package rocks.inspectit.ui.rcp.editor.viewers; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.SWT; import rocks.inspectit.shared.all.communication.DefaultData; import rocks.inspectit.shared.cs.communication.comparator.ResultComparator; /** * Viewer comparator uses provided comparators to sort specific columns. * * @author Patrice Boulliet * @author Ivan Senic * * @param <T> * Type for which comparator is created. */ public abstract class AbstractViewerComparator<T extends DefaultData> extends ViewerComparator { /** * The available sort states. * * @author Patrice Bouillet * */ protected enum SortState { /** State that won't sort. */ NONE(SWT.NONE), /** State that sorts upwards. */ UP(SWT.UP), /** State that sorts downwards. */ DOWN(SWT.DOWN); /** * The swt direction. */ private int swtDirection; /** * Constructor to accept the swt direction. * * @param swtDirection * The swt direction. */ private SortState(int swtDirection) { this.swtDirection = swtDirection; } /** * Gets {@link #swtDirection}. * * @return {@link #swtDirection} */ public int getSwtDirection() { return swtDirection; } } /** * Current comparator provider. */ private ResultComparator<T> comparator; /** * Default sort state. */ private SortState sortState = SortState.UP; /** * Toggles the sorting of the column. * * @param id * The comparator provider. */ protected void toggleSortColumn(ResultComparator<T> id) { if (comparator == id) { // NOPMD switch (sortState) { case NONE: sortState = SortState.UP; comparator.setAscending(true); break; case UP: sortState = SortState.DOWN; comparator.setAscending(false); break; case DOWN: sortState = SortState.NONE; break; default: break; } } else { comparator = id; sortState = SortState.UP; comparator.setAscending(true); } } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public int compare(Viewer viewer, Object o1, Object o2) { if (null == comparator) { return 0; } // just return 0 if we don't want to sort if (SortState.NONE.equals(sortState)) { return 0; } T e1 = (T) o1; T e2 = (T) o2; return comparator.compare(e1, e2); } /** * Gets {@link #sortState}. * * @return {@link #sortState} */ protected SortState getSortState() { return sortState; } }