2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
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
9 // http://floralicense.org/license/
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.
19 * @file FUiCtrl_PopupImpl.cpp
20 * @brief This is the implementation file for the _PopupImpl class.
24 #include <FUiLayout.h>
25 #include <FBaseSysLog.h>
26 #include "FUi_UiBuilder.h"
27 #include "FUi_DataBindingContextImpl.h"
28 #include "FUi_ResourceSizeInfo.h"
29 #include "FUi_ResourceManager.h"
30 #include "FUi_ControlImplManager.h"
31 #include "FUi_LayoutImpl.h"
32 #include "FUiCtrl_FrameImpl.h"
33 #include "FUiCtrl_PopupImpl.h"
34 #include "FUiCtrl_Popup.h"
35 #include "FUiCtrl_Form.h"
38 using namespace Tizen::Ui::Animations;
39 using namespace Tizen::Graphics;
40 using namespace Tizen::Ui;
43 namespace Tizen { namespace Ui { namespace Controls
48 _PopupImpl::PopupSizeInfo::GetDefaultMinimumSize(_ControlOrientation orientation) const
51 Dimension dimension(0, 0);
53 r = GET_DIMENSION_CONFIG(POPUP::MIN_SIZE, orientation, dimension);
54 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, dimension, r, "[%s] A system error occurred.", GetErrorMessage(r));
61 _PopupImpl::PopupSizeInfo::GetDefaultMaximumSize(_ControlOrientation orientation) const
64 Dimension dimension(0, 0);
66 r = GET_DIMENSION_CONFIG(POPUP::MAX_SIZE, orientation, dimension);
67 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, dimension, r, "[%s] A system error occurred.", GetErrorMessage(r));
75 _PopupImpl::GetInstance(Popup& pPopup)
77 return static_cast <_PopupImpl*>(pPopup._pControlImpl);
81 _PopupImpl::GetInstance(const Popup& pPopup)
83 return static_cast <const _PopupImpl*>(pPopup._pControlImpl);
86 _PopupImpl::_PopupImpl(Popup* pPublic, _Popup* pCore, Layout* pPublicPortraitLayout, Layout* pPublicLandscapeLayout)
87 : _WindowImpl(pPublic, pCore, pPublicPortraitLayout, pPublicLandscapeLayout)
90 , __centerAlign(false)
91 , __callBoundsChange(false)
96 _PopupImpl::~_PopupImpl(void)
102 _PopupImpl::CreatePopupImplN(Popup* pControl, const Tizen::Graphics::Dimension& dim, Layout* pPublicPortraitLayout, Layout* pPublicLandscapeLayout)
104 result r = E_SUCCESS;
106 r = GET_SIZE_INFO(Popup).CheckInitialSizeValid(dim, _ControlManager::GetInstance()->GetOrientation());
107 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, E_INVALID_ARG, "[E_INVALID_ARG] The given size is not valid.");
109 _PopupImpl* pImpl = null;
110 _Popup* pCore = null;
112 pCore = _Popup::CreatePopupN();
113 SysTryReturn(NID_UI_CTRL, pCore, null, E_SYSTEM, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
115 pImpl = new (std::nothrow) _PopupImpl(pControl, pCore, pPublicPortraitLayout, pPublicLandscapeLayout);
116 r = CheckConstruction(pCore, pImpl);
117 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
119 r = pImpl->InitializeBoundsProperties(GET_SIZE_INFO(Popup), dim, _ControlManager::GetInstance()->GetOrientation());
120 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
127 delete pImpl; //This deletes pCore as well
133 _PopupImpl::Initialize(bool hasTitle, const Tizen::Graphics::Dimension& dim)
135 result r = E_SUCCESS;
139 Dimension minSize(0, 0);
141 r = GET_DIMENSION_CONFIG(POPUP::MIN_SIZE_WITH_TITLE, _ControlManager::GetInstance()->GetOrientation(), minSize);
143 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] A system error occurred.", GetErrorMessage(r));
145 SysTryReturn(NID_UI_CTRL,
146 (minSize.width <= dim.width && minSize.height <= dim.height), E_INVALID_ARG,
147 E_INVALID_ARG, "[E_INVALID_ARG] The size is out of minium size(%d, %d)",
148 minSize.width, minSize.width);
150 r = GetCore().SetMinimumSize(minSize);
152 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] SetMinimumSize is failed.", GetErrorMessage(r));
155 Rectangle bounds = GetCenterAlignedRect(dim.width, dim.height);
157 __centerAlign = true;
159 r = SetBounds(bounds);
160 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
162 return GetCore().Initialize(hasTitle, bounds);
166 _PopupImpl::GetPublicClassName(void) const
168 return "Tizen::Ui::Controls::Popup";
172 _PopupImpl::GetPublic(void) const
174 return static_cast <const Popup&>(_ControlImpl::GetPublic());
178 _PopupImpl::GetPublic(void)
180 return static_cast <Popup&>(_ControlImpl::GetPublic());
184 _PopupImpl::GetCore(void) const
186 return static_cast <const _Popup&>(_ControlImpl::GetCore());
190 _PopupImpl::GetCore(void)
192 return static_cast <_Popup&>(_ControlImpl::GetCore());
196 _PopupImpl::GetCenterAlignedRect(int width, int height) const
201 Dimension screenRect = _ControlManager::GetInstance()->GetScreenSize();
203 if (GetCore().GetOrientation() == _CONTROL_ORIENTATION_LANDSCAPE)
205 int temp = screenRect.width;
206 screenRect.width = screenRect.height;
207 screenRect.height = temp;
210 x = (screenRect.width - width) / 2;
211 y = (screenRect.height - height) / 2;
213 return Rectangle(x, y, width, height);
217 _PopupImpl::GetClientAreaBounds(void) const
219 return _ControlImpl::GetClientBounds();
223 _PopupImpl::GetClientAreaCanvasN(void) const
225 return GetCore().GetClientAreaCanvasN();
229 _PopupImpl::TranslateFromClientAreaPosition(const Point& clientPosition) const
231 return GetCore().TranslateFromClientAreaPosition(clientPosition);
235 _PopupImpl::TranslateToClientAreaPosition(const Point& position) const
237 return GetCore().TranslateToClientAreaPosition(position);
241 _PopupImpl::DoModal(int& modalResult)
243 SysTryReturn(NID_UI_CTRL, GetVisibleState() != false, E_INVALID_STATE,
244 E_INVALID_STATE, "[E_INVALID_STATE] The Popup is not visible");
248 return GetCore().DoModal(modalResult);
252 _PopupImpl::EndModal(int modalResult)
254 SysTryReturn(NID_UI_CTRL, _isModal == true, E_INVALID_STATE, E_INVALID_STATE,
255 "[E_INVALID_STATE] The method is not supported because this popup isn't running as a modal window.");
257 return GetCore().EndModal(modalResult);
261 _PopupImpl::SetColor(const Color& color)
263 GetCore().SetColor(color);
269 _PopupImpl::GetColor(void) const
271 return GetCore().GetColor();
275 _PopupImpl::SetTitleText(const Tizen::Base::String& title)
277 return GetCore().SetTitleText(title);
281 _PopupImpl::GetTitleText(void) const
283 return GetCore().GetTitleText();
287 _PopupImpl::SetTitleTextColor(const Color& color)
289 GetCore().SetTitleTextColor(color);
295 _PopupImpl::GetTitleTextColor() const
297 return GetCore().GetTitleTextColor();
301 _PopupImpl::GetMinWidth(void) const
303 Dimension dimMin(0, 0);
305 GET_DIMENSION_CONFIG(POPUP::MIN_SIZE, GetCore().GetOrientation(), dimMin);
311 _PopupImpl::GetMinHeight(void) const
313 Dimension dimMin(0, 0);
315 GET_DIMENSION_CONFIG(POPUP::MIN_SIZE, GetCore().GetOrientation(), dimMin);
317 return dimMin.height;
321 _PopupImpl::GetMaxWidth(void) const
323 Dimension dimMax(0, 0);
325 GET_DIMENSION_CONFIG(POPUP::MAX_SIZE, GetCore().GetOrientation(), dimMax);
331 _PopupImpl::GetMaxHeight(void) const
333 Dimension dimMax(0, 0);
335 GET_DIMENSION_CONFIG(POPUP::MAX_SIZE, GetCore().GetOrientation(), dimMax);
337 return dimMax.height;
341 _PopupImpl::GetDataBindingContextN(void) const
343 return Tizen::Ui::_DataBindingContextImpl::GetDataBindingContextN(*this);
347 _PopupImpl::OnChangeLayout(_ControlOrientation orientation)
349 result r = E_SUCCESS;
351 Dimension newMaxSize(0, 0);
352 Dimension maxSize = GetCore().GetMaximumSize();
354 r = GET_DIMENSION_CONFIG(POPUP::MAX_SIZE, orientation, newMaxSize);
355 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] A system error occurred.", GetErrorMessage(r));
357 if (maxSize.width == newMaxSize.height && maxSize.height == newMaxSize.width)
359 r = GetCore().SetMaximumSize(newMaxSize);
360 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] SetMinimumSize is failed.", GetErrorMessage(r));
363 if (!__callBoundsChange)
365 Rectangle bounds = GetCenterAlignedRect(GetBounds().width, GetBounds().height);
366 __centerAlign = true;
368 r = SetBounds(bounds);
369 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
373 return GetCore().OnChangeLayout(orientation);
377 _PopupImpl::OnBoundsChanged(void)
379 Rectangle rect = GetBounds();
385 rect = GetCenterAlignedRect(GetSize().width, GetSize().height);
386 __centerAlign = false;
390 __callBoundsChange = true;
394 #if !defined(MULTI_WINDOW)
395 result r = SetBounds(rect, false);
397 result r = SetBounds(rect, true);
402 // Error propagation fall through
406 _ControlImpl::OnBoundsChanged();
411 : public _UiBuilderControlMaker
414 _PopupMaker(_UiBuilder* uibuilder)
415 : _UiBuilderControlMaker(uibuilder){};
416 virtual ~_PopupMaker(){};
418 static _UiBuilderControlMaker* GetInstance(_UiBuilder* uibuilder)
420 _PopupMaker* pPopupMaker = new (std::nothrow) _PopupMaker(uibuilder);
422 return static_cast<_UiBuilderControlMaker*>(pPopupMaker);
426 virtual Tizen::Ui::Control* Make(_UiBuilderControl* pControl)
428 bool hasTitle = false;
430 _UiBuilderControlLayout* pControlProperty = null;
431 Tizen::Base::String elementString;
433 Tizen::Graphics::Dimension dim;
434 Tizen::Graphics::Rectangle rect;
436 Popup* pPopup = dynamic_cast <Popup*>(GetContainer());
437 SysTryReturn(NID_UI_CTRL, pPopup != null, null, E_SYSTEM, "[E_SYSTEM] This instance is not constructed.");
439 SetUiBuilderRotateState(UIBUIDER_SCREEN_VERTICAL);
440 GetProperty(pControl, &pControlProperty);
442 if (pControlProperty == null)
447 if (pControl->GetElement("titleText", elementString))
456 //pPopup = new (std::nothrow) Popup();
457 rect = pControlProperty->GetRect();
459 dim.width = rect.width;
460 dim.height = rect.height;
462 // int sideMargin = 0;
463 // GET_SHAPE_CONFIG(POPUP::TITLE_TEXT_SIDE_MARGIN, _ControlManager::GetInstance()->GetOrientation(), sideMargin);
465 // // To consider client's area
466 // dim.width += sideMargin * 2;
468 // if (hasTitle == true)
470 // int titleHeight = 0;
471 // GET_SHAPE_CONFIG(POPUP::TITLE_HEIGHT, _ControlManager::GetInstance()->GetOrientation(), titleHeight);
473 // dim.height += titleHeight;
476 _UiBuilderLayoutType layoutType = UIBUILDER_LAYOUT_NONE;
477 GetLayoutType(pControlProperty, layoutType);
479 if (layoutType == UIBUILDER_LAYOUT_NONE)
481 r = pPopup->Construct(hasTitle, dim);
485 Layout* pPortraitLayout = null;
486 Layout* pLandscapeLayout = null;
487 result tempResult = E_SUCCESS;
489 tempResult = GetLayoutN(pControl, pPortraitLayout, pLandscapeLayout);
491 if (E_SUCCESS == tempResult)
493 r = pPopup->Construct(*pPortraitLayout, *pLandscapeLayout, hasTitle, dim);
500 _UiBuilderLayoutType layoutType = UIBUILDER_LAYOUT_NONE;
502 if (GetLayoutType(pControlProperty, layoutType) == false)
507 if ( layoutType == UIBUILDER_LAYOUT_GRID)
509 for (int i = 0; i < UIBUILDER_ATTRIBUTE_NUM; i++)
511 GridLayout* pGridLayout = null;
512 pControlProperty = pControl->GetAttribute(i);
514 if ( i == UIBUILDER_ATTRIBUTE_PORTRAIT)
516 pGridLayout = dynamic_cast<GridLayout*>(pPortraitLayout);
520 pGridLayout = dynamic_cast<GridLayout*>(pLandscapeLayout);
522 SetGridLayoutContainerProperty(pGridLayout, pControlProperty);
526 delete pPortraitLayout;
528 if (pPortraitLayout != pLandscapeLayout)
530 delete pLandscapeLayout;
532 // CONSTRUCT_WITH_LAYOUT_ARG2(pPopup, hasTitle, dim);
537 SysLog(NID_UI_CTRL, "Failed to create Popup.");
541 if (hasTitle == true)
543 pPopup->SetTitleText(elementString);
547 if (pControl->GetElement("color", elementString))
549 ConvertStringToColor(elementString, color);
550 pPopup->SetColor(color);
553 if (pControl->GetElement("titleTextColor", elementString))
555 ConvertStringToColor(elementString, color);
556 pPopup->SetTitleTextColor(color);
559 //-------safety for Minimum size-------------------
560 // rect = (pControl->GetAttribute(UIBUILDER_ATTRIBUTE_PORTRAIT))->GetRect();
561 // if (rect.width < __BaseProperty(PROPERTY_POPUP_MIN_WIDTH))
563 // rect.width = __BaseProperty(PROPERTY_POPUP_MIN_WIDTH);
565 // if (rect.height < __BaseProperty(PROPERTY_POPUP_MIN_HEIGHT))
567 // rect.height = __BaseProperty(PROPERTY_POPUP_MIN_HEIGHT);
569 // (pControl->GetAttribute(UIBUILDER_ATTRIBUTE_PORTRAIT))->SetRect(rect.x,rect.y,rect.width,rect.height);
571 // rect = (pControl->GetAttribute(UIBUILDER_ATTRIBUTE_LANDSCAPE))->GetRect();
572 // if (rect.width < __BaseProperty(PROPERTY_POPUP_MIN_WIDTH))
574 // rect.width = __BaseProperty(PROPERTY_POPUP_MIN_WIDTH);
576 // if (rect.height < __BaseProperty(PROPERTY_POPUP_MIN_HEIGHT))
578 // rect.height = __BaseProperty(PROPERTY_POPUP_MIN_HEIGHT);
580 // (pControl->GetAttribute(UIBUILDER_ATTRIBUTE_LANDSCAPE))->SetRect(rect.x,rect.y,rect.width,rect.height);
581 //---------end safety code------------------------
590 _PopupRegister::_PopupRegister()
592 _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
593 pUiBuilderControlTableManager->RegisterControl(L"Popup", _PopupMaker::GetInstance);
596 _PopupRegister::~_PopupRegister()
598 _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
599 pUiBuilderControlTableManager->UnregisterControl(L"Popup");
601 static _PopupRegister PopupRegisterToUiBuilder;
603 }}} // Tizen::Ui::Controls