java c eclipse hover markers

java - Eclipse: texto personalizado al pasar el mouse sobre un marcador



hover markers (1)

Estoy trabajando en un plugin de Eclipse y actualmente estoy tratando de hacer que Eclipse (Luna) muestre texto personalizado al pasar el ratón sobre un marcador. Sé que podría lograr esto especificando los argumentos del marcador, pero necesito cambiar el texto dinámicamente , por ejemplo:

Ya he probado estos enfoques sin éxito:

1) Tener un SourceViewerConfiguration personalizado con SourceViewerConfiguration personalizado:

public class MyEditor extends TextEditor { public MyEditor() { setSourceViewerConfiguration(new SourceViewerConfiguration() { @Override public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) { return new IAnnotationHover() { @Override public String getHoverInfo(ISourceViewer sv, int ln) { return "Hello world!"; } }; } }); } }

y el plugin.xml así:

<extension point="org.eclipse.ui.editors"> <editor id="test" name="MyEditor" extensions="c" class="foo.bar.editors.MyEditor"> </editor> </extension>

Mi método getHoverInfo nunca se llama. En cambio, se llama al método getHoverInfo desde DefaultAnnotationHover cada vez que abro un archivo * .c y cierro el cursor sobre el marcador. Revisé los editores disponibles a través de Eclipse-> Preferencias-> General-> Editores y MyEditor está allí.

2) Agregando el anulador de anotación personalizado dinámicamente. Encontré aquí información que es posible. Entonces, cada vez que abro un archivo "* .c", tengo este código:

IPartListener2 partListener2 = new IPartListener2() { @Override public void partOpened(IWorkbenchPartReference partRef) { if ("org.eclipse.cdt.ui.editor.CEditor".equals(((EditorReference) partRef).getDescriptor().getId())) { CEditor currentCFileEditor = ((CEditor)((EditorReference) partRef).getEditor(false)); currentCFileEditor.getViewer().setAnnotationHover(new IAnnotationHover() { @Override public String getHoverInfo(ISourceViewer sourceViewer, int lineNumber) { return "Hello world"; } }); } }

Pero, de nuevo, no tuve éxito: mi getHoverInfo no se llama en absoluto.

¿Alguna idea de lo que estoy haciendo mal?


Para aquellos que tienen un problema similar, he encontrado una solución "hacky". MyAwesomeHover mi propia clase MyAwesomeHover :

public class MyAwesomeHover implements IAnnotationHover { @Override public String getHoverInfo(ISourceViewer sw, int ln) { return "Hey hoo" } }

Y luego utilizo el reflejo para establecer MyAweseomeHover como el AnnotationHover mostrado.

Field hm= SourceViewer.class.getDeclaredField("fVerticalRulerHoveringController"); hm.setAccessible(true); AnnotationBarHoverManager ma= (AnnotationBarHoverManager) hm.get(sourceViewer); Field ah= AnnotationBarHoverManager.class.getDeclaredField("fAnnotationHover"); ah.setAccessible(true); ah.set(ma, MyAwesomeHover());