nighty

折腾的年华
posts - 37, comments - 143, trackbacks - 0, articles - 0

一个ActionDelegate代理多个Action

Posted on 2007-08-15 09:55 寒武纪 阅读(6209) 评论(0)  编辑  收藏 所属分类: Eclipse

    以前在做Eclipse插件的时候,习惯一个功能定义一个操作项。比如说在org.eclipse.ui.popupMenus扩展点上,如果有添加这个功能,但是添加的类型有多样,我们假定现在有添加A、B、C、D四个元素,在扩展点上添加一个viewerContribution扩展,添加四个Action,分别为A、B、C、D。因为这四个添加功能非常相近,所以我们可以只写一个ActionDelegate,把这四个Action的代理类都指向同一个。但是ID必须区分。声明定义如下:

 <viewerContribution
            
id="test.viewerContribution1"
            targetID
="test.testView" >
         
<action
               
class="test.AddTestDelegate"
               id
="add.a"
               label
="A"
               menubarPath
="test"/>
         
<action
               
class="test.AddTestDelegate"
               id
="add.b"
               label
="B"
               menubarPath
="test"/>
         
<action
               
class="test.AddTestDelegate"
               id
="add.c"
               label
="C"
               menubarPath
="test"/>
         
<action
               
class="test.AddTestDelegate"
               id
="add.d"
               label
="D"
               menubarPath
="test"/>
      
</viewerContribution>

    上面的主要区别是在id,在所有的代理ActionDelegate中的run(IAction action)方法中都带有一个参数action,这个参数有个用途就是可以在运行时区别是对应的那个action。下面我们看一下AddTestDelegate类的定义:

 1package test;
 2
 3import org.eclipse.jface.action.IAction;
 4import org.eclipse.jface.viewers.ISelection;
 5import org.eclipse.ui.IViewActionDelegate;
 6import org.eclipse.ui.IViewPart;
 7
 8public class AddTestDelegate implements IViewActionDelegate {
 9
10    private IViewPart view;
11    public AddTestDelegate() {
12        // TODO 自动生成构造函数存根
13    }

14
15    public void init(IViewPart view) {
16        this.view = view;
17
18    }

19
20    public void run(IAction action) {
21        String id = action.getId();
22        
23        if(id.equals("add.a")){
24            //TODO
25        }
else if(id.equals("add.b")){
26            //TODO
27        }
else if(id.equals("add.c")){
28            //TODO
29        }
else if(id.equals("add.d")){
30            //TODO
31        }

32
33    }

34
35    public void selectionChanged(IAction action, ISelection selection) {
36        // TODO 自动生成方法存根
37
38    }

39
40}

    我们可以在运行时通过action.getId()在识别是对应的那个Action。
   总结:这个途径可以为插件开发中避免写过多的ActionDelegate,把一些功能较为接近实现代码又比较少的操作合并在一起。当然,对于操作步骤比较多的,为了代码维护的方便,还是建议单独为它定义一个代理。
      

 



刚进场的时候戏就落幕

只有注册用户登录后才能发表评论。


网站导航: