1 /*
2  * Copyright (C) 2008 Emweb bv, Herent, Belgium.
3  *
4  * See the LICENSE file for terms of use.
5  */
6 
7 #include "Wt/WApplication.h"
8 #include "Wt/WContainerWidget.h"
9 #include "Wt/WEnvironment.h"
10 #include "Wt/WFitLayout.h"
11 #include "Wt/WLogger.h"
12 
13 #include "StdGridLayoutImpl2.h"
14 #include "FlexLayoutImpl.h"
15 
16 namespace Wt {
17 
18 LOGGER("WFitLayout");
19 
WFitLayout()20 WFitLayout::WFitLayout()
21 {
22   grid_.columns_.push_back(Impl::Grid::Section(0));
23   grid_.rows_.push_back(Impl::Grid::Section(0));
24 
25   std::vector<Impl::Grid::Item> items;
26   items.push_back(Impl::Grid::Item());
27   grid_.items_.push_back(std::move(items));
28 }
29 
~WFitLayout()30 WFitLayout::~WFitLayout()
31 { }
32 
fitWidget(WContainerWidget * container,std::unique_ptr<WWidget> widget)33 void WFitLayout::fitWidget(WContainerWidget *container,
34 			   std::unique_ptr<WWidget> widget)
35 {
36   std::unique_ptr<WFitLayout> l(new WFitLayout());
37   l->addWidget(std::move(widget));
38   container->setLayout(std::move(l));
39 }
40 
addItem(std::unique_ptr<WLayoutItem> item)41 void WFitLayout::addItem(std::unique_ptr<WLayoutItem> item)
42 {
43   if (grid_.items_[0][0].item_) {
44     LOG_ERROR("addItem(): already have a widget");
45     return;
46   }
47 
48   WLayoutItem *it = item.get();
49   grid_.items_[0][0].item_ = std::move(item);
50   itemAdded(it);
51 }
52 
removeItem(WLayoutItem * item)53 std::unique_ptr<WLayoutItem> WFitLayout::removeItem(WLayoutItem *item)
54 {
55   if (item == grid_.items_[0][0].item_.get()) {
56     auto result = std::move(grid_.items_[0][0].item_);
57     itemRemoved(item);
58     return result;
59   } else
60     return std::unique_ptr<WLayoutItem>();
61 }
62 
itemAt(int index)63 WLayoutItem *WFitLayout::itemAt(int index) const
64 {
65   return grid_.items_[0][0].item_.get();
66 }
67 
indexOf(WLayoutItem * item)68 int WFitLayout::indexOf(WLayoutItem *item) const
69 {
70   if (grid_.items_[0][0].item_.get() == item)
71     return 0;
72   else
73     return -1;
74 }
75 
count()76 int WFitLayout::count() const
77 {
78   return grid_.items_[0][0].item_ ? 1 : 0;
79 }
80 
81 
iterateWidgets(const HandleWidgetMethod & method)82 void WFitLayout::iterateWidgets(const HandleWidgetMethod& method) const
83 {
84   if (grid_.items_[0][0].item_)
85     grid_.items_[0][0].item_->iterateWidgets(method);
86 }
87 
setParentWidget(WWidget * parent)88 void WFitLayout::setParentWidget(WWidget *parent)
89 {
90   WLayout::setParentWidget(parent);
91 
92   if (parent) {
93     updateImplementation();
94   }
95 }
96 
updateImplementation()97 void WFitLayout::updateImplementation()
98 {
99   if (!parentWidget())
100     return;
101 
102   bool isFlexLayout = implementationIsFlexLayout();
103 
104   if (isFlexLayout)
105     setImpl(std::make_unique<FlexLayoutImpl>(this, grid_));
106   else
107     setImpl(std::make_unique<StdGridLayoutImpl2>(this, grid_));
108 }
109 
implementationIsFlexLayout()110 bool WFitLayout::implementationIsFlexLayout() const
111 {
112   const WEnvironment &env = WApplication::instance()->environment();
113   return preferredImplementation() == LayoutImplementation::Flex &&
114          !env.agentIsIElt(10);
115 }
116 
117 }
118