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 die Syntax ist optional. In der Standardeinstellung installiertSourceViewerConfiguration keine Darstellungsausgleichsfunktion, da das für einen bestimmten Editor verwendete Dokumentmodell nicht bekannt ist und kein generisches Verhalten für die Syntaxhervorhebung 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 Konzepte der Beschädigung, Korrektur und des Ausgleichs von Bedeutung.
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.
Darstellungsausgleichsfunktionen sollten mit einem Paar aus Korrekturfunktion und Beschädigungsanalysefunktion für jeden Inhaltstyp bereitgestellt werden, der im Dokument gefunden werden kann. Jeder Editor muss selbst die geeignete Implementierung für eine Darstellungsausgleichsfunktion ermitteln. Die Plattform stellt jedoch in org.eclipse.jface.text.rules eine Unterstützung für die Verwendung von regelbasierten Dokumentscannerfunktionen zur Verfügung, die die Beschädigungen berechnen und korrigieren. Dieses Paket enthält Standardversionen für Beschädigungsanalyse- und Korrekturfunktionen. Sie können zusammen mit den Standardausgleichsfunktionen ausorg.eclipse.jface.text.presentation verwendet werden, um die Syntaxfarbgebung durch die Definition von Suchregeln für das Dokument zu implementieren.
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 vonPresentationReconciler undDefaultDamagerRepairer.
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 Maschinenwö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.
Der Java-Beispieleditor stellt eine Unterklasse vonSourceViewerConfiguration für die Installation der bereits vorgestellten Darstellungsausgleichsfunktion zur Verfügung. Eine Darstellungsausgleichsfunktion kann aber auch dynamisch für eine Textanzeigefunktion installiert werden, indem das Protokoll IPresentationReconciler verwendet wird. Welche dieser beiden Methoden verwendet wird, ist für die Laufzeit unerheblich. Wenn Sie jedoch die gesamten Überschreibungen des einfügbaren Verhaltens in eine Unterklasse von SourceViewerConfiguration stellen, haben Sie den Vorteil, dass alle verhaltensbezogenen Überschreibungen an derselben Stelle konsolidiert sind. Das dynamische Protokoll kann hilfreich sein, wenn im Lebenszyklus eines Editors unterschiedliche Darstellungsausgleichsfunktionen zu einer Anzeigefunktion zugeordnet werden.