O editor e seu visualizador de texto correspondente são amplamente responsáveis pela implementação da apresentação e configuração do documento de quaisquer classes auxiliares necessárias. (Consulte Visualizadores se você não estiver familiarizado com o conceito de um visualizador.)
Um TextViewer trata de todos os detalhes de nível inferior de mapeamento do modelo do documento e suas partições em texto colorido e formatado que um usuário visualizará. Para editores de estilo do código fonte, um SourceViewer é fornecido. Um visualizador de origem apresenta a noção de anotações do código fonte. Essas anotações podem ser mostradas em uma régua vertical à esquerda do texto, uma régua de visão geral à direita do texto ou como rascunhos coloridos sob o texto.
SourceViewer e suas classes auxiliares são utilizados na hierarquia de AbstractTextEditor. O pacote org.eclipse.jface.text.source define este visualizador e as outras classes que suportam a apresentação de anotação.
Nós vimos antes que um provedor de documento fornece um modelo para as anotações de seu documento, IAnnotationModel, além do próprio documento. Esse modelo de anotação contém as anotações, enumera elas a pedido e atende às alterações de texto para manter as anotações atualizadas com o texto. O JavaDocumentProvider herda o comportamento definido em FileDocumentProvider e, portanto, seu modelo de anotação.
protected IAnnotationModel createAnnotationModel(Object element) throws CoreException { if (element instanceof IFileEditorInput) { IFileEditorInput input= (IFileEditorInput) element; return new ResourceMarkerAnnotationModel(input.getFile()); } return super.createAnnotationModel(element); }
ResourceMarkerAnnotationModel define um modelo para anotações que representam um marcador em um recurso no espaço de trabalho. (Consulte Marcadores de Recursos para obter informações adicionais sobre marcadores.) Atribui uma imagem e descrição a cada marcador e monitora seu recurso quanto às alterações nos marcadores.
Para ver como um modelo de anotação é exibido em um editor de texto, nós examinaremos o editor de texto da plataforma e sua utilização de réguas e anotações. As especificações de como diferentes anotações são mostradas nas réguas e no texto podem ser controladas pelo usuário na preferências Workbench > Editores > Editor de Texto na guia Anotações.
Uma régua vertical à esquerda da área de edição é utilizada pelos editores de texto da plataforma para mostrar intervalos de texto e anotações baseadas em linha adjacentes à sua linha de texto.
Estas anotações são descritas no ResourceMarkerAnnotationModel fornecido. Este modelo é definido para o SourceViewer quando o visualizador de origem é inicializado pelo editor. O trecho a seguir de AbstractTextEditor mostra como o documento e o modelo de anotação estão associados ao visualizador.
private void initializeSourceViewer(IEditorInput input) { IAnnotationModel model= getDocumentProvider().getAnnotationModel(input); IDocument document= getDocumentProvider().getDocument(input); if (document != null) { fSourceViewer.setDocument(document, model); ...
Depois que o visualizador de origem é configurado com o modelo apropriado de documento e anotação, ele possui informações suficientes para apresentar o documento e assegurar que as anotações corretas sejam mostradas na régua vertical à esquerda. O modelo é associado à régua quando o documento é definido. O trecho a seguir mostra o que acontece quando um documento é definido no visualizador de eventos. Ele foi simplificado a partir do código real em SourceViewer para clareza:
public void setDocument(IDocument document, IAnnotationModel annotationModel) { ... // criar modelo visual de anotação do modelo fornecido e armazenar // em fVisualAnnotationModel ... if (fVerticalRuler != null) fVerticalRuler.setModel(fVisualAnnotationModel);
Desse modo, a régua é associada ao modelo apropriado de anotação.
Vamos ver a régua em si. Ela é criada pelo editor de texto e, em seguida, conectada ao visualizador do editor. Como o exemplo do editor Java não define nenhum comportamento especial para réguas, ele herda a régua conforme definida em TextEditor.
protected IVerticalRuler createVerticalRuler() { CompositeRuler ruler= new CompositeRuler(); ruler.addDecorator(0, new AnnotationRulerColumn(VERTICAL_RULER_WIDTH)); if (isLineNumberRulerVisible()) ruler.addDecorator(1, createLineNumberRulerColumn()); return ruler; }
O editor de texto utiliza um CompositeRuler. Essa régua não possui uma apresentação visual própria. A apresentação é fornecida por uma lista de decoradores que mostram colunas (IVerticalRulerColumn) na régua. Neste exemplo, uma coluna da régua que mostra anotações (AnnotationRulerColumn) é sempre adicionada e uma coluna da régua de número da linha é adicionada com base nas preferências do usuário. A coluna da régua de anotação trata dos detalhes de exibição das imagens de anotação nas localizações apropriadas.
Apesar de todas as classes envolvidas para mostrar uma régua, observe que o editor de exemplo precisou apenas dividir em subclasses as classes da estrutura para obter o comportamento da régua. JavaDocumentProvider herda um modelo apropriado de anotação do marcador de FileDocumentProvider. O JavaTextEditor herda a apresentação da régua de TextEditor.
Uma régua de visão geral à direita da área de edição é utilizada para mostrar anotações relativas ao documento inteiro. Essas anotações são mostradas em relação às suas posições no documento e não são movidas quando o usuário rola o documento. Há geralmente uma anotação correspondente na régua vertical quando essa parte do documento está visível.
A régua vertical abaixo mostra que há duas tarefas no documento e um marcador. Como o texto com marcador é visível, sua anotação também é mostrada à esquerda.
O usuário pode navegar para a localização da anotação no código clicando na própria anotação.
Os tipos de anotações mostrados na régua de visão geral são determinados adicionando tipos de anotação à régua. No trecho a seguir de SourceViewerDecorationSupport, os tipos de anotação são adicionados dinamicamente à régua. (Consulte a próxima seção para obter informações adicionais sobre SourceViewerDecorationSupport.)
private void showAnnotationOverview(Object annotationType) {
if (fOverviewRuler != null) { Color c= getAnnotationTypeColor(annotationType);
fOverviewRuler.setAnnotationTypeColor(annotationType, c); int l= getAnnotationTypeLayer(annotationType);
fOverviewRuler.setAnnotationTypeLayer(annotationType, l);
fOverviewRuler.addAnnotationType(annotationType);
fOverviewRuler.update();
} }
A régua de visão geral também é fornecida com um IAnnotationAccess que é utilizado para fornecer informações sobre uma anotação específica, como seu tipo e como ela será exibida. O TextEditor utiliza um DefaultMarkerAnnotationAccess que interpreta anotações de acordo com seus tipos de marcadores e consulta as preferências do usuário para ver quais tipos de marcadores devem ser mostrados na régua de visão geral.
protected IAnnotationAccess createAnnotationAccess() { return new DefaultMarkerAnnotationAccess(fAnnotationPreferences); }
Consulte a implementação de DefaultMarkerAnnotationAccess e MarkerAnnotation para obter detalhes adicionais sobre a apresentação de marcadores na régua de visão geral.
Além de mostrar as anotações nas réguas, um visualizador de origem pode mostrar as anotações como marcas coloridas de rascunho no texto.
Nós veremos novamente a criação do visualizador de origem em TextEditor.
protected ISourceViewer createSourceViewer(Composite parent, IVerticalRuler ruler, int styles) { ... ISourceViewer sourceViewer= new SourceViewer(parent, ruler, fOverviewRuler, isOverviewRulerVisible(), styles); fSourceViewerDecorationSupport= new SourceViewerDecorationSupport(sourceViewer, fOverviewRuler, fAnnotationAccess, sharedColors); configureSourceViewerDecorationSupport(); return sourceViewer; }
A classe SourceViewerDecorationSupport trata de muitas das decorações mostradas em um visualizador de origem, incluindo anotações de texto, margens coloridas, linhas coloridas do cursor ou coisa parecida. Ela é configurada com as preferências do usuário para que possa responder a atualizações dinâmicas de alterações de preferências do usuário. A maioria dos editores não precisam se preocupar com os detalhes de como essas decorações são pintadas. (Consulte SourceViewerDecorationSupport e as classes relacionadas, como AnnotationPainter, se necessário!). O importante é saber quais decorações estão disponíveis para que o SourceViewer e seu SourceViewerDecorationSupport de suporte sejam configurados corretamente.
Vamos ver a configuração utilizada por TextEditor para o suporte de decoração.
protected void configureSourceViewerDecorationSupport() { Iterator e= fAnnotationPreferences.getAnnotationPreferences().iterator(); while (e.hasNext()) fSourceViewerDecorationSupport.setAnnotationPreference((AnnotationPreference) e.next()); fSourceViewerDecorationSupport.setAnnotationPainterPreferenceKeys(DefaultMarkerAnnotationAccess.UNKNOWN, UNKNOWN_INDICATION_COLOR, UNKNOWN_INDICATION, UNKNOWN_INDICATION_IN_OVERVIEW_RULER, 0); fSourceViewerDecorationSupport.setCursorLinePainterPreferenceKeys(CURRENT_LINE, CURRENT_LINE_COLOR); fSourceViewerDecorationSupport.setMarginPainterPreferenceKeys(PRINT_MARGIN, PRINT_MARGIN_COLOR, PRINT_MARGIN_COLUMN); fSourceViewerDecorationSupport.setSymbolicFontName(getFontPropertyPreferenceKey()); }
Observe que as preferências de anotação são utilizadas para definir os tipos de anotação para todas as anotações mostradas nas preferências do usuário. Isso inclui anotações contribuídas por qualquer plug-in e não se limita às anotações fornecidas pelo workbench. Se você não desejar mostrar todas as anotações disponíveis em seu editor, deverá substituir este método e configurar o SourceViewerDecorationSupport apenas com os tipos que deseja mostrar.