Merge "remove unused source code" into tizen_2.1
[platform/framework/native/uifw.git] / src / ui / inc / FUiCtrl_TableViewPresenter.h
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://floralicense.org/license/
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 /**
19  * @file        FUiCtrl_TableViewPresenter.h
20  * @brief       This is the implementation file for _TableViewPresenter class.
21  *
22  * This file contains the implementation of _TableViewPresenter class.
23  */
24
25
26 #ifndef _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_
27 #define _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_
28
29 #include <FUiCtrlTableView.h>
30 #include <FBaseColArrayListT.h>
31 #include "FUiCtrl_TableViewItem.h"
32 #include "FUiCtrl_ScrollPanelPresenter.h"
33
34 namespace Tizen { namespace Ui { namespace Animations
35 {
36 class _VisualElement;
37 }}}
38
39 namespace Tizen { namespace Ui { namespace Controls
40 {
41
42 enum ItemAlignment
43 {
44         TABLE_VIEW_ITEM_ALIGNMENT_TOP = 0,
45         TABLE_VIEW_ITEM_ALIGNMENT_BOTTOM
46 };
47
48 enum ItemTouchReleasedEventState
49 {
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
53 };
54
55 struct _TableViewReorderInfo
56 {
57         int groupIndex;
58         int itemIndex;
59         int originGroupIndex;
60         int originItemIndex;
61         float touchPressedPositionY;
62         float itemBasisPositionY;
63         int isScrollDirectionUp;
64         float nonScrollableLimitArea;
65         bool blockedTouchReleaseState;
66         bool blockedScroll;
67         long long touchPressedTick;
68         Tizen::Graphics::FloatRectangle itemBounds;
69
70
71         _TableViewReorderInfo(void)
72                 : groupIndex(-1)
73                 , itemIndex(-1)
74                 , originGroupIndex(-1)
75                 , originItemIndex(-1)
76                 , touchPressedPositionY(0.0f)
77                 , itemBasisPositionY(0.0f)
78                 , isScrollDirectionUp(false)
79                 , nonScrollableLimitArea(0.0f)
80                 , blockedTouchReleaseState(false)
81                 , blockedScroll(false)
82                 , touchPressedTick(0)
83                 , itemBounds()
84         {
85
86         }
87 };
88
89 struct _TableViewSectionStringAlignment
90 {
91         HorizontalAlignment headerHorizontalAlignment;
92         HorizontalAlignment footerHorizontalAlignment;
93
94         _TableViewSectionStringAlignment(void)
95                 : headerHorizontalAlignment(ALIGNMENT_LEFT)
96                 , footerHorizontalAlignment(ALIGNMENT_RIGHT)
97         {
98         }
99
100         bool operator== (const _TableViewSectionStringAlignment& rhs) const;
101         bool operator!= (const _TableViewSectionStringAlignment& rhs) const;
102 };
103
104
105 class _TableView;
106 class _ListViewModel;
107 class _TableViewItemProviderAdaptor;
108
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
114 {
115 public:
116         _TableViewPresenter();
117         virtual ~_TableViewPresenter(void);
118
119         virtual result Construct(_TableView* pTableView);
120
121         bool Initialize(_TableView* pTableView);
122
123         _TableView* GetView(void) const;
124
125         _ListViewModel* GetModel(void) const;
126
127         // set ItemProvider
128         result SetItemProvider(const _TableViewItemProvider* pProvider);
129
130         void SetTableViewItemProviderAdaptor(_TableViewItemProviderAdaptor* pProviderAdaptor);
131
132         _TableViewItemProviderAdaptor* GetTableViewItemProviderAdaptor(void) const;
133
134         // event handler for window event
135         virtual void OnBoundsChanged(void);
136         virtual result Draw(void);
137
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);
143
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);
149
150         // gestureListener Callback API
151         virtual bool OnFlickGestureDetected(_TouchFlickGestureDetector& gesture);
152         virtual bool OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture);
153         virtual bool OnPreviewFlickGestureDetected(_TouchFlickGestureDetector& gesture);
154
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);
159
160         // Timer Event
161         virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer);
162
163         // accessibility
164         virtual bool OnAccessibilityItemRefreshed(const _AccessibilityContainer& control, const _AccessibilityElement& element, _AccessibilityFocusDirection direction);
165
166         void Dispose(void);
167
168         result RefreshTableView(int groupIndex, int itemIndex, TableViewRefreshType type, bool animation);
169         result RefreshAllItems(void);
170         result UpdateTableView(void);
171
172         result GetItemIndexFromPosition(const Tizen::Graphics::FloatPoint& position, int& groupIndex, int& itemIndex) const;
173         result GetItemFromPosition(const Tizen::Graphics::FloatPoint& position, TableViewItemTag& itemPos) const;
174
175         result GetTopDrawnItem(TableViewItemTag& itemPos) const;
176         result SetTopDrawnItem(TableViewItemTag& itemPos);
177
178         result GetBottomDrawnItem(TableViewItemTag& itemPos) const;
179
180         result GetTopDrawnItemIndex(int& groupIndex, int& itemIndex) const;
181         result SetTopDrawnItemIndex(int groupIndex, int itemIndex);
182
183         result GetBottomDrawnItemIndex(int& groupIndex, int& itemIndex) const;
184         result SetBottomDrawnItemIndex(int groupIndex, int itemIndex);
185
186         int GetGroupCount(void) const;
187         int GetItemCountAt(int groupIndex) const;
188         bool HasSectionHeader(int groupIndex) const;
189         bool HasSectionFooter(int groupIndex) const;
190
191         float GetTopMargin(void) const;
192         result SetTopMargin(float topMargin);
193
194         float GetBottomMargin(void) const;
195         result SetBottomMargin(float bottomMargin);
196
197         float GetLeftMargin(void) const;
198         result SetLeftMargin(float leftMargin);
199
200         bool IsItemChecked(int groupIndex, int itemIndex) const;
201         result SetItemChecked(int groupIndex, int itemIndex, bool checked);
202
203         bool IsItemEnabled(int groupIndex, int itemIndex) const;
204         result SetItemEnabled(int groupIndex, int itemIndex, bool enabled);
205
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;
212
213         result SetStatusChanged(bool changed);
214         bool IsStatusChanged(void) const;
215
216         result ExpandGroup(int groupIndex, bool withAnimation);
217         result CollapseGroup(int groupIndex, bool withAnimation);
218         bool IsGroupExpanded(int groupIndex) const;
219
220         result SetReorderMode(bool enabled);
221
222         bool CheckItemHeightAndRefreshLayout(TableViewItemTag itemTag, bool downScroll);
223
224         result ScrollByPixel(float scrollDistance);
225         void SetScrollEnabled(bool enable);
226         bool IsScrollEnabled(void) const;
227
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);
233
234         result OpenContextItem(int groupIndex, int itemIndex);
235         result CloseContextItem(int groupIndex, int itemIndex);
236         bool IsContextItemOpened(int groupIndex, int itemIndex) const;
237
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;
242
243         void BlockAnimationCallback(bool blocked);
244
245         void FireItemTouchReleasedEventDuringPressing(int groupIndex, int itemIndex);
246
247 protected:
248         virtual float ScrollToInternal(float targetPosition);
249         virtual void FadeInScrollBar(void);
250         virtual void FadeOutScrollBar(void);
251
252         // Update Layout
253         virtual void UpdateLayout(void);
254
255 private:
256         _TableViewPresenter(const _TableViewPresenter& rhs);
257         _TableViewPresenter& operator =(const _TableViewPresenter& rhs);
258
259         _TableView* __pTableView;
260         _ListViewModel* __pListModel;
261         _TableViewItemProviderAdaptor* __pProviderAdaptor;
262
263         bool PreloadItem(void);
264         bool PreloadItem(int topDrawnGroupIndex, int topDrawnItemIndex, int shiftingDistance);
265
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;
272
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);
280
281
282         _TableViewItem* GetTableViewItemFromControl(const _Control& source);
283
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);
290
291         result StartFastScrollTimer(void);
292         void StopFastScrollTimer(void);
293
294         bool IsEmpty(void) const;
295         result DrawEmptyTableView(void);
296
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);
309
310         // reordering
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);
320
321         // item height
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);
328
329         bool CreateSectionAlignmentList(void);
330         void DeleteSectionAlignmentList(void);
331         bool RefreshSectionAlignmentList(int groupIndex, TableViewRefreshType refreshType);
332
333         void CaptureAndStartRemoveItemAnimation(int groupIndex, int itemIndex);
334
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);
340
341
342         void SweepItem(float x);
343         void ResetSweptItem(void);
344         void AdjustSweptItemPosition(bool withAnimation = false);
345         void AdjustLoadedItemWidth(void);
346
347         bool IsValidDrawnItem(int groupIndex, int itemIndex);
348         void StopAllItemAnimation(void);
349
350         bool GetAccessibilityElementFocusedState(void);
351
352 private:
353         float __topMargin;
354         float __bottomMargin;
355         float __leftMargin;
356
357         bool __modelInitialized;
358         bool __firstDrawnFlag;
359         bool __statusChangedFlag;
360         bool __scrolling;
361
362         _ItemDrawingProperty* __pItemDrawingProperty;
363
364         Tizen::Ui::Animations::_VisualElement* __pBaseVisualElement;
365
366         bool __sweepOccured;
367         Tizen::Graphics::FloatPoint __sweptItemPosition;
368         TableViewItemTag __sweptItemTag;
369
370         TableViewItemTag __reservedScrollItemIndex;
371         TableViewScrollItemAlignment __reservedScrollItemAlignment;
372
373         bool __firstTouchMoved;
374
375         Tizen::Base::Runtime::Timer* __pReorderScrollTimer;
376
377         _TableViewReorderInfo __reorderInfo;
378
379         Tizen::Base::Collection::ArrayListT<float> __itemHeightList;
380         Tizen::Base::Collection::ArrayListT<_TableViewSectionStringAlignment> __sectionAlignmentList;
381         float __itemTotalHeight;
382
383         TableViewItemTag __expandableItemTag;
384         Tizen::Ui::Animations::_VisualElement* __pCapturedItemVisualElement;
385
386         Tizen::Base::Runtime::Timer* __pFastScrollTimer;
387         bool __isFastScrollTimerEnabled;
388
389         float __scrollHeightOnFlickStarted;
390         float __scrollPositionOnFlickStarted;
391
392         bool __isAnimationCallbackBlocked;
393         bool __lockLoadItemWithScroll;
394
395         int __itemTouchReleasedEventState;
396
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;
403
404         //animation
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;
412 };
413
414 }}} // Tizen::Ui::Controls
415
416 #endif // _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_
417