package org.objectstyle.wolips.wodclipse.core.document;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.objectstyle.wolips.bindings.utils.BindingReflectionUtils;
import org.objectstyle.wolips.bindings.wod.BindingValueKey;
import org.objectstyle.wolips.bindings.wod.BindingValueKeyPath;
import org.objectstyle.wolips.bindings.wod.IWodBinding;
import org.objectstyle.wolips.bindings.wod.IWodElement;
import org.objectstyle.wolips.bindings.wod.TypeCache;
import org.objectstyle.wolips.wodclipse.core.Activator;
import org.objectstyle.wolips.wodclipse.core.completion.WodParserCache;
public class WodBindingNameHyperlink implements IHyperlink {
private IJavaProject _javaProject;
private TypeCache _cache;
private IRegion _region;
private String _bindingName;
private String _elementTypeName;
public WodBindingNameHyperlink(IRegion region, String bindingName, IJavaProject javaProject, String elementTypeName, TypeCache cache) {
_region = region;
_bindingName = bindingName;
_javaProject = javaProject;
_elementTypeName = elementTypeName;
_cache = cache;
}
public IRegion getHyperlinkRegion() {
return _region;
}
public String getTypeLabel() {
return null;
}
public String getHyperlinkText() {
return null;
}
public void open() {
try {
IType elementType = BindingReflectionUtils.findElementType(_javaProject, _elementTypeName, false, _cache);
if (elementType != null) {
BindingValueKeyPath bindingValueKeyPath = new BindingValueKeyPath(_bindingName, elementType, elementType.getJavaProject(), WodParserCache.getTypeCache());
if (bindingValueKeyPath.isValid()) {
BindingValueKey lastKey = bindingValueKeyPath.getLastBindingKey();
if (lastKey != null) {
IMember member = lastKey.getBindingMember();
if (member != null) {
JavaUI.openInEditor(member, true, true);
}
else {
JavaUI.openInEditor(elementType, true, true);
}
}
else {
JavaUI.openInEditor(elementType, true, true);
}
}
}
}
catch (Exception ex) {
Activator.getDefault().log(ex);
}
}
public static WodBindingNameHyperlink toBindingNameHyperlink(IWodElement wodElement, String bindingName, WodParserCache cache) {
WodBindingNameHyperlink hyperlink = null;
IWodBinding wodBinding = wodElement.getBindingNamed(bindingName);
if (wodBinding != null) {
Position namePosition = wodBinding.getNamePosition();
if (namePosition != null) {
Region elementRegion = new Region(namePosition.getOffset(), namePosition.getLength());
String elementTypeName = wodElement.getElementType();
if (elementTypeName != null) {
hyperlink = new WodBindingNameHyperlink(elementRegion, bindingName, cache.getJavaProject(), elementTypeName, WodParserCache.getTypeCache());
}
}
}
return hyperlink;
}
}