X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.utils.ui.workbench%2Fsrc%2Forg%2Fsimantics%2Futils%2Fui%2Fworkbench%2Fui%2FTreeColumnSorter.java;h=a4618fba77a4073e84cf2082992e21a6f9ff59e6;hp=d36448ff3e711687c8dbe9442e7f4cae1949f63d;hb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;hpb=24e2b34260f219f0d1644ca7a138894980e25b14 diff --git a/bundles/org.simantics.utils.ui.workbench/src/org/simantics/utils/ui/workbench/ui/TreeColumnSorter.java b/bundles/org.simantics.utils.ui.workbench/src/org/simantics/utils/ui/workbench/ui/TreeColumnSorter.java index d36448ff3..a4618fba7 100644 --- a/bundles/org.simantics.utils.ui.workbench/src/org/simantics/utils/ui/workbench/ui/TreeColumnSorter.java +++ b/bundles/org.simantics.utils.ui.workbench/src/org/simantics/utils/ui/workbench/ui/TreeColumnSorter.java @@ -1,238 +1,238 @@ -/******************************************************************************* - * 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 - *******************************************************************************/ -/* - * 4.7.2006 - */ -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.TreeViewer; -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.TreeColumn; -import org.eclipse.ui.IMemento; - -/** - * This class adds column sorting functionality to SWT Tree widget. - *

- * Attach this Sorter after you have created all columns. - *

- * Usage: TreeColumnSorter.attachTreeColumnSorter(myTree); - * - * @author Toni Kalajainen - */ -public class TreeColumnSorter { - - /** The tree */ - protected final TreeViewer viewer; - - /** the sorter */ - protected final ColumnSorter sorter; - - /** column specific comparators*/ - protected Map> columnComparators = - new HashMap>(); - - public static TreeColumnSorter attachTreeColumnSorter(TreeViewer viewer) { - return new TreeColumnSorter(viewer); - } - - public static void unattachTreeColumnSorter(TreeViewer viewer) { - viewer.setSorter(null); - } - - private TreeColumnSorter(TreeViewer viewer) { - this.viewer = viewer; - this.sorter = new ColumnSorter(); - - // Attach columns - TreeColumn columns[] = viewer.getTree().getColumns(); - for(int i=0; i comparator) - { - columnComparators.put(index, comparator); - viewer.refresh(); - } - - public void setColumnAscending(int index) - { - sorter.setIndex(index); - sorter.setAscending(true); - viewer.refresh(); - } - - private final static String PRI_ASC = "TPriAsc"; - private final static String SEC_ASC = "TSecAsc"; - private final static String PRI_IND = "TPriInd"; - private final static String SEC_IND = "TSecInd"; - - 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); - } - - class ColumnSorter extends ViewerSorter { - /** Sort direction */ - private boolean ascending = true; - /** Secondary Sort direction */ - private boolean secondaryAscending = true; - /** Sort column */ - private int columnIndex = 0; - /** Secondary sort column */ - private int secondaryColumnIndex = -1; - /** case sensitive */ - private boolean caseSensitive = false; - - public void setAscending(boolean ascending) { - this.ascending = ascending; - } - - public boolean isAscending() { - return ascending; - } - - public void setSecondaryAscending(boolean ascending) { - this.secondaryAscending = ascending; - } - - public boolean isSecondaryAscending() { - return secondaryAscending; - } - - public void setIndex(int index) { - this.columnIndex = index; - } - - public int getIndex() { - return columnIndex; - } - - public void setSecondaryIndex(int index) { - this.secondaryColumnIndex = index; - } - - public int getSecondaryIndex() { - return secondaryColumnIndex; - } - - @SuppressWarnings("unchecked") - private int compare(int columnIndex, String text1, String text2, Object o1, Object o2) - { - @SuppressWarnings("rawtypes") - Comparator c = columnComparators.get(columnIndex); - if (c==null || o1==null || o2==null) - return text1.compareTo(text2); - return c.compare(o1, o2); - } - - public int compare(Viewer viewer, Object e1, Object e2) { - int result = 0; - - TreeViewer v = (TreeViewer) viewer; - IBaseLabelProvider blp = v.getLabelProvider(); - if (!(blp instanceof ITableLabelProvider)) { - return super.compare(viewer, e1, e2); - } - ITableLabelProvider tlp = (ITableLabelProvider) blp; - - // Primary sort - String text1 = tlp.getColumnText(e1, columnIndex); - String text2 = tlp.getColumnText(e2, columnIndex); - if (text1==null) text1=""; - if (text2==null) text2=""; - if (!caseSensitive) { - text1 = text1.toLowerCase(); - text2 = text2.toLowerCase(); - } - result = compare(columnIndex, text1, text2, e1, e2); - if (!ascending) return -result; - - // secondary sort - if (result==0 && (secondaryColumnIndex>=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; - } - -} +/******************************************************************************* + * 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 + *******************************************************************************/ +/* + * 4.7.2006 + */ +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.TreeViewer; +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.TreeColumn; +import org.eclipse.ui.IMemento; + +/** + * This class adds column sorting functionality to SWT Tree widget. + *

+ * Attach this Sorter after you have created all columns. + *

+ * Usage: TreeColumnSorter.attachTreeColumnSorter(myTree); + * + * @author Toni Kalajainen + */ +public class TreeColumnSorter { + + /** The tree */ + protected final TreeViewer viewer; + + /** the sorter */ + protected final ColumnSorter sorter; + + /** column specific comparators*/ + protected Map> columnComparators = + new HashMap>(); + + public static TreeColumnSorter attachTreeColumnSorter(TreeViewer viewer) { + return new TreeColumnSorter(viewer); + } + + public static void unattachTreeColumnSorter(TreeViewer viewer) { + viewer.setSorter(null); + } + + private TreeColumnSorter(TreeViewer viewer) { + this.viewer = viewer; + this.sorter = new ColumnSorter(); + + // Attach columns + TreeColumn columns[] = viewer.getTree().getColumns(); + for(int i=0; i comparator) + { + columnComparators.put(index, comparator); + viewer.refresh(); + } + + public void setColumnAscending(int index) + { + sorter.setIndex(index); + sorter.setAscending(true); + viewer.refresh(); + } + + private final static String PRI_ASC = "TPriAsc"; + private final static String SEC_ASC = "TSecAsc"; + private final static String PRI_IND = "TPriInd"; + private final static String SEC_IND = "TSecInd"; + + 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); + } + + class ColumnSorter extends ViewerSorter { + /** Sort direction */ + private boolean ascending = true; + /** Secondary Sort direction */ + private boolean secondaryAscending = true; + /** Sort column */ + private int columnIndex = 0; + /** Secondary sort column */ + private int secondaryColumnIndex = -1; + /** case sensitive */ + private boolean caseSensitive = false; + + public void setAscending(boolean ascending) { + this.ascending = ascending; + } + + public boolean isAscending() { + return ascending; + } + + public void setSecondaryAscending(boolean ascending) { + this.secondaryAscending = ascending; + } + + public boolean isSecondaryAscending() { + return secondaryAscending; + } + + public void setIndex(int index) { + this.columnIndex = index; + } + + public int getIndex() { + return columnIndex; + } + + public void setSecondaryIndex(int index) { + this.secondaryColumnIndex = index; + } + + public int getSecondaryIndex() { + return secondaryColumnIndex; + } + + @SuppressWarnings("unchecked") + private int compare(int columnIndex, String text1, String text2, Object o1, Object o2) + { + @SuppressWarnings("rawtypes") + Comparator c = columnComparators.get(columnIndex); + if (c==null || o1==null || o2==null) + return text1.compareTo(text2); + return c.compare(o1, o2); + } + + public int compare(Viewer viewer, Object e1, Object e2) { + int result = 0; + + TreeViewer v = (TreeViewer) viewer; + IBaseLabelProvider blp = v.getLabelProvider(); + if (!(blp instanceof ITableLabelProvider)) { + return super.compare(viewer, e1, e2); + } + ITableLabelProvider tlp = (ITableLabelProvider) blp; + + // Primary sort + String text1 = tlp.getColumnText(e1, columnIndex); + String text2 = tlp.getColumnText(e2, columnIndex); + if (text1==null) text1=""; + if (text2==null) text2=""; + if (!caseSensitive) { + text1 = text1.toLowerCase(); + text2 = text2.toLowerCase(); + } + result = compare(columnIndex, text1, text2, e1, e2); + if (!ascending) return -result; + + // secondary sort + if (result==0 && (secondaryColumnIndex>=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; + } + +}