我需要达到的目标是:只有在项目是J2ME项目时,才会在popupmenu上出现我的菜单Huayusoft;因此,我需要在plugin.xml中添加条件判断,判断当前选中的是J2ME项目。
而判断一个项目是否是J2ME项目,需要eclipseme插件提供支持。Eclipseme插件本身也提供了这个功能。当当前选中的项目是Java项目时,Eclipseme会弹出菜单J2ME-->Convert to J2ME project;当当前选中的项目是J2ME项目时,Eclipseme会弹出菜单J2ME-->Create Package;
查看Eclipseme的plugin.xml,发现它使用的popupmenus方式,它的核心在这一句: <objectState name="nature" value="eclipseme.core.nature"/> 即判断projectnature是否是eclipseme.core.nature;
在Eclipse的每个java项目目录下,都有一个.project文件。如果是普通的Java Project,它只有一个nature: org.eclipse.jdt.core.javanature 不要惊讶,jdt也是插件。 如果是使用eclipseme插件构建的J2ME project,它还会有一个nature: <nature>eclipseme.core.nature</nature> 如果是使用mtj插件构建的J2ME project,它也会比普通java project多一个nature: <nature>org.eclipse.mtj.core.nature</nature>
从这里也可以看出mtj的命名更标准化了。
在Eclipse中,workspace中的project有两种状态:打开和关闭。当project处于打开的状态时,它的.project文件会被解析,并在内存中有对应的对象。这也是plugin.xml的条件判断在弹出popupmenu前能够起作用的原因。 必须要牢记的是,在弹出popupmenu时,特定的eclipse插件是没有导入的,但是plugin.xml是被解析,而且其作用了的。
而且我发现,IActionObjectDelegate的selectionChanged是在popupmenu前就会被调用的。但是,它有一个前提条件,就是当前选中的对象是符合plugin.xml中描述的条件的。
因为eclipseme采用的popupmenu方式,我也改成了popupmenu方式。这种方式和command方式有相同的地方,也有一些差异。不考虑actionsets的方式,是因为这种方式主要用于menu和toolbar。
popupmenu方式采用的org.eclipse.ui.popupmenus扩展点。它有一个元素叫objectContribution,类似于command方式的menuContribution;这个Contribution可以理解为归属的意思,其实就是连接。 在objectContribution中有objectid和objectclass元素。
这个objectclass就是条件。只有选中的对象满足这个objectclass才会继续下一步。另外,这个adaptable属性也是非常关键的。我的理解是,它应该是一个适配的作用。比如我选中的是IJavaProject,但是我的objectclass是IProject;如果adaptable=true,即允许适配,那么这个条件就满足。
popupmenu方式对menu的定义方式和commands方式相同,但是,它没有command,它用的是action。它的响应是IObjectActionDelegate。
popupmenu方式还有一个差异的地方时:ISelection的是IProject不是IJavaProject,需要用JavaCore进行转换,这一点要特别注意。 |
|
来自: 江江385 > 《eclipse插件开发》