summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2009-01-13 22:07:29 +0100
committerBjørn Lindeijer <bjorn@lindeijer.nl>2009-01-13 22:07:29 +0100
commit5340364ee4b91d5d26358d1ec131016946f2998b (patch)
tree47fe78a356836a61fa7f6a9df67b742fe18bacc4
parented60c53eb2fe5ef377fc726df796d0aaf2005c6c (diff)
downloadmana-5340364ee4b91d5d26358d1ec131016946f2998b.tar.gz
mana-5340364ee4b91d5d26358d1ec131016946f2998b.tar.bz2
mana-5340364ee4b91d5d26358d1ec131016946f2998b.tar.xz
mana-5340364ee4b91d5d26358d1ec131016946f2998b.zip
Merged Tab and TabbedArea from mainline
Changes mostly done by David Athay. Currently these widgets are only used in the setup window, where they replace the previously used TabbedContainer.
-rw-r--r--data/graphics/gui/CMakeLists.txt2
-rw-r--r--data/graphics/gui/Makefile.am2
-rw-r--r--data/graphics/gui/tab.pngbin0 -> 329 bytes
-rw-r--r--data/graphics/gui/tabselected.pngbin0 -> 313 bytes
-rw-r--r--src/CMakeLists.txt6
-rw-r--r--src/Makefile.am6
-rw-r--r--src/gui/setup.cpp20
-rw-r--r--src/gui/setup.h2
-rw-r--r--src/gui/setup_audio.cpp1
-rw-r--r--src/gui/setup_joystick.cpp2
-rw-r--r--src/gui/setup_keyboard.cpp1
-rw-r--r--src/gui/setup_players.cpp1
-rw-r--r--src/gui/setup_video.cpp1
-rw-r--r--src/gui/tabbedcontainer.cpp121
-rw-r--r--src/gui/tabbedcontainer.h65
-rw-r--r--src/gui/widgets/tab.cpp130
-rw-r--r--src/gui/widgets/tab.h60
-rw-r--r--src/gui/widgets/tabbedarea.cpp160
-rw-r--r--src/gui/widgets/tabbedarea.h92
19 files changed, 471 insertions, 201 deletions
diff --git a/data/graphics/gui/CMakeLists.txt b/data/graphics/gui/CMakeLists.txt
index 1ca4ee72..4065e939 100644
--- a/data/graphics/gui/CMakeLists.txt
+++ b/data/graphics/gui/CMakeLists.txt
@@ -29,6 +29,8 @@ SET (FILES
rpgfont_wider.png
selection.png
slider.png
+ tab.png
+ tabselected.png
target-cursor-blue-l.png
target-cursor-blue-m.png
target-cursor-blue-s.png
diff --git a/data/graphics/gui/Makefile.am b/data/graphics/gui/Makefile.am
index 0b7824c9..4cc5b569 100644
--- a/data/graphics/gui/Makefile.am
+++ b/data/graphics/gui/Makefile.am
@@ -33,6 +33,8 @@ gui_DATA = \
rpgfont_wider.png \
selection.png \
slider.png \
+ tab.png \
+ tabselected.png \
target-cursor-blue-l.png \
target-cursor-blue-m.png \
target-cursor-blue-s.png \
diff --git a/data/graphics/gui/tab.png b/data/graphics/gui/tab.png
new file mode 100644
index 00000000..91eadf08
--- /dev/null
+++ b/data/graphics/gui/tab.png
Binary files differ
diff --git a/data/graphics/gui/tabselected.png b/data/graphics/gui/tabselected.png
new file mode 100644
index 00000000..e2983060
--- /dev/null
+++ b/data/graphics/gui/tabselected.png
Binary files differ
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 27d1e1d8..467ceb71 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -53,6 +53,10 @@ SET(SRCS
gui/widgets/resizegrip.h
gui/widgets/layout.cpp
gui/widgets/layout.h
+ gui/widgets/tab.cpp
+ gui/widgets/tab.h
+ gui/widgets/tabbedarea.cpp
+ gui/widgets/tabbedarea.h
gui/browserbox.cpp
gui/browserbox.h
gui/buddywindow.cpp
@@ -159,8 +163,6 @@ SET(SRCS
gui/slider.h
gui/status.cpp
gui/status.h
- gui/tabbedcontainer.cpp
- gui/tabbedcontainer.h
gui/table.cpp
gui/table.h
gui/table_model.cpp
diff --git a/src/Makefile.am b/src/Makefile.am
index d882f426..95379a3c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -5,6 +5,10 @@ tmw_SOURCES = gui/widgets/layout.cpp \
gui/widgets/layout.h \
gui/widgets/resizegrip.cpp \
gui/widgets/resizegrip.h \
+ gui/widgets/tab.cpp \
+ gui/widgets/tab.h \
+ gui/widgets/tabbedarea.cpp \
+ gui/widgets/tabbedarea.h \
gui/browserbox.cpp \
gui/browserbox.h \
gui/buddywindow.cpp \
@@ -113,8 +117,6 @@ tmw_SOURCES = gui/widgets/layout.cpp \
gui/slider.h \
gui/status.cpp \
gui/status.h \
- gui/tabbedcontainer.cpp \
- gui/tabbedcontainer.h \
gui/table.h \
gui/table.cpp \
gui/table_model.h \
diff --git a/src/gui/setup.cpp b/src/gui/setup.cpp
index 067d8d64..80da120a 100644
--- a/src/gui/setup.cpp
+++ b/src/gui/setup.cpp
@@ -29,7 +29,8 @@
#include "setup_video.h"
#include "setup_keyboard.h"
#include "setup_players.h"
-#include "tabbedcontainer.h"
+
+#include "widgets/tabbedarea.h"
#include "../utils/dtor.h"
#include "../utils/gettext.h"
@@ -47,7 +48,7 @@ extern Window *itemShortcutWindow;
extern Window *tradeWindow;
Setup::Setup():
- Window("Setup")
+ Window(_("Setup"))
{
setCloseButton(true);
int width = 310;
@@ -69,30 +70,29 @@ Setup::Setup():
btn->setEnabled(statusWindow != NULL);
}
- TabbedContainer *panel = new TabbedContainer();
- panel->setDimension(gcn::Rectangle(5, 5, width, height - 40));
- panel->setOpaque(false);
+ TabbedArea *panel = new TabbedArea();
+ panel->setDimension(gcn::Rectangle(5, 5, 260, 225));
SetupTab *tab;
tab = new Setup_Video();
- panel->addTab(tab, _("Video"));
+ panel->addTab(_("Video"), tab);
mTabs.push_back(tab);
tab = new Setup_Audio();
- panel->addTab(tab, _("Audio"));
+ panel->addTab(_("Audio"), tab);
mTabs.push_back(tab);
tab = new Setup_Joystick();
- panel->addTab(tab, _("Joystick"));
+ panel->addTab(_("Joystick"), tab);
mTabs.push_back(tab);
tab = new Setup_Keyboard();
- panel->addTab(tab, _("Keyboard"));
+ panel->addTab(_("Keyboard"), tab);
mTabs.push_back(tab);
tab = new Setup_Players();
- panel->addTab(tab, _("Players"));
+ panel->addTab(_("Players"), tab);
mTabs.push_back(tab);
add(panel);
diff --git a/src/gui/setup.h b/src/gui/setup.h
index 5268f725..2142a67d 100644
--- a/src/gui/setup.h
+++ b/src/gui/setup.h
@@ -46,7 +46,7 @@ class Setup : public Window, public gcn::ActionListener
/**
* Destructor.
*/
- virtual ~Setup();
+ ~Setup();
/**
* Event handling method.
diff --git a/src/gui/setup_audio.cpp b/src/gui/setup_audio.cpp
index c595edc9..4f09cde0 100644
--- a/src/gui/setup_audio.cpp
+++ b/src/gui/setup_audio.cpp
@@ -42,6 +42,7 @@ Setup_Audio::Setup_Audio():
mMusicSlider(new Slider(0, 128))
{
setOpaque(false);
+ setDimension(gcn::Rectangle(0, 0, 250, 200));
gcn::Label *sfxLabel = new gcn::Label(_("Sfx volume"));
gcn::Label *musicLabel = new gcn::Label(_("Music volume"));
diff --git a/src/gui/setup_joystick.cpp b/src/gui/setup_joystick.cpp
index a718f87e..9de5be9f 100644
--- a/src/gui/setup_joystick.cpp
+++ b/src/gui/setup_joystick.cpp
@@ -38,6 +38,8 @@ Setup_Joystick::Setup_Joystick():
mJoystickEnabled(new CheckBox(_("Enable joystick")))
{
setOpaque(false);
+ setDimension(gcn::Rectangle(0, 0, 250, 200));
+
mJoystickEnabled->setPosition(10, 10);
mCalibrateLabel->setPosition(10, 25);
mCalibrateButton->setPosition(10, 30 + mCalibrateLabel->getHeight());
diff --git a/src/gui/setup_keyboard.cpp b/src/gui/setup_keyboard.cpp
index de3c0ce1..e4d1af0c 100644
--- a/src/gui/setup_keyboard.cpp
+++ b/src/gui/setup_keyboard.cpp
@@ -74,6 +74,7 @@ Setup_Keyboard::Setup_Keyboard():
{
keyboard.setSetupKeyboard(this);
setOpaque(false);
+ setDimension(gcn::Rectangle(0, 0, 250, 200));
refreshKeys();
diff --git a/src/gui/setup_players.cpp b/src/gui/setup_players.cpp
index 122f54e1..0f7ba03b 100644
--- a/src/gui/setup_players.cpp
+++ b/src/gui/setup_players.cpp
@@ -221,6 +221,7 @@ Setup_Players::Setup_Players():
mIgnoreActionChoicesBox(new gcn::DropDown(new IgnoreChoicesListModel()))
{
setOpaque(false);
+ setDimension(gcn::Rectangle(0, 0, 250, 200));
int table_width = NAME_COLUMN_WIDTH + RELATION_CHOICE_COLUMN_WIDTH;
mPlayerTableTitleModel->fixColumnWidth(NAME_COLUMN, NAME_COLUMN_WIDTH);
diff --git a/src/gui/setup_video.cpp b/src/gui/setup_video.cpp
index 0debe163..51a5fac5 100644
--- a/src/gui/setup_video.cpp
+++ b/src/gui/setup_video.cpp
@@ -130,6 +130,7 @@ Setup_Video::Setup_Video():
mParticleDetailField(new gcn::Label(""))
{
setOpaque(false);
+ setDimension(gcn::Rectangle(0, 0, 250, 200));
ScrollArea *scrollArea = new ScrollArea(mModeList);
gcn::Label *alphaLabel = new gcn::Label(_("Gui opacity"));
diff --git a/src/gui/tabbedcontainer.cpp b/src/gui/tabbedcontainer.cpp
deleted file mode 100644
index 8c23f76f..00000000
--- a/src/gui/tabbedcontainer.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * 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 "tabbedcontainer.h"
-
-#include "button.h"
-
-#include "../utils/tostring.h"
-#include "../utils/dtor.h"
-
-#define TABWIDTH 60
-#define TABHEIGHT 20
-
-TabbedContainer::TabbedContainer():
- mActiveContent(0)
-{
-}
-
-TabbedContainer::~TabbedContainer()
-{
- delete_all(mTabs);
- mTabs.clear();
- mContents.clear();
-}
-
-void TabbedContainer::addTab(gcn::Widget *widget, const std::string &caption)
-{
- int tabNumber = mTabs.size();
-
- Button *tab = new Button(caption, toString(tabNumber), this);
-
- tab->setSize(TABWIDTH, TABHEIGHT);
- add(tab, TABWIDTH * tabNumber, 0);
-
- mTabs[caption] = tab;
-
- mContents.push_back(widget);
- widget->setPosition(0, TABHEIGHT);
-
- // If this is the first tab in this container, make it visible
- if (!mActiveContent) {
- mActiveContent = widget;
- add(mActiveContent);
- tab->setLogged(true);
- }
-
- mWidgets[widget] = caption;
-}
-
-void TabbedContainer::removeTab(const std::string &caption)
-{
- gcn::ActionEvent actionEvent(this, "0");
- action(actionEvent);
- remove(mTabs[caption]);
- mTabs.erase(caption);
-}
-
-void TabbedContainer::logic()
-{
- if (mActiveContent) {
- mActiveContent->setSize(
- getWidth() - 2 * mActiveContent->getFrameSize(),
- getHeight() - TABHEIGHT - 2 * mActiveContent->getFrameSize());
- }
-
- Container::logic();
-}
-
-void TabbedContainer::action(const gcn::ActionEvent &event)
-{
- int tabNo;
- std::stringstream ss(event.getId());
- ss >> tabNo;
-
- gcn::Widget *newContent = mContents[tabNo];
-
- if (newContent) {
- if (mActiveContent) {
- // Unhighlight old tab
- ((Button*)mTabs[mWidgets[mActiveContent]])->setLogged(false);
- remove(mActiveContent);
- }
- mActiveContent = newContent;
- // Highlight new tab
- ((Button*)mTabs[mWidgets[mActiveContent]])->setLogged(true);
- add(newContent);
- }
-}
-
-void TabbedContainer::setOpaque(bool opaque)
-{
- Container::setOpaque(opaque);
-}
-
-short TabbedContainer::getNumberOfTabs()
-{
- return mTabs.size();
-}
-
-std::string TabbedContainer::getActiveWidget()
-{
- return mWidgets[mActiveContent];
-}
diff --git a/src/gui/tabbedcontainer.h b/src/gui/tabbedcontainer.h
deleted file mode 100644
index babf68a2..00000000
--- a/src/gui/tabbedcontainer.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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
- */
-
-#ifndef _TMW_TABPANE_H
-#define _TMW_TABPANE_H
-
-#include <iosfwd>
-#include <vector>
-#include <map>
-
-#include <guichan/actionlistener.hpp>
-
-#include <guichan/widgets/container.hpp>
-
-#include "../guichanfwd.h"
-
-class TabbedContainer : public gcn::Container, public gcn::ActionListener
-{
- public:
- TabbedContainer();
- ~TabbedContainer();
-
- void addTab(gcn::Widget *widget, const std::string &caption);
-
- void removeTab(const std::string &caption);
-
- void logic();
-
- void action(const gcn::ActionEvent &event);
-
- void setOpaque(bool opaque);
-
- short getNumberOfTabs();
-
- std::string getActiveWidget();
-
- private:
- typedef std::vector<gcn::Widget*> Widgets;
- typedef Widgets::iterator WidgetIterator;
- std::map<std::string, gcn::Widget*> mTabs; // tabs mapped to their channel name
- Widgets mContents; // The contents of the tabs
-
- std::map<gcn::Widget*, std::string> mWidgets;
- gcn::Widget *mActiveContent;
-};
-
-#endif
diff --git a/src/gui/widgets/tab.cpp b/src/gui/widgets/tab.cpp
new file mode 100644
index 00000000..c53ac85c
--- /dev/null
+++ b/src/gui/widgets/tab.cpp
@@ -0,0 +1,130 @@
+/*
+ * The Mana World
+ * Copyright 2008 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 <algorithm>
+
+#include "tab.h"
+
+#include "tabbedarea.h"
+
+#include "../../graphics.h"
+
+#include "../../resources/image.h"
+#include "../../resources/resourcemanager.h"
+
+#include "../../utils/dtor.h"
+
+int Tab::mInstances = 0;
+
+enum{
+ TAB_STANDARD, // 0
+ TAB_HIGHLIGHTED, // 1
+ TAB_SELECTED, // 2
+ TAB_UNUSED, // 3
+ TAB_COUNT // 4 - Must be last.
+};
+
+struct TabData
+{
+ char const *file;
+ int gridX;
+ int gridY;
+};
+
+static TabData const data[TAB_COUNT] = {
+ {"graphics/gui/tab.png", 0, 0},
+ {"graphics/gui/tab.png", 9, 4},
+ {"graphics/gui/tabselected.png", 16, 19},
+ {"graphics/gui/tab.png", 25, 23}
+};
+
+ImageRect Tab::tabImg[TAB_COUNT];
+
+Tab::Tab() : gcn::Tab()
+{
+ init();
+}
+
+Tab::~Tab()
+{
+ mInstances--;
+
+ if (mInstances == 0)
+ {
+ for (int mode = 0; mode < TAB_COUNT; mode++)
+ {
+ for_each(tabImg[mode].grid, tabImg[mode].grid + 9, dtor<Image*>());
+ }
+ }
+}
+
+void Tab::init()
+{
+ setFrameSize(0);
+
+ if (mInstances == 0)
+ {
+ // Load the skin
+ ResourceManager *resman = ResourceManager::getInstance();
+ Image *tab[TAB_COUNT];
+
+ int a, x, y, mode;
+
+ for (mode = 0; mode < TAB_COUNT; mode++)
+ {
+ tab[mode] = resman->getImage(data[mode].file);
+ a = 0;
+ for (y = 0; y < 3; y++) {
+ for (x = 0; x < 3; x++) {
+ tabImg[mode].grid[a] = tab[mode]->getSubImage(
+ data[x].gridX, data[y].gridY,
+ data[x + 1].gridX - data[x].gridX + 1,
+ data[y + 1].gridY - data[y].gridY + 1);
+ a++;
+ }
+ }
+ tab[mode]->decRef();
+ }
+ }
+ mInstances++;
+}
+
+void Tab::draw(gcn::Graphics *graphics)
+{
+ int mode;
+
+ // check which type of tab to draw
+ if (mTabbedArea && mTabbedArea->isTabSelected(this))
+ {
+ mode = TAB_SELECTED;
+ }
+ else
+ {
+ mode = TAB_STANDARD;
+ }
+
+ // draw tab
+ static_cast<Graphics*>(graphics)->
+ drawImageRect(0, 0, getWidth(), getHeight(), tabImg[mode]);
+
+ // draw label
+ drawChildren(graphics);
+}
diff --git a/src/gui/widgets/tab.h b/src/gui/widgets/tab.h
new file mode 100644
index 00000000..42964b0f
--- /dev/null
+++ b/src/gui/widgets/tab.h
@@ -0,0 +1,60 @@
+/*
+ * The Mana World
+ * Copyright 2008 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
+ */
+
+#ifndef _TMW_TAB_H
+#define _TMW_TAB_H
+
+#include <guichan/widgets/tab.hpp>
+
+class ImageRect;
+
+/**
+ * A tab, the same as the guichan tab in 0.8, but extended to allow transparancy
+ */
+class Tab : public gcn::Tab
+{
+ public:
+ /**
+ * Constructor.
+ */
+ Tab();
+
+ /**
+ * Destructor.
+ */
+ ~Tab();
+
+ /**
+ * Draw the tabbed area.
+ */
+ void draw(gcn::Graphics *graphics);
+
+ private:
+ /** Load images if no other instances exist yet */
+ void init();
+
+ static ImageRect tabImg[4]; /**< Tab state graphics */
+ static int mInstances; /**< Number of tab instances */
+};
+
+#endif
+
+
diff --git a/src/gui/widgets/tabbedarea.cpp b/src/gui/widgets/tabbedarea.cpp
new file mode 100644
index 00000000..205fdc99
--- /dev/null
+++ b/src/gui/widgets/tabbedarea.cpp
@@ -0,0 +1,160 @@
+/*
+ * The Mana World
+ * Copyright 2008 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 "tabbedarea.h"
+#include "tab.h"
+
+#include <guichan/widgets/container.hpp>
+
+TabbedArea::TabbedArea() : gcn::TabbedArea()
+{
+ mWidgetContainer->setOpaque(false);
+}
+
+int TabbedArea::getNumberOfTabs()
+{
+ return mTabs.size();
+}
+
+Tab* TabbedArea::getTab(const std::string &name)
+{
+ TabContainer::iterator itr = mTabs.begin(), itr_end = mTabs.end();
+ while (itr != itr_end)
+ {
+ if ((*itr).first->getCaption() == name)
+ {
+ return static_cast<Tab*>((*itr).first);
+ }
+ ++itr;
+ }
+ return NULL;
+}
+
+void TabbedArea::draw(gcn::Graphics *graphics)
+{
+ if (mTabs.empty())
+ {
+ return;
+ }
+
+ drawChildren(graphics);
+}
+
+gcn::Widget* TabbedArea::getWidget(const std::string &name)
+{
+ TabContainer::iterator itr = mTabs.begin(), itr_end = mTabs.end();
+ while (itr != itr_end)
+ {
+ if ((*itr).first->getCaption() == name)
+ {
+ return (*itr).second;
+ }
+ ++itr;
+ }
+
+ return NULL;
+}
+
+void TabbedArea::addTab(const std::string &caption, gcn::Widget *widget)
+{
+ Tab* tab = new Tab();
+ tab->setCaption(caption);
+ mTabsToDelete.push_back(tab);
+
+ addTab(tab, widget);
+}
+
+void TabbedArea::addTab(Tab *tab, gcn::Widget *widget)
+{
+ tab->setTabbedArea(this);
+ tab->addActionListener(this);
+
+ mTabContainer->add(tab);
+ mTabs.push_back(std::pair<Tab*, gcn::Widget*>(tab, widget));
+
+ if (mSelectedTab == NULL)
+ {
+ setSelectedTab(tab);
+ }
+
+ adjustTabPositions();
+ adjustSize();
+}
+
+void TabbedArea::removeTab(Tab *tab)
+{
+ int tabIndexToBeSelected = 0;
+
+ if (tab == mSelectedTab)
+ {
+ int index = getSelectedTabIndex();
+
+ if (index == (int)mTabs.size() - 1
+ && mTabs.size() == 1)
+ {
+ tabIndexToBeSelected = -1;
+ }
+ else
+ {
+ tabIndexToBeSelected = index - 1;
+ }
+ }
+
+ TabContainer::iterator iter;
+ for (iter = mTabs.begin(); iter != mTabs.end(); iter++)
+ {
+ if (iter->first == tab)
+ {
+ mTabContainer->remove(tab);
+ mTabs.erase(iter);
+ break;
+ }
+ }
+
+ std::vector<gcn::Tab*>::iterator iter2;
+ for (iter2 = mTabsToDelete.begin(); iter2 != mTabsToDelete.end(); iter2++)
+ {
+ if (*iter2 == tab)
+ {
+ mTabsToDelete.erase(iter2);
+ delete tab;
+ break;
+ }
+ }
+
+ if (tabIndexToBeSelected == -1)
+ {
+ mSelectedTab = NULL;
+ mWidgetContainer->clear();
+ }
+ else
+ {
+ setSelectedTab(tabIndexToBeSelected);
+ }
+
+ adjustSize();
+ adjustTabPositions();
+}
+
+void TabbedArea::logic()
+{
+ logicChildren();
+}
diff --git a/src/gui/widgets/tabbedarea.h b/src/gui/widgets/tabbedarea.h
new file mode 100644
index 00000000..2199264b
--- /dev/null
+++ b/src/gui/widgets/tabbedarea.h
@@ -0,0 +1,92 @@
+/*
+ * The Mana World
+ * Copyright 2008 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
+ */
+
+#ifndef _TMW_TABBEDAREA_H
+#define _TMW_TABBEDAREA_H
+
+#include <guichan/widget.hpp>
+#include <guichan/widgets/tabbedarea.hpp>
+
+#include <string>
+
+class Tab;
+
+/**
+ * A tabbed area, the same as the guichan tabbed area in 0.8, but extended
+ */
+class TabbedArea : public gcn::TabbedArea
+{
+ public:
+ /**
+ * Constructor.
+ */
+ TabbedArea();
+
+ /**
+ * Draw the tabbed area.
+ */
+ void draw(gcn::Graphics *graphics);
+
+ /**
+ * Return how many tabs have been created
+ */
+ int getNumberOfTabs();
+
+ /**
+ * Return tab with specified name as caption
+ */
+ Tab* getTab(const std::string &name);
+
+ /**
+ * Returns the widget with the tab that has specified caption
+ */
+ gcn::Widget* getWidget(const std::string &name);
+
+ /**
+ * Add a 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 *widget);
+
+ /**
+ * Add a tab
+ * @param tab The tab
+ * @param widget The widget to display
+ */
+ void addTab(Tab *tab, gcn::Widget *widget);
+
+ /**
+ * Overload the remove tab function as its broken in guichan 0.8
+ */
+ void removeTab(Tab *tab);
+
+ /**
+ * Overload the logic function since it's broken in guichan 0.8
+ */
+ void logic();
+
+ private:
+ typedef std::vector< std::pair<gcn::Tab*, gcn::Widget*> > TabContainer;
+};
+
+#endif
+