2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.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
9 // http://www.apache.org/licenses/LICENSE-2.0/
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.
18 * @file FUi_LayoutImpl.cpp
19 * @brief This is the implementation file for _Layout class.
21 * This file contains the implementation of _Layout class.
24 #include <FUiLayout.h>
25 #include <FUiRelativeLayout.h>
26 #include <FUiGridLayout.h>
27 #include <FUiVerticalBoxLayout.h>
28 #include <FUiHorizontalBoxLayout.h>
29 #include <FUiCardLayout.h>
30 #include "FUi_LayoutImpl.h"
32 using namespace Tizen::Base;
34 namespace Tizen { namespace Ui
39 static const int CONVERT_ERROR_CODE = -1;
41 _Layout::HorizontalAlign
42 ConvertEnum(const LayoutHorizontalAlignment val)
46 case LAYOUT_HORIZONTAL_ALIGN_LEFT:
47 return _Layout::ITEM_HORIZONTAL_ALIGN_LEFT;
49 case LAYOUT_HORIZONTAL_ALIGN_RIGHT:
50 return _Layout::ITEM_HORIZONTAL_ALIGN_RIGHT;
52 case LAYOUT_HORIZONTAL_ALIGN_CENTER:
53 return _Layout::ITEM_HORIZONTAL_ALIGN_CENTER;
56 return static_cast <_Layout::HorizontalAlign>(CONVERT_ERROR_CODE);
60 LayoutHorizontalAlignment
61 ConvertEnum(const _Layout::HorizontalAlign val)
65 case _Layout::ITEM_HORIZONTAL_ALIGN_LEFT:
66 return LAYOUT_HORIZONTAL_ALIGN_LEFT;
68 case _Layout::ITEM_HORIZONTAL_ALIGN_RIGHT:
69 return LAYOUT_HORIZONTAL_ALIGN_RIGHT;
71 case _Layout::ITEM_HORIZONTAL_ALIGN_CENTER:
72 return LAYOUT_HORIZONTAL_ALIGN_CENTER;
75 return static_cast <LayoutHorizontalAlignment>(CONVERT_ERROR_CODE);
79 _Layout::VerticalAlign
80 ConvertEnum(const LayoutVerticalAlignment val)
84 case LAYOUT_VERTICAL_ALIGN_TOP:
85 return _Layout::ITEM_VERTICAL_ALIGN_TOP;
87 case LAYOUT_VERTICAL_ALIGN_BOTTOM:
88 return _Layout::ITEM_VERTICAL_ALIGN_BOTTOM;
90 case LAYOUT_VERTICAL_ALIGN_MIDDLE:
91 return _Layout::ITEM_VERTICAL_ALIGN_MIDDLE;
94 return static_cast <_Layout::VerticalAlign>(CONVERT_ERROR_CODE);
98 LayoutVerticalAlignment
99 ConvertEnum(const _Layout::VerticalAlign val)
103 case _Layout::ITEM_VERTICAL_ALIGN_TOP:
104 return LAYOUT_VERTICAL_ALIGN_TOP;
106 case _Layout::ITEM_VERTICAL_ALIGN_BOTTOM:
107 return LAYOUT_VERTICAL_ALIGN_BOTTOM;
109 case _Layout::ITEM_VERTICAL_ALIGN_MIDDLE:
110 return LAYOUT_VERTICAL_ALIGN_MIDDLE;
113 return static_cast <LayoutVerticalAlignment>(CONVERT_ERROR_CODE);
117 _Layout::LayoutMatchMode
118 ConvertEnum(FitPolicy val)
122 case FIT_POLICY_FIXED:
123 return _Layout::NONE_MODE;
125 case FIT_POLICY_CONTENT:
126 return _Layout::WRAP_CONTENT;
128 case FIT_POLICY_PARENT:
129 return _Layout::MATCH_PARENT;
132 return static_cast <_Layout::LayoutMatchMode>(CONVERT_ERROR_CODE);
137 ConvertEnum(_Layout::LayoutMatchMode val)
141 case _Layout::NONE_MODE:
142 return FIT_POLICY_FIXED;
144 case _Layout::WRAP_CONTENT:
145 return FIT_POLICY_CONTENT;
147 case _Layout::MATCH_PARENT:
148 return FIT_POLICY_PARENT;
151 return static_cast <FitPolicy>(CONVERT_ERROR_CODE);
156 // _LayoutImpl implementation
157 _LayoutImpl::_LayoutImpl(Layout* pPublicLayout, _Layout::Layout* pCoreLayout)
158 : _pPublicLayout(pPublicLayout)
159 , _pCoreLayout(pCoreLayout)
163 _LayoutImpl::~_LayoutImpl()
169 _LayoutImpl::CheckConstruction(_Layout::Layout* pCoreLayout, _LayoutImpl* pImplLayout)
171 if (pImplLayout == null)
174 SysLogException(NID_UI, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
175 return E_OUT_OF_MEMORY;
178 result r = GetLastResult();
185 SysLogException(NID_UI, r, "[%s] Propagating.", GetErrorMessage(r));
192 _SharedPtr <_LayoutImpl>
193 _LayoutImpl::GetLayoutImpl(Layout* pPublicLayout)
195 LayoutImplHolder* pHolder = static_cast <LayoutImplHolder*>(pPublicLayout->_pImpl);
196 SysAssert(pHolder != null);
198 return pHolder->layoutImpl;
202 _LayoutImpl::SetLayoutImpl(Layout* pPublicLayout, _LayoutImpl* pImplLayout)
204 LayoutImplHolder* pHolder = static_cast <LayoutImplHolder*>(pPublicLayout->_pImpl);
205 SysAssert(pHolder != null);
207 pHolder->layoutImpl.SetNull();
208 pHolder->layoutImpl.Bind(pImplLayout);
212 _LayoutImpl::GetPublicClassName(void) const
214 return "Tizen::Ui::Layout";
218 _LayoutImpl::GetPublic(void) const
220 return *_pPublicLayout;
224 _LayoutImpl::GetPublic(void)
226 return *_pPublicLayout;
229 const _Layout::Layout&
230 _LayoutImpl::GetCore(void) const
232 return *_pCoreLayout;
236 _LayoutImpl::GetCore(void)
238 return *_pCoreLayout;
242 _LayoutImpl::GetInstance(const Layout& layout)
244 LayoutImplHolder* pHolder = static_cast <LayoutImplHolder*>(layout._pImpl);
245 SysAssert(pHolder != null);
247 const _LayoutImpl* pImpl = pHolder->layoutImpl.Get();
253 _LayoutImpl::GetInstance(Layout& layout)
255 LayoutImplHolder* pHolder = static_cast <LayoutImplHolder*>(layout._pImpl);
256 SysAssert(pHolder != null);
258 _LayoutImpl* pImpl = pHolder->layoutImpl.Get();
264 _LayoutImpl::SetAlignment(const _ControlImpl& item, const LayoutHorizontalAlignment horizontalAlign, const LayoutVerticalAlignment verticalAlign)
268 _Layout::LayoutItem& layoutItem = item.GetLayoutContainer();
270 _Layout::ItemAlign itemAlign;
271 itemAlign.HAlign = ConvertEnum(horizontalAlign);
272 SysTryReturn(NID_UI, itemAlign.HAlign != (_Layout::HorizontalAlign) CONVERT_ERROR_CODE,
273 E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The given parameter is invalid.");
275 itemAlign.VAlign = ConvertEnum(verticalAlign);
276 SysTryReturn(NID_UI, itemAlign.VAlign != (_Layout::VerticalAlign) CONVERT_ERROR_CODE,
277 E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The given parameter is invalid.");
279 return _pCoreLayout->SetItemAlignment(layoutItem, itemAlign);
283 _LayoutImpl::GetAlignment(const _ControlImpl& item, LayoutHorizontalAlignment& horizontalAlign, LayoutVerticalAlignment& verticalAlign) const
285 _Layout::LayoutItem& layoutItem = item.GetLayoutContainer();
287 _Layout::ItemAlign itemAlign;
289 result r = _pCoreLayout->GetItemAlignment(layoutItem, itemAlign);
290 SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
292 horizontalAlign = ConvertEnum(itemAlign.HAlign);
293 verticalAlign = ConvertEnum(itemAlign.VAlign);
299 _LayoutImpl::SetMargin(const _ControlImpl& item, int left, int right, int top, int bottom)
301 SysTryReturn(NID_UI, left >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The left margin is negative.");
302 SysTryReturn(NID_UI, right >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The right margin is negative.");
303 SysTryReturn(NID_UI, top >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The top margin is negative.");
304 SysTryReturn(NID_UI, bottom >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The bottom margin is negative.");
306 _Layout::LayoutItem& layoutItem = item.GetLayoutContainer();
308 _Layout::ItemMargin itemMargin;
310 itemMargin.left = left;
311 itemMargin.right = right;
312 itemMargin.top = top;
313 itemMargin.bottom = bottom;
315 result r = _pCoreLayout->SetItemMargin(layoutItem, itemMargin);
321 _LayoutImpl::SetMargin(const _ControlImpl& item, float left, float right, float top, float bottom)
323 SysTryReturn(NID_UI, left >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The left margin is negative.");
324 SysTryReturn(NID_UI, right >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The right margin is negative.");
325 SysTryReturn(NID_UI, top >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The top margin is negative.");
326 SysTryReturn(NID_UI, bottom >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The bottom margin is negative.");
328 _Layout::LayoutItem& layoutItem = item.GetLayoutContainer();
330 _Layout::ItemMargin itemMargin;
332 itemMargin.left = static_cast <int>(left);
333 itemMargin.right = static_cast <int>(right);
334 itemMargin.top = static_cast <int>(top);
335 itemMargin.bottom = static_cast <int>(bottom);
337 result r = _pCoreLayout->SetItemMargin(layoutItem, itemMargin);
343 _LayoutImpl::GetMargin(const _ControlImpl& item, int& left, int& right, int& top, int& bottom) const
345 _Layout::LayoutItem& layoutItem = item.GetLayoutContainer();
347 _Layout::ItemMargin itemMargin;
349 result r = _pCoreLayout->GetItemMargin(layoutItem, itemMargin);
350 SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
352 left = itemMargin.left;
353 right = itemMargin.right;
354 top = itemMargin.top;
355 bottom = itemMargin.bottom;
361 _LayoutImpl::GetMargin(const _ControlImpl& item, float& left, float& right, float& top, float& bottom) const
363 _Layout::LayoutItem& layoutItem = item.GetLayoutContainer();
365 _Layout::ItemMargin itemMargin;
367 result r = _pCoreLayout->GetItemMargin(layoutItem, itemMargin);
368 SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
370 left = static_cast <float>(itemMargin.left);
371 right = static_cast <float>(itemMargin.right);
372 top = static_cast <float>(itemMargin.top);
373 bottom = static_cast <float>(itemMargin.bottom);
379 _LayoutImpl::SetHorizontalFitPolicy(const _ControlImpl& item, const FitPolicy policy)
381 _Layout::LayoutItem& layoutItem = item.GetLayoutContainer();
383 _Layout::LayoutMatchMode matchMode;
385 matchMode = ConvertEnum(policy);
387 SysTryReturn(NID_UI, matchMode != (_Layout::LayoutMatchMode) CONVERT_ERROR_CODE,
388 E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The given parameter is invalid.");
390 result r = _pCoreLayout->SetItemWidthMatchMode(layoutItem, matchMode);
396 _LayoutImpl::GetHorizontalFitPolicy(const _ControlImpl& item, FitPolicy& policy) const
398 _Layout::LayoutItem& layoutItem = item.GetLayoutContainer();
400 _Layout::LayoutMatchMode matchMode;
402 result r = _pCoreLayout->GetItemWidthMatchMode(layoutItem, matchMode);
403 SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
405 policy = ConvertEnum(matchMode);
411 _LayoutImpl::SetVerticalFitPolicy(const _ControlImpl& item, const FitPolicy matchMode)
413 _Layout::LayoutItem& layoutItem = item.GetLayoutContainer();
415 _Layout::LayoutMatchMode layoutMatchMode;
417 layoutMatchMode = ConvertEnum(matchMode);
419 SysTryReturn(NID_UI, layoutMatchMode != (_Layout::LayoutMatchMode) CONVERT_ERROR_CODE,
420 E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The given parameter is invalid.");
422 result r = _pCoreLayout->SetItemHeightMatchMode(layoutItem, layoutMatchMode);
428 _LayoutImpl::GetVerticalFitPolicy(const _ControlImpl& item, FitPolicy& policy) const
430 _Layout::LayoutItem& layoutItem = item.GetLayoutContainer();
432 _Layout::LayoutMatchMode matchMode;
434 result r = _pCoreLayout->GetItemHeightMatchMode(layoutItem, matchMode);
435 SysTryReturn(NID_UI, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
437 policy = ConvertEnum(matchMode);
443 _LayoutImpl::UpdateLayout(void)
445 result r = _pCoreLayout->UpdateLayout();
451 _LayoutImpl::AddItem(_ControlImpl& addItem)
453 _Layout::LayoutItem& layoutItem = addItem.GetLayoutContainer();
455 result r = _pCoreLayout->AddItem(layoutItem);
461 _LayoutImpl::RemoveItem(const _ControlImpl& removeItem)
463 _Layout::LayoutItem& layoutItem = removeItem.GetLayoutContainer();
465 result r = _pCoreLayout->RemoveItem(layoutItem);
471 _LayoutImpl::OnChangeViewPos(int viewPosX, int viewPosY)
473 result r = _pCoreLayout->OnChangeViewPosition(viewPosX, viewPosY);
479 _LayoutImpl::SetItemBaseRect(const _ControlImpl& item, const _Layout::LayoutRect baseRect)
481 SysTryReturn(NID_UI, baseRect.x >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] X position is negative.");
482 SysTryReturn(NID_UI, baseRect.y >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Y position is negative.");
483 SysTryReturn(NID_UI, baseRect.w >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Width is negative.");
484 SysTryReturn(NID_UI, baseRect.h >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Height is negative.");
486 _Layout::LayoutItem& layoutItem = item.GetLayoutContainer();
488 result r = _pCoreLayout->SetItemBaseRect(layoutItem, baseRect);
494 _LayoutImpl::GetItemBaseRect(const _ControlImpl& item, _Layout::LayoutRect& baseRect) const
496 _Layout::LayoutItem& layoutItem = item.GetLayoutContainer();
498 result r = _pCoreLayout->GetItemBaseRect(layoutItem, baseRect);
504 _LayoutImpl::AllocateLayoutImpl(Layout* pPublicLayout, _SharedPtr <Tizen::Ui::_LayoutImpl> layoutImpl)
506 LayoutImplHolder* pHolder = static_cast <LayoutImplHolder*>(pPublicLayout->_pImpl);
507 SysAssert(pHolder != null);
509 pHolder->layoutImpl = layoutImpl;
513 _LayoutImpl::CreatePublicLayoutN(_SharedPtr <Tizen::Ui::_LayoutImpl> layoutImpl)
515 _LayoutImpl* pLayoutImpl = layoutImpl.Get();
516 if (pLayoutImpl == null)
521 switch (pLayoutImpl->GetLayoutType())
523 case LAYOUT_RELATIVE:
525 RelativeLayout* pPublicLayout = new (std::nothrow) RelativeLayout;
526 SysTryReturn(NID_UI, pPublicLayout != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
528 _LayoutImpl::AllocateLayoutImpl(pPublicLayout, layoutImpl);
530 return pPublicLayout;
533 case LAYOUT_VERTICAL_BOX:
535 VerticalBoxLayout* pPublicLayout = new (std::nothrow) VerticalBoxLayout;
536 SysTryReturn(NID_UI, pPublicLayout != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
538 _LayoutImpl::AllocateLayoutImpl(pPublicLayout, layoutImpl);
540 return pPublicLayout;
543 case LAYOUT_HORIZONTAL_BOX:
545 HorizontalBoxLayout* pPublicLayout = new (std::nothrow) HorizontalBoxLayout;
546 SysTryReturn(NID_UI, pPublicLayout != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
548 _LayoutImpl::AllocateLayoutImpl(pPublicLayout, layoutImpl);
550 return pPublicLayout;
555 GridLayout* pPublicLayout = new (std::nothrow) GridLayout;
556 SysTryReturn(NID_UI, pPublicLayout != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
558 _LayoutImpl::AllocateLayoutImpl(pPublicLayout, layoutImpl);
560 return pPublicLayout;
565 CardLayout* pPublicLayout = new (std::nothrow) CardLayout;
566 SysTryReturn(NID_UI, pPublicLayout != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
568 _LayoutImpl::AllocateLayoutImpl(pPublicLayout, layoutImpl);
570 return pPublicLayout;