/* UndoableEdit and AbstractUndoableEdit */
								
						
				
		
		
				
						
								
										AbstractUndoableEdit edit = new AbstractUndoableEdit();
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										// methods fall into 3 categories
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										// 1.undoable operations
								
						
				
		
		
				
						
								
										// if the alive field is false, all operation fail
								
						
				
		
		
				
						
								
										// the hasBeenDone field affect the behaviours of canUndo and canRedo method
								
						
				
		
		
				
						
								
										if (edit.canUndo()) {
								
						
				
		
		
				
						
								
										
												       edit.undo(); // the behaviour depends on canUndo
								
						
				
		
		
				
						
								
										}
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										if (edit.canRedo()) {
								
						
				
		
		
				
						
								
										
												       edit.redo(); // the behaviour depends on canRedo
								
						
				
		
		
				
						
								
										}
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										edit.die(); // set alive to be false
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										// 2.edit management
								
						
				
		
		
				
						
								
										edit.isSignificant(); // if the edit affect model state, default implementation return false
								
						
				
		
		
				
						
								
										edit.addEdit(null); // edit queued in some UndoableEditListener, and try to absorb another edit
								
						
				
		
		
				
						
								
										edit.replaceEdit(null); // try to replace another edit queued in some UndoableEditListener
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										// 3.representation
								
						
				
		
		
				
						
								
										edit.getPresentationName();
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										// the following 2 methods use result of getPresentationName and add undo/redo text in UIManager
								
						
				
		
		
				
						
								
										edit.getUndoPresentationName();
								
						
				
		
		
				
						
								
										edit.getRedoPresentationName();
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										/* CompoundEdit */
								
						
				
		
		
				
						
								
										// implements the composition pattern, manages a set of edits
								
						
				
		
		
				
						
								
										CompoundEdit compound = new CompoundEdit();
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										// undoable operations (except die) fail if inProgress is true
								
						
				
		
		
				
						
								
										// edit management methods (except isSignificant) fail if inProgress is false
								
						
				
		
		
				
						
								
										compound.isInProgress();
								
						
				
		
		
				
						
								
										compound.end(); // set inProgress to be false
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										// representation methods try to use information of the last edit
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										/* UndoManager */
								
						
				
		
		
				
						
								
										UndoManager manager = new UndoManager();
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										// extends undoable operations when inProgress is true
								
						
				
		
		
				
						
								
										// undo/redo now stop at the latest significant edit
								
						
				
		
		
				
						
								
										// limit the maximal number of edits
								
						
				
		
		
				
						
								
										manager.setLimit(0);
								
						
				
		
		
				
						
								
										manager.getLimit();
								
						
				
		
		
				
						
								
										manager.discardAllEdits(); // clear all edits
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										// extends representation methods when inProgress is true
								
						
				
		
		
				
						
								
										// undo/redo methods try to use information of the latest edit to be undo/redo
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										// add undoOrRedo methods
								
						
				
		
		
				
						
								
										if (manager.canUndoOrRedo()) {
								
						
				
		
		
				
						
								
										
												       manager.undoOrRedo();
								
						
				
		
		
				
						
								
										}
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										manager.getUndoOrRedoPresentationName();
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										/* StateEditable */
								
						
				
		
		
				
						
								
										// stateful object should be able to store and restore its state
								
						
				
		
		
				
						
								
										StateEditable stateEditable = new StateEditable() {
								
						
				
		
		
				
						
								
										
												       public void restoreState(Hashtable<?, ?> state) {}
								
						
				
		
		
				
						
								
										
												       public void storeState(Hashtable<Object, Object> state) {}
								
						
				
		
		
				
						
								
										};
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										/* StateEdit */
								
						
				
		
		
				
						
								
										// extends AbstractUndoableEdit to add the ability to use StateEditable
								
						
				
		
		
				
						
								
										// store pre-state 
								
						
				
		
		
				
						
								
										StateEdit stateEdit = new StateEdit(stateEditable);
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										// store post-state
								
						
				
		
		
				
						
								
										stateEdit.end();
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										// restore the state of stateEditable
								
						
				
		
		
				
						
								
										stateEdit.undo();
								
						
				
		
		
				
						
								
										stateEdit.redo();
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										/* UndoableEditSupport */
								
						
				
		
		
				
						
								
										UndoableEditSupport support = new UndoableEditSupport(new Object());
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										// methods fall into 2 categories
								
						
				
		
		
				
						
								
										// 1.manage a set of UndoableEditListener
								
						
				
		
		
				
						
								
										support.addUndoableEditListener(null);
								
						
				
		
		
				
						
								
										support.removeUndoableEditListener(null);
								
						
				
		
		
				
						
								
										support.getUndoableEditListeners();
								
						
				
		
		
				
						
								
										 
								
						
				
		
		
				
						
								
										// 2.send UndoableEditEvent
								
						
				
		
		
				
						
								
										// if updateLevel is 0, all UndoableEditEvent would be sent immediately
								
						
				
		
		
				
						
								
										// else UndoableEdit will be saved in CompoundUndoableEdit and wait util updateLevel change to 0
								
						
				
		
		
				
						
								
										support.beginUpdate(); // increase updateLevel
								
						
				
		
		
				
						
								
										// send UndoableEditEvent if updateLevel is 0 or save edit in CompoundUndoableEdit
								
						
				
		
		
				
						
								
										support.postEdit(null);
								
						
				
		
		
				
						
								
										support.endUpdate(); // decrease unpdateLeve and send UndoableEditEvent if necessary