|
|
|
Re: Xtext hover support [message #632701 is a reply to message #632437] |
Wed, 13 October 2010 23:54 |
No real name Messages: 101 Registered: August 2010 |
Senior Member |
|
|
Hi,
Thank you for the help. One thing I'm confused is the following:
Quote: |
Make sure you register a composite hover consisting of your custom hover as well as Xtext's problem hover.
|
How do I do that? So far I have something like this:
1. In MyHLMUiModule.java
public Class<? extends XtextSourceViewerConfiguration> bindSourceViewerConfiguration() {
return MyHLMSourceViewerConfiguration.class;
}
2. MyHLMSourceViewerConfiguration.java
public class MyHLMSourceViewerConfiguration extends
XtextSourceViewerConfiguration {
@Override
public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {
return new MyHLMTextHover(sourceViewer);
}
}
3. MyHLMTextHover.java
public class MyHLMTextHover implements ITextHover, ITextHoverExtension2 {
public MyHLMTextHover(ISourceViewer sourceViewer) {
}
@Override
public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
// Deprecated by Eclipse 3.4. Do not implement!
return null;
}
@Override
public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
return new Region(offset, 0);
}
@Override
public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) {
return getHoverText(textViewer, hoverRegion);
}
private String getHoverText(ITextViewer textViewer, IRegion hoverRegion) {
// Do the processing here.
return "";
}
}
How do I create a "composite" hover? It seems like setSourceViewConfiguration() will override the existing Xtext's sourceViewConfiguration. I see the 'new ProblemHover' in the getTextHover() of XtextSourceViewerConfiguration.
Thanks!
|
|
|
|
Re: Xtext hover support [message #633291 is a reply to message #632437] |
Sat, 16 October 2010 04:13 |
No real name Messages: 101 Registered: August 2010 |
Senior Member |
|
|
Here is some code I wrote that does what I want:
public class MyHLMSourceViewerConfiguration extends
XtextSourceViewerConfiguration {
@Override
public IInformationControlCreator getInformationControlCreator(ISourceViewer sourceViewer) {
return new IInformationControlCreator() {
@Override
public IInformationControl createInformationControl(Shell parent) {
return new DefaultInformationControl(parent, false);
}
};
}
@Override
public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {
return new MyHLMBestMatchHover(sourceViewer);
}
}
public class MyHLMBestMatchHover implements ITextHover, ITextHoverExtension2 {
private List<ITextHoverExtension2> instantiatedTextHovers;
public MyHLMBestMatchHover(ISourceViewer sourceViewer) {
addTextHovers(sourceViewer);
}
private void addTextHovers(ISourceViewer sourceViewer) {
// Add in order of precedence. Higher precedence first.
instantiatedTextHovers = new ArrayList<ITextHoverExtension2>(2);
// Xtext's problem hover (for syntax errors).
instantiatedTextHovers.add(new ProblemHover(sourceViewer));
// Our BBB information hover.
instantiatedTextHovers.add(new MyHLMBBBHover(sourceViewer));
}
@Override
public String getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) {
if (instantiatedTextHovers == null) {
return null;
}
for (Iterator<ITextHoverExtension2> it = instantiatedTextHovers.iterator(); it.hasNext(); ) {
ITextHoverExtension2 hover = it.next();
String s = (String) hover.getHoverInfo2(textViewer, hoverRegion);
if (s != null && !s.trim().isEmpty()) {
return s;
}
}
return null;
}
@Override
public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
return getHoverInfo2(textViewer, hoverRegion);
}
@Override
public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
Point selection = textViewer.getSelectedRange();
if (selection.x <= offset && offset < selection.x + selection.y) {
return new Region(selection.x, selection.y);
}
return new Region(offset, 0);
}
}
public class MyHLMBBBHover extends AbstractHover {
private final MyHLMBBBFormatter bbbFormatter;
/**
* Constructor.
* @param sourceViewer - The source viewer.
*/
public MyHLMBBBHover(ISourceViewer sourceViewer) {
super(sourceViewer);
bbbFormatter = new MyHLMBBBFormatter();
}
@Override
protected String getHoverInfoInternal(final int lineNumber, final int offset) {
try {
IDocument doc = sourceViewer.getDocument();
if (doc.get(offset, 1).trim().isEmpty()) {
return null;
}
IRegion lineRegion = doc.getLineInformation(lineNumber);
String line = doc.get(lineRegion.getOffset(), lineRegion.getLength());
int diff = offset - lineRegion.getOffset();
int firstSpace = 0, lastSpace = 0;
for (int i = diff; i >= 0; i--) {
if (!Character.isJavaIdentifierStart(line.charAt(i)) && !Character.isDigit(line.charAt(i))) {
firstSpace = i;
break;
}
}
for (int i = diff; i < line.length(); i++) {
if (!Character.isJavaIdentifierPart(line.charAt(i))) {
lastSpace = i;
break;
}
}
if (firstSpace == lastSpace) {
return null;
}
String word = line.substring(firstSpace + 1, (lastSpace > 0 ? lastSpace : line.length()));
return bbbFormatter.getBBBDocumentation(word);
} catch (BadLocationException e) {
return null;
}
}
}
I had one question about getHoverInfoInternal. Given the line number/offset, i have to go character by character to extrract the function name(). Is it possible to use the Xtext parse model here somehow to get the element that matched at that particular offset?
Thanks.
|
|
|
|
Powered by
FUDForum. Page generated in 0.03580 seconds