`
yonlist
  • 浏览: 84512 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

GEF图形显示机制(二)

阅读更多

比如我们使用:

getGraphicalViewer().setRootEditPart(rooteditpart);

到此LightweightSystem的构建完成,关键是怎么往rootfigure加其他figure了。这个就是GraphicalViewersetcontens的作用。

public void setContents(Object contents) {

    Assert.isTrue(getEditPartFactory() != null,

        "An EditPartFactory is required to call setContents(Object)");//$NON-NLS-1$

    setContents(getEditPartFactory().

            createEditPart(null, contents));

}

public void setContents(EditPart editpart) {

    getRootEditPart().setContents(editpart);

}

下面这个是rooteditpartsetcontents.

public void setContents(EditPart editpart) {

    if (contents == editpart)

        return;

    if (contents != null)

        removeChild(contents);

    contents = editpart;

//只能有一个contents.

    if (contents != null)

        addChild(contents, 0);

//注意这个0,表示contentsfigure在最上面。

}

这样就添加了,也就是说contentfigurerootfigurechild.

比如我们使用:

  getGraphicalViewer().setContents(this.diagram);

 

然后contentmodelchildemode对应的editpartfigure如何添加到contentfigue的呢?

当这Contentfigure(一个Layer)的载体contentseditpartmodel添加一个child时就要通知

Contenteditpart,然后Contenteditpart执行refreshchildren;

protected void refreshChildren() {

    int i;

    EditPart editPart;

    Object model;

 

    Map modelToEditPart = new HashMap();

    List children = getChildren();

 

    for (i = 0; i < children.size(); i++) {

        editPart = (EditPart)children.get(i);

        modelToEditPart.put(editPart.getModel(), editPart);

    }

 

    List modelObjects = getModelChildren();

 

    for (i = 0; i < modelObjects.size(); i++) {

        model = modelObjects.get(i);

 

        //Do a quick check to see if editPart[i] == model[i]

        if (i < children.size()

            && ((EditPart) children.get(i)).getModel() == model)

                continue;

 

        //Look to see if the EditPart is already around but in the wrong location

        editPart = (EditPart)modelToEditPart.get(model);

 

        if (editPart != null)

            reorderChild (editPart, i);

        else {

            //An editpart for this model doesn't exist yet.  Create and insert one.

            editPart = createChild(model);

//

            addChild(editPart, i);

        }

    }

    List trash = new ArrayList();

    for (; i < children.size(); i++)

        trash.add(children.get(i));

    for (i = 0; i < trash.size(); i++) {

        EditPart ep = (EditPart)trash.get(i);

        removeChild(ep);

    }

}

 

protected EditPart createChild(Object model) {

    return getViewer().getEditPartFactory().createEditPart(this, model);

}

protected void addChild(EditPart child, int index) {

    Assert.isNotNull(child);

    if (index == -1)

        index = getChildren().size();

    if (children == null)

        children = new ArrayList(2);

 

    children.add(index, child);

    child.setParent(this);

    addChildVisual(child, index);

    child.addNotify();

 

    if (isActive())

        child.activate();

    fireChildAdded(child, index);

}

 

 

protected void addChildVisual(EditPart childEditPart, int index) {

    IFigure child = ((GraphicalEditPart)childEditPart).getFigure();

//getfigure会调用createfigure

    getContentPane().add(child, index);

}

public IFigure getContentPane() {

    return getFigure();

}

这样就把一个child添加到primary layer里。

到此完成了所有editpartfigure

Rooteditpartfigure是一个ScalableRootEditPart

public ScalableRootEditPart() {

    zoomManager =

        new ZoomManager((ScalableLayeredPane)getScaledLayers(), ((Viewport)getFigure()));

}

 

/**

 * @see org.eclipse.GEF.editparts.AbstractGraphicalEditPart#createFigure()

 */

protected IFigure createFigure() {

    Viewport viewport = createViewport();

innerLayers = new LayeredPane();

    createLayers(innerLayers);

 

    viewport.setContents(innerLayers);

    return viewport;

}

 

public void setContents(IFigure figure) {

    if (view == figure)

        return;

    if (view != null)

        remove(view);

    view = figure;

    if (view != null)

        add(figure);

}

 

protected void createLayers(LayeredPane layeredPane) {

    layeredPane.add(getScaledLayers(), SCALABLE_LAYERS);

    layeredPane.add(new Layer() {

        public Dimension getPreferredSize(int wHint, int hHint) {

            return new Dimension();

        }

    }, HANDLE_LAYER);

    layeredPane.add(new FeedbackLayer(), FEEDBACK_LAYER);

    layeredPane.add(new GuideLayer(), GUIDE_LAYER);

}

然后inerlayer添加了EEDBACK_LAYER等层。

其实在lightwigetsystem里,layer就是composite(所有figure都是)的感觉,只不过它是透明的,即没有背景色,而Label这些不行。

Contenteditpart就是一个layer.

protected IFigure createFigure() {

        // TODO Auto-generated method stub

        Layer figure = new Layer();

        figure.setLayoutManager(new XYLayout());

        return figure;                                                                                                             

    }

 

转载自http://sjj0412.cublog.cn/

分享到:
评论

相关推荐

    [翻译]Eclipse图形化编辑框架(GEF)/更新第7章:层和视图

    Eclipse图形化编辑框架(GEF)通过层和视图的机制,提供了强大的图形编辑工具构建能力。层的管理使得元素的绘制和交互更加灵活,而视图则提供了展示模型数据的多种方式。通过深入学习第7章的内容,开发者能够更高效地...

    eclipse3.4的可视化开发GEF

    **二、GEF架构** GEF的核心架构由多个层次组成,包括Model、View、Controller和Command模式。Model层负责存储和管理数据,View层则将Model的数据可视化,Controller层处理用户的交互操作,而Command模式确保了操作的...

    GEF入门学习例子

    7. **文件名称列表**: `gef.tutorial.step2`可能代表了一个逐步教程的第二步,通常包含了一些示例代码和配置文件,用于演示上述概念的实现。 学习这个例子,开发者可以了解如何使用GEF创建一个完整的图形编辑环境,...

    GEF简易教程-学习GEF的入门教程

    虽然两者都可以用来显示GEF图形,但**Editor**与**View**存在本质区别: - **Editor**提供文件保存功能,适用于需要持久化数据的场景。 - **View**主要用于展示数据,不涉及数据保存,适用于动态数据展示或监控界面...

    GEF教程和demo源码

    3. **手势处理**:GEF提供了一套标准的手势处理机制,如拖放、单击、双击等,使得图形对象可以响应用户的操作。 4. **ZOrder管理**:文档将解释如何管理图形元素的层次顺序,以决定哪个元素在视觉上覆盖另一个。 5...

    gef版本的helloworld

    文档中指出,创建一个Editor是为了在图形界面中显示GEF图形,而这一部分通常是在Eclipse的EditorPart基础上扩展来的。作者还提到了模型、控制器和视图的放置位置,强调了Editor类应该放在gef.tutorial.step.ui包中,...

    GEF.rarGEF.rar

    9. **可扩展性**:GEF的设计允许通过插件机制添加新的功能或图形元素,极大地增强了框架的灵活性。 10. **示例和教程**:GEF通常会提供一系列的示例项目和教程,帮助开发者快速上手,理解和使用框架。 总的来说,...

    GEF锚点鼠标定位

    它提供了一套完整的机制来处理图形元素的创建、编辑、显示以及它们之间的连接。GEF的核心组件包括模型(Model)、视图(View)、编辑器(Editor)和控制器(Controller)等,这些组件共同协作以实现图形编辑功能。 ...

    Eclipse插件gef 3.8.0

    GEF允许开发者自定义视图的显示方式。 - **编辑器(Editor)**:编辑器是整个图形界面,它包含一个或多个视图,用户可以通过编辑器与模型交互。 - **命令(Command)**:命令是GEF的核心机制之一,用于执行对模型...

    org.eclipse.gef

    3. **事件处理**:通过事件驱动机制,GEF 支持用户与图形元素之间的交互,如点击、拖放和双击等操作。 4. **图形变换**:提供缩放、平移等图形变换功能,以适应不同的显示需求。 5. **图元工厂**:图元工厂是创建...

    Eclipse的GEF插件

    GEF提供了一套机制来处理图形元素的绘制和布局。 3. **Edit Part**:编辑部分是视图层与用户交互的关键,它封装了用户操作和图形元素之间的映射。当用户在图形界面上进行操作时,Edit Part会处理这些事件并更新相应...

    GEF原理的详细介绍+程序实例和程序源码

    2. **视图(View)**:视图是模型在屏幕上的表示,由GEF的图形组件(如Figure和Part)组成,用于显示模型数据。 3. **控制器(Controller)**:处理用户输入,如鼠标点击和键盘事件,协调模型和视图的更新。 4. **...

    界面设计GEF应用实例

    【标题】"界面设计GEF应用实例"涉及的是在软件开发中使用图形编辑框架(Graphical Editing Framework,...通过这些实例,开发者能够深入理解GEF的各个组件和机制,从而能够高效地构建出具有专业级图形界面的软件系统。

    GEF 入门教程 中文版

    - 微型视图是另一个简化版本的图形视图,用于显示模型的关键部分。 - 它可以帮助用户聚焦于当前正在编辑的部分。 **知识点2:实现微型视图** 1. **定义微型视图模型**:创建一个简化版的模型,只包含关键元素。 2....

    GEF快速入门教程和EMF教程

    通常情况下,GEF会集成到Editor中而非View中,这是因为Editor提供了文件保存机制,这对于图形编辑来说非常关键。 1. **创建Editor**: - 在`plugin.xml`的“extensions”页面中,添加一个新的编辑器。选择`org....

    gef eclipse org

    2. **View**:显示模型数据的图形组件,如图元、连接线等。 3. **EditPart**:介于模型和视图之间,负责将模型数据转换为视图元素,并处理用户交互。 4. **Command**:用于实现撤销/重做功能,确保对模型的更改是...

    GEF入门实例代码2《Eclipse插件开发》中实例

    总之,通过这个"GEF入门实例代码2",开发者可以了解到如何在Eclipse中构建一个基于GEF的图形编辑器,这不仅涉及数据模型的设计,还包括视图的绘制、用户交互的处理以及可撤销/重做机制的实现。通过实践,开发者可以...

    GEF实现拷贝粘贴

    GEF是Eclipse平台下用于构建图形化编辑器的框架,它提供了一套完整的机制来帮助开发者创建复杂的图形用户界面。 首先,我们要理解GEF的基本概念。GEF是一种模型-视图-控制器(MVC)架构的实现,它将图形界面与业务...

    GEF Description

    #### 二、GEF 解决的问题 ##### 2.1 图形编辑器的一般问题 在开发图形编辑器时,通常面临以下问题: - **模型与视图的关联**:需要建立数据模型与用户界面之间的联系,使得用户对界面的操作可以直接反映到数据...

    GEF入门系列

    - **模型-视图-控制器(MVC)**:GEF基于经典的MVC设计模式,其中模型负责存储数据,视图负责显示数据,而控制器则处理用户交互。 - **编辑领域(EditPart)**:编辑领域是GEF中的核心组件,它将模型与视图关联...

Global site tag (gtag.js) - Google Analytics