Viewport视口:编辑器中当前可以见到的部分。一般在outline视图实现鹰眼功能的时候会用到这个东西。
Viewport有三个子类:FocusableViewport、RulerViewport和FreeformViewport。这三个Viewport跟gef中默认提供的RootEditPart是一一对应的:
RulerRootEditPart对应于RulerViewport
FreeFormGraphicalRootEditPart和它的子类ScalableFreeformRootEditPart对应于FreeformViewport
FocusableViewport是一个内部类
在outline中使用Viewport:
由于Viewport是一个真实的视口它的大小跟当前编辑器打开的大小一样,而outline视图上现实的肯定会跟它实际大小不一样。所有在Viewport用到outline中的时候,有一个转换过程,这个转换能力是由Thumbnail提供。
Thumbnail:缩略图的意思,其功能主要也是干这个的。它还有一个子类ScrollableThumbnail:扩展了一个滚动的功能。通常我们使用的就是这个子类ScrollableThumbnail。
我在实现outline视图的鹰眼功能的时候,没有自己实现这些细节,我是直接使用emf提供的一个类OverviewComposite:
public void createControl(Composite parent)
{
RootEditPart rootEditPart = viewer.getRootEditPart();
if (rootEditPart instanceof ScalableFreeformRootEditPart)
{
overview = new OverviewComposite(parent,
(ScalableFreeformRootEditPart) rootEditPart);
overview.setLayoutData(new GridData(GridData.FILL_BOTH));
}
}
这个方法是我的DiagramsOutlinePage类里面的方法,我只需要传入一个ScalableFreeformRootEditPart进去就行了。但是OverviewComposite类只能在使用ScalableFreeformRootEditPart作为rootEditPart 的时候才能使用。如果想自己实现:
public void createControl(Composite parent) {
parent.setLayout(new GridLayout(1,false));
Canvas canvas = new Canvas(parent, SWT.NONE);
canvas.setLayoutData(new GridData(GridData.FILL_BOTH));
LightweightSystem lightweightSystem = new LightweightSystem(canvas);
ScalableFreeformRootEditPart rootEditPart = (ScalableFreeformRootEditPart) getViewer()
.getRootEditPart();
ScrollableThumbnail thumbnail = new ScrollableThumbnail(
(Viewport) rootEditPart.getFigure());
thumbnail.setSource(rootEditPart.getFigure());
lightweightSystem.setContents(thumbnail);
}