1 31 32 package org.antlr.xjlib.appkit.undo; 33 34 import javax.swing.*; 35 import javax.swing.event.UndoableEditEvent ; 36 import javax.swing.event.UndoableEditListener ; 37 import javax.swing.undo.CompoundEdit ; 38 import javax.swing.undo.UndoManager ; 39 import javax.swing.undo.UndoableEdit ; 40 import java.util.Stack ; 41 42 public class XJUndo { 43 44 protected XJUndoEngine engine; 45 protected XJUndoDelegate delegate; 46 47 protected UndoManager undoManager = new UndoManager (); 48 protected XJUndoAction undoAction; 49 protected XJRedoAction redoAction; 50 51 protected Stack <CustomCompoundEdit> groupEditEvent = new Stack <CustomCompoundEdit>(); 52 53 protected int enable = 0; 54 55 public XJUndo(XJUndoEngine engine, XJUndoDelegate delegate) { 56 this.engine = engine; 57 this.delegate = delegate; 58 59 undoAction = new XJUndoAction(undoManager); 60 redoAction = new XJRedoAction(undoManager); 61 62 undoAction.setRedoAction(redoAction); 63 redoAction.setUndoAction(undoAction); 64 } 65 66 public void bindTo(JTextPane textPane) { 67 textPane.getDocument().addUndoableEditListener(new TextPaneUndoableEditListener()); 68 } 69 70 public void performUndo() { 71 if(delegate != null) 72 delegate.undoManagerWillUndo(false); 73 74 try { 75 undoAction.actionPerformed(null); 76 fireUndoStateDidChange(); 77 } finally { 78 if(delegate != null) 79 delegate.undoManagerDidUndo(false); 80 } 81 } 82 83 public void performRedo() { 84 if(delegate != null) 85 delegate.undoManagerWillUndo(true); 86 87 try { 88 redoAction.actionPerformed(null); 89 fireUndoStateDidChange(); 90 } finally { 91 if(delegate != null) 92 delegate.undoManagerDidUndo(true); 93 } 94 } 95 96 public void beginUndoGroup(String name) { 97 groupEditEvent.push(new CustomCompoundEdit(name)); 98 } 99 100 public void endUndoGroup() { 101 CustomCompoundEdit edit = groupEditEvent.pop(); 102 edit.end(); 103 addEditEvent(edit); 104 } 105 106 public CompoundEdit getUndoGroup() { 107 if(groupEditEvent.isEmpty()) 108 return null; 109 else 110 return (CompoundEdit )groupEditEvent.peek(); 111 } 112 113 public void enableUndo() { 114 enable--; 115 } 116 117 public void disableUndo() { 118 enable++; 119 } 120 121 public boolean isEnabled() { 122 return enable == 0; 123 } 124 125 public boolean canUndo() { 126 return undoManager.canUndo(); 127 } 128 129 public boolean canRedo() { 130 return undoManager.canRedo(); 131 } 132 133 public void addEditEvent(UndoableEdit edit) { 134 undoManager.addEdit(edit); 135 undoAction.updateUndoState(); 136 redoAction.updateRedoState(); 137 fireUndoStateDidChange(); 138 } 139 140 protected void fireUndoStateDidChange() { 141 engine.undoStateDidChange(this); 142 } 143 144 protected class TextPaneUndoableEditListener implements UndoableEditListener { 145 public void undoableEditHappened(UndoableEditEvent e) { 146 if(!isEnabled()) 147 return; 148 149 CompoundEdit groupEdit = getUndoGroup(); 150 if(groupEdit == null) 151 addEditEvent(e.getEdit()); 152 else 153 groupEdit.addEdit(e.getEdit()); 154 } 155 } 156 157 protected static class CustomCompoundEdit extends CompoundEdit { 158 159 protected String name; 160 161 public CustomCompoundEdit(String name) { 162 this.name = name; 163 } 164 165 public String getUndoPresentationName() { 166 return "Undo "+name; 167 } 168 169 public String getRedoPresentationName() { 170 return "Redo "+name; 171 } 172 173 } 174 } 175 | Popular Tags |