/*******************************************************************************
* 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 java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
import org.eclipse.dltk.core.ICodeAssist;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.internal.ui.actions.ActionMessages;
import org.eclipse.dltk.internal.ui.actions.OpenActionUtil;
import org.eclipse.dltk.internal.ui.editor.EditorUtility;
import org.eclipse.dltk.internal.ui.text.ScriptWordFinder;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.IUpdate;
import org.eclipse.ui.texteditor.TextEditorAction;
import org.eclipse.wst.xml.core.internal.Logger;
public abstract class PHPEditorResolvingAction extends TextEditorAction implements IUpdate {
public PHPEditorResolvingAction(ResourceBundle bundle, String prefix, ITextEditor editor) {
super(bundle, prefix, editor);
setEnabled(true);
}
@Override
public void run() {
IModelElement[] modelElement = getSelectedElement();
IModelElement selected = null;
if (modelElement != null) {
if (modelElement.length > 1) {
IModelElement[] filteredElements = filterElements(modelElement);
selected = OpenActionUtil.selectModelElement(filteredElements, getTextEditor().getSite().getShell(),
ActionMessages.OpenAction_error_title, ActionMessages.OpenAction_select_element);
if (selected == null)
return;
} else {
selected = modelElement[0];
}
doRun(selected);
}
}
/**
* run the action
*/
abstract protected void doRun(IModelElement modelElement);
/**
* @return is action valid and can be run
*/
protected boolean isValid(IModelElement modelElement) {
return modelElement != null;
}
@Override
public void update() {
setEnabled(getTextEditor() != null/* && isValid(getSelectedElement()) */);
}
protected IModelElement[] getSelectedElement() {
ITextEditor editor = getTextEditor();
ITextSelection textSelection = (ITextSelection) editor.getSelectionProvider().getSelection();
int offset = textSelection.getOffset();
IModelElement input = EditorUtility.getEditorInputModelElement(editor, false);
if (input == null) {
return null;
}
try {
IDocument document = editor.getDocumentProvider().getDocument(editor.getEditorInput());
IRegion wordRegion = ScriptWordFinder.findWord(document, offset);
if (wordRegion == null)
return null;
if (wordRegion.getOffset() < 0 || wordRegion.getLength() < 0) {
return null;
}
IModelElement[] elements = null;
elements = ((ICodeAssist) input).codeSelect(wordRegion.getOffset(), wordRegion.getLength());
if (elements != null && elements.length > 0) {
return elements;
}
} catch (Exception e) {
Logger.logException(e);
}
return null;
}
private IModelElement[] filterElements(IModelElement[] elements) {
if (elements == null)
return null;
Map<IModelElement, IModelElement> uniqueElements = new HashMap<>();
for (int i = 0; i < elements.length; i++) {
IModelElement element = elements[i];
IModelElement module = element.getAncestor(IModelElement.SOURCE_MODULE);
if (module != null) {
if (!uniqueElements.containsKey(module)) {
uniqueElements.put(module, element);
}
}
}
return uniqueElements.values().toArray(new IModelElement[uniqueElements.size()]);
}
}