Supprimer le popupmenus de CNF (Common Navigator Framework) dans Eclipse
-
18-09-2019 - |
Question
J'ai réussi en partie à supprimer presque tous les menus contextuels du framework Commons Navigator simplement en configurant le plugin.xml
dossier.
Il y a 2 menus qui refusent d'aller:
group.edit
etgroup.reorganize
.
Mon plugin.xml
La configuration 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>
Définition du allowsPlatformContribution
To False arrête les contributions à ajouter au menu contextuel à l'exception pour group.edit
et group.reorganize
... Cela commence à me ressembler à un bug.
La solution évidente consiste à supprimer les points d'insertion de mon <popUpMenu>
Mais sans eux, l'application lance 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 lance la même exception pour le groupe de réorganisation.
La solution
J'ai réussi à supprimer les actions "Group.Edit" (copie / coller) et je l'ai fait de cette façon, en utilisant les points d'extension du navigateur 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 l'ajout de "org.eclipse.ui.navigator.resources" dans mes dépendances de plugin, j'ai implémenté "mypastealprovider" 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 "accès découragé" mais je me décourageais ;-) JM.D
Autres conseils
Généralement, vous devriez utiliser le Framework de commande Avec toute version récente d'Eclipse (3,3 ou plus), cela remplace le mécanisme pour fournir des menus contextuels dans le navigateur commun.
Cette Le fil suggère Pour supprimer les choses qui font apparaître les éléments de menu en premier lieu:
Ce sont probablement des ensembles d'action, donc si vous pouvez identifier l'ensemble d'action qui cause la contribution offensive, vous pouvez faire quelque chose comme ça 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 bug le plus proche que j'ai trouvé est le 145233: rendre un moyen plus évident de spécifier les entrées (pour les applications RCP), avec un Hack similaire.
Punaise 143430 (Commonnavigator nécessite que l'initiale est adaptable) est plus général et indiquerait que CNF a ensuite été amélioré avec Eclipse3.5 (Galileo).
Alors, avez-vous également ce problème avec 3.5 et une classe CNF personnalisée?
Comme mentionné dans l'article "Eclipse CNF: Extensions de contenu Navigator", CNF a évolué avec Eclipse3.5, et cet article semble avoir un arbre avec de véritables entrées de menu contextuel personnalisés.