Eliminar la popupmeno de CNF (marco de navegador común) en Eclipse
-
18-09-2019 - |
Pregunta
He tenido un éxito parcialmente exitoso en eliminar casi todos los menús emergentes del marco Commons Navigator simplemente configurando el plugin.xml
expediente.
Hay 2 menús que se niegan a ir:
group.edit
ygroup.reorganize
.
Mi plugin.xml
La configuración se ve así:
<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>
Establecer el allowsPlatformContribution
a falso detener las contribuciones que se agregarán al menú contextual excepto por group.edit
y group.reorganize
... Esto está empezando a parecer un error para mí.
La solución obvia es eliminar los puntos de inserción de mi <popUpMenu>
Pero sin ellos, la aplicación arroja una excepción:
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)
Lanza la misma excepción para el grupo Reorganize.
Solución
Lo logré de eliminar las acciones "Group.Edit" (copiar/pegar) y lo hice de esa manera, usando los puntos de extensión 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>
Y, con la adición de "org.eclipse.ui.navigator.resources" en mis dependencias de complementos, implementé "myPasteActionProvider" como este:
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");
}
}
Bueno, ese es un "acceso desanimado" pero me estaba desanimando ;-) jm.d
Otros consejos
Generalmente deberías usar el Marco de comando Con cualquier versión reciente de Eclipse (3.3 o superior), esto reemplaza el mecanismo para proporcionar menús emergentes en el navegador común.
Este el hilo sugiere Para eliminar las cosas que están haciendo que los elementos del menú aparezcan en primer lugar:
Probablemente estén en conjuntos de acción, por lo que si puede identificar el conjunto de acción que está causando la contribución ofensiva, puede hacer algo como esto en su 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] });
}
El error más cercano que he encontrado es el 145233: Haga una forma más obvia de especificar la entrada (para aplicaciones RCP), con un hack similar.
Insecto 143430 (CommonNavigator requiere que InitialInput sea adaptable) es más general e indicaría que entonces CNF se ha mejorado con Eclipse3.5 (Galileo).
Entonces, ¿también tiene este problema con 3.5 y una clase CNF personalizada?
Como se menciona en el artículo "Eclipse CNF: Extensiones de contenido de Navigator", CNF ha evolucionado con Eclipse3.5, y este artículo parece tener algún árbol con verdaderas entradas de menú contextual personalizadas.