diff options
-rw-r--r-- | src/gui/customserverdialog.cpp | 208 | ||||
-rw-r--r-- | src/gui/customserverdialog.h | 98 |
2 files changed, 306 insertions, 0 deletions
diff --git a/src/gui/customserverdialog.cpp b/src/gui/customserverdialog.cpp new file mode 100644 index 000000000..b84595d0d --- /dev/null +++ b/src/gui/customserverdialog.cpp @@ -0,0 +1,208 @@ +/* + * The Mana Client + * Copyright (C) 2011-2012 The Mana Developers + * + * This file is part of The Mana Client. + * + * This program 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 2 of the License, or + * any later version. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "gui/customserverdialog.h" + +#include "configuration.h" + +#include "gui/okdialog.h" +#include "gui/sdlinput.h" +#include "gui/serverdialog.h" + +#include "gui/widgets/button.h" +#include "gui/widgets/dropdown.h" +#include "gui/widgets/label.h" +#include "gui/widgets/layout.h" +#include "gui/widgets/textfield.h" + +#include "utils/gettext.h" + +std::string TypeListModel::getElementAt(int elementIndex) +{ + if (elementIndex == 0) + return "TmwAthena"; + else if (elementIndex == 1) + return "ManaServ"; + else + return "Unknown"; +} + +CustomServerDialog::CustomServerDialog(ServerDialog *parent, int index): + Window(_("Custom Server"), true, parent), + mServerDialog(parent), + mIndex(index) +{ + setWindowName("CustomServerDialog"); + + Label *nameLabel = new Label(_("Name:")); + Label *serverAdressLabel = new Label(_("Address:")); + Label *portLabel = new Label(_("Port:")); + Label *typeLabel = new Label(_("Server type:")); + Label *descriptionLabel = new Label(_("Description:")); + mServerAddressField = new TextField(std::string()); + mPortField = new TextField(std::string()); + + mTypeListModel = new TypeListModel(); + mTypeField = new DropDown(mTypeListModel); + mTypeField->setSelected(0); // TmwAthena by default for now. + + mNameField = new TextField(std::string()); + mDescriptionField = new TextField(std::string()); + + mOkButton = new Button(_("Ok"), "addServer", this); + mCancelButton = new Button(_("Cancel"), "cancel", this); + + mServerAddressField->addActionListener(this); + mPortField->addActionListener(this); + + place(0, 0, nameLabel); + place(1, 0, mNameField, 4).setPadding(3); + place(0, 1, serverAdressLabel); + place(1, 1, mServerAddressField, 4).setPadding(3); + place(0, 2, portLabel); + place(1, 2, mPortField, 4).setPadding(3); + place(0, 3, typeLabel); + place(1, 3, mTypeField).setPadding(3); + place(0, 4, descriptionLabel); + place(1, 4, mDescriptionField, 4).setPadding(3); + place(4, 5, mOkButton); + place(3, 5, mCancelButton); + + // Do this manually instead of calling reflowLayout so we can enforce a + // minimum width. + int width = 0, height = 0; + getLayout().reflow(width, height); + if (width < 300) + { + width = 300; + getLayout().reflow(width, height); + } + if (height < 120) + { + height = 120; + getLayout().reflow(width, height); + } + + setContentSize(width, height); + + setMinWidth(getWidth()); + setMinHeight(getHeight()); + setDefaultSize(getWidth(), getHeight(), ImageRect::CENTER); + + setResizable(false); + addKeyListener(this); + + loadWindowState(); + + // Add the entry's info when in modify mode. + if (index > -1) + { + const ServerInfo &serverInfo = mServerDialog->mServers[index]; + mNameField->setText(serverInfo.name); + mDescriptionField->setText(serverInfo.description); + mServerAddressField->setText(serverInfo.hostname); + mPortField->setText(toString(serverInfo.port)); + mTypeField->setSelected(serverInfo.type ? ServerInfo::MANASERV : + ServerInfo::TMWATHENA); + } + + setLocationRelativeTo(getParentWindow()); + setVisible(true); + + mNameField->requestFocus(); +} + +CustomServerDialog::~CustomServerDialog() +{ + delete mTypeListModel; +} + +void CustomServerDialog::logic() +{ + Window::logic(); +} + +void CustomServerDialog::action(const gcn::ActionEvent &event) +{ + if (event.getId() == "ok") + { + // Give focus back to the server dialog. + mServerAddressField->requestFocus(); + } + if (event.getId() == "addServer") + { + // Check the given information + if (mServerAddressField->getText().empty() + || mPortField->getText().empty()) + { + OkDialog *dlg = new OkDialog(_("Error"), + _("Please at least type both the address and the port " + "of the server.")); + dlg->addActionListener(this); + } + else + { + mCancelButton->setEnabled(false); + mOkButton->setEnabled(false); + + ServerInfo serverInfo; + serverInfo.name = mNameField->getText(); + serverInfo.description = mDescriptionField->getText(); + serverInfo.hostname = mServerAddressField->getText(); + serverInfo.port = (short) atoi(mPortField->getText().c_str()); + switch (mTypeField->getSelected()) + { + case 0: + serverInfo.type = ServerInfo::TMWATHENA; + break; + case 1: + serverInfo.type = ServerInfo::MANASERV; + break; + default: + serverInfo.type = ServerInfo::UNKNOWN; + } + + // Tell the server has to be saved + serverInfo.save = true; + + //Add server + mServerDialog->saveCustomServers(serverInfo, mIndex); + scheduleDelete(); + } + } + else if (event.getId() == "cancel") + { + scheduleDelete(); + } +} + +void CustomServerDialog::keyPressed(gcn::KeyEvent &keyEvent) +{ + gcn::Key key = keyEvent.getKey(); + + if (key.getValue() == Key::ESCAPE) + { + scheduleDelete(); + } + else if (key.getValue() == Key::ENTER) + { + action(gcn::ActionEvent(NULL, mOkButton->getActionEventId())); + } +} diff --git a/src/gui/customserverdialog.h b/src/gui/customserverdialog.h new file mode 100644 index 000000000..25c320e81 --- /dev/null +++ b/src/gui/customserverdialog.h @@ -0,0 +1,98 @@ +/* + * The Mana Client + * Copyright (C) 2011-2012 The Mana Developers + * + * This file is part of The Mana Client. + * + * This program 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 2 of the License, or + * any later version. + * + * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef CUSTOMSERVERDIALOG_H +#define CUSTOMSERVERDIALOG_H + +class Button; +class Label; +class TextField; +class DropDown; +class ServerDialog; +class TypeListModel; + +#include "gui/widgets/window.h" + +#include "net/serverinfo.h" + +#include <guichan/actionlistener.hpp> +#include <guichan/keylistener.hpp> +#include <guichan/listmodel.hpp> + + +/** + * Server Type List Model + */ +class TypeListModel : public gcn::ListModel +{ + public: + TypeListModel() {} + + /** + * Used to get number of line in the list + */ + int getNumberOfElements() { return 2; } + + /** + * Used to get an element from the list + */ + std::string getElementAt(int elementIndex); +}; + +/** + * The custom server addition dialog. + * + * \ingroup Interface + */ +class CustomServerDialog : public Window, + public gcn::ActionListener, + public gcn::KeyListener +{ + public: + CustomServerDialog(ServerDialog *parent, int index = -1); + + ~CustomServerDialog(); + + /** + * Called when receiving actions from the widgets. + */ + void action(const gcn::ActionEvent &event); + + void keyPressed(gcn::KeyEvent &keyEvent); + + void logic(); + + private: + TextField *mServerAddressField; + TextField *mPortField; + TextField *mNameField; + TextField *mDescriptionField; + Button *mOkButton; + Button *mCancelButton; + + DropDown *mTypeField; + TypeListModel *mTypeListModel; + + ServerDialog *mServerDialog; + // The index of the entry to modify, -1 when only adding a new entry. + int mIndex; +}; + +#endif // CUSTOMSERVERDIALOG_H |