Farbgebung für Syntax

Die Farbgebung für die Syntax wird im Textgerüst der der Plattform unter Verwendung eines Modells für Beschädigung, Korrektur und Ausgleich erreicht. Für jede Änderung, die an einem Dokument vorgenommen wird, ermittelt eine Darstellungsausgleichsfunktion, welcher Bereich der optischen Darstellung ungültig gemacht werden soll und wie er korrigiert werden muss.  Für unterschiedliche Inhaltstypen in einem Dokument können jeweils separate Strategien verwendet werden.

Die Implementierung der Farbgebung für Syntax (und die Verwendung einer Darstellungsausgleichsfunktion) ist optional.  In der Standardeinstellung installiert SourceViewerConfiguration keine Darstellungsausgleichsfunktion, da das für einen bestimmten Editor verwendete Dokumentmodell nicht bekannt ist und kein generisches Verhalten für die Hervorhebung von Syntax vorhanden ist.  

Um die Syntaxhervorhebung durch Verwendung von Ausgleichsklassen implementieren zu können, muss die Konfiguration der Quellenanzeigefunktion für den Editor so konfiguriert sein, dass eine Darstellungsausgleichsfunktion definiert ist.  Die Definition einer Darstellungsausgleichsfunktion für den Editor wird auch an dieser Stelle ausgehend von JavaSourceViewerConfiguration erläutert.

public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {

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

Zum Verständnis der Funktionsweise einer Darstellungsausgleichsfunktion sind zunächst die KonzepteBeschädigung, Korrektur und Ausgleich von Bedeutung.

Beschädigung, Korrektur und Ausgleich

Wenn der Benutzer Text in einem Editor ändert, müssen Teile des Editors neu angezeigt werden, damit die Änderungen sichtbar sind.  Die Berechnung des Textes, der neu angezeigt werden muss, wird auch als Berechnung der Beschädigung bezeichnet.  Wird eine Farbgebung für die Syntax angewendet, ist der Umfang der Beschädigung, die durch eine Bearbeitungsoperation verursacht wird, erheblich größer, da das Vorhandensein oder Nichtvorhandensein eines einzigen Zeichens die Farbe des umgebenden Textes ändern kann.  

Beschädigungsanalysefunktionen (IPresentationDamager) ermitteln den Bereich in der Darstellung des Dokuments, der aufgrund einer Dokumentänderung erneut erstellt werden muss. Ein Beschädigungsanalysefunktion für die Darstellung ist für einen bestimmten Dokumentinhaltstyp (oder Bereich) spezifisch. Sie muss in der Lage sein, einen Beschädigungsbereich zurückzugeben, der als gültige Eingabe für eine Darstellungskorrekturfunktion (IPresentationRepairer) verwendet werden kann.  Eine Korrekturfunktion muss alle benötigen Informationen aus einem Beschädigungsbereich ableiten können, damit die für einen bestimmten Inhaltstyp erforderlichen Korrekturen erfolgreich beschrieben werden können.

Der Begriff Ausgleich beschreibt den gesamten Prozess, mit dem die Darstellung eines Dokuments verwaltet wird, wenn im Editor Änderungen vorgenommen werden.  Eine Darstellungsausgleichsfunktion (IPresentationReconciler) überwacht Änderungen am Text über die ihr zugeordneten Anzeigefunktionen.  Anhand der Dokumentbereiche ermittelt sie die von den Änderungen betroffenen Inhaltstypen und benachrichtigt eine Beschädigungsanalysefunktion, die für den betreffenden Inhaltstyp geeignet ist.  Sobald die Beschädigung berechnet worden ist, wird sie an die passende Korrekturfunktion übergeben. Diese wiederum erstellt Korrekturbeschreibungen, die auf die Anzeigefunktion angewendet werden, damit sie wieder mit dem zu Grunde liegenden Inhalt synchron ist. 

Die Klassen in org.eclipse.jface.text.reconciler definieren zusätzliche Unterstützungsklassen für die Synchronisierung eines Dokumentmodells mit der externen Bearbeitung des Dokuments.

Für jeden im Dokument enthaltenen Inhaltstyp sollten Darstellungsausgleichsfunktionen mit einer Korrektur- und einer Beschädigungsanalysefunktion bereitgestellt werden.  Jeder Editor muss selbst die geeignete Implementierung für eine Darstellungsausgleichsfunktion bestimmen.  Die Plattform bietet jedoch für die Verwendung regelbasierter Scanner zur Berechnung und Korrektur von Beschädigungen Unterstützung unter org.eclipse.jface.text.rules an.  In diesem Paket werden standardmäßige Korrektur- und Beschädigungsanalysefunktionen definiert.  Sie können zusammen mit den Standardausgleichsfunktionen unter org.eclipse.jface.text.presentation verwendet werden, um Syntaxfarbgebung zu implementieren, indem Sie Scannregeln für das Dokument definieren.

Regelbasierter Ausgleich

Sie verfügen jetzt über genügend Hintergrundwissen, um sich mit der Erstellung der Beispielfunktion für den Darstellungsausgleichs im Detail zu beschäftigen. Zur Erinnerung: Der Java-Beispieleditor implementiert einen JavaPartitionScanner, der das Dokument in Inhaltstypen für Javadoc, mehrzeilige Kommentare und sonstige Daten partitioniert. 

Für jeden dieser Inhaltstypen muss nun ein Paar aus Beschädigungsanalyse- und Korrekturfunktion angegeben werden.  Dies erfolgt im Folgenden unter Verwendung von PresentationReconciler und 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;

Sie können feststellen, dass das Beispiel für jeden Inhaltstyp eine Scannerfunktion bereitstellt.  

Der Standardinhaltstyp wird mit einem JavaCodeScanner konfiguriert, damit Schlüsselwörter festgestellt und farblich gekennzeichnet werden können.  Der JavaCodeScanner stellt Regeln für die Ermittlung unterschiedlicher Tokentypen (z. B. einzeilige Kommentare, Leerzeichen und Wörter) auf.  Er beschreibt die Farben, die für Wörter mit unterschiedlichem Tokentyp verwendet werden sollen.   

Die anderen Inhaltstypen werden mit einem SingleTokenScanner konfiguriert und erhalten eine Farbe, die für Token in diesen Inhaltstypen verwendet wird.

Alle Details für die Beschädigung und Korrektur der richtigen Teile des Dokuments unter Beachtung der Scannregeln werden durch DefaultDamagerRepairer verarbeitet.  Diese Details müssen in der Regel vom Plug-in-Code nicht verstanden werden.  Ihr Plug-in sollte sich auf die Erstellung einer Reihe von Regeln konzentrieren, die für die Partitionierung und das Durchsuchen des Editorinhalts geeignet sind.

Ausgleichsfunktion dynamisch installieren

Das Java-Editor-Beispiel bietet für die zuvor gesehene Installation der Darstellungsausgleichsfunktion eine Subklasse vonSourceViewerConfiguration .  Darstellungsausgleichsfunktionen können in einer Textanzeigefunktion auch dynamisch unter Verwendung des Protokolls IPresentationReconciler installiert werden.  Welche der beiden Methoden verwendet wird, ist für die Laufzeit unerheblich. Wenn Sie jedoch die gesamten Überschreibungen des Plug-in-Verhaltens in eine Unterklasse von SourceViewerConfiguration stellen, haben Sie den Vorteil, dass alle verhaltensbezogenen Überschreibungen an einer gemeinsamen Position konsolidiert sind.  Das dynamische Protokoll kann recht nützlich sein, wenn während der Lebensdauer eines Editors verschiedene Darstellungsausgleichsfunktionen mit einer Anzeigefunktion verbunden werden.