Eclipse (PDE) - Gérer les associations de fichiers

Cet article ouvre sur une nouvelle série de tutoriels consacrée au développement de plugins pour Eclipse.

L’environnement de développement utilisé est Eclipse RCP (l’IDE "par défaut" sans aucun plugin) et PDE (Plugin Environment Developement).

Je ne ferais pas de tutoriel complet sur la mise en place de cet environnement de développement, vous trouverez facilement tout ce qu’il faut sur le net, par exemple ici : http://www.eclipse.org/pde/

Ce premier sujet sera consacré aux méthodes à implémenter pour personnaliser les préférences de l’IDE.
Plus spécialement cette fois-ci, la personnalisation des associations de fichiers avec certains éditeurs. Deux cas se présentent :

L’extension de fichier considérée existe déjà dans la liste des extensions gérées dans les préférences (par défaut *.html ou *.htm) :

Dans ce cas le plus simple, le code suivant permet de modifier l’association par défaut :

IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
registry.setDefaultEditor("*.html", "org.eclipse.ui.DefaultTextEditor");
((EditorRegistry)registry).saveAssociations();

Ce code peut être implémenté dans une classe qui s’éxecute au lancement de l’IDE, ou dans tout autre classe, puisque la méthode saveAssociations() met à jour les registres.

L’extension de fichier considéré n’existe pas par défaut :

Dans ce cas, il est impossible d’ajouter cette nouvelle association au lancement de l’IDE en passant par les registres d’éditeurs.

Il faut créer un éditeur personnalisé et l’associer à la nouvelle extension à travers le fichier plugin.xml : il faut utiliser le point d’extension "org.eclipse.ui.editors" : la section extensions permet de spécifier toutes les nouvelles extensions de fichiers qui seront associées par défaut à cet éditeur.

Pour en savoir plus, un très bon tutoriel a été rédigé sur developpez.com, je vous conseille d’aller y jeter un oeil. Et pour quelques détails supplémentaires, un autre tutoriel Aptana.


Fichier(s) joint(s) :

Eclipse (PDE) - Modifier le comportement par défaut d’un composant graphique

Nous allons voir maintenant comment interagir avec l’interface de l’IDE pendant son lancement pour agir sur un composant graphique.

L’exemple utilisé ici est l’ajout d’un MouseListener sur le TreeViewer dans la vue "ProjectExplorer".

Premièrement, pour accéder à ce composant, il faut, au lancement de l’IDE, passer par la fenêtre active puis entrer dans la vue ProjectExplorer. Voici le code nécessaire :

IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow window = workbench.getWorkbenchWindows()[0];
IWorkbenchPage page = window.getActivePage();
IViewPart viewPart = null;
try {
      viewPart = page.showView("org.eclipse.ui.navigator.ProjectExplorer");
} catch (PartInitException e) {
      System.out.println(e);
}
CommonNavigator nav = (CommonNavigator) viewPart;
CommonViewer viewer = nav.getCommonViewer();
Tree tree = viewer.getTree();
tree.addMouseMoveListener(list);

Voici donc le déroulement :

  • On accède en premier au Workbench (ensemble de fenêtres),
  • On récupère la page active
  • On accède à la vue ProjectExplorer qui est de type CommonNavigator
  • On récupère l’arbre qui gère l’arborescence des ressources du projet,
  • On lui affecte un listener personnalisé pour une action précise.

Cependant, si vous exécutez ce code dans une classe au lancement de l’IDE, vous allez être confronté à une erreur :

"org.eclipse.swt.SWTException: Invalid thread access".

En effet, lorsque l’interface est en cours de création, le thread courant est l’IUThread d’Eclipse. Donc tout autre bout de code (thread) tentant d’accéder à un élément graphique en parallèle est rejeté.

Pour contrer ce problème, il faut accéder à l’UIThread et bloquer son exécution le temps de réaliser les actions requises. Pour ce faire, voici le code à implémenter :

Display.getDefault().syncExec(new Runnable() {
   public void run() {
     IWorkbench workbench = PlatformUI.getWorkbench();
     IWorkbenchWindow window = workbench.getWorkbenchWindows()[0];
     IWorkbenchPage page = window.getActivePage();
     IViewPart viewPart = null;
     try {
        viewPart = page.showView("org.eclipse.ui.navigator.ProjectExplorer");
     } catch (PartInitException e) {
        System.out.println(e);
     }
     CommonNavigator nav = (CommonNavigator) viewPart;
     CommonViewer viewer = nav.getCommonViewer();
     Tree tree = viewer.getTree();
     tree.addMouseMoveListener(list);
   }
});

Ainsi, on spécifie au thread courant d’exécuter de manière synchrone notre code.


Fichier(s) joint(s) :