/* * The Mana World * Copyright 2004 The Mana World Development Team * * This file is part of The Mana World. * * The Mana World 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. * * The Mana World 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 The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "popup_box.h" #include "window.h" #include "browserbox.h" #include #include class PoppedSelectionWindow : public Window { public: PoppedSelectionWindow(PopupBox *owner): mOwner(owner) { setResizable(false); setTitleBarHeight(0); mShowTitle = false; mBrowserBox = new BrowserBox(); mBrowserBox->setPosition(4, 4); mBrowserBox->setHighlightMode(BrowserBox::BACKGROUND); mBrowserBox->setOpaque(false); add(mBrowserBox); mBrowserBox->setLinkHandler(owner); initModel(); } void initModel(void) { mBrowserBox->clearRows(); gcn::ListModel *model = mOwner->getListModel(); for (int i = 0; i < model->getNumberOfElements(); i++) { std::stringstream s; s << "@@" << i << "|" << model->getElementAt(i) << "@@"; mBrowserBox->addRow(s.str()); } setContentSize(mBrowserBox->getWidth() + 8, mBrowserBox->getHeight() + 8); } protected: BrowserBox *mBrowserBox; PopupBox *mOwner; }; PopupBox::PopupBox(gcn::ListModel *list_model) : DropDown(list_model), mWindow(NULL) { } PopupBox::~PopupBox(void) { if (mWindow) delete mWindow; } //////////////////////////////////////// // Widget ops void PopupBox::draw(gcn::Graphics *graphics) { // fill background graphics->setColor(gcn::Color(0xd0, 0xd0, 0xd0)); graphics->fillRectangle(gcn::Rectangle(0, 0, getWidth(), getHeight())); // draw frame-ish object graphics->setColor(gcn::Color(0xc0, 0xc0, 0xc0)); graphics->drawRectangle(gcn::Rectangle(0, 0, getWidth(), getHeight())); graphics->setColor(gcn::Color(0xe0, 0xe0, 0xe0)); graphics->drawLine(0, getHeight(), getWidth(), getHeight()); graphics->drawLine(getWidth(), 0, getWidth(), getHeight()); graphics->drawText(getListModel()->getElementAt(getSelected()), 0, 0); } //////////////////////////////////////// // MouseListener ops void PopupBox::mousePressed(gcn::MouseEvent& mouseEvent) { if (0 <= mouseEvent.getY() && mouseEvent.getY() < getHeight() && mouseEvent.getX() >= 0 && mouseEvent.getX() < getWidth() && mouseEvent.getButton() == gcn::MouseEvent::LEFT && mouseEvent.getSource() == this) { if (mWindow == NULL) { mWindow = new PoppedSelectionWindow(this); mWindow->resizeToContent(); } int x, y; getAbsolutePosition(x, y); mWindow->setPosition(mouseEvent.getX() + x, mouseEvent.getY() + y); mWindow->setVisible(true); mWindow->requestMoveToTop(); } } //////////////////////////////////////// // LinkHandler ops void PopupBox::handleLink(const std::string &link) { if (mWindow) mWindow->setVisible(false); std::stringstream s; s << link; int index; s >> index; setSelected(index); }