/******************************************************************************* * Copyright (c) 2015 IBM Corporation 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: * IBM Corporation - initial API and implementation * Zend Technologies *******************************************************************************/ package org.eclipse.php.internal.ui.util; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import org.eclipse.jface.util.Policy; import org.eclipse.jface.viewers.*; 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; /** * The class can be used to sort content of * {@link org.eclipse.swt.widgets.Table}. Compared values are labels displayed * in table columns. * * Sorting is fired by clicking column header. */ public class TableSorter { private TableViewer fTableViewer = null; private ViewerComparator fViewerComparator = null; private Comparator<Object> fComparator; private HashMap<TableColumn, SelectionAdapter> fSelectionAdapters = null; /** * Constructor. */ public TableSorter() { this(null); } /** * Constructor. * * @param comparator */ public TableSorter(Comparator<Object> comparator) { fComparator = comparator; fSelectionAdapters = new HashMap<>(); fViewerComparator = new ViewerComparator() { @Override public int compare(Viewer viewer, Object e1, Object e2) { return compareElements(e1, e2); } }; } /** * Constructor. * * @param comparator * @param viewer * table viewer */ public TableSorter(TableViewer viewer, Comparator<Object> comparator) { this(comparator); setTableViewer(viewer); } protected void tableColumnClicked(TableColumn column) { Table table = column.getParent(); if (column.equals(table.getSortColumn())) { table.setSortDirection(table.getSortDirection() == SWT.UP ? SWT.DOWN : SWT.UP); } else { table.setSortColumn(column); table.setSortDirection(SWT.UP); } fTableViewer.refresh(); } protected int compareElements(Object e1, Object e2) { ILabelProvider labelProvider = (ILabelProvider) fTableViewer.getLabelProvider(); Table table = fTableViewer.getTable(); String text1 = ""; //$NON-NLS-1$ String text2 = ""; //$NON-NLS-1$ if (labelProvider instanceof ITableLabelProvider) { ITableLabelProvider tableLabelProvider = (ITableLabelProvider) labelProvider; int index = Arrays.asList(table.getColumns()).indexOf(table.getSortColumn()); if (index != -1) { text1 = tableLabelProvider.getColumnText(e1, index); text2 = tableLabelProvider.getColumnText(e2, index); } } else { text1 = labelProvider.getText(e1); text2 = labelProvider.getText(e2); } int result = getComparator().compare(text1, text2); return table.getSortDirection() == SWT.UP ? result : -result; } protected void registerTableViewer(TableViewer viewer) { if (viewer == null) return; viewer.setComparator(fViewerComparator); addColumnSelectionListeners(viewer); } protected void unregisterTableViewer(TableViewer viewer) { if (viewer == null) return; if (viewer.getComparator() == fViewerComparator) viewer.setComparator(null); removeColumnSelectionListeners(viewer); } protected void addColumnSelectionListeners(TableViewer viewer) { if (viewer == null) return; for (TableColumn column : viewer.getTable().getColumns()) { addColumnSelectionListener(column); } } protected void removeColumnSelectionListeners(TableViewer viewer) { if (viewer == null) return; for (Map.Entry<TableColumn, SelectionAdapter> entry : fSelectionAdapters.entrySet()) { TableColumn tableColumn = entry.getKey(); SelectionAdapter selectionAdapter = entry.getValue(); tableColumn.removeSelectionListener(selectionAdapter); } fSelectionAdapters.clear(); } protected void addColumnSelectionListener(TableColumn column) { SelectionAdapter selectionAdapter = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { tableColumnClicked((TableColumn) e.widget); } }; column.addSelectionListener(selectionAdapter); fSelectionAdapters.put(column, selectionAdapter); } public void setTableViewer(TableViewer viewer) { if (fTableViewer == viewer) return; unregisterTableViewer(fTableViewer); registerTableViewer(viewer); fTableViewer = viewer; } public TableViewer getTableViewer() { return fTableViewer; } protected Comparator<Object> getComparator() { if (fComparator == null) { fComparator = Policy.getComparator(); } return fComparator; } }