O suporte a focalização é fornecido na estrutura de texto da plataforma, permitindo implementar focalizações informativas (ou infopops) sobre o texto e as réguas mostradas em seu editor.
O suporte a focalização é opcional. Por padrão, SourceViewerConfiguration não instala o comportamento de focalização pois não há informações úteis gerais a serem mostradas. Para fornecer focalização de texto ou régua, a configuração do visualizador de origem do seu editor deve ser configurada para definir um objeto de focalização conectável.
Vejamos novamente JavaSourceViewerConfiguration para consultar quais métodos definem o comportamento de focalização:
public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) { return new JavaTextHover(); } public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) { return new JavaAnnotationHover(); }
As classes de assistente de focalização também podem ser instaladas dinamicamente utilizando o protocolo SourceViewer (setTextHover e setAnnotationHover). Não há benefício em tempo de execução específico algum em se fazer de determinada maneira, mas colocar todas as substituições de comportamento conectáveis em uma subclasse de SourceViewerConfiguration fornece a vantagem de consolidar todas as definições em apenas um lugar.
Vejamos as peculiaridades no fornecimento de ambos os tipos de focalização.
A focalização de texto permite fornecer texto informativo sobre o texto mostrado no editor. Isso é feito utilizando a interface ITextHover. Uma focalização de texto é responsável pela computação da região que deveria ser usada como a origem das informações de focalização, dado um deslocamento no documento. Ela também é responsável pelo fornecimento de texto informativo sobre uma região específica. O JavaTextHover é bastante simples. Ele verifica se o deslocamento fornecido para a focalização está contido na seleção de texto. Se estiver, ele fornece o intervalo da seleção como uma região de focalização.
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); } }
Dada sua própria região de focalização computada, obtém o texto selecionado de seu documento e o retorna como as informações de focalização.
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"); } ... }
Com toda a certeza, podemos ver que se focalizamos sobre uma seleção no editor, o texto de focalização mostra a seleção.
Informações de contexto mais complexas podem ser utilizadas para computar informações úteis de focalização. Exemplos relacionados podem ser localizados no JavaTextHover implementado com o editor JDT.
A focalização na régua vertical é útil para mostrar informações orientadas por linhas. A classe de focalização é configurada como descrito acima. IAnnotationHover é a interface para objetos de focalização de régua. Embora o nome sugira que a focalização foi projetada para anotações na régua, na verdade compete a um editor específico determinar o que é apropriado. Uma focalização de régua é responsável por retornar a cadeia de informações associada a um número de linha específico, independentemente da presença de marcadores nessa linha.
O JavaAnnotationHover do editor Java de exemplo implementa a focalização para todas as linhas. Ele utiliza o número da linha para obter todo o texto na linha de focalização e retorná-lo como a cadeia de informações.
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; }
Como a focalização possui acesso ao documento e ao visualizador de origem, ela possui todo o contexto necessário para tomar decisões contextuais mais complexas sobre as informações que devem ser mostradas. Por exemplo, o modelo de anotação poderia ser recuperado do visualizador de origem para fornecer informações de focalização para quaisquer anotações mostradas na régua vertical. O JavaAnnotationHover fornecido pelo editor JDT fornece essa capacidade.