2010-07-01 19 views
12

Estoy intentando crear un cuadro de diálogo de confirmación modal. Me gustaría que funcione como Window.confirm(""), donde puedo llamarlo y obtener una respuesta booleana.Cuadro de diálogo de confirmación GWT

Mi problema es que no estoy seguro de cómo hacerlo. Estoy tratando de usar MVP en mi aplicación. Aquí está el código que tengo hasta ahora:

public class DialogBoxPresenter implements Presenter { 

    public interface Display { 

     Label getDialogText(); 

     Button getAffirmativeButton(); 

     Button getCancelButton(); 

     Widget asWidget(); 

     public void center(); 

     public void hide(); 

     public void setHeader(String text); 
    } 
    private Display display; 
    private String header; 
    private String dialogText; 
    private String cancelButtonText; 
    private String affirmativeButtonText; 

    protected DialogBoxPresenter() { 
    } 

    public DialogBoxPresenter(Display display, String header, String dialogText, String cancelButtonText, String affirmativeButtonText) { 
     this.display = display; 
     this.header = header; 
     this.dialogText = dialogText; 
     this.cancelButtonText = cancelButtonText; 
     this.affirmativeButtonText = affirmativeButtonText; 

     bind(); 
    } 

    public DialogBoxPresenter(Display display, String header, String dialogText) { 
     this.display = display; 
     this.header = header; 
     this.dialogText = dialogText; 
     this.cancelButtonText = "Cancel"; 
     this.affirmativeButtonText = "OK"; 

     bind(); 
    } 

    private void bind() { 

     this.display.getDialogText().setText(dialogText); 
     this.display.getAffirmativeButton().setText(affirmativeButtonText); 
     this.display.getCancelButton().setText(cancelButtonText); 
     this.display.setHeader(header); 

     addClickHandlers(); 

    } 

    private void addClickHandlers() { 
     this.display.getAffirmativeButton().addClickHandler(new ClickHandler() { 

      @Override 
      public void onClick(ClickEvent event) { 
       doAffirmative(); 
      } 
     }); 

     this.display.getCancelButton().addClickHandler(new ClickHandler() { 

      @Override 
      public void onClick(ClickEvent event) { 
       doCancel(); 
      } 
     }); 
    } 

    private void doAffirmative() { 
     //do something 
     display.hide(); 
    } 

    private void doCancel() { 
     //do something 
     display.hide(); 
    } 

    public void init() { 
     display.center(); 
    } 

    @Override 
    public void go(HasWidgets container) { 
     container.clear(); 
     container.add(display.asWidget()); 
    } 
} 

y mi punto de vista:

public class DialogBoxView extends DialogBox implements DialogBoxPresenter.Display { 

    private Label dialogText; 
    private Button affirmativeButton; 
    private Button cancelButton; 
    private VerticalPanel container; 

    public DialogBoxView() { 
     //init items 
     dialogText = new Label(); 

     affirmativeButton = new Button(); 
     cancelButton = new Button(); 

     container = new VerticalPanel(); 

     setGlassEnabled(true); 
     setAnimationEnabled(true); 
     setModal(false); 

     init(); 
    } 

    private void init() { 
     //add items 
     container.add(dialogText); 

     HorizontalPanel hp = new HorizontalPanel(); 
     hp.add(affirmativeButton); 
     hp.add(cancelButton); 

     container.add(hp); 
     this.add(container); 
    } 

    @Override 
    public Widget asWidget() { 
     return this; 
    } 

    @Override 
    public Label getDialogText() { 
     return dialogText; 
    } 

    @Override 
    public Button getAffirmativeButton() { 
     return affirmativeButton; 
    } 

    @Override 
    public Button getCancelButton() { 
     return cancelButton; 
    } 

    @Override 
    public void setHeader(String text) { 
     this.setText(text); 
    } 

} 

Respuesta

19

No vas a ser capaz de hacer que funcione exactamente de la misma manera que Window.confirm(). El problema es que todos los javascript en una página web se ejecutan en un solo hilo. Notarás que siempre que se abra un diálogo de confirmación estándar, el resto de la página se agotará. Eso es porque el único hilo de JavaScript está bloqueado, esperando que regrese el confirm(). Si creara un método similar para su diálogo, siempre que estuviera esperando que el método retorne, no se procesarán los eventos generados por el usuario, por lo que su diálogo no funcionaría. Espero que tenga sentido.

Lo mejor que podrá hacer es similar a lo que hace la biblioteca GWT para llamadas RPC: la interfaz AsyncCallback. Incluso se puede volver a utilizar esa interfaz usted mismo, o si lo prefiere, a rodar su propia:

public interface DialogCallback { 
    void onOk(); 
    void onCancel(); 
} 

En lugar de Window.confirm(String), su firma método será más como Dialog.confirm(String,DialogCallback). A continuación, su cuadro de diálogo solo guarda una referencia a la devolución de llamada que se transfirió, y donde tiene // do something en su código, realiza llamadas a onOk y onCancel.

+0

Eso funciona. Gracias Señor. Voy a publicar mi código en otra respuesta para cualquier persona que tenga curiosidad. – KevMo

8

Aquí está el código que tengo funcionando si alguien tiene curiosidad.

public class DialogBoxPresenter implements Presenter { 

     public interface Display { 

      Label getDialogText(); 

      Button getAffirmativeButton(); 

      Button getCancelButton(); 

      Widget asWidget(); 

      public void center(); 

      public void hide(); 

      public void setHeader(String text); 
     } 
     private Display display; 
     private String header; 
     private String dialogText; 
     private String cancelButtonText; 
     private String affirmativeButtonText; 
     private ConfirmDialogCallback confirmCallback; 
     private AlertDialogCallback alertCallback; 

     protected DialogBoxPresenter() { 
     } 

     public DialogBoxPresenter(Display display, String header, String dialogText, String cancelButtonText, String affirmativeButtonText, ConfirmDialogCallback callback) { 
      this.display = display; 
      this.header = header; 
      this.dialogText = dialogText; 
      this.cancelButtonText = cancelButtonText; 
      this.affirmativeButtonText = affirmativeButtonText; 
      this.confirmCallback = callback; 

      bind(); 
     } 

     public DialogBoxPresenter(Display display, String header, String dialogText, String affirmativeButtonText, AlertDialogCallback callback) { 
      this.display = display; 
      this.header = header; 
      this.dialogText = dialogText; 
      this.affirmativeButtonText = affirmativeButtonText; 
      this.alertCallback = callback; 

      this.display.getCancelButton().setVisible(false); 

      bind(); 
     } 

     private void bind() { 

      this.display.getDialogText().setText(dialogText); 
      this.display.getAffirmativeButton().setText(affirmativeButtonText); 
      this.display.getCancelButton().setText(cancelButtonText); 
      this.display.setHeader(header); 

      addClickHandlers(); 

     } 

     private void addClickHandlers() { 
      this.display.getAffirmativeButton().addClickHandler(new ClickHandler() { 

       @Override 
       public void onClick(ClickEvent event) { 
        doAffirmative(); 
       } 
      }); 

      this.display.getCancelButton().addClickHandler(new ClickHandler() { 

       @Override 
       public void onClick(ClickEvent event) { 
        doCancel(); 
       } 
      }); 
     } 

     private void doAffirmative() { 
      if (confirmCallback != null) { 
       confirmCallback.onAffirmative(); 
      } else { 
       alertCallback.onAffirmative(); 
      } 
      display.hide(); 
     } 

     private void doCancel() { 
      confirmCallback.onCancel(); 
      display.hide(); 
     } 

     public void init() { 
      display.center(); 
     } 

     @Override 
     public void go(HasWidgets container) { 
      container.clear(); 
      container.add(display.asWidget()); 
     } 
    } 




    public class DialogBoxView extends DialogBox implements DialogBoxPresenter.Display { 

     private Label dialogText; 
     private Button affirmativeButton; 
     private Button cancelButton; 
     private VerticalPanel container; 

     public DialogBoxView() { 
      //init items 
      dialogText = new Label(); 

      affirmativeButton = new Button(); 
      cancelButton = new Button(); 

      container = new VerticalPanel(); 

      setGlassEnabled(true); 
      setAnimationEnabled(true); 
      setModal(false); 

      init(); 
     } 

     private void init() { 
      //add items 
      container.add(dialogText); 

      HorizontalPanel hp = new HorizontalPanel(); 
      hp.add(affirmativeButton); 
      hp.add(cancelButton); 

      container.add(hp); 
      this.add(container); 
     } 

     @Override 
     public Widget asWidget() { 
      return this; 
     } 

     @Override 
     public Label getDialogText() { 
      return dialogText; 
     } 

     @Override 
     public Button getAffirmativeButton() { 
      return affirmativeButton; 
     } 

     @Override 
     public Button getCancelButton() { 
      return cancelButton; 
     } 

     @Override 
     public void setHeader(String text) { 
      this.setText(text); 
     } 

    } 


    public class DialogBoxWidget implements LensooConstant { 

     private static DialogBoxView view = null; 
     private static DialogBoxPresenter presenter = null; 

     public static DialogBoxPresenter confirm(String header, String dialogText, String cancelButtonText, String affirmativeButtonText, ConfirmDialogCallback callback) { 
      view = new DialogBoxView(); 
      presenter = new DialogBoxPresenter(view, header, dialogText, cancelButtonText, affirmativeButtonText, callback); 

      presenter.init(); 

      return presenter; 
     } 

     public static DialogBoxPresenter confirm(String header, String dialogText, ConfirmDialogCallback callback) { 
      return DialogBoxWidget.confirm(header, dialogText, constants.cancelButton(), constants.okButton(), callback); 
     } 

     public static DialogBoxPresenter alert(String header, String dialogText, String affirmativeButtonText, AlertDialogCallback callback) { 
      view = new DialogBoxView(); 
      presenter = new DialogBoxPresenter(view, header, dialogText, affirmativeButtonText, callback); 

      presenter.init(); 

      return presenter; 
     } 

     public static DialogBoxPresenter alert(String header, String dialogText, AlertDialogCallback callback) { 
      return DialogBoxWidget.alert(header, dialogText, constants.okButton(), callback); 
     } 

     protected DialogBoxWidget() { 
     } 
    } 

public interface AlertDialogCallback { 

    void onAffirmative(); 

} 

public interface ConfirmDialogCallback { 

    void onAffirmative(); 

    void onCancel(); 
} 
+0

¿Qué es LensooConstant? Gracias. – Eugen

+0

Oh, lo siento. No me di cuenta de que lo dejé allí. Es solo una interfaz que contiene mis constantes de cadena para diferentes idiomas. Fue una manera tonta de implementarlo, y desde entonces ha sido cambiado. – KevMo

+0

¡Gran ejemplo de MVP simple! – MatejC

Cuestiones relacionadas