Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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)

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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= et after= 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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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, …)

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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)

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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)

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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)

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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)

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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)

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

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é

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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 »

Slide 101

Slide 101 text

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

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

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)

Slide 105

Slide 105 text

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

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

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

Slide 109

Slide 109 text

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

Slide 110

Slide 110 text

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

Slide 111

Slide 111 text

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

Slide 112

Slide 112 text

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

Slide 113

Slide 113 text

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

Slide 114

Slide 114 text

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é

Slide 115

Slide 115 text

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

Slide 116

Slide 116 text

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

Slide 117

Slide 117 text

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é

Slide 118

Slide 118 text

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

Slide 119

Slide 119 text

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

Slide 120

Slide 120 text

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

Slide 121

Slide 121 text

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

Slide 122

Slide 122 text

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

Slide 123

Slide 123 text

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

Slide 124

Slide 124 text

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)

Slide 125

Slide 125 text

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

Slide 126

Slide 126 text

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

Slide 127

Slide 127 text

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

Slide 128

Slide 128 text

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

Slide 129

Slide 129 text

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

Slide 130

Slide 130 text

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

Slide 131

Slide 131 text

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

Slide 132

Slide 132 text

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

Slide 133

Slide 133 text

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

Slide 134

Slide 134 text

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 getCurrentState() { Map currentState = new HashMap(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

Slide 135

Slide 135 text

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

Slide 136

Slide 136 text

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

Slide 137

Slide 137 text

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

Slide 138

Slide 138 text

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

Slide 139

Slide 139 text

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

Slide 140

Slide 140 text

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é

Slide 141

Slide 141 text

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

Slide 142

Slide 142 text

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

Slide 143

Slide 143 text

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

Slide 144

Slide 144 text

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

Slide 145

Slide 145 text

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

Slide 146

Slide 146 text

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

Slide 147

Slide 147 text

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

Slide 148

Slide 148 text

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

Slide 149

Slide 149 text

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

Slide 150

Slide 150 text

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

Slide 151

Slide 151 text

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

Slide 152

Slide 152 text

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

Slide 153

Slide 153 text

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

Slide 154

Slide 154 text

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é

Slide 155

Slide 155 text

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 »

Slide 156

Slide 156 text

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

Slide 157

Slide 157 text

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

Slide 158

Slide 158 text

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

Slide 159

Slide 159 text

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

Slide 160

Slide 160 text

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)

Slide 161

Slide 161 text

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

Slide 162

Slide 162 text

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

Slide 163

Slide 163 text

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

Slide 164

Slide 164 text

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)

Slide 165

Slide 165 text

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

Slide 166

Slide 166 text

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 getParameterValues() : valeurs autorisées † Exemple public class ParameterValues implements IParameterValues { public Map getParameterValues() { Map params = new HashMap(); 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

Slide 167

Slide 167 text

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

Slide 168

Slide 168 text

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

Slide 169

Slide 169 text

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

Slide 170

Slide 170 text

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

Slide 171

Slide 171 text

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

Slide 172

Slide 172 text

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

Slide 173

Slide 173 text

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

Slide 174

Slide 174 text

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

Slide 175

Slide 175 text

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)

Slide 176

Slide 176 text

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