Implementace prohlížeče obsahu

Porovnávací modul plug-in vám umožňuje poskytovat specializované prohlížeče pro prohlížení a slučování obsahových rozdílů mezi nestrukturovanými prvky.

Jednoduché prohlížeče obsahu

Prohlížeč obsahu se používá v místech, kde je k dispozici pouze jednoduchý vstup, a tudíž není potřeba porovnávání.  Typickým příkladem je funkce "Obnovit z lokální historie".  Bod rozšíření org.eclipse.compare.contentViewers vám umožňuje definovat specializovaný prohlížeč obsahu, který neporovnává jeho vstupy.

<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>

Specializované prohlížeče poskytované vaším modulem plug-in jsou označeny v prvku prohlížeč. Musíte určit id prohlížeče a třídu, která jej tvoří. Můžete rovněž určit libovolné přípony souborů, pro které by měl být prohlížeč obsahu použit.  

Můžete také použít prvek contentTypeBinding pro přiřazení typu obsahu k prohlížeči obsahu.

Prohlížeče sloučení obsahu

Prohlížeč sloučení obsahu provádí dvojcestné a trojcestné porovnání svých vstupů a prezentuje výsledky vedle sebe nebo jiným vhodným způsobem.  Prohlížeč umožňuje uživateli slučovat mezi vstupy. Prohlížeče sloučení obsahu jsou obvyklé pro text nebo obrázky.

Pokud standardní prohlížeče sloučení nejsou vhodné pro funkci vašeho modulu plug-in, můžete zvolit implementaci vlastního prohlížeče sloučení obsahu.  Váš prohlížeč sloučení obsahu by měl být registrován v platformě pomocí bodu rozšíření org.eclipse.compare.contentMergeViewers.  Následující markup ukazuje definici specializovaných prohlížečů sloučení obsahu pro prohlížení souborů Java a souborů vlastností v 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>

Podobně jako prohlížeče obsahu jsou i specializované prohlížeče sloučení poskytované vaším modulem plug-in označeny v prvku prohlížeč. Musíte určit id prohlížeče a třídu, která jej tvoří. Můžete rovněž určit libovolné přípony souborů, pro které by měl být prohlížeč sloučení obsahu použit.

Rovněž podobně jako u prohlížečů obsahu můžete použít prvek contentTypeBinding pro přiřazení typu obsahu k prohlížeči sloučení. Modul plug-in JDT přiřazuje prohlížeče sloučení obsahu ke dvěma různým typům obsahu: zdrojovým souborům Java a souborům vlastností Java.

ContentMergeViewer je abstraktní prohlížeč porovnání a sloučení se dvěma obsahovými oblastmi vedle sebe a s volitelnou obsahovou oblastí pro společného předchůdce (pro trojcestné porovnání).  Jelikož implementace nečiní žádné předpoklady o typu obsahu, odpovídá podtřída za zacházení s konkrétním typem obsahu.  

ImageMergeViewer v org.eclipse.compare.internal ukazuje, jak implementovat jednoduchý prohlížeč sloučení pro obrázky pomocí ContentMergeViewerContentMergeViewer přistupuje ke svému modelu prostřednictvím poskytovatele obsahu, který musí implementovat rozhraní IMergeViewerContentProvider.

Slučování textu

Pokud váš prohlížeč používá text, je možné použít další třídy, které  porovnávají a slučují textový obsah.

TextMergeViewer je konkrétní podtřídou ContentMergeViewer pro porovnávání a slučování textového obsahu.  Prohlížeč sloučení textu používá RangeDifferencer k textovému, řádek po řádku prováděnému porovnávání dvou (nebo tří) vstupních dokumentů.

Pro řádky textu, které jsou odlišné používá TextMergeViewer ITokenComparator k nalezení nejdelších posloupností odpovídajících a nevyhovujících tokenů. Porovnání výchozího tokenu TextMergeViewer pracuje se znaky oddělenými neviditelnými znaky. V případě potřeby jiné strategie (například tokeny Java v prohlížeči sloučení se znalostí prostředí Java) mohou klienti vytvářet vlastní tokenové komparátory implementací rozhraní ITokenComparator.

TextMergeViewer pracuje s celými dokumenty a s dílčími rozsahy dokumentů. Pro částečné dokumenty musí být vstup prohlížeče IDocumentRange namísto IDocument.

Rozlišování rozsahu

RangeDifferencer nalézá nejdelší posloupnosti odpovídajících a nevyhovujících porovnatelných entit v textovém obsahu. Jeho implementace je založena na objektivizované verzi algoritmu popsaném v: A File Comparison Program, autoři Webb Miller a Eugene W. Myers, Software Practice and Experience, Vol. 15, Nov. 1985.  Klienti musí poskytnout vstup rozlišovači, který implementuje rozhraní IRangeComparator. IRangeComparator rozděluje vstupní data do sekvence entit a poskytuje metodu porovnání jedné entity s entitou v jiném IRangeComparator.

Například pro porovnání dvou textových dokumentů a nalezení nejdelších společných posloupností odpovídajících a nevyhovujících řádků musí implementace IRangeComparator rozdělit dokument do řádků a poskytnout metodu testování, zda jsou dva řádky považovány za stejné. Příklad tohoto postupu viz org.eclipse.compare.internal.DocLineComparator.

Rozlišovač vrací rozdíly mezi těmito posloupnostmi jako přehled objektů RangeDifference. Každý objekt RangeDifference popisuje druh rozdílu (žádná změna, změna, přidání, odstranění) a odpovídající rozsahy základních porovnatelných entit ve dvou nebo třech vstupech.