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 FShell_AppWidgetPopup.cpp
19 * @brief This is the implementation file for the _AppWidgetPopup class.
24 #include <Ecore_Evas.h>
26 #include <provider_buffer.h>
27 #include <FBaseSysLog.h>
28 #include <FSysSystemTime.h>
29 #include <FBase_StringConverter.h>
30 #include "FUi_UiKeyEvent.h"
31 #include "FUi_IUiEventManager.h"
32 #include "FUi_UiEventManager.h"
33 #include "FUi_ResourceManager.h"
34 #include "FUiAnim_DisplayManager.h"
35 #include "FUiAnim_RootVisualElement.h"
36 #include "FShell_AppWidgetLayer.h"
37 #include "FShell_AppWidgetPopup.h"
38 #include "FShell_AppWidgetPopupPresenter.h"
39 #include "FShell_AppWidgetProviderManagerImpl.h"
42 using namespace Tizen::Base;
43 using namespace Tizen::Graphics;
44 using namespace Tizen::System;
45 using namespace Tizen::Ui;
46 using namespace Tizen::Ui::Animations;
47 using namespace Tizen::Ui::Controls;
49 namespace Tizen { namespace Shell
52 class _AppWidgetPopupLayer
53 : public _AppWidgetLayer
56 _AppWidgetPopupLayer(const Tizen::Base::String& providerId, const FloatDimension& size);
57 virtual ~_AppWidgetPopupLayer(void);
60 _AppWidgetPopupLayer(const _AppWidgetPopupLayer& rhs);
61 _AppWidgetPopupLayer& operator =(const _AppWidgetPopupLayer& rhs);
63 virtual result RegisterTouchEventListener(void);
64 virtual int AcquirePixmap(void);
65 virtual result Sync(const FloatDimension& size);
66 virtual void ReleasePixmap(void);
69 _AppWidgetPopupLayer::_AppWidgetPopupLayer(const Tizen::Base::String& providerId, const FloatDimension& size)
70 : _AppWidgetLayer(providerId, size)
74 _AppWidgetPopupLayer::~_AppWidgetPopupLayer(void)
84 _AppWidgetPopupLayer::RegisterTouchEventListener(void)
86 result r = _AppWidgetProviderManagerImpl::GetInstance()->SetAppWidgetPopupEventListener(*this);
87 SysTryReturn(NID_SHELL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
93 _AppWidgetPopupLayer::AcquirePixmap(void)
96 SystemTime::GetTicks(ticks);
97 SysLog(NID_SHELL, "%lld", ticks);
101 result r = _AppWidgetProviderManagerImpl::GetInstance()->RequestSharedMemoryIdForPD(GetProviderId(), __size.width, __size.height, pixmapId);
102 SysTryReturn(NID_SHELL, r == E_SUCCESS, -1, r, "[%s] Propagating.", GetErrorMessage(r));
104 SystemTime::GetTicks(ticks);
105 SysLog(NID_SHELL, "%lld", ticks);
107 SysLog(NID_SHELL, "pixmapId(%d) size(%f %f)", pixmapId, __size.width, __size.height);
113 _AppWidgetPopupLayer::Sync(const FloatDimension& size)
115 result r = _AppWidgetProviderManagerImpl::GetInstance()->RequestSyncSharedMemoryForPD(GetProviderId());
116 SysTryReturn(NID_SHELL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
122 _AppWidgetPopupLayer::ReleasePixmap(void)
124 _AppWidgetProviderManagerImpl::GetInstance()->RequestReleaseSharedMemoryForPD(GetProviderId());
127 _AppWidgetPopup::_AppWidgetPopup(void)
128 : __pAppWidgetPopupPresenter(new (std::nothrow) _AppWidgetPopupPresenter(*this))
129 , __pAppWidgetPopupLayer(null)
130 , __pAppWidgetPopupRootVisualElement(null)
131 , __pEventManager(null)
133 SysTryReturnVoidResult(NID_SHELL, __pAppWidgetPopupPresenter, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
135 _UiEventManager* pEventManager = _UiEventManager::GetInstance();
136 SysTryReturnVoidResult(NID_SHELL, pEventManager, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
138 __pEventManager = pEventManager->GetEventManager();
139 SysTryReturnVoidResult(NID_SHELL, __pEventManager, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
142 _AppWidgetPopup::~_AppWidgetPopup(void)
146 __pEventManager->UnregisterTouchEventHandler(*this);
149 __pAppWidgetPopupLayer = null;
150 __pAppWidgetPopupRootVisualElement = null;
154 _AppWidgetPopup::CreateAppWidgetPopupN(void)
156 unique_ptr<_AppWidgetPopup> pAppWidgetPopup(new (std::nothrow) _AppWidgetPopup());
157 SysTryReturn(NID_SHELL, pAppWidgetPopup, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
159 result r = GetLastResult();
160 SysTryReturn(NID_SHELL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
162 pAppWidgetPopup->AcquireHandle();
164 SetLastResult(E_SUCCESS);
166 return pAppWidgetPopup.release();
170 _AppWidgetPopup::Initialize(const FloatDimension& size)
173 SystemTime::GetTicks(ticks);
175 SysLog(NID_SHELL, "(%d %d) %lld", size.width, size.height, ticks);
177 result r = E_SUCCESS;
179 __appwidgetSize = size;
181 SetSystemWindow(true);
183 r = __pAppWidgetPopupPresenter->Initialize();
184 SysTryReturn(NID_SHELL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
186 r = CreateRootVisualElement();
\r
187 SysTryReturn(NID_SHELL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
\r
189 FloatRectangle bounds(0.0f, 0.0f, 1.0f, 1.0f);
\r
190 r = SetBounds(bounds);
\r
191 SysTryReturn(NID_SHELL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
\r
193 r = __pAppWidgetPopupPresenter->Initialize();
\r
194 SysTryReturn(NID_SHELL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
\r
196 __pAppWidgetPopupLayer->SetLayerBounds(bounds);
\r
197 __pAppWidgetPopupLayer->SetShowState(false);
\r
199 __pAppWidgetPopupRootVisualElement->SetImplicitAnimationEnabled(false);
\r
200 __pAppWidgetPopupRootVisualElement->SetName(L"_AppWidgetPopup");
\r
201 __pAppWidgetPopupRootVisualElement->SetBounds(bounds);
\r
202 __pAppWidgetPopupRootVisualElement->SetShowState(false);
\r
204 SetBackgroundColor(Color(0, 0, 0, 0));
\r
206 __pEventManager->RegisterTouchEventHandler(*this);
\r
207 r = GetLastResult();
\r
208 SysTryReturn(NID_SHELL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
214 _AppWidgetPopup::SetProviderId(const String& providerId)
216 __pAppWidgetPopupPresenter->SetProviderId(providerId);
218 result r = __pAppWidgetPopupLayer->SetProviderId(providerId);
219 SysTryReturn(NID_SHELL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
221 FloatRectangle bounds(0.0f, 0.0f, __appwidgetSize.width, __appwidgetSize.height);
222 r = SetBounds(bounds);
223 SysTryReturn(NID_SHELL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
229 _AppWidgetPopup::GetProviderId(void) const
231 return __pAppWidgetPopupPresenter->GetProviderId();
235 _AppWidgetPopup::SetAnchorPosition(const FloatPoint& position)
237 return __pAppWidgetPopupPresenter->SetAnchorPosition(position);
241 _AppWidgetPopup::GetAnchorPosition(void) const
243 return __pAppWidgetPopupPresenter->GetAnchorPosition();
247 _AppWidgetPopup::GetClientAreaCanvasN(void) const
249 Canvas* pCanvas = GetCanvasN(GetClientBoundsF());
250 result r = GetLastResult();
251 SysTryReturn(NID_SHELL, pCanvas, null, r, "[%s] Propagating.", GetErrorMessage(r));
257 _AppWidgetPopup::TranslateToClientAreaPosition(const FloatPoint& controlPosition) const
259 FloatRectangle leftTop = GetClientBoundsF();
261 return FloatPoint(controlPosition.x - leftTop.x, controlPosition.y - leftTop.y);
265 _AppWidgetPopup::TranslateToControlPosition(const FloatPoint& clientPosition) const
267 FloatRectangle leftTop = GetClientBoundsF();
269 return FloatPoint(clientPosition.x + leftTop.x, clientPosition.y + leftTop.y);
273 _AppWidgetPopup::SetLayerShowState(bool showState)
275 result r = E_SUCCESS;
277 if (__pAppWidgetPopupRootVisualElement)
279 _AppWidgetPopupLayer* pLayer = dynamic_cast<_AppWidgetPopupLayer*>(__pAppWidgetPopupRootVisualElement->GetNativeLayer());
280 SysTryReturn(NID_SHELL, pLayer, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
282 r = pLayer->SetShowState(showState);
283 SysTryReturn(NID_SHELL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
285 __pAppWidgetPopupRootVisualElement->SetShowState(showState);
292 _AppWidgetPopup::SetLayerBounds(const FloatRectangle& bounds)
294 result r = E_SUCCESS;
296 if (__pAppWidgetPopupRootVisualElement)
298 _AppWidgetPopupLayer* pLayer = dynamic_cast<_AppWidgetPopupLayer*>(__pAppWidgetPopupRootVisualElement->GetNativeLayer());
300 SysTryReturn(NID_SHELL, pLayer, r, r, "[%s] Propagating.", GetErrorMessage(r));
302 pLayer->SetLayerBounds(bounds);
303 __pAppWidgetPopupRootVisualElement->SetBounds(bounds);
310 _AppWidgetPopup::GetAppWidgetPopupClientBounds(void) const
315 int bottomMargin = 0;
316 _ControlOrientation orientation = GetOrientation();
318 GET_SHAPE_CONFIG(LIVEBOX::POPUP_LEFT_MARGIN, orientation, leftMargin);
319 GET_SHAPE_CONFIG(LIVEBOX::POPUP_RIGHT_MARGIN, orientation, rightMargin);
320 GET_SHAPE_CONFIG(LIVEBOX::POPUP_TOP_MARGIN, orientation, topMargin);
321 GET_SHAPE_CONFIG(LIVEBOX::POPUP_BOTTOM_MARGIN, orientation, bottomMargin);
323 FloatRectangle bounds = GetBoundsF();
325 FloatRectangle clientBounds(bounds.x + leftMargin, bounds.y + topMargin, bounds.width - leftMargin - rightMargin, bounds.height - topMargin - bottomMargin);
327 SysLog(NID_SHELL, "[%d %d %d %d]", clientBounds.x, clientBounds.y, clientBounds.width, clientBounds.height);
333 _AppWidgetPopup::UpdateClientBounds(const FloatDimension& size, FloatRectangle& clientBounds)
335 clientBounds = GetAppWidgetPopupClientBounds();
339 _AppWidgetPopup::CreateLayer(void)
341 unique_ptr<_AppWidgetPopupLayer> pLayer(new (std::nothrow) _AppWidgetPopupLayer(GetProviderId(), GetSizeF()));
342 SysTryReturn(NID_SHELL, pLayer, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
344 result r = pLayer->Construct();
345 SysTryReturn(NID_SHELL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
347 __pAppWidgetPopupLayer = pLayer.release();
348 __pAppWidgetPopupRootVisualElement = __pAppWidgetPopupLayer->GetRootVisualElement();
350 SetLayer(*__pAppWidgetPopupLayer);
351 SetRootVisualElement(*__pAppWidgetPopupRootVisualElement);
357 _AppWidgetPopup::OnActivated(void)
359 result r = SetLayerShowState(true);
360 SysTryReturnVoidResult(NID_SHELL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
364 _AppWidgetPopup::OnBoundsChanged(void)
366 SetLayerBounds(GetBoundsF());
368 SetClientBounds(GetAppWidgetPopupClientBounds());
372 _AppWidgetPopup::OnDraw(void)
374 if (__pAppWidgetPopupPresenter)
376 __pAppWidgetPopupPresenter->Draw();