1 Tool Behavior Provider
工具行为提供器需要被集成到标准工作台工具中。这一般意味着在工作台现有的编辑概念(concept)上添加功能。
(1) 必须实现接口IToolBehaviorProvider,或者继承其子类如DefaultToolBehaviorProvider.。
(2) 覆写方法:到剪贴板。
(3) 在feature provider中覆写getAvailableToolBehaviorProviders发布。
1.1 Providing Own Images
提供自己的图像是依赖于平台的。
图标必须放到插件工程的“icons/”中关联。
1.1.1 ceating an Image Provider
提供自己的图像是依赖于平台的。
图标必须放到插件工程的“icons/xxx.png”中关联。
(1) ceating an Image Provider
Graphiti是独立于平台的,但图像的实例是依赖于平台的。因此Graphiti中的图片是通过标识符(identify)来使用的,image provider的任务就是为图片标识符发布依赖平台的图片。
创 建Image provider必须实现接口IImageProvider,或者继承其子类如AbstractImageProvider。覆写或实现方法 addAvailableImages(注册所有可用的图像标识符,并将它们映射到他们的依赖于平台的图像)。实现tool behavior provider类中的getContextButtonPad方法。
Image Provider必须在plugin.xml的extension中注册。
<extension
point="org.eclipse.graphiti.ui.diagramTypeProviders">
<diagramTypeProvider
class="org.wang.andy.classeditor.MyDiagramTypeProvider"
id="org.wang.andy.classeditor.MyDiagramTypeProvider"
name="Demo Editor">
<diagramType
id="org.wang.andy.classeditor.diagramType">
</diagramType>
<imageProvider
id="org.wang.andy.classeditor.MyImageProvider">
</imageProvider>
</diagramTypeProvider>
</extension>
...
<extension
point="org.eclipse.graphiti.ui.imageProviders">
<imageProvider
class="org.wang.andy.classeditor.MyImageProvider"
id="org.wang.andy.classeditor.MyImageProvider">
</imageProvider>
</extension>
1.2 提供Context Buttons
(1) Context Button是每一个图符元素上小的、自动显示图标的动作按钮。当鼠标在图元上时显示,移除图元时隐藏。Context Button不仅能提供Context menu的功能,并且一个Context Button上还可以添加多个drag & drop feature。
(2) Context buttons 需要在 tool behavior provider中定义。
须要覆写tool behavior provider中的一个方法:
The method getContextButtonPad has to return the context buttons for the given context (which implement IContextButtonEntry).
(3) 有如下几类context button:
① Generic context buttons:对于所有工具,该类按钮外观和行为都是标准化的,如delete、remove、update。显示在图元的上边缘,有个特殊的工具可以选择显示或隐藏哪一个。(0~3个)
② Domain specific context buttons:他们是针对每个工具的,显示在图元右边缘和下边缘。外观和行为必须自定义。(0~5个)
③ Collapse context button: 对于所有工具,该类按钮外观和行为都是标准化的,必须定义一个特定的工具,通过定义调用功能来定义按钮的行为(createCollapseContextButton)。(0~1个)
每个context button可以有一个点击的功能和几个拖放功能(连接线),当同时存在多个拖放feature时,会有一个context-menu提示用户选择某个feature执行。
1.3 Providing a Context Menu
Context Menu定义在tool behavior provider中。通过覆写方法getContextMenu创建返回context menu。
1.4 Palette
图形编辑器的调色板提供工具来在创建连接线和图元对象。
1.4.1 有许多不同类型的调色板:
这是一个容器,工具通过调用addToolEntry可以把图标放到不同的隔间(compartment)里,隔间可以展开和关闭。
(2) ConnectionCreationToolEntry
这个工具可以让用户在两个对象之间创建连接线,通过在源对象和目标对象上拖放。它也可以(如果启用)在画布上画连接线,在这种情况下,一个新的目标对象将被创建。可以添加任意数量的create connection features到此工具。如果你添加一个create connection feature,那么这个功能在光标放下时将被直接执行。如果你提供一个以上的连接功能,在光标放下时会弹出菜单,其中包含所有功能,用户可以选择一个来执行。
这个工具可以让用户在图中使用create connection feature来创建对象
(4) StackEntry
一个堆栈可以包含任意数量的creation tools(而不是直接create feature)属于语义结合的。用户可以在下拉列表中选择堆栈上已激活的creation tools。
Figure: Drop down list (on the left expanded) of the stack
1.4.2 Creating a Palette
在tool behavior provider中调用getPalette方法创建并返回一个palette。
DefaultToolBehaviorProvider类中已经默认实现了两个compartment,一个是放connection的,一个是放置用户的creature feature。
1.5 双击行为
双击行为定义在tool behavior provider中。通过覆写方法getDoubleClickFeature返回custom feature为给定的上下文执行双击行为。
1.6 Providing Rendering Decorators
当前活跃的图元上的一些修饰,这些修饰只是暂时的出现。Rendering Decorators定义在tool behavior provider中。通过覆写方法getDecorators给图元返回一个修饰,修饰必须实现接口IDecorator(和ILocation)。
graphiti支持以下装饰:
① ImageDecorators: 在定义的位置显示一个图标,并且可以给图标添加tooltips。
② ColorDecorators: 使图形显示不同的背景色和前景色。
③ BorderDecorators:使图元的边框线以不同的颜色、宽度等·风格显示。
1.7 Providing Tooltips
当光标在激活的图元上时,会显示工具提示。Tooltips需要定义在tool behavior provider中。通过覆写方法getToolTip给绘图算法返回一个工具提示。
由于工具提示是绑定到域模型的业务对象上的,业务对象中的每一个变化将自动更新工具提示。
1.8 Selection Behavior
(1) 介绍
由于技术原因Graphiti中看上去分散的图形其实仍然被一个不可见的边框包围着。对一个选中的内部图形的移动缩放动作同时也会作用在它的不可见的外边框上。当点击任一内部图形时,都在同一图形上出现handle-bounds表示其被选中。
我们要改变的layout feature的布局方法。
能够被选中的区域(selection-area)是在tool behavior provider中定义的.通过覆写getSelectionBorder方法创建并返回一个定义了selection-handle的graphics algorithm。通过覆写getClickArea创建并返回一个复合的graphics algorithm,其中定义了可被鼠标点击激活的selection-area。
1.9 创建属性页( Property Sheet)
使用注册标签式(tabbed分页式)属性表的标准Eclipse扩展点来构建属性页。然后,在plugin.xml中附加到插件org.eclipse.ui.views.properties.tabbed上。
[使用标准的eclipse属性页也是可以的,这样的话需要在DiagramEditor
的getAdapter()
方法中
提供一个org.eclipse.ui.views.properties.PropertySheetPage
替代默认的org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage(ITabbedPropertySheetPageContributor)]
(eclipse的属性也介绍http://help.eclipse.org/juno/index.jsp?nav=%2F22)
(1) 必须在plugin.xml添加一些声明: propertyContributor. propertyTab, propertySection。contributorId计算格式:Diagram.getDiagramTypeId()+”.PropertyContributor”。 getDiagramTypeId()即diagramType.type的属性值。
(2) 必须通过扩展类AbstractPropertySectionFilter和覆盖的方法accept实现一个过滤器类。
(3) 必须实现的属性节类(section),该类使用SWT控件创建标签UI显示。可以由类GFPropertySection扩展。
1.10 使用风格/样式(styles)
样式style是图形属性(颜色,线宽,...)的容器,它可以与一个图形算法相关联。一种样式可以有一个父样式,可以“继承”它的图形属性(类似级联样式表)。
具体图形属性的值是由查找到的第一个非空值确定的,按下列顺序查找(0.8与0.9有区别):
① 图形算法本身
② 如果没有父样式,则使用该样式
③ 如果存在父样式,则分配父样式给图形算法
样式不能“覆写”图形算法的已存在的属性值,图形算法的样式应该是被分配的。这使得它特别适合在冲突中使用,如果属性值已被设为一个图形算法的默认值。默认值是由框架设定的,其中一些是在元模型中设置的。为了避免上述混乱,在图形算法的中引入了"createPlain"-methods方法,用这些方法创建的图形算法没有默认值。所有值都必须显式设置,并记录在编码中。建议使用这种方式。
当许多图形算法关联相同的风格时,它有几个优点:
① 当某风格的图形属性值改变时,所有的图形算法将使用这种新的风格重新绘制
② 有工具可以提供一组预定义的风格供用户可以选择(类似于“主题”可用在很多程序)
③ 避免相同的信息被冗余存储
1.10.1 创建样式工具类
(1) 把style以给定的ID存放在diagram中。并提供查找和获取style的方法。
(2) 在Add Feature的add方法中把样式关联到图形算法中。在之前绘图算法中直接放置图形属性的地方。
1.11 Color Schemas
Graphiti支持设置多层次颜色和渐变色等复杂的颜色模式。并且支持根据当前的互动状态(选中、选中多个、拖拽等),改变背景颜色。这些复杂的背景颜色定义在RenderingStyle类中,但前景色并不在其中,并且RenderingStyle与style没有关系。
1.11.1 使用预定义的颜色
一个RenderingStyle只有AdaptedGradientColoredAreas类型的属性adaptedGradientColoredAreas,它必须是PredefinedColoredAreas中预定义的颜色之一。使用形如PredefinedColoredAreas.getBlueWhiteGlossAdaptions()的方法可以获取颜色样式.
1.11.2 使用自定义的颜色
扩展接口IPredefinedRenderingStyle来定义自己的颜色(ID)。
扩展类PredefinedColoredAreas为自己的颜色定义颜色区域。
1.12 使用自定义属性
在一个类型对应多种图形展示的情况下,我们需要一种工具来区分独立于关联的业务对象的图形。
所有的图符要素都提供了将用户定义的属性(键-值对)附加到其上的能力。
创建一个属性实用工具类
1.12.1 创建一个属性工具类
在创建的add feature中创建。在layout feature中检查这个用户定义的属性,判断是否为期望的图元。
辅助方法setPropertyValue和getPropertyValue,可以轻松地访问属性值。
在Add Feature的add方法中把自定义的属性绑定到类型的图形上。
改变Layout Feature的canLayout方法,以便比较形状的自定义属性。