blob: 030f34577af7d5e7935a8c418ef1717b5119e29e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2013 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.commons.ui;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ContentViewer;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Item;
/**
* Provides sorting support for column-based viewers such as tables and tree-tables.
*
* @author Shawn Minto
* @author Steffen Pingel
* @since 3.7
*/
public abstract class AbstractColumnViewerSorter<V extends ColumnViewer, I extends Item> extends ViewerSorter {
/**
* Returns the current sort column.
*
* @return the column that is being sorted; <code>null</code>, if no column is sorted
*/
abstract I getSortColumn(V viewer);
/**
* Returns the current sort order.
*
* @return {@link SWT#DOWN}, if sorting descending; 0, if no sort order is specified; {@link SWT#UP}, if sorting
* ascending
*/
abstract int getSortDirection(V viewer);
/**
* Returns the index of <code>I</code>.
*/
abstract int getColumnIndex(V viewer, I column);
/**
* Compares <code>e1</code> and <code>e2</code> according to the current sort column and order. Delegates to
* {@link #compareDefault(ColumnViewer, Object, Object)} if no sort column is selected.
*
* @see #getSortColumn(ColumnViewer)
* @see #getSortDirection(ColumnViewer)
* @see #compareDefault(ColumnViewer, Object, Object)
*/
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
Assert.isLegal(viewer instanceof ColumnViewer);
@SuppressWarnings("unchecked")
V columnViewer = (V) viewer;
I column = getSortColumn(columnViewer);
if (column != null) {
int index = getColumnIndex(columnViewer, column);
int result = compare(columnViewer, e1, e2, index);
if (getSortDirection(columnViewer) == SWT.DOWN) {
return -result;
}
return result;
}
return compareDefault(columnViewer, e1, e2);
}
/**
* Compares <code>e1</code> and <code>e2</code> following the contract of
* {@link ViewerComparator#compare(Viewer, Object, Object)}. Subclasses may override.
*
* @see ViewerComparator#compare(Viewer, Object, Object)
*/
protected int compareDefault(V viewer, Object e1, Object e2) {
return super.compare(viewer, e1, e2);
}
/**
* Compares <code>e1</code> and <code>e2</code> according based on their category and column specific label.
*/
@SuppressWarnings("unchecked")
public int compare(V viewer, Object e1, Object e2, int columnIndex) {
int cat1 = category(e1);
int cat2 = category(e2);
if (cat1 != cat2) {
return cat1 - cat2;
}
String name1;
String name2;
if (viewer == null || !(viewer instanceof ContentViewer)) {
name1 = e1.toString();
name2 = e2.toString();
} else {
CellLabelProvider prov = viewer.getLabelProvider(columnIndex);
if (prov instanceof ILabelProvider) {
ILabelProvider lprov = (ILabelProvider) prov;
name1 = lprov.getText(e1);
name2 = lprov.getText(e2);
} else {
name1 = e1.toString();
name2 = e2.toString();
}
}
if (name1 == null) {
name1 = "";//$NON-NLS-1$
}
if (name2 == null) {
name2 = "";//$NON-NLS-1$
}
// use the comparator to compare the strings
return getComparator().compare(name1, name2);
}
}