`

[zt]第二章 主类和主界面类的实现(2)

阅读更多

FROM:http://www.blog.edu.cn/user1/19180/archives/2005/372857.shtml

3 Palette的设置

    如果你的主界面的继承自GraphicalEditorWithPalette抽象类,那么在初始化主界面的时候,我们必须实现接口getPaletteRoot函数,向系统返回Palette的根。

    之前曾经说过,Palette是一个树形结构,在这个结构中有四种主要的节点类型:PaletteRoot、PaletteGroup、PaletteDrawer、ToolEntry,其中,PaletteRoot、PaletteGroup、PaletteDrawer都继承自PaletteContainer,PaletteContainer和ToolEntry则都继承自PaletteEntry,这是Palette树结构的基类。getPaletteRoot就是要向系统返回PaletteRoot对象。

    PaletteRoot对象是Palette树结构的树根,可以通过add函数向其中插入PaletteEntry对象。PaletteRoot继承自PaletteContainer,它对PaletteContainer的扩展主要是getDefaultEntry和setDefaultEntry函数,这两个函数分别用来获得和设置缺省操作。注意setDefaultEntry函数的参数是一个ToolEntry类型。

    PaletteGroup继承自PaletteContainer类,和PaletteRoot类似,它也可以包含其它的PaletteEntry对象。它没有增加新的操作,只是重设了PaletteContainer中的一些属性。和PaletteDrawer对象不同,PaletteGroup对象不能折叠它的子女,也没有标签。

    PaletteDrawer是一个抽屉类型,同样继承自PaletteContainer类,它可以用来归类一组ToolEntry,它们有一个标签,点击这个标签的时候,这组ToolEntry就会被折叠起来。PaletteDrawer对象和PaletteGroup最大的不同就是,PaletteDrawer不能包括container,但是PaletteGroup可以包括别的container,亦即PaletteDrawer不能拥有子树。

    ToolEntry是直接继承自PaletteEntry,它描述一个单独的工具,它是一个叶子节点。我们不能向它插入子女,它只能作为上述三个类的子女。ToolEntry是工具入口的父类,其下还有一些子类,常用的比如SelectionToolEntry、MarqueeToolEntry、CreationToolEntry、CombinedTemplateCreationEntry、ConnectionCreationToolEntry。

    SelectionToolEntry用于创建选择工具,MarqueeToolEntry则用于创建区域选择工具,你可以直接使用没有参数的构造函数,也可以在构造函数中加入String参数指明工具的名称(默认情况下会有英文工具名)。

    CreationToolEntry用于创建一个元素,它是CombinedTemplateCreationEntry和ConnectionCreationToolEntry的基类,它的构造函数是:

java 代码
  1. CreationToolEntry   
  2.     (   
  3.     String label,   
  4.     String shortDesc,   
  5.     CreationFactory factory,   
  6.     ImageDescriptor iconSmall,   
  7.     ImageDescriptor iconLarge   
  8.     )  

 

其中,label是工具的标签,shortDesc是简短的描述,iconSmall和iconLarge是图标,可以设为null。factory是你要创建的元素的创建工厂,这里由于GEF使用了Abstract Factory模式。你可以使用SimpleFactory的实例生成这个工厂,SimpleFactory的构造方法是SimpleFactory(Class aClass),注意它的参数是一个Class对象,你可以使用[类名].class来得到这个对象。现在还有一个问题就是,我应该使用哪个元素的.class呢?换句话说,这个工具创建的哪个对象呢?这里应该注意的是,你创建的对象应该是一个模型元素。原来说过,GEF采用MVC框架,而GEF首先创建M,然后根据M创建C,并在创建C的时候创建V。而根据模型创建EditPart的映射,是在GraphicalEditorWithPalette->configureGraphicalViewer中使用setEditPartFactory来完成的,这又是一个使用Abstract Factory的例子。关于EditPartFactory的问题,我们在后面会有说明。下面举一个例子,比如我要创建一个矩形绘制工具,那么我应该这么写new CreationToolEntry("矩形", "创建一个矩形",  new SimpleFactory(RectangleModel.class), null, null),注意RectangleModel是矩形的模型,里面存储了有关这个矩形对象的信息,当然至于是什么信息,就根据你的应用自行定夺了。

    CombinedTemplateCreationEntry用于创建可以拖拽的创建工具,它和CreateToolEntry类似,只是它可以进行拖拽。但是要想这个工具支持拖拽,还要给界面增加响应拖拽的消息,所以一般情况下可以用CreationToolEntry代替。它的构造函数和CreationToolEntry类似:

java 代码
  1. CombinedTemplateCreationEntry   
  2.     (   
  3.     String label,   
  4.     String shortDesc,   
  5.     Object template,   
  6.     CreationFactory factory,   
  7.     ImageDescriptor iconSmall,   
  8.     ImageDescriptor iconLarge   
  9.     )  

第三个参数template就可以设置为factory中的Class对象。

    ConnectionCreationToolEntry用于描述创建线形元素的工具,它的构造方法和CreationToolEntry相同。仔细研究ConnectionCreationToolEntry的构造函数,发现其中有一条语句是setToolClass(ConnectionCreationTool.class),这好像是指明了该工具使用的创建工具,这和JBOO的思想很像,将来有时间可以研究一下。

    现在再让我们回到NotationBuilderEditor的那个代码中,我们发现在getPaletteRoot函数中,我们是这么写的:

java 代码
  1. protected PaletteRoot getPaletteRoot() {   
  2.     if (this.paletteRoot == null) {   
  3.         this.paletteRoot = PaletteFactory.createPalette();   
  4.     }   
  5.     return this.paletteRoot;   
  6. }  

这段代码中首先使用单键模式,然后使用PaletteFactory.createPalette()函数构造PaletteRoot对象。这个PaletteFactory也是我们编写的用于创建PaletteRoot的类,当然你也可以在getPaletteRoot函数中直接进行创建。下面就给出PaletteFactory的源代码:

java 代码
  1. package pku.oo.util;   
  2.   
  3. import java.util.ArrayList;   
  4. import java.util.List;   
  5.   
  6. import org.eclipse.gef.palette.CombinedTemplateCreationEntry;   
  7. import org.eclipse.gef.palette.ConnectionCreationToolEntry;   
  8. import org.eclipse.gef.palette.CreationToolEntry;   
  9. import org.eclipse.gef.palette.MarqueeToolEntry;   
  10. import org.eclipse.gef.palette.PaletteContainer;   
  11. import org.eclipse.gef.palette.PaletteDrawer;   
  12. import org.eclipse.gef.palette.PaletteGroup;   
  13. import org.eclipse.gef.palette.PaletteRoot;   
  14. import org.eclipse.gef.palette.SelectionToolEntry;   
  15. import org.eclipse.gef.palette.ToolEntry;   
  16. import org.eclipse.gef.requests.SimpleFactory;   
  17.   
  18. import pku.oo.model.RectangleModel;   
  19.   
  20.   
  21. public class PaletteFactory {   
  22.     public static PaletteRoot createPalette() {   
  23.         PaletteRoot paletteRoot = new PaletteRoot();   
  24.         paletteRoot.addAll(createCategories(paletteRoot));   
  25.         return paletteRoot;   
  26.     }   
  27.   
  28.     private static List createCategories(PaletteRoot root) {   
  29.         List <palettecontainer></palettecontainer>  categories = new ArrayList <palettecontainer></palettecontainer> ();   
  30.   
  31.         categories.add(createGeneralControlGroup(root));   
  32.         categories.add(createGraphicsDrawer());   
  33.         categories.add(createLayoutDrawer());   
  34.         categories.add(createDecoratorDrawer());          
  35.   
  36.         return categories;   
  37.     }   
  38.   
  39.     private static PaletteContainer createGeneralControlGroup(PaletteRoot root) {   
  40.         PaletteGroup controlGroup = new PaletteGroup("工具栏");   
  41.   
  42.         List<toolentry></toolentry> entries = new ArrayList<toolentry></toolentry>();   
  43.         ToolEntry tool =null;   
  44.         tool = new SelectionToolEntry("选择工具");   
  45.         entries.add(tool);   
  46.         root.setDefaultEntry(tool);   
  47.            
  48.         tool=new MarqueeToolEntry("区域选择工具");   
  49.         entries.add(tool);   
  50.   
  51.         controlGroup.addAll(entries);   
  52.         return controlGroup;   
  53.     }   
  54.     private static PaletteContainer createGraphicsDrawer() {   
  55.         PaletteDrawer drawer = new PaletteDrawer("基本图元");   
  56.         List<toolentry></toolentry> entries = new ArrayList<toolentry></toolentry>();   
  57.         ToolEntry tool = new CreationToolEntry("矩形""创建一个矩形",  new SimpleFactory(   
  58.                 RectangleModel.class), nullnull);   
  59.         entries.add(tool);   
  60.         drawer.addAll(entries);   
  61.         return drawer;   
  62.   
  63.     }   
  64.   
  65.     private static PaletteContainer createLayoutDrawer() {   
  66.   
  67.         PaletteDrawer drawer = new PaletteDrawer("布局");   
  68.         List<toolentry></toolentry> entries = new ArrayList<toolentry></toolentry>();   
  69.         drawer.addAll(entries);   
  70.         return drawer;   
  71.     }   
  72.     private static PaletteContainer createDecoratorDrawer() {   
  73.   
  74.         PaletteDrawer drawer = new PaletteDrawer("修饰");   
  75.         List<toolentry></toolentry> entries = new ArrayList<toolentry></toolentry>();   
  76.         drawer.addAll(entries);   
  77.         return drawer;   
  78.     }   
  79. }   

4 Outline Page的设置

   这里只是介绍如何配置Outline Page,由于Outline Page的原理和主编辑器框架十分类似,因此其结构也比较复杂,关于如何编写Outline Page,将在后面说明。

    在上面的NotationBuilderEditor例子中,getAdapter函数是这样写的:

java 代码
  1. public Object getAdapter(Class type) {   
  2.     if (type == IContentOutlinePage.class)   
  3.         return new OutlinePage();   
  4.     return super.getAdapter(type);   
  5. }  

我们说过,这个getAdapter不仅可以创建大纲视图,还可以创建其它的附属视图,那么你需要根据这个type来进行创建。对于大纲视图来说,我们创建了一个OutlinPage对象,这个对象的代码也在上面给出了,它是作为NotationBuilderEditor的内嵌类出现的,我们再重放一下它的代码:

java 代码
  1. class OutlinePage extends ContentOutlinePage {   
  2.     public OutlinePage() {   
  3.         super(new TreeViewer());   
  4.     }   
  5.   
  6.     public void init(IPageSite pageSite) {   
  7.         super.init(pageSite);   
  8.     }   
  9.   
  10.     public void createControl(Composite parent) {   
  11.         super.createControl(parent);   
  12.         getSelectionSynchronizer().addViewer(getViewer());   
  13.         getViewer().setEditDomain(getEditDomain());   
  14.         getViewer().setEditPartFactory(new TreePartFactory());   
  15.         getViewer().setContents(getDiagram());   
  16.     }   
  17.   
  18.     public void dispose() {   
  19.     getSelectionSynchronizer().removeViewer(getViewer());   
  20.     super.dispose();   
  21.     }   
  22. }   

    仔细看OutlinePage的createControl函数中的语句是否感觉似曾相识呢?不错,它和NotationBuilderEditor中的很多语句都很像,这就表明Outline Page的工作原理和主界面(具体说就是GraphicalEditorWithPalette)的原理是相似的,下面简单说明一下:首先,这个Outline Page设置了自己的同步的视图(getSelectionSynchronizer),那就是我们的主界面视图,然后它设置自己的编辑区域和EditPartFactory,最后设置自己的编辑内容,这和主编辑区域的内容是一样的,因为它们都是对同一文档进行编辑,只不过是不同的表现形式。大纲一旦设置了自己的EditPartFactory,当它发现自己的同步视图发生了变化(注意,它监测的是同步视图的模型部分),就会调用自己的EditPartFactory来更新自己的视图,其过程同样先是创建模型对应的EditPart,由EditPart创建Figure。

 

5 EditPartFactory 

   EditPartFactory的作用,抽象地讲,是要建立模型和EditPart之间的映射,使得系统可以根据模型创建对应的EditPart。EditPartFactory并不难写,只是模型、EditPart的概念和关系现在还不能解释,等到下一个章节会有说明。下面的一个例子给出了一个简单的EditPartFactory:

java 代码
  1. package pku.oo.part;   
  2.   
  3. import org.eclipse.gef.EditPart;   
  4. import org.eclipse.gef.EditPartFactory;   
  5.   
  6. import pku.oo.model.Diagram;   
  7. import pku.oo.model.RectangleModel;   
  8.   
  9.   
  10. public class PartFactory implements EditPartFactory {   
  11.   
  12.     public EditPart createEditPart(EditPart context, Object model) {   
  13.         EditPart part = null;   
  14.         if (model instanceof Diagram)   
  15.             part = new DiagramPart();   
  16.         else if(model instanceof RectangleModel) {   
  17.             part = new RectanglePart();   
  18.         }   
  19.                   
  20.         part.setModel(model);   
  21.         return part;   
  22.     }   
  23. }   


其中只有一个函数createEditPart,context是上下文,model是模型。这里需要注意的是,不要忘记为主编辑区域创建EditPart。

 
分享到:
评论
1 楼 ztan 2007-07-30  
写得很好,收益很大.希望您继续.

相关推荐

    zt411-zt421-ug-zhcn_ZT411/ZT421_斑马打印机手册_

    斑马打印机ZT411和ZT421是工业级条码和标签打印机,广泛应用于制造业、物流、零售业等对打印质量和效率有高要求的领域。这两款打印机以其出色的性能、耐用性和易用性赢得了用户的信赖。这份中文手册详细地介绍了ZT...

    ZT213/ZT213LEEA规格书V2.10-低功耗RS232多通道USB收发器/驱动器芯片手册

    《ZT213/ZT213LEEA:低功耗RS232多通道USB收发器/驱动器芯片详解》 ZT213/ZT213LEEA是一款专为低功耗应用设计的RS232多通道USB收发器和驱动器芯片,广泛应用于数据通信、工业控制、物联网设备等领域。本文将深入...

    第二章_隐马尔科夫模型

    HMM将实际问题抽象成两个随机过程:一是状态间的转移,二是状态与观察符号间的统计对应关系。这种模型的应用极为广泛,涵盖了语音识别、生物序列分析、自然语言处理等多个领域。 ### HMM的基本概念 理解HMM的基本...

    Zebra ZT230 条码打印机驱动

    本驱动程序专为Zebra的ZT210、ZT220及ZT230系列打印机设计,提供了全面的功能支持,以实现高质量的条形码、二维码以及其他标签打印。 1. **驱动程序安装** - `zd51166465-certified.exe` 是Zebra ZT230系列打印机...

    ZT7548 Datasheet Rev.1.0.3.pdf

    ZT7548是一款第五代电容式触控屏幕控制器,支持30x18或18x30的通道配置,可以同时检测最多10个触点。该控制器能够与最多8个键与TSP(触控屏面板)或FPC(柔性印刷电路板)模式一起工作,在多点触控时无扫描率下降的...

    斑马打印机ZT210用户指南

    本设备经测试符合 FCC 规则第 15 章规定的 B 类数字设备的限制。这些限制专门用于在家庭环境下提供适当的有害干扰防护。本设备产生、使用并且会辐射射频能量。如果未根据说明进行安装和使用,则会对无线电通信产生...

    ZT410打印机IP地址设置网络打印机

    ZT410打印机IP地址设置网络打印机ZT410打印机IP地址设置网络打印机ZT410打印机IP地址设置网络打印机ZT410打印机IP地址设置网络打印机ZT410打印机IP地址设置网络打印机

    证通ZT598金属键盘开发资料.rar

    2. **Library Files**:库文件,实现了接口的具体功能,开发者在编译时链接这些库。 3. **Sample Code**:示例代码,演示如何使用接口进行键盘操作。 4. **Documentation**:文档,详细解释了接口的功能、参数和...

    数字信号处理 课后答案第2章

    在数字信号处理中,有三个重要的数学变换工具,即傅里叶变换(FT)、Z 变换(ZT)和离散傅里叶变换(DFT)。这些变换可以将信号和系统在时域空间和频域空间相互转换,方便了对信号和系统的分析和处理。 傅里叶变换...

    RS485通信芯片zt13085e的原理图库和PCB库

    RS485通信芯片ZT13085E是一种常用的工业级串行通信接口芯片,主要用于构建远程、多节点的通信网络。在工业自动化、楼宇自动化、物联网设备等领域有广泛应用。ZT13085E的设计目标是提供一种高效、可靠的数据传输方式...

    斑马zt410中文库

    斑马(Zebra)ZT410是一款先进的桌面级条码打印机,被广泛应用于物流、零售、医疗、制造业等多个行业。这款打印机以其高效、耐用和易于操作的特点深受用户喜爱。"斑马zt410中文库"指的是为ZT410打印机特别设计的中文...

    ZK-ZT2使用手册(1).pdf

    本文档是关于ZK-ZT2多功能直流电机调速器的使用手册。手册详细介绍了该调速器的功能、参数指标、接口说明及控制模式等内容。以下是手册中的关键知识点总结: 1. 产品简介 ZK-ZT2调速器支持四种运行模式:手动(人工...

    《随机过程》第二章题目与答案[参照].pdf

    《随机过程》第二章主要涉及了随机过程的基本概念和特性,包括随机过程的分类、概率密度函数、数学期望、方差、协方差和相关函数等核心知识点。以下是这些知识点的详细解释: 1. **随机过程分类**: - 离散参数链...

    ZT-TR43系列参数设置软件

    2. **色温设定**:ZT-TR43软件允许用户调整LED灯的色温,从冷白到暖白,以营造不同的氛围或满足特定用途。 3. **动态效果**:对于具有动态效果的LED灯,软件可以设置闪烁频率、颜色变换模式等,适用于舞台照明、...

    斑马打印机(ZT210).docx

    斑马打印机ZT210是一款专业的工业级条形码和标签打印机,广泛应用于物流、零售、医疗等行业的标签制作。以下是对如何设置和使用斑马ZT210打印机的详细步骤: 首先,我们需要安装电脑驱动。双击下载好的驱动程序文件...

    斑马ZT510打印机驱动文件

    斑马ZT510打印机驱动文件

    ZT598命令集技术手册(C45)(B46.04)_证通密码键盘指令集_

    《ZT598命令集技术手册》是针对证通密码键盘操作与通信的重要参考资料,主要涵盖了一系列串口指令的详细说明。这份手册对于理解和掌握如何通过串行接口与密码键盘进行有效通信至关重要,尤其在金融、安防以及其他...

Global site tag (gtag.js) - Google Analytics