记住,自述文件工具定义它自已的编辑器,该编辑器使用它的 ReadmeEditorActionBarContributor 向工作台菜单栏添加操作。
<extension point = "org.eclipse.ui.editors"> <editor id = "org.eclipse.ui.examples.readmetool.ReadmeEditor" name="%Editors.ReadmeEditor" icon="icons/obj16/editor.png" 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")); ...
创建添加程序时,添加程序将创建两个可重定目标的操作(一个允许标签更新,一个不允许)。创建这两个操作使用工作台使用的相同技术。它还会创建两个处理程序,在编辑器为活动部件时,将对这些操作使用这两个处理程序。
操作的处理程序是在哪里注册的?当编辑器定义重定目标的操作时,设置全局处理程序稍微有所不同。这是为什么呢?因为添加程序负责跟踪活动视图 并在不同视图或编辑器本身变得活动时挂接不同的处理程序。(当为工作台的其中一个全局操作设置处理程序时,工作台将执行此操作)。以下是 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 的实现。)注意,要启动时,将由当前活动的部件安排该操作。
当编辑器添加程序被除去时,它应取消挂接作为页侦听器的可重定目标的操作。
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); ...
注意,大纲图对第二个操作设置工具提示文本和标签,因为它允许重新标记。自述文件大纲图视图活动时,它的处理程序(及其标签)将出现在工作台菜单栏中。
注意,重新标记的操作将显示新的标签。