同事和我做同一件事情,但是我弄的总有个问题。
对比了我们各自写的文件,在表面上完全没有那里存在问题。
在前段的时间中也遇到相应的问题,原来是加上一个布局就可以了。
setLayoutManager(new ConstrainedToolbarLayout());
再次遇到一样的问题,想查查到底是什么问题。经过对比使用布局和不使用的调试结果后。
大概问题如下:
GEF在用户操作会提供一个“鬼影”的提示。获得的FeedBack的大小由操作的图形的MinSize和操作后的Bounds决定。
org.eclipse.gmf.runtime.diagram.ui.editpolicies.ResizableEditPolicyEx.showChangeBoundsFeedback(ChangeBoundsRequest)
protected void showChangeBoundsFeedback(ChangeBoundsRequest request) {
IFigure feedback = getDragSourceFeedbackFigure();
// 获得操作后的大小
PrecisionRectangle rect = new PrecisionRectangle(getInitialFeedbackBounds().getCopy());
getHostFigure().translateToAbsolute(rect);
rect.translate(request.getMoveDelta());
rect.resize(request.getSizeDelta());
IFigure f = getHostFigure();
// 最小的大小
Dimension min = f.getMinimumSize().getCopy();
Dimension max = f.getMaximumSize().getCopy();
IMapMode mmode = MapModeUtil.getMapMode(f);
min.height = mmode.LPtoDP(min.height);
min.width = mmode.LPtoDP(min.width);
max.height = mmode.LPtoDP(max.height);
max.width = mmode.LPtoDP(max.width);
if (min.width>rect.width)
rect.width = min.width;
else if (max.width < rect.width)
rect.width = max.width;
if (min.height>rect.height)
rect.height = min.height;
else if (max.height < rect.height)
rect.height = max.height;
feedback.translateToRelative(rect);
feedback.setBounds(rect);
}
而Figure的getMinimumSize()方法中,当用户没有直接设置minSize,又没有设置布局管理器LayoutManager的话,会返回preferredSize。最终返回了当前图形Figure的size/bounds。
public final Dimension getMinimumSize() { return getMinimumSize(-1, -1); } public Dimension getMinimumSize(int wHint, int hHint) { if (minSize != null) return minSize; if (getLayoutManager() != null) { Dimension d = getLayoutManager().getMinimumSize(this, wHint, hHint); if (d != null) return d; } return getPreferredSize(wHint, hHint); }
public final Dimension getPreferredSize() {
return getPreferredSize(-1, -1);
}
public Dimension getPreferredSize(int wHint, int hHint) {
if (prefSize != null)
return prefSize;
if (getLayoutManager() != null) {
Dimension d = getLayoutManager().getPreferredSize(this, wHint,
hHint);
if (d != null)
return d;
}
return getSize();
}
这样用户看到的看到的FeedBack就是当前大小,导致出现不能缩小的窘境/囧。
<------------------------------------->
2/ 在准备写的时刻又遇到了一个问题,既然我们看到的FeedBack是控制了,但是FeedBack是在request已经生成后才呈现给用户看的,那么又是怎样反过来改变Request的呢?
其实,GMF并没有再次处理Request,比minSize小,照样修改模型的数据。
3/ 只是在重绘的时刻,通过layoutmanager#layout(),重新计算孩子的大小,而layout()则会调用min,max,perfectSize来重新设置Bounds。
org.eclipse.gmf.runtime.diagram.ui.layout.FreeFormLayoutEx.layout(IFigure)