posts - 36, comments - 30, trackbacks - 0, articles - 3
          要在編輯器中支持復(fù)制,粘貼功能,首先,要在編輯器中選擇活動(dòng)節(jié)點(diǎn),Eclipse工作臺(tái)的菜單中復(fù)制,粘貼按鈕處于激活狀態(tài),要實(shí)現(xiàn)這功能,我們還必須做些配置,因?yàn)榫庉嬈鳑]有單獨(dú)的菜單欄,所有編輯器共享一個(gè)菜單欄,前面我們?cè)诙x編輯器擴(kuò)展點(diǎn)時(shí),有一個(gè)屬性contributorClass沒有指定值,它的值應(yīng)該是一個(gè)實(shí)現(xiàn)IEditorActionBarContributor接口的類的全名,只有指定這個(gè)屬性,菜單欄中的菜單項(xiàng)才能夠?qū)ξ覀冊(cè)诰庉嬈髦兴龅牟僮鬟M(jìn)行相應(yīng);
          首先,我們?cè)黾訉傩詂ontributorClass對(duì)應(yīng)的類:
          package com.example.workflow.actions;

          import org.eclipse.gef.ui.actions.ActionBarContributor;
          import org.eclipse.ui.actions.ActionFactory;

          public class WorkflowActionContributor extends ActionBarContributor {

              @Override
              
          protected void buildActions() {
                  
              }

              
              @Override
              
          protected void declareGlobalActionKeys() {
                  addGlobalActionKey(ActionFactory.COPY.getId());
                  
              }
              

          }

          在declareGlobalActionKeys增加對(duì)復(fù)制命令的申明,同時(shí)把屬性contributorClass指定為這個(gè)類,包含全路徑。再定義復(fù)制動(dòng)作CopyAction,代碼如下:

          package com.example.workflow.actions;

          import org.eclipse.gef.ui.actions.SelectionAction;
          import org.eclipse.ui.IWorkbenchPart;
          import org.eclipse.ui.actions.ActionFactory;

          public class CopyAction extends SelectionAction{

              
          public CopyAction(IWorkbenchPart part) {
                  
          super(part);
                  setId(ActionFactory.COPY.getId());
              }


              @Override
              
          protected boolean calculateEnabled() {        
                  
          return true;
              }


          }

           


          注意構(gòu)造函數(shù)中一定要把這個(gè)action的id設(shè)置為ActionFactory.COPY.getId(),和前面統(tǒng)一起來;

          到這兒還沒有結(jié)束,還必須在編輯器類中注冊(cè)這個(gè)action,覆蓋編輯器父類中的createActions()方法:

          protected void createActions() {
              
          super.createActions();

              CopyAction copyAction 
          = new CopyAction((IWorkbenchPart) this);
              getActionRegistry().registerAction(copyAction);
              getSelectionActions().add(copyAction.getId());
          }
          但是當(dāng)我們?cè)趶?fù)制按鈕可用情況,點(diǎn)擊之后,我們希望把我們選擇的對(duì)象,拷貝到剪切板上,這個(gè)在其他軟件中已經(jīng)成功實(shí)現(xiàn),但要是在我們開發(fā)的流程設(shè)計(jì)器中,要實(shí)現(xiàn)這個(gè)功能,我們還必須自己寫代碼來實(shí)現(xiàn),必須重寫CopyAction父類中的run方法,把我們選擇的對(duì)象放到剪切板上,代碼如下:
          public void run() {
              Clipboard.getDefault().setContents(
          super.getSelectedObjects());
          }

          這樣當(dāng)我們點(diǎn)復(fù)制按鈕之后,流程設(shè)計(jì)器就把我們選擇的內(nèi)容放到剪切板上,下一步要做的就是粘貼了。

          要使粘貼按鈕可用,所做的修改和復(fù)制類似,在類WorkflowActionContributor 的方法declareGlobalActionKeys中增加addGlobalActionKey(ActionFactory.PASTE.getId())

          增加PasteAction類,代碼如下:

          package com.example.workflow.actions;

          import org.eclipse.gef.ui.actions.Clipboard;
          import org.eclipse.gef.ui.actions.SelectionAction;
          import org.eclipse.ui.IWorkbenchPart;
          import org.eclipse.ui.actions.ActionFactory;

          public class PasteAction extends SelectionAction{

              
          public PasteAction(IWorkbenchPart part) {
                  
          super(part);
                  setId(ActionFactory.PASTE.getId());
              }


              @Override
              
          protected boolean calculateEnabled() {        
                  
          if(Clipboard.getDefault().getContents()!=null){
                      
          return true;
                  }
          else{
                      
          return false;
                  }

              }


          }

          這里對(duì)Paste菜單的可用性作了判斷,只有當(dāng)剪切板中內(nèi)容不為空時(shí),粘貼按鈕才可用,否則為不可用狀
          態(tài)。
          另外還要在編輯器中對(duì)這個(gè)action進(jìn)行申明,
          PasteAction pasteAction = new PasteAction((IWorkbenchPart) this);
          getActionRegistry().registerAction(pasteAction);
          getSelectionActions().add(pasteAction.getId());
          到這里,當(dāng)我們?cè)诰庉嬈髦羞x擇活動(dòng),選擇復(fù)制之后,粘貼按鈕可用,但點(diǎn)粘貼按鈕具體做什么,我們還沒有定義,要實(shí)現(xiàn)這個(gè)做什么功能,還必須覆蓋PasteAction父類中的run方法:
          public void run() {
                  List list 
          = (List)Clipboard.getDefault().getContents();
                  
          for(int i=0;i<list.size();i++){
                      AbstractActivityEditPart part 
          = (AbstractActivityEditPart)list.get(i);
                      AbstractActivity model 
          = (AbstractActivity)part.getModel();
                      WorkflowProcess parent 
          = (WorkflowProcess)part.getParent().getModel();
                      AbstractActivity clone 
          = new AbstractActivity();
                      clone.setName(
          "CloneActivity");
                      clone.setLocation(model.getLocation());
                      clone.setSize(model.getSize());
                      clone.setFigure(model.getFigure());
                      parent.addChild(clone);
                  }

              }

          這里只是做了一下簡(jiǎn)單處理,更復(fù)雜的邏輯用戶可以根據(jù)自己應(yīng)用的需要,這里的run可以通過執(zhí)行一個(gè)命令,以支持撤銷,重做功能,原理就是這樣的,另外剪切功能和這類似,只是在復(fù)制基礎(chǔ)上多了個(gè)刪除操作。

          Feedback

          # re: 流程設(shè)計(jì)器開發(fā)十二(復(fù)制粘貼部分)  回復(fù)  更多評(píng)論   

          2008-01-20 08:34 by anone
          呵呵。LZ厲害,坐一下沙發(fā),支持。。。。
          主站蜘蛛池模板: 冀州市| 穆棱市| 伊川县| 綦江县| 衡阳县| 永吉县| 金坛市| 临安市| 永丰县| 永定县| 富锦市| 玉门市| 华坪县| 界首市| 城步| 涡阳县| 会宁县| 新邵县| 临泉县| 赤壁市| 太原市| 抚松县| 株洲市| 宜良县| 临漳县| 界首市| 江山市| 嘉祥县| 会东县| 赤水市| 普格县| 永平县| 德昌县| 大冶市| 象州县| 静乐县| 岐山县| 湘乡市| 乐亭县| 凌云县| 静海县|