Construction d'éditeurs avec la plateforme Eclipse

6 616 vues

Publié le

Ce support de cours s'intéresse à détailler la construction d'éditeurs avec la plateforme Eclipse. Il fait partie de la série des supports de cours liée au Workbench. Les aspects suivants sont étudiés : construction déclarative, registre des éditeurs, cycle de vie, MultiPageEditorPart, écouteurs, éditeur et les commandes, Workspace et les ressources, éditeur et le texte via TextEditor (coloration syntaxique, assistant de contenu, template, outline, spelling checking, ...).

Publié dans : Technologie, Sports
0 commentaire
2 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
6 616
Sur SlideShare
0
Issues des intégrations
0
Intégrations
1 092
Actions
Partages
0
Téléchargements
362
Commentaires
0
J’aime
2
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Construction d'éditeurs avec la plateforme Eclipse

  1. 1. Développement de clients riches : Plateforme Eclipse Chapitre 3 : Conception de plug-ins Workbench : Editors Mickaël BARON - 2010 mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
  2. 2. Licence Creative Commons Contrat Paternité Partage des Conditions Initiales à l'Identique 2.0 France keulkeul.blogspot.com http://creativecommons.org/licenses/by-sa/2.0/fr Editors - M. Baron - Page 2
  3. 3. Organisation du cours sur le Workbench : Editors Construction déclarative IEditorPart, IEditorSite, IEditorInput Registre des éditeurs Cycle de vie MultiPageEditorPart Ecouteurs keulkeul.blogspot.com Editeur et les commandes Workspace et les ressources Editeur et le texte via TextEditor Editors - M. Baron - Page 3
  4. 4. Workbench Editors : déroulement du cours Pédagogie du cours Illustration avec de nombreux exemples qui sont disponibles à l’adresse mbaron.developpez.com/eclipse/editors Des bulles d’aide tout au long du cours Logiciels utilisés Ceci est une astuce Eclipse 3.5.2 Galileo Ceci est une alerte keulkeul.blogspot.com Pré-requis Connaître la structure d’un plug-ins et savoir créer une extension Structure du Workbench Editors - M. Baron - Page 4
  5. 5. Workbench Editors : ressources … Des liens sur les éditeurs de manière générale www.vogella.de/articles/RichClientPlatform/article.html#editor wiki.eclipse.org/FAQ_What_is_the_difference_between_a_view_and_an_editor%3F wiki.eclipse.org/FAQ_How_do_I_open_an_editor_on_something_that_is_not_a_file%3F eclipse.dzone.com/tips/programmatically-split-editor- www.pajbam.com/wp-content/uploads/2008/04/cours_plugin_eclipse.pdf Des liens sur le Workspace (gestion de fichiers) wiki.eclipse.org/FAQ_How_do_I_open_an_editor_on_a_file_outside_the_workspace%3F www.eclipsezone.com/eclipse/forums/t83786.html wiki.eclipse.org/index.php/EFS www.eclipse.org/eclipse/platform-team/docs/ABC%20of%20Platform%20Workspace.ppt www.eclipse.org/articles/Article-Resource-deltas/resource-deltas.html keulkeul.blogspot.com hexapixel.com/2009/01/12/rcp-workspaces www.eclipse.org/articles/Article-Mark My Words/mark-my-words.html www.eclipse.org/articles/Article-Builders/builders.html wiki.eclipse.org/FAQ_How_do_I_make_my_compiler_incremental%3F wiki.eclipse.org/FAQ_How_do_I_implement_an_Eclipse_builder%3F www.eclipsepluginsite.com/builders-natures-markers.html Editors - M. Baron - Page 5
  6. 6. Workbench Editors : ressources … Des liens sur l’amélioration d’un TextEditor beuss.developpez.com/tutoriels/eclipse/plug-in/editor/colors www.eclipse.org/eclipse/platform-text/development/dev.html wiki.eclipse.org/FAQ_How_do_I_provide_syntax_coloring_in_an_editor%3F wiki.eclipse.org/FAQ_What_is_a_document_partition%3F wiki.eclipse.org/FAQ_How_do_I_add_Content_Assist_to_my_editor%3F www.eclipse.org/articles/Article-Folding-in-Eclipse-Text-Editors/folding.html www.ibm.com/developerworks/opensource/library/os-ecca www.java2s.com/Code/Java/SWT-JFace-Eclipse/SWTCompletionEditor.htm Des livres Eclipse – Building Commercial-Quality Plug-ins, 2004 - ISBN : 0-321-22847-2 keulkeul.blogspot.com Eclipse – Rich Client Platform, 2005 – ISBN : 0-321-33461-2 Editors - M. Baron - Page 6
  7. 7. Généralités : Différences entre Vue et Editeur Un éditeur est commun à toutes les perspectives d’une fenêtre Si l’éditeur est fermé à partir d’une perspective il est fermé pour toutes les perspectives Il n’est pas possible d’empiler une vue avec un éditeur Un éditeur n’est pas détachable Un éditeur a obligatoirement une barre de titre keulkeul.blogspot.com Un éditeur n’a pas de barre de menus et de barre d’outils localisées, il partage avec les barres de la fenêtre Editors - M. Baron - Page 7
  8. 8. Généralités : Différences entre Vue et Editeur Un éditeur peut être instancié plusieurs fois pour un type d’éditeur donné Une vue ne possède qu’une seule instance (cas particulier avec l’identifiant secondaire) Un éditeur apparaît à un seul endroit de la page alors qu’une vue peut être déplacée Un éditeur peut être dans un état « modifié », son contenu peut ainsi être sauvegardé keulkeul.blogspot.com Un éditeur peut être associé à un nom de fichier ou à une extension et cette association peut être modifiée par l’utilisateur Editors - M. Baron - Page 8
  9. 9. Généralités : Usage de l’éditeur Les fausses idées concernant un éditeur … Editeur est dédié uniquement à l’affichage et à la manipulation du contenu d’un fichier Une vue peut réaliser la même chose Editeur est dédié à l’affichage du texte Un éditeur peut aussi afficher des IHMs types formulaires (PDE) La vue console affiche uniquement du texte Quand utiliser un éditeur ? keulkeul.blogspot.com Quand le contenu est considéré comme l’élément central de la fenêtre. Toutes les vues sont utilisées comme support (outline, explorer, …) Quand il est nécessaire de fournir des actions spécifiques pour l’édition (sauvegarde, menu contextuel, …) Editors - M. Baron - Page 9
  10. 10. Généralités : Editeur interne et externe Editeur interne Intégré dans une page d’une fenêtre du Workbench Le menu et la barre d’outils sont issus de la fenêtre du Workbench Editeur externe (System Editor) Démarré dans une fenêtre séparée au Workbench Après le démarrage d’un éditeur externe, le Workbench n’a plus la main sur l’état de l’éditeur (pas de possibilité d’arrêt) La collaboration ne peut s’effectuer que par le système de fichier Editeur mixte (In-Place Editor) keulkeul.blogspot.com Intégré dans une page d’une fenêtre du Workbench, un éditeur externe (intégration OLE) Le menu de l’éditeur externe intégré utilise le menu de la fenêtre du Workbench Editors - M. Baron - Page 10
  11. 11. Généralités : Editeur interne et externe Exemple : Utilisation d’un éditeur Word en mode « In-Place » Le menu de l’application Eclipse est complété par les éléments du menu de Word keulkeul.blogspot.com L’éditeur externe Word est intégré dans une page d’une WorkbenchWindow Editors - M. Baron - Page 11
  12. 12. Généralités : Editeur par défaut Un éditeur par défaut est celui à utiliser en priorité si d’autres éditeurs traitent le même type d’entrées Exemple : fichier xml Plusieurs éditeurs disponibles (texte, xml, m2eclipse, …) Si l’éditeur xml est utilisé comme défaut, il sera ouvert en priorité Lors de la définition d’un éditeur (voir extension editors), il est possible de spécifier qu’un éditeur est par défaut Un éditeur est définit implicitement par défaut, si aucun keulkeul.blogspot.com autre éditeur ne peut traiter son type d’entrée Si un fichier est ouvert avec un éditeur, cet éditeur ne devient pas par défaut mais sera utilisé pour ré-ouvrir de nouveau ce fichier Editors - M. Baron - Page 12
  13. 13. Généralités : Carte des classes de l’éditeur Principales interfaces et classes pour la gestion des éditeurs IWorkbenchPage activate(IWorkbenchPart) bringToTop(IWorkbenchPart) IWorkbenchPartReference findEditor(String) getId() getEditorReferences() getPage() hideEditor(IEditorReference) getPart(boolean) showEditor(IEditorReference) IWorkbenchSite getPage() getSelectionProvider() IEditorReference getShell() getEditor(boolean) getWorkbenchWindow() getEditorInput() setSelectionProvider(ISelectionProvider) getFactoryId() getName() IWorkbenchPart isPinned() createPartControl(Composite) IWorkbenchPartSite dispose() getKeyBindingService() getSite() registerContextMenu(MenuManager, ISelectionProvider) registerContextMenu(String, MenuManager, ISelectionProvider) WorkbenchPart IEditorPart keulkeul.blogspot.com dispose() getEditorSite() IEditorSite getConfigurationElement() getEditorInput() getActionBars() getSite() init(IEditorSite, IEditorInput) getActionBarContributor() setPartName(String) EditorPart Héritage Généraliste getEditorSite() Spécifique à un getEditorInput() EditorInput Dépendance éditeur getEditorSite() init(IEditorSite, IEditorInput) getEditorInput() init(IEditorSite, IEditorInput) Editors - M. Baron - Page 13
  14. 14. Généralités : Principales classes de l’éditeur IEditorPart : Contient le code de l’IHM de l’éditeur IEditorSite : Pont entre l’éditeur et le Workbench IEditorInput : Descripteur du contenu d’un éditeur IEditorDescriptor : Descripteur utilisé dans le registre des éditeurs IEditorReference : Représenter une instance d’un éditeur keulkeul.blogspot.com dans la page active IEditorActionBarContributor : Utilisé pour contribuer à l’ajout d’actions dans la barre de menus et d’outils Editors - M. Baron - Page 14
  15. 15. Construction d’un éditeur interne par extension Sélectionner le point d’extension org.eclipse.ui.editors Création d’une extension à partir du point d’extension org.eclipse.ui.editors keulkeul.blogspot.com Création d’un éditeur à partir des templates Editor et Multi-page Editor Editors - M. Baron - Page 15
  16. 16. Construction d’un éditeur interne par extension Définir les attributs de l’extension Identifiant de l’éditeur Nom de l’éditeur Extensions des fichiers (ex : html) gérées par l’éditeur Objet de type EditorPart implémentant le contenu d’un éditeur interne Utiliser pour démarrer un éditeur externe (mutuellement exclusif avec class) Objet de type keulkeul.blogspot.com IEditorActionBarContributor utilisé pour ajouter des actions à la barre de menu et à la barre d’outils L’attribut default permet d’indiquer que cet éditeur est à utiliser en priorité pour les fichiers Les noms des fichiers Utilisation d’une police dont l’extension est html ou txt gérés par l’éditeur par défaut Editors - M. Baron - Page 16
  17. 17. Construction d’un éditeur interne par extension Etendre un éditeur de type EditorPart SimpleEditor.java du Projet EditorExample package eclipse.workbench.viewexample.views public class SimpleEditor extends EditorPart { public SimpleEditor() { } public void doSaveAs() { } public void init(IEditorSite site, IEditorInput input) throws PartInitException { setSite(site); setInput(input); } public boolean isDirty() { return false; } public boolean isSaveAsAllowed() { return false; } keulkeul.blogspot.com public void createPartControl(Composite parent) { Label myLabel = new Label(parent, SWT.NONE); myLabel.setText("Simple View"); } public void setFocus() { } public void doSave(IProgressMonitor monitor) { } } Editors - M. Baron - Page 17
  18. 18. Construction d’un éditeur interne par extension Pour utiliser cet éditeur plusieurs solutions sont à envisager Ouvrir un fichier au format html ou txt (File -> Open File …) Faire appel explicitement à la méthode openEditor à partir d’un WorkbenchPage (voir plus tard) A noter que si aucun éditeur n’est défini pour une extension donnée d’un fichier Ce fichier n’est pas ouvert par un éditeur Eclipse Un éditeur externe (System Editor) est utilisé si l’extension a été associée à un éditeur keulkeul.blogspot.com Si l’éditeur d’Eclipse est défini comme éditeur par défaut, le fichier est automatiquement ouvert dans cet éditeur Il est possible d’utiliser d’autres éditeurs en utilisant le menu Open With Editors - M. Baron - Page 18
  19. 19. Construction d’un éditeur interne par extension Exemple : Ouverture du fichier pom.xml par trois éditeurs Plusieurs éditeurs peuvent éditer ce fichier Des éditeurs fournis par Eclipse L’éditeur système Via l’éditeur de M2 Eclipse Via l’éditeur XML Via l’éditeur sytème « Firefox » keulkeul.blogspot.com Editors - M. Baron - Page 19
  20. 20. Construction d’un éditeur externe par extension Précédemment l’attribut class a permis de développer un éditeur interne Pour développer des éditeurs externes il faut utiliser les attributs launcher ou command A noter que class, launcher et command sont mutuellement exclusif Utilisation de l’attribut launcher Nécessite la création d’une classe implémentant IEditorLauncher void open(IPath file) : appelée pour ouvrir le fichier dont le chemin keulkeul.blogspot.com est passé en paramètre Utilisation de l’attribut command Commande du système (par exemple : notepad.exe) Ne pas confondre avec les commandes Eclipse !!!! - M. Baron - Page Editors 20
  21. 21. Construction d’un éditeur externe par extension Exemple : Création d’un éditeur externe via launcher Cet éditeur est associé aux fichiers dont l’extension est extlaunch L’attribut launcher est renseigné keulkeul.blogspot.com Si l’attribut launcher doit être renseigné, ne pas modifier les attributs class et command Editors - M. Baron - Page 21
  22. 22. Construction d’un éditeur externe par extension Exemple (suite) : Création d’un éditeur externe via launcher Recherche au niveau du système d’exploitation le programme associé Utilisation de l’API Program pour à l’extension txt démarrer un éditeur externe (pour être sur d’obtenir un résultat) public class SimpleEditorEditorLauncher implements IEditorLauncher { public void open(IPath file) { final Program findProgram = Program.findProgram("txt"); boolean result = findProgram.execute(file.toFile().getAbsolutePath()); System.out.println("External Editor has been launched ? : " + result); } } SimpleEditor.java du Projet EditorExample keulkeul.blogspot.com Exécution du programme (notepad.exe) en donnant en paramètre le chemin du fichier Editors - M. Baron - Page 22
  23. 23. Construction d’un éditeur externe par extension Exemple (suite) : Création d’un éditeur externe via launcher Utilisation de l’éditeur interne texte (via Open With) Utilisation de l’éditeur keulkeul.blogspot.com externe (notepad.exe) (également via Open With) Editors - M. Baron - Page 23
  24. 24. Construction d’un éditeur externe par extension Exemple : Création d’un éditeur externe via command Cet éditeur est associé aux fichiers dont l’extension est extCommand L’attribut command est renseigné keulkeul.blogspot.com Très simple d’utilisation mais ne Si l’attribut command doit être permet pas de définir des renseigné, ne pas modifier les paramètres dérivés attributs class et launcher Editors - M. Baron - Page 24
  25. 25. EditorPart La définition d’un nouvel éditeur est obtenue en héritant de la classe EditorPart Des méthodes abstraites doivent être implémentées void init(IEditorSite site, IEditorInput input) : initialise l’éditeur void createPartControl(Composite parent) : création de l’IHM par des composants SWT où parent est le conteneur de la vue void setFocus() : composant qui aura le focus lors de l’activation void doSave(IProgressMonitor monitor) : sauvegarde le contenu de l’éditeur void doSaveAs() : sauvegarde le contenu de l’éditeur dans un autre keulkeul.blogspot.com emplacement boolean isDirty() : indique si le contenu a changé boolean isSaveAsAllowed() : « Save As » est-il supporté ? boolean isSaveOnCloseNeeded() : La sauvegarde est-elle nécessaire avant la fermeture de l’éditeur ? Editors - M. Baron - Page 25
  26. 26. EditorPart Des méthodes qui peuvent être redéfinies … void setInitializationData(…) : appelée lors de la création de l’extension String getTitleToolTip() : message pour la bulle d’aide de l’éditeur Des méthodes à exploiter … IEditorSite getEditorSite() : retourne le site de l’éditeur (étudier par la suite) keulkeul.blogspot.com IEditorInput getEditorInput() : retourne l’EditorInput de l’éditeur (étudier par la suite) void setPartName(String ti) : modifie directement le titre de l’éditeur en place d’utiliser les données de l’extension Editors - M. Baron - Page 26
  27. 27. EditorPart et IEditorSite Le site d’un éditeur est une sorte de pont entre l’éditeur (définit par EditorPart) et le Workbench Il faut voir le site comme un objet qui permet de lier l’éditeur au contexte de l’application L’interface IWorkbenchSite est une abstraction d’un site IWorkbenchPage getPage() : la page dans laquelle l’éditeur est stockée Shell getShell() : la fenêtre physique d’où est contenue l’éditeur IWorkbenchWindow getWorkbenchWindow() : la fenêtre déclarative contenant l’éditeur void registerContextMenu(MenuManager mM, ISelectionProvider sP) : keulkeul.blogspot.com expose un menu vers le Workbench pour permettre son extension ultérieur void setSelectionProvider(ISelectionProvider sP) : déclare un SelectionProvider (TableViewer par exemple) au service de sélection Editors - M. Baron - Page 27
  28. 28. EditorPart et IEditorSite L’interface IEditorSite (sous type de IWorkbenchSite) fournit des méthodes spécifiques IActionBars getActionBars() : la barre d’action de l’éditeur IEditorActionBarContributor getActionBarContributor() : retourne un objet IEditorActionBarContributor utilisé pour la création des actions L’ajout d’éléments dans keulkeul.blogspot.com la barre de menu A l’ouverture de l’éditeur des et la barre commandes (ou actions) sont d’outils sera ajoutées à la barre d’action et menu étudié dans la suite Editors - M. Baron - Page 28
  29. 29. IEditorInput Un objet IEditorInput est un descripteur léger sur le contenu d’un éditeur Il ne s’agit pas du modèle de l’éditeur mais d’une description sur la source de l’éditeur utilisé par l’EditorPart A chaque création d’une nouvelle instance d’EditorPart, un objet de type IEditorInput doit être passé en paramètre L’éditeur à ouvrir doit supporter l’objet IEditorInput passé en paramètre Possibilité d’adapter un objet IEditorInput en autre objet keulkeul.blogspot.com puisque l’objet est de type IAdaptable Exemple : adapter un CustomEditorInput en FileEditorInput de telle sorte que CustomEditorInput soit utilisable par des éditeurs manipulant des fichiers Editors - M. Baron - Page 29
  30. 30. IEditorInput Principales méthodes de IEditorInput boolean exists() : vérifie si l’éditeur existe ImageDescriptor getImageDescriptor() : retourne une image String getToolTipText() : retourne le texte de la bulle d’aide String getName() : retourne un nom En pratique un éditeur qui édite le contenu d’un fichier utilise en FileEditorInput Contient un attribut de type File permettant d’accéder au contenu du fichier keulkeul.blogspot.com Principales méthodes de FileEditorInput IFile getFile() : retourne le fichier contenant la source Lors de la définition de votre propre IEditorInput redéfinissez obligatoirement la méthode equals Editors - M. Baron - Page 30
  31. 31. Registre des éditeurs Le registre des éditeurs est utilisé par le conteneur Eclipse pour stocker l’intégralité des éditeurs créés Il n’existe qu’un seul registre d’éditeur géré par le Workbench A partir de ce registre il est possible de Chercher un éditeur par son identifiant Chercher tous les éditeurs associés à un nom de fichier Chercher l’éditeur par défaut par son nom keulkeul.blogspot.com IEditorRegistry editorRegistry = PlatformUI.getWorkbench().getEditorRegistry(); L’interface IEditorRegistry est détaillée dans la suite Editors - M. Baron - Page 31
  32. 32. Registre des éditeurs L’interface IEditorRegistry dispose des méthodes suivantes IEditorDescriptor findEditor(String id) : recherche un éditeur par son id IEditorDescriptor[] getEditors(String fileName) : retourne les éditeurs disponibles pour un fichier donné IEditorDescriptor getDefaultEditor(String fileName) : retourne l’éditeur par défaut pour un fichier donné boolean isSystemExternalEditorAvailable(String fileName) : vérifie s’il existe un éditeur externe disponible pour un fichier donné keulkeul.blogspot.com void setDefaultEditor(String fileNameOrExt, String id) : modifie l’éditeur par défaut suivant le nom de fichier ou l’extension Un objet IEditorDescriptor décrit un éditeur du point de vue de sa déclaration (informations de l’extension) - M. Baron - Page Editors 32
  33. 33. Registre des éditeurs Exemple : Modifier et accéder à l’éditeur par défaut Deux commandes permettent de modifier l’éditeur par défaut des fichiers de type html 1 La commande Launcher Editor Default associe l’éditeur SimpleExternalEditorWithLauncherId au fichier html 3 2 keulkeul.blogspot.com Le traitement de cette commande • affiche l’ancien éditeur par défaut • affecte le nouveau éditeur par défaut • affiche enfin le nouveau éditeur par défaut Editors - M. Baron - Page 33
  34. 34. Registre des éditeurs Exemple (suite) : Modifier et accéder à l’éditeur par défaut Récupération de l’éditeur par défaut des fichiers dont l’extension est html public class LauncherEditorCommandHandler extends AbstractHandler { public Object execute(ExecutionEvent event) throws ExecutionException { final IEditorRegistry editorRegistry = PlatformUI.getWorkbench().getEditorRegistry(); IEditorDescriptor defaultEditor = editorRegistry.getDefaultEditor("*.html"); if (defaultEditor != null) { System.out.println(defaultEditor.getLabel()); } editorRegistry.setDefaultEditor("*.html","eclipse.workbench.EditorExample.SimpleExternalEditorWithLauncherId"); defaultEditor = editorRegistry.getDefaultEditor("*.html"); if (defaultEditor != null) { System.out.println(defaultEditor.getLabel()); } return null; Modification de l’éditeur par défaut keulkeul.blogspot.com } } des fichiers de type html LauncherEditorCommandHandler.java du Projet EditorExample Editors - M. Baron - Page 34
  35. 35. Registre des éditeurs L’interface IEditorDescriptor décrit l’éditeur dans le registre des éditeurs (relation avec les extensions) String getId() : identifiant de l’éditeur String getLabel() : le nom de l’éditeur ImageDescriptor getImageDescriptor() : image de l’éditeur boolean isInternal() : utilise un éditeur interne pour l’ouverture ? boolean isOpenExternal() : utilise un éditeur externe pour l’ouverture ? boolean isOpenInPlace() : utilise un éditeur externe intégré à Eclipse ? keulkeul.blogspot.com … Le registre ne donne pas accès aux instances des objets IEditorPart (voir cycle de vie) Editors - M. Baron - Page 35
  36. 36. Registre des éditeurs Exemple : Interroger le registre des éditeurs public class EditorRegistryCommandHandler extends AbstractHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { final IEditorRegistry editorRegistry = PlatformUI.getWorkbench().getEditorRegistry(); final IEditorDescriptor[] editors = editorRegistry.getEditors("*.txt"); for (IEditorDescriptor iEditorDescriptor : editors) { System.out.println(iEditorDescriptor.getLabel()); } return null; Récupère les éditeurs associés à } } ce type d’extension EditorRegistryCommandHandler.java du Projet EditorExample keulkeul.blogspot.com Deux éditeurs sont disponibles Editors - M. Baron - Page 36
  37. 37. Cycle de vie Un objet IWorkbenchPage permet de gérer le cycle de vie des instances d’une classe IEditorPart (celle utilisée pour programmer l’interface d’un éditeur) Chaque instance de type IEditorPart est associée un objet de type IEditorReference Une instance IEditorReference est associée une instance IEditorPart Il peut exister dans une même page plusieurs instances du keulkeul.blogspot.com même éditeur (pas d’identifiant secondaire) Les méthodes fournies par la page permettent généralement d’afficher ou de cacher des éditeurs Editors - M. Baron - Page 37
  38. 38. Cycle de vie Principales méthodes de IWorkbenchPage en relation avec la notion d’éditeur IEditorPart getActiveEditor() : l’éditeur actuellement actif boolean closeAllEditors(boolean save) : ferme tous les éditeurs sans possibilité de sauvegarde si save vaut false boolean closeEditor(IEditorPart e, boolean save) : ferme un éditeur désigné par e IEditorPart findEditor(IEditorInput e) : cherche un éditeur via son IEditorInput IEditorPart[] getDirtyEditors() : retourne l’ensemble des éditeurs dont keulkeul.blogspot.com le contenu a changé (nécessite une sauvegarde) IEditorReferences[] getEditorReferences() : retourne l’ensemble des éditeurs IEditorPart openEditor(…) : ouvre un éditeur (détailler dans le prochain transparent) Editors - M. Baron - Page 38
  39. 39. Cycle de vie : openEditor … Le comportement de l’ouverture d’un éditeur est différent selon la configuration utilisée pour la méthode openEditor Trois configurations différentes Ouvre un nouvel éditeur s’il n’existe pas un éditeur ayant un même input (MATCH_INPUT) Ouvre un nouvel éditeur s’il n’existe pas un éditeur ayant un même identifiant (MATCH_ID) Ouvre un nouvel éditeur même s’il existe un éditeur ayant un même input ou un même identifiant (MATCH_NONE) Surcharge de la méthode openEditor keulkeul.blogspot.com IEditorPart openEditor(IEditorInput input, String editorID) : ouvre un éditeur s’il n’existe pas un éditeur ouvert ayant un même input IEditorPart openEditor(final IEditorInput input, final String editorID, final boolean activate, final int matchFlags) : ouvre un éditeur en spécifiant la configuration Editors - M. Baron - Page 39
  40. 40. Cycle de vie : openEditor … Exemple : Ouvrir un éditeur pour un fichier présent dans le Workspace Récupération de l’éditeur associé au type du fichier sélectionné (ici le fichier sample.html) public class OpenEditorCommandHandler extends AbstractHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { final IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); ISelectionService selService = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService(); final ISelection selection = selService.getSelection(); if (selection instanceof TreeSelection) { TreeSelection currentFile = (TreeSelection)selection; final IFile firstElement = (IFile)currentFile.getFirstElement(); IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(firstElement.getName()); try { keulkeul.blogspot.com activePage.openEditor(new FileEditorInput(firstElement), desc.getId()); } catch (PartInitException e) { e.printStackTrace(); } } } return null; Ouverture de l’éditeur s’il n’existe pas un } éditeur déjà ouvert ayant le même input OpenEditorCommandHandler.java du Projet EditorExample Editors - M. Baron - Page 40
  41. 41. Cycle de vie : openEditor … Exemple (suite) : Ouvrir un éditeur pour un fichier présent dans le Workspace keulkeul.blogspot.com L’utilisation de la méthode Les fichiers doivent être présents dans le openEditor ne s’applique que pour répertoire du workspace pour être ouvert les fichiers présents dans le via la méthode open(…) Workspace, sauf cas … Editors - M. Baron - Page 41
  42. 42. Cycle de vie : openEditor … Exemple : Ouvrir un éditeur pour un fichier non présent dans le Workspace (solution 1) public class OpenExternalEditorCommandHandler extends AbstractHandler { public Object execute(ExecutionEvent event) throws ExecutionException { try { IWorkspace ws = ResourcesPlugin.getWorkspace(); IProject project = ws.getRoot().getProject("SimpleEditor"); Une boîte de dialogue est if (!project.exists()) project.create(null); utilisée pour choisir un if (!project.isOpen()) fichier sur le système hôte project.open(null); final IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); final Shell shell = activeWorkbenchWindow.getShell(); String name = new FileDialog(shell, SWT.OPEN).open(); if (name == null) return null; IPath location = new Path(name); Création d’un lien entre le IFile file = project.getFile(location.lastSegment()); file.createLink(location, IResource.NONE, null); fichier physique et le IWorkbenchPage page = activeWorkbenchWindow.getActivePage(); if (page != null) workspace keulkeul.blogspot.com IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(file.getName()); page.openEditor(new FileEditorInput(file), desc.getId()); } catch(Exception e) { e.printStackTrace(); } return null; Utilisation de l’éditeur par } } défaut pour l’ouverture OpenExternalEditorCommandHandler.java du Projet EditorExample Editors - M. Baron - Page 42
  43. 43. Cycle de vie : openEditor … Exemple (suite) : Ouvrir un éditeur pour un fichier non présent dans le Workspace (solution 1) Pas de fichier setup.log dans le répertoire du workspace keulkeul.blogspot.com Le fichier setup.log est localisé à l’emplacement c:setup.log L’icône précise qu’il s’agit d’un lien Editors - M. Baron - Page 43
  44. 44. Cycle de vie : openEditor … Exemple : Ouvrir un éditeur pour un fichier non présent dans le Workspace (solution 2) Depuis la version Eclipse 3.3, EFS (Eclipse File System) a été défini pour simplifier la gestion des fichiers public class OpenExternalEditorWithEFSCommandHandler extends AbstractHandler { public Object execute(ExecutionEvent event) throws ExecutionException { final IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); final Shell shell = activeWorkbenchWindow.getShell(); String name= new FileDialog(shell, SWT.OPEN).open(); if (name == null) return null; name = name.replace('','/'); IFileStore fileStore = EFS.getLocalFileSystem().getStore(URI.create(name)); if (!fileStore.fetchInfo().isDirectory() && fileStore.fetchInfo().exists()) { IWorkbenchPage page= activeWorkbenchWindow.getActivePage(); try { IDE.openEditorOnFileStore(page, fileStore); } catch (PartInitException e) { e.printStackTrace(); Utilisation de la méthode keulkeul.blogspot.com } } return null; openEditorOnFileStore définie } } dans la classe IDE OpenExternalEditorWithEFCCommandHandler.java du Projet EditorExample Editors - M. Baron - Page 44
  45. 45. Cycle de vie : openEditor … Exemple : Ouvrir un éditeur pour un contenu qui n’est pas un fichier Affichage du contenu qui ne provient pas d’un fichier (une chaîne de texte) keulkeul.blogspot.com Exemple issu de la FAQ Eclipse http://wiki.eclipse.org/FAQ_How_do_I_open_an_editor_on_something_that_is_not_a_file%3F Editors - M. Baron - Page 45
  46. 46. Cycle de vie : openEditor … Exemple (suite) : Ouvrir un éditeur pour un contenu qui n’est pas un fichier public class OpenEditorWithNoFileCommandHandler extends AbstractHandler { class StringStorage implements IStorage { priva te String string; StringStorage(String input) { this.string = input; } public InputStream getContents() throws CoreException { return new ByteArrayInputStream(string.getBytes()); } public IPath getFullPath() { return null; } public Object getAdapter(Class adapter) { return null; } public String getName() { int len = Math.min(5, string.length()); keulkeul.blogspot.com return string.substring(0, len).concat("..."); } public boolean isReadOnly() { return true; } } ... // Suite dans le prochain transparent OpenEditorWithNoFileCommandHandler.java du projet EditorExample Editors - M. Baron - Page 46
  47. 47. Cycle de vie : openEditor … Exemple (suite) : Ouvrir un éditeur pour un contenu qui n’est pas un fichier public class OpenEditorWithNoFileCommandHandler extends AbstractHandler { class StringInput implements IStorageEditorInput { private IStorage storage; StringInput(IStorage storage) { this.storage = storage; } public boolean exists() { return true; } public ImageDescriptor getImageDescriptor() { return null; } public String getName() { return storage.getName(); } public IPersistableElement getPersistable() { return null; } public IStorage getStorage() { return storage; } keulkeul.blogspot.com public String getToolTipText() { return "String-based file: " + storage.getName(); } public Object getAdapter(Class adapter) { return null; } } ... // Suite dans le prochain transparent OpenEditorWithNoFileCommandHandler.java du projet EditorExample Editors - M. Baron - Page 47
  48. 48. Cycle de vie : openEditor … Exemple (suite) : Ouvrir un éditeur pour un contenu qui n’est pas un fichier Contenu à afficher public class OpenEditorWithNoFileCommandHandler extends AbstractHandler { public Object execute(ExecutionEvent event) throws ExecutionException { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); String string = "This is the text file contents"; IStorage storage = new StringStorage(string); IStorageEditorInput input = new StringInput(storage); Définition d’un IEditorInput IWorkbenchPage page = window.getActivePage(); dédié à la gestion d’une chaîne if (page != null) { de caractères try { page.openEditor(input, "org.eclipse.ui.DefaultTextEditor"); } catch (PartInitException e) { e.printStackTrace(); } } Ouverture de l’éditeur qui gère keulkeul.blogspot.com } return null; l’édition et l’affichage du texte OpenEditorWithNoFileCommandHandler.java du projet EditorExample Editors - M. Baron - Page 48
  49. 49. Cycle de vie : openEditor … Exemple : Ouvrir plusieurs instances d’un même éditeur Plusieurs instances d’un même éditeur keulkeul.blogspot.com Editors - M. Baron - Page 49
  50. 50. Cycle de vie : openEditor … Exemple (suite) : Ouvrir plusieurs instances d’un même éditeur public class OpenSeveralEditorInstances extends AbstractHandler { public Object execute(ExecutionEvent event) throws ExecutionException { final IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); ISelectionService selService = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService(); final ISelection selection = selService.getSelection(); if (selection instanceof TreeSelection) { TreeSelection currentFile = (TreeSelection)selection; final IFile firstElement = (IFile)currentFile.getFirstElement(); IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(firstElement.getName()); try { activePage.openEditor( new FileEditorInput(firstElement), desc.getId(), true, IWorkbenchPage.MATCH_NONE); } catch (PartInitException e) { e.printStackTrace(); } } keulkeul.blogspot.com return null; Précise qu’il n’y a pas de comparaison } } entre les instances d’éditeur OpenSeveralEditorInstances.java du projet EditorExample Editors - M. Baron - Page 50
  51. 51. Cycle de vie L’interface IEditorReference permet de représenter une instance d’un éditeur dans la page active String getName() : le nom de l’éditeur IEditorPart getEditor(boolean restore) : l’éditeur associé à cette instance IEditorInput getEditorInput() : l’EditorInput associé à cette instance boolean isPinned() : indique si l’éditeur est épinglé (voir transparent keulkeul.blogspot.com suivant pour explication) L’accès à un objet IViewReference se fait par l’intermédiaire du Workbench Page actif Editors - M. Baron - Page 51
  52. 52. Cycle de vie : isPinned ? Possibilité d’ouvrir plusieurs éditeurs dans une page pouvant aboutir à un nombre important d’éditeurs ouverts La plateforme Eclipse permet de restreindre le nombre d’éditeur ouvert dans une page en fermant automatique- ment les anciens éditeurs keulkeul.blogspot.com Preferences -> General -> Editors … activer l’option Close editors … Seuls trois éditeurs doivent rester ouverts Editors - M. Baron - Page 52
  53. 53. Cycle de vie : isPinned ? Un éditeur ne peut être fermé automatiquement dans les cas suivants si son état est dirty (contenu modifié) si son état est pinned (épinglé) Dés que l’option Close Editors Comment « épingler » un éditeur … automatically est activée, l’action Pin Editor est disponible keulkeul.blogspot.com L’action Pin Editor sur l’éditeur courant active ou pas l’état épinglé Possibilité de modifier programmatiquement l’état de la caractéristique pinned d’un éditeur Editors - M. Baron - Page 53
  54. 54. Cycle de vie : de l’ouverture à la fermeture 1 Ouverture de l’éditeur void init(IEditorSite site, IEditorInput input) : initialisation du contenu de l’éditeur void createPartControl(Composite parent) : création de l’IHM 2 Modification du contenu void firePropertyChange(PROP_INPUT) : déclenche un changement boolean isDirty() : précise s’il y a des changements 3 Persistance keulkeul.blogspot.com void doSave(IProgressMonitor monitor) : sauvegarder le contenu void doSaveAs() : sauvegarder le contenu dans un autre objet 4 Fermeture dispose() : destruction des objets Editors - M. Baron - Page 54
  55. 55. Cycle de vie : ouverture d’un éditeur Ouverture d’un éditeur procède à la création d’une instance EditorPart dans le Workbench Page actif Ordre d’appel des méthodes de la classe de type EditorPart 1 Constructeur de la classe de type EditorPart 2 void init(IEditorSite site, IEditorInput input) : ne pas oublier de stocker le site et l’input dans le traitement de cette méthode keulkeul.blogspot.com 3 void createPartControl(Composite parent) Méthodes appelées par la plateforme Eclipse uniquement à la création de l’instance d’un éditeur Editors - M. Baron - Page 55
  56. 56. Cycle de vie : éditeur en utilisation Tout au long de l’utilisation d’une instance d’un EditorPart, son contenu peut évoluer Exemple : un texte a été modifié, une sauvegarde peut être réalisée La méthode isDirty() permet de retourner à la page courante l’état de ce changement Si un changement est repéré, les procédures de sauvegarde du contenu sont proposées La commande Save est activée keulkeul.blogspot.com La commande Save As est activée si la méthode isSaveAsAllowed() retourne vraie La sauvegarde est proposée à l’utilisateur si la méthode isSaveOnCloseNeeded() retourne vraie Editors - M. Baron - Page 56
  57. 57. Cycle de vie : fermeture d’un éditeur La sauvegarde du contenu est gérée directement par l’éditeur dans la classe de type EditorPart Plusieurs méthodes sont appelées en fonction du type de sauvegarde à réaliser void doSave(IProgressMonitor monitor) : appelée pour réaliser une sauvegarde sur une ressource void doSaveAs() : appelée pour effectuer une sauvegarde de type « Sauvegarder Comme » A la suite de la sauvegarde, il faut penser à modifier l’état keulkeul.blogspot.com du changement retourné par la méthode isDirty() La fermeture d’un éditeur provoque la suppression d’une instance de type EditorPart (méthode dispose()- M. Baron - Page Editors appelée) 57
  58. 58. Cycle de vie : show et hide Depuis la version Eclipse 3.5 (Galileo), une API permet de cacher et de rendre visible un éditeur sans destruction de ces instances Son utilisation reste limitée et seulement deux méthodes sont proposées void hideEditor(IEditorReference) : cache un éditeur en utilisant son EditorReference void showEditor(IEditorReference) : affiche un éditeur précédemment keulkeul.blogspot.com caché Il n’est pas possible de récupérer la liste des éditeurs qui sont dans un état caché Editors - M. Baron - Page 58
  59. 59. Cycle de vie : show et hide Exemple : Cacher et ouvrir un éditeur HideEditorCommandHandler.java du projet EditorExample Handler utilisé pour cacher des éditeurs public class HideEditorCommandHandler extends AbstractHandler { public Object execute(ExecutionEvent event) throws ExecutionException { final IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); final IWorkbenchPartReference reference = activePage.getReference(activePage.getActiveEditor()); if (reference instanceof IEditorReference) { activePage.hideEditor((IEditorReference)reference); Activator.getDefault().getHiddenEditors().add((IEditorReference)reference); } return null; } } keulkeul.blogspot.com L’ajout explicite des éditeurs dans Ajoute chaque référence l’Activator est nécessaire puisque l’API (IEditorReference) des éditeurs à ne permet pas de connaître les éditeurs cacher dans l’Activator cachés Editors - M. Baron - Page 59
  60. 60. Cycle de vie : show et hide Exemple (suite) : Cacher et ouvrir un éditeur ShowEditorCommandHandler.java Permet de réafficher un du projet EditorExample seul éditeur public class ShowEditorCommandHandler extends AbstractHandler { public Object execute(ExecutionEvent event) throws ExecutionException { final IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); final List<IEditorReference> hiddenEditors = Activator.getDefault().getHiddenEditors(); if (!hiddenEditors.isEmpty()) { activePage.showEditor(hiddenEditors.get(0)); hiddenEditors.remove(0); } return null; Appel de showEditor pour afficher } } l’éditeur puis suppression dans l’Activator Permet de réafficher ou tous les éditeurs public class ShowAllHiddenEditorsHandler extends AbstractHandler { public Object execute(ExecutionEvent event) throws ExecutionException { final IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); keulkeul.blogspot.com WorkbenchPage activeWorkbencPage = (WorkbenchPage)activePage; final List<IEditorReference> hiddenEditors = Activator.getDefault().getHiddenEditors(); hiddenEditors.clear(); activeWorkbencPage.resetHiddenEditors(); return null; Appel de resetHiddenEditors pour } } réafficher tous les éditeurs cachés ShowAllHiddenEditorsHandler.java du projet EditorExample Editors - M. Baron - Page 60
  61. 61. MultiPageEditorPart Un MultiPageEditorPart est un éditeur avec plusieurs pages où chaque page peut contenir un éditeur (EditorPart) ou un composant SWT Un MultiPageEditorPart hérite de EditorPart et par conséquent il se comporte comme un éditeur classique (cycle de vie identique) keulkeul.blogspot.com Une page contenant des composants SWT (Composite, Button, …) Une page contenant un éditeur Editors - M. Baron - Page 61
  62. 62. MultiPageEditorPart Les méthodes utiles de la classe MultiPageEditorPart int addPage(IEditorPart editor, IEditorInput input) : ajoute un éditeur à la dernière page et retourne l’index de la page ajoutée int addPage(Control p) : ajoute un composant SWT à la dernière page et retourne l’index de la page ajoutée void setPageText(int index, String title) : modifie le titre de la page en fonction de l’index donné Les méthodes à implémenter et à redéfinir void createPages() : appeler pour construire les pages void doSave(IProgressMonitor p) : sauvegarde de l’éditeur multiple keulkeul.blogspot.com void doSaveAs() : sauvegarde de type « Sauvegarder Comme » boolean isSaveAsAllowed() : autoriser le « Sauvegarder Comme » void pageChange(int new) : à redéfinir si besoin d’être notifié du changement de page Editors - M. Baron - Page 62
  63. 63. MultiPageEditorPart Exemple : Un éditeur multiple avec trois pages Une page contenant un éditeur de texte affichant le contenu d’un fichier Une page contenant un composite avec un bouton permettant de choisir une police de caractères keulkeul.blogspot.com Exemple basé sur le template fourni par la Une dernière page contenant un plateforme Eclipse composite avec un composant utilisé pour illustrer la StyledText permettant d’afficher chaque construction d’éditeurs mot (donné par le texte de la page 1) avec une police définie par la page 2 Editors - M. Baron - Page 63
  64. 64. MultiPageEditorPart Exemple (suite) : Un éditeur multiple avec trois pages public class MultiPageEditor extends MultiPageEditorPart implements IResourceChangeListener { public MultiPageEditor() { super(); Ajoute un écouteur sur les } ResourcesPlugin.getWorkspace().addResourceChangeListener(this); changements des ressources protected void createPages() { createPage0(); Demande la création createPage1(); createPage2(); de chaque page } private void createPage0() { try { Ajoute un éditeur editor = new TextEditor(); dans la page 0 int index = addPage(editor, getEditorInput()); setPageText(index, editor.getTitle()); } catch (PartInitException e) { ErrorDialog.openError(getSite().getShell(), "Error creating nested text editor", null, e.getStatus()); } } private void createPage2() { ... text = new StyledText(composite, SWT.H_SCROLL | SWT.V_SCROLL); int index = addPage(composite); Ajoute un composite setPageText(index, "Preview"); keulkeul.blogspot.com } dans la page 2 protected void pageChange(int newPageIndex) { super.pageChange(newPageIndex); if (newPageIndex == 2) sortWords(); } A chaque changement de page } // Suite dans le prochain transparent une action est réalisée MultiPageEditor.java du projet MultiPageEditorExample Editors - M. Baron - Page 64
  65. 65. MultiPageEditorPart Exemple (suite) : Un éditeur multiple avec trois pages public class MultiPageEditor extends MultiPageEditorPart implements IResourceChangeListener { public void doSave(IProgressMonitor monitor) { getEditor(0).doSave(monitor); } public void doSaveAs() { IEditorPart editor = getEditor(0); Sauvegarde le contenu si des editor.doSaveAs(); modifications ont été apportées setPageText(0, editor.getTitle()); setInput(editor.getEditorInput()); } public void resourceChanged(final IResourceChangeEvent event) { if(event.getType() == IResourceChangeEvent.PRE_CLOSE){ Display.getDefault().asyncExec(new Runnable(){ public void run(){ IWorkbenchPage[] pages = getSite().getWorkbenchWindow().getPages(); for (int i = 0; i<pages.length; i++){ if(((FileEditorInput)editor.getEditorInput()).getFile() .getProject().equals(event.getResource())) { IEditorPart editorPart = pages[i].findEditor(editor.getEditorInput()); pages[i].closeEditor(editorPart,true); } } } keulkeul.blogspot.com } }); Si le projet est fermé, les } éditeurs associés sont fermés public void dispose() { ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); super.dispose(); } } MultiPageEditor.java du projet MultiPageEditorExample Editors - M. Baron - Page 65
  66. 66. Diviser un éditeur Dans une page la zone de l’éditeur est unique et plusieurs instances d’éditeurs peuvent cohabiter dans la zone L’affichage des éditeurs peut se faire Soit en empilant les différents éditeurs Soit en divisant (split) les éditeurs Soit de manière mixte (empiler + diviser) Pour diviser des éditeurs, l’utilisateur peut faire glisser un éditeur dans la zone keulkeul.blogspot.com Toutefois, il n’existe pas d’API « publics » pour réaliser cette opération de manière programmatique, il faut penser par l’implémentation interne Editors - M. Baron - Page 66
  67. 67. Diviser un éditeur Exemple : Diviser programmatiquement la zone de l’éditeur keulkeul.blogspot.com Exemple issu du blog … La zone de l’éditeur est séparée en deux http://swarmy.free.fr/wordpress/?p=17 Editors - M. Baron - Page 67
  68. 68. Diviser un éditeur Exemple (suite) : Diviser programmatiquement la zone de l’éditeur public class CreateSplitEditorHandler extends AbstractHandler { public Object execute(ExecutionEvent event) throws ExecutionException { IWorkbenchPage workbenchPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IWorkbenchPart part = workbenchPage.getActivePart(); PartPane partPane = ((PartSite) part.getSite()).getPane(); LayoutPart layoutPart = partPane.getPart(); IEditorReference[] editorReferences = workbenchPage.getEditorReferences(); if (editorReferences.length > 1) { PartPane currentEditorPartPane = ((PartSite) workbenchPage.getActiveEditor().getSite()).getPane(); EditorSashContainer editorSashContainer = null; ILayoutContainer rootLayoutContainer = layoutPart.getContainer(); if (rootLayoutContainer instanceof LayoutPart) { ILayoutContainer editorSashLayoutContainer = ((LayoutPart) rootLayoutContainer).getContainer(); if (editorSashLayoutContainer instanceof EditorSashContainer) { editorSashContainer = ((EditorSashContainer) editorSashLayoutContainer); } } PartStack newPart = createStack(editorSashContainer); editorSashContainer.stack(currentEditorPartPane, newPart); if (rootLayoutContainer instanceof LayoutPart) { ILayoutContainer cont = ((LayoutPart) rootLayoutContainer).getContainer(); keulkeul.blogspot.com if (cont instanceof PartSashContainer) { // "Split" the editor area by adding the new part ((PartSashContainer) cont).add(newPart); } } } return null; } // Suite dans le prochain transparent ... } CreateSplitEditorHandler.java du projet SplitEditorExample Editors - M. Baron - Page 68
  69. 69. Diviser un éditeur Exemple (suite) : Diviser programmatiquement la zone de l’éditeur public class CreateSplitEditorHandler extends AbstractHandler { ... private PartStack createStack(EditorSashContainer editorSashContainer) { WorkbenchPage workPage = (WorkbenchPage)PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); EditorStack newWorkbook = EditorStack.newEditorWorkbook(editorSashContainer, workbenchPage); return newWorkbook; } } CreateSplitEditorHandler.java du projet SplitEditorExample keulkeul.blogspot.com Une grande partie des APIs utilisées sont définies comme Internal Editors - M. Baron - Page 69
  70. 70. Ecouteurs (Part Listeners) Les modifications opérées sur un éditeur (activation, visibilité ou l’ouverture) peuvent être écoutées (principe identique pour les vues) L’activation et la création des éditeurs sont écoutables via l’interface IPartService implémentées par IWorkbenchPage void addPartListener(IPartListener pl) : écouteur « 1ère » version void addPartListener(IPartListener2 pl) : écouteur « 2nd » version IWorkbenchPart getActivePart() : Part active keulkeul.blogspot.com IWorkbenchPartReference getActivePartReference() : Part référence active L’écouteur IPartListener est à remplacer par l’interface IPartListener2 Editors - M. Baron - Page 70
  71. 71. Ecouteurs (Part Listeners) IPartListener2 fournit les méthodes suivantes pour les réponses aux événements sur un éditeur void partActivated(IWorkbenchPartReference pr) : part activée void partBroughtToTop(IWorkbench… pr) : part au premier plan void partClosed(IWorkbench… pr) : part fermée void partDeactivated(IWorkbench… pr) : part désactivée void partHidden(IWorkbench… pr) : part cachée void partInputChanged(IWorkbench… pr) : saisie de l’utilisateur void partOpened(IWorkbench… pr) : part ouverte keulkeul.blogspot.com void partVisible(IWorkbench… pr) : part visible L’écoute de certaines modifications propres aux éditeurs n’est pas pris en compte : show/hide, instances multiples, division d’un éditeur, … Editors - M. Baron - Page 71
  72. 72. Ecouteurs (Part Listeners) Exemple : Ecouter les changements d’un EditorPart public class LifeCycleEditor extends EditorPart { public void createPartControl(Composite parent) { ... IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); activePage.addPartListener(new IPartListener2() { @Override public void partActivated(IWorkbenchPartReference partRef) { IWorkbenchPart part = partRef.getPart(false); if (LifeCycleEditor.this == part) { System.out.println(".partActivated()"); } } @Override public void partBroughtToTop(IWorkbenchPartReference partRef) { IWorkbenchPart part = partRef.getPart(false); if (LifeCycleEditor.this == part) { System.out.println(".partBroughtToTop()"); } } @Override public void partClosed(IWorkbenchPartReference partRef) { IWorkbenchPart part = partRef.getPart(false); keulkeul.blogspot.com if (LifeCycleEditor.this == part) { System.out.println(".partClosed()"); } } ... } } } LifeCycleEditor.java du projet EditorExample Editors - M. Baron - Page 72

×