Coloração da Sintaxe

A coloração da sintaxe é fornecida na estrutura de texto da plataforma utilizando um modelo de dano, reparo e reconciliação.  Para cada alteração aplicada a um documento, um reconciliador de apresentação determina qual região da apresentação visual deve ser invalidada e como repará-la.  Diferentes estratégias podem ser utilizadas para diferentes tipos de conteúdo no documento.

A implementação de coloração da sintaxe (e fazer isso com um reconciliador de apresentação) é opcional.  Por padrão, SourceViewerConfiguration não instala um reconciliador de apresentação porque não conhece o modelo de documento utilizado para um editor específico e não possui comportamento genérico para realce de sintaxe.  

Para utilizar as classes de reconciliação para implementar o realce de sintaxe, a configuração do visualizador de origem do editor deve ser configurada para definir um reconciliador de apresentação.  Novamente, nós iniciamos com JavaSourceViewerConfiguration para ver como um reconciliador de apresentação é definido para nosso editor.

public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {

	PresentationReconciler reconciler= new PresentationReconciler();
	...
	return reconciler;
}

Para entender o que é um reconciliador de apresentação, nós devemos primeiro ver os conceitos de dano, reparo e reconciliação.

Dano, Reparo e Reconciliação

Quando o usuário modifica texto em um editor, partes do editos devem ser reexibidas para mostrar as alterações.  Computar o texto que deve ser reexibido é conhecido como computar dano.  Quando a coloração da sintaxe esta envolvida, a quantidade de danos causados por uma operação de edição torna-se mais extensiva, pois a presença ou falta de um único caractere poderia alterar a coloração do texto em torno dela.  

Os danificadores (IPresentationDamager) determinam a região de apresentação de um documento que deve ser reconstruída devido a uma alteração do documento. Assume-se que um danificador de apresentação seja específico para um determinado tipo de conteúdo do documento (ou região). Ele deve estar apto a retornar uma região de dano que seja uma entrada válida para um reparador de apresentação (IPresentationRepairer).  Um reparador deve estar apto a derivar todas as informações que ele precisa de uma região de dano para descrever com êxito os reparos que são necessários para um tipo de conteúdo específico.

A reconciliação descreve o processo global de manter a apresentação de um documento conforme são feitas alterações no editor.  Um reconciliador de apresentação (IPresentationReconciler) monitora alterações no texto por meio de seu visualizador associado.  Ele utiliza as regiões do documento para determinar os tipos de conteúdo afetados pela alteração e notifica um danificador que seja apropriado para o tipo de conteúdo afetado.  Depois que o dano é computado, ele é transmitido para o reparador apropriado que construirá descrições de reparo que são aplicadas ao visualizador para colocá-lo de volta em sincronia com o conteúdo subjacente. 

As classes em org.eclipse.jface.text.reconciler definem classes adicionais de suporte para sincronizar um modelo de documento com a manipulação externa do documento.

Os reconciliadores de apresentação devem ser fornecidos com um par de reparador e danificador para cada tipo de conteúdo a ser localizado no documento.  Compete a cada editor determinar a implementação apropriada para um reconciliador de apresentação.  No entanto, a plataforma fornece suporte em org.eclipse.jface.text.rules para utilizar scanners baseados em regra do documento para computar e reparar o dano.  Os danificadores e reparadores padrão são definidos neste pacote.  Eles podem ser utilizados juntamente com os reconciliadores padrão em org.eclipse.jface.text.presentation para implementar a coloração de sintaxe definindo regras de varredura para o documento.

Reconciliação Baseada em Regras

Agora nós tempos segundo plano suficiente para ver com detalhe na criação do reconciliador de apresentação de exemplo.  Lembre-se que o exemplo de editor Java implementa um JavaPartitionScanner que particiona o documento em tipos de conteúdo que representam javadoc, comentários de várias linhas e outros. 

Para cada um desses tipos de conteúdo, um par de danificador/reparador deve ser especificado.  Isso é feito abaixo utilizando o PresentationReconciler e o DefaultDamagerRepairer.

	JavaColorProvider provider= JavaEditorEnvironment.getJavaColorProvider();
	PresentationReconciler reconciler= new PresentationReconciler();
		
	DefaultDamagerRepairer dr= new DefaultDamagerRepairer(JavaEditorEnvironment.getJavaCodeScanner());
	reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
	reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);

	dr= new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(provider.getColor(JavaColorProvider.JAVADOC_DEFAULT))));
	reconciler.setDamager(dr, JavaPartitionScanner.JAVA_DOC);
	reconciler.setRepairer(dr, JavaPartitionScanner.JAVA_DOC);

	dr= new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(provider.getColor(JavaColorProvider.MULTI_LINE_COMMENT))));
	reconciler.setDamager(dr, JavaPartitionScanner.JAVA_MULTILINE_COMMENT);
	reconciler.setRepairer(dr, JavaPartitionScanner.JAVA_MULTILINE_COMMENT);

	return reconciler;

Observe que o exemplo fornece scanners para cada tipo de conteúdo.  

O tipo de conteúdo padrão é configurado com um JavaCodeScanner para que as palavras-chave possam ser detectadas e coloridas.  O JavaCodeScanner constrói regras para detectar diferentes tipos de símbolos, como comentários de linha única, espaço em branco e palavras.  Ele descreve as cores que devem ser utilizadas para palavras de tipos diferentes de símbolos.   

Os outros tipos de conteúdo são configurados com um SingleTokenScanner e recebem uma cor para ser utilizada para os símbolos nesses tipos de conteúdo.

Todos os detalhes de danos e reparos das partes apropriadas dos documentos, de acordo com as regras de varredura, são tratados pelo DefaultDamagerRepairer.  Esses detalhes geralmente não precisam ser reconhecidos pelo código do plug-in.  O plug-in deve focalizar a construção de um conjunto de regras que sejam apropriadas para o particionamento e varredura do conteúdo do editor.

Instalando Dinamicamente um Reconciliador

O exemplo de editor Java fornece uma subclasse de SourceViewerConfiguration para instalar o reconciliador de apresentação conforme visto anteriormente.  Um reconciliador de apresentação também pode ser instalado dinamicamente em um visualizador de texto utilizando o protocolo IPresentationReconciler.   Não há nenhum benefício específico de tempo de execução em fazer isso de uma forma ou outra, mas colocar todas as substituições conectáveis de comportamento em uma subclasse de SourceViewerConfiguration fornece a vantagem de consolidar todas as substituições comportamentais em um local.  O protocolo dinâmico pode ser útil quando diferentes reconciliadores de apresentação são anexados a um visualizador durante a existência de um editor.