2011-01-19 10 views
12

Esta es una pregunta general, pero mi problema actual gira en torno al manejo del menú.Eclipse Menús y acciones de RCP: ¿Configurar o codificar?

En un complemento normal con acciones de menú de contribuir, configuraría ActionSets, etc. en la configuración de plugin.xml. Esto es obviamente sensato.

Estoy trabajando en una aplicación RCP (en realidad RAP) y me pregunto si vale la pena el esfuerzo de configurar todo a través de plugin.xml. Mi complemento no tiene que interactuar con otros complementos desconocidos, así que, teóricamente, tengo control. Puedo agregar menús y acciones mediante programación.

He estado tratando de configurar un menú que contiene un submenú. Intenté definir ActionSets y vincular uno dentro del otro, pero sin éxito. Algunos artículos deben ser deshabilitados dependiendo de la función del usuario.

Me imagino que podría haber codificado todo en pocos minutos, pero no estoy seguro de si eso encaja con el eclipse 'ethos'.

¿Qué opiniones hay por ahí? La aplicación será bastante grande, por lo que me gustaría obtener el enfoque desde el principio. Tal vez alguien me puede indicar un ejemplo para configurar un menú anidado :-)

Respuesta

25

Mi opinión es que la implementación de plugin.xml es el camino a seguir.

Mis principales dos razones para usar este método:

  • Es muy fácil de configurar y reorganizar los menús y botones sin necesidad de escribir código Java.
  • Visualización jerárquica muy clara de los árboles del menú.

Aquí hay un fragmento de código que implementa menús y submenús. En este ejemplo, se agregan al menú principal.

Puede pegar esto en su plugin.xml:

<extension 
     name="Main Menu Contributions" 
     point="org.eclipse.ui.menus"> 
<menuContribution 
     allPopups="false" 
     locationURI="menu:org.eclipse.ui.main.menu"> 
    <menu 
      id="fileMenu" 
      label="File"> 
     <command 
       commandId="org.eclipse.ui.file.exit" 
       label="Exit" 
       style="push"> 
     </command> 
    </menu> 
    <menu 
      label="Edit"> 
     <command 
       commandId="org.eclipse.ui.edit.selectAll" 
       label="Select All" 
       style="push"> 
     </command> 
     <menu 
       label="Submenu"> 
      <command 
       commandId="org.eclipse.ui.edit.selectAll" 
       label="Select All Submenu" 
       style="push"> 
      </command> 
      <command 
       commandId="org.eclipse.ui.edit.delete" 
       label="Delete submenu" 
       style="push"> 
      </command> 
     </menu> 
    </menu> 
    </menuContribution> 
</extension> 

Para activar/desactivar un menú, usted tiene que utilizar expresiones básicas para activar/desactivar los controladores de comandos. Si un comando no tiene controladores activos conectados, se desactivará. Por lo tanto, el elemento del menú que llama a ese comando también estará deshabilitado.

Los siguientes fragmentos de código muestran cómo crear un botón en la barra de herramientas de una vista y habilitarlo/deshabilitarlo dependiendo del valor de una variable. Ten en cuenta que tendrás que cambiar algunas cosas en este código para que funcione. La mayoría de los cambios son para nombres de referencia e implementación de clases.

Crear el botón en la barra de herramientas (plugin.xml):

<extension 
     name="View Toolbar Contributions" 
     point="org.eclipse.ui.menus"> 
     <menuContribution 
      allPopups="false" 
      locationURI="toolbar:myapp.views.MyView"> 
     <command 
      commandId="myapp.commands.PauseSound" 
      icon="" 
      label="Pause Playback Sound" 
      style="push" 
      tooltip="Pause"> 
     </command> 
    </menuContribution> 
</extension> 

Crear el comando (plugin.xml):

<extension 
     id="myapp.commands.PauseSound" 
     name="Pause sound command" 
     point="org.eclipse.ui.commands"> 
     <command 
      id="myapp.commands.PauseSound" 
      name="Pause Sound"> 
     </command> 
</extension> 

Cree el controlador de comandos (plug-in.xml):

<extension 
     point="org.eclipse.ui.handlers"> 
     <handler 
      commandId="myapp.commands.PauseSound"> 
     <activeWhen> 
      <with 
        variable="myapp.commands.sourceprovider.active"> 
       <or> 
        <equals 
         value="PLAYING"> 
        </equals> 
        <equals 
         value="PAUSED"> 
        </equals> 
       </or> 
      </with> 
     </activeWhen> 
     <class 
       class="myapp.rcp.commands.toolbar.PausePlayback"> 
     </class> 
     </handler> 
</extension> 

Crear la variable de estado para el comando (plugin.xml):

<extension 
     point="org.eclipse.ui.services"> 
     <sourceProvider 
      provider="myapp.commands.sourceprovider.CommandState"> 
     <variable 
       name="myapp.commands.sourceprovider.active" 
       priorityLevel="workbench"> 
     </variable> 
     </sourceProvider> 
    </extension> 

implementar la clase que cambia el estado de la variable:

public class CommandState extends AbstractSourceProvider { 
    public final static String STATE = "myapp.commands.sourceprovider.active"; 
    public final static String STOPPED = "STOPPED"; 
    public final static String PLAYING = "PLAYING"; 
    public final static String PAUSED = "PAUSED"; 
    public final static String NOT_LOADED = "NOT_LOADED"; 

enum State { 
     NOT_LOADED, PLAYING, PAUSED, STOPPED 
    }; 
    private State curState = State.NOT_LOADED; 

    @Override 
    public void dispose() { 
    } 

    @Override 
    public String[] getProvidedSourceNames() { 
     return new String[] { STATE }; 
    } 

    // You cannot return NULL 
    @SuppressWarnings("unchecked") 
    @Override 
    public Map getCurrentState() { 
     Map map = new HashMap(1); 
     if (curState == State.PLAYING) 
      map.put(STATE, PLAYING); 
     else if (curState == State.STOPPED) 
      map.put(STATE, STOPPED); 
     else if (curState == State.PAUSED) 
      map.put(STATE, PAUSED); 

     return map; 
    } 

    public void setPlaying() { 
     fireSourceChanged(ISources.WORKBENCH, STATE, PLAYING); 
    } 

    public void setPaused() { 
     fireSourceChanged(ISources.WORKBENCH, STATE, PAUSED); 
    } 

    public void setStopped() { 
     fireSourceChanged(ISources.WORKBENCH, STATE, STOPPED); 
    } 

    public void setNotLoaded() { 
     fireSourceChanged(ISources.WORKBENCH, STATE, NOT_LOADED); 
    } 

} 

Más detalles sobre cómo para implementar estas características se pueden encontrar en estas ubicaciones:

+4

+1 ¡Buen ejemplo! –

+0

Encontré que todo el ciclo de verificación, cambio y recarga es demasiado lento, especialmente si tiene muchos menús contextuales que necesitan depuración con un comportamiento complejo.Pero puedo ver cómo funcionaría para ese ejemplo. –

0

Si está escribiendo la aplicación RCP, la buena práctica es crear los marcadores de posición en su ActionBarAdvisor. Si bien eso definiría la estructura básica de sus menús y barras de herramientas, puede extender las contribuciones del menú y usar comandos para contribuir con los elementos reales del menú/herramienta.

1

para Eclipse hay dos maneras diferentes de contribuir a la Mesa de trabajo: acciones y comandos.

Definitivamente recomiendo los comandos como los más nuevos y más avanzados que las acciones. Los inconvenientes de acciones que se especifican aquí (1):

  • La interfaz de usuario y manejo están siempre atados. No hay forma de que puedan separarse
  • Si bien las Acciones pueden ser contribuidas a diferentes partes del banco de trabajo (menú emergente/barra de herramientas), todas ellas son puntos de extensión diferentes y así termina duplicando el XML en múltiples lugares. Lo peor es que no todos los puntos de extensión esperan la misma configuración.
  • La especificación de acciones en varios lugares es una pesadilla de mantenimiento. Si tiene que cambiar el ícono de una acción, debe cambiar en todos los lugares.
  • Otro problema con la duplicación de acciones en plugin.xml es que varias instancias de las mismas acciones se creará en la memoria

    (1) Actions vs Commands

0

Para añadir acciones en RCP también puede use ApplicationActinBarAcvisor. Es más fácil que la solución mencionada anteriormente En este caso, solo tiene que declarar primero la acción como un objeto de IWorkbenchAction, luego en el método "protected void makeActions (ventana de IWorkbenchWindow)" puede registrarlo. Y el último paso es agregarlo al menú. El siguiente código te ayudará.

1.En primer lugar declarar la acción: -

private IWorkbenchAction newAction 

acción 2.Registering: -

protected void makeActions(IWorkbenchWindow window) { 
newAction = ActionFactory.NEW_WIZARD_DROP_DOWN.create(window); 
    register(newAction); 
    newAction.setText("New"); 

paso 3.Last es añadir la acción en el menú: -

MenuManager filemenu = new MenuManager("&File", "file"); 
    filemenu.add(newAction); 

También puede agregar la acción en la barra de herramientas de la siguiente manera: -

protected void fillCoolBar(ICoolBarManager coolBar) { 
    IToolBarManager toolbar = new ToolBarManager(coolBar.getStyle()); 
    coolBar.add(toolbar); 
    toolbar.add(newAction); 
Cuestiones relacionadas