/******************************************************************************* * 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; } }