Как установить отдельный глобальный обработчик действий для нескольких экземпляров редактора плагинов на основе формы затмения
Я работаю над редактором на основе формы затмения. Я дал поддержку обработки Undo Redo и грязного флага моему редактору. Обе эти функции отлично работают для отдельных экземпляров плагина. Проблема наступает, когда я открываю его с 2 или более файлами (2 или более экземпляров плагина eclipse). Теперь, отменить повтор, начинает работать странно. Они работают только для экземпляров, которые наконец открыты.
Например: предположим, что мой редактор поддерживает файл.xeb. если я открою файлы test1.xeb и test2.xeb один за другим, используя мой редактор. тогда отмена повтора работает только для тех экземпляров, которые открыты для файла test2.xeb. Если я переключаюсь обратно на другие экземпляры, то появляется отменить повтор первого экземпляра.
У меня есть записи ниже в моем редакторе plugin.xml:
<plugin><extension
point="org.eclipse.ui.editors">
<editor
class="Testeditor"
default="true"
extensions="xeb"
icon="icons/sample.gif"
id="testeditor"
name="editor">
</editor>
</plugin>
Я отладил код и обнаружил, что это странное поведение происходит из-за неправильной обработки глобальных действий. Я использовал приведенный ниже код для установки обработчика глобальных действий:
public void setUndoRedoActionHandlers() {
final IActionBars actionBars = getEditorSite().getActionBars();
actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
mUndoAction);
actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
mRedoAction);
actionBars.updateActionBars();
}
Я просмотрел несколько ссылок, связанных с этой проблемой. но не мог понять концепцию реализации этого поведения.
http://wiki.eclipse.org/FAQ_How_do_I_find_out_what_view_or_editor_is_selected%3F
http://wiki.eclipse.org/FAQ_How_do_I_hook_into_global_actions,_such_as_Copy_and_Delete%3F
Может ли кто-нибудь разобраться в этом вопросе. Заранее спасибо.
1 ответ
Только переопределите метод setFocus() MultiPageEditorPart в своем классе редактора и вызовите соответствующий метод установки глобального обработчика действий, например, так:
@Override
public void setFocus() {
switch (getActivePage()) {
case 0:
pageOne.setUndoRedoActionHandlers();
break;
case 1:
pageTwo.setUndoRedoActionHandlers();
break;
}
super.setFocus();
}