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 FUiCtrl_ScrollPanelImpl.cpp
20 * @brief This is the implementation file for the %_ScrollPanelImpl class.
24 #include <FBaseSysLog.h>
25 #include <FGrpRectangle.h>
26 #include <FUiCtrlScrollPanel.h>
27 #include <FBase_LocalizedNumParser.h>
28 #include <FUiLayout.h>
29 #include "FApp_AppInfo.h"
30 #include "FUi_LayoutImpl.h"
31 #include "FUi_LayoutLayoutMaker.h"
32 #include "FUi_UiBuilder.h"
33 #include "FUiCtrl_Edit.h"
34 #include "FUiCtrl_ScrollEvent.h"
35 #include "FUiCtrl_ScrollEventArg.h"
36 #include "FUiCtrl_ScrollPanelImpl.h"
37 #include "FUi_CoordinateSystemUtils.h"
39 using namespace Tizen::App;
40 using namespace Tizen::Graphics;
42 namespace Tizen { namespace Ui { namespace Controls
45 _ScrollPanelImpl::_ScrollPanelImpl(Control* pPublic, _Control* pCore, Layout* pPublicPortraitLayout, Layout* pPublicLandscapeLayout)
46 : _PanelImpl(pPublic, pCore, pPublicPortraitLayout, pPublicLandscapeLayout)
47 , __pScrollEvent(null)
53 _ScrollPanelImpl::~_ScrollPanelImpl(void)
55 GetCore().RemoveScrollEventListener(*this);
57 delete __pScrollEvent;
58 __pScrollEvent = null;
62 _ScrollPanelImpl::CreateScrollPanelImplN(ScrollPanel* pControl, const FloatRectangle& rect, ScrollPanelScrollDirection scrollDirection, bool autoResizingEnable, Layout* pPublicPortraitLayout, Layout* pPublicLandscapeLayout)
66 _ScrollPanelImpl* pImpl = null;
67 _ScrollPanel* pCore = null;
69 if (pPublicPortraitLayout != null)
71 _LayoutImpl* pPortraitLayoutImpl = _LayoutImpl::GetInstance(*pPublicPortraitLayout);
72 SysTryReturn(NID_UI_CTRL, pPortraitLayoutImpl != null, null, E_INVALID_ARG, "[%s] Portrait layout is invalid object", GetErrorMessage(E_INVALID_ARG));
74 if (pPublicLandscapeLayout != null)
76 _LayoutImpl* pLandscapeLayoutImpl = _LayoutImpl::GetInstance(*pPublicLandscapeLayout);
77 SysTryReturn(NID_UI_CTRL, pLandscapeLayoutImpl != null, null, E_INVALID_ARG, "[%s] Landscape layout is invalid object", GetErrorMessage(E_INVALID_ARG));
80 pCore = _ScrollPanel::CreateScrollPanelN(rect, scrollDirection, autoResizingEnable);
81 result r = GetLastResult();
82 SysTryReturn(NID_UI_CTRL, pCore != null, null, r, "[%s] Propagating.", GetErrorMessage(r));
84 pImpl = new (std::nothrow) _ScrollPanelImpl(pControl, pCore, pPublicPortraitLayout, pPublicLandscapeLayout);
85 r = CheckConstruction(pCore, pImpl);
86 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
88 pCore->SetFixingClientBoundsEnabled(!_AppInfo::IsOspCompat());
93 const _ScrollPanelImpl*
94 _ScrollPanelImpl::GetInstance(const ScrollPanel& scrollPanel)
96 return static_cast<const _ScrollPanelImpl*>(_ControlImpl::GetInstance(scrollPanel));
100 _ScrollPanelImpl::GetInstance(ScrollPanel& scrollPanel)
102 return static_cast<_ScrollPanelImpl*>(_ControlImpl::GetInstance(scrollPanel));
106 _ScrollPanelImpl::GetPublicClassName(void) const
108 return "Tizen::Ui::Controls::ScrollPanel";
112 _ScrollPanelImpl::GetPublic(void) const
114 return static_cast <const ScrollPanel&>(_ControlImpl::GetPublic());
118 _ScrollPanelImpl::GetPublic(void)
120 return static_cast <ScrollPanel&>(_ControlImpl::GetPublic());
124 _ScrollPanelImpl::GetCore(void) const
126 return static_cast <const _ScrollPanel&>(_ControlImpl::GetCore());
130 _ScrollPanelImpl::GetCore(void)
132 return static_cast <_ScrollPanel&>(_ControlImpl::GetCore());
136 _ScrollPanelImpl::OnDetachingFromMainTree(void)
140 return _PanelImpl::OnDetachingFromMainTree();
144 _ScrollPanelImpl::AddScrollEventListener(IScrollEventListener& listener)
148 result r = E_SUCCESS;
150 if (__pScrollEvent == null)
152 __pScrollEvent = new (std::nothrow) _ScrollEvent();
153 SysTryReturnVoidResult(NID_UI_CTRL, __pScrollEvent != null, E_OUT_OF_MEMORY, "[%s] The memory is insufficient", GetErrorMessage(E_OUT_OF_MEMORY));
155 r = __pScrollEvent->Construct(GetPublic());
156 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
159 r = __pScrollEvent->AddListener(listener);
160 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
162 GetCore().AddScrollEventListener(*this);
164 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
168 _ScrollPanelImpl::AddScrollEventListener(IScrollEventListenerF& listener)
172 result r = E_SUCCESS;
174 if (__pScrollEvent == null)
176 __pScrollEvent = new (std::nothrow) _ScrollEvent();
177 SysTryReturnVoidResult(NID_UI_CTRL, __pScrollEvent != null, E_OUT_OF_MEMORY, "[%s] The memory is insufficient", GetErrorMessage(E_OUT_OF_MEMORY));
179 r = __pScrollEvent->Construct(GetPublic());
180 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
183 r = __pScrollEvent->AddListener(listener);
184 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
186 GetCore().AddScrollEventListener(*this);
188 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
192 _ScrollPanelImpl::RemoveScrollEventListener(IScrollEventListener& listener)
196 if (__pScrollEvent != null)
198 result r = __pScrollEvent->RemoveListener(listener);
199 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
204 _ScrollPanelImpl::RemoveScrollEventListener(IScrollEventListenerF& listener)
208 if (__pScrollEvent != null)
210 result r = __pScrollEvent->RemoveListener(listener);
211 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
216 _ScrollPanelImpl::OnScrollEndReached(_Control& source, ScrollEndEvent type)
223 if (__pScrollEvent == null)
228 _ScrollEventArg* pEventArg = _ScrollEventArg::GetScrollEventArgN(GetPublic(), type);
229 result r = GetLastResult();
230 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
232 __pScrollEvent->Fire(*pEventArg);
240 _ScrollPanelImpl::OnScrollPositionChanged(_Control& source, float scrollPosition)
247 if (__pScrollEvent == null)
252 _ScrollEventArg* pEventArg = _ScrollEventArg::GetScrollEventArgN(GetPublic(), scrollPosition);
253 result r = GetLastResult();
254 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
256 __pScrollEvent->Fire(*pEventArg);
264 _ScrollPanelImpl::OnScrollStopped(_Control& source)
271 if (__pScrollEvent == null)
276 _ScrollEventArg* pEventArg = _ScrollEventArg::GetScrollEventArgN(GetPublic());
277 result r = GetLastResult();
278 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
280 __pScrollEvent->Fire(*pEventArg);
288 _ScrollPanelImpl::GetScrollPosition(void) const
290 return GetCore().GetScrollPosition();
294 _ScrollPanelImpl::SetScrollPosition(float position, bool withAnimation)
296 GetCore().SetScrollPosition(position, withAnimation);
300 _ScrollPanelImpl::ScrollToBottom(void) const
302 const _ScrollPanel& scrollPanel = GetCore();
303 if (scrollPanel.GetScrollDirection() == SCROLL_PANEL_SCROLL_DIRECTION_HORIZONTAL)
305 scrollPanel.ScrollToRight();
309 scrollPanel.ScrollToBottom();
314 _ScrollPanelImpl::ScrollToTop(void) const
316 const _ScrollPanel& scrollPanel = GetCore();
317 if (scrollPanel.GetScrollDirection() == SCROLL_PANEL_SCROLL_DIRECTION_HORIZONTAL)
319 scrollPanel.ScrollToLeft();
323 scrollPanel.ScrollToTop();
328 _ScrollPanelImpl::CloseOverlayWindow(void)
332 const _Control* pControl = GetCore().GetControlKeypadBinding();
334 _Edit* pKeypadBindingEdit = dynamic_cast <_Edit*>(const_cast <_Control*>(pControl));
336 if (pKeypadBindingEdit == null)
341 result r = pKeypadBindingEdit->HideKeypad();
342 SysTryReturn(NID_UI_CTRL, r != E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
348 _ScrollPanelImpl::GetClientAreaBounds(void) const
350 return GetCore().GetScrollAreaBounds();
354 _ScrollPanelImpl::SetClientAreaHeight(float height)
356 return GetCore().SetClientAreaHeight(height);
360 _ScrollPanelImpl::SetClientAreaWidth(float width)
362 return GetCore().SetClientAreaWidth(width);
365 ScrollPanelScrollDirection
366 _ScrollPanelImpl::GetScrollDirection(void) const
368 return GetCore().GetScrollDirection();
372 _ScrollPanelImpl::IsScrollAreaAutoResizingEnabled(void) const
374 return GetCore().IsScrollAreaAutoResizingEnabled();
378 _ScrollPanelImpl::SetPageScrollEnabled(bool enable)
380 return GetCore().SetPageScrollEnabled(enable);
384 _ScrollPanelImpl::IsPageScrollEnabled(void) const
386 return GetCore().IsPageScrollEnabled();
390 _ScrollPanelImpl::SetScrollBarVisible(bool visible)
392 GetCore().SetScrollBarVisible(visible);
396 _ScrollPanelImpl::IsScrollBarVisible(void) const
398 return GetCore().IsScrollBarVisible();
402 _ScrollPanelImpl::SetScrollInputMode(ScrollInputMode mode)
404 GetCore().SetScrollInputMode(mode);
408 _ScrollPanelImpl::GetScrollInputMode(void) const
410 return GetCore().GetScrollInputMode();
413 class _ScrollPanelMaker
414 : public _UiBuilderControlMaker
417 _ScrollPanelMaker(_UiBuilder* pUibuilder)
418 : _UiBuilderControlMaker(pUibuilder) {};
419 virtual ~_ScrollPanelMaker(void) {};
421 static _UiBuilderControlMaker*
422 GetInstance(_UiBuilder* pUibuilder)
424 _ScrollPanelMaker* pScrollPanelMaker = new (std::nothrow) _ScrollPanelMaker(pUibuilder);
425 SysTryReturn(NID_UI_CTRL, pScrollPanelMaker != null, null, E_OUT_OF_MEMORY, "[%s] The memory is insufficient.", GetErrorMessage(E_OUT_OF_MEMORY));
427 return pScrollPanelMaker;
432 Make(_UiBuilderControl* pControl)
436 ScrollPanel* pScrollPanel = null;
439 _UiBuilderControlLayout* pControlProperty = null;
440 _UiBuilderLayoutType layoutType = UIBUILDER_LAYOUT_NONE;
445 ScrollPanelScrollDirection scrollDirection = SCROLL_PANEL_SCROLL_DIRECTION_VERTICAL;
446 bool autoResizingEnabled = true;
448 Tizen::Base::String elementString;
449 GetProperty(pControl, &pControlProperty);
450 SysTryReturn(NID_UI_CTRL, pControlProperty != null, null, E_SYSTEM, "[%s] pControlProperty is invalid pointer.", GetErrorMessage(E_SYSTEM));
452 if(pControl->GetParentWin().IsEmpty())
454 pScrollPanel = static_cast<ScrollPanel*> (GetContainer());
458 pScrollPanel = new (std::nothrow) ScrollPanel;
460 SysTryReturn(NID_UI_CTRL, pScrollPanel != null, null, E_OUT_OF_MEMORY, "[%s] The memory is insufficient.", GetErrorMessage(E_OUT_OF_MEMORY));
461 rect = pControlProperty->GetRectF();
464 __pLayoutMaker->GetLayoutType(pControlProperty, layoutType);
467 if (pControl->GetElement(L"scrollDirection", elementString) || pControl->GetElement(L"ScrollDirection", elementString))
469 if (elementString.Equals(L"SCROLL_PANEL_SCROLL_DIRECTION_VERTICAL", false))
471 scrollDirection = SCROLL_PANEL_SCROLL_DIRECTION_VERTICAL;
473 else if (elementString.Equals(L"SCROLL_PANEL_SCROLL_DIRECTION_HORIZONTAL", false))
475 scrollDirection = SCROLL_PANEL_SCROLL_DIRECTION_HORIZONTAL;
479 // AutoResizingEnabled
480 if (pControl->GetElement(L"autoResizingEnabled", elementString) || pControl->GetElement(L"AutoResizingEnabled", elementString))
482 if (elementString.Equals(L"false", false))
484 autoResizingEnabled = false;
486 else if (elementString.Equals(L"true", false))
488 autoResizingEnabled = true;
492 if (layoutType == UIBUILDER_LAYOUT_NONE)
494 r = pScrollPanel->Construct(rect, scrollDirection, autoResizingEnabled);
498 Layout* pPortraitLayout = null;
499 Layout* pLandscapeLayout = null;
500 result tempResult = E_SUCCESS;
501 tempResult = __pLayoutMaker->GetLayoutN(pControl, pPortraitLayout, pLandscapeLayout);
502 if (E_SUCCESS == tempResult)
504 //CONSTRUCT_WITH_LAYOUT_ARG1(pScrollPanel, rect);
505 r = pScrollPanel->Construct(*pPortraitLayout, *pLandscapeLayout, rect, scrollDirection, autoResizingEnabled);
511 delete pPortraitLayout;
512 if (pPortraitLayout != pLandscapeLayout)
514 delete pLandscapeLayout;
523 if (pControl->GetElement("backgroundColorOpacity", elementString) || pControl->GetElement("BGColorOpacity", elementString) || pControl->GetElement("backgroundOpacity", elementString))
525 Base::Integer::Parse(elementString, opacity);
528 if (pControl->GetElement("backgroundColor", elementString) || pControl->GetElement("BGColor", elementString))
530 ConvertStringToColor32(elementString, opacity, color);
531 pScrollPanel->SetBackgroundColor(color);
535 color = pScrollPanel->GetBackgroundColor();
536 color.SetAlpha(ConvertOpacity100to255(opacity));
537 pScrollPanel->SetBackgroundColor(color);
540 if (!autoResizingEnabled)
542 if (scrollDirection == SCROLL_PANEL_SCROLL_DIRECTION_HORIZONTAL)
545 if (pControl->GetElement(L"clientAreaWidth", elementString) || pControl->GetElement(L"ClientAreaWidth", elementString))
548 width = _LocalizedNumParser::ToDouble(elementString, "C");
549 pScrollPanel->SetClientAreaWidth(width);
552 else if (scrollDirection == SCROLL_PANEL_SCROLL_DIRECTION_VERTICAL)
555 if (pControl->GetElement(L"clientAreaHeight", elementString) || pControl->GetElement(L"ClientAreaHeight", elementString))
558 height = _LocalizedNumParser::ToDouble(elementString, "C");
559 pScrollPanel->SetClientAreaWidth(height);
565 if (pControl->GetElement(L"pageScrollEnabled", elementString) || pControl->GetElement(L"PageScrollEnabled", elementString))
567 if (elementString.Equals(L"false", false))
569 pScrollPanel->SetPageScrollEnabled(false);
571 else if (elementString.Equals(L"true", false))
573 pScrollPanel->SetPageScrollEnabled(true);
578 if (pControl->GetElement(L"scrollBarVisible", elementString) || pControl->GetElement(L"ScrollBarVisible", elementString))
580 if (elementString.Equals(L"false", false))
582 pScrollPanel->SetScrollBarVisible(false);
584 else if (elementString.Equals(L"true", false))
586 pScrollPanel->SetScrollBarVisible(true);
591 if (pControl->GetElement(L"scrollInputMode", elementString) || pControl->GetElement(L"ScrollInputMode", elementString))
593 if (elementString.Equals(L"SCROLL_INPUT_MODE_ALLOW_ANY_DIRECTION", false))
595 pScrollPanel->SetScrollInputMode(SCROLL_INPUT_MODE_ALLOW_ANY_DIRECTION);
597 else if (elementString.Equals(L"SCROLL_INPUT_MODE_RESTRICT_TO_INITIAL_DIRECTION", false))
599 pScrollPanel->SetScrollInputMode(SCROLL_INPUT_MODE_RESTRICT_TO_INITIAL_DIRECTION);
607 }; // _ScrollPanelMaker
609 _ScrollPanelRegister::_ScrollPanelRegister(void)
611 _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
612 pUiBuilderControlTableManager->RegisterControl(L"ScrollPanel", _ScrollPanelMaker::GetInstance);
614 _ScrollPanelRegister::~_ScrollPanelRegister(void)
616 _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
617 pUiBuilderControlTableManager->UnregisterControl(L"ScrollPanel");
619 static _ScrollPanelRegister ScrollPanelRegisterToUiBuilder;
620 }}} // Tizen::Ui::Controls