/******************************************************************************* * Copyright (c) 2004, 2010 BREDEX GmbH and others. * 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: * Tom Schindl - initial API and implementation * BREDEX GmbH - initial documentation and removal of "NONE" sort order *******************************************************************************/ package org.eclipse.jubula.client.ui.views; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Table; /** * Helper class for sorting on TableViewerColumns. Taken from * Snippet040TableViewerSorting and modified to pass Checkstyle. * * @author Tom Schindl <tom.schindl@bestsolution.at> * @author BREDEX GmbH */ public abstract class ColumnViewerSorter extends ViewerComparator { /** constant for ascending sort order */ public static final int ASC = 1; /** constant for descending sort order */ public static final int DESC = -1; /** current sort direction */ private int m_direction = 0; /** the column on which to sort */ private TableViewerColumn m_column; /** the viewer to sort */ private ColumnViewer m_viewer; /** * Constructor * * @param viewer The viewer to sort. * @param column The column on which to sort. */ public ColumnViewerSorter(ColumnViewer viewer, TableViewerColumn column) { m_column = column; m_viewer = viewer; m_column.getColumn().addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { if (m_viewer.getComparator() == ColumnViewerSorter.this && m_direction == ASC) { setSorter(DESC); } else { setSorter(ASC); } } }); } /** * Assigns the receiver as its viewer's sorter. * * @param direction * The sort direction to use. */ public void setSorter(int direction) { final Table parent = m_column.getColumn().getParent(); parent.setSortColumn(m_column.getColumn()); m_direction = direction; if (direction == ASC) { parent.setSortDirection(SWT.UP); } else { parent.setSortDirection(SWT.DOWN); } if (m_viewer.getComparator() == this) { m_viewer.refresh(); } else { m_viewer.setComparator(this); } } /** * * {@inheritDoc} */ public int compare(Viewer viewer, Object e1, Object e2) { return m_direction * doCompare(viewer, e1, e2); } /** * Performs the actual comparison. * * Returns a negative, zero, or positive number depending on whether * the first element is less than, equal to, or greater than * the second element. * * @param viewer the viewer * @param e1 the first element * @param e2 the second element * @return a negative number if the first element is less than the * second element; the value <code>0</code> if the first element is * equal to the second element; and a positive number if the first * element is greater than the second element */ protected abstract int doCompare(Viewer viewer, Object e1, Object e2); }