blob: 37ae0e70501cf754fae0977e1f5fe8a68639058c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ui.sync.views;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.team.internal.ui.IPreferenceIds;
import org.eclipse.team.internal.ui.TeamUIPlugin;
import org.eclipse.ui.views.navigator.ResourceSorter;
/**
* Provides support for sorting the table viewer of the SynchronizeView by column
*/
public class SyncViewerTableSorter extends SyncViewerSorter {
private boolean reversed;
private int columnNumber;
//column constants
public static final int COL_NAME = 0;
public static final int COL_PARENT = 1;
// column headings: "Revision" "Tags" "Date" "Author" "Comment"
private int[][] SORT_ORDERS_BY_COLUMN = {
{COL_NAME, COL_PARENT}, /* name */
{COL_PARENT, COL_NAME} /* parent */
};
/**
* Return a listener that will change the sorter in the table when the column header
* is clicked.
*/
public static SelectionListener getColumnListener(final TableViewer tableViewer) {
/**
* This class handles selections of the column headers.
* Selection of the column header will cause resorting
* of the shown tasks using that column's sorter.
* Repeated selection of the header will toggle
* sorting order (ascending versus descending).
*/
return new SelectionAdapter() {
/**
* Handles the case of user selecting the
* header area.
* <p>If the column has not been selected previously,
* it will set the sorter of that column to be
* the current tasklist sorter. Repeated
* presses on the same column header will
* toggle sorting order (ascending/descending).
*/
public void widgetSelected(SelectionEvent e) {
// column selected - need to sort
int column = tableViewer.getTable().indexOf((TableColumn) e.widget);
SyncViewerTableSorter oldSorter = (SyncViewerTableSorter)tableViewer.getSorter();
if (oldSorter != null && column == oldSorter.getColumnNumber()) {
SyncViewerTableSorter.getStore().setValue(IPreferenceIds.SYNCVIEW_VIEW_TABLESORT_REVERSED, !oldSorter.isReversed());
oldSorter.setReversed(!oldSorter.isReversed());
tableViewer.refresh();
} else {
SyncViewerTableSorter.getStore().setValue(IPreferenceIds.SYNCVIEW_VIEW_TABLESORT, column);
SyncViewerTableSorter.getStore().setValue(IPreferenceIds.SYNCVIEW_VIEW_TABLESORT_REVERSED, false);
tableViewer.setSorter(new SyncViewerTableSorter());
}
}
};
}
public SyncViewerTableSorter() {
super(ResourceSorter.NAME);
this.columnNumber = getStore().getInt(IPreferenceIds.SYNCVIEW_VIEW_TABLESORT);
this.reversed = getStore().getBoolean(IPreferenceIds.SYNCVIEW_VIEW_TABLESORT_REVERSED);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
public int compare(Viewer viewer, Object e1, Object e2) {
IResource resource1 = getResource(e1);
IResource resource2 = getResource(e2);
int result = 0;
if (resource1 == null || resource2 == null) {
result = super.compare(viewer, e1, e2);
} else {
int[] columnSortOrder = SORT_ORDERS_BY_COLUMN[columnNumber];
for (int i = 0; i < columnSortOrder.length; ++i) {
result = compareColumnValue(columnSortOrder[i], resource1, resource2);
if (result != 0)
break;
}
}
if (reversed)
result = -result;
return result;
}
/**
* Compares two resources, based only on the value of the specified column.
*/
int compareColumnValue(int columnNumber, IResource e1, IResource e2) {
switch (columnNumber) {
case COL_NAME: /* revision */
// Category behavior from superclass
int cat1 = category(e1);
int cat2 = category(e2);
if (cat1 != cat2)
return cat1 - cat2;
// cat1 == cat2
return getCollator().compare(e1.getName(), e2.getName());
case COL_PARENT: /* parent */
return getCollator().compare(e1.getParent().getFullPath().toString(), e2.getParent().getFullPath().toString());
default:
return 0;
}
}
/**
* Returns the number of the column by which this is sorting.
*/
public int getColumnNumber() {
return columnNumber;
}
/**
* Returns true for descending, or false
* for ascending sorting order.
*/
public boolean isReversed() {
return reversed;
}
/**
* Sets the sorting order.
*/
public void setReversed(boolean newReversed) {
reversed = newReversed;
}
private static IPreferenceStore getStore() {
return TeamUIPlugin.getPlugin().getPreferenceStore();
}
}