package org.objectstyle.wolips.wodclipse.editor; import java.util.LinkedList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.jface.text.hyperlink.IHyperlinkDetector; import org.eclipse.ui.IFileEditorInput; import org.objectstyle.wolips.bindings.wod.IWodBinding; import org.objectstyle.wolips.bindings.wod.IWodElement; import org.objectstyle.wolips.bindings.wod.IWodModel; import org.objectstyle.wolips.wodclipse.core.Activator; import org.objectstyle.wolips.wodclipse.core.completion.WodParserCache; import org.objectstyle.wolips.wodclipse.core.document.WodBindingNameHyperlink; import org.objectstyle.wolips.wodclipse.core.document.WodBindingValueHyperlink; import org.objectstyle.wolips.wodclipse.core.document.WodElementTypeHyperlink; public class WodElementHyperlinkDetector implements IHyperlinkDetector { private WodEditor _editor; public WodElementHyperlinkDetector(WodEditor editor) { _editor = editor; } public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { List<IHyperlink> hyperlinks = new LinkedList<IHyperlink>(); try { IFileEditorInput input = (IFileEditorInput) _editor.getEditorInput(); if (input != null) { IFile file = input.getFile(); WodParserCache cache = WodParserCache.parser(file); IWodModel model = cache.getWodEntry().getModel(); if (model != null) { List<IWodElement> wodElements = model.getElements(); if (wodElements != null) { for (IWodElement element : wodElements) { if (element.isWithin(region)) { if (element.isTypeWithin(region)) { WodElementTypeHyperlink typeHyperlink = WodElementTypeHyperlink.toElementTypeHyperlink(element, cache); if (typeHyperlink != null) { hyperlinks.add(typeHyperlink); } } for (IWodBinding binding : element.getBindings()) { if (binding.isNameWithin(region)) { WodBindingNameHyperlink bindingHyperlink = WodBindingNameHyperlink.toBindingNameHyperlink(element, binding.getName(), cache); if (bindingHyperlink != null) { hyperlinks.add(bindingHyperlink); } } else if (binding.isValueWithin(region)) { WodBindingValueHyperlink bindingHyperlink = WodBindingValueHyperlink.toBindingValueHyperlink(element, binding.getName(), cache); if (bindingHyperlink != null) { hyperlinks.add(bindingHyperlink); } } } } } } } } } catch (Exception e) { Activator.getDefault().log(e); } IHyperlink[] hyperlinksArray; if (hyperlinks.size() == 0) { hyperlinksArray = null; } else { hyperlinksArray = hyperlinks.toArray(new IHyperlink[hyperlinks.size()]); } return hyperlinksArray; } }