nighty

          折騰的年華
          posts - 37, comments - 143, trackbacks - 0, articles - 0

          一個(gè)ActionDelegate代理多個(gè)Action

          Posted on 2007-08-15 09:55 寒武紀(jì) 閱讀(6232) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Eclipse

              以前在做Eclipse插件的時(shí)候,習(xí)慣一個(gè)功能定義一個(gè)操作項(xiàng)。比如說(shuō)在org.eclipse.ui.popupMenus擴(kuò)展點(diǎn)上,如果有添加這個(gè)功能,但是添加的類(lèi)型有多樣,我們假定現(xiàn)在有添加A、B、C、D四個(gè)元素,在擴(kuò)展點(diǎn)上添加一個(gè)viewerContribution擴(kuò)展,添加四個(gè)Action,分別為A、B、C、D。因?yàn)檫@四個(gè)添加功能非常相近,所以我們可以只寫(xiě)一個(gè)ActionDelegate,把這四個(gè)Action的代理類(lèi)都指向同一個(gè)。但是ID必須區(qū)分。聲明定義如下:

           <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>

              上面的主要區(qū)別是在id,在所有的代理ActionDelegate中的run(IAction action)方法中都帶有一個(gè)參數(shù)action,這個(gè)參數(shù)有個(gè)用途就是可以在運(yùn)行時(shí)區(qū)別是對(duì)應(yīng)的那個(gè)action。下面我們看一下AddTestDelegate類(lèi)的定義:

           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 自動(dòng)生成構(gòu)造函數(shù)存根
          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 自動(dòng)生成方法存根
          37
          38    }

          39
          40}

              我們可以在運(yùn)行時(shí)通過(guò)action.getId()在識(shí)別是對(duì)應(yīng)的那個(gè)Action。
             總結(jié):這個(gè)途徑可以為插件開(kāi)發(fā)中避免寫(xiě)過(guò)多的ActionDelegate,把一些功能較為接近實(shí)現(xiàn)代碼又比較少的操作合并在一起。當(dāng)然,對(duì)于操作步驟比較多的,為了代碼維護(hù)的方便,還是建議單獨(dú)為它定義一個(gè)代理。
                

           



          剛進(jìn)場(chǎng)的時(shí)候戲就落幕
          主站蜘蛛池模板: 安溪县| 治县。| 万州区| 灌阳县| 朝阳县| 黎川县| 中江县| 四会市| 富源县| 贺州市| 泸定县| 普格县| 焦作市| 南通市| 称多县| 平原县| 东乡族自治县| 灵石县| 吉首市| 乐亭县| 都昌县| 扶风县| 米泉市| 调兵山市| 焦作市| 罗平县| 平凉市| 邢台县| 大同县| 元氏县| 肥乡县| 鸡泽县| 库伦旗| 天水市| 黔南| 盐池县| 岑溪市| 湖南省| 衢州市| 和田县| 利津县|