IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Eclipse Platform Discussion :

[RCP] Enable/disable de commande


Sujet :

Eclipse Platform

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut [RCP] Enable/disable de commande
    Bonjour bonjour...

    Je continue ma petite application d'apprentissage d'Eclipse RCP, et voilà que je bute sur un autre problème tout bête :

    Je voudrai faire en sorte que mes commandes ( qui sont utilisés dans la toolbar et le menu contextuel ma vue) soient grisées ou disponibles en fonction du type de l'objet sélectionné dans cette même vue.

    Pour info, mes menus + popup sont créés dans l'onglet extension (sous org.eclipse.ui.menus) en utilisant :
    -popup:maVueID
    -toolbar:maVueID

    Après avoir cherché longuement sur le net, j'ai quand même trouvé quelques façons de faire, mais que je n'ai pas réussi à mettre en place :

    - En rajoutant le point d'extension org.eclipse.ui.handlers, en mettant dessous des handler, des enableWhen... J'ai réussi à faire fonctionner l'exemple que j'avais trouvé (activer ma commande uniquement si il y a une sélection de faite), mais je n'ai pas réussi à faire beaucoup mieux, et dans tous les cas je ne pense pas pouvoir faire des trucs assez détaillés pour correspondre à tous mes besoins (par exemple activer uniquement si la racine de l'arbre de la vue en cours est sélectionnée...)

    - Je suis tombé sur une autre façon de faire, qui correspondrait peut être plus à mes besoins (Vu qu'on peut faire par programmation, ça doit permettre de faire des trucs un peu plus évolués), en utilisant IHandlerService, mais là par contre j'ai pas tout compris et certaines classes de l'exemple n'existent pas chez moi (par exemple "Expression")...

    Si quelqu'un pouvait m'aiguiller sur la bonne marche à suivre parce que là je cale et il y a tellement de façon de tout faire avec RCP qu'on est jamais trop sûr de partir dans la bonne direction !

    Merci d'avance et à plus !

  2. #2
    Membre émérite Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Par défaut
    Bonjour,
    ta commande doit implémenter AbstractHandler non ? Si c'est bien le cas tu n'as qu'à redéfinir la méthode isEnabled(boolean) au sein de ta classe

    jojodu31

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Merci pour ta réponse,

    J'avais essayé de surdéfinir cette méthode, mais il m'a semblé (je peux pas vérifier maintenant mais j'avais mis des System.out.println()) qu'elle était appelée qu'une fois (création de la commande peut être, ou première utilisation je sais plus), mais pas chaque fois que j'utilise ma commande ou que je modifie ma sélection dans mon arbre (pour ma barre de menu, c'est à ce moment là qu'il faudrait que mon bouton se grise), ou bien c'est que j'ai oublié quelque chose quelque part ! il existe peut être des listener à mettre en place ou quelque chose comme ça?

    à + !

  4. #4
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Salut,

    Une méthode pour faire ce que tu veux (merci à Prakash G.R.):
    - Créer un sourceProvider dans le plugin.xml de ton application:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <extension point="org.eclipse.ui.services">
        <sourceProvider provider="com.foo.myapp.MySourceProvider">
            <variable 
                 name="com.foo.myapp.myVariable"
                 priorityLevel="workbench">
            </variable>
        </sourceProvider>
    </extension>
    Où:
    • "com.foo.myapp.MySourceProvider" est la classe qui va étendre ISourceProvider
    • "com.foo.myapp.myVariable" est le nom de la variable

    - Ensuite, il faut créer la classe MySourceProvider dans le package "com.foo.myapp". Cette classe hérite de AbstractSourceProvider (pour plus de lisibilité).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    public class MySourceProvider extends AbstractSourceProvider {
        /**
         * The name of the variable to check.
         */
        public final static String VARIABLE = "com.foo.myapp.myVariable";
     
        /**
         * The enabled state value.
         */
        private final static String ENABLED = "enabled";
     
        /**
         * The disabled state value.
         */
        private final static String DISABLED = "disabled";
     
        /**
         * The current state of the variable.
         */
        private boolean enabled;
     
        @Override
        public String[] getProvidedSourceNames() {
            return new String[] {VARIABLE};
        }
     
        @Override
        public Map getCurrentState() {
            Map currentState = new HashMap(1);
            String variabletState =  enabled ? ENABLED : DISABLED;
            currentState.put(VARIABLE, variableState);
            return currentState;
        }
     
        public void setVariableState(boolean flag) {
             if(this.enabled == flag)
                 return; // no change 
            this.enabled = flag;
            String currentState =  enabled ? ENABLED : DISABLED;
            fireSourceChanged(ISources.WORKBENCH, VARIABLE,
                    currentState);
        }
     }
    - Dans ton plugin.xml, à la définition du handler de ta commande, tu rajoutes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <extension
           point="org.eclipse.ui.handlers">
        <handler
              class="com.foo.MyHandler"
              commandId="com.foo.myCommand">
           <activeWhen>
              <with
                    variable="com.foo.myapp.myVariable">
                 <equals
                       value="enabled">
                 </equals>
              </with>
           </activeWhen>
        </handler>
     </extension>
    - Ensuite, quand tu dois mettre à jour la valeur de la variable (enabled ou non), tu appelles la méthode setVariableState(). Ex. dans un listener:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    boolean newVariableState = true;
    // Get the ISourceProviderService.
    ISourceProviderService sourceProviderService =
        (ISourceProviderService) PlatformUI.getWorkbench().getService(
            ISourceProviderService.class);
    if (sourceProviderService != null) {
        // Get the Provider of the interest variable.
        ISourceProvider provider =
            sourceProviderService
                .getSourceProvider(MySourceProvider.VARIABLE);
        if (provider instanceof MySourceProvider) {
            // Set the new variable state.
            ((MySourceProvider) provider).setVariableState(newVariableState);
        }
    }
    C'est un peu fastidieux, mais c'est à ma courte connaissance l'un des moyens d'y parvenir.

    Voilà, à+
    Gueritarish

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Merci !
    Effectivement ça fait beaucoup de code tout ça mais bon, si ça marche !
    Je teste ça demain et je vous tiens au courant !


  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Bon je viens de mettre ça en place, ça marche bien !
    Si quelqu'un a une autre méthode (plus simple à mettre en place) je suis toujours preneur, mais en attendant je suis débloqué !

    merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. générer un executable RCP en ligne de commande
    Par Aldouille dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 02/01/2007, 12h51
  2. Enabled / disabled sur un button
    Par Sephiroth Lune dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/11/2006, 15h44
  3. [RCP] generation du rcp en ligne de commande avec ant
    Par albeau dans le forum Eclipse Platform
    Réponses: 5
    Dernier message: 01/09/2006, 17h34
  4. [MFC] SDI Enable/disable élement d'un menu
    Par Nergaahl dans le forum MFC
    Réponses: 4
    Dernier message: 12/06/2006, 10h49
  5. enable/disable listbox avec radiobouton
    Par -DeN- dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/02/2006, 17h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo