2009-08-17 25 views
4

J'ai partiellement réussi à supprimer la plupart des menus contextuels de Commons Navigator Framework simplement en configurant le fichier plugin.xml.
Il y a 2 menus qui refusent d'aller:Suppression de popUpMenus de CNF (Common Navigator Framework) dans Eclipse

  • group.edit et
  • group.reorganize.

Ma config plugin.xml ressemble à ceci:

<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> 

Réglage du allowsPlatformContribution à false Ne fait arrêter les contributions à ajouter au menu contextuel sauf pour group.edit et group.reorganize ... cela commence à regarder comme un bug pour moi.

La solution évidente est de supprimer les points d'insertion de mon <popUpMenu> mais sans eux l'application renvoie une exception:

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) 

Il jette la même exception pour le groupe Réorganiser.

+1

Ajouter un article récent sur CNF qui pourrait vous intéresser (voir ma réponse complétée) – VonC

+0

Pourriez-vous vérifier si vous avez toujours l'erreur avec un RCP basé sur eclipse3.5? – VonC

Répondre

4

je réussi à éliminer les actions "group.edit" (copier/coller) et je l'ai fait de cette façon, en utilisant les points d'extension Navigator commun:

<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> 

Et, avec addition de "org.eclipse.ui.navigator.resources" dans mes dépendances de plugin, j'implemented "MyPasteActionProvider" comme ceci:

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"); 
    } 
} 

Eh bien, c'est un « découragée accès "mais je me suis découragé ;-) JM.D

1

Ce thread suggests pour enlever les choses qui sont à l'origine des éléments de menu apparaissent en premier lieu:

Ils sont probablement dans les jeux d'action, donc si vous pouvez identifier l'ensemble d'action qui cause la contribution offensive, vous pouvez faire quelque chose comme ceci dans votre 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] }); 
    } 

le plus proche bug que j'ai trouvé est le 145233: Make more obvious way to specify input (for RCP apps), avec un similar hack.
Le bogue 143430 (CommonNavigator requires initialInput to be Adaptable) est un bogue plus général, et indiquerait alors que CNF a été amélioré avec eclipse3.5 (Galileo).
Avez-vous aussi ce problème avec 3.5 et une classe CNF personnalisée?


Comme mentionné dans l'article « Eclipse CNF: Navigator Content Extensions », CNF a évolué avec eclipse3.5, et cet article semble avoir un arbre avec une véritable entrées de menu contextuel personnalisés.

alt text http://www.techjava.de/wp-content/uploads/CNF2-rename-child.png

+0

J'ai essayé cette suggestion mais cela n'a pas fonctionné. Cela me fait penser que la raison en est qu'il était obsolète il y a un certain temps. Peut-être qu'il y a une nouvelle façon de le faire avec la nouvelle api? – user157916

+0

Cela peut être le cas, mais quelle version d'Eclipse utilisez-vous? – VonC

+0

J'utilise eclipse rpc 3.4 – user157916

1

En général, vous devriez utiliser le Command Framework avec une version récente d'Eclipse (3.3 ou plus), ceci remplace le mécanisme de fourniture de menus contextuels dans le Common Navigator.