SWT Tips and Samples 基礎編 > UndoManager

 

UndoManager

JFaceのTextViewerにはUndo、Redoの機構が用意されており、UndoManagerを利用することで比較的簡単にUndo、Redoを実装することができます。まずUndoManagerを準備する必要がありますが、DefaultUndoManagerクラスを使います。コンストラクタ引き数で、Undo、Redoの実行可能回数を設定し、TextViewerにセットします。またUndoManagerの方からもテキストウィジェットにアクセスする必要があるので、connectメソッドで対象となるテキストをセットします。次にどの操作に対してUndo、Redoを行えるかを設定する必要があるわけですが、endCompoundChangeメソッドで行われた操作を記録させます。これは、テキストに文字入力や文字の貼り付けなど、何らかの変更が行われたときveryfyTextメソッドが呼び出されるので、このメソッド内で操作の記録をすればよいでしょう。そして実際のUndo、Redoの処理はTextViewer#doOperationを使います。まとめるとイディオムとしては下のようになります。

TextViewer text = new TextViewer(...);
...
IUndoManager undoMan = new DefaultUndoManager(10);
text.setUndoManager(undoMan);
undoMan.connect(text);
...
text.getTextWidget().addVerifyListener(new VerifyListener(){
   public void verifyText(VerifyEvent e){
      ...
      undoMan.endCompoundChange();
      ...
   }
});
...
//実際のUndoの処理
text.doOperation(ITextOperationTarget.UNDO);
//実際のRedoの処理
text.doOperation(ITextOperationTarget.REDO);

サンプルプログラム

このプログラムでは、3回までの操作に対してUndo、Redoを行うことができます。キーボードショートカットを設定しており、Ctrl+ZでUndo、Ctrl+RでRedoとなります。

ソースコード (UndoManagerTest.java)

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.text.DefaultUndoManager;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.ITextOperationTarget;
import org.eclipse.jface.text.IUndoManager;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class UndoManagerTest extends ApplicationWindow {

        private TextViewer text;
        private IUndoManager undoMan;
        private Action undoAction;

        private RedoAction redoAction;
        public UndoManagerTest() {
                super(null);
                addMenuBar();
        }

        public static void main(String[] args) {
                ApplicationWindow w = new UndoManagerTest();
                w.setBlockOnOpen(true);
                w.open();
                Display.getCurrent().dispose();
        }

        protected Control createContents(Composite parent) {
                getShell().setText("UndoManagerTest");
                getShell().setSize(200,200);

                Composite container = new Composite(parent, SWT.NONE);
                container.setLayout(new FillLayout());

                text =
                        new TextViewer(container, SWT.H_SCROLL | 
                                                  SWT.V_SCROLL | 
                                                  SWT.BORDER);
                Document doc = new Document("ドキュメント");
                text.setDocument(doc);

                undoMan = new DefaultUndoManager(3);
                text.setUndoManager(undoMan);
                undoMan.connect(text);

                text.getTextWidget().addVerifyListener(new VerifyListener() {
                        public void verifyText(VerifyEvent e) {
                                System.out.println(e);
                                undoMan.endCompoundChange();
                                undoAction.setEnabled(undoMan.undoable());
                                redoAction.setEnabled(undoMan.redoable());
                        }
                });

                return container;
        }
        protected MenuManager createMenuManager() {
                MenuManager menubar = new MenuManager();
                MenuManager editMenu = new MenuManager("&Edit");
                undoAction = new UndoAction();
                redoAction = new RedoAction();
                editMenu.add(undoAction);
                editMenu.add(redoAction);
                menubar.add(editMenu);
                return menubar;
        }

        class UndoAction extends Action {
                public UndoAction() {
                        setText("&Undo@Ctrl+Z");
                }
                public void run() {
                        text.doOperation(ITextOperationTarget.UNDO);
                        if (!undoMan.undoable()) {
                                setEnabled(false);
                        }
                }
        }
        class RedoAction extends Action {
                public RedoAction() {
                        setText("&Redo@Ctrl+R");
                }
                public void run() {
                        text.doOperation(ITextOperationTarget.REDO);
                        if (!undoMan.redoable()) {
                                setEnabled(false);
                        }
                }
        }

}


最新更新日: 2004年10月20日
 
関連リンク
Eclipse API ドキュメント
DefaultUndoManager
IUndoManager
TextViewer
Document
ITextOperationTarget
VerifyEvent
VeriyListener
MenuManager
Action
基礎編 - TextViewer

- PR -

プレゼンテーション作成ソフト無料お試し版配信中

【Sony】大手他社よりも安い!ビジネス向け光・100Mしかも固定IP付!今なら更に初期費用最大15,000円OFF!

オフィス用品・オフィス家具 価 格 交 渉 可! 
◎ 目指せ★業界最安値 ★ ◎ オフィネット・ドットコム株式会社

注文から納品まで驚きの早さ!!【ASKULカタログ】はこちらから・・・

マイクロソフト お得な見積! まとめての購入ならオトクな方法で。ライセンスだから管理も簡単。


Copyright(C) 2003,2004 Jasmin Project. All Right Reserved.
SEO [PR] おまとめローン Windows7 冷え性対策 動画 掲示板 レンタルサーバー ライブチャット SEO