`
winse
  • 浏览: 92941 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

GMF编辑器中,图形可以放大不能缩小

 
阅读更多

同事和我做同一件事情,但是我弄的总有个问题。

对比了我们各自写的文件,在表面上完全没有那里存在问题。

 

在前段的时间中也遇到相应的问题,原来是加上一个布局就可以了。

 

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)

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics