【问题标题】:How to disable mnemonics?如何禁用助记符?
【发布时间】:2010-01-24 08:34:28
【问题描述】:

我正在使用 Eclipse 插件基础架构扩展 Eclipse,但遇到了问题:

我创建了一个 Eclipse 编辑器,我想禁用 Eclipse 的助记菜单,例如:ALT + a 相当于菜单搜索。因为我的编辑器中需要这些组合(Alt + ...)。怎么办?

【问题讨论】:

    标签: eclipse-plugin mnemonics


    【解决方案1】:

    this thread推荐的:

    创建您自己的方案并添加您需要的键绑定。在自定义ini文件中添加这一行:

    org.eclipse.ui/KEY_CONFIGURATION_ID = <your scheme id>
    

    Keybindings

    alt text http://www.vogella.de/articles/EclipseCommands/images/keybinding30.gif

    作为Paul Webster puts it:

    您可以通过 3 种方式之一覆盖快捷方式

    1. 创建一个没有父级的新方案。然后,您可以根据需要定义任意数量的键绑定,因为您将看不到任何默认绑定。
    2. 使用默认方案父级创建一个新方案。您将继承所有默认键绑定,但您在方案中定义的任何键绑定都将优先(我认为 :)
    3. 在包含一些绑定的上下文之外创建一个子上下文。您在上下文中定义的任何键都将优先于原始上下文。

    另一种解决方案,对于仅针对一个 SWT 组件的特定键事件处理,同时为其余组件保留默认方案,是添加一个侦听器(请参阅this thread):

    final Listener keyDownFilter = new Listener()
    {
        private void postKeyEvent( final int type, final char character, final int keyCode )
        {
            final Display display = PlatformUI.getWorkbench().getDisplay();
            final Event event = new Event();
            event.type = type;
            event.character = character;
            event.keyCode = keyCode;
            display.post( event );
        }
    
        /* (non-Javadoc)
        * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
        */
        public void handleEvent( Event ev )
        {
            if ( ev.widget == RichText.this.editorControl )
            {
                if ( ( ev.keyCode == SWT.CR || ev.keyCode == SWT.KEYPAD_CR ) && ( ev.stateMask & SWT.SHIFT ) == 0 )
                {
                    ev.doit = false;
                    postKeyEvent( SWT.KeyDown, ( char ) 0, SWT.SHIFT );
                    postKeyEvent( SWT.KeyDown, ev.character, ev.keyCode );
                    postKeyEvent( SWT.KeyUp, ( char ) 0, SWT.SHIFT );
                }
            }
        }
    };
    
    final Display display = PlatformUI.getWorkbench().getDisplay();
    display.addFilter( SWT.KeyDown, keyDownFilter );
    this.editorControl.addDisposeListener( new DisposeListener()
    {
        /* (non-Javadoc)
        * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
        */
        public void widgetDisposed( final DisposeEvent ev )
        {
            display.removeFilter( SWT.KeyDown, keyDownFilter );
        }
    } );
    

    【讨论】:

    • 感谢您的回复。我尝试了您推荐的方法,但没有奏效。事实上,当我的编辑器处于活动状态时,我已经使用了我的 propore 方案(在 FocusListener 中使用 IBindigService)。在这种情况下,eclipse 快捷方式不起作用,但是当我按下“ALT + F”时“文件”菜单会激活(Alt+a 激活搜索菜单),我需要他的组合(Alt +...)当它们代表 Eclipse 的助记符菜单时的编辑器!
    • @Imen:很抱歉看到这个。我希望您能找到解决方案并在此处发布。您是否尝试过子上下文提示来检查它是否捕获了其中一些关键事件?
    • @VonC:首先,感谢您对我的问题表现出的兴趣。我尝试按照您的建议使用过滤器,但问题是当按下 ALT 时,我的编辑器会拦截键,但也会拦截 Elipse。因此我的编辑器失去焦点并且 Eclipse 菜单被激活(文件、搜索 ..)。我不明白你的问题?
    • @Imen:好吧,因为“您在上下文中定义的任何键都将优先于原始上下文”,它看起来是覆盖 ALT“菜单焦点激活”行为并替换的好方法通过您的编辑器快捷方式激活。因此我的问题。
    • 我在 Eclipse 网站上提出了这个问题,这是我收到的回复:“无法从 Eclipse 中禁用助记符,因为它们是由您的平台(Windows)和窗口管理器( windows)。您必须从 windows 本身禁用助记符“如何从 windows 禁用助记符?
    【解决方案2】:

    一个方案和一个键来覆盖 Alt

    <extension
         point="org.eclipse.ui.bindings">
      <scheme
            id="myscheme"
            name="My Scheme"
            parentId="org.eclipse.ui.defaultAcceleratorConfiguration">
      </scheme>
      <key
            commandId="mycommand"
            contextId="mycontext"
            schemeId="myscheme"
            sequence="Alt+A">
      </key>
      <key
            commandId="mycommand"
            contextId="mycontext"
            schemeId="myscheme"
            sequence="Alt">
      </key>
    

    一个命令

    <extension
         point="org.eclipse.ui.commands">
      <command
            id="mycommand"
            name="My Command">
      </command>
    

    【讨论】:

      【解决方案3】:

      这对empty.scheme 有帮助: 把它放在你的IApplication.start()

      public Object start(IApplicationContext context) { 
          // set the default shortcuts
      PlatformUI.getPreferenceStore().setDefault(IWorkbenchPreferenceConstants.KEY_CONFIGURATION_ID, "your.scheme"); //$NON-NLS-1$ 
          // start your app 
      } 
      

      您将拥有默认方案设置为您的。

      【讨论】:

        猜你喜欢
        • 2016-06-30
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多