プラットフォーム・テキスト・フレームワークは、テキスト用の文書モデルを定義し、そのモデルを使用してテキストを 表示するビューアーを提供しています。 まず Java エディター・サンプルを調べ、このモデルがどのように使用されるかを見てみましょう。 すでに org.eclipse.ui.editors に関するセクションで述べているため、 エディター拡張の登録における基本機構については述べません。 代わりに、サンプルでエディター・クラスがインプリメントされている方法について調べます。
ワークベンチにおいて、通常、ユーザーがドメイン・エレメント (ファイル、またはアーカイブ・ファイルに 保管されているエレメントなど) を選択し、それを開くときにエディターが開きます。 エディターが作成されると、編集されるオブジェクトを記述するエディター入力 (IEditorInput) に関連付けられます。
ユーザーが拡張子 "*.jav" のファイルを開くと、Java サンプル・エディターが起動します。 この場合、エディターへの入力は IFileEditorInput です。 エディター入力それ自身について、プラットフォーム・テキスト・フレームワークが要求する前提条件は、ほとんどありません。 これは、入力用の表示モデル IDocument を操作するため、 テキストを効果的に表示し、操作することができます。
つまり、予期されているドメイン・モデル (エディター入力) から表示モデルにマップする方法がなければなりません。 このマッピングは IDocumentProvider に 定義されています。 エディター入力を与えられると、ドキュメント・プロバイダーは該当する IDocument を返します。
Java エディター・サンプルでは、プラグイン org.eclipse.ui.editors で定義された TextFileDocumentProvider が継承されています。 拡張 org.eclipse.ui.editors.documentProviders は、エディター入力タイプ (ファイル拡張子) とドキュメント・プロバイダーの間のマッピングを定義する場合に使用されます。 エディター・プラグインでは、そのドキュメント・プロバイダーが以下のように定義されています。
<extension point="org.eclipse.ui.editors.documentProviders"> <provider class="org.eclipse.ui.editors.text.TextFileDocumentProvider" inputTypes="org.eclipse.ui.IStorageEditorInput" id="org.eclipse.ui.editors.text.StorageDocumentProvider"> </provider> </extension>
この拡張ポイントを使用すると、プラグインは、ドキュメント・プロバイダーを登録し、登録したドキュメント・プロバイダーをファイル拡張子またはエディター入力クラスに割り当てることができます。 Java エディター・サンプルは独自のドキュメント・プロバイダー拡張を定義していないため、すべての入力タイプに指定されている汎用ドキュメント・プロバイダー IStorageEditorInput を継承します。 編集するファイルをユーザーが開くと、プラットフォームが適切なドキュメント・プロバイダー・インスタンス作成の詳細を管理します。 ファイル拡張子に特定のドキュメント・プロバイダーが登録されている場合は、このドキュメント・プロバイダーが使用されます。ファイル拡張子に対する特定のドキュメント・プロバイダーがない場合は、エディター入力タイプを使用して、適切なプロバイダーが検索されます。
汎用プラットフォーム・ドキュメント・プロバイダーを使用すると、Java エディター・サンプルは、ファイル・バッファリングや他の最適化など、ドキュメント・プロバイダーのすべてのフィーチャーを使用することができます。
Java エディターは、プラットフォーム・テキスト・ドキュメント・プロバイダーを使用するため、Java ファイルの処理にどのように特化された振る舞いを提供できるでしょうか?
拡張 org.eclipse.core.filebuffers.documentSetup を使用して、ファイル拡張子と IDocumentSetupParticipant の間のマッピングが定義されます。 セットアップ参加者は、文書がエディターに提供されると、任意の特殊機能を使用して、文書をセットアップします。
<extension id="ExampleJavaDocumentSetupParticipant" name="%documentSetupParticipantName" point="org.eclipse.core.filebuffers.documentSetup"> <participant extensions="jav" class="org.eclipse.ui.examples.javaeditor.JavaDocumentSetupParticipant"> </participant> </extension>
この拡張定義では、Java に固有のタスクのドキュメントをセットアップできる例を示します。 JavaDocumentSetupParticipant は何を行うのでしょうか? ここでは、単純化した setup メソッドを示します。
public void setup(IDocument document) { ... IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES); partitioner.connect(document); ... }
このセットアップ・コードでは、partitioner というオブジェクトを構成します。
分割機能 (IDocumentPartitioner) には、区画と呼ばれる非オーバーラップ領域に文書を分割する役割があります。 区画 (ITypedRegion で表示) は、 構文強調表示や形式化といった機能に関して、さまざまな文書のセクションを個別に処理するために役立ちます。
Java エディター・サンプルの場合、文書は、javadoc コメント、複数行コメント、および他のすべてを表す区画に分割されています。 領域はそれぞれ、コンテンツ型、および文書内のその位置に割り当てられています。 位置は、ユーザーがテキストを編集するときに更新されます。
文書分割機能に該当するインプリメンテーションを決定するのは、エディターそれぞれの役割です。 ルール・ベースの文書スキャンについては、 org.eclipse.jface.text.rules に サポートが提供されています。 ルール・ベース・スキャナーを使用することによって、エディターはフレームワークによって提供されている FastPartitioner を使用できます。
IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES);
RuleBasedPartitionScanner は、ルール・ベース・スキャナーのスーパークラスです。 サブクラスには、トークン (行区切り文字、空白、文書スキャン時の総称パターンなど) を区別するために使用される ルールを列挙およびインプリメントする役割があります。 サンプルの JavaPartitionScanner は、単一行コメント、文字定数、javadoc、複数行コメント、およびワードを 区別するためのルールを定義しています。 これは、スキャナーのコンストラクターで行われます。
public JavaPartitionScanner() { super(); IToken javaDoc= new Token(JAVA_DOC); IToken comment= new Token(JAVA_MULTILINE_COMMENT); List rules= new ArrayList(); // Add rule for single line comments. rules.add(new EndOfLineRule("//", Token.UNDEFINED)); // Add rule for strings and character constants. rules.add(new SingleLineRule("¥"", "¥"", Token.UNDEFINED, '¥¥')); rules.add(new SingleLineRule("'", "'", Token.UNDEFINED, '¥¥')); // Add special case word rule. rules.add(new WordPredicateRule(comment)); // Add rules for multi-line comments and javadoc. rules.add(new MultiLineRule("/**", "*/", javaDoc, (char) 0, true)); rules.add(new MultiLineRule("/*", "*/", comment, (char) 0, true)); IPredicateRule[] result= new IPredicateRule[rules.size()]; rules.toArray(result); setPredicateRules(result); }
ルールの定義、およびルールの型について詳しくは、 org.eclipse.jface.text.rules の クラスを参照してください。 構文強調表示を調べるときに、もう一度スキャナーを見てみましょう。