/*******************************************************************************
* Copyright (c) 2009 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.actions;
import org.eclipse.dltk.core.IImportContainer;
import org.eclipse.dltk.core.ISourceRange;
import org.eclipse.dltk.core.ISourceReference;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.ui.ModelElementSorter;
import org.eclipse.dltk.ui.viewsupport.SourcePositionSorter;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.php.internal.ui.IPHPHelpContextIds;
import org.eclipse.php.internal.ui.PHPUIMessages;
import org.eclipse.php.internal.ui.PHPUiPlugin;
import org.eclipse.php.internal.ui.outline.PHPOutlineContentProvider.UseStatementsNode;
import org.eclipse.php.internal.ui.util.PHPPluginImages;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.ui.PlatformUI;
public class SortAction extends Action {
public static final String PREF_IS_SORTED = "SortingAction.isChecked"; //$NON-NLS-1$
private TreeViewer treeViewer;
private ModelElementSorter fComparator = new ModelElementSorter() {
@Override
public int compare(org.eclipse.jface.viewers.Viewer viewer, Object e1, Object e2) {
if (e1 instanceof UseStatementsNode) {
return -1;
} else if (e2 instanceof UseStatementsNode) {
return 1;
} else {
return super.compare(viewer, e1, e2);
}
};
};
private SourcePositionSorter fSourcePositonComparator = new SourcePositionSorter() {
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
if (e1 instanceof IImportContainer || e2 instanceof IImportContainer) {
try {
if (e1 == null || e2 == null) {
return 0;
}
ISourceRange sr1 = ((ISourceReference) e1).getSourceRange();
ISourceRange sr2 = ((ISourceReference) e2).getSourceRange();
if (sr1 == null || sr2 == null)
return 0;
return sr1.getOffset() - sr2.getOffset();
} catch (ModelException e) {
return 0;
}
}
return super.compare(viewer, e1, e2);
}
};
public SortAction(TreeViewer treeViewer) {
super();
this.treeViewer = treeViewer;
PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IPHPHelpContextIds.OUTLINE_VIEW);
setText(PHPUIMessages.PHPOutlinePage_Sort_label);
PHPPluginImages.setLocalImageDescriptors(this, "alphab_sort_co.png"); //$NON-NLS-1$
setToolTipText(PHPUIMessages.PHPOutlinePage_Sort_tooltip);
setDescription(PHPUIMessages.PHPOutlinePage_Sort_description);
boolean checked = PHPUiPlugin.getDefault().getPreferenceStore().getBoolean(PREF_IS_SORTED);
valueChanged(checked, false);
}
@Override
public void run() {
valueChanged(isChecked(), true);
}
private void valueChanged(final boolean on, boolean store) {
setChecked(on);
BusyIndicator.showWhile(treeViewer.getControl().getDisplay(), new Runnable() {
@Override
public void run() {
if (on) {
treeViewer.setComparator(fComparator);
// fDropSupport.setFeedbackEnabled(false);
} else {
treeViewer.setComparator(fSourcePositonComparator);
// fDropSupport.setFeedbackEnabled(true);
}
}
});
if (store)
PHPUiPlugin.getDefault().getPreferenceStore().setValue(PREF_IS_SORTED, on);
}
}