package com.redhat.ceylon.eclipse.code.outline;
import static com.redhat.ceylon.eclipse.code.outline.HierarchyView.showHierarchyView;
import static com.redhat.ceylon.eclipse.util.EditorUtil.getCurrentEditor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.views.contentoutline.ContentOutline;
import com.redhat.ceylon.model.typechecker.model.Declaration;
import com.redhat.ceylon.compiler.typechecker.tree.Node;
import com.redhat.ceylon.compiler.typechecker.tree.Tree;
import com.redhat.ceylon.eclipse.code.editor.CeylonEditor;
import com.redhat.ceylon.eclipse.code.parse.CeylonParseController;
import com.redhat.ceylon.eclipse.util.Nodes;
public class ShowInHierarchyAction extends Action implements IObjectActionDelegate {
private IWorkbenchPartSite site;
protected Declaration declaration;
private ContentOutline outlineView;
@Override
public void selectionChanged(IAction action, ISelection selection) {
if (outlineView==null) return;
try {
final ITreeSelection oultineSelection =
(ITreeSelection) outlineView.getSelection();
CeylonOutlineNode on =
(CeylonOutlineNode) oultineSelection.getFirstElement();
if (on!=null) {
IEditorPart currentEditor = getCurrentEditor();
if (currentEditor instanceof CeylonEditor) {
CeylonParseController parseController =
((CeylonEditor) currentEditor).getParseController();
Tree.CompilationUnit rootNode =
parseController.getLastCompilationUnit();
if (rootNode!=null) {
Node node =
Nodes.findNode(rootNode,
on.getStartOffset(),
on.getEndOffset());
if (node instanceof Tree.Declaration) {
declaration =
((Tree.Declaration) node).getDeclarationModel();
action.setEnabled(isValidSelection());
return; //early exit
}
}
}
}
declaration=null;
action.setEnabled(false);
}
catch (Exception e) {
action.setEnabled(false);
}
}
@Override
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
outlineView = (ContentOutline) targetPart;
site = targetPart.getSite();
}
@Override
public void run(IAction action) {
run();
}
@Override
public void run() {
if (isValidSelection()) {
try {
showHierarchyView().focusOn(declaration);
}
catch (PartInitException e) {
e.printStackTrace();
}
}
else {
MessageDialog.openWarning(site.getShell(),
"Ceylon Find Error",
"No appropriate declaration name selected");
}
}
private boolean isValidSelection() {
return declaration!=null;
}
}