Posted on 2008-01-03 08:54
笑看人生 閱讀(2866)
評論(3) 編輯 收藏 所屬分類:
Java插件開發(fā)
為了實(shí)現(xiàn)流程編輯器,光有我們建立的模型,控制器和視圖還不夠,我們還必須新建一個編輯器類,為此,我們要新建一個插件項(xiàng)目,我們新建的插件項(xiàng)目com.example.workflow結(jié)構(gòu)如下:
為了實(shí)現(xiàn)一個編輯器,我們必須擴(kuò)展org.eclipse.ui.editors這個擴(kuò)展點(diǎn),這個可以在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屬性指定編輯器打開文件的擴(kuò)展名為workflow;
Default屬性指出該編輯器是擴(kuò)展名為workflow文件的默認(rèn)打開方式;
Icon為擴(kuò)展名為workflow的文件和編輯器的圖標(biāo);
Id屬性為編輯器的唯一標(biāo)識
Name為編輯器顯示的名稱
同時,我們還必須定義插件運(yùn)行時要依賴的包,打開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)在我們就可以來定義編輯器對應(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(),我們把第二講中定義的模型和控制器映射的類注冊進(jìn)來,這樣編輯器就知道模型和控制器的映射關(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項(xiàng)目就可以運(yùn)行起來了,效果如下圖:
對照面板的外觀,讀者應(yīng)該很容易明白面板類的含義,下一節(jié)我們將介紹如何在編輯器中創(chuàng)建活動。
代碼下載