文本编辑器框架提供了许多实用程序类,这些实用程序类帮助显示和更新文本和源代码。现在,我们将主要讨论工作台,编辑器只是它的一部分。编辑器如何与其它工作台功能部件(例如,上下文菜单、菜单栏和工具栏)交互?
要了解编辑器如何向工作台注册它们自己以及为工作台菜单栏提供操作,参见讨论 org.eclipse.ui.editors 的那一节。在此处,我们将不再讲述那些信息。我们将只是快速查看一下 Java 示例编辑器在其中注册其编辑器的标记。
<extension point="org.eclipse.ui.editors"> <editor name="%javaEditorName" icon="icons/obj16/java.gif" 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(); }
前两个操作被定义为可重定目标的文本编辑器操作。其原理类似于工作台提供的可重定目标的操作。可重定目标的文本编辑器操作表示一些菜单项,操作添加程序将把这些菜单项动态地绑定至活动编辑器提供的相应操作。当活动编辑器发生更改时,将可重定目标的文本编辑器操作绑定至的操作也会随之更改。以下片段说明编辑器操作添加程序通过要求编辑器提供给定标识的操作来查找相应的操作:
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();
}
向编辑器注册操作所采用的标识与此处为 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); }
添加程序中的第三个操作是添加至工作台工具栏的具体操作。它使编辑器的状态在显示突出显示的范围(由 Java 示例的内容大纲图控制)与显示整个文件之间进行切换。此操作只出现在工具栏中。
createActions 方法用于向编辑器注册操作。这些操作包括适合于编辑器上下文菜单的操作或在扩展定义中添加的任何操作。在 Java 示例编辑器中,将只创建已绑定至可重定目标的操作的那些操作。但是,Java 示例编辑器还继承了由 TextEditor 及其超类创建的操作。可在编辑器上下文菜单中使用这些操作。
在框架中,TextEditor 方法 editorContextMenuAboutToShow 用来允许编辑器将操作添加至编辑区域的上下文菜单。可以使用菜单路径来决定应当出现操作的准确位置。编辑器上下文菜单中的有效菜单路径是在 AbstractTextEditor 中此方法的实现中定义的。
可以采用多种方法来将操作添加至此菜单中。第一种方法是只使用向编辑器注册操作所采用的标识来添加操作。例如,当调用此方法时,JavaTextEditor 就会将它有关内容辅助的操作添加至菜单。当没有采用所使用的标识来注册任何操作时,操作将不会出现在菜单中。
public void editorContextMenuAboutToShow(MenuManager menu) { super.editorContextMenuAboutToShow(menu); addAction(menu, "ContentAssistProposal"); addAction(menu, "ContentAssistTip"); }
超类 TextEditor 采用另一种方法来添加操作 — 通过在上下文菜单中指定用于放置操作的菜单组。在这种情况下,(Shift+向左箭头和 Shift+向右箭头)操作一定会出现在由 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 中此方法的实现定义可以在其中将某些项添加至菜单的组。
可以为编辑器上下文菜单和标尺上下文菜单指定标识,以便其它插件可以在它们的扩展中添加至这些菜单。自从平台的原始版本以来,用于建立菜单标识的方案更加灵活了。但是,框架可以兼容性方式运行,以便与为原始版本开发的插件保持兼容。可以使用 AbstractTextEditor.setCompatibilityMode() 来控制此行为。缺省设置为 true。
当兼容性方式为 true 时,就可以使用 AbstractTextEditor 协议来设置编辑器上下文菜单和标尺上下文菜单的标识。setEditorContextMenuId 和 setRulerContextMenuId 方法可完成此目的。如果想要防止继承已添加至超类菜单的菜单,则重新设置标识会很有用。例如,示例中的 JavaTextEditor 就将它的上下文菜单标识重新设置为特定于 Java 的,以便防止从其它插件继承任何类属文本添加项。
protected void initializeEditor() { super.initializeEditor(); JavaEditorEnvironment.connect(this); setSourceViewerConfiguration(new JavaSourceViewerConfiguration()); setEditorContextMenuId("#JavaEditorContext"); setRulerContextMenuId("#JavaRulerContext"); }
如果在具体层次结构中的任何地方都没有设置标识,则将使用由 AbstractTextEditor 定义的缺省标识。
编辑器上下文菜单标识始终是 <editor id>.EditorContext
,其中 <editor id>
是编辑器的标识。编辑器的标识是在编辑器的 xml 声明中定义的。标尺上下文菜单标识始终是 <editor id>.RulerContext
。