在 Eclipse 中从 CNF(通用导航器框架)中删除 popUpMenus

Posted

技术标签:

【中文标题】在 Eclipse 中从 CNF(通用导航器框架)中删除 popUpMenus【英文标题】:Removing popUpMenus from CNF (Common Navigator Framework) in Eclipse 【发布时间】:2009-08-17 18:12:08 【问题描述】:

通过配置plugin.xml 文件,我已经部分成功地从 Commons Navigator Framework 中删除了几乎所有的弹出菜单。 有 2 个拒绝去的菜单:

group.editgroup.reorganize

我的plugin.xml 配置如下所示:

<extension
          point="org.eclipse.ui.navigator.viewer">
       <viewer
             viewerId="org.eclipse.ui.example.navigator.view">
             <popupMenu allowsPlatformContributions="false">
                <insertionPoint
                    name="group.edit" />

                <insertionPoint
                    name="group.reorganize" />
             </popupMenu>
       </viewer>
       <viewerContentBinding
             viewerId="org.eclipse.ui.thermo.navigator.view">
          <includes>
             <contentExtension
                   pattern="org.eclipse.ui.navigator.resourceContent"/>
          </includes>
       </viewerContentBinding> 
</extension>

allowsPlatformContribution 设置为false 确实会停止将贡献添加到上下文菜单except for group.editgroup.reorganize...这对我来说开始看起来像一个错误。

显而易见的解决方案是从我的&lt;popUpMenu&gt; 中删除插入点,但如果没有它们,应用程序会抛出异常:

Throwable: java.lang.IllegalArgumentException: Group not found: group.edit

java.lang.IllegalArgumentException: Group not found: group.edit
at org.eclipse.jface.action.ContributionManager.addToGroup(ContributionManager.java:131)
at org.eclipse.jface.action.ContributionManager.appendToGroup(ContributionManager.java:138)
at org.eclipse.ui.internal.navigator.resources.actions.EditActionGroup.fillContextMenu(EditActionGroup.java:74)
at org.eclipse.ui.internal.navigator.resources.actions.EditActionProvider.fillContextMenu(EditActionProvider.java:50)
at org.eclipse.ui.navigator.NavigatorActionService.addCommonActionProviderMenu(NavigatorActionService.java:205)
at org.eclipse.ui.navigator.NavigatorActionService.fillContextMenu(NavigatorActionService.java:172)
at org.eclipse.ui.internal.navigator.CommonNavigatorManager.fillContextMenu(CommonNavigatorManager.java:258)
at org.eclipse.ui.internal.navigator.CommonNavigatorManager$4.menuAboutToShow(CommonNavigatorManager.java:273)
at org.eclipse.jface.action.MenuManager.fireAboutToShow(MenuManager.java:335)
at org.eclipse.jface.action.MenuManager.handleAboutToShow(MenuManager.java:463)
at org.eclipse.jface.action.MenuManager.access$1(MenuManager.java:459)
at org.eclipse.jface.action.MenuManager$2.menuShown(MenuManager.java:485)

它为重组组抛出相同的异常。

【问题讨论】:

添加最近可能感兴趣的关于 CNF 的文章(请参阅我完成的答案) 能否检查一下基于 eclipse3.5 的 RCP 是否仍有错误? 【参考方案1】:

我成功地删除了“group.edit”操作(复制/粘贴),并且我已经这样做了,使用 Common Navigator 扩展点:

   <extension
         point="org.eclipse.ui.navigator.viewer">
      <viewerActionBinding
            viewerId="org.eclipse.ui.navigator.ProjectExplorer">
         <includes>
            <actionExtension
                  pattern="my.app.client.actions.MyAppEditActionExtension">
            </actionExtension>
         </includes>
      </viewerActionBinding>    
   </extension>
   <extension
         point="org.eclipse.ui.navigator.navigatorContent">
      <actionProvider
            class="my.app.client.workshop.MyPasteActionProvider"
            id="my.app.client.actions.MyAppEditActionExtension"
            overrides="org.eclipse.ui.navigator.resources.actions.EditActions"
            priority="highest">
         <enablement>
         <!-- A hack to allways be enabled -->
         <not>
            <systemTest
                  property="MyApp"
                  value="WONT-EVER-BE-SET">
            </systemTest>
         </not>
         </enablement>
     </actionProvider>
   </extension>

并且,通过在我的插件依赖项中添加“org.eclipse.ui.navigator.resources”,我实现了“MyPasteActionProvider”,如下所示:

import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.ui.internal.navigator.resources.actions.EditActionProvider;

/**
 * Create the Edit actions (Cut/Copy/Paste) 
 * and register then globally in the workbench using EditActionProvider.
 * <p/>
 * Then, removes the Copy/Paste contributions in the pop-up menu.
 */
public class MyPasteActionProvider extends EditActionProvider 
   public void fillContextMenu(IMenuManager menu)  super.fillContextMenu(menu);
   // remove Copy/Paste contributions
   IContributionItem copyItemRemoved = menu.remove("org.eclipse.ui.CopyAction");
   IContributionItem pasteItemRemoved = menu.remove("org.eclipse.ui.PasteAction");
   

嗯,这是一个“不鼓励访问”,但我让自己灰心了 ;-) JM.D

【讨论】:

【参考方案2】:

一般情况下,您应该将Command Framework 与任何最新版本的 Eclipse(3.3 或更高版本)一起使用,这取代了在 Common Navigator 中提供弹出菜单的机制。

【讨论】:

【参考方案3】:

这个thread suggests 删除导致菜单项首先出现的东西:

它们可能在动作集中,所以如果你能确定导致攻击性贡献的动作集,你可以在你的 WorkbenchAdvisor 中做这样的事情:

    ActionSetRegistry reg = WorkbenchPlugin.getDefault()
            .getActionSetRegistry();


    IActionSetDescriptor[] actionSets = reg.getActionSets();
    String[] removeActionSets = new String[] 
        "org.eclipse.ui.cheatsheets.actionSet",
        "org.eclipse.ui.edit.text.actionSet.annotationNavigation",
       "org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo",
          "org.eclipse.ui.WorkingSetActionSet",
        "org.eclipse.update.ui.softwareUpdates", ;


    for (int i = 0; i < actionSets.length; i++)
    
        boolean found = false;
        for (int j = 0; j < removeActionSets.length; j++)
        
            if (removeActionSets[j].equals(actionSets[i].getId()))
                found = true;
        


        if (!found)
            continue;
        IExtension ext = actionSets[i].getConfigurationElement()
                .getDeclaringExtension();
        reg.removeExtension(ext, new Object[]  actionSets[i] );
    

我发现的最接近的错误是145233: Make more obvious way to specify input (for RCP apps),带有similar hack。 错误143430 (CommonNavigator requires initialInput to be Adaptable) 是一个更普遍的错误,它表明 CNF 已经使用 eclipse3.5 (Galileo) 进行了改进。 那么对于 3.5 和自定义 CNF 类,您是否也有这个问题?


正如文章“Eclipse CNF: Navigator Content Extensions”中提到的,CNF 已经随着 eclipse3.5 的发展而发展,而且这篇文章似乎有一些树,其中包含真正的自定义上下文菜单条目。

【讨论】:

我尝试了这个建议,但没有奏效。这让我觉得原因是它不久前被弃用了。也许有一种新的方法可以用较新的 api 做到这一点? 可能是这样,但是你用的是什么版本的eclipse呢?

以上是关于在 Eclipse 中从 CNF(通用导航器框架)中删除 popUpMenus的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MVVM 模式中从页面导航到 WPF 中的页面?没有棱镜的概念[重复]

如何在颤动中从导航器堆栈中弹出最后三个路由

如何在qt中从右侧创建导航抽屉

在react-navigation中从嵌套导航器导航到父屏幕

如何在这个简单的代码中从导航反应 4 升级到导航 5

Eclipse中从svn中检出maven项目