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 y
  • group.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.

¿Fue útil?

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.

alt text

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top