posts - 36, comments - 30, trackbacks - 0, articles - 3
              為了實現(xiàn)流程編輯器,光有我們建立的模型,控制器和視圖還不夠,我們還必須新建一個編輯器類,為此,我們要新建一個插件項目,我們新建的插件項目com.example.workflow結(jié)構(gòu)如下:





              為了實現(xiàn)一個編輯器,我們必須擴展org.eclipse.ui.editors這個擴展點,這個可以在plugin.xm定義,定義后的文件如下:

          <extension
                   
          point="org.eclipse.ui.editors">
                
          <editor
                      
          class="com.example.workflow.ui.WorkflowProcessEditor"
                      default
          ="true"
                      extensions
          ="workflow"
                      icon
          ="src/com/example/workflow/icons/shapes.gif"
                      id
          ="com.example.workflow.WorkflowProcessEditor"
                      name
          ="流程設(shè)計器"/>
            
          </extension>

          其中,class屬性指定我們編輯器對應(yīng)的類;
                     Extensions屬性指定編輯器打開文件的擴展名為workflow;
                     Default屬性指出該編輯器是擴展名為workflow文件的默認(rèn)打開方式;
                     Icon為擴展名為workflow的文件和編輯器的圖標(biāo);
                     Id屬性為編輯器的唯一標(biāo)識
                    Name為編輯器顯示的名稱

           同時,我們還必須定義插件運行時要依賴的包,打開META-INF中的文件MANIFEST.MF ,添加依賴項就可以,最后文件內(nèi)容如下:

          Manifest-Version: 1.0
          Bundle-ManifestVersion: 2
          Bundle-Name: Workflow Plug-in
          Bundle-SymbolicName: com.example.workflow;singleton:=true
          Bundle-Version: 1.0.0
          Bundle-Activator: com.example.workflow.Activator
          Bundle-Vendor: EXAMPLE
          Bundle-Localization: plugin
          Require-Bundle: org.eclipse.ui,
           org.eclipse.core.runtime,
           org.eclipse.gef,
           org.eclipse.ui.editors,
           org.eclipse.ui.ide,
           org.eclipse.core.resources,
           org.eclipse.ui.views
          Eclipse-LazyStart: true

          現(xiàn)在我們就可以來定義編輯器對應(yīng)的類了WorkflowProcessEditor,代碼如下:

          package com.example.workflow.ui;
           
          import org.eclipse.core.runtime.IProgressMonitor;
          import org.eclipse.gef.DefaultEditDomain;
          import org.eclipse.gef.GraphicalViewer;
          import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
          import org.eclipse.gef.palette.PaletteRoot;
          import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
          import org.eclipse.ui.IEditorInput;
           
          import com.example.workflow.model.WorkflowProcess;
          import com.example.workflow.parts.WorkflowProcessEditPartFactory;
           
          public class WorkflowProcessEditor extends GraphicalEditorWithFlyoutPalette{
           
                 
          private WorkflowProcess process;
                 
          private static PaletteRoot PALETTE_MODEL;
                 
                 
          public WorkflowProcessEditor(){
                        setEditDomain(
          new DefaultEditDomain(this));
                 }

                 
                 
          private WorkflowProcess getModel(){
                        
          return this.process;
                 }

                 
                 
          protected void initializeGraphicalViewer() {         
                        
          super.initializeGraphicalViewer();
                        GraphicalViewer viewer 
          = getGraphicalViewer();
                        viewer.setContents(getModel());          
                 }
               
           
                 
          protected void configureGraphicalViewer() {              
                        
          super.configureGraphicalViewer();
                        GraphicalViewer viewer 
          = getGraphicalViewer();
                        viewer.setEditPartFactory(
          new WorkflowProcessEditPartFactory());
                        viewer.setRootEditPart(
          new ScalableFreeformRootEditPart());
                 }
               
           
                 
          protected void setInput(IEditorInput input) {              
                        
          super.setInput(input);
                        process 
          = new WorkflowProcess();
                 }

           
                 
          protected PaletteRoot getPaletteRoot() {
                        
          if (PALETTE_MODEL == null)
                               PALETTE_MODEL 
          = WorkflowProcessEditorPaletteFactory.createPalette();
                        
          return PALETTE_MODEL;
                 }

           
                 
          public void doSave(IProgressMonitor monitor) {
                        
          // TODO Auto-generated method stub
                        
                 }

           
          }

          這個類繼承了GraphicalEditorWithFlyoutPalette,帶有面板的圖形化編輯器。在這個類getPaletteRoot()方法中,我們定創(chuàng)建了面板,面板類詳細(xì)信息,接下來將介紹。在setInput方法中,我們定義了一個流程對象,在這里我們也可以從外面文件讀入一個對象,作為編輯器的輸入,在構(gòu)造函數(shù)中,setEditDomain(new DefaultEditDomain(this));就是給當(dāng)前編輯器設(shè)置一個默認(rèn)編輯域,這個域跟命令堆棧有關(guān)。在initializeGraphicalViewer()方法中,我們把GraphicalViewer的內(nèi)容設(shè)計為流程,說明我們以后編輯的是一個流程對象,在configureGraphicalViewer(),我們把第二講中定義的模型和控制器映射的類注冊進來,這樣編輯器就知道模型和控制器的映射關(guān)系了。
          接下來我們再看一下面板對應(yīng)的類:

          package com.example.workflow.ui;
           
          import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
          import org.eclipse.gef.palette.ConnectionCreationToolEntry;
          import org.eclipse.gef.palette.MarqueeToolEntry;
          import org.eclipse.gef.palette.PaletteContainer;
          import org.eclipse.gef.palette.PaletteDrawer;
          import org.eclipse.gef.palette.PaletteGroup;
          import org.eclipse.gef.palette.PaletteRoot;
          import org.eclipse.gef.palette.PaletteSeparator;
          import org.eclipse.gef.palette.PanningSelectionToolEntry;
          import org.eclipse.gef.palette.ToolEntry;
          import org.eclipse.gef.requests.CreationFactory;
          import org.eclipse.gef.requests.SimpleFactory;
          import org.eclipse.jface.resource.ImageDescriptor;
           
          import com.example.workflow.Activator;
          import com.example.workflow.model.Activity;
          import com.example.workflow.model.EndActivity;
          import com.example.workflow.model.StartActivity;
          /**
           *UtilityclassthatcancreateaGEFPalette.
           *
          @see#createPalette()
           
          */

          finalclass WorkflowProcessEditorPaletteFactory 
          {    
              
              
          /**
               *CreatesthePaletteRootandaddsallpaletteelements.
               *Usethisfactorymethodtocreateanewpaletteforyourgraphicaleditor.
               *@returnanewPaletteRoot
               
          */

              
          static PaletteRoot createPalette(){
                 PaletteRoot palette 
          = new PaletteRoot();
                 palette.add(createToolsGroup(palette));
                 palette.add(createActivitiesDrawer());
                 
          return palette;
              }

              
              
          /**Createthe"Activities"drawer.*/
              privatestatic PaletteContainer createActivitiesDrawer() 
          {
                 PaletteDrawer componentsDrawer 
          = new PaletteDrawer("Process");
           
                 CombinedTemplateCreationEntry component 
          = new CombinedTemplateCreationEntry(
                        
          "Start"
                        
          "Create a StartActivity"
                        StartActivity.
          class,
                        
          new SimpleFactory(StartActivity.class), 
                        ImageDescriptor.createFromFile(Activator.
          class"icons/start16.gif"), 
                        ImageDescriptor.createFromFile(Activator.
          class"icons/start24.gif"));
                 componentsDrawer.add(component);
           
                 component 
          = new CombinedTemplateCreationEntry(
                        
          "Activity",
                        
          "Create a Activity"
                        Activity.
          class,
                        
          new SimpleFactory(Activity.class), 
                        ImageDescriptor.createFromFile(Activator.
          class"icons/activity16.gif"), 
                        ImageDescriptor.createFromFile(Activator.
          class"icons/activity24.gif"));
                 componentsDrawer.add(component);
                 
                 component 
          = new CombinedTemplateCreationEntry(
                        
          "End",
                        
          "Create a EndActivity"
                        Activity.
          class,
                        
          new SimpleFactory(EndActivity.class), 
                        ImageDescriptor.createFromFile(Activator.
          class"icons/end16.gif"), 
                        ImageDescriptor.createFromFile(Activator.
          class"icons/end24.gif"));
                 componentsDrawer.add(component);
           
                 
          return componentsDrawer;
              }

              
              
          /**Createthe"Tools"group.*/
              privatestatic PaletteContainer createToolsGroup(PaletteRoot palette) 
          {
                 PaletteGroup toolGroup 
          = new PaletteGroup("Tools");
           
                 
          // Add a selection tool to the group
                 ToolEntry tool = new PanningSelectionToolEntry();
                 toolGroup.add(tool);
                 palette.setDefaultEntry(tool);
                 
                 
          // Add a marquee tool to the group
                 toolGroup.add(new MarqueeToolEntry());
           
                 
          // Add a (unnamed) separator to the group
                 toolGroup.add(new PaletteSeparator());
           
                  
                 tool 
          = new ConnectionCreationToolEntry(
                        
          "Transition",
                         
          "Create a Transiton",
                        
          new CreationFactory() {
                            
          public Object getNewObject() { returnnull; }               
                            
          public Object getObjectType() { returnnew Integer(1); }
                        }
          ,
                        ImageDescriptor.createFromFile(Activator.
          class"icons/transition16.gif"), 
                        ImageDescriptor.createFromFile(Activator.
          class"icons/transition24.gif"));
                 toolGroup.add(tool);
                 
          return toolGroup;
              }

          }

          這樣,我們的gef項目就可以運行起來了,效果如下圖:



          對照面板的外觀,讀者應(yīng)該很容易明白面板類的含義,下一節(jié)我們將介紹如何在編輯器中創(chuàng)建活動。

          代碼下載

          Feedback

          # re: 流程設(shè)計器開發(fā)三(編輯器部分)[未登錄]  回復(fù)  更多評論   

          2008-03-22 20:39 by 新手
          那么怎樣固定編輯區(qū)域GraphicalViewer,而不是整個Viewer

          # re: 流程設(shè)計器開發(fā)三(編輯器部分)  回復(fù)  更多評論   

          2008-08-20 09:59 by jinshi101
          你好!謝謝你寫的文章,看了之后對于一些細(xì)節(jié)還是不怎么明白,我想問您一下,在viewPart中如何顯示一個樹形菜單,是用TreeView嗎?謝謝!

          # re: 流程設(shè)計器開發(fā)三(編輯器部分)  回復(fù)  更多評論   

          2010-06-28 01:45 by gef
          弱弱的問,怎樣運行才能得到如圖所示的效果啊?run as eclipse application?還是怎樣?
          主站蜘蛛池模板: 保康县| 溆浦县| 岳池县| 怀化市| 金秀| 鞍山市| 庄河市| 北票市| 沐川县| 新干县| 双城市| 宁河县| 蓬安县| 吉林省| 颍上县| 海淀区| 南雄市| 山阴县| 株洲市| 桃江县| 霍城县| 鄂州市| 安乡县| 黄陵县| 兴和县| 柘荣县| 南丹县| 海淀区| 阿瓦提县| 吉安市| 项城市| 喜德县| 房产| 大港区| 祥云县| 宜章县| 和顺县| 疏附县| 怀集县| 兴化市| 延庆县|