Tizen 2.1 base
[framework/osp/uifw.git] / src / ui / controls / FUiCtrl_OverlayPanelImpl.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://floralicense.org/license/
10 //
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.
16 //
17 /*
18  * @file                FUiCtrl_OverlayPanelImpl.cpp
19  * @brief               This is the implementation file for _OverlayPanelImpl class.
20  *
21  */
22
23
24 #include <FBaseSysLog.h>
25 #include <FUiCtrlOverlayPanel.h>
26
27 #include <FSys_EnvironmentImpl.h>
28 #include <FIo_RegistryImpl.h>
29
30 #include "FUi_UiBuilder.h"
31 #include "FUiCtrl_OverlayPanelImpl.h"
32 #include "FUi_ResourceSizeInfo.h"
33 #include "FUi_ResourceManager.h"
34
35 using namespace Tizen::Base;
36 using namespace Tizen::Graphics;
37 using namespace Tizen::Ui::Animations;
38 using namespace Tizen::Io;
39 using namespace Tizen::System;
40
41 #ifndef _OSP_EMUL_
42 namespace
43 {
44         const wchar_t* _UI_REGISTRY_PATH = L"/usr/etc/system-info.ini";
45         const wchar_t* _UI_INFO_SESSION = L"UiControlInfo";
46 }
47 #endif
48
49 namespace Tizen { namespace Ui { namespace Controls
50 {
51
52 bool _OverlayPanelImpl::overlayPanelPixelFomatList[]= {false,};
53
54 Tizen::Graphics::Dimension
55 _OverlayPanelImpl::OverlayPanelSizeInfo::GetDefaultMinimumSize(_ControlOrientation orientation) const
56 {
57         // [ToDo]
58         Dimension dimension(0, 0);
59
60         int minimumSize = 0;
61         result r = GET_SHAPE_CONFIG("OVERLAYPANEL::MIN_RENDERER_SIZE", orientation, minimumSize);
62         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, dimension, r, "[%s] Propagating.", GetErrorMessage(r));
63
64         dimension.width = minimumSize;
65         dimension.height = minimumSize;
66
67         SetLastResult(E_SUCCESS);
68
69         return dimension;
70 }
71
72 _OverlayPanelImpl*
73 _OverlayPanelImpl::CreateOverlayPanelImplN(OverlayPanel* pPublic, const Rectangle& bounds)
74 {
75         result r = GET_SIZE_INFO(OverlayPanel).CheckInitialSizeValid(Dimension(bounds.width, bounds.height), _CONTROL_ORIENTATION_PORTRAIT);
76         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, E_INVALID_ARG, "[E_INVALID_ARG] A specified input parameter is invalid.");
77
78         _OverlayPanel* pCore = _OverlayPanel::CreateOverlayPanelN(bounds);
79         r = GetLastResult();
80         SysTryReturn(NID_UI_CTRL, pCore != null, null, r, "[%s] Propagating.", GetErrorMessage(r));
81
82         _OverlayPanelImpl* pImpl = new (std::nothrow) _OverlayPanelImpl(pPublic, pCore);
83         r = _ControlImpl::CheckConstruction(pCore, pImpl);
84         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
85
86         r = pImpl->InitializeBoundsProperties(GET_SIZE_INFO(OverlayPanel), bounds, _CONTROL_ORIENTATION_PORTRAIT);
87         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
88
89         SetLastResult(E_SUCCESS);
90
91         return pImpl;
92
93 CATCH:
94         delete pImpl;
95         return null;
96 }
97
98 _OverlayPanelImpl::~_OverlayPanelImpl(void)
99 {
100
101 }
102
103 void
104 _OverlayPanelImpl::SetRendererRotation(OverlayPanel::Rotation rotation)
105 {
106         GetCore().SetRendererRotation(rotation);
107 }
108
109 void
110 _OverlayPanelImpl::SetRendererAspectRatio(bool fix)
111 {
112         GetCore().SetRendererAspectRatio(fix);
113 }
114
115 void
116 _OverlayPanelImpl::SetRendererSize(const Dimension& dimension)
117 {
118         GetCore().SetRendererSize(dimension);
119 }
120
121 result
122 _OverlayPanelImpl::SetInputBuffer(const Dimension& destDim, const ByteBuffer& srcBuffer, const Dimension& srcDim, OverlayPanel::BufferPixelFormat srcFormat)
123 {
124          if (!_OverlayPanelImpl::overlayPanelPixelFomatList[0])
125         {
126                 result r = _OverlayPanelImpl::SetPixelFormatList();
127                 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
128         }
129
130         if (!_OverlayPanelImpl::overlayPanelPixelFomatList[srcFormat])
131         {
132                 SysLogException(NID_UI_CTRL, E_UNSUPPORTED_FORMAT, "[E_UNSUPPORTED_FORMAT] srcFormat [%d] is not supported!", srcFormat);
133                 return E_UNSUPPORTED_FORMAT;
134         }
135
136         result r = GetCore().SetInputBuffer(destDim, srcBuffer, srcDim, srcFormat);
137
138         if ((r == E_INVALID_ARG) || (r == E_UNSUPPORTED_FORMAT) || (r == E_SYSTEM))
139         {
140                 SysLogException(NID_UI_CTRL, r, "[%s] Propagating.", GetErrorMessage(r));
141         }
142         else if (r != E_SUCCESS)
143         {
144                 r = E_SYSTEM;
145                 SysLogException(NID_UI_CTRL, r, "[E_SYSTEM] A system error occurred.");
146         }
147
148         return r;
149 }
150
151 result
152 _OverlayPanelImpl::GetBackgroundBufferInfo(BufferInfo& bufferInfo) const
153 {
154         result r = GetCore().GetBackgroundBufferInfo(bufferInfo);
155
156         if (r == E_OPERATION_FAILED)
157         {
158                 SysLogException(NID_UI_CTRL, r, "[%s] Propagating.", GetErrorMessage(r));
159         }
160         else if (r != E_SUCCESS)
161         {
162                 r = E_OPERATION_FAILED;
163                 SysLogException(NID_UI_CTRL, r, "[E_OPERATION_FAILED] The operation has failed.");
164         }
165
166         return r;
167 }
168
169 _OverlayPanelImpl::_OverlayPanelImpl(OverlayPanel* pPublic, _OverlayPanel* pCore)
170         : _ContainerImpl(pPublic, pCore)
171 {
172 }
173
174 Color
175 _OverlayPanelImpl::GetMaskingColor(void) const
176 {
177         return GetCore().GetMaskingColor();
178 }
179
180 const char*
181 _OverlayPanelImpl::GetPublicClassName(void) const
182 {
183         return "Tizen::Ui::Controls::OverlayPanel";
184 }
185
186 const _OverlayPanel&
187 _OverlayPanelImpl::GetCore(void) const
188 {
189         return static_cast <const _OverlayPanel&>(_ControlImpl::GetCore());
190 }
191
192 _OverlayPanel&
193 _OverlayPanelImpl::GetCore(void)
194 {
195         return static_cast <_OverlayPanel&>(_ControlImpl::GetCore());
196 }
197
198 const OverlayPanel&
199 _OverlayPanelImpl::GetPublic(void) const
200 {
201         return static_cast <const OverlayPanel&>(_ControlImpl::GetPublic());
202 }
203
204 OverlayPanel&
205 _OverlayPanelImpl::GetPublic(void)
206 {
207         return static_cast <OverlayPanel&>(_ControlImpl::GetPublic());
208 }
209
210 _OverlayPanelImpl*
211 _OverlayPanelImpl::GetInstance(OverlayPanel& overlayPanel)
212 {
213         return static_cast<_OverlayPanelImpl*> (overlayPanel._pControlImpl);
214 }
215
216 const _OverlayPanelImpl*
217 _OverlayPanelImpl::GetInstance(const OverlayPanel& overlayPanel)
218 {
219         return static_cast<const _OverlayPanelImpl*> (overlayPanel._pControlImpl);
220 }
221
222 result
223 _OverlayPanelImpl::SetPixelFormatList(void)
224 {
225 #ifndef _OSP_EMUL_
226         String formatList;
227
228         result r = E_SUCCESS;
229         _RegistryImpl _reg;
230
231         r = _reg.Construct(_UI_REGISTRY_PATH, REG_OPEN_READ_ONLY, null);
232         if (IsFailed(r))
233         {
234                 if (r == E_OUT_OF_MEMORY)
235                 {
236                         SysTryReturn(NID_UI_CTRL, r != E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
237                 }
238                 else
239                 {
240                         SysAssertf(0, "failed to Construct the _RegistryImpl");
241                 }
242         }
243
244         r = _reg.GetValue(_UI_INFO_SESSION, L"OverlayRegionBufferPixelFormat", formatList);
245         SysAssertf(!IsFailed(r), "Failed to get a registry value");
246
247 #else
248         String formatList(L"ARGB8888/RGB565/YCbCr420P");
249 #endif
250
251         bool set = false;
252         if (formatList.Contains(L"ARGB8888"))
253         {
254                 overlayPanelPixelFomatList[OverlayPanel::BUFFER_PIXEL_FORMAT_ARGB8888+1] = true;
255                 set = true;
256         }
257
258         if (formatList.Contains(L"RGB565"))
259         {
260                 overlayPanelPixelFomatList[OverlayPanel::BUFFER_PIXEL_FORMAT_RGB565+1] = true;
261                 set = true;
262         }
263
264         if (formatList.Contains(L"YCbCr420P"))
265         {
266                 overlayPanelPixelFomatList[OverlayPanel::BUFFER_PIXEL_FORMAT_YCbCr420_PLANAR+1] = true;
267                 set = true;
268         }
269
270         SysAssertf(set, "registry file is something wrong");
271
272         overlayPanelPixelFomatList[0] = set;
273
274         return E_SUCCESS;
275 }
276
277 class _OverlayPanelMaker
278         : public _UiBuilderControlMaker
279 {
280 public:
281         _OverlayPanelMaker(_UiBuilder* uibuilder)
282                 :_UiBuilderControlMaker(uibuilder){};
283         virtual ~_OverlayPanelMaker(){};
284
285         static _UiBuilderControlMaker* GetInstance(_UiBuilder* uibuilder)
286         {
287                 _OverlayPanelMaker* _pOverlayPanelMaker = new (std::nothrow) _OverlayPanelMaker(uibuilder);
288                 return _pOverlayPanelMaker;
289         };
290
291 protected:
292         virtual Tizen::Ui::Control* Make(_UiBuilderControl* pControl)
293         {
294                 result r = E_SYSTEM;
295                 _UiBuilderControlLayout* pControlProperty = NULL;
296                 OverlayPanel* pOverlayPanel = NULL;
297                 Tizen::Graphics::Rectangle rect;
298
299                 GetProperty(pControl, &pControlProperty);
300                 if (pControlProperty == null)
301                 {
302                         return null;
303                 }
304
305                 rect = pControlProperty->GetRect();
306
307                 pOverlayPanel = new (std::nothrow) OverlayPanel();
308                 if (pOverlayPanel == null)
309                 {
310                         return null;
311                 }
312
313                 //Construct
314                 r = pOverlayPanel->Construct(rect);
315                 if (r != E_SUCCESS)
316                 {
317                         delete pOverlayPanel;
318                         return null;
319                 }
320
321                 return pOverlayPanel;
322         }
323 };
324
325 _OverlayPanelRegister::_OverlayPanelRegister()
326 {
327         _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
328         pUiBuilderControlTableManager->RegisterControl("OverlayPanel", _OverlayPanelMaker::GetInstance);
329 }
330
331 _OverlayPanelRegister::~_OverlayPanelRegister()
332 {
333         _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
334         pUiBuilderControlTableManager->UnregisterControl("OverlayPanel");
335 }
336 static _OverlayPanelRegister OverlayPanelRegisterToUIbuilder;
337 }}} // Tizen::Ui::Controls
338