f29085cb523b55ba357fa6dd29b238b5896d2131
[platform/framework/native/uifw.git] / src / ui / inc / FUiCtrl_TableViewItem.h
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0/
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_TableViewItem.h
20  * @brief       This is the header file for the _TableViewItem class.
21  *
22  * This header file contains the declarations of the _TableViewItem class.
23  */
24
25
26 #ifndef _FUI_CTRL_INTERNAL_TABLE_VIEW_ITEM_H_
27 #define _FUI_CTRL_INTERNAL_TABLE_VIEW_ITEM_H_
28
29 #include <FUiCtrlTableViewTypes.h>
30 #include <FUiAnimIVisualElementAnimationStatusEventListener.h>
31 #include <FUiAnimIVisualElementAnimationTickEventListener.h>
32 #include <FBaseColArrayList.h>
33 #include <FBaseRtITimerEventListener.h>
34 #include "FUi_Control.h"
35 #include "FUi_IAccessibilityListener.h"
36 #include "FUiCtrl_IListItemCommon.h"
37 #include "FUiCtrl_Label.h"
38
39 namespace Tizen { namespace Ui
40 {
41 class _TouchLongPressGestureDetector;
42 }}
43
44 namespace Tizen { namespace Ui { namespace Controls
45 {
46
47 enum TableViewItemSelectionStyle
48 {
49    TABLE_VIEW_ITEM_SELECTION_STYLE_NONE = 0,
50    TABLE_VIEW_ITEM_SELECTION_STYLE_WHOLE
51 };
52
53 enum TableViewItemType
54 {
55         TABLE_VIEW_ITEM_TYPE_TOP,
56         TABLE_VIEW_ITEM_TYPE_MIDDLE,
57         TABLE_VIEW_ITEM_TYPE_BOTTOM,
58         TABLE_VIEW_ITEM_TYPE_ONE,
59         TABLE_VIEW_ITEM_TYPE_TITLE,
60         TABLE_VIEW_ITEM_TYPE_HEADER,
61         TABLE_VIEW_ITEM_TYPE_FOOTER,
62         TABLE_VIEW_ITEM_TYPE_NONE
63 };
64
65 enum TableViewGroupItemDrawingStatus
66 {
67         TABLE_VIEW_GROUPITEM_DRAWING_STATUS_NORMAL = 3,
68         TABLE_VIEW_GROUPITEM_DRAWING_STATUS_PRESSED
69 };
70
71 enum TableViewSimpleItemDrawingStatus
72 {
73         TABLE_VIEW_SIMPLEITEM_DRAWING_STATUS_DISABLED = 5,
74 };
75
76 enum TableViewItemPressedControl
77 {
78    TABLE_VIEW_ITEM_PRESSED_NONE = 0,
79    TABLE_VIEW_ITEM_PRESSED_ITEM,
80    TABLE_VIEW_ITEM_PRESSED_ANNEX,
81    TABLE_VIEW_ITEM_PRESSED_INDIVIDUAL
82 };
83
84 struct _ItemDrawingProperty
85 {
86         bool itemDividerEnabled;
87         Tizen::Graphics::Color dividerColor;
88         bool sectionStyleEnabled;
89         Tizen::Graphics::Color sectionStyleBgColor;
90         bool groupedLookEnabled;
91         bool reorderMode;
92         float leftMargin;
93         float scrollMargin;
94         float width;
95         bool propertyChanged;
96 };
97
98 // TableViewItemControl
99 class _TableViewItemControl
100         : public Tizen::Ui::_Control
101 {
102 public:
103         virtual ~_TableViewItemControl(void);
104         virtual void OnDraw(void);
105         virtual Tizen::Ui::Animations::HitTestResult HitTest(const Tizen::Graphics::FloatPoint& point);
106
107 public:
108         static _TableViewItemControl* CreateTableViewItemControlN(void);
109         result SetBackgroundBitmap(const Tizen::Graphics::Bitmap& bitmap);
110         Tizen::Graphics::Bitmap* GetBackgroundBitmap(void) const;
111
112 private:
113         Tizen::Graphics::Bitmap* __pBackgroundBitmap;
114
115 private:
116         _TableViewItemControl(void);
117         _TableViewItemControl(const _TableViewItemControl& rhs);
118         _TableViewItemControl& operator =(const _TableViewItemControl rhs);
119 };
120
121
122 class _OSP_EXPORT_ _TableViewItem
123         : public Tizen::Ui::_Control
124         , public _IListItemCommon
125         , public _IAccessibilityListener
126         , public Tizen::Base::Runtime::ITimerEventListener
127         , public Tizen::Ui::Animations::IVisualElementAnimationTickEventListener
128         , public Tizen::Ui::Animations::IVisualElementAnimationStatusEventListener
129         , virtual public Tizen::Base::Runtime::IEventListener
130         , virtual public Tizen::Ui::_IUiEventListener
131         , virtual public Tizen::Ui::_IUiEventPreviewer
132 {
133
134 public:
135         virtual ~_TableViewItem();
136
137         static _TableViewItem* CreateTableViewItemN(float itemHeight);
138
139         virtual bool DrawItem(Tizen::Graphics::FloatRectangle& rcItem, ListItemState isFocused, bool itemDivider = false);
140
141         virtual float GetItemHeight(void) const;
142         virtual void SetItemHeight(int itemHeight);     // +++ check floating
143         virtual void SetItemHeight(float itemHeight);
144
145         virtual void SetChecked(bool checked);
146         virtual bool IsChecked(void) const;
147         virtual void SetCheckedAnimationEnabled(bool enabled);
148
149         virtual void SetItemEnabled(bool enabled);
150         virtual bool IsItemEnabled(void) const;
151
152         void SetItemType(const TableViewItemType itemType);
153         TableViewItemType GetItemType(void) const;
154
155         virtual bool IsReorderMode(void) const;
156         virtual void SetReorderMode(bool enabled);
157
158         virtual void SetItemChanged(bool changed);
159         virtual bool IsItemChanged(void) const;
160
161         virtual void SetItemIndex(int groupIndex, int itemIndex);
162         virtual void GetItemIndex(int& groupIndex, int& itemIndex) const;
163
164         _TableViewItem* GetContextItem(void) const;
165         void SetContextItem(_TableViewItem* pContextItem);
166
167         bool IsContextItem(void) const;
168         void SetContextItemActivation(bool activated);
169         bool IsContextItemActivated(void) const;
170
171         result CreateItemDimLayer(void);
172         void ExposeContextItem(Tizen::Graphics::FloatRectangle itemBounds, float targetWidth);
173         void DrawItemDimLayer(bool visible);
174
175         void SetItemStyle(TableViewAnnexStyle style);
176         TableViewAnnexStyle GetItemStyle(void) const;
177
178         void SetItemWidth(float width);
179
180         bool SetItemBackgroundBitmap(ListItemState itemState, const Tizen::Graphics::Bitmap* pBitmap);
181         Tizen::Graphics::Bitmap* GetItemBackgroundBitmap(ListItemState itemState) const;
182
183         void SetItemBackgroundColor(ListItemState itemState, const Tizen::Graphics::Color bgColor);
184         Tizen::Graphics::Color GetItemBackgroundColor(ListItemState itemState) const;
185
186         result SetSelectionStyle(TableViewItemSelectionStyle style);
187         TableViewItemSelectionStyle GetSelectionStyle(void) const;
188
189         virtual void SetAppInfo(const void* pAppInfo);
190         virtual void* GetAppInfo(void) const;
191
192         int AddRef(void);
193         int Release(void);
194
195         void FireItemEvent(bool selectedItem = true);
196         void FireItemSweepEvent(TableViewSweepDirection direction);
197
198         void SetDrawingProperty(_ItemDrawingProperty* pDrawingProperty);
199         _ItemDrawingProperty* GetDrawingProperty(void);
200
201         void SetDrawingStatus(TableViewItemDrawingStatus status);
202         TableViewItemDrawingStatus GetDrawingStatus(void);
203
204         void AdjustChildControlMargin(void);
205
206         void AdjustContextItemBounds(void);
207         void AdjustChildControlCenterAlign(void);
208         void SetChildControlCenterAlign(bool centerAlign);
209         void AdjustAnnexBounds(void);
210
211         //Simple Item
212         result SetSimpleItemContents(const Tizen::Base::String& text, const Tizen::Graphics::Bitmap* pBitmap, bool groupType);
213         result SetSimpleTextColor(const Tizen::Graphics::Color& color, TableViewItemDrawingStatus status);
214         Tizen::Graphics::Color GetSimpleItemTextColor(TableViewItemDrawingStatus status) const;
215         result SetSimpleItemTextSize(int size);
216         int GetSimpleItemTextSize(void) const;
217
218         //Simple group item
219         result SetSimpleGroupItemTextColor(const Tizen::Graphics::Color& color, TableViewItemDrawingStatus status);
220         Tizen::Graphics::Color GetSimpleGroupItemTextColor(TableViewItemDrawingStatus status) const;
221
222         result SetSectionHeaderFooterContents(const Tizen::Base::String& text, HorizontalAlignment alignment, bool isHeader);
223         result SetSectionHeaderFooterAlignment(HorizontalAlignment alignment);
224
225         bool MoveItem(Tizen::Graphics::FloatPoint position, int duration, int delay);
226         bool FadeInOutItem(bool fadeOut, int duration, int delay);
227         bool ZoomInOutItem(bool zoomOut, int duration, int delay);
228
229         Tizen::Graphics::Point GetLastTouchPressedPosition(void);
230         Tizen::Graphics::FloatPoint GetLastTouchPressedPositionF(void);
231         void SetLastTouchPressedPosition(Tizen::Graphics::Point position);
232         void SetLastTouchPressedPosition(Tizen::Graphics::FloatPoint position);
233
234         bool GetSelectionState(void);
235         void SetSelectionState(bool selected);
236
237         result SetIndividualSelectionEnabled(const _Control& control, bool enable);
238         bool IsIndividualSelectionEnabled(const _Control& control);
239
240         bool IsAnimationPlaying(void);
241         void StopAllAnimation(void);
242
243         void SetItemDividerEnabled(bool enable);
244
245         result PlayCheckBoxAnimation(void);
246         result StartCheckBoxAnimation(void);
247         void StopCheckBoxAnimation(void);
248
249         void SetItemLayoutEnabled(bool enabled);
250         bool GetItemLayoutEnabled(void);
251         bool IsAnnexOnOffSliding(void);
252         static float GetAnnexWidth(TableViewAnnexStyle style);
253
254         void FireItemTouchReleased(void);
255         void FireItemTouchPressed(void);
256         void SetSimpleLastItemEnabled(bool enable);
257         void SetSectionItem(bool isSectionItem);
258         void SetTouchPressOnScroll(bool isTouch);
259         bool IsTouchPressOnScroll(void) const;
260
261         // Accessibility
262         virtual void SetAccessibilityElement(void);
263         Tizen::Ui::_AccessibilityElement* GetAccessibilityElement(void);
264
265         virtual result OnAttachedToMainTree(void);
266
267         // event handler for ITouchEventListener
268         virtual bool OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo);
269         virtual bool OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo);
270         virtual bool OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo);
271         virtual bool OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo);
272
273         virtual _UiTouchEventDelivery OnPreviewTouchPressed(const _Control& source, const _TouchInfo& touchinfo);
274         virtual _UiTouchEventDelivery OnPreviewTouchReleased(const _Control& source, const _TouchInfo& touchinfo);
275         virtual _UiTouchEventDelivery OnPreviewTouchMoved(const _Control& source, const _TouchInfo& touchinfo);
276         virtual _UiTouchEventDelivery OnPreviewTouchCanceled(const _Control& source, const _TouchInfo& touchinfo);
277
278         virtual void OnDraw(void);
279         virtual void OnChildAttached(const _Control& child);
280         virtual void OnChildDetached(const _Control& child);
281         virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer);
282         virtual void OnBoundsChanged(void);
283
284         // VisualElement Animation
285         virtual void OnTickOccurred(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, const Tizen::Ui::Variant& currentValue);
286         virtual void OnVisualElementAnimationStarted(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target);
287         virtual void OnVisualElementAnimationRepeated(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, long currentRepeatCount);
288         virtual void OnVisualElementAnimationFinished(const Tizen::Ui::Animations::VisualElementAnimation& animation, const Tizen::Base::String& keyName, Tizen::Ui::Animations::VisualElement& target, bool completedNormally);
289
290         // accessibility listener
291         virtual bool OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element);
292         virtual bool OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element);
293         virtual bool OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element);
294         virtual bool OnAccessibilityReadElement(const _AccessibilityContainer& control, const _AccessibilityElement& element);
295         virtual bool OnAccessibilityFocusIn(const _AccessibilityContainer& control, const _AccessibilityElement& element);
296         virtual bool OnAccessibilityFocusOut(const _AccessibilityContainer& control, const _AccessibilityElement& element);
297         virtual bool OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element);
298         virtual bool OnAccessibilityValueIncreased(const _AccessibilityContainer& control, const _AccessibilityElement& element);
299         virtual bool OnAccessibilityValueDecreased(const _AccessibilityContainer& control, const _AccessibilityElement& element);
300
301         // Focus Ui
302         virtual bool OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo);
303         virtual bool OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo);
304         virtual bool IsChildControlFocusManage(void) const;
305         virtual void OnFocusModeStateChanged(void);
306
307         bool SetItemTapSoundEnabled(bool tapSoundEnabled);
308         bool GetItemTapSoundEnabled(void);
309
310         void DrawAnnexFocus(void);
311         void ResetItemState(void);
312
313         virtual Tizen::Graphics::Canvas* OnCanvasRequestedN(const Tizen::Graphics::FloatRectangle& bounds);
314
315         //Enable/Visible state change
316         virtual void OnVisibleStateChanged(void);
317         virtual void OnAncestorEnableStateChanged(const _Control& control);
318         virtual void OnAncestorVisibleStateChanged(const _Control& control);
319         virtual void OnFocusableStateChanged(bool focusableState);
320
321         //Accessibility
322         void SetPublicLabelUpdate(bool resetPublicLabelUpdate);
323
324
325 protected:
326         _TableViewItem(float nItemHeight);
327         result Initialize(void);
328
329         virtual void SetAccessibilityElementLabel(void);
330         virtual void SetAccessibilityElementTrait(void);
331         virtual void SetAccessibilityElementValue(void);
332
333         void SetPressedControl(TableViewItemPressedControl pressedControl);
334         TableViewItemPressedControl GetPressedControl(void);
335
336         result StartTouchPressedTimer(const _Control& source, const _TouchInfo& touchinfo);
337         void StopTouchPressedTimer(bool forceStop = false);
338         result StartTouchReleasedTimer(void);
339         void StopTouchReleasedTimer(bool forceStop = false);
340
341         void OnAncestorInputEnableStateChanged(const _Control& control);
342
343         void SetItemCustomHeight(float height);
344         float GetItemCustomHeight(void);
345
346 private:
347         _TableViewItem(const _TableViewItem&);
348         _TableViewItem& operator =(const _TableViewItem&);
349
350 private:
351         void DrawItemBackground(void);
352         void DrawSectionStyleBackground(void);
353         void DrawSectionStyleBackgroundCover(void);
354         void DrawContextItemBackground(void);
355         void DrawAnnexStyle(void);
356         void DrawCheckBox(void);
357         void DrawRadioBox(void);
358         void DrawOnOffButton(void);
359         void DrawAnnexOnOffHandler(float position);
360         void AdjustAnnexOnOffHandlerPosition();
361         void DrawDetailButton(void);
362         void DrawItemDivider(void);
363         void DrawItemAnnexDivider(void);
364         void DrawGroupedLook(void);
365
366         result DrawBitmap (Tizen::Graphics::Canvas& canvas, const Tizen::Graphics::FloatRectangle& bounds, const Tizen::Graphics::Bitmap& bitmap);
367
368         result SetItemHighlightBounds(Tizen::Ui::Animations::_VisualElement& highlightVisualElement, const Tizen::Graphics::FloatRectangle& bounds);
369         Tizen::Graphics::FloatRectangle CalculateItemHighlightBounds(void);
370         Tizen::Graphics::FloatRectangle CalculateAnnexBitmapBounds(float annexWidth, float annexHeight, const Tizen::Graphics::Bitmap& bitmap);
371
372         bool IsTitleStyleItem(void) const;
373         bool IsValidSelectionState(void);
374
375         //Simple Item
376         void DrawSimpleItem(void);
377         result CreateSimpleItemContents(bool textOnly);
378
379         result CreateItemDivider(void);
380         result CreateItemAnnexDivider(void);
381         result CreateItemCover(void);
382
383         void CreateAnnexStyle(void);
384         result CreateCheckBox(void);
385         result CreateRadioBox(void);
386         result CreateOnOffButton(void);
387         result CreateDetailButton(void);
388
389         _Label* GetLabelCore(Label* pLabel);
390
391         _Control* GetPreviousFocusChildControl(const _Control& source);
392         _Control* GetNextFocusChildControl(const _Control& source);
393
394         Tizen::Base::String GetChildAccessibilityLabelContent(const _Control& source);
395         void DeactivateChildAccessibilityContainer(const _Control& source);
396
397 private:
398         void* __pAppInfo;
399         int __refCount;
400         float __itemHeight;
401         int __itemGroupIndex;
402         int __itemIndex;
403
404         bool __checkedState;
405         bool __enabledState;
406         bool __itemChanged;
407         bool __reorderMode;
408         bool __itemSelected;
409         bool __itemTouchMoved;
410         bool __childMarginState;
411
412         TableViewAnnexStyle __annexStyle;
413         TableViewItemDrawingStatus __drawingStatus;
414         TableViewItemSelectionStyle __selectionStyle;
415         TableViewItemType __itemType;
416
417         _TableViewItem* __pContextItem;
418         bool __isContextItem;
419         bool __isContextItemActivated;
420         bool __checkItemHeightNeeded;
421
422         _TableViewItemControl* __pItemDivider;
423         _TableViewItemControl* __pItemTopDivider;
424         Label* __pItemAnnex;
425         _TableViewItemControl* __pItemCover;
426         _TableViewItemControl* __pItemAnnexLeftDivider;
427         _TableViewItemControl* __pItemAnnexRightDivider;
428
429         float __itemWidth;
430
431         Tizen::Graphics::Bitmap* __pItemBgBitmap[3];
432         Tizen::Graphics::Color __colorItemBg[3];
433
434         _ItemDrawingProperty* __pDrawingProperty;
435
436         bool __itemDividerEnabled;
437
438         // Simple Item
439         Label* __pSimpleItemText;
440         Label* __pSimpleItemBitmap;
441         Tizen::Graphics::Color __simpleItemTextColor[6];
442         int __simpleItemTextSize;
443
444         // Section header, footer
445         Label* __pHeaderFooterItemText;
446
447         _Label* __pDimLayer;
448
449         Tizen::Graphics::FloatPoint __touchStartPosition;
450         float __annexTouchStartPosition;
451         bool __annexOnOffHandlerMoved;
452         float __annexOnOffHandlerPositionX;
453         bool __childControlCenterAlign;
454         float __customHeight;
455         int __animationCount;
456
457         Tizen::Base::Collection::ArrayList __individualSelectionControls;
458
459         Tizen::Ui::_AccessibilityElement* __pAccessibilityElement;
460         Tizen::Ui::_AccessibilityElement* __pAccessibilityOnOffElement;
461
462         Tizen::Base::Runtime::Timer* __pPressedTimer;
463         Tizen::Base::Runtime::Timer* __pReleasedTimer;
464         bool __isPressedTimerEnabled;
465         bool __isReleasedTimerEnabled;
466         TableViewItemPressedControl __pressedControl;
467         TableViewItemPressedControl __releasedControl;
468
469         Tizen::Base::Runtime::Timer* __pCheckedTimer;
470         bool __isCheckedTimerEnabled;
471         bool __isCheckedAnimationEnabled;
472         int __checkedCount;
473         Tizen::Graphics::FloatRectangle __checkedBounds;
474
475         bool __isItemLayoutEnabled;
476
477         bool __isMoveItemAnimationEnabled;
478         bool __isZoomInOutItemAnimationEnabled;
479         bool __isFadeInOutItemAnimationEnabled;
480         bool __isAnimationCallbackBlocked;
481
482         bool __isItemTapSoundEnabled;
483         bool __isTabSoundPlayed;
484         bool __isSelectedDetailButton;
485         bool __isSimpleLastItem;
486         bool __isSectionItem;
487         bool __isTouchPressOnScroll;
488
489         bool __isTouchCancelOnPressRelease;
490
491         Tizen::Ui::Animations::_VisualElement* __pHighlightVisualElement;
492         Tizen::Ui::Animations::_VisualElement* __pBitmapVisualElement;
493
494         Tizen::Ui::Animations::VisualElementValueAnimation* __pMoveItemAnimation;
495         Tizen::Ui::Animations::VisualElementValueAnimation* __pZoomInOutItemAnimation;
496         Tizen::Ui::Animations::VisualElementValueAnimation* __pFadeInOutItemtAnimation;
497
498         static const float SIMPLE_ITEM_ELEMENT_BITMAP_SIZE_RATIO = 0.6f;
499         static const float BACKGROUND_DIMMED_OPACITY = 0.7f;
500         static const float BACKGROUND_DISABLED_OPACITY = 0.3f;
501         static const int DEFAULT_CAPTURED_CONTROL_COUNT = 10;
502         static const int CHECKED_ANIMATION_DURATION = 10;
503         static const int TOUCH_PRESSED_DURATION = 100;
504         static const int TOUCH_RELEASED_DURATION = 30;
505         static const int MAX_CHECKED_COUNT = 10;
506         static const float INSENSITIVE = 0.16f;
507         static const float SENSITIVE = 0.08f;
508         static const float ITEM_TOP_DIVIDER_OPACITY = 0.3f;
509         static const float ITEM_BOTTOM_DIVIDER_OPACITY = 1.0f;
510 };
511
512 }}} // Tizen::Ui::Controls
513
514 #endif // _FUI_CTRL_INTERNAL_TABLE_VIEW_ITEM_H_