Tizen 2.1 base
[framework/osp/uifw.git] / src / ui / FUi_RelativeLayoutImpl.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://floralicense.org/license/
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 /**
18  * @file                FUi_RelativeLayoutImpl.cpp
19  * @brief       This is the implementation file for _RelativeLayoutImpl class.
20  *
21  * This file contains the implementation of _RelativeLayoutImpl class.
22  */
23
24 #include "FUi_RelativeLayoutImpl.h"
25
26 namespace Tizen { namespace Ui
27 {
28
29 namespace
30 {
31
32 _Layout::RelativeLayoutEdge
33 ConvertEnum(CenterAlignmentType var)
34 {
35         switch (var)
36         {
37         case CENTER_ALIGN_HORIZONTAL:
38                 return _Layout::EDGE_HCENTER;
39
40         case CENTER_ALIGN_VERTICAL:
41                 return _Layout::EDGE_VCENTER;
42
43         default:
44                 return _Layout::EDGE_NONE;
45         }
46 }
47
48 _Layout::RelativeLayoutEdge
49 ConvertEnum(RectangleEdgeType var)
50 {
51         switch (var)
52         {
53         case RECT_EDGE_LEFT:
54                 return _Layout::EDGE_LEFT;
55
56         case RECT_EDGE_RIGHT:
57                 return _Layout::EDGE_RIGHT;
58
59         case RECT_EDGE_TOP:
60                 return _Layout::EDGE_TOP;
61
62         case RECT_EDGE_BOTTOM:
63                 return _Layout::EDGE_BOTTOM;
64
65         default:
66                 return _Layout::EDGE_NONE;
67         }
68 }
69
70 }
71
72 // _RelativelayoutImpl implementation
73 _RelativeLayoutImpl::_RelativeLayoutImpl(RelativeLayout* pPublicLayout, _Layout::RelativeLayout* pCoreLayout)
74         : _LayoutImpl(pPublicLayout, pCoreLayout)
75 {
76 }
77
78 _RelativeLayoutImpl::~_RelativeLayoutImpl(void)
79 {
80 }
81
82 Tizen::Ui::LayoutType
83 _RelativeLayoutImpl::GetLayoutType(void) const
84 {
85         return LAYOUT_RELATIVE;
86 }
87
88 _RelativeLayoutImpl*
89 _RelativeLayoutImpl::CreateRelativeLayoutImplN(RelativeLayout* pPublicLayout)
90 {
91         ClearLastResult();
92
93         _Layout::RelativeLayout* pCoreLayout = null;
94         _RelativeLayoutImpl* pImplLayout = null;
95         result r = E_SUCCESS;
96
97         pCoreLayout = _Layout::RelativeLayout::CreateRelativeLayoutN();
98         r = GetLastResult();
99         SysTryReturn(NID_UI, pCoreLayout != null, null, r, "[%s] Propagating.", GetErrorMessage(r));
100
101         pImplLayout = new (std::nothrow) _RelativeLayoutImpl(pPublicLayout, pCoreLayout);
102         r = CheckConstruction(pCoreLayout, pImplLayout);
103         SysTryReturn(NID_UI, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
104
105         return pImplLayout;
106 }
107
108 const char*
109 _RelativeLayoutImpl::GetPublicClassName(void) const
110 {
111         return "Tizen::Ui::RelativeLayout";
112 }
113
114 const RelativeLayout&
115 _RelativeLayoutImpl::GetPublic(void) const
116 {
117         return static_cast <const RelativeLayout&>(_LayoutImpl::GetPublic());
118 }
119
120 RelativeLayout&
121 _RelativeLayoutImpl::GetPublic(void)
122 {
123         return static_cast <RelativeLayout&>(_LayoutImpl::GetPublic());
124 }
125
126 const _Layout::RelativeLayout&
127 _RelativeLayoutImpl::GetCore(void) const
128 {
129         return static_cast <const _Layout::RelativeLayout&>(_LayoutImpl::GetCore());
130 }
131
132 _Layout::RelativeLayout&
133 _RelativeLayoutImpl::GetCore(void)
134 {
135         return static_cast <_Layout::RelativeLayout&>(_LayoutImpl::GetCore());
136 }
137
138 const _RelativeLayoutImpl*
139 _RelativeLayoutImpl::GetInstance(const RelativeLayout& layout)
140 {
141         return static_cast<const _RelativeLayoutImpl*>(_LayoutImpl::GetInstance(layout));
142 }
143
144 _RelativeLayoutImpl*
145 _RelativeLayoutImpl::GetInstance(RelativeLayout& layout)
146 {
147         return static_cast<_RelativeLayoutImpl*>(_LayoutImpl::GetInstance(layout));
148 }
149
150 result
151 _RelativeLayoutImpl::SetCenterAligned(_ControlImpl& control, CenterAlignmentType alignment)
152 {
153         ClearLastResult();
154
155         _Layout::LayoutItem& layoutItem = control.GetLayoutContainer();
156
157         _Layout::RelativeLayoutEdge edge = ConvertEnum(alignment);
158         SysTryReturn(NID_UI, edge != _Layout::EDGE_NONE, E_INVALID_ARG, E_INVALID_ARG,
159                                 "[E_INVALID_ARG] The rectangle edge is invalid argument.");
160
161         result r = GetCore().SetRelation(layoutItem, edge);
162
163         return r;
164 }
165
166 result
167 _RelativeLayoutImpl::SetRelation(_ControlImpl& childControl, _ControlImpl& targetControl, RectangleEdgeRelation edgeRelation)
168 {
169         ClearLastResult();
170
171         _Layout::LayoutItem& childItem = childControl.GetLayoutContainer();
172         _Layout::LayoutItem& targetItem = targetControl.GetLayoutContainer();
173
174         result r = E_SUCCESS;
175         _Layout::RelativeLayoutEdge sourceEdge;
176         _Layout::RelativeLayoutEdge targetEdge;
177         switch (edgeRelation)
178         {
179         case RECT_EDGE_RELATION_LEFT_TO_LEFT:
180                 sourceEdge = _Layout::EDGE_LEFT;
181                 targetEdge = _Layout::EDGE_LEFT;
182                 break;
183
184         case RECT_EDGE_RELATION_LEFT_TO_RIGHT:
185                 sourceEdge = _Layout::EDGE_LEFT;
186                 targetEdge = _Layout::EDGE_RIGHT;
187                 break;
188
189         case RECT_EDGE_RELATION_RIGHT_TO_RIGHT:
190                 sourceEdge = _Layout::EDGE_RIGHT;
191                 targetEdge = _Layout::EDGE_RIGHT;
192                 break;
193
194         case RECT_EDGE_RELATION_RIGHT_TO_LEFT:
195                 sourceEdge = _Layout::EDGE_RIGHT;
196                 targetEdge = _Layout::EDGE_LEFT;
197                 break;
198
199         case RECT_EDGE_RELATION_TOP_TO_TOP:
200                 sourceEdge = _Layout::EDGE_TOP;
201                 targetEdge = _Layout::EDGE_TOP;
202                 break;
203
204         case RECT_EDGE_RELATION_TOP_TO_BOTTOM:
205                 sourceEdge = _Layout::EDGE_TOP;
206                 targetEdge = _Layout::EDGE_BOTTOM;
207                 break;
208
209         case RECT_EDGE_RELATION_BOTTOM_TO_BOTTOM:
210                 sourceEdge = _Layout::EDGE_BOTTOM;
211                 targetEdge = _Layout::EDGE_BOTTOM;
212                 break;
213
214         case RECT_EDGE_RELATION_BOTTOM_TO_TOP:
215                 sourceEdge = _Layout::EDGE_BOTTOM;
216                 targetEdge = _Layout::EDGE_TOP;
217                 break;
218
219         default:
220                 //SysAssert(false);
221                 SysTryReturn(NID_UI, false, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The rectangle edge is invalid argument.");
222                 break;
223         }
224
225         r = GetCore().SetRelation(childItem, sourceEdge, &targetItem, targetEdge);
226
227         return r;
228 }
229
230 result
231 _RelativeLayoutImpl::ResetCenterAligned(_ControlImpl& control, CenterAlignmentType alignment)
232 {
233         ClearLastResult();
234
235         _Layout::LayoutItem& layoutItem = control.GetLayoutContainer();
236
237         _Layout::RelativeLayoutEdge edge = ConvertEnum(alignment);
238         SysTryReturn(NID_UI, edge != _Layout::EDGE_NONE, E_INVALID_ARG, E_INVALID_ARG,
239                                 "[E_INVALID_ARG] The rectangle edge is invalid argument.");
240
241         result r = GetCore().UnsetRelation(layoutItem, edge);
242
243         return r;
244 }
245
246 result
247 _RelativeLayoutImpl::ResetRelation(_ControlImpl& control, RectangleEdgeType edgeType)
248 {
249         ClearLastResult();
250
251         _Layout::LayoutItem& layoutItem = control.GetLayoutContainer();
252
253         _Layout::RelativeLayoutEdge edge = ConvertEnum(edgeType);
254         SysTryReturn(NID_UI, edge != _Layout::EDGE_NONE, E_INVALID_ARG, E_INVALID_ARG,
255                                 "[E_INVALID_ARG] The rectangle edge is invalid argument.");
256
257         result r = GetCore().UnsetRelation(layoutItem, edge);
258
259         return r;
260 }
261
262 result
263 _RelativeLayoutImpl::SetHeight(_ControlImpl& control, int height)
264 {
265         ClearLastResult();
266
267         result r = SetVerticalFitPolicy(control, FIT_POLICY_FIXED);
268         SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
269
270         _Layout::LayoutRect rect;
271         r = GetItemBaseRect(control, rect);
272         SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
273
274         rect.h = height;
275         r = SetItemBaseRect(control, rect);
276         SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
277
278         return r;
279 }
280
281 result
282 _RelativeLayoutImpl::SetWidth(_ControlImpl& control, int width)
283 {
284         ClearLastResult();
285
286         result r = SetHorizontalFitPolicy(control, FIT_POLICY_FIXED);
287         SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
288
289         _Layout::LayoutRect rect;
290         r = GetItemBaseRect(control, rect);
291         SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
292
293         rect.w = width;
294         r = SetItemBaseRect(control, rect);
295         SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
296
297         return r;
298 }
299
300 result
301 _RelativeLayoutImpl::SetItemMargin(const _ControlImpl& item, int left, int right, int top, int bottom)
302 {
303         return _LayoutImpl::SetMargin(item, left, right, top, bottom);
304 }
305
306 result
307 _RelativeLayoutImpl::GetItemMargin(const _ControlImpl& item, int& left, int& right, int& top, int& bottom)
308 {
309         return _LayoutImpl::GetMargin(item, left, right, top, bottom);
310 }
311
312 result
313 _RelativeLayoutImpl::SetItemHorizontalFitPolicy(const _ControlImpl& item, const FitPolicy policy)
314 {
315         return _LayoutImpl::SetHorizontalFitPolicy(item, policy);
316 }
317
318 result
319 _RelativeLayoutImpl::SetItemVerticalFitPolicy(const _ControlImpl& item, FitPolicy policy)
320 {
321         return _LayoutImpl::SetVerticalFitPolicy(item, policy);
322 }
323
324 }} // Tizen::Ui