Как установить отдельный глобальный обработчик действий для нескольких экземпляров редактора плагинов на основе формы затмения

Я работаю над редактором на основе формы затмения. Я дал поддержку обработки 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();
    }
Другие вопросы по тегам