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_TableViewPresenter.h
20 * @brief This is the implementation file for _TableViewPresenter class.
22 * This file contains the implementation of _TableViewPresenter class.
26 #ifndef _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_
27 #define _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_
29 #include <FUiCtrlTableView.h>
30 #include <FBaseColArrayListT.h>
31 #include "FUiCtrl_TableViewItem.h"
32 #include "FUiCtrl_ScrollPanelPresenter.h"
34 namespace Tizen { namespace Ui { namespace Animations
39 namespace Tizen { namespace Ui { namespace Controls
44 TABLE_VIEW_ITEM_ALIGNMENT_TOP = 0,
45 TABLE_VIEW_ITEM_ALIGNMENT_BOTTOM
48 enum ItemTouchReleasedEventState
50 TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_NORMAL = 0,
51 TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_FIRE,
52 TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_UPDATE_TABLE_VIEW
55 struct _TableViewReorderInfo
61 float touchPressedPositionY;
62 float itemBasisPositionY;
63 int isScrollDirectionUp;
64 float nonScrollableLimitArea;
65 bool blockedTouchReleaseState;
67 long long touchPressedTick;
68 Tizen::Graphics::FloatRectangle itemBounds;
71 _TableViewReorderInfo(void)
74 , originGroupIndex(-1)
76 , touchPressedPositionY(0.0f)
77 , itemBasisPositionY(0.0f)
78 , isScrollDirectionUp(false)
79 , nonScrollableLimitArea(0.0f)
80 , blockedTouchReleaseState(false)
81 , blockedScroll(false)
89 struct _TableViewSectionStringAlignment
91 HorizontalAlignment headerHorizontalAlignment;
92 HorizontalAlignment footerHorizontalAlignment;
94 _TableViewSectionStringAlignment(void)
95 : headerHorizontalAlignment(ALIGNMENT_LEFT)
96 , footerHorizontalAlignment(ALIGNMENT_RIGHT)
100 bool operator== (const _TableViewSectionStringAlignment& rhs) const;
101 bool operator!= (const _TableViewSectionStringAlignment& rhs) const;
106 class _ListViewModel;
107 class _TableViewItemProviderAdaptor;
109 class _TableViewPresenter
110 : public _ScrollPanelPresenter
111 , public Tizen::Ui::Animations::IVisualElementAnimationTickEventListener
112 , public Tizen::Ui::Animations::IVisualElementAnimationStatusEventListener
113 , virtual public Tizen::Base::Runtime::IEventListener
116 _TableViewPresenter();
117 virtual ~_TableViewPresenter(void);
119 virtual result Construct(_TableView* pTableView);
121 bool Initialize(_TableView* pTableView);
123 _TableView* GetView(void) const;
125 _ListViewModel* GetModel(void) const;
128 result SetItemProvider(const _TableViewItemProvider* pProvider);
130 void SetTableViewItemProviderAdaptor(_TableViewItemProviderAdaptor* pProviderAdaptor);
132 _TableViewItemProviderAdaptor* GetTableViewItemProviderAdaptor(void) const;
134 // event handler for window event
135 virtual void OnBoundsChanged(void);
136 virtual result Draw(void);
138 // Touch Event Previewer
139 virtual _UiTouchEventDelivery OnPreviewTouchPressed(const _Control& source, const _TouchInfo& touchInfo);
140 virtual _UiTouchEventDelivery OnPreviewTouchMoved(const _Control& source, const _TouchInfo& touchInfo);
141 virtual _UiTouchEventDelivery OnPreviewTouchReleased(const _Control& source, const _TouchInfo& touchInfo);
142 virtual _UiTouchEventDelivery OnPreviewTouchCanceled(const _Control& source, const _TouchInfo& touchInfo);
144 // Touch Event Listener
145 virtual bool OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo);
146 virtual bool OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo);
147 virtual bool OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo);
148 virtual bool OnTouchCanceled(const _Control& source, const _TouchInfo& touchInfo);
150 // gestureListener Callback API
151 virtual bool OnFlickGestureDetected(_TouchFlickGestureDetector& gesture);
152 virtual bool OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture);
153 virtual bool OnPreviewFlickGestureDetected(_TouchFlickGestureDetector& gesture);
155 virtual void OnVisualElementAnimationStarted(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target);
156 virtual void OnVisualElementAnimationRepeated(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, long currentRepeatCount);
157 virtual void OnVisualElementAnimationFinished(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, bool completedNormally);
158 virtual void OnTickOccurred(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, const Tizen::Ui::Variant& currentValue);
161 virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer);
164 virtual bool OnAccessibilityItemRefreshed(const _AccessibilityContainer& control, const _AccessibilityElement& element, _AccessibilityFocusDirection direction);
168 result RefreshTableView(int groupIndex, int itemIndex, TableViewRefreshType type, bool animation);
169 result RefreshAllItems(void);
170 result UpdateTableView(void);
172 result GetItemIndexFromPosition(const Tizen::Graphics::FloatPoint& position, int& groupIndex, int& itemIndex) const;
173 result GetItemFromPosition(const Tizen::Graphics::FloatPoint& position, TableViewItemTag& itemPos) const;
175 result GetTopDrawnItem(TableViewItemTag& itemPos) const;
176 result SetTopDrawnItem(TableViewItemTag& itemPos);
178 result GetBottomDrawnItem(TableViewItemTag& itemPos) const;
180 result GetTopDrawnItemIndex(int& groupIndex, int& itemIndex) const;
181 result SetTopDrawnItemIndex(int groupIndex, int itemIndex);
183 result GetBottomDrawnItemIndex(int& groupIndex, int& itemIndex) const;
184 result SetBottomDrawnItemIndex(int groupIndex, int itemIndex);
186 int GetGroupCount(void) const;
187 int GetItemCountAt(int groupIndex) const;
188 bool HasSectionHeader(int groupIndex) const;
189 bool HasSectionFooter(int groupIndex) const;
191 float GetTopMargin(void) const;
192 result SetTopMargin(float topMargin);
194 float GetBottomMargin(void) const;
195 result SetBottomMargin(float bottomMargin);
197 float GetLeftMargin(void) const;
198 result SetLeftMargin(float leftMargin);
200 bool IsItemChecked(int groupIndex, int itemIndex) const;
201 result SetItemChecked(int groupIndex, int itemIndex, bool checked);
203 bool IsItemEnabled(int groupIndex, int itemIndex) const;
204 result SetItemEnabled(int groupIndex, int itemIndex, bool enabled);
206 _TableViewItem* FindItem(TableViewItemTag& itemTag);
207 void UnloadItem(int groupIndex, int itemIndex);
208 _TableViewItem* LoadItem(int groupIndex, int itemIndex);
209 void RefreshItemLayout(int groupIndex, int itemIndex);
210 void GetFirstLoadedItemIndex(int& groupIndex, int& itemIndex) const;
211 void GetLastLoadedItemIndex(int& groupIndex, int& itemIndex) const;
213 result SetStatusChanged(bool changed);
214 bool IsStatusChanged(void) const;
216 result ExpandGroup(int groupIndex, bool withAnimation);
217 result CollapseGroup(int groupIndex, bool withAnimation);
218 bool IsGroupExpanded(int groupIndex) const;
220 result SetReorderMode(bool enabled);
222 bool CheckItemHeightAndRefreshLayout(TableViewItemTag itemTag, bool downScroll);
224 result ScrollByPixel(float scrollDistance);
225 void SetScrollEnabled(bool enable);
226 bool IsScrollEnabled(void) const;
228 bool GetFirstDrawnFlag(void) const;
229 int GetMaxItemCachingSize(void) const;
230 void ResetSweepItem(void);
231 void GetSweepItemIndex(int& groupIndex, int& itemIndex) const;
232 int GetPressedItemCount(void);
234 result OpenContextItem(int groupIndex, int itemIndex);
235 result CloseContextItem(int groupIndex, int itemIndex);
236 bool IsContextItemOpened(int groupIndex, int itemIndex) const;
238 result SetSectionHeaderTextHorizontalAlignment(int sectionIndex, HorizontalAlignment alignment);
239 HorizontalAlignment GetSectionHeaderTextHorizontalAlignment(int sectionIndex) const;
240 result SetSectionFooterTextHorizontalAlignment(int sectionIndex, HorizontalAlignment alignment);
241 HorizontalAlignment GetSectionFooterTextHorizontalAlignment(int sectionIndex) const;
243 void BlockAnimationCallback(bool blocked);
245 void FireItemTouchReleasedEventDuringPressing(int groupIndex, int itemIndex);
248 virtual float ScrollToInternal(float targetPosition);
249 virtual void FadeInScrollBar(void);
250 virtual void FadeOutScrollBar(void);
253 virtual void UpdateLayout(void);
256 _TableViewPresenter(const _TableViewPresenter& rhs);
257 _TableViewPresenter& operator =(const _TableViewPresenter& rhs);
259 _TableView* __pTableView;
260 _ListViewModel* __pListModel;
261 _TableViewItemProviderAdaptor* __pProviderAdaptor;
263 bool PreloadItem(void);
264 bool PreloadItem(int topDrawnGroupIndex, int topDrawnItemIndex, int shiftingDistance);
266 bool GetFirstItem(TableViewItemTag& firstItem) const;
267 bool GetLastItem(TableViewItemTag& lastItem) const;
268 bool GetPreviousItemPosition(const TableViewItemTag& currentItem, TableViewItemTag& prevItem) const;
269 bool GetNextItemPosition(const TableViewItemTag& currentItem, TableViewItemTag& nextItem) const;
270 int GetItemCount(void) const;
271 float GetHeightOfAllItems(void) const;
273 void SetItemLayout(_TableViewItem* pItem, TableViewItemTag& itemPos);
274 float CalculateItemPositionY(int groupIndex, int itemIndex);
275 void AdjustLayoutItems(float scrollPosition);
276 void ResetItemLayout(TableViewItemTag& topDrawnItemTag, float shiftingDistance);
277 void RefreshItemLayout(TableViewItemTag& topDrawnItemTag, TableViewItemTag& refreshItemTag, TableViewRefreshType type, bool animation);
278 void RefreshItemBounds(_TableViewItem* pItem, TableViewItemTag& itemPos);
279 void ScrollToItem(int groupIndex, int itemIndex, TableViewScrollItemAlignment itemAlignment, float shiftingDistance = 0.0f);
282 _TableViewItem* GetTableViewItemFromControl(const _Control& source);
284 void UnloadItem(TableViewItemTag& itemTag);
285 void DetachItem(TableViewItemTag& itemTag);
286 void DetachContextItem(TableViewItemTag& itemTag);
287 void DetachAllItem(bool removeItem);
288 void SetItemDrawingProperty(void);
289 void SetItemType(_TableViewItem* pItem, TableViewItemTag itemPosition);
291 result StartFastScrollTimer(void);
292 void StopFastScrollTimer(void);
294 bool IsEmpty(void) const;
295 result DrawEmptyTableView(void);
297 void LoadItemWithScrollPosition(float previousScrollPosition, float currentScrollPos);
298 bool GetTableViewItemPosition(_TableViewItem& item, TableViewItemTag& itemTag); // item must exist between from tag and end tag
299 int LoadAllItemsInGroup(int groupIndex, bool downward);
300 void SetLoadedItemsVisibleInGroup(int groupIndex, bool visible);
301 TableViewItemTag LoadItemsToBeVisible(const TableViewItemTag& from);
302 void AttachNextItemsToBottom(const TableViewItemTag& anchor);
303 bool IsAnyItemInGroupLoaded(int groupIndex) const;
304 bool IsAnyItemInLoadedIndex(int groupIndex, int itemIndex);
305 void ScrollToHideNonClientArea(TableViewItemTag& bottomTag);
306 void AdjustClientAreaBounds(bool reset, float dist = 0.0f);
307 void SetClientAreaHeight(float height);
308 void UnloadInvisibleItems(void);
311 bool SelectReorderItem(int groupIndex, int itemIndex, bool directSelection);
312 bool ResetReorderItem(int groupIndex, int itemIndex);
313 bool DragSelectedItem(float distance, bool relativeCoordinate);
314 bool CheckReorderItemScrollAnimation(_TableViewItem *pItem);
315 bool CheckReorderItemPosition(_TableViewItem* pItem, TableViewItemTag& reorderItemTag);
316 void AdjustReorderItemLimitPositionY(float& positionY);
317 bool ReorderItem(int destinationGroupIndex, int destinationItemIndex);
318 void StartReorderScrollTimer(void);
319 void StopReorderScrollTimer(void);
322 float GetItemHeight(TableViewItemTag itemTag) const;
323 float SetItemHeight(TableViewItemTag itemTag, float height);
324 bool CreateItemHeightList(float defaultGroupItemHeight, float defaultItemHeight);
325 void DeleteItemHeightList(void);
326 void PresetItemHeightList(void);
327 bool RefreshItemHeightList(int groupIndex, int itemIndex, TableViewRefreshType refreshType);
329 bool CreateSectionAlignmentList(void);
330 void DeleteSectionAlignmentList(void);
331 bool RefreshSectionAlignmentList(int groupIndex, TableViewRefreshType refreshType);
333 void CaptureAndStartRemoveItemAnimation(int groupIndex, int itemIndex);
335 void ShowTableViewCapturedItem(int groupIndex, int itemIndex, float height);
336 void SetLoadedItemsVisibleFromPosition(float position, bool visible);
337 void MoveLoadedItemsFromPosition(float position);
338 void ExpandGroupAnimationFinished(bool completedNormally);
339 void CollapseGroupAnimationFinished(bool completedNormally);
342 void SweepItem(float x);
343 void ResetSweptItem(void);
344 void AdjustSweptItemPosition(bool withAnimation = false);
345 void AdjustLoadedItemWidth(void);
347 bool IsValidDrawnItem(int groupIndex, int itemIndex);
348 void StopAllItemAnimation(void);
350 bool GetAccessibilityElementFocusedState(void);
354 float __bottomMargin;
357 bool __modelInitialized;
358 bool __firstDrawnFlag;
359 bool __statusChangedFlag;
362 _ItemDrawingProperty* __pItemDrawingProperty;
364 Tizen::Ui::Animations::_VisualElement* __pBaseVisualElement;
367 Tizen::Graphics::FloatPoint __sweptItemPosition;
368 TableViewItemTag __sweptItemTag;
370 TableViewItemTag __reservedScrollItemIndex;
371 TableViewScrollItemAlignment __reservedScrollItemAlignment;
373 bool __firstTouchMoved;
375 Tizen::Base::Runtime::Timer* __pReorderScrollTimer;
377 _TableViewReorderInfo __reorderInfo;
379 Tizen::Base::Collection::ArrayListT<float> __itemHeightList;
380 Tizen::Base::Collection::ArrayListT<_TableViewSectionStringAlignment> __sectionAlignmentList;
381 float __itemTotalHeight;
383 TableViewItemTag __expandableItemTag;
384 Tizen::Ui::Animations::_VisualElement* __pCapturedItemVisualElement;
386 Tizen::Base::Runtime::Timer* __pFastScrollTimer;
387 bool __isFastScrollTimerEnabled;
389 float __scrollHeightOnFlickStarted;
390 float __scrollPositionOnFlickStarted;
392 bool __isAnimationCallbackBlocked;
393 bool __lockLoadItemWithScroll;
395 int __itemTouchReleasedEventState;
397 static const int TABLEVIEW_MAX_ITEM_COUNT = 30;
398 static const int REORDER_SCROLL_ANIMATION_TIMER_DURATION = 10;
399 static const float REORDER_SCROLL_ANIMATION_DISTANCE = 10.0f;
400 static const int REORDER_TOUCH_UIACTIVATE_DURATION = 100;
401 static const int FAST_SCROLL_FADE_OUT_DURATION = 500;
402 static const float TABLEVIEW_DEFAULT_ITEM_HEIGHT_VALUE = 12.3456f;
405 static const int REORDER_ITEM_MOVE_ANIMATION_DURATION = 113;
406 static const int ADD_ITEM_ANIMATION_DURATION = 333;
407 static const int REMOVE_ITEM_MOVE_ANIMATION_DURATION = 267;
408 static const int REFRESH_ITEM_ANIMATION_DELAY = 100;
409 static const int EXPAND_GROUP_ANIMATION_DURATION = 335;
410 static const int COLLAPSE_GROUP_ANIMATION_DURATION = 329;
411 static const int SWEEP_ITEM_ANIMATION_DURATION = 300;
414 }}} // Tizen::Ui::Controls
416 #endif // _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_