/*
* Copyright 2003-2010 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.codehaus.groovy.eclipse.editor.outline;
import org.codehaus.groovy.eclipse.editor.GroovyEditor;
import org.eclipse.jdt.core.ISourceReference;
import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.internal.ui.javaeditor.JavaOutlinePage;
import org.eclipse.jdt.internal.ui.viewsupport.SourcePositionComparator;
import org.eclipse.jdt.ui.JavaElementComparator;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.IPageSite;
/**
* @author Maxime Hamm
* @created 7 avr. 2011
*/
public class GroovyOutlinePage extends JavaOutlinePage {
private OCompilationUnit outlineUnit = null;
public GroovyOutlinePage(String contextMenuID, GroovyEditor editor, OCompilationUnit unit) {
super(contextMenuID, editor);
outlineUnit = unit;
}
public void refresh() {
initializeViewer();
outlineUnit.refresh();
JavaOutlineViewer outlineViewer = getOutlineViewer();
if (outlineViewer != null) {
outlineViewer.refresh();
}
}
public OCompilationUnit getOutlineCompilationUnit() {
return outlineUnit;
}
@Override
protected void contextMenuAboutToShow(IMenuManager menu) {
// none
}
private boolean isInitialized = false;
private void initializeViewer() {
if (isInitialized) {
return;
}
// remove actions
IPageSite site = getSite();
if (site != null) {
IActionBars actionBars = site.getActionBars();
if (actionBars != null) {
IToolBarManager toolBarManager = actionBars.getToolBarManager();
if (toolBarManager != null) {
toolBarManager.removeAll();
toolBarManager.add(new GroovyLexicalSortingAction());
toolBarManager.update(true);
}
}
}
isInitialized = true;
}
@Override
public void createControl(Composite parent) {
super.createControl(parent);
// categories are not supported by the groovy parser.
// and the CategoryFilter filter is causing NotPresentExceptions when the
// top level type goes away, so disable it.
ViewerFilter[] filters = getOutlineViewer().getFilters();
for (ViewerFilter filter : filters) {
if (filter.getClass().getName().contains("CategoryFilter")) {
getOutlineViewer().removeFilter(filter);
}
}
}
/**
* @param caretOffset
* @return
*/
public ISourceReference getOutlineElmenetAt(int caretOffset) {
return getOutlineCompilationUnit().getOutlineElementAt(caretOffset);
}
/****************************************************************
* @author Maxime HAMM
* @created 7 avr. 2011
*/
public class GroovyLexicalSortingAction extends Action {
private JavaElementComparator fComparator = new JavaElementComparator();
private SourcePositionComparator fSourcePositonComparator = new SourcePositionComparator();
public GroovyLexicalSortingAction() {
super();
PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IJavaHelpContextIds.LEXICAL_SORTING_OUTLINE_ACTION);
setText("Link with Editor");
JavaPluginImages.setLocalImageDescriptors(this, "alphab_sort_co.gif"); //$NON-NLS-1$
boolean checked = JavaPlugin.getDefault().getPreferenceStore().getBoolean("LexicalSortingAction.isChecked"); //$NON-NLS-1$
valueChanged(checked, false);
}
@Override
public void run() {
valueChanged(isChecked(), true);
}
private void valueChanged(final boolean on, boolean store) {
setChecked(on);
BusyIndicator.showWhile(getOutlineViewer().getControl().getDisplay(), new Runnable() {
public void run() {
if (on) {
getOutlineViewer().setComparator(fComparator);
} else {
getOutlineViewer().setComparator(fSourcePositonComparator);
}
}
});
if (store)
JavaPlugin.getDefault().getPreferenceStore().setValue("LexicalSortingAction.isChecked", on); //$NON-NLS-1$
}
}
}