Mit dem Plug-in für Vergleiche können Sie spezialisierte Anzeigefunktionen für das Anzeigen und Mischen von Inhaltsvergleichen zwischen unstrukturierten Elementen bereitstellen.
Eine Inhaltsanzeigefunktion wird dann verwendet, wenn nur ein Eingabeelement vorhanden und somit kein Vergleich erforderlich ist. Ein typisches Beispiel hierfür ist die Funktion Aus lokalem Protokoll wiederherstellen. Am Erweiterungspunktorg.eclipse.compare.contentViewers können Sie eine spezialisierte Inhaltsanzeigefunktion definieren, die ihre Eingabedaten nicht vergleicht.
Eine Anzeigefunktion für Inhaltsmischoperationen führt einen Zweifach- oder Dreifachvergleich der Eingabedaten aus und stellt die Ergebnisse nebeneinander oder auf andere geeignete Weise dar. Sie ermöglicht dem Benutzer Mischoperationen mit den Eingabedaten. Anzeigefunktionen für Inhaltsmischoperationen werden gewöhnlich für Text oder Images verwendet.
Wenn die Standardanzeigefunktionen für Mischoperationen für die Funktion Ihres Plug-ins ungeeignet sind, können Sie stattdessen eine eigene Inhaltsanzeigefunktion implementieren. Ihre Inhaltsanzeigefunktion sollte für die Plattform unter Verwendung des Erweiterungspunktes org.eclipse.compare.contentMergeViewers registriert werden. Die folgenden Konfigurationsbefehle zeigen die Definition von spezialisierten Inhaltsanzeigefunktionen für Mischoperationen, mit denen Java- und Eigenschaftsdateien in der Java-IDE angezeigt werden können:
<extension point="org.eclipse.compare.contentMergeViewers"> <viewer id="org.eclipse.jdt.internal.ui.compare.JavaContentViewerCreator" extensions="java,java2" class="org.eclipse.jdt.internal.ui.compare.JavaContentViewerCreator"> </viewer> <viewer id="org.eclipse.jdt.internal.ui.compare.TextMergeViewerCreator" extensions="properties" class="org.eclipse.jdt.internal.ui.compare.TextMergeViewerCreator"> </viewer> </extension>
In den Konfigurationsbefehlen geben Sie die ID der Anzeigefunktion (id), die durch sie erstellte Klasse (class) und die Dateierweiterung (extensions) an, für die die Inhaltsanzeigefunktion verwendet werden soll.
ContentMergeViewer ist eine abstrakte Anzeigefunktion für Vergleichs- und Mischoperationen mit zwei nebeneinander angeordneten Inhaltsbereichen sowie einem optionalen Inhaltsbereich für einen gemeinsamen Vorgänger (bei einem Dreifachvergleich). Da die Implementierung keine Voraussetzungen für den Inhaltstyp definiert, ist es Aufgabe der Unterklasse, einen spezifischen Inhaltstyp zu verarbeiten.
ImageMergeViewer in org.eclipse.compare.internal zeigt, wie eine einfache Anzeigefunktion für Mischoperationen von Images unter Verwendung von ContentMergeViewer implementiert wird. ContentMergeViewer greift über einen Inhaltsprovider, der die Schnittstelle IMergeViewerContentProvider implementieren muss, auf sein Modell zu.
Falls Ihre Anzeigefunktion Text verwendet, können Sie zusätzliche Klassen nutzen, die Textinhalt vergleichen und mischen.
TextMergeViewer ist die konkrete Unterklasse von ContentMergeViewer für das Vergleichen und Mischen von Textinhalt. Eine Anzeigefunktion für Textmischoperationen verwendet RangeDifferencer, um einen textbezogenen und zeilenweisen Vergleich von zwei (oder drei) Eingabedokumenten auszuführen.
Bei abweichenden Textzeilen verwendet TextMergeViewer ein Objekt ITokenComparator, um die längste Folge von übereinstimmenden und abweichenden Token zu ermitteln. Der Standardtokenvergleich von TextMergeViewer kann für Zeichen verwendet werden, die durch Leerzeichen voneinander abgegrenzt sind. Falls eine andere Strategie benötigt wird (beispielsweise Java-Token in einer Java-fähigen Anzeigefunktion für Mischoperationen), können Clients eigene Tokenvergleichsfunktionen erstellen, indem die Schnittstelle ITokenComparator implementiert wird.
TextMergeViewer kann für ganze Dokumente und für Teilbereich von Dokumenten verwendet werden. Bei Teildokumenten muss die Eingabe für die Anzeigefunktion ein Objekt IDocumentRange anstelle eines Objekts IDocument sein.
RangeDifferencer ermittelt die längste Folge von übereinstimmenden und abweichenden vergleichbaren Elementen im Textinhalt. Seine Implementierung basiert auf einer objektbezogenen Version des Algorithmus', der in A File Comparison Program (Webb Miller und Eugene W. Myers, Software Practice and Experience, Vol. 15, Nov. 1985) beschrieben ist. Clients müssen eine Eingabe für die Differenzierung bereitstellen, die die Schnittstelle IRangeComparator implementiert. IRangeComparator zerlegt die Eingabedaten in eine Folge von Elementen und bietet eine Methode für den Vergleich eines Elements mit dem Element in einem anderen IRangeComparator.
Beispiel: Um zwei Textdokumente zu vergleichen und die längsten gemeinsamen Folgen von übereinstimmenden und abweichenden Zeilen zu ermitteln, muss die Implementierung von IRangeComparator das Dokument in Zeilen zerlegen und eine Methode bereitstellen, mit der getestet werden kann, ob zwei Zeilen als identisch betrachtet werden können. Ein Beispiel hierfür finden Sie in org.eclipse.compare.internal.DocLineComparator.
Der Differenzierer gibt die Unterschiede zwischen diesen Abfolgen als einen Bereich von RangeDifference-Objekten zurück. Jedes einzelne Objekt RangeDifference beschreibt die Art des Unterschieds (keine Änderung, Änderung, Hinzufügung, Löschung) und die entsprechenden Bereiche der zu Grunde liegenden vergleichbaren Elemente in den zwei oder drei Eingabeobjekten.