blob: 40a624f4602ba8492c5f8752d8d990e9afd3dd8f [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2018, Luís Copetti <lhcopetti@gmail.com>
*
* All rights reserved. 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
*******************************************************************************/
package org.eclipse.egit.ui.internal;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
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;
import org.eclipse.swt.widgets.TableColumn;
/**
* A lexicographical label column comparator. It depends on the
* {@link ColumnLabelProvider} provided by the {@link TableViewer} to retrieve
* the label for the given column and supports {@link #ASCENDING},
* {@link #DESCENDING} and also the default ordering {@link #NONE}. Clicking on
* the column header repeatedly alternates between the previously mentioned
* ordering modes.
*/
public class LabelColumnComparator extends ViewerComparator {
private static final int ASCENDING = SWT.DOWN;
private static final int NONE = SWT.NONE;
private static final int DESCENDING = SWT.UP;
private final TableColumn column;
private final int columnIndex;
private final TableViewer tv;
private int direction;
/**
*
* @param tableViewer
* @param column
* @param columnIndex
*/
public LabelColumnComparator(TableViewer tableViewer, TableColumn column,
int columnIndex) {
super(null);
this.tv = tableViewer;
this.column = column;
this.columnIndex = columnIndex;
column.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (tv.getComparator() == LabelColumnComparator.this) {
if (direction == ASCENDING) {
setDirection(DESCENDING);
} else {
setDirection(NONE);
}
} else {
setDirection(ASCENDING);
}
}
});
}
private void setDirection(int newDirection) {
direction = newDirection;
Table table = column.getParent();
table.setSortDirection(direction);
if (direction == NONE) {
table.setSortColumn(null);
tv.setComparator(null);
} else {
table.setSortColumn(column);
if (tv.getComparator() == this) {
tv.refresh();
} else {
tv.setComparator(this);
}
}
}
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
ColumnLabelProvider labelProvider = (ColumnLabelProvider) tv
.getLabelProvider(columnIndex);
String label1 = labelProvider.getText(e1);
String label2 = labelProvider.getText(e2);
if (direction == ASCENDING) {
return label1.compareTo(label2);
} else {
return label2.compareTo(label1);
}
}
}