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_Indicator.cpp
19 * @brief This is the implementation file for the _Form class.
22 #include <FGrpRectangle.h>
23 #include <FGrp_CoordinateSystem.h>
24 #include <FUiAnim_VisualElementSurfaceImpl.h>
25 #include "FUiAnim_VisualElement.h"
26 #include "FUiAnim_VisualElementImpl.h"
27 #include "FUiAnim_EflNode.h"
28 #include "FUi_EcoreEvasMgr.h"
29 #include "FUi_EcoreEvas.h"
30 #include "FUi_ResourceManager.h"
31 #include "FUi_CoordinateSystemUtils.h"
32 #include "FUi_Window.h"
33 #include "FUiCtrl_Form.h"
34 #include "FUiCtrl_Indicator.h"
35 #include "FUiCtrl_IndicatorManager.h"
37 using namespace Tizen::Base::Runtime;
38 using namespace Tizen::Graphics;
39 using namespace Tizen::Ui;
40 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 static const char* pPortPublicKey = "__Plug_Ecore_Evas_Port";
48 static const char* pLandPublicKey = "__Plug_Ecore_Evas_Land";
49 static const char* pIndicatorKey = "Inidcator_Manager_Object";
50 static const int CONNECTION_INTERVAL = 1000;
52 #define MSG_DOMAIN_CONTROL_INDICATOR 0x10001
53 #define MSG_ID_INDICATOR_REPEAT_EVENT 0x10002
54 #define MSG_ID_INDICATOR_ROTATION 0x10003
55 #define MSG_ID_INDICATOR_OPACITY 0X1004
56 #define MSG_ID_INDICATOR_TYPE 0X1005
60 _INDICATOR_TYPE_UNKNOWN, /**< Unknown indicator type mode */
61 _INDICATOR_TYPE_1, /**< Type 0 the the indicator */
62 _INDICATOR_TYPE_2, /**< Type 1 the indicator */
66 _Indicator::CreateIndicator(void)
69 Color bgColor(0xff343432);
71 _Indicator* pIndicator = new (std::nothrow) _Indicator;
72 SysTryReturn(NID_UI_CTRL, pIndicator, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
73 SysTryCatch(NID_UI_CTRL, GetLastResult() == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] A system error occurred.");
75 r = pIndicator->ConstructControlVisualElement();
76 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
78 pIndicator->SetBackgroundColor(_Colorf((float)bgColor.GetRed() / 255.0f, (float)bgColor.GetGreen() / 255.0f, (float)bgColor.GetBlue() / 255.0f, (float)bgColor.GetAlpha() / 255.0f));
87 _Indicator::_Indicator(void)
88 : __pPortraitIndicatorEvasObject(null)
89 , __pLandscapeIndicatorEvasObject(null)
90 , __pConnectionTimer(null)
91 , __pPortraitVisualElement(null)
92 , __pLandscapeVisualElement(null)
93 , __pCurrentVisualElement(null)
97 , __opacity(_INDICATOR_OPACITY_OPAQUE)
98 , __orientation(_CONTROL_ORIENTATION_PORTRAIT)
102 _Indicator::~_Indicator(void)
104 if (__pConnectionTimer != null)
106 __pConnectionTimer->Cancel();
107 delete __pConnectionTimer;
108 __pConnectionTimer = null;
113 _Indicator::SetIndicatorShowState(bool state)
115 result r = E_SUCCESS;
117 _EcoreEvas* pEcoreEvas = GetEcoreEvasMgr()->GetEcoreEvas();
118 SysTryReturnResult(NID_UI_CTRL, pEcoreEvas, E_SYSTEM, "[E_SYSTEM] Unable to get evas");
122 r = pEcoreEvas->SetIndicatorShowState(*__pWindow, state);
123 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
132 SetIndicatorOpacity(__opacity);
139 _Indicator::SetIndicatorAutoHide(bool autohide)
144 win = (Ecore_X_Window)__pWindow->GetNativeHandle();
147 Ecore_Evas *pPortraitEe = ecore_evas_object_ecore_evas_get(__pPortraitIndicatorEvasObject);
148 SysTryReturnVoidResult(NID_UI_CTRL, pPortraitEe, E_SYSTEM, "[E_SYSTEM] Unable to get evas.");
149 Ecore_Evas *pLandscapeEe = ecore_evas_object_ecore_evas_get(__pLandscapeIndicatorEvasObject);
150 SysTryReturnVoidResult(NID_UI_CTRL, pLandscapeEe, E_SYSTEM, "[E_SYSTEM] Unable to get evas.");
154 Color bgColor(0x00000000);
155 SetBackgroundColor(_Colorf((float)bgColor.GetRed() / 255.0f, (float)bgColor.GetGreen() / 255.0f, (float)bgColor.GetBlue() / 255.0f, (float)bgColor.GetAlpha() / 255.0f));
156 ecore_x_e_illume_indicator_opacity_set(win, ECORE_X_ILLUME_INDICATOR_TRANSPARENT);
160 SetIndicatorOpacity(__opacity);
161 ecore_x_e_illume_indicator_opacity_set(win, ECORE_X_ILLUME_INDICATOR_OPAQUE);
164 __autohide = autohide;
168 _Indicator::SetIndicatorOpacity(_IndicatorOpacity opacity)
170 result r = E_SUCCESS;
172 if (opacity == _INDICATOR_OPACITY_OPAQUE)
174 Color bgColor(0xff343432);
175 SetBackgroundColor(_Colorf((float)bgColor.GetRed() / 255.0f, (float)bgColor.GetGreen() / 255.0f, (float)bgColor.GetBlue() / 255.0f, (float)bgColor.GetAlpha() / 255.0f));
177 else if (opacity == _INDICATOR_OPACITY_TRANSLUCENT)
179 if (__orientation == _CONTROL_ORIENTATION_PORTRAIT)
181 Color bgColor(0x7f000000);
182 SetBackgroundColor(_Colorf((float)bgColor.GetRed() / 255.0f, (float)bgColor.GetGreen() / 255.0f, (float)bgColor.GetBlue() / 255.0f, (float)bgColor.GetAlpha() / 255.0f));
186 Color bgColor(0x00000000);
187 SetBackgroundColor(_Colorf((float)bgColor.GetRed() / 255.0f, (float)bgColor.GetGreen() / 255.0f, (float)bgColor.GetBlue() / 255.0f, (float)bgColor.GetAlpha() / 255.0f));
197 _Indicator::GetIndicatorShowState(void) const
203 _Indicator::GetIndicatorOpacity(void) const
207 return _INDICATOR_OPACITY_TRANSPARENT;
214 _Indicator::GetIndicatorAutoHide(void) const
220 _Indicator::GetIndicatorBounds(void) const
222 const Dimension portraitSize = _ControlManager::GetInstance()->_ControlManager::GetScreenSize();
223 const Dimension landscapeSize = Dimension(portraitSize.height, portraitSize.width);
225 _ControlOrientation orientation = __pWindow->GetOrientation();
227 Rectangle indicatorbounds(0, 0, 0, 0);
229 if (orientation == _CONTROL_ORIENTATION_PORTRAIT)
231 indicatorbounds.width = portraitSize.width;
232 GET_SHAPE_CONFIG(FORM::INDICATOR_HEIGHT, __pWindow->GetOrientation(), indicatorbounds.height);
236 indicatorbounds.width = landscapeSize.width;
237 GET_SHAPE_CONFIG(FORM::INDICATOR_MINIMIZE_HEIGHT, __pWindow->GetOrientation(), indicatorbounds.height);
240 _CoordinateSystem* pCoordSystem = _CoordinateSystem::GetInstance();
241 SysTryReturn(NID_UI_CTRL, pCoordSystem, Rectangle(-1, -1, -1, -1), E_SYSTEM, "[E_SYSTEM] Coordinate system load failed.");
243 _ICoordinateSystemTransformer* pXformer = pCoordSystem->GetTransformer();
244 SysTryReturn(NID_UI_CTRL, pXformer, Rectangle(-1, -1, -1, -1), E_SYSTEM, "[E_SYSTEM] Coordinate system load failed.");
246 indicatorbounds = pXformer->Transform(indicatorbounds);
248 return indicatorbounds;
252 _Indicator::GetIndicatorBoundsF(void) const
254 const FloatDimension portraitSize = _ControlManager::GetInstance()->_ControlManager::GetScreenSizeF();
255 const FloatDimension landscapeSize = FloatDimension(portraitSize.height, portraitSize.width);
257 _ControlOrientation orientation = __pWindow->GetOrientation();
259 FloatRectangle indicatorbounds(0.0f, 0.0f, 0.0f, 0.0f);
261 if (orientation == _CONTROL_ORIENTATION_PORTRAIT)
263 indicatorbounds.width = portraitSize.width;
264 GET_SHAPE_CONFIG(FORM::INDICATOR_HEIGHT, __pWindow->GetOrientation(), indicatorbounds.height);
268 indicatorbounds.width = landscapeSize.width;
269 GET_SHAPE_CONFIG(FORM::INDICATOR_MINIMIZE_HEIGHT, __pWindow->GetOrientation(), indicatorbounds.height);
272 _CoordinateSystem* pCoordSystem = _CoordinateSystem::GetInstance();
273 SysTryReturn(NID_UI_CTRL, pCoordSystem, FloatRectangle(-1.0, -1.0, -1.0, -1.0), E_SYSTEM, "[E_SYSTEM] Coordinate system load failed.");
275 _ICoordinateSystemTransformer* pXformer = pCoordSystem->GetTransformer();
276 SysTryReturn(NID_UI_CTRL, pXformer, FloatRectangle(-1.0, -1.0, -1.0, -1.0), E_SYSTEM, "[E_SYSTEM] Coordinate system load failed.");
278 indicatorbounds = pXformer->Transform(indicatorbounds);
280 return indicatorbounds;
284 _Indicator::AddIndicatorObject(_Control* pControl, _Window* pWindow)
286 result r = E_SUCCESS;
290 __pPortraitVisualElement = _IndicatorManager::GetInstance()->GetIndicatorVisualElement(pWindow, _INDICATOR_ORIENTATION_PORTRAIT, pControl);
291 SysTryReturn(NID_UI_CTRL, __pPortraitVisualElement, null, E_SYSTEM, "[E_SYSTEM] Indicator can not create the surface.");
292 __pLandscapeVisualElement = _IndicatorManager::GetInstance()->GetIndicatorVisualElement(pWindow, _INDICATOR_ORIENTATION_LANDSCAPE, pControl);
293 SysTryReturn(NID_UI_CTRL, __pLandscapeVisualElement, null, E_SYSTEM, "[E_SYSTEM] Indicator can not create the surface.");
294 __pPortraitIndicatorEvasObject = _IndicatorManager::GetInstance()->GetEvasObject(pWindow, pControl, _INDICATOR_ORIENTATION_PORTRAIT);
295 SysTryReturn(NID_UI_CTRL, __pPortraitIndicatorEvasObject, null, E_SYSTEM, "[E_SYSTEM] Indicator can not get the Evas_Object.");
296 __pLandscapeIndicatorEvasObject = _IndicatorManager::GetInstance()->GetEvasObject(pWindow, pControl, _INDICATOR_ORIENTATION_LANDSCAPE);
297 SysTryReturn(NID_UI_CTRL, __pLandscapeIndicatorEvasObject, null, E_SYSTEM, "[E_SYSTEM] Indicator can not get the Evas_Object.");
299 _ControlOrientation orientation = pControl->GetOrientation();
300 if (orientation == _CONTROL_ORIENTATION_PORTRAIT)
302 r = ChangeCurrentVisualElement(__pPortraitVisualElement);
306 r = ChangeCurrentVisualElement(__pLandscapeVisualElement);
309 Ecore_Evas *pPortraitEe = ecore_evas_object_ecore_evas_get(__pPortraitIndicatorEvasObject);
310 SysTryReturn(NID_UI_CTRL, pPortraitEe, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Unable to get evas.");
311 Ecore_Evas *pLandscapeEe = ecore_evas_object_ecore_evas_get(__pLandscapeIndicatorEvasObject);
312 SysTryReturn(NID_UI_CTRL, pLandscapeEe, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Unable to get evas.");
314 ecore_evas_data_set(pPortraitEe, pPortPublicKey, __pPortraitIndicatorEvasObject);
315 ecore_evas_data_set(pLandscapeEe, pLandPublicKey, __pLandscapeIndicatorEvasObject);
316 ecore_evas_data_set(pPortraitEe, pIndicatorKey, this);
317 ecore_evas_data_set(pLandscapeEe, pIndicatorKey, this);
318 ecore_evas_callback_delete_request_set(pPortraitEe, _Indicator::OnDisconnected);
319 ecore_evas_callback_delete_request_set(pLandscapeEe, _Indicator::OnDisconnected);
321 ecore_evas_callback_msg_handle_set(pPortraitEe, _Indicator::OnMessageHandle);
322 ecore_evas_callback_msg_handle_set(pLandscapeEe, _Indicator::OnMessageHandle);
324 _EcoreEvas* pEcoreEvas = GetEcoreEvasMgr()->GetEcoreEvas();
326 if (pEcoreEvas && __pWindow)
328 rotation = pEcoreEvas->GetWindowRotation(*__pWindow);
331 if(rotation == 0 || rotation == 180)
333 ecore_evas_msg_parent_send(pPortraitEe, MSG_DOMAIN_CONTROL_INDICATOR, MSG_ID_INDICATOR_ROTATION, &rotation, sizeof(int));
337 ecore_evas_msg_parent_send(pLandscapeEe, MSG_DOMAIN_CONTROL_INDICATOR, MSG_ID_INDICATOR_ROTATION, &rotation, sizeof(int));
344 _Indicator::DeleteIndicatorObject(void)
346 result r = E_SUCCESS;
348 r = _IndicatorManager::GetInstance()->ReleaseIndicatorVisualElement(__pWindow, _INDICATOR_ORIENTATION_PORTRAIT, __pPortraitVisualElement);
349 r = _IndicatorManager::GetInstance()->ReleaseIndicatorVisualElement(__pWindow, _INDICATOR_ORIENTATION_LANDSCAPE, __pLandscapeVisualElement);
351 if (__pPortraitVisualElement)
353 r = DetachChild(*__pPortraitVisualElement);
355 if (__pLandscapeVisualElement)
357 r = DetachChild(*__pLandscapeVisualElement);
360 __pPortraitIndicatorEvasObject = null;
361 __pLandscapeIndicatorEvasObject = null;
362 __pPortraitVisualElement = null;
363 __pLandscapeVisualElement = null;
364 __pCurrentVisualElement = null;
370 _Indicator::ChangeCurrentVisualElement(Tizen::Ui::Animations::_VisualElement* pVisualElement)
372 result r = E_SUCCESS;
374 if (!(__pCurrentVisualElement == pVisualElement))
376 r = AttachChild(*pVisualElement);
377 if (__pCurrentVisualElement)
379 r = DetachChild(*__pCurrentVisualElement);
381 __pCurrentVisualElement = pVisualElement;
388 _Indicator::OnChangeLayout(_ControlOrientation orientation)
390 if (orientation == _CONTROL_ORIENTATION_PORTRAIT)
392 ChangeCurrentVisualElement(__pPortraitVisualElement);
393 SetClipChildrenEnabled(true);
397 ChangeCurrentVisualElement(__pLandscapeVisualElement);
398 SetClipChildrenEnabled(false);
400 __orientation = orientation;
403 SetIndicatorOpacity(__opacity);
406 _EcoreEvas* pEcoreEvas = GetEcoreEvasMgr()->GetEcoreEvas();
408 Ecore_Evas *pPortraitEe = ecore_evas_object_ecore_evas_get(__pPortraitIndicatorEvasObject);
409 SysTryReturnVoidResult(NID_UI_CTRL, pPortraitEe, E_SYSTEM, "[E_SYSTEM] Unable to get evas.");
410 Ecore_Evas *pLandscapeEe = ecore_evas_object_ecore_evas_get(__pLandscapeIndicatorEvasObject);
411 SysTryReturnVoidResult(NID_UI_CTRL, pLandscapeEe, E_SYSTEM, "[E_SYSTEM] Unable to get evas.");
413 if (pEcoreEvas && __pWindow)
415 rotation = pEcoreEvas->GetWindowRotation(*__pWindow);
418 if(rotation == 0 || rotation == 180)
420 ecore_evas_msg_parent_send(pPortraitEe, MSG_DOMAIN_CONTROL_INDICATOR, MSG_ID_INDICATOR_ROTATION, &rotation, sizeof(int));
424 ecore_evas_msg_parent_send(pLandscapeEe, MSG_DOMAIN_CONTROL_INDICATOR, MSG_ID_INDICATOR_ROTATION, &rotation, sizeof(int));
429 _Indicator::OnAttachedToMainTree(void)
431 result r = E_SUCCESS;
433 if (__pCurrentVisualElement)
435 r = ChangeCurrentVisualElement(__pCurrentVisualElement);
442 _Indicator::OnTimerExpired(Timer& timer)
444 Eina_Bool result = EINA_TRUE;
446 _ControlOrientation orientation = _ControlManager::GetInstance()->GetOrientation();
447 if (orientation == _CONTROL_ORIENTATION_PORTRAIT)
449 result = ecore_evas_extn_plug_connect(__pPortraitIndicatorEvasObject, pPortraitSvcName, 0, EINA_FALSE);
453 result = ecore_evas_extn_plug_connect(__pLandscapeIndicatorEvasObject, pLandScapeSvcName, 0, EINA_FALSE);
456 if (result == EINA_TRUE)
462 timer.Start(CONNECTION_INTERVAL);
467 _Indicator::OnDisconnected(Ecore_Evas *pEe)
469 _Indicator* pIndicator = (_Indicator*)ecore_evas_data_get(pEe, pIndicatorKey);
470 SysTryReturnVoidResult(NID_UI_CTRL, pIndicator, E_SYSTEM, "[E_SYSTEM] Unable to get Indicator Object");
472 if (pIndicator->__pConnectionTimer == null)
474 pIndicator->__pConnectionTimer = new (std::nothrow) Timer;
475 if (pIndicator->__pConnectionTimer == null)
480 result r = pIndicator->__pConnectionTimer->Construct(*pIndicator);
483 delete pIndicator->__pConnectionTimer;
484 pIndicator->__pConnectionTimer = null;
490 pIndicator->__pConnectionTimer->Start(CONNECTION_INTERVAL);
494 _Indicator::SetNotificationTrayOpenEnabled(bool enable)
496 Ecore_X_Window win = (Ecore_X_Window)__pWindow->GetNativeHandle();
498 Ecore_X_Atom atomPanelScrollable = ecore_x_atom_get("_E_MOVE_PANEL_SCROLLABLE_STATE");
501 ecore_x_window_prop_card32_get(win, atomPanelScrollable, val, 3);
512 ecore_x_window_prop_card32_set(win, atomPanelScrollable, val, 3);
519 _Indicator::IsNotificationTrayOpenEnabled(void) const
521 Ecore_X_Window win = (Ecore_X_Window)__pWindow->GetNativeHandle();
523 Ecore_X_Atom atomPanelScrollable = ecore_x_atom_get("_E_MOVE_PANEL_SCROLLABLE_STATE");
526 ecore_x_window_prop_card32_get(win, atomPanelScrollable, val, 3);
539 _Indicator::OnMessageHandle(Ecore_Evas *pEe, int msgDomain, int msgId, void *data, int size)
546 if (msgDomain == MSG_DOMAIN_CONTROL_INDICATOR)
548 /*if (msg_id == MSG_ID_INDICATOR_REPEAT_EVENT)
550 int *repeat = static_cast<int*>(data);
552 if (msgId == MSG_ID_INDICATOR_TYPE)
554 _IndicatorTypeMode *pIndicatorTypeMode = (_IndicatorTypeMode*)(data);
556 _Window* pWindow = _ControlManager::GetInstance()->_ControlManager::GetTopVisibleWindow();
557 SysTryReturnVoidResult(NID_UI_CTRL, pWindow, E_INVALID_STATE, "[E_INVALID_STATE] Indicator is not attached main tree.");
559 Ecore_X_Window win = (Ecore_X_Window)pWindow->GetNativeHandle();
561 if (*pIndicatorTypeMode == _INDICATOR_TYPE_1)
563 ecore_x_e_illume_indicator_type_set(win, ECORE_X_ILLUME_INDICATOR_TYPE_1);
565 else if (*pIndicatorTypeMode == _INDICATOR_TYPE_2)
567 ecore_x_e_illume_indicator_type_set (win, ECORE_X_ILLUME_INDICATOR_TYPE_2);
573 }}} // Tizen::Ui::Controls