以前在做Eclipse插件的時候,習慣一個功能定義一個操作項。比如說在org.eclipse.ui.popupMenus擴展點上,如果有添加這個功能,但是添加的類型有多樣,我們假定現在有添加A、B、C、D四個元素,在擴展點上添加一個viewerContribution擴展,添加四個Action,分別為A、B、C、D。因為這四個添加功能非常相近,所以我們可以只寫一個ActionDelegate,把這四個Action的代理類都指向同一個。但是ID必須區分。聲明定義如下:
























上面的主要區別是在id,在所有的代理ActionDelegate中的run(IAction action)方法中都帶有一個參數action,這個參數有個用途就是可以在運行時區別是對應的那個action。下面我們看一下AddTestDelegate類的定義:
1
package test;
2
3
import org.eclipse.jface.action.IAction;
4
import org.eclipse.jface.viewers.ISelection;
5
import org.eclipse.ui.IViewActionDelegate;
6
import org.eclipse.ui.IViewPart;
7
8
public 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
}

2

3

4

5

6

7

8



9

10

11



12

13

14

15



16

17

18

19

20



21

22

23



24

25



26

27



28

29



30

31

32

33

34

35



36

37

38

39

40

我們可以在運行時通過action.getId()在識別是對應的那個Action。
總結:這個途徑可以為插件開發中避免寫過多的ActionDelegate,把一些功能較為接近實現代碼又比較少的操作合并在一起。當然,對于操作步驟比較多的,為了代碼維護的方便,還是建議單獨為它定義一個代理。
剛進場的時候戲就落幕