- 浏览: 214397 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
teacodeing:
111
理解Java常量池 -
teacodeing:
122334455
理解Java常量池 -
最佳蜗牛:
有理有据,期待更多这样的文章。
理解Java常量池 -
ruijin5566:
cry615 写道zean 写道“在方法区中,而方法区是在JV ...
理解Java常量池 -
cry615:
zean 写道“在方法区中,而方法区是在JVM内存模型中的堆中 ...
理解Java常量池
1、问题:连接线旁边没有文字标签和箭头
文字标签:在gmfmap里的Connection Mappping下增加Label Mapping元素;箭头:在gmfgraph里为Polyline Connection指定一个Polyline Decorator作为source/target decoration,要为这个Decorator创建一些Template Point来决定箭头的形状,例如指定(-1,-1), (0,0), (-1,1)。
2、让一个图形可以在另一个图形里随意改变位置
在gmfgen里把作为容器的那个图形的Gen Compartment里把Listlayout属性改为false。
3、隐藏图形标签文字前的小图标
在gmfgen里把相应的Gen Node Label元素的Element Icon属性改为false(但重新生成gmfgen时这个属性会被覆盖)
4、让标签里同时显示和编辑多个属性
在gmfmap里把相应的Label Mapping元素的View Pattern属性改为类似“属性1:{0},属性2:{1}”的形式。
5、问题:跨Compartment进行连线操作时会创建两条连线
GMF的bug,见https://bugs.eclipse.org/bugs/show_bug.cgi?id=148021,在你的XXXDiagramCanonicalEditPolicy里覆盖方法:
protected boolean shouldHandleNotificationEvent(Notification event) {
return false;
}
6、让Label出现在图元外面
在gmfgraph里定义这个Figure时把Label定义在外面,而非定义为Figure的子元素。
7、在gmfgraph里设置一个Figure使用GridLayout后生成的代码无法正确编译
GMF的bug,见https://bugs.eclipse.org/bugs/show_bug.cgi?id=133279
8、改变Figure的缺省大小
在gmfgraph里为Figure增加Preferred Size子元素;若想让图形尺寸小于40x40象素,要覆盖XXXEditPart里的createNodePlate()方法。在GMF2.0里,使用DefaultSizeFacet,见http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg01546.html
9、禁止用户修改图元的尺寸
在gmfgraph里将此Node的Resize Constraint属性值改为“NONE”(但size-on-drop功能仍存在,也就是用户仍然可以在创建时指定尺寸)。
10、让Compartment在容纳不下子图形时自动显示滚动箭头
在genmodel的GenDiagram元素里改Units属性为“himetric”(经测试对GMF1.0不起作用),见https://bugs.eclipse.org/bugs/show_bug.cgi?id=140789
11、为画布Canvas指定Layout
GMF1.0不支持,需要手工改代码,见https://bugs.eclipse.org/bugs/show_bug.cgi?id=139951
12、Border Item
Border Item是指只能紧贴其他图元运动的图形,GMF1.0可通过打patch实现这个功能,见https://bugs.eclipse.org/bugs/show_bug.cgi?id=124826;GMF2.0开始支持。
13、规定连接线的约束,例如规定source和target不能是同一对象
在gmfmap里定义,在Link Mapping元素下定义Link Constraint元素,缺省使用OCL,见教程http://wiki.eclipse.org/index.php /GMF_Tutorial_Part_2#Link_Constraints;不论使用OCL或是Java,在 XXXBaseItemSemanticEditPolicy里会生成LinkConstraint类,在生成command前检查是否满足这些 constraint。
14、Audit
定义的constraint出现在com.your.diagram项目的plugin.xml里,作为constraintProvider扩展;为了让这些constraint生效,要在gmfgen的Gen Diagram元素里设定Validate Enabled/Decorator属性值为true,并将优先级(Validation Provider Priority, Validation Decorator Provider Priority)设定为medium(非lowest)才会在Diagram菜单里出现Validate命令。
若是在gmfmap里选择使用Java验证,则在gmfmap里指定的是一个Java方法名,生成代码后,应在XXXValidationProvider类里应实现这个方法。
15、GMF里从EditPart得到Semantic Model
因为GMF里EditPart#getModel()方法得到的是Notation Model里的对象,如Node或Edge,所以可以使用这样的方法得到真正的业务对象: ((org.eclipse.gmf.runtime.notation.View) EditPart.getModel()).getElement()或ViewUtil.resolveSemanticElement(view)
16、问题:从gmfgen生成代码时产生java.lang.ClassCastException: org.eclipse.jdt.internal.core.jdom.DOMMethod
删除原先生成的代码中无法编译的类,重新生成。
17、在gmfgraph里定义Polyline的图形
在Rectangle上画Polyline,注意是固定大小的
18、问题:每次重新生成代码后,在plugin.xml里的修改会丢失
GMF1.0里生成代码时不能保留plugin.xml里的任何修改,从GMF2.0开始用户可以在plugin.xml里标记不要覆盖的区域
19、问题:Outline树视图里的节点没有图标
在plugin.xml里找到org.eclipse.gmf.runtime.emf.type.core.elementTypes扩展点,在下面相应的元素里指定icon属性,见http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg00341.html,但我在GMF1.0里测试不起作用,何况每次生成代码时这个文件都会被覆盖。
20、问题:提示java.lang.IllegalStateException: Cannot modify resource set without a write transaction异常
在GMF里修改Model要通过在TransactionalEditingDomain里执行命令完成,GMF提供的RecordingCommand是不错的选择,它为我们提供了Undo支持,我们只要实现执行部分的代码就可以了,下面是一个例子:
TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(myElement);
domain.getCommandStack().execute(new RecordingCommand(domain) {
@Override
protected void doExecute() {
//Do anything
}
});
若是在EditPolicy里需要返回一个Command,用下面的代码:
AbstractTransactionalCommand command = new AbstractTransactionalCommand(TransactionUtil
.getEditingDomain(myElement), "Command Name", Collections.EMPTY_LIST) {
@Override
protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info)
throws ExecutionException {
//Any modification to the model
return CommandResult.newOKCommandResult();
}
};
21、问题:创建图元时提示异常“java.lang.IllegalArgumentException: Figure must be a child”
Workaround:注释掉产生异常的setRatio()方法里的全部内容。
22、问题:在AbstractBorderItemEditPart子类的getPrimaryDragEditPolicy()方法里提示ClassCastException异常
在gmfgraph里检查作为BorderItem的那个Node的Resize Constraint属性是否改过,若为缺省的NSEW则对应的editpart不会生成这个方法,对BorderItem(即Affixed Node Side属性不为NONE的Node)来说这个属性虽然设置为NSEW也无法改变大小。相关链接:https://bugs.eclipse.org/bugs/show_bug.cgi?id=155698
23、如何禁用PopupBar和ConnectionHandler功能(鼠标停止在图形上时出现的连线符号)
在需要禁用该功能的EditPart的createDefaultEditPolicies()方法的最后加下面的语句:
//禁用PopupBar
removeEditPolicy(EditPolicyRoles.POPUPBAR_ROLE);
//禁用ConnectionHandler
removeEditPolicy(EditPolicyRoles.CONNECTION_HANDLES_ROLE);
24、使用ConnectionHandler连接到canvas上已存在的图形或创建新的图形
覆盖XXXModelingAssistantProvider里的几个get方法,要连接到已存在的图形覆盖 getRelTypesOnSourceAndTarget()方法,创建新的作为源的图形覆盖getRelTypesOnSource()和 getTypesForTarget()方法,创建新的作为目标的图形应覆盖getRelTypesOnTarget()和 getTypesForSource()方法。具体代码可参考LogicModelingAssistantProvider里的实现。
25、给画布加背景图
http://www.cnblogs.com/bjzhanghao/archive/2007/03/13/673273.html
BTW, 以上所有问题只针对GMF1.0,GMF2.0的gmfmap模型和gmfgen模型与前一版本有所不同,一些问题可能也在GMF2.0里不存在了。
26、使用Label作为一个editpart的figure
在.gmfgraph里不用创建Node,只用Diagram Label即可;在.gmfmap里,Node Mapping的Diagram Node属性指定为这个Diagram Label,下面的Feature Label Mapping的Diagram Label属性也是这个Diagram Label。在parent使用ListLayout的时候这个方法比较有用。GMF的mindmap例子里的ThreadItem就是这样一个例子。
27、若类A包含B和C,且C继承B,则试图让A的图形同时包含B和C会造成运行时异常,异常信息是无法创建C的View,可能是GMF目前版本的bug。解决办法是建立抽象类D,让B和C都继承D,并且让A包含D。(update 2007/7/23: 有一点像这个bug,异常信息差不多)
28、用渐变色填充非矩形图形
覆盖图形的fillShape()方法,利用swt的Path,但draw2d的graphics对它的支持似乎不好。http://dev.eclipse.org/newslists/news.eclipse.tools.gef/msg13928.html
29、(这条实际是关于EMF的,anyway)为TableViewer增加Drag and Drop支持
非常简单,见下面的代码(tv是TreeViewer的一个实例)
int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance() };
tv.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(tv));
tv.addDropSupport(dndOperations, transfers, new EditingDomainViewerDropAdapter(editingDomain, tv));
30、从EObject得到TransactionalEditingDomain
TransactionalEditingDomain editingDomain = TransactionUtil.getEditingDomain(eobject);
31、让Label换行
.gmfgraph里无法指定Label是否换行,要修改生成的代码:
fFigureXXXFigure = new WrapLabel();
fFigureXXXFigure.setTextWrap(true);//add this line
fFigureXXXFigure.setText("<>");
另外可以在.gmfgraph里指定需要的布局以便让换行Label更好的显示。给Label设置Margin Border会有问题(Label被推向右侧),可以给Parent图形设置Margin Border,或建一个RectangleFigure来实现设置文字边距的需求。
32、定制Project Exploerer里显示的内容
修改.gmfgen里Gen Navigator节点下面的元素,见http://wiki.eclipse.org/index.php/GMF_Tutorial_Part_4#Project_Navigator
33、可缩放的多边形
在.gmfgraph里定义为Scalable Polygon,和普通Polygon一样要定义template points,每个点的坐标绝对值不是关键,但它们之间的位置关系要保证。我发现绝对值定义得大一些时,得到的结果会更精确。下面是一个可缩放菱形的定义:
<descriptors name="ConditionFigure">
<actualFigure xsi:type="gmfgraph:ScalablePolygon" name="MyDiamondFigure">
<template x="200" y="0"/>
<template x="0" y="200"/>
<template x="200" y="400"/>
<template x="400" y="200"/>
<template x="200" y="0"/>
</actualFigure>
</descriptors>
34、生成的RCP应用里,保存操作后经常提示“the file has been modifying on the file system...”信息。
GMF太“聪明”了,每次save后都要记录文件修改的timestamp,一旦发现不符则认为有其他程序修改了这个文件。要让RCP应用不检查当前编辑的文件是否被其他程序修改,可覆盖XXXDocumentProvider的isSynchronized()方法,让它直接“return super.isSynchronized(element);”。(但要小心,这有可能造成用户的修改无法被保存的情况。)
35、生成的GMF应用程序里,打印功能是禁用状态。
打开.gmfgen文件,修改Gen Plugin的"Printing Enabled"属性为true,再重新生成代码。这样除了 Print变为可用外,GMF还会生成一个XXXContributionItemProvider类在主菜单上添加Print Preview选项。 http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg02207.html
36、(实际是Eclipse OCL问题)脱离Eclipse环境使用OCL时,报异常java.lang.NoClassDefFoundError: lpg/lpgjavaruntime/RuleAction
Eclipse OCL依赖lpg库(LALR parser generator,使用EPL协议),在RCP里使用OCL需要把net.sourceforge.lpg.lpgjavaruntime这个插件加在dependencies列表里。参考链接
37、(还是OCL问题)Eclipse OCL实现里,OCL语句里各集合类型与ecore里集合类型的映射:
Collection Type isUnique isOrdered
Bag N N
Sequence N Y
Set Y N
OrderedSet Y Y
所以,如果一个EList在ecore里定义为Unique且Ordered(即缺省定义)时,在OCL里应该用OrderedSet类型,例如:XXX->allInstances()->asOrderedSet()或OrderedSet{object1, object2},等等。
38、在画布上创建一个元素(包括连接)后根据当前模型状态自动设置某属性值:
(GMF允许通过多种语言如ocl、regexp和java来实现初始值的设置,这里以java为例)在xxx.gmfmap文件里,找到这个元素对应的Mapping节点(如Node Mapping或Link Mapping),点右键新建一个Feature Seq Initializer元素,在这个元素上点右键再新建一个Feature Value Spec元素,设置后者的Feature为想要设置的类型,语言选java,在Body属性里输入一个方法名,例如 “initialMyFeature”。重新生成.gmfgen和代码,GMF会在名为ElementInitializers.java的文件里生成 initialMyFeature()这个空壳方法,实现它即可。
39、新建向导结束后,生成一个非空的模型文件。(Customize新创建的模型文件)
修改XXXDiagramEditorUtil#createInitialModel()方法。
40、在partition diagram里,从shortcut到一个正常节点间的连线在关闭editor后再次打开时丢失(2008.1.4)
原因不明,暂时的解决方法是注释掉XXXCanonicalEditPolicy#refreshConnections()方法里的deleteViews(existingLinks.iterator()),其中XXX代表link元素的父元素,例如Diagram。(这个解决方法有严重问题,会造成Initialize Diagram时丢失全部连接)。新探索出来的解决方法如下,覆盖XXXCanonicalEditPolicy#sholdDeleteView()方法:
/** *//**
* @generated NOT
*/
protected boolean shouldDeleteView(View view) {
if(view instanceof Edge){
Edge edge = (Edge)view;
View sourceView = edge.getSource();
View targetView = edge.getTarget();
if(sourceView.getEAnnotation("Shortcut")!=null
|| targetView.getEAnnotation("Shortcut")!=null){
return false;
}
}
return true;
}
41、删除右键菜单里不需要的菜单项
在plugin.xml里声明contributionItemProviders扩展点,在popupContribution下指定如下元素:
<popupPredefinedItem id="autoSizeAction"remove="true"/>
一些GMF Runtime定义的ID:deleteFromModelAction, navigateGroup, fileMenu, toolbarArrangeAllAction, addGeoShapesGroup, addGeoShapes2Group
详见org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds
42、在单独的编辑窗口里编辑子图(Diagram Partitioning)
http://wiki.eclipse.org/Diagram_Partitioning
43、在单独的项目(非GMF生成的xxx.diagram项目)里扩展DiagramEditor能识别的adapter类型:
在单独项目的Activator的start()方法里用类似下面的代码,这样就不需要直接修改生成的XXXDiagramEditor#getAdapter()方法了(因为我们希望把定制的内容尽量放在生成的项目以外):
//Register adapters for ERM reports and charts
Platform.getAdapterManager().registerAdapters(new IAdapterFactory() {
/** *//**
* @see org.eclipse.core.runtime.IAdapterFactory
*/
public Object getAdapter(Object adaptableObject, Class adapterType) {
ErmDiagramEditor editor = (ErmDiagramEditor) adaptableObject;
Process process = (Process) editor.getDiagram().getElement();
if (adapterType == IRiskImportancePage.class) {
return new RiskImportancePage(process);
} else if (adapterType == IRiskDrillDownPage.class) {
return new RiskDrillDownPage(process);
}
return null;
}
/** *//**
* @see org.eclipse.core.runtime.IAdapterFactory
*/
public Class[] getAdapterList() {
return new Class[] { IRiskImportancePage.class, IRiskDrillDownPage.class };
}
}, ErmDiagramEditor.class);
文字标签:在gmfmap里的Connection Mappping下增加Label Mapping元素;箭头:在gmfgraph里为Polyline Connection指定一个Polyline Decorator作为source/target decoration,要为这个Decorator创建一些Template Point来决定箭头的形状,例如指定(-1,-1), (0,0), (-1,1)。
2、让一个图形可以在另一个图形里随意改变位置
在gmfgen里把作为容器的那个图形的Gen Compartment里把Listlayout属性改为false。
3、隐藏图形标签文字前的小图标
在gmfgen里把相应的Gen Node Label元素的Element Icon属性改为false(但重新生成gmfgen时这个属性会被覆盖)
4、让标签里同时显示和编辑多个属性
在gmfmap里把相应的Label Mapping元素的View Pattern属性改为类似“属性1:{0},属性2:{1}”的形式。
5、问题:跨Compartment进行连线操作时会创建两条连线
GMF的bug,见https://bugs.eclipse.org/bugs/show_bug.cgi?id=148021,在你的XXXDiagramCanonicalEditPolicy里覆盖方法:
protected boolean shouldHandleNotificationEvent(Notification event) {
return false;
}
6、让Label出现在图元外面
在gmfgraph里定义这个Figure时把Label定义在外面,而非定义为Figure的子元素。
7、在gmfgraph里设置一个Figure使用GridLayout后生成的代码无法正确编译
GMF的bug,见https://bugs.eclipse.org/bugs/show_bug.cgi?id=133279
8、改变Figure的缺省大小
在gmfgraph里为Figure增加Preferred Size子元素;若想让图形尺寸小于40x40象素,要覆盖XXXEditPart里的createNodePlate()方法。在GMF2.0里,使用DefaultSizeFacet,见http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg01546.html
9、禁止用户修改图元的尺寸
在gmfgraph里将此Node的Resize Constraint属性值改为“NONE”(但size-on-drop功能仍存在,也就是用户仍然可以在创建时指定尺寸)。
10、让Compartment在容纳不下子图形时自动显示滚动箭头
在genmodel的GenDiagram元素里改Units属性为“himetric”(经测试对GMF1.0不起作用),见https://bugs.eclipse.org/bugs/show_bug.cgi?id=140789
11、为画布Canvas指定Layout
GMF1.0不支持,需要手工改代码,见https://bugs.eclipse.org/bugs/show_bug.cgi?id=139951
12、Border Item
Border Item是指只能紧贴其他图元运动的图形,GMF1.0可通过打patch实现这个功能,见https://bugs.eclipse.org/bugs/show_bug.cgi?id=124826;GMF2.0开始支持。
13、规定连接线的约束,例如规定source和target不能是同一对象
在gmfmap里定义,在Link Mapping元素下定义Link Constraint元素,缺省使用OCL,见教程http://wiki.eclipse.org/index.php /GMF_Tutorial_Part_2#Link_Constraints;不论使用OCL或是Java,在 XXXBaseItemSemanticEditPolicy里会生成LinkConstraint类,在生成command前检查是否满足这些 constraint。
14、Audit
定义的constraint出现在com.your.diagram项目的plugin.xml里,作为constraintProvider扩展;为了让这些constraint生效,要在gmfgen的Gen Diagram元素里设定Validate Enabled/Decorator属性值为true,并将优先级(Validation Provider Priority, Validation Decorator Provider Priority)设定为medium(非lowest)才会在Diagram菜单里出现Validate命令。
若是在gmfmap里选择使用Java验证,则在gmfmap里指定的是一个Java方法名,生成代码后,应在XXXValidationProvider类里应实现这个方法。
15、GMF里从EditPart得到Semantic Model
因为GMF里EditPart#getModel()方法得到的是Notation Model里的对象,如Node或Edge,所以可以使用这样的方法得到真正的业务对象: ((org.eclipse.gmf.runtime.notation.View) EditPart.getModel()).getElement()或ViewUtil.resolveSemanticElement(view)
16、问题:从gmfgen生成代码时产生java.lang.ClassCastException: org.eclipse.jdt.internal.core.jdom.DOMMethod
删除原先生成的代码中无法编译的类,重新生成。
17、在gmfgraph里定义Polyline的图形
在Rectangle上画Polyline,注意是固定大小的
18、问题:每次重新生成代码后,在plugin.xml里的修改会丢失
GMF1.0里生成代码时不能保留plugin.xml里的任何修改,从GMF2.0开始用户可以在plugin.xml里标记不要覆盖的区域
19、问题:Outline树视图里的节点没有图标
在plugin.xml里找到org.eclipse.gmf.runtime.emf.type.core.elementTypes扩展点,在下面相应的元素里指定icon属性,见http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg00341.html,但我在GMF1.0里测试不起作用,何况每次生成代码时这个文件都会被覆盖。
20、问题:提示java.lang.IllegalStateException: Cannot modify resource set without a write transaction异常
在GMF里修改Model要通过在TransactionalEditingDomain里执行命令完成,GMF提供的RecordingCommand是不错的选择,它为我们提供了Undo支持,我们只要实现执行部分的代码就可以了,下面是一个例子:
TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(myElement);
domain.getCommandStack().execute(new RecordingCommand(domain) {
@Override
protected void doExecute() {
//Do anything
}
});
若是在EditPolicy里需要返回一个Command,用下面的代码:
AbstractTransactionalCommand command = new AbstractTransactionalCommand(TransactionUtil
.getEditingDomain(myElement), "Command Name", Collections.EMPTY_LIST) {
@Override
protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info)
throws ExecutionException {
//Any modification to the model
return CommandResult.newOKCommandResult();
}
};
21、问题:创建图元时提示异常“java.lang.IllegalArgumentException: Figure must be a child”
Workaround:注释掉产生异常的setRatio()方法里的全部内容。
22、问题:在AbstractBorderItemEditPart子类的getPrimaryDragEditPolicy()方法里提示ClassCastException异常
在gmfgraph里检查作为BorderItem的那个Node的Resize Constraint属性是否改过,若为缺省的NSEW则对应的editpart不会生成这个方法,对BorderItem(即Affixed Node Side属性不为NONE的Node)来说这个属性虽然设置为NSEW也无法改变大小。相关链接:https://bugs.eclipse.org/bugs/show_bug.cgi?id=155698
23、如何禁用PopupBar和ConnectionHandler功能(鼠标停止在图形上时出现的连线符号)
在需要禁用该功能的EditPart的createDefaultEditPolicies()方法的最后加下面的语句:
//禁用PopupBar
removeEditPolicy(EditPolicyRoles.POPUPBAR_ROLE);
//禁用ConnectionHandler
removeEditPolicy(EditPolicyRoles.CONNECTION_HANDLES_ROLE);
24、使用ConnectionHandler连接到canvas上已存在的图形或创建新的图形
覆盖XXXModelingAssistantProvider里的几个get方法,要连接到已存在的图形覆盖 getRelTypesOnSourceAndTarget()方法,创建新的作为源的图形覆盖getRelTypesOnSource()和 getTypesForTarget()方法,创建新的作为目标的图形应覆盖getRelTypesOnTarget()和 getTypesForSource()方法。具体代码可参考LogicModelingAssistantProvider里的实现。
25、给画布加背景图
http://www.cnblogs.com/bjzhanghao/archive/2007/03/13/673273.html
BTW, 以上所有问题只针对GMF1.0,GMF2.0的gmfmap模型和gmfgen模型与前一版本有所不同,一些问题可能也在GMF2.0里不存在了。
26、使用Label作为一个editpart的figure
在.gmfgraph里不用创建Node,只用Diagram Label即可;在.gmfmap里,Node Mapping的Diagram Node属性指定为这个Diagram Label,下面的Feature Label Mapping的Diagram Label属性也是这个Diagram Label。在parent使用ListLayout的时候这个方法比较有用。GMF的mindmap例子里的ThreadItem就是这样一个例子。
27、若类A包含B和C,且C继承B,则试图让A的图形同时包含B和C会造成运行时异常,异常信息是无法创建C的View,可能是GMF目前版本的bug。解决办法是建立抽象类D,让B和C都继承D,并且让A包含D。(update 2007/7/23: 有一点像这个bug,异常信息差不多)
28、用渐变色填充非矩形图形
覆盖图形的fillShape()方法,利用swt的Path,但draw2d的graphics对它的支持似乎不好。http://dev.eclipse.org/newslists/news.eclipse.tools.gef/msg13928.html
29、(这条实际是关于EMF的,anyway)为TableViewer增加Drag and Drop支持
非常简单,见下面的代码(tv是TreeViewer的一个实例)
int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance() };
tv.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(tv));
tv.addDropSupport(dndOperations, transfers, new EditingDomainViewerDropAdapter(editingDomain, tv));
30、从EObject得到TransactionalEditingDomain
TransactionalEditingDomain editingDomain = TransactionUtil.getEditingDomain(eobject);
31、让Label换行
.gmfgraph里无法指定Label是否换行,要修改生成的代码:
fFigureXXXFigure = new WrapLabel();
fFigureXXXFigure.setTextWrap(true);//add this line
fFigureXXXFigure.setText("<>");
另外可以在.gmfgraph里指定需要的布局以便让换行Label更好的显示。给Label设置Margin Border会有问题(Label被推向右侧),可以给Parent图形设置Margin Border,或建一个RectangleFigure来实现设置文字边距的需求。
32、定制Project Exploerer里显示的内容
修改.gmfgen里Gen Navigator节点下面的元素,见http://wiki.eclipse.org/index.php/GMF_Tutorial_Part_4#Project_Navigator
33、可缩放的多边形
在.gmfgraph里定义为Scalable Polygon,和普通Polygon一样要定义template points,每个点的坐标绝对值不是关键,但它们之间的位置关系要保证。我发现绝对值定义得大一些时,得到的结果会更精确。下面是一个可缩放菱形的定义:
<descriptors name="ConditionFigure">
<actualFigure xsi:type="gmfgraph:ScalablePolygon" name="MyDiamondFigure">
<template x="200" y="0"/>
<template x="0" y="200"/>
<template x="200" y="400"/>
<template x="400" y="200"/>
<template x="200" y="0"/>
</actualFigure>
</descriptors>
34、生成的RCP应用里,保存操作后经常提示“the file has been modifying on the file system...”信息。
GMF太“聪明”了,每次save后都要记录文件修改的timestamp,一旦发现不符则认为有其他程序修改了这个文件。要让RCP应用不检查当前编辑的文件是否被其他程序修改,可覆盖XXXDocumentProvider的isSynchronized()方法,让它直接“return super.isSynchronized(element);”。(但要小心,这有可能造成用户的修改无法被保存的情况。)
35、生成的GMF应用程序里,打印功能是禁用状态。
打开.gmfgen文件,修改Gen Plugin的"Printing Enabled"属性为true,再重新生成代码。这样除了 Print变为可用外,GMF还会生成一个XXXContributionItemProvider类在主菜单上添加Print Preview选项。 http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg02207.html
36、(实际是Eclipse OCL问题)脱离Eclipse环境使用OCL时,报异常java.lang.NoClassDefFoundError: lpg/lpgjavaruntime/RuleAction
Eclipse OCL依赖lpg库(LALR parser generator,使用EPL协议),在RCP里使用OCL需要把net.sourceforge.lpg.lpgjavaruntime这个插件加在dependencies列表里。参考链接
37、(还是OCL问题)Eclipse OCL实现里,OCL语句里各集合类型与ecore里集合类型的映射:
Collection Type isUnique isOrdered
Bag N N
Sequence N Y
Set Y N
OrderedSet Y Y
所以,如果一个EList在ecore里定义为Unique且Ordered(即缺省定义)时,在OCL里应该用OrderedSet类型,例如:XXX->allInstances()->asOrderedSet()或OrderedSet{object1, object2},等等。
38、在画布上创建一个元素(包括连接)后根据当前模型状态自动设置某属性值:
(GMF允许通过多种语言如ocl、regexp和java来实现初始值的设置,这里以java为例)在xxx.gmfmap文件里,找到这个元素对应的Mapping节点(如Node Mapping或Link Mapping),点右键新建一个Feature Seq Initializer元素,在这个元素上点右键再新建一个Feature Value Spec元素,设置后者的Feature为想要设置的类型,语言选java,在Body属性里输入一个方法名,例如 “initialMyFeature”。重新生成.gmfgen和代码,GMF会在名为ElementInitializers.java的文件里生成 initialMyFeature()这个空壳方法,实现它即可。
39、新建向导结束后,生成一个非空的模型文件。(Customize新创建的模型文件)
修改XXXDiagramEditorUtil#createInitialModel()方法。
40、在partition diagram里,从shortcut到一个正常节点间的连线在关闭editor后再次打开时丢失(2008.1.4)
原因不明,暂时的解决方法是注释掉XXXCanonicalEditPolicy#refreshConnections()方法里的deleteViews(existingLinks.iterator()),其中XXX代表link元素的父元素,例如Diagram。(这个解决方法有严重问题,会造成Initialize Diagram时丢失全部连接)。新探索出来的解决方法如下,覆盖XXXCanonicalEditPolicy#sholdDeleteView()方法:
/** *//**
* @generated NOT
*/
protected boolean shouldDeleteView(View view) {
if(view instanceof Edge){
Edge edge = (Edge)view;
View sourceView = edge.getSource();
View targetView = edge.getTarget();
if(sourceView.getEAnnotation("Shortcut")!=null
|| targetView.getEAnnotation("Shortcut")!=null){
return false;
}
}
return true;
}
41、删除右键菜单里不需要的菜单项
在plugin.xml里声明contributionItemProviders扩展点,在popupContribution下指定如下元素:
<popupPredefinedItem id="autoSizeAction"remove="true"/>
一些GMF Runtime定义的ID:deleteFromModelAction, navigateGroup, fileMenu, toolbarArrangeAllAction, addGeoShapesGroup, addGeoShapes2Group
详见org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds
42、在单独的编辑窗口里编辑子图(Diagram Partitioning)
http://wiki.eclipse.org/Diagram_Partitioning
43、在单独的项目(非GMF生成的xxx.diagram项目)里扩展DiagramEditor能识别的adapter类型:
在单独项目的Activator的start()方法里用类似下面的代码,这样就不需要直接修改生成的XXXDiagramEditor#getAdapter()方法了(因为我们希望把定制的内容尽量放在生成的项目以外):
//Register adapters for ERM reports and charts
Platform.getAdapterManager().registerAdapters(new IAdapterFactory() {
/** *//**
* @see org.eclipse.core.runtime.IAdapterFactory
*/
public Object getAdapter(Object adaptableObject, Class adapterType) {
ErmDiagramEditor editor = (ErmDiagramEditor) adaptableObject;
Process process = (Process) editor.getDiagram().getElement();
if (adapterType == IRiskImportancePage.class) {
return new RiskImportancePage(process);
} else if (adapterType == IRiskDrillDownPage.class) {
return new RiskDrillDownPage(process);
}
return null;
}
/** *//**
* @see org.eclipse.core.runtime.IAdapterFactory
*/
public Class[] getAdapterList() {
return new Class[] { IRiskImportancePage.class, IRiskDrillDownPage.class };
}
}, ErmDiagramEditor.class);
发表评论
-
修改GMF属性视图
2008-07-09 17:11 2553上图中紫色的椭圆结点在ecore模型中代 ... -
GMF:基于Reference的连接
2008-07-09 17:10 1758GMF中的Link有两个,分别是基于Type的和基于Refer ... -
GMF编辑器中图元的前景色,字体,线条宽度的定制方法
2008-07-09 17:09 1929要让GMF编辑器中的图元更加生动,可以通过在gmfgraph中 ... -
Graphical Modeling Framework简介
2008-06-25 11:16 2328Graphical Modeling Framework简 ... -
给GMF应用程序添加自定义Action
2008-06-24 17:01 2417假设GMF为你生成的项目名称为com.example.dia ... -
15 分钟学会 Eclipse GMF
2008-06-23 15:07 22772006 年 11 月 27 日 本文介绍了 Graphica ... -
Graphical Modeling Framework 进阶
2008-06-23 10:18 20392007 年 2 月 28 日 基于 EMF 和 GEF,Gr ... -
基于 GMF 的流程分析工具的设计与实现
2008-06-20 16:05 3374本文在 GMF2.0 的基础上,用一个自上而下的流程分析建模工 ... -
XML Schema学习笔记和注解-(转)
2008-06-20 11:20 1999XML Schema学习笔记和注解-(转) 1、复杂类型和 ... -
gmf学习笔记
2008-06-20 11:18 2088刚刚接触eclipse的这些概念,着实有点头晕现在总算对这一部 ... -
用gmf实现业务模型编辑器
2008-06-20 10:15 2978用gmf实现业务模型编辑器 过去用Graphical Edit ... -
GMF Tutorial中文版
2008-06-20 09:41 5985前言:本文源自Eclipse网站GMF子项目的同名实例文档。虽 ... -
GMF中控制Figure的大小和位置
2008-06-20 09:32 1973在GMF中当使用XYLayout时经常会遇到这样的问题: 1 ...
相关推荐
4. **编辑操作**:GMF能够自动处理常见的编辑操作,如拖放、剪切、复制、粘贴、撤销和重做等。 5. **代码生成**:开发者只需关注模型定义,GMF会自动生成大部分的Java代码,减少了手动编码的工作量。 6. **可扩展...
因此,结合EMF(Eclipse Modeling Framework)构建后台模型成为了一种常见策略,然而EMF与GEF的整合并非易事。 在此背景下,GMF(Graphical Modeling Framework)应运而生,作为GEF和EMF的进一步封装,它提供了一个...
常见的可能包括移动设备、物联网(IoT)设备、智能家居、穿戴设备等,具体的应用场景可能包括触控识别、指纹识别、传感器数据处理等。 3. **产品型号总览**:这部分将列出GMF03x系列的不同型号,每种型号可能有特定的...
在IT行业中,补丁是一种常见的更新形式,它们是程序员为解决已知问题或改进现有代码而编写的代码片段。在这个案例中,“gmf”可能是一个特定项目或库的缩写,而“补丁”则是对该GMF进行的调整。 【描述】:虽然提供...
6. **最佳实践和常见问题**:分享一些在开发过程中需要注意的事项,以及可能遇到的问题及其解决方案。 标签中的“源码”和“工具”暗示这篇博客可能涵盖了代码示例和使用GMF开发工具的技巧。 压缩包中的文件名似乎...
【GMF】是一种在软件开发领域中常见的技术缩写,尤其在Python编程环境中,它可能代表着"Generic Mapping Functions"(通用映射函数)或者“Game Map Format”(游戏地图格式)。在这里,我们主要讨论它与Python环境...
4. 转基因大豆、水稻、玉米和马铃薯等常见农作物的出现,引发了消费者对食品安全的关注。不同的公司和组织有着不同的立场,这反映在他们的口号和宣传中。 5. 全球对转基因食品的态度不一,大部分欧洲国家持谨慎或...
A0702GMF+GH REV4驱动板是京瓷2010打印机的特定版本,可能包含针对特定问题的修复或优化。维修MCU(微控制器单元)备份是为了预防可能出现的硬件故障,通过备份可以迅速恢复到正常工作状态,减少停机时间。 卡刷包...
通过对齿轮箱常见故障的振动信号进行分析,可以有效地诊断出潜在的问题所在。特别是利用齿轮啮合频率及其侧带的变化趋势,结合时间波形分析和磨损颗粒分析等手段,能够更加精准地定位故障类型和发展程度。这对于预防...
GMF_WinSh 是一个专为 Windows 操作系统设计的简单命令处理器,它扩展了标准的 Windows 命令提示符(CMD)的功能,提供了一种更高效、更易用的方式来执行常见命令和任务。该项目可能由 C 语言编写,这使得它具有较高...
比如,可以增加支持多进程共享内存、动态调整页大小、优化页面替换算法等功能,这些都是实际操作系统中常见的内存管理策略。 总结,GMF_VMMan是学习虚拟内存管理的理想工具,它以直观的方式揭示了虚拟内存管理的...
- Bash(Bourne-Again SHell)是最常见的Shell类型,也是GMF_Shell可能使用的环境。 - Shell脚本是一种程序设计语言,允许用户编写包含一系列命令的文件,一次性执行这些命令。 2. **Shell语法** - 变量:在...
它可能采用了常见的调度算法,如轮转调度(Round Robin)、优先级调度(Priority Scheduling)或者是简单优先级非抢占式调度。这些算法的选择取决于项目的需求和性能目标。 在"GMF_Sched-master"这个压缩包中,我们...
它可能涵盖了从分析现有编辑器到生成和测试GMF编辑器的全过程,包括具体步骤、最佳实践和常见问题的解决方案。 总之,"中国Eclipse社区开发资料整理"中的这个主题对于Eclipse开发者来说是一个宝贵的学习资源,它...
本文主要探讨了常见的三级运算放大器架构的优缺点,特别关注了极点和零点对性能的影响。极点和零点是决定运算放大器频率响应的关键因素,它们决定了增益、稳定性和带宽。 首先,我们来看看两级运放采用的SMC补偿...
- 官方文档通常会提供详细的安装指南和常见问题解答,这些都是解决问题的重要资源。 总之,安装ADT插件时遇到报错是很常见的现象,但只要按照上述步骤仔细排查,大部分问题都能够得到解决。希望上述信息对您有所...
转子不对中是另一个常见的问题,它会导致2X频率的出现,轴心轨迹呈香蕉形或8字形,轴向振动显著。通过对中调整可以解决这个问题。此外,还有平行不对中、角度不对中和综合不对中三种类型,每种类型的不对中都会在...
本文将详细介绍如何搭建一个适用于Android应用开发的基础环境,并针对在使用Eclipse过程中遇到的一些常见问题提供解决方案。 #### 二、所需工具与资源 1. **JDK (Java Development Kit)** - **版本要求**:至少...
在进行Android开发时,使用Eclipse作为集成开发环境(IDE)是非常常见的选择之一。但是,在配置过程中可能会遇到各种各样的问题,特别是当安装ADT(Android Development Tools)插件时出现问题,如文中所提到的...
H3C 防火墙产品 Web配置指导(V7)-6W401不仅包括常见功能简介,还详细介绍了主要特性和典型配置含图指导,适用于以下机型: F5030-DF5060-DF5080-DF5000-AK515F5000-AK525 E9620 F5030F5030-6GWF5060F5080F5000-...