Eclipse Action 3
6.2.4. Action 图标
下一步, 为action关联可以显示在工作台工具栏上的图标。选择在前面章节添加的打开Favorites视图action, 点击出现在icon域右侧的 Browse... 按钮,在打开的结果对话框中,展开树的节点,从icons文件夹中选择sample.gif 条目 (见 图6-5)。点击OK 按钮, icons/sample.gif 将出现在icon 域中。
Figure 6-5. 用来选择图标的资源属性值对话框
出现在icon域和plugin.xml文件的路径是相对于插件的安装目录的。其他的与图标有关的属性还有hoverIcon 和 disabledIcon。
创建你自己的图标
许多程序都可以创建修改图标,像Jasc's Paint Shop Pro和Adobe's Photoshop。使用这些软件,你可以利用Eclipse提供的图标,进行相应的修改。 (见plugins\org.eclipse.ui_3.1.2.jar 或 plugins\org.eclipse.jdt.ui_3.1.2.jar 下的\icons\full 目录)。图标通常是带透明度颜色的 *.gif 文件。
6.2.5. 插入点
Eclipse是由众多插件组合而成,因为每个插件在构建时期都可以在对其他插件未知的情况下贡献action,所以action或子菜单在父亲中的绝对位置直到运行期,才可以知道。即使在执行阶段,如果用户改变了选择,同等级的action会被添加或删除,所以action的位置还是可能改变。因为这个原因,Eclipse使用标示符来引用每一个菜单,组,或者action和路径,也就是作为一个插入点,用来指定菜单或者action显示的位置。
插入点由一个或两个用“/”分隔的标示符组成,标示action在父亲(此情况指菜单)和组中的位置。例如,Open Favorites View action的菜单栏属性(见 6.2.3节, 定义菜单条目和工具栏按钮,图6-1) 是由两个用“/”分隔的元素组成。
第一个元素,com.qualityeclipse.favorites.workbenchMenu,标示Favorites菜单;第二个元素,content,标示Favorites菜单中的组。在许多情况下,例如当父亲是工作台菜单栏或者视图上下文菜单时,父亲是隐含的,所以在插入点只要指定组就可以了。
插件通过一个空的标记为"additions"的组,使得别的插件可以添加新的action到它的菜单中。"additions"标示符在Eclipse中是实事上的标准,用来指定新的action和菜单的位置,它是作为一个IWorkbenchActionConstants.MB_ADDITIONS常量被使用。例如,Favorites菜单指定一个路径属性(见 6.2.1节, 定义工作台窗口菜单),属性的值为"additions",它使得Favorites菜单出现在Window菜单的左侧。因为Window菜单的标示符是window,如果Favorites菜单的路径属性设置为"window/additions",Favorites菜单将作为子菜单出现在Window菜单下,而不是出现在工作台菜单栏。
嵌套ActionSet问题
在actionSet中定义一个action,actionSet也贡献了一个定义在另一个actionSet的菜单,在Eclipse日志文件中就会出现如下错误:
Invalid Menu Extension (Path is invalid): some.action.id
要解决这个问题,要在两个actionSet中都定义菜单。更多信息,见Bugzilla条目#36389 和 #105949。
工具栏属性也是一个插入点,它有同menubarPath属性的结构,但是是标示action出现在工作台工具栏的位置,而不是菜单栏。例如,Open Favorites View action (见 6.2.3节, 定义菜单条目和工具栏按钮)的toolbarPath属性也是由两个由“/”分隔的元素组成: 第一个元素, Normal, 是工作台工具栏的标示符;第二个元素 ,additions,是action要出现在工具栏的组。
6.2.6. 创建 action 代理
action代理包含了关联到action的行为。使用下面是几种方法,你可以为一个action关联一个action代理。
- 在class输入框输入action代理的类名。
- 点击class输入框左边的class:标签,创建一个新的action代理类。
- 点击点击class输入框右边的Browse...按钮,选择已经存在的action代理。
如果你还没有创建action类,可以使用Eclipse定制产生一个。选择Open Favorites View action,点击class输入框左边的class:标签 ,打开action类的Java属性编辑器。 (见图6-6).
图6-6. action 类的Java 属性编辑器
在Package 输入框输入"com.qualityeclipse.favorites.actions" ,在Name输入框输入"OpenFavoritesViewActionDelegate"。点击 Finish 按钮创建新的action代理,并且打开该类的Java编辑器。
在类被创建,编辑器打开后,按照如下方式进行修改,使得当用户选择action时,Favorites视图将被打开。加入一个新的成员变量,更改init()方法来存储window对象,window对象在action的执行中会使用到。
private IWorkbenchWindow window;
public void init(IWorkbenchWindow window) {
this.window = window;
}
下一步, 为 FavoritesView 类增加一个常量来作为唯一的标示符,用来打开Favorites视图。
public static final String ID =
"com.qualityeclipse.favorites.views.FavoritesView";
最后, 更改OpenFavoritesViewActionDelegate 类的run() 访法,实现打开Favorites 视图的操作。
public void run(IAction action) {
// Get the active page.
if (window == null)
return;
IWorkbenchPage page = window.getActivePage();
if (page == null)
return;
// Open and activate the Favorites view.
try {
page.showView(FavoritesView.ID);
}
catch (PartInitException e) {
FavoritesLog.logError("Failed to open the Favorites view", e);
}
}
6.2.6.1. selectionChanged 方法
在插件装载文件的action声明中只是提供了action的初始状态, action的selectionChanged()方法使用IAction接口提供了动态调整action的状态,可用性,甚至action的文字的机会。
例如, enablesFor 属性 (见 6.3.2节, action过滤和可用性) 用来指定选择了哪些对象,action是可用的。但是如果实现了selectionChanged()方法,可以更精巧的来进行状态设置。这个方法可以根据当前的选择,调用IAction.setEnabled()方法来更新action的可用性。
为了调用action 代理的selectionChanged() 方法,你需要在你的视图的createPartControl()方法中调用 getViewSite().setSelectionProvider(viewer)。
6.2.6.2. run 方法
当用户选择了action并期望一个操作被执行的时候,就要调用run()方法。它和selectionChanged()方法相似,可以使用IAction接口根据操作的结果改变action的状态。
必要的守护代码
需要注意的是,如果插件没有被装载,而是用户选择一个菜单选项导致插件被加载,selectionChanged()方法将不会在run()方法之前运行,所以run()方法仍然需要适当的守护代码。另外,run()方法是在主UI线程中执行,所以要考虑将耗时长的操作放到后台线程中(见 20.8节, 后台任务Jobs API)。