$30 off During Our Annual Pro Sale. View Details »

Eclipse : développement de commandes

Eclipse : développement de commandes

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

Mickael BARON

December 21, 2012
Tweet

More Decks by Mickael BARON

Other Decks in Programming

Transcript

  1. Développement de clients riches : Plateforme Eclipse Mickaël BARON -

    2009 mailto:[email protected] ou mailto:[email protected] mickael-baron.fr mickaelbaron Chapitre 3 : Conception de plug-ins Workbench : Commands
  2. 2 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Creative

    Commons Contrat Paternité Partage des Conditions Initiales à l'Identique 2.0 France http://creativecommons.org/licenses/by-sa/2.0/fr Licence
  3. 3 Commands - M. Baron - Page mickael-baron.fr mickaelbaron †3

    À propos de l’auteur … † Mickaël BARON † Ingénieur de Recherche au LIAS † https://www.lias-lab.fr † Equipe : Ingénierie des Données et des Modèles † Responsable des plateformes logicielles, « coach » technique † Ancien responsable Java de Developpez.com (2011-2021) † Communauté Francophone dédiée au développement informatique † https://java.developpez.com † 4 millions de visiteurs uniques et 12 millions de pages vues par mois † 750 00 membres, 2000 forums et jusqu'à 5000 messages par jour mickael-baron.fr mickaelbaron
  4. 4 Commands - M. Baron - Page mickael-baron.fr mickaelbaron †

    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 mickael-baron.fr/eclipse/commands
  5. 5 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 mickael-baron.fr/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
  6. 6 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 † 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
  7. 7 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 † 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
  8. 8 Commands - M. Baron - Page mickael-baron.fr mickaelbaron †

    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
  9. 9 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  10. 10 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  11. 11 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  12. 12 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  13. 13 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  14. 14 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 Extensions plugin.xml du projet ActionsExamples
  15. 15 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 Extensions plugin.xml du projet ActionsExamples Texte affiché dans le menu de l’application Possibilité d’ajouter le nouveau menu à un menu existant
  16. 16 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 Extensions plugin.xml du projet ActionsExamples
  17. 17 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  18. 18 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  19. 19 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  20. 20 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Construction

    par déclaration Onglet Extensions plugin.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
  21. 21 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Construction

    par déclaration package eclipse.workbench.commandsexamples.handler; public class FirstHandler extends AbstractHandler { @Override public 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
  22. 22 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  23. 23 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  24. 24 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Associer

    une commande à un Handler Onglet Extensions plugin.xml du projet CommandsExamples † Définition du couple commande / handler Identifiant de la commande Classe de type IHandler correspondant au traitement de la commande
  25. 25 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  26. 26 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  27. 27 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Associer

    une commande à des images † Définition du couple commande / images Onglet Extensions plugin.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
  28. 28 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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);
  29. 29 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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)
  30. 30 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  31. 31 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  32. 32 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Construction

    par programmation † Exemple (suite) : exécuter une commande public 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
  33. 33 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  34. 34 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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()"); } ... }); 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
  35. 35 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  36. 36 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  37. 37 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  38. 38 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  39. 39 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 Quit situé dans le menu File
  40. 40 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  41. 41 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  42. 42 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  43. 43 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  44. 44 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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, …)
  45. 45 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  46. 46 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  47. 47 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  48. 48 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  49. 49 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  50. 50 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  51. 51 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  52. 52 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  53. 53 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  54. 54 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Commande

    dans un menu localisé d’une vue † Exemple : ajouter une commande dans le menu localisé d’une vue Vue …commandsexample.views.viewcommandid du projet CommandsExamples Menu localisé de la vue contenant une commande
  55. 55 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  56. 56 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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.viewcommandid du projet CommandsExamples
  57. 57 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  58. 58 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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)
  59. 59 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Commande

    dans un menu contextuel de vue † Exemple : ajouter une commande dans le menu contextuel d’une vue Vue …commandsexample.views.popupviewcommandid du projet CommandsExamples Menu contextuel de la vue contenant plusieurs commandes
  60. 60 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  61. 61 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 private 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
  62. 62 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  63. 63 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  64. 64 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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.popupviewcommandid du projet CommandsExamples Cette commande doit être placée avant First Command identifiée par contributionitem (définie programmatiquement)
  65. 65 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  66. 66 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  67. 67 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  68. 68 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  69. 69 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  70. 70 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  71. 71 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  72. 72 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  73. 73 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  74. 74 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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.java du projet CommandsExamples Composants SWT Déclenchement d’une commande
  75. 75 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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)
  76. 76 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  77. 77 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Raccourci

    clavier † Ajouter un élément key permettant de construire un raccourci clavier plugin.xml du projet CommandsKeyBindingRCPExamples
  78. 78 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Raccourci

    clavier † Construire un raccourci clavier actif quand la touche F11 est déclenchée plugin.xml du projet CommandsKeyBindingRCPExamples
  79. 79 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  80. 80 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  81. 81 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  82. 82 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  83. 83 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  84. 84 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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éé
  85. 85 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 scheme précédemment créé L’identifiant de la commande qui sera appelée
  86. 86 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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)
  87. 87 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  88. 88 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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)
  89. 89 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  90. 90 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  91. 91 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  92. 92 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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.specificdefaultacceleratorconfigurationid org.eclipse.ui/SHOW_PROGRESS_ON_STARTUP = false pluginpreference.ini du projet CommandsKeyBindingRCPExamples Identifiant du scheme qui doit être rendu actif Clé (KEY_CONFIGURATION_ID) permettant d’activer un scheme Le fichier pluginpreference.ini est placé à la racine du projet
  93. 93 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  94. 94 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  95. 95 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  96. 96 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 † 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
  97. 97 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  98. 98 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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é
  99. 99 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  100. 100 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 »
  101. 101 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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éfinition Ajouter une dépendance sur org.eclipse.core.expressions pour exploiter le point d’extension org.eclipse.core.expressions.definitions
  102. 102 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Restrictions

    : construire Expression Definitions Point d’extension permettant de créer des définitions d’expression
  103. 103 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  104. 104 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Restrictions

    : utiliser Expression Definitions plugin.xml du projet CommandsExpressionsExamples 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 reference de visibleWhen (s’appliquerait également à enabledWhen et activeWhen)
  105. 105 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  106. 106 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  107. 107 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  108. 108 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  109. 109 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  110. 110 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  111. 111 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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, iterate est évalué à vrai Tous les éléments doivent respecter le sous élément instanceof de iterate
  112. 112 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  113. 113 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  114. 114 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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é
  115. 115 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Restrictions

    : élément systemTest † Exemple : Afficher une commande dans la barre d’outils quand 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
  116. 116 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 † 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
  117. 117 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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é
  118. 118 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Restrictions

    : élément test † Property Tester prédéfinis …
  119. 119 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Restrictions

    : élément test † Property Tester prédéfinis … (suite)
  120. 120 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Restrictions

    : élément test † Exemple : Désactiver une commande dans la barre de menu quand 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
  121. 121 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 est † org.eclipse.ui.workbenchWindow.isPerspectiveOpen
  122. 122 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  123. 123 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  124. 124 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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)
  125. 125 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 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
  126. 126 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  127. 127 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 † Dans la suite est montré au travers d’un exemple la façon de † créer une variable † mettre à jour son contenu
  128. 128 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Restrictions

    : définir ses propres variables d’évaluation † Variable prédéfinies …
  129. 129 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Restrictions

    : définir ses propres variables d’évaluation † Variable prédéfinies … (suite)
  130. 130 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  131. 131 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  132. 132 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  133. 133 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  134. 134 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  135. 135 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  136. 136 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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);
  137. 137 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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); } }); 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
  138. 138 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  139. 139 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 † 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
  140. 140 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 handler associé à la commande est activé Si la sélection sur le texte contient à la fois des lettres et des chiffres, le handler est désactivé
  141. 141 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  142. 142 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  143. 143 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  144. 144 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Restrictions

    : définir ses propres PropertyTester plugin.xml du projet CommandsExpressionsCustomTestExamples † Ajout d’un élément propertyTester Ce 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
  145. 145 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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)) { 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
  146. 146 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 Tester avec ces deux propriétés
  147. 147 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  148. 148 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 IMenuService † void 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);
  149. 149 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  150. 150 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  151. 151 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  152. 152 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  153. 153 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  154. 154 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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é
  155. 155 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 »
  156. 156 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  157. 157 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  158. 158 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  159. 159 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  160. 160 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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)
  161. 161 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  162. 162 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 paramètre † String getParameter(String param) : récupération de la valeur du paramètre param
  163. 163 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Paramè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 { @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; } } OpenDialogHandler.java du projet CommandsParametersExamples Récupération de la valeur du paramètre …opendialogparameterid
  164. 164 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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)
  165. 165 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Paramètres

    : renseigner les valeurs autorisées Le paramètre Open Dialog Values Parameter accepte 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
  166. 166 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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"); params.put("toolbar", "In Menu"); return params; } } Valeurs affichées à l’utilisateur associées aux valeurs autorisées par le paramètre
  167. 167 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  168. 168 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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 1 Utiliser cette classe de type IParameterValues définie par la plateforme Eclipse 2
  169. 169 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  170. 170 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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) † 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
  171. 171 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  172. 172 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  173. 173 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  174. 174 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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
  175. 175 Commands - M. Baron - Page mickael-baron.fr mickaelbaron 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)
  176. 176 Commands - M. Baron - Page mickael-baron.fr mickaelbaron Réutilisation

    : Options de traçage † Activation les traces d’exécution des commandes (suite) Identifiant de la commande Classe implémentant le handler