GMF常见问题(2)

2018-11-19 20:28

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 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 helper = ocl.createOCLHelper(); helper.setContext(SpmsPackage.Literals.SP_SERVICE_PLAN);

OCLExpression exp = helper.createQuery(metric.getFormula());//Seems this call is time costly

Query query = ocl.createQuery(exp); query.getEvaluationEnvironment().add(appContextVar.getName(),

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


GMF常见问题(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:课堂教学秩序整顿方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: