/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.view.console;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import de.rcenvironment.core.component.execution.api.ConsoleRow;
/**
* Provides functionality of sorting a table column.
* You can choose which column to sort on and in which direction.
*
* @author Doreen Seider
*/
public class ConsoleColumnSorter extends ViewerSorter {
private static final int FIRST_IS_EQUAL = 0;
private static final int FIRST_IS_GREATER = 1;
private static final int FIRST_IS_LESS = -1;
private static final int SORT_ASCENDING = 1;
private static final int SORT_DESCENDING = 2;
private int direction;
private int columnToSort;
/**
* Sets the default sorting column and direction.
*/
public ConsoleColumnSorter() {
columnToSort = 1;
direction = SORT_ASCENDING;
}
/**
* Lets set another column than default one to sort on.
*
* @param column The index (beginning with 0) of column to sort.
*/
public void setColumn(int column) {
if (column == columnToSort) {
// same column as last sort: toggle direction
if (SORT_ASCENDING == direction) {
direction = SORT_DESCENDING;
} else {
direction = SORT_ASCENDING;
}
} else {
// new column to sort
columnToSort = column;
direction = SORT_ASCENDING;
}
}
@Override
public int compare(Viewer viewer, Object object1, Object object2) {
int returnValue = FIRST_IS_EQUAL;
if (object1 instanceof ConsoleRow && object2 instanceof ConsoleRow) {
ConsoleRow cr1 = (ConsoleRow) object1;
ConsoleRow cr2 = (ConsoleRow) object2;
switch (columnToSort) {
// type column
case 0:
if (cr1.getType() == cr2.getType()) {
returnValue = FIRST_IS_EQUAL;
} else if (cr1.getType() == ConsoleRow.Type.TOOL_ERROR) {
returnValue = FIRST_IS_GREATER;
} else if (cr1.getType() == ConsoleRow.Type.TOOL_OUT) {
if (cr2.getType() == ConsoleRow.Type.TOOL_ERROR) {
returnValue = FIRST_IS_LESS;
} else {
returnValue = FIRST_IS_GREATER;
}
} else {
returnValue = FIRST_IS_LESS;
}
break;
// timestamp column
case 1:
if (cr1.getTimestamp() == cr2.getTimestamp()) {
returnValue = cr1.compareTo(cr2);
} else {
returnValue = new Long(cr1.getTimestamp()).compareTo(cr2.getTimestamp());
}
break;
// message column
case 2:
returnValue = cr1.getPayload().compareTo(cr2.getPayload());
break;
// component column
case 3:
returnValue = cr1.getComponentName().compareTo(cr2.getComponentName());
break;
// workflow column
case 4:
returnValue = cr1.getWorkflowName().compareTo(cr2.getWorkflowName());
break;
// shouldn't occur
default:
break;
}
// is DESCENDING? then flip sorting!
if (SORT_DESCENDING == direction) {
returnValue = -returnValue;
}
}
return returnValue;
}
}