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 :

Conflits de raccourci


Sujet :

Eclipse Platform

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut Conflits de raccourci
    Bonjour,

    Dans le plugin Eclipse que je suis en train de développer, j'utilise une commande de suppression dans une liste.
    J'ai donc une Commande pourra faire la suppression, j'ai ajouté un bouton à ma vue pour lancer la commande, et enfin j'utilise l'extension org.eclipse.ui.binding pour ajouter un raccourci...

    Le problème, c'est que quand j'appuie sur la touche SUPPR, un rectangle jaune apparaît pour me demander si je veux utiliser la commande supprimer d'éclipse ou la mienne...

    Quelle est la bonne façon de faire?
    - étendre la commande d'éclipse plutôt que d'en créer une nouvelle?
    - dire que dans cette vue, seule ma commande est utilisée?
    ...

    Merci pour votre aide !

  2. #2
    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 : 39
    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
    Points : 3 919
    Points
    3 919
    Par défaut
    Salut,

    Les 2 en fait
    Tu ajoutes un point d'extension org.eclipse.ui.handlers dans lequel tu vas ajouter une extension handler. Dans cette extension, tu vas indiquer comme commandId "org.eclipse.ui.edit.delete" et comme class le handler de ta commande. Tu vas ensuite ajouter une extension activeWhen à ton handler. Dans cette partie, tu vas indiquer que ce handler est valable seulement dans ta vue.
    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="handlers.MyHandler"
                commandId="org.eclipse.ui.edit.copy">
             <activeWhen>
                <with
                   variable="activePartId">
                   <equals
                      value="view.MyView">
                   </equals>
                </with>
             </activeWhen>
          </handler>
    </extension>
    Du coup, tu peux enlever la définition de ta commande ainsi que ton binding (qui sont maintenant inutile ).

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    Super merci pour cette réponse rapide !

    Je teste ça dès que je peux !

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    Alors j'ai testé c'est presque parfait !
    Mais il reste un détail...

    J'ai un éditeur dans lequel une arborescence d'objet est représenté (dans un Tree), et une vue qui permet de montrer tous les fichiers attachés à l'objet sélectionné.
    J'ai supprimé les deux commandes permettant de supprimer l'objet et celle pour supprimer un fichier attaché, et j'ai ajouté 2 handlers sur "org.eclipse.ui.edit.delete". effectivement, je n'ai plus le problème quand je fais SUPPR, ça supprime de suite !

    Par contre j'utilise sous les handler, des enableWhen, du coup maintenant, pour le handler me permettant de supprimer mes fichiers attachés, j'ai :

    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
     
    <handler
                class="generateurfue.gui.commands.CommandSupprimerFichierAttache"
                commandId="org.eclipse.ui.edit.delete">
             <enabledWhen>
                <with
                      variable="generateurfue.commandSupprimerFichierAttacheEnabled">
                   <equals
                         value="enabled">
                   </equals>
                </with>
             </enabledWhen>
             <activeWhen>
                <with
                      variable="activePartId">
                   <equals
                         value="generateurfue.fichiersattachesview">
                   </equals>
                </with>
             </activeWhen>
          </handler>
    et ma variable est définie comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <sourceProvider
                provider="generateurfue.gui.sourceprovider.SourceProviderCommandSupprimerFichierAttache">
             <variable
                   name="generateurfue.commandSupprimerFichierAttacheEnabled"
                   priorityLevel="workbench">
             </variable>
          </sourceProvider>
    J'ai ensuite mon sourceProvider qui fait changer l'état de la variable, ça ça marchait bien...
    Par contre le problème, c'est que vu que j'utilise un seule commande maintenant, si je sélectionne un objet dans l'arborescence, ça me dégrise le bouton de ma vue qui permet de supprimer un fichier attaché, même si aucun fichier attaché n'est sélectionné...

    Y a t'il un moyen de faire en sorte que la commande soit dans plusieurs états différents selon la vue où on se trouve, ou un truc du genre ??

    ( j'ai pensé à rajouter en plus un enableWhen sur la vue active, mais je voudrai pouvoir avoir mon icone de la vue dégrisé si un fichier attaché est sélectionné même si c'est l'éditeur qui est sélectionné)

    Merci d'avance !

  5. #5
    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 : 39
    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
    Points : 3 919
    Points
    3 919
    Par défaut
    Alors, j'ai pas tout suivi, tu as 2 handlers de suppression c'est ça?
    Un dans une vue et un autre dans un éditeur?
    Tu as donc défini 2 handlers dans ton plugin.xml pour la commande org.eclipse.ui.edit.delete. Sache que si Eclipse a des conflits d'activation de handlers au niveau d'une commande, il n'active aucun handler.
    Donc, soit tu n'as qu'un seul handler d'actif, soit tu n'en as aucun.
    En gardant, cette remarque en tête, il faut t'assurer qu'un seul handler pour cette commande est actif à la fois. Donc, il faut que tu ais bien un activeWhen de défini et de différent pour chacun de tes handlers sur cette commande.

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

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

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

    Euh j'ai peut être pas été très clair effectivement !
    Je n'ai pas de problèmes pour les handler, il n'y en a qu'un actif à la fois (à priori du moins ) mon problème est plus un problème graphique !

    La commande de suppression est utilisée dans l'éditeur et dans plusieurs vues, dans chaque vue il y a une icône dans la barre d'outils de la vue et l'action dans le menu contextuel (dans l'éditor, il y a juste l'action dans le menu contextuel).

    J'ai rajouté une variable par type de suppression qui passe à true ou à false pour activer/désactiver l'handler correspondant.

    Le problème, c'est que maintenant tous mes handler "pointent" sur la même commande (org.eclipse.ui.edit.delete). Du coup si dans mon éditeur je sélectionne un objet, le handler de suppression d'objet s'active, donc la commande s'active aussi (Rien d'anormal jusque là !)
    Et je me retrouve, dans toutes les vues où j'ai ma commande delete dans la barre d'outil, à avoir le bouton correspondant à la suppression qui se dégrise (même si la vue est complètement vide avec rien à supprimer)

    J'ai vu qu'il y avait un visibleWhen disponible dans ma commande qui est sous mon menuContribution, où je pourrai rajouter un test sur ma variable aussi pour gérer ça menu par menu, mais ça me semble un peu lourd, et j'aurai préféré un enableWhen !

  7. #7
    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 : 39
    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
    Points : 3 919
    Points
    3 919
    Par défaut
    Est-ce que tu as une variable par vue?
    Est-ce que tu mets à jour la valeur de cette variable lorsque ta vue prend le focus?
    Pas de questions technique par MP, les forums sont là pour ça.

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    Euh oui j'ai une variable par action (par exemple une pour la suppression de lien et une pour la suppression d'objet), et vu que j'ai une action par vue, ça correspond à peu près à ça !

    Pour être plus précis, je vais te donner les bouts de codes que j'utilise :

    Mes handlers :

    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
     
    <handler
                class="generateurfue.gui.commands.CommandSupprimerLien"
                commandId="org.eclipse.ui.edit.delete">
             <enabledWhen>
                <with
                      variable="generateurfue.commandSupprimerLienEnabled">
                   <equals
                         value="enabled">
                   </equals>
                </with>
             </enabledWhen>
             <activeWhen>
                <with
                      variable="activePartId">
                   <equals
                         value="generateurfue.objectLiensView">
                   </equals>
                </with>
             </activeWhen>
          </handler>
          <handler
                class="generateurfue.gui.commands.CommandSupprimerObjet"
                commandId="org.eclipse.ui.edit.delete">
             <enabledWhen>
                <with
                      variable="generateurfue.commandSupprimerObjetEnabled">
                   <equals
                         value="enabled">
                   </equals>
                </with>
             </enabledWhen>
             <activeWhen>
                <with
                      variable="activePartId">
                   <equals
                         value="generateurfue.fueeditor">
                   </equals>
                </with>
             </activeWhen>
          </handler>
    La définition des mes variables :

    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
     
    <extension
             point="org.eclipse.ui.services">
          <sourceProvider
                provider="generateurfue.gui.sourceprovider.SourceProviderCommandSupprimerLien">
             <variable
                   name="generateurfue.commandSupprimerLienEnabled"
                   priorityLevel="workbench">
             </variable>
          </sourceProvider>
          <sourceProvider
                provider="generateurfue.gui.sourceprovider.SourceProviderCommandSupprimerObjet">
             <variable
                   name="generateurfue.commandSupprimerObjetEnabled"
                   priorityLevel="workbench">
             </variable>
          </sourceProvider>
    Mes sourcesProvider :

    Pour la suppression de liens :

    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
     
    package generateurfue.gui.sourceprovider;
     
     
    public class SourceProviderCommandSupprimerLien extends SourceProviderCommand {
     
    	/**
             * The name of the variable to check.
             */
    	public static final String VARIABLE = "generateurfue.commandSupprimerLienEnabled";
     
    	/**
             * Constructor
             */
    	public SourceProviderCommandSupprimerLien() {
    		super();
    	}
     
    	@Override
    	public String getVariable() {
    		return VARIABLE;
    	}
     
    }
    Pour la suppression d'objets

    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
     
    package generateurfue.gui.sourceprovider;
     
     
    public class SourceProviderCommandSupprimerObjet extends SourceProviderCommand {
     
    	/**
             * The name of the variable to check.
             */
    	public static final String VARIABLE = "generateurfue.commandSupprimerObjetEnabled";
     
     
    	@Override
    	public String getVariable() {
    		return VARIABLE;
    	}
     
    }
    Et ma classe mère :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    public abstract class SourceProviderCommand extends AbstractSourceProvider {
     
    	/**
             * The enabled state value.
             */
    	private static final String ENABLED = "enabled";
     
    	/**
             * The disabled state value.
             */
    	private static final String DISABLED = "disabled";
     
    	/**
             * The current state of the variable.
             */
    	private boolean enabled;
     
    	@Override
    	public void dispose() {
    		// Rien à faire
     
    	}
     
    	@Override
    	public Map<?, ?> getCurrentState() {
    		HashMap<String, String> currentState = new HashMap<String, String>(1);
    		String variableState = this.enabled ? ENABLED : DISABLED;
    		currentState.put(this.getVariable(), variableState);
    		return currentState;
    	}
     
    	@Override
    	public String[] getProvidedSourceNames() {
    		return new String[] { this.getVariable() };
    	}
     
    	/**
             * Get la variable correspondant à l'ID
             * @return l'ID
             */
    	public abstract String getVariable();
     
    	/**
             * Permet de modifier l'état de la variable
             * @param flag le nouvel etat
             */
    	public void setVariableState(boolean flag) {
    		if (this.enabled == flag) {
    			return; // no change
    		}
    		this.enabled = flag;
    		String currentState = this.enabled ? ENABLED : DISABLED;
    		this.fireSourceChanged(ISources.WORKBENCH, this.getVariable(), currentState);
    	}
     
    }
    J'ai ensuite une méthode qui est appelée pour la modification de liens dans les cas suivants :
    - Quand la sélection est modifiée dans la table de liens
    - Quand il n'y a plus de sélection dans la table de liens (par exemple si le l'objet portant ce lien est désélectionné dans l'éditeur en cours)

    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
     
    public static void modifierEtatCommandeLien (Lien elementSelectionne){
    		Activator.logInfo("Modification de l'état des comandes des liens");
    		ISourceProviderService sourceProviderService = (ISourceProviderService) PlatformUI.getWorkbench().getService(ISourceProviderService.class);
    		if (sourceProviderService == null) {
    			return;
    		}
     
    		ISourceProvider provider = sourceProviderService.getSourceProvider(SourceProviderCommandSupprimerLien.VARIABLE);
    		if (provider instanceof SourceProviderCommandSupprimerLien) {
    			if (elementSelectionne != null) {
    				((SourceProviderCommand) provider).setVariableState(true);
    			} else {
    				((SourceProviderCommand) provider).setVariableState(false);
    			}
    		}
     
     
     
    	}
    et une autre méthode pour la modification d'objet qui est appelé :
    - Quand l'éditeur prend le focus
    - Quand la sélection d'objet change dans l'éditeur

    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
     
    public static void modifierEtatCommandeObjet (FUeObject elementSelectionne){
    		Activator.logInfo("Modification de l'état des comandes des objets");
     
    		ISourceProviderService sourceProviderService = (ISourceProviderService) PlatformUI.getWorkbench().getService(ISourceProviderService.class);
    		if (sourceProviderService == null) {
    			return;
    		}
     
    		ISourceProvider provider = sourceProviderService.getSourceProvider(SourceProviderCommandSupprimerObjet.VARIABLE);
    		if (provider instanceof SourceProviderCommandSupprimerObjet) {
    			if (elementSelectionne != null) {
    				((SourceProviderCommand) provider).setVariableState(true);
    			} else {
    				((SourceProviderCommand) provider).setVariableState(false);
    			}
    		}
     
    	}
    Le problème est toujours que la commande delete d'eclipse est maintenant liée à ces deux variables, et dès q'une de ces variables est mise à jour, cette commande change d'état, et ce changement d'état est visible dans toute les vues en même temps (même si le type de suppression qui est autorisé ne correspond pas au contenu de ces vues...)

    Je pense qu'il doit y avoir quelques trucs que je n'ai pas saisi, vois-tu ce qui cloche dans ma façon de faire??

    Merci !

  9. #9
    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 : 39
    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
    Points : 3 919
    Points
    3 919
    Par défaut
    Salut,

    Pas vraiment de solutions, mais toutefois, quelques remarques:
    • Tu fais 2 ISourceProvider alors qu'un seul aurait suffit (un même ISourceProvider peut contenir plusieurs variables). Mais bon, tu fais ça d'une bonne façon objet, donc, ça va.
    • Je vois que quand tu mets à jour une variable, tu ne mets pas l'autre à jour (je me trompe peut-être). Mais selon moi, c'est une exclusion mutuelle. Si A est actif, alors B est inactif. Donc il te faudrait faire setVariableState(B, false) suivi d'un setVariableState(A, true). Si c'est pas déjà ce que tu fais autrement
    • J'imagine que tu passes par IPartListener pour mettre tes variables à jour dans tes Editeurs/Vues.
    • Tu fais un "if" inutile . Par exemple:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      if (elementSelectionne != null) {
           ((SourceProviderCommand) provider).setVariableState(true);
      } else {
           ((SourceProviderCommand) provider).setVariableState(false);
      }
      Pourquoi ne pas faire directement:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ((SourceProviderCommand) provider).setVariableState(elementSelectionne != null);
      Ce qui revient exactement à ce que tu fais (juste en plus propre)


    Ce sont juste quelques remarques mais bon, je dois dire que j'ai du mal à cerner ton problème...

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

Discussions similaires

  1. [] Raccourci clavier pour bouton d'une barre d'outil
    Par Sébastien dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 24/03/2003, 17h02
  2. [VB6] [Install] Associer une icone à un raccourci
    Par petitgognol dans le forum Installation, Déploiement et Sécurité
    Réponses: 7
    Dernier message: 30/10/2002, 20h20
  3. Raccourcis menu Windows 200
    Par pp dans le forum Composants VCL
    Réponses: 6
    Dernier message: 12/09/2002, 14h06
  4. Raccourci sur le bureau
    Par senateur dans le forum Langage
    Réponses: 7
    Dernier message: 05/09/2002, 15h17
  5. faire de la touche F1 une touche de raccourci?
    Par sb dans le forum Composants VCL
    Réponses: 3
    Dernier message: 06/08/2002, 10h11

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