• Like
  • Save
Construction de commandes avec la plateforme Eclipse
Upcoming SlideShare
Loading in...5
×
 

Construction de commandes avec la plateforme Eclipse

on

  • 4,945 views

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 ...

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).

Statistics

Views

Total Views
4,945
Views on SlideShare
4,531
Embed Views
414

Actions

Likes
2
Downloads
122
Comments
0

8 Embeds 414

http://mbaron.developpez.com 314
http://keulkeul.blogspot.com 51
http://keulkeul.blogspot.fr 41
http://keulkeul.blogspot.be 4
http://www.keulkeul.blogspot.com 1
http://keulkeul.blogspot.it 1
http://keulkeul.blogspot.ca 1
http://keulkeul.blogspot.ch 1
More...

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Construction de commandes avec la plateforme Eclipse Construction de commandes avec la plateforme Eclipse Presentation Transcript

    • Développement de clients riches : Plateforme Eclipse Chapitre 3 : Conception de plug-ins Workbench : Commands Mickaël BARON - 2009 mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
    • Licence Creative Commons Contrat Paternité Partage des Conditions Initiales à l'Identique 2.0 France keulkeul.blogspot.com http://creativecommons.org/licenses/by-sa/2.0/fr Commands - M. Baron - Page 2
    • Organisation du cours sur le Workbench : Commands Avant, il y avait les Actions … Construction par déclaration et programmation Eléments menuContribution par déclaration Tous les exemples du cours Raccourcis clavier sont disponibles directement à l’adresse mbaron.developpez.com/eclipse/commands Restrictions (visibleWhen, enabledWhen, activeWhen) Paramétrer les commandes keulkeul.blogspot.com Restrictions par programmation Réutilisation Commands - M. Baron - Page 3
    • Déroulement du cours 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 keulkeul.blogspot.com Ceci est une astuce Remerciement Developpez.com : [TODO] Ceci est une alerte … Commands - M. Baron - Page 4
    • Ressources … Des billets sur les généralités sur les commandes blog.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 keulkeul.blogspot.com 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 Commands - M. Baron - Page 5
    • Ressources … (suite) Des articles sur les généralités sur les commandes wiki.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 keulkeul.blogspot.com Des livres Eclipse – 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 Commands - M. Baron - Page 6
    • Introduction 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) keulkeul.blogspot.com Command (apparue depuis Eclipse 3.3) L’API Actions est plus ancienne et doit être remplacée par l’API Commands Commands - M. Baron - Page 7
    • 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 keulkeul.blogspot.com Dans la suite nous présentons rapidement l’API Actions en insistant sur ces désavantages puis nous nous orienterons vers l’API Commands Commands - M. Baron - Page 8
    • 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 public interface IAction { void setText(String text); Caractéristiques liées void setImageDescriptor(ImageDescriptor image); à la présentation de void setAccelerator(int keycode); void setEnabled(boolean enabled); Caractéristique liée au l’action traitement de l’action void run(); // ... more setters and getters } Les aspects liés à la présentation (setText, setEnabled, …) keulkeul.blogspot.com 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 Commands - M. Baron - Page 9
    • 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 keulkeul.blogspot.com 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 Commands - M. Baron - Page 10
    • 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 keulkeul.blogspot.com Projet ActionsExamples Commands - M. Baron - Page 11
    • 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 keulkeul.blogspot.com Template pour créer rapidement cette extension Commands - M. Baron - Page 12
    • 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 keulkeul.blogspot.com plugin.xml du projet Onglet Extensions ActionsExamples Commands - M. Baron - Page 13
    • 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 Texte affiché dans le menu de l’application keulkeul.blogspot.com Possibilité d’ajouter le nouveau menu à un menu existant plugin.xml du projet Onglet Extensions ActionsExamples Commands - M. Baron - Page 14
    • 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 keulkeul.blogspot.com plugin.xml du projet Onglet Extensions ActionsExamples Commands - M. Baron - Page 15
    • Ancienne API Actions Exemple (suite) : ajouter une action au menu et à la barre d’outils d’une application Eclipse avec l’API Actions 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 keulkeul.blogspot.com Classe de type IWorkbenchWindowActionDelegage codant le traitement de l’action Commands - M. Baron - Page 16
    • 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, keulkeul.blogspot.com 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 - M. Baron - Page Commands 17
    • 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 keulkeul.blogspot.com Un template « Hello, World » pour définir une commande Commands - M. Baron - Page 18
    • Construction par déclaration Définition des attributs d’une commande keulkeul.blogspot.com Un handler par défaut peut être défini, dans la suite on plugin.xml du projet Onglet Extensions montrera qu’il est possible CommandsExamples d’extraire cette relation Commands - M. Baron - Page 19
    • Construction par déclaration 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 package eclipse.workbench.commandsexamples.handler; public class FirstHandler extends AbstractHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { keulkeul.blogspot.com MessageDialog.openInformation(Display.getDefault().getActiveShell(), "CommandsExamples Plug-in","Hello, Eclipse world with First Handler"); return ""; } } Classe FirstHandler.java du projet CommandsExamples Commands - M. Baron - Page 20
    • 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 keulkeul.blogspot.com Contraintes seront étudiées à la fin activeWhen : comportement actif ou pas de cette partie enabledWhen : comportement activé ou pas Commands - M. Baron - Page 21
    • 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 keulkeul.blogspot.com Commands - M. Baron - Page 22
    • Associer une commande à un Handler Définition du couple commande / handler Identifiant de la commande Classe de type IHandler keulkeul.blogspot.com correspondant au traitement de la commande plugin.xml du projet Onglet Extensions CommandsExamples Commands - M. Baron - Page 23
    • 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 keulkeul.blogspot.com 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 Commands - M. Baron - Page 24
    • 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 keulkeul.blogspot.com Commands - M. Baron - Page 25
    • Associer une commande à des images Définition du couple commande / images Les différentes Identifiant de la commande images utilisées keulkeul.blogspot.com Si aucune valeur, cela concerne la barre de menu, si la valeur vaut plugin.xml du projet toolbar cela concerne la barre d’outils Onglet Extensions CommandsExamples Commands - M. Baron - Page 26
    • 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 keulkeul.blogspot.com ICommandService cs = (ICommandService)PlatformUI.getWorkbench().getService(ICommandService.class); IHandlerService hs = (IHandlerService)PlatformUI.getWorkbench().getService(IHandlerService.class); La destruction des commandes et handler sont à la charge du programmeur Commands - M. Baron - Page 27
    • 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 keulkeul.blogspot.com 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)Commands - M. Baron - Page 28
    • Construction par programmation Exemple : construire une commande Récupération du service de création de commandes Construction de la catégorie 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 } Construction de la commande thirdcommand keulkeul.blogspot.com Association de la commande à la catégorie Classe ViewCommandPart.java du projet CommandsExamples Commands - M. Baron - Page 29
    • 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 keulkeul.blogspot.com Pour rappel, la classe IHandler a été étudiée précédemment, la classe AbstractHandler fournit une abstraction des principales méthodes Commands - M. Baron - Page 30
    • Construction par programmation Exemple (suite) : exécuter une commande public class ViewCommandPart extends ViewPart { public void createPartControl(Composite parent) { Récupération du service de // Suite du précédent transparent handler 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); Associer une commande avec un callCommand.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { try { handler IHandlerService hs = (IHandlerService)PlatformUI.getWorkbench() .getService(IHandlerService.class); hs.executeCommand("eclipse.workbench.commandsexample.thirdcommand", null); } catch (Exception e1) { keulkeul.blogspot.com e1.printStackTrace(); } } Exécuter un handler à partir de }); callCommand.setText("Call Third Command"); } } l’identifiant d’une commande Classe ViewCommandPart.java du projet CommandsExamples Commands - M. Baron - Page 31
    • 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é keulkeul.blogspot.com 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 Commands - M. Baron - Page 32
    • Construction par programmation Exemple : écouter l’exécution d’une commande public class ViewCommandPart extends ViewPart { public void createPartControl(Composite parent) { // Suite du précédent transparent ICommandService 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()"); } Ecouteur sur la totalité }); ... des exécutions de thirdCommand.addExecutionListener(new IExecutionListener() { commande public void notHandled(String commandId, NotHandledException exception) { System.out.println(".notHandled()"); } public void postExecuteSuccess(String commandId, Object returnValue) { System.out.println(".postExecuteSuccess()"); } keulkeul.blogspot.com public void preExecute(String commandId, ExecutionEvent event) { System.out.println(".preExecute()"); } ... }); Ecouteur sur l’exécution } } d’une commande Classe ViewCommandPart.java du projet CommandsExamples Commands - M. Baron - Page 33
    • 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 keulkeul.blogspot.com 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 Commands - M. Baron - Page 34
    • 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 keulkeul.blogspot.com Commands - M. Baron - Page 35
    • 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) keulkeul.blogspot.com Ajout d’un élément menuContribution Commands - M. Baron - Page 36
    • Commande dans le Workbench Modification de la valeur de l’attribut locationURI L’attribut locationURI permet d’indiquer où sera placée la commande keulkeul.blogspot.com Dans la suite nous donnons des explications sur la construction de l’attribut locationURI Commands - M. Baron - Page 37
    • Commande dans le Workbench La valeur de l’attribut locationURI est de la forme suivante [scheme]:[id]?[placement] 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) keulkeul.blogspot.com Exemple Ajoute un élément avant l’élément Quit menu:file?before=quit situé dans le menu File Commands - M. Baron - Page 38
    • 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 keulkeul.blogspot.com l’application Eclipse toolbar:viewcommandId : ajout un élément à la barre d’outil de la vue identifiée par viewcommandId Commands - M. Baron - Page 39
    • 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) keulkeul.blogspot.com 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 Commands - M. Baron - Page 40
    • 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 keulkeul.blogspot.com Lors de l’utilisation de la commande une boîte de dialogue est affichée Commands - M. Baron - Page 41
    • Commande dans le menu Exemple (suite) : ajoute une commande au menu principal d’une application Eclipse Ajout d’une commande au niveau du menu principal de l’application Eclipse keulkeul.blogspot.com plugin.xml du projet CommandsExamples Commands - M. Baron - Page 42
    • Commande dans le menu Exemple (suite) : ajoute une commande au menu principal Réutilisation d’une commande d’une application Eclipse définie précédemment keulkeul.blogspot.com Ajout d’un élément command L’élément command permet de préciser les caractéristiques graphiques de la commande plugin.xml du projet (texte, image, …) CommandsExamples Commands - M. Baron - Page 43
    • 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 keulkeul.blogspot.com Commands - M. Baron - Page 44
    • Commande dans le menu Exemple (suite) : ajoute une commande dans un sous menu du menu principal d’une application Eclipse Ajout d’un menu au niveau du menu principal de l’application Eclipse keulkeul.blogspot.com plugin.xml du projet CommandsExamples Commands - M. Baron - Page 45
    • Commande dans le menu Exemple (suite) : ajoute une commande dans un sous menu du menu principal d’une application Eclipse Caractéristiques graphiques de l’élément menu Ajout d’un élément menu keulkeul.blogspot.com Ajout de deux éléments command à l’élément menu plugin.xml du projet CommandsExamples Commands - M. Baron - Page 46
    • Commande dans le menu Exemple (suite) : ajoute une commande dans un sous menu du menu principal d’une application Eclipse keulkeul.blogspot.com plugin.xml du projet CommandsExamples Commands - M. Baron - Page 47
    • 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) keulkeul.blogspot.com Un composant graphique (élément control) Dans la suite des transparents nous présentons la mise en œuvre de certains de ces éléments Commands - M. Baron - Page 48
    • 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 keulkeul.blogspot.com Lors de l’utilisation de la commande une boîte de dialogue est affichée Commands - M. Baron - Page 49
    • Commande dans une barre d’outil Exemple (suite) : ajouter une commande dans la barre d’outil principale d’une application Eclipse Ajout d’une commande au niveau de la barre d’outils de l’application Eclipse keulkeul.blogspot.com plugin.xml du projet CommandsExamples Commands - M. Baron - Page 50
    • Commande dans une barre d’outil Exemple (suite) : ajouter une commande dans la barre d’outil principale d’une application Eclipse Identifiant de la nouvelle barre d’outils contenant l’élément command. Possibilité d’étendre directement cette nouvelle barre d’outils keulkeul.blogspot.com Un élément toolbar est ajouté à l’élément plugin.xml du projet menuContribution. Une nouvelle barre d’outils CommandsExamples est ajoutée à la barre d’outils principale Commands - M. Baron - Page 51
    • Commande dans une barre d’outil Exemple (suite) : ajouter une commande dans la barre d’outil principale d’une application Eclipse Réutilisation d’une commande définie précédemment keulkeul.blogspot.com Ajout d’un élément command à la nouvelle barre d’outils L’élément command permet de préciser les caractéristiques graphiques de la commande plugin.xml du projet (texte, image, …) CommandsExamples Commands - M. Baron - Page 52
    • Commande dans un menu localisé d’une vue Exemple : ajouter une commande dans le menu localisé d’une vue Menu localisé de la vue contenant une commande keulkeul.blogspot.com Vue …commandsexample.views.viewcommandid du projet CommandsExamples Commands - M. Baron - Page 53
    • Commande dans un menu localisé d’une vue Exemple (suite) : ajouter une commande dans le menu localisé d’une vue Scheme vaut menu et id pointe sur l’identifiant de la vue keulkeul.blogspot.com La création de l’élément command est identique aux précédents transparents plugin.xml du projet CommandsExamples Commands - M. Baron - Page 54
    • 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 keulkeul.blogspot.com Vue …commandsexample.views.viewcommandid du projet CommandsExamples Commands - M. Baron - Page 55
    • Commande dans une barre d’outils de vue Exemple (suite) : ajouter une commande dans la barre d’outils d’une vue Scheme vaut toolbar et id pointe sur l’identifiant de la vue La création de l’élément command est keulkeul.blogspot.com identique aux précédents transparents plugin.xml du projet CommandsExamples Commands - M. Baron - Page 56
    • 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) keulkeul.blogspot.com 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) Commands - M. Baron - Page 57
    • Commande dans un menu contextuel de vue Exemple : ajouter une commande dans le menu contextuel d’une vue Menu contextuel de la vue contenant plusieurs commandes keulkeul.blogspot.com Vue …commandsexample.views.popupviewcommandid du projet CommandsExamples Commands - M. Baron - Page 58
    • 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(); } Construction programmatique du keulkeul.blogspot.com ... // Suite dans le prochain transparent } contenu du menu contextuel PopupViewPart.java du projet CommandsExamples Commands - M. Baron - Page 59
    • 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 transparent Construction d’une action via l’API private void createContextMenu() { JFace (voir cours Perspectives et Views) 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); Construction d’une commande via menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager mgr) { IContributionItem (voir dans les prochains transparents) mgr.add(action1); mgr.add(ref); } }); keulkeul.blogspot.com // Create menu. Menu menu = menuMgr.createContextMenu(viewer.getControl()); viewer.getControl().setMenu(menu); // Register menu for extension. Déclare le menu contextuel dans le } getSite().registerContextMenu(menuMgr, viewer); Workbench, obligatoire pour } l’enrichir via les extensions PopupViewPart.java du projet CommandsExamples Commands - M. Baron - Page 60
    • 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 keulkeul.blogspot.com La création de l’élément command est identique aux précédents transparents plugin.xml du projet CommandsExamples Commands - M. Baron - Page 61
    • Commande dans un menu contextuel de vue Exemple (suite) : ajouter une commande dans le menu contextuel d’une vue Récupération de la sélection courante Correspond au handler de la commande via le service de sélection ajoutée au menu contextuel 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()); keulkeul.blogspot.com } } return null; } } ShowSelectedHandler.java du projet CommandsExamples Commands - M. Baron - Page 62
    • Commande dans un menu contextuel de vue Exemple : ajouter une commande dans le menu contextuel d’une vue avec une contrainte de positionnement Cette commande doit être placée avant First Command identifiée par contributionitem (définie programmatiquement) keulkeul.blogspot.com Vue …commandsexample.views.popupviewcommandid du projet CommandsExamples Commands - M. Baron - Page 63
    • Commande dans un menu contextuel de vue Exemple (suite) : ajouter une commande dans le menu contextuel d’une vue avec une contrainte de positionnement Utilisation de la contrainte de placement before=contributionitem pour placer avant la commande keulkeul.blogspot.com First Command plugin.xml du projet CommandsExamples Commands - M. Baron - Page 64
    • 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 keulkeul.blogspot.com Commands - M. Baron - Page 65
    • Commande dans un menu contextuel de vue Exemple (suite) : ajouter une commande dans tous les menus contextuels des vues Scheme vaut popup et id pointe sur l’identifiant org.eclipse.ui.popup.any keulkeul.blogspot.com plugin.xml du projet CommandsExamples Commands - M. Baron - Page 66
    • 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 keulkeul.blogspot.com 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 Commands - M. Baron - Page 67
    • Aller plus loin avec menuContribution : dynamic Exemple : ajout dynamique d’éléments dans un menu Les deux commandes sont ajoutées dans le sous menu Dynamic Example keulkeul.blogspot.com Projet CommandsExamples Commands - M. Baron - Page 68
    • Aller plus loin avec menuContribution : dynamic Exemple (suite) : ajout dynamique d’éléments dans un menu Création d’un élément dynamic Classe de type IContributionItem keulkeul.blogspot.com plugin.xml du projet CommandsExamples Commands - M. Baron - Page 69
    • Aller plus loin avec menuContribution : dynamic Exemple (suite) : ajout dynamique d’éléments dans un menu A utiliser comme implémentation abstraite de IContributionItem 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); keulkeul.blogspot.com tab[1] = ref; return tab; Utilisation de commandes définies } } précédemment ContributionItemExample.java du projet CommandsExamples Commands - M. Baron - Page 70
    • Aller plus loin avec menuContribution : control Exemple : création d’un élément personnalisé dans une barre d’outils Création d’un élément dans la barre d’outils à partir de l’API SWT keulkeul.blogspot.com Projet CommandsExamples Commands - M. Baron - Page 71
    • Aller plus loin avec menuContribution : control Exemple (suite) : création d’un élément personnalisé dans une barre d’outils Classe de type WorkbenchWindowControlContribution Création d’un élément keulkeul.blogspot.com control plugin.xml du projet CommandsExamples Commands - M. Baron - Page 72
    • 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"); Composants SWT 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(); keulkeul.blogspot.com } } }); return composite; } } Déclenchement d’une commande WorkbenchWindowCustomControlContribution.java du projet CommandsExamples Commands - M. Baron - Page 73
    • 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 keulkeul.blogspot.com raccourcis claviers (key) et des regroupements de raccourcis claviers (scheme) Commands - M. Baron - Page 74
    • 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 keulkeul.blogspot.com Commands - M. Baron - Page 75
    • Raccourci clavier Ajouter un élément key permettant de construire un raccourci clavier keulkeul.blogspot.com plugin.xml du projet CommandsKeyBindingRCPExamples Commands - M. Baron - Page 76
    • Raccourci clavier Construire un raccourci clavier actif quand la touche F11 est déclenchée keulkeul.blogspot.com plugin.xml du projet CommandsKeyBindingRCPExamples Commands - M. Baron - Page 77
    • Raccourci clavier Paramétrer les attributs d’un élément key sequence définit la séquence de touches schemeId définit le regroupement de du clavier qui active la commande raccourcis clavier. Par défaut org.eclipse.ui.defaultAcceleratorConfiguration keulkeul.blogspot.com platform définit le système sur commandId définit l’identifiant lequel le raccourci est défini (win32, de la commande à appeler lors gtk, motif, carbon, photon) de l’utilisation de la touche F11 Commands - M. Baron - Page 78
    • 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 keulkeul.blogspot.com 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 Commands - M. Baron - Page 79
    • 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 keulkeul.blogspot.com Quand plusieurs raccourcis claviers se succèdent une fenêtre flottante contextualise l’interaction en cours Commands - M. Baron - Page 80
    • 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 keulkeul.blogspot.com 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 Commands - M. Baron - Page 81
    • Raccourci clavier : scheme Définir un scheme via le point d’ext. org.eclipse.ui.bindings Construction d’un élément scheme permettant de regroupant de raccourcis clavier keulkeul.blogspot.com plugin.xml du projet CommandsKeyBindingRCPExamples Commands - M. Baron - Page 82
    • Raccourci clavier : scheme Définir un scheme via le point d’ext. org.eclipse.ui.bindings Définition de l’identifiant du scheme Précise le nom du scheme keulkeul.blogspot.com Relation d’héritage avec un scheme déjà créé plugin.xml du projet CommandsKeyBindingRCPExamples Commands - M. Baron - Page 83
    • Raccourci clavier : scheme Attribuer l’identifiant du scheme à l’attribut schemeId de key Définition de la séquence du raccourci clavier Préciser l’identifiant du scheme précédemment créé keulkeul.blogspot.com L’identifiant de la commande qui sera appelée plugin.xml du projet CommandsKeyBindingRCPExamples Commands - M. Baron - Page 84
    • Raccourci clavier : scheme (création d’un product) Construction d’une application Eclipse RCP Construction d’un nouveau projet Plug-in (File -> New -> Project -> Plug-in Project) keulkeul.blogspot.com Une présentation détaillée sur la manière de construire un product sera donnée dans la partie Eclipse RCP Commands - M. Baron - Page 85
    • Raccourci clavier : scheme (création d’un product) Construction d’une application Eclipse RCP (suite) Différents paramétrages identiques à ceux utilisés lors de la création d’un plug-in keulkeul.blogspot.com S’assurer que l’option Rich Client Application est active Commands - M. Baron - Page 86
    • Raccourci clavier : scheme (création d’un product) Construire le fichier de configuration du product Construction d’un nouveau projet Plug-in (File -> New -> Other … -> Product Configuration) Choisir le projet où sera créé le product Définir le nom du product keulkeul.blogspot.com Créer le product à partir d’une configuration allégée Commands - M. Baron - Page 87
    • Raccourci clavier : scheme (création d’un product) Configuration du fichier de configuration du product Nécessite la création de l’identifiant du product keulkeul.blogspot.com Commandskeybindingrcpexamples.product du projet CommandsKeyBindingRCPExamples Commands - M. Baron - Page 88
    • Raccourci clavier : scheme (création d’un product) Configuration du fichier de configuration du product (suite) Projet où l’identifiant du product sera créé Identifiant du product keulkeul.blogspot.com Identifiant de l’application sur laquelle le product est associé Commands - M. Baron - Page 89
    • Raccourci clavier : scheme (création d’un product) Configuration du fichier de configuration du product (suite) Lors de la création de l’identifiant une extension basée sur org.eclipse.core.runtime.products a été créée keulkeul.blogspot.com Nom donné à l’identifiant du product plugin.xml du projet CommandsKeyBindingRCPExamples Commands - M. Baron - Page 90
    • Raccourci clavier : scheme (création d’un product) Définir un fichier de configuration des préférences utilisateur Clé (KEY_CONFIGURATION_ID) permettant d’activer un scheme Identifiant du scheme qui doit être rendu actif org.eclipse.ui/KEY_CONFIGURATION_ID = eclipse.workbench.commandskeybindingrcpexamples.specificdefaultacceleratorconfigurationid org.eclipse.ui/SHOW_PROGRESS_ON_STARTUP = false pluginpreference.ini du projet CommandsKeyBindingRCPExamples keulkeul.blogspot.com Le fichier pluginpreference.ini est placé à la racine du projet Commands - M. Baron - Page 91
    • Raccourci clavier : scheme (création d’un product) Déclarer le fichier pluginpreference.ini dans le fichier de confi- guration du product Définition d’une propriété à l’extension products pour keulkeul.blogspot.com configurer le product plugin.xml du projet CommandsKeyBindingRCPExamples Commands - M. Baron - Page 92
    • Raccourci clavier : scheme (création d’un product) Déclarer le fichier pluginpreference.ini dans le fichier de confi- guration du product (suite) Nom de la propriété à ajouter : preferenceCustomization Nom du fichier de configuration : keulkeul.blogspot.com pluginpreference.ini plugin.xml du projet CommandsKeyBindingRCPExamples Commands - M. Baron - Page 93
    • Raccourci clavier : scheme Exécuter l’application et reproduire la séquence : F9 Lors de l’appui sur la touche F9, la commande keyspecificcommandid est déclenchée keulkeul.blogspot.com Projet CommandsKeyBindingRCPExamples Commands - M. Baron - Page 94
    • 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 est keulkeul.blogspot.com visibleWhen : 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 Core Expressions Commands - M. Baron - Page 95
    • Restrictions : exemples Exemple : Afficher une commande dans la barre d’outils principale quand un élément est sélectionné Un élément dans le service de sélection keulkeul.blogspot.com La commande est affichée dans Pas d’élément dans le la barre d’outils principale service de sélection Commands - M. Baron - Page 96
    • Restrictions : exemples Exemple (suite) : Afficher une commande dans la barre d’outils principale quand un élément est sélectionné Une restriction visibleWhen au niveau d’un élément menuContribution Commande est affichée quand un keulkeul.blogspot.com seul élément de la sélection est sélectionné plugin.xml du projet CommandsExpressionsExamples Commands - M. Baron - Page 97
    • Restrictions : exemples Exemple : Afficher une commande dans la barre d’outils principale quand une vue est active La vue « View Command Expression » La vue « View Command Expression » n’est pas active est active keulkeul.blogspot.com La commande « Second Command La commande « Second Command Expression » est maintenant activée Expression » est désactivée Commands - M. Baron - Page 98
    • Restrictions : exemples Exemple (suite) : Afficher une commande dans la barre d’outils principale quand une vue est active Une restriction enabledWhen au niveau d’un élément handler keulkeul.blogspot.com Commande est activée quand la vue plugin.xml du projet active est « View Command Expression » CommandsExpressionsExamples Commands - M. Baron - Page 99
    • 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 keulkeul.blogspot.com définition Ajouter une dépendance sur org.eclipse.core.expressions pour exploiter le point d’extension org.eclipse.core.expressions.definitions Commands - M. Baron - Page 100
    • Restrictions : construire Expression Definitions Point d’extension permettant de créer des définitions d’expression keulkeul.blogspot.com Commands - M. Baron - Page 101
    • keulkeul.blogspot.com Restrictions : construire Expression Definitions Création d’une définition d’expression : plugin.xml du projet un élément du service de sélection CommandsExpressionsExamples Commands - M. Baron - Page 102
    • Restrictions : utiliser Expression Definitions Définition d’un nouvel élément menuContribution avec une restriction visibleWhen dont l’expression a été définie précédemment Utilisation du sous élément keulkeul.blogspot.com reference de visibleWhen (s’appliquerait également à enabledWhen et activeWhen) plugin.xml du projet CommandsExpressionsExamples Commands - M. Baron - Page 103
    • Restrictions : utiliser Expression Definitions Pas d’élément dans le service de sélection keulkeul.blogspot.com Lors de la sélection d’un élément, les deux commandes sont affichées dans la barre d’outils principale Commands - M. Baron - Page 104
    • Restrictions : 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 keulkeul.blogspot.com Commands - M. Baron - Page 105
    • 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 keulkeul.blogspot.com * : n’importe quelle valeur ? : 0 ou 1 élément + : 1 ou plusieurs éléments ! : aucun élément Commands - M. Baron - Page 106
    • Restrictions : élément count Exemple : Afficher une commande dans la barre d’outils principale quand zéro ou un élément est sélectionné Une restriction visibleWhen au niveau d’un élément menuContribution La commande est affichée si keulkeul.blogspot.com l’élément count s’assure qu’il n’y ait aucune ou un élément de la sélection plugin.xml du projet CommandsExpressionsCountExamples Commands - M. Baron - Page 107
    • 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 keulkeul.blogspot.com 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 Commands - M. Baron - Page 108
    • 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 keulkeul.blogspot.com type à comparer Si la correspondance entre les types est correcte, l’élément instanceof est évalué à vrai Commands - M. Baron - Page 109
    • 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 Tous les éléments doivent respecter le sous élément instanceof de iterate Si la collection est vide, iterate est évalué à vrai keulkeul.blogspot.com plugin.xml du projet CommandsExpressionsIterateInstanceOfExamples Commands - M. Baron - Page 110
    • 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 Permet de comparer le type de l’objet en cours (occurrence de la sélection) avec le type String keulkeul.blogspot.com plugin.xml du projet CommandsExpressionsIterateInstanceOfExamples Commands - M. Baron - Page 111
    • 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 Si seuls des éléments de type String sont sélectionnés, la commande est affichée Une Table avec Si par contre la des éléments de sélection contient des keulkeul.blogspot.com type String et un éléments de type élément de type String et Integer, la Integer commande n’est pas affichée Commands - M. Baron - Page 112
    • 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 keulkeul.blogspot.com L’élément systemTest possède deux attributs property : le nom de la propriété à tester value : la valeur de la propriété Commands - M. Baron - Page 113
    • Restrictions : élément systemTest Exemple : Afficher une commande dans la barre d’outils quand la propriété user.name vaut baronm Permet de comparer la valeur de la propriété « user.name » avec la valeur baronm keulkeul.blogspot.com plugin.xml du projet CommandsExpressionsSystemTestExamples Commands - M. Baron - Page 114
    • Restrictions : élément test L’élément test permet de tester une valeur particulière d’une propriété sur un objet en cours Exemples A 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 Tester décrit au travers d’une classe Java de type PropertyTester L’élément test possède quatre attributs keulkeul.blogspot.com 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 aCommands - M. Baron - Page l’activation 115
    • 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 Espace de nommage Nom de la propriété La plateforme Eclipse fournit un ensemble prédéfinis de Property Tester qui sont utilisés pour le fonctionnement keulkeul.blogspot.com interne de l’environnement Eclipse Nous montrerons également dans la suite comment créer ses propres Property Tester Commands - M. Baron - Page 116
    • Restrictions : élément test Property Tester prédéfinis … keulkeul.blogspot.com Commands - M. Baron - Page 117
    • Restrictions : élément test Property Tester prédéfinis … (suite) keulkeul.blogspot.com Commands - M. Baron - Page 118
    • Restrictions : élément test Exemple : Désactiver une commande dans la barre de menu quand toutes les perspectives sont fermées La perspective Resource est ouverte, la Toutes les perspectives sont fermées, la commande est activée commande est désactivée keulkeul.blogspot.com Projet CommandsExpressionsTestExamples Commands - M. Baron - Page 119
    • Restrictions : élément test Exemple (suite) : Désactiver une commande dans la barre de menu quand toutes les perspectives sont fermées Classe implémentant le Espace de nommage Property Tester associé Type de l’objet Nom de la propriété keulkeul.blogspot.com La valeur de l’attribut property de test est org.eclipse.ui.workbenchWindow.isPerspectiveOpen Commands - M. Baron - Page 120
    • Restrictions : élément test Exemple (suite) : Désactiver une commande dans la barre de menu quand toutes les perspectives sont fermées L’objet en cours est activeWorkbenchWindow de type IWorkbenchWindow keulkeul.blogspot.com plugin.xml du projet CommandsExpressionsTestExamples Commands - M. Baron - Page 121
    • Restrictions : élément test Exemple (suite) : Désactiver une commande dans la barre de menu quand toutes les perspectives sont fermées Utilisation de la propriété org.eclipse.ui.workbenchWindow.isPerspectiveOpen keulkeul.blogspot.com Permet de forcer le démarrage du plugin de manière à prendre en compte cette restriction plugin.xml du projet CommandsExpressionsTestExamples Commands - M. Baron - Page 122
    • 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 keulkeul.blogspot.com Nous montrons dans la suite, la combinaison des éléments étudiés précédemment (iterate, instanceof, count et systemtest) Commands - M. Baron - Page 123
    • Restrictions : élément and, not et or Exemple : Afficher une commande dans la barre de menu si la 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 keulkeul.blogspot.com Elément de sélection de type différent Le nombre de sélection est et nombre de sélection égale à 2 => différent de 2 => Commande Commande non affichée affichée Commands - M. Baron - Page 124
    • Restrictions : élément and, not et or Exemple (suite) : Afficher une commande dans la barre de menu si … Bloc and keulkeul.blogspot.com Bloc not Bloc or plugin.xml du projet CommandsExpressionsAndNotOrExamples Commands - M. Baron - Page 125
    • Restrictions : définir ses propres variables d’évaluation Précédemment nous avons utilisé deux variables (selection et 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 keulkeul.blogspot.com Dans la suite est montré au travers d’un exemple la façon de créer une variable mettre à jour son contenu Commands - M. Baron - Page 126
    • Restrictions : définir ses propres variables d’évaluation Variable prédéfinies … keulkeul.blogspot.com Commands - M. Baron - Page 127
    • Restrictions : définir ses propres variables d’évaluation Variable prédéfinies … (suite) keulkeul.blogspot.com Commands - M. Baron - Page 128
    • 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 keulkeul.blogspot.com 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 Commands - M. Baron - Page 129
    • 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 keulkeul.blogspot.com Commands - M. Baron - Page 130
    • 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 Nom de la classe définissant l’objet de type ISourceProvider keulkeul.blogspot.com plugin.xml du projet CommandsExpressionsVariableExamples Commands - M. Baron - Page 131
    • 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) keulkeul.blogspot.com String[] getProvidedSourceNames() : retourne les noms des variables définies par l’objet SourceProvider Un objet ISourceProvider peut définir plusieurs variables Commands - M. Baron - Page 132
    • 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 private final static String TOOLBAR_VIEW_STATE = "toolbarview"; int state; Nom de la variable 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); Trois états différents peuvent } else { currentState.put(ANIMATION_STATE, TOOLBAR_VIEW_STATE); être retournés } keulkeul.blogspot.com return currentState; } public String[] getProvidedSourceNames() { return new String[] {ANIMATION_STATE}; } ... Une seule variable est définie } Classe AnimationSourceProvider.java du projet CommandsExpressionsVariableExamples Commands - M. Baron - Page 133
    • 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 Nom de la variable keulkeul.blogspot.com plugin.xml du projet CommandsExpressionsVariableExamples Commands - M. Baron - Page 134
    • 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 ISourceProviderService spc = (ISourceProviderService)PlatformUI.getWorkbench().getService(ISourceProviderService.class); keulkeul.blogspot.com A partir d’un ISourceProviderService, la récupération d’un ISourceProvider est obtenue par le nom de la variable AnimationSourceProvider myPro = (AnimationSourceProvider)spc.getSourceProvider(AnimationSourceProvider.ANIMATION_STATE); Commands - M. Baron - Page 135
    • 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 service ISourceProviderService spc = (ISourceProviderService) PlatformUI.getWorkbench().getService(ISourceProviderService.class); // Get our source provider by querying by the variable name final 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); Récupération de l’objet }); menu.setLayoutData(new GridData(GridData.FILL_BOTH)); ISourceProvider menu.setText("Menu"); Button toolbar = new Button(parent, SWT.FLAT); toolbar.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { myPro.setState(1); Modifications de l’état de }); } la variable toolbar.setLayoutData(new GridData(GridData.FILL_BOTH)); keulkeul.blogspot.com toolbar.setText("Toolbar"); Button view = new Button(parent, SWT.FLAT); view.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { myPro.setState(2); Classe AnimationControlViewPart.java du projet }); } CommandsExpressionsVariableExamples view.setLayoutData(new GridData(GridData.FILL_BOTH)); view.setText("ToolbarView"); } } Commands - M. Baron - Page 136
    • Restrictions : définir ses propres variables d’évaluation Exemple (suite) : définition d’une variable avec trois états qui est modifiable par l’utilisateur Trois restrictions visibleWhen sont définies keulkeul.blogspot.com plugin.xml du projet CommandsExpressionsVariableExamples Commands - M. Baron - Page 137
    • 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 Tester personnalisé 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 keulkeul.blogspot.com 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 Commands - M. Baron - Page 138
    • 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 Sélection d’un texte contenant uniquement des lettres uniquement des chiffres Dans les deux cas, le handler associé à la commande est activé keulkeul.blogspot.com Si la sélection sur le texte contient à la fois des lettres et des chiffres, le handler est désactivé Commands - M. Baron - Page 139
    • 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 keulkeul.blogspot.com Commands - M. Baron - Page 140
    • 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 keulkeul.blogspot.com 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 Commands - M. Baron - Page 141
    • 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 keulkeul.blogspot.com définir le comportement du Property Tester Généralement les arguments receiver et prop sont utilisés Commands - M. Baron - Page 142
    • Restrictions : définir ses propres PropertyTester Ajout d’un élément propertyTester Ce Property Tester ne traite que les objets de type ISelection (type de l’argument receiver) keulkeul.blogspot.com Deux propriétés sont définies : plugin.xml du projet isAllLetters et isAllDigits CommandsExpressionsCustomTestExamples Commands - M. Baron - Page 143
    • Restrictions : définir ses propres PropertyTester Exemple (suite) : vérifie si la sélection sur du texte contient uniquement des lettres ou des chiffres public class CustomPropertyTester extends PropertyTester { public boolean test(Object receiver, String property, Object[] args, Object expectedValue) { ISelection selection = (ISelection) receiver; if ("isAllLetters".equals(property)) { Test relatif à la propriété if (selection instanceof TextSelection) { TextSelection ts = (TextSelection) selection; isAllLetters 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; } Test relatif à la propriété } isAllDigits 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; } keulkeul.blogspot.com for (Character ch : text.toCharArray()) if (!Character.isDigit(ch)) { return false; } return true; } } return false; } } CustomPropertyTester.java du projet CommandsExpressionsCustomTestExamples Commands - M. Baron - Page 144
    • Restrictions : définir ses propres PropertyTester Exemple (suite) : vérifie si la sélection sur du texte contient uniquement des lettres ou des chiffres Utilisation du Property Tester avec ces deux propriétés keulkeul.blogspot.com plugin.xml du projet CommandsExpressionsCustomTestExamples Commands - M. Baron - Page 145
    • 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 keulkeul.blogspot.com A noter enfin, qu’il est préférable de passer par des constructions déclaratives pour une meilleure portabilité des applications à construire Commands - M. Baron - Page 146
    • 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 IMenuService menuService = (IMenuService)PlatformUI.getWorkbench().getService(ISourceProviderService.class); A partir d’un objet IMenuService void addContributionItem(AbstractContributionFactory cont) : ajoute un élément de menu keulkeul.blogspot.com 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 Commands - M. Baron - Page 147
    • Restrictions par programmation : visibleWhen Exemple : afficher une commande dans le menu dont la restriction visibleWhen est contrôlée par programmation Création d’un élément dans Bouton « Hide » cache le menu l’élément du menu keulkeul.blogspot.com Bouton « Show » affiche Projet l’élément du menu CommandsProgrammaticVisibleWhenExamples Commands - M. Baron - Page 148
    • 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 { Construction d’un élément private boolean isVisible = true; private CommandContributionItem item; private Expression currentExpression; public void createPartControl(Composite parent) { ... dans le menu principal 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; } L’expression est très simple et } elle est pilotée par l’attribut keulkeul.blogspot.com }; item = new CommandContributionItem(commandParameter); additions.addContributionItem(item, currentExpression); isVisible } }; service.addContributionFactory(ref); myButton.setEnabled(false); } }); ... // Suite dans le prochain transparent CreateMenuContributionViewPart.java du projet CommandsProgrammaticVisibleWhenExamples Commands - M. Baron - Page 149
    • 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(); Modification de l’attribut }); isVisible Button showMenuContribution = new Button(parent, SWT.NONE); showMenuContribution.setText("Show"); showMenuContribution.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { isVisible = true; keulkeul.blogspot.com updateExpression(); } }); } // Suite dans le prochain transparent CreateMenuContributionViewPart.java du projet CommandsProgrammaticVisibleWhenExamples Commands - M. Baron - Page 150
    • 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); Inspirée de la méthode boolean os = evalRef.evaluate(currentState); evalRef.clearResult(); liftRestrictions de la classe boolean ns = evalRef.evaluate(currentState); WorkbenchWindow if (os != ns) { changeDetected = true; evalRef.getListener().propertyChange( new PropertyChangeEvent(evalRef, evalRef.getProperty(),valueOf(os),valueOf(ns))); } } keulkeul.blogspot.com } 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 Commands - M. Baron - Page 151
    • 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) keulkeul.blogspot.com IHandlerActivation activateHandler(String commandId, IHandler handler, Expression exp) : associer une commande à un handler et définir une restriction enabledWhen via exp Commands - M. Baron - Page 152
    • Restrictions par programmation : enabledWhen Exemple : activée un handler dans le menu dont la restriction enabledWhen est contrôlée par programmation Handler associé à la Handler associé à la commande est désactivé commande est activé keulkeul.blogspot.com Projet CommandsProgrammaticEnabledWhenExamples Commands - M. Baron - Page 153
    • 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; Nécessaire pour la mise à jour de }; Expression enabledWhen = new Expression() { l’expression. Notification est effectuée à chaque modification public void collectExpressionInfo(ExpressionInfo info) { info.markDefaultVariableAccessed(); } des variables « expression » public EvaluationResult evaluate(IEvaluationContext context) throws CoreException { if (isEnabled) keulkeul.blogspot.com 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 Commands - M. Baron - Page 154
    • 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; } }); Modification de l’attribut Button enabledHandler = new Button(parent, SWT.NONE); isVisible enabledHandler.setText("Enabled"); enabledHandler.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { isEnabled = true; } keulkeul.blogspot.com }); } } CreateHandlerViewPart.java du projet CommandsProgrammaticVisibleWhenExamples Commands - M. Baron - Page 155
    • 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 keulkeul.blogspot.com 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 Commands - M. Baron - Page 156
    • 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) keulkeul.blogspot.com 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 Baron - Page Commands - M. 157
    • Paramètres : ajouter des paramètres Exemple : afficher l’emplacement (menu ou toolbar) où est déclenchée une commande Identifiant utilisé pour les manipulations du paramètre Ajout d’un élément commandParameter keulkeul.blogspot.com plugin.xml du projet CommandsParametersExamples Commands - M. Baron - Page 158
    • 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 keulkeul.blogspot.com name : identifiant du paramètre value : valeur à donner pour ce paramètre (String) Commands - M. Baron - Page 159
    • Paramètres : fournir des valeurs aux paramètres Exemple (suite) : afficher l’emplacement (menu ou toolbar) où est déclenchée une commande Identifiant du paramètre dont la valeur doit être transmise Valeur du paramètre keulkeul.blogspot.com …opendialogparameterid plugin.xml du projet CommandsParametersExamples Commands - M. Baron - Page 160
    • Paramè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 keulkeul.blogspot.com paramètre String getParameter(String param) : récupération de la valeur du paramètre param Commands - M. Baron - Page 161
    • Paramètres : traitement dans le handler Exemple (suite) : afficher l’emplacement (menu ou toolbar) où est déclenchée une commande Récupération de la valeur du paramètre …opendialogparameterid public class OpenDialogHandler extends AbstractHandler { @Override public 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; } } keulkeul.blogspot.com OpenDialogHandler.java du projet CommandsParametersExamples Commands - M. Baron - Page 162
    • 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 keulkeul.blogspot.com autorisées (sous condition que l’attribut values soit renseigné) L’outil est accessible via les préférences (menu Window -> Preferences -> General -> Keys) Commands - M. Baron - Page 163
    • Paramètres : renseigner les valeurs autorisées Le paramètre Open Dialog Values Parameter accepte deux valeurs : menu et toolbar keulkeul.blogspot.com Pour que les valeurs potentielles du paramètre soient affichées il est obligatoire d’associer la commande a une catégorie Commands - M. Baron - Page 164
    • 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 Exemple public class ParameterValues implements IParameterValues { public Map<String, String> getParameterValues() { Map<String, String> params = new HashMap<String, String>(); params.put("menu", "In Toolbar"); keulkeul.blogspot.com params.put("toolbar", "In Menu"); return params; } } Valeurs affichées à l’utilisateur associées aux valeurs autorisées par le paramètre Commands - M. Baron - Page 165
    • Paramètres : renseigner les valeurs autorisées Possibilité de définir les valeurs autorisées en passant par une approche déclarative keulkeul.blogspot.com Ne rien préciser au niveau de l’attribut plugin.xml du projet values CommandsParametersExamples Commands - M. Baron - Page 166
    • Paramètres : renseigner les valeurs autorisées Suite : Possibilité de définir les valeurs autorisées en passant par une approche déclarative Ajouter un sous élément values 2 1 Utiliser cette classe de type IParameterValues définie par la plateforme Eclipse keulkeul.blogspot.com plugin.xml du projet CommandsParametersExamples Commands - M. Baron - Page 167
    • Paramètres : renseigner les valeurs autorisées Suite : Possibilité de définir les valeurs autorisées en passant par une approche déclarative Nom de la valeur et valeur à Ajouter des sous éléments donner parameter qui désignent les keulkeul.blogspot.com valeurs possibles plugin.xml du projet CommandsParametersExamples Commands - M. Baron - Page 168
    • 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 sur La vue active (éléments des menus contextuels, identifiants, …) La sélection en cours Les identifiants des commandes La position d’un menuContribution (locationURI) keulkeul.blogspot.com Pour démarrer l’outil deux options disponibles Shift + Alt + F1 : pour l’espionnage des vues, du workbench, … Shift + Alt + F2 : pour l’espionnage des menus et des commandes Commands - M. Baron - Page 169
    • 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 Récupère l’identifiant de la vue la vue Récupère l’identifiant du menu de la vue keulkeul.blogspot.com Donne des informations sur la sélection en cours Commands - M. Baron - Page 170
    • 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 keulkeul.blogspot.com L’identifiant de la commande Très utile pour récupérer les identifiants des commandes prédéfinies par la plateforme Eclipse Commands - M. Baron - Page 171
    • 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 keulkeul.blogspot.com Tracing d’une configuration d’exécution L’activation doit être réalisée avant l’exécution de l’applica- tion Eclipse Commands - M. Baron - Page 172
    • Réutilisation : Options de traçage Activation les traces d’exécution des commandes Onglet Tracing 1 3 2 keulkeul.blogspot.com Sélectionner le plug-in Activer le mode org.eclipse.ui debug Commands - M. Baron - Page 173
    • Réutilisation : Options de traçage Activation les traces d’exécution des commandes (suite) Activer trace/commands 1 keulkeul.blogspot.com 2 Possibilité d’activer les traces relatives aux handlers Commands - M. Baron - Page 174
    • Réutilisation : Options de traçage Activation les traces d’exécution des commandes (suite) Identifiant de la commande keulkeul.blogspot.com Classe implémentant le handler Commands - M. Baron - Page 175