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.
19 * @file FUi_UiBuilder.cpp
20 * @brief This is the implementation file for _UiBuilder class.
25 #include <FUiIOrientationEventListener.h>
26 #include <FUi_ControlImplManager.h>
27 #include <FBaseSysLog.h>
28 #include "FUiCtrl_FrameImpl.h"
29 #include "FUi_UiBuilder.h"
30 #include "FUi_UiBuilderXmlHandler.h"
31 #include "FUi_ControlManager.h"
33 using namespace Tizen::Base;
34 using namespace Tizen::Base::Collection;
35 using namespace Tizen::Io;
36 using namespace Tizen::Ui;
37 using namespace Tizen::Ui::Controls;
38 using namespace Tizen::Media;
39 using namespace Tizen::Graphics;
41 namespace Tizen { namespace Ui
43 _UiBuilder::_UiBuilder(void)
46 , __logicalResolution(0)
47 , __pUiBuilderControlList(null)
49 , __rotate(UIBUIDER_SCREEN_NONE)
55 _UiBuilder::~_UiBuilder(void)
57 if (__pUiBuilderControlList)
59 _UiBuilderControl* pUiBuilderControl = null;
60 int controlCount = __pUiBuilderControlList->GetCount();
61 for (int i = 0; i < controlCount; i++)
63 __pUiBuilderControlList->GetAt(i, pUiBuilderControl);
64 delete pUiBuilderControl;
66 __pUiBuilderControlList->RemoveAll();
67 delete __pUiBuilderControlList;
68 __pUiBuilderControlList = null;
73 _UiBuilder::GetControl(int index) const
75 SysTryReturn(NID_UI, index >= 0 && index < UIBUILDER_CONTROL_MAX_COUNT, null, E_INVALID_ARG,
76 "[E_INVALID_ARG] Index is over than max control count");
78 _UiBuilderControl* pUiBuilderControl = null;
79 __pUiBuilderControlList->GetAt(index, pUiBuilderControl);
80 if (pUiBuilderControl == null)
82 SysLogException(NID_UI, GetLastResult(), "Failed to GetControl()");
86 return pUiBuilderControl;
90 _UiBuilder::GetControl(const Tizen::Base::String& id) const
92 IEnumeratorT<_UiBuilderControl*>* pEnum = __pUiBuilderControlList->GetEnumeratorN();
93 SysTryReturn(NID_UI, pEnum != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to get IEnumeratorT.");
94 _UiBuilderControl* pUiBuilderControl = null;
96 while (pEnum->MoveNext() == E_SUCCESS)
98 pEnum->GetCurrent(pUiBuilderControl);
99 String controlId = pUiBuilderControl->GetId();
101 if (controlId.Equals(id, false))
104 return pUiBuilderControl;
113 _UiBuilder::SetVersion(int xmlVersion)
115 __version = xmlVersion;
119 _UiBuilder::GetVersion(void) const
125 _UiBuilder::Construct(const String& xmlFile, Container* pContainer)
127 result r = E_SUCCESS;
129 __pContainer = pContainer;
131 __pUiBuilderControlList = new (std::nothrow) ArrayListT<_UiBuilderControl*>;
132 SysTryCatch(NID_UI, __pUiBuilderControlList != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to create __pUiBuilderControlList.");
138 delete __pUiBuilderControlList;
143 _UiBuilder::MakeUI(_UiBuilderControl* pControl)
145 result r = E_SUCCESS;
147 _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
148 if(pUiBuilderControlTableManager == null)
150 return E_OUT_OF_MEMORY;
153 for (int i = 0; i < UIBUILDER_CONTROL_MAX_COUNT; i++)
155 if (pUiBuilderControlTableManager->GetName(i).IsEmpty())
160 if (pControl->GetType().Equals(pUiBuilderControlTableManager->GetName(i), false))
162 _UiBuilderControlMakerFunctionPointer pControlMakerFunctionPointer = pUiBuilderControlTableManager->GetControlMaker(i);
163 if (pControlMakerFunctionPointer != null)
165 _UiBuilderControlMaker* pMaker = pControlMakerFunctionPointer(this);
166 r = pMaker->MakeControl(pControl);
175 return E_OPERATION_FAILED;
179 _UiBuilder::Parse(void)
183 FileAttributes attrib;
185 byte* pXmlContents = null;
186 result r = E_SUCCESS;
187 bool findPath = false;
189 String xmlFilePath(L"");
193 __logicalResolution = _CoordinateSystem::GetInstance()->GetLogicalResolutionInt();
195 xmlFilePath.Append(__xmlFile);
196 xmlFilePath.Append(L".xml");
198 _ControlManager* pControlManager = _ControlManager::GetInstance();
199 SysTryReturn(NID_UI, pControlManager != null, E_OPERATION_FAILED, E_OPERATION_FAILED, "[E_OPERATION_FAILED] Unable to get the control manager");
201 FloatDimension screenSize = pControlManager->GetScreenSizeF();
203 // find xml file with device deviceResolution
206 r = temp.Insert("/", 0);
207 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
208 r = temp.Insert(screenSize.height, 0);
209 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
210 r = temp.Insert("x", 0);
211 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
212 r = temp.Insert(screenSize.width, 0);
213 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
214 r = temp.Insert("res/", 0);
215 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
217 homePath = Tizen::App::App::GetInstance()->GetAppRootPath();
218 r = temp.Insert(homePath, 0);
219 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
220 SysLog(NID_IO, "[UiBuilder] ui builder res path: %ls", temp.GetPointer());
222 // find device deviceResolution directory
223 if (!File::IsFileExist(temp))
226 r = temp.Insert("res/screen-size-normal/", 0);
227 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
229 homePath = Tizen::App::App::GetInstance()->GetAppRootPath();
230 r = temp.Insert(homePath, 0);
231 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
232 SysLog(NID_IO, "[UiBuilder] ui builder home path: %ls, res path: %ls", homePath.GetPointer(), temp.GetPointer());
234 if (!pControlManager->IsCoordinateSystemLogical() || !File::IsFileExist(temp)) // if autoscale on, find ScreenSize normal
237 SysLogException(NID_UI, E_FILE_NOT_FOUND, "[E_FILE_NOT_FOUND] Parse failed -- %ls file not found.", temp.GetPointer());
238 return E_FILE_NOT_FOUND;
244 r = file.Construct(xmlFilePath, L"r");
247 SysLogException(NID_UI, E_OPERATION_FAILED, "[E_OPERATION_FAILED] Parse Failed -- XML file Construct.");
248 return E_OPERATION_FAILED;
251 r = Tizen::Io::File::GetAttributes(xmlFilePath, attrib);
254 SysLogException(NID_UI, E_OPERATION_FAILED, "[E_OPERATION_FAILED] Parse Failed -- XML file GetAttributes.");
255 return E_OPERATION_FAILED;
257 size = (int) attrib.GetFileSize();
259 r = buffer.Construct(size);
262 SysLogException(NID_UI, E_OPERATION_FAILED, "[E_OPERATION_FAILED] Parse Failed - Buffer Construct Failed.");
263 return E_OPERATION_FAILED;
266 r = file.Read(buffer);
269 SysLogException(NID_UI, E_OPERATION_FAILED, "[E_OPERATION_FAILED] Parse Failed -- can't read the file.");
270 return E_OPERATION_FAILED;
273 readCount = buffer.GetPosition();
274 pXmlContents = new (std::nothrow) byte[readCount];
275 SysTryReturn(NID_UI, pXmlContents != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to create XmlContents.");
278 r = buffer.GetArray(pXmlContents, 0, readCount);
281 SysLogException(NID_UI, E_OPERATION_FAILED, "[E_OPERATION_FAILED] Parse Failed -- buffer.GetArray is Failed.");
282 delete[] pXmlContents;
283 return E_OPERATION_FAILED;
286 _UiBuilderXmlHandler xmlHandler;
287 bool returnValue = false;
288 char* pXmlBuffer = (char*) pXmlContents;
291 returnValue = xmlHandler.Construct(this);
292 if (returnValue == false)
294 delete[] pXmlContents;
295 return E_OPERATION_FAILED;
298 r = xmlHandler.ParseXml(pXmlBuffer, readCount);
301 SysLogException(NID_UI, r, "[%s] Propagation.", GetErrorMessage(r));
305 if (__pTransform != null)
307 _UiBuilderControl* pUiBuilderControl;
308 for (int i = 0; i < UIBUILDER_CONTROL_MAX_COUNT; i++)
310 pUiBuilderControl = GetControl(i);
311 if (pUiBuilderControl != null)
313 _UiBuilderControlLayout* pUiBuilderControlLayoutPortrait;
314 _UiBuilderControlLayout* pUiBuilderControlLayoutLandscape;
316 pUiBuilderControlLayoutPortrait = pUiBuilderControl->GetAttribute(UIBUILDER_ATTRIBUTE_PORTRAIT);
317 FloatRectangle rect = pUiBuilderControlLayoutPortrait->GetRectF();
318 FloatRectangle realBounds = __pTransform->Transform(rect);
319 pUiBuilderControlLayoutPortrait->SetRect(realBounds.x, realBounds.y, realBounds.width, realBounds.height);
321 pUiBuilderControlLayoutLandscape = pUiBuilderControl->GetAttribute(UIBUILDER_ATTRIBUTE_LANDSCAPE);
322 rect = pUiBuilderControlLayoutLandscape->GetRectF();
323 realBounds = __pTransform->Transform(rect);
324 pUiBuilderControlLayoutLandscape->SetRect(realBounds.x, realBounds.y, realBounds.width, realBounds.height);
334 //Make UiControls with UiBuilderControls
335 IEnumeratorT<_UiBuilderControl*>* pEnum = __pUiBuilderControlList->GetEnumeratorN();
336 SysTryCatch(NID_UI, pEnum != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to get IEnumeratorT.");
338 while (pEnum->MoveNext() == E_SUCCESS)
340 _UiBuilderControl* pUiBuilderControl = null;
341 pEnum->GetCurrent(pUiBuilderControl);
342 if (pUiBuilderControl != null)
344 r = MakeUI(pUiBuilderControl);
345 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[UiBuilder] Failed to create control %ls", pUiBuilderControl->GetType().GetPointer());
346 delete pUiBuilderControl;
350 if (__pUiBuilderControlList)
352 __pUiBuilderControlList->RemoveAll();
353 delete __pUiBuilderControlList;
354 __pUiBuilderControlList = null;
362 delete[] pXmlContents;
372 delete[] pXmlContents;
379 _UiBuilder::CreateControl(void)
381 if (__pUiBuilderControlList == null)
383 __pUiBuilderControlList = new (std::nothrow) ArrayListT<_UiBuilderControl*>;
384 SysTryReturn(NID_UI, __pUiBuilderControlList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to create __pUiBuilderControlList.");
387 _UiBuilderControl* pUiBuilderControl = null;
388 pUiBuilderControl = new (std::nothrow) _UiBuilderControl;
389 if (pUiBuilderControl != null)
391 __pUiBuilderControlList->Add(pUiBuilderControl);
395 SysLogException(NID_UI, E_OUT_OF_MEMORY, "Failed to CreateControl()");
399 return pUiBuilderControl;
402 Tizen::Ui::Container*
403 _UiBuilder::GetContainer() const
409 _UiBuilder::SetUiBuilderRotateState(_UiBuilderScreenRotate rotate)
414 _UiBuilderScreenRotate
415 _UiBuilder::GetUiBuilderRotateState() const
421 _UiBuilder::SetFormXmlResolution(int formXmlResoluton)
423 result r = E_SUCCESS;
425 if (__pTransform == null)
427 if (formXmlResoluton == 720 && __logicalResolution == 480)
429 __pTransform = _CoordinateSystem::GetTransformerN(720, _CoordinateSystem::GetInstance()->GetLogicalBaseScreenSize(), Dimension(480, 800), _CoordinateSystem::GetInstance()->GetPhysicalBaseScreenSize());
430 SysTryReturn(NID_UI, __pTransform != null, null, GetLastResult(),
431 "Failed to get Transformer");
433 if (formXmlResoluton == 480 && __logicalResolution == 720)
435 __pTransform = _CoordinateSystem::GetTransformerN(480, _CoordinateSystem::GetInstance()->GetLogicalBaseScreenSize(), Dimension(720, 1280), _CoordinateSystem::GetInstance()->GetPhysicalBaseScreenSize());
436 SysTryReturn(NID_UI, __pTransform != null, GetLastResult(), GetLastResult(),
437 "Failed to get Transformer");
442 SysLog(NID_UI, "__pTransform is already exists");
449 _UiBuilder::SetLayoutOrientation(_UiBuilderControl* pUiBuilderControl, Tizen::Ui::Control* pControl)
451 _ControlImpl* pControlImpl = _ControlImpl::GetInstance(*pControl);
452 _UiBuilderControlLayout* pLayout = null;
455 pLayout = pUiBuilderControl->GetAttribute(UIBUILDER_ATTRIBUTE_PORTRAIT);
456 rect = pLayout->GetRectF();
457 pControlImpl->SetBuilderBounds(_CONTROL_ORIENTATION_PORTRAIT, rect);
459 pLayout = pUiBuilderControl->GetAttribute(UIBUILDER_ATTRIBUTE_LANDSCAPE);
460 rect = pLayout->GetRectF();
461 pControlImpl->SetBuilderBounds(_CONTROL_ORIENTATION_LANDSCAPE, rect);
464 _ICoordinateSystemTransformer*
465 _UiBuilder::GetTransformer() const