工作小驛

          Ninja!

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            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 王君 閱讀(468) 評論(0)  編輯  收藏 所屬分類: J2SE
          主站蜘蛛池模板: 云和县| 广东省| 龙口市| 万年县| 峨边| 江都市| 新昌县| 寻乌县| 贵定县| 博白县| 长岛县| 抚顺县| 大埔区| 天门市| 冀州市| 珠海市| 邯郸市| 井研县| 化德县| 富源县| 桦川县| 梁河县| 白城市| 洛宁县| 特克斯县| 天台县| 应城市| 卫辉市| 邓州市| 吉首市| 昌邑市| 丰城市| 濮阳市| 嘉定区| 曲麻莱县| 苗栗市| 四会市| 蒙城县| 高陵县| 汝州市| 北辰区|