00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "gui/login.h"
00023
00024 #include "gui/ok_dialog.h"
00025
00026 #include "gui/widgets/button.h"
00027 #include "gui/widgets/checkbox.h"
00028 #include "gui/widgets/dropdown.h"
00029 #include "gui/widgets/label.h"
00030 #include "gui/widgets/layout.h"
00031 #include "gui/widgets/passwordfield.h"
00032 #include "gui/widgets/textfield.h"
00033
00034 #include "main.h"
00035 #include "logindata.h"
00036 #include "configuration.h"
00037
00038 #include "utils/gettext.h"
00039 #include "utils/stringutils.h"
00040
00041 static const int MAX_SERVER_LIST_SIZE = 5;
00042 static const int LOGIN_DIALOG_WIDTH = 220;
00043 static const int LOGIN_DIALOG_HEIGHT = 140;
00044 static const int FIELD_WIDTH = LOGIN_DIALOG_WIDTH - 70;
00045
00046 LoginDialog::LoginDialog(LoginData *loginData):
00047 Window(_("Login")),
00048 mLoginData(loginData)
00049 {
00050 gcn::Label *userLabel = new Label(_("Name:"));
00051 gcn::Label *passLabel = new Label(_("Password:"));
00052 #ifdef EATHENA_SUPPORT
00053 gcn::Label *serverLabel = new Label(_("Server:"));
00054 gcn::Label *portLabel = new Label(_("Port:"));
00055 gcn::Label *dropdownLabel = new Label(_("Recent:"));
00056 std::vector<std::string> dfltServer;
00057 dfltServer.push_back("server.themanaworld.org");
00058 std::vector<std::string> dfltPort;
00059 dfltPort.push_back("6901");
00060 mServerList = new DropDownList("MostRecent00", dfltServer, dfltPort,
00061 MAX_SERVER_LIST_SIZE);
00062 #endif
00063
00064 mUserField = new TextField(mLoginData->username);
00065 mPassField = new PasswordField(mLoginData->password);
00066 #ifdef EATHENA_SUPPORT
00067 mServerField = new TextField(mServerList->getServerAt(0));
00068 mPortField = new TextField(mServerList->getPortAt(0));
00069 mServerDropDown = new DropDown(mServerList);
00070 #endif
00071
00072 mKeepCheck = new CheckBox(_("Remember Username"), mLoginData->remember);
00073 mOkButton = new Button(_("OK"), "ok", this);
00074 mCancelButton = new Button(_("Cancel"), "cancel", this);
00075 mRegisterButton = new Button(_("Register"), "register", this);
00076
00077 mUserField->setActionEventId("ok");
00078 mPassField->setActionEventId("ok");
00079 #ifdef EATHENA_SUPPORT
00080 mServerField->setActionEventId("ok");
00081 mPortField->setActionEventId("ok");
00082 mServerDropDown->setActionEventId("changeSelection");
00083 #endif
00084
00085 mUserField->addKeyListener(this);
00086 mPassField->addKeyListener(this);
00087 #ifdef EATHENA_SUPPORT
00088 mServerField->addKeyListener(this);
00089 mPortField->addKeyListener(this);
00090 mServerDropDown->addKeyListener(this);
00091 #endif
00092 mUserField->addActionListener(this);
00093 mPassField->addActionListener(this);
00094 #ifdef EATHENA_SUPPORT
00095 mServerField->addActionListener(this);
00096 mPortField->addActionListener(this);
00097 mServerDropDown->addActionListener(this);
00098 mKeepCheck->addActionListener(this);
00099 #endif
00100
00101 place(0, 0, userLabel);
00102 place(0, 1, passLabel);
00103 #ifdef EATHENA_SUPPORT
00104 place(0, 2, serverLabel);
00105 place(0, 3, portLabel);
00106 place(0, 4, dropdownLabel);
00107 #endif
00108 place(1, 0, mUserField, 3).setPadding(1);
00109 place(1, 1, mPassField, 3).setPadding(1);
00110 #ifdef EATHENA_SUPPORT
00111 place(1, 2, mServerField, 3).setPadding(1);
00112 place(1, 3, mPortField, 3).setPadding(1);
00113 place(1, 4, mServerDropDown, 3).setPadding(1);
00114 #endif
00115 place(0, 5, mKeepCheck, 4);
00116 place(0, 6, mRegisterButton).setHAlign(LayoutCell::LEFT);
00117 place(2, 6, mCancelButton);
00118 place(3, 6, mOkButton);
00119 reflowLayout(250, 0);
00120
00121 center();
00122 setVisible(true);
00123
00124 if (mUserField->getText().empty())
00125 mUserField->requestFocus();
00126 else
00127 mPassField->requestFocus();
00128
00129 mOkButton->setEnabled(canSubmit());
00130 }
00131
00132 LoginDialog::~LoginDialog()
00133 {
00134 #ifdef EATHENA_SUPPORT
00135 delete mServerList;
00136 #endif
00137 }
00138
00139 void LoginDialog::action(const gcn::ActionEvent &event)
00140 {
00141 if (event.getId() == "ok" && canSubmit())
00142 {
00143 #ifdef EATHENA_SUPPORT
00144 mLoginData->hostname = mServerField->getText();
00145 mLoginData->port = getUShort(mPortField->getText());
00146 #endif
00147 mLoginData->username = mUserField->getText();
00148 mLoginData->password = mPassField->getText();
00149 mLoginData->remember = mKeepCheck->isSelected();
00150 mLoginData->registerLogin = false;
00151
00152 mOkButton->setEnabled(false);
00153 mRegisterButton->setEnabled(false);
00154 #ifdef EATHENA_SUPPORT
00155 mServerList->save(mServerField->getText(), mPortField->getText());
00156 state = STATE_ACCOUNT;
00157 #else
00158 state = STATE_LOGIN_ATTEMPT;
00159 #endif
00160 }
00161 #ifdef EATHENA_SUPPORT
00162 else if (event.getId() == "changeSelection")
00163 {
00164 int selected = mServerDropDown->getSelected();
00165 mServerField->setText(mServerList->getServerAt(selected));
00166 mPortField->setText(mServerList->getPortAt(selected));
00167 }
00168 #endif
00169 else if (event.getId() == "cancel")
00170 {
00171 #ifdef TMWSERV_SUPPORT
00172 state = STATE_SWITCH_ACCOUNTSERVER;
00173 #else
00174 state = STATE_EXIT;
00175 #endif
00176 }
00177 else if (event.getId() == "register")
00178 {
00179 #ifdef EATHENA_SUPPORT
00180
00181 mLoginData->hostname = mServerField->getText();
00182
00183 if (isUShort(mPortField->getText()))
00184 mLoginData->port = getUShort(mPortField->getText());
00185 else
00186 mLoginData->port = 6901;
00187 #endif
00188
00189 mLoginData->username = mUserField->getText();
00190 mLoginData->password = mPassField->getText();
00191
00192 state = STATE_REGISTER;
00193 }
00194 }
00195
00196 void LoginDialog::keyPressed(gcn::KeyEvent &keyEvent)
00197 {
00198 mOkButton->setEnabled(canSubmit());
00199 }
00200
00201 bool LoginDialog::canSubmit()
00202 {
00203 return !mUserField->getText().empty() &&
00204 !mPassField->getText().empty() &&
00205 #ifdef EATHENA_SUPPORT
00206 !mServerField->getText().empty() &&
00207 isUShort(mPortField->getText()) &&
00208 #endif
00209 state == STATE_LOGIN;
00210 }
00211
00212 #ifdef EATHENA_SUPPORT
00213 bool LoginDialog::isUShort(const std::string &str)
00214 {
00215 if (str.empty())
00216 {
00217 return false;
00218 }
00219 unsigned long l = 0;
00220 for (std::string::const_iterator strPtr = str.begin(), strEnd = str.end();
00221 strPtr != strEnd; ++strPtr)
00222 {
00223 if (*strPtr < '0' || *strPtr > '9')
00224 return false;
00225
00226 l = l * 10 + (*strPtr - '0');
00227
00228 if (l > 65535)
00229 return false;
00230 }
00231 return true;
00232 }
00233
00234 unsigned short LoginDialog::getUShort(const std::string &str)
00235 {
00236 unsigned long l = 0;
00237 for (std::string::const_iterator strPtr = str.begin(), strEnd = str.end();
00238 strPtr != strEnd; ++strPtr)
00239 {
00240 l = l * 10 + (*strPtr - '0');
00241 }
00242 return static_cast<unsigned short>(l);
00243 }
00244
00249 void LoginDialog::DropDownList::saveEntry(const std::string &server,
00250 const std::string &port, int &saved)
00251 {
00252 if (saved < MAX_SERVER_LIST_SIZE && !server.empty())
00253 {
00254 config.setValue(mConfigPrefix + "Server" + toString(saved), server);
00255 config.setValue(mConfigPrefix + "Port" + toString(saved), port);
00256 ++saved;
00257 }
00258 }
00259
00260 LoginDialog::DropDownList::DropDownList(std::string prefix,
00261 std::vector<std::string> dflt,
00262 std::vector<std::string> dfltPort,
00263 int maxEntries) :
00264 mConfigPrefix(prefix),
00265 mMaxEntries(maxEntries)
00266 {
00267 for (int i = 0; i < maxEntries; ++i)
00268 {
00269 std::string server = config.getValue(mConfigPrefix + "Server" +
00270 toString(i), "");
00271 if (server.empty())
00272 {
00273 server = config.getValue(mConfigPrefix + "ServerList" +
00274 toString(i), "");
00275 }
00276 std::string port = config.getValue(mConfigPrefix + "Port" +
00277 toString(i), dfltPort.front());
00278
00279 if (!server.empty())
00280 {
00281 mServers.push_back(server);
00282 mPorts.push_back(port);
00283 }
00284 }
00285 if (mServers.empty())
00286 {
00287 mServers.assign(dflt.begin(), dflt.end());
00288 mPorts.assign(dfltPort.begin(), dfltPort.end());
00289 }
00290 }
00291
00292 void LoginDialog::DropDownList::save(const std::string &server,
00293 const std::string &port)
00294 {
00295 int position = 0;
00296 saveEntry(server, port, position);
00297 for (std::vector<std::string>::const_iterator sPtr = mServers.begin(),
00298 sEnd = mServers.end(),
00299 pPtr = mPorts.begin(),
00300 pEnd = mPorts.end();
00301 sPtr != sEnd && pPtr != pEnd;
00302 ++sPtr, ++pPtr)
00303 {
00304 if (*sPtr != server || *pPtr != port)
00305 saveEntry(*sPtr, *pPtr, position);
00306 }
00307 }
00308
00309 int LoginDialog::DropDownList::getNumberOfElements()
00310 {
00311 return mServers.size();
00312 }
00313
00314 std::string LoginDialog::DropDownList::getElementAt(int i)
00315 {
00316 if (i < 0 || i >= getNumberOfElements())
00317 return "";
00318
00319 return getServerAt(i) + ":" + getPortAt(i);
00320 }
00321
00322 std::string LoginDialog::DropDownList::getServerAt(int i)
00323 {
00324 if (i < 0 || i >= getNumberOfElements())
00325 return "";
00326
00327 return mServers.at(i);
00328 }
00329
00330 std::string LoginDialog::DropDownList::getPortAt(int i)
00331 {
00332 if (i < 0 || i >= getNumberOfElements())
00333 return "";
00334
00335 return mPorts.at(i);
00336 }
00337 #endif