00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "gui/register.h"
00023
00024 #include "configuration.h"
00025 #include "log.h"
00026 #include "logindata.h"
00027 #include "main.h"
00028
00029 #include "gui/login.h"
00030 #include "gui/ok_dialog.h"
00031
00032 #include "gui/widgets/button.h"
00033 #include "gui/widgets/checkbox.h"
00034 #include "gui/widgets/label.h"
00035 #include "gui/widgets/layout.h"
00036 #include "gui/widgets/passwordfield.h"
00037 #include "gui/widgets/radiobutton.h"
00038 #include "gui/widgets/textfield.h"
00039
00040 #include "utils/gettext.h"
00041 #include "utils/strprintf.h"
00042 #include "utils/stringutils.h"
00043
00044 void WrongDataNoticeListener::setTarget(gcn::TextField *textField)
00045 {
00046 mTarget = textField;
00047 }
00048
00049 void WrongDataNoticeListener::action(const gcn::ActionEvent &event)
00050 {
00051 if (event.getId() == "ok")
00052 mTarget->requestFocus();
00053 }
00054
00055 RegisterDialog::RegisterDialog(LoginData *loginData):
00056 Window(_("Register")),
00057 mWrongDataNoticeListener(new WrongDataNoticeListener),
00058 mLoginData(loginData)
00059 {
00060 gcn::Label *userLabel = new Label(_("Name:"));
00061 gcn::Label *passwordLabel = new Label(_("Password:"));
00062 gcn::Label *confirmLabel = new Label(_("Confirm:"));
00063 #ifdef EATHENA_SUPPORT
00064 gcn::Label *serverLabel = new Label(_("Server:"));
00065 gcn::Label *portLabel = new Label(_("Port:"));
00066 #else
00067 gcn::Label *emailLabel = new Label(_("Email:"));
00068 #endif
00069 mUserField = new TextField(loginData->username);
00070 mPasswordField = new PasswordField(loginData->password);
00071 mConfirmField = new PasswordField;
00072 #ifdef EATHENA_SUPPORT
00073 mServerField = new TextField(loginData->hostname);
00074 mPortField = new TextField(toString(loginData->port));
00075 mMaleButton = new RadioButton(_("Male"), "sex", true);
00076 mFemaleButton = new RadioButton(_("Female"), "sex", false);
00077 #else
00078 mEmailField = new TextField;
00079 #endif
00080 mRegisterButton = new Button(_("Register"), "register", this);
00081 mCancelButton = new Button(_("Cancel"), "cancel", this);
00082
00083 ContainerPlacer place;
00084 place = getPlacer(0, 0);
00085 place(0, 0, userLabel);
00086 place(0, 1, passwordLabel);
00087 place(0, 2, confirmLabel);
00088 #ifdef EATHENA_SUPPORT
00089 place(1, 3, mMaleButton);
00090 place(2, 3, mFemaleButton);
00091 place(0, 4, serverLabel);
00092 place(0, 5, portLabel);
00093 #else
00094 place(0, 3, emailLabel);
00095 #endif
00096 place(1, 0, mUserField, 3).setPadding(2);
00097 place(1, 1, mPasswordField, 3).setPadding(2);
00098 place(1, 2, mConfirmField, 3).setPadding(2);
00099 #ifdef EATHENA_SUPPORT
00100 place(1, 4, mServerField, 3).setPadding(2);
00101 place(1, 5, mPortField, 3).setPadding(2);
00102 #else
00103 place(1, 3, mEmailField, 3).setPadding(2);
00104 #endif
00105 place = getPlacer(0, 2);
00106 place(1, 0, mRegisterButton);
00107 place(2, 0, mCancelButton);
00108 reflowLayout(250, 0);
00109
00110 mUserField->addKeyListener(this);
00111 mPasswordField->addKeyListener(this);
00112 mConfirmField->addKeyListener(this);
00113 #ifdef EATHENA_SUPPORT
00114 mServerField->addKeyListener(this);
00115 mPortField->addKeyListener(this);
00116 #endif
00117
00118
00119
00120
00121
00122
00123 mUserField->setActionEventId("register");
00124 mPasswordField->setActionEventId("register");
00125 mConfirmField->setActionEventId("register");
00126
00127 mUserField->addActionListener(this);
00128 mPasswordField->addActionListener(this);
00129 mConfirmField->addActionListener(this);
00130
00131 #ifdef EATHENA_SUPPORT
00132 mServerField->setActionEventId("register");
00133 mPortField->setActionEventId("register");
00134
00135 mServerField->addActionListener(this);
00136 mPortField->addActionListener(this);
00137 #endif
00138
00139 center();
00140 setVisible(true);
00141 mUserField->requestFocus();
00142 mUserField->setCaretPosition(mUserField->getText().length());
00143
00144 mRegisterButton->setEnabled(canSubmit());
00145 }
00146
00147 RegisterDialog::~RegisterDialog()
00148 {
00149 delete mWrongDataNoticeListener;
00150 }
00151
00152 void RegisterDialog::action(const gcn::ActionEvent &event)
00153 {
00154 if (event.getId() == "cancel")
00155 {
00156 state = STATE_LOGIN;
00157 }
00158 else if (event.getId() == "register" && canSubmit())
00159 {
00160 const std::string user = mUserField->getText();
00161 logger->log("RegisterDialog::register Username is %s", user.c_str());
00162
00163 std::string errorMsg;
00164 int error = 0;
00165
00166 if (user.length() < LEN_MIN_USERNAME)
00167 {
00168
00169 errorMsg = strprintf
00170 (_("The username needs to be at least %d characters long."),
00171 LEN_MIN_USERNAME);
00172 error = 1;
00173 }
00174 else if (user.length() > LEN_MAX_USERNAME - 1 )
00175 {
00176
00177 errorMsg = strprintf
00178 (_("The username needs to be less than %d characters long."),
00179 LEN_MAX_USERNAME);
00180 error = 1;
00181 }
00182 else if (mPasswordField->getText().length() < LEN_MIN_PASSWORD)
00183 {
00184
00185 errorMsg = strprintf
00186 (_("The password needs to be at least %d characters long."),
00187 LEN_MIN_PASSWORD);
00188 error = 2;
00189 }
00190 else if (mPasswordField->getText().length() > LEN_MAX_PASSWORD - 1 )
00191 {
00192
00193 errorMsg = strprintf
00194 (_("The password needs to be less than %d characters long."),
00195 LEN_MAX_PASSWORD);
00196 error = 2;
00197 }
00198 else if (mPasswordField->getText() != mConfirmField->getText())
00199 {
00200
00201 errorMsg = _("Passwords do not match.");
00202 error = 2;
00203 }
00204
00205
00206
00207 if (error > 0)
00208 {
00209 if (error == 1)
00210 {
00211 mWrongDataNoticeListener->setTarget(this->mUserField);
00212 }
00213 else if (error == 2)
00214 {
00215
00216 mPasswordField->setText("");
00217 mConfirmField->setText("");
00218
00219 mWrongDataNoticeListener->setTarget(this->mPasswordField);
00220 }
00221
00222 OkDialog *dlg = new OkDialog(_("Error"), errorMsg);
00223 dlg->addActionListener(mWrongDataNoticeListener);
00224 }
00225 else
00226 {
00227
00228 mRegisterButton->setEnabled(false);
00229
00230 mLoginData->username = mUserField->getText();
00231 mLoginData->password = mPasswordField->getText();
00232 #ifdef EATHENA_SUPPORT
00233 mLoginData->hostname = mServerField->getText();
00234 mLoginData->port = getUShort(mPortField->getText());
00235 mLoginData->sex =
00236 mFemaleButton->isSelected() ? GENDER_FEMALE : GENDER_MALE;
00237 #else
00238 mLoginData->email = mEmailField->getText();
00239 #endif
00240 mLoginData->registerLogin = true;
00241
00242 #ifdef TMWSERV_SUPPORT
00243 state = STATE_REGISTER_ATTEMPT;
00244 #else
00245 state = STATE_ACCOUNT;
00246 #endif
00247 }
00248 }
00249 }
00250
00251 void RegisterDialog::keyPressed(gcn::KeyEvent &keyEvent)
00252 {
00253 mRegisterButton->setEnabled(canSubmit());
00254 }
00255
00256 bool RegisterDialog::canSubmit() const
00257 {
00258 return !mUserField->getText().empty() &&
00259 !mPasswordField->getText().empty() &&
00260 !mConfirmField->getText().empty() &&
00261 #ifdef EATHENA_SUPPORT
00262 !mServerField->getText().empty() &&
00263 isUShort(mPortField->getText()) &&
00264 #endif
00265 state == STATE_REGISTER;
00266 }
00267
00268 #ifdef EATHENA_SUPPORT
00269 bool RegisterDialog::isUShort(const std::string &str)
00270 {
00271 if (str.empty())
00272 {
00273 return false;
00274 }
00275 unsigned long l = 0;
00276 for (std::string::const_iterator strPtr = str.begin(), strEnd = str.end();
00277 strPtr != strEnd; ++strPtr)
00278 {
00279 if (*strPtr < '0' || *strPtr > '9')
00280 {
00281 return false;
00282 }
00283 l = l * 10 + (*strPtr - '0');
00284 if (l > 65535)
00285 {
00286 return false;
00287 }
00288 }
00289 return true;
00290 }
00291
00292 unsigned short RegisterDialog::getUShort(const std::string &str)
00293 {
00294 unsigned long l = 0;
00295 for (std::string::const_iterator strPtr = str.begin(), strEnd = str.end();
00296 strPtr != strEnd; ++strPtr)
00297 {
00298 l = l * 10 + (*strPtr - '0');
00299 }
00300 return static_cast<unsigned short>(l);
00301 }
00302 #endif