比如我们使用:
getGraphicalViewer().setRootEditPart(rooteditpart);
到此LightweightSystem的构建完成,关键是怎么往rootfigure加其他figure了。这个就是GraphicalViewer的setcontens的作用。
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);
}
下面这个是rooteditpart的setcontents.
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在最上面。
}
这样就添加了,也就是说contentfigure是rootfigure的child.
比如我们使用:
getGraphicalViewer().setContents(this.diagram);
然后contentmodel的childemode对应的editpart的figure如何添加到contentfigue的呢?
当这Contentfigure(一个Layer)的载体contentseditpart的model添加一个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里。
到此完成了所有editpart的figure。
Rooteditpart的figure是一个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/
分享到:
相关推荐
gef布局显示学习
用视图显示在GEF编辑器编辑好的图形 在视图里加入GraphicalViewer viewer = new ScrollingGraphicalViewer(); viewer.createControl(parent);
GEF图形编辑框架使用指南,从新手到入门,详细的讲解了如何使用GEF进行图形编辑
一个GEF的例子,例子中展示了利用GEF往画布上添加节点 删除节点,以及树形展现等得荣
NULL 博文链接:https://ojeta.iteye.com/blog/1485997
GEF入门系列,八进制 的GEF入门系列教程, 由社区经作者授权后整理而成GEF(Graphical Editor Framework)是一个图形化编辑框架,它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验。这样的应用程序有很...
GEF: Graphical Editing Framework <br>GEF是一套MVC Framework,它能帮你比较容易的建立图形化的编辑器,V(View)的部分常常是基于SWT的Draw2D,因此Draw2D也看作是GEF的一部分。依赖:org.eclipse.gef***, org...
GEF 图形编辑框架,是Eclipse旗下一个重要的插件,用于开发图形界面。这是系列教程源码之二。
GEF(Graphical Editor Framework)是一个图形化编辑框架,它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验。这样的应用程序有很多,例如:UML类图编辑器、图形化XML编辑器、界面设计工具以及图形化...
这是我自己在学习GEF的时候做的一些总结。 1、GEF中的概念比如Command,Tool,Request等等。 2、GEF中使用到的几种设计模式。 3、GEF中对鼠标键盘事件处理的机制、流程。
GEF理解之第二部分,学习gef必备文档资料啊,值得下载
GEF 图形编辑框架,是Eclipse旗下一个重要的插件,用于开发图形界面。这是系列教程源码之三。
GEF入门必读 GEF入门系列 GEF-whole-upload 感谢八进制
eclipse3.4的可视化开发GEF eclipse3.4的可视化开发GEF eclipse3.4的可视化开发GEF
我下的资源的打包,希望有帮助,包括:GEF_Tutorial,GEF实例,入门教程,GEF-whole-upload
GEF eclipse 插件
GEF简易教程-学习GEF的入门教程,不错的gef入门教程
gef 绘图折线的实现方法。 gef API chm 格式
NULL 博文链接:https://liugang594.iteye.com/blog/1000794
GEF.rar GEF.rar GEF.rar