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,异常信息差不多)
update 2008/10/09: 今天再次遇到了这个问题,复制异常信息如下以便查找:
org.eclipse.core.commands.ExecutionException: While executing the operation, an exception occurred at org.eclipse.core.commands.operations.DefaultOperationHistory.execute(DefaultOperationHistory.java:519) ...
Caused by: org.eclipse.core.runtime.AssertionFailedException: null argument:failed to create a view at org.eclipse.core.runtime.Assert.isNotNull(Assert.java:86)
at org.eclipse.gmf.runtime.diagram.ui.commands.CreateCommand.doExecuteWithResult(CreateCommand.java:99) ...
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,每个点的坐标绝对值不是关键,但它们之间的位置关系要保证。我发现绝对值定义得大一些时,得到的结果会更精确。下面是一个可缩放菱形的定义:
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的\属性为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 Bag Sequence Set OrderedSet isUnique N N Y Y isOrdered N Y N 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(\null
|| targetView.getEAnnotation(\null){ return false; } }
return true; }
41、删除右键菜单里不需要的菜单项
在plugin.xml里声明contributionItemProviders扩展点,在popupContribution下指定如下元素: remove=\ 一些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); 44. 允许创建shortcut 在.gmfgen的Gen Diagram元素的属性“Shortcuts Provided”和\里设置相应的model名字,然后重新生成代码,这样画布的右键菜单里将出现“Create Shortcut...”菜单项。参考http://wiki.eclipse.org/GMF_Tutorial_Part_2#Shortcuts 45. 提示“Cannot activate read/write transaction in read-only transaction context” 在editpolicy的getXXXCommand()里不能直接对模型进行操作,否则将提示上面的异常,应该返回一个 ICommandProxy(yourCommand) ,其中yourCommand一般继承自AbstractTransactionalCommand。参考http://dev.eclipse.org/mhonarc/newsLists/news.eclipse.modeling.gmf/msg04366.html 46. (实际是OCL问题)在ocl语句里增加预定义的变量,当变量是集合类型时,如何setType: OCL, EClassifier, ?, ?, ?, ?, ?, ?, ?, Constraint, EClass, EObject> ocl; ocl = OCL.newInstance(EcoreEnvironmentFactory.INSTANCE); //Customize this OCL environment Variable appContextVar = ExpressionsFactory.eINSTANCE.createVariable(); appContextVar.setName(\ EClassifier type = TypeUtil.resolveSequenceType(ocl.getEnvironment(), EcorePackage.Literals.ORDERED_SET_TYPE); appContextVar.setType(type); ocl.getEnvironment().addElement(appContextVar.getName(), appContextVar, true); try { OCLHelper OCLExpression Query SpmsResourceManager.getInstance().getCustomerModel().getCustomers()); Object object = query.evaluate(servicePlan); System.out.println(object); if (object instanceof Number) { result = ((Number) object).doubleValue(); } } catch (ParserException e) { e.printStackTrace(); } ocl.dispose(); 47、创建一个新的Diagram实例 GMF生成代码时同时生成了工具类XXXDiagramEditorUtil,调用XXXDiagramEditorUtil.createDiagram()即可创建新的Diagram实例。 (更多内容见GMF分类) 分类: GMF, Eclipse 绿色通道:好文要顶关注我收藏该文与我联系 八进制 关注 - 0 粉丝 - 9 关注博主 1 0 (请您对文章做出评价) ? 上一篇:让多个Viewer对应一个属性视图 ? 下一篇:RCP程序的启动进度条 posted on 2006-10-26 23:46 八进制 阅读(9268) 评论(102) 编辑 收藏 评论 评论共2页: 上一页 1 2