Colorazione della sintassi

La colorazione della sintassi viene fornita nel framework del testo della piattaforma mediante un modello di danno, riparazione e riconciliazione.  Per ciascuna modifica applicata a un documento, un reconciler di presentazione stabilisce quale area della presentazione visiva deve essere invalidata e come procedere alla riparazione.  È possibile utilizzare strategie diverse per tipi diversi di contenuti nel documento.

L'implementazione della colorazione della sintassi, e l'eventuale uso del reconciler di presentazione, sono facoltativi.  Per impostazione predefinita, SourceViewerConfiguration non installa un reconciler di presentazione in quanto non conosce il modello di documento utilizzato per un determinato editor e non è dotato di funzionalità generiche per l'evidenziazione della sintassi.  

Per poter utilizzare le classi di riconciliazione per implementare l'evidenziazione della sintassi, è necessario che il visualizzatore di origine dell'editor sia configurato per la definizione di un reconciler di presentazione.  Ancora una volta, si partirà da JavaSourceViewerConfiguration per illustrare come un reconciler di presentazione viene definito per l'editor.

public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {

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

Per comprendere le funzioni svolte da un reconciler di presentazione, è necessario prima illustrare i concetti di danno, riparazione e riconciliazione.

Danno, riparazione e riconciliazione

Quando l'utente modifica il testo in un editor, è necessario visualizzare nuovamente parti dell'editor per visualizzare le modifiche.  L'elaborazione del testo che deve essere rivisualizzato viene definita elaborazione del danno. Quando viene utilizzata la colorazione della sintassi, l'entità del danno causato da un'operazione di modifica diventa più estesa, dal momento che la presenza o l'assenza di un unico carattere è in grado di modificare la colorazione del testo che lo circonda.  

I danneggiatori (IPresentationDamager) determinano la sezione della presentazione di un documento che deve essere ricreata a causa di una modifica apportata al documento. Un danneggiatore di presentazione viene considerati specifico di un determinato tipo di contenuto di documento (o sezione). Deve essere in grado di restituire una sezione non finale che costituisce un valido input per un riparatore di presentazione (IPresentationRepairer).  Un riparatore deve essere in grado di dedurre da una sezione non finale tutte le informazioni necessarie per descrivere correttamente le riparazioni necessarie per un particolare tipo di contenuto.

La riconciliazione descrive il processo generale di gestione della presentazione di un documento quando vengono apportate modifiche nell'editor.  Un reconciler di presentazione (IPresentationReconciler) controlla le modifiche apportate al testo mediante il visualizzatore associato.  Utilizza le sezioni del documento per determinare i tipi di contenuti interessati dalle modifiche e ne invia notifica al danneggiatore appropriato per quel tipo di contenuto.  Una volta elaborato, il danno viene trasferito al riparatore appropriato che elaborerà descrizioni di riparazioni da applicare al visualizzatore in modo che sia nuovamente sincronizzato con il contenuto sottostante. 

Le classi in org.eclipse.jface.text.reconciler definiscono classi di supporto aggiuntive per la sincronizzazione di un modello di documento con manipolazione esterna del documento.

I reconciler di presentazione dovrebbero essere forniti di una coppia di riparatore e danneggiatore per ciascun tipo di contenuto da trovare nel documento.  È compito di ciascun editor determinare l'implementazione appropriata per un reconciler di presentazione.  Tuttavia la piattaforma fornisce supporto org.eclipse.jface.text.rules per l'utilizzo degli scanner di documento basati su regole per elaborare e riparare il danno.  In questo pacchetto sono definiti i danneggiatori e i riparatori predefiniti.  Questi possono essere utilizzati insieme ai reconciler standard in org.eclipse.jface.text.presentation per implementare la colorazione della sintassi mediante la definizione delle regole di scannerizzazione per il documento.

Riconciliazione basata su regole

A questo punto è possibile analizzare nei dettagli la creazione del reconciler di presentazione di esempio.  Si tenga presenta che l'editor Java implementa uno JavaPartitionScanner che suddivide il documento in partizioni nei tipi di contenuti che rappresentano la javadoc, i commenti multiriga e tutti gli altri. 

Per ciascun tipo di contenuto, è necessario specificare una coppia danneggiatore/riparatore.  Questa operazione può essere eseguita mediante il PresentationReconciler e il 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;

Si osservi che l'esempio fornisce scanner per ciascun tipo di contenuto.  

Il tipo di contenuto predefinito viene impostato con un JavaCodeScanner, pertanto è possibile individuare e colorare una parola chiave.  Lo JavaCodeScanner crea regole per l'individuazione di tipi diversi di token, ad esempio commenti a riga singola, spazi e parole.  Esso descrive i colori da utilizzare per le parole dei diversi tipi di token.   

Gli altri tipi di contenuti vengono impostati con uno SingleTokenScanner e viene assegnato un colore da utilizzare per i token in tali tipi di contenuti.

Tutti i dettagli relativi al danno e alla riparazione delle parti appropriate dei documenti in base alle regole di scannerizzazione vengono gestiti da DefaultDamagerRepairer.  Generalmente non è necessario che il codice di plugin capisca tali dettagli.  Il plugin deve focalizzare l'attenzione sulla creazione di un insieme di regole appropriate per la suddivisione in partizioni e per la scannerizzazione del contenuto dell'editor.

Installazione dinamica di un reconciler

L'esempio di editor Java fornisce una sottoclasse di SourceViewerConfiguration per l'installazione del reconciler di presentazione, come illustrato precedentemente.  Un reconciler di presentazione può essere installato anche dinamicamente su un visualizzatore di testo mediante il protocollo IPresentationReconciler.  Procedure alternative non comportano alcun particolare vantaggio di run-time, ma inserendo tutte le sostituzioni delle funzioni collegabili in una sottoclasse di SourceViewerConfiguration, si ottiene il vantaggio di fissare tutte le sostituzioni in un'unica posizione.  Il protocollo dinamico può risultare utile quando reconciler di presentazione diversi vengono aggiunti a un visualizzatore per tutto il ciclo di vita di un editor.