文字編輯器組織架構提供許多公用程式類別,來協助呈現和更新文字及程式碼。現在,我們將注意力轉向工作台,而編輯器只是其中的一部分。 編輯器如何與其他工作台功能(如快速功能表、功能表列及工具列)交談呢?
如果要瞭解編輯器如何利用工作台登錄自己,並提供動作給工作台功能表列,請參照討論 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();
}
最先兩個動作定義為可重定目標的文字編輯器動作。 原則類似於工作台所提供的可重定目標的動作。 可重定目標的文字編輯器動作代表若干功能表項目, 動作提供器會以動態方式將這些功能表項目連結至由作用中編輯器所提供的對應動作。 當作用中編輯器變更時,可重定目標的文字編輯器動作所連結的動作也會隨之變更。 下列片段顯示編輯器動作提供器會藉由要求編輯器提供動作給指定的 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 的 ID。(另請參閱下一節。):
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);
}
提供器中的第三個動作就是已新增至工作台工具列的具體動作。 它會在顯示強調顯示的範圍(如同 Java 範例的內容概要畫面所指定一般)和顯示整個檔案之間切換編輯器的狀態。 這個動作僅出現在工具列。
createActions 方法是用來以編輯器登錄動作。 這包括適合於編輯器快速功能表的動作,或任何在延伸定義中提供的動作。 在 Java 範例編輯器中,僅建立可重定目標之動作所連結的動作。 然而,Java 範例編輯器也會繼承由 TextEditor 及其 Super 類別所建立的動作。 這些動作可以用在編輯器快速功能表中。
TextEditor editorContextMenuAboutToShow 方法是用在組織架構中,以容許編輯器新增動作至編輯區的快速功能表。您可以使用功能表路徑,來確切地判定您的動作應該在那裡出現。 編輯器快速功能表內的有效功能表路徑定義在 AbstractTextEditor 中這個方法的實作內。
有數種新增動作至這個功能表的方法。第一種方法就是新增動作, 做法為僅使用以編輯器登錄動作時所用的 ID。 舉例來說,當呼叫這個方法時,JavaTextEditor 會新增適合於內容輔助的動作至功能表。 當在所用的 ID 之下沒有動作登錄時,動作將不會出現在功能表中。
public void editorContextMenuAboutToShow(MenuManager menu) {
super.editorContextMenuAboutToShow(menu);
addAction(menu, "ContentAssistProposal");
addAction(menu, "ContentAssistTip");
}
Super 類別 TextEditor 是新增動作的第二種方法 - 在快速功能表中指定放置動作的功能表群組。 在這種情況下,動作(向左移位、向右移位 )的確會出現在由 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 時,您可以使用 AbstractTextEditor 通訊協定, 來設定編輯器和尺規快速功能表的 ID。基於這個目的,可以使用 setEditorContextMenuId 和 setRulerContextMenuId 方法。如果您想要防止繼承已提供給 Super 類別功能表的功能表, 重設 ID 可能很有用。舉例來說, 範例中的 JavaTextEditor 會將它的快速功能表 ID 重設為 Java 特有的, 以便防止從其他外掛程式繼承通用的文字構成要素。
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。