流程設(shè)計(jì)器開(kāi)發(fā)八(大綱視圖部分)
Posted on 2008-01-11 08:44 笑看人生 閱讀(1558) 評(píng)論(1) 編輯 收藏 所屬分類(lèi): Java插件開(kāi)發(fā) 要實(shí)現(xiàn)大綱視圖,我們先回顧一下以前在編輯器中實(shí)現(xiàn)GraphicalViewer視圖,是如何實(shí)現(xiàn)的,找到以前的代碼,在WorkflowProcessEditor的configureGraphicalViewer方法中,
GraphicalViewer viewer = getGraphicalViewer();
viewer.setEditPartFactory(new WorkflowProcessEditPartFactory());
我們給GraphicalViewer設(shè)置了模型和控制映射的工廠類(lèi),大綱視圖的實(shí)現(xiàn)和GraphicalViewer視圖類(lèi)似,也需要為模型定義控制器,不過(guò)這個(gè)控制器不同于以前的控制器,這些控制器必須繼承AbstractTreeEditPart,(注意:一個(gè)模型可以對(duì)應(yīng)多個(gè)控制器,多個(gè)視圖),由于在大綱視圖中我們不用顯示轉(zhuǎn)移,因此,我們只需定義兩個(gè)控制器:流程和活動(dòng),代碼如下:
流程控制器


package com.example.workflow.parts;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import org.eclipse.gef.editparts.AbstractTreeEditPart;
import com.example.workflow.model.ModelElement;
import com.example.workflow.model.WorkflowProcess;
public class WorkflowProcessTreeEditPart extends AbstractTreeEditPart
implements PropertyChangeListener{
public void activate() {
if (!isActive()) {
super.activate();
((ModelElement) getModel()).addPropertyChangeListener(this);
}
}
public void deactivate() {
if (isActive()) {
super.deactivate();
((ModelElement) getModel()).removePropertyChangeListener(this);
}
}
private WorkflowProcess getCastedModel() {
return (WorkflowProcess) getModel();
}
protected List getModelChildren() {
return getCastedModel().getChildren(); // return a list of activities
}
//當(dāng)往編輯器中增加活動(dòng)時(shí),刷新活動(dòng)模型對(duì)應(yīng)的視圖
public void propertyChange(PropertyChangeEvent arg0) {
String prop = evt.getPropertyName();
if (WorkflowProcess.CHILD_ADDED_PROP.equals(prop)
|| WorkflowProcess.CHILD_REMOVED_PROP.equals(prop)) {
refreshChildren();
}
}
}

package com.example.workflow.parts;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.eclipse.gef.editparts.AbstractTreeEditPart;
import org.eclipse.swt.graphics.Image;
import com.example.workflow.model.AbstractActivity;
import com.example.workflow.model.ModelElement;
public class AbstractActivityTreeEditPart extends AbstractTreeEditPart
implements PropertyChangeListener{
public void activate() {
if (!isActive()) {
super.activate();
((ModelElement) getModel()).addPropertyChangeListener(this);
}
}
public void deactivate() {
if (isActive()) {
super.deactivate();
((ModelElement) getModel()).removePropertyChangeListener(this);
}
}
private AbstractActivity getCastedModel() {
return (AbstractActivity) getModel();
}
protected String getText() {
return getCastedModel().getName();
}
public void propertyChange(PropertyChangeEvent evt) {
}
}
package com.example.workflow.parts;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartFactory;
import com.example.workflow.model.AbstractActivity;
import com.example.workflow.model.WorkflowProcess;
public class WorkflowProcessTreeEditPartFactory implements EditPartFactory{
public EditPart createEditPart(EditPart context, Object modelElement) {
//get EditPart for model element
EditPart part = getPartForElement(modelElement);
// store model element in EditPart
part.setModel(modelElement);
return part;
}
/**
* Maps an object to an EditPart.
* @throws RuntimeException if no match was found (programming error)
*/
private EditPart getPartForElement(Object modelElement) {
if (modelElement instanceof WorkflowProcess) {
return new WorkflowProcessTreeEditPart();
}
if (modelElement instanceof AbstractActivity) {
return new AbstractActivityTreeEditPart();
}
//because the outline view of the WorkflowProcessEditor dont
//need to display the Trasntion ,we dont create the TransitionTreeEditPart
throw new RuntimeException(
"Can't create part for model element: "
+ ((modelElement != null) ? modelElement.getClass().getName() : "null"));
}
}
定義完控制器和映射類(lèi)之后,我們還需定義一個(gè)大綱視圖對(duì)應(yīng)類(lèi),由于大綱視圖和編輯器聯(lián)系緊密,因此我們把這個(gè)類(lèi)作為WorkflowProcessEditor的內(nèi)部類(lèi),代碼如下:
class WorkflowProcessOutlinePage extends ContentOutlinePage{
/**
* Create a new outline page for the WorkflowProcess editor.
* @param viewer a viewer (TreeViewer instance) used for this outline page
* @throws IllegalArgumentException if editor is null
*/
public WorkflowProcessOutlinePage(EditPartViewer viewer) {
super(viewer);
}
public void createControl(Composite parent) {
//create outline viewer page
getViewer().createControl(parent);
// configure outline viewer
getViewer().setEditDomain(getEditDomain());
getViewer().setEditPartFactory(new WorkflowProcessTreeEditPartFactory());
//讓大綱視圖和編輯器的GraphicalViewer視圖同步選擇
getSelectionSynchronizer().addViewer(getViewer());
//設(shè)置大綱視圖的根內(nèi)容為流程模型
getViewer().setContents(getModel());
}
public Control getControl() {
return getViewer().getControl();
}
public void dispose() {
// unhook outline viewer
getSelectionSynchronizer().removeViewer(getViewer());
// dispose
super.dispose();
}
}
為了在大綱視圖中顯示內(nèi)容,我們還必須在WorkflowProcessEditor類(lèi)中重寫(xiě)getAdapter方法,代碼如下:
public Object getAdapter(Class type) {
if (type == IContentOutlinePage.class)
return new WorkflowProcessOutlinePage(new TreeViewer());
return super.getAdapter(type);
}
同時(shí)在插件依賴(lài)項(xiàng)中增加
org.eclipse.ui.ide,
org.eclipse.ui.views
這樣運(yùn)行程序,就可以看到編輯器大綱視圖的效果了


流程控制器

















































//活動(dòng)控制器













































這些類(lèi)中方法大家應(yīng)該很熟悉,我只說(shuō)一下getText()方法,就是活動(dòng)在大綱視圖中顯示的名稱(chēng),還有個(gè)getImage()方法,可以定義顯示的圖標(biāo),定義完這些控制器后,我們還必須定義模型和這些控制器的映射類(lèi),代碼如下:





































這個(gè)映射類(lèi)和以前GraphicalViewer視圖基本一樣,我也不解釋了。
定義完控制器和映射類(lèi)之后,我們還需定義一個(gè)大綱視圖對(duì)應(yīng)類(lèi),由于大綱視圖和編輯器聯(lián)系緊密,因此我們把這個(gè)類(lèi)作為WorkflowProcessEditor的內(nèi)部類(lèi),代碼如下:










































org.eclipse.ui.ide,
org.eclipse.ui.views
這樣運(yùn)行程序,就可以看到編輯器大綱視圖的效果了