[Genlist][Nabi:S1-1013] bug fix, Abnormality is displayed when selecting Type while...
[framework/uifw/elementary.git] / src / lib / elm_gen_common.h
1 #ifndef ELM_GEN_H_
2 #define ELM_GEN_H_
3
4 #include <Elementary.h>
5 #include <Elementary_Cursor.h>
6 #include "elm_priv.h"
7
8 #define ELM_GEN_ITEM_FROM_INLIST(it) \
9   ((it) ? EINA_INLIST_CONTAINER_GET(it, Elm_Gen_Item) : NULL)
10
11 #define SWIPE_MOVES 12
12
13 typedef struct Elm_Gen_Item_Type    Elm_Gen_Item_Type;
14 typedef struct Elm_Gen_Item_Tooltip Elm_Gen_Item_Tooltip;
15 typedef struct _Widget_Data         Widget_Data;
16
17 struct Elm_Gen_Item_Tooltip
18 {
19    const void                 *data;
20    Elm_Tooltip_Item_Content_Cb content_cb;
21    Evas_Smart_Cb               del_cb;
22    const char                 *style;
23    Eina_Bool                   free_size : 1;
24 };
25
26 struct Elm_Gen_Item
27 {
28    ELM_WIDGET_ITEM;
29    EINA_INLIST;
30    Widget_Data              *wd;
31    Elm_Gen_Item_Type        *item;
32    const Elm_Gen_Item_Class *itc;
33    Evas_Coord                x, y, dx, dy;
34    Evas_Object              *spacer, *deco_all_view;
35    Elm_Gen_Item             *parent;
36    Eina_List                *texts, *contents, *states, *content_objs;
37    Ecore_Timer              *long_timer;
38    int                       relcount;
39    int                       walking;
40    int                       generation; /**< a generation of an item. when the item is created, this value is set to the value of genlist generation. this value will be decreased when the item is going to be deleted */
41    const char               *mouse_cursor;
42
43    struct
44      {
45         Evas_Smart_Cb func;
46         const void   *data;
47      } func;
48
49    Elm_Gen_Item_Tooltip      tooltip;
50    Ecore_Cb                  del_cb, sel_cb, highlight_cb;
51    Ecore_Cb                  unsel_cb, unhighlight_cb, unrealize_cb;
52
53    int                       position;
54    Elm_Object_Select_Mode    select_mode;
55
56    Eina_Bool                 position_update : 1;
57    Eina_Bool                 want_unrealize : 1;
58    Eina_Bool                 realized : 1;
59    Eina_Bool                 selected : 1;
60    Eina_Bool                 highlighted : 1;
61    Eina_Bool                 dragging : 1; /**< this is set true when an item is being dragged. this is set false on multidown/mouseup/mousedown. when this is true, the item should not be unrealized. or evas mouse down/up event will be corrupted. */
62    Eina_Bool                 down : 1;
63    Eina_Bool                 group : 1;
64    Eina_Bool                 reorder : 1;
65    Eina_Bool                 decorate_it_set : 1; /**< item uses style mode for highlight/select */
66    Eina_Bool                 flipped : 1; /**< a flag that shows the flip status of the item. */
67    Eina_Bool                 defer_unrealize : 1;
68    Eina_Bool                 can_focus : 1;
69 };
70
71 typedef struct _Pan Pan;
72 struct _Pan
73 {
74    Evas_Object_Smart_Clipped_Data __clipped_data;
75    Widget_Data                   *wd;
76    Ecore_Job                     *resize_job;
77 };
78
79 typedef enum
80 {
81    ELM_GENLIST_TREE_EFFECT_NONE         = 0,
82    ELM_GENLIST_TREE_EFFECT_EXPAND       = 1,
83    ELM_GENLIST_TREE_EFFECT_CONTRACT     = 2
84 } Elm_Genlist_Item_Move_Effect_Mode;
85
86 struct _Widget_Data
87 {
88    Eina_Inlist_Sorted_State      *state;
89    Evas_Object                   *obj; /**< the genlist object */
90    Evas_Object                   *scr; /**< a smart scroller object which is used internally in genlist */
91    Evas_Object                   *pan_smart; /**< "elm_genlist_pan" evas smart object. this is an extern pan of smart scroller(scr). */
92    Eina_List                     *selected; /**< a list of selected items */
93    Eina_List                     *group_items; /**< a list of groups index items */
94    Eina_Inlist                   *items; /**< an inlist of all items */
95    Elm_Gen_Item                  *reorder_it; /**< item currently being repositioned */
96    Elm_Object_Item               *last_selected_item;
97    Pan                           *pan; /**< pan_smart object's smart data */
98    Ecore_Job                     *calc_job;
99    int                            walking;
100    int                            item_width, item_height;
101    int                            group_item_width, group_item_height;
102    int                            minw, minh;
103    unsigned int                   item_count;
104    Evas_Coord                     pan_x, pan_y;
105    Elm_Object_Select_Mode         select_mode;
106    Eina_Bool                      reorder_mode : 1; /**< a flag for reorder mode enable/disable */
107    Eina_Bool                      on_hold : 1;
108    Eina_Bool                      multi : 1; /**< a flag for item multi selection */
109    Eina_Bool                      wasselected : 1;
110    Eina_Bool                      highlight : 1; /**< a flag for items can be highlighted or not. by default this flag is true. */
111    Eina_Bool                      clear_me : 1; /**< a flag whether genlist is marked as to be cleared or not. if this flag is true, genlist clear was already deferred.  */
112    Eina_Bool                      h_bounce : 1;
113    Eina_Bool                      v_bounce : 1;
114    Ecore_Cb                       del_cb, calc_cb, sizing_cb;
115    Ecore_Cb                       clear_cb;
116    ////////////////////////////////////
117    Eina_Inlist                   *blocks; /**< an inlist of all blocks. a block consists of a certain number of items. maximum number of items in a block is 'max_items_per_block'. */
118    Evas_Coord                     reorder_old_pan_y, w, h, realminw, prev_viewport_w;
119    Ecore_Job                     *update_job;
120    Ecore_Idle_Enterer            *queue_idle_enterer;
121    Ecore_Idler                   *must_recalc_idler;
122    Eina_List                     *queue;
123    Elm_Gen_Item                  *show_item, *anchor_item, *mode_item, *reorder_rel, *expanded_item;
124    Eina_Inlist                   *item_cache; /**< an inlist of edje object it cache. */
125    Evas_Coord                     anchor_y;
126    Evas_Coord                     reorder_start_y; /**< reorder it's initial y coordinate in the pan. */
127    Elm_List_Mode                  mode;
128    Ecore_Timer                   *multi_timer, *scr_hold_timer;
129    Ecore_Animator                *reorder_move_animator;
130    const char                    *decorate_it_type;
131    double                         start_time;
132    Evas_Coord                     prev_x, prev_y, prev_mx, prev_my;
133    Evas_Coord                     cur_x, cur_y, cur_mx, cur_my;
134    Eina_Bool                      mouse_down : 1;
135    Eina_Bool                      multi_down : 1;
136    Eina_Bool                      multi_timeout : 1;
137    Eina_Bool                      multitouched : 1;
138    Eina_Bool                      longpressed : 1;
139    Eina_Bool                      bring_in : 1; /**< a flag to describe the scroll animation. (show, bring in) */
140    Eina_Bool                      height_for_width : 1;
141    Eina_Bool                      homogeneous : 1;
142    Eina_Bool                      swipe : 1;
143    Eina_Bool                      decorate_all_mode : 1;
144    Eina_Bool                      reorder_pan_move : 1;
145    Eina_Bool                      auto_scroll_enabled : 1;
146    Eina_Bool                      pan_changed : 1;
147    Eina_Bool                      requeued : 1; /**< this is set to EINA_TRUE when the item is re-queued. this happens when the item is un-queued but the rel item is still in the queue. this item will be processed later. */
148    Eina_Bool                      check_scroll : 1; /**< this flag means genlist is supposed to be scrolled. if this flag is set to EINA_TRUE, genlist checks whether it's ok to scroll genlist now or not. */
149    Eina_Bool                      tree_effect_enabled : 1; /**< tree effect */
150    Eina_Bool                      reorder_deleted : 1;
151    Eina_Bool                      drag_started : 1;
152    struct
153      {
154         Evas_Coord x, y;
155      } history[SWIPE_MOVES];
156    int                            multi_device;
157    int                            item_cache_count;
158    int                            item_cache_max; /**< maximum number of cached items */
159    int                            movements;
160    int                            max_items_per_block; /**< maximum number of items per block */
161    double                         longpress_timeout; /**< longpress timeout. this value comes from _elm_config by default. this can be changed by elm_genlist_longpress_timeout_set() */
162    int                            generation; /**< a generation of genlist. when genlist is cleared, this value will be increased and a new generation will start */
163    Eina_Compare_Cb                item_compare_cb;
164    Eina_Compare_Cb                item_compare_data_cb;
165    Elm_Genlist_Item_Scrollto_Type scrollto_type; /**< a scrollto type which remembers where to scroll ex) in, top, middle */
166    Evas_Object                   *alpha_bg; /**< not to receive event when tree effect is not finished */
167    Eina_List                     *move_items; /**< items move for tree effect */
168    Elm_Gen_Item                  *expanded_next_item;
169    Ecore_Animator                *tree_effect_animator; /**< tree effect animator */
170    Elm_Genlist_Item_Move_Effect_Mode move_effect_mode;
171    Ecore_Job                     *changed_job;
172
173    /* The stuff below directly come from gengrid without any thinking */
174    unsigned int                   nmax;
175    Evas_Coord                     reorder_item_x, reorder_item_y;
176    Evas_Coord                     old_pan_x, old_pan_y;
177    long                           items_lost;
178    double                         align_x, align_y;
179
180    Eina_Bool                      horizontal : 1;
181    Eina_Bool                      move_effect_enabled : 1;
182    Eina_Bool                      reorder_item_changed : 1;
183    Eina_Bool                      filled : 1;
184 };
185
186 Elm_Gen_Item *_elm_genlist_item_new(Widget_Data *wd, const Elm_Gen_Item_Class *itc, const void *data, Elm_Gen_Item *parent, Evas_Smart_Cb func, const void *func_data);
187
188 Evas_Object  *_elm_genlist_item_widget_get(const Elm_Gen_Item *it);
189
190 void          _elm_genlist_page_relative_set(Evas_Object *obj, double h_pagerel, double v_pagerel);
191
192 void          _elm_genlist_page_relative_get(const Evas_Object *obj, double *h_pagerel, double *v_pagerel);
193
194 void          _elm_genlist_page_size_set(Evas_Object *obj, Evas_Coord h_pagesize, Evas_Coord v_pagesize);
195
196 void          _elm_genlist_current_page_get(const Evas_Object *obj, int *h_pagenumber, int *v_pagenumber);
197
198 void          _elm_genlist_last_page_get(const Evas_Object *obj, int *h_pagenumber, int *v_pagenumber);
199
200 void          _elm_genlist_page_show(const Evas_Object *obj, int h_pagenumber, int v_pagenumber);
201
202 void          _elm_genlist_page_bring_in(const Evas_Object *obj, int h_pagenumber, int v_pagenumber);
203
204 void          _elm_genlist_item_unrealize(Elm_Gen_Item *it, Eina_Bool calc);
205 void          _elm_genlist_item_del_serious(Elm_Gen_Item *it);
206
207 void          _elm_genlist_item_del_notserious(Elm_Gen_Item *it);
208
209 #endif