月蚀传说

浮躁让人失去理智
posts - 25, comments - 101, trackbacks - 0, articles - 0
  BlogJava :: 首页 ::  :: 联系 :: 聚合  :: 管理

数据库编辑器雏形

Posted on 2006-10-09 18:57 Dart 阅读(1450) 评论(0)  编辑  收藏 所属分类: GEF

 

上一章讲了一下GEF的大概,这章我讲通过实现一个数据库编辑器来进一步说一下GEF。实例代码下载

1.需求分析以及建模

数据库编辑器,无非就是利用图形化的方式,来实现对数据库表的管理。比如,我从画板上托一个表格到编辑器上,然后给他加上列,最后通过模型导出对应的SQL语句,连接数据库生成对应的表。就这么简单。

让我们再分析一下。一个建立一个数据库表需要什么?首先我们要给这个表取个名字,然后给它添加上一些列,而对于列呢,也要有名字,还要有类型,还要说明它是否能为空等等。打住!就这样得了,我们这里只研究GEF,具体的需求还是以后再说吧。下面我们建立这个模型:

http://album.sina.com.cn/pic/5414465b0200041d

让我们看看这几个类:DBBase为基类,具有一个List对象,这个List是放置其子节点的地方,因为在数据库中,Schema和表是一对多的关系,可以说是Schema包含了某一个表;表和列也一样,表包含了列,所以我们就先将他们的子对象放置到他们的基类中。parent表示该类的父对象。

Schema表示数据库本身;Table表示表;Column表示列,这几个类直接继承DBBase,而且没有复写基类的任何方法。

先就这样吧,这几个类目前来看还少很多的属性和操作,在以后的开发中我会一一补上。

2.EditPart

在上一章我们以及说过了,模型是需要通过编辑单元进行维护的,而且编辑单元和模型是一一对应的关系。而这些对应关系又是通过什么来映射的呢,就是通过一个叫做EditPartFactory的接口类。我们在写GEF程序的时候,这个类是必须的,只有它才能把我们的模型和编辑单元联系起来。这个接口只有一个方法:createEditPart,这个方法需要我们返回一个EditPart,给了我们两个参数,其中对我们来说最有用的参数就是model,因为它就是传入的模型,我们就需要通过这个模型来生成对应的EditPart

看看这几个EditPart:

http://album.sina.com.cn/pic/5414465b0200041e

DBEditPartBase : 其他几个EditPart的基类。虽然没有写什么,但是在以后的后续开发中将起到很大的作用。

SchemaEditPart:Schema模型对应的EditPart

TableEditPart:Table模型对应的EditPart

ColumnEditPart:Column模型对应的EditPart

OK,下面开始让我们的模型实现出来

3.准备工作1——创建我们的Editor

编辑器嘛,肯定需要扩展editor扩展点咯(不明白的去看看Eclipse插件开发基础。什么?你不知道什么是Eclipse插件开发? ……),看看我们扩展点怎么写的:
  

< extension
        
id ="dbeditor"
         point
="org.eclipse.ui.editors" >
     
< editor
           
class ="gef.example.databasecreator.ui.DbEditor"
            icon
="icons/sample.gif"
            default
="false"
            name
="DBEditor"
            id
="gef.example.databasecreator.editor2"
            extensions
="dbtest" />
  
</ extension >

我们的扩展点对应的启动类是gef.example.databasecreator.ui.DbEditor,这个类是继承了 GraphicalEditorWithPalette,GraphicalEditorWithPalette是一个带有画板的、GEF提供的编辑器。我们生成了我们的编辑器类后,需要在里面写上一些必要的代码。

首先是在DbEditor的构造函数中,我们需要把EditDomian给它加上,这是必须的,没有EditDomain一些都“空了吹”(家乡话,呵呵),我在第一章讲提到过EditDomain,大家可以看看我以前的文章,里面有对它的简短介绍。 

public  DbEditor() {
  
this .setEditDomain( new  DefaultEditDomain);
}


然后我们需要在getPaletteRoot方法中给它返回一个PaletteRoot,没有这个东西,我们的编辑器将无法启动,因为画板指针为空,无法进行构建我们的控件(我会在后面的文章简要说一下,Palette和Viewer的关系)。我们只要返回一个PaletteRoot就够了,不需要往它身上加工具按钮什么的。
public   PaletteRoot createPaletteRoot() {
     
return   new  PaletteRoot();
}

 

再看看configureGraphicalViewer方法。这个方法是复写基类的,在这里面,我们要对我们的Viewer进行一些设置:指定根编辑单元和设置我们的EditPartFactory。根编辑单元属于一个比较特殊的编辑单元,它不属于我们的模型对应的编辑单元。

特别强调,在复写configureGraphicalViewer方法的时候,需要调用一下父类原来的方法,因为在父类方法中,创建了Viewer,并进行了一些设置,如果不复写的话,那就要自己动手写了。

我们再把我们的EditPartFactory注册到Viewer中,不然它傻,找不到对应的EditPart :)

 

  protected   void  configureGraphicalViewer() {
        
//  这里需要调用基类的方法
        super.configureGraphicalViewer();
        GraphicalViewer viewer 
=   this .getGraphicalViewer();
        
        
//  设置根EditPart
        viewer.setRootEditPart( new  FreeformGraphicalRootEditPart());
        
        
//  设置工厂
        viewer.setEditPartFactory( new  DBEditPartFactory());
    }

 

  OK,最后一步:把我们的模型告诉给Viewer。在initializeGraphicalViewer方法中,我们生成了一个Schema对象,并把它通过Viewer的setContent方法注册进去。

 

  protected   void  initializeGraphicalViewer() {
        
//  TODO Auto-generated method stub
        Schema schema  =   new  Schema();
        
this .getGraphicalViewer().setContents(schema);
    }

 

启动一下吧!什么?无法创建编辑器……

4.准备工作2——创建一个Schema对应的Figure

刚才不能创建编辑器的原因如下:

当GEF发现我们设置的内容是一个Schema的时候,它就去找到对应的EditPart,这里是SchemaEditPart,然后调它的createFigure方法,获得一个图形进行显示。但是我们返回了一个NULL,所以编辑器就会创建不起来。

我们给它写一个简单的Figure吧

     protected  IFigure createFigure() {
        
return   new  FreeformLayer();
    }

 

这里给了一个FreeformLayer,这个Figure一般都作为一个根图形存在,可以根据子Figure的大小数量,以及Editor本身的大小来调节自身的大小。

好了,让我们再启动一次!成功,看看吧

http://album.sina.com.cn/pic/5414465b0200041f

5.结束语

什么都没有啊,不要着急,下一章我们再让它显示出图形!



只有注册用户登录后才能发表评论。


网站导航: