1 /*
2 * Copyright (C) 2008 Emweb bv, Herent, Belgium.
3 *
4 * See the LICENSE file for terms of use.
5 */
6
7 #include "Wt/WContainerWidget.h"
8 #include "Wt/WIconPair.h"
9 #include "Wt/WTemplate.h"
10 #include "Wt/WText.h"
11 #include "Wt/WTreeTable.h"
12 #include "Wt/WTreeTableNode.h"
13
14 namespace Wt {
15
WTreeTableNode(const WString & labelText,std::unique_ptr<WIconPair> labelIcon)16 WTreeTableNode::WTreeTableNode(const WString& labelText,
17 std::unique_ptr<WIconPair> labelIcon)
18 : WTreeNode(labelText, std::move(labelIcon)),
19 table_(nullptr),
20 row_(nullptr)
21 { }
22
insertChildNode(int index,std::unique_ptr<WTreeNode> node)23 void WTreeTableNode::insertChildNode(int index,
24 std::unique_ptr<WTreeNode> node)
25 {
26 if (table_)
27 (dynamic_cast<WTreeTableNode *>(node.get()))->setTable(table_);
28
29 WTreeNode::insertChildNode(index, std::move(node));
30 }
31
setColumnWidget(int column,std::unique_ptr<WWidget> widget)32 void WTreeTableNode::setColumnWidget(int column,
33 std::unique_ptr<WWidget> widget)
34 {
35 --column;
36
37 createExtraColumns(column);
38
39 if (column < (int)columnWidgets_.size()) {
40 if (columnWidgets_[column].widget)
41 columnWidgets_[column].widget->removeFromParent();
42 columnWidgets_[column] = ColumnWidget(widget.get(), true);
43 } else {
44 columnWidgets_.push_back(ColumnWidget(widget.get(), true));
45 }
46
47 widget->setInline(false);
48 widget->setFloatSide(Side::Left);
49 widget->resize(columnWidth(column + 1), WLength::Auto);
50 widget->setMinimumSize(WLength::Auto, 1);
51 if (column == static_cast<int>(columnWidgets_.size()) - 1)
52 row_->addWidget(std::move(widget));
53 else
54 row_->insertBefore(std::move(widget), columnWidgets_[column + 1].widget);
55 }
56
createExtraColumns(int numColumns)57 void WTreeTableNode::createExtraColumns(int numColumns)
58 {
59 if (!row_) {
60 row_ = impl()->bindWidget("cols-row", std::make_unique<WContainerWidget>());
61 row_->addStyleClass("cols-row");
62 }
63
64 while (static_cast<int>(columnWidgets_.size()) < numColumns) {
65 std::unique_ptr<WText> w(new WText(WString::fromUTF8(" ")));
66 w->setInline(false);
67 columnWidgets_.push_back(ColumnWidget(w.get(), false));
68 w->setFloatSide(Side::Left);
69 w->resize(columnWidth(columnWidgets_.size()), 1);
70 row_->addWidget(std::move(w));
71 }
72 }
73
columnWidget(int column)74 WWidget *WTreeTableNode::columnWidget(int column)
75 {
76 --column;
77
78 return
79 (column < static_cast<int>(columnWidgets_.size())
80 && columnWidgets_[column].isSet)
81 ? columnWidgets_[column].widget
82 : nullptr;
83 }
84
columnWidth(int column)85 WLength WTreeTableNode::columnWidth(int column)
86 {
87 if (table_)
88 return table_->columnWidth(column);
89 else
90 return WLength::Auto;
91 }
92
setTable(WTreeTable * table)93 void WTreeTableNode::setTable(WTreeTable *table)
94 {
95 if (table_ != table) {
96 table_ = table;
97
98 for (unsigned i = 0; i < childNodes().size(); ++i)
99 dynamic_cast<WTreeTableNode *>(childNodes()[i])->setTable(table);
100
101 createExtraColumns(table->columnCount() - 1);
102
103 for (unsigned i = 0; i < columnWidgets_.size(); ++i) {
104 WWidget *w = columnWidgets_[i].widget;
105 w->resize(columnWidth(i + 1), w->height());
106 }
107 }
108 }
109
110 }
111