diff options
-rw-r--r-- | src/CMakeLists.txt | 4 | ||||
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/gui/chatwindow.cpp | 2 | ||||
-rw-r--r-- | src/gui/widgets/chattab.cpp | 3 | ||||
-rw-r--r-- | src/gui/widgets/tab.cpp | 59 | ||||
-rw-r--r-- | src/gui/widgets/tab.h | 32 | ||||
-rw-r--r-- | src/gui/widgets/tabbedarea.cpp | 172 | ||||
-rw-r--r-- | src/gui/widgets/tabbedarea.h | 75 | ||||
-rw-r--r-- | src/guichan/include/guichan/widgets/tab.hpp | 151 | ||||
-rw-r--r-- | src/guichan/include/guichan/widgets/tabbedarea.hpp | 267 | ||||
-rw-r--r-- | src/guichan/widgets/tab.cpp | 120 | ||||
-rw-r--r-- | src/guichan/widgets/tabbedarea.cpp | 284 |
12 files changed, 307 insertions, 866 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ea9de836b..8fdf8bbab 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -686,8 +686,6 @@ SET(SRCS_GUICHAN guichan/include/guichan/widgets/radiobutton.hpp guichan/include/guichan/widgets/scrollarea.hpp guichan/include/guichan/widgets/slider.hpp - guichan/include/guichan/widgets/tabbedarea.hpp - guichan/include/guichan/widgets/tab.hpp guichan/include/guichan/widgets/textbox.hpp guichan/include/guichan/widgets/textfield.hpp guichan/include/guichan/widgets/window.hpp @@ -721,8 +719,6 @@ SET(SRCS_GUICHAN guichan/widgets/radiobutton.cpp guichan/widgets/scrollarea.cpp guichan/widgets/slider.cpp - guichan/widgets/tabbedarea.cpp - guichan/widgets/tab.cpp guichan/widgets/textbox.cpp guichan/widgets/textfield.cpp guichan/widgets/window.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 38a0f4181..fba5e2cb7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -64,8 +64,6 @@ manaplus_SOURCES += guichan/include/guichan/actionevent.hpp \ guichan/include/guichan/widgets/radiobutton.hpp \ guichan/include/guichan/widgets/scrollarea.hpp \ guichan/include/guichan/widgets/slider.hpp \ - guichan/include/guichan/widgets/tabbedarea.hpp \ - guichan/include/guichan/widgets/tab.hpp \ guichan/include/guichan/widgets/textbox.hpp \ guichan/include/guichan/widgets/textfield.hpp \ guichan/include/guichan/widgets/window.hpp @@ -100,8 +98,6 @@ manaplus_SOURCES += guichan/actionevent.cpp \ guichan/widgets/radiobutton.cpp \ guichan/widgets/scrollarea.cpp \ guichan/widgets/slider.cpp \ - guichan/widgets/tabbedarea.cpp \ - guichan/widgets/tab.cpp \ guichan/widgets/textbox.cpp \ guichan/widgets/textfield.cpp \ guichan/widgets/window.cpp diff --git a/src/gui/chatwindow.cpp b/src/gui/chatwindow.cpp index 3be64f3c5..4fb470eed 100644 --- a/src/gui/chatwindow.cpp +++ b/src/gui/chatwindow.cpp @@ -697,7 +697,7 @@ void ChatWindow::mousePressed(gcn::MouseEvent &event) { if (viewport) { - gcn::Tab *const tab = mChatTabs->getSelectedTab(); + Tab *const tab = mChatTabs->getSelectedTab(); if (tab) { ChatTab *const cTab = dynamic_cast<ChatTab*>(tab); diff --git a/src/gui/widgets/chattab.cpp b/src/gui/widgets/chattab.cpp index d71f7f640..a0b31d040 100644 --- a/src/gui/widgets/chattab.cpp +++ b/src/gui/widgets/chattab.cpp @@ -34,6 +34,7 @@ #include "gui/widgets/scrollarea.h" #include "gui/widgets/itemlinkhandler.h" +#include "gui/widgets/tabbedarea.h" #include "gui/widgets/tradetab.h" #include "net/chathandler.h" @@ -44,8 +45,6 @@ #include "utils/gettext.h" -#include <guichan/widgets/tabbedarea.hpp> - #include "debug.h" static const unsigned int MAX_WORD_SIZE = 50; diff --git a/src/gui/widgets/tab.cpp b/src/gui/widgets/tab.cpp index e002c03fe..ab7d5683e 100644 --- a/src/gui/widgets/tab.cpp +++ b/src/gui/widgets/tab.cpp @@ -31,6 +31,7 @@ #include "gui/palette.h" #include "gui/theme.h" +#include "gui/widgets/label.h" #include "gui/widgets/tabbedarea.h" #include "utils/dtor.h" @@ -62,8 +63,14 @@ static std::string const data[TAB_COUNT] = ImageRect Tab::tabImg[TAB_COUNT]; Tab::Tab() : - gcn::Tab(), + gcn::BasicContainer(), + gcn::MouseListener(), gcn::WidgetListener(), + + mLabel(new Label), + mHasMouse(false), + mTabbedArea(nullptr), + mTabColor(&Theme::getThemeColor(Theme::TAB)), mTabHighlightedColor(&Theme::getThemeColor(Theme::TAB_HIGHLIGHTED)), mTabSelectedColor(&Theme::getThemeColor(Theme::TAB_SELECTED)), @@ -85,12 +92,20 @@ Tab::~Tab() for (int mode = 0; mode < TAB_COUNT; mode ++) theme->unloadRect(tabImg[mode]); } + + delete mLabel; + mLabel = nullptr; + delete mVertexes; mVertexes = nullptr; } void Tab::init() { + mLabel->setPosition(4, 4); + add(mLabel); + + addMouseListener(this); setFocusable(false); setFrameSize(0); mFlash = 0; @@ -209,3 +224,45 @@ void Tab::setLabelFont(gcn::Font *const font) mLabel->adjustSize(); adjustSize(); } + + +void Tab::adjustSize() +{ + setSize(mLabel->getWidth() + 8, + mLabel->getHeight() + 8); + + if (mTabbedArea) + mTabbedArea->adjustTabPositions(); +} + +void Tab::setTabbedArea(TabbedArea* tabbedArea) +{ + mTabbedArea = tabbedArea; +} + +TabbedArea* Tab::getTabbedArea() +{ + return mTabbedArea; +} + +void Tab::setCaption(const std::string &caption) +{ + mLabel->setCaption(caption); + mLabel->adjustSize(); + adjustSize(); +} + +const std::string &Tab::getCaption() const +{ + return mLabel->getCaption(); +} + +void Tab::mouseEntered(gcn::MouseEvent& mouseEvent A_UNUSED) +{ + mHasMouse = true; +} + +void Tab::mouseExited(gcn::MouseEvent& mouseEvent A_UNUSED) +{ + mHasMouse = false; +} diff --git a/src/gui/widgets/tab.h b/src/gui/widgets/tab.h index 28ae9f392..8c6e7d115 100644 --- a/src/gui/widgets/tab.h +++ b/src/gui/widgets/tab.h @@ -23,19 +23,25 @@ #ifndef TAB_H #define TAB_H +#include <guichan/basiccontainer.hpp> +#include <guichan/mouselistener.hpp> + #include <guichan/widgets/label.hpp> -#include <guichan/widgets/tab.hpp> + #include <guichan/widgetlistener.hpp> class GraphicsVertexes; class ImageRect; +class Label; class TabbedArea; /** * A tab, the same as the Guichan tab in 0.8, but extended to allow * transparency. */ -class Tab : public gcn::Tab, public gcn::WidgetListener +class Tab : public gcn::BasicContainer, + public gcn::MouseListener, + public gcn::WidgetListener { public: Tab(); @@ -99,15 +105,35 @@ class Tab : public gcn::Tab, public gcn::WidgetListener void setLabelFont(gcn::Font *const font); - gcn::Label *getLabel() const + Label *getLabel() const { return mLabel; } + void adjustSize(); + + void setTabbedArea(TabbedArea* tabbedArea); + + TabbedArea* getTabbedArea(); + + void setCaption(const std::string& caption); + + const std::string &getCaption() const; + + void mouseEntered(gcn::MouseEvent &mouseEvent) override; + + void mouseExited(gcn::MouseEvent &mouseEvent) override; + protected: friend class TabbedArea; virtual void setCurrent() { } + Label* mLabel; + + bool mHasMouse; + + TabbedArea* mTabbedArea; + private: /** Load images if no other instances exist yet */ void init(); diff --git a/src/gui/widgets/tabbedarea.cpp b/src/gui/widgets/tabbedarea.cpp index 1cc990f21..7643e0044 100644 --- a/src/gui/widgets/tabbedarea.cpp +++ b/src/gui/widgets/tabbedarea.cpp @@ -35,8 +35,17 @@ #include "debug.h" TabbedArea::TabbedArea() : - gcn::TabbedArea(), + gcn::ActionListener(), + gcn::BasicContainer(), + gcn::KeyListener(), + gcn::MouseListener(), gcn::WidgetListener(), + + mSelectedTab(nullptr), + mTabContainer(new gcn::Container()), + mWidgetContainer(new gcn::Container()), + mOpaque(false), + mTabsWidth(0), mVisibleTabsWidth(0), mTabScrollIndex(0), @@ -45,6 +54,16 @@ TabbedArea::TabbedArea() : mFollowDownScroll(false), mBlockSwitching(true) { + setFocusable(true); + addKeyListener(this); + addMouseListener(this); + mTabContainer->setOpaque(false); + + add(mTabContainer); + add(mWidgetContainer); + + + mWidgetContainer->setOpaque(false); addWidgetListener(this); @@ -56,6 +75,20 @@ TabbedArea::TabbedArea() : TabbedArea::~TabbedArea() { + remove(mTabContainer); + remove(mWidgetContainer); + + delete mTabContainer; + mTabContainer = nullptr; + delete mWidgetContainer; + mWidgetContainer = nullptr; + + for (size_t i = 0, sz = mTabsToDelete.size(); i < sz; i++) + { + delete mTabsToDelete[i]; + mTabsToDelete[i] = nullptr; + } + delete mArrowButton[0]; mArrowButton[0] = nullptr; delete mArrowButton[1]; @@ -124,7 +157,7 @@ gcn::Widget *TabbedArea::getWidget(const std::string &name) const gcn::Widget *TabbedArea::getCurrentWidget() { - const gcn::Tab *const tab = getSelectedTab(); + const Tab *const tab = getSelectedTab(); if (tab) return getWidget(tab->getCaption()); @@ -132,12 +165,25 @@ gcn::Widget *TabbedArea::getCurrentWidget() return nullptr; } -void TabbedArea::addTab(gcn::Tab* tab, gcn::Widget* widget) +void TabbedArea::addTab(Tab* tab, gcn::Widget* widget) { if (!tab || !widget) return; - gcn::TabbedArea::addTab(tab, widget); + + tab->setTabbedArea(this); + tab->addActionListener(this); + + mTabContainer->add(tab); + mTabs.push_back(std::pair<Tab*, gcn::Widget*>(tab, widget)); + + if (!mSelectedTab) + setSelectedTab(tab); + + adjustTabPositions(); + adjustSize(); + + const int frameSize = 2 * getFrameSize(); widget->setSize(getWidth() - frameSize, @@ -156,7 +202,28 @@ void TabbedArea::addTab(const std::string &caption, gcn::Widget *const widget) addTab(tab, widget); } -void TabbedArea::removeTab(gcn::Tab *tab) +bool TabbedArea::isTabSelected(unsigned int index) const +{ + if (index >= mTabs.size()) + return false; + + return mSelectedTab == mTabs[index].first; +} + +bool TabbedArea::isTabSelected(Tab* tab) +{ + return mSelectedTab == tab; +} + +void TabbedArea::setSelectedTab(unsigned int index) +{ + if (index >= mTabs.size()) + return; + + setSelectedTab(mTabs[index].first); +} + +void TabbedArea::removeTab(Tab *tab) { int tabIndexToBeSelected = -1; @@ -181,7 +248,7 @@ void TabbedArea::removeTab(gcn::Tab *tab) } } - for (std::vector<gcn::Tab*>::iterator iter2 = mTabsToDelete.begin(); + for (std::vector<Tab*>::iterator iter2 = mTabsToDelete.begin(); iter2 != mTabsToDelete.end(); ++iter2) { if (*iter2 == tab) @@ -227,7 +294,7 @@ void TabbedArea::mousePressed(gcn::MouseEvent &mouseEvent) { gcn::Widget *const widget = mTabContainer->getWidgetAt( mouseEvent.getX(), mouseEvent.getY()); - gcn::Tab *const tab = dynamic_cast<gcn::Tab *const>(widget); + Tab *const tab = dynamic_cast<Tab *const>(widget); if (tab) { @@ -237,9 +304,23 @@ void TabbedArea::mousePressed(gcn::MouseEvent &mouseEvent) } } -void TabbedArea::setSelectedTab(gcn::Tab *tab) +void TabbedArea::setSelectedTab(Tab *tab) { - gcn::TabbedArea::setSelectedTab(tab); + unsigned int i; + for (i = 0; i < mTabs.size(); i++) + { + if (mTabs[i].first == mSelectedTab) + mWidgetContainer->remove(mTabs[i].second); + } + + for (i = 0; i < mTabs.size(); i++) + { + if (mTabs[i].first == tab) + { + mSelectedTab = tab; + mWidgetContainer->add(mTabs[i].second); + } + } Tab *const newTab = dynamic_cast<Tab *const>(tab); @@ -249,6 +330,18 @@ void TabbedArea::setSelectedTab(gcn::Tab *tab) widgetResized(nullptr); } +int TabbedArea::getSelectedTabIndex() const +{ + for (unsigned int i = 0, sz = static_cast<unsigned int>(mTabs.size()); + i < sz; i++) + { + if (mTabs[i].first == mSelectedTab) + return i; + } + + return -1; +} + void TabbedArea::setSelectedTabByName(const std::string &name) { for (TabContainer::const_iterator itr = mTabs.begin(), @@ -264,7 +357,7 @@ void TabbedArea::setSelectedTabByName(const std::string &name) void TabbedArea::setSelectedTabByPos(int tab) { - gcn::TabbedArea::setSelectedTab(tab); + setSelectedTab(tab); } void TabbedArea::widgetResized(const gcn::Event &event A_UNUSED) @@ -354,13 +447,30 @@ void TabbedArea::updateVisibleTabsWidth() } } +void TabbedArea::adjustSize() +{ + int maxTabHeight = 0; + + for (size_t i = 0, sz = mTabs.size(); i < sz; i++) + { + if (mTabs[i].first->getHeight() > maxTabHeight) + maxTabHeight = mTabs[i].first->getHeight(); + } + + mTabContainer->setSize(getWidth() - 2, maxTabHeight); + + mWidgetContainer->setPosition(1, maxTabHeight + 1); + mWidgetContainer->setSize(getWidth() - 2, + getHeight() - maxTabHeight - 2); +} + void TabbedArea::adjustTabPositions() { int maxTabHeight = 0; const size_t sz = mTabs.size(); for (size_t i = 0; i < sz; ++i) { - const gcn::Tab *const tab = mTabs[i].first; + const Tab *const tab = mTabs[i].first; if (tab && tab->getHeight() > maxTabHeight) maxTabHeight = tab->getHeight(); } @@ -368,7 +478,7 @@ void TabbedArea::adjustTabPositions() int x = mArrowButton[0]->isVisible() ? mArrowButton[0]->getWidth() : 0; for (size_t i = mTabScrollIndex; i < sz; ++i) { - gcn::Tab *const tab = mTabs[i].first; + Tab *const tab = mTabs[i].first; if (!tab) continue; tab->setPosition(x, maxTabHeight - tab->getHeight()); @@ -381,7 +491,7 @@ void TabbedArea::adjustTabPositions() x = 0; for (unsigned i = 0; i < mTabScrollIndex; ++i) { - gcn::Tab *const tab = mTabs[i].first; + Tab *const tab = mTabs[i].first; if (tab) { x -= tab->getWidth(); @@ -480,7 +590,7 @@ void TabbedArea::removeAll() while (getNumberOfTabs() > 0) { const int idx = getNumberOfTabs() - 1; - gcn::Tab *tab = mTabs[idx].first; + Tab *tab = mTabs[idx].first; Widget *widget = mTabs[idx].second; removeTab(tab); delete tab; @@ -488,6 +598,30 @@ void TabbedArea::removeAll() } } +void TabbedArea::setWidth(int width) +{ + gcn::Widget::setWidth(width); + adjustSize(); +} + +void TabbedArea::setHeight(int height) +{ + gcn::Widget::setHeight(height); + adjustSize(); +} + +void TabbedArea::setSize(int width, int height) +{ + gcn::Widget::setSize(width, height); + adjustSize(); +} + +void TabbedArea::setDimension(const gcn::Rectangle &dimension) +{ + gcn::Widget::setDimension(dimension); + adjustSize(); +} + void TabbedArea::keyPressed(gcn::KeyEvent& keyEvent) { if (mBlockSwitching || keyEvent.isConsumed() || !isFocused()) @@ -520,3 +654,13 @@ void TabbedArea::keyPressed(gcn::KeyEvent& keyEvent) keyEvent.consume(); } } + +void TabbedArea::death(const gcn::Event &event) +{ + Tab *const tab = dynamic_cast<Tab*>(event.getSource()); + + if (tab) + removeTab(tab); + else + gcn::BasicContainer::death(event); +} diff --git a/src/gui/widgets/tabbedarea.h b/src/gui/widgets/tabbedarea.h index 9edf46748..b7e5f8154 100644 --- a/src/gui/widgets/tabbedarea.h +++ b/src/gui/widgets/tabbedarea.h @@ -23,10 +23,10 @@ #ifndef TABBEDAREA_H #define TABBEDAREA_H +#include <guichan/actionlistener.hpp> #include <guichan/widget.hpp> #include <guichan/widgetlistener.hpp> #include <guichan/widgets/container.hpp> -#include <guichan/widgets/tabbedarea.hpp> #include "gui/widgets/button.h" @@ -37,7 +37,11 @@ class Tab; /** * A tabbed area, the same as the guichan tabbed area in 0.8, but extended */ -class TabbedArea final : public gcn::TabbedArea, public gcn::WidgetListener +class TabbedArea final : public gcn::ActionListener, + public gcn::BasicContainer, + public gcn::KeyListener, + public gcn::MouseListener, + public gcn::WidgetListener { public: /** @@ -86,21 +90,18 @@ class TabbedArea final : public gcn::TabbedArea, public gcn::WidgetListener * @param tab The tab widget for the tab. * @param widget The widget to view when the tab is selected. */ - void addTab(gcn::Tab* tab, gcn::Widget* widget) override; + void addTab(Tab *tab, gcn::Widget *widget); - /** - * Add a tab. Overridden since it needs to create an instance of Tab - * instead of gcn::Tab. - * - * @param caption The Caption to display - * @param widget The widget to show when tab is selected - */ void addTab(const std::string &caption, gcn::Widget *const widget); + bool isTabSelected(unsigned int index) const; + + bool isTabSelected(Tab* tab); + /** * Overload the remove tab function as it's broken in guichan 0.8. */ - void removeTab(gcn::Tab *tab) override; + void removeTab(Tab *tab); void removeAll(); @@ -112,7 +113,22 @@ class TabbedArea final : public gcn::TabbedArea, public gcn::WidgetListener int getContainerHeight() const { return mWidgetContainer->getHeight(); } - void setSelectedTab(gcn::Tab *tab) override; + void setSelectedTab(Tab *tab); + + void setSelectedTab(unsigned int index); + + int getSelectedTabIndex() const; + + Tab* getSelectedTab() + { return mSelectedTab; } + + void setOpaque(bool opaque) + { mOpaque = opaque; } + + bool isOpaque() const + { return mOpaque; } + + void adjustSize(); void setSelectedTabByPos(int tab); @@ -121,9 +137,9 @@ class TabbedArea final : public gcn::TabbedArea, public gcn::WidgetListener void widgetResized(const gcn::Event &event) override; /* - void moveLeft(gcn::Tab *tab); + void moveLeft(Tab *tab); - void moveRight(gcn::Tab *tab); + void moveRight(Tab *tab); */ void adjustTabPositions(); @@ -155,8 +171,18 @@ class TabbedArea final : public gcn::TabbedArea, public gcn::WidgetListener void setBlockSwitching(bool b) { mBlockSwitching = b; } + void setWidth(int width); + + void setHeight(int height); + + void setSize(int width, int height); + + void setDimension(const gcn::Rectangle &dimension); + + void death(const gcn::Event &event); + private: - typedef std::vector< std::pair<gcn::Tab*, gcn::Widget*> > TabContainer; + typedef std::vector <std::pair<Tab*, gcn::Widget*> > TabContainer; /** The tab arrows */ gcn::Button *mArrowButton[2]; @@ -170,6 +196,24 @@ class TabbedArea final : public gcn::TabbedArea, public gcn::WidgetListener */ void updateTabsWidth(); + + + Tab* mSelectedTab; + + gcn::Container* mTabContainer; + + gcn::Container* mWidgetContainer; + + std::vector<Tab*> mTabsToDelete; + + std::vector<std::pair<Tab*, gcn::Widget*> > mTabs; + + bool mOpaque; + + + + + /** * The overall width of all tab. */ @@ -187,6 +231,7 @@ class TabbedArea final : public gcn::TabbedArea, public gcn::WidgetListener int mVisibleTabsWidth; + /** * The tab scroll index. When scrolling with the arrows, the tabs * must be displayed according to the current index. diff --git a/src/guichan/include/guichan/widgets/tab.hpp b/src/guichan/include/guichan/widgets/tab.hpp deleted file mode 100644 index 6568b9049..000000000 --- a/src/guichan/include/guichan/widgets/tab.hpp +++ /dev/null @@ -1,151 +0,0 @@ -/* _______ __ __ __ ______ __ __ _______ __ __ - * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ - * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / - * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / - * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / - * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / - * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ - * - * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson - * Copyright (C) 2011-2012 The ManaPlus Developers - * - * - * Per Larsson a.k.a finalman - * Olof Naessén a.k.a jansem/yakslem - * - * Visit: http://guichan.sourceforge.net - * - * License: (BSD) - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name of Guichan nor the names of its contributors may - * be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef GCN_TAB_HPP -#define GCN_TAB_HPP - -#include <map> -#include <string> - -#include "guichan/basiccontainer.hpp" -#include "guichan/mouselistener.hpp" -#include "guichan/platform.hpp" - -namespace gcn -{ - class Label; - class TabbedArea; - - /** - * An implementation of a simple tab to be used in a tabbed area. - * - * @see TabbedArea - * @since 0.8.0 - */ - class GCN_CORE_DECLSPEC Tab: - public BasicContainer, - public MouseListener - { - public: - - /** - * Constructor. - */ - Tab(); - - A_DELETE_COPY(Tab); - - /** - * Destructor. - */ - virtual ~Tab(); - - /** - * Adjusts the size of the tab to fit the caption. If this tab was - * added to a TabbedArea, it will also adjust the tab positions. - */ - void adjustSize(); - - /** - * Sets the tabbed area the tab should be a part of. - * - * @param tabbedArea The tabbed area the tab should be a part of. - * @see getTabbedArea - */ - void setTabbedArea(TabbedArea* tabbedArea); - - /** - * Gets the tabbed are the tab is a part of. - * - * @return The tabbed are the tab is a part of. - * @see setTabbedArea - */ - TabbedArea* getTabbedArea(); - - /** - * Sets the caption of the tab. It's advisable to call - * adjustSize after setting the caption to make the tab - * fit the caption. - * - * @param caption The caption of the tab. - * @see getCaption, adjustSize - */ - void setCaption(const std::string& caption); - - /** - * Gets the caption of the tab. - * - * @return The caption of the tab. - * @see setCaption - */ - const std::string& getCaption() const; - - - // Inherited from Widget - - // Inherited from MouseListener - - virtual void mouseEntered(MouseEvent& mouseEvent) override; - - virtual void mouseExited(MouseEvent& mouseEvent) override; - - protected: - /** - * Holds the label of the tab. - */ - Label* mLabel; - - /** - * True if the tab has the mouse, false otherwise. - */ - bool mHasMouse; - - /** - * Holds the tabbed area the tab is a part of. - */ - TabbedArea* mTabbedArea; - }; -} - -#endif // end GCN_TABBEDAREA_HPP diff --git a/src/guichan/include/guichan/widgets/tabbedarea.hpp b/src/guichan/include/guichan/widgets/tabbedarea.hpp deleted file mode 100644 index 9c64172e8..000000000 --- a/src/guichan/include/guichan/widgets/tabbedarea.hpp +++ /dev/null @@ -1,267 +0,0 @@ -/* _______ __ __ __ ______ __ __ _______ __ __ - * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ - * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / - * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / - * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / - * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / - * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ - * - * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson - * Copyright (C) 2011-2012 The ManaPlus Developers - * - * - * Per Larsson a.k.a finalman - * Olof Naessén a.k.a jansem/yakslem - * - * Visit: http://guichan.sourceforge.net - * - * License: (BSD) - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name of Guichan nor the names of its contributors may - * be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef GCN_TABBEDAREA_HPP -#define GCN_TABBEDAREA_HPP - -#include <map> -#include <string> -#include <vector> - -#include "guichan/actionlistener.hpp" -#include "guichan/basiccontainer.hpp" -#include "guichan/keylistener.hpp" -#include "guichan/mouselistener.hpp" -#include "guichan/platform.hpp" - -namespace gcn -{ - class Container; - class Tab; - - /** - * An implementation of a tabbed area where a user can display a widget by - * selecting a tab. - * - * @since 0.8.0 - */ - class GCN_CORE_DECLSPEC TabbedArea: - public ActionListener, - public BasicContainer, - public KeyListener, - public MouseListener - { - friend class Tab; - - public: - /** - * Constructor. - */ - TabbedArea(); - - A_DELETE_COPY(TabbedArea); - - /** - * Destructor. - */ - virtual ~TabbedArea(); - - /** - * Sets the tabbed area to be opaque or not. If the tabbed area is - * opaque its background will be drawn, if it's not opaque its - * background will not be drawn. By default, a tabbed area is not - * opaque. - * - * The tabbed area's background is normally only visible behind the - * tabs, since the container holding the tab contents is opaque by - * default. - * - * @param opaque True if the tabbed area should be opaque, false - * otherwise. - * @see isOpaque - */ - void setOpaque(bool opaque); - - /** - * Checks if the tabbed area is opaque or not. - * - * @return true if the tabbed area is opaque, false otherwise. - * @see setOpaque - */ - bool isOpaque() const; - - /** - * Adds a tab to the tabbed area. The tab will not be deleted by the - * tabbed area when it is removed. - * - * @param tab The tab widget for the tab. - * @param widget The widget to view when the tab is selected. - * @see removeTab, removeTabWithIndex - */ - virtual void addTab(Tab* tab, Widget* widget); - - /** - * Removes a tab from the tabbed area. - * - * @param index The index of the tab to remove. - * @see addTab - */ - virtual void removeTabWithIndex(unsigned int index); - - /** - * Removes a tab from the tabbed area. - * - * @param index The tab to remove. - * @see addTab - */ - virtual void removeTab(Tab* tab) = 0; - - /** - * Checks if a tab given an index is selected or not. - * - * @param index The index of the tab to check. - * @return True if the tab is selected, false otherwise. - * @see setSelectedTab - */ - virtual bool isTabSelected(unsigned int index) const; - - /** - * Checks if a tab is selected or not. - * - * @param index The tab to check. - * @return True if the tab is selected, false otherwise. - * @see setSelectedTab - */ - virtual bool isTabSelected(Tab* tab); - - /** - * Sets a tab given an index to be selected. - * - * @param index The index of the tab to be selected. - * @see isTabSelected, getSelectedTab - */ - virtual void setSelectedTab(unsigned int index); - - /** - * Sets a tab to be selected or not. - * - * @param index The tab to be selected. - * @see isTabSelected, getSelectedTab - */ - virtual void setSelectedTab(Tab* tab); - - /** - * Gets the index of the selected tab. - * - * @return The undex of the selected tab. - * If no tab is selected -1 will be returned. - * @see isTabSelected, setSelectedTab - */ - virtual int getSelectedTabIndex() const; - - /** - * Gets the selected tab. - * - * @return The selected tab. - * @see isTabSelected, setSelectedTab - */ - Tab* getSelectedTab(); - - // Inherited from Widget - - virtual void draw(Graphics *graphics); - - void setWidth(int width); - - void setHeight(int height); - - void setSize(int width, int height); - - void setDimension(const Rectangle& dimension); - - - // Inherited from ActionListener - - void action(const ActionEvent& actionEvent); - - - // Inherited from DeathListener - - virtual void death(const Event& event); - - - // Inherited from KeyListener - - virtual void keyPressed(KeyEvent& keyEvent) override; - - - // Inherited from MouseListener - - protected: - /** - * Adjusts the size of the tab container and the widget container. - */ - void adjustSize(); - - /** - * Adjusts the positions of the tabs. - */ - void adjustTabPositions(); - - /** - * Holds the selected tab. - */ - Tab* mSelectedTab; - - /** - * Holds the container for the tabs. - */ - Container* mTabContainer; - - /** - * Holds the container for the widgets. - */ - Container* mWidgetContainer; - - /** - * Holds a vector of tabs to delete in the destructor. - * A tab that is to be deleted is a tab that has been - * internally created by the tabbed area. - */ - std::vector<Tab*> mTabsToDelete; - - /** - * A map between a tab and a widget to display when the - * tab is selected. - */ - std::vector<std::pair<Tab*, Widget*> > mTabs; - - /** - * True if the tabbed area is opaque, false otherwise. - */ - bool mOpaque; - }; -} - -#endif // end GCN_TABBEDAREA_HPP diff --git a/src/guichan/widgets/tab.cpp b/src/guichan/widgets/tab.cpp deleted file mode 100644 index 04d3dbb83..000000000 --- a/src/guichan/widgets/tab.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* _______ __ __ __ ______ __ __ _______ __ __ - * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ - * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / - * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / - * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / - * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / - * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ - * - * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson - * Copyright (C) 2011-2012 The ManaPlus Developers - * - * - * Per Larsson a.k.a finalman - * Olof Naessén a.k.a jansem/yakslem - * - * Visit: http://guichan.sourceforge.net - * - * License: (BSD) - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name of Guichan nor the names of its contributors may - * be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * For comments regarding functions please see the header file. - */ - -#include "guichan/widgets/tab.hpp" - -#include "guichan/font.hpp" -#include "guichan/graphics.hpp" -#include "guichan/widgets/button.hpp" -#include "guichan/widgets/label.hpp" -#include "guichan/widgets/tabbedarea.hpp" - -#include "debug.h" - -namespace gcn -{ - Tab::Tab() : - BasicContainer(), - MouseListener(), - mLabel(new Label()), - mHasMouse(false), - mTabbedArea(nullptr) - { - mLabel->setPosition(4, 4); - add(mLabel); - - addMouseListener(this); - } - - Tab::~Tab() - { - delete mLabel; - mLabel = nullptr; - } - - void Tab::adjustSize() - { - setSize(mLabel->getWidth() + 8, - mLabel->getHeight() + 8); - - if (mTabbedArea) - mTabbedArea->adjustTabPositions(); - } - - void Tab::setTabbedArea(TabbedArea* tabbedArea) - { - mTabbedArea = tabbedArea; - } - - TabbedArea* Tab::getTabbedArea() - { - return mTabbedArea; - } - - void Tab::setCaption(const std::string& caption) - { - mLabel->setCaption(caption); - mLabel->adjustSize(); - adjustSize(); - } - - const std::string& Tab::getCaption() const - { - return mLabel->getCaption(); - } - - void Tab::mouseEntered(MouseEvent& mouseEvent A_UNUSED) - { - mHasMouse = true; - } - - void Tab::mouseExited(MouseEvent& mouseEvent A_UNUSED) - { - mHasMouse = false; - } -} diff --git a/src/guichan/widgets/tabbedarea.cpp b/src/guichan/widgets/tabbedarea.cpp deleted file mode 100644 index 35d401426..000000000 --- a/src/guichan/widgets/tabbedarea.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/* _______ __ __ __ ______ __ __ _______ __ __ - * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ - * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / - * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / - * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / - * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / - * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ - * - * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson - * Copyright (C) 2011-2012 The ManaPlus Developers - * - * - * Per Larsson a.k.a finalman - * Olof Naessén a.k.a jansem/yakslem - * - * Visit: http://guichan.sourceforge.net - * - * License: (BSD) - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name of Guichan nor the names of its contributors may - * be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * For comments regarding functions please see the header file. - */ - -#include "guichan/widgets/tabbedarea.hpp" - -#include "guichan/exception.hpp" -#include "guichan/focushandler.hpp" -#include "guichan/font.hpp" -#include "guichan/graphics.hpp" - -#include "guichan/widgets/container.hpp" -#include "guichan/widgets/tab.hpp" - -#include <algorithm> - -#include "debug.h" - -namespace gcn -{ - TabbedArea::TabbedArea() : - ActionListener(), - BasicContainer(), - KeyListener(), - MouseListener(), - mSelectedTab(nullptr), - mTabContainer(new Container()), - mWidgetContainer(new Container()), - mOpaque(false) - { - setFocusable(true); - addKeyListener(this); - addMouseListener(this); - - mTabContainer->setOpaque(false); - - add(mTabContainer); - add(mWidgetContainer); - } - - TabbedArea::~TabbedArea() - { - remove(mTabContainer); - remove(mWidgetContainer); - - delete mTabContainer; - mTabContainer = nullptr; - delete mWidgetContainer; - mWidgetContainer = nullptr; - - for (size_t i = 0, sz = mTabsToDelete.size(); i < sz; i++) - { - delete mTabsToDelete[i]; - mTabsToDelete[i] = nullptr; - } - } - - void TabbedArea::addTab(Tab* tab, Widget* widget) - { - tab->setTabbedArea(this); - tab->addActionListener(this); - - mTabContainer->add(tab); - mTabs.push_back(std::pair<Tab*, Widget*>(tab, widget)); - - if (!mSelectedTab) - setSelectedTab(tab); - - adjustTabPositions(); - adjustSize(); - } - - void TabbedArea::removeTabWithIndex(unsigned int index) - { - if (index >= mTabs.size()) - throw GCN_EXCEPTION("No such tab index."); - - removeTab(mTabs[index].first); - } - - bool TabbedArea::isTabSelected(unsigned int index) const - { - if (index >= mTabs.size()) - throw GCN_EXCEPTION("No such tab index."); - - return mSelectedTab == mTabs[index].first; - } - - bool TabbedArea::isTabSelected(Tab* tab) - { - return mSelectedTab == tab; - } - - void TabbedArea::setSelectedTab(unsigned int index) - { - if (index >= mTabs.size()) - throw GCN_EXCEPTION("No such tab index."); - - setSelectedTab(mTabs[index].first); - } - - void TabbedArea::setSelectedTab(Tab* tab) - { - unsigned int i; - for (i = 0; i < mTabs.size(); i++) - { - if (mTabs[i].first == mSelectedTab) - mWidgetContainer->remove(mTabs[i].second); - } - - for (i = 0; i < mTabs.size(); i++) - { - if (mTabs[i].first == tab) - { - mSelectedTab = tab; - mWidgetContainer->add(mTabs[i].second); - } - } - } - - int TabbedArea::getSelectedTabIndex() const - { - for (unsigned int i = 0, sz = static_cast<unsigned int>(mTabs.size()); - i < sz; i++) - { - if (mTabs[i].first == mSelectedTab) - return i; - } - - return -1; - } - - Tab* TabbedArea::getSelectedTab() - { - return mSelectedTab; - } - - void TabbedArea::setOpaque(bool opaque) - { - mOpaque = opaque; - } - - bool TabbedArea::isOpaque() const - { - return mOpaque; - } - - void TabbedArea::draw(Graphics *graphics A_UNUSED) - { - } - - void TabbedArea::adjustSize() - { - int maxTabHeight = 0; - - for (size_t i = 0, sz = mTabs.size(); i < sz; i++) - { - if (mTabs[i].first->getHeight() > maxTabHeight) - maxTabHeight = mTabs[i].first->getHeight(); - } - - mTabContainer->setSize(getWidth() - 2, maxTabHeight); - - mWidgetContainer->setPosition(1, maxTabHeight + 1); - mWidgetContainer->setSize(getWidth() - 2, - getHeight() - maxTabHeight - 2); - } - - void TabbedArea::adjustTabPositions() - { - int maxTabHeight = 0; - unsigned int i; - const unsigned int sz = static_cast<unsigned int>(mTabs.size()); - for (i = 0; i < sz; i++) - { - if (mTabs[i].first->getHeight() > maxTabHeight) - maxTabHeight = mTabs[i].first->getHeight(); - } - - int x = 0; - for (i = 0; i < sz; i++) - { - Tab *const tab = mTabs[i].first; - tab->setPosition(x, maxTabHeight - tab->getHeight()); - x += tab->getWidth(); - } - } - - void TabbedArea::setWidth(int width) - { - Widget::setWidth(width); - adjustSize(); - } - - void TabbedArea::setHeight(int height) - { - Widget::setHeight(height); - adjustSize(); - } - - void TabbedArea::setSize(int width, int height) - { - Widget::setSize(width, height); - adjustSize(); - } - - void TabbedArea::setDimension(const Rectangle& dimension) - { - Widget::setDimension(dimension); - adjustSize(); - } - - void TabbedArea::keyPressed(KeyEvent& keyEvent A_UNUSED) - { - } - - void TabbedArea::death(const Event& event) - { - Tab *const tab = dynamic_cast<Tab*>(event.getSource()); - - if (tab) - removeTab(tab); - else - BasicContainer::death(event); - } - - void TabbedArea::action(const ActionEvent& actionEvent) - { - Widget *const source = actionEvent.getSource(); - Tab *const tab = dynamic_cast<Tab*>(source); - - if (!tab) - { - throw GCN_EXCEPTION("Received an action from a " - "widget that's not a tab!"); - } - - setSelectedTab(tab); - } -} |