Inhaltsanzeigefunktion implementieren

Mit dem Plug-in für Vergleiche können Sie spezialisierte Anzeigefunktionen für das Anzeigen und Mischen von Inhaltsvergleichen zwischen unstrukturierten Elementen bereitstellen.

Einfache Inhaltsanzeigefunktionen

Eine Inhaltsanzeigefunktion wird in Situationen verwendet, in denen nur eine einzige Eingabe verfügbar und ein Vergleich daher nicht erforderlich ist. Ein typisches Beispiel hierfür ist die Funktion "Aus lokalem Protokoll wiederherstellen".  Am Erweiterungspunkt org.eclipse.compare.contentViewers können Sie eine spezialisierte Inhaltsanzeigefunktion definieren, die ihre Eingabedaten nicht vergleicht..

<extension
	point="org.eclipse.compare.contentViewers">
	<viewer
		extensions="java,java2"
		class="org.eclipse.jdt.internal.ui.compare.JavaTextViewerCreator"
		id="org.eclipse.jdt.internal.ui.compare.JavaTextViewerCreator">
	</viewer>
	<contentTypeBinding
		contentTypeId="org.eclipse.jdt.core.javaSource"
		contentViewerId="org.eclipse.jdt.internal.ui.compare.JavaTextViewerCreator">
	</contentTypeBinding>
</extension>

Spezialisierte, von Ihrem Plug-in ergänzte Anzeigefunktionen werden im Anzeigefunktionselement bestimmt. Sie müssen die ID der Anzeigefunktion sowie die Klasse, die sie erstellt, angeben. Sie können auch beliebige Dateierweiterungen bestimmen, für die die Inhaltsanzeigefunktion verwendet werden soll.  

Sie können auch das Element contentTypeBinding verwenden, um einem Inhaltstyp eine Inhaltsanzeigefunktion zuzuordnen.

Anzeigefunktionen für Inhaltsmischoperationen

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 Standardmischanzeigefunktionen für die Funktion Ihres Plug-ins nicht geeignet ist, können Sie auch Ihre eigene Anzeigefunktion für Inhaltsmischung implementieren.  Ihre Anzeigefunktion für Inhaltsmischung sollte mit der Plattform über den Erweiterungspunkt org.eclipse.compare.contentMergeViewers registriert werden.  Die folgenden Formatierungssteuerzeichen zeigt die Definition spezialisierter Anzeigefunktionen für Inhaltsmischung bei der Betrachtung von Java-Dateien und Merkmaldateien in der Java-IDE:

<extension
	point="org.eclipse.compare.contentMergeViewers">
	<viewer
		extensions="java,java2"
		class="org.eclipse.jdt.internal.ui.compare.JavaContentViewerCreator"
		id="org.eclipse.jdt.internal.ui.compare.JavaContentViewerCreator">
	</viewer>
	<contentTypeBinding
		contentTypeId="org.eclipse.jdt.core.javaProperties"
		contentMergeViewerId="org.eclipse.compare.TextMergeViewerCreator">
	</contentTypeBinding>
	<contentTypeBinding
		contentTypeId="org.eclipse.jdt.core.javaSource"
		contentMergeViewerId="org.eclipse.jdt.internal.ui.compare.JavaContentViewerCreator">
	</contentTypeBinding>
</extension>

Spezialisierte, von Ihrem Plug-in ergänzte Anzeigefunktionen werden, ganz ähnlich wie Inhaltsanzeigefunktionen im Anzeigefunktionselement bestimmt. Sie müssen die ID der Anzeigefunktion sowie die Klasse, die sie erstellt, angeben. Sie können auch beliebige Dateierweiterungen bestimmen, für die die Anzeigefunktion für Inhaltsmischung verwendet werden soll.

Ebenfalls ganz ähnlich wie bei Inhaltsanzeigefunktionen können Sie contentTypeBinding verwenden, um einem Inhaltstyp eine Mischanzeigefunktion zuzuordnen. Das JDT-Plug-in ordnet Mischanzeigefunktionen zwei verschiedenen Inhaltstypen zu: Java-Quellendateien und Java-Merkmaldateien.

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 keinen bestimmten Inhaltstyp voraussetzt, ist die Behandlung eines bestimmten Inhaltstyps Aufgabe der Unterklasse.  

ImageMergeViewer in org.eclipse.compare.internal zeigt, wie eine einfache Anzeigefunktion für Mischoperationen von Images unter Verwendung von ContentMergeViewer implementiert wird.  Ein ContentMergeViewer greift auf sein Modell über einen Inhaltsprovider zu, der die Schnittstelle IMergeViewerContentProvider implementieren muss.

Text mischen

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 Zusammenfügen von Textinhalt. Eine Anzeigefunktion für Textzusammenfügung verwendet den RangeDifferencer zum Ausführen eines textbezogenen, zeilenweisen Vergleichs von zwei (oder drei) Eingabedokumenten.

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. Ist eine andere Strategie erforderlich (beispielsweise Java-Token in einer Java-empfindlichen Zusammenfüge-Anzeigefunktion), können Clients durch Implementieren der Schnittstelle ITokenComparator ihre eigenen Token-Komparatoren erstellen.

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.

Bereich unterscheiden

RangeDifferencer ermittelt die längste Folge von übereinstimmenden und abweichenden vergleichbaren Elementen im Textinhalt. Ihre Implementierung basiert auf einer Objektversion des Algorithmus', der in A File Comparison Program (Webb Miller und Eugene W. Myers, Software Practice and Experience, Nr. 15, November 1985) beschrieben ist. Clients müssen dem Differenzierer eine Arbeitsvorgabe liefern, 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.