`
yiliner
  • 浏览: 214591 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

给GMF应用程序添加自定义Action

    博客分类:
  • GMF
阅读更多

假设GMF为你生成的项目名称为com.example.diagram,现在要在右键菜单里增加一个自定义命令,并关联在名为Activity的模型元素上,即只有在Activity类型的元素上点右键,弹出菜单里才有这个自定义命令。此命令的功能是简单的把该Activity的Name属性改为“Modified Activity”。实现的步骤如下:

1、如果之前没有创建过,则创建一个名为com.example.diagram.custom的plugin项目(以下简称为“custom项目”),新建这个项目的目的是把自己的定制与GMF生成的代码分开;

2、在custom项目里实现org.eclipse.ui.popupMenus扩展点,这样会在右键菜单里多出一个"Change"菜单项,下面有"Name"命令;

 
<!----><extension
         
point="org.eclipse.ui.popupMenus">

  
<objectContribution
        
adaptable="false"

        id
="com.example.custom.objectContribution.ActivityEditPart"
        objectClass
="com.example.diagram.edit.parts.ActivityEditPart">
     
<menu
           
id="BMAChange"

           label
="&amp;Change"
           path
="additions">
        
<separator name="group1"/>
     
</menu>
     
<action
           
class="com.example.diagram.popup.ChangeActivityNameAction"

           enablesFor
="1"
           id
="com.example.diagram.popup.ChangeActivityNameAction"
           label
="&amp;Name"
           menubarPath
="BMAChange/group1"/>
  
</objectContribution>
</extension>
 

3、实现上一步里定义的Action类ChangeActivityNameAction,这个类不仅要实现 IObjectActionDelegate(popupMenus扩展点的要求),还要继承自AbstractActionDelegate这个类(GMF的要求)。我们要做的是实现doRun()方法,首先取得当前选中的editpart,然后创建一个SetRequest实例,它包含了改变属性操作的所有信息,包括目标对象、属性的名字和新属性值。因为GMF里editpart的getModel()方法不是业务模型里的元素了,而是View对象,要再调用View#getElement()才能得到业务模型里的元素,所以代码里我们利用 ViewUtil#resolveSemanticElement()方法直接得到Activity对象。另外,GMF使用了EMFT的 Transaction项目来操作模型,所以editpart.getEditingDomain()方法得到的会是一个 TransactionalEditingDomain类型。

有了request,我们用它作为构造参数创建一个SetValueCommand(),这是一个GMF命令(实现 org.eclipse.gmf.runtime.common.core.command.ICommand),用来改变属性值。最后要执行这个命令,我们知道command是要用CommandStack来执行的,这样才能undo/redo,但 editpart.getDiagramEditDomain().getDiagramCommandStack()得到的CommandStack只能执行GEF的命令(org.eclipse.gef.commands.Command),所以要把我们的command用 ICommandProxy()包装一下,这样就没问题了。

<!---->public class ChangeActivityNameAction extends AbstractActionDelegate 
                
implements
 IObjectActionDelegate {

    
protected void
 doRun(IProgressMonitor progressMonitor) {

        
// Get the selected edit part

        IStructuredSelection structuredSelection = getStructuredSelection();
        Object selection 
=
 structuredSelection.getFirstElement();
        IGraphicalEditPart editpart 
=
 (IGraphicalEditPart) selection;

        
// Create a command to modify its property

        SetRequest request = new SetRequest(
                editpart.getEditingDomain(),
                ViewUtil.resolveSemanticElement((View) editpart.getModel()),
//The semantic model 

                BmaPackage.Literals.ACTIVITY__NAME,//Name feature of activity
                "Modified Activity");//New name value
        SetValueCommand command = new SetValueCommand(request);

        
//Do the work

        editpart.getDiagramEditDomain().getDiagramCommandStack().execute(new ICommandProxy(command));

    }
}

Update: 可以用IGraphicalEditPart#resolveSemanticElement()直接取得editpart对应的 EObject,IGraphicalEditPart#getNotationView()是得到View对象,和getModel()作用一样。

运行效果如下,选择修改名字命令后,Activity1的名字改为Modified Activity,并且可以undo/redo:


参考:

  • GMF提供的Logic例子中CreateLogicElementActionDelegate.java文件
  • GMF Tips,Change Names Of Newly Created Elements小节
  • GMF Tutorial Part 3

Update(2007/07/17):似乎GMF更推荐使用IOperationHistory来修改模型,例如在Action的doRun()方法里像下面这样写:

<!---->AbstractTransactionalCommand command = new AbstractTransactionalCommand(
        editingDomain,
        
"Modifying the model"
, Collections.EMPTY_LIST) { 
    
protected
 CommandResult doExecuteWithResult(
            IProgressMonitor monitor, IAdaptable info)
            
throws
 ExecutionException {
        
//在这里修改模型

        return CommandResult.newOKCommandResult();
    }
};
try
 {
    OperationHistoryFactory.getOperationHistory().execute(command,
            
new SubProgressMonitor(progressMonitor, 1), null
);
catch
 (ExecutionException e) {
    MindmapDiagramEditorPlugin.getInstance().logError(
            
"Unable to create model and diagram", e); //$NON-NLS-1$

}

因为在GMF新闻组里提到过:"in a GMF application, you should probably never execute commands in a CommandStack, because it will not be worth the effort of coordinating the IUndoContexts applied to these commands and your GMF AbstractTransactionalCommands to ensure that the Undo/Redo menus make sense.",原文链接

分享到:
评论

相关推荐

    gmf 1.7 最新版的gmf

    6. **可扩展性**:GMF设计灵活,可以方便地添加自定义行为和扩展,以满足特定项目需求。 在GMF 1.7版本中,可能包含以下改进: - **性能优化**:对图形渲染和编辑操作进行了优化,提高了响应速度和整体性能。 - **...

    图形建模框架GMF综述

    ### 图形建模框架GMF综述 #### 引言 在软件开发过程中,图形建模...无论是对于希望快速构建自定义建模工具的企业还是对于那些寻求深入研究图形建模技术的研究人员来说,GMF都是一个值得深入了解和探索的重要工具。

    GMF数据表建模例子

    GMF简化了创建自定义图形编辑器的过程,通过生成代码和编辑器组件,使得开发者可以专注于业务逻辑而不是底层实现。 2. **EMF和GEF**:EMF是Eclipse用于构建模型的基础,它提供了一种在Java中表示和操作结构化数据的...

    GMF教程.doc

    【GMF教程】GMF(Graphics Modeling Framework)是Eclipse平台下的一个图形...通过这个教程,读者可以了解到如何利用GMF构建一个简单的Mindmap图形编辑器,这对于理解GMF框架和开发自定义图形工具具有重要的实践意义。

    GMF Tutorial中文版

    总的来说,GMF Tutorial中文版是一个全面的指南,帮助开发者理解和掌握如何利用GMF构建强大的图形化应用程序。通过实例和详细的解释,教程不仅提供了理论知识,还提供了实践指导,对于想要涉足Eclipse建模领域的...

    org.eclipse.gmf.rar

    5. **动态加载和解析**:RAR支持在运行时动态加载和解析资源,这使得应用程序可以根据需要加载不同的模型和图形资源,提高了程序的灵活性和可扩展性。 6. **自定义行为**:开发者可以通过扩展RAR,实现特定的业务...

    GMF EMF

    GMF(Generic Modeling Framework)是Eclipse Modeling Framework (EMF)的一个扩展,它提供了一种通用的方法来构建基于模型的应用程序。GMF旨在简化图形用户界面(GUI)的开发,特别是那些涉及图表编辑和可视化任务...

    gmf例子

    它是一个基于Eclipse RCP(Rich Client Platform)的框架,提供了强大的图形用户界面(GUI)工具,使得开发者能够构建自定义的地图编辑器和地图应用程序。GMF的目标是简化地图应用程序的开发过程,通过提供图形化的...

    GMF Tourial中文版(一)

    - 本文档将通过开发一个名为**mindmap**的应用程序来展示GMF的功能。 - **mindmap**是一款基于GMF开发的思维导图应用,通过此案例可以深入了解GMF如何帮助开发者快速构建出直观易用的图形化编辑器。 #### 四、GMF...

    GMF相关资料

    学习如何使用`gmt makecpt`创建自定义颜色表,以及`gmt psimage`和`gmt psscale`等命令添加图像和比例尺,能够提升地图的专业性。 此外,GMF也支持脚本编写,可以利用Python或Bash等脚本语言将多个GMF命令组合成一...

    15 分钟学会 Eclipse GMF

    3. 扩展性:GMF支持自定义图形和行为,可以轻松扩展以满足特定需求。 4. 可视化设计:通过图形化的方式配置和设计编辑器,降低开发难度。 三、GMF工作流程 Eclipse GMF的工作流程通常分为以下几个步骤: 1. 模型...

    GMF实例解析(PDF版)

    通过重构Taipan应用程序或插件,开发者不仅可以掌握GMF的基本操作,还能探索其高级特性,如动态模型更新、定制编辑行为和扩展图形元素。 #### 结论:GMF——图形化编辑器的未来 GMF的出现极大地推动了图形化编辑器...

    eclipse gef ve gmf

    VE是Eclipse中的一个可视化编辑器项目,旨在提供一种直观的方式来创建和编辑Java Swing和 SWT/JFace 应用程序。它允许开发者通过拖放的方式设计GUI界面,而不是手动编写XML代码或使用复杂的布局管理器。VE支持多种...

    GMF实例解析.pdf

    Taipan是一个示例应用,用于演示如何使用GMF来构建一个完整的图形编辑器。在学习过程中,我们将了解从安装GMF到理解其设计思想,再到实现具体功能的全过程。 1. GMF 2.0与Taipan的安装 安装GMF及其所需组件需要...

    Eclipse插件 GMF

    4. **自定义编辑器**:根据需要对生成的代码进行调整,添加额外的功能或修改默认行为。 5. **打包和部署**:将编辑器集成到Eclipse插件中,打包并发布。 在Eclipse插件GMF中,你还可以利用EMF(Eclipse Modeling ...

    eclipse GMF 制作简单工作流流程设计器(3)

    作者 mjtfly 在其iteye博客上分享了这个教程,这可能意味着我们将看到有关Eclipse插件开发和GMF应用的实践步骤。 在压缩包的文件名列表中,我们看到以下几个关键组件: 1. `com.mjt.flow`: 这可能是项目的根包,...

    GMF介绍以及使用手册.rar

    在实践中,GMF的应用非常广泛,它可以用于构建UML模型编辑器、数据库设计工具、网络配置界面等各种图形化的应用程序。由于GMF是开源的,并且与Java紧密集成,因此它为开发者提供了丰富的API和社区支持。 总结来说,...

    GMF 开发文档

    域模型定义了应用程序的基本结构和元素。 - **域生成模型:** 在指定了域模型之后,下一步是创建一个域生成模型(点击“导出”按钮),这将在不久的将来让用户生成模型代码并进行编辑。 ##### 2.3 生成模型代码 - *...

Global site tag (gtag.js) - Google Analytics