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

0 commentaires: