00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "gui/widgets/tabbedarea.h"
00023 #include "gui/widgets/tab.h"
00024
00025 #include <guichan/widgets/container.hpp>
00026
00027 TabbedArea::TabbedArea() : gcn::TabbedArea()
00028 {
00029 mWidgetContainer->setOpaque(false);
00030 }
00031
00032 int TabbedArea::getNumberOfTabs() const
00033 {
00034 return mTabs.size();
00035 }
00036
00037 Tab *TabbedArea::getTab(const std::string &name) const
00038 {
00039 TabContainer::const_iterator itr = mTabs.begin(), itr_end = mTabs.end();
00040 while (itr != itr_end)
00041 {
00042 if ((*itr).first->getCaption() == name)
00043 return static_cast<Tab*>((*itr).first);
00044
00045 ++itr;
00046 }
00047 return NULL;
00048 }
00049
00050 void TabbedArea::draw(gcn::Graphics *graphics)
00051 {
00052 if (mTabs.empty())
00053 return;
00054
00055 drawChildren(graphics);
00056 }
00057
00058 gcn::Widget *TabbedArea::getWidget(const std::string &name) const
00059 {
00060 TabContainer::const_iterator itr = mTabs.begin(), itr_end = mTabs.end();
00061 while (itr != itr_end)
00062 {
00063 if ((*itr).first->getCaption() == name)
00064 return (*itr).second;
00065
00066 ++itr;
00067 }
00068
00069 return NULL;
00070 }
00071
00072 void TabbedArea::addTab(const std::string &caption, gcn::Widget *widget)
00073 {
00074 Tab *tab = new Tab;
00075 tab->setCaption(caption);
00076 mTabsToDelete.push_back(tab);
00077
00078 addTab(tab, widget);
00079 }
00080
00081 void TabbedArea::removeTab(Tab *tab)
00082 {
00083 int tabIndexToBeSelected = -1;
00084
00085 if (tab == mSelectedTab)
00086 {
00087 int index = getSelectedTabIndex();
00088
00089 if (index == (int)mTabs.size() - 1 && mTabs.size() == 1)
00090 tabIndexToBeSelected = -1;
00091 else
00092 tabIndexToBeSelected = index - 1;
00093 }
00094
00095 TabContainer::iterator iter;
00096 for (iter = mTabs.begin(); iter != mTabs.end(); iter++)
00097 {
00098 if (iter->first == tab)
00099 {
00100 mTabContainer->remove(tab);
00101 mTabs.erase(iter);
00102 break;
00103 }
00104 }
00105
00106 std::vector<gcn::Tab*>::iterator iter2;
00107 for (iter2 = mTabsToDelete.begin(); iter2 != mTabsToDelete.end(); iter2++)
00108 {
00109 if (*iter2 == tab)
00110 {
00111 mTabsToDelete.erase(iter2);
00112 delete tab;
00113 break;
00114 }
00115 }
00116
00117 if (tabIndexToBeSelected == -1)
00118 {
00119 mSelectedTab = NULL;
00120 mWidgetContainer->clear();
00121 }
00122 else
00123 {
00124 setSelectedTab(tabIndexToBeSelected);
00125 }
00126
00127 adjustSize();
00128 adjustTabPositions();
00129 }
00130
00131 void TabbedArea::logic()
00132 {
00133 logicChildren();
00134 }
00135
00136 void TabbedArea::setSelectedTab(gcn::Tab *tab)
00137 {
00138 gcn::TabbedArea::setSelectedTab(tab);
00139
00140 Tab *newTab = dynamic_cast<Tab*>(tab);
00141
00142 if (newTab)
00143 newTab->setCurrent();
00144 }