1 /*
2  * Copyright (C) 2008 Emweb bv, Herent, Belgium.
3  *
4  * See the LICENSE file for terms of use.
5  */
6 
7 #include "Wt/WAnchor.h"
8 #include "Wt/WApplication.h"
9 #include "Wt/WText.h"
10 #include "Wt/WTabWidget.h"
11 #include "Wt/WMenu.h"
12 #include "Wt/WMenuItem.h"
13 #include "Wt/WStackedWidget.h"
14 
15 #include "WebUtils.h"
16 #include "StdWidgetItemImpl.h"
17 
18 namespace Wt {
19 
WTabWidget()20 WTabWidget::WTabWidget()
21 {
22   create();
23 }
24 
create()25 void WTabWidget::create()
26 {
27   layout_ = new WContainerWidget();
28   setImplementation(std::unique_ptr<WWidget>(layout_));
29 
30   std::unique_ptr<WStackedWidget> stack(new WStackedWidget());
31   menu_ = new WMenu(stack.get());
32   layout_->addWidget(std::unique_ptr<WWidget>(menu_));
33   layout_->addWidget(std::move(stack));
34 
35   setJavaScriptMember(WT_RESIZE_JS, StdWidgetItemImpl::secondResizeJS());
36   setJavaScriptMember(WT_GETPS_JS, StdWidgetItemImpl::secondGetPSJS());
37 
38   menu_->itemSelected().connect(this, &WTabWidget::onItemSelected);
39   menu_->itemClosed().connect(this, &WTabWidget::onItemClosed);
40 }
41 
addTab(std::unique_ptr<WWidget> child,const WString & label,ContentLoading loadPolicy)42 WMenuItem *WTabWidget::addTab(std::unique_ptr<WWidget> child,
43 			      const WString& label,
44 			      ContentLoading loadPolicy)
45 {
46   return insertTab(count(), std::move(child), label, loadPolicy);
47 }
48 
insertTab(int index,std::unique_ptr<WWidget> child,const WString & label,ContentLoading loadPolicy)49 WMenuItem *WTabWidget::insertTab(int index,
50                                  std::unique_ptr<WWidget> child,
51                                  const WString &label,
52                                  ContentLoading loadPolicy)
53 {
54   contentsWidgets_.insert(contentsWidgets_.begin() + index, child.get());
55   std::unique_ptr<WMenuItem> item
56     (new WMenuItem(label, std::move(child), loadPolicy));
57   WMenuItem *result = item.get();
58   menu_->insertItem(index, std::move(item));
59   return result;
60 }
61 
removeTab(WWidget * child)62 std::unique_ptr<WWidget> WTabWidget::removeTab(WWidget *child)
63 {
64   int tabIndex = indexOf(child);
65 
66   if (tabIndex != -1) {
67     contentsWidgets_.erase(contentsWidgets_.begin() + tabIndex);
68 
69     WMenuItem *item = menu_->itemAt(tabIndex);
70     std::unique_ptr<WWidget> result = item->removeContents();
71     menu_->removeItem(item);
72     return result;
73   } else
74     return std::unique_ptr<WWidget>();
75 }
76 
count()77 int WTabWidget::count() const
78 {
79   return contentsWidgets_.size();
80 }
81 
widget(int index)82 WWidget *WTabWidget::widget(int index) const
83 {
84   return contentsWidgets_[index];
85 }
86 
itemAt(int index)87 WMenuItem *WTabWidget::itemAt(int index) const
88 {
89   return menu_->itemAt(index);
90 }
91 
indexOf(WWidget * widget)92 int WTabWidget::indexOf(WWidget *widget) const
93 {
94   return Utils::indexOf(contentsWidgets_, widget);
95 }
96 
setCurrentIndex(int index)97 void WTabWidget::setCurrentIndex(int index)
98 {
99   menu_->select(index);
100 }
101 
currentIndex()102 int WTabWidget::currentIndex() const
103 {
104   return menu_->currentIndex();
105 }
106 
setCurrentWidget(WWidget * widget)107 void WTabWidget::setCurrentWidget(WWidget *widget)
108 {
109   setCurrentIndex(indexOf(widget));
110 }
111 
currentWidget()112 WWidget *WTabWidget::currentWidget() const
113 {
114   return menu_->currentItem()->contents();
115 }
116 
currentItem()117 WMenuItem *WTabWidget::currentItem() const
118 {
119   return menu_->currentItem();
120 }
121 
setTabEnabled(int index,bool enable)122 void WTabWidget::setTabEnabled(int index, bool enable)
123 {
124   menu_->setItemDisabled(index, !enable);
125 }
126 
isTabEnabled(int index)127 bool WTabWidget::isTabEnabled(int index) const
128 {
129   return !menu_->isItemDisabled(index);
130 }
131 
setTabHidden(int index,bool hidden)132 void WTabWidget::setTabHidden(int index, bool hidden)
133 {
134   menu_->setItemHidden(index, hidden);
135 }
136 
isTabHidden(int index)137 bool WTabWidget::isTabHidden(int index) const
138 {
139   return menu_->isItemHidden(index);
140 }
141 
setTabCloseable(int index,bool closeable)142 void WTabWidget::setTabCloseable(int index, bool closeable)
143 {
144   menu_->itemAt(index)->setCloseable(closeable);
145 }
146 
isTabCloseable(int index)147 bool WTabWidget::isTabCloseable(int index)
148 {
149   return menu_->itemAt(index)->isCloseable();
150 }
151 
closeTab(int index)152 void WTabWidget::closeTab(int index)
153 {
154   setTabHidden(index, true);
155   tabClosed_.emit(index);
156 }
157 
setTabText(int index,const WString & label)158 void WTabWidget::setTabText(int index, const WString& label)
159 {
160   WMenuItem *item = menu_->itemAt(index);
161   item->setText(label);
162 }
163 
tabText(int index)164 WString WTabWidget::tabText(int index) const
165 {
166   WMenuItem *item = menu_->itemAt(index);
167   return item->text();
168 }
169 
setTabToolTip(int index,const WString & tip)170 void WTabWidget::setTabToolTip(int index, const WString& tip)
171 {
172   WMenuItem *item = menu_->itemAt(index);
173   item->setToolTip(tip);
174 }
175 
tabToolTip(int index)176 WString WTabWidget::tabToolTip(int index) const
177 {
178   WMenuItem *item = menu_->itemAt(index);
179   return item->toolTip();
180 }
181 
internalPathEnabled()182 bool WTabWidget::internalPathEnabled() const
183 {
184   return menu_->internalPathEnabled();
185 }
186 
setInternalPathEnabled(const std::string & basePath)187 void WTabWidget::setInternalPathEnabled(const std::string& basePath)
188 {
189   menu_->setInternalPathEnabled(basePath);
190 }
191 
internalBasePath()192 const std::string& WTabWidget::internalBasePath() const
193 {
194   return menu_->internalBasePath();
195 }
196 
setInternalBasePath(const std::string & path)197 void WTabWidget::setInternalBasePath(const std::string& path)
198 {
199   menu_->setInternalBasePath(path);
200 }
201 
onItemSelected(WMenuItem * item)202 void WTabWidget::onItemSelected(WMenuItem *item)
203 {
204   currentChanged_.emit(menu_->currentIndex());
205 }
206 
onItemClosed(WMenuItem * item)207 void WTabWidget::onItemClosed(WMenuItem *item)
208 {
209   closeTab(menu_->indexOf(item));
210 }
211 
contentsStack()212 WStackedWidget *WTabWidget::contentsStack() const
213 {
214   return menu_->contentsStack();
215 }
216 
setOverflow(Overflow value,WFlags<Orientation> orientation)217 void WTabWidget::setOverflow(Overflow value,
218 	WFlags<Orientation> orientation)
219 {
220   layout_->setOverflow(value, orientation);
221 }
222 
223 }
224