@Override
  public <
          A extends FlexoUndoableAction<A, T1, T2>,
          T1 extends FlexoModelObject,
          T2 extends FlexoModelObject>
      A performRedoAction(A action, EventObject event) {
    boolean confirmRedoAction = true;
    ActionInitializer<A, T1, T2> actionInitializer = getActionInitializer(action.getActionType());
    FlexoActionRedoInitializer<A> initializer = null;
    if (actionInitializer != null) {
      initializer = actionInitializer.getDefaultRedoInitializer();
      if (initializer != null) {
        confirmRedoAction = initializer.run(event, action);
      }
    }

    if (confirmRedoAction) {
      actionWillBeRedone(action);
      try {
        if (getProject() != null) {
          getProject().clearRecentlyCreatedObjects();
        }
        action.redoActionInContext();
        if (getProject() != null) {
          getProject().notifyRecentlyCreatedObjects();
        }
        actionHasBeenRedone(action, true); // Action succeeded
      } catch (FlexoException exception) {
        actionHasBeenUndone(action, false); // Action failed
        ProgressWindow.hideProgressWindow();
        FlexoExceptionHandler<A> exceptionHandler = null;
        if (actionInitializer != null) {
          exceptionHandler = actionInitializer.getDefaultExceptionHandler();
        }
        if (exceptionHandler != null) {
          if (exceptionHandler.handleException(exception, action)) {
            // The exception has been handled, we may still have to execute finalizer, if any
          } else {
            return action;
          }
        } else {
          return action;
        }
      }

      FlexoActionRedoFinalizer<A> finalizer = null;
      if (actionInitializer != null) {
        finalizer = actionInitializer.getDefaultRedoFinalizer();
        if (finalizer != null) {
          confirmRedoAction = finalizer.run(event, action);
        }
      }
    }
    ProgressWindow.hideProgressWindow();
    return action;
  }
 private <
         A extends org.openflexo.foundation.action.FlexoAction<A, T1, T2>,
         T1 extends FlexoModelObject,
         T2 extends FlexoModelObject>
     void runFinalizer(final A action, EventObject event) {
   ActionInitializer<A, T1, T2> actionInitializer = getActionInitializer(action.getActionType());
   if (actionInitializer != null) {
     FlexoActionFinalizer<A> finalizer = actionInitializer.getDefaultFinalizer();
     if (finalizer != null) {
       finalizer.run(event, action);
     }
   }
 }
 private <
         A extends FlexoAction<A, T1, T2>,
         T1 extends FlexoModelObject,
         T2 extends FlexoModelObject>
     boolean runInitializer(A action, EventObject event) {
   ActionInitializer<A, T1, T2> actionInitializer = getActionInitializer(action.getActionType());
   if (actionInitializer != null) {
     FlexoActionInitializer<A> initializer = actionInitializer.getDefaultInitializer();
     if (initializer != null) {
       return initializer.run(event, action);
     }
   }
   return true;
 }
  @Override
  public <
          A extends org.openflexo.foundation.action.FlexoAction<A, T1, T2>,
          T1 extends FlexoModelObject,
          T2 extends FlexoModelObject>
      A performAction(final A action, final EventObject e) {
    if (!action.getActionType().isEnabled(action.getFocusedObject(), action.getGlobalSelection())) {
      return null;
    }
    if (!(action instanceof FlexoGUIAction<?, ?, ?>)
        && action.getFocusedObject() != null
        && action.getFocusedObject().getProject() != getProject()) {
      if (logger.isLoggable(Level.INFO)) {
        logger.info(
            "Cannot execute action because focused object is within another project than the one of this editor");
      }
      return null;
    }

    executeAction(action, e);
    return action;
  }
  private <
          A extends FlexoAction<A, T1, T2>,
          T1 extends FlexoModelObject,
          T2 extends FlexoModelObject>
      boolean runExceptionHandler(FlexoException exception, final A action) {
    actionHasBeenPerformed(action, false); // Action failed
    ProgressWindow.hideProgressWindow();
    FlexoExceptionHandler<A> exceptionHandler = null;
    ActionInitializer<A, T1, T2> actionInitializer = getActionInitializer(action.getActionType());
    if (actionInitializer != null) {
      exceptionHandler = actionInitializer.getDefaultExceptionHandler();
    }
    if (exceptionHandler != null) {
      if (exceptionHandler.handleException(exception, action)) {
        // The exception has been handled, we may still have to execute finalizer, if any
        return true;
      } else {
        return false;
      }

    } else {
      return false;
    }
  }