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.
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 "FGrp_Screen.h"
28 #include <FBaseSysLog.h>
29 #include "FUiCtrl_FrameImpl.h"
30 #include "FUi_UiBuilder.h"
31 #include "FUi_UiBuilderXmlHandler.h"
32 #include "FUi_ControlManager.h"
34 using namespace Tizen::Base;
35 using namespace Tizen::Base::Collection;
36 using namespace Tizen::Io;
37 using namespace Tizen::Ui;
38 using namespace Tizen::Ui::Controls;
39 using namespace Tizen::Media;
40 using namespace Tizen::Graphics;
42 namespace Tizen { namespace Ui
44 _UiBuilder::_UiBuilder(void)
47 , __logicalResolution(0)
48 , __pUiBuilderControlList(null)
50 , __rotate(UIBUIDER_SCREEN_NONE)
56 _UiBuilder::~_UiBuilder(void)
58 if (__pUiBuilderControlList)
60 _UiBuilderControl* pUiBuilderControl = null;
61 int controlCount = __pUiBuilderControlList->GetCount();
62 for (int i = 0; i < controlCount; i++)
64 __pUiBuilderControlList->GetAt(i, pUiBuilderControl);
65 delete pUiBuilderControl;
67 __pUiBuilderControlList->RemoveAll();
68 delete __pUiBuilderControlList;
69 __pUiBuilderControlList = null;
74 _UiBuilder::GetControl(int index) const
76 SysTryReturn(NID_UI, index >= 0 && index < UIBUILDER_CONTROL_MAX_COUNT, null, E_INVALID_ARG,
77 "[E_INVALID_ARG] Index is over than max control count");
79 _UiBuilderControl* pUiBuilderControl = null;
80 __pUiBuilderControlList->GetAt(index, pUiBuilderControl);
81 if (pUiBuilderControl == null)
83 SysLogException(NID_UI, GetLastResult(), "Failed to GetControl()");
87 return pUiBuilderControl;
91 _UiBuilder::GetControl(const Tizen::Base::String& id) const
93 IEnumeratorT<_UiBuilderControl*>* pEnum = __pUiBuilderControlList->GetEnumeratorN();
94 SysTryReturn(NID_UI, pEnum != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to get IEnumeratorT.");
95 _UiBuilderControl* pUiBuilderControl = null;
97 while (pEnum->MoveNext() == E_SUCCESS)
99 pEnum->GetCurrent(pUiBuilderControl);
100 String controlId = pUiBuilderControl->GetId();
102 if (controlId.Equals(id, false))
105 return pUiBuilderControl;
114 _UiBuilder::SetVersion(int xmlVersion)
116 __version = xmlVersion;
120 _UiBuilder::GetVersion(void) const
126 _UiBuilder::Construct(const String& xmlFile, Container* pContainer)
128 result r = E_SUCCESS;
130 __pContainer = pContainer;
132 __pUiBuilderControlList = new (std::nothrow) ArrayListT<_UiBuilderControl*>;
133 SysTryCatch(NID_UI, __pUiBuilderControlList != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to create __pUiBuilderControlList.");
139 delete __pUiBuilderControlList;
144 _UiBuilder::MakeUI(_UiBuilderControl* pControl)
146 result r = E_SUCCESS;
148 _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
149 if(pUiBuilderControlTableManager == null)
151 return E_OUT_OF_MEMORY;
154 for (int i = 0; i < UIBUILDER_CONTROL_MAX_COUNT; i++)
156 if (pUiBuilderControlTableManager->GetName(i).IsEmpty())
161 if (pControl->GetType().Equals(pUiBuilderControlTableManager->GetName(i), false))
163 _UiBuilderControlMakerFunctionPointer pControlMakerFunctionPointer = pUiBuilderControlTableManager->GetControlMaker(i);
164 if (pControlMakerFunctionPointer != null)
166 _UiBuilderControlMaker* pMaker = pControlMakerFunctionPointer(this);
167 r = pMaker->MakeControl(pControl);
176 return E_OPERATION_FAILED;
180 _UiBuilder::Parse(void)
184 FileAttributes attrib;
186 byte* pXmlContents = null;
187 result r = E_SUCCESS;
188 bool findPath = false;
190 String xmlFilePath(L"");
194 __logicalResolution = _CoordinateSystem::GetInstance()->GetLogicalResolutionInt();
196 xmlFilePath.Append(__xmlFile);
197 xmlFilePath.Append(L".xml");
199 _ControlManager* pControlManager = _ControlManager::GetInstance();
200 SysTryReturn(NID_UI, pControlManager != null, E_OPERATION_FAILED, E_OPERATION_FAILED, "[E_OPERATION_FAILED] Unable to get the control manager");
202 int screenWidth = _Screen::GetWidth();
203 int screenHeight = _Screen::GetHeight();
205 // find xml file with device deviceResolution
207 r = temp.Insert("/", 0);
208 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
209 r = temp.Insert(screenHeight, 0);
210 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
211 r = temp.Insert("x", 0);
212 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
213 r = temp.Insert(screenWidth, 0);
214 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
215 r = temp.Insert("res/", 0);
216 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
218 homePath = Tizen::App::App::GetInstance()->GetAppRootPath();
219 r = temp.Insert(homePath, 0);
220 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
221 SysLog(NID_IO, "[UiBuilder] ui builder res path: %ls", temp.GetPointer());
223 // find device deviceResolution directory
224 if (!File::IsFileExist(temp))
227 r = temp.Insert("res/screen-size-normal/", 0);
228 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
230 homePath = Tizen::App::App::GetInstance()->GetAppRootPath();
231 r = temp.Insert(homePath, 0);
232 SysTryReturn(NID_UI, r == E_SUCCESS, E_OPERATION_FAILED, E_OPERATION_FAILED, "[%s] Propagated.", GetErrorMessage(r));
233 SysLog(NID_IO, "[UiBuilder] ui builder home path: %ls, res path: %ls", homePath.GetPointer(), temp.GetPointer());
235 if (!pControlManager->IsCoordinateSystemLogical() || !File::IsFileExist(temp)) // if autoscale on, find ScreenSize normal
238 SysLogException(NID_UI, E_FILE_NOT_FOUND, "[E_FILE_NOT_FOUND] Parse failed -- %ls file not found.", temp.GetPointer());
239 return E_FILE_NOT_FOUND;
245 r = file.Construct(xmlFilePath, L"r");
248 SysLogException(NID_UI, E_OPERATION_FAILED, "[E_OPERATION_FAILED] Parse Failed -- XML file Construct.");
249 return E_OPERATION_FAILED;
252 r = Tizen::Io::File::GetAttributes(xmlFilePath, attrib);
255 SysLogException(NID_UI, E_OPERATION_FAILED, "[E_OPERATION_FAILED] Parse Failed -- XML file GetAttributes.");
256 return E_OPERATION_FAILED;
258 size = (int) attrib.GetFileSize();
260 r = buffer.Construct(size);
263 SysLogException(NID_UI, E_OPERATION_FAILED, "[E_OPERATION_FAILED] Parse Failed - Buffer Construct Failed.");
264 return E_OPERATION_FAILED;
267 r = file.Read(buffer);
270 SysLogException(NID_UI, E_OPERATION_FAILED, "[E_OPERATION_FAILED] Parse Failed -- can't read the file.");
271 return E_OPERATION_FAILED;
274 readCount = buffer.GetPosition();
275 pXmlContents = new (std::nothrow) byte[readCount];
276 SysTryReturn(NID_UI, pXmlContents != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to create XmlContents.");
279 r = buffer.GetArray(pXmlContents, 0, readCount);
282 SysLogException(NID_UI, E_OPERATION_FAILED, "[E_OPERATION_FAILED] Parse Failed -- buffer.GetArray is Failed.");
283 delete[] pXmlContents;
284 return E_OPERATION_FAILED;
287 _UiBuilderXmlHandler xmlHandler;
288 bool returnValue = false;
289 char* pXmlBuffer = (char*) pXmlContents;
292 returnValue = xmlHandler.Construct(this);
293 if (returnValue == false)
295 delete[] pXmlContents;
296 return E_OPERATION_FAILED;
299 r = xmlHandler.ParseXml(pXmlBuffer, readCount);
302 SysLogException(NID_UI, r, "[%s] Propagation.", GetErrorMessage(r));
306 if (__pTransform != null)
308 _UiBuilderControl* pUiBuilderControl;
309 for (int i = 0; i < UIBUILDER_CONTROL_MAX_COUNT; i++)
311 pUiBuilderControl = GetControl(i);
312 if (pUiBuilderControl != null)
314 _UiBuilderControlLayout* pUiBuilderControlLayoutPortrait;
315 _UiBuilderControlLayout* pUiBuilderControlLayoutLandscape;
317 pUiBuilderControlLayoutPortrait = pUiBuilderControl->GetAttribute(UIBUILDER_ATTRIBUTE_PORTRAIT);
318 FloatRectangle rect = pUiBuilderControlLayoutPortrait->GetRectF();
319 FloatRectangle realBounds = __pTransform->Transform(rect);
320 pUiBuilderControlLayoutPortrait->SetRect(realBounds.x, realBounds.y, realBounds.width, realBounds.height);
322 pUiBuilderControlLayoutLandscape = pUiBuilderControl->GetAttribute(UIBUILDER_ATTRIBUTE_LANDSCAPE);
323 rect = pUiBuilderControlLayoutLandscape->GetRectF();
324 realBounds = __pTransform->Transform(rect);
325 pUiBuilderControlLayoutLandscape->SetRect(realBounds.x, realBounds.y, realBounds.width, realBounds.height);
335 //Make UiControls with UiBuilderControls
336 IEnumeratorT<_UiBuilderControl*>* pEnum = __pUiBuilderControlList->GetEnumeratorN();
337 SysTryCatch(NID_UI, pEnum != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to get IEnumeratorT.");
339 while (pEnum->MoveNext() == E_SUCCESS)
341 _UiBuilderControl* pUiBuilderControl = null;
342 pEnum->GetCurrent(pUiBuilderControl);
343 if (pUiBuilderControl != null)
345 r = MakeUI(pUiBuilderControl);
346 SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[UiBuilder] Failed to create control %ls", pUiBuilderControl->GetType().GetPointer());
347 delete pUiBuilderControl;
351 if (__pUiBuilderControlList)
353 __pUiBuilderControlList->RemoveAll();
354 delete __pUiBuilderControlList;
355 __pUiBuilderControlList = null;
363 delete[] pXmlContents;
373 delete[] pXmlContents;
380 _UiBuilder::CreateControl(void)
382 if (__pUiBuilderControlList == null)
384 __pUiBuilderControlList = new (std::nothrow) ArrayListT<_UiBuilderControl*>;
385 SysTryReturn(NID_UI, __pUiBuilderControlList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to create __pUiBuilderControlList.");
388 _UiBuilderControl* pUiBuilderControl = null;
389 pUiBuilderControl = new (std::nothrow) _UiBuilderControl;
390 if (pUiBuilderControl != null)
392 __pUiBuilderControlList->Add(pUiBuilderControl);
396 SysLogException(NID_UI, E_OUT_OF_MEMORY, "Failed to CreateControl()");
400 return pUiBuilderControl;
403 Tizen::Ui::Container*
404 _UiBuilder::GetContainer() const
410 _UiBuilder::SetUiBuilderRotateState(_UiBuilderScreenRotate rotate)
415 _UiBuilderScreenRotate
416 _UiBuilder::GetUiBuilderRotateState() const
422 _UiBuilder::SetFormXmlResolution(int formXmlResoluton)
424 result r = E_SUCCESS;
426 if (__pTransform == null)
428 if (formXmlResoluton == 720 && __logicalResolution == 480)
430 __pTransform = _CoordinateSystem::GetTransformerN(720, _CoordinateSystem::GetInstance()->GetLogicalBaseScreenSize(), Dimension(480, 800), _CoordinateSystem::GetInstance()->GetPhysicalBaseScreenSize());
431 SysTryReturn(NID_UI, __pTransform != null, null, GetLastResult(),
432 "Failed to get Transformer");
434 if (formXmlResoluton == 480 && __logicalResolution == 720)
436 __pTransform = _CoordinateSystem::GetTransformerN(480, _CoordinateSystem::GetInstance()->GetLogicalBaseScreenSize(), Dimension(720, 1280), _CoordinateSystem::GetInstance()->GetPhysicalBaseScreenSize());
437 SysTryReturn(NID_UI, __pTransform != null, GetLastResult(), GetLastResult(),
438 "Failed to get Transformer");
443 SysLog(NID_UI, "__pTransform is already exists");
450 _UiBuilder::SetLayoutOrientation(_UiBuilderControl* pUiBuilderControl, Tizen::Ui::Control* pControl)
452 _ControlImpl* pControlImpl = _ControlImpl::GetInstance(*pControl);
453 _UiBuilderControlLayout* pLayout = null;
456 pLayout = pUiBuilderControl->GetAttribute(UIBUILDER_ATTRIBUTE_PORTRAIT);
457 rect = pLayout->GetRectF();
458 pControlImpl->SetBuilderBounds(_CONTROL_ORIENTATION_PORTRAIT, rect);
460 pLayout = pUiBuilderControl->GetAttribute(UIBUILDER_ATTRIBUTE_LANDSCAPE);
461 rect = pLayout->GetRectF();
462 pControlImpl->SetBuilderBounds(_CONTROL_ORIENTATION_LANDSCAPE, rect);
465 _ICoordinateSystemTransformer*
466 _UiBuilder::GetTransformer() const