Skip to content

Instantly share code, notes, and snippets.

@BinaryMuse
Created July 9, 2010 16:42
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BinaryMuse/469692 to your computer and use it in GitHub Desktop.
Save BinaryMuse/469692 to your computer and use it in GitHub Desktop.
GWT-Wizard Sample Code

Sample code from a page of the Fresno Pacific University Vehicle Reservation Wizard.

RequesterInfoPage.java defines the business logic for the page, as well as the Display interface for the UI; RequesterInfoPageView.java implements the Display interface. Notice that the view extends LazyComposite to lazily create the view on demand (the first time the page is shown).

package edu.fresno.gwt.vehiclereservation.client.page;
import java.util.ArrayList;
import java.util.List;
import net.binarymuse.gwt.client.ui.wizard.WizardPage;
import net.binarymuse.gwt.client.ui.wizard.event.NavigationEvent;
import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.ui.HasHTML;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.Widget;
import edu.fresno.gwt.vehiclereservation.shared.VehicleReservationContext;
public class RequesterInfoPage extends WizardPage<VehicleReservationContext> {
// The Display interface here defines methods that the
// view for this page must define. The presenter (this object)
// uses these methods to manipulate the view, without knowing
// the details of exactly how the view is implemented.
public interface Display {
// HasX methods for getting fields that present a value
HasValue<String> getRequesterNameValue();
HasValue<String> getRequesterEmailValue();
HasValue<String> getRequesterPhoneValue();
HasValue<String> getDepartmentBilledValue();
HasValue<String> getAccountNumberValue();
HasHTML getErrorHTML();
// Methods to implement various view functionality
void addKeyPressHandlers(KeyPressHandler handler);
void focusFirstBlankField();
void showErrors(List<String> errors);
// asWidget() allows the page to be added to the wizard
Widget asWidget();
}
public final static PageID PAGEID = new PageID();
public final Display view;
// Not technically good MVP practice here; ideally, we
// would use Dependency Injection to inject the view.
public RequesterInfoPage() {
view = new RequesterInfoPageView();
}
@Override
public PageID getPageID() {
return PAGEID;
}
@Override
public Widget asWidget() {
return view.asWidget();
}
@Override
public String getTitle() {
return "Requester Information";
}
// Fires only the first time the page is shown (before it is actually
// shown). Gets any values from the context that may have been set
// from previous pages (e.g. the login page) and sets the data
// in the view.
//
// Also does some other basic view setup, such as injecting a
// KeyPressHandler into the fields (so the user can go next by pressing
// the enter key) and setting the focus to the first blank field (using
// a DeferredCommand so that the code executes once the other events
// finish.)
@Override
public void beforeFirstShow() {
if(getContext().authFullname != null)
view.getRequesterNameValue().setValue(getContext().authFullname);
if(getContext().authEmail != null)
view.getRequesterEmailValue().setValue(getContext().authEmail);
view.addKeyPressHandlers(getWizard().getView().getHandlerFactory().getEnterKeyNextHandler());
DeferredCommand.addCommand(new Command() {
@Override
public void execute() {
view.focusFirstBlankField();
}
});
}
@Override
public void beforeShow() {
view.showErrors(null);
}
// Commits the data to the context when moving to the next page
// (assuming the data validates).
@Override
public void beforeNext(NavigationEvent event) {
if(!validate())
event.cancel();
getContext().requesterName = view.getRequesterNameValue().getValue();
getContext().requesterEmail = view.getRequesterEmailValue().getValue();
getContext().requesterPhone = view.getRequesterPhoneValue().getValue();
getContext().departmentName = view.getDepartmentBilledValue().getValue();
getContext().accountNumber = view.getAccountNumberValue().getValue();
}
@Override
public void afterNext() {
Log.debug("RequesterInfoPage afterNext()");
Log.debug(context.toString());
}
public boolean validate() {
List<String> errors = new ArrayList<String>();
if(view.getRequesterNameValue().getValue().isEmpty())
errors.add("You must provide your name.");
if(view.getRequesterEmailValue().getValue().isEmpty())
errors.add("You must provide your email address.");
if(view.getRequesterPhoneValue().getValue().isEmpty())
errors.add("You must provide your phone number.");
if(view.getDepartmentBilledValue().getValue().isEmpty())
errors.add("You must specify the department to be billed.");
if(view.getAccountNumberValue().getValue().isEmpty())
errors.add("You must specify the account number of the department to be billed.");
if(errors.size() == 0) {
view.showErrors(null);
return true;
} else {
view.showErrors(errors);
return false;
}
}
}
package edu.fresno.gwt.vehiclereservation.client.page;
import java.util.Iterator;
import java.util.List;
import net.binarymuse.gwt.client.ui.wizard.view.LazyComposite;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHTML;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
// View extends LazyComposite and doesn't use initWidget()--this allows
// the wizard to initialize the view only when it's ready to be displayed
// for the first time.
public class RequesterInfoPageView extends LazyComposite implements RequesterInfoPage.Display {
private FlowPanel panel;
private Grid grid;
private TextBox requesterName;
private TextBox requesterEmail;
private TextBox requesterPhone;
private TextBox departmentBilled;
private TextBox accountNumber;
private HTML errorHTML;
public RequesterInfoPageView() {
requesterName = new TextBox();
requesterEmail = new TextBox();
requesterPhone = new TextBox();
departmentBilled = new TextBox();
accountNumber = new TextBox();
errorHTML = new HTML();
requesterName.setWidth("200px");
requesterEmail.setWidth("200px");
requesterPhone.setWidth("200px");
departmentBilled.setWidth("200px");
accountNumber.setWidth("200px");
errorHTML.addStyleDependentName("error");
}
@Override
public Widget createWidget() {
panel = new FlowPanel();
grid = new Grid(5, 2);
grid.setWidget(0, 0, new Label("Requester Name:"));
grid.setWidget(0, 1, requesterName);
grid.setWidget(1, 0, new Label("Requester Email:"));
grid.setWidget(1, 1, requesterEmail);
grid.setWidget(2, 0, new Label("Requester Phone:"));
grid.setWidget(2, 1, requesterPhone);
grid.setWidget(3, 0, new Label("Dept. to be Billed:"));
grid.setWidget(3, 1, departmentBilled);
grid.setWidget(4, 0, new Label("Account Number:"));
grid.setWidget(4, 1, accountNumber);
panel.add(new HTML("<h1>Requester Information</h1>"));
panel.add(grid);
panel.add(errorHTML);
return panel;
}
@Override
public HasValue<String> getAccountNumberValue() {
return accountNumber;
}
@Override
public HasValue<String> getDepartmentBilledValue() {
return departmentBilled;
}
@Override
public HasHTML getErrorHTML() {
return errorHTML;
}
@Override
public HasValue<String> getRequesterEmailValue() {
return requesterEmail;
}
@Override
public HasValue<String> getRequesterNameValue() {
return requesterName;
}
@Override
public HasValue<String> getRequesterPhoneValue() {
return requesterPhone;
}
@Override
public void focusFirstBlankField() {
if(accountNumber.getValue().isEmpty())
accountNumber.setFocus(true);
if(departmentBilled.getValue().isEmpty())
departmentBilled.setFocus(true);
if(requesterPhone.getValue().isEmpty())
requesterPhone.setFocus(true);
if(requesterEmail.getValue().isEmpty())
requesterEmail.setFocus(true);
if(requesterName.getValue().isEmpty())
requesterName.setFocus(true);
}
@Override
public void showErrors(List<String> errors) {
if(errors == null || errors.size() == 0) {
errorHTML.setHTML("");
return;
}
Iterator<String> iter = errors.iterator();
StringBuilder sb = new StringBuilder(iter.next());
while(iter.hasNext()) {
sb.append("<br />").append(iter.next());
}
errorHTML.setHTML(sb.toString());
}
@Override
public void addKeyPressHandlers(KeyPressHandler handler) {
requesterName.addKeyPressHandler(handler);
requesterEmail.addKeyPressHandler(handler);
requesterPhone.addKeyPressHandler(handler);
departmentBilled.addKeyPressHandler(handler);
accountNumber.addKeyPressHandler(handler);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment