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
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 :