/*******************************************************************************
* Copyright (c) 2016 ARM Ltd. and others
* 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:
* Ivor Williams - Initial API and implementation: https://dzone.com/articles/javaswt-click-table-column
* ARM Ltd and ARM Germany GmbH - application-specific implementation
*******************************************************************************/
package com.arm.cmsis.pack.installer.ui.views;
import java.util.Arrays;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
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.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import com.arm.cmsis.pack.common.CmsisConstants;
import com.arm.cmsis.pack.data.ICpPackCollection;
import com.arm.cmsis.pack.item.ICmsisItem;
import com.arm.cmsis.pack.ui.tree.ColumnAdvisor;
/**
* The Tree comparator used to sort the rows of each column
*/
public class TreeColumnComparator extends ViewerComparator {
protected final TreeViewer treeViewer;
protected final ColumnAdvisor columnAdvisor;
public TreeColumnComparator(TreeViewer viewer, ColumnAdvisor advisor) {
treeViewer = viewer;
columnAdvisor = advisor;
addColumnSelectionListeners(treeViewer);
}
private void addColumnSelectionListeners(TreeViewer treeViewer) {
TreeColumn[] columns = treeViewer.getTree().getColumns();
for (int i = 0; i < columns.length; i++) {
addColumnSelectionListener(columns[i]);
}
}
private void addColumnSelectionListener(TreeColumn column) {
column.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
treeColumnClicked((TreeColumn) e.widget);
}
});
}
void treeColumnClicked(TreeColumn column) {
Tree tree = column.getParent();
if (column.equals(tree.getSortColumn())) {
tree.setSortDirection(tree.getSortDirection() == SWT.UP ? SWT.DOWN : SWT.UP);
} else {
tree.setSortColumn(column);
tree.setSortDirection(SWT.UP);
}
treeViewer.refresh();
}
protected int getColumnIndex() {
Tree tree = treeViewer.getTree();
int index = Arrays.asList(tree.getColumns()).indexOf(tree.getSortColumn());
if (index == -1) {
index = 0;
}
return index;
}
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
ICmsisItem cp1 = (ICmsisItem)e1;
ICmsisItem cp2 = (ICmsisItem)e2;
// Error packs should always be shown on top
// Never switch the Device Specific and Generic row
if (CmsisConstants.ERRORS.equals(cp1.getTag())) {
return -1;
} else if (CmsisConstants.ERRORS.equals(cp2.getTag())) {
return 1;
} else if (cp1 instanceof ICpPackCollection && cp2 instanceof ICpPackCollection) {
return 0;
}
Tree tree = treeViewer.getTree();
int index = Arrays.asList(tree.getColumns()).indexOf(tree.getSortColumn());
if (index == -1) {
index = 0;
}
int result = 0;
if (index == 0 || index == 2) {
ColumnLabelProvider colLabelProvider = (ColumnLabelProvider) treeViewer.getLabelProvider(index);
String str1 = colLabelProvider.getText(e1);
String str2 = colLabelProvider.getText(e2);
result = str1 == null ? (str2 == null ? 0 : 1) : str1.compareToIgnoreCase(str2);
} else if (index == 1) {
String str1 = columnAdvisor.getString(e1, index);
String str2 = columnAdvisor.getString(e2, index);
result = str1.compareToIgnoreCase(str2);
}
return tree.getSortDirection() == SWT.DOWN ? -result : result;
}
}