2

http://help.eclipse.org/indigo/topic/org.eclipse.platform.doc.isv/guide/wrkAdv_undo.htmで説明されている例に従っていました

私のinit()方法ではEditorPart

    /**
     * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite,
     * org.eclipse.ui.IEditorInput)
     */
    @Override
    public void init(IEditorSite site,IEditorInput input)
    throws PartInitException {
        ...
        IWorkbench workbench = getSite().getWorkbenchWindow().getWorkbench();
        myUndoContext= workbench.getOperationSupport().getUndoContext();


        UndoRedoActionGroup historyActionGroup = new UndoRedoActionGroup(site, myUndoContext, true);
        historyActionGroup.fillActionBars(site.getActionBars());
        }

...私は私のメソッドに以下を追加しましたEditorPart

        IUndoableOperation operation = new MyOperation("My Action");
        operation.addContext(myUndoContext);
        try {
            IStatus status = OperationHistoryFactory.getOperationHistory().execute(operation, null, null);
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

元に戻すアクションを追加できましたが、カスタム エディターで開いたすべてのファイルに元に戻すアクションが追加されることに気付きました。ファイルに変更を加えると、開いている他のすべてのファイルの元に戻す操作が編集メニューに追加されます。現在アクティブなファイルにのみ適用するにはどうすればよいですか?

4

2 に答える 2

0

ちょうど1分前に同様の問題を修正しました。私の問題は次のとおりでした: UndoRedo アクションは、開いているすべてのエディターに表示されていました。その理由は、次のように、エディタごとにUndoActionHandlerとが作成および追加されたためです。RedoActionHandler

if (undoCmdHandler == null || !contains(undoCmdHandler)) {
    undoCmdHandler = new UndoActionHandler(site, undoContext);
    actionBars.getToolBarManager().add(undoCmdHandler);
}

#contains()メソッドは (バグがあるため) 常に false を返すため、ハンドラーは常に作成されていました。だから、私はそれを削除しました:)

あなたの例では、常にUndoRedoActionGroupエディターごとに作成し、アクションバーを埋めます。上記のように、アクション グループを使用するのではなく、自分でUndoActionHandlerandRedoActionHandlerを作成することをお勧めします。

ハンドラーを制御できる場合、解決策はUndoActionHandlerandのインスタンスを1つだけ作成しRedoActionHandler、アクションバーを埋めますが、コンテキストが変更されたとき(ユーザーがエディター間を移動するとき(このイベントをリッスンする必要があります))、コンテキストを更新するだけですあなたのハンドラー、次のように:

redoCmdHandler.setContext(undoContext);

したがって、最終的には次のような結果になります。

public static RedoActionHandler getRedoActionHandler(IWorkbenchPartSite site, IActionBars actionBars, IUndoContext undoContext) {
        if (redoCmdHandler == null) {
            redoCmdHandler = new RedoActionHandler(site, undoContext);
            actionBars.getToolBarManager().add(redoCmdHandler);
        } else {
            redoCmdHandler.setContext(undoContext);
        }
        return redoCmdHandler;
    }
于 2013-09-16T11:13:39.823 に答える