`
youngerbaby
  • 浏览: 115098 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

GMF中定制自己的outline

阅读更多

GMF默认生成的outline很成问题,只能显示top level的图形,比如在logic例子中,画板中图形元素和outline对应如下:

 

可见非top level的图形并没有与之对应的Tree Item显示在outline tree上。

其实用过gef的人都很容易知道原因,因为outline上每一个节点对应的也是一个tree editpart,每个tree editpart复用对应画板图形元素相同的数据模型。因此很显然,GMF生成的outline 和TreeEditPart并不能满足具体应用的需求,用户需要自己订制每个图形元素对应的outline 元素,也就是为每个图形元素实现一个TreeEditPart。

如何定制outlinepage:

在LogicNotationEditor中重载方法getOutlineViewEditPartFactory(),不过要注意的是这个方法在gmf1.0.1之后再加入DiagramEditor中,在gmf1.0.0里面没有这个方法,由于DiagramEditor中的内部类DiagramOutlinePage是友好的,无法继承,所以要想在gmf1.0.0中定制自己的outline就只能重写自己的outline page类了。

protected EditPartFactory getOutlineViewEditPartFactory() {
        
return new EditPartFactory() {

            
public EditPart createEditPart(EditPart context, Object model) {
                
if (model instanceof Diagram) {
                    
return new LogicDiagramTreeEditPart(model);
                }
 else {
                    
return this.getRightTreeEditPart(model);
                }

            }

            
private TreeEditPart getRightTreeEditPart(Object view) {
                
if(view instanceof Node &&
                        ((Node) view).getElement() 
instanceof ContainerElement) {
                    
                    
return new LogicContainerTreeEditPart(view);
                }

                
return new LogicChildTreeEditPart(view);
            }

        }
;
    }

 

LogicDiagramTreeEditPart.java

public class LogicDiagramTreeEditPart extends TreeDiagramEditPart{

    
public LogicDiagramTreeEditPart(Object model) {
        
super(model);
        
// TODO Auto-generated constructor stub
    }


    @Override
    
protected Image getImage() {
        
return LogicDiagramPlugin.getInstance().getBundledImage("icons/logic.gif");
    }


    @Override
    
protected String getText() {
        
return "Logic Diagram";
    }


}

LogicContainerTreeEditPart.java

public class LogicContainerTreeEditPart extends TreeContainerEditPart {

    
public LogicContainerTreeEditPart(Object model) {
        
super(model);
        
// TODO Auto-generated constructor stub
    }


    @Override
    
protected List getModelChildren() {
        List children 
= ((View) this.getModel()).getChildren();
        
return children;
    }


    @Override
    
protected Image getImage() {
        String path 
= "icons/logic.gif";
        String type 
= getType();
        
if("circuit".equalsIgnoreCase(type)) {
            path 
= "icons/circuit16.gif";
        }

        
if("FlowContainer".equalsIgnoreCase(type)) {
            path 
= "icons/logicflow16.gif";
        }

        
return LogicDiagramPlugin.getInstance().getBundledImage(path);
    }


    @Override
    
protected String getText() {
        
// TODO Auto-generated method stub
        return ((View) this.getModel()).getType();
    }

    
private String getType() {
        
return ((View) getModel()).getType();
        
    }

}

LogicChildTreeEditPart.java

public class LogicChildTreeEditPart extends TreeEditPart {

    
public LogicChildTreeEditPart(Object model) {
        
super(model);
        
// TODO Auto-generated constructor stub
    }

    @Override
    
protected Image getImage() {
        String path 
= "icons/logic.gif";
        String type 
= getType();
        
if("LED".equalsIgnoreCase(type)) {
            path 
= "icons/ledicon16.gif";
        }

        
if("AndGate".equalsIgnoreCase(type)) {
            path 
= "icons/and16.gif";
        }

        
if("OrGate".equalsIgnoreCase(type)) {
            path 
= "icons/or16.gif";
        }

        
if("XorGate".equalsIgnoreCase(type)) {
            path 
= "icons/xor16.gif";
        }

        
return LogicDiagramPlugin.getInstance().getBundledImage(path);
    }


    @Override
    
protected String getText() {
        
// TODO Auto-generated method stub
        return ((View) this.getModel()).getType();
    }

    
private String getType() {
        
return ((View) getModel()).getType();
        
    }

}

 

在LogicDiagramPlugin里面加入如下代码,主要用于获取icon image
    public static ImageDescriptor getBundledImageDescriptor(String path) {
        
return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.gmf.examples.runtime.diagram.logic", path);
    }

    
public Image getBundledImage(String path) {
        Image image 
= getImageRegistry().get(path);
        
if (image == null{
            getImageRegistry().put(path, getBundledImageDescriptor(path));
            image 
= getImageRegistry().get(path);
        }

        
return image;
    }


经过改进后的logic diagram outline page:

 

分享到:
评论

相关推荐

    gmf 1.7 最新版的gmf

    在GMF 1.7版本中,可能包含以下改进: - **性能优化**:对图形渲染和编辑操作进行了优化,提高了响应速度和整体性能。 - **新功能引入**:可能新增了一些特性,如更丰富的图元库,或者对EMF模型的高级支持。 - **...

    GMF EMF

    - 在实际项目中,GMF可以帮助开发人员构建定制化的模型编辑环境,提高生产力。 通过深入研究GMF ѧϰ和GMF 学习这两个文件,你将能够掌握GMF的基本概念,理解其工作原理,并具备使用GMF创建自己的图形编辑器的能力...

    org.eclipse.gmf.rar

    本文将深入探讨GMF中的RAR(Runtime Architecture Resource)组件,以及其在模型驱动开发中的关键作用。 首先,我们需要理解RAR的含义。"org.eclipse.gmf.rar"是Eclipse GMF运行时架构资源的标识符,它是GMF的核心...

    GMF数据表建模例子

    9. **源码分析**:深入研究这个例子的源码,不仅可以学习GMF的使用方法,还可以了解如何将EMF和GEF结合,以及如何处理图形交互事件,这对于开发自己的图形化工具非常有帮助。 10. **社区支持**:由于GMF是开源项目...

    GMF教程.doc

    - 在Eclipse中,通过`File` > `New` > `Project`,选择`New GMF Project`,创建名为`org.eclipse.gmf.examples.mindmap`的项目。 - 在创建项目时,可以选择显示Dashboard视图,便于后续操作。 2. **导入模型文件*...

    15 分钟学会 Eclipse GMF

    GMF是Eclipse Modeling Framework (EMF)的扩展,用于构建可定制的、高效的图形编辑器。EMF提供了一种模型到代码的生成机制,而GMF则专注于生成图形用户界面,使得开发人员能够专注于业务逻辑,而不是底层UI实现。 ...

    GMF Tutorial中文版

    GMF区分了"toolsmith"(使用GMF构建插件的开发者)和"user"(使用这些插件的开发者),并强调在透视图中,GMF应尽可能隐藏内部模型的复杂性。 教程还涉及了GMF的核心组成部分——概念模型和工具定义模型。概念模型...

    GMF实例解析.pdf

    通过深入研究和重构Taipan,读者可以逐步熟悉GMF的API,理解其设计理念,并掌握如何使用GMF创建自己的图形化编辑器。这样的实践不仅有助于学习GMF本身,也为理解和应用EMF和GEF提供了宝贵的经验。

    图形建模框架GMF综述

    - **模型驱动的开发**:GMF提供了一整套模型驱动的开发环境,允许开发者通过图形界面定制自己的领域模型。开发者可以定义模型中的元素类型、关系以及其他特性,然后基于这个模型自动生产出相应的代码。这种方式极大...

    GMF实例解析(PDF版)

    通过重构Taipan应用程序或插件,开发者不仅可以掌握GMF的基本操作,还能探索其高级特性,如动态模型更新、定制编辑行为和扩展图形元素。 #### 结论:GMF——图形化编辑器的未来 GMF的出现极大地推动了图形化编辑器...

    GMF相关资料

    在地图制作方面,GMF提供了丰富的符号库和颜色表,可以根据需要定制地图的外观。学习如何使用`gmt makecpt`创建自定义颜色表,以及`gmt psimage`和`gmt psscale`等命令添加图像和比例尺,能够提升地图的专业性。 ...

    Eclipse插件 GMF

    通过理解并熟练运用GMF,你可以构建出高度定制化的、专业级的建模工具,满足各种复杂的软件设计需求。在实际工作中,结合Eclipse的其他工具和插件,如EMF和Tycho,可以构建出完整的MDE(Model Driven Engineering)...

    一个简单的GMF实例

    【标题】:“一个简单的GMF实例” 在IT领域,GMF(Graphical Modeling Framework)是Eclipse项目的一部分,主要用于创建...通过阅读博文和研究提供的源码,可以深入理解GMF的工作原理,并能够将其应用到自己的项目中。

    GMF开发FSM的完整的例子

    本文档将通过一个详细的案例来介绍如何使用GMF来开发一个FSM(Finite State Machine,有限状态机)图形编辑器,从而教会读者如何为自己定制化的建模工具开发图形界面。 #### 了解 GMF 的机制与流程 在深入学习如何...

    GMF Tourial中文版(一)

    - **GMF**作为一个强大的框架,提供了创建高度定制化的图形化用户界面的能力,特别适用于开发复杂的数据可视化应用或建模工具。 - **EMF**是一个用于构建模型驱动的应用程序的基础框架,支持模型的定义、实例化以及...

    eclipse gef ve gmf

    在Eclipse中,GEF(Graphical Editing Framework)、VE(Visual Editor)和GMF(Graphical Modeling Framework)是三个重要的插件或框架,主要用于图形化界面设计和建模。 1. GEF(Graphical Editing Framework) ...

    GMF 开发文档

    - **启动GMF项目:** 在Eclipse中设置一个新的GMF项目是整个开发流程的第一步。 - **GMF Dashboard:** 创建新项目后,会显示GMF Dashboard(图1),它将指导用户完成整个开发过程,并成为主要的交互界面。 ##### ...

    gmf例子

    "gmf.edit"部分主要涉及到GMF中的编辑功能。在GMF中,编辑模块允许用户对地图数据进行增删改查操作。这包括添加新的地理对象,删除现有对象,修改对象属性,以及连接和断开对象之间的关系。编辑功能通常与图层的概念...

Global site tag (gtag.js) - Google Analytics