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