Question

Ceci est une question générale, mais mes tourne de problèmes actuels autour de la gestion des menus.

Dans un plug-in normale avec des actions de menu de configuration vous le feriez contribue ActionSets etc dans la configuration plugin.xml. Ceci est évidemment sensible.

Je travaille sur une application RCP (RAP en fait) et je me demande si ça vaut la peine de tout configurer via plugin.xml. Mon plug-in ne pas interagir avec un autre plug-ins inconnus alors, théoriquement, j'ai le contrôle. Je peux ajouter des menus et des actions par programmation.

J'ai essayé de configurer un menu qui contient un sous-menu. J'ai essayé de définir ActionSets et relier l'un dans l'autre, mais sans succès. Certains éléments doivent être désactivés en fonction du rôle de l'utilisateur.

Je me dis que je pourrais avoir codé le tout en quelques minutes, mais je ne sais pas si cela correspond à l'éclipse « ethos ».

Quelles sont les opinions sont là-bas? L'application se assez grand donc je voudrais obtenir le droit d'approche dès le début. Peut-être que quelqu'un peut me montrer un exemple pour configurer un menu imbriqué: -)

Était-ce utile?

La solution

Mon avis est que la mise en œuvre de plugin.xml est le chemin à parcourir.

Mes deux principales raisons d'utiliser cette méthode:

  • Il est vraiment facile de reconfigurer et réorganiser les menus et les boutons sans écriture de code java.
  • visualisation hiérarchique très claire des arbres de menu.

Voici un extrait de code qui implémente les menus et sous-menus. Dans cet exemple, ils sont ajoutés au menu principal.

Vous pouvez coller dans votre plugin.xml:

<extension
         name="Main Menu Contributions"
         point="org.eclipse.ui.menus">
 <menuContribution
        allPopups="false"
        locationURI="menu:org.eclipse.ui.main.menu">
     <menu
           id="fileMenu"
           label="File">
        <command
              commandId="org.eclipse.ui.file.exit"
              label="Exit"
              style="push">
        </command>
     </menu>
     <menu
           label="Edit">
        <command
              commandId="org.eclipse.ui.edit.selectAll"
              label="Select All"
              style="push">
        </command>
        <menu
              label="Submenu">
           <command
                 commandId="org.eclipse.ui.edit.selectAll"
                 label="Select All Submenu"
                 style="push">
           </command>
           <command
                 commandId="org.eclipse.ui.edit.delete"
                 label="Delete submenu"
                 style="push">
           </command>
        </menu>
     </menu>
  </menuContribution>
</extension>

Pour activer / désactiver un menu, vous devez utiliser des expressions de base pour activer / désactiver les gestionnaires de commandes. Si une commande n'a pas de gestionnaires actifs attachés, il sera désactivé. Ainsi, l'élément de menu qui appelle cette commande sera également désactivé.

Les extraits de code ci-dessous montrent comment créer un bouton dans la barre d'outils d'une vue et l'ont être activé / désactivé en fonction de la valeur d'une variable. Bare à l'esprit que vous devrez changer certaines choses dans ce code pour le faire fonctionner. La plupart des modifications sont des noms de référence et la mise en œuvre de la classe.

Créer le bouton dans la barre d'outils (plugin.xml):

   <extension
         name="View Toolbar Contributions"
         point="org.eclipse.ui.menus">
      <menuContribution
            allPopups="false"
            locationURI="toolbar:myapp.views.MyView">
       <command
             commandId="myapp.commands.PauseSound"
             icon=""
             label="Pause Playback Sound"
             style="push"
             tooltip="Pause">
       </command>
     </menuContribution>
</extension>

Créer la commande (plugin.xml):

<extension
         id="myapp.commands.PauseSound"
         name="Pause sound command"
         point="org.eclipse.ui.commands">
      <command
            id="myapp.commands.PauseSound"
            name="Pause Sound">
      </command>
</extension> 

Créer le gestionnaire de commande (plugin.xml):

<extension
         point="org.eclipse.ui.handlers">
      <handler
            commandId="myapp.commands.PauseSound">
         <activeWhen>
            <with
                  variable="myapp.commands.sourceprovider.active">
               <or>
                  <equals
                        value="PLAYING">
                  </equals>
                  <equals
                        value="PAUSED">
                  </equals>
               </or>
            </with>
         </activeWhen>
         <class
               class="myapp.rcp.commands.toolbar.PausePlayback">
         </class>
      </handler>
</extension> 

Créer la variable d'état pour la commande (plugin.xml):

   <extension
         point="org.eclipse.ui.services">
      <sourceProvider
            provider="myapp.commands.sourceprovider.CommandState">
         <variable
               name="myapp.commands.sourceprovider.active"
               priorityLevel="workbench">
         </variable>
      </sourceProvider>
   </extension>

Mettre en œuvre la classe qui change l'état de la variable:

public class CommandState extends AbstractSourceProvider {
    public final static String STATE = "myapp.commands.sourceprovider.active";
    public final static String STOPPED = "STOPPED";
    public final static String PLAYING = "PLAYING";
    public final static String PAUSED = "PAUSED";
    public final static String NOT_LOADED = "NOT_LOADED";

enum State {
        NOT_LOADED, PLAYING, PAUSED, STOPPED
    };
    private State curState = State.NOT_LOADED;

    @Override
    public void dispose() {
    }

    @Override
    public String[] getProvidedSourceNames() {
        return new String[] { STATE };
    }

    // You cannot return NULL
    @SuppressWarnings("unchecked")
    @Override
    public Map getCurrentState() {
        Map map = new HashMap(1);
        if (curState == State.PLAYING)
            map.put(STATE, PLAYING);
        else if (curState == State.STOPPED)
            map.put(STATE, STOPPED);
        else if (curState == State.PAUSED)
            map.put(STATE, PAUSED);

        return map;
    }

    public void setPlaying() {
        fireSourceChanged(ISources.WORKBENCH, STATE, PLAYING);
    }

    public void setPaused() {
        fireSourceChanged(ISources.WORKBENCH, STATE, PAUSED);
    }

    public void setStopped() {
        fireSourceChanged(ISources.WORKBENCH, STATE, STOPPED);
    }

    public void setNotLoaded() {
        fireSourceChanged(ISources.WORKBENCH, STATE, NOT_LOADED);
    }

}

Plus de détails sur la façon de mettre en œuvre ces fonctionnalités peuvent être trouvées à ces endroits:

Autres conseils

Pour Eclipse, il y a deux façons de contribuer à la Workbench:. Actions et commandes

Je recommande vraiment les commandes les plus récentes et plus avancées que les actions. Les inconvénients des actions prévues ici (1):

  • L'interface utilisateur et la manipulation sont toujours à égalité. Il n'y a aucun moyen que vous pouvez séparer les uns des autres
  • Si les actions peuvent être contribué à différentes parties de la table de travail (pop-up Menu / barre d'outils), tous étaient différents points d'extension et ainsi vous finissez par dupliquer le XML à plusieurs endroits. Le pire est que vous attendez pas à tous les points d'extension de la même configuration.
  • Actions dans plusieurs Spécifier endroits est un cauchemar d'entretien. Si vous devez changer l'icône d'une action, vous devez changer dans tous les lieux.
  • Un autre problème avec la duplication Actions en plugin.xml est que plusieurs instances des mêmes actions sera créé dans la mémoire

    (1) Actions vs Commandes

Si vous écrivez l'application RCP, la bonne pratique consiste à créer les détenteurs place dans votre ActionBarAdvisor. Bien que cela définirait la structure de base de vos menus et barres d'outils, vous pouvez étendre menuContributions et à l'aide des commandes pour apporter les éléments de menu réel / outil.

Pour ajouter des actions dans RCP, vous pouvez également utiliser ApplicationActinBarAcvisor.It est plus facile que la solution ci-dessus mentionnée Dans ce u ont tout d'abord déclarer l'action comme un objet de IWorkbenchAction, puis en mode « makeActions vides protégées (fenêtre de IWorkbenchWindow) » u peut enregistrer. Et la dernière étape consiste à ajouter dans le menu. code suivant vous aidera u out.

1.Premièrement déclarer l'action: -

private IWorkbenchAction newAction

Action 2.Enregistrement: -

protected void makeActions(IWorkbenchWindow window) {
newAction = ActionFactory.NEW_WIZARD_DROP_DOWN.create(window);
    register(newAction);
    newAction.setText("New");

étape 3.Last est d'ajouter l'action dans le menu: -

MenuManager filemenu = new MenuManager("&File", "file");
    filemenu.add(newAction);

Vous pouvez également ajouter l'action dans la barre d'outils comme suit: -

protected void fillCoolBar(ICoolBarManager coolBar) {
    IToolBarManager toolbar = new ToolBarManager(coolBar.getStyle());
    coolBar.add(toolbar);
    toolbar.add(newAction);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top