`

重定向Retarget Action 小结

阅读更多

根据资料系统整理、明确一下Retarget Action这个概念(以在GEF中的应用为例)。

概念

它是一种具有一定语义但没有实际功能的action。它唯一的作用是在主菜单或是主工具条上占据一个位置,编辑器将具有实际功能的action映射到这个Retarget Action上,当编辑器被激活时,这个Retarget action将具有那个action的功能。

举例,eclipse提供了IWorkbenchActionConstants.COPY这个retarget Action它的文字、图标登时预先定义好的,而ABCAction是一个具体的动作类,通过在某个editor getEditorSite().getActionBars().setGlobalActionHandler(IWorkbenchActionConstants.COPY, ABCAction)就实现了映射。

一般地,eclipse自带的actionredo/undo等)绑定到eclipse自带的常量id上。自己定义的action绑定到自己的常量id上。当然,也可以交叉。

Eclipse引入RetargetAction的目的是为了尽量减少菜单/工具条的重建消耗,利用用户使用上的一致性。

重定向操作分类

重定向的操作分为eclipse已定义的操作和未定义的操作,已定义的操作如redo/undo等;未定义的操作就是自己需要定义的操作。

重定向绑定id方式

1通过contributorClass的实现类,在该类内部的buildActions()方法中新建,并用addRetargetAction()方法绑定。

2不用buildActions内创建新类,隐含在GEFeditor内部的createActions()方法中调用super.createActions()也可以创建(对于非eclipse定义的操作,我们在createActions()中自己添加)。这时可以在contributorClass类的declareGlobalActionKey()方法通过调用addGlobalActionKey()来绑定。

3不利用contributorClass类,而在GEF的编辑器初始化时,在createActions()方法中创建action添加到actionRegistry中,并利用类似下面的代码绑定操作:

比如,在initializeGraphicalViewer()方法中通过getEditorSite().getActionBars()得到actionBars,并通过getActionRegistry()方法得到actionRegistry

//………

//准备从ActionRegistry中找actionId对应的处理动作

        ActionRegistry registry = getActionRegistry();

        //actionBar上按钮的重定向

        IActionBars bars = this.getEditorSite().getActionBars();

        IToolBarManager toolBarManager = bars.getToolBarManager();

        //actionid

        String id = ActionFactory.UNDO.getId();

        bars.setGlobalActionHandler(id, registry.getAction(id));

        //动作绑定到工具栏上

        toolBarManager.add(registry.getAction(id));

GEF编辑器菜单/工具条

与视图不同编辑器没有自己的菜单和工具条,它的菜单只能添加到主菜单内,因此在扩展编辑器的时候,元素有一个contributorClass属性。通过这个属性定义的类的buildActions()方法将菜单重定向到主菜单上。

    protectedvoid buildActions() {

        addRetargetAction(new UndoRetargetAction());

        addRetargetAction(new RedoRetargetAction());

        addRetargetAction(new DeleteRetargetAction());

 

    }

    publicvoid contributeToToolBar(IToolBarManager toolBarManager) {

        toolBarManager.add(getAction(ActionFactory.UNDO.getId()));

        toolBarManager.add(getAction(ActionFactory.REDO.getId()));

}

publicvoid contributeToMenu(IMenuManager menuManager)

    {

        super.contributeToMenu(menuManager);

        IMenuManager mgr = new MenuManager("&Node","Node");

        //插入到主菜单上编辑的后面

        menuManager.insertAfter(IWorkbenchActionConstants.M_EDIT, mgr);

        mgr.add(getAction(IConstants.ACTION_A));

        mgr.add(getAction(IConstants.ACTION_B));

        mgr.add(getAction(IConstants.ACTION_C));

 }

    /*

     * 对于已经有的Retarget Action,我们应该在这个方法中调用addGlobalActionKey()方法来声明

     * 当编辑器被激活时,在globalActionKeys中的id指向的action将被映射到regargetAction上。

     * 不再需要setGlobalActionHandler("id",handler).因此上面buildActions()中可以删除,变为下面形式

     */

    protectedvoid declareGlobalActionKeys() {

        addGlobalActionKey(ActionFactory.UNDO.getId());

        addGlobalActionKey(ActionFactory.REDO.getId());

        addGlobalActionKey(ActionFactory.DELETE.getId());

    }

创建自己的action

GEF内没有定义的相应的action,这些action是这个编辑器所独有的。假定,我们选择的3figure,要给这3figure统一设定优先级属性。即当选中这几个figure时,我们插入到主菜单中的设定优先级的action可用。

我们建立的action应该是gefSelectionAction的子类,因为我们需要对选中的figure操作。还需要将action添加到selectionActions中。

privatevoid createMyActions() {

        // subSelectionAction1应该是gefSelectionAction的子类

        IAction subSelectionAction1 = null;

        subSelectionAction1.setId("");

        getActionRegistry().registerAction(subSelectionAction1);

        getSelectionActions().add(subSelectionAction1.getId());

       

        IAction action2 = null;

        action2.setId("");

        getActionRegistry().registerAction(action2);

        getSelectionActions().add(action2.getId());

    }

这个selectionAction需要自己实现calculateEnabled()方法。另外,因为在GEF编辑器中的动作都是支持redo/undo的。因此我们需要在这个action.run()的时候创建命令并推入命令栈,action的运行是靠命令,而不是直接运行。如果选中的figure3个,可能需要创建3个命令,这时为执行redo/undo也能一次性操作,而不是一个一个的来,可能需要一个CompoundCommand.3个命令组合成一个命令。注意的是:在创建命令之前判断选中的figure对应的editpartgetSelectedObjects())是否是可以执行action的对象。

GEF编辑器上下文菜单

GEF Editor中的configureGraphicalViewer()方法中,添加代码

//右键菜单

        MyContextMenuProvider provider = new MyContextMenuProvider(getGraphicalViewer(), getActionRegistry());

        this.getGraphicalViewer().setContextMenu(provider);

即可。

其中MyContextMenuProvidergefcontexMenuProvider的子类(而contextMenuProviderjface.actionMenuManager的子类),我们需要实现buildContextMenu()方法,在该方法中一般第一句调用GEFActionConstantS.addStandardActionGroups(menu);以对上下文菜单项添加默认分组。然后将action添加到分组中(action复用actionRegistry中的action)。

分享到:
评论

相关推荐

    重定向动画工具:Retarget Pro v3.1.0

    Retarget Pro 革新了你的工作流程,使你能够快速且轻松地重定向动画,确保它们在所有角色之间看起来都很流畅。 不要让无聊的动画任务拖慢你的速度。获取 Retarget Pro,比以往任何时候都更高效! 准备好迎接改变...

    retarget.c文件

    1. **重定向函数**:retarget.c会包含重新定义的函数,如`_write()`和`_read()`,这些是C标准库中的低级别I/O接口。这些函数会被用来替换原始的硬件I/O操作,转而使用Semihosting协议与主机通信。 2. **Semihosting...

    STM32 C++开发必备的retarget.c文件

    ARM官方的retarget.c文件链接已经失效,给基于STM32 C++开发带来了不必要的麻烦,此处将原有的retarget.c上传,用于STM32 C++开发

    基于Seam Carving实现图像的重定位-计算机图像与图形技术大作业

    2.图像重定向(Retarget):将原图像重定向到指定尺寸,并保持主体内容完整且比例正常。 内容去除:指定一个矩形的内容,将该矩形内容从原图像中删除,并且尽可能保持其余部分维持原有形状。 而第五部分则包含两个...

    retarget.c,不使用microlib

    不使用microlib,添加FILE __stdout;FILE __stdin;后报错重复定义,删除添加的内容,添加次文件到工程

    nucleo-retarget-example:将 libc 重定向到 Nucleo 调试端口和 libopencm3

    将对象 retarget.o 添加到 OBJ 文件,它将添加一个构造函数( SystemInit() ),该函数将在 main 启动之前运行。 该函数初始化系统时钟、连接到 Nucleo 板调试部分的 UART 和 1kHz 系统“滴答”中断(这对计时等很...

    Retarget Pixel Helper-crx插件

    语言:English 通过AdSightPro重新定位Pixel助手 Retarget Pixel Helper是一种故障排除工具,可帮助您验证像素的实现。...单击扩展程序图标后,面板将展开以显示页面上包括的所有“自定义受众重定向目标像素”的列表。

    Eclipse菜单探密.doc

    在这个例子中,`DiagramActionBarContributor`构建了几个重定向动作(Retarget Actions),这些动作可以在不同上下文中应用,比如撤销、重做和删除。 总的来说,Eclipse提供了一套灵活的机制来创建和管理菜单与工具...

    计算机视觉大作业实验报告1

    2. **图像重定向(Retarget)**:先等比例放大图像,再用Seam Carving剪裁,以适应特定尺寸,保持视觉效果。 3. **内容去除**:通过标记特定区域的像素能量为负无穷,使得Seam穿过这些区域,从而实现内容删除。 **...

    Motion Retargeting for Virtual Human

    1. 虚拟人运动重定向概念:虚拟人运动重定向是计算机图形学中的一个概念,用于解决不同人体骨骼模型间的运动数据转换问题。这一技术让计算机能够将原始人物骨骼模型的运动数据转化为目标模型的运动数据,同时保持...

    audio-retargeting

    音频重定向 该存储库提供了一个名为retarget的 OS X 可执行文件,它演示了更改音乐长度的能力。 (它还包含 Python 源代码,适用于想要深入研究或在不同平台上运行的人;请参阅下面的文档安装详细信息) 下载...

    ARM嵌入式软件开发PPT学习教案.pptx

    可以通过查看ADS Embedded example目录下的retarget.c来消除C库函数中的semi hosting,以确保在连接时没有函数使用了semi hosting SWIs。 该PPT学习教案提供了ARM嵌入式软件开发的基础知识和技术,涵盖了嵌入式...

    Keil MDK环境下使用printf函数的解决方法 .txt

    因此,`printf()`函数的实现会寻找一个输出重定向的方法,如果没有找到合适的重定向,则会触发一个软件中断(SWI),导致程序卡在`SWI_Handler`函数中。 #### 解决方案 为了解决这个问题,我们需要对Keil MDK环境...

    ++test嵌入式测试.pdf

    Retarget.c文件通常用于重定向标准I/O流,如printf等函数,使其能够在嵌入式系统中正确工作。文档中提到了对Retarget.c的修改,具体做法是屏蔽intferror(FILE *f)函数,并添加退出函数: ```c void _sys_exit(int ...

    lpc54102 ifft ad5676 dac code_ripple_soilsv4_AD5676_lpc54102adc5

    这些文件共同构成了基于LPC54102的AD5676 DAC控制程序,其中Blinky.c可能是主程序入口,ad5676.c和ad5676.h包含了AD5676的驱动代码,Serial.c和Serial.h处理串行通信,Retarget.c可能用于重定向I/O流,Dbg_RAM.ini和...

    keil-ARM-STM32-firmware工程案例

    《基于Keil-ARM-STM32的固件工程实践指南》 在嵌入式开发领域,STM32系列微控制器以其丰富的资源和强大的性能深受广大开发者喜爱。而在基于ARM架构的STM32开发过程中,Keil μVision是一款常用且功能强大的集成开发...

Global site tag (gtag.js) - Google Analytics