blob: ec4d9b963b2140c8a48e0e50b4dc7ad2a16c1e70 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 The University of York.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* Dimitrios Kolovos - initial API and implementation
******************************************************************************/
package org.eclipse.epsilon.common.dt.editor.outline;
import org.eclipse.epsilon.common.dt.EpsilonCommonsPlugin;
import org.eclipse.epsilon.common.dt.editor.AbstractModuleEditor;
import org.eclipse.epsilon.common.dt.editor.IModuleParseListener;
import org.eclipse.epsilon.common.dt.util.EclipseUtil;
import org.eclipse.epsilon.common.module.IModule;
import org.eclipse.epsilon.common.module.ModuleElement;
import org.eclipse.epsilon.eol.util.ReflectionUtil;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
public class ModuleContentOutlinePage extends ContentOutlinePage implements IModuleParseListener {
protected IDocumentProvider documentProvider;
protected IModule module;
protected AbstractModuleEditor editor;
protected ILabelProvider labelProvider;
protected ModuleContentProvider contentProvider;
protected Action linkWithEditorAction;
public ModuleContentOutlinePage(IDocumentProvider documentProvider,
AbstractModuleEditor editor, ILabelProvider labelProvider,
ModuleContentProvider contentProvider) {
super();
this.documentProvider = documentProvider;
this.editor = editor;
this.labelProvider = labelProvider;
this.contentProvider = contentProvider;
addSelectionChangedListener(this);
}
@Override
public void createControl(Composite parent) {
super.createControl(parent);
getTreeViewer().setContentProvider(contentProvider);
getTreeViewer().setLabelProvider(labelProvider);
getSite().setSelectionProvider(getTreeViewer());
IToolBarManager toolbarManager = getSite().getActionBars().getToolBarManager();
toolbarManager.add(new AlphabeticallySortAction());
linkWithEditorAction = new LinkWithEditorAction();
toolbarManager.add(linkWithEditorAction);
}
public boolean isReady() {
return notDisplayed() || getTreeViewer()!=null;
}
private boolean notDisplayed() {
return getControl() == null || !getControl().isVisible();
}
@Override
public void selectionChanged(SelectionChangedEvent event) {
if (!linkWithEditorAction.isChecked()) return;
try {
ModuleElement selected = editor.adaptToAST(((IStructuredSelection) event.getSelection()).getFirstElement());
if (selected != null) {
ModuleElement focused = contentProvider.getFocusedModuleElement(selected);
if (focused == null) focused = selected;
EclipseUtil.openEditorAt(focused);
}
}
catch (Exception ex) {}
}
public IModule getModule() {
return module;
}
public void setModule(IModule module) {
this.module = module;
}
class AlphabeticallySortAction extends Action {
AlphabeticalSorter alphabeticalSorter = null;
TreeViewer treeViewer = null;
public AlphabeticallySortAction(){
super(null,AS_CHECK_BOX);
this.setImageDescriptor(EpsilonCommonsPlugin.getDefault().getImageDescriptor("icons/alphabeticalSorter.gif"));
this.setDescription("Sorts the contents of the view alphabetically");
alphabeticalSorter = new AlphabeticalSorter();
treeViewer = (TreeViewer) ReflectionUtil.getFieldValue(ModuleContentOutlinePage.this ,"treeViewer");
}
@Override
public void run() {
treeViewer.setComparator(isChecked() ? alphabeticalSorter : null);
}
}
class LinkWithEditorAction extends Action {
public LinkWithEditorAction(){
super("Link with editor",AS_CHECK_BOX);
this.setDescription("Links the outline view with the editor");
this.setImageDescriptor(EpsilonCommonsPlugin.getDefault().getImageDescriptor("icons/linkwitheditor.gif"));
this.setChecked(true);
}
}
@Override
public void moduleParsed(AbstractModuleEditor editor, final IModule module) {
if (getSite() != null) {
getSite().getShell().getDisplay().asyncExec(() -> {
if (getTreeViewer() != null && !getTreeViewer().getTree().isDisposed()) {
getTreeViewer().setInput(getOutlineRoot(module));
//getTreeViewer().expandAll();
}
});
}
}
public Object getOutlineRoot(IModule module) {
return module;
}
}