@Override
 public IStatus undoOperation(
     IUndoableOperation operation, IProgressMonitor monitor, IAdaptable info)
     throws ExecutionException {
   Assert.isNotNull(operation);
   IStatus status;
   if (operation.canUndo()) {
     status = doUndo(monitor, info, operation);
   } else {
     if (DEBUG_OPERATION_HISTORY_UNEXPECTED) {
       Tracing.printTrace(
           "OPERATIONHISTORY",
           "Undo operation not valid - " + operation); // $NON-NLS-1$//$NON-NLS-2$
     }
     status = IOperationHistory.OPERATION_INVALID_STATUS;
   }
   return status;
 }
  @Override
  public IStatus undo(IUndoContext context, IProgressMonitor monitor, IAdaptable info)
      throws ExecutionException {
    Assert.isNotNull(context);
    IUndoableOperation operation = getUndoOperation(context);

    // info if there is no operation
    if (operation == null) {
      return IOperationHistory.NOTHING_TO_UNDO_STATUS;
    }

    // error if operation is invalid
    if (!operation.canUndo()) {
      if (DEBUG_OPERATION_HISTORY_UNEXPECTED) {
        Tracing.printTrace(
            "OPERATIONHISTORY",
            "Undo operation not valid - " + operation); // $NON-NLS-1$ //$NON-NLS-2$
      }
      return IOperationHistory.OPERATION_INVALID_STATUS;
    }

    return doUndo(monitor, info, operation);
  }
 @Override
 public boolean canUndo(IUndoContext context) {
   // null context is allowed and passed through
   IUndoableOperation operation = getUndoOperation(context);
   return (operation != null && operation.canUndo());
 }