プラットフォーム・テキスト・フレームワークは、テキスト用の文書モデルを定義し、そのモデルを使用してテキストを 表示するビューアーを提供しています。 まず Java エディター・サンプルを調べ、このモデルがどのように使用されるかを見てみましょう。 すでに org.eclipse.ui.editors に関するセクションで述べているため、 エディター拡張の登録における基本機構については述べません。 代わりに、サンプルでエディター・クラスがインプリメントされている方法について調べます。
ワークベンチにおいて、通常、ユーザーがドメイン・エレメント (ファイル、またはアーカイブ・ファイルに 保管されているエレメントなど) を選択し、それを開くときにエディターが開きます。 エディターが作成されると、編集されるオブジェクトを記述するエディター入力 (IEditorInput) に関連付けられます。
ユーザーが拡張子 "*.jav" のファイルを開くと、Java サンプル・エディターが起動します。 この場合、エディターへの入力は IFileEditorInput です。 エディター入力それ自身について、プラットフォーム・テキスト・フレームワークが要求する前提条件は、ほとんどありません。 これは、入力用の表示モデル IDocument を操作するため、 テキストを効果的に表示し、操作することができます。
つまり、予期されているドメイン・モデル (エディター入力) から表示モデルにマップする方法がなければなりません。 このマッピングは IDocumentProvider に 定義されています。 エディター入力を与えられると、文書プロバイダーは該当する IDocument を返します。
Java エディター・サンプルは、該当する文書を返す JavaDocumentProvider を定義しています。 該当する文書プロバイダーと確立された "*.jav" 拡張子はどのような関係になっているでしょうか? これは、org.eclipse.ui.documentProviders 拡張で行われます。 この拡張は、ファイル・タイプと文書プロバイダーとの間のマッピングを定義するために使用されます。 サンプルでは、その文書プロバイダーが以下のように定義されています。
<extension point="org.eclipse.ui.documentProviders"> <provider extensions="jav" class="org.eclipse.ui.examples.javaeditor.JavaDocumentProvider" id="org.eclipse.ui.examples.javaeditor.JavaDocumentProvider"> </provider> </extension>
指定された拡張子のファイルをユーザーが開くと、ワークベンチが文書プロバイダー・インスタンス作成の詳細を管理します。 ワークベンチは文書プロバイダー・インスタンスを一度だけ作成し、そのインスタンスを異なるエディターの間で共有します。
あなたのプラグインがこの拡張ポイントを使用し、その文書プロバイダーを登録する必要はありません。 文書プロバイダーをエディターに関連付けるもう 1 つの方法は、あなたのプラグイン自身に文書プロバイダーを管理させることです。 これは通常、そのプラグイン・クラスで行われます。 入力エレメントがエディターに設定されると、そのエディターは該当する文書プロバイダーをそのプラグイン・クラスに要求します。 プラグインは、作成、および文書プロバイダーへの参照を管理することができます。 文書プロバイダーに特殊な初期化またはその他の処理が関係している場合、この技法をお勧めします。 例については、JDT ツールの ClassFileEditor を参照してください。
適切な文書プロバイダーがエディターに関連付けられると、そのメインタスクは、エディター入力から文書を作成し、 その文書を区画に分割するために該当するオブジェクトを構成します。
JavaDocumentProvider で、文書および区画について調べてみましょう。 文書が作成されると、 IDocumentPartitioner が作成され、 その文書に設定されます。
protected IDocument createDocument(Object element) throws CoreException { IDocument document= super.createDocument(element); if (document != null) { IDocumentPartitioner partitioner= createJavaPartitioner(); document.setDocumentPartitioner(partitioner); partitioner.connect(document); } return document; }
分割機能には、区画と呼ばれる非オーバーラップ領域に文書を分割する役割があります。 区画 (ITypedRegion で表示) は、 構文強調表示や形式化といった機能に関して、さまざまな文書のセクションを個別に処理するために役立ちます。
Java エディター・サンプルの場合、文書は、javadoc コメント、複数行コメント、および他のすべてを表す区画に分割されています。 領域はそれぞれ、コンテンツ型、および文書内のその位置に割り当てられています。 位置は、ユーザーがテキストを編集するときに更新されます。
文書分割機能に該当するインプリメンテーションを決定するのは、エディターそれぞれの役割です。 ルール・ベースの文書スキャンについては、 org.eclipse.jface.text.rules に サポートが提供されています。 ルール・ベース・スキャナーを使用することによって、エディターはフレームワークによって提供されている DefaultPartitioner を使用できます。
private IDocumentPartitioner createJavaPartitioner() { return new DefaultPartitioner(getJavaPartitionScanner(), 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 の クラスを参照してください。 構文強調表示を調べるときに、もう一度スキャナーを見てみましょう。
エディター入力の該当する文書を提供する他に、文書プロバイダーのもう 1 つの重要なタスクは、 エディター入力で使用するために該当する IAnnotationModel を 提供することです。 このモデルは、文書に関連付けられている注釈を管理するために使用されます。 文書プロバイダーにモデルを提供させることによって、エディターはコンテンツの型に適切なモデルを使用することができます。 注釈について、またそれらがどのように表示されるかについて、次のセクションで詳しく調べてみましょう。