blob: c80c44272b4b773455878dbb747cce865fa5686a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Ericsson
*
* 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:
* Ericsson Communications - Initial Implementation
******************************************************************************/
package org.eclipse.egerrit.internal.ui.table.model;
import org.eclipse.egerrit.internal.model.impl.ChangeMessageInfoImpl;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
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;
import org.eclipse.swt.widgets.TreeItem;
/**
* This class implements the History table UI view column sorter.
*
* @since 1.0
*/
public class HistoryTableSorter extends ViewerSorter {
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
// The target column
private int fColumnIndex = 0;
// ------------------------------------------------------------------------
// Constructor
// ------------------------------------------------------------------------
public HistoryTableSorter(int columnIndex) {
super();
this.fColumnIndex = columnIndex;
}
// ------------------------------------------------------------------------
// ViewerSorter
// ------------------------------------------------------------------------
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
@Override
public int compare(Viewer viewer, Object item1, Object item2) {
int sortDirection = SWT.NONE;
if (viewer instanceof TableViewer) {
sortDirection = ((TableViewer) viewer).getTable().getSortDirection();
} else if (viewer instanceof TreeViewer) {
sortDirection = ((TreeViewer) viewer).getTree().getSortDirection();
}
// The comparison result (< 0, == 0, > 0)
int result = 0;
// We are dealing with ChangeInfo but just in case...
if (viewer instanceof TableViewer && item1 instanceof ChangeMessageInfoImpl
&& item2 instanceof ChangeMessageInfoImpl) {
ChangeMessageInfoImpl changeInfo1 = (ChangeMessageInfoImpl) item1;
ChangeMessageInfoImpl changeInfo2 = (ChangeMessageInfoImpl) item2;
String val1 = null;
String val2 = null;
switch (fColumnIndex) {
case 0: // Comment
result = Boolean.toString(changeInfo1.isComment()).compareTo(Boolean.toString(changeInfo2.isComment()));
break;
case 1: // date
val1 = changeInfo1.getDate();
val2 = changeInfo2.getDate();
if (val1 != null && val2 != null) {
result = val1.compareTo(val2);
}
break;
default:
result = defaultCompare(viewer, item1, item2);
break;
}
} else {
result = defaultCompare(viewer, item1, item2);
}
if (sortDirection != SWT.UP) {
result = -result;
}
return result;
}
private int defaultCompare(Viewer aViewer, Object aE1, Object aE2) {
if (aViewer instanceof TableViewer) {
return defaultSortTable(aViewer, aE1, aE2);
}
else if (aViewer instanceof TreeViewer) {
return defaultSortTree(aViewer, aE1, aE2);
}
return 0;
}
/**
* @param aViewer
* @param aE1
* @param aE2
* @return
*/
private int defaultSortTree(Viewer aViewer, Object aE1, Object aE2) {
TreeViewer tv = (TreeViewer) aViewer;
tv.getTree().setSortColumn(tv.getTree().getColumn(fColumnIndex));
int idx1 = -1;
int idx2 = -1;
Object[] listObj = tv.getTree().getItems();
for (int i = 0; i < listObj.length; i++) {
Object obj = ((TreeItem) listObj[i]).getData();
((TreeItem) listObj[i]).setExpanded(true);
if (obj != null) {
if (obj.equals(aE1)) {
idx1 = i;
} else if (obj.equals(aE2)) {
idx2 = i;
}
if (idx1 > 0 && idx2 > 0) {
break;
}
}
}
int order = 0;
if (idx1 > -1 && idx2 > -1) {
String str1 = tv.getTree().getItems()[idx1].getText(this.fColumnIndex);
String str2 = tv.getTree().getItems()[idx2].getText(this.fColumnIndex);
order = str1.compareTo(str2);
}
return order;
}
/**
* @param aViewer
* @param aE1
* @param aE2
* @return
*/
private int defaultSortTable(Viewer aViewer, Object aE1, Object aE2) {
// We are in a table
TableViewer tv = (TableViewer) aViewer;
tv.getTable().setSortColumn(tv.getTable().getColumn(fColumnIndex));
// Lookup aE1 and aE2
int idx1 = -1;
int idx2 = -1;
for (int i = 0; i < tv.getTable().getItemCount(); i++) {
Object obj = tv.getElementAt(i);
if (obj.equals(aE1)) {
idx1 = i;
} else if (obj.equals(aE2)) {
idx2 = i;
}
if (idx1 != -1 && idx2 != -1) {
break;
}
}
// Compare the respective fields
int order = 0;
if (idx1 > -1 && idx2 > -1) {
String str1 = tv.getTable().getItems()[idx1].getText(this.fColumnIndex);
String str2 = tv.getTable().getItems()[idx2].getText(this.fColumnIndex);
order = str1.compareTo(str2);
}
return order;
}
// ------------------------------------------------------------------------
// Static methods
// ------------------------------------------------------------------------
/**
* Bind a sorter to each table column
*
* @param aTableViewer
*/
public static void bind(final TableViewer aTableViewer) {
for (int i = 0; i < aTableViewer.getTable().getColumnCount(); i++) {
final int columnNum = i;
TableColumn column = aTableViewer.getTable().getColumn(i);
column.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
HistoryTableSorter sorter = new HistoryTableSorter(columnNum);
Table table = aTableViewer.getTable();
TableColumn currentColumn = (TableColumn) e.widget;
table.setSortColumn(currentColumn);
table.setSortDirection(table.getSortDirection() == SWT.UP ? SWT.DOWN : SWT.UP);
aTableViewer.setComparator(sorter);
aTableViewer.setSelection(aTableViewer.getSelection(), true);
}
});
}
}
}