| /******************************************************************************* |
| * Copyright (c) 2012 Original authors and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Original authors and others - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.nebula.widgets.nattable.extension.glazedlists; |
| |
| import static org.eclipse.nebula.widgets.nattable.sort.SortDirectionEnum.ASC; |
| import static org.eclipse.nebula.widgets.nattable.sort.SortDirectionEnum.DESC; |
| import static org.eclipse.nebula.widgets.nattable.sort.SortDirectionEnum.NONE; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.nebula.widgets.nattable.sort.SortDirectionEnum; |
| |
| import ca.odell.glazedlists.SortedList; |
| import ca.odell.glazedlists.gui.AbstractTableComparatorChooser; |
| import ca.odell.glazedlists.gui.TableFormat; |
| |
| public class NatTableComparatorChooser<T> extends |
| AbstractTableComparatorChooser<T> { |
| |
| public NatTableComparatorChooser(SortedList<T> sortedList, |
| TableFormat<T> tableFormat) { |
| super(sortedList, tableFormat); |
| } |
| |
| void sort(int columnIndex, SortDirectionEnum sortDirection, |
| boolean accumulate) { |
| if (getComparatorsForColumn(columnIndex).isEmpty()) { |
| return; |
| } |
| if (!accumulate) { |
| clearComparator(); |
| } |
| |
| switch (sortDirection) { |
| case NONE: |
| removeSortingColumnIndex(columnIndex); |
| break; |
| case ASC: |
| removeSortingColumnIndex(columnIndex); |
| appendComparator(columnIndex, 0, false); |
| break; |
| case DESC: |
| removeSortingColumnIndex(columnIndex); |
| appendComparator(columnIndex, 0, true); |
| break; |
| default: |
| break; |
| } |
| } |
| |
| private void removeSortingColumnIndex(int columnIndex) { |
| // Save comparators |
| List<ComparatorInfo> comparatorInfos = new ArrayList<ComparatorInfo>(); |
| for (int sortingColumnIndex : getSortingColumns()) { |
| if (sortingColumnIndex != columnIndex) { |
| boolean reverse = isColumnReverse(sortingColumnIndex); |
| comparatorInfos.add(new ComparatorInfo(sortingColumnIndex, |
| reverse)); |
| } |
| } |
| |
| clearComparator(); |
| |
| // Rebuild comparators |
| for (ComparatorInfo comparatorInfo : comparatorInfos) { |
| appendComparator(comparatorInfo.columnIndex, 0, |
| comparatorInfo.isReverse); |
| } |
| } |
| |
| public boolean isColumnIndexSorted(int columnIndex) { |
| return getSortingColumns().contains(Integer.valueOf(columnIndex)); |
| } |
| |
| public SortDirectionEnum getSortDirectionForColumnIndex(int columnIndex) { |
| boolean sorted = getSortingColumns().contains( |
| Integer.valueOf(columnIndex)); |
| if (!sorted) { |
| return NONE; |
| } |
| return isColumnReverse(columnIndex) ? DESC : ASC; |
| } |
| |
| /** |
| * @return The order in which this column was clicked. Zero indexed. -1 if |
| * the column wasn't recently clicked. |
| * |
| * Example: If column indexes 20, 10, 25 are clicked in that order, |
| * clickSequence(10) is 2. |
| */ |
| int getClickSequence(int columnIndex) { |
| return getSortingColumns().indexOf(Integer.valueOf(columnIndex)); |
| } |
| |
| /** |
| * Helper object for tracking existing comparators |
| */ |
| private class ComparatorInfo { |
| final int columnIndex; |
| final boolean isReverse; |
| |
| ComparatorInfo(int columnIndex, boolean reverse) { |
| this.columnIndex = columnIndex; |
| this.isReverse = reverse; |
| } |
| } |
| |
| } |