Kolorowanie składni

Kolorowanie składni jest możliwe w środowisku tekstowym platformy korzystającym z modelu niszczenia, naprawiania i uzgadniania. Przy każdej zmianie wprowadzonej do dokumentu obiekt uzgadniający prezentację określa, który region wizualnej prezentacji powinien zostać unieważniony i jak go naprawić. Na potrzeby różnych typów treści w dokumencie mogą być stosowane różne strategie.

Implementacja kolorowania składni (przy użyciu obiektu uzgadniającego prezentację) jest opcjonalna. Domyślnie klasa SourceViewerConfiguration nie instaluje obiektu uzgadniającego prezentację, ponieważ nie zna modelu dokumentu używanego w konkretnym edytorze, a ogólne zachowanie na potrzeby wyróżniania składni nie istnieje.  

Aby do zaimplementowania wyróżniania składni użyć klas uzgadniania, należy skonfigurować przeglądarkę kodu źródłowego edytora tak, aby definiowała obiekt uzgadniający prezentację. Ponownie na początek pokazana zostanie klasa JavaSourceViewerConfiguration, na przykładzie której można zobaczyć, w jaki sposób w edytorze jest definiowany obiekt uzgadniający prezentację.

public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {

	PresentationReconciler reconciler= new PresentationReconciler();
	...
	return reconciler;
}

Aby zrozumieć działanie obiektu uzgadniającego prezentację, należy najpierw przyjrzeć się pojęciom niszczenia, naprawiania i uzgadniania.

Niszczenie, naprawianie i uzgadnianie

Gdy użytkownik zmienia tekst w edytorze, niektóre części edytora muszą zostać wyświetlone ponownie, aby odzwierciedlić zmiany. Przetworzenie tekstu, który musi zostać wyświetlony ponownie, jest określane jako obliczanie zniszczeń. Jeśli jest wprowadzone kolorowanie składni, zniszczenia powstałe w wyniku operacji edycji stają się jeszcze większe, ponieważ obecność lub brak jednego znaku może zmienić kolorowanie tekstu.  

Obiekty oceniające zniszczenia (interfejs IPresentationDamager) określają region prezentacji dokumentu, który musi zostać odbudowany ze względu na zmianę w dokumencie. Z założenia obiekt oceniający zniszczenia prezentacji jest dostosowany do określonego typu treści dokumentu (lub regionu). Musi zwrócić region zniszczeń, który będzie poprawnym elementem wejściowym dla obiektu naprawiającego prezentację (interfejs IPresentationRepairer). Obiekt naprawiający musi być w stanie uzyskać z regionu zniszczeń wszystkie informacje potrzebne do właściwego opisania napraw koniecznych w przypadku danego typu treści.

Uzgadnianie opisuje cały proces konserwacji prezentacji dokumentu po zmianach wprowadzonych w edytorze. Obiekt uzgadniający prezentację (interfejs IPresentationReconciler) monitoruje zmiany w tekście przy użyciu powiązanej z nim przeglądarki. Obiekt uzgadniający używa regionów dokumentu do określenia typów treści, na które wpłynęła zmiana, i powiadamia obiekt oceniający zniszczenia odpowiadający danemu typowi treści. Wynik obliczeń zniszczeń jest przekazywany do obiektu naprawiającego, który przygotowuje opisy napraw do wykonania w przeglądarce, dzięki czemu nastąpi ponowna synchronizacja z bazową treścią. 

Klasy pakietu org.eclipse.jface.text.reconciler definiują dodatkowe klasy obsługi na potrzeby synchronizacji modelu dokumentu z zewnętrznymi zmianami w dokumencie.

Dla każdego typu treści w danym dokumencie obiekty uzgadniające prezentację powinny mieć udostępnioną parę obiektów - obiekt naprawiający i obiekt oceniający zniszczenia. Zadaniem każdego edytora jest ustalenie właściwej implementacji obiektu uzgadniającego prezentację. Jednak platforma zapewnia w pakiecie org.eclipse.jface.text.rules obsługę używania skanerów dokumentów opartych na regułach do obliczania i naprawiania zniszczeń. W pakiecie tym są zdefiniowane podstawowe obiekty oceniające i naprawiające zniszczenia. Mogą one być używane razem ze standardowymi obiektami uzgadniającymi pakietu org.eclipse.jface.text.presentation do implementowania kolorowania składni przez zdefiniowanie reguł skanowania dla dokumentu.

Uzgadnianie oparte na regułach

Teraz można już dokładniej przyjrzeć się tworzeniu przykładowego obiektu uzgadniającego prezentację. Należy pamiętać, że edytor Java implementuje metodę JavaPartitionScanner, która dzieli dokument na partycje o różnych typach treści reprezentujących elementy javadoc, komentarze wielowierszowe i inne. 

Każdy z tych typów treści musi mieć określoną parę obiektów - obiekt oceniający zniszczenia i obiekt naprawiający. W poniższym przykładzie parę tę określono przy użyciu klas PresentationReconciler i DefaultDamagerRepairer.

	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;

Warto zwrócić uwagę, że w przykładzie dla każdego typu treści został udostępniony skaner.  

Aby słowa kluczowe mogły być rozpoznawane i kolorowane, skaner JavaCodeScanner konfiguruje domyślny typ treści. Skaner JavaCodeScanner buduje reguły rozpoznawania różnych rodzajów elementów, takich jak komentarze jednowierszowe, znaki spacji i wyrazy. Opisuje też kolory, które powinny być używane dla wyrazów w różnych typach elementów leksykalnych.   

Skaner SingleTokenScanner konfiguruje inne typy treści i przypisuje im kolor elementów leksykalnych.

Wszystkie szczegóły oceniania i naprawiania zniszczeń odpowiednich części dokumentów według reguł skanowania są obsługiwane przez klasę DefaultDamagerRepairer. Szczegóły te zazwyczaj nie muszą być rozumiane przez kod modułu dodatkowego. Moduł dodatkowy powinien budować zestaw reguł na potrzeby partycjonowania i skanowania treści w edytorze.

Dynamiczne instalowanie obiektu uzgadniającego

Jak pokazano, do instalowania obiektu uzgadniającego edytor Java udostępnia podklasę klasy SourceViewerConfiguration. Obiekt uzgadniający prezentację może być również instalowany w przeglądarce tekstu dynamicznie przy użyciu protokołu IPresentationReconciler. Wybranie jednej z tych metod nie polepsza szczególnie środowiska wykonawczego, ale umieszczenie wszystkich dołączanych przesłonięć zachowań w podklasie klasy SourceViewerConfiguration pozwala korzystać z zalet konsolidacji wszystkich przesłonięć behawioralnych w jednym miejscu. Dynamiczny protokół może być przydatny, gdy w okresie istnienia edytora do przeglądarki jest podłączanych wiele różnych obiektów uzgadniających prezentację.