Search code examples
gwtgwt2uibinder

GWT - Implementing a DialogBox for Login purposes


For testing purposes, I want to use a DialogBox for logging into my application.

Here's the uibinder file:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
  xmlns:g="urn:import:com.google.gwt.user.client.ui">
  <ui:style>
  </ui:style>
    <g:HTMLPanel>
      <g:Label>Username</g:Label>
      <g:TextBox ui:field="username"></g:TextBox>
      <g:Label>Password</g:Label>
      <g:PasswordTextBox ui:field="password"></g:PasswordTextBox>
      <g:Button ui:field="login">Login</g:Button>
    </g:HTMLPanel>
</ui:UiBinder>

And here's my implementation of it:

public class Login extends DialogBox {
    private static LoginUiBinder uiBinder = GWT.create(LoginUiBinder.class);

    interface LoginUiBinder extends UiBinder<Widget, Login> {}

    @UiField
    TextBox username;
    @UiField
    PasswordTextBox password;
    @UiField
    Button login;

    public Login() {
        setHTML("Login");
        setWidget(uiBinder.createAndBindUi(this));
    }
}

Now my question is: Is this the correct way to do it? The documentation doesn't seem to say anything on how to do this sort of thing...


Solution

  • That's what I do, and it's been working great in production for months. It's super easy to understand and reuse.

    I made an abstract dialog with the same pattern that has an abstract method onConfirm and a built-in confirm button. I also include in the UiBinder a panel to accept a widget, and override the setWidget function to put the widget into that interior panel. Then, whenever I need a new dialog for something, I can just write:

    final CustomWidget whicheverWidgetINeedRightNow = xyz;
    CustomDialog dialog = new CustomDialog()
    {
        @Override
        protected void onConfirm()
        {
            process(whicheverWidgetINeedRightNow.getData());
        }
    };
    dialog.setWidget(whicheverWidgetINeedRightNow);
    

    The ok button in the template UiBinder is hard-wired to call onConfirm when it's pressed. Nifty! For more complex cases, I'd subclass CustomDialog in its own named class.

    It's worked well for me in maybe 5 or 6 different situations in my app, and I don't have to re-style or re-code anything.