package com.hundsun.ares.studio.logic.ui.editor; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; 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.IEditorInput; import org.eclipse.ui.texteditor.ITextEditor; import com.hundsun.ares.studio.atom.constants.IAtomRefType; import com.hundsun.ares.studio.core.IARESElement; import com.hundsun.ares.studio.core.IARESProject; import com.hundsun.ares.studio.jres.database.constant.IDatabaseRefType; import com.hundsun.ares.studio.logic.constants.ILogicRefType; import com.hundsun.ares.studio.model.reference.ReferenceInfo; import com.hundsun.ares.studio.procdure.constants.IProcedureRefType; import com.hundsun.ares.studio.reference.ReferenceManager; import com.hundsun.ares.studio.ui.editor.text.OpenLinkAction; import com.hundsun.ares.studio.ui.editor.text.TextUtil; import com.hundsun.ares.studio.ui.editor.textbase.TextBasedEditorInput; public class LogicHyperlinkDetector implements IHyperlinkDetector { private ITextEditor editor; public LogicHyperlinkDetector(ITextEditor editor) { this.editor = editor; } public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { IDocument document = textViewer.getDocument(); int offset = region.getOffset(); IRegion r = TextUtil.findHyperlink(document, offset); if(r == null) return null; String name = ""; try { name = document.get(r.getOffset() + 1, r.getLength() -2); } catch (BadLocationException e) { e.printStackTrace(); } IEditorInput input = editor.getEditorInput(); if(!(input instanceof TextBasedEditorInput)) return null; IARESProject project = ((TextBasedEditorInput)input).getARESElement().getARESProject(); IARESElement element = null; ReferenceInfo info = ReferenceManager.getInstance().getFirstReferenceInfo(project, ILogicRefType.LOGIC_SERVICE_CNAME, name, true); if(info == null){ info = ReferenceManager.getInstance().getFirstReferenceInfo(project, ILogicRefType.LOGIC_FUNCTION_CNAME, name, true); } if(info == null){ info = ReferenceManager.getInstance().getFirstReferenceInfo(project, IAtomRefType.ATOM_SERVICE_CNAME, name, true); } if(info == null){ info = ReferenceManager.getInstance().getFirstReferenceInfo(project, IAtomRefType.ATOM_FUNCTION_CNAME, name, true); } if(info == null){ info = ReferenceManager.getInstance().getFirstReferenceInfo(project, IProcedureRefType.PROCEDURE_CNAME, name, true); } if(info == null){ info = ReferenceManager.getInstance().getFirstReferenceInfo(project, IDatabaseRefType.Table, name, true); } if(info != null){ element = info.getResource(); } OpenLinkAction action = null; if(! (element == null)) { action = new OpenLinkAction(element); } else { return null; } LogicHyperlink link = new LogicHyperlink(r, action); IHyperlink[] result = new IHyperlink[] {link}; return result; } }