package de.ovgu.cide.mining.relationmanager; import java.util.Comparator; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.TreeColumn; import de.ovgu.cide.mining.relationmanager.model.RelationTreeNode; public class RelationSorter extends ViewerSorter { private class SortInfo { int columnIndex; Comparator<RelationTreeNode> comparator; boolean descending; } private TreeViewer viewer; private SortInfo[] infos; public RelationSorter(TreeViewer viewer, TreeColumn[] columns, Comparator<RelationTreeNode>[] comparators) { this.viewer = viewer; infos = new SortInfo[columns.length]; for (int i = 0; i < columns.length; i++) { infos[i] = new SortInfo(); infos[i].columnIndex = i; infos[i].comparator = comparators[i]; infos[i].descending = false; createSelectionListener(columns[i], infos[i]); } } public int compare(Viewer viewer, Object entry1, Object entry2) { for (int i = 0; i < infos.length; i++) { int result = infos[i].comparator.compare((RelationTreeNode) entry1, (RelationTreeNode) entry2); if (result != 0) { if (infos[i].descending) return -result; return result; } } return 0; } private void createSelectionListener(final TreeColumn column, final SortInfo info) { column.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { sortUsing(info); } public void widgetDefaultSelected(SelectionEvent e) { // TODO Auto-generated method stub } }); } protected void sortUsing(SortInfo info) { if (info == infos[0]) { info.descending = !info.descending; } else { for (int i = 0; i < infos.length; i++) { if (info == infos[i]) { System.arraycopy(infos, 0, infos, 1, i); infos[0] = info; info.descending = false; break; } } } viewer.refresh(); } }