001 /*
002 * Copyright 2014-2016 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package griffon.plugins.glazedlists.gui;
017
018 import ca.odell.glazedlists.gui.AdvancedTableFormat;
019 import griffon.plugins.glazedlists.ColumnReader;
020
021 import javax.annotation.Nonnull;
022 import java.util.Comparator;
023 import java.util.List;
024 import java.util.Map;
025
026 import static griffon.util.GriffonClassUtils.requireState;
027 import static java.util.Objects.requireNonNull;
028
029 /**
030 * @author Andres Almiray
031 */
032 public class DefaultAdvancedTableFormat<E> extends DefaultTableFormat<E> implements AdvancedTableFormat<E> {
033 private static final Class DEFAULT_CLASS = Object.class;
034 private static final Comparator<Object> DEFAULT_COMPARATOR = new Comparator<Object>() {
035 @Override
036 public int compare(Object o1, Object o2) {
037 if (o1 instanceof Comparable && o2 instanceof Comparable) {
038 return ((Comparable) o1).compareTo(o2);
039 }
040 return -1;
041 }
042 };
043
044 private static final String CLASS = "class";
045 private static final String COMPARATOR = "comparator";
046
047 private final Class[] columnClasses;
048 private final Comparator[] columnComparators;
049
050 public DefaultAdvancedTableFormat(@Nonnull String[] columnNames) {
051 super(columnNames);
052 this.columnClasses = new Class[columnNames.length];
053 this.columnComparators = new Comparator[columnNames.length];
054
055 for (int i = 0; i < columnNames.length; i++) {
056 columnClasses[i] = DEFAULT_CLASS;
057 columnComparators[i] = DEFAULT_COMPARATOR;
058 }
059 }
060
061 public DefaultAdvancedTableFormat(@Nonnull String[] columnNames, @Nonnull String[] columnTitles, @Nonnull ColumnReader[] columnReaders,
062 @Nonnull Class[] columnClasses, @Nonnull Comparator[] columnComparators) {
063 super(columnNames, columnTitles, columnReaders);
064 this.columnClasses = requireNonNull(columnClasses, "Argument 'columnClasses' must not be null.");
065 this.columnComparators = requireNonNull(columnComparators, "Argument 'columnComparators' must not be null.");
066 requireState(columnNames.length == columnClasses.length,
067 "Arguments 'columNames' and 'columnClasses' have different cardinality. " + columnNames.length + " != " + columnClasses.length);
068 requireState(columnNames.length == columnComparators.length,
069 "Arguments 'columNames' and 'columnComparators' have different cardinality. " + columnNames.length + " != " + columnComparators.length);
070 }
071
072 public DefaultAdvancedTableFormat(@Nonnull List<Map<String, Object>> options) {
073 super(options);
074 this.columnClasses = new Class[columnNames.length];
075 this.columnComparators = new Comparator[columnNames.length];
076
077 int i = 0;
078 for (Map<String, Object> op : options) {
079 if (op.containsKey(CLASS) && op.get(CLASS) instanceof Class) {
080 columnClasses[i] = (Class) op.get(CLASS);
081 } else {
082 columnClasses[i] = DEFAULT_CLASS;
083 }
084
085 if (op.containsKey(COMPARATOR) && op.get(COMPARATOR) instanceof Comparator) {
086 columnComparators[i] = (Comparator) op.get(COMPARATOR);
087 } else {
088 columnComparators[i] = DEFAULT_COMPARATOR;
089 }
090
091 i++;
092 }
093 }
094
095 @Override
096 public Class getColumnClass(int column) {
097 return columnClasses[column];
098 }
099
100 @Override
101 public Comparator getColumnComparator(int column) {
102 return columnComparators[column];
103 }
104 }
|