構文の色付けは、損傷、修復、および調整のモデルを使用するプラットフォーム・テキスト・フレームワークで提供されています。文書に適用された変更ごとに、表示リコンサイラーは、ビジュアル表記のどの領域が無効になるか、またどのようにそれを修復するかを決定します。 文書内の異なるコンテンツ・タイプに、異なるストラテジーを使用できます。
構文の色付けのインプリメント (および表示リコンサイラーによる実行) はオプションです。特定のエディターに使用される文書モデルを認識せず、構文強調表示のための汎用動作を行わないため、デフォルトで SourceViewerConfiguration は表示リコンサイラーをインストールしません。
構文強調表示をインプリメントするようクラスを調整するためには、エディターのソース・ビューアーを 構成し、表記リコンサイラーを定義しなければなりません。もう一度 JavaSourceViewerConfiguration を調べ、どのように表示リコンサイラーがエディターに定義されているか見てみましょう。
public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) { PresentationReconciler reconciler= new PresentationReconciler(); ... return reconciler; }
表示リコンサイラーが何を行うかを理解するためには、まず損傷、修復、および調整の概念を調べなければなりません。
ユーザーがエディターでテキストを変更すると、その変更を表示するためにエディターのパーツが再表示されます。再表示されなければならないテキストの計算は、損傷の計算と呼ばれます。 構文の色付けが適用されていると、ある 1 文字の存在または欠落がその周囲のテキストの色付けに影響することがあるため、編集操作によって生じる損傷の量は重大なものになります。
ダメージャー (IPresentationDamager) は、文書の変更のために再ビルドしなければならない文書の表示の領域を決定します。表示ダメージャーは、特定の文書コンテンツ・タイプ (または領域) に特定のものと想定されています。表示リペアラー (IPresentationRepairer) にとって有効な入力である損傷領域を返すことができるようになっていなければなりません。特定のコンテンツ・タイプに必要な修復を正常に記述するためには、リペアラーは、必要な情報すべてを損傷領域から引き継がなければなりません。
調整は、エディターで変更が発生したときに、文書の表示を保守するプロセス全体を記述します。 表示リコンサイラー (IPresentationReconciler) は、その関連ビューアーを使用して、テキストに加えられた変更をモニターします。文書の領域を使用して、変更によって影響を受けるコンテンツ・タイプを判別し、その影響を受けるコンテンツ・タイプに該当するダメージャーに通知します。 損傷が計算されると、ビューアーに適用されている修復記述を構成し、それを基本コンテンツと同期させる該当するリペアラーに渡されます。
org.eclipse.jface.text.reconciler のクラスは、文書モデルをその文書の外部操作と同期させるため、追加のサポート・クラスを定義します。
文書に存在するコンテンツ・タイプごとに、リペアラーとダメージャーのペアとともに表示リコンサイラーが提供されていなければなりません。表示リコンサイラーに該当するインプリメンテーションを決定するのは、エディターそれぞれの役割です。 ただし、損傷を計算および修復するルール・ベース文書スキャナーを使用するため、プラットフォームは org.eclipse.jface.text.rules でサポートを提供しています。 デフォルト・ダメージャーおよびリペアラーはこのパッケージに定義されています。 これらは、文書用のスキャン・ルールを定義することによって構文の色付けをインプリメントするため、 org.eclipse.jface.text.presentation の標準リコンサイラーとともに使用できます。
これで、サンプル表示リコンサイラーの作成について詳しく調べる準備ができました。 Java エディター・サンプルが、javadoc、複数行コメント、およびその他すべてを表すコンテンツ・タイプに文書を分割する JavaPartitionScanner をインプリメントすることを思い出してください。
これらのコンテンツ・タイプごとに、ダメージャー/リペアラーのペアが指定されていなければなりません。これは、PresentationReconciler および 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;
この例では、コンテンツ・タイプごとにスキャナーが提供されていることに注意してください。
デフォルト・コンテンツ・タイプは JavaCodeScanner でセットアップされているため、キーワードを検出し、色を付けることができます。 JavaCodeScanner は、異なる種類のトークン (単一行コメント、空白、およびワードなど) を検出するためのルールを作成します。 これは、異なるトークン型のワードに使用される色を記述しています。
その他のコンテンツ・タイプは SingleTokenScanner でセットアップされ、それらのコンテンツ・タイプのトークンに使用される色を与えられています。
スキャン・ルールに従って、文書の適切な部分を損傷させ、修復するための詳細すべては、 DefaultDamagerRepairer によって処理されます。これらの詳細は通常、プラグイン・コードによって認識されている必要はありません。 あなたのプラグインは、そのエディター・コンテンツを分割およびスキャンするために適切なルールのセットのビルドを行わなければなりません。
Java エディター・サンプルは、前に述べたように、表示リコンサイラーをインストールするための SourceViewerConfiguration のサブクラスを提供しています。また表示リコンサイラーは、 IPresentationReconciler プロトコルを使用して、テキスト・ビューアーに動的にインストールすることができます。 いずれの方法を行っても、ランタイムにおける特定の効果はありません。 ただし、SourceViewerConfiguration のサブクラスにプラグ可能動作の上書きすべてを行うことによって、動作上書きすべてを 1 つに統合できるという効果が生まれます。エディターの使用期間にわたって異なる表示リコンサイラーがビューアーに関連付けられている場合、この動的プロトコルが役立ちます。