Focalização de Texto e Régua

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.

Focalização de texto

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 Focalização em Região Selecionada

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.

Focalização de régua

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;
}

Informações sobre Foco na Régua

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.