00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "gui/serverselectdialog.h"
00023
00024 #include "gui/widgets/button.h"
00025 #include "gui/widgets/listbox.h"
00026 #include "gui/widgets/scrollarea.h"
00027
00028 #include "logindata.h"
00029 #include "main.h"
00030 #include "serverinfo.h"
00031
00032 #include "utils/gettext.h"
00033 #include "utils/stringutils.h"
00034
00035 extern SERVER_INFO **server_info;
00036
00040 class ServerListModel : public gcn::ListModel
00041 {
00042 public:
00043 virtual ~ServerListModel() {}
00044
00045 int getNumberOfElements();
00046 std::string getElementAt(int i);
00047 };
00048
00049 ServerSelectDialog::ServerSelectDialog(LoginData *loginData, int nextState):
00050 Window(_("Select Server")),
00051 mLoginData(loginData),
00052 mNextState(nextState)
00053 {
00054 mServerListModel = new ServerListModel;
00055 mServerList = new ListBox(mServerListModel);
00056 ScrollArea *mScrollArea = new ScrollArea(mServerList);
00057 mOkButton = new Button(_("OK"), "ok", this);
00058 Button *mCancelButton = new Button(_("Cancel"), "cancel", this);
00059
00060 setContentSize(200, 100);
00061
00062 mCancelButton->setPosition(
00063 200 - mCancelButton->getWidth() - 5,
00064 100 - mCancelButton->getHeight() - 5);
00065 mOkButton->setPosition(
00066 mCancelButton->getX() - mOkButton->getWidth() - 5,
00067 100 - mOkButton->getHeight() - 5);
00068 mScrollArea->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER);
00069 mScrollArea->setDimension(gcn::Rectangle(
00070 5, 5, 200 - 2 * 5,
00071 100 - 3 * 5 - mCancelButton->getHeight() -
00072 mScrollArea->getFrameSize()));
00073
00074 mServerList->setActionEventId("ok");
00075
00076
00077
00078 add(mScrollArea);
00079 add(mOkButton);
00080 add(mCancelButton);
00081
00082 if (n_server == 0)
00083
00084 mOkButton->setEnabled(false);
00085 else
00086
00087 mServerList->setSelected(1);
00088
00089 center();
00090 setVisible(true);
00091 mOkButton->requestFocus();
00092 }
00093
00094 ServerSelectDialog::~ServerSelectDialog()
00095 {
00096 delete mServerListModel;
00097 }
00098
00099 void ServerSelectDialog::action(const gcn::ActionEvent &event)
00100 {
00101 if (event.getId() == "ok")
00102 {
00103 mOkButton->setEnabled(false);
00104 const SERVER_INFO *si = server_info[mServerList->getSelected()];
00105 mLoginData->hostname = ipToString(si->address);
00106 mLoginData->port = si->port;
00107 mLoginData->updateHost = si->updateHost;
00108 state = mNextState;
00109 }
00110 else if (event.getId() == "cancel")
00111 state = STATE_LOGIN;
00112 }
00113
00114 int ServerListModel::getNumberOfElements()
00115 {
00116 return n_server;
00117 }
00118
00119 std::string ServerListModel::getElementAt(int i)
00120 {
00121 const SERVER_INFO *si = server_info[i];
00122 return si->name + " (" + toString(si->online_users) + ")";
00123 }