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:
+1 Buon esempio! –
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. –