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 Dimension screenSize = pControlManager->GetScreenSize();
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 SysTryReturn(NID_UI, returnValue == true, E_OPERATION_FAILED, E_OPERATION_FAILED, "[E_OPERATION_FAILED] Parse Failed - xmlHandler Construct Failed.");
294 r = xmlHandler.ParseXml(pXmlBuffer, readCount);
297 SysLogException(NID_UI, r, "[%s] Propagation.", GetErrorMessage(r));
301 if (__pTransform != null)
303 _UiBuilderControl* pUiBuilderControl;
304 for (int i = 0; i < UIBUILDER_CONTROL_MAX_COUNT; i++)
306 pUiBuilderControl = GetControl(i);
307 if (pUiBuilderControl != null)
309 _UiBuilderControlLayout* pUiBuilderControlLayoutPortrait;
310 _UiBuilderControlLayout* pUiBuilderControlLayoutLandscape;
312 pUiBuilderControlLayoutPortrait = pUiBuilderControl->GetAttribute(UIBUILDER_ATTRIBUTE_PORTRAIT);
313 Rectangle rect = pUiBuilderControlLayoutPortrait->GetRect();
314 Rectangle realBounds = __pTransform->Transform(rect);
315 pUiBuilderControlLayoutPortrait->SetRect(realBounds.x, realBounds.y, realBounds.width, realBounds.height);
317 pUiBuilderControlLayoutLandscape = pUiBuilderControl->GetAttribute(UIBUILDER_ATTRIBUTE_LANDSCAPE);
318 rect = pUiBuilderControlLayoutLandscape->GetRect();
319 realBounds = __pTransform->Transform(rect);
320 pUiBuilderControlLayoutLandscape->SetRect(realBounds.x, realBounds.y, realBounds.width, realBounds.height);
330 //Make UiControls with UiBuilderControls
331 IEnumeratorT<_UiBuilderControl*>* pEnum = __pUiBuilderControlList->GetEnumeratorN();
332 SysTryCatch(NID_UI, pEnum != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to get IEnumeratorT.");
334 while (pEnum->MoveNext() == E_SUCCESS)
336 _UiBuilderControl* pUiBuilderControl = null;
337 pEnum->GetCurrent(pUiBuilderControl);
338 if (pUiBuilderControl != null)
340 r = MakeUI(pUiBuilderControl);
341 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[UiBuilder] Failed to create control %ls", pUiBuilderControl->GetType().GetPointer());
342 delete pUiBuilderControl;
346 if (__pUiBuilderControlList)
348 __pUiBuilderControlList->RemoveAll();
349 delete __pUiBuilderControlList;
350 __pUiBuilderControlList = null;
358 delete[] pXmlContents;
368 delete[] pXmlContents;
375 _UiBuilder::CreateControl(void)
377 if (__pUiBuilderControlList == null)
379 __pUiBuilderControlList = new (std::nothrow) ArrayListT<_UiBuilderControl*>;
380 SysTryReturn(NID_UI, __pUiBuilderControlList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to create __pUiBuilderControlList.");
383 _UiBuilderControl* pUiBuilderControl = null;
384 pUiBuilderControl = new (std::nothrow) _UiBuilderControl;
385 if (pUiBuilderControl != null)
387 __pUiBuilderControlList->Add(pUiBuilderControl);
391 SysLogException(NID_UI, E_OUT_OF_MEMORY, "Failed to CreateControl()");
395 return pUiBuilderControl;
398 Tizen::Ui::Container*
399 _UiBuilder::GetContainer() const
405 _UiBuilder::SetUiBuilderRotateState(_UiBuilderScreenRotate rotate)
410 _UiBuilderScreenRotate
411 _UiBuilder::GetUiBuilderRotateState() const
417 _UiBuilder::SetFormXmlResolution(_LogicalResolution formXmlResoluton)
419 result r = E_SUCCESS;
421 if (__pTransform == null)
423 if (formXmlResoluton == RESOLUTION_LOGICAL_720 && __logicalResolution == 480)
425 __pTransform = _CoordinateSystem::GetTransformerN(RESOLUTION_LOGICAL_720, RESOLUTION_LOGICAL_480);
426 SysTryReturn(NID_UI, __pTransform != null, null, GetLastResult(),
427 "Failed to get Transformer");
429 if (formXmlResoluton == RESOLUTION_LOGICAL_480 && __logicalResolution == 720)
431 __pTransform = _CoordinateSystem::GetTransformerN(RESOLUTION_LOGICAL_480, RESOLUTION_LOGICAL_720);
432 SysTryReturn(NID_UI, __pTransform != null, GetLastResult(), GetLastResult(),
433 "Failed to get Transformer");
438 SysLog(NID_UI, "__pTransform is already exists");
445 _UiBuilder::SetLayoutOrientation(_UiBuilderControl* pUiBuilderControl, Tizen::Ui::Control* pControl)
447 _ControlImpl* pControlImpl = _ControlImpl::GetInstance(*pControl);
448 _UiBuilderControlLayout* pLayout = null;
451 pLayout = pUiBuilderControl->GetAttribute(UIBUILDER_ATTRIBUTE_PORTRAIT);
452 rect = pLayout->GetRect();
453 pControlImpl->SetBuilderBounds(_CONTROL_ORIENTATION_PORTRAIT, rect);
455 pLayout = pUiBuilderControl->GetAttribute(UIBUILDER_ATTRIBUTE_LANDSCAPE);
456 rect = pLayout->GetRect();
457 pControlImpl->SetBuilderBounds(_CONTROL_ORIENTATION_LANDSCAPE, rect);
460 _ICoordinateSystemTransformer*
461 _UiBuilder::GetTransformer() const