00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "gui/serverdialog.h"
00023
00024 #include "gui/ok_dialog.h"
00025
00026 #include "gui/widgets/button.h"
00027 #include "gui/widgets/dropdown.h"
00028 #include "gui/widgets/label.h"
00029 #include "gui/widgets/layout.h"
00030 #include "gui/widgets/textfield.h"
00031
00032 #include "configuration.h"
00033 #include "log.h"
00034 #include "logindata.h"
00035 #include "main.h"
00036
00037 #include "utils/gettext.h"
00038 #include "utils/stringutils.h"
00039
00040 #include <cstdlib>
00041 #include <iostream>
00042 #include <string>
00043
00044 const short MAX_SERVERLIST = 5;
00045
00046 int ServersListModel::getNumberOfElements()
00047 {
00048 return servers.size();
00049 }
00050
00051 std::string ServersListModel::getElementAt(int elementIndex)
00052 {
00053 std::string myServer = "";
00054 myServer = servers.at(elementIndex).serverName;
00055 myServer += ":";
00056 myServer += toString(servers.at(elementIndex).port);
00057 return myServer;
00058 }
00059
00060 void ServersListModel::addFirstElement(Server server)
00061 {
00062
00063 std::vector<Server>::iterator MyIterator = servers.begin();
00064 servers.insert(MyIterator, 1, server);
00065 }
00066
00067 void ServersListModel::addElement(Server server)
00068 {
00069 servers.push_back(server);
00070 }
00071
00072 ServerDialog::ServerDialog(LoginData *loginData):
00073 Window(_("Choose your server")), mLoginData(loginData)
00074 {
00075 gcn::Label *serverLabel = new Label(_("Server:"));
00076 gcn::Label *portLabel = new Label(_("Port:"));
00077 mServerNameField = new TextField(mLoginData->hostname);
00078 mPortField = new TextField(toString(mLoginData->port));
00079
00080
00081 mMostUsedServersListModel = new ServersListModel;
00082 Server currentServer;
00083 std::string currentConfig = "";
00084 for (int i=0; i<=MAX_SERVERLIST; i++)
00085 {
00086 currentServer.serverName = "";
00087 currentServer.port = 0;
00088
00089 currentConfig = "MostUsedServerName" + toString(i);
00090 currentServer.serverName = config.getValue(currentConfig, "");
00091
00092 currentConfig = "MostUsedServerPort" + toString(i);
00093 currentServer.port = (short)atoi(config.getValue(currentConfig, "").c_str());
00094 if (!currentServer.serverName.empty() || currentServer.port != 0)
00095 {
00096 mMostUsedServersListModel->addElement(currentServer);
00097 }
00098 }
00099
00100 mMostUsedServersDropDown = new DropDown(mMostUsedServersListModel);
00101
00102 mOkButton = new Button(_("Ok"), "connect", this);
00103 mCancelButton = new Button(_("Cancel"), "cancel", this);
00104
00105 mServerNameField->setActionEventId("connect");
00106 mPortField->setActionEventId("connect");
00107 mMostUsedServersDropDown->setActionEventId("changeSelection");
00108
00109 mServerNameField->addActionListener(this);
00110 mPortField->addActionListener(this);
00111 mMostUsedServersDropDown->addActionListener(this);
00112
00113 place(0, 0, serverLabel);
00114 place(0, 1, portLabel);
00115 place(1, 0, mServerNameField, 3).setPadding(2);
00116 place(1, 1, mPortField, 3).setPadding(2);
00117 place(0, 2, mMostUsedServersDropDown, 4).setPadding(2);
00118 place(2, 3, mOkButton);
00119 place(3, 3, mCancelButton);
00120 reflowLayout(250, 0);
00121
00122 setLocationRelativeTo(getParent());
00123 setVisible(true);
00124
00125 if (mServerNameField->getText().empty()) {
00126 mServerNameField->requestFocus();
00127 } else {
00128 if (mPortField->getText().empty()) {
00129 mPortField->requestFocus();
00130 } else {
00131 mOkButton->requestFocus();
00132 }
00133 }
00134 }
00135
00136 ServerDialog::~ServerDialog()
00137 {
00138 delete mMostUsedServersListModel;
00139 }
00140
00141 void
00142 ServerDialog::action(const gcn::ActionEvent &event)
00143 {
00144 if (event.getId() == "ok")
00145 {
00146
00147 mServerNameField->requestFocus();
00148 }
00149 else if (event.getId() == "changeSelection")
00150 {
00151
00152 Server myServer = mMostUsedServersListModel->getServer
00153 (mMostUsedServersDropDown->getSelected());
00154 mServerNameField->setText(myServer.serverName);
00155 mPortField->setText(toString(myServer.port));
00156 }
00157 else if (event.getId() == "connect")
00158 {
00159
00160 if (mServerNameField->getText().empty() || mPortField->getText().empty())
00161 {
00162 OkDialog *dlg = new OkDialog(_("Error"),
00163 _("Please type both the address and the port of a server."));
00164 dlg->addActionListener(this);
00165 }
00166 else
00167 {
00168 mLoginData->hostname = mServerNameField->getText();
00169 mLoginData->port = (short) atoi(mPortField->getText().c_str());
00170 mOkButton->setEnabled(false);
00171 mCancelButton->setEnabled(false);
00172
00173
00174 Server currentServer;
00175 bool newEntry = true;
00176 for (int i = 0; i < mMostUsedServersListModel->getNumberOfElements(); i++)
00177 {
00178 currentServer = mMostUsedServersListModel->getServer(i);
00179 if (currentServer.serverName == mLoginData->hostname &&
00180 currentServer.port == mLoginData->port)
00181 newEntry = false;
00182 }
00183
00184 currentServer.serverName = mLoginData->hostname;
00185 currentServer.port = mLoginData->port;
00186 if (newEntry)
00187 mMostUsedServersListModel->addFirstElement(currentServer);
00188
00189 std::string currentConfig = "";
00190 for (int i = 0; i < mMostUsedServersListModel->getNumberOfElements(); i++)
00191 {
00192 currentServer = mMostUsedServersListModel->getServer(i);
00193
00194 currentConfig = "MostUsedServerName" + toString(i);
00195 config.setValue(currentConfig, currentServer.serverName);
00196
00197 currentConfig = "MostUsedServerPort" + toString(i);
00198 config.setValue(currentConfig, toString(currentServer.port));
00199 }
00200 state = STATE_CONNECT_ACCOUNT;
00201 }
00202 }
00203 else if (event.getId() == "cancel")
00204 {
00205 state = STATE_FORCE_QUIT;
00206 }
00207 }