/*******************************************************************************
* Copyright (c) 2007, 2010 Association for Decentralized Information Management
* in Industry THTH ry.
* 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:
* VTT Technical Research Centre of Finland - initial API and implementation
*******************************************************************************/
package org.simantics.utils.ui.workbench.ui;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IMemento;
/**
* This class adds column sorting functionality to SWT Table widget.
*
* Attach this Sorter after you have created all columns.
*
* Usage: TableColumnSorter.attachTableColumnSorter(myTable);
*
* @author Toni Kalajainen
*/
public class TableColumnSorter {
/** The table */
protected final TableViewer viewer;
/** the sorter */
protected final ColumnSorter sorter;
/** column specific comparators*/
protected Map> columnComparators =
new HashMap>();
public static TableColumnSorter attachTableColumnSorter(TableViewer viewer) {
return new TableColumnSorter(viewer);
}
public static void unattachTableColumnSorter(TableViewer viewer) {
viewer.setSorter(null);
}
public void setColumnComparator(int index, Comparator> comparator)
{
columnComparators.put(index, comparator);
viewer.refresh();
}
private final static String PRI_ASC = "PriAsc";
private final static String SEC_ASC = "SecAsc";
private final static String PRI_IND = "PriInd";
private final static String SEC_IND = "SecInd";
public void saveState(String id, IMemento memento) {
memento.putInteger(id+PRI_ASC, sorter.isAscending()?1:0);
memento.putInteger(id+SEC_ASC, sorter.isSecondaryAscending()?1:0);
memento.putInteger(id+PRI_IND, sorter.getIndex());
memento.putInteger(id+SEC_IND, sorter.getSecondaryIndex());
}
public void restoreState(String id, IMemento memento) {
if (!hasState(id, memento)) return;
sorter.setAscending( memento.getInteger(id+PRI_ASC)==1 );
sorter.setSecondaryAscending( memento.getInteger(id+SEC_ASC)==1 );
sorter.setIndex( memento.getInteger(id+PRI_IND) );
sorter.setSecondaryIndex( memento.getInteger(id+SEC_IND) );
viewer.refresh();
}
public boolean hasState(String id, IMemento memento) {
return (memento.getInteger(id+PRI_ASC)!=null) &&
(memento.getInteger(id+SEC_ASC)!=null) &&
(memento.getInteger(id+PRI_IND)!=null) &&
(memento.getInteger(id+SEC_IND)!=null);
}
public void setColumnAscending(int index)
{
sorter.setIndex(index);
sorter.setAscending(true);
viewer.refresh();
}
private TableColumnSorter(TableViewer viewer) {
this.viewer = viewer;
this.sorter = new ColumnSorter();
// Attach columns
TableColumn columns[] = viewer.getTable().getColumns();
for(int i=0; i=0)) {
text1 = tlp.getColumnText(e1, secondaryColumnIndex);
text2 = tlp.getColumnText(e2, secondaryColumnIndex);
if (text1==null) text1="";
if (text2==null) text2="";
if (!caseSensitive) {
text1 = text1.toLowerCase();
text2 = text2.toLowerCase();
}
result = compare(secondaryColumnIndex, text1, text2, e1, e2);
if (!secondaryAscending) return -result;
}
return result;
}
public boolean isCaseSensitive() {
return caseSensitive;
}
public void setCaseSensitive(boolean caseSensitive) {
this.caseSensitive = caseSensitive;
}
}
public ColumnSorter getSorter() {
return sorter;
}
}