テキスト・エディター・フレームワークは、テキストとソース・コードの表示および更新に役立つ、多くの ユーティリティー・クラスを提供しています。 ここでは、エディターが含まれていても、その一部ではないワークベンチについて調べてみましょう。 エディターは、その他のワークベンチ・フィーチャー (コンテキスト・メニュー、メニュー・バー、およびツールバー) と どのように対話するのでしょうか?
どのようにエディターが自身をワークベンチに登録するか、またワークベンチ・メニュー・バーのアクションを提供するかについては、 org.eclipse.ui.editors について説明しているセクションを参照してください。 ここでは、この問題には触れません。 Java サンプル・エディターが自身を登録するマークアップについて簡単に見てみましょう。
<extension point="org.eclipse.ui.editors"> <editor name="%javaEditorName" icon="icons/obj16/java.png" extensions="jav" contributorClass="org.eclipse.ui.examples.javaeditor.JavaActionContributor" class="org.eclipse.ui.examples.javaeditor.JavaEditor" id="org.eclipse.ui.JavaEditor"> </editor> </extension>
ワークベンチ・メニュー・バーのアクションは JavaActionContributor によって提供されています。 これは、ワークベンチの「編集」メニューおよびワークベンチ・ツールバーに置かれるアクションをインプリメントします。
public JavaActionContributor() { super(); fContentAssistProposal= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistProposal."); //$NON-NLS-1$ ... fContentAssistTip= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistTip."); //$NON-NLS-1$ ... fTogglePresentation= new PresentationAction(); }
最初の 2 つのアクションは、再ターゲット化が可能なテキスト・エディター・アクションとして定義されています。 原理は、ワークベンチによって提供されている再ターゲット可能なアクションと同様です。 再ターゲット化が可能なテキスト・エディター・アクションは、アクション・コントリビューターが、アクティブ・エディターによって 提供された対応するアクションに動的にバインドするメニュー・エントリーを表します。 アクティブ・エディターが変更されると、再ターゲット化が可能なテキスト・エディター・アクションがバインドされている アクションも同様に変更されます。 以下の断片は、エディター・アクション・コントリビューターが、与えられた ID のアクションをエディターに要求することによって、 対応するアクションを検索することを示しています。
protected final IAction getAction(ITextEditor editor, String actionId) {
return (editor == null ? null : editor.getAction(actionId));
} public void setActiveEditor(IEditorPart part) {
super.setActiveEditor(part);
ITextEditor editor= null;
if (part instanceof ITextEditor)
editor= (ITextEditor) part;
fContentAssistProposal.setAction(getAction(editor, "ContentAssistProposal"));
fContentAssistTip.setAction(getAction(editor, "ContentAssistTip"));
fTogglePresentation.setEditor(editor);
fTogglePresentation.update();
}
アクションがエディターに登録されたときの ID は、ここで JavaTextEditor に与えたものと同じでなければなりません。
(次のセクションを参照してください。):
protected void createActions() { super.createActions(); IAction a= new TextOperationAction(JavaEditorMessages.getResourceBundle(), "ContentAssistProposal.", this, ISourceViewer.CONTENTASSIST_PROPOSALS); //$NON-NLS-1$ a.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS); setAction("ContentAssistProposal", a); a= new TextOperationAction(JavaEditorMessages.getResourceBundle(), "ContentAssistTip.", this, ISourceViewer.CONTENTASSIST_CONTEXT_INFORMATION); //$NON-NLS-1$ a.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_CONTEXT_INFORMATION); setAction("ContentAssistTip", a); }
コントリビューターの 3 つ目のアクションは、ワークベンチ・ツールバーに追加された具象アクションです。 これは、エディターの状態を強調表示された範囲の表示 (Java サンプルのコンテンツ・アウトライナーで説明) と ファイル全体の表示とで切り替えます。 このアクションは、ツールバーでのみ行われます。
メソッド createActions は、アクションをエディターに登録するために使用されます。 ここには、エディター・コンテキスト・メニューに該当するアクション、または拡張定義に組み込まれているアクションが含まれます。 Java サンプル・エディターでは、再ターゲット化が可能なアクションにバインドされるアクションだけが作成されます。 ただし、Java サンプル・エディターは、TextEditor およびそのスーパークラスによって作成されたアクションも継承します。 これらのアクションは、エディター・コンテキスト・メニューで使用できます。
TextEditor メソッド editorContextMenuAboutToShow は、エディターが編集域のコンテキスト・メニューにアクションを追加できるようにするために、 フレームワークで使用されます。 メニュー・パスを使用すると、アクションがどこに表示されるかを決定することができます。 エディター・コンテキスト・メニュー内の有効なメニュー・パスは、 AbstractTextEditor のこのメソッドの インプリメンテーションに定義されています。
このメニューにアクションを追加するには、いくつかの方法があります。 1 つは、エディターに登録されている ID を使用するだけで、そのアクションを追加する方法です。 たとえば JavaTextEditor は、そのメソッドが呼び出されたときに、そのコンテンツ・アシスタンス用のアクションをメニューに追加します。 使用されている ID で登録されているアクションがない場合、アクションはメニューには表示されません。
public void editorContextMenuAboutToShow(MenuManager menu) { super.editorContextMenuAboutToShow(menu); addAction(menu, "ContentAssistProposal"); addAction(menu, "ContentAssistTip"); }
スーパークラス TextEditor は、 もう 1 つの方法 (アクションを置くコンテキスト・メニューにメニュー・グループを指定) でアクションを追加します。 この場合、アクション (「左へシフト」、「右へシフト」) は、 AbstractTextEditor によって 定義されているグループにあるコンテキスト・メニューには表示されません。
protected void editorContextMenuAboutToShow(IMenuManager menu) { super.editorContextMenuAboutToShow(menu); addAction(menu, ITextEditorActionConstants.GROUP_EDIT, ITextEditorActionConstants.SHIFT_RIGHT); addAction(menu, ITextEditorActionConstants.GROUP_EDIT, ITextEditorActionConstants.SHIFT_LEFT); }
メソッド rulerContextMenuAboutToShow は、ルーラーのコンテキスト・メニューが表示される前に同じ方法で使用されます。 AbstractTextEditor でのこのメソッドの インプリメンテーションは、項目をメニューに追加できるグループを定義しています。
エディター・コンテキストおよびルーラー・コンテキスト・メニューには、他のプラグインがその拡張において これらのメニューに提供できるよう、ID を割り当てることができます。 メニュー ID 確立の体系は、プラットフォームのオリジナル・バージョンに比べ、より柔軟になっています。 ただし、オリジナル・バージョン用に開発されたプラグインとの互換性を保つため、フレームワークは 互換モードで機能します。 AbstractTextEditor.setCompatibilityMode() を 使用すると、この動作を制御できます。 デフォルト設定は true です。
互換モードが true になっている場合、エディターおよびルーラー・コンテキスト・メニューの ID は、 AbstractTextEditor プロトコルで 設定できます。 この目的のため、メソッド setEditorContextMenuId および setRulerContextMenuId を使用できます。 スーパークラス・メニューに提供されていたメニューの継承を禁止したい場合、ID のリセットが役立ちます。 たとえば、サンプルにおける JavaTextEditor は、他のプラグインからの汎用テキスト提供の継承を避けるため、 その Java 特定となるコンテキスト・メニュー ID をリセットします。
protected void initializeEditor() { super.initializeEditor(); JavaEditorEnvironment.connect(this); setSourceViewerConfiguration(new JavaSourceViewerConfiguration()); setEditorContextMenuId("#JavaEditorContext"); setRulerContextMenuId("#JavaRulerContext"); }
具体的な階層のいずれかの場所に設定されている ID がない場合、 AbstractTextEditor によって定義されているデフォルト ID が使用されます。
エディター・コンテキスト・メニュー ID は、常に <editor id>.EditorContext
(<editor id>
はエディターの ID) です。
エディターの ID は、そのエディターの xml 宣言に定義されています。
ルーラー・コンテキスト・メニュー ID は、常に <editor id>.RulerContext
です。