X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.utils.ui.workbench%2Fsrc%2Forg%2Fsimantics%2Futils%2Fui%2Fworkbench%2Fui%2FTableColumnSorter.java;fp=bundles%2Forg.simantics.utils.ui.workbench%2Fsrc%2Forg%2Fsimantics%2Futils%2Fui%2Fworkbench%2Fui%2FTableColumnSorter.java;h=2ce76b50144c25e59f4cce5e28d99acb77a6be4b;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.utils.ui.workbench/src/org/simantics/utils/ui/workbench/ui/TableColumnSorter.java b/bundles/org.simantics.utils.ui.workbench/src/org/simantics/utils/ui/workbench/ui/TableColumnSorter.java new file mode 100644 index 000000000..2ce76b501 --- /dev/null +++ b/bundles/org.simantics.utils.ui.workbench/src/org/simantics/utils/ui/workbench/ui/TableColumnSorter.java @@ -0,0 +1,236 @@ +/******************************************************************************* + * 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; + } + +}