记住,自述文件工具定义它自已的编辑器, 该编辑器使用它的 ReadmeEditorActionBarContributor 向工作台菜单栏添加操作。
<extension point = "org.eclipse.ui.editors"> <editor id = "org.eclipse.ui.examples.readmetool.ReadmeEditor" name="%Editors.ReadmeEditor" icon="icons/obj16/editor.gif" class="org.eclipse.ui.examples.readmetool.ReadmeEditor" extensions="readme" contributorClass="org.eclipse.ui.examples.readmetool.ReadmeEditorActionBarContributor"> </editor> </extension>
让我们进一步考察在添加程序类中发生了什么。
public ReadmeEditorActionBarContributor() { ... action2 = new RetargetAction(IReadmeConstants.RETARGET2, MessageUtil.getString("Editor_Action2")); action2.setToolTipText(MessageUtil.getString("Readme_Editor_Action2")); action2.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_DISABLE); action2.setImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_ENABLE); ... action3 = new LabelRetargetAction(IReadmeConstants.LABELRETARGET3, MessageUtil.getString("Editor_Action3")); action3.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_DISABLE); action3.setImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_ENABLE); ... handler2 = new EditorAction(MessageUtil.getString("Editor_Action2")); ... handler3 = new EditorAction(MessageUtil.getString("Editor_Action3")); ...
创建添加程序时,添加程序将创建两个可重定目标操作(一个允许标号更新,一个不允许)。 创建这两个操作使用工作台使用的相同技术。它还会创建两个处理程序,在编辑器为活动部件时,将对这些操作使用这两个处理程序。
但是,操作的处理程序是在何处注册的?编辑器定义重定目标操作时,设置全局处理程序时有一点不同。 为什么?因为添加程序负责在不同的视图或编辑器自身活动时跟踪活动视图并 hook 不同的处理程序。 (当您为工作台的全局操作之一设置处理程序时,工作台将完成此操作)。 下面显示 ReadmeEditorActionBarContributor 如何进行设置:
public void init(IActionBars bars, IWorkbenchPage page) { super.init(bars, page); bars.setGlobalActionHandler(IReadmeConstants.RETARGET2, handler2); bars.setGlobalActionHandler(IReadmeConstants.LABELRETARGET3, handler3); ...
首先,添加程序为重定目标操作注册它的处理程序。 这将确保当编辑器本身活动时,将运行添加程序的操作。 下一步是将每个 RetargetAction 注册为该页上的部件侦听器。
... // Hook retarget actions as page listeners page.addPartListener(action2); page.addPartListener(action3); IWorkbenchPart activePart = page.getActivePart(); if (activePart != null) { action2.partActivated(activePart); action3.partActivated(activePart); } }
将每个 RetargetAction 作为部件侦听器添加意味着当活动部件更改时将通知它。 操作可以从新激活的部件获取正确的全局处理程序。(有关全部详细信息, 参见 RetargetAction 的实现。)注意,要启动时,将由当前活动的部件安排该操作。
编辑器添加程序被废弃时,它应取消 hook 作为页侦听器的可重定目标操作。
public void dispose() { // Remove retarget actions as page listeners getPage().removePartListener(action2); getPage().removePartListener(action3); }
最后,记住,操作栏添加程序是在同一编辑器类的多个实例之间共享的。 因此,当活动编辑器更改时,必须通知处理程序以便它们可以连接至相应的编辑器实例。
public void setActiveEditor(IEditorPart editor) { ... handler2.setActiveEditor(editor); handler3.setActiveEditor(editor); ... }
这将完成编辑器端的设置。当编辑器打开并活动时,ReadmeEditorActionBarContributor 定义的处理程序(及其标号)将出现在工作台菜单栏中。
既然编辑器的添加项已就位,视图要如何做来注册处理程序? 客户机端的代码与为工作台操作注册处理程序相似, 但操作标识是插件的编辑器定义的操作标识。ReadmeContentOutlinePage 为这些操作注册处理程序。
public void createControl(Composite parent) { super.createControl(parent); ... getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.RETARGET2, new OutlineAction(MessageUtil.getString("Outline_Action2"))); OutlineAction action = new OutlineAction(MessageUtil.getString("Outline_Action3")); action.setToolTipText(MessageUtil.getString("Readme_Outline_Action3")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.LABELRETARGET3, action); ...
注意,大纲图对第二个操作设置工具提示文本和标号, 因为它允许重新标号。自述文件大纲图视图活动时,它的处理程序(及其标号)将出现在工作台菜单栏中。
注意,重新标号的操作将显示新的标号。