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





              為了實(shí)現(xiàn)一個(gè)編輯器,我們必須擴(kuò)展org.eclipse.ui.editors這個(gè)擴(kuò)展點(diǎn),這個(gè)可以在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è)計(jì)器"/>
            
          </extension>

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

           同時(shí),我們還必須定義插件運(yùn)行時(shí)要依賴的包,打開(kāi)META-INF中的文件MANIFEST.MF ,添加依賴項(xiàng)就可以,最后文件內(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)在我們就可以來(lái)定義編輯器對(duì)應(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
                        
                 }

           
          }

          這個(gè)類繼承了GraphicalEditorWithFlyoutPalette,帶有面板的圖形化編輯器。在這個(gè)類getPaletteRoot()方法中,我們定創(chuàng)建了面板,面板類詳細(xì)信息,接下來(lái)將介紹。在setInput方法中,我們定義了一個(gè)流程對(duì)象,在這里我們也可以從外面文件讀入一個(gè)對(duì)象,作為編輯器的輸入,在構(gòu)造函數(shù)中,setEditDomain(new DefaultEditDomain(this));就是給當(dāng)前編輯器設(shè)置一個(gè)默認(rèn)編輯域,這個(gè)域跟命令堆棧有關(guān)。在initializeGraphicalViewer()方法中,我們把GraphicalViewer的內(nèi)容設(shè)計(jì)為流程,說(shuō)明我們以后編輯的是一個(gè)流程對(duì)象,在configureGraphicalViewer(),我們把第二講中定義的模型和控制器映射的類注冊(cè)進(jìn)來(lái),這樣編輯器就知道模型和控制器的映射關(guān)系了。
          接下來(lái)我們?cè)倏匆幌旅姘鍖?duì)應(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項(xiàng)目就可以運(yùn)行起來(lái)了,效果如下圖:



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

          代碼下載

          Feedback

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

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

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

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

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

          2010-06-28 01:45 by gef
          弱弱的問(wèn),怎樣運(yùn)行才能得到如圖所示的效果啊?run as eclipse application?還是怎樣?
          主站蜘蛛池模板: 南陵县| 柳州市| 阳高县| 宜兰县| 天全县| 若羌县| 涟水县| 屯门区| 朔州市| 屏南县| 许昌县| 杨浦区| 瓦房店市| 谷城县| 太湖县| 肃宁县| 西藏| 固始县| 富阳市| 大名县| 花垣县| 慈溪市| 措美县| 龙南县| 综艺| 新化县| 温泉县| 德安县| 曲靖市| 嫩江县| 长沙市| 崇信县| 积石山| 上栗县| 常宁市| 江门市| 开封市| 吉首市| 新密市| 英山县| 奉化市|