blob: 666940895b550b977596dce09e70b76a0ec9f2c1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2011 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ant.internal.ui;
import org.eclipse.ant.internal.core.IAntCoreConstants;
import org.eclipse.ant.internal.ui.preferences.AntObjectLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
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.TableColumn;
/**
* A sorter that can be attached to a given column in a given viewer. This comparator uses the {@link AntObjectLabelProvider} to get the text to
* compare
*
* @since 3.5
*/
public abstract class ColumnSorter extends ViewerComparator {
private ColumnViewer cviewer = null;
private TableColumn column = null;
private int direction = SWT.DOWN;
private int columnidx = 0;
/**
* Constructor
*
* @param cviewer
* @param column
*/
public ColumnSorter(ColumnViewer cviewer, TableColumn column) {
this.cviewer = cviewer;
this.column = column;
this.columnidx = getColumnIndex();
this.column.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (ColumnSorter.this.cviewer.getComparator() != ColumnSorter.this) {
setDirection(SWT.DOWN);
} else {
int tdirection = ColumnSorter.this.column.getParent().getSortDirection();
if (tdirection == SWT.NONE) {
setDirection(SWT.DOWN);
} else {
setDirection(tdirection == SWT.UP ? SWT.DOWN : SWT.UP);
}
}
}
});
}
/**
* Returns the compare text that should be used for the given object coming from the given column index
*
* @param obj
* @param columnindex
* @return the text to compare with
*/
public abstract String getCompareText(Object obj, int columnindex);
/**
* Sets the sorting direction for this sorter to use
*
* @param direction
*/
public void setDirection(int direction) {
this.column.getParent().setSortColumn(this.column);
this.direction = direction;
this.column.getParent().setSortDirection(this.direction);
if (this.cviewer.getComparator() == this) {
this.cviewer.refresh();
} else {
this.cviewer.setComparator(this);
}
}
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
String text1 = getCompareText(e1, this.columnidx);
if (text1 == null) {
text1 = IAntCoreConstants.EMPTY_STRING;
}
String text2 = getCompareText(e2, this.columnidx);
if (text2 == null) {
text2 = IAntCoreConstants.EMPTY_STRING;
}
return (this.direction == SWT.UP ? -1 : 1) * text1.compareTo(text2);
}
/**
* Returns the index of the given column in the backing table for this page, or 0
*
* @return the index of the column in the backing table for this page or 0
*/
private int getColumnIndex() {
int idx = this.column.getParent().indexOf(this.column);
return (idx < 0 ? 0 : idx);
}
}