`

重定向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.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穿过这些区域,从而实现内容删除。 **...

    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环境...

    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是一款常用且功能强大的集成开发...

    stm32+enc28j60的代码

    9. **重定向输入/输出**:`Retarget.c`可能用于将STM32的串口输出(如printf函数)重定向到特定的串口设备,便于调试信息的输出。 这些文件共同构成了一个基本的STM32与ENC28J60结合的以太网通信系统,开发者可以...

    mixamo_converter:Blender插件,用于将mixamo动画转换为虚幻4 rootmotion

    Mixamo转换器 是一个Blender插件,可将Mixamo动画转换为在需要Root Motion Blender 2.80或更高版本才能工作的虚幻引擎4中工作。... 您可以通过在3D视图中用鼠标或3D视图右侧的小箭头按N来打开它。在UI

Global site tag (gtag.js) - Google Analytics