Changed indicator bg color.
[platform/framework/native/uifw.git] / src / ui / controls / FUiCtrl_TabBarImpl.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0/
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 #include <FBaseInteger.h>
19 #include <FUiAccessibilityContainer.h>
20 #include <FUiAccessibilityElement.h>
21 #include "FUiCtrl_TabBarImpl.h"
22 #include "FUiCtrl_TabBarItem.h"
23 #include "FUi_CoordinateSystemUtils.h"
24 #include "FUi_ResourceSizeInfo.h"
25 #include "FUi_ResourceManager.h"
26
27 //UiBuilder
28 #include <FUiCtrlTabBarItem.h>
29 #include "FUi_UiBuilder.h"
30
31 using namespace Tizen::Ui;
32 using namespace Tizen::Graphics;
33 using namespace Tizen::Base::Runtime;
34
35 namespace Tizen { namespace Ui { namespace Controls
36 {
37
38 _TabBarImpl*
39 _TabBarImpl::GetInstance(TabBar& tabBar)
40 {
41         return static_cast<_TabBarImpl*> (tabBar._pControlImpl);
42 }
43
44 const _TabBarImpl*
45 _TabBarImpl::GetInstance(const TabBar& tabBar)
46 {
47         return static_cast<const _TabBarImpl*> (tabBar._pControlImpl);
48 }
49
50 _TabBarImpl::_TabBarImpl(TabBar* pTabBar, _TabBar* pCore)
51         : _ControlImpl(pTabBar, pCore)
52         , __pPublicActionEvent(null)
53 {
54 }
55
56 _TabBarImpl::~_TabBarImpl(void)
57 {
58         if (__pPublicActionEvent)
59         {
60                 delete __pPublicActionEvent;
61                 __pPublicActionEvent = null;
62         }
63 }
64
65 _TabBarImpl*
66 _TabBarImpl::CreateTabBarImplN(TabBar* pTabBar, const Tizen::Graphics::FloatRectangle& bounds)
67 {
68         ClearLastResult();
69         SysTryReturn(NID_UI_CTRL, bounds.width >= 0.0f && bounds.height >= 0.0f, null, E_INVALID_ARG, "[E_INVALID_ARG] The specified width is smaller than minimum size.");
70
71         float height = 0.0f;
72         GET_SHAPE_CONFIG(TABBAR::HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, height);
73
74         result r = E_SUCCESS;
75
76         _TabBar* pCore = _TabBar::CreateTabBarN();
77         SysTryReturn(NID_UI_CTRL, pCore != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] _TabBar is not constructed.");
78
79         _TabBarImpl* pImpl = new (std::nothrow) _TabBarImpl(pTabBar, pCore);
80         r = CheckConstruction(pCore, pImpl);
81         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
82
83         r = pImpl->SetBounds(FloatRectangle(bounds.x, bounds.y, bounds.width, height));
84         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] SetBounds is failed.", GetErrorMessage(r));
85
86         r = pImpl->SetMinimumSize(FloatDimension(pImpl->GetMinimumSizeF().width, height));
87         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] SetMinimumSize is failed.", GetErrorMessage(r));
88
89         r = pImpl->SetMaximumSize(FloatDimension(pImpl->GetMaximumSizeLimitF().width, height));
90         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] SetMaximumSize is failed.", GetErrorMessage(r));
91
92         return pImpl;
93
94 CATCH:
95         delete pImpl;
96
97         return null;
98 }
99
100 result
101 _TabBarImpl::AddItem(const Tizen::Base::String& text, int actionId)
102 {
103         int itemMaxCnt = 0;
104         GET_SHAPE_CONFIG(TABBAR::ITEM_COUNT_MAX, GetCore().GetOrientation(), itemMaxCnt);
105         SysTryReturn(NID_UI_CTRL, GetCore().GetItemCount() < itemMaxCnt, E_MAX_EXCEEDED, E_MAX_EXCEEDED, "[E_MAX_EXCEEDED] The item is not added more than %d.", itemMaxCnt);
106
107         return GetCore().AddItem(text, actionId);
108 }
109
110 result
111 _TabBarImpl::InsertItemAt(int index, const Tizen::Base::String& text, int actionId)
112 {
113         int itemMaxCnt = 0;
114         GET_SHAPE_CONFIG(TABBAR::ITEM_COUNT_MAX, GetCore().GetOrientation(), itemMaxCnt);
115         SysTryReturn(NID_UI_CTRL, GetCore().GetItemCount() < itemMaxCnt, E_MAX_EXCEEDED, E_MAX_EXCEEDED, "[E_MAX_EXCEEDED] The item is not added more than %d.", itemMaxCnt);
116         SysTryReturn(NID_UI_CTRL, index >= 0 && index <= GetCore().GetItemCount(), E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] This index(%d) is invalid.", index);
117
118         return GetCore().InsertItemAt(index, text, actionId);
119 }
120
121 Tizen::Graphics::Color
122 _TabBarImpl::GetColor(void) const
123 {
124         return GetCore().GetColor();
125 }
126
127 int
128 _TabBarImpl::GetItemCount(void) const
129 {
130         return GetCore().GetItemCount();
131 }
132
133 Tizen::Graphics::Color
134 _TabBarImpl::GetSelectedItemColor(void) const
135 {
136         return GetCore().GetItemColor(ITEM_STATUS_SELECTED);
137 }
138
139 Tizen::Graphics::Color
140 _TabBarImpl::GetItemTextColor(TabBarItemStatus status) const
141 {
142         if (status == TAB_BAR_ITEM_STATUS_NORMAL)
143         {
144                 return GetCore().GetItemTextColor(ITEM_STATUS_NORMAL);
145         }
146         else if (status == TAB_BAR_ITEM_STATUS_SELECTED)
147         {
148                 return GetCore().GetItemTextColor(ITEM_STATUS_SELECTED);
149         }
150
151         return Tizen::Graphics::Color(0);
152 }
153
154 int
155 _TabBarImpl::GetSelectedItemIndex(void) const
156 {
157         return GetCore().GetSelectedItemIndex();
158 }
159
160 result
161 _TabBarImpl::RemoveItemAt(int index)
162 {
163         SysTryReturn(NID_UI_CTRL, index >= 0 && index < GetCore().GetItemCount(), E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] This index(%d) is invalid.", index);
164
165         return GetCore().RemoveItemAt(index);
166 }
167
168 result
169 _TabBarImpl::RemoveAllItems(void)
170 {
171         return GetCore().RemoveAllItems();
172 }
173
174 result
175 _TabBarImpl::SetColor(const Tizen::Graphics::Color& color)
176 {
177         return GetCore().SetColor(color);
178 }
179
180 result
181 _TabBarImpl::SetItemAt(int index, const Tizen::Base::String& text, int actionId)
182 {
183         SysTryReturn(NID_UI_CTRL, index >= 0 && index < GetCore().GetItemCount(), E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] This index(%d) is invalid.", index);
184
185         return GetCore().SetItemAt(index, text, actionId);
186 }
187
188 result
189 _TabBarImpl::SetItemSelected(int index)
190 {
191         SysTryReturn(NID_UI_CTRL, index >= 0 && index < GetCore().GetItemCount(), E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] This index(%d) is invalid.", index);
192
193         return GetCore().SetItemSelected(index);
194 }
195
196 result
197 _TabBarImpl::SetItemTextColor(TabBarItemStatus status, const Tizen::Graphics::Color& color)
198 {
199         if (status == TAB_BAR_ITEM_STATUS_NORMAL)
200         {
201                 GetCore().SetItemTextColor(ITEM_STATUS_NORMAL, color);
202         }
203         else if (status == TAB_BAR_ITEM_STATUS_SELECTED)
204         {
205                 GetCore().SetItemTextColor(ITEM_STATUS_SELECTED, color);
206         }
207
208         return E_SUCCESS;
209 }
210
211 result
212 _TabBarImpl::SetSelectedItemColor(const Tizen::Graphics::Color& color)
213 {
214         return GetCore().SetItemColor(ITEM_STATUS_SELECTED, color);
215 }
216
217 result
218 _TabBarImpl::SetWidth(float width)
219 {
220         return GetCore().SetWidth(width);
221 }
222
223 void
224 _TabBarImpl::AddActionEventListener(Tizen::Ui::IActionEventListener& listener)
225 {
226         ClearLastResult();
227
228         if (__pPublicActionEvent == null)
229         {
230                 __pPublicActionEvent = _PublicActionEvent::CreateInstanceN(GetPublic());
231
232                 if (__pPublicActionEvent == null || IsFailed(GetLastResult()))
233                 {
234                         SysLogException(NID_UI_CTRL, E_INVALID_STATE, "[E_INVALID_STATE] System error occurred.");
235                         SetLastResult(E_INVALID_STATE);
236                         delete __pPublicActionEvent;
237                         return;
238                 }
239         }
240
241         SetLastResult(E_SUCCESS);
242
243         __pPublicActionEvent->AddListener(listener);
244
245         GetCore().AddActionEventListener(*this);
246 }
247
248 void
249 _TabBarImpl::RemoveActionEventListener(Tizen::Ui::IActionEventListener& listener)
250 {
251         SysTryReturnVoidResult(NID_UI_CTRL, __pPublicActionEvent, E_INVALID_STATE, "[E_INVALID_STATE] This instance isn't constructed.")
252
253         // Todo : check fail case of RemoveListener
254         __pPublicActionEvent->RemoveListener(listener);
255
256         GetCore().RemoveActionEventListener(*this);
257 }
258
259 TabBar&
260 _TabBarImpl::GetPublic(void)
261 {
262         return static_cast <TabBar&>(_ControlImpl::GetPublic());
263 }
264
265 const TabBar&
266 _TabBarImpl::GetPublic(void) const
267 {
268         return static_cast <const TabBar&>(_ControlImpl::GetPublic());
269 }
270
271 const char*
272 _TabBarImpl::GetPublicClassName(void) const
273 {
274         return "Tizen::Ui::Controls::TabBar";
275 }
276
277 const _TabBar&
278 _TabBarImpl::GetCore(void) const
279 {
280         return static_cast <const _TabBar&>(_ControlImpl::GetCore());
281 }
282
283 _TabBar&
284 _TabBarImpl::GetCore(void)
285 {
286         return static_cast <_TabBar&>(_ControlImpl::GetCore());
287 }
288
289 void
290 _TabBarImpl::OnActionPerformed(const Tizen::Ui::_Control& source, int actionId)
291 {
292         if (__pPublicActionEvent != null)
293         {
294                 __pPublicActionEvent->Fire(*_PublicActionEvent::CreateActionEventArgN(actionId));
295         }
296 }
297
298 class _TabBarMaker
299         : public _UiBuilderControlMaker
300 {
301 public:
302         _TabBarMaker(_UiBuilder* uibuilder)
303                 : _UiBuilderControlMaker(uibuilder){};
304         virtual ~_TabBarMaker(){};
305
306         static _UiBuilderControlMaker*
307         GetInstance(_UiBuilder* uibuilder)
308         {
309                 _TabBarMaker* pTabBarMaker = new (std::nothrow) _TabBarMaker(uibuilder);
310                 SysTryReturn(NID_UI_CTRL, pTabBarMaker != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
311                 return pTabBarMaker;
312         };
313 protected:
314         virtual Tizen::Ui::Control*
315         Make(_UiBuilderControl* pControl)
316         {
317                 result r = E_SUCCESS;
318                 _UiBuilderControlLayout* pControlProperty = null;
319                 TabBar* pTabBar = null;
320                 Tizen::Graphics::FloatRectangle rect;
321                 Tizen::Base::String elementString;
322                 int opacity = 0;
323                 Color color;
324
325                 GetProperty(pControl, &pControlProperty);
326                 if (pControlProperty == null)
327                 {
328                         return null;
329                 }
330
331                 rect = pControlProperty->GetRectF();
332
333                 //Construct
334                 pTabBar = new (std::nothrow) TabBar();
335                 SysTryReturn(NID_UI_CTRL, pTabBar != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
336
337                 r = pTabBar->Construct(rect.x, rect.y, rect.width);
338                 if (r != E_SUCCESS)
339                 {
340                         delete pTabBar;
341                         return null;
342                 }
343                 //tabBar item..
344                 rect = pTabBar->GetBoundsF();
345
346                 if (pControl->GetElement(L"BGColorOpacity", elementString) == true)
347                 {
348                         Base::Integer::Parse(elementString, opacity);
349                 }
350
351                 if (pControl->GetElement(L"BGColor", elementString) == true)
352                 {
353                         ConvertStringToColor32(elementString, opacity, color);
354                         pTabBar->SetColor(color);
355                 }
356
357                 if (pControl->GetElement(L"backgroundColorOpacity", elementString) == true)
358                 {
359                         Base::Integer::Parse(elementString, opacity);
360                 }
361
362                 if (pControl->GetElement(L"backgroundColor", elementString) == true)
363                 {
364                         ConvertStringToColor32(elementString, opacity, color);
365                         pTabBar->SetColor(color);
366                 }
367
368                 if (pControl->GetElement(L"normalItemTextColor", elementString) == true)
369                 {
370                         ConvertStringToColor(elementString, color);
371                         pTabBar->SetItemTextColor(TAB_BAR_ITEM_STATUS_NORMAL, color);
372                 }
373
374                 if (pControl->GetElement(L"selectedItemTextColor", elementString) == true)
375                 {
376                         ConvertStringToColor(elementString, color);
377                         pTabBar->SetItemTextColor(TAB_BAR_ITEM_STATUS_SELECTED, color);
378                 }
379
380                 if (pControl->GetElement(L"selectedItemColor", elementString) == true)
381                 {
382                         ConvertStringToColor(elementString, color);
383                         pTabBar->SetSelectedItemColor(color);
384                 }
385
386                 int itemCnt = pControl->GetItemCount();
387                 for (int i = 0; i < itemCnt; i++)
388                 {
389                         TabBarItem tabBarItem;
390                         int actionId = 0;
391                         if (pControl->GetItemElement(i, "actionId", elementString))
392                         {
393                                 Base::Integer::Parse(elementString, actionId);
394                         }
395
396                         if (pControl->GetItemElement(i, "text", elementString))
397                         {
398                                 tabBarItem.Construct(elementString, actionId);
399                         }
400                         pTabBar->AddItem(tabBarItem);
401
402                         if (pControl->GetElement(L"accessibilityHint", elementString))
403                         {
404                                 AccessibilityContainer* pContainer = pTabBar->GetAccessibilityContainer();
405                                 if (pContainer)
406                                 {
407                                         AccessibilityElement* pElement = pContainer->GetElement(L"Category" + Base::Integer::ToString(i+1));
408                                         if (pElement)
409                                         {
410                                                 pElement->SetHint(elementString);
411                                         }
412                                 }
413                         }
414                 }
415
416                 rect = (pControl->GetAttribute(UIBUILDER_ATTRIBUTE_PORTRAIT))->GetRectF();
417                 (pControl->GetAttribute(UIBUILDER_ATTRIBUTE_PORTRAIT))->SetRect(rect.x, rect.y, rect.width, rect.height);
418
419                 rect = (pControl->GetAttribute(UIBUILDER_ATTRIBUTE_LANDSCAPE))->GetRectF();
420                 (pControl->GetAttribute(UIBUILDER_ATTRIBUTE_LANDSCAPE))->SetRect(rect.x, rect.y, rect.width, rect.height);
421
422                 /*r = AddControl(pControl, pTabBar);
423                 if (r != E_SUCCESS)
424                 {
425                         delete pTabBar;
426                         return null;
427                 }
428 */
429                 return pTabBar;
430         }
431 };
432
433 _TabBarRegister::_TabBarRegister()
434 {
435         _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
436         pUiBuilderControlTableManager->RegisterControl(L"TabBar", _TabBarMaker::GetInstance);
437 }
438 _TabBarRegister::~_TabBarRegister()
439 {
440         _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
441         pUiBuilderControlTableManager->UnregisterControl(L"TabBar");
442 }
443 static _TabBarRegister TabBarRegisterToUiBuilder;
444 }}} // Tizen::Ui::Controls