Implementowanie przeglądarki treści

Moduł dodatkowy umożliwia stosowanie specjalnych przeglądarek do wyświetlania oraz scalania różnic między elementami bez określonej struktury.

Proste przeglądarki treści

Przeglądarka treści jest używana w sytuacji, gdy dostępny jest tylko jeden obiekt wejściowy i nie ma potrzeby porównywania. Typowym tego przykładem jest funkcja Odtwórz z lokalnej historii. Punkt rozszerzenia org.eclipse.compare.contentViewers umożliwia zdefiniowanie specjalnej przeglądarki treści, która nie porównuje obiektów wejściowych.

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

Specjalne przeglądarki udostępniane przez moduł dodatkowy są określone w elemencie viewer. Należy określić parametr id (identyfikator) przeglądarki oraz parametr class, czyli klasę, która tworzy przeglądarkę. Do danej przeglądarki treści mogą zostać przypisane dowolne rozszerzenia plików (extensions).  

Aby przypisać typy treści do przeglądarki treści, należy zastosować element contentTypeBinding.

Przeglądarki scalania treści

Przeglądarka scalania treści wykonuje podwójne lub potrójne porównanie obiektów wejściowych i prezentuje wyniki jeden obok drugiego lub w inny wygodny sposób. Przeglądarka ta umożliwia scalenie obiektów wejściowych. Przeglądarki scalania treści są często używane w przypadku tekstu i obrazów.

Jeśli standardowe przeglądarki scalania nie są odpowiednie dla danej funkcji modułu dodatkowego, można zaimplementować własną przeglądarkę scalania treści. Własną przeglądarkę scalania treści należy zarejestrować na platformie przy użyciu punktu rozszerzenia org.eclipse.compare.contentMergeViewers.  Poniższy fragment kodu przedstawia definicję specjalnej przeglądarki scalania treści służącej do wyświetlania plików Java oraz plików właściwości w środowisku IDE języka Java:

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

Podobnie jak w przypadku przeglądarek treści, przeglądarki scalania udostępniane przez moduł dodatkowy są opisane w elemencie viewer. Należy określić parametr id (identyfikator) przeglądarki oraz parametr class, czyli klasę, która tworzy przeglądarkę. Do danej przeglądarki scalania treści mogą zostać przypisane dowolne rozszerzenia plików (extensions).

Również podobnie, jak w przypadku przeglądarek treści, aby przypisać typy treści do przeglądarki scalania treści, należy zastosować element contentTypeBinding. Moduł dodatkowy JDT wiąże przeglądarki scalania treści z dwoma różnymi typami treści: kodem źródłowym Java i plikami właściwości Java.

Klasa abstrakcyjna ContentMergeViewer oferuje przeglądarkę treści i scalania z dwoma znajdującymi się obok siebie obszarami treści oraz opcjonalnym obszarem treści dla wspólnej wcześniejszej treści (przy porównywaniu potrójnym). Ponieważ ta implementacja nie przyjmuje żadnych założeń co do typu treści, za rozpoznanie konkretnego typu treści odpowiedzialna jest jej podklasa.  

Klasa ImageMergeViewer pakietu org.eclipse.compare.internal pokazuje, jak zaimplementować prostą przeglądarkę scalania dla obrazów, korzystając z klasy ContentMergeViewer.  Klasa ContentMergeViewer ma dostęp do własnego modelu przez dostawcę treści, który musi implementować interfejs IMergeViewerContentProvider.

Scalanie tekstu

Jeśli przeglądarka ma operować na tekście, do porównywania i scalania tekstu można użyć dodatkowych klas.

Klasa TextMergeViewer jest podklasą konkretną klasy ContentMergeViewer używaną do porównywania i scalania tekstu.  Przeglądarka scalania treści używa klasy RangeDifferencer to wykonania tekstowego porównania, wiersz po wierszu, dwóch lub trzech dokumentów wejściowych.

W przypadku różniących się wierszy podklasa TextMergeViewer używa interfejsu ITokenComparator do wyszukania najdłuższej sekwencji zgodnych i niezgodnych elementów. Funkcja porównywania elementów podklasy TextMergeViewer działa domyślnie na znakach oddzielonych znakami spacji. Jeśli konieczne jest inne podejście, na przykład trzeba wyszukać elementy Java w przeglądarce scalania kodu Java, klienci mogą utworzyć własne sposoby porównywania elementów, implementując interfejs ITokenComparator.

Podklasa TextMergeViewer działa na całych dokumentach, jak również na ich podzakresach. W przypadku części dokumentów obiekt wejściowy przeglądarki musi implementować interfejs IDocumentRange, a nie interfejs IDocument.

Różnicowanie zakresów

Klasa RangeDifferencer wyszukuje w tekście najdłuższą sekwencję zgodnych i niezgodnych porównywalnych jednostek. Implementacja tej klasy opiera się na obiektowej wersji algorytmu opisanego w książce: A File Comparison Program, by Webb Miller and Eugene W. Myers, Software Practice and Experience, Vol. 15, Nov. 1985. Klienci muszą dostarczyć do klasy różnicującej obiekt wejściowy, który implementuje interfejs IRangeComparator. Interfejs IRangeComparator dzieli dane wejściowe na sekwencje jednostek i udostępnia metodę porównywania danej jednostki z jednostką w innym obiekcie implementującym interfejs IRangeComparator.

Aby porównać na przykład dwa dokumenty tekstowe i znaleźć najdłuższe wspólne sekwencje zgodnych i niezgodnych wierszy, implementacja interfejsu IRangeComparator musi podzielić dokument na wiersze i udostępnić metodę pozwalającą sprawdzić, czy dwa wiersze są jednakowe. Przykładem takiej implementacji może być klasa org.eclipse.compare.internal.DocLineComparator.

Klasa różnicująca zwraca różnice między sekwencjami w postaci tablicy obiektów RangeDifference. Każdy obiekt RangeDifference opisuje rodzaj różnicy (bez zmian, zmiana, dodanie, usunięcie) oraz odpowiednie zakresy porównywanych jednostek bazowych z dwóch lub trzech dokumentów wejściowych.