posts - 36, comments - 30, trackbacks - 0, articles - 3

          流程設計器開發三(編輯器部分)

          Posted on 2008-01-03 08:54 笑看人生 閱讀(2867) 評論(3)  編輯  收藏 所屬分類: Java插件開發
              為了實現流程編輯器,光有我們建立的模型,控制器和視圖還不夠,我們還必須新建一個編輯器類,為此,我們要新建一個插件項目,我們新建的插件項目com.example.workflow結構如下:





              為了實現一個編輯器,我們必須擴展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
          ="流程設計器"/>
            
          </extension>

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

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

          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

          現在我們就可以來定義編輯器對應的類了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()方法中,我們定創建了面板,面板類詳細信息,接下來將介紹。在setInput方法中,我們定義了一個流程對象,在這里我們也可以從外面文件讀入一個對象,作為編輯器的輸入,在構造函數中,setEditDomain(new DefaultEditDomain(this));就是給當前編輯器設置一個默認編輯域,這個域跟命令堆棧有關。在initializeGraphicalViewer()方法中,我們把GraphicalViewer的內容設計為流程,說明我們以后編輯的是一個流程對象,在configureGraphicalViewer(),我們把第二講中定義的模型和控制器映射的類注冊進來,這樣編輯器就知道模型和控制器的映射關系了。
          接下來我們再看一下面板對應的類:

          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項目就可以運行起來了,效果如下圖:



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

          代碼下載

          Feedback

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

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

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

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

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

          2010-06-28 01:45 by gef
          弱弱的問,怎樣運行才能得到如圖所示的效果啊?run as eclipse application?還是怎樣?
          主站蜘蛛池模板: 江孜县| 汤原县| 上杭县| 桐城市| 东兰县| 丰顺县| 谢通门县| 乐安县| 清远市| 和平区| 宜丰县| 三明市| 吉安县| 漳州市| 全南县| 海兴县| 英吉沙县| 宜君县| 凉城县| 滦南县| 曲靖市| 磐石市| 比如县| 新建县| 蒲江县| 保德县| 乌苏市| 祁门县| 民勤县| 乌兰察布市| 淄博市| 莱西市| 罗田县| 南岸区| 隆子县| 巫溪县| 莱阳市| 庄河市| 河西区| 盈江县| 凤山县|