/******************************************************************************* * Copyright (c) 2006 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 *******************************************************************************/ package org.erlide.ui.actions; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.ViewerComparator; import org.erlide.ui.ErlideImage; import org.erlide.ui.navigator.ErlElementSorter; public class SortAction extends Action { private boolean fSorted; private int fSortedHow; private final StructuredViewer fViewer; private final ViewerComparator fComparator; private final ViewerComparator fComparator2; private final ViewerComparator fDefaultComparator; private final IPreferenceStore fStore; /** * @param viewer * @param tooltipText * @param sorter * @param defaultSorter * @param listener * @param useMiniImage */ public SortAction(final StructuredViewer viewer, final String tooltipText, final ViewerComparator comparator, final ViewerComparator comparator2, final IPropertyChangeListener listener, final boolean useMiniImage, final IPreferenceStore store) { super(tooltipText, IAction.AS_CHECK_BOX); // Set the tooltip setToolTipText(tooltipText); // Set the default comparator fDefaultComparator = null; // Set the viewer fViewer = viewer; // Set prefs store fStore = store; // Set the comparators fComparator = comparator; fComparator2 = comparator2; // Determine if the viewer is already sorted fSorted = fStore != null && fStore.getBoolean("erlide.sortedOutline"); fSortedHow = fStore != null ? fStore.getInt("erlide.sortedOutlineHow") : ErlElementSorter.SORT_ON_NAME; setComparator(); // Set the status of this action depending on whether it is sorted or // not setChecked(fSorted); // Set the image setImage(); // If a listener was specified, use it if (listener != null) { addListenerObject(listener); } } /** * */ private void setComparator() { if (fSorted) { if (fSortedHow == ErlElementSorter.SORT_ON_EXPORT) { fViewer.setComparator(fComparator2); } else { fViewer.setComparator(fComparator); } } else { fViewer.setComparator(fDefaultComparator); } } @Override public void run() { // Toggle sorting in three steps if (fSorted) { if (fSortedHow == ErlElementSorter.SORT_ON_NAME) { fSortedHow = ErlElementSorter.SORT_ON_EXPORT; } else { fSorted = false; } } else { // Sorting is off // Turn it on (name) fSorted = true; fSortedHow = ErlElementSorter.SORT_ON_NAME; } setComparator(); if (fStore != null) { fStore.setValue("erlide.sortedOutline", fSorted); final int how = fViewer.getComparator() == fComparator2 ? ErlElementSorter.SORT_ON_EXPORT : ErlElementSorter.SORT_ON_NAME; fStore.setValue("erlide.sortedOutlineHow", how); } setChecked(fSorted); setImage(); } private void setImage() { final ImageDescriptor desc = fSorted && fSortedHow == ErlElementSorter.SORT_ON_EXPORT ? ErlideImage.EXPORTED_SORT.getDescriptor() : ErlideImage.ALPHAB_SORT.getDescriptor(); setImageDescriptor(desc); } }