`
yonlist
  • 浏览: 83124 次
  • 性别: 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/

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics