Slide 1

Slide 1 text

Développement de clients riches : Plateforme Eclipse Mickaël BARON - 2009 mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr mickael-baron.fr mickaelbaron Chapitre 3 : Conception de plug-ins Workbench : Perspectives

Slide 2

Slide 2 text

2 Perspectives - 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 Perspectives - 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 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Organisation du cours sur le Workbench : Perspectives Tous les exemples du cours sont disponibles directement à l’adresse mickael-baron.fr/eclipse/perspectives † Construction déclarative † Ajout de vues † Paramétrage † Etendre une perspective existante † Registre des perspectives † Ecouter les changements † Principales opérations

Slide 5

Slide 5 text

5 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Déroulement du cours † Pédagogie du cours † Illustration avec de nombreux exemples qui sont disponibles à l’adresse mickael-baron.fr/eclipse/perspectives † 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 † Généralités sur le Workbench † Remerciement † Developpez.com : djo.mos (Jawher MOUSSA) Ceci est une alerte Ceci est une astuce

Slide 6

Slide 6 text

6 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Ressources … † Des articles sur la construction de perspectives † www.eclipse.org/articles/using-perspectives/PerspectiveArticle.html † www.javalobby.org/java/forums/t18187.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

Slide 7

Slide 7 text

7 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Généralités † Une perspective est un regroupement de vues, d’éditeurs et de raccourcis au sein du Workbench afin de faciliter une tâche de l'utilisateur † Une perspective fournit des mécanismes pour faciliter l'agencement des vues et des éditeurs † Différents types de raccourcis peuvent être référencés † Raccourcis sur des commandes † Raccourcis pour changer la perspective † Raccourcis pour démarrer un assistant † Raccourcis pour ouvrir une vue † Exemples des perspectives prédéfinies du développeur Java † Java, Debug, Java Browsing … Les commandes remplacent les actions, voir le cours Commands pour des détails supplémentaires

Slide 8

Slide 8 text

8 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Généralités † Perspective Java

Slide 9

Slide 9 text

9 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Généralités † Perspective Debug

Slide 10

Slide 10 text

10 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Généralités † Perspective Java Browsing

Slide 11

Slide 11 text

11 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Généralités † Personnalisation des raccourcis d'une perspective Liste les raccourcis sur les assistants Le raccourci sur l'assistant Création de Fichier a été ajouté Barre d'outils où seront ajoutés les raccourcis sur les commandes. Le raccourci sur la commande Synchronisation a été ajouté Liste les raccourcis sur les perspectives Le raccourci sur la perspective Resource a été ajouté Liste les raccourcis sur les vues Le raccourci sur la vue Console a été ajouté

Slide 12

Slide 12 text

12 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Généralités † La construction d’une perspective peut être réalisée de trois manières différentes † Programmatiquement † Utilisation du point d’extension org.eclipse.ui.perspective † Nécessite la construction d’une classe de type IPerspectiveFactory † L’agencement des vues et de l’éditeur est codé dans cette classe † Déclarativement † Utilisation du point d’extension org.eclipse.ui.perspectiveExtensions † L’agencement est défini au travers de l’outil PDE via les paramètres de l’extension † En cours d’exécution † La construction se fait pendant l’exécution de l’application † L’utilisateur agence ses vues puis sauvegarde une nouvelle perspective personnalisée

Slide 13

Slide 13 text

13 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Construction d'une extension † Sélectionner le point d’extension org.eclipse.ui.perspectives Point d'extension à créer

Slide 14

Slide 14 text

14 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Construction d'une extension Onglet Extensions Ajout d'une nouvelle perspective † Ajouter une nouvelle perspective Projet PerspectiveExemple

Slide 15

Slide 15 text

15 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Construction d'une extension Identifiant unique de la perspective Nom de la perspective utilisable par l'utilisateur pour identifier la perspective Classe de type IPerspectiveFactory qui décrit comment la perspective doit être créée Personnalisation de la perspective † Saisir les paramètres de la perspective créée

Slide 16

Slide 16 text

16 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Construction d'une extension package eclipse.workbench.perspectiveexample; public class EmptyPerspectiveFactory implements IPerspectiveFactory { public void createInitialLayout(IPageLayout layout) { // Ceci est une perspective vide ... } } † Créer la classe EmptyPerspectiveFactory en implémentant l'interface IPerspectiveFactory Aucune vue ni éditeur n'ont été ajoutés dans cette perspective Seule la méthode createInitialLayout doit être implémentée EmptyPerspectiveFactory.java du Projet PerspectiveExample

Slide 17

Slide 17 text

17 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Construction d'une extension Comme prévu la perspective Empty Perspective ne contient aucune vue † Tester la perspective Empty Perspective … Projet PerspectiveExemple

Slide 18

Slide 18 text

18 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron IPageLayout † Une perspective définit l'agencement des vues de différentes manières † View : ajoute une vue à la perspective † Place Folder : création d'un emplacement pour empiler de vues † Place Holder : définition d'un emplacement par défaut d'une vue sans l'afficher. A l'ouverture, celle-ci sera positionnée à l'emplacement défini † Fast View : ajoute une vue de manière flottante à la perspective † Standalone View : ajoute une vue qui ne peut être empilée avec d'autres vues (peut ne pas contenir de titre) † L'agencement des vues est obtenu par l'intermédiaire d'un objet de type IPageLayout † Dans la suite, ces différents agencements sont présentées ainsi que leurs mises en œuvre via IPageLayout

Slide 19

Slide 19 text

19 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addView † Exemple : agencer trois vues dans une perspective Projet PerspectiveExemple La zone des éditeurs est utilisée comme référent pour l’agencement des vues Bookmarks et Tasks La vue Bookmarks est positionnée à la gauche de la zone des éditeurs La vue Tasks est positionnée au dessous de la zone des éditeurs La vue Navigator est positionnée au dessous de la vue Bookmarks

Slide 20

Slide 20 text

20 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addView † Exemple (suite) : agencer trois vues dans une perspective package eclipse.workbench.perspectiveexample.perspectives; public class AddViewPerspectiveFactory implements IPerspectiveFactory { public void createInitialLayout(IPageLayout layout) { String editorAreaId = layout.getEditorArea(); layout.addView(IPageLayout.ID_BOOKMARKS, IPageLayout.LEFT, 0.25f, editorAreaId); layout.addView(IPageLayout.ID_TASK_LIST, IPageLayout.BOTTOM, 0.45f, editorAreaId); layout.addView(IPageLayout.ID_RES_NAV, IPageLayout.BOTTOM, 0.45f, IPageLayout.ID_TASK_LIST); } } AddViewPerspectiveFactory.java du Projet PerspectiveExample Récupération de l’Id de la zone des éditeurs La vue Bookmarks est positionnée à la gauche de la zone des éditeurs Ratio qui définit l’espace occupé par la vue Bookmarks par rapport à son référent Le référent peut également être une vue Le référent est la zone des éditeurs

Slide 21

Slide 21 text

21 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron † L’interface IPageLayout fournit des méthodes pour ajouter de simples vues à une perspective † void addView(String viewId, int relationship, float ratio, String refId) : ajoute une vue viewId à une perspective † viewId : identifiant de la vue à ajouter † relationship : position de la vue par rapport au référent (TOP, BOTTOM, LEFT et RIGHT) † ratio : spécifie comment diviser l’espace entre la vue viewId et son référent refId † refId : identifiant de la référence † String getEditorArea() : récupère l’identifiant de la zone des éditeurs de la perspective addView

Slide 22

Slide 22 text

22 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addView (ratio) † L’argument ratio spécifie comment doit être occupé l’espace entre une vue et son référent † Selon l’orientation, le ratio porte sur la vue ou sur le référent † Pour une séparation verticale (TOP ou BOTTOM) le ratio s’applique sur l’élément du haut † Si ratio = 0.95, l’élément du haut occupera 95% de l’espace † Pour une séparation horizontale (LEFT ou RIGHT) le ratio s’applique sur l’élément de gauche † Si ratio = 0.95, l’élément de gauche occupera 95% de l’espace † La valeur ratio est comprise entre 0.05 et 0.95 layout.addView(IPageLayout.ID_BOOKMARKS, IPageLayout.LEFT, 0.25f, editorAreaId); ... layout.addView(IPageLayout.ID_RES_NAV, IPageLayout.BOTTOM, 0.45f, IPageLayout.ID_TASK_LIST); La vue Bookmarks occupera 25% de l’espace défini avec la zone des éditeurs La vue Tasks occupera 45% de l’espace défini avec la vue Navigator

Slide 23

Slide 23 text

23 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addView (ratio) 25% 75 % 55% 45% 45% 55% Vue Bookmarks placée à gauche Editeur Vue Tasks placée au dessous de la zone des éditeurs Vue Navigator placée au dessous de la vue Tasks

Slide 24

Slide 24 text

24 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addFastView † Exemple : ajouter deux vues FastView à une perspective Projet PerspectiveExemple La vue Bookmarks est FastView Elle est affichée sans être figée à la perspective. A la perte du focus la vue est automatiquement fermée Les deux vues FastView ajoutées à la perspective sont affichable via les raccourcis

Slide 25

Slide 25 text

25 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addFastView † Caractéristiques d’une vue de type FastView † N’est pas « accrochée » à la perspective † Est fermée automatiquement quand la vue perd son focus † Toute vue d’une perspective peut devenir FastView † Ne s’applique pas aux éditeurs † Peut perdre son aspect FastView pour être accrochée à la perspective † L’interface IPageLayout fournit une méthode pour ajouter une vue de type FastView à une perspective † void addFastView(String viewId, float ratio) † viewId : identifiant de la vue à transformer en FastView † ratio : pourcentage de la fenêtre Workbench qu’occupera la FastView

Slide 26

Slide 26 text

26 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addFastView † Exemple (suite) : ajouter deux vues FastView à une … package eclipse.workbench.perspectiveexample.perspectives; public class AddFastViewPerspectiveFactory implements IPerspectiveFactory { public void createInitialLayout(IPageLayout layout) { String editorAreaId = layout.getEditorArea(); layout.addView(IPageLayout.ID_RES_NAV, IPageLayout.BOTTOM, 0.45f, editorAreaId); layout.addFastView(IPageLayout.ID_BOOKMARKS, 0.50f); layout.addFastView(IPageLayout.ID_TASK_LIST, 0.50f); } } AddFastViewPerspectiveFactory.java du Projet PerspectiveExample La vue Bookmarks et la vue Tasks sont définies comme FastView Une vue FastView ajoutée via addFastView ajoute des raccourcis et ne montre pas la vue Les vues FastView ne sont pas directement visibles dans la perspective

Slide 27

Slide 27 text

27 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addStandaloneView † Caractéristiques d’une vue de type StandaloneView † Ne peut être empilée avec une autre vue † Sa barre de titre peut être masquée. † L’interface IPageLayout fournit une méthode pour ajouter une vue de type StandaloneView à une perspective † void addStandaloneView(String viewId, boolean showTitle, int relationship, float ratio, String refPartId) † boolean showTitle : si TRUE affiche la barre sinon ne l’affiche pas † viewId : identifiant de la vue à ajouter † relationship : position de la vue par rapport au référent (TOP, BOTTOM, LEFT et RIGHT) † ratio : spécifie comment diviser l’espace entre la vue viewId et son référent refPartId † refPartId : identifiant de la référence

Slide 28

Slide 28 text

28 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addStandaloneView † Exemple : agencer une vue StandaloneView avec des vues Projet PerspectiveExemple La vue Bookmarks et Tasks sont de simples vues La vue Navigator est une StandaloneView La vue Bookmarks peut être empilée avec la vue Tasks La vue Bookmarks ne peut être empilée avec la vue Navigator

Slide 29

Slide 29 text

29 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addStandaloneView † Exemple (suite) : agencer une vue StandaloneView … package eclipse.workbench.perspectiveexample.perspectives; public class AddStandaloneViewPerspectiveFactory1 implements IPerspectiveFactory { public void createInitialLayout(IPageLayout layout) { String editorAreaId = layout.getEditorArea(); layout.addView(IPageLayout.ID_BOOKMARKS, IPageLayout.LEFT, 0.25f, editorAreaId); layout.addView(IPageLayout.ID_TASK_LIST, IPageLayout.BOTTOM, 0.45f, editorAreaId); layout.addStandaloneView(IPageLayout.ID_RES_NAV, true, IPageLayout.BOTTOM, 0.45f, IPageLayout.ID_TASK_LIST); } } AddStandaloneViewPerspectiveFactory1.java du Projet PerspectiveExample La vue Navigator est définie comme StandaloneView. La barre de titre est affichée

Slide 30

Slide 30 text

30 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addStandaloneView † Exemple : agencer une vue StandaloneView sans titre Projet PerspectiveExemple La vue Bookmarks et Tasks sont de simples vues La vue Navigator est de type StandaloneView La vue Navigator ne dispose pas de titre

Slide 31

Slide 31 text

31 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addStandaloneView † Exemple (suite) : agencer une vue StandaloneView sans titre La vue Navigator avec sa barre de titre et ses commandes associées La même vue Navigator sans barre de titre Si la vue StandaloneView dispose de commandes, l’ensemble des commandes sera affiché dans la barre d’outils de la WorkbenchWindow Si vous utilisez une vue en mode StandaloneView pensez à désactiver ses commandes

Slide 32

Slide 32 text

32 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addStandaloneView † Exemple (suite) : agencer une vue StandaloneView sans titre package eclipse.workbench.perspectiveexample.perspectives; public class AddStandaloneViewPerspectiveFactory1 implements IPerspectiveFactory { public void createInitialLayout(IPageLayout layout) { String editorAreaId = layout.getEditorArea(); layout.addView(IPageLayout.ID_BOOKMARKS, IPageLayout.LEFT, 0.25f, editorAreaId); layout.addView(IPageLayout.ID_TASK_LIST, IPageLayout.BOTTOM, 0.45f, editorAreaId); layout.addStandaloneView(IPageLayout.ID_RES_NAV, false, IPageLayout.BOTTOM, 0.45f, IPageLayout.ID_TASK_LIST); } } AddStandaloneViewPerspectiveFactory2.java du Projet PerspectiveExample La vue Navigator est définie comme StandaloneView. La barre de titre est cachée

Slide 33

Slide 33 text

33 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addPlaceholder † Un Place Holder ou emplacement prédéfini permet de définir dans une perspective donnée un emplacement favori d’une vue sans l’afficher directement † Les vues ajoutées à un Place Holder ne sont pas directe- ment visibles, elles le sont à posteriori lorsqu’une demande d’affichage de vue est réalisée † L’intérêt du Place Holder est de pouvoir fixer l’emplacement d’une vue à l’avance

Slide 34

Slide 34 text

34 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addPlaceholder † L’interface IPageLayout fournit des méthodes pour ajouter une vue à un Place Holder † void addPlaceholder(String viewId, int relationship, float ratio, String refPartId) † String viewId : identifiant de la vue à ajouter † relationship : position de la vue par rapport au référent (TOP, BOTTOM, LEFT et RIGHT) † ratio : spécifie comment diviser l’espace entre la vue viewId et son référent refPartId † refPartId : identifiant de la référence † void addStandaloneViewPlaceholder(String viewId, int relationship, float ratio, String refPartId, boolean showTitle) † Paramètres identiques à la précédente méthode † showTitle : si TRUE affiche la barre sinon ne l’affiche pas

Slide 35

Slide 35 text

35 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addPlaceholder † Exemple : fixer l’emplacement de deux vues AddPlaceholderViewPerspectiveFactory.java du Projet PerspectiveExample A l’ouverture de la perspective, une seule vue est affichée Les emplacements des vues Tasks et Navigator (StandaloneView) ont été fixés. A l’ouverture, les vues sont positionnées à la position prédéfinie

Slide 36

Slide 36 text

36 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron addPlaceholder † Exemple (suite) : fixer l’emplacement de deux vues package eclipse.workbench.perspectiveexample.perspectives; public class AddPlaceholderViewPerspectiveFactory implements IPerspectiveFactory { public void createInitialLayout(IPageLayout layout) { String editorAreaId = layout.getEditorArea(); layout.addView(IPageLayout.ID_BOOKMARKS, IPageLayout.LEFT, 0.50f, editorAreaId); layout.addPlaceholder(IPageLayout.ID_TASK_LIST, IPageLayout.BOTTOM, 0.45f, editorAreaId); layout.addStandaloneViewPlaceholder(IPageLayout.ID_RES_NAV, IPageLayout.BOTTOM, 0.45f, IPageLayout.ID_TASK_LIST, false); } } AddPlaceholderViewPerspectiveFactory.java du Projet PerspectiveExample Ajout un vue de type StandaloneView dans un Place Holder Ajout d’une vue dans un Place Holder

Slide 37

Slide 37 text

37 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron createFolder † Un Place Folder ou emplacement à onglets permet d’empiler dans une perspective donnée des vues à un emplacement favori † Les vues peuvent être ajoutées au Place Folder † Les vues sont accessibles sous la forme d’un onglet et peuvent être détachées du Place Folder La vue Bookmarks, Tasks et Navigator sont ajoutées à un Place Folder

Slide 38

Slide 38 text

38 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron createFolder † L’interface IPageLayout fournit une méthode pour ajouter un Place Folder à une perspective † IFolderLayout createFolder(String folderId, int relationship, float ratio, String refPartId) † String folderId : identifiant du nouveau Placer Folder † relationship : position de la vue par rapport au référent (TOP, BOTTOM, LEFT et RIGHT) † ratio : spécifie comment diviser l’espace entre le Place Folder folderId et son référent refPartId † refPartId : identifiant de la référence † L’interface IFolderLayout permet d’ajouter des éléments au Place Folder (pas uniquement des vues) † void addView(String viewId) : ajout d’une vue identifiée par viewId † void addPlaceHolder(String phID) : ajout d’un Place Holder identifié par phID

Slide 39

Slide 39 text

39 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron createFolder † Exemple : création d’un Place Folder et ajout de trois vues La vue Bookmarks, Tasks et Navigator sont ajoutées à un Place Folder AddCreateFolderViewPerspectiveFactory.java du Projet PerspectiveExample

Slide 40

Slide 40 text

40 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron createFolder † Exemple (suite) : création d’un Place Folder et ajout de trois vues package eclipse.workbench.perspectiveexample.perspectives; public class AddCreateFolderViewPerspectiveFactory implements IPerspectiveFactory { public void createInitialLayout(IPageLayout layout) { String editorArea = layout.getEditorArea(); IFolderLayout createFolder = layout.createFolder("bottomFolder", IPageLayout.BOTTOM, 0.45f, editorArea); createFolder.addView(IPageLayout.ID_BOOKMARKS); createFolder.addView(IPageLayout.ID_TASK_LIST); createFolder.addView(IPageLayout.ID_RES_NAV); } } AddCreateFolderViewPerspectiveFactory.java du Projet PerspectiveExample Création d’un Place Folder identifié bottomFolder Ajout de trois vues dans le Place Folder L’agencement du Place Folder est défini d’une manière semblable à celui d’une vue

Slide 41

Slide 41 text

41 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron createPlaceholderFolder † Un Place Holder Folder ou emplacement prédéfini à onglets permet de définir un emplacement favori pour empiler des vues sans les afficher directement † L’interface IPageLayout fournit une méthode pour créer un Place Holder Folder à une perspective † IPlaceholderFolderLayout createPlaceholderFolder(String folderId, int relationship, float ratio, String refPartId) : … † L’interface IPlaceholderFolderLayout permet d’ajouter des vues comme emplacement prédéfini † void addPlaceholderFolder(String idView) : ajout de la vue idView

Slide 42

Slide 42 text

42 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron createPlaceholderFolder † Exemple : création d’un Place Holder Folder package eclipse.workbench.perspectiveexample.perspectives; public class AddCreatePlaceholderFolderViewPerspectiveFactory implements IPerspectiveFactory { public void createInitialLayout(IPageLayout layout) { String editorArea = layout.getEditorArea(); IPlaceholderFolderLayout createPlaceholderFolder = layout.createPlaceholderFolder("bottomFolder", IPageLayout.BOTTOM, 0.45f, editorArea); createPlaceholderFolder.addPlaceholder(IPageLayout.ID_BOOKMARKS); createPlaceholderFolder.addPlaceholder(IPageLayout.ID_TASK_LIST); createPlaceholderFolder.addPlaceholder(IPageLayout.ID_RES_NAV); } } AddCreatePlaceholderFolderViewPerspectiveFactory.java du Projet PerspectiveExample Création d’un Place Hodler Folder identifié bottomFolder Ajout de trois vues au Place Holder Folder

Slide 43

Slide 43 text

43 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Raccourcis † Différents types de raccourcis peuvent être ajoutés à une perspective † Raccourcis sur des actions † Raccourcis pour changer la perspective † Raccourcis pour démarrer un assistant † Raccourcis pour ouvrir une vue † L’interface IPageLayout fournit des méthodes pour ajouter des raccourcis † void addActionSet(String actionId) : ajout d’un raccourci action † void addNewWizardShortcut(String wizardId) : ajout d’un raccourci assistant † void addPerspectiveShortcut(String perspId) : ajout d’un raccourci sur une perspecive † void addShowViewShortcut(String viewId) : ajout d’un raccourci sur une vue Dans le cours Commands, on montrera comment obtenir le même résultat avec les commandes A éviter préférer les commandes

Slide 44

Slide 44 text

44 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Raccourcis † Exemple : création de raccourcis Liste les raccourcis sur les assistants Le raccourci sur l'assistant Création de Fichier a été ajouté Barre d'outils où seront ajoutés les raccourcis sur les commandes Le raccourci sur la commande Synchronisation a été ajouté Liste les raccourcis sur les perspectives Le raccourci sur la perspective Resource a été ajouté Liste les raccourcis sur les vues Le raccourci sur la vue Console a été ajouté CustomPerspectiveFactory1.java du Projet PerspectiveExample

Slide 45

Slide 45 text

45 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Raccourcis † Exemple (suite) : création de raccourcis package eclipse.workbench.perspectiveexample.perspectives; public class CustomPerspectiveFactory1 implements IPerspectiveFactory { public void createInitialLayout(IPageLayout layout) { String editorAreaId = layout.getEditorArea(); layout.addView(IPageLayout.ID_BOOKMARKS, IPageLayout.LEFT, 0.25f, editorAreaId); layout.addActionSet("org.eclipse.team.ui.actionSet"); layout.addNewWizardShortcut("org.eclipse.ui.wizards.new.file"); layout.addPerspectiveShortcut("org.eclipse.ui.resourcePerspective"); layout.addShowViewShortcut(IConsoleConstants.ID_CONSOLE_VIEW); } }} CustomPerspectiveFactory1.java du Projet PerspectiveExample Ajout d’un raccourci Action Ajout d’un raccourci Assistant pour la création de fichiers Ajout d’un raccourci Perspective Ajout d’un raccourci sur la vue Console

Slide 46

Slide 46 text

46 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Paramétrages d’une perspective † Possibilité de modifier certaines caractéristiques d’une perspective † void setEditorAreaVisible(boolean isVisible) : affiche ou pas la zone des éditeurs † void setFixed(boolean isFixed) : désactive l’agrandissement d’une vue CustomPerspectiveFactory2.java du Projet PerspectiveExample La zone des éditeurs n’est pas affichés † Exemple : pas de zone des éditeurs ni d’agrandissement …

Slide 47

Slide 47 text

47 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Paramétrages d’une perspective † Exemple (suite) : pas de zone des éditeurs ni agrandissement Agrandissement non autorisé Affichages quand l’agrandissement est autorisé

Slide 48

Slide 48 text

48 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Paramétrages d’une perspective † Exemple (suite) : pas de zone des éditeurs ni agrandissement package eclipse.workbench.perspectiveexample.perspectives; public class CustomPerspectiveFactory2 implements IPerspectiveFactory { public void createInitialLayout(IPageLayout layout) { String editorAreaId = layout.getEditorArea(); layout.addView(IPageLayout.ID_BOOKMARKS, IPageLayout.LEFT, 0.25f, editorAreaId); layout.addView(IPageLayout.ID_TASK_LIST, IPageLayout.BOTTOM, 0.45f, editorAreaId); layout.setEditorAreaVisible(false); layout.setFixed(true); } } CustomPerspectiveFactory2.java du Projet PerspectiveExample Désactivation de la zone des éditeurs et de l’agrandissement des vues Même si la zone des éditeurs n’est plus visible, elle est utilisée comme référent pour ajouter les vues à la perspective

Slide 49

Slide 49 text

49 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Perspective Extensions † Nous avons montré précédemment la construction d’une perspective par l’intermédiaire du point d’extension org.eclipse.ui.perspective † Construction d’une classe de type IPerspectiveFactory † L’agencement des vues se fait de manière programmatique † Ne peut étendre une perspective déjà existante † La plateforme Eclipse fournit un point d’extension org.eclipse.ui.perspectiveExtensions permettant de † Construire déclarativement une perspective (agencer des vues, ajouter des raccourcis, …) via l’outil PDE † Etendre une perspective existante

Slide 50

Slide 50 text

50 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Perspective Extensions Choisir le point d’extension perspectiveExtensions † Sélectionner le point org.eclipse.ui.perspectiveExtensions

Slide 51

Slide 51 text

51 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Perspective Extensions Définition de la perspective qui sera étendue L’utilisation du point d’extension PerspectiveExtension nécessite qu’une perspective existe (soit de la plateforme Eclipse soit explicitement) Onglet Extensions

Slide 52

Slide 52 text

52 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Perspective Extensions package eclipse.workbench.perspectiveexample.perspectives; public class EmptyPerspectiveFactory implements IPerspectiveFactory { public void createInitialLayout(IPageLayout layout) { // Ceci est une perspective vide. } } EmptyPerspectiveFactory.java du Projet PerspectiveExample Aucune modification n’a été apportée à la perspective Nous aurions pu également utiliser une perspective prédéfinie par la plateforme et contenant déjà des vues

Slide 53

Slide 53 text

53 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Perspective Extensions Possibilité d’ajouter des vues et des raccourcis à la perspective étendue Onglet Extensions showInPart permet d’ajouter des vues dans le menu Navigate -> Show In

Slide 54

Slide 54 text

54 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Perspective Extensions † Ajout d’une vue dans la perspective étendue Identifiant de la vue à ajouter Emplacement de la vue Par rapport à quelle autre vue Ratio de division La vue est-elle visible ou pas ? La vue peut-elle être fermée ou pas ? La vue peut-elle être déplacée ou pas ? S’agit-il d’une vue de type Standalone ou pas ? Si elle est Standalone le titre est-il affiché ou pas ? Mêmes caractéristiques que pour l’approche par programmation (voir précédemment)

Slide 55

Slide 55 text

55 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Perspective Extensions † Exemple : refaire à l’identique AddViewPerspective Trois vues sont ajoutées à la perspective vide

Slide 56

Slide 56 text

56 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Construction à l’exécution † Précédemment nous avons montré comment créer une perspective au niveau de la phase de développement † Cette troisième solution permet de créer une perspective en cours d’exécution de l’application † Démarche à entreprendre … † L’utilisateur choisit quelles sont les vues à afficher dans la perspective et les agencent de manière interactive † Il sauvegarde ensuite la perspective en lui donnant un nom qui servira d’identifiant † Menu Window -> Save Perspective As …

Slide 57

Slide 57 text

57 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Registre des perspectives † Le registre des perspectives est utilisé par le conteneur Eclipse pour stocker l’intégralité des perspectives créées † Il n’existe qu’un seul registre de perspective géré par le Workbench † A partir de ce registre il est possible de † Chercher une perspective † Supprimer une perspective IPerspectiveRegistry perspRegistry = PlatformUI.getWorkbench().getPerspectiveRegistry(); L’interface IPerspectiveRegistry est détaillée dans la suite Seules les perspectives construites à l’exécution sont supprimables

Slide 58

Slide 58 text

58 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Registre des perspectives † L’interface IPerspectiveRegistry fournit un ensemble de méthodes pour identifier et effacer des perspectives † IPerspectiveDescriptor clonePerspective(String id, String label, IPerspectiveDescriptor desc) : création d’un clone de la perspective desc avec un nouvel id et label † void deletePerspective(IPerspectiveDescriptor desc) : suppression d’une perspective (ne fonctionne pas pour les perspectives définies par une extension) † IPerspectiveDescriptor findPerspectiveWithId(String idPersp) : recherche une perspective à partir de son identifiant idPersp † IPerspectiveDescriptor[] getPerspectives() : retourne la liste complète des perspectives † String getDefaultPerspective() : retourne la perspective par défaut † void setDefaultPerspective(String id) : modifie la perspective par défaut

Slide 59

Slide 59 text

59 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Registre des perspectives † Une perspective est définie via l’interface de programmation IPerspectiveDescriptor † Cette interface contient tous les accesseurs caractérisant une perspective † String getId() : l’identifiant de la perspective † Sting getLabel() : le nom de la perspective † String getDescription() : la description de la perspective † ImageDescriptor() : l’image de la perspective Identifiant Nom Image La description est définie comme un sous élément d’une extension

Slide 60

Slide 60 text

60 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Registre des perspectives † Exemple : manipuler le registre des perspectives PerspectiveRegistryViewPart du Projet PerspectiveExample Affiche les informations de la perspective AddFastViewPerspective Supprime la perspective CustomPerspective Affiche toutes les perspectives du registre La perspective CustomPerspective a été construite à l’exécution

Slide 61

Slide 61 text

61 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Registre des perspectives † Exemple (suite) : manipuler le registre des perspectives package eclipse.workbench.perspectiveexample.views; public class PerspectiveRegistryViewPart extends ViewPart { public void createPartControl(Composite parent) { ... Button searchPerspective = new Button(parent, SWT.FLAT); searchPerspective.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { IPerspectiveRegistry perspectiveRegistry= PlatformUI.getWorkbench().getPerspectiveRegistry(); IPerspectiveDescriptor findPerspectiveWithId = perspectiveRegistry.findPerspectiveWithId("eclipse.workbench.PerspectiveExample. AddFastViewPerspective"); if (findPerspectiveWithId !=null) { System.out.println(findPerspectiveWithId.getId()); System.out.println(findPerspectiveWithId.getLabel()); System.out.println(findPerspectiveWithId.getDescription()); } } }); searchPerspective.setText("Find : AddFastViewPerspective"); ... } } PerspectiveRegistryViewPart.java du Projet PerspectiveExample Recherche une perspective à partir de son identifiant

Slide 62

Slide 62 text

62 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Ecouteurs † Tout changement réalisé par la perspective peut être écouté † Activation et désactivation d’une perspective † Ouverture et fermeture d’une perspective † Modification du contenu d’une perspective (nouvelle vue, …) † Enregistrement d’une perspective † L’abonnement se fait à partir du WorkbenchWindow récupérable de deux manières † La méthode addPerspectiveListener(IPerspectiveListener p) est utilisée pour ajouter un écouteur sur la perspective IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); IWorkbenchWindow workbenchWindow = getSite().getWorkbenchWindow(); A n’utiliser que s’il n’existe qu’une fenêtre dans l’application A utiliser dans une ViewPart ou EditorPart

Slide 63

Slide 63 text

63 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Ecouteurs † Plusieurs sous interfaces à IPerspectiveListener ont été définies et sont apparues au fil des versions d’Eclipse † Interface IPerspectiveListener † void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) : déclenchée quand perspective devient active † void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) : déclenchée quand perspective est modifiée (changeId décrit le changement) † Les valeurs possibles de changeId sont définit dans l’interface IWorkbenchPage par les constantes CHANGE_*

Slide 64

Slide 64 text

64 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Ecouteurs † Interface IPerspectiveListener2 † void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, IWorkbenchPartReference part, String changeId) : identique à la méthode précédente à part qu’il est possible de connaître la vue ou l’éditeur impactée † Interface IPerspectiveListener3 † void perspectiveClosed(IWorkbenchPage p, IPerspectiveDescriptor p) : déclenchée si la perspective est fermée † void perspectiveDeactivated(IWorkbenchPage p, IPerspectiveDescriptor pDesc) : déclenchée si pDesc est désactivée † void perspectiveOpened(IWorkbenchPage p, IPerspectiveDescriptor pDesc) : déclenchée si la perspective a été ouverte † void perspectiveSaveAs(IWorkbenchPage p, IPerspectiveDescriptor old, IPerspectiveDescriptor new) : déclenchée quand la perspective est sauvegardée

Slide 65

Slide 65 text

65 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Ecouteurs † Interface IPerspectiveListener4 † void perspectivePreDeactivate(IWorkbenchPage page, IPerspectiveDescriptor perspective) : déclenchée avant que perspective soit désactivée † Principales valeurs de changeId † CHANGE_ACTION_SET_HIDE/SHOW : action est cachée ou montrée † CHANGE_EDITOR_AREA_HIDE/SHOW : éditeur est caché ou montré † CHANGE_EDITOR_CLOSE/OPEN : éditeur fermé ou montré † CHANGE_FAST_VIEW_ADD/REMOVE : fastview ajoutée ou montrée † CHANGE_VIEW_HIDE/SHOW : vue cachée ou montrée †CHANGE_RESET : reset de la perspective ou pas

Slide 66

Slide 66 text

66 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Ecouteurs † Exemple : écouter les changements d’une perspective package eclipse.workbench.perspectiveexample; public class Activator extends AbsractUIPlugin { public void start(BundleContext context) throws Exception { super.start(context); plugin = this; IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); activeWorkbenchWindow.addPerspectiveListener(new IPerspectiveListener4() { public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) { System.out.println("Activated " + perspective.getId()); } public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) { System.out.println("Changed " + perspective.getId() + " " + changeId); } ... }); } } Activator.java du Projet PerspectiveExample Récupération de la fenêtre active IWorkbenchWindow

Slide 67

Slide 67 text

67 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Principales opérations † La plateforme Eclipse fournit un ensemble d’opérations prédéfinies sur des traitements concernant les perspectives † org.eclipse.ui.perspectives.showPerspective : montrer une perspective en particulier † org.eclipse.ui.window.closeAllPerspectives : fermer toutes les perspectives † org.eclipse.ui.window.closePerspective : fermer la perspective urante † org.eclipse.ui.window.customizePerspective : paramétrer la perspective courante † org.eclipse.ui.window.nextPerspective : afficher la perspective suivant la perspective courante

Slide 68

Slide 68 text

68 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Principales opérations † org.eclipse.ui.window.previousPerspective : afficher la perspective précédent la perspective courante † org.eclipse.ui.window.resetPerspective : initialiser la perspective courante † org.eclipse.ui.window.savePerspective : sauvegarder la perspective courante † Ces opérations prédéfinies sont gérées par l’API Commands qui sera étudiée dans un prochain support de cours du Workbench

Slide 69

Slide 69 text

69 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Principales opérations † Exemple : exécuter une commande programmatiquement package eclipse.workbench.perspectiveexample; public class PerspectiveCommandsViewPart extends ViewPart { public void createPartControl(Composite parent) { parent.setLayout(new GridLayout(2, true)); Button resetButton = new Button(parent, SWT.PUSH); resetButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { try { IHandlerService hs = (IHandlerService) PlatformUI .getWorkbench().getService(IHandlerService.class); hs.executeCommand("org.eclipse.ui.window.resetPerspective", null); } catch (Exception e1) { e1.printStackTrace(); } } }); resetButton.setText("Reset Perspective"); } } PerspectiveCommandsViewPart.java du Projet PerspectiveExample Exécution de la commande « resetPerspective » par l’appui d’un bouton

Slide 70

Slide 70 text

70 Perspectives - M. Baron - Page mickael-baron.fr mickaelbaron Principales opérations † Exemple : exécuter une commande dans la barre d’outils d’une vue Une commande dans la barre d’outils de la vue (org.eclipse.ui.window.customizePerspective) Une commande dans le menu localisé de la vue (org.eclipse.ui.perspectives.showPerspective) PerspectiveCommandsViewPart.java du Projet PerspectiveExample A voir dans la partie Commands, comment définir déclarativement de nouveaux éléments à une barre d’outils et à un menu localisé d’une vue