快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

金沙国际娱城app_博格自动化网进入



本文示例源代码或素材下载

当一个GEF利用法度榜样实现了大年夜部分必需的营业功能后,为了能让用户应用得更方便,我们应该在易用性方面做些斟酌。从3.0版本开始, GEF增添了更多这方面的新特点,开拓职员很轻易使用它们来改良自己的利用法度榜样界面。这篇帖子将先容主要的几个功能,它们有些在GEF 2.1中就呈现了,但由于都是关于易用性的而且曩昔没有提到,以是放在这里一路来说。

可折叠调色板

在曩昔的例子里,我们的编辑器都承袭自GraphicalEditorWithPalette。GEF 3.0供给了一个功能加倍富厚的编辑器父类:GraphicalEditorWithFlyoutPalette,承袭它的编辑用具有一个可以折叠的对象条,并且能够使用Eclipse自带的调色板视图,当调色板视图显示时,对象条会自动转移到这个视图中。

图1 可折叠和设置设置设备摆设摆设的调色板

与曩昔的GraphicalEditorWithPalette比拟,承袭 GraphicalEditorWithFlyoutPalette的编辑器要多做一些事情。首先要实现getPalettePreferences() 措施,它返回一个FlyoutPreferences实例,感化是把调色板的几个状态信息(位置、大年夜小和是否展开)保存起来,这样下次打开编辑器的时刻就可以自动套用这些设置。下面应用偏好设置的要领保存和载入这些状态,你也可以应用其他措施,比如保存为.properties文件:

protected FlyoutPreferences getPalettePreferences() {

return new FlyoutPreferences() {

public int getDockLocation() {

return SubjectEditorPlugin.getDefault().getPreferenceStore().getInt(IConstants.PREF_PALETTE_DOCK_LOCATION);

}

public void setDockLocation(int location) {

SubjectEditorPlugin.getDefault().getPreferenceStore().setValue(IConstants.PREF_PALETTE_DOCK_LOCATION,location);

}

};

}

然后要覆盖缺省的createPaletteViewerProvider()实现,在这里为调色板增添拖放支持,即指定调色板为拖放源(之以是用这样的要领,缘故原由是在编辑器里没有法子获得它对应的调色板实例),在曩昔这个事情平日是在initializePaletteViewer ()措施里完成的,而现在这个措施已经不必要了:

protected PaletteViewerProvider createPaletteViewerProvider() {

return new PaletteViewerProvider(getEditDomain()) {

protected void configurePaletteViewer(PaletteViewer viewer) {

super.configurePaletteViewer(viewer);

viewer.addDragSourceListener(new TemplateTransferDragSourceListener(viewer));

}

};

}

GEF 3.0还容许用户对调色板里的各类对象进行定制,例如暗藏某个对象,或是改动对象的描述等等,这是经由过程给PaletteViewer定义一个 PaletteCustomizer实例实现的,但因为光阴关系,这里暂时不具体先容了,假如必要这项功能你可以参考Logic例子中的实现措施。

缩放

因为Draw2D中的图形都具有天然的缩放功能,是以在GEF里实现缩放功能是很轻易的,而且缩放的效果不错。GEF为我们供给了 ZoomInAction和ZoomOutAction以及对应的RetargetAction(ZoomInRetargetAction和 ZoomOutRetargetAction),只要在编辑器里构造它们的实例,然后在编辑器的ActionBarContributer类里将它们添加到想要的菜单或对象条位置即可。由于ZoomInAction和ZoomOutAction的构造措施要求一个ZoomManager类型的参数,而后者必要从GEF的RootEditPart中得到(ScalableRootEditPart或 ScalableFreeformRootEditPart),以金沙国际娱城app是最好在编辑器的 configureGraphicalViewer()里构造这两个Action对照方便,请看下面的代码:

public Object getAdapter(Class type) {

if (type == ZoomManager.class)

return getGraphicalViewer().getProperty(ZoomManager.class.toString());

return super.getA金沙国际娱城appdapter(type);

}

现在,打开编辑器后主对象条中将呈现下图所示的两个按钮和一个下拉框:

图2 缩下班具条

无意偶尔候我们想让法度榜样把用户当前的缩放值记录下来,以便下次打开时显示同样的比例。这就须要在画布模型里增添一个zoom变量,在编辑器的初始化历程中增添下面的语句,此中diagram是我们的画布实例:

ZoomManager manager = (ZoomManager) getGraphicalViewer().getProperty(ZoomManager.class.toString());

if (manager != null)

manager.setZoom(diagram.getZoom());

在保存模型前获得当前的缩放比例放在画布模型里一路保存:

ZoomManager manager = (ZoomManager) getGraphicalViewer().getProperty(ZoomManager.class.toString());

if (manager != null)金沙国际娱城app

diagram.setZoom(manager.getZoom());

帮助网格

你可能用过一些这样的利用法度榜样,画布里可以显示一个灰色的网格赞助定位你的图形元素,当被拖动的节点靠近网格线条时会被"吸附"到网格上,这样可以很轻易的把画布上的图形元素排列划一,GEF 3.0里就供给了显示这种帮助网格的功能。

要实现对齐功能,还有一个紧张的步骤,那便是在画布所对应的EditPart的getAdapter()措施里增添对 SnapToHelper类的回应,像下面这样:

public Object getAdapter(Class adapter) {

if (adapter == SnapToHelper.class) {

List snapStrategies = new ArrayList();

Boolean val = (Boolean)getViewer().getProperty(RulerProvider.PROPERTY_RULER_VISIBILITY);

if (val != null && val.booleanValue())

snapStrategies.add(new SnapToGuides(this));

val = (Boolean)getViewer().getProperty(SnapToGeometry.PROPERTY_SNAP_ENABLED);

if (val != null && val.booleanValue())

snapStrategies.add(new SnapToGeometry(this));

val = (Boolean)getViewer().getProperty(SnapToGrid.PROPERTY_GRID_ENABLED);

if (val != null && val.booleanValue())

snapStrategies.add(new SnapToGrid(this));

if (snapStrategies.size() == 0)

return null;

if (snapStrategies.size() == 1)

return (SnapT金沙国际娱城appoHelper)snapStrategies.get(0);

SnapToHelper ss[] = new SnapToHelper[snapStrategies.size()];

for (int i = 0; i

//定义一个RulerComposite类型的变量

private RulerComposite rulerComp;

//创建RulerComposite,并把GraphicalViewer创建在其上

protected void createGraphicalViewer(Composite parent) {

rulerComp = new RulerComposite(parent, SWT.NONE);

super.createGraphicalViewer(rulerComp);

rulerComp.setGraphicalViewer((ScrollingGraphicalViewer) getGraphicalViewer());

}

//覆盖getGraphicalControl返回RulerComposite实例

protected Control getGraphicalControl() {

return rulerComp;

}

然后,要设置GraphicalViewer的几个有关属性,如下所示,此中前两个分腕表示左侧和上方的标尺,而着末一个表示标尺的可见性:

getGraphicalViewer().setProperty(RulerProvider.PROPERTY_VERTICAL_RULER,new SubjectRulerProvider(diagram.getLeftRuler()));

getGraphicalViewer().setProperty(RulerProvider.PROPERTY_HORIZONTAL_RULER,new SubjectRulerProvider(diagram.getTopRuler()));

getGraphicalViewer().setProperty(RulerProvider.PROPERTY_RULER_VISIBILITY,new Boolean(diagram.isRulerVisibility()));

在前两个措施里用到了SubjectRulerProvider这个类,它是我们从RulerProvider类承袭过来的, RulerProvider是一个对照特殊的类,其感化有点像EditPolicy,不过除了一些getXXXCommand()措施以外,还有其他几个措施要实现。必要返回Command的措施包括:getCreateGuideCommand()、getDeleteGuideCommand()和 getMoveGuideCommand(),分手返回创建帮助线、删除帮助线和移动帮助线的敕令,下面列出创建帮助线的敕令,其他两个的实现要领是类似的,你可以在本文所附例子中找到它们的代码:

可以看到 监听 器在被触发时所做的事情实际上是触发这个RulerProvider的 监听 器列表(listeners)里的所有 监听 器,而这些 监听 器便是RulerEditPart或GuideEditPart,而我们不必要去关心这两个类。Ruler的事故有两种,一是单位(象素、厘米、英寸)改变,二是创建帮助线,在创建帮助线的环境要给这个帮助线增添 监听 器。下面是Guide 监听 器的主要代码:

public void notifyChanged(Notification notification) {

Guide guide 金沙国际娱城app= (Guide) notification.getNotifier();

switch (notification.getFeatureID(ModelPackage.class)) {

case ModelPackage.GUIDE__POSITION:

for (int i = 0; i

Guide 监听 器也有两种事故,一是帮助线位置改变,二是帮助线上吸附的图形的增减变更。请留意,这里的轮回必然不要用 iterator的要领,而应该用上面列出的下标要领,否则会呈现ConcurrentModificationException非常,缘故原由和 RulerProvider的notifyXXX()实现有关。我们的SubjectRulerProvider构造措施如下所示,它的主要事情便是增添 监听 器:

public SubjectRulerProvider(Ruler ruler) {

this.ruler = ruler;

ruler.eAdapters().add(rulerAdapter);

//载入模型的环境下,ruler可能已经包孕一些guides,以是要给它们增添 监听 器

for (Iterator iter = ruler.getGuides().iterator(); iter.hasNext();) {

Guide guide = (Guide) iter.next();

guide.eAdapters().add(guideAdapter);

}

}

您可能还会对下面的文章感兴趣: