2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0/
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_ListViewModel.h"
33 #include "FUiCtrl_ScrollPanelPresenter.h"
35 namespace Tizen { namespace Ui { namespace Animations
40 namespace Tizen { namespace Ui { namespace Controls
45 TABLE_VIEW_ITEM_ALIGNMENT_TOP = 0,
46 TABLE_VIEW_ITEM_ALIGNMENT_BOTTOM
49 enum ItemTouchReleasedEventState
51 TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_NORMAL = 0,
52 TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_FIRE,
53 TABLE_VIEW_ITEM_TOUCH_RELEASED_EVENT_UPDATE_TABLE_VIEW
56 struct _TableViewReorderInfo
62 float touchPressedPositionY;
63 float itemBasisPositionY;
64 int isScrollDirectionUp;
65 float nonScrollableLimitArea;
66 bool blockedTouchReleaseState;
68 long long touchPressedTick;
69 Tizen::Graphics::FloatRectangle itemBounds;
72 _TableViewReorderInfo(void)
75 , originGroupIndex(-1)
77 , touchPressedPositionY(0.0f)
78 , itemBasisPositionY(0.0f)
79 , isScrollDirectionUp(false)
80 , nonScrollableLimitArea(0.0f)
81 , blockedTouchReleaseState(false)
82 , blockedScroll(false)
90 struct _TableViewSectionStringAlignment
92 HorizontalAlignment headerHorizontalAlignment;
93 HorizontalAlignment footerHorizontalAlignment;
95 _TableViewSectionStringAlignment(void)
96 : headerHorizontalAlignment(ALIGNMENT_LEFT)
97 , footerHorizontalAlignment(ALIGNMENT_RIGHT)
101 bool operator== (const _TableViewSectionStringAlignment& rhs) const;
102 bool operator!= (const _TableViewSectionStringAlignment& rhs) const;
107 class _ListViewModel;
108 class _TableViewItemProviderAdaptor;
110 class _TableViewPresenter
111 : public _ScrollPanelPresenter
112 , public _IListViewModelDelegate
113 , public Tizen::Ui::Animations::IVisualElementAnimationTickEventListener
114 , public Tizen::Ui::Animations::IVisualElementAnimationStatusEventListener
115 , virtual public Tizen::Base::Runtime::IEventListener
118 _TableViewPresenter();
119 virtual ~_TableViewPresenter(void);
121 virtual result Construct(_TableView* pTableView);
123 bool Initialize(_TableView* pTableView);
125 _TableView* GetView(void) const;
127 _ListViewModel* GetModel(void) const;
130 result SetItemProvider(const _TableViewItemProvider* pProvider);
132 void SetTableViewItemProviderAdaptor(_TableViewItemProviderAdaptor* pProviderAdaptor);
134 _TableViewItemProviderAdaptor* GetTableViewItemProviderAdaptor(void) const;
136 // event handler for window event
137 virtual void OnBoundsChanged(void);
138 virtual result Draw(void);
140 // Touch Event Previewer
141 virtual _UiTouchEventDelivery OnPreviewTouchPressed(const _Control& source, const _TouchInfo& touchInfo);
142 virtual _UiTouchEventDelivery OnPreviewTouchMoved(const _Control& source, const _TouchInfo& touchInfo);
143 virtual _UiTouchEventDelivery OnPreviewTouchReleased(const _Control& source, const _TouchInfo& touchInfo);
144 virtual _UiTouchEventDelivery OnPreviewTouchCanceled(const _Control& source, const _TouchInfo& touchInfo);
146 // Touch Event Listener
147 virtual bool OnTouchPressed(const _Control& source, const _TouchInfo& touchInfo);
148 virtual bool OnTouchMoved(const _Control& source, const _TouchInfo& touchInfo);
149 virtual bool OnTouchReleased(const _Control& source, const _TouchInfo& touchInfo);
150 virtual bool OnTouchCanceled(const _Control& source, const _TouchInfo& touchInfo);
152 // gestureListener Callback API
153 virtual bool OnFlickGestureDetected(_TouchFlickGestureDetector& gesture);
154 virtual bool OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture);
155 virtual bool OnPreviewFlickGestureDetected(_TouchFlickGestureDetector& gesture);
157 virtual void OnVisualElementAnimationStarted(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target);
158 virtual void OnVisualElementAnimationRepeated(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, long currentRepeatCount);
159 virtual void OnVisualElementAnimationFinished(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, bool completedNormally);
160 virtual void OnTickOccurred(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, const Tizen::Ui::Variant& currentValue);
163 virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer);
166 virtual bool OnAccessibilityItemRefreshed(const _AccessibilityContainer& control, const _AccessibilityElement& element, _AccessibilityFocusDirection direction);
168 // List model delegate
169 virtual bool OnOcurredOverflowItems(const int currentCashSize, const int overflowCount);
173 result RefreshTableView(int groupIndex, int itemIndex, TableViewRefreshType type, bool animation);
174 result RefreshAllItems(void);
175 result UpdateTableView(void);
177 result GetItemIndexFromPosition(const Tizen::Graphics::FloatPoint& position, int& groupIndex, int& itemIndex) const;
178 result GetItemFromPosition(const Tizen::Graphics::FloatPoint& position, TableViewItemTag& itemPos) const;
180 result GetTopDrawnItem(TableViewItemTag& itemPos) const;
181 result SetTopDrawnItem(TableViewItemTag& itemPos);
183 result GetBottomDrawnItem(TableViewItemTag& itemPos) const;
185 result GetTopDrawnItemIndex(int& groupIndex, int& itemIndex) const;
186 result SetTopDrawnItemIndex(int groupIndex, int itemIndex);
188 result GetBottomDrawnItemIndex(int& groupIndex, int& itemIndex) const;
189 result SetBottomDrawnItemIndex(int groupIndex, int itemIndex);
191 int GetGroupCount(void) const;
192 int GetItemCountAt(int groupIndex) const;
193 bool HasSectionHeader(int groupIndex) const;
194 bool HasSectionFooter(int groupIndex) const;
196 float GetTopMargin(void) const;
197 result SetTopMargin(float topMargin);
199 float GetBottomMargin(void) const;
200 result SetBottomMargin(float bottomMargin);
202 float GetLeftMargin(void) const;
203 result SetLeftMargin(float leftMargin);
205 bool IsItemChecked(int groupIndex, int itemIndex) const;
206 result SetItemChecked(int groupIndex, int itemIndex, bool checked);
208 bool IsItemEnabled(int groupIndex, int itemIndex) const;
209 result SetItemEnabled(int groupIndex, int itemIndex, bool enabled);
211 _TableViewItem* FindItem(TableViewItemTag& itemTag);
212 void UnloadItem(int groupIndex, int itemIndex);
213 _TableViewItem* LoadItem(int groupIndex, int itemIndex);
214 void RefreshItemLayout(int groupIndex, int itemIndex);
215 void GetFirstLoadedItemIndex(int& groupIndex, int& itemIndex) const;
216 void GetLastLoadedItemIndex(int& groupIndex, int& itemIndex) const;
218 result SetStatusChanged(bool changed);
219 bool IsStatusChanged(void) const;
221 result ExpandGroup(int groupIndex, bool withAnimation);
222 result CollapseGroup(int groupIndex, bool withAnimation);
223 bool IsGroupExpanded(int groupIndex) const;
225 result SetReorderMode(bool enabled);
227 bool CheckItemHeightAndRefreshLayout(TableViewItemTag itemTag, bool downScroll);
229 result ScrollByPixel(float scrollDistance);
230 void SetScrollEnabled(bool enable);
231 bool IsScrollEnabled(void) const;
233 bool GetFirstDrawnFlag(void) const;
234 int GetMaxItemCachingSize(void) const;
235 void ResetSweepItem(void);
236 void GetSweepItemIndex(int& groupIndex, int& itemIndex) const;
237 int GetPressedItemCount(void);
239 result OpenContextItem(int groupIndex, int itemIndex);
240 result CloseContextItem(int groupIndex, int itemIndex);
241 bool IsContextItemOpened(int groupIndex, int itemIndex) const;
243 result SetSectionHeaderTextHorizontalAlignment(int sectionIndex, HorizontalAlignment alignment);
244 HorizontalAlignment GetSectionHeaderTextHorizontalAlignment(int sectionIndex) const;
245 result SetSectionFooterTextHorizontalAlignment(int sectionIndex, HorizontalAlignment alignment);
246 HorizontalAlignment GetSectionFooterTextHorizontalAlignment(int sectionIndex) const;
248 void BlockAnimationCallback(bool blocked);
250 void FireItemTouchReleasedEventDuringPressing(int groupIndex, int itemIndex);
253 virtual float ScrollToInternal(float targetPosition);
254 virtual void FadeInScrollBar(void);
255 virtual void FadeOutScrollBar(void);
258 virtual void UpdateLayout(void);
261 _TableViewPresenter(const _TableViewPresenter& rhs);
262 _TableViewPresenter& operator =(const _TableViewPresenter& rhs);
264 _TableView* __pTableView;
265 _ListViewModel* __pListModel;
266 _TableViewItemProviderAdaptor* __pProviderAdaptor;
268 bool PreloadItem(void);
269 bool PreloadItem(int topDrawnGroupIndex, int topDrawnItemIndex, int shiftingDistance);
271 bool GetFirstItem(TableViewItemTag& firstItem) const;
272 bool GetLastItem(TableViewItemTag& lastItem) const;
273 bool GetPreviousItemPosition(const TableViewItemTag& currentItem, TableViewItemTag& prevItem) const;
274 bool GetNextItemPosition(const TableViewItemTag& currentItem, TableViewItemTag& nextItem) const;
275 int GetItemCount(void) const;
276 float GetHeightOfAllItems(void) const;
278 void SetItemLayout(_TableViewItem* pItem, TableViewItemTag& itemPos);
279 float CalculateItemPositionY(int groupIndex, int itemIndex);
280 void AdjustLayoutItems(float scrollPosition);
281 bool IsCachingItemsTotalHeightLessThanViewHeight(void);
283 void ResetItemLayout(TableViewItemTag& topDrawnItemTag, float shiftingDistance);
284 void RefreshItemLayout(TableViewItemTag& topDrawnItemTag, TableViewItemTag& refreshItemTag, TableViewRefreshType type, bool animation);
285 void RefreshItemBounds(_TableViewItem* pItem, TableViewItemTag& itemPos);
286 void ScrollToItem(int groupIndex, int itemIndex, TableViewScrollItemAlignment itemAlignment, float shiftingDistance = 0.0f);
289 _TableViewItem* GetTableViewItemFromControl(const _Control& source);
291 void UnloadItem(TableViewItemTag& itemTag);
292 void DetachItem(TableViewItemTag& itemTag);
293 void DetachContextItem(TableViewItemTag& itemTag);
294 void DetachAllItem(bool removeItem);
295 void SetItemDrawingProperty(void);
296 void SetItemType(_TableViewItem* pItem, TableViewItemTag itemPosition);
298 result StartFastScrollTimer(void);
299 void StopFastScrollTimer(void);
301 bool IsEmpty(void) const;
302 result DrawEmptyTableView(void);
304 void LoadItemWithScrollPosition(float previousScrollPosition, float currentScrollPos);
305 bool GetTableViewItemPosition(_TableViewItem& item, TableViewItemTag& itemTag); // item must exist between from tag and end tag
306 int LoadAllItemsInGroup(int groupIndex, bool downward);
307 void SetLoadedItemsVisibleInGroup(int groupIndex, bool visible);
308 TableViewItemTag LoadItemsToBeVisible(const TableViewItemTag& from);
309 void AttachNextItemsToBottom(const TableViewItemTag& anchor);
310 bool IsAnyItemInGroupLoaded(int groupIndex) const;
311 bool IsAnyItemInLoadedIndex(int groupIndex, int itemIndex);
312 void ScrollToHideNonClientArea(TableViewItemTag& bottomTag);
313 void AdjustClientAreaBounds(bool reset, float dist = 0.0f);
314 void SetClientAreaHeight(float height);
315 void UnloadInvisibleItems(void);
318 bool SelectReorderItem(int groupIndex, int itemIndex, bool directSelection);
319 bool ResetReorderItem(int groupIndex, int itemIndex);
320 bool DragSelectedItem(float distance, bool relativeCoordinate);
321 bool CheckReorderItemScrollAnimation(_TableViewItem *pItem);
322 bool CheckReorderItemPosition(_TableViewItem* pItem, TableViewItemTag& reorderItemTag);
323 void AdjustReorderItemLimitPositionY(float& positionY);
324 bool ReorderItem(int destinationGroupIndex, int destinationItemIndex);
325 void StartReorderScrollTimer(void);
326 void StopReorderScrollTimer(void);
329 float GetItemHeight(TableViewItemTag itemTag) const;
330 float SetItemHeight(TableViewItemTag itemTag, float height);
331 bool CreateItemHeightList(float defaultGroupItemHeight, float defaultItemHeight);
332 void DeleteItemHeightList(void);
333 void PresetItemHeightList(void);
334 bool RefreshItemHeightList(int groupIndex, int itemIndex, TableViewRefreshType refreshType);
336 bool CreateSectionAlignmentList(void);
337 void DeleteSectionAlignmentList(void);
338 bool RefreshSectionAlignmentList(int groupIndex, TableViewRefreshType refreshType);
340 void CaptureAndStartRemoveItemAnimation(int groupIndex, int itemIndex);
342 void ShowTableViewCapturedItem(int groupIndex, int itemIndex, float height);
343 void SetLoadedItemsVisibleFromPosition(float position, bool visible);
344 void MoveLoadedItemsFromPosition(float position);
345 void ExpandGroupAnimationFinished(bool completedNormally);
346 void CollapseGroupAnimationFinished(bool completedNormally);
349 void SweepItem(float x);
350 void ResetSweptItem(void);
351 void AdjustSweptItemPosition(bool withAnimation = false);
352 void AdjustLoadedItemWidth(void);
354 bool IsValidDrawnItem(int groupIndex, int itemIndex);
355 void StopAllItemAnimation(void);
357 bool GetAccessibilityElementFocusedState(void);
361 float __bottomMargin;
364 bool __modelInitialized;
365 bool __firstDrawnFlag;
366 bool __statusChangedFlag;
369 _ItemDrawingProperty* __pItemDrawingProperty;
371 Tizen::Ui::Animations::_VisualElement* __pBaseVisualElement;
374 Tizen::Graphics::FloatPoint __sweptItemPosition;
375 TableViewItemTag __sweptItemTag;
377 TableViewItemTag __reservedScrollItemIndex;
378 TableViewScrollItemAlignment __reservedScrollItemAlignment;
380 bool __firstTouchMoved;
382 Tizen::Base::Runtime::Timer* __pReorderScrollTimer;
384 _TableViewReorderInfo __reorderInfo;
386 Tizen::Base::Collection::ArrayListT<float> __itemHeightList;
387 Tizen::Base::Collection::ArrayListT<_TableViewSectionStringAlignment> __sectionAlignmentList;
388 float __itemTotalHeight;
390 TableViewItemTag __expandableItemTag;
391 Tizen::Ui::Animations::_VisualElement* __pCapturedItemVisualElement;
393 Tizen::Base::Runtime::Timer* __pFastScrollTimer;
394 bool __isFastScrollTimerEnabled;
396 float __scrollHeightOnFlickStarted;
397 float __scrollPositionOnFlickStarted;
399 bool __isAnimationCallbackBlocked;
400 bool __lockLoadItemWithScroll;
402 int __itemTouchReleasedEventState;
404 static const int TABLEVIEW_MAX_ITEM_COUNT = 30;
405 static const int REORDER_SCROLL_ANIMATION_TIMER_DURATION = 10;
406 static const float REORDER_SCROLL_ANIMATION_DISTANCE = 10.0f;
407 static const int REORDER_TOUCH_UIACTIVATE_DURATION = 100;
408 static const int FAST_SCROLL_FADE_OUT_DURATION = 500;
409 static const float TABLEVIEW_DEFAULT_ITEM_HEIGHT_VALUE = 12.3456f;
412 static const int REORDER_ITEM_MOVE_ANIMATION_DURATION = 113;
413 static const int ADD_ITEM_ANIMATION_DURATION = 333;
414 static const int REMOVE_ITEM_MOVE_ANIMATION_DURATION = 267;
415 static const int REFRESH_ITEM_ANIMATION_DELAY = 100;
416 static const int EXPAND_GROUP_ANIMATION_DURATION = 335;
417 static const int COLLAPSE_GROUP_ANIMATION_DURATION = 329;
418 static const int SWEEP_ITEM_ANIMATION_DURATION = 300;
421 }}} // Tizen::Ui::Controls
423 #endif // _FUI_CTRL_INTERNAL_TABLE_VIEW_PRESENTER_H_