Java tutorial
/******************************************************************************* * Copyright (c) 2008-2011 Chair for Applied Software Engineering, * Technische Universitaet Muenchen. * 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: ******************************************************************************/ package org.eclipse.emf.ecp.common; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerColumn; import org.eclipse.jface.viewers.ViewerComparator; /** * Super-class for sorting column viewer, with ability to turn sorting on and off. * * @author zardosht */ public abstract class ColumnViewerSorter extends ViewerComparator { /** * Direction constant used to show right direction arrow on column header. */ public static final int ASC = 1; /** * Direction constant used to show right direction arrow on column header. */ public static final int DESC = -1; private int direction = 1; private ColumnLabelProvider columnLabelProvider; private final ColumnViewer viewer; private boolean sortingEnabled; /** * Constructor. * * @param viewer ColumnViewer * @param columnLabelProvider ColumnLabelProvider */ public ColumnViewerSorter(ColumnViewer viewer, ColumnLabelProvider columnLabelProvider) { this.columnLabelProvider = columnLabelProvider; this.viewer = viewer; } /** * . This is used to set the right direction arrow at column header and refresh the viewer. * * @param sorter sorter * @param direction direction */ protected void setSorter(ColumnViewerSorter sorter, int direction) { if (!sortingEnabled) { sortingEnabled = true; } this.direction = direction; if (viewer.getComparator() == sorter) { viewer.refresh(); } else { viewer.setComparator(sorter); } } /** * . {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public int compare(Viewer viewer, Object e1, Object e2) { if (!sortingEnabled) { return 0; } int cat1 = category(e1); int cat2 = category(e2); if (cat1 != cat2) { return cat1 - cat2; } String str1 = columnLabelProvider.getText(e1); String str2 = columnLabelProvider.getText(e2); if (str1 == null) { str1 = ""; } if (str2 == null) { str2 = ""; } // Handle integers if (str1.matches("[0-9]*") || str1.equals("")) { if (str2.matches("[0-9]*") || str2.equals("")) { return compareIntegers(str1, str2); } } // use the comparator to compare the strings if (direction == ASC) { return getComparator().compare(str1, str2); } else { return getComparator().compare(str2, str1); } } private int compareIntegers(String str1, String str2) { if (str1.equals("")) { str1 = "0"; } if (str2.equals("")) { str2 = "0"; } int int1; int int2; try { int1 = Integer.parseInt(str1); int2 = Integer.parseInt(str2); } catch (NumberFormatException e) { return 0; } if (direction == ASC) { return int1 - int2; } else { return int2 - int1; } } /** * @param sortingEnabled the sortingEnabled to set */ public void setSortingEnabled(boolean sortingEnabled) { this.sortingEnabled = sortingEnabled; } /** * @return the sortingEnabled */ public boolean isSortingEnabled() { return sortingEnabled; } /** * @param direction the direction to set */ public void setDirection(int direction) { this.direction = direction; } /** * @return the direction */ public int getDirection() { return direction; } /** * @return viewer column */ public abstract ViewerColumn getViewerColumn(); /** * @param columnLabelProvider the columnLabelProvider to set */ public void setColumnLabelProvider(ColumnLabelProvider columnLabelProvider) { this.columnLabelProvider = columnLabelProvider; } /** * @return the columnLabelProvider */ public ColumnLabelProvider getColumnLabelProvider() { return columnLabelProvider; } /** * @return the viewer */ public ColumnViewer getViewer() { return viewer; } }