/* Copyright 2011 Massimo Gengarelli <gengarel@cs.unibo.it> * This file is part of Floz Configurator. * Floz Configurator is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Floz Configurator is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Floz Configurator. If not, see http://www.gnu.org/licenses/. */ package it.unibo.cs.v2.client; import it.unibo.cs.v2.servlets.IsUsernameValid; import it.unibo.cs.v2.servlets.IsUsernameValidAsync; import it.unibo.cs.v2.servlets.RegisterUser; import it.unibo.cs.v2.servlets.RegisterUserAsync; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.event.dom.client.KeyDownHandler; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.PasswordTextBox; import com.google.gwt.user.client.ui.TextBox; public class RegistrationForm extends HTMLPanel implements ClickHandler, KeyUpHandler { private final TextBox username = new TextBox(); private final TextBox displayname = new TextBox(); private final Button submitButton = new Button("Register"); private final PasswordTextBox password = new PasswordTextBox(); private final FlexTable mainTable = new FlexTable(); private final IsUsernameValidAsync validProxy = (IsUsernameValidAsync) GWT.create(IsUsernameValid.class); private final RegisterUserAsync registerProxy = (RegisterUserAsync) GWT.create(RegisterUser.class); private final HTML resultLabel = new HTML(); public RegistrationForm() { super(""); resultLabel.setVisible(false); mainTable.setWidget(0, 0, new HTML("Your (real) name")); mainTable.setWidget(0, 1, displayname); mainTable.setWidget(1, 0, new HTML("Desired username")); mainTable.setWidget(1, 1, username); mainTable.setWidget(2, 0, new HTML("Password")); mainTable.setWidget(2, 1, password); mainTable.setWidget(3, 0, submitButton); add(mainTable); add(resultLabel); displayname.addKeyUpHandler(this); password.addKeyDownHandler(new SimpleHandler()); submitButton.addClickHandler(this); } @Override public void onClick(ClickEvent event) { submit(); } @Override public void onKeyUp(KeyUpEvent event) { if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) { submit(); } else { if (username.getText().length() < 8) username.setText(displayname.getText().toLowerCase().replace(' ', '_')); } } private void submit() { if (password.getText().length() < 8 || username.getText().length() < 4) { showLabel("Password or username too short, at least 8 characters must be used for password and 4 for username.", "red"); return; } validProxy.isUserNameValid(username.getText().toLowerCase(), new AsyncCallback<Boolean>() { @Override public void onSuccess(Boolean result) { if (!result) showLabel("Username " + username.getText() + " already taken", "red"); else { hideLabel(); registerProxy.registerUser(username.getText(), password.getText(), displayname.getText(), new AsyncCallback<Boolean>() { @Override public void onFailure(Throwable caught) { showLabel(caught.getMessage(), "red"); } @Override public void onSuccess(Boolean result) { if (result) { showLabel("User " + username.getText() + " successfully created. You can now login.", "green"); mainTable.setVisible(false); } else showLabel("An unknown error occured while creating the user. " + "This is not your fault, please contact the webmaster", "red"); } }); } } @Override public void onFailure(Throwable caught) { Window.alert(caught.getMessage()); } }); } private void showLabel(String message, String color) { resultLabel.setVisible(true); resultLabel.getElement().getStyle().setColor(color); resultLabel.setHTML(message); } public void hideLabel() { resultLabel.setVisible(false); } class SimpleHandler implements KeyDownHandler { @Override public void onKeyDown(KeyDownEvent event) { if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) submit(); } } }