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 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 <FUiLayout.h>
28 #include "FApp_AppInfo.h"
29 #include "FUi_LayoutImpl.h"
30 #include "FUi_UiBuilder.h"
31 #include "FUiCtrl_Edit.h"
32 #include "FUiCtrl_ScrollEvent.h"
33 #include "FUiCtrl_ScrollEventArg.h"
34 #include "FUiCtrl_ScrollPanelImpl.h"
36 using namespace Tizen::App;
37 using namespace Tizen::Graphics;
39 namespace Tizen { namespace Ui { namespace Controls
42 _ScrollPanelImpl::_ScrollPanelImpl(Control* pPublic, _Control* pCore, Layout* pPublicPortraitLayout, Layout* pPublicLandscapeLayout)
43 : _PanelImpl(pPublic, pCore, pPublicPortraitLayout, pPublicLandscapeLayout)
44 , __pScrollEvent(null)
49 _ScrollPanelImpl::~_ScrollPanelImpl(void)
51 GetCore().RemoveScrollEventListener(*this);
53 delete __pScrollEvent;
54 __pScrollEvent = null;
58 _ScrollPanelImpl::CreateScrollPanelImplN(ScrollPanel* pControl, const Rectangle& rect, ScrollPanelScrollDirection scrollDirection, bool autoResizingEnable, Layout* pPublicPortraitLayout, Layout* pPublicLandscapeLayout)
62 _ScrollPanelImpl* pImpl = null;
63 _ScrollPanel* pCore = null;
65 if (pPublicPortraitLayout != null)
67 _LayoutImpl* pPortraitLayoutImpl = _LayoutImpl::GetInstance(*pPublicPortraitLayout);
68 SysTryReturn(NID_UI_CTRL, pPortraitLayoutImpl != null, null, E_INVALID_ARG, "[%s] Portrait layout is invalid object", GetErrorMessage(E_INVALID_ARG));
70 if (pPublicLandscapeLayout != null)
72 _LayoutImpl* pLandscapeLayoutImpl = _LayoutImpl::GetInstance(*pPublicLandscapeLayout);
73 SysTryReturn(NID_UI_CTRL, pLandscapeLayoutImpl != null, null, E_INVALID_ARG, "[%s] Landscape layout is invalid object", GetErrorMessage(E_INVALID_ARG));
76 pCore = _ScrollPanel::CreateScrollPanelN(rect, scrollDirection, autoResizingEnable);
77 result r = GetLastResult();
78 SysTryReturn(NID_UI_CTRL, pCore != null, null, r, "[%s] Propagating.", GetErrorMessage(r));
80 pImpl = new (std::nothrow) _ScrollPanelImpl(pControl, pCore, pPublicPortraitLayout, pPublicLandscapeLayout);
81 r = CheckConstruction(pCore, pImpl);
82 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
84 r = pImpl->SetBounds(rect);
85 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
87 pCore->SetFixingClientBoundsEnable(!_AppInfo::IsOspCompat());
98 const _ScrollPanelImpl*
99 _ScrollPanelImpl::GetInstance(const ScrollPanel& scrollPanel)
101 return static_cast<const _ScrollPanelImpl*>(_ControlImpl::GetInstance(scrollPanel));
105 _ScrollPanelImpl::GetInstance(ScrollPanel& scrollPanel)
107 return static_cast<_ScrollPanelImpl*>(_ControlImpl::GetInstance(scrollPanel));
111 _ScrollPanelImpl::GetPublicClassName(void) const
113 return "Tizen::Ui::Controls::ScrollPanel";
117 _ScrollPanelImpl::GetPublic(void) const
119 return static_cast <const ScrollPanel&>(_ControlImpl::GetPublic());
123 _ScrollPanelImpl::GetPublic(void)
125 return static_cast <ScrollPanel&>(_ControlImpl::GetPublic());
129 _ScrollPanelImpl::GetCore(void) const
131 return static_cast <const _ScrollPanel&>(_ControlImpl::GetCore());
135 _ScrollPanelImpl::GetCore(void)
137 return static_cast <_ScrollPanel&>(_ControlImpl::GetCore());
141 _ScrollPanelImpl::AddScrollEventListener(IScrollEventListener& listener)
145 result r = E_SUCCESS;
147 if (__pScrollEvent == null)
149 __pScrollEvent = new (std::nothrow) _ScrollEvent();
150 SysTryReturnVoidResult(NID_UI_CTRL, __pScrollEvent != null, E_OUT_OF_MEMORY, "[%s] The memory is insufficient", GetErrorMessage(E_OUT_OF_MEMORY));
152 r = __pScrollEvent->Construct(GetPublic());
153 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
156 r = __pScrollEvent->AddListener(listener);
157 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
159 GetCore().AddScrollEventListener(*this);
161 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
165 _ScrollPanelImpl::RemoveScrollEventListener(IScrollEventListener& listener)
169 if (__pScrollEvent != null)
171 result r = __pScrollEvent->RemoveListener(listener);
172 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
177 _ScrollPanelImpl::OnScrollEndReached(_Control& source, ScrollEndEvent type)
179 if (__pScrollEvent == null)
184 _ScrollEventArg* pEventArg = _ScrollEventArg::GetScrollEventArgN(GetPublic(), type);
185 result r = GetLastResult();
186 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
188 __pScrollEvent->Fire(*pEventArg);
196 _ScrollPanelImpl::OnScrollPositionChanged(_Control& source, int scrollPosition)
198 if (__pScrollEvent == null)
203 _ScrollEventArg* pEventArg = _ScrollEventArg::GetScrollEventArgN(GetPublic(), scrollPosition);
204 result r = GetLastResult();
205 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
207 __pScrollEvent->Fire(*pEventArg);
215 _ScrollPanelImpl::OnScrollStopped(_Control& source)
217 if (__pScrollEvent == null)
222 _ScrollEventArg* pEventArg = _ScrollEventArg::GetScrollEventArgN(GetPublic());
223 result r = GetLastResult();
224 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
226 __pScrollEvent->Fire(*pEventArg);
234 _ScrollPanelImpl::GetScrollPosition(void) const
236 return GetCore().GetScrollPosition();
240 _ScrollPanelImpl::SetScrollPosition(int position, bool withAnimation)
242 GetCore().SetScrollPosition(position, withAnimation);
246 _ScrollPanelImpl::ScrollToBottom(void) const
248 const _ScrollPanel& scrollPanel = GetCore();
249 if (scrollPanel.GetScrollDirection() == SCROLL_PANEL_SCROLL_DIRECTION_HORIZONTAL)
251 scrollPanel.ScrollToRight();
255 scrollPanel.ScrollToBottom();
260 _ScrollPanelImpl::ScrollToTop(void) const
262 const _ScrollPanel& scrollPanel = GetCore();
263 if (scrollPanel.GetScrollDirection() == SCROLL_PANEL_SCROLL_DIRECTION_HORIZONTAL)
265 scrollPanel.ScrollToLeft();
269 scrollPanel.ScrollToTop();
274 _ScrollPanelImpl::CloseOverlayWindow(void)
278 const _Control* pControl = GetCore().GetControlKeypadBinding();
280 _Edit* pKeypadBindingEdit = dynamic_cast <_Edit*>(const_cast <_Control*>(pControl));
282 if (pKeypadBindingEdit == null)
287 result r = pKeypadBindingEdit->HideKeypad();
288 SysTryReturn(NID_UI_CTRL, r != E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
294 _ScrollPanelImpl::GetClientAreaBounds(void) const
296 return GetCore().GetScrollAreaBounds();
300 _ScrollPanelImpl::SetClientAreaHeight(int height)
302 return GetCore().SetClientAreaHeight(height);
306 _ScrollPanelImpl::SetClientAreaWidth(int width)
308 return GetCore().SetClientAreaWidth(width);
311 ScrollPanelScrollDirection
312 _ScrollPanelImpl::GetScrollDirection(void) const
314 return GetCore().GetScrollDirection();
318 _ScrollPanelImpl::IsScrollAreaAutoResizingEnabled(void) const
320 return GetCore().IsScrollAreaAutoResizingEnabled();
324 _ScrollPanelImpl::SetPageScrollEnabled(bool enable)
326 return GetCore().SetPageScrollEnabled(enable);
330 _ScrollPanelImpl::IsPageScrollEnabled(void) const
332 return GetCore().IsPageScrollEnabled();
336 _ScrollPanelImpl::SetScrollBarVisible(bool visible)
338 GetCore().SetScrollBarVisible(visible);
342 _ScrollPanelImpl::IsScrollBarVisible(void) const
344 return GetCore().IsScrollBarVisible();
348 _ScrollPanelImpl::SetScrollInputMode(ScrollInputMode mode)
350 GetCore().SetScrollInputMode(mode);
354 _ScrollPanelImpl::GetScrollInputMode(void) const
356 return GetCore().GetScrollInputMode();
359 class _ScrollPanelMaker
360 : public _UiBuilderControlMaker
363 _ScrollPanelMaker(_UiBuilder* pUibuilder)
364 : _UiBuilderControlMaker(pUibuilder) {};
365 virtual ~_ScrollPanelMaker(void) {};
367 static _UiBuilderControlMaker*
368 GetInstance(_UiBuilder* pUibuilder)
370 _ScrollPanelMaker* pScrollPanelMaker = new (std::nothrow) _ScrollPanelMaker(pUibuilder);
371 SysTryReturn(NID_UI_CTRL, pScrollPanelMaker != null, null, E_OUT_OF_MEMORY, "[%s] The memory is insufficient.", GetErrorMessage(E_OUT_OF_MEMORY));
373 return pScrollPanelMaker;
378 Make(_UiBuilderControl* pControl)
382 ScrollPanel* pScrollPanel = null;
385 _UiBuilderControlLayout* pControlProperty = null;
386 _UiBuilderLayoutType layoutType = UIBUILDER_LAYOUT_NONE;
391 ScrollPanelScrollDirection scrollDirection = SCROLL_PANEL_SCROLL_DIRECTION_VERTICAL;
392 bool autoResizingEnabled = true;
394 Tizen::Base::String elementString;
395 GetProperty(pControl, &pControlProperty);
396 SysTryReturn(NID_UI_CTRL, pControlProperty != null, null, E_SYSTEM, "[%s] pControlProperty is invalid pointer.", GetErrorMessage(E_SYSTEM));
398 if(pControl->GetParentWin().IsEmpty())
400 pScrollPanel = static_cast<ScrollPanel*> (GetContainer());
404 pScrollPanel = new (std::nothrow) ScrollPanel;
406 SysTryReturn(NID_UI_CTRL, pScrollPanel != null, null, E_OUT_OF_MEMORY, "[%s] The memory is insufficient.", GetErrorMessage(E_OUT_OF_MEMORY));
407 rect = pControlProperty->GetRect();
410 GetLayoutType(pControlProperty, layoutType);
413 if (pControl->GetElement(L"scrollDirection", elementString) || pControl->GetElement(L"ScrollDirection", elementString))
415 if (elementString.Equals(L"SCROLL_PANEL_SCROLL_DIRECTION_VERTICAL", false))
417 scrollDirection = SCROLL_PANEL_SCROLL_DIRECTION_VERTICAL;
419 else if (elementString.Equals(L"SCROLL_PANEL_SCROLL_DIRECTION_HORIZONTAL", false))
421 scrollDirection = SCROLL_PANEL_SCROLL_DIRECTION_HORIZONTAL;
425 // AutoResizingEnabled
426 if (pControl->GetElement(L"autoResizingEnabled", elementString) || pControl->GetElement(L"AutoResizingEnabled", elementString))
428 if (elementString.Equals(L"false", false))
430 autoResizingEnabled = false;
432 else if (elementString.Equals(L"true", false))
434 autoResizingEnabled = true;
438 if (layoutType == UIBUILDER_LAYOUT_NONE)
440 r = pScrollPanel->Construct(rect, scrollDirection, autoResizingEnabled);
444 Layout* pPortraitLayout = null;
445 Layout* pLandscapeLayout = null;
446 result tempResult = E_SUCCESS;
447 tempResult = GetLayoutN(pControl, pPortraitLayout, pLandscapeLayout);
448 if (E_SUCCESS == tempResult)
450 //CONSTRUCT_WITH_LAYOUT_ARG1(pScrollPanel, rect);
451 r = pScrollPanel->Construct(*pPortraitLayout, *pLandscapeLayout, rect, scrollDirection, autoResizingEnabled);
457 delete pPortraitLayout;
458 if (pPortraitLayout != pLandscapeLayout)
460 delete pLandscapeLayout;
469 if (pControl->GetElement("backgroundColorOpacity", elementString) || pControl->GetElement("BGColorOpacity", elementString) || pControl->GetElement("backgroundOpacity", elementString))
471 Base::Integer::Parse(elementString, opacity);
474 if (pControl->GetElement("backgroundColor", elementString) || pControl->GetElement("BGColor", elementString))
476 ConvertStringToColor32(elementString, opacity, color);
477 pScrollPanel->SetBackgroundColor(color);
481 color = pScrollPanel->GetBackgroundColor();
482 color.SetAlpha(ConvertOpacity100to255(opacity));
483 pScrollPanel->SetBackgroundColor(color);
486 if (!autoResizingEnabled)
488 if (scrollDirection == SCROLL_PANEL_SCROLL_DIRECTION_HORIZONTAL)
491 if (pControl->GetElement(L"clientAreaWidth", elementString) || pControl->GetElement(L"ClientAreaWidth", elementString))
494 Base::Integer::Parse(elementString, width);
495 pScrollPanel->SetClientAreaWidth(width);
498 else if (scrollDirection == SCROLL_PANEL_SCROLL_DIRECTION_VERTICAL)
501 if (pControl->GetElement(L"clientAreaHeight", elementString) || pControl->GetElement(L"ClientAreaHeight", elementString))
504 Base::Integer::Parse(elementString, height);
505 pScrollPanel->SetClientAreaWidth(height);
511 if (pControl->GetElement(L"pageScrollEnabled", elementString) || pControl->GetElement(L"PageScrollEnabled", elementString))
513 if (elementString.Equals(L"false", false))
515 pScrollPanel->SetPageScrollEnabled(false);
517 else if (elementString.Equals(L"true", false))
519 pScrollPanel->SetPageScrollEnabled(true);
524 if (pControl->GetElement(L"scrollBarVisible", elementString) || pControl->GetElement(L"ScrollBarVisible", elementString))
526 if (elementString.Equals(L"false", false))
528 pScrollPanel->SetScrollBarVisible(false);
530 else if (elementString.Equals(L"true", false))
532 pScrollPanel->SetScrollBarVisible(true);
537 if (pControl->GetElement(L"scrollInputMode", elementString) || pControl->GetElement(L"ScrollInputMode", elementString))
539 if (elementString.Equals(L"SCROLL_INPUT_MODE_ALLOW_ANY_DIRECTION", false))
541 pScrollPanel->SetScrollInputMode(SCROLL_INPUT_MODE_ALLOW_ANY_DIRECTION);
543 else if (elementString.Equals(L"SCROLL_INPUT_MODE_RESTRICT_TO_INITIAL_DIRECTION", false))
545 pScrollPanel->SetScrollInputMode(SCROLL_INPUT_MODE_RESTRICT_TO_INITIAL_DIRECTION);
553 }; // _ScrollPanelMaker
555 _ScrollPanelRegister::_ScrollPanelRegister(void)
557 _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
558 pUiBuilderControlTableManager->RegisterControl(L"ScrollPanel", _ScrollPanelMaker::GetInstance);
560 _ScrollPanelRegister::~_ScrollPanelRegister(void)
562 _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
563 pUiBuilderControlTableManager->UnregisterControl(L"ScrollPanel");
565 static _ScrollPanelRegister ScrollPanelRegisterToUiBuilder;
566 }}} // Tizen::Ui::Controls