日期:2014-05-16  浏览次数:20649 次

Feedback(反馈)详述一

Feedback用于对gef编辑器操作的反馈,最常见的是一些鬼影效果。

?

?

1.Feedback的调用:

每个gef编辑器都有一个EditDomain对象,EditDomain主要是用于触发事件用的,这样说真的很不负责任。但是,事件的转发确实是它的主要责任之一。首先它会获取到事件源,然后获取到当前活动的ActiveTool,然后转发给当前活动的ActiveTool。至于事件是如何响应的,如何处理的,都是由Tool来处理的。(关于EditDomain和tool这块在另一篇文章里面有描述)

由于事件的响应都是由ActiveTool处理的,EditDomain只做转发,所以,最源头调用Feedback的地方是各个ActiveTool,这个获取一下引用就能够找到了,包括最终销毁Feedback效果也是在ActiveTool里面处理的。

?

?

2.Feedback的创建:

尽管调用是在ActiveTool里面,但是创建却是在EditPart里面,在EditPart接口里面定义了四个方法:

?

void eraseSourceFeedback(Request request);

void eraseTargetFeedback(Request request);

void showSourceFeedback(Request request);

void showTargetFeedback(Request request);
?

这还没完,我们可以看看AbstractEditPart里面对这些方法的实现,这里只贴出一个:

?

public void showSourceFeedback(Request request) {
		if (!isActive())
			return;
		EditPolicyIterator i = getEditPolicyIterator();
		while (i.hasNext())
			i.next().showSourceFeedback(request);
	}
?

从代码可以看出,其实gef的默认实现是调用EditPolicy里面的实现。现在就要弄清楚了,其实EditPart和EditPolicy里面都能够实现Feedback效果。具体在那里实现,完全看这个效果的粒度,如果它针对所有的请求都有效,可以直接在EditPart里面实现,如果只针对部分请求有效,就实现在EditPolicy里面。

?

?

3.Feedback的实现:

其最基本的实现原理是:在编辑器的根上有一个Feedback Layer,所有的与Feedback效果相关的IFigure,都是画在这个层上面的,所以一般打印是不会打印出Feedback的效果的。一个gef编辑器的最底层的容器是一个由多个层组成的IFigure,这个网上查一下就很清楚了。

?

一般我们需要获取图片的画,主要是获取打印Layer,然后通过对打印层的部分在内存中重画成一个image对象,然后保存到文件中,这个是打印层主要的用法。还有连线层,专门是放线的。Feedback专门用于显示反馈效果的。?

?

在GraphicalEditPolicy里面有一个addFeedback(IFigure figure)方法,把自己想显示的效果实现在这个地方,就能显示了。

?

protected void addFeedback(IFigure figure) {
		getFeedbackLayer().add(figure);
	}
?

具体的实现细节自己把握。

?

?