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