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 struct _TableViewReorderInfo
54 float touchPressedPositionY;
55 float itemBasisPositionY;
56 int isScrollDirectionUp;
57 float nonScrollableLimitArea;
58 bool blockedTouchReleaseState;
60 long long touchPressedTick;
61 Tizen::Graphics::FloatRectangle itemBounds;
64 _TableViewReorderInfo(void)
67 , originGroupIndex(-1)
69 , touchPressedPositionY(0.0f)
70 , itemBasisPositionY(0.0f)
71 , isScrollDirectionUp(false)
72 , nonScrollableLimitArea(0.0f)
73 , blockedTouchReleaseState(false)
74 , blockedScroll(false)
82 struct _TableViewSectionStringAlignment
84 HorizontalAlignment headerHorizontalAlignment;
85 HorizontalAlignment footerHorizontalAlignment;
87 _TableViewSectionStringAlignment(void)
88 : headerHorizontalAlignment(ALIGNMENT_LEFT)
89 , footerHorizontalAlignment(ALIGNMENT_RIGHT)
93 bool operator== (const _TableViewSectionStringAlignment& rhs) const;
94 bool operator!= (const _TableViewSectionStringAlignment& rhs) const;
100 class _TableViewItemProviderAdaptor;
102 class _TableViewPresenter
103 : public _ScrollPanelPresenter
104 , public Tizen::Ui::Animations::IVisualElementAnimationTickEventListener
105 , public Tizen::Ui::Animations::IVisualElementAnimationStatusEventListener
106 , virtual public Tizen::Base::Runtime::IEventListener
109 _TableViewPresenter();
110 virtual ~_TableViewPresenter(void);
112 virtual result Construct(_TableView* pTableView);
114 bool Initialize(_TableView* pTableView);
116 _TableView* GetView(void) const;
118 _ListViewModel* GetModel(void) const;
121 result SetItemProvider(const _TableViewItemProvider* pProvider);
123 void SetTableViewItemProviderAdaptor(_TableViewItemProviderAdaptor* pProviderAdaptor);
125 _TableViewItemProviderAdaptor* GetTableViewItemProviderAdaptor(void) const;
127 // event handler for window event
128 virtual void OnBoundsChanged(void);
129 virtual result Draw(void);
131 // Touch Event Previewer
132 virtual _UiTouchEventDelivery OnPreviewTouchPressed(const _Control& source, const _TouchInfo& touchInfo);
133 virtual _UiTouchEventDelivery OnPreviewTouchMoved(const _Control& source, const _TouchInfo& touchInfo);
134 virtual _UiTouchEventDelivery OnPreviewTouchReleased(const _Control& source, const _TouchInfo& touchInfo);
135 virtual _UiTouchEventDelivery OnPreviewTouchCanceled(const _Control& source, const _TouchInfo& touchInfo);
137 // Touch Event Listener
138 virtual bool OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo);
139 virtual bool OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo);
140 virtual bool OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo);
141 virtual bool OnTouchCanceled(const _Control& source, const _TouchInfo& touchInfo);
143 // gestureListener Callback API
144 virtual bool OnFlickGestureDetected(_TouchFlickGestureDetector& gesture);
145 virtual bool OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture);
146 virtual bool OnPreviewFlickGestureDetected(_TouchFlickGestureDetector& gesture);
148 virtual void OnVisualElementAnimationStarted(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target);
149 virtual void OnVisualElementAnimationRepeated(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, long currentRepeatCount);
150 virtual void OnVisualElementAnimationFinished(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, bool completedNormally);
151 virtual void OnTickOccurred(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, const Tizen::Ui::Variant& currentValue);
154 virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer);
157 virtual bool OnAccessibilityItemRefreshed(const _AccessibilityContainer& control, const _AccessibilityElement& element, _AccessibilityFocusDirection direction);
161 result RefreshTableView(int groupIndex, int itemIndex, TableViewRefreshType type, bool animation);
162 result RefreshAllItems(void);
163 result UpdateTableView(void);
165 result GetItemIndexFromPosition(const Tizen::Graphics::FloatPoint& position, int& groupIndex, int& itemIndex) const;
166 result GetItemFromPosition(const Tizen::Graphics::FloatPoint& position, TableViewItemTag& itemPos) const;
168 result GetTopDrawnItem(TableViewItemTag& itemPos) const;
169 result SetTopDrawnItem(TableViewItemTag& itemPos);
171 result GetBottomDrawnItem(TableViewItemTag& itemPos) const;
173 result GetTopDrawnItemIndex(int& groupIndex, int& itemIndex) const;
174 result SetTopDrawnItemIndex(int groupIndex, int itemIndex);
176 result GetBottomDrawnItemIndex(int& groupIndex, int& itemIndex) const;
177 result SetBottomDrawnItemIndex(int groupIndex, int itemIndex);
179 int GetGroupCount(void) const;
180 int GetItemCountAt(int groupIndex) const;
181 bool HasSectionHeader(int groupIndex) const;
182 bool HasSectionFooter(int groupIndex) const;
184 float GetTopMargin(void) const;
185 result SetTopMargin(float topMargin);
187 float GetBottomMargin(void) const;
188 result SetBottomMargin(float bottomMargin);
190 float GetLeftMargin(void) const;
191 result SetLeftMargin(float leftMargin);
193 bool IsItemChecked(int groupIndex, int itemIndex) const;
194 result SetItemChecked(int groupIndex, int itemIndex, bool checked);
196 bool IsItemEnabled(int groupIndex, int itemIndex) const;
197 result SetItemEnabled(int groupIndex, int itemIndex, bool enabled);
199 _TableViewItem* FindItem(TableViewItemTag& itemTag);
200 void UnloadItem(int groupIndex, int itemIndex);
201 _TableViewItem* LoadItem(int groupIndex, int itemIndex);
202 void RefreshItemLayout(int groupIndex, int itemIndex);
203 void GetFirstLoadedItemIndex(int& groupIndex, int& itemIndex) const;
204 void GetLastLoadedItemIndex(int& groupIndex, int& itemIndex) const;
206 result SetStatusChanged(bool changed);
207 bool IsStatusChanged(void) const;
209 result ExpandGroup(int groupIndex, bool withAnimation);
210 result CollapseGroup(int groupIndex, bool withAnimation);
211 bool IsGroupExpanded(int groupIndex) const;
213 result SetReorderMode(bool enabled);
215 bool CheckItemHeightAndRefreshLayout(TableViewItemTag itemTag, bool downScroll);
217 result ScrollByPixel(float scrollDistance);
218 void SetScrollEnabled(bool enable);
219 bool IsScrollEnabled(void) const;
221 bool GetFirstDrawnFlag(void) const;
222 int GetMaxItemCachingSize(void) const;
223 void ResetSweepItem(void);
224 void GetSweepItemIndex(int& groupIndex, int& itemIndex) const;
225 int GetPressedItemCount(void);
227 result OpenContextItem(int groupIndex, int itemIndex);
228 result CloseContextItem(int groupIndex, int itemIndex);
229 bool IsContextItemOpened(int groupIndex, int itemIndex) const;
231 result SetSectionHeaderTextHorizontalAlignment(int sectionIndex, HorizontalAlignment alignment);
232 HorizontalAlignment GetSectionHeaderTextHorizontalAlignment(int sectionIndex) const;
233 result SetSectionFooterTextHorizontalAlignment(int sectionIndex, HorizontalAlignment alignment);
234 HorizontalAlignment GetSectionFooterTextHorizontalAlignment(int sectionIndex) const;
236 void BlockAnimationCallback(bool blocked);
239 virtual float ScrollToInternal(float targetPosition);
240 virtual void FadeInScrollBar(void);
241 virtual void FadeOutScrollBar(void);
244 virtual void UpdateLayout(void);
247 _TableViewPresenter(const _TableViewPresenter& rhs);
248 _TableViewPresenter& operator =(const _TableViewPresenter& rhs);
250 _TableView* __pTableView;
251 _ListViewModel* __pListModel;
252 _TableViewItemProviderAdaptor* __pProviderAdaptor;
254 bool PreloadItem(void);
255 bool PreloadItem(int topDrawnGroupIndex, int topDrawnItemIndex, int shiftingDistance);
257 bool GetFirstItem(TableViewItemTag& firstItem) const;
258 bool GetLastItem(TableViewItemTag& lastItem) const;
259 bool GetPreviousItemPosition(const TableViewItemTag& currentItem, TableViewItemTag& prevItem) const;
260 bool GetNextItemPosition(const TableViewItemTag& currentItem, TableViewItemTag& nextItem) const;
261 int GetItemCount(void) const;
262 float GetHeightOfAllItems(void) const;
264 void SetItemLayout(_TableViewItem* pItem, TableViewItemTag& itemPos);
265 float CalculateItemPositionY(int groupIndex, int itemIndex);
266 void AdjustLayoutItems(float scrollPosition);
267 void ResetItemLayout(TableViewItemTag& topDrawnItemTag);
268 void RefreshItemLayout(TableViewItemTag& topDrawnItemTag, TableViewItemTag& refreshItemTag, TableViewRefreshType type, bool animation);
269 void RefreshItemBounds(_TableViewItem* pItem, TableViewItemTag& itemPos);
270 void ScrollToItem(int groupIndex, int itemIndex, TableViewScrollItemAlignment itemAlignment, float shiftingDistance = 0.0f);
273 _TableViewItem* GetTableViewItemFromControl(const _Control& source);
275 void UnloadItem(TableViewItemTag& itemTag);
276 void DetachItem(TableViewItemTag& itemTag);
277 void DetachContextItem(TableViewItemTag& itemTag);
278 void DetachAllItem(bool removeItem);
279 void SetItemDrawingProperty(void);
280 void SetItemType(_TableViewItem* pItem, TableViewItemTag itemPosition);
282 result StartFastScrollTimer(void);
283 void StopFastScrollTimer(void);
285 bool IsEmpty(void) const;
286 result DrawEmptyTableView(void);
288 void LoadItemWithScrollPosition(float previousScrollPosition, float currentScrollPos);
291 bool GetTableViewItemPosition(_TableViewItem& item, TableViewItemTag& itemTag); // item must exist between from tag and end tag
293 int LoadAllItemsInGroup(int groupIndex, bool downward);
294 void SetLoadedItemsVisibleInGroup(int groupIndex, bool visible);
295 TableViewItemTag LoadItemsToBeVisible(const TableViewItemTag& from);
296 void AttachNextItemsToBottom(const TableViewItemTag& anchor);
297 bool IsAnyItemInGroupLoaded(int groupIndex) const;
298 bool IsAnyItemInLoadedIndex(int groupIndex, int itemIndex);
299 void ScrollToHideNonClientArea(TableViewItemTag& bottomTag);
300 void AdjustClientAreaBounds(bool reset, float dist = 0.0f);
301 void SetClientAreaHeight(float height);
302 void UnloadInvisibleItems(void);
305 bool SelectReorderItem(int groupIndex, int itemIndex);
306 bool ResetReorderItem(int groupIndex, int itemIndex);
307 bool DragSelectedItem(float distance, bool relativeCoordinate);
308 bool CheckReorderItemScrollAnimation(_TableViewItem *pItem);
309 bool CheckReorderItemPosition(_TableViewItem* pItem, TableViewItemTag& reorderItemTag);
310 void AdjustReorderItemLimitPositionY(float& positionY);
311 bool ReorderItem(int destinationGroupIndex, int destinationItemIndex);
312 void StartReorderScrollTimer(void);
313 void StopReorderScrollTimer(void);
316 float GetItemHeight(TableViewItemTag itemTag) const;
317 float SetItemHeight(TableViewItemTag itemTag, float height);
318 bool CreateItemHeightList(void);
319 void DeleteItemHeightList(void);
320 void PresetItemHeightList(void);
321 bool RefreshItemHeightList(int groupIndex, int itemIndex, TableViewRefreshType refreshType);
323 bool CreateSectionAlignmentList(void);
324 void DeleteSectionAlignmentList(void);
325 bool RefreshSectionAlignmentList(int groupIndex, TableViewRefreshType refreshType);
327 void CaptureAndStartRemoveItemAnimation(int groupIndex, int itemIndex);
329 void SetLoadedItemsVisibleFromPosition(float position, bool visible);
330 void MoveLoadedItemsFromPosition(float position);
332 void SweepItem(float x);
333 void ResetSweptItem(void);
334 void AdjustSweptItemPosition(bool withAnimation = false);
335 void AdjustLoadedItemWidth(void);
337 bool IsValidDrawnItem(int groupIndex, int itemIndex);
338 void StopAllItemAnimation(void);
340 bool GetAccessibilityElementFocusedState(void);
344 float __bottomMargin;
347 bool __modelInitialized;
348 bool __firstDrawnFlag;
349 bool __statusChangedFlag;
352 _ItemDrawingProperty* __pItemDrawingProperty;
354 Tizen::Ui::Animations::_VisualElement* __pBaseVisualElement;
357 Tizen::Graphics::FloatPoint __sweptItemPosition;
358 TableViewItemTag __sweptItemTag;
360 TableViewItemTag __reservedScrollItemIndex;
361 TableViewScrollItemAlignment __reservedScrollItemAlignment;
363 bool __firstTouchMoved;
365 Tizen::Base::Runtime::Timer* __pReorderScrollTimer;
367 _TableViewReorderInfo __reorderInfo;
369 Tizen::Base::Collection::ArrayListT<float> __itemHeightList;
370 Tizen::Base::Collection::ArrayListT<_TableViewSectionStringAlignment> __sectionAlignmentList;
371 float __itemTotalHeight;
373 TableViewItemTag __expandableItemTag;
375 Tizen::Base::Runtime::Timer* __pFastScrollTimer;
376 bool __isFastScrollTimerEnabled;
378 float __scrollHeightOnFlickStarted;
379 float __scrollPositionOnFlickStarted;
381 bool __isAnimationCallbackBlocked;
383 static const int TABLEVIEW_MAX_ITEM_COUNT = 30;
384 static const int REORDER_SCROLL_ANIMATION_TIMER_DURATION = 10;
385 static const float REORDER_SCROLL_ANIMATION_DISTANCE = 10.0f;
386 static const int REORDER_TOUCH_UIACTIVATE_DURATION = 100;
387 static const int FAST_SCROLL_FADE_OUT_DURATION = 500;
390 static const int REORDER_ITEM_MOVE_ANIMATION_DURATION = 113;
391 static const int ADD_ITEM_ANIMATION_DURATION = 333;
392 static const int REMOVE_ITEM_MOVE_ANIMATION_DURATION = 267;
393 static const int REFRESH_ITEM_ANIMATION_DELAY = 100;
394 static const int EXPAND_GROUP_ANIMATION_DURATION = 335;
395 static const int COLLAPSE_GROUP_ANIMATION_DURATION = 329;
396 static const int SWEEP_ITEM_ANIMATION_DURATION = 300;
399 }}} // Tizen::Ui::Controls
401 #endif // _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_