在我们实现一个gef编辑器的时候,会重新configureGraphicalViewer()方法,在这个方法里面我们会为GraphicalViewer设置一个RootEditPart,一般是ScalableFreeformRootEditPart。
RootEditPart接口:这个接口定义了几个方法,主要是用于获取当前的EditPartViewer,在gef中EditPartViewer才是我们在界面看到的一个个有效单元,而EditPart只是它的一个控制器。
1.FreeformGraphicalRootEditPart:一个gef默认提供的类,它是一个RootEditPart,它默认的建立了N个Layer,用分层展示的方式,展示编辑器中的界面元素,所有的layer都放在FreeformViewport里面。
关于创建layer的代码:
protected void createLayers(LayeredPane layeredPane) {
layeredPane.add(createGridLayer(), GRID_LAYER);
layeredPane.add(getPrintableLayers(), PRINTABLE_LAYERS);
layeredPane.add(new FreeformLayer(), HANDLE_LAYER);
layeredPane.add(new FeedbackLayer(), FEEDBACK_LAYER);
layeredPane.add(new GuideLayer(), GUIDE_LAYER);
}
protected LayeredPane createPrintableLayers() {
FreeformLayeredPane layeredPane = new FreeformLayeredPane();
layeredPane.add(new FreeformLayer(), PRIMARY_LAYER);
layeredPane.add(new ConnectionLayer(), CONNECTION_LAYER);
return layeredPane;
}
除了添加layer,FreeformGraphicalRootEditPart还对GridLayer做了一些处理:
if (property.equals(SnapToGrid.PROPERTY_GRID_ORIGIN)
|| property.equals(SnapToGrid.PROPERTY_GRID_SPACING)
|| property.equals(SnapToGrid.PROPERTY_GRID_VISIBLE))
refreshGridLayer();
我们可以在Editor中设置这三个属性的值,来改变GridLayer现实的状态:
getGraphicalViewer().setProperty(SnapToGrid.PROPERTY_GRID_VISIBLE,
false);
getGraphicalViewer().setProperty(SnapToGrid.PROPERTY_GRID_ENABLED,
false);
getGraphicalViewer().setProperty(SnapToGeometry.PROPERTY_SNAP_ENABLED,
true);
ScalableFreeformRootEditPart:是FreeformGraphicalRootEditPart的子类,它里面增加了一个ZoomManager的功能。
RulerRootEditPart:为编辑提供游标功能的EditPart,主要被gef默认提供的封装组件RulerComposite使用。RulerComposite大家肯定熟悉,是用于实现游标的那个功能的。
ScalableRootEditPart:能够缩放,但是不自由伸展。