/* * Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved. * * This program and the accompanying materials are made available * under the terms of the Eclipse Public License, Version 1.0, * which accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html * */ package net.rim.ejde.internal.ui.editors.locale; import java.util.Comparator; import java.util.Vector; import net.rim.ejde.internal.core.ContextManager; import net.rim.sdk.resourceutil.ResourceElement; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.TableColumn; public class ResourceSorter extends ViewerSorter { private static class SortInfo { int _columnIndex; Comparator< ResourceElement > _comparator; boolean _descending; } private static Image _ascendingImage; private static Image _descendingImage; private TableViewer _viewer; private Vector< SortInfo > _sortInfos; static { _ascendingImage = ContextManager.imageDescriptorFromPlugin( ContextManager.PLUGIN_ID, "icons/obj16/uparrow.png" ) .createImage(); _descendingImage = ContextManager.imageDescriptorFromPlugin( ContextManager.PLUGIN_ID, "icons/obj16/downarrow.png" ) .createImage(); } public ResourceSorter( TableViewer viewer, Vector< Comparator< ResourceElement >> comparators ) { _viewer = viewer; _sortInfos = createSortInfos( comparators ); setColumnSortIcon( 0, false ); } public int compare( Viewer viewer, Object o1, Object o2 ) { ResourceElement element1 = (ResourceElement) o1; ResourceElement element2 = (ResourceElement) o2; for( SortInfo sortInfo : _sortInfos ) { int result = sortInfo._comparator.compare( element1, element2 ); if( result != 0 ) { return sortInfo._descending ? -result : result; } } return 0; } private void createSelectionListener( TableColumn column, final SortInfo sortInfo ) { column.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { sort( sortInfo ); } } ); } private Vector< SortInfo > createSortInfos( Vector< Comparator< ResourceElement >> comparators ) { TableColumn[] columns = _viewer.getTable().getColumns(); Vector< SortInfo > sortInfos = new Vector< SortInfo >( columns.length ); for( int i = 0; i < columns.length; ++i ) { SortInfo sortInfo = new SortInfo(); sortInfo._columnIndex = i; sortInfo._comparator = comparators.elementAt( i ); sortInfo._descending = false; sortInfos.add( sortInfo ); createSelectionListener( columns[ i ], sortInfo ); } return sortInfos; } private void setColumnSortIcon( int columnIndex, boolean descending ) { TableColumn[] columns = _viewer.getTable().getColumns(); for( int i = 0; i < columns.length; ++i ) { if( i == columnIndex ) { if( descending ) { columns[ i ].setImage( _descendingImage ); } else { columns[ i ].setImage( _ascendingImage ); } } else { columns[ i ].setImage( null ); } } } private void sort( SortInfo sortInfo ) { if( sortInfo == _sortInfos.elementAt( 0 ) ) { // Column was clicked when it was already being used...reverse sort // ordering. sortInfo._descending = !sortInfo._descending; } else { // New column has been chosen...move this SortInfo to the front of // the list. _sortInfos.remove( sortInfo ); _sortInfos.insertElementAt( sortInfo, 0 ); sortInfo._descending = false; } setColumnSortIcon( sortInfo._columnIndex, sortInfo._descending ); _viewer.refresh(); } }