#java #eclipse #eclipse-plugin #eclipse-indigo #eclipse-pde
#java #eclipse #eclipse-плагин #eclipse-indigo #eclipse-pde
Вопрос:
РЕДАКТИРОВАТЬ: РЕШЕНО
Фон
Я внедрил плагин eclipse (на indigo, 3.7.2), который предоставляет новый значок в строке меню.
Это новое действие полностью инициализируется через несколько секунд после запуска eclipse (некоторые файлы конфигурации загружены из моего репозитория maven).
Я пытаюсь отключить это действие, пока мой активатор не завершит инициализацию.
Что я ищу
Перед инициализацией
После инициализации
Что я уже сделал
Я добавил тест включения для своего действия. Мое действие будет включено, только если мой плагин активирован.
<extension
point="org.eclipse.ui.actionSets">
<actionSet
label="Action Set"
visible="true"
id="com.eclipse.plugins.extarcheytpe.actionSet">
<action
class="com.eclipse.plugins.extarchetype.actions.ShortcutsAction"
icon="src/main/resources/icons/generic_box_16x16.png"
id="com.eclipse.plugins.extarcheytpe.actions.ShortcutsAction"
label="Shortcuts List"
style="pulldown"
toolbarPath="Shortcuts"
tooltip="Shortcuts">
<enablement>
<pluginState
id="com.eclipse.plugins.extarchetype"
value="activated">
</pluginState>
</enablement>
</action>
</actionSet>
</extension>
[...]
<extension
point="org.eclipse.ui.startup">
<startup
class="com.eclipse.plugins.extarchetype.Startup">
</startup>
</extension>
Я определил класс запуска, где метод ignite () инициализирует конфигурацию моего плагина :
public class Startup implements org.eclipse.ui.IStartup{
@Override
public void earlyStartup() {
try {
Activator.getDefault().ignite();
Activator.getDefault().setChanged();
Activator.getDefault().notifyObservers();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Я реализовал шаблон проектирования наблюдения между моим действием и моим активатором (для уведомления об окончании инициализации).
public class ShortcutsAction extends Action implements
IWorkbenchWindowPulldownDelegate, IMenuCreator, IObserver {
private IAction action;
private Menu menu;
public boolean enabled = false;
public ShortcutsAction() {
super();
Activator.getDefault().addObserver(this);
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
// Change action object instance at first selection
if (action != this.action) {
this.action = action;
}
// If property enabled is true, enable this action
if (enabled) {
action.setEnabled(true);
} else {
action.setEnabled(false);
}
}
[...]
@Override
public void update(IObservable obs, Object obj) {
this.enabled = true;
ConsoleHandler.logInfo("Shortcut enabled");
action.setEnabled(true);
}
}
Заключение
Я получил то, что искал :
- При загрузке мое действие отключено
- Поскольку мой плагин инициализирован, мое действие включено
Спасибо.
Ответ №1:
<objectState>
и <objectClass>
проверяйте состояние и класс выбранных в данный момент объектов, а не класс обработчика действий.
Я думаю, вам пришлось бы использовать <systemProperty>
для проверки установленного вами свойства. Или используйте selectionChanged
метод для включения IAction
.
selectionChanged
Метод является частью IActionDelegate
интерфейса, с помощью которого вы косвенно реализуете IWorkbenchWindowPulldownDelegate
:
public void selectionChanged(IAction action, ISelection selection)
action
Параметр — это фактическое действие, вызов action.setEnabled(true)
для включения действия.
Комментарии:
1. Спасибо, Грег, за твой ответ.
2. Не могли бы вы дать мне более подробную информацию о методе SelectionChanged, пожалуйста?
3. Хорошо, я попытался использовать метод SelectionChanged. Это работает, только если я выбираю что-то в проводнике пакетов. Но я хочу «автоматически» включить мое действие, когда мой активатор уведомит об окончании инициализации, не требуя от пользователя ничего делать.
4. С помощью Грега я нашел способ реализовать свои потребности. Смотрите первый пост, чтобы узнать, как это сделать.