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 FUiCtrl_IndicatorManager.cpp
19 * @brief This is the implementation file for the _IndicatorManager class.
22 #include <FBaseSysLog.h>
23 #include <FBaseColHashMapT.h>
24 #include <FUiAnim_VisualElementSurfaceImpl.h>
25 #include "FUiAnim_RootVisualElement.h"
26 #include "FUiAnim_EflLayer.h"
27 #include "FUi_EcoreEvas.h"
28 #include "FUi_EcoreEvasMgr.h"
29 #include "FUi_Window.h"
30 #include "FUi_ControlManager.h"
31 #include "FUi_ResourceManager.h"
32 #include "FUi_CoordinateSystemUtils.h"
33 #include "FUiCtrl_IndicatorManager.h"
34 #include "FUiCtrl_Form.h"
35 #include "FUiCtrl_Frame.h"
36 #include "FUiCtrl_Popup.h"
37 #include "FUiCtrl_Keypad.h"
39 using namespace Tizen::Base::Collection;
40 using namespace Tizen::Graphics;
41 using namespace Tizen::Ui;
42 using namespace Tizen::Ui::Animations;
45 namespace Tizen { namespace Ui { namespace Controls
48 static const char* pPortraitSvcName = "elm_indicator_portrait";
49 static const char* pLandScapeSvcName = "elm_indicator_landscape";
50 const int NUMBER_OF_OBJECT = 2;
52 _IndicatorManager* _IndicatorManager::__pInstance = null;
55 _IndicatorManager::GetInstance(void)
61 _IndicatorManager::Initialize(void)
65 __pInstance = new (std::nothrow)_IndicatorManager;
66 SysAssert(__pInstance);
71 _IndicatorManager::InitializeInstance(void)
73 static pthread_once_t once_block = PTHREAD_ONCE_INIT;
77 pthread_once(&once_block, Initialize);
82 _IndicatorManager::ReleaseInstance(void)
91 _IndicatorManager::_IndicatorManager(void) // [ToDo] exception check.
93 __indicatorMap.Construct();
96 _IndicatorManager::~_IndicatorManager(void)
98 IMapEnumeratorT<_Window*, IndicatorComponent*>* pEnumerator = __indicatorMap.GetMapEnumeratorN();
101 while(pEnumerator->MoveNext() == E_SUCCESS)
103 IndicatorComponent* pIndicatorComponent = null;
104 pEnumerator->GetValue(pIndicatorComponent);
106 if (pIndicatorComponent)
108 delete pIndicatorComponent[0].pPortraitSurface;
109 delete pIndicatorComponent[1].pPortraitSurface;
110 delete pIndicatorComponent[0].pLandscapeSurface;
111 delete pIndicatorComponent[1].pLandscapeSurface;
112 pIndicatorComponent[0].pPortraitVisualElement->Destroy();
113 pIndicatorComponent[0].pLandscapeVisualElement->Destroy();
114 pIndicatorComponent[1].pPortraitVisualElement->Destroy();
115 pIndicatorComponent[1].pLandscapeVisualElement->Destroy();
117 delete [] pIndicatorComponent;
123 __indicatorMap.RemoveAll();
127 _IndicatorManager::GetIndicatorVisualElement(_Window* pWindow, _IndicatorOrientation orientation, _Control* pControl) const
129 result r = E_SUCCESS;
131 IndicatorComponent* pIndicatorComponentArray = null;
132 r = __indicatorMap.GetValue(pWindow, pIndicatorComponentArray);
133 SysTryReturn(NID_UI_CTRL, pIndicatorComponentArray, null, E_SYSTEM, "[E_SYSTEM] Unable to get Indicator");
136 for(int i = 0 ; i < NUMBER_OF_OBJECT ; i++)
138 if (pControl == pIndicatorComponentArray[i].pControl)
140 if ((orientation == _INDICATOR_ORIENTATION_PORTRAIT) && (pIndicatorComponentArray[i].portraitVisualElementUsed))
142 return pIndicatorComponentArray[i].pPortraitVisualElement;
144 else if((orientation == _INDICATOR_ORIENTATION_LANDSCAPE) && (pIndicatorComponentArray[i].landscapeVisualElementUsed))
146 return pIndicatorComponentArray[i].pLandscapeVisualElement;
151 if (IsFull(pIndicatorComponentArray))
153 _Frame* pFrame = dynamic_cast<_Frame*>(pWindow);
156 _Form* pCurrentForm = pFrame->GetCurrentForm();
157 if (pCurrentForm == pControl)
159 int count = pFrame->GetChildCount();
160 pCurrentForm = dynamic_cast<_Form*>(pFrame->GetChild(count-2));
165 for(int i = 0 ; i < NUMBER_OF_OBJECT ; i++)
167 if (pIndicatorComponentArray[i].pControl != pCurrentForm)
169 _Form* pForm = dynamic_cast<_Form*>(pIndicatorComponentArray[i].pControl);
172 pForm->DeleteIndicatorObject();
181 _VisualElement* pVisalElement = null;
182 if (pIndicatorComponentArray)
184 for(int i = 0 ; i < NUMBER_OF_OBJECT ; i++)
186 if (orientation == _INDICATOR_ORIENTATION_PORTRAIT)
188 if (!(pIndicatorComponentArray[i].portraitVisualElementUsed))
190 pVisalElement = pIndicatorComponentArray[i].pPortraitVisualElement;
191 pIndicatorComponentArray[i].portraitVisualElementUsed = true;
192 pIndicatorComponentArray[i].pControl = pControl;
196 else if(orientation == _INDICATOR_ORIENTATION_LANDSCAPE)
198 if (!(pIndicatorComponentArray[i].landscapeVisualElementUsed))
200 pVisalElement = pIndicatorComponentArray[i].pLandscapeVisualElement;
201 pIndicatorComponentArray[i].landscapeVisualElementUsed = true;
202 pIndicatorComponentArray[i].pControl = pControl;
208 return pVisalElement;
212 _IndicatorManager::ReleaseIndicatorVisualElement(_Window* pWindow, _IndicatorOrientation orientation, _VisualElement* pVisualElement)
214 result r = E_SUCCESS;
215 IndicatorComponent* pIndicatorComponentArray = null;
216 r = __indicatorMap.GetValue(pWindow, pIndicatorComponentArray);
218 if (pIndicatorComponentArray)
220 for(int i = 0 ; i < NUMBER_OF_OBJECT ; i++)
222 if (orientation == _INDICATOR_ORIENTATION_PORTRAIT)
224 if (pIndicatorComponentArray[i].portraitVisualElementUsed)
226 if (pVisualElement == pIndicatorComponentArray[i].pPortraitVisualElement)
228 pIndicatorComponentArray[i].portraitVisualElementUsed = false;
229 pIndicatorComponentArray[i].pControl = null;
234 else if(orientation == _INDICATOR_ORIENTATION_LANDSCAPE)
236 if (pIndicatorComponentArray[i].landscapeVisualElementUsed)
238 if (pVisualElement == pIndicatorComponentArray[i].pLandscapeVisualElement)
240 pIndicatorComponentArray[i].landscapeVisualElementUsed = false;
241 pIndicatorComponentArray[i].pControl = null;
252 _IndicatorManager::AddWindow(_Window* pWindow)
254 result r = E_SUCCESS;
256 _Frame* pFrame = dynamic_cast<_Frame*>(pWindow);
257 _Popup* pPopup = dynamic_cast<_Popup*>(pWindow);
258 _Keypad* pKeypad = dynamic_cast<_Keypad*>(pWindow);
260 if ((pFrame == null) && (pPopup == null) && (pKeypad ==null))
265 IndicatorComponent* pIndicatorComponentArray = MakeIndicatorComponentArrayN(pWindow);
267 r = __indicatorMap.Add(pWindow, pIndicatorComponentArray);
273 _IndicatorManager::DeleteWindow(_Window* pWindow)
275 result r = E_SUCCESS;
276 IndicatorComponent* pIndicatorComponentArray = null;
278 _Frame* pFrame = dynamic_cast<_Frame*>(pWindow);
279 _Popup* pPopup = dynamic_cast<_Popup*>(pWindow);
280 _Keypad* pKeypad = dynamic_cast<_Keypad*>(pWindow);
282 if ((pFrame == null) && (pPopup == null) && (pKeypad ==null))
287 r = __indicatorMap.GetValue(pWindow, pIndicatorComponentArray);
288 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS && pIndicatorComponentArray, r, r, "[%s] Propagating.", GetErrorMessage(r));
290 delete pIndicatorComponentArray[0].pPortraitSurface;
291 delete pIndicatorComponentArray[0].pLandscapeSurface;
292 delete pIndicatorComponentArray[1].pPortraitSurface;
293 delete pIndicatorComponentArray[1].pLandscapeSurface;
294 pIndicatorComponentArray[0].pPortraitVisualElement->Destroy();
295 pIndicatorComponentArray[0].pLandscapeVisualElement->Destroy();
296 pIndicatorComponentArray[1].pPortraitVisualElement->Destroy();
297 pIndicatorComponentArray[1].pLandscapeVisualElement->Destroy();
299 delete [] pIndicatorComponentArray;
300 __indicatorMap.Remove(pWindow);
306 _IndicatorManager::MakeIndicatorComponentArrayN(_Window* pWindow)
308 result r = E_SUCCESS;
309 Eina_Bool result = EINA_TRUE;
310 FloatDimension portraitsize(0.0f, 0.0f);
311 FloatDimension landscapesize(0.0f, 0.0f);
313 _VisualElement* pLandscapeVisualElement = null;
314 _VisualElement* pPortraitVisualElement = null;
316 IndicatorComponent* pIndicatorComponentArray = new IndicatorComponent[NUMBER_OF_OBJECT];
318 _RootVisualElement* pRootVisualElement = pWindow->GetRootVisualElement();
319 _EflLayer* pEflLayer = static_cast<_EflLayer*>(pRootVisualElement->GetNativeLayer());
320 Ecore_Evas* pEcore_Evas = pEflLayer->GetEcoreEvas();
321 SysTryCatch(NID_UI_CTRL, pEcore_Evas, , E_SYSTEM, "[E_SYSTEM] A system error occurred.");
323 portraitsize = GetIndicatorSizeF(_INDICATOR_ORIENTATION_PORTRAIT);
324 landscapesize = GetIndicatorSizeF(_INDICATOR_ORIENTATION_LANDSCAPE);
326 //Get indicator Image Object
327 for(int i = 0 ; i < NUMBER_OF_OBJECT ; i++)
329 Evas_Object* pPortraitEvasObject = ecore_evas_extn_plug_new(pEcore_Evas);
330 SysTryCatch(NID_UI_CTRL, pPortraitEvasObject, , E_SYSTEM, "[E_SYSTEM] Unable to get evas object");
332 Evas_Object* pLandscapeEvasObject = ecore_evas_extn_plug_new(pEcore_Evas);
333 SysTryCatch(NID_UI_CTRL, pLandscapeEvasObject, , E_SYSTEM, "[E_SYSTEM] Unable to get evas object");
335 result = ecore_evas_extn_plug_connect(pPortraitEvasObject, pPortraitSvcName, 0, EINA_FALSE);
336 result = ecore_evas_extn_plug_connect(pLandscapeEvasObject, pLandScapeSvcName, 0, EINA_FALSE);
338 evas_object_resize(pPortraitEvasObject, portraitsize.width, portraitsize.height);
339 evas_object_resize(pLandscapeEvasObject, landscapesize.width, landscapesize.height);
340 evas_object_move(pPortraitEvasObject, 0, 0);
341 evas_object_move(pLandscapeEvasObject, 0, 0);
343 VisualElementSurface* pPortraitSurface = _VisualElementSurfaceImpl::CreateSurfaceUsingExistingObjectN(*pWindow->GetDisplayContext(), reinterpret_cast<Handle>(pPortraitEvasObject), GetIndicatorSize(_INDICATOR_ORIENTATION_PORTRAIT));
344 VisualElementSurface* pLandScapeSurface = _VisualElementSurfaceImpl::CreateSurfaceUsingExistingObjectN(*pWindow->GetDisplayContext(), reinterpret_cast<Handle>(pLandscapeEvasObject), GetIndicatorSize(_INDICATOR_ORIENTATION_LANDSCAPE));
346 pPortraitVisualElement = new (std::nothrow) _VisualElement;
347 SysTryCatch(NID_UI_CTRL, pPortraitVisualElement, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
348 r = pPortraitVisualElement->Construct();
349 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] System error occurred.");
350 pPortraitVisualElement->SetImplicitAnimationEnabled(false);
351 pPortraitVisualElement->SetShowState(true);
352 pPortraitVisualElement->SetSurface(pPortraitSurface);
353 pPortraitVisualElement->SetBounds(FloatRectangle(0.0f, 0.0f, portraitsize.width, portraitsize.height));
355 pLandscapeVisualElement = new (std::nothrow) _VisualElement;
356 SysTryCatch(NID_UI_CTRL, pLandscapeVisualElement, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory shortage.");
357 r = pLandscapeVisualElement->Construct();
358 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] System error occurred.");
359 pLandscapeVisualElement->SetImplicitAnimationEnabled(false);
360 pLandscapeVisualElement->SetShowState(true);
361 pLandscapeVisualElement->SetSurface(pLandScapeSurface);
362 pLandscapeVisualElement->SetBounds(FloatRectangle(0.0f, 0.0f, landscapesize.width, landscapesize.height));
364 pIndicatorComponentArray[i].pPortraitEvasObject = pPortraitEvasObject;
365 pIndicatorComponentArray[i].pLandscapeEvasObject = pLandscapeEvasObject;
366 pIndicatorComponentArray[i].pPortraitSurface = pPortraitSurface;
367 pIndicatorComponentArray[i].pLandscapeSurface = pLandScapeSurface;
368 pIndicatorComponentArray[i].pPortraitVisualElement = pPortraitVisualElement;
369 pIndicatorComponentArray[i].pLandscapeVisualElement = pLandscapeVisualElement;
370 pIndicatorComponentArray[i].portraitVisualElementUsed = false;
371 pIndicatorComponentArray[i].landscapeVisualElementUsed = false;
372 pIndicatorComponentArray[i].pControl = null;
375 return pIndicatorComponentArray;
378 delete [] pIndicatorComponentArray;
379 if (pPortraitVisualElement)
381 pPortraitVisualElement->Destroy();
383 if (pLandscapeVisualElement)
385 pLandscapeVisualElement->Destroy();
391 _IndicatorManager::IsFull(IndicatorComponent* pIndicatorComponentArray) const
393 if (pIndicatorComponentArray[0].portraitVisualElementUsed && pIndicatorComponentArray[0].landscapeVisualElementUsed
394 && pIndicatorComponentArray[1].portraitVisualElementUsed && pIndicatorComponentArray[1].landscapeVisualElementUsed)
403 _IndicatorManager::GetEvasObject(_Window* pWindow, _Control* pControl, _IndicatorOrientation orientation) const
405 Evas_Object* pEvasObject = null;
407 result r = E_SUCCESS;
408 IndicatorComponent* pIndicatorComponentArray = null;
409 r = __indicatorMap.GetValue(pWindow, pIndicatorComponentArray);
410 SysTryReturn(NID_UI_CTRL, pIndicatorComponentArray, null, r, "[%s] Propagating.", GetErrorMessage(r));
412 for(int i = 0 ; i < NUMBER_OF_OBJECT ; i++)
414 if (pControl == pIndicatorComponentArray[i].pControl)
416 if (orientation == _INDICATOR_ORIENTATION_PORTRAIT)
418 pEvasObject = pIndicatorComponentArray[i].pPortraitEvasObject;
420 else if(orientation == _INDICATOR_ORIENTATION_LANDSCAPE)
422 pEvasObject = pIndicatorComponentArray[i].pLandscapeEvasObject;
430 _IndicatorManager::GetIndicatorSize(_IndicatorOrientation orientation) const
432 const Dimension portraitSize = _ControlManager::GetInstance()->_ControlManager::GetScreenSize();
433 const Dimension landscapeSize = Dimension(portraitSize.height, portraitSize.width);
435 Rectangle indicatorbounds(0, 0, 0, 0);
437 if (orientation == _INDICATOR_ORIENTATION_PORTRAIT)
439 indicatorbounds.width = portraitSize.width;
443 indicatorbounds.width = landscapeSize.width;
445 GET_SHAPE_CONFIG(FORM::INDICATOR_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, indicatorbounds.height);
447 Dimension size(0, 0);
448 size.width = indicatorbounds.width;
449 size.height = indicatorbounds.height;
455 _IndicatorManager::GetIndicatorSizeF(_IndicatorOrientation orientation) const
457 const FloatDimension portraitSize = _ControlManager::GetInstance()->_ControlManager::GetScreenSizeF();
458 const FloatDimension landscapeSize = FloatDimension(portraitSize.height, portraitSize.width);
460 FloatDimension indicatorSize(0.0f, 0.0f);
462 if (orientation == _INDICATOR_ORIENTATION_PORTRAIT)
464 indicatorSize.width = portraitSize.width;
468 indicatorSize.width = landscapeSize.width;
470 GET_SHAPE_CONFIG(FORM::INDICATOR_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, indicatorSize.height);
472 return indicatorSize;
475 }}} // Tizen::Ui::Controls