blob: 772834acd65a133807ad7c2d5353965acdef5a30 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}
}