posts - 36, comments - 30, trackbacks - 0, articles - 3
           要實(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();
                 }

                        
                 }

           
          }

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


          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) {
                        
                 }

           
          }

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

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

           
          }

           

          這個(gè)映射類(lèi)和以前GraphicalViewer視圖基本一樣,我也不解釋了。
          定義完控制器和映射類(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)行程序,就可以看到編輯器大綱視圖的效果了

           

          Feedback

          # re: 流程設(shè)計(jì)器開(kāi)發(fā)八(大綱視圖部分)[未登錄](méi)  回復(fù)  更多評(píng)論   

          2008-01-11 19:32 by fisher
          強(qiáng)!!!!!!
          主站蜘蛛池模板: 微博| 石门县| 宣汉县| 敖汉旗| 宜良县| 兰坪| 丽水市| 淄博市| 保靖县| 泸定县| 闽清县| 乐清市| 和林格尔县| 花莲县| 元谋县| 荥经县| 西青区| 黄冈市| 饶河县| 馆陶县| 郴州市| 泽库县| 克东县| 靖江市| 宕昌县| 临猗县| 井冈山市| 丹寨县| 榆林市| 正蓝旗| 淮安市| 芦溪县| 建湖县| 溧阳市| 西盟| 手游| 剑河县| 太康县| 庄河市| 陇西县| 遵义市|