2011-01-19 21 views
12

Questa è una domanda generale ma il mio problema attuale riguarda la gestione del menu.Menu e azioni di Eclipse RCP: Configura o codifica?

In un normale plug-in con le azioni del menu Contribute è possibile configurare ActionSet ecc. Nella configurazione plugin.xml. Questo è ovviamente sensato.

Sto lavorando su un'applicazione RCP (in realtà RAP) e mi chiedo se valga la pena di configurare tutto tramite plugin.xml. Il mio plugin non deve interagire con altri plugin sconosciuti quindi, in teoria, ho il controllo. Posso aggiungere menu e azioni a livello di programmazione.

Ho cercato di configurare un menu che contiene un sottomenu. Ho provato a definire ActionSet e collegarne uno all'interno ma senza successo. Alcuni elementi devono essere disabilitati a seconda del ruolo dell'utente.

Immagino di aver potuto codificare tutto in pochi minuti, ma non sono sicuro se questo si adatta all'eclipse "ethos".

Quali opinioni ci sono là fuori? L'applicazione diventerà abbastanza grande quindi mi piacerebbe avere l'approccio sin dall'inizio. Forse qualcuno può indicarmi un esempio per configurare un menu annidato :-)

risposta

25

La mia opinione è che l'implementazione plugin.xml è la strada da percorrere.

miei due principali ragioni per l'utilizzo di questo metodo:

  • E 'davvero facile da riconfigurare e riorganizzare i menu ei pulsanti senza scrivere codice Java.
  • Visualizzazione gerarchica molto chiara degli alberi del menu.

Ecco uno snippet di codice che implementa menu e sottomenu. In questo esempio, vengono aggiunti al menu principale.

È possibile incollare questo nella vostra 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> 

Per attivare/disattivare un menu, è necessario utilizzare core espressioni per attivare/disattivare i gestori di comandi. Se un comando non ha alcun gestore attivo collegato, sarà disabilitato. Quindi, anche la voce di menu che chiama quel comando sarà disabilitata.

I seguenti frammenti di codice mostrano come creare un pulsante sulla barra degli strumenti di una vista e farlo abilitare/disabilitare in base al valore di una variabile. Ricorda che dovrai modificare alcune cose in questo codice per farlo funzionare. La maggior parte delle modifiche riguarda nomi di riferimento e implementazione della classe.

Crea il pulsante nella barra degli strumenti (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> 

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

Creare il gestore di comandi (plugin.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> 

Creare la variabile di stato per il 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> 

implementare la classe che cambia lo stato della variabile:

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

} 

Maggiori dettagli su come per implementare queste funzionalità può essere trovato in questi luoghi:

+4

+1 Buon esempio! –

+0

Ho trovato l'intero controllo, cambio, ciclo di ricarica troppo lento, soprattutto se si dispone di molti menu contestuali che richiedono il debug con un comportamento complesso.Ma posso vedere come funzionerebbe per quell'esempio. –

0

Se stai scrivendo l'applicazione RCP, la buona pratica è quella di creare i segnaposto nel tuo ActionBarAdvisor. Mentre ciò definirà la struttura di base dei menu e delle barre degli strumenti, è possibile estendere menuContributions e utilizzare i comandi per contribuire al menu/agli strumenti reali.

1

per Eclipse ci sono due modi diversi per contribuire alla Workbench: Azioni e comandi.

Consiglio decisamente i comandi come più recenti e più avanzati delle azioni. Gli svantaggi delle azioni come specificato qui (1):

  • L'interfaccia utente e la gestione sono sempre collegate. Non è possibile separarsi a vicenda
  • Mentre le azioni possono essere apportate a diverse parti del workbench (menu popup/barra degli strumenti), tutte erano punti di estensione diversi e quindi si finisce per duplicare l'XML in più punti. La cosa peggiore è che non tutti i punti di estensione si aspettano la stessa configurazione.
  • Specificare azioni in più punti è un incubo di manutenzione. Se devi cambiare l'icona di un'azione, devi cambiare in tutti i posti.
  • Un altro problema con la duplicazione di azioni in plugin.xml è tale istanza multipla delle stesse azioni verrà creato nella memoria

    (1) Actions vs Commands

0

Per aggiungere le azioni in RCP è anche possibile usa ApplicationActinBarAcvisor.È più facile della soluzione sopra menzionata In questo caso devi solo dichiarare l'azione come oggetto di IWorkbenchAction, quindi nel metodo "protected void makeActions (IWorkbenchWindow window)" puoi registrarlo. E l'ultimo passo è aggiungerlo al menu. Il seguente codice ti aiuterà.

1.First dichiarare il ricorso: -

private IWorkbenchAction newAction 

azione 2.Registering: -

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

passo 3.Last è quello di aggiungere l'azione nel menu: -

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

È inoltre possibile aggiungere l'azione nella barra degli strumenti come segue: -

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