Меню Eclipse RCP

1

Я создаю приложение RCP затмения, и у меня есть один вопрос:

В файле plugin.xml я объявил меню с 5 командами. Таким образом, это выглядит так:

Menu A
 subMenu A1
 subMenu A2

я хочу сказать, чтобы затмить, чтобы оценить, должны ли подменю быть видимыми только тогда, когда курсорная мышь нависает над пунктом главного меню, то есть с меню А. Как я могу это сделать?

заранее спасибо

<extension
         point="org.eclipse.ui.menus">
      <menuContribution
            allPopups="false"
            locationURI="popup:com.x.sat.ui.views.ProjectsView?after=com.x.sat.ui.commands.closeproject">
         <menu
               icon="icons/repository_rep.gif"
               id="com.x.sat.ui.sgc"
               label="Gestion de Configuration">
            <command
                  commandId="com.x.sat.sgc.ui.addProject"
                  label="Partager le projet"
                  style="push">
               <visibleWhen
                     checkEnabled="false">
                  <reference
                        definitionId="satProjetOrSatModelProjectSelected">
                  </reference>
               </visibleWhen>
            </command>
            <command
                  commandId="com.x.sat.sgc.ui.synchronize"
                  label="Synchroniser avec le dépôt ..."
                  style="push">
               <visibleWhen
                     checkEnabled="false">
                  <reference
                        definitionId="synchronizeObject">
                  </reference>
               </visibleWhen>
            </command>
            <command
                  commandId="com.x.sat.sgc.ui.browseRepository"
                  label="Parcourir le dépôt...."
                  style="push">
            </command>
            <command
                  commandId="com.x.sat.sgc.ui.compare"
                  label="Comparer..."
                  style="push">
            </command>
            <command
                  commandId="com.x.sat.sgc.ui.disconnect"
                  label="Déconnecter le projet ..."
                  style="push">
            </command>
         </menu>
      </menuContribution>
   </extension>
Теги:
eclipse-rcp

2 ответа

0

Я сделал что-то подобное в прошлом, но не уверен, что трюк соответствует состоянию Eclipse; Я использовал dynamic элемент в своем объявлении меню и sourceProvider из точки расширения org.eclipse.ui.services.

Я предполагаю, что он также должен быть применим к вашему всплывающему меню.

Класс, связанный с динамическим элементом, расширяет CompoundContributionItem и переопределяет метод getContributionItems() для обновления состояния переменной sourceProvider... вот трюк, который не очень чист мне, но он работает...

@Override
protected IContributionItem[] getContributionItems() {
    SourceProvider.getInstance().updateState();
    return new IContributionItem[0];
}

Пример SourceProvider:

public class SourceProvider extends AbstractSourceProvider {

    private static String ID = "fr.jln.stackoverflow.services.SourceProvider";
    private static String VAR = "fr.jln.stackoverflow.variable1";

    private static final String VAL_TRUE = "TRUE";
    private static final String VAL_FALSE = "FALSE";

    public static SourceProvider getInstance() {
        ISourceProviderService ser = (ISourceProviderService) PlatformUI.getWorkbench().getService(ISourceProviderService.class);
        return (SourceProvider) ser.getSourceProvider(ID);
    }

    boolean state = false;

    public SourceProvider() {}

    @Override
    public Map<?, ?> getCurrentState() {
        String value = null;
        Map<String, String> map = new HashMap<String, String>(1);

        // fake variable (my id)
        map.put(ID, VAL_TRUE);

        // var state
        value = state ? VAL_TRUE : VAL_FALSE;
        map.put(VAR, value);

        return map;
    }

    @Override
    public String[] getProvidedSourceNames() {
        return new String[] { ID, VAR };
    }

    public void updateState() {
        Calendar cal = Calendar.getInstance();
        int min = cal.get(Calendar.MINUTE);
        state = (min % 2 == 0);
        fireSourceChanged(ISources.WORKBENCH, VAR, state?VAL_TRUE:VAL_FALSE);
    }

    @Override
    public void dispose() {}
}

plugin.xml:

   <extension
         point="org.eclipse.ui.menus">
      <menuContribution
            allPopups="false"
            locationURI="menu:org.eclipse.ui.main.menu?after=additions">
         <menu
               label="StackOverflow">
            <command
                  commandId="fr.jln.stackoverflow.command1"
                  label="Command 1"
                  style="push">
               <visibleWhen
                     checkEnabled="false">
                  <with
                        variable="fr.jln.stackoverflow.variable1">
                     <equals
                           value="TRUE">
                     </equals>
                  </with>
               </visibleWhen>
            </command>
            <command
                  commandId="fr.jln.stackoverflow.command2"
                  label="Command 2"
                  style="push">
               <visibleWhen
                     checkEnabled="false">
                  <with
                        variable="fr.jln.stackoverflow.variable1">
                     <equals
                           value="FALSE">
                     </equals>
                  </with>
               </visibleWhen>
            </command>
            <dynamic
                  class="ContributionItem"
                  id="fr.jln.stackoverflow.dynamic1">
            </dynamic>
         </menu>
      </menuContribution>
   </extension>
   <extension
         point="org.eclipse.ui.services">
      <sourceProvider
            provider="SourceProvider">
         <variable
               name="fr.jln.stackoverflow.variable1"
               priorityLevel="workbench">
         </variable>
      </sourceProvider>
   </extension>

С этим образцом в результате у вас должно быть меню, содержащее 2 элемента, на которых 1 маскируется в зависимости от времени...

Примечание: некоторые идентификаторы могут казаться довольно странными, но источники извлекаются из моего плагина компании

Надеюсь, это поможет...

0

Я сомневаюсь, что вы можете запустить это с помощью plugin.xml и visiblewhen. Поскольку вы знаете MenuItem, который хотите прослушать, вместо этого вы можете добавить ArmListener. Он будет прослушивать MenuItem, и вы можете реализовать visibleWhen команды внутри или вызвать другой метод, который запускает ваши элементы.

    ArmListener armListener = new ArmListener() {
    @Override
    public void widgetArmed(ArmEvent e) {
        System.out.println(e);
    }
    };

и назовите его:

Menu systemMenu = display.getSystemMenu();
    if (systemMenu != null) {
        MenuItem sysItem = getItem(systemMenu, SWT.ID_QUIT);
        sysItem.addArmListener(armListener);
    }

Полный пример, если использование может быть найдено в этом SWT-фрагменте

edit: для всплывающего меню вы можете сделать

final Menu tableMenu = new Menu(shell, SWT.POP_UP);
MenuItem item = new MenuItem(tableMenu, SWT.PUSH);
item.setText("Hover Me");
item.addArmListener(armListener);
  • 0
    Меню, которое я хочу прослушать, является контекстным (всплывающим) меню в представлении, оно появляется только тогда, когда пользователь делает правый клик, поэтому я не могу получить его так, как вы предлагаете
  • 0
    Почему нет? Отредактированный ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню