--- /dev/null
+package org.simantics.tests.modelled.ui;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.eclipse.jface.viewers.TreeViewer;\r
+import org.eclipse.jface.viewers.TreeViewerColumn;\r
+import org.eclipse.jface.viewers.Viewer;\r
+import org.eclipse.jface.viewers.ViewerComparator;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.events.SelectionListener;\r
+import org.eclipse.swt.widgets.TreeColumn;\r
+import org.simantics.scl.compiler.module.coverage.Coverage;\r
+\r
+class CoverageViewSorter extends ViewerComparator {\r
+\r
+ private final TreeViewer viewer;\r
+\r
+ public CoverageViewSorter(TreeViewer viewer) {\r
+ this.viewer = viewer;\r
+ }\r
+\r
+ private Map<TreeColumn, Integer> columns = new HashMap<>();\r
+ private int currentDirection;\r
+ \r
+ void addColumn(final TreeViewerColumn viewerColumn, final int columnidx) {\r
+ final TreeColumn column = viewerColumn.getColumn();\r
+ setSortColumnAndDirection(column, SWT.UP);\r
+ column.addSelectionListener(new SelectionListener() {\r
+\r
+ public void widgetSelected(SelectionEvent e) {\r
+ TreeColumn current = column.getParent().getSortColumn();\r
+ if (current.equals(column)) {\r
+ int sortDirection = column.getParent().getSortDirection();\r
+ setSortColumnAndDirection(column, sortDirection != SWT.DOWN ? SWT.DOWN : SWT.UP);\r
+ } else {\r
+ setSortColumnAndDirection(column, SWT.DOWN);\r
+ }\r
+ viewer.refresh();\r
+ }\r
+\r
+ public void widgetDefaultSelected(SelectionEvent e) {\r
+ }\r
+ });\r
+ columns.put(column, columnidx);\r
+ }\r
+\r
+ private void setSortColumnAndDirection(TreeColumn sortColumn, int direction) {\r
+ currentDirection = direction;\r
+ sortColumn.getParent().setSortColumn(sortColumn);\r
+ sortColumn.getParent().setSortDirection(direction);\r
+ }\r
+\r
+ \r
+ @Override\r
+ public int compare(Viewer viewer, Object e1, Object e2) {\r
+\r
+ TreeViewer v = (TreeViewer) viewer;\r
+ TreeColumn currentColumn = v.getTree().getSortColumn();\r
+ \r
+ int res = 0;\r
+ if (e1 instanceof Coverage && e2 instanceof Coverage) {\r
+ Coverage c1 = (Coverage) e1;\r
+ Coverage c2 = (Coverage) e2;\r
+ \r
+ int indx = columns.get(currentColumn);\r
+ switch (indx) {\r
+ case STSTestRunnerView.COLUMN_ELEMENT:\r
+ res = c1.getIdentifier().compareToIgnoreCase(c2.getIdentifier());\r
+ break;\r
+ case STSTestRunnerView.COLUMN_RATIO:\r
+ res = Double.compare(c1.getCoverage(), c2.getCoverage());\r
+ break;\r
+ case STSTestRunnerView.COLUMN_COVERED:\r
+ res = (int) (c1.getCoveredCodeSize() - c2.getCoveredCodeSize());\r
+ break;\r
+ case STSTestRunnerView.COLUMN_MISSED:\r
+ res = (int) (c1.getMissedCodeSize()) - c2.getMissedCodeSize();\r
+ break;\r
+ case STSTestRunnerView.COLUMN_TOTAL:\r
+ res = (int) (c1.getTotalCodeSize() - c2.getTotalCodeSize());\r
+ break;\r
+ }\r
+ if (res == 0) {\r
+ res = c1.getIdentifier().compareTo(c2.getIdentifier());\r
+ } else {\r
+ res = isReverseSort() ? -res : res;\r
+ }\r
+ }\r
+ return res;\r
+ }\r
+\r
+ private boolean isReverseSort() {\r
+ return currentDirection == SWT.DOWN;\r
+ }\r
+}\r