DefaultAdvancedTableFormat.java
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 ((Comparableo1).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(CLASSinstanceof Class) {
080                 columnClasses[i(Classop.get(CLASS);
081             else {
082                 columnClasses[i= DEFAULT_CLASS;
083             }
084 
085             if (op.containsKey(COMPARATOR&& op.get(COMPARATORinstanceof Comparator) {
086                 columnComparators[i(Comparatorop.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 }