日期:2014-05-16 浏览次数:20709 次
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); }?
具体的实现细节自己把握。
?
?