Upload
mickael-baron
View
5.068
Download
0
Embed Size (px)
DESCRIPTION
Ce support de cours s'intéresse à détailler la construction de commandes avec la plateforme Eclipse. Il fait partie de la série des supports de cours liée au Workbench. Les aspects suivants sont étudiés : les actions, construction par déclaration et programmation de commandes et de handlers, éléments menuContribution par déclaration, raccourcis clavier, restrictions (visibleWhen, enabledWhen, activeWhen), paramétrer les commandes, restrictions par programmation et réutilisation (plug-in Spy et traces).
Citation preview
Développement de clients riches : Plateforme Eclipse
Mickaël BARON - 2009 mailto:[email protected] ou mailto:[email protected]
Chapitre 3 : Conception de plugChapitre 3 : Conception de plug--insins
Workbench : Commands
2Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Creative Commons
Contrat Paternité
Partage des Conditions Initiales à l'Identique
2.0 France
http://creativecommons.org/licenses/by-sa/2.0/fr
Licence
3Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Avant, il y avait les Actions …
Construction par déclaration et programmation
Eléments menuContribution par déclaration
Raccourcis clavier
Restrictions (visibleWhen, enabledWhen, activeWhen)
Paramétrer les commandes
Restrictions par programmation
Réutilisation
Organisation du cours sur le Workbench : Commands
Tous les exemples du cours sont disponibles directement à l’adresse
mbaron.developpez.com/eclipse/commands
4Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Déroulement du cours
Ceci est une alerte
Ceci est une astuce
Pédagogie du cours
Illustration avec de nombreux exemples qui sont disponibles àl’adresse mbaron.developpez.com/eclipse/commands
Des bulles d’aide tout au long du cours
Logiciels utilisés
Eclipse 3.4.2 Ganymede
Pré-requis
Connaître la structure d’un plug-ins et savoir créer une extension
Structure du Workbench
Remerciement
Developpez.com : [TODO]
…
5Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Ressources …
Des billets sur les généralités sur les commandesblog.eclipse-tips.com/2009/01/commands-part-1-actions-vs-commands.html
blog.eclipse-tips.com/2009/01/commands-part-2-selection-and.html
blog.eclipse-tips.com/2008/12/commands-part-3-parameters-for-commands.html
blog.eclipse-tips.com/2009/01/commands-part-4-misc-items.html
blog.eclipse-tips.com/2009/02/commands-part-5-authentication-in-rcp.html
blog.eclipse-tips.com/2009/03/commands-part-6-toggle-radio-menu.html
blog.eclipse-tips.com/2009/05/commands-part-7-adding-standard.html
blog.eclipse-tips.com/2009/02/customizing-about-dialog.html
blog.eclipse-tips.com/2009/10/associating-command-with-job.html
blog.eclipse-tips.com/2009/06/keyboard-accessibility-thru-command.html
bugs.eclipse.org/bugs/show_bug.cgi?id=223445
hermanlintvelt.blogspot.com/2009/06/eclipse-rcp-commands-api-review-of-part.html
hermanlintvelt.blogspot.com/2009/05/eclipse-rcp-commands-api-part-one.html
hermanlintvelt.blogspot.com/2009/06/eclipse-rcp-commands-part-3-visiblewhen.html
konigsberg.blogspot.com/2008/06/screencast-using-property-testers-in.html
www.vogella.de/blog/?p=421
richclientplatform.blogspot.com/2007/07/new-menu-contribution-extension.html
www.vimeo.com/1217595?pg=embed&sec=1217595
6Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Ressources … (suite)
Des articles sur les généralités sur les commandeswiki.eclipse.org/Platform_Command_Framework
wiki.eclipse.org/Menu_Contributions
wiki.eclipse.org/Menus_Extension_Mapping
wiki.eclipse.org/Command_Core_Expressions
www.eclipsecon.org/2008/?page=sub/&id=221
www.vogella.de/articles/RichClientPlatform/article.html#commands
www.vogella.de/articles/EclipseCommands/article.html
www.vogella.de/articles/EclipsePlugIn/ar01s04.html
www.ibm.com/developerworks/library/os-eclipse-3.3menu/index.html
svn2.assembla.com/svn/eclipsecommands/trunk/EclipseCommands/contents/article.html
Des livresEclipse – Building Commercial-Quality Plug-ins, 2004 - ISBN : 0-321-22847-2
Eclipse – Rich Client Platform, 2005 – ISBN : 0-321-33461-2
Eclipse Plug-ins, 3rd Edition, 2008 – ISBN : 0-321-55346-2
7Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Dans les parties Perspective, View et Editor nous avons
abordé le concept d’actions permettant d’ajouter de nou-
veaux éléments pour
un menu
une barre d’outils
un menu contextuel
Workbench fournit deux APIs pour ajouter des éléments
Actions (celle utilisée dans les précédents transparents)
Command (apparue depuis Eclipse 3.3)
L’API Actions est plus ancienne et doit être remplacée par
l’API Commands
Introduction
8Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Introduction
Les points d’extension concernant l’API Actions sont
toujours utilisables
Du côté des vues, des éditeurs et des perspectives il existe
toujours cette relation avec les actions
Pour vos prochains développements, préférer l’utilisation de
la nouvelle API Commands
Dans la suite nous présentons rapidement l’API Actions en
insistant sur ces désavantages puis nous nous orienterons
vers l’API Commands
9Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Ancienne API Actions
Depuis le début de ce support de cours, nous avons abordérapidement la notion d’Actions via l’interface IAction
La description de cette interface met en avant l’absence de flexibilité qui a conduit à définir la nouvelle API Command
Les aspects liés à la présentation (setText, setEnabled, …) sont fortement couplés avec le traitement de l’action (run)
Par conséquent il est difficile de fournir plusieurs textes, images, … raccourcis clavier pour une même action
public interface IAction { void setText(String text);void setImageDescriptor(ImageDescriptor image);void setAccelerator(int keycode);void setEnabled(boolean enabled);
void run();// ... more setters and getters
}
Caractéristiques liées à la présentation de
l’action
Caractéristique liée au traitement de l’action
10Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Ancienne API Actions
La plateforme Eclipse fournit différents points d’extension permettant d’ajouter des actions à différents éléments du Workbench
org.eclipse.ui.actionSets : ajouter des actions au menu et à la barre d’outils d’une application Eclipse
org.eclipse.ui.editorActions : ajouter des actions au menu et à la barre d’outils d’une application Eclipse pour un type d’éditeur donné
org.eclipse.ui.actionSetPartAssociations : permet d’associer une action à un ensemble de Parts (View et Editor)
org.eclipse.ui.viewActions : ajouter des actions au menu et à la barre d’outils d’une vue
org.eclipse.ui.popupMenus : ajouter des actions à un menu contextuel
Nous montrons dans la suite un exemple exploitant le point d’extension org.eclipse.ui.actionSets
11Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Ancienne API Actions
Exemple : ajouter une action au menu et à la barre d’outils d’une application Eclipse avec l’API Actions
Ajout d’une action au menu
Ajout d’une action à la barre d’outils
Projet ActionsExamples
12Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Ancienne API Actions
Exemple (suite) : ajouter une action au menu et à la barre d’outils d’une application Eclipse avec l’API Actions
Création d’extension àpartir du point
d’extension org.eclipse.ui.actionSets
Template pour créer rapidement cette
extension
13Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Ancienne API Actions
Exemple (suite) : ajouter une action au menu et à la barre d’outils d’une application Eclipse avec l’API Actions
Création d’un élément actionSet
Onglet Extensionsplugin.xml du projet ActionsExamples
14Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Ancienne API Actions
Exemple (suite) : ajouter une action au menu et à la barre d’outils d’une application Eclipse avec l’API Actions
Création d’un élément menu
Onglet Extensionsplugin.xml du projet ActionsExamples
Texte affiché dans le menu de l’application
Possibilité d’ajouter le nouveau menu à un menu existant
15Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Ancienne API Actions
Exemple (suite) : ajouter une action au menu et à la barre d’outils d’une application Eclipse avec l’API Actions
Création d’un élément action
Onglet Extensionsplugin.xml du projet ActionsExamples
16Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Ancienne API Actions
Exemple (suite) : ajouter une action au menu et à la barre d’outils d’une application Eclipse avec l’API Actions
Classe de type IWorkbenchWindowActionDelegage
codant le traitement de l’action
Précise où doit être affiché l’action dans la barre de menu
Précise où doit être affiché l’action dans la barre d’outils
17Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
API Commands
La nouvelle API Commands permet de construire une
Command, désignée commande dans la suite de ce cours
Le principal avantage d’une commande est la séparation
stricte de l’IHM du comportement
Pour utiliser une commande, vous avez besoin
Donner une description déclarative de la commande
Définir le comportement via un Handler (activation, traitement, …)
Préciser à quel endroit de l’IHM la commande s’applique (menu,
barre d’outils de l’application ou d’une vue, …)
Si vous commencez de nouveaux développements préférez
l’utilisation de cette nouvelle API Commands
18Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Construction par déclaration
Une commande est déclarée par l’intermédiaire du point d’extension org.eclipse.ui.commands
Point d’extension org.eclipse.ui.commands
Un template « Hello, World » pour définir
une commande
19Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Construction par déclaration
Onglet Extensionsplugin.xml du projet
CommandsExamples
Définition des attributs d’une commande
Un handler par défaut peut être défini, dans la suite on
montrera qu’il est possible d’extraire cette relation
20Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Construction par déclaration
package eclipse.workbench.commandsexamples.handler;
public class FirstHandler extends AbstractHandler {
@Overridepublic Object execute(ExecutionEvent event) throws ExecutionException {
MessageDialog.openInformation(Display.getDefault().getActiveShell(),"CommandsExamples Plug-in","Hello, Eclipse world with First Handler");
return "";}
}
Le comportement de la commande doit être défini par un objet de type IHandler
La classe AbstractHandler fournit une implémentation des différentes méthodes
Object execute(ExecutionEvent event) : traitement réalisé quand la commande est déclenchée
Classe FirstHandler.java du projet CommandsExamples
21Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Associer une commande à un Handler
Le point d’extension org.eclipse.ui.handlers permet de
définir explicitement un Handler à une commande
L’Handler n’est donc plus défini au niveau de la commande
L’intérêt est de pouvoir spécifier des contraintes différentes
pour une même classe de comportement (objet IHandler)
Différentes contraintes
activeWhen : comportement actif ou pas
enabledWhen : comportement activé ou pas
Contraintes seront étudiées à la fin de cette partie
22Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Associer une commande à un Handler
L’association commande / handler est déclarée par le point d’extension org.eclipse.ui.handlers
Point d’extension org.eclipse.ui.handlers
23Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Associer une commande à un Handler
Onglet Extensionsplugin.xml du projet
CommandsExamples
Définition du couple commande / handlerIdentifiant de la commande
Classe de type IHandlercorrespondant au traitement de
la commande
24Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Associer une commande à des images
Dans le même ordre d’idée, il est possible de découpler
dans la définition de la commande les différentes images
utilisées
Le point d’extension org.eclipse.ui.commandImages permet
de définir pour une commande les images à afficher
l’image par défaut
l’image utilisée lorsque la commande est désactivée
l’image utilisée lorsque le curseur de la souris est au dessus de la
représentation graphique de la commande
style : dans quel contexte ces images sont utilisées : barre de menu
ou barre d’outils. Si aucune valeur, cela concerne la barre de menu,
si toolbar cela concerne la barre d’outils
25Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Associer une commande à des images
L’association commande / image est déclarée par le point d’extension org.eclipse.ui.commandImages
Point d’extension org.eclipse.ui.commandImages
26Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Associer une commande à des images
Définition du couple commande / images
Onglet Extensionsplugin.xml du projet
CommandsExamples
Identifiant de la commande
Si aucune valeur, cela concerne la barre de menu, si la valeur vaut
toolbar cela concerne la barre d’outils
Les différentes images utilisées
27Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Construction par programmation
Précédemment nous avons montré comment créer déclara-
tivement des commandes et des comportements (Handler)
La construction de commandes et de handlers de manière
programmatique est obtenue via l’utilisation des interfaces
ICommandService : pour créer des commandes
IHandlerService : pour créer des handlers
L’accès aux instances des deux interfaces IHandlerService et
ICommandService est obtenu via le Workbench
La destruction des commandes et handler sont à la charge
du programmeur
ICommandService cs = (ICommandService)PlatformUI.getWorkbench().getService(ICommandService.class);IHandlerService hs = (IHandlerService)PlatformUI.getWorkbench().getService(IHandlerService.class);
28Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Construction par programmation
L’interface ICommandService fournit les principaux services
Category getCategory(String catId) : récupère la catégorie catId, si
non existante, elle est créée
Command getCommand(String comId) : récupère la commande
comId, si non existante, elle est créée
Category[] getDefinedCategories() : récupère la liste complète des
catégories du Workbench
void addExecutionListener(IExecutionListener iel) : ajoute un
écouteur lors de l’exécution de la commande
La classe Command décrit une commande
void define(String name, String description, Category cat) : précise le
nom de la commande, la description et la catégorie à laquelle la
commande appartient (cat ne peut être null)
29Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Construction par programmation
Exemple : construire une commande
public class ViewCommandPart extends ViewPart {
public void createPartControl(Composite parent) {
ICommandService cs = (ICommandService)PlatformUI.getWorkbench().getService(ICommandService.class);
Category category = cs.getCategory("eclipse.workbench.commandsexample.commandscategory");
Command thirdCommand = cs.getCommand("eclipse.workbench.commandsexample.thirdcommand");
thirdCommand.define("Third Command", "", category);
// Suite concernant la construction du Handler
}
Classe ViewCommandPart.java du projet CommandsExamples
Construction de la commande thirdcommand
Association de la commande à la catégorie
Récupération du service de création de commandes Construction de la catégorie
30Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Construction par programmation
L’interface IHandlerService fournit les principales méthodes
suivantes
IHandlerActivation activateHandler(String commandId, IHandler
handler) : associe une commande à un handler
Object executeCommand(String commandId, Event event) throws
ExecutionException … : exécute un handler à partir de l’identifiant de
la commande
Pour rappel, la classe IHandler a été étudiée précédemment,
la classe AbstractHandler fournit une abstraction des
principales méthodes
31Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Construction par programmation
Exemple (suite) : exécuter une commandepublic class ViewCommandPart extends ViewPart {
public void createPartControl(Composite parent) {// Suite du précédent transparent
IHandlerService hs = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);IHandler handler = new AbstractHandler() {
public Object execute(ExecutionEvent event) throws ExecutionException {MessageDialog.openInformation(Display.getDefault().getActiveShell(),
"CommandsExamples Plug-in", "Hello, Eclipse world with Third Handler");return null;
}};hs.activateHandler("eclipse.workbench.commandsexample.thirdcommand", handler);
Button callCommand = new Button(parent, SWT.PUSH);callCommand.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {try {
IHandlerService hs = (IHandlerService)PlatformUI.getWorkbench().getService(IHandlerService.class);
hs.executeCommand("eclipse.workbench.commandsexample.thirdcommand", null);} catch (Exception e1) {
e1.printStackTrace();}
}});callCommand.setText("Call Third Command");
}}
Classe ViewCommandPart.java du projet CommandsExamples
Récupération du service de handler
Associer une commande avec un handler
Exécuter un handler à partir de l’identifiant d’une commande
32Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Construction par programmation
Le Workbench fournit des écouteurs permettant de notifier le client lors de l’exécution d’une ou plusieurs commandes
ICommandService#addExecutionListener(IExecutionListener el) : ajout d’un écouteur sur l’ensemble des exécutions de commandes
Command#addExecutionListener(IExecutionListener el) : ajout d’un écouteur sur une exécution de commande
IExecutionListener fournit les services suivants
void postExecuteFailure(String comId, ExecutionException ex) : déclenchée si l’exécution d’une commande a échoué
void postExecuteSucess(String comId, Object returnValue) : déclenchée si l’exécution d’une commande a réussi
void preExecute(String comId, ExecutionEvent event) : déclenchée pour avertir qu’une commande va être exécutée
33Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Construction par programmation
Exemple : écouter l’exécution d’une commandepublic class ViewCommandPart extends ViewPart {
public void createPartControl(Composite parent) {// Suite du précédent transparentICommandService cs = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);cs.addExecutionListener(new IExecutionListener() {
public void postExecuteSuccess(String commandId, Object returnValue) {System.out.println(".postExecuteSuccess() : " + commandId);
}public void preExecute(String commandId, ExecutionEvent event) {
System.out.println(".preExecute()");}public void postExecuteFailure(String commandId, ExecutionException exception) {
System.out.println(".postExecuteFailure()");}...
});thirdCommand.addExecutionListener(new IExecutionListener() {
public void notHandled(String commandId, NotHandledException exception) {System.out.println(".notHandled()");
}public void postExecuteSuccess(String commandId, Object returnValue) {
System.out.println(".postExecuteSuccess()");}public void preExecute(String commandId, ExecutionEvent event) {
System.out.println(".preExecute()");}...
});}
}
Classe ViewCommandPart.java du projet CommandsExamples
Ecouteur sur la totalitédes exécutions de
commande
Ecouteur sur l’exécution d’une commande
34Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans le Workbench
Pour l’instant nous savons construire une commande et un
handler de manière déclarative et programmatique
Nous montrons dans la suite comment ajouter une com-
mande à l’interface graphique du Workbench
Pour rappel les éléments graphiques qui peuvent être
étendus sont les suivants
Menu général de l’application
Barre d’outil de l’application
Barre d’outil, menu localisé et menu contextuel d’une vue donnée
35Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans le Workbench
L’ajout d’une commande au Workbench est obtenu par le point d’extension org.eclipse.ui.menus
Point d’extension org.eclipse.ui.menus
36Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans le Workbench
Création d’un élément de type menuContribution permettant de préciser où sera placée la commande dans le Workbench (locationURI)
Ajout d’un élément menuContribution
37Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans le Workbench
Modification de la valeur de l’attribut locationURI
Dans la suite nous donnons des explications sur la construction
de l’attribut locationURI
L’attribut locationURI permet d’indiquer où sera placée la
commande
38Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans le Workbench
La valeur de l’attribut locationURI est de la forme suivante
scheme : le type d’élément graphique à étendre. Les valeurs autorisées sont : menu, toolbar et popup
id : identifiant du menu, barre d’outil, menu contextuel ou vue
placement : les contraintes de placement de la commande par rapport aux autres éléments du scheme.Deux contraintes sont autorisées : before=<id> et after=<id>Où id peut être un séparateur, un identifiant de menu, un élément d’un menu, ou la valeur additions (signifie placer en dernier)
Exemple
[scheme]:[id]?[placement]
menu:file?before=quit
Ajoute un élément avant l’élément Quitsitué dans le menu File
39Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans le Workbench
La plateforme fournit des identifiants sur les éléments
standards
org.eclipse.ui.main.menu : identifiant de la barre de menu d’une
application Eclipse
org.eclipse.ui.main.toolbar : identifiant de la barre d’outils d’une
application Eclipse
org.eclipse.ui.popup.any : identifiant de tous les menus contextuels
Exemples
menu:org.eclipse.ui.main.menu : ajout un élément au menu de
l’application Eclipse
toolbar:viewcommandId : ajout un élément à la barre d’outil de la
vue identifiée par viewcommandId
40Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans le menu
Pour ajouter une commande à un menu la valeur du scheme
de l’attribut locationURI doit être à menu
A partir d’un élément menuContribution, plusieurs types
d’éléments peuvent être ajoutés à un menu existant
Une commande (élément command)
Un sous menu (élément menu)
Un séparateur (élément separator)
Un sous menu dynamique (élément dynamic)
Dans la suite des transparents nous présentons la mise en
œuvre de certains de ces éléments
41Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans le menu
Exemple : ajoute une commande au menu principal d’une application Eclipse Une commande est ajoutée directement à la
barre de menu de l’application Eclipse
Lors de l’utilisation de la commande une boîte de
dialogue est affichée
42Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans le menu
Exemple (suite) : ajoute une commande au menu principal d’une application Eclipse
plugin.xml du projet CommandsExamples
Ajout d’une commande au niveau du menu principal de
l’application Eclipse
43Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans le menu
Exemple (suite) : ajoute une commande au menu principal d’une application Eclipse
plugin.xml du projet CommandsExamples
Ajout d’un élément command
Réutilisation d’une commande définie précédemment
L’élément command permet de préciser les caractéristiques graphiques de la commande
(texte, image, …)
44Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans le menu
Exemple : ajoute une commande dans un sous menu du menu principal d’une application Eclipse
Un menu a été ajouté à la barre de menu principale de l’application Eclipse
Lors de l’utilisation d’une commande du menu
« Commands Example » une boîte de dialogue est affichée
45Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans le menu
Exemple (suite) : ajoute une commande dans un sous menu du menu principal d’une application Eclipse
plugin.xml du projet CommandsExamples
Ajout d’un menu au niveau du menu principal de l’application Eclipse
46Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans le menu
Exemple (suite) : ajoute une commande dans un sous menu du menu principal d’une application Eclipse
plugin.xml du projet CommandsExamples
Ajout d’un élément menu
Ajout de deux éléments command à l’élément menu
Caractéristiques graphiques de l’élément menu
47Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans le menu
Exemple (suite) : ajoute une commande dans un sous menu du menu principal d’une application Eclipse
plugin.xml du projet CommandsExamples
48Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans une barre d’outil
Pour ajouter une commande à une barre d’outils la valeur du
scheme de l’attribut locationURI doit être à toolbar
A partir d’un élément menuContribution, plusieurs types
d’éléments peuvent être ajoutés à une barre d’outils
Un séparateur (élément separator)
Une barre d’outils dynamique (élément dynamic)
Un composant graphique (élément control)
Dans la suite des transparents nous présentons la mise en
œuvre de certains de ces éléments
49Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans une barre d’outil
Exemple : ajouter une commande dans la barre d’outil principale d’une application Eclipse Une commande est ajoutée
directement à la barre d’outils principale de l’application
Eclipse
Lors de l’utilisation de la commande une boîte de
dialogue est affichée
50Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans une barre d’outil
Exemple (suite) : ajouter une commande dans la barre d’outil principale d’une application Eclipse
plugin.xml du projet CommandsExamples
Ajout d’une commande au niveau de la barre d’outils de l’application
Eclipse
51Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans une barre d’outil
Exemple (suite) : ajouter une commande dans la barre d’outil principale d’une application Eclipse
plugin.xml du projet CommandsExamples
Un élément toolbar est ajouté à l’élément menuContribution. Une nouvelle barre d’outils
est ajoutée à la barre d’outils principale
Identifiant de la nouvelle barre d’outils contenant l’élément
command. Possibilité d’étendre directement cette nouvelle barre
d’outils
52Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans une barre d’outil
Exemple (suite) : ajouter une commande dans la barre d’outil principale d’une application Eclipse
plugin.xml du projet CommandsExamples
Réutilisation d’une commande définie précédemment
L’élément command permet de préciser les caractéristiques graphiques de la commande
(texte, image, …)
Ajout d’un élément command àla nouvelle barre d’outils
53Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans un menu localisé d’une vue
Exemple : ajouter une commande dans le menu localiséd’une vue
Vue …commandsexample.views.viewcommandiddu projet CommandsExamples
Menu localisé de la vue contenant une commande
54Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans un menu localisé d’une vue
Exemple (suite) : ajouter une commande dans le menu localisé d’une vue
plugin.xml du projet CommandsExamples
Scheme vaut menu et id pointe sur l’identifiant de la vue
La création de l’élément command est identique aux précédents transparents
55Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans une barre d’outils de vue
Exemple : ajouter une commande dans la barre d’outils d’une vue
Menu localisé de la vue contenant une commande
Vue …commandsexample.views.viewcommandiddu projet CommandsExamples
56Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans une barre d’outils de vue
Exemple (suite) : ajouter une commande dans la barre d’outils d’une vue
plugin.xml du projet CommandsExamples
Scheme vaut toolbar et id pointe sur l’identifiant de la vue
La création de l’élément command est identique aux précédents transparents
57Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans un menu contextuel de vue
Pour ajouter une commande à un menu contextuel d’une vue
la valeur du scheme de l’attribut locationURI doit être à
popup et l’id doit pointer sur l’identifiant de la vue
A partir d’un élément menuContribution, plusieurs types
d’éléments peuvent être ajoutés à un menu contextuel
Une commande (élément command)
Un sous menu (élément menu)
Un séparateur (élément separator)
Un sous menu dynamique (élément dynamic)
Il s’agit des mêmes éléments que pour l’enrichissement d’une
barre de menu (générale ou localisée)
58Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans un menu contextuel de vue
Exemple : ajouter une commande dans le menu contextuel d’une vue
Vue …commandsexample.views.popupviewcommandiddu projet CommandsExamples
Menu contextuel de la vue contenant plusieurs commandes
59Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans un menu contextuel de vue
Exemple (suite) : ajouter une commande dans le menu contextuel d’une vue
public class PopupViewPart extends ViewPart {
private TableViewer viewer;
public void createPartControl(Composite parent) {parent.setLayout(new GridLayout(1, false));GridData myGridData = new GridData(GridData.FILL_BOTH);
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);viewer.setContentProvider(new ViewContentProvider());viewer.setLabelProvider(new ViewLabelProvider());viewer.setInput(this.getViewSite());viewer.getControl().setLayoutData(myGridData);this.getSite().setSelectionProvider(viewer);
createContextMenu();}
... // Suite dans le prochain transparent}
PopupViewPart.java du projet CommandsExamples
Construction programmatique du contenu du menu contextuel
60Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans un menu contextuel de vue
Exemple (suite) : ajouter une commande dans le menu contextuel d’une vue
public class PopupViewPart extends ViewPart {// Suite du précédent transparentprivate void createContextMenu() {
final Action action1 = new Action("Action 1") {public void run() { System.out.println("Action 1 Performed"); }
};CommandContributionItemParameter commandParameter = new CommandContributionItemParameter(
PlatformUI.getWorkbench(), "contributionitem","eclipse.workbench.commandsexample.firstcommand",CommandContributionItem.STYLE_PUSH);
final IContributionItem ref = new CommandContributionItem(commandParameter);
MenuManager menuMgr = new MenuManager();menuMgr.setRemoveAllWhenShown(true);menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager mgr) {mgr.add(action1);mgr.add(ref);
}});// Create menu.Menu menu = menuMgr.createContextMenu(viewer.getControl());viewer.getControl().setMenu(menu);
// Register menu for extension.getSite().registerContextMenu(menuMgr, viewer);
}}
PopupViewPart.java du projet CommandsExamples
Construction d’une action via l’API JFace (voir cours Perspectives et Views)
Construction d’une commande via IContributionItem (voir dans les
prochains transparents)
Déclare le menu contextuel dans le Workbench, obligatoire pour l’enrichir via les extensions
61Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans un menu contextuel de vue
Exemple (suite) : ajouter une commande dans le menu contextuel d’une vue Scheme vaut popup et id pointe
sur l’identifiant de la vue
La création de l’élément command est identique aux précédents transparents
plugin.xml du projet CommandsExamples
62Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans un menu contextuel de vue
Exemple (suite) : ajouter une commande dans le menu contextuel d’une vue
public class ShowSelectedHandler extends AbstractHandler {
@SuppressWarnings("unchecked")public Object execute(ExecutionEvent event) throws ExecutionException {
ISelection selection =PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection();
if (selection != null & selection instanceof IStructuredSelection) {IStructuredSelection structuredSelection = (IStructuredSelection) selection;for (Iterator<Object> iterator = structuredSelection.iterator(); iterator
.hasNext();) {Object element = iterator.next();System.out.println(element.toString());
}}return null;
}}
ShowSelectedHandler.java du projet CommandsExamples
Correspond au handler de la commande ajoutée au menu contextuel
Récupération de la sélection courante via le service de sélection
63Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans un menu contextuel de vue
Exemple : ajouter une commande dans le menu contextuel d’une vue avec une contrainte de positionnement
Vue …commandsexample.views.popupviewcommandiddu projet CommandsExamples
Cette commande doit être placée avant First Command identifiée par
contributionitem (définie programmatiquement)
64Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans un menu contextuel de vue
Exemple (suite) : ajouter une commande dans le menu contextuel d’une vue avec une contrainte de positionnement
plugin.xml du projet CommandsExamples
Utilisation de la contrainte de placement before=contributionitem
pour placer avant la commande First Command
65Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans un menu contextuel de vue
Exemple : ajouter une commande dans tous les menus contextuels des vues
Une commande est ajoutée à tous les menus
contextuels de vues
66Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Commande dans un menu contextuel de vue
Exemple (suite) : ajouter une commande dans tous les menus contextuels des vues
plugin.xml du projet CommandsExamples
Scheme vaut popup et id pointe sur l’identifiant org.eclipse.ui.popup.any
67Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Aller plus loin avec menuContribution
A partir d’un élément menuContribution, il est également possible d’ajouter deux types d’éléments
Dynamic
Construction dynamique d’éléments d’un menu ou d’une barre d’outils
Nécessite le développement par programmation des éléments àafficher
A utiliser si le nombre d’éléments à afficher dans un menu ou une barre d’outils n’est pas connu à l’avance
control
Création personnalisée de l’élément graphique à afficher (non disponible pour les éléments de menus)
A utiliser quand il est intéressant d’afficher autre chose qu’un label
68Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Aller plus loin avec menuContribution : dynamic
Exemple : ajout dynamique d’éléments dans un menu
Projet CommandsExamples
Les deux commandes sont ajoutées dans le sous menu
Dynamic Example
69Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Aller plus loin avec menuContribution : dynamic
Exemple (suite) : ajout dynamique d’éléments dans un menu
plugin.xml du projet CommandsExamples
Classe de type IContributionItem
Création d’un élément dynamic
70Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Aller plus loin avec menuContribution : dynamic
Exemple (suite) : ajout dynamique d’éléments dans un menu
public class ContributionItemExample extends CompoundContributionItem {
protected IContributionItem[] getContributionItems() {IContributionItem[] tab = new IContributionItem[2];
CommandContributionItemParameter commandParameter = new CommandContributionItemParameter(PlatformUI.getWorkbench(), "contributionfirstitem","eclipse.workbench.commandsexample.firstcommand",CommandContributionItem.STYLE_PUSH);
IContributionItem ref = new CommandContributionItem(commandParameter);tab[0] = ref;
commandParameter = new CommandContributionItemParameter(PlatformUI.getWorkbench(), "contributionseconditem","eclipse.workbench.commandsexample.secondcommand",CommandContributionItem.STYLE_PUSH);
ref = new CommandContributionItem(commandParameter);tab[1] = ref;
return tab;}
}
ContributionItemExample.java du projet CommandsExamples
A utiliser comme implémentation abstraite de IContributionItem
Utilisation de commandes définies précédemment
71Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Aller plus loin avec menuContribution : control
Exemple : création d’un élément personnalisé dans une barre d’outils
Projet CommandsExamples
Création d’un élément dans la barre d’outils à partir de l’API SWT
72Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Aller plus loin avec menuContribution : control
Exemple (suite) : création d’un élément personnalisé dans une barre d’outils
plugin.xml du projet CommandsExamples
Création d’un élément control
Classe de type WorkbenchWindowControlContribution
73Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Aller plus loin avec menuContribution : control
Exemple (suite) : création d’un élément personnalisé dans une barre d’outils
public class WorkbenchWindowCustomControlContribution extends WorkbenchWindowControlContribution {
protected Control createControl(Composite parent) {Composite composite = new Composite(parent, SWT.NONE);GridLayout layout = new GridLayout(2, false);layout.marginHeight = 0;layout.marginWidth = 0;composite.setLayout(layout);composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
final Label label = new Label(composite, SWT.NONE);label.setText("Click");
Button button = new Button(composite, SWT.PUSH);button.setText("Call");button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {IHandlerService hs = (IHandlerService)PlatformUI.getWorkbench().getService(IHandlerService.class);try {
hs.executeCommand("eclipse.workbench.commandsexample.firstcommand", null);} catch (Exception e1) {
e1.printStackTrace();}
}});
return composite;}
}
WorkbenchWindowCustomControlContribution.javadu projet CommandsExamples
Composants SWT
Déclenchement d’une commande
74Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier
Possibilité d’exécuter une commande via un raccourci clavier
en utilisant le point d’extension org.eclipse.ui.bindings
A noter que le point d’extension org.eclipse.ui.commands
permet de construire des raccourcis clavier mais ces éléments
sont DEPRECATED et ne doivent pas être utilisés
Dans la suite nous montrons comment construire des
raccourcis claviers (key) et des regroupements de raccourcis
claviers (scheme)
75Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier
Ajouter un extension basée sur le point d’extension org.eclipse.ui.bindings
Création d’extension àpartir du point
d’extension org.eclipse.ui.bindings
76Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier
Ajouter un élément key permettant de construire un raccourci clavier
plugin.xml du projet CommandsKeyBindingRCPExamples
77Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier
Construire un raccourci clavier actif quand la touche F11est déclenchée
plugin.xml du projet CommandsKeyBindingRCPExamples
78Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier
sequence définit la séquence de touches du clavier qui active la commande
schemeId définit le regroupement de raccourcis clavier. Par défaut
org.eclipse.ui.defaultAcceleratorConfiguration
commandId définit l’identifiant de la commande à appeler lors de l’utilisation de la touche F11
platform définit le système sur lequel le raccourci est défini (win32,
gtk, motif, carbon, photon)
Paramétrer les attributs d’un élément key
79Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : sequence
L’attribut sequence est utilisée pour définir une séquence de raccourcis clavier
Plusieurs raccourcis clavier peuvent être spécifiés dans une séquence séparés par un espace
Chaque raccourcis clavier se compose d’une ou plusieurs touches maintenues enfoncées et sont séparées par +
Les modifiers (touches spécifiques) reconnus sont : M1, M2, M3, M4, ALT, COMMAND, CTRL et SHIFT
M1 : COMMAND sur MAC OS X et CTRL sur les autres plateformes
M2 : SHIFT
M3 : OPTION sur MAC OS X et ALT sur les autres plateformes
M4 : CTRL sur MAC OS X et indéfinis pour les autres plateformes
Préférez l’utilisation de M1, M2, M3 et M4 pour être indé-pendant de la plateforme cible
80Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : sequence
Différents exemples de séquence
CTRL+L : maintenir enfoncées les touches CTRL et L
M1+L : maintenir enfoncées les touches COMMAND et L (MAC OS X)
ou CTRL et L sur les autres systèmes
CTRL+L F11 F12 : maintenir enfoncées les touches CTRL et L puis la
touche F11 et enfin la touche F12
Quand plusieurs raccourcis claviers se succèdent une fenêtre flottante contextualise l’interaction en cours
81Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : scheme
Un scheme est un regroupement de raccourcis clavier
org.eclipse.ui.defaultAcceleratorConfiguration est l’identifiant
par défaut de la plateforme Eclipse
Pour construire et utiliser son propre scheme vous devrez
Définir un scheme via le point d’extension org.eclipse.ui.bindings
Attribuer l’identifiant du scheme à l’attribut schemeId de l’élément key
Posséder un product (extrait du cours sur Eclipse RCP)
Définir un fichier de configuration et positionner l’identifiant du
scheme dans une valeur de propriétés
82Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : scheme
Définir un scheme via le point d’ext. org.eclipse.ui.bindings
plugin.xml du projet CommandsKeyBindingRCPExamples
Construction d’un élément scheme permettant de regroupant de raccourcis clavier
83Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : scheme
Définir un scheme via le point d’ext. org.eclipse.ui.bindings
Définition de l’identifiant du scheme
plugin.xml du projet CommandsKeyBindingRCPExamples
Précise le nom du scheme
Relation d’héritage avec un scheme déjà créé
84Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : scheme
Attribuer l’identifiant du scheme à l’attribut schemeId de key
plugin.xml du projet CommandsKeyBindingRCPExamples
Définition de la séquence du raccourci clavier Préciser l’identifiant du schemeprécédemment créé
L’identifiant de la commande qui sera
appelée
85Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : scheme (création d’un product)
Construction d’une application Eclipse RCP
Une présentation détaillée sur la manière de construire un product sera
donnée dans la partie Eclipse RCP
Construction d’un nouveau projet Plug-in (File -> New -> Project ->
Plug-in Project)
86Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : scheme (création d’un product)
Construction d’une application Eclipse RCP (suite)
S’assurer que l’option Rich Client Application est active
Différents paramétrages identiques à ceux utilisés lors de la création
d’un plug-in
87Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : scheme (création d’un product)
Construire le fichier de configuration du product
Choisir le projet où sera créé le product
Définir le nom du product
Créer le product à partir d’une configuration allégée
Construction d’un nouveau projet Plug-in (File -> New -> Other … -> Product
Configuration)
88Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : scheme (création d’un product)
Configuration du fichier de configuration du product
Commandskeybindingrcpexamples.product du projet CommandsKeyBindingRCPExamples
Nécessite la création de l’identifiant du product
89Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : scheme (création d’un product)
Configuration du fichier de configuration du product (suite)
Identifiant de l’application sur laquelle le product est associé
Projet où l’identifiant du product sera créé
Identifiant du product
90Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : scheme (création d’un product)
Configuration du fichier de configuration du product (suite)
plugin.xml du projet CommandsKeyBindingRCPExamples
Lors de la création de l’identifiant une extension basée sur org.eclipse.core.runtime.products a été créée
Nom donné à l’identifiant du product
91Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : scheme (création d’un product)
Définir un fichier de configuration des préférences utilisateur
org.eclipse.ui/KEY_CONFIGURATION_ID = eclipse.workbench.commandskeybindingrcpexamples.specificdefaultacceleratorconfigurationidorg.eclipse.ui/SHOW_PROGRESS_ON_STARTUP = false
pluginpreference.ini du projet CommandsKeyBindingRCPExamples
Identifiant du scheme qui doit être rendu actifClé (KEY_CONFIGURATION_ID) permettant d’activer un scheme
Le fichier pluginpreference.ini est placé à la racine du projet
92Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : scheme (création d’un product)
Déclarer le fichier pluginpreference.ini dans le fichier de confi-guration du product
plugin.xml du projet CommandsKeyBindingRCPExamples
Définition d’une propriété à l’extension
products pour configurer le product
93Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : scheme (création d’un product)
Déclarer le fichier pluginpreference.ini dans le fichier de confi-guration du product (suite)
plugin.xml du projet CommandsKeyBindingRCPExamples
Nom de la propriété à ajouter : preferenceCustomization
Nom du fichier de configuration : pluginpreference.ini
94Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Raccourci clavier : scheme
Exécuter l’application et reproduire la séquence : F9
Projet CommandsKeyBindingRCPExamples
Lors de l’appui sur la touche F9, la commande keyspecificcommandid est
déclenchée
95Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : généralités
L’API Commands permet d’appliquer des restrictions sur les handlers et sur les éléments menuContributions
Au niveau des handlers les restrictions sont activeWhen : si le handler est inactif, aucune commande n’est associée à ce handler
enabledWhen : si le handler est désactivé, l’exécution du handler ne peut être réalisée (si activé doit obligatoirement être actif)
Si handler est désactivé la commande apparaîtra grisée si elle est affichée dans un menu (peut importe si le handler est actif ou inactif)
Au niveau des éléments menuContributions la restriction estvisibleWhen : si invisible, l’élément graphique associé à la commande ne s’affiche pas (un élément dans un menu par exemple)
La description de restrictions est réalisée par le langage CoreExpressions
96Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : exemples
Exemple : Afficher une commande dans la barre d’outils principale quand un élément est sélectionné
Pas d’élément dans le service de sélection
Un élément dans le service de sélection
La commande est affichée dans la barre d’outils principale
97Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : exemples
Exemple (suite) : Afficher une commande dans la barre d’outils principale quand un élément est sélectionné
plugin.xml du projet CommandsExpressionsExamples
Une restriction visibleWhen au niveau d’un élément menuContribution
Commande est affichée quand un seul élément de la sélection est
sélectionné
98Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : exemples
Exemple : Afficher une commande dans la barre d’outils principale quand une vue est active
La vue « View Command Expression »n’est pas active
La vue « View Command Expression »est active
La commande « Second Command Expression » est désactivée
La commande « Second Command Expression » est maintenant activée
99Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : exemples
Exemple (suite) : Afficher une commande dans la barre d’outils principale quand une vue est active
plugin.xml du projet CommandsExpressionsExamples
Une restriction enabledWhen au niveau d’un élément handler
Commande est activée quand la vue active est « View Command Expression »
100Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : construire Expression Definitions
Dans les exemples précédents nous avons montré comment
construire des expressions en les associant directement aux
différentes restrictions (visibleWhen, enabledWhen, …)
Il peut être intéressant de mutualiser ces expressions de
manière à les réutiliser sans avoir à recopier les définitions
Le point d’extension org.eclipse.core.expressions.definitions
permet de construire ces expressions
Les restrictions utiliseront ensuite une référence à la nouvelle
définitionAjouter une dépendance sur
org.eclipse.core.expressions pour exploiter le point d’extension org.eclipse.core.expressions.definitions
101Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : construire Expression Definitions
Point d’extension permettant de créer des définitions
d’expression
102Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : construire Expression Definitions
plugin.xml du projet CommandsExpressionsExamples
Création d’une définition d’expression : un élément du service de sélection
103Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : utiliser Expression Definitions
plugin.xml du projet CommandsExpressionsExamples
Définition d’un nouvel élément menuContributionavec une restriction visibleWhen dont l’expression
a été définie précédemment
Utilisation du sous élément reference de visibleWhen
(s’appliquerait également àenabledWhen et activeWhen)
104Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : utiliser Expression Definitions
Lors de la sélection d’un élément, les deux commandes sont affichées dans
la barre d’outils principale
Pas d’élément dans le service de sélection
105Commands - M. Baron - Page
keul
keul
.blo
gspo
t.comRestrictions : Core Expressions en détail
Nous avons montré dans les exemples précédent des expressions basiques
La plateforme Eclipse fournit un ensemble d’éléments pour la définition d’expressions plus complexes
Dans la suite, nous nous proposons d’étudier chacun de ces éléments
106Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément count
L’élément count est utilisé pour vérifier le nombre d’occur-rence d’une collection
Cet élément peut être utilisé pour vérifier par exemple le nombre des sélections en cours
Si la vérification est correcte l’élément count est évalué à vrai sinon il est évalué à faux
L’attribut value de l’élément count est soit un entier soit un méta-caractère
* : n’importe quelle valeur
? : 0 ou 1 élément
+ : 1 ou plusieurs éléments
! : aucun élément
107Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément count
Exemple : Afficher une commande dans la barre d’outils principale quand zéro ou un élément est sélectionné
plugin.xml du projet CommandsExpressionsCountExamples
Une restriction visibleWhen au niveau d’un élément menuContribution
La commande est affichée si l’élément count s’assure qu’il n’y ait aucune ou un élément
de la sélection
108Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément iterate
L’élément iterate permet de parcourir les occurrences d’une
collection
Cet élément peut être utilisé pour vérifier par exemple le
contenu des sélections en cours
Deux attributs de iterate sont définis operator et ifEmpty
Attribut operator peut recevoir les valeurs and ou or
and : chaque occurrence doit satisfaire le sous élément de iterate
or : au moins un élément doit satisfaire le sous élément de iterate
Attribut ifEmpty peut recevoir les valeurs true ou false
true : iterate est évalué à vrai si la collection est vide
false : iterate est évalué à faux si la collection est vide
109Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément instanceof
L’élément instanceof permet de comparer le type d’un objet
en cours (un élément de sélection par exemple) par rapport
à un type à comparer
Cet élément est comparable à l’instruction instanceof du
langage Java
L’attribut value de l’élément instanceof permet d’indiquer le
type à comparer
Si la correspondance entre les types est correcte, l’élément
instanceof est évalué à vrai
110Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément iterate et instanceof
Exemple : Afficher une commande dans la barre d’outils quand tous les éléments de sélection sont des String
plugin.xml du projet CommandsExpressionsIterateInstanceOfExamples
Si la collection est vide, iterateest évalué à vrai
Tous les éléments doivent respecter le sous élément instanceof de iterate
111Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément iterate et instanceof
Exemple (suite) : Afficher une commande dans la barre d’outils quand tous les éléments de sélection sont des String
plugin.xml du projet CommandsExpressionsIterateInstanceOfExamples
Permet de comparer le type de l’objet en cours (occurrence de la sélection) avec le type String
112Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément iterate et instanceof
Exemple (suite) : Afficher une commande dans la barre d’outils quand tous les éléments de sélection sont des String
Une Table avec des éléments de type String et un élément de type
Integer
Si seuls des éléments de type
String sont sélectionnés, la commande est
affichée
Si par contre la sélection contient des
éléments de type String et Integer, la commande n’est pas
affichée
113Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément systemTest
L’élément systemTest permet de comparer la valeur d’une
propriété système avec une valeur donnée
Les propriétés systèmes sont les propriétés obtenues par la
méthode System.getProperty()
Par exemple user.name est une propriété qui retourne le
nom de l’utilisateur courant
L’élément systemTest possède deux attributs
property : le nom de la propriété à tester
value : la valeur de la propriété
114Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément systemTest
Exemple : Afficher une commande dans la barre d’outilsquand la propriété user.name vaut baronm
plugin.xml du projet CommandsExpressionsSystemTestExamples
Permet de comparer la valeur de la propriété« user.name » avec la valeur baronm
115Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément test
L’élément test permet de tester une valeur particulière d’une propriété sur un objet en cours
ExemplesA partir de la sélection d’un texte, vérifier que le contenu de la sélec-tion contient que des lettres
A partir du Workbench Window actif, vérifier que toutes ces perspec-tives sont fermées
Le test s’effectue par l’utilisation d’un objet Property Testerdécrit au travers d’une classe Java de type PropertyTesterL’élément test possède quatre attributs
property : nom de la propriété à tester
args : arguments complémentaires à transmettre au tester
value : la valeur qui peut être comparée
forcePluginActivation : si true force le plugin a l’activation
116Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément test
La valeur de l’attribut property de test est la combinaison
entre l’espace de nommage et le nom de la propriété
Exemple
Vérifier si toutes les perspectives de IWorkbenchWindow sont ouvertes
la property est org.eclipse.ui.workbenchWindow.isPerpsectiveOpen
La plateforme Eclipse fournit un ensemble prédéfinis de
Property Tester qui sont utilisés pour le fonctionnement
interne de l’environnement Eclipse
Nous montrerons également dans la suite comment créer ses
propres Property Tester
Espace de nommage Nom de la propriété
117Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément test
Property Tester prédéfinis …
118Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément test
Property Tester prédéfinis … (suite)
119Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément test
Exemple : Désactiver une commande dans la barre de menuquand toutes les perspectives sont fermées
Projet CommandsExpressionsTestExamples
Toutes les perspectives sont fermées, la commande est désactivée
La perspective Resource est ouverte, la commande est activée
120Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément test
Exemple (suite) : Désactiver une commande dans la barre de menu quand toutes les perspectives sont fermées
Nom de la propriété
Espace de nommage Type de l’objet
Classe implémentant le Property Tester associé
La valeur de l’attribut property de test estorg.eclipse.ui.workbenchWindow.isPerspectiveOpen
121Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément test
Exemple (suite) : Désactiver une commande dans la barre de menu quand toutes les perspectives sont fermées
plugin.xml du projet CommandsExpressionsTestExamples
L’objet en cours est activeWorkbenchWindow de type
IWorkbenchWindow
122Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément test
Exemple (suite) : Désactiver une commande dans la barre de menu quand toutes les perspectives sont fermées
plugin.xml du projet CommandsExpressionsTestExamples
Utilisation de la propriétéorg.eclipse.ui.workbenchWindow.isPerspectiveOpen
Permet de forcer le démarrage du plugin de manière à prendre en compte cette
restriction
123Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément and, not et or
Les éléments and, or et not permettent de combiner des
expressions par des opérateurs logiques
Ils permettent d’exprimer des expressions à plusieurs niveaux
d’éléments (iterate, count, …)
Tous les sous éléments des éléments and ou or sont affectés
par l’opération logique
L’élément not ne peut accepter un seul sous élément
Nous montrons dans la suite, la combinaison des éléments
étudiés précédemment (iterate, instanceof, count et
systemtest)
124Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément and, not et or
Exemple : Afficher une commande dans la barre de menu sila propriété user.name vaut baronm et tous les élément de sélection sont String
ou quand le nombre de sélection est différent de 2
Le nombre de sélection est différent de 2 => Commande
affichée
Elément de sélection de type différent et nombre de sélection égale à 2 =>
Commande non affichée
125Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : élément and, not et or
Exemple (suite) : Afficher une commande dans la barre de menu si …
Bloc or
Bloc and
Bloc not
plugin.xml du projet CommandsExpressionsAndNotOrExamples
126Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres variables d’évaluation
Précédemment nous avons utilisé deux variables (selectionet activeWorkbenchWindow) prédéfinies par la plateforme
Eclipse
Une variable retourne un type a concorder avec les éléments
des expressions définis précédemment
ISelection pour la variable selection
String pour activeWorkbenchWindow
La plupart des variables sont modifiables en cours d’exécution
Dans la suite est montré au travers d’un exemple la façon de
créer une variable
mettre à jour son contenu
127Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres variables d’évaluation
Variable prédéfinies …
128Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres variables d’évaluation
Variable prédéfinies … (suite)
129Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres variables d’évaluation
Exemple : définition d’une variable avec trois états qui est modifiable par l’utilisateur L’appuie sur les boutons
modifie l’état de la variable
La variable est utilisée pour des restrictions visibleWhen pour afficher une commande du
menu, de la barre d’outils et de la barre de la vue
130Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres variables d’évaluation
La création d’une variable s’effectue au travers du point d’extension org.eclipse.ui.services
Point d’extension org.eclipse.ui.services
131Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres variables d’évaluation
La création d’un élément sourceProvider permet de définir un objet de type ISourceProvider
plugin.xml du projet CommandsExpressionsVariableExamples
Nom de la classe définissant l’objet de type ISourceProvider
132Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres variables d’évaluation
Un objet ISourceProvider définit le comportement de la
variable (l’accès à ses valeurs)
Un objet ISourceProvider peut gérer plusieurs variables
Une implémentation partielle est fournie par la classe
AbstractSourceProvider
Map<String, Object> getCurrentState() : Map des noms de variables
(String) avec les valeurs des variables (Object)
String[] getProvidedSourceNames() : retourne les noms des variables
définies par l’objet SourceProvider
Un objet ISourceProvider peut définir plusieurs variables
133Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres variables d’évaluation
Exemple (suite) : définition d’une variable avec trois états qui est modifiable par l’utilisateur
public class AnimationSourceProvider extends AbstractSourceProvider {
public final static String ANIMATION_STATE = "eclipse.workbench.commands...examples.animation";
private final static String MENU_STATE = "menu";private final static String TOOLBAR_STATE = "toolbar";private final static String TOOLBAR_VIEW_STATE = "toolbarview";private int state;
public AnimationSourceProvider() {state = 0;
}
public Map<String, String> getCurrentState() {Map<String, String> currentState = new HashMap<String, String>(1);if (state == 0) {
currentState.put(ANIMATION_STATE, MENU_STATE);} else if (state == 1) {
currentState.put(ANIMATION_STATE, TOOLBAR_STATE);} else {
currentState.put(ANIMATION_STATE, TOOLBAR_VIEW_STATE);}
return currentState; }
public String[] getProvidedSourceNames() {return new String[] {ANIMATION_STATE};
}
...}
Classe AnimationSourceProvider.java du projet CommandsExpressionsVariableExamples
Une seule variable est définie
Trois états différents peuvent être retournés
Nom de la variable
134Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres variables d’évaluation
Exposer le nom de la variable au sein de l’application Eclipse pour être utilisée dans les expressions
plugin.xml du projet CommandsExpressionsVariableExamples
Nom de la variable
135Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres variables d’évaluation
L’accès aux objets de type ISourceProvider est réalisé par
l’intermédiaire de l’interface
ISourceProviderService : pour créer des commandes
De la même manière que pour les interfaces IHandlerService
et ICommandService, le Workbench permet de récupérer une
instance de ISourceProviderService
A partir d’un ISourceProviderService, la récupération d’un
ISourceProvider est obtenue par le nom de la variable
ISourceProviderService spc = (ISourceProviderService)PlatformUI.getWorkbench().getService(ISourceProviderService.class);
AnimationSourceProvider myPro = (AnimationSourceProvider)spc.getSourceProvider(AnimationSourceProvider.ANIMATION_STATE);
136Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres variables d’évaluation
Exemple (suite) : définition d’une variable avec trois états qui est modifiable par l’utilisateur
public class AnimationControlViewPart extends ViewPart {public void createPartControl(Composite parent) {
parent.setLayout(new GridLayout(3,true));
// Get the serviceISourceProviderService spc = (ISourceProviderService) PlatformUI.getWorkbench().getService(ISourceProviderService.class);// Get our source provider by querying by the variable namefinal AnimationSourceProvider myPro = (AnimationSourceProvider) spc.getSourceProvider(AnimationSourceProvider.ANIMATION_STATE);
Button menu = new Button(parent, SWT.FLAT);menu.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {myPro.setState(0);
}});menu.setLayoutData(new GridData(GridData.FILL_BOTH));menu.setText("Menu");
Button toolbar = new Button(parent, SWT.FLAT);toolbar.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {myPro.setState(1);
}});toolbar.setLayoutData(new GridData(GridData.FILL_BOTH));toolbar.setText("Toolbar");
Button view = new Button(parent, SWT.FLAT);view.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {myPro.setState(2);
}});view.setLayoutData(new GridData(GridData.FILL_BOTH));view.setText("ToolbarView");
}}
Classe AnimationControlViewPart.java du projet CommandsExpressionsVariableExamples
Récupération de l’objet ISourceProvider
Modifications de l’état de la variable
137Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres variables d’évaluation
Exemple (suite) : définition d’une variable avec trois états qui est modifiable par l’utilisateur
plugin.xml du projet CommandsExpressionsVariableExamples
Trois restrictions visibleWhen sont définies
138Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres PropertyTester
Précédemment nous avons montré comment utiliser les Property Tester définis par la plateforme Eclipse
Cette partie s’intéresse à la création de Property Testerpersonnalisé
La présentation sera guidée par un exemple inspiré d’un billet de Robert Konigsberg
http://konigsberg.blogspot.com/2008/06/screencast-using-property-testers-in.html
Description de l’exemple
Vérifie que la sélection sur du texte contient uniquement des lettres ou des chiffres
Le Propery Tester contient deux propriétés : isAllLetters et isAllDigits
139Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres PropertyTester
Exemple : vérifie si la sélection sur du texte contient unique-ment des lettres ou des chiffres
Sélection d’un texte contenant uniquement des lettres
Sélection d’un texte contenant uniquement des chiffres
Dans les deux cas, le handlerassocié à la commande est activé
Si la sélection sur le texte contient à la fois des lettres et des chiffres,
le handler est désactivé
140Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres PropertyTester
La création d’un Property Tester est réalisé au travers du point d’extension org.eclipse.core.expressions.propertyTesters
Point d’extension org.eclipse.core.expressions.properyTesters
141Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres PropertyTester
L’ajout d’un élément PropertyTester (à partir de l’extension
précédente) permet de définir un Property Tester
L’élément PropertyTester possède cinq attributs
id : l’identifiant du Property Tester
type : le type de l’objet à traiter pour effectuer la vérification
namespace : l’espace de nommage
properties : une liste de propriétés séparées par une virgule
class : classe de type PropertyTester implémentant le comportement
du Property Tester
142Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres PropertyTester
La classe de type PropertyTester doit implémenter
boolean test(Object receiver, String prop, Object[] args, Object exp) :
appelée pour coder le comportement du Property Tester
receiver : source d’information pour effectuer les tests
prop : la propriété à tester
args : des arguments supplémentaires
expectedValue : valeur attendue
Tous ces paramètres ne sont pas forcément utiles pour
définir le comportement du Property Tester
Généralement les arguments receiver et prop sont utilisés
143Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres PropertyTester
plugin.xml du projet CommandsExpressionsCustomTestExamples
Ajout d’un élément propertyTesterCe Property Tester ne traite que les objets de
type ISelection (type de l’argument receiver)
Deux propriétés sont définies : isAllLetters et isAllDigits
144Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres PropertyTester
Exemple (suite) : vérifie si la sélection sur du texte contient uniquement des lettres ou des chiffrespublic class CustomPropertyTester extends PropertyTester {
public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {ISelection selection = (ISelection) receiver;
if ("isAllLetters".equals(property)) {if (selection instanceof TextSelection) {
TextSelection ts = (TextSelection) selection;String text = (String) ts.getText();
if (text == null || text.length() == 0) { return false; }for (Character ch : text.toCharArray())
if (!Character.isLetter(ch)) { return false; }return true;
}}
if ("isAllDigits".equals(property)) {if (selection instanceof TextSelection) {
TextSelection ts = (TextSelection) selection;String text = (String) ts.getText();
if (text == null || text.length() == 0) { return false; }for (Character ch : text.toCharArray())
if (!Character.isDigit(ch)) { return false; }return true;
}}return false;
}}
CustomPropertyTester.java du projet CommandsExpressionsCustomTestExamples
Test relatif à la propriétéisAllLetters
Test relatif à la propriétéisAllDigits
145Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions : définir ses propres PropertyTester
Exemple (suite) : vérifie si la sélection sur du texte contient uniquement des lettres ou des chiffres
plugin.xml du projet CommandsExpressionsCustomTestExamples
Utilisation du Property Testeravec ces deux propriétés
146Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions par programmation
Précédemment nous avons montré comment utiliser les restrictions (visibleWhen, enabledWhen et activeWhen) de manière déclarative via les extensions
Puisque toutes les restrictions définies dans ces extensions s’appuient sur des APIs Java, il est possible de réaliser les mêmes constructions de manière programmatique
Nous n’allons pas montrer dans la suite l’exhaustivité des expressions étudiées précédemment mais deux exemples qui présentent visibleWhen et enabledWhen
A noter enfin, qu’il est préférable de passer par des constructions déclaratives pour une meilleure portabilité des applications à construire
147Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions par programmation : visibleWhen
Pour rappel une restriction visibleWhen est attachée à un élément menuContribution
Les services consacrés à la contribution d’éléments de menu (barre de menu, barre d’outils) sont définis par l’interface IMenuService
A partir d’un objet IMenuServicevoid addContributionItem(AbstractContributionFactory cont) : ajoute un élément de menu
La classe AbstractContributionFactory est utilisée pour construire un élément de menu
void abstract createContributionItems(IServiceLocator sl, IContributionRoot add) : doit être implémentée afin de construire un élément de menu
IMenuService menuService = (IMenuService)PlatformUI.getWorkbench().getService(ISourceProviderService.class);
148Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions par programmation : visibleWhen
Exemple : afficher une commande dans le menu dont la restriction visibleWhen est contrôlée par programmation
Projet CommandsProgrammaticVisibleWhenExamples
Création d’un élément dans le menu
Bouton « Hide » cache l’élément du menu
Bouton « Show » affiche l’élément du menu
149Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions par programmation : visibleWhen
Exemple (suite) : afficher une commande dans le menu dont la restriction visibleWhen est contrôlée par programmation
public class CreateMenuContributionViewPart extends ViewPart {private boolean isVisible = true;private CommandContributionItem item;private Expression currentExpression;public void createPartControl(Composite parent) {
...final Button myButton = new Button(parent, SWT.NONE);myButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {IMenuService service = (IMenuService) PlatformUI.getWorkbench().getService(IMenuService.class);AbstractContributionFactory ref = new AbstractContributionFactory("menu:org.eclipse.ui.main.menu", null) {
public void createContributionItems(IServiceLocator serviceLocator, IContributionRoot additions) {CommandContributionItemParameter commandParameter = new CommandContributionItemParameter(
serviceLocator, "contributionitem","eclipse.workbench.commandsprogrammaticvisiblewhenexamples.helloworldcommandid",CommandContributionItem.STYLE_PUSH);
currentExpression = new Expression() {public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
if (isVisible) {return EvaluationResult.TRUE;
} else {return EvaluationResult.FALSE;
}
}};item = new CommandContributionItem(commandParameter);additions.addContributionItem(item, currentExpression);
}};service.addContributionFactory(ref);myButton.setEnabled(false);
}});... // Suite dans le prochain transparent
CreateMenuContributionViewPart.java du projet CommandsProgrammaticVisibleWhenExamples
Construction d’un élément dans le menu principal
L’expression est très simple et elle est pilotée par l’attribut
isVisible
150Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions par programmation : visibleWhen
Exemple (suite) : afficher une commande dans le menu dont la restriction visibleWhen est contrôlée par programmation
public class CreateMenuContributionViewPart extends ViewPart {...public void createPartControl(Composite parent) {
...Button hideMenuContribution = new Button(parent, SWT.NONE);hideMenuContribution.setText("Hide");hideMenuContribution.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {isVisible = false;
updateExpression();}
});
Button showMenuContribution = new Button(parent, SWT.NONE);showMenuContribution.setText("Show");showMenuContribution.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {isVisible = true;
updateExpression();}
});}// Suite dans le prochain transparent
CreateMenuContributionViewPart.java du projet CommandsProgrammaticVisibleWhenExamples
Modification de l’attribut isVisible
151Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions par programmation : visibleWhen
Exemple (suite) : afficher une commande dans le menu dont la restriction visibleWhen est contrôlée par programmation
public class CreateMenuContributionViewPart extends ViewPart {private void updateExpression() {
WorkbenchWindow current = (WorkbenchWindow)PlatformUI.getWorkbench().getActiveWorkbenchWindow();final Set<EvaluationReference> menuRestrictions = current.getMenuRestrictions();if (menuRestrictions == null) { return; }
IEvaluationService es = (IEvaluationService)PlatformUI.getWorkbench().getService(IEvaluationService.class);IEvaluationContext currentState = es.getCurrentState();
EvaluationReference[] refs = (EvaluationReference[]) menuRestrictions.toArray(new EvaluationReference[menuRestrictions.size()]);boolean changeDetected = false;for (EvaluationReference evalRef : refs) {
final Expression expression = evalRef.getExpression();if (expression == currentExpression) {
evalRef.setPostingChanges(true);boolean os = evalRef.evaluate(currentState);evalRef.clearResult();boolean ns = evalRef.evaluate(currentState);
if (os != ns) {changeDetected = true;evalRef.getListener().propertyChange(
new PropertyChangeEvent(evalRef, evalRef.getProperty(),valueOf(os),valueOf(ns)));}
}}
if (changeDetected) {IMenuService ms = (IMenuService) PlatformUI.getWorkbench().getService(IMenuService.class);if (ms instanceof WorkbenchMenuService) { ((WorkbenchMenuService) ms).updateManagers(); }
}}
private Boolean valueOf(boolean result) { return result ? Boolean.TRUE : Boolean.FALSE; }}
CreateMenuContributionViewPart.java du projet CommandsProgrammaticVisibleWhenExamples
Inspirée de la méthode liftRestrictions de la classe
WorkbenchWindow
152Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions par programmation : enabledWhen
Dans le cas d’une restriction enabledWhen, il s’agit de
contrôler un handler
Précédemment nous avons montré comment créer et associer
une commande via IHandlerService
IHandlerActivation activateHandler(String commandId, IHandler
handler) : associe une commande à un handler
Cette même interface fournit une méthode activateHandler
avec la possibilité d’ajouter une expression (enabledWhen)
IHandlerActivation activateHandler(String commandId, IHandler
handler, Expression exp) : associer une commande à un handler et
définir une restriction enabledWhen via exp
153Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions par programmation : enabledWhen
Exemple : activée un handler dans le menu dont la restriction enabledWhen est contrôlée par programmation
Projet CommandsProgrammaticEnabledWhenExamples
Handler associé à la commande est désactivé
Handler associé à la commande est activé
154Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions par programmation : enabledWhen
Exemple (suite) : activée un handler dans le menu dont la restriction enabledWhen est contrôlée par programmation
public class CreateHandlerViewPart extends ViewPart {
private boolean isEnabled = true;
public void createPartControl(Composite parent) {...final Button createButton = new Button(parent, SWT.NONE);createButton.setText("Create");createButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {IHandlerService hs = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);IHandler handler = new AbstractHandler() {
public Object execute(ExecutionEvent event) throws ExecutionException {MessageDialog.openInformation(Display.getDefault().getActiveShell(),
"CommandsExamples Plug-in", "Hello, Eclipse World with Third Handler");return null;
}};Expression enabledWhen = new Expression() {
public void collectExpressionInfo(ExpressionInfo info) {info.markDefaultVariableAccessed();
}
public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {if (isEnabled)
return EvaluationResult.TRUE; else
return EvaluationResult.FALSE;}
};hs.activateHandler("eclipse.workbench.commandsprogrammaticenabledwhenexamples.helloworldcommandid",
handler,enabledWhen);createButton.setEnabled(false);
}}); // Suite dans le prochain transparent
CreateHandlerViewPart.java du projet CommandsProgrammaticVisibleWhenExamples
Nécessaire pour la mise à jour de l’expression. Notification est
effectuée à chaque modification des variables « expression »
155Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Restrictions par programmation : enabledWhen
Exemple (suite) : activée un handler dans le menu dont la restriction enabledWhen est contrôlée par programmation
public class CreateHandlerViewPart extends ViewPart {
private boolean isEnabled = true;
public void createPartControl(Composite parent) {...Button disabledHandler = new Button(parent, SWT.NONE);disabledHandler.setText("Disabled");disabledHandler.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {isEnabled = false;
}});
Button enabledHandler = new Button(parent, SWT.NONE);enabledHandler.setText("Enabled");enabledHandler.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {isEnabled = true;
}});
}}
CreateHandlerViewPart.java du projet CommandsProgrammaticVisibleWhenExamples
Modification de l’attribut isVisible
156Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Paramètres : généralités
Actuellement lors du déclenchement d’une commande, il
n’est pas possible de paramétrer l’exécution du handler
associé
Si on souhaite obtenir plusieurs comportements différents
pour une commande donnée il sera nécessaire de définir
plusieurs commandes
L’API Commands permet d’ajouter des paramètres à une
commande via le sous élément commandParameter
Les valeurs de ces paramètres sont données lors de la
définition du déclenchement de la commande, c’est-à-dire
au niveau des sous éléments menuContribution
157Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Paramètres : ajouter des paramètres
L’ajout des paramètres est réalisé au niveau de la définition d’une commande (extension sur org.eclipse.ui.commands)
Il faut ajouter des sous éléments commandParamter àl’élément command
Possibilité pour une commande de définir plusieurs paramètres
Un paramètre est défini par les attributs suivants
id : identifiant du paramètre (utilisé pour la manipulation)
name : nom du paramètre
values : définir l’ensemble des valeurs autorisées
typeId : permet d’utiliser un autre type que String
optional : précise si le paramètre est obligatoire ou pas
158Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Paramètres : ajouter des paramètres
Exemple : afficher l’emplacement (menu ou toolbar) où est déclenchée une commande
plugin.xml du projet CommandsParametersExamples
Ajout d’un élément commandParameter
Identifiant utilisé pour les manipulations du paramètre
159Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Paramètres : fournir des valeurs aux paramètres
Les valeurs données aux paramètres sont précisées lors de
la définition du déclenchement de la commande
Pour rappel, la définition du déclenchement de la commande
est réalisée au niveau des sous éléments menuContribution
Au niveau de l’élément command (sous élément de
menuContribution) il faut ajouter un sous élément parameter
L’élément parameter contient deux attributs
name : identifiant du paramètre
value : valeur à donner pour ce paramètre (String)
160Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Paramètres : fournir des valeurs aux paramètres
Exemple (suite) : afficher l’emplacement (menu ou toolbar) où est déclenchée une commande
plugin.xml du projet CommandsParametersExamples
Identifiant du paramètre dont la valeur doit être transmise
Valeur du paramètre …opendialogparameterid
161Commands - M. Baron - Page
keul
keul
.blo
gspo
t.comParamètres : traitement dans le handler
Dans le code du handler, les valeurs du paramètre permet-
tent d’effectuer des traitements particuliers
Pour rappel un handler doit implémenter un objet de type
IHandler (implémentation abstraite via AbstractHandler)
Object execute(ExecutionEvent e) : traitement réalisé quand la
commande est déclenchée
L’objet ExecutionEvent permet d’extraire la valeur d’un
paramètre
String getParameter(String param) : récupération de la valeur du
paramètre param
162Commands - M. Baron - Page
keul
keul
.blo
gspo
t.comParamètres : traitement dans le handler
Exemple (suite) : afficher l’emplacement (menu ou toolbar) où est déclenchée une commande
public class OpenDialogHandler extends AbstractHandler {
@Overridepublic Object execute(ExecutionEvent event) throws ExecutionException {
String param = event.getParameter("eclipse.workbench.commandsparametersexamples.opendialogparameterid");
MessageDialog.openInformation(Display.getDefault().getActiveShell(),"CommandsParametersExamples Plug-in","opendialogparameterid parameter value : " + param);
return null; }
}
OpenDialogHandler.java du projet CommandsParametersExamples
Récupération de la valeur du paramètre …opendialogparameterid
163Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Paramètres : renseigner les valeurs autorisées
Il est également possible de définir à l’avance la liste des
valeurs prises en compte par un paramètre
L’attribut values de l’élément commandParameter est utilisé
pour fournir cette information
Par ailleurs, l’environnement Eclipse fournit un outil permet-
tant de lister l’intégralité des commandes et des valeurs
autorisées (sous condition que l’attribut values soit renseigné)
L’outil est accessible via les préférences (menu Window ->
Preferences -> General -> Keys)
164Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Paramètres : renseigner les valeurs autorisées
Le paramètre Open Dialog Values Parameteraccepte deux valeurs : menu et toolbar
Pour que les valeurs potentielles du paramètre soient affichées il est
obligatoire d’associer la commande a une catégorie
165Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Paramètres : renseigner les valeurs autorisées
L’attribut values de l’élément commandParameter doit
renseigner un objet de type IParameterValues
Cette interface fournit une méthode
Map<String, String> getParameterValues() : valeurs autorisées
Exemplepublic class ParameterValues implements IParameterValues {
public Map<String, String> getParameterValues() {Map<String, String> params = new HashMap<String, String>();
params.put("menu", "In Toolbar");params.put("toolbar", "In Menu");
return params; }
}
Valeurs affichées à l’utilisateur associées aux valeurs autorisées par le paramètre
166Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Paramètres : renseigner les valeurs autorisées
Possibilité de définir les valeurs autorisées en passant par une approche déclarative
plugin.xml du projet CommandsParametersExamples
Ne rien préciser au niveau de l’attribut
values
167Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Paramètres : renseigner les valeurs autorisées
Suite : Possibilité de définir les valeurs autorisées en passant par une approche déclarative
plugin.xml du projet CommandsParametersExamples
Ajouter un sous élément values
1Utiliser cette classe de type
IParameterValues définie par la plateforme Eclipse
2
168Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Paramètres : renseigner les valeurs autorisées
Suite : Possibilité de définir les valeurs autorisées en passant par une approche déclarative
plugin.xml du projet CommandsParametersExamples
Ajouter des sous éléments parameter qui désignent les
valeurs possibles
Nom de la valeur et valeur àdonner
169Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Réutilisation : Plug-in Spy
L’utilitaire Plug-in Spy permet d’espionner une application Eclipse en cours d’exécution
Cet utilitaire est fourni nativement dans la plateforme Eclipse depuis la version 3.4
L’espionnage donne des informations surLa vue active (éléments des menus contextuels, identifiants, …)
La sélection en cours
Les identifiants des commandes
La position d’un menuContribution (locationURI)
Pour démarrer l’outil deux options disponiblesShift + Alt + F1 : pour l’espionnage des vues, du workbench, …
Shift + Alt + F2 : pour l’espionnage des menus et des commandes
170Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Réutilisation : Plug-in Spy
Exemple : Espionner la vue Package Explorer via le raccourci Shift + Alt + F1
Identifie la classe ViewPart qui code la vue Package Explorer
Identifie le plugin où est définie la vue
Récupère l’identifiant de la vue
Récupère l’identifiant du menu de la vue
Donne des informations sur la sélection en cours
171Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Réutilisation : Plug-in Spy
Exemple : Espionner un élément de menu (closePerspective)via le raccourci Shift + Alt + F2 (à partir d’Eclipse 3.5)
Récupère l’identifiant de l’élément menuContribution
La position (locationURI) de l’élément
L’identifiant de la commande
Très utile pour récupérer les identifiants des commandes
prédéfinies par la plateforme Eclipse
172Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Réutilisation : Options de traçage
Lors de l’exécution d’une application Eclipse il est possible
d’activer les logs dans le but d’afficher les identifiants des
commandes utilisés
Les options de traçage peuvent également être utilisés pour
obtenir des informations sur tous les plug-ins qu’ils soient de
la plateforme Eclipse ou non
L’activation des logs est réalisée au niveau de l’onglet
Tracing d’une configuration d’exécution
L’activation doit être réalisée avant l’exécution de l’applica-
tion Eclipse
173Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Réutilisation : Options de traçage
Onglet Tracing
Sélectionner le plug-in org.eclipse.ui
Activer le mode debug
1
2
3
Activation les traces d’exécution des commandes
174Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Réutilisation : Options de traçage
Activer trace/commands
1
Possibilité d’activer les traces relatives aux handlers
2
Activation les traces d’exécution des commandes (suite)
175Commands - M. Baron - Page
keul
keul
.blo
gspo
t.com
Réutilisation : Options de traçage
Activation les traces d’exécution des commandes (suite)
Identifiant de la commande
Classe implémentant le handler