我想在我的项目中创建超链接自定义处理,但找不到任何示例或教程。
我可以请你给我一些例子或教程的链接吗?
答案 0 :(得分:0)
如果其他文件由EMF资源备份,那么您可以使用Xtext索引它们,特别是唯一标识资源的索引EMF对象,然后在语法中添加对它们的引用。
作为替代方案,您可以像Christian建议的那样自定义HyperlinkHelper
。问题是您必须自定义所有UI组件,其中应存在此类引用的概念,例如找到参考。如果您如上所述明确建模您的参考文献,则没有此问题。
答案 1 :(得分:0)
我有ansver。 要做到这一点,我们需要覆盖方法
def Class<? extends DefaultHyperlinkDetector> bindDefaultHyperlinkDetector()
的课程
AbstractMyDslUiModule
将以下列方式进行
/*
* generated by Xtext 2.9.2
*/
package org.xtext.example.mydsl.ui
import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
import org.eclipse.xtext.ui.editor.hyperlinking.DefaultHyperlinkDetector
/**
* Use this class to register components to be used within the Eclipse IDE.
*/
@FinalFieldsConstructor
class MyDslUiModule extends AbstractMyDslUiModule {
def Class<? extends DefaultHyperlinkDetector> bindDefaultHyperlinkDetector() {
return MyHyperlinkDetector;
}
}
我需要覆盖类 DefaultHyperlinkDetector
package org.xtext.example.mydsl.ui;
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.Region;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.xtext.ui.editor.hyperlinking.DefaultHyperlinkDetector;
import org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkHelper;
public class MyHyperlinkDetector extends DefaultHyperlinkDetector{
private static final String PREFERENCES = "Hello";
@Override
public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
IDocument document = textViewer.getDocument();
int offset = region.getOffset();
// extract relevant characters
IRegion lineRegion;
String candidate;
try {
lineRegion = document.getLineInformationOfOffset(offset);
candidate = document.get(lineRegion.getOffset(), lineRegion.getLength());
} catch (BadLocationException ex) {
return null;
}
// look for keyword
int index = candidate.indexOf(PREFERENCES);
if (index != -1) {
// detect region containing keyword
IRegion targetRegion = new Region(lineRegion.getOffset() + index, PREFERENCES.length());
if ((targetRegion.getOffset() <= offset) && ((targetRegion.getOffset() + targetRegion.getLength()) > offset))
// create link
return new IHyperlink[] { new PreferencesHyperlink(targetRegion) };
}
return null;
}
}
接下来我们需要实现IHyperlink接口 IHyperlink
package org.xtext.example.mydsl.ui;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.dialogs.PreferencesUtil;
public class PreferencesHyperlink implements IHyperlink {
private final IRegion fUrlRegion;
public PreferencesHyperlink(IRegion urlRegion) {
fUrlRegion = urlRegion;
}
@Override
public IRegion getHyperlinkRegion() {
return fUrlRegion;
}
@Override
public String getTypeLabel() {
return null;
}
@Override
public String getHyperlinkText() {
return null;
}
@Override
public void open() {
PreferencesUtil.createPreferenceDialogOn(Display.getDefault().getActiveShell(), null, null, null).open();
}
}
这样,当我们点击“hello”子字符串时,“首选项”页面将被打开