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.
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 "FUiCtrl_IndicatorManager.h"
33 #include "FUiCtrl_Form.h"
34 #include "FUiCtrl_Frame.h"
36 using namespace Tizen::Base::Collection;
37 using namespace Tizen::Graphics;
38 using namespace Tizen::Ui;
39 using namespace Tizen::Ui::Animations;
42 namespace Tizen { namespace Ui { namespace Controls
45 static const char* pPortraitSvcName = "elm_indicator_portrait";
46 static const char* pLandScapeSvcName = "elm_indicator_landscape";
47 const int NUMBER_OF_OBJECT = 2;
49 _IndicatorManager* _IndicatorManager::__pInstance = null;
52 _IndicatorManager::GetInstance(void)
58 _IndicatorManager::Initialize(void)
62 __pInstance = new (std::nothrow)_IndicatorManager;
63 SysAssert(__pInstance);
68 _IndicatorManager::InitializeInstance(void)
70 static pthread_once_t once_block = PTHREAD_ONCE_INIT;
74 pthread_once(&once_block, Initialize);
79 _IndicatorManager::ReleaseInstance(void)
88 _IndicatorManager::_IndicatorManager(void) // [ToDo] exception check.
90 __indicatorMap.Construct();
93 _IndicatorManager::~_IndicatorManager(void)
95 IMapEnumeratorT<_Window*, IndicatorSurface*>* pEnumerator = __indicatorMap.GetMapEnumeratorN();
98 while(pEnumerator->MoveNext() == E_SUCCESS)
100 IndicatorSurface* pIndicatorSurface = null;
101 pEnumerator->GetValue(pIndicatorSurface);
103 if (pIndicatorSurface)
105 delete pIndicatorSurface[0].pPortraitSurface;
106 delete pIndicatorSurface[1].pPortraitSurface;
107 delete pIndicatorSurface[0].pLandscapeSurface;
108 delete pIndicatorSurface[1].pLandscapeSurface;
109 delete [] pIndicatorSurface;
115 __indicatorMap.RemoveAll();
118 VisualElementSurface*
119 _IndicatorManager::GetSurface(_Window* pWindow, _IndicatorOrientation orientation, _Form* pForm) const
121 result r = E_SUCCESS;
123 IndicatorSurface* pIndicatorSurfaceArray = null;
124 r = __indicatorMap.GetValue(pWindow, pIndicatorSurfaceArray);
125 SysTryReturn(NID_UI_CTRL, pIndicatorSurfaceArray, null, E_SYSTEM, "[E_SYSTEM] Unable to get Indicator");
128 for(int i = 0 ; i < NUMBER_OF_OBJECT ; i++)
130 if (pForm == pIndicatorSurfaceArray[i].pForm)
132 if ((orientation == _INDICATOR_ORIENTATION_PORTRAIT) && (pIndicatorSurfaceArray[i].portraitSurfaceUsed))
134 return pIndicatorSurfaceArray[i].pPortraitSurface;
136 else if((orientation == _INDICATOR_ORIENTATION_LANDSCAPE) && (pIndicatorSurfaceArray[i].landscapeSurfaceUsed))
138 return pIndicatorSurfaceArray[i].pLandscapeSurface;
143 if (IsFull(pIndicatorSurfaceArray))
145 _Frame* pFrame = dynamic_cast<_Frame*>(pWindow);
148 _Form* pCurrentForm = pFrame->GetCurrentForm();
149 if (pCurrentForm == pForm)
151 int count = pFrame->GetChildCount();
152 pCurrentForm = dynamic_cast<_Form*>(pFrame->GetChild(count-2));
157 for(int i = 0 ; i < NUMBER_OF_OBJECT ; i++)
159 if (pIndicatorSurfaceArray[i].pForm != pCurrentForm)
161 pIndicatorSurfaceArray[i].pForm->DeleteIndicatorObject();
169 VisualElementSurface* pSurface = null;
170 for(int i = 0 ; i < NUMBER_OF_OBJECT ; i++)
172 if (orientation == _INDICATOR_ORIENTATION_PORTRAIT)
174 if (!(pIndicatorSurfaceArray[i].portraitSurfaceUsed))
176 pSurface = pIndicatorSurfaceArray[i].pPortraitSurface;
177 pIndicatorSurfaceArray[i].portraitSurfaceUsed = true;
178 pIndicatorSurfaceArray[i].pForm = pForm;
182 else if(orientation == _INDICATOR_ORIENTATION_LANDSCAPE)
184 if (!(pIndicatorSurfaceArray[i].landscapeSurfaceUsed))
186 pSurface = pIndicatorSurfaceArray[i].pLandscapeSurface;
187 pIndicatorSurfaceArray[i].landscapeSurfaceUsed = true;
188 pIndicatorSurfaceArray[i].pForm = pForm;
198 _IndicatorManager::ReleaseSurface(_Window* pWindow, _IndicatorOrientation orientation, VisualElementSurface* pSurface)
200 result r = E_SUCCESS;
201 IndicatorSurface* pIndicatorSurfaceArray = null;
202 r = __indicatorMap.GetValue(pWindow, pIndicatorSurfaceArray);
204 if (pIndicatorSurfaceArray)
206 for(int i = 0 ; i < NUMBER_OF_OBJECT ; i++)
208 if (orientation == _INDICATOR_ORIENTATION_PORTRAIT)
210 if (pIndicatorSurfaceArray[i].portraitSurfaceUsed)
212 if (pSurface == pIndicatorSurfaceArray[i].pPortraitSurface)
214 pIndicatorSurfaceArray[i].portraitSurfaceUsed = false;
215 pIndicatorSurfaceArray[i].pForm = null;
220 else if(orientation == _INDICATOR_ORIENTATION_LANDSCAPE)
222 if (pSurface == pIndicatorSurfaceArray[i].pLandscapeSurface)
224 pIndicatorSurfaceArray[i].landscapeSurfaceUsed = false;
225 pIndicatorSurfaceArray[i].pForm = null;
235 _IndicatorManager::AddWindow(_Window* pWindow)
239 IndicatorSurface* pIndicatorSurfaceArray = MakeEvasSurfaceArrayN(pWindow);
241 r = __indicatorMap.Add(pWindow, pIndicatorSurfaceArray);
247 _IndicatorManager::DeleteWindow(_Window* pWindow)
249 result r = E_SUCCESS;
250 IndicatorSurface* pIndicatorSurfaceArray = null;
252 r = __indicatorMap.GetValue(pWindow, pIndicatorSurfaceArray);
253 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS && pIndicatorSurfaceArray, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] The given binding ID is not registered.");
255 delete [] pIndicatorSurfaceArray;
256 __indicatorMap.Remove(pWindow);
262 _IndicatorManager::MakeEvasSurfaceArrayN(_Window* pWindow)
264 Eina_Bool result = EINA_TRUE;
266 _Frame* pFrame = dynamic_cast<_Frame*>(pWindow);
272 IndicatorSurface* pIndicatorSurfaceArray = new IndicatorSurface[NUMBER_OF_OBJECT];
274 Dimension portraitsize = GetIndicatorSize(_INDICATOR_ORIENTATION_PORTRAIT);
275 Dimension landscapesize = GetIndicatorSize(_INDICATOR_ORIENTATION_LANDSCAPE);
277 _RootVisualElement* pRootVisualElement = pWindow->GetRootVisualElement();
278 _EflLayer* pEflLayer = static_cast<_EflLayer*>(pRootVisualElement->GetNativeLayer());
279 Ecore_Evas* pEcore_Evas = pEflLayer->GetEcoreEvas();
280 SysTryCatch(NID_UI_CTRL, pEcore_Evas, , E_SYSTEM, "[E_SYSTEM] Unable to get Ecore_Evas object");
282 //Get indicator Image Object
283 for(int i = 0 ; i < NUMBER_OF_OBJECT ; i++)
285 Evas_Object* pPortraitEvasObject = ecore_evas_extn_plug_new(pEcore_Evas);
286 SysTryCatch(NID_UI_CTRL, pPortraitEvasObject, , E_SYSTEM, "[E_SYSTEM] Unable to get evas object");
288 Evas_Object* pLandscapeEvasObject = ecore_evas_extn_plug_new(pEcore_Evas);
289 SysTryCatch(NID_UI_CTRL, pLandscapeEvasObject, , E_SYSTEM, "[E_SYSTEM] Unable to get evas object");
291 result = ecore_evas_extn_plug_connect(pPortraitEvasObject, pPortraitSvcName, 0, EINA_FALSE);
292 result = ecore_evas_extn_plug_connect(pLandscapeEvasObject, pLandScapeSvcName, 0, EINA_FALSE);
294 evas_object_resize(pPortraitEvasObject, portraitsize.width, portraitsize.height);
295 evas_object_resize(pLandscapeEvasObject, landscapesize.width, landscapesize.height);
296 evas_object_move(pPortraitEvasObject, 0, 0);
297 evas_object_move(pLandscapeEvasObject, 0, 0);
299 VisualElementSurface* pPortraitSurface = _VisualElementSurfaceImpl::CreateSurfaceUsingExistingObjectN(*pWindow->GetDisplayContext(), reinterpret_cast<Handle>(pPortraitEvasObject), portraitsize);
300 VisualElementSurface* pLandScapeSurface = _VisualElementSurfaceImpl::CreateSurfaceUsingExistingObjectN(*pWindow->GetDisplayContext(), reinterpret_cast<Handle>(pLandscapeEvasObject), landscapesize);
302 pIndicatorSurfaceArray[i].pPortraitEvasObject = pPortraitEvasObject;
303 pIndicatorSurfaceArray[i].pLandscapeEvasObject = pLandscapeEvasObject;
304 pIndicatorSurfaceArray[i].pPortraitSurface = pPortraitSurface;
305 pIndicatorSurfaceArray[i].pLandscapeSurface = pLandScapeSurface;
306 pIndicatorSurfaceArray[i].portraitSurfaceUsed = false;
307 pIndicatorSurfaceArray[i].landscapeSurfaceUsed = false;
308 pIndicatorSurfaceArray[i].pForm = null;
311 return pIndicatorSurfaceArray;
314 delete [] pIndicatorSurfaceArray;
319 _IndicatorManager::IsFull(IndicatorSurface* pIndicatorSurfaceArray) const
321 if (pIndicatorSurfaceArray[0].portraitSurfaceUsed && pIndicatorSurfaceArray[0].landscapeSurfaceUsed
322 && pIndicatorSurfaceArray[1].portraitSurfaceUsed && pIndicatorSurfaceArray[1].landscapeSurfaceUsed)
331 _IndicatorManager::GetEvasObject(_Window* pWindow, _Form* pForm, _IndicatorOrientation orientation) const
333 Evas_Object* pEvasObject = null;
335 result r = E_SUCCESS;
336 IndicatorSurface* pIndicatorSurfaceArray = null;
337 r = __indicatorMap.GetValue(pWindow, pIndicatorSurfaceArray);
338 SysTryReturn(NID_UI_CTRL, pIndicatorSurfaceArray, null, r, "[%s] Propagating.", GetErrorMessage(r));
340 for(int i = 0 ; i < NUMBER_OF_OBJECT ; i++)
342 if (pForm == pIndicatorSurfaceArray[i].pForm)
344 if (orientation == _INDICATOR_ORIENTATION_PORTRAIT)
346 pEvasObject = pIndicatorSurfaceArray[i].pPortraitEvasObject;
348 else if(orientation == _INDICATOR_ORIENTATION_LANDSCAPE)
350 pEvasObject = pIndicatorSurfaceArray[i].pLandscapeEvasObject;
358 _IndicatorManager::GetIndicatorSize(_IndicatorOrientation orientation) const
360 const Dimension portraitSize = _ControlManager::GetInstance()->_ControlManager::GetScreenSize();
361 const Dimension landscapeSize = Dimension(portraitSize.height, portraitSize.width);
363 Rectangle indicatorbounds(0, 0, 0, 0);
365 if (orientation == _INDICATOR_ORIENTATION_PORTRAIT)
367 indicatorbounds.width = portraitSize.width;
371 indicatorbounds.width = landscapeSize.width;
373 GET_SHAPE_CONFIG(FORM::INDICATOR_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, indicatorbounds.height);
375 Dimension size(0, 0);
376 size.width = indicatorbounds.width;
377 size.height = indicatorbounds.height;
382 }}} // Tizen::Ui::Controls