Visualizzazione post con etichetta command. Mostra tutti i post
Visualizzazione post con etichetta command. Mostra tutti i post

venerdì 4 febbraio 2011

Eclipse RCP: aggiungere voci di menu dinamiche

Eclipse mette a disposizione un semplice meccanismo che permette di aggiungere in maniera dinamica delle voci ad un menu contestuale.

Per creare un menu è necessario dichiarare nel plugin.xml un estension point org.eclipse.ui.menus.
Supponiamo di voler aggiungere un nuovo menu alla toolbar dell'applicazione.
Aggiungiamo all'extension poin org.eclipse.ui.menus un menuContribution con

locationURI="menu:org.eclipse.ui.main.menu?after=additions"

Lo schema menu indica che il nuovo menu deve apparire sulla toolbar, mentre after=additions indica che deve apparire dopo i menu standard.

Al menuContribution aggiungiamo ora un menu, indicando id e label.


point="org.eclipse.ui.menus">
locationURI="menu:org.eclipse.ui.main.menu?after=additions">
id="it.sinossi.menu.toolbarMenu"
label="Menu Dinamico">





Aggiungiamo ora al menu un nodo di tipo dynamic e specifichiamo gli attributi id e class


point="org.eclipse.ui.menus">
locationURI="menu:org.eclipse.ui.main.menu?after=additions">
id="it.sinossi.menu.toolbarMenu"
label="Menu Dinamico">
id="it.sinossi.menu.sinossiCompoundContributionItem"
class="it.sinossi.menu.SinossiCompoundContributionItem">






La classe it.sinossi.menu.sinossiCompoundContributionItem deve estendere la classe astratta org.eclipse.ui.actions.CompoundContributionItem e implementare il metodo getContributionItems


import org.eclipse.jface.action.IContributionItem;
import org.eclipse.swt.SWT;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.CompoundContributionItem;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;


public class SinossiCompoundContributionItem extends CompoundContributionItem
{
private static int counter = 0;

@Override
protected IContributionItem[] getContributionItems()
{
final CommandContributionItemParameter contributionParameter =
new CommandContributionItemParameter(
PlatformUI.getWorkbench().getActiveWorkbenchWindow(),
"it.sinossi.menu.sinossiCompoundContributionItem",
"it.sinossi.command.dynamicCommand",
SWT.NONE);
contributionParameter.label = "Dynamic Menu Item " + counter++;
items[i] = new CommandContributionItem(contributionParameter);
}
return new IContributionItem[] { new CommandContributionItem(contributionParameter) };
}
}


Il metodo restituisce un array di IContributionItem. Ogni elemento dell'array è un oggetto di classe org.eclipse.ui.menus.CommandContributionItem, e rappresenta una voce da aggiungere al menu. Ogni CommandContributionItem è costruito a partire da un org.eclipse.ui.menus.CommandContributionItemParameter, che contiene le caratteristiche della voce stessa.
Nel suo costruttore infatti devono essere specificati l'id dell'elemento dynamic a cui associare il CommandContributionItem e l'id del command che dovra essere eseguito quando la voce viene selezionata.
Si noti che il metodo getContributionItems viene eseguito ogni volta che viene aperto il menu, perciò la variabile counter verrà incrementata ogni volta e questo fa si che la label della voce di menu sia aggiornata dinamicamente.

Nel plugin.xml aggiungiamo l'estension point org.eclipse.ui.commands per definire il command e l'handler di default che saranno attivati alla selezione della voce


point="org.eclipse.ui.commands">
id="it.sinossi.command.dynamicCommand"
defaultHandler="it.sinossi.command.DynamicCommand"
name="Dynamic Command">


giovedì 29 ottobre 2009

Handler di Eclipse RCP
Classicamente, la definizione di un command per un plugin RCP prevede una classe handler di default, che definisca il comportamento dell'applicazione quando viene attivato il command.

id="it.sinossi.SinossiCommand"
categoryid="it.sinossi.command.SinossiCommandsCategory"
defaulthandler="it.sinossi.handlers.DefaultSinossiHandler"
name="SinossiCommand">



In questo caso, quando viene attivato il SinossiCommand, viene automaticamente eseguito il metodo execute(ExecutionEvent evt) della classe DefaultSinossiHandler.

Supponiamo ora che un plugin esterno abbia la necessità di personalizzare il comportamento dell'applicazione all'attivazione del SinossiCommand, cioè di definire un handler custom per tale command.
E' sufficiente inserire nel plugin.xml del progetto esterno un'extension di org.eclipse.ui.handler come la seguente:


commandid="it.sinossi.command.SinossiCommandsCategory">









L'handler CustomSinossiHandler viene utilizzato al posto del default handler se l'activePartId corrisponde a quello della vista SinossiView. Infatti, la porzione di xml compresa all'interno del tag "activeWhen" è una core expressione e permette di definire quali sono le condizioni in cui l'handler è attivato. Analogamente, si può definire quando l'handler è abilitato definendo una core expression all'interno del tag "enableWhen".
Per saperne di più..
Help - Eclipse SDK - Handlers
Eclipse wiki - Command Core Expressions