/**
  * Performs the Undo action. A new corresponding Redo step is automatically pushed to the stack.
  */
 private void undo() {
   if (stack.hasUndo()) {
     isUndo = true;
     revertEvent(stack.popUndo());
     isUndo = false;
   }
 }
 /**
  * Performs the Redo action. A new corresponding Undo step is automatically pushed to the stack.
  */
 private void redo() {
   if (stack.hasRedo()) {
     isRedo = true;
     revertEvent(stack.popRedo());
     isRedo = false;
   }
 }
 /**
  * Creates a corresponding Undo or Redo step from the given event and pushes it to the stack. The
  * Redo stack is, logically, emptied if the event comes from a normal user action.
  *
  * @param event
  * @see org.eclipse.swt.custom.ExtendedModifyListener#modifyText(org.eclipse.
  *     swt.custom.ExtendedModifyEvent)
  */
 public void modifyText(ExtendedModifyEvent event) {
   if (isUndo) {
     stack.pushRedo(event);
   } else { // is Redo or a normal user action
     stack.pushUndo(event);
     if (!isRedo) {
       stack.clearRedo();
       // TODO Switch to treat consecutive characters as one event?
     }
   }
 }