要在編輯器中支持復制,粘貼功能,首先,要在編輯器中選擇活動節點,Eclipse工作臺的菜單中復制,粘貼按鈕處于激活狀態,要實現這功能,我們還必須做些配置,因為編輯器沒有單獨的菜單欄,所有編輯器共享一個菜單欄,前面我們在定義編輯器擴展點時,有一個屬性contributorClass沒有指定值,它的值應該是一個實現IEditorActionBarContributor接口的類的全名,只有指定這個屬性,菜單欄中的菜單項才能夠對我們在編輯器中所做的操作進行相應;
首先,我們增加屬性contributorClass對應的類:
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());
}

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

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

CopyAction copyAction = new CopyAction((IWorkbenchPart) this);
getActionRegistry().registerAction(copyAction);
getSelectionActions().add(copyAction.getId());
}
但是當我們在復制按鈕可用情況,點擊之后,我們希望把我們選擇的對象,拷貝到剪切板上,這個在其他軟件中已經成功實現,但要是在我們開發的流程設計器中,要實現這個功能,我們還必須自己寫代碼來實現,必須重寫CopyAction父類中的run方法,把我們選擇的對象放到剪切板上,代碼如下:
public void run() {
Clipboard.getDefault().setContents(super.getSelectedObjects());
}
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;
}
}

}
這里對Paste菜單的可用性作了判斷,只有當剪切板中內容不為空時,粘貼按鈕才可用,否則為不可用狀
態。
另外還要在編輯器中對這個action進行申明,
PasteAction pasteAction = new PasteAction((IWorkbenchPart) this);
getActionRegistry().registerAction(pasteAction);
getSelectionActions().add(pasteAction.getId());
到這里,當我們在編輯器中選擇活動,選擇復制之后,粘貼按鈕可用,但點粘貼按鈕具體做什么,我們還沒有定義,要實現這個做什么功能,還必須覆蓋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);
}
}
這里只是做了一下簡單處理,更復雜的邏輯用戶可以根據自己應用的需要,這里的run可以通過執行一個命令,以支持撤銷,重做功能,原理就是這樣的,另外剪切功能和這類似,只是在復制基礎上多了個刪除操作。
首先,我們增加屬性contributorClass對應的類:



















在declareGlobalActionKeys增加對復制命令的申明,同時把屬性contributorClass指定為這個類,包含全路徑。再定義復制動作CopyAction,代碼如下:



















注意構造函數中一定要把這個action的id設置為ActionFactory.COPY.getId(),和前面統一起來;
到這兒還沒有結束,還必須在編輯器類中注冊這個action,覆蓋編輯器父類中的createActions()方法:










這樣當我們點復制按鈕之后,流程設計器就把我們選擇的內容放到剪切板上,下一步要做的就是粘貼了。
要使粘貼按鈕可用,所做的修改和復制類似,在類WorkflowActionContributor 的方法declareGlobalActionKeys中增加addGlobalActionKey(ActionFactory.PASTE.getId())
增加PasteAction類,代碼如下:
























這里對Paste菜單的可用性作了判斷,只有當剪切板中內容不為空時,粘貼按鈕才可用,否則為不可用狀
態。
另外還要在編輯器中對這個action進行申明,

















這里只是做了一下簡單處理,更復雜的邏輯用戶可以根據自己應用的需要,這里的run可以通過執行一個命令,以支持撤銷,重做功能,原理就是這樣的,另外剪切功能和這類似,只是在復制基礎上多了個刪除操作。