可重定目标的编辑器操作

记住,自述文件工具定义它自已的编辑器,该编辑器使用它的 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);  
	...

注意,大纲图对第二个操作设置工具提示文本和标签,因为它允许重新标记。自述文件大纲图视图活动时,它的处理程序(及其标签)将出现在工作台菜单栏中。

具有一个已重命名的编辑器操作的自述文件菜单

注意,重新标记的操作将显示新的标签。