Eclipse (PDE) - Gérer les activités

Lors du développement d’applications Éclipse, on peut rapidement être confronté à la gestion des droits d’accès utilisateurs sur certaines fonctionnalités.

Heureusement, cela peut facilement être géré par les Activités : vous trouverez un très bon guide dans la documentation officielle, mais pour résumer, on peut dire qu’une activité est un groupe de fonctionnalités régies par des règles d’utilisation ou d’accès.

Pour créer ces règles, dans le fichier "plugin.xml", il faut utiliser le point d’extension

org.eclipse.ui.activities

C’est ensuite le "pattern" qui définira la règle à appliquer : sous forme d’expression régulière, son format est le suivant :

plug-in-identifier + "/" + local-identifier

Voici un exemple :

Dans le fichier "plugin.xml", on définit l’activité suivante : 

 Puis on lui affecte un pattern :

Ainsi, nous avons défini la règle suivante : le profil "developer" n’aura accès qu’aux fonctionnalités du plugin

com.client

dont le nom contient

ui.commands.developer

Pour faire appliquer cette règle à l’IDE, voici le code à implémenter :

public class ProfileManager {
    private static final String ACTIVITY_DEVELOPER_ID    = "com.client.ui.activities.profile.developer";
    public static void refreshGUIAccordingToProfile(){
        IWorkbenchActivitySupport activitySupport = PlatformUI.getWorkbench()
            .getActivitySupport();
        // List of activities to be activated
        Set enabledActivities = new HashSet();
 
        // Retrieve list of activities currently activated
        Set currentlyEnabledActivities = PlatformUI.getWorkbench()
            .getActivitySupport().getActivityManager().getEnabledActivityIds();
        // Remove activities which are related to user's profile
        // I.e. Keep activities activated by user via Windows > Preferences
        for (String anActivity : currentlyEnabledActivities) {
            if (!isAProfileRelatedActivity(anActivity)) {
                enabledActivities.add(anActivity);
            }
        }
        enabledActivities.add(ACTIVITY_DEVELOPER_ID);
        activitySupport.setEnabledActivityIds(enabledActivities);
   }
}

Ce code est à appeler au lancement du plugin dans l’IDE : il fait appel simplement à l’interface de gestion des activités par défaut et y ajoute celle que nous venons de créer!

Vous disposer maintenant de tout le nécessaire pour paramétrer l’interface de votre application selon différent profils utilisateurs.


Fichier(s) joint(s) :

Eclipse (SWT) : sélectionner une cellule dans une Table

Cela pourrait paraître enfantin et pourtant, on peut plutôt y perdre quelques cheveux!! Attention, je parle pas ici des JTable de swing qui sont facilement utilisables et extensibles, mais bien de l’objet simpliste Table de SWT.

Le principe basique des Tables est d’afficher une liste de données en ligne (les colonnes représentent les attributs). Le constructeur de l’objet permet facilement d’autoriser la sélection d’une ligne entière, mais rien ne permet d’activer à l’aide de la souris la sélection d’une cellule : il faut pour cela un peu d’imagination. Jetons d’abord un œil au code avant de le commenter :

TableViewer tableViewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
            | SWT.V_SCROLL | SWT.FULL_SELECTION);
tableViewer.getTable().addListener(SWT.MouseDown, new Listener() {
            TableItem item = null;
            int       oldi = -1;
            public void handleEvent(Event event) {
                Point pt = new Point(event.x, event.y);
                if (item != null && !item.isDisposed()) {
                    item.setBackground(oldi, Display.getCurrent()
                        .getSystemColor(SWT.COLOR_WHITE));
                    item.setForeground(oldi, Display.getCurrent()
                        .getSystemColor(SWT.COLOR_BLACK));
                }
                item = table.getItem(pt);
                if (item == null)
                    return;
                for (int i = 0; i < table.getColumnCount(); i++) {
                    Rectangle rect = item.getBounds(i);
                    if (rect.contains(pt)) {
                        table.deselectAll();
                        item.setBackground(i, Display.getCurrent()
                            .getSystemColor(SWT.COLOR_LIST_SELECTION));
                        item.setForeground(i, Display.getCurrent()
                            .getSystemColor(SWT.COLOR_WHITE));
                        oldi = i;
                        int index = table.indexOf(item);
                        System.out.println("Sélection de la ligne " + index + " - colonne " + i + " : valeur '"+ item.getText(i) +"'");
                    }
                }
            }
        });
    }

Le principe est donc le suivant :

Lorsque l’utilisateur clic dans le tableau, on récupère la position x et y du clic et on lui demande de nous retourner l’élément situé sous la souris (l’objet item). Pas terrible n’est-ce pas?!

Au niveau du code on a donc bien récupéré notre objet, mais au niveau visuel, c’est toute la ligne du tableau qui est sélectionnée! Pour y remédier, on dé-sélectionne immédiatement tout, puis on affecte à notre cellule une couleur d’arrière-plan correspondant à la couleur d’un élément sélectionné… On garde en mémoire notre cellule pour lui redonner des couleurs normales lorsqu’une autre sera clicquée.

Je vous l’accorde, c’est du bricolage, mais l’objet Table de SWT est vraiment très basique et c’est le seul moyen d’arriver à ce résultat ( à moins que je ne me trompe…)


Fichier(s) joint(s) :



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



[Non résolu] Swftools et zones de texte dynamiques

Un problème un fois de plus assez complexe.

Voici le contexte :

J’ai développé un moteur de recherche en Flash pour du contenu textuel au sein de fichiers SWF. Basé sur des zones de textes dynamiques et de polices embarquées, tout fonctionne très bien, les résultats de la recherche étant surlignés dans les textes (avec TextSnapShot).

Le coeur du problème :

Ce système fonctionne très bien avec des SWF créés à la main. Le soucis est que je désormais le faire fonctionner avec des SWF générés dynamiquement à partir de l’outil pdf2swf des Swftools.

Après décompilation des fichiers générés, on peut facilement constater que cet outil crée des zones de texte statiques pour tout ce qui est textuel.

Il faut donc pouvoir modifier le code source de Swftools pour lui faire générer plutôt des zones de texte dynamiques… Pas très simple sous Windows!!

Solution :

Pour le moment je n’ai pas trouvé de solution à mon problème. J’ai tout juste réussi à remplacer bêtement dans le code source tout les "StaticText" par "DynamicText", recompiler le tout, mais sans grand succès!! Un très bon tutorial pour recompiler Swftools sous Windows est disponible à cette adresse (accessible depuis la FAQ su site officiel)

Très peu de sites/forums/mailinglist abordent le sujet de la customization de swftools.

Alors j’en apelle à la communauté pour savoir si quelqu’un à déjà eu à faire ce genre de modification!! N’hésitez pas à fournir des propositions!


Fichier(s) joint(s) :