package org.objectstyle.wolips.wodclipse.action; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.widgets.Event; import org.eclipse.ui.IEditorActionDelegate; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.texteditor.ITextEditor; import org.objectstyle.wolips.baseforuiplugins.utils.WorkbenchUtilities; import org.objectstyle.wolips.locate.Locate; import org.objectstyle.wolips.locate.result.LocalizedComponentsLocateResult; import org.objectstyle.wolips.locate.scope.ComponentLocateScope; import org.objectstyle.wolips.wodclipse.core.parser.ElementTypeRule; import org.objectstyle.wolips.wodclipse.core.parser.RulePosition; import org.objectstyle.wolips.wodclipse.core.parser.WodScanner; public class OpenDeclarationAction extends Action implements IEditorActionDelegate { private IEditorPart _activeEditor; private ISelection _selection; public void run() { if (_selection instanceof TextSelection) { RulePosition rulePosition; try { TextSelection selection = (TextSelection) _selection; ITextEditor textEditor = (ITextEditor) _activeEditor; IEditorInput editorInput = textEditor.getEditorInput(); IDocument document = textEditor.getDocumentProvider().getDocument(editorInput); WodScanner scanner = WodScanner.wodScannerForDocument(document); rulePosition = scanner.getRulePositionAtOffset(selection.getOffset()); IProject project = null; if (editorInput instanceof FileEditorInput) { IFile file = ((FileEditorInput) editorInput).getFile(); project = file.getProject(); } IRule rule = rulePosition.getRule(); if (rule instanceof ElementTypeRule) { String elementTypeName = rulePosition.getText(); ComponentLocateScope componentLocateScope = new ComponentLocateScope(project, elementTypeName, true); LocalizedComponentsLocateResult localizedComponentsLocateResult = new LocalizedComponentsLocateResult(); Locate locate = new Locate(componentLocateScope, localizedComponentsLocateResult); locate.locate(); IFile wodFile = localizedComponentsLocateResult.getFirstWodFile(); if (wodFile != null) { WorkbenchUtilities.open(wodFile, "org.objectstyle.wolips.componenteditor.ComponentEditor"); } } } catch (Throwable e) { e.printStackTrace(); } } } public void runWithEvent(Event event) { run(); } public void setActiveEditor(IAction action, IEditorPart targetEditor) { _activeEditor = targetEditor; } public void run(IAction action) { run(); } public void selectionChanged(IAction action, ISelection selection) { _selection = selection; } }