Fork for IVI: mesa fixing
[profile/ivi/uifw.git] / src / ui / inc / FUiCtrl_IconListPresenter.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_IconListPresenter.h
20  * @brief               This is the header file for the _IconListPresenter class.
21  */
22
23 #ifndef _FUI_CTRL_INTERNAL_ICON_LIST_PRESENTER_H_
24 #define _FUI_CTRL_INTERNAL_ICON_LIST_PRESENTER_H_
25
26 #include <FBaseRtITimerEventListener.h>
27 #include <FBaseRtTimer.h>
28 #include <FGrpCanvas.h>
29 #include <FGrpFloatRectangle.h>
30 #include <FGrpPoint.h>
31 #include <FGrpRectangle.h>
32 #include <FUiCtrlControlsTypes.h>
33 #include <FUiCtrlIconListViewTypes.h>
34 #include <FUiCtrlIIconListViewItemProvider.h>
35 #include <FUiCtrlListViewTypes.h>
36 #include <FUiCtrlScrollEventTypes.h>
37
38 #include "FUi_ControlImpl.h"
39 #include "FUi_UiTouchEvent.h"
40 #include "FUiCtrl_FlickAnimation.h"
41 #include "FUiCtrl_IconListUtils.h"
42 #include "FUiCtrl_IconListViewItemEventArg.h"
43 #include "FUiCtrl_IScrollEventListener.h"
44
45 namespace Tizen { namespace Ui
46 {
47 class _AccessibilityElement;
48 }}
49
50 namespace Tizen { namespace Ui { namespace Controls
51 {
52
53 class _IconListItem;
54 class _IconListItemDrawingProperty;
55 class _IconListItemProviderAdaptor;
56 class _IconListView;
57 class _IListItemProviderAdaptor;
58 class _ListViewModel;
59
60 class _IconListPresenter
61         : public Tizen::Base::Object
62         , public Tizen::Base::Runtime::ITimerEventListener
63         , virtual public Tizen::Base::Runtime::IEventListener
64         , virtual public _IScrollEventListener
65 {
66 // Lifecycle
67 public:
68         virtual ~_IconListPresenter(void);
69
70         static _IconListPresenter* CreateInstanceN(_IconListView& pIconListView);
71
72 // Operations
73 public:
74         result Draw(void);
75
76 // Accessor
77 public:
78         result SetItemProvider(const IIconListViewItemProvider& provider);
79
80         result RegisterItemProviderAdaptor(_IListItemProviderAdaptor* pItemProviderAdaptor);
81
82         result SetScrollDirection(IconListViewScrollDirection scrollDirection);
83
84         result SetTopMargin(int value);
85
86         int GetTopMargin(void) const;
87
88         result SetBottomMargin(int value);
89
90         int GetBottomMargin(void) const;
91
92         result SetLeftMargin(int value);
93
94         int GetLeftMargin(void) const;
95
96         result SetRightMargin(int value);
97
98         int GetRightMargin(void) const;
99
100         result SetItemSpacing(int horizontalSpacing, int verticalSpacing);
101
102         int GetItemHorizontalSpacing(void) const;
103
104         int GetItemVerticalSpacing(void) const;
105
106         void SetUseCheckedStyle(bool checkedStyle);
107
108         result SetItemChecked(int index, bool check);
109
110         bool IsItemChecked(int index) const;
111
112         int GetItemIndexFromPosition(int x, int y) const;
113
114         int GetItemIndexFromPosition(const Tizen::Graphics::Point& position) const;
115
116         result SetTextHorizontalAlignment(HorizontalAlignment alignment);
117
118         result SetTextVerticalAlignment(IconListViewItemTextVerticalAlignment alignment);
119
120         HorizontalAlignment GetTextHorizontalAlignment(void) const;
121
122         IconListViewItemTextVerticalAlignment GetTextVerticalAlignment(void) const;
123
124         result SetItemTextColor(IconListViewItemDrawingStatus status, const Tizen::Graphics::Color& color);
125
126         const Tizen::Graphics::Color GetItemTextColor(IconListViewItemDrawingStatus status) const;
127
128         result SetItemTextSize(int size);
129
130         int GetItemTextSize(void) const;
131
132         result SetCheckBoxPosition(IconListViewCheckBoxPosition position);
133
134         IconListViewCheckBoxPosition GetCheckBoxPosition(void) const;
135
136         result SetTouchAnimationEnabled(bool enable);
137
138         bool IsTouchAnimationEnabled(void) const;
139
140         result ScrollToItem(int index);
141
142         result ScrollByPixel(int pixel);
143
144         result RefreshList(int index, ListRefreshType type);
145
146         result UpdateList(void);
147
148         result SetItemBitmapBounds(const Tizen::Graphics::Rectangle& bounds);
149
150         const Tizen::Graphics::Rectangle GetItemBitmapBounds(void) const;
151
152         result GetItemBitmapSize(int& width, int& height) const;
153
154         const Tizen::Graphics::Dimension GetItemBitmapSize(void) const;
155
156         result SetItemSize(const Tizen::Graphics::Dimension& size);
157
158         result GetItemSize(int& width, int& height) const;
159
160         const Tizen::Graphics::Dimension GetItemSize(void) const;
161
162         result SetMagneticScrollSize(int scrollSize);
163
164         int GetMagneticScrollSize(void) const;
165
166         void SetItemCountPerAxis(int itemCountPerAxis);
167
168         int GetItemCountPerAxis(void) const;
169
170         result SetItemLayoutHorizontalAlignment(HorizontalAlignment alignment);
171
172         result SetItemLayoutVerticalAlignment(VerticalAlignment alignment);
173
174         HorizontalAlignment GetItemLayoutHorizontalAlignment(void) const;
175
176         VerticalAlignment GetItemLayoutVerticalAlignment(void) const;
177
178         result SetItemBorderStyle(IconListViewItemBorderStyle borderStyle);
179
180         IconListViewItemBorderStyle GetItemBorderStyle(void) const;
181
182         _IconListItemDrawingProperty* GetItemDrawingProperty(void) const;
183
184         void ClearVisualElement(void);
185
186         result SetNonSlidableList(void);
187
188         result AddItem(_IconListItem* pItem);
189
190         result InsertItemAt(int index, _IconListItem* pItem);
191
192         result SetItemAt(int index, _IconListItem* pItem);
193
194         result RemoveItemAt(int index);
195
196         result RemoveAllItems(void);
197
198         void SetItemBitmapAsAspectRatio(bool isAspect);
199
200         bool IsItemBitmapAsAspectRatio(void) const;
201
202         result SetReorderModeEnabled(bool enable);
203
204         void ScrollFadeOut(bool showEffect = false);
205
206 // Inquiry
207 public:
208         // Tizen::Ui::_Control
209         virtual void OnBoundsChanged(void);
210         virtual void OnFontInfoRequested(unsigned long& style, int& size);
211         virtual void OnFontChanged(Tizen::Graphics::Font* pFont);
212
213         // Tizen::Ui::_IKeyEventPreviewer
214         virtual bool OnPreviewKeyPressed(const _Control& source, const _KeyInfo& keyInfo);
215         virtual bool OnPreviewKeyReleased(const _Control& source, const _KeyInfo& keyInfo);
216
217         // Tizen::Ui::_IKeyEventListener
218         virtual bool OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo);
219         virtual bool OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo);
220
221         // Tizen::Ui::_INotificationEventPreviewer
222         virtual bool OnPreviewNotifiedN(const _Control& source, Tizen::Base::Collection::IList* pArgs);
223
224         // Tizen::Ui::_INotificationEventListener
225         virtual bool OnNotifiedN(const _Control& source, Tizen::Base::Collection::IList* pArgs);
226
227         // Tizen::Ui::_ITouchEventPreviewer
228         virtual _UiTouchEventDelivery OnPreviewTouchReleased(const _Control& source, const _TouchInfo& touchinfo);
229
230         // Tizen::Ui::_ITouchEventListener
231         virtual bool OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo);
232         virtual bool OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo);
233         virtual bool OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo);
234         virtual bool OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo);
235
236         // GestureListener Callback API
237         bool OnFlickGestureDetected(bool isFlicked, const Tizen::Graphics::Point& flickPosition, int flickTime);
238         bool OnLongPressGestureDetected(void);
239
240         // Tizen::Base::Runtime::ITimerEventListener
241         virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer);
242
243         void OnVisibleStateChanged(void);
244
245         // Tizen::Ui::_IScrollEventListener
246         virtual void OnScrollEndReached(Tizen::Ui::_Control& source, ScrollEndEvent type);
247         virtual void OnScrollPositionChanged(Tizen::Ui::_Control& source, int scrollPos);
248         virtual void OnScrollStopped(Tizen::Ui::_Control& source);
249
250         // Osp::Ui::Animations::IAnimationTransactionEventListener
251         virtual void OnAnimationTransactionStarted(int transactionId);
252         virtual void OnAnimationTransactionStopped(int transactionId);
253         virtual void OnAnimationTransactionFinished(int transactionId);
254
255 protected:
256         result Dispose(void);
257         result Initialize(void);
258         result InitializeFont(void);
259
260 protected:
261         result DrawEmptyList(void);
262         result DrawHorizontalScrollList(void);
263         result DrawVerticalScrollList(void);
264
265         void AdjustLayout(void);
266         void UpdateDrawnIndex(void);
267
268         void HideItems(int startIndex, int endIndex);
269
270         result RedrawItem(int index, float ratio = 1.0f, bool doShow = true, float checkRatio = 1.0f);
271
272         result FireIconListViewItemEvent(_IconListViewItemEventType eventType, int index, int arg);
273         result FireScrollEndReachedEvent(ScrollEndEvent type);
274         result FireScrollPositionChangedEvent(int scrollPosition);
275         result FireScrollStoppedEvent();
276         result FireScrollEvent();
277
278         bool SetScrollPosition(int position, bool enableFadeEffect = true);
279
280         int GetMagneticScrollPosition(void) const;
281
282         void TranslateIconListItemPosition(int& x, int& y);
283
284         Tizen::Graphics::Rectangle GetItemBounds(int index) const;
285
286         // visual interaction animation
287         void AddAnimation(_IconListItem& item, int index, int delay = 0);
288         void RemoveAnimation(_IconListItem& item, int index);
289         void MoveAnimation(_IconListItem& item, Tizen::Graphics::FloatRectangle& bounds, int delay = 0);
290         void MoveAnimation(_IconListItem& item, Tizen::Graphics::FloatRectangle& bounds, int delay, bool fadeIn);
291         void MoveAnimation(_IconListItem& item, Tizen::Graphics::FloatRectangle& startBounds, Tizen::Graphics::FloatRectangle& endBounds, int delay = 0);
292         void RemoveAllAnimation(_IconListItem& item);
293
294         void MoveForward(int index);
295         void MoveBackward(int index);
296         bool IsAnimationRunning(int transactionId);
297
298         void InitializeAccessibilityElement(void);
299         void AddAccessibilityElement(_IconListItem& item, const Tizen::Graphics::Rectangle& rect);
300         void RemoveAllAccessibilityElements(void);
301
302 private:
303         _IconListPresenter(_IconListView* pIconListView, _ListViewModel* pListModel);
304         _IconListPresenter(const _IconListPresenter& rhs);
305         _IconListPresenter& operator =(const _IconListPresenter& rhs);
306
307         virtual bool OnTouchActionActivated(const _Control& source, const _TouchInfo& touchinfo);
308
309 private:
310         void ProcessAfterTouchRelease(int index);
311         void FireEventAfterTouchRelease(int index);
312
313         void PrepareReordering(void);
314         void DoReordering(const Tizen::Graphics::Point& movedPosition);
315         void CheckAndReorderItem(int movedX, int movedY);
316         void SwapReorderedItems(int toIndex, bool singleItemChanged);
317         void FinishReordering(void);
318         void ClearReorderingInformation(void);
319
320         result StartSelectionAnimationTimer(void);
321         result ResetSelectionAnimationTimer(void);
322
323         result StartCheckAnimationTimer(void);
324         result ResetCheckAnimationTimer(void);
325
326         result StartTouchActionTimer(void);
327         result ResetTouchActionTimer(void);
328
329         result StartFlickAnimationTimer(void);
330         result ResetFlickAnimationTimer(void);
331         void StartFlickAnimation(void);
332
333         result StartMagneticScrollTimer(void);
334         result ResetMagneticScrollTimer(void);
335
336         result StartReorderScrollTimer(void);
337         result ResetReorderScrollTimer(void);
338         void StartReorderScrollAnimation(void);
339
340         result StartAnimationTimer(int delay);
341         result ResetAnimationTimer(void);
342
343 // Attribute
344 private:
345         static const int DEFAULT_GROUP_INDEX = 0;
346         static const int INVALID_INDEX = -1;
347         static const int ITEM_CACHE_SIZE_MULTIPLIER = 5;
348         static const int MINIMUM_FLICK_EFFECT_TIME = 80;
349         static const int FLICK_ANIMATION_TIMER_PERIOD = 10;
350         static const int MAGNETIC_SCROLL_TIMER_PERIOD = 10;
351         static const int SELECTION_ANIMATION_TIMER_PERIOD = 30;
352         static const int TOUCH_ACTION_TIMER_PERIOD = 100;
353         static const int REORDER_SCROLL_TIMER_PERIOD = 20;
354         static const int REORDER_SCROLL_ANIMATION_DISTANCE = 10;
355         static const int ITEM_ANIMATION_DURATION = 333;
356         static const int ITEM_ANIMATION_DELAY = 334;
357         static const int MOVE_ITEM_ANIMATION_DURATION = 500;
358         static const int MOVE_ITEM_ANIMATION_DELAY = 167;
359         static const int SCREEN_WIDTH = 480;
360         static const int SCREEN_HEIGHT = 800;
361         static const int NEEDED_FLICK_COUNT_FOR_FINGER_FASTSCROLL = 3;
362         static const int OVERSCROLLING_MAX_DISTANCE = 400;
363
364         _ListViewModel* __pListModel;
365         _IconListView* __pIconListView;
366         _IListItemProviderAdaptor* __pItemProviderAdaptor;
367         Tizen::Graphics::Color __backgroundColor;
368         Tizen::Ui::_TouchInfo __currentTouchInfo;
369         int __selectedOverlayBitmapId;
370         int __selectedIndex;
371         int __checkedIndex;
372         int __highlightedIndex;
373         int __firstDrawnIndex;
374         int __lastDrawnIndex;
375         IconListViewScrollDirection __scrollDirection;
376         int __topMargin;
377         int __bottomMargin;
378         int __leftMargin;
379         int __rightMargin;
380         int __horizontalSpacing;
381         int __verticalSpacing;
382         int __magneticScrollSize;
383         int __itemCountPerAxis;
384         HorizontalAlignment __itemHorizontalAlignment;
385         VerticalAlignment __itemVerticalAlignment;
386         int __scrollPosition;
387         int __unitScrollLength;
388         int __scrollLength;
389         int __unitLengthOfAxis;
390         int __startPosOfAxis;
391         int __endPosOfAxis;
392         _IconListItemDrawingProperty* __pItemDrawingProperty;
393         Tizen::Base::Runtime::Timer* __pSelectionAnimationTimer;
394         Tizen::Base::Runtime::Timer* __pCheckAnimationTimer;
395         Tizen::Base::Runtime::Timer* __pTouchActionTimer;
396         Tizen::Base::Runtime::Timer* __pFlickAnimationTimer;
397         Tizen::Base::Runtime::Timer* __pMagneticScrollTimer;
398         Tizen::Base::Runtime::Timer* __pAnimationTimer;
399         _FlickAnimation __flickAnimation;
400         _IconListUtils::TouchAnimation __touchAnimation;
401         _IconListUtils::MagneticScrollAnimation __magneticScrollAnimation;
402         _IconListUtils::CheckAnimation __checkAnimation;
403         bool __isTouchAnimationEnabled;
404         bool __previousTouchAnimatinEnabled;
405         bool __isLayoutChanged;
406         bool __isTouchPressed;
407         bool __onDrawing;
408         bool __requireNextDrawing;
409         bool __alreadyDrawn;
410         bool __enableCustomItemProviderAdaptor;
411         bool __listStatusChanged;
412         bool __needBaseCanvas;
413         bool __isSelectionDelayed;
414
415         Tizen::Ui::Animations::_VisualElement* __pRemoveItemVE;
416         Tizen::Ui::Animations::_VisualElement* __pEmptyListVE;
417         Tizen::Ui::Animations::_VisualElement* __pVE;
418
419         // reorder
420         bool __onReordering;
421         int __reorderFromIndex;
422         int __reorderToIndex;
423         Tizen::Graphics::Point __lastReorderedPosition;
424         Tizen::Graphics::Point __lastReorderedDifferences;
425         Tizen::Graphics::FloatRectangle __reorderItemBounds;
426         Tizen::Base::Runtime::Timer* __pReorderScrollTimer;
427         int __reorderScrollAnimationDistance;
428         int __scrollPositionBeforeScrollAnimation;
429
430         int __flickCount;
431         bool __isFlickDown;
432
433         int __animationItemIndex;
434         int __addTransactionId;
435         int __removeTransactionId;
436         int __moveTransactionId;
437
438 }; // _IconListPresenter
439
440 }}} // Tizen::Ui::Controls
441
442 #endif // _FUI_CTRL_INTERNAL_ICON_LIST_PRESENTER_H_