La infraestructura de texto de la plataforma suministra soporte para ayuda flotante, que permite implementar ayuda flotante informativa (o cuadros informativos emergentes) sobre el texto y las reglas que aparecen en el editor.
El soporte para ayuda flotante es opcional. Por omisión, SourceViewerConfiguration no instala comportamiento de ayuda flotante, ya que no existe ninguna información general de utilidad que mostrar. Para poder suministrar ayuda flotante de texto o regla, la configuración del visor de código fuente del editor debe configurarse para definir un objeto de ayuda flotante conectable.
Observemos de nuevo JavaSourceViewerConfiguration para ver qué métodos definen el comportamiento de la ayuda flotante:
public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) { return new JavaTextHover(); } public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) { return new JavaAnnotationHover(); }
Las clases de ayuda de la ayuda flotante también pueden instalarse dinámicamente mediante el protocolo SourceViewer (setTextHover y setAnnotationHover). Hacerlo de una u otra forma no representa ninguna ventaja en cuanto a la ejecución, pero el hecho de colocar todas las alteraciones temporales de comportamiento conectable en una subclase de SourceViewerConfiguration ofrece la ventaja de consolidar todas las definiciones en un solo lugar.
Observemos los detalles del suministro de ambos tipos de ayuda flotante.
La ayuda flotante de texto permite suministrar texto informativo acerca del texto que aparece en el editor. Esto se realiza mediante la interfaz ITextHover. La ayuda flotante de texto se encarga de calcular la región que debe utilizarse como fuente de la información flotante, a partir de un desplazamiento en el documento. También es responsable de suministrar el texto informativo acerca de una región específica. JavaTextHover es bastante sencillo. Comprueba si el desplazamiento suministrado para la ayuda flotante se encuentra dentro de la selección de texto. Si es así, suministra el rango de selección como región de ayuda flotante.
public class JavaTextHover implements ITextHover { ... 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); } }
A partir de su propia región de ayuda flotante calculada, obtiene el texto seleccionado de su documento y devuelve la información de ayuda flotante.
public class JavaTextHover implements ITextHover { public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { if (hoverRegion != null) { try { if (hoverRegion.getLength() > -1) return textViewer.getDocument().get(hoverRegion.getOffset(), hoverRegion.getLength()); } catch (BadLocationException x) { } } return JavaEditorMessages.getString("JavaTextHover.emptySelection"); } ... }
Efectivamente, podemos observar que, al pasar el cursor sobre una selección del editor, el texto de la ayuda flotante muestra la selección.
Para calcular información de ayuda flotante que resulte de utilidad, podemos utilizar información contextual más compleja. Puede encontrar ejemplos de este tipo de ayuda en la JavaTextHover que se implementa con el editor JDT.
La ayuda flotante de la regla vertical resulta de utilidad para mostrar información orientada a las líneas. La clase de la ayuda flotante se configura según se ha descrito anteriormente. IAnnotationHover es la interfaz destinada a los objetos de ayuda flotante de regla. Aunque el nombre indica que la ayuda flotante está diseñada para las anotaciones de la regla, en realidad es el editor quien se encarga de determinarlo. La ayuda flotante de regla se encarga de devolver la serie informativa asociada con un número de línea determinado, independientemente de la presencia de marcadores en dicha línea.
La clase JavaAnnotationHover del editor Java de ejemplo implementa ayuda flotante en todas las líneas. Utiliza el número de línea para obtener todo el texto de la línea de ayuda flotante y para devolverla como la serie informativa.
public String getHoverInfo(ISourceViewer sourceViewer, int lineNumber) { IDocument document= sourceViewer.getDocument(); try { IRegion info= document.getLineInformation(lineNumber); return document.get(info.getOffset(), info.getLength()); } catch (BadLocationException x) { } return null; }
Dado que la ayuda flotante tiene acceso al documento y al visor de código fuente, dispone de todo el contexto necesario para tomar decisiones contextuales más complicadas acerca de la información que debe mostrarse. Por ejemplo, puede recuperarse el modelo de anotación del visor de código fuente para poder suministrar información de ayuda flotante a las anotaciones que aparecen en la regla vertical. La clase JavaAnnotationHover suministrada por el editor JDT proporciona esta posibilidad.