В Eclipse RCP как отключить кнопку панели инструментов сохранения в соответствии со свойством «dirty» в редакторе - PullRequest
4 голосов
/ 16 марта 2009

В моем приложении eclipse RCP 3.3 я хотел бы включить или отключить кнопку панели «Сохранить» в соответствии с текущим редактором.

Я пытаюсь использовать тег <<a href="http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/core/expressions/package-summary.html" rel="nofollow noreferrer"> enabledWhen >, но не могу заставить его работать.

Вот часть кода в plugin.xml:

<command
 commandId="org.acme.command.save"
 icon="icons/save.png"
 id="org.acme.command.save"
 style="push">
 <enabledWhen>
    <instanceof value="activeEditor"/>
     <test property="dirty" value="true"/>
 </enabledWhen>
</command>

У вас есть идеи, как это должно работать?

Ответы [ 5 ]

5 голосов
/ 31 марта 2009

Поддержка действий «Сохранить» и «Сохранить все» обеспечивается рабочей средой, поэтому вам не нужно реализовывать ее самостоятельно, как вы пытаетесь это сделать.

Рекомендуется добавить поддержку в вашем классе, которая расширяет ActionBarAdvisor. Точный код будет зависеть от структуры класса, но вам понадобятся следующие биты кода:

в ваших полевых декларациях:

private IWorkbenchAction saveAction;
private IWorkbenchAction saveAllAction;

в вашем методе makeActions:

    saveAction = ActionFactory.SAVE.create(window);
    register(saveAction);

    saveAllAction = ActionFactory.SAVE_ALL.create(window);
    register(saveAllAction);

в вашем методе fillActionBars:

    IToolBarManager saveToolbar = new ToolBarManager(SWT.FLAT | SWT.RIGHT);
    saveToolbar.add(saveAction);
    saveToolbar.add(saveAllAction);
    coolBar.add(new ToolBarContributionItem(saveToolbar, "save"));   

Верстак позаботится о включении и отключении для вас.

Если вы хотите реализовать свой собственный код, чтобы сделать это по любой причине, тогда подход, который вы используете, будет работать. Вам нужно будет исправить XML (например, элемент instanceof проверяет, что выбранный объект является экземпляром класса с именем 'activeEditor', что, вероятно, не то, что предполагалось).

4 голосов
/ 12 мая 2009

Блестящий мой коллега только что нашел ответ для затмения> = 3.3:

Вот как определить команду в файле plugin.xml:

  <command
        commandId="com.acme.bo.command.done"
        id="com.acme.bo.menu.done"
        label="Command to do">
     <visibleWhen>
        <with variable="activeMenuSelection">
           <iterate>
              <adapt type="com.acme.bo.model.Pojo"></adapt>
              <test
                    args="valueThatYouWantToPassTest"
                    property="com.acme.namespace.testedProperty"
                    value="something">
              </test>
           </iterate>
        </with>
     </visibleWhen>
  </command>

Затем вы должны определить propertyTester, снова в plugin.xml:

 <extension
       point="org.eclipse.core.expressions.propertyTesters">
    <propertyTester
          class="com.acme.namespace.tester.YourPropertyTester"
          id="com.acme.namespace.tester.testedPropertyTester"
          namespace="com.acme.namespace"
          properties="testedProperty"
          type="com.acme.bo.model.Pojo">
    </propertyTester>
 </extension>

А вот класс YourPropertyTester , который выполняет тест:

package com.acme.namespace.tester;

import org.eclipse.core.expressions.PropertyTester;

import com.acme.bo.model.Pojo;

public class YourPropertyTester extends PropertyTester {

   @Override
   public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
      if (receiver == null || !(receiver instanceof Pojo))
         return false;

      Pojo pojo = (Pojo) receiver;
      if (args != null) {
         for (Object object : args) {
            if (pojo.getYourProperty().contains((String)object))
               return true;
         }
      }
      return false;
   }
}
0 голосов
/ 30 мая 2010

Если у вас возникли проблемы с активацией тестера свойств, имейте в виду, что ваша реализация тестера свойств должна находиться в том же подключаемом модуле, в который она вносит свой вклад в org.eclipse.core.expressions.propertyTesters точка расширения.

0 голосов
/ 23 марта 2009

попробуйте это:

org.eclipse.core.variables.dynamicVariables
-(variable) [here you should implement resolver class to return active editor]

org.eclipse.core.expressions.definitions
-(definition)
--(with) [reference here your variable]
---(test) [test if dirty]

org.eclipse.ui.commands !mistake: not commands, but handlers
-(handler)
--(enabledWhen)
---(reference) [reference your definition here]

**(updated)**
org.eclipse.core.properties.propertyTesters
-(propertyTester)

Я не уверен, что это сработает, но есть шанс ...

0 голосов
/ 16 марта 2009

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

saveAction = ActionFactory.SAVE.create(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
configurer.registerGlobalAction(saveAction);

Можете ли вы проверить, может ли следующая строка помочь вам ?
В случае действия сохранения это может быть действие Retargetable .

...