`
huwenbiao2010
  • 浏览: 1962 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

消除Eclipse RCP快捷键定义冲突之终极法

阅读更多
快捷键的数量是有限的,何况Eclipse预定义了为数不少的快捷键,所以你开发的RCP程序自定义的快捷键与Eclipse默认定义出现冲突是寻常情况,这时候如何让我们自定义的快捷键优先被接受?方法有几种,在此,我向大家介绍一种万全之策。
    一般给Action绑定快捷键的方法是自定义binding和command。例如我们实现了文件保存的动作代码,将这个动作与快捷键CTRL+S绑定,我们在该应用的plugin.xml文件中添加了以下代码:
    <extension
          point="org.eclipse.ui.bindings">
        <key
              commandId="miner.file.save"
              schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
              sequence="CTRL+S">
        </key>
    </extension>

    <extension
          point="org.eclipse.ui.commands">
        <command
              id="miner.file.save"
              name="Save">
        </command>
    </extension>


    一般情况下,如上XML片段绑定的快捷键都可以正常使用。但是遇到快捷键冲突,就像org.eclipse.ui插件已经提供了一个Ctrl+S的快捷键,按下Ctrl+S将不能如我们所愿直接激活miner.file.save动作。遇到这种情况,我们可以选择改用另一个快捷键,也可以自定义动作的 commandId,将miner.file.save改成org.eclipse.ui.file.save。因为在Eclipse默认定义里,CTRL+S是与org.eclipse.ui.file.save绑定的,我们自定义了org.eclipse.ui.file.save的新实现。以上两种方法都不甚便利,最理想的解决之道是下面的自定义schema办法。
    注意到,在之前定义的bindings用到的schemaId都是 org.eclipse.ui.defaultAcceleratorConfiguration,这个schema存储了Eclipse用到的所有默认快捷键。为何我们不自定义一个自己的schema文件,并把它设成当前使用的schema文件,那么Eclipse就会调用自定义的schema文件。且看下面修改后的plugin.xml片段:

    <extension
          point="org.eclipse.ui.bindings">
        <scheme
            id="miner.accelerator"
            name="myAccelerator"
            parentId="org.eclipse.ui.defaultAcceleratorConfiguration">
       </scheme>

        <key
              commandId="miner.file.save"
              schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
              sequence="CTRL+S">
        </key>
    </extension>

    <extension
          point="org.eclipse.ui.commands">
        <command
              id="miner.file.save"
              name="Save">
        </command>
    </extension>


    miner.accelerator是一个新的schema文件,它在org.eclipse.ui.bindings扩展点中定义。请注意,在定义新 schema的时候有一个parentID属性,如果定义了它,新的schema会像类继承一样把parent schema里面的key binding全继承下来。如果不定义,则是一个全新的schema。
    至此是否大功告成?不行,还差重要的一步——让新建的schema文件生效。这需要plugin配置文件的支持,过程有些复杂,我简要的介绍三个实现步骤。RCP新手希望更深入的理解,可以从网上搜索RCP product配置方面的知识。
    1. 新建一个plugin配置文件,遵循习惯,我们将这个文本文件命名为 plugin_customization.ini;
    2. 在上述配置文件中加入以下语句:
        org.eclipse.ui/KEY_CONFIGURATION_ID=miner.accelerator
    KEY_CONFIGURATION_ID属性指示你将激活的schema;
    3. 在plugin.xml中加入product扩展,将这个扩展的preferenceCustomization属性值赋予plugin_customization.ini。就如以下的XML片段:
<extension id="product" point="org.eclipse.core.runtime.products">
   <product application="miner.application" name="miner">
      <property name="preferenceCustomization" value="plugin_customization.ini">
      </property>
   </product>
</extension>



这种方法虽然麻烦了一点,但它标本兼治,我搜索了不少资源,经过自己的实践确认它确实可行
分享到:
评论
7 楼 huwenbiao2010 2010-07-14  
    private String getInputFileName(IApplicationContext context)
    {
        String[] arguments = (String[])context.getArguments()
            .get(IApplicationContext.APPLICATION_ARGS);
        if ((arguments != null) && (arguments.length > 0))
        {
            return arguments[arguments.length - 1];
        }
        else
        {
            return null;
        }
    }
6 楼 huwenbiao2010 2010-07-13  
的快捷键只对特定的视图或者编辑器起作用,那么可以通过org.eclipse.ui.contexts扩展点来自定义上下文
5 楼 huwenbiao2010 2010-07-13  
IContextService contextService = 
(IContextService) getSite().getService(IContextService.class);
contextService.activateContext("viewmenu.testcontext");
4 楼 huwenbiao2010 2010-07-02  
popup:视图的ID?after=某个已存在的菜单项的ID
menu:myview_id?after=additions或menu:myview_id?after=已存在的菜单项ID

Treeviewplug.views是包名称,SampleTreeView是外部类名,TreeParent是SampleTreeView类的一个内嵌类。
<with variable="selection">
     <iterate ifEmpty="false"  operator="or">
         <instanceof                                                           value="treeviewplug.views.SampleTreeView$TreeParent">
          </instanceof>
     </iterate>
</with>
//注册到workbench的selectionProvider,才可以使用visibleWhen/enableWhen的selection变量来控制visible和enable
getSite().setSelectionProvider(viewer);
3 楼 huwenbiao2010 2010-07-02  
MenuManager menuMgr = new MenuManager("#PopupMenu");
        menuMgr.setRemoveAllWhenShown(true);
       
        // viewControl是要显示弹出菜单的控件,如TreeViewer控件
        Menu menu = menuMgr.createContextMenu(tableViewer.getControl());
        tableViewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, tableViewer);
2 楼 huwenbiao2010 2010-07-02  
testaa
1 楼 huwenbiao2010 2010-06-29  
Q: RCP中屏蔽了系统快捷键如Ctrl+C, Ctrl+V, Ctrl+P等, 改如何解除它?

A: Eclipse 3.0之前的版本使用如下方法:

    IWorkbench.getContextSupport().setKeyFilterEnabled(false);

    Eclipse 3.0之后的版本使用如下的方法:

    ((IBindingService)IWorkbench.getAdapter(IBindingService.class)).setKeyFilterEnabled(false);

相关推荐

    Eclipse RCP 软件打包发布方法

    Eclipse Rich Client Platform (RCP) 是一个强大的框架,用于构建桌面应用程序。它提供了一整套工具和功能,使得开发者可以构建出具有丰富用户界面的应用。在开发完成后,我们需要将这些应用打包并发布,以便用户...

    Eclipse rcp深入浅出中英文版及配套代码

    11. **扩展点(Extension Points)**:这是Eclipse RCP插件系统的关键特性,允许插件之间通过定义和使用扩展点来相互协作。 12. **案例研究和实践**:书中的配套代码(samples.zip)提供了实际的示例,帮助读者将...

    eclipse rcp应用系统开发方法与实战源代码.zip

    Eclipse RCP,全称Eclipse Rich Client Platform,是一种基于Java的开源框架,用于构建桌面应用程序。它由Eclipse基金会维护,是Eclipse IDE的核心组成部分,提供了丰富的UI组件、插件系统以及工作台(Workbench)...

    eclipse RCP Plug-in开发自学教程.pdf

    eclipse RCP Plug-in开发自学教程 eclipse RCP(Rich Client Platform)是一种基于eclipse的插件式开发平台,允许开发者使用eclipse结构风格设计弹性的可扩展的应用程序。RCP插件式开发方式可以重用eclipse中的方法...

    Eclipse RCP.pdf清晰版

    ### Eclipse RCP 入门详解 #### 一、Eclipse RCP 概述 **Eclipse RCP**(Rich Client Platform)是一种构建丰富客户端应用程序的框架,它利用Eclipse平台的强大功能来创建高度定制化的桌面应用程序。通过RCP,...

    EclipseRCP教程

    Eclipse RCP 的视图机制是其核心机制之一,提供了多种视图类型和视图之间的交互机制。在 Eclipse RCP 中,视图可以是以下几种类型: 1. Part:Eclipse RCP 的基本视图单元,提供了基本的用户界面元素。 2. View:...

    EclipseRcp 例子程序

    6. **命令与快捷键**:Eclipse RCP提供了命令框架,允许自定义用户操作,如菜单项和快捷键。例子程序会展示如何定义、注册和绑定这些命令。 7. **服务(Service)**:Eclipse RCP支持服务导向的架构,通过服务,...

    Eclipse RCP培训.zip

    11. **插件开发**:开发Eclipse RCP应用涉及创建插件项目、定义插件依赖、编写插件XML配置文件,以及实现具体业务逻辑。 12. **调试与测试**:Eclipse RCP提供强大的调试工具,如插件调试器,可以帮助开发者定位和...

    Eclipse Rcp

    Eclipse RCP是一种基于Eclipse平台的富客户端平台技术,它允许开发者创建独立于Eclipse环境的Java桌面应用程序。RCP通过提供一套标准组件和API,简化了桌面应用程序的开发流程,使开发者能够专注于业务逻辑而非界面...

    Eclipse RCP(富客户端平台)开发中文语言包_3.6.0.rar

    Eclipse RCP(Rich Client Platform)是Eclipse IDE的一个核心组成部分,它提供了一个框架和工具集,用于构建桌面应用程序。Eclipse RCP允许开发者利用Java和SWT(Standard Widget Toolkit)构建功能丰富的、可定制...

    ECLIPSE+RCP应用系统开发方法与实战(PDF 高岗著)

    《ECLIPSE+RCP应用系统开发方法与实战》这本书是高岗先生关于使用Eclipse RCP(Rich Client Platform)进行应用系统开发的一本实战指南。Eclipse RCP是Eclipse IDE的一部分,它提供了一个框架,使得开发者可以构建...

    eclipse RCP mp3工程

    【标题】"eclipse RCP mp3工程"指的是一个基于Eclipse Rich Client Platform(RCP)构建的专门处理MP3音频文件的应用程序。Eclipse RCP是一个强大的开发框架,允许开发者创建桌面应用,它提供了丰富的用户界面组件和...

    菜鸟EclipseRCP学习之路

    "菜鸟Eclipse RCP学习之路"这个主题显然针对的是初学者,旨在引导他们逐步掌握如何使用Eclipse RCP进行软件开发。 首先,Eclipse RCP的核心概念是插件(Plugins)。每个插件代表应用程序的一个模块,它们通过OSGI...

    Eclipse RCP 插件开发指南

    Eclipse RCP(Rich Client Platform)插件开发是构建基于Eclipse框架的应用程序的核心技术之一。本指南旨在帮助开发者从零开始掌握Eclipse RCP插件开发的基础知识及实战技巧。 ##### Introduction Eclipse RCP 是...

    Eclipse RCP开发详解

    Eclipse Rich Client Platform (RCP) 是一个强大的框架,用于构建桌面应用程序,它基于Java语言并利用了Eclipse IDE的核心技术。Eclipse RCP允许开发者创建功能丰富的、可扩展的应用程序,这些应用程序拥有与Eclipse...

    documents about Eclipse RCP

    Eclipse Rich Client Platform (RCP) 是一个强大的框架,用于构建桌面应用程序。它基于Java,由Eclipse基金会维护,是Eclipse IDE的核心组成部分。RCP允许开发者利用已有的插件系统构建可定制、模块化的应用,具有...

    Eclipse RCP详细教程

    Eclipse RCP的核心特性之一是它的灵活性和可扩展性。这种灵活性体现在多个方面,例如通过插件机制可以轻松地添加新功能或修改现有行为。此外,Eclipse RCP还支持多种UI组件和技术,如Swing和SWT,这使得开发者可以...

    Eclipse RCP与Spring OSGi技术详解与最佳实践

    《Eclipse RCP与Spring OSGi:技术详解与最佳实践》由资源的Eclipse专家亲自执笔,并得到了Eclipse官方技术社区的强烈推荐,权威性毋庸置疑!内容全面,系统讲解了利用Eclipse RCP和Spring OSGi开发大规模Java应用的...

    Eclipse Rcp comon Navigator demo

    Eclipse RCP(Rich Client Platform)是一个开源框架,用于构建桌面应用程序。Common Navigator是Eclipse RCP中的一个重要组件,它提供了一种通用的资源浏览和管理界面。在本"Common Navigator demo"中,我们将深入...

Global site tag (gtag.js) - Google Analytics