ConfirmBox

On souhaite afficher une fenêtre de confirmation à la sauvegarde (ou changement d’étape) dans un formulaire de processus ou sur un écran Process.

Solution 1 : avec un actionListener

Note

Cette méthode est réservée au fomulaires de processus mais n’est pas très pratique. Préférer la solution 2.

Il n’est pas possible de configurer directement les boutons standards pour qu’ils affichent une confirmation. Il faut implémenter un actionlistener qui se charge :

  • D’encapsuler les listeners standards
  • De déclencher ou non ces listeners standards en fonction d’une confirmation

Implémentation

L’implémentation se fait en 3 étapes :

  • Une classe d’extension BaseDocumentExtension qui intègre simplement une méthode générique pour rendre “confirmable” un bouton : confirmButton(IResourceController.TOP_CONTAINER, "save", "Etes-vous sûr de vouloir enregistrer ?");
  • Un ActionListener “ConfirmActionListener” qui gère les actionlisteners standards et qui est donc déposée sur les boutons
  • Un ActionListener “RestoreConfirmActionListener” qui passe en dernier et repositionne notre “ConfirmActionListener” pour la prochaine sauvegarde une fois que les listeners standards ont été exécutées

Exemple

RestoreConfirmActionListener :

import java.util.Set;

import com.axemble.vdoc.sdk.interfaces.IResourceController;
import com.axemble.vdp.ui.framework.components.events.ActionEvent;
import com.axemble.vdp.ui.framework.components.listeners.AbstractActionListener;
import com.axemble.vdp.ui.framework.components.listeners.ActionListener;
import com.axemble.vdp.ui.framework.widgets.CtlButton;

public class RestoreConfirmActionListener implements ActionListener {
    protected Set<AbstractActionListener> actionListeners;
    protected String message;
    protected CtlButton button;

    protected IResourceController iResourceController;
    
    public RestoreConfirmActionListener(IResourceController iResourceController, String message, CtlButton button, Set<AbstractActionListener> actionListeners) {
        super();
        this.message = message;
        this.actionListeners = actionListeners;
        this.button = button;
        this.iResourceController = iResourceController;
    }
    
    @Override
    public void onClick(ActionEvent actionEvent) {
        // We remove standard listeners and build a new instance of our ConfirmActionListener
        button.removeActionListeners();
        button.addActionListener(new ConfirmActionListener(iResourceController, message, button, actionListeners));
    }
}

ConfirmActionListener :

import java.util.Set;

import com.axemble.vdoc.sdk.interfaces.IResourceController;
import com.axemble.vdp.ui.framework.components.events.ActionEvent;
import com.axemble.vdp.ui.framework.components.listeners.AbstractActionListener;
import com.axemble.vdp.ui.framework.components.listeners.ActionListener;
import com.axemble.vdp.ui.framework.components.listeners.ConfirmBoxListener;
import com.axemble.vdp.ui.framework.widgets.CtlButton;

public class ConfirmActionListener implements ActionListener {
  protected Set<AbstractActionListener> actionListeners;
  protected String message;
  protected CtlButton button;

  protected IResourceController iResourceController;

  public ConfirmActionListener(IResourceController iResourceController, String message, CtlButton button, Set<AbstractActionListener> actionListeners) {
    super();
    this.message = message;
    this.actionListeners = actionListeners;
    this.button = button;
    this.iResourceController = iResourceController;
  }
  
  @Override
  public void onClick(ActionEvent actionEvent) {
    // Call confirm
    iResourceController.confirm(message, new ConfirmBoxListener() {
      @Override
      public void onOk(ActionEvent actionevent) {
        // We remove our ConfirmActionListener
        button.removeActionListeners();

        // We add standard listeners
        for (AbstractActionListener abstractActionListener : actionListeners) {
          button.addActionListener(abstractActionListener);
        }
        // We add final listener to restore our ConfirmActionListener 
        button.addActionListener(new RestoreConfirmActionListener(iResourceController, message, button, actionListeners));

        // We execute the button
        iResourceController.execute(button);
      }

      @Override
      public void onCancel(ActionEvent actionevent) {
      }
    });
  }
}

Extension de formulaire pour poser la confirmBox :

import java.util.LinkedHashSet;
import java.util.Set;

import com.axemble.vdoc.sdk.document.extensions.BaseDocumentExtension;
import com.axemble.vdoc.sdk.interfaces.IResourceController;
import com.axemble.vdp.ui.framework.components.listeners.AbstractActionListener;
import com.axemble.vdp.ui.framework.widgets.CtlButton;

public class ConfirmboxDocumentExtension extends BaseDocumentExtension {
  @Override
  public boolean onAfterLoad() {
    confirmButton(IResourceController.TOP_CONTAINER, "save", "Etes-vous sûr de vouloir enregistrer ?");
    confirmButton(IResourceController.TOP_CONTAINER, "saveandclose", "Etes-vous sûr de vouloir enregistrer ?");
    confirmButton(IResourceController.BOTTOM_CONTAINER, "Envoyer", "Etes-vous sûr de vouloir enregistrer et passer à l'étape suivante ?");
    return super.onAfterLoad();
  }

  protected void confirmButton(int position, String name, String confirmMessage) {
    // We get button by name in container (top or bottom)
    CtlButton ctlButton = (CtlButton) getResourceController().getButtonContainer(position).get(name);

    // We get standard listeners (used to trigger after this standard code)
    Set<AbstractActionListener> sActionListeners = new LinkedHashSet<>(ctlButton.actionListeners);

    // We remove it from current button listeners
    ctlButton.removeActionListeners();

    // We rebuild actionlisteners to be a LinkedHashSet (ordered) instead of a HashSet by default
    ctlButton.actionListeners = new LinkedHashSet<>();

    // We add our ConfirmActionListener
    ctlButton.addActionListener(new ConfirmActionListener(getResourceController(), confirmMessage, ctlButton, sActionListeners));
  }
}

Solution 2 : interface IConfirmboxListener

Sur certaines étapes de process ou écrans vues Process, on a besoin de demander la confirmation de l’execution de certaines actions de l’utilisateur.

La demande de confirmation peut se faire via une alerte qui se lance sur le clic sur un bouton d’action se trouvant dans le container haut ou bas de l’ecran.

Exemple

Une demande de confirmation avant de passer à l’etape suivante :

public class confirmlistner extends BaseDocumentExtension {
  private static com.axemble.vdoc.sdk.utils.Logger LOG = com.axemble.vdoc.sdk.utils.Logger.getLogger(confirmlistner.class);
  protected MyConfirmBoxListener myConfirmBoxListener = null;

  public class MyConfirmBoxListener implements ConfirmBoxListener {
    protected IAction iAction;
    protected boolean accept = false;

    public MyConfirmBoxListener(IAction iAction) {
      super();
      this.iAction = iAction;
    }

    public void onCancel(ActionEvent actionEvent) {
      accept = false;
    }

    public void onOk(ActionEvent actionEvent) {
      CtlButton actionButton = getResourceController().getButton(iAction.getLabel(), IResourceController.BOTTOM_CONTAINER);

      // Executer l’action declenchant l’alerte
      Navigator.getNavigator().enqueue2(new ActionEvent(actionButton, ActionEvent.ONCLICK));

      // Pour ne pas lancer à nouveau le confirm box on met accept a true
      accept = true;
    }

    public boolean isAccept() {
      return accept;
    }
  }

  /**
   * Appelé lorsque l’utilisateur execute une action de confirmation ou non
   */
  public boolean onBeforeSubmit(IAction action) {
    try {
      boolean myTest = false;

      if (myConfirmBoxListener == null) {
        myConfirmBoxListener = new MyConfirmBoxListener(action);
      }

      if ((!myTest) && (!myConfirmBoxListener.isAccept())) {
        Navigator.getNavigator().getRootNavigator().showConfirmBox("Etes-vous certain ?", myConfirmBoxListener);
        
        // ou bien a travers l'interface ResourceController :
        // getResourceController().confirm("Etes-vous certain ?", myConfirmBoxListener);
        
        return false;
      }
    } catch (Exception e) {
      String message = e.getMessage();
      if (message == null) {
        message = "";
      }
      LOG.error("Error in ConfirmBoxDocumentExtension onBeforeSubmit method : " + e.getClass() + " - " + message);
    }
    return super.onBeforeSubmit(action);
  }

}

Sources :