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.
19 * @file FUiCtrl_OverlayPanelImpl.cpp
20 * @brief This is the implementation file for _OverlayPanelImpl class.
23 #include <unique_ptr.h>
24 #include <FBaseSysLog.h>
25 #include <FUiCtrlOverlayPanel.h>
27 #include <FIo_RegistryImpl.h>
28 #include <FGrpCoordinateSystem.h>
29 #include <FSys_EnvironmentImpl.h>
30 #include "FUi_CoordinateSystemUtils.h"
31 #include "FUi_ControlManager.h"
32 #include "FUi_ResourceSizeInfo.h"
33 #include "FUi_UiBuilder.h"
34 #include "FUiCtrl_FormImpl.h"
35 #include "FUiCtrl_OverlayAgent.h"
36 #include "FUiCtrl_OverlayPanelImpl.h"
38 using namespace Tizen::Base;
39 using namespace Tizen::Base::Collection;
40 using namespace Tizen::Graphics;
41 using namespace Tizen::Io;
42 using namespace Tizen::System;
43 using namespace Tizen::Ui;
44 using namespace Tizen::Ui::Animations;
45 using namespace Tizen::Ui::Controls;
47 namespace Tizen { namespace Ui { namespace Controls
50 bool _OverlayPanelImpl::__overlayPanelPixelFomatList[_OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_MAX]= {false,};
53 _OverlayPanelImpl::OverlayPanelSizeInfo::GetDefaultMinimumSize(_ControlOrientation orientation) const
55 Dimension overlayPanelMinSize = _CoordinateSystemUtils::InverseTransform(Dimension(_OverlayAgent::GetDstRectMinWidth(), _OverlayAgent::GetDstRectMinHeight()));
56 result r = GetLastResult();
57 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, Dimension(-1, -1), r,"[%s] Propagating.", GetErrorMessage(r));
58 SysTryReturn(NID_UI_CTRL, overlayPanelMinSize.width > 0 && overlayPanelMinSize.height > 0, Dimension(-1, -1), E_SYSTEM,
59 "[E_SYSTEM] The minimum size of overlay panel in system-info(%d, %d) is invalid.", overlayPanelMinSize.width, overlayPanelMinSize.height);
61 return overlayPanelMinSize;
65 _OverlayPanelImpl::OverlayPanelSizeInfo::GetDefaultMaximumSize(_ControlOrientation orientation) const
67 Dimension overlayPanelMaxSize = CoordinateSystem::GetLogicalResolution();
69 if (orientation == _CONTROL_ORIENTATION_LANDSCAPE)
71 return Dimension(overlayPanelMaxSize.height, overlayPanelMaxSize.width);
74 return overlayPanelMaxSize;
78 _OverlayPanelImpl::CreateOverlayPanelImplN(OverlayPanel* pPublic, const Rectangle& bounds)
80 result r = GET_SIZE_INFO(OverlayPanel).CheckInitialSizeValid(Dimension(bounds.width, bounds.height), _ControlManager::GetInstance()->GetOrientation());
81 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, E_INVALID_ARG, "[E_INVALID_ARG] The size of overlay panel(%d, %d) is invalid.", bounds.width, bounds.height);
83 _OverlayPanel* pCore = _OverlayPanel::CreateOverlayPanelN();
85 SysTryReturn(NID_UI_CTRL, pCore != null, null, r, "[%s] Propagating.", GetErrorMessage(r));
87 std::unique_ptr<_OverlayPanelImpl> pImpl(new (std::nothrow) _OverlayPanelImpl(pPublic, pCore));
88 r = _ControlImpl::CheckConstruction(pCore, pImpl.get());
89 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
91 r = pImpl->InitializeBoundsProperties(GET_SIZE_INFO(OverlayPanel), bounds, _ControlManager::GetInstance()->GetOrientation());
92 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
94 return pImpl.release();
98 _OverlayPanelImpl::CreateOverlayPanelImplN(OverlayPanel* pPublic, const FloatRectangle& bounds)
100 result r = GET_SIZE_INFO(OverlayPanel).CheckInitialSizeValid(Dimension(bounds.width, bounds.height), _ControlManager::GetInstance()->GetOrientation());
101 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, E_INVALID_ARG, "[E_INVALID_ARG] The size of overlay panel(%d, %d) is invalid.", bounds.width, bounds.height);
103 _OverlayPanel* pCore = _OverlayPanel::CreateOverlayPanelN();
105 SysTryReturn(NID_UI_CTRL, pCore != null, null, r, "[%s] Propagating.", GetErrorMessage(r));
107 std::unique_ptr<_OverlayPanelImpl> pImpl(new (std::nothrow) _OverlayPanelImpl(pPublic, pCore));
108 r = _ControlImpl::CheckConstruction(pCore, pImpl.get());
109 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
111 r = pImpl->InitializeBoundsPropertiesF(GET_SIZE_INFO(OverlayPanel), bounds, _ControlManager::GetInstance()->GetOrientation());
112 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
114 return pImpl.release();
117 _OverlayPanelImpl::~_OverlayPanelImpl(void)
122 _OverlayPanelImpl::SetChildBuilderBounds(_ContainerImpl* pContainerImpl, _ControlOrientation controlOrientation)
124 FloatRectangle builderBounds;
125 _ContainerImpl* pTempContainerImpl;
127 for(int i = 0; i < pContainerImpl->GetChildCount(); i++)
129 _ControlImpl* pControlImpl = pContainerImpl->GetChild(i);
130 bool exist = pControlImpl->GetBuilderBoundsF(controlOrientation, builderBounds);
136 pControlImpl->SetBounds(builderBounds);
137 pTempContainerImpl = dynamic_cast<_ContainerImpl*>(pControlImpl);
138 if (pTempContainerImpl != null)
140 SetChildBuilderBounds(pTempContainerImpl, controlOrientation);
146 _OverlayPanelImpl::OnAttachedToMainTree(void)
148 //result r = SetFocusable(false);
149 result r = E_SUCCESS;
151 _ControlOrientation controlOrientation = _CONTROL_ORIENTATION_PORTRAIT;
152 FloatRectangle builderBounds;
153 bool exist = GetBuilderBoundsF(controlOrientation, builderBounds);
157 _ContainerImpl* pContainerImpl = this;
158 _FormImpl* pParentImpl = null;
160 while (pContainerImpl)
162 pParentImpl = dynamic_cast<_FormImpl*>(pContainerImpl->GetParent());
163 if (pParentImpl != null)
169 pContainerImpl = pContainerImpl->GetParent();
175 OrientationStatus orientation = pParentImpl->GetOrientationStatus();
176 if (orientation == ORIENTATION_STATUS_LANDSCAPE || orientation == ORIENTATION_STATUS_LANDSCAPE_REVERSE)
178 controlOrientation = _CONTROL_ORIENTATION_LANDSCAPE;
179 GetBuilderBoundsF(controlOrientation, builderBounds);
182 r = SetBounds(builderBounds);
183 SysTryLog(NID_UI_CTRL, r == E_SUCCESS, "[%s] Failed to SetBounds", GetErrorMessage(r));
184 SetChildBuilderBounds(this, controlOrientation);
188 r = _ContainerImpl::OnAttachedToMainTree();
189 SysTryLog(NID_UI_CTRL, r == E_SUCCESS, "[%s] Failed to OnAttachedToMainTree", GetErrorMessage(r));
195 _OverlayPanelImpl::SetRendererRotation(OverlayPanel::Rotation rotation)
197 GetCore().SetRendererRotation(rotation);
201 _OverlayPanelImpl::SetRendererAspectRatio(bool fix)
203 GetCore().SetRendererAspectRatio(fix);
207 _OverlayPanelImpl::SetRenderSize(const Dimension& dimension)
209 FloatDimension floatDimension = _CoordinateSystemUtils::ConvertToFloat(dimension);
210 return GetCore().SetRenderSize(floatDimension);
214 _OverlayPanelImpl::SetRenderSize(const FloatDimension& dimension)
216 return GetCore().SetRenderSize(dimension);
220 _OverlayPanelImpl::SetInputBuffer(const Dimension& destDim, const ByteBuffer& srcBuffer, const Dimension& srcDim, OverlayPanel::BufferPixelFormat srcFormat)
222 FloatDimension destFloatDim = _CoordinateSystemUtils::ConvertToFloat(destDim);
223 return SetInputBuffer(destFloatDim, srcBuffer, srcDim, srcFormat);
227 _OverlayPanelImpl::SetInputBuffer(const FloatDimension& destDim, const ByteBuffer& srcBuffer, const Dimension& srcDim, OverlayPanel::BufferPixelFormat srcFormat)
229 if (!__overlayPanelPixelFomatList[0])
231 result r = _OverlayPanelImpl::SetPixelFormatList();
232 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
235 if (!__overlayPanelPixelFomatList[srcFormat])
237 SysLogException(NID_UI_CTRL, E_UNSUPPORTED_FORMAT, "[E_UNSUPPORTED_FORMAT] The Source format[%d] is unsupported.", srcFormat);
238 return E_UNSUPPORTED_FORMAT;
241 result r = GetCore().SetInputBuffer(destDim, srcBuffer, srcDim, srcFormat);
243 if (r == E_INVALID_ARG || r == E_UNSUPPORTED_FORMAT || r == E_SYSTEM)
245 SysLogException(NID_UI_CTRL, r, "[%s] Propagating.", GetErrorMessage(r));
247 else if (r != E_SUCCESS)
250 SysLogException(NID_UI_CTRL, r, "[E_SYSTEM] A system error occurred.");
257 _OverlayPanelImpl::GetBackgroundBufferInfo(BufferInfo& bufferInfo) const
259 result r = GetCore().GetBackgroundBufferInfo(bufferInfo);
261 if (r == E_OPERATION_FAILED)
263 SysLogException(NID_UI_CTRL, r, "[%s] Propagating.", GetErrorMessage(r));
265 else if (r != E_SUCCESS)
267 r = E_OPERATION_FAILED;
268 SysLogException(NID_UI_CTRL, r, "[E_OPERATION_FAILED] failed to GetBackgroundBufferInfo.");
275 _OverlayPanelImpl::GetMaskingColor(void) const
277 return GetCore().GetMaskingColor();
281 _OverlayPanelImpl::OnChangeLayout(_ControlOrientation orientation)
283 result r = InitializeBoundsProperties(GET_SIZE_INFO(OverlayPanel), orientation);
284 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
286 _ControlImpl::OnChangeLayout(orientation);
289 _OverlayPanelImpl::_OverlayPanelImpl(OverlayPanel* pPublic, _OverlayPanel* pCore)
290 : _ContainerImpl(pPublic, pCore)
295 _OverlayPanelImpl::GetPublicClassName(void) const
297 return "Tizen::Ui::Controls::OverlayPanel";
301 _OverlayPanelImpl::GetCore(void) const
303 return static_cast <const _OverlayPanel&>(_ControlImpl::GetCore());
307 _OverlayPanelImpl::GetCore(void)
309 return static_cast <_OverlayPanel&>(_ControlImpl::GetCore());
313 _OverlayPanelImpl::GetPublic(void) const
315 return static_cast <const OverlayPanel&>(_ControlImpl::GetPublic());
319 _OverlayPanelImpl::GetPublic(void)
321 return static_cast <OverlayPanel&>(_ControlImpl::GetPublic());
325 _OverlayPanelImpl::GetInstance(OverlayPanel& overlayPanel)
327 return static_cast<_OverlayPanelImpl*>(_ControlImpl::GetInstance(overlayPanel));
330 const _OverlayPanelImpl*
331 _OverlayPanelImpl::GetInstance(const OverlayPanel& overlayPanel)
333 return static_cast<const _OverlayPanelImpl*>(_ControlImpl::GetInstance(overlayPanel));
337 _OverlayPanelImpl::SetPixelFormatList(void)
339 if (__overlayPanelPixelFomatList[0])
344 std::unique_ptr< IListT<bool> > pFormatList(_OverlayAgent::GetPixelFormatListN());
345 SysTryReturn(NID_UI_CTRL, pFormatList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] failed to create a list instance");
348 for (int formatIndex = 0; formatIndex < pFormatList->GetCount(); formatIndex++)
351 pFormatList->GetAt(formatIndex, value);
355 __overlayPanelPixelFomatList[formatIndex + 1] = true;
360 SysAssertf(set, "The list of supported pixel formats is an invalid.");
362 __overlayPanelPixelFomatList[0] = set;
367 IListT<OverlayPanel::BufferPixelFormat>*
368 _OverlayPanelImpl::GetSupportedBufferPixelFormatListN(void)
370 result r = E_SUCCESS;
372 if (!__overlayPanelPixelFomatList[0])
374 r = _OverlayPanelImpl::SetPixelFormatList();
375 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
378 std::unique_ptr< ArrayListT<OverlayPanel::BufferPixelFormat> > pFormatList( new (std::nothrow) ArrayListT<OverlayPanel::BufferPixelFormat>());
379 SysTryReturn(NID_UI_CTRL, pFormatList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] failed to create a list instance");
381 r = pFormatList->Construct();
382 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
384 for (int index = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_ARGB8888; index <= _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_UYVY; index++)
386 if (__overlayPanelPixelFomatList[index])
388 r = pFormatList->Add(static_cast<OverlayPanel::BufferPixelFormat>(index - 1));
391 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
393 return pFormatList.release();
397 _OverlayPanelImpl::EvaluateBounds(OverlayPanelEvaluationOption option, FloatRectangle& rect, bool& modified)
401 case OVERLAY_PANEL_EVAL_OPT_GREATER_THAN:
402 return _OverlayAgent::EvaluateBounds(OVERLAY_AGENT_EVALUATION_OPTION_GREATER_THAN, rect, modified);
404 case OVERLAY_PANEL_EVAL_OPT_LESS_THAN:
405 return _OverlayAgent::EvaluateBounds(OVERLAY_AGENT_EVALUATION_OPTION_LESS_THAN, rect, modified);
408 SysLogException(NID_UI_CTRL, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument is used. The OverlayPanelEvaluationOption is invalid.");
409 return E_INVALID_ARG;
414 _OverlayPanelImpl::GetWidthUnit(void)
416 int widthUnit = _OverlayAgent::GetWidthUnit();
417 SysAssertf(widthUnit > 0, "Failed to get a OverlayAgent's WidthUnit");
423 _OverlayPanelImpl::GetHeightUnit(void)
425 int heightUnit = _OverlayAgent::GetHeightUnit();
426 SysAssertf(heightUnit > 0, "Failed to get a OverlayAgent's HeightUnit");
432 _OverlayPanelImpl::GetMaxCount(void)
434 int maxCount = _OverlayAgent::GetMaxCount();
435 SysAssertf(maxCount > 0, "Failed to get a OverlayAgent's MaxCount");
440 class _OverlayPanelMaker
441 : public _UiBuilderControlMaker
444 _OverlayPanelMaker(_UiBuilder* uibuilder)
445 :_UiBuilderControlMaker(uibuilder)
449 virtual ~_OverlayPanelMaker()
453 static _UiBuilderControlMaker* GetInstance(_UiBuilder* uibuilder)
455 _OverlayPanelMaker* pOverlayPanelMaker = new (std::nothrow) _OverlayPanelMaker(uibuilder);
456 SysTryReturn(NID_UI_CTRL, pOverlayPanelMaker != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
458 return pOverlayPanelMaker;
462 virtual Tizen::Ui::Control* Make(_UiBuilderControl* pControl)
464 _UiBuilderControlLayout* pControlProperty = null;
466 GetProperty(pControl, &pControlProperty);
467 SysTryReturn(NID_UI_CTRL, pControlProperty != null, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
469 std::unique_ptr<OverlayPanel> pOverlayPanel(new (std::nothrow) OverlayPanel());
470 SysTryReturn(NID_UI_CTRL, pOverlayPanel != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
472 FloatRectangle overlayPanelBounds = pControlProperty->GetRectF();
473 bool modified = false;
475 OverlayPanel::EvaluateBounds(OVERLAY_PANEL_EVAL_OPT_LESS_THAN, overlayPanelBounds, modified);
476 SysTryLog(NID_UI_CTRL, modified, "The bounds of OverlayPanel is modified into [%.3f, %.3f, %.3f, %.3f]"
477 , overlayPanelBounds.x, overlayPanelBounds.y, overlayPanelBounds.width, overlayPanelBounds.height);
479 result r = pOverlayPanel->Construct(overlayPanelBounds);
480 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
482 return pOverlayPanel.release();
486 _OverlayPanelRegister::_OverlayPanelRegister()
488 _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
489 pUiBuilderControlTableManager->RegisterControl("OverlayPanel", _OverlayPanelMaker::GetInstance);
492 _OverlayPanelRegister::~_OverlayPanelRegister()
494 _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
495 pUiBuilderControlTableManager->UnregisterControl("OverlayPanel");
497 static _OverlayPanelRegister OverlayPanelRegisterToUIbuilder;
498 }}} // Tizen::Ui::Controls