八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  244 随笔 :: 0 文章 :: 3241 评论 :: 14 引用

通过org.eclipse.gmf.runtime.diagram.ui.editpolicyProviders扩展点可以给GMF应用里的editpart增加所需要的editpolicy,通过editpolicy返回的command,就可以自由的控制editpart的行为。顺便说一句,GMF Runtime之所以提供这许多扩展点,是为了允许通过其他插件工程对GMF生成的应用进行各种定制。

例如现在要对一个GMF程序里的名为Book的图形元素增加双击打开一个对话框,在对话框里修改模型属性的功能。最直接的办法是找到GMF生成的BookEditPart,覆盖performRequest()方法,判断request.getType()是否为RequestConstatns.REQ_OPEN,若是则打开一个对话框。但这样要求我们把代码写在GMF生成的插件项目里,如果考虑到有时要为第三方插件做扩展,我们无法修改它的代码的情况呢?

使用editpolicyProviders扩展点则无此限制,还是同样的需求,扩展点的方式步骤如下:

创建一个插件项目,并依赖生成的GMF应用和GMF相关依赖项(特别是org.eclipse.gmf.runtime.diagram.ui.providers),在plugin.xml的extensions里添加org.eclipse.gmf.runtime.diagram.ui.editpolicyProviders项,通过class属性指定一个Provider类。

 <extension
       point
="org.eclipse.gmf.runtime.diagram.ui.editpolicyProviders">
    
<editpolicyProvider
          
class="com.my.diagram.custom.MyEditPolicyProvider">
       
<Priority
             name
="Lowest">
       
</Priority>
    
</editpolicyProvider>
 
</extension>

这里定义的Provider要自己写,它应该实现IEditPolicyProvider接口,它的provide()方法根据传入的operation判断对相关的editpart是否需要创建editpolicy,若是则createEditPolicies()里用installEditPolicy()方法添加。下面的代码实现了双击打开对话框的需求:

public class MyEditPolicyProvider implements IEditPolicyProvider {

    
public void createEditPolicies(EditPart editPart) {
        editPart.installEditPolicy(EditPolicyRoles.OPEN_ROLE, 
new OpenConditionEditPolicy());
    }

    
public void addProviderChangeListener(IProviderChangeListener listener) {

    }

    
public boolean provides(IOperation operation) {
        
if (operation instanceof CreateEditPoliciesOperation) {
            EditPart editPart 
= ((CreateEditPoliciesOperation) operation).getEditPart();
            
if (editPart instanceof ConditionEditPart)
                
return true;
        }
        
return false;
    }

    
public void removeProviderChangeListener(IProviderChangeListener listener) {

    }

}

参考:

http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg05684.html
http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg00931.html

posted on 2007-08-16 22:04 八进制 阅读(4079) 评论(29)  编辑 收藏 网摘 所属分类: EclipseGMF

评论

这篇文章垃圾死了 怎么弄都 不对 作者你不要瞎写 党务大家时间
  回复  引用    

gmf里根本没有鼠标双击的事件 失败
  回复  引用    

#3楼[楼主] 2007-08-31 23:43 八进制      
能否说清楚些,鼠标双击确实产生REQ_OPEN类型的Request,这里的代码我测试过。
  回复  引用  查看    

我收回我说过的话,sorry。我弄出来了你说的对。扩展点那个好使 不过perform那个方法的就不行。
  回复  引用    

作者能不能留个你的联系qq什么的 有不会的问题请教你 你太强悍了 我qq540010726
  回复  引用    

#6楼 2007-09-03 18:05 z[未注册用户]
如何能把一个gmf项目生成一个rcp,使其能够独立运行?在gmf中有生成model的一个项目,一个edit,一个diagram,一个扩展的项目custom。在生成*.gen的时候,我已经选择了生成rcp。但是rcp运行时就不能读到custom中的东西了。
  回复  引用    

#7楼 2007-09-03 19:00 z[未注册用户]
思维有点混乱,可能问题描述不是很清楚。我的问题就是如何使一个gmf项目,转换为一个rcp项目,或是说一个独立运行的项目。非常期待您的答案。
  回复  引用    

#8楼[楼主] 2007-09-03 22:04 八进制      
在生成.gmfgen里选中"Generate RCP Application",然后自己建一个.product文件导出,在.product文件里要选中要导出的plugin。
  回复  引用  查看    

#9楼 2007-09-04 15:37 z[未注册用户]
看了你的rcp的帖子,我可以把简单的项目转成rcp了,谢谢。在gmf项目中,我用到的扩展点popupMenus,调用一个ChangeTaskNameAction类,改变Task的name,在调用这个扩展点时,可以从我写的xml文件中读到数据,但是在运行的rcp的窗口中不显示右键改变的值。这是什么原因呢?原来在gmf的项目中是好用的。
  回复  引用    

#10楼[楼主] 2007-09-04 20:48 八进制      
可能在RCP情况下action运行出错了,找找error log。
  回复  引用  查看    

#11楼 2007-09-05 09:12 z[未注册用户]
error log中没有任何信息。我读了一部份rcp的资料,我发现它在eclipse中好像就是一个宽展点,不知道我的理解有没有错误。想请教下,eclipse中一个扩展点想调用另外一个扩展点的信息应该怎么做。还是每个扩展点之间是不矛盾的。在rcp中用扩展点时应该怎么做?和在插件项目中有什么区别?八进制对gmf很关注,我想对我的问题应该也很感兴趣,希望可以通过其他的方式交流。同时非常感谢你的blog,对我的工作帮助很大。
  回复  引用    

#12楼[楼主] 2007-09-05 13:01 八进制      
另外一个方法是打开.product文件,在它的Overview页里选择Launch an Eclipse application in Debug mode,这样就可以在eclipse里调试了。按rcp方式打包得到的应用程序和eclipse没有本质区别,只是去掉了一些无用的插件,我一般只在最后需要独立运行程序的时候才打包,平时都在eclipse里像普通插件程序一样开发和调试。
  回复  引用  查看    

问一个几乎不可能 解决的问题 在gmf或者是rcp应用中 怎么把一个透视图添加到另外的一个弹出式的子窗体中呢 我想把那个图形属性视图添加到一个在双击图形后弹出的对话框中
  回复  引用    

new OpenConditionEditPolicy()
ConditionEditPart
你这个文章里的这两个类是哪来的 我程序里怎么没有这两个类呢

  回复  引用    

#15楼 2007-09-06 09:27 z[未注册用户]
谢谢,我打算rcp这部分以后在说。我现在遇到一个关于限制的问题,如果我在gmf中的连接是三种type,single,A,B。但是是single时,我所连接的button不想让它在能用A,B。两种连接还能连,我的限制应该在*.ecore中做还是在程序中实现,应该如何实现,希望可以给些好的意见。

  回复  引用    

#16楼[楼主] 2007-09-06 18:51 八进制      
可以用OCL实现,见"GMF常见问题"第13条http://www.cnblogs.com/bjzhanghao/archive/2006/10/26/541262.html" target="_new">http://www.cnblogs.com/bjzhanghao/archive/2006/10/26/541262.html
  回复  引用  查看    

#17楼 2007-09-07 11:36 z[未注册用户]
谢谢,我知道大致的方向了,现在正在正在research ocl。不知道八进制对ocl是否感兴趣,希望可以交流经验。
  回复  引用    

#18楼[楼主] 2007-09-07 14:04 八进制      
一般使用只要把语法搞清楚就差不多了,留一份OCL-Spec备查。
  回复  引用  查看    

#19楼 2007-09-07 18:55 z[未注册用户]
三告习习的blog你知道吗?他常去自己的blog吗?我看他好像对ocl比较感兴趣,而且和你很熟悉的样子。

  回复  引用    

双击事件是可以实现,不过要想在这个双击事件里改变模型的两个以上的属性就没有办法做到了
  回复  引用    

扩展editpolicyProviders扩展点没什么意义
  回复  引用    

#22楼[楼主] 2007-09-20 18:13 八进制      
1. 两个属性和n个属性有区别吗?
2. 不更改别人plugin的前提下要修改gmf应用程序的行为,我觉得必须通过editpolicyProviders和paletteProviders这些机制。

  回复  引用  查看    

#23楼 2007-10-31 20:15 soda[未注册用户]
S1:如果原有应用已经在EditPart里覆盖了performRequest方法,而该方法体里又没有执行super.performRequest(editPart),则外部添加的扩展EditPolicy无法执行他所返回的Command。
Q1:请问在这种情况下如何扩展特性?

S2:如果1中的应用覆盖了performRequest方法,并且执行了super.performRequest(editPart),则外部添加的EditPolicy返回命令的执行是由这条语句所调用的,那么意味着执行的顺序取决于原有应用的代码。
Q2:请问在这种情况下如何以不改动原有应用代码为前提,对请求事件的处理进行覆盖性的扩展?

谢谢。

  回复  引用    

#24楼[楼主] 2007-11-01 18:01 八进制      
第一个问题,你确定无法通过editpolicyProvider扩展editpart的行为?我没有试验过,我的理解是edtpolicyProvider所提供的editpolicy是注册在editpart上的,editpart在处理request时会让每个已注册editpolicy都有机会处理它,所以和performRequest()里是否调用super()方法应该没有关系。

第二个问题,如果是像上面机制的实现,super()的位置也就不会造成执行顺序的影响。

  回复  引用  查看    

#25楼 2008-02-25 22:37 Hper[未注册用户]
想问一个跟这个功能有点相关又不太一样的问题
你这里是通过双击一个节点打开一个对话框,然后修改它的属性。
我想做的是双击一个节点A,然后打开一个不同的图形编辑器,在新的编辑器里面进行进一步的建模,以体现它的层次关系,同时最好能把模型保存后的xml数据放在同一个文件里面。
现在两个不同层次的图形编辑器,单独建立两个gmf项目是不成问题的,困难在于如何将这两层给联系起来。
双击响应策略在你这篇里已经提到了,但后面怎么做就不知道了,好像涉及到共享editingdomain的问题。
请八进制大侠指教,或者给一些相关资料的链接。
谢谢。

  回复  引用    

#26楼[楼主] 2008-02-26 17:25 八进制      
GMF已经提供了子图编辑的功能,请参考http://wiki.eclipse.org/Diagram_Partitioning
现在的GMF在这个功能上还有一些小问题,其中一个问题在"GMF常见问题"第40条里我提供了一个解决方法供参考。http://www.cnblogs.com/bjzhanghao/archive/2008/01/29/541262.html" target="_new">http://www.cnblogs.com/bjzhanghao/archive/2008/01/29/541262.html

  回复  引用  查看    

#27楼 2008-06-24 20:48 mengl[未注册用户]
八进制大哥,如果我现在要用GMF实现一课树,在树的某个节点上可以通过修改这个节点的属性把这个节点collapse,通过一个toolbar button"page down"可以刷新当前editor显示为子树,并且在子树上的修改能够保存,通过一个toolbar button"page up"可以返回主树,这种"page down""page up"可以又很多层;有点类似于26楼新闻组提到的Opening a new diagram on double click diagram element ,但这种切换始终是在当前editor里而非打开新的editor。
以前没用过emf和gmf,感觉gmf的diagram模型和业务模型是同步的,有什么办法做到业务模型保存一个完整的树,而editor里只显示树的一部分这种么?因为感觉如果单纯为现实某个子树新构造一个model,无法做到子树上的修改保存到总的树上。
说得有点乱,八进制大哥有空的话能否指导1、2,或者新闻组里有类似的需求也行,我英语不太好,没找到

  回复  引用    

#28楼 2008-06-24 21:18 mengl[未注册用户]
还有GMF最后持久化好像是2个文件,一个纯业务模型,一个显示相关?
感觉像isCollapse这些属性应该保存在显示相关的那个文件里吧,但GMF的save机制始终不是太明白,所有的属性都是在ecore里定义的,save时也不用我们去添代码。但稍微改改model就得重新Generate代码,即使很熟悉gmf了,根据model修改手动去修改代码也很难的感觉,不太方便。

  回复  引用    

只这样好像不行啊,还需要覆盖在相应的EditPart 里的getTargetEditPart()方法;
public EditPart getTargetEditPart(Request request) {
if (RequestConstants.REQ_OPEN == request.getType())
return this.getHost();
return super.getTargetEditPart(request);
}

然后再

public Command getCommand(Request request) {
if (RequestConstants.REQ_OPEN == request.getType())
// RequestConstants.REQ_DIRECT_EDIT
// if (RequestConstants.REQ_DIRECT_EDIT == request.getType())
System.out
.println("RequestConstants.REQ_OPEN == request.getType()");

return null;
}

  回复  引用    

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 858923


历史上的今天:
2005-08-16 写代码的代码:JET

相关文章:

相关链接: