Modal panel problem
madman1 Sep 26, 2007 9:48 PMSorry for my english.
How can I do something like this.
<h:form>
<a4j:outputPanel ajaxRendered="true">
<rich:modalPanel id="dialog" showWhenRendered="true" rendered="#{dialogManager.currentDialog != null}">
<f:facet name="header">
<h:outputText value="#{dialogManager.currentDialog.title}"/>
</f:facet>
<t:div>
<h:outputText value="#{dialogManager.currentDialog.titleMessage}" styleClass="modalpanel-title"/>
</t:div>
<t:div>
<h:graphicImage value="#{dialogManager.currentDialog.image}"/>
<h:outputText value="#{dialogManager.currentDialog.message}"/>
</t:div>
<t:div>
<a4j:commandButton value="#{dialogManager.currentDialog.acceptButtonText}" action="#{dialogManager.clickOnAcceptButton}" oncomplete="Richfaces.hideModalPanel('dialog')"/>
<a4j:commandButton value="#{dialogManager.currentDialog.cancelButtonText}" rendered="#{dialogManager.currentDialog.cancelButtonText != null && dialogManager.currentDialog.cancelButtonText != ''}" action="#{dialogManager.clickOnCancelButton}" oncomplete="Richfaces.hideModalPanel('dialog')"/>
</t:div>
</rich:modalPanel>
</a4j:outputPanel>
</h:form>
<managed-bean> <managed-bean-name>dialogManager</managed-bean-name> <managed-bean-class>com.cms.application.backingbeans.ModalPanelDialogManager</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>
package com.cms.application.backingbeans;
import com.cms.business.CommandProcessor;
import com.cms.business.command.Command;
import com.cms.business.command.DataAccessCommand;
import com.cms.common.utils.Messages;
import com.cms.common.utils.Utils;
import java.util.concurrent.PriorityBlockingQueue;
/**
* En ocasiones es necesario mostrar un ventana de diálogo (modal panel), informando de un error, advertencia, mensaje.... o lo que corresponda.
* Incluso puede darse el caso de que al realizar ciertas operaciones, sea necesario pedirle confirmación al usuario para realizar las mismas. Pero
* esto no sea descubierto hasta una vez llegada la petición al servidor. Así pues es necesario un método que permita pedir la confirmación al usuario,
* y posteriormente realizar la misma.
*
* Precisamente éste es el propósito de la clase. Servir de único punto para la creación de ventanas de diálogo que deberán ser mostradas al usuario.
*
* El modo de funcionamiento será el siguiente, en cualquier punto de la aplicación se podrá añadir una nuevo diálogo a ser mostrado. A la lista
* de diálogos pendientes de ser mostrados. Una vez hecho esto, la presente clase se encargará de mostrar 1 a 1, las ventanas de diálogo que
* correspondan. Según su prioridad, tipo...
*
* Actualmente se contemplan 2 tipos de ventanas modales, aquellas destinadas a informar, ya sea de un error, advertencia o información.
* Estas serán las primeras en ser mostradas, según el orden anteriormente expuesto: error, advertencia, información.
*
* Y el segundo tipo se tratará de ventanas, que además de proporcionar una información, podrán desembocar en la ejecución de operaciones
* (patrón command). Ejemplo, se sube un nuevo fichero a la aplicación, pero al intentar insertarlo se descubre que el fichero ya existe.
* ¿Debemos sobreescribirlo? La solución será el preguntarle al usuario, y en caso de que acepte, el fichero será sobreescrito (ejecutada la operación).
* Y en caso de que no se acepte, simplemente no se hará nada. Y se seguirá con el proceso normal.
*
*
* @author Ricardo Fanjul Fandiño
*/
public class ModalPanelDialogManager {
/**
* Prioridad de los diálogos usados para mostrar excepciones ocurridas en el servidor.
*/
private static final int EXCEPTIONS_PRIORITY = 10;
/**
* Prioridad para los diálogos, que implican la ejecución de una operación "peligrosa". Por ejemplo que implica borrar un fichero.
*/
private static final int WARNING_TO_DO_COMMAND = 5;
private PriorityBlockingQueue<DialogContent> dialogs = new PriorityBlockingQueue<DialogContent>();
private DialogContent currentDialog;
/** Creates a new instance of ModalPanelDialogManager */
public ModalPanelDialogManager() {
}
public void addWarningToDoCommand(String title, String titleMessage,String message, Command command){
DialogContent dialog = createDialog(title, titleMessage, message, Utils.getMessage(Messages.ICON_WARNING_96), Utils.getMessage(Messages.TEXT_YES), Utils.getMessage(Messages.TEXT_NO), command, WARNING_TO_DO_COMMAND);
dialogs.add(dialog);
}
private DialogContent createDialog(String title, String titleMessage, String message, String image, String acceptText, String cancelText, Command command, int priority){
return new DialogContent(title, titleMessage, message, image, acceptText, cancelText, command, priority);
}
public DialogContent getCurrentDialog() {
if(currentDialog == null){
currentDialog = dialogs.poll();
}
return currentDialog;
}
/**
* Es ejecutado como respuesta al evento desembocado por pulsar en el boton "aceptar" de la ventana de diálogo en la interfaz de usuario.
* Con ello ejecutamos la operación asociada a este diálogo (command), si es que la huviera.
*
* Y establecemos el diálogo actual a <CODE>null</CODE>.
* @return <CODE>null</CODE>, para que se genere una respuesta Ajax.
*/
public String clickOnAcceptButton(){
Command command = currentDialog.getCommand();
currentDialog = null;
if (command instanceof DataAccessCommand){
CommandProcessor.processDataAccessCommand((DataAccessCommand) command);
} else {
//TODO en este momento todos los objetos command, también derivan a DataAccesCommand
}
return null;
}
/**
* Es ejecutado como respuesta al evento desembocado por pulsar en el boton "cancelar" de la ventana de diálogo en la interfaz de usuario.
*
* Se pone a <CODE>null</CODE>, el diálogo actual.
* @return <CODE>null</CODE>, para que la respuesta sea tratada como una respuesta Ajax.
*/
public String clickOnCancelButton(){
currentDialog = null;
return null;
}
}
package com.cms.application.backingbeans;
import com.cms.business.command.Command;
/**
* Esta clase almacena los datos necesarios para crear una ventana de diálogo por parte de la clase ModalPanelDialogManager. Entre otros almacena:
* <ul>
* <li>El título del díalogo</li>
* <li>La imagen a ser mostrada, ejemplo una imagen con el simbolo de un error</li>
* <li>El texto a ser mostrado</li>
* <li>El texto a ser mostrado en los botones "aceptar" y "cancelar", el segundo es opcional</li>
* <li>La operación (patrón command), que será ejecutada al pulsar el botón "aceptar", si es que la huviera.</li>
* <li>La prioridad de la ventana de diálogo, es decir si huviera varias pendientes de ser mostradas. Cual será en primer lugar.</li>
* </ul>
*
*
* "Note: this class has a natural ordering that is inconsistent with equals."
*
* @author Ricardo Fanjul Fandiño
*/
public class DialogContent implements Comparable{
/**
* Título de la ventana de diálogo
*/
private String title = "";
/**
* Título del cuerpo del mensaje.
*/
private String titleMessage = "";
/**
* Mensaje en el cuerpo de la ventana de diálogo.
*/
private String message = "";
/**
* Path hacia la imagen.
*/
private String image = "";
/**
* El texto del botón "aceptar".
*/
private String acceptButtonText = "";
/**
* El texto del botón cancelar, si su varlos es <code>null</code> o la cadena vacía. Dicho botón no será mostrado.
*/
private String cancelButtonText = "";
/**
* Operación que será ejecutada al pulsar el botón "aceptar".
*/
private Command command = null;
/**
* Prioridad del diálogo, los diálogos con mayor prioridad serán los primeros en ser mostrados.
* Cuanto mayor sea el número mayor será la prioridad. Es decir
* 0 < 5, una prioridad de 5 es mayor que una de 0.
* -8 < 33, una prioridad de 33 es mayor que una de -8.
*/
private int priority = 0;
/** Creates a new instance of DialogContent */
public DialogContent() {
}
public DialogContent(String title, String titleMessage, String message, String image, String accept, String cancel, Command command, int priority){
this.title = title;
this.titleMessage = titleMessage;
this.message = message;
this.image = image;
this.acceptButtonText = accept;
this.cancelButtonText = cancel;
this.command = command;
this.priority = priority;
}
public int compareTo(Object o) {
return priority - ((DialogContent)o).priority;
}
public String getTitle() {
return ""+System.currentTimeMillis();
//return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getAcceptButtonText() {
return acceptButtonText;
}
public void setAcceptButtonText(String acceptButtonText) {
this.acceptButtonText = acceptButtonText;
}
public String getCancelButtonText() {
return cancelButtonText;
}
public void setCancelButtonText(String cancelButtonText) {
this.cancelButtonText = cancelButtonText;
}
public Command getCommand() {
return command;
}
public void setCommand(Command command) {
this.command = command;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
public String getTitleMessage() {
return titleMessage;
}
public void setTitleMessage(String titleMessage) {
this.titleMessage = titleMessage;
}
}