工作小驛

          Ninja!

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            103 Posts :: 0 Stories :: 36 Comments :: 0 Trackbacks
          import java.awt.event.ActionEvent;
          import javax.swing.AbstractAction;
          import javax.swing.Action;
          import javax.swing.JEditorPane;
          import javax.swing.KeyStroke;
          import javax.swing.event.UndoableEditEvent;
          import javax.swing.event.UndoableEditListener;
          import javax.swing.text.JTextComponent;
          import javax.swing.undo.CannotRedoException;
          import javax.swing.undo.CannotUndoException;
          import javax.swing.undo.UndoManager;

          /**
          * UndoWrapper is responsible for adding undo and redo support to text components.
          * @author Antonio Vieiro (antonio@antonioshome.net), $Author: $
          * @version $Revision: $
          */
          public class UndoWrapper
          implements UndoableEditListener
          {
          private UndoManager undoManager;
          private UndoAction undoAction;
          private RedoAction redoAction;
          private JEditorPane textComponent;

          /**
          * Creates a new instance of UndoWrapper
          */
          public UndoWrapper( JEditorPane aComponent )
          {
          textComponent = aComponent;
          undoManager = new UndoManager();
          undoAction = new UndoAction();
          redoAction = new RedoAction();
          textComponent.getDocument().addUndoableEditListener( this );
          textComponent.getInputMap().put( (KeyStroke) undoAction.getValue(
          Action.ACCELERATOR_KEY), "undo" );
          textComponent.getInputMap().put( (KeyStroke) redoAction.getValue(
          Action.ACCELERATOR_KEY), "redo" );
          textComponent.getActionMap().put( "undo", undoAction );
          textComponent.getActionMap().put( "redo", redoAction );
          }

          public void undoableEditHappened(UndoableEditEvent e)
          {
          undoManager.addEdit( e.getEdit() );
          undoAction.updateUndoState();
          redoAction.updateRedoState();
          }

          /**
          * UndoAction is the Action responsible for handling the undo operation.
          */
          class UndoAction
          extends AbstractAction
          {
          public UndoAction()
          {
          super( "Cannot undo" ); // TODO: I18N
          setEnabled( false );
          putValue( Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl Z") );
          }

          public void actionPerformed(ActionEvent e)
          {
          try
          {
          undoManager.undo();
          }
          catch( CannotUndoException cue )
          {
          // TODO: Use logging?
          cue.printStackTrace( System.err );
          }
          updateUndoState();
          redoAction.updateRedoState();
          }

          void updateUndoState()
          {
          if ( undoManager.canUndo() )
          {
          setEnabled( true );
          putValue( Action.NAME, "Undo" ); // TODO I18N
          }
          else
          {
          setEnabled( false );
          putValue( Action.NAME, "Cannot undo" ); // TODO I18N
          }
          }
          }

          /**
          * RedoAction is the Action responsible for handling the redo operation.
          */
          class RedoAction
          extends AbstractAction
          {
          public RedoAction()
          {
          super( "Cannot redo" ); // TODO I18N
          setEnabled( false );
          putValue( Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl Y") );
          }
          public void actionPerformed(ActionEvent e)
          {
          try
          {
          undoManager.redo();
          }
          catch( CannotRedoException cre )
          {
          // TODO: Use logging?
          cre.printStackTrace( System.err );
          }
          updateRedoState();
          undoAction.updateUndoState();
          }

          void updateRedoState()
          {
          if ( undoManager.canRedo() )
          {
          setEnabled( true );
          putValue( Action.NAME, "Redo" ); // TODO I18N
          }
          else
          {
          setEnabled( false );
          putValue( Action.NAME, "Cannot redo" ); // TODO I18N
          }
          }
          }

          UndoAction getUndoAction()
          {
          return undoAction;
          }

          RedoAction getRedoAction()
          {
          return redoAction;
          }
          }
              
          posted on 2007-08-14 12:15 王君 閱讀(469) 評論(0)  編輯  收藏 所屬分類: J2SE
          主站蜘蛛池模板: 乾安县| 新和县| 梁河县| 靖州| 马公市| 安仁县| 长海县| 湖北省| 赤水市| 安岳县| 芦山县| 昌宁县| 南江县| 宜宾县| 鄢陵县| 绵阳市| 桑植县| 福建省| 伊春市| 乐东| 塔城市| 崇阳县| 六安市| 房产| 金川县| 乌拉特前旗| 台州市| 岑巩县| 南京市| 壤塘县| 时尚| 绩溪县| 垫江县| 巴彦淖尔市| 封开县| 余庆县| 大埔区| 花莲县| 和顺县| 伊通| 唐山市|