Merge "[Copy&Paste] remove "Paste" button when CBHM has no item"
[framework/uifw/elementary.git] / src / edje_externals / elm_list.c
1 #include <assert.h>
2
3 #include "private.h"
4
5 typedef struct _Elm_Params_List
6 {
7    Elm_Params base;
8    const char *policy_h;
9    const char *policy_v;
10    const char *mode;
11    Eina_Bool h_mode : 1;
12    Eina_Bool h_mode_exists : 1;
13    Eina_Bool multi : 1;
14    Eina_Bool multi_exists : 1;
15    Eina_Bool always_select : 1;
16    Eina_Bool always_select_exists : 1;
17 } Elm_Params_List;
18
19 #define CHOICE_GET(CHOICES, STR)                \
20   unsigned int i;                               \
21   for (i = 0; i < (sizeof(CHOICES)/sizeof(CHOICES[0])); i++)         \
22     if (strcmp(STR, CHOICES[i]) == 0)           \
23       return i
24
25 static const char *scroller_policy_choices[] = {"auto", "on", "off", NULL};
26 static const char *list_mode_choices[] = {"compress", "scroll", "limit",
27                                           "expand", NULL};
28
29 static Elm_Scroller_Policy
30 _scroller_policy_choices_setting_get(const char *policy_str)
31 {
32    assert(sizeof(scroller_policy_choices)/
33           sizeof(scroller_policy_choices[0]) == ELM_SCROLLER_POLICY_LAST + 1);
34    CHOICE_GET(scroller_policy_choices, policy_str);
35    return ELM_SCROLLER_POLICY_LAST;
36 }
37
38 static Elm_List_Mode
39 _list_mode_setting_get(const char *mode_str)
40 {
41    assert(sizeof(list_mode_choices)/sizeof(list_mode_choices[0]) ==
42           ELM_LIST_LAST + 1);
43    CHOICE_GET(list_mode_choices, mode_str);
44    return ELM_LIST_LAST;
45 }
46
47 static void
48 external_list_state_set(void *data __UNUSED__, Evas_Object *obj, const void *from_params, const void *to_params, float pos __UNUSED__)
49 {
50    const Elm_Params_List *p;
51    Elm_Scroller_Policy policy_h, policy_v;
52
53    if (to_params) p = to_params;
54    else if (from_params) p = from_params;
55    else return;
56
57    if (p->mode)
58      {
59         Elm_List_Mode set = _list_mode_setting_get(p->mode);
60
61         if (set != ELM_LIST_LAST)
62           elm_list_mode_set(obj, set);
63      }
64
65    if ((p->policy_h) && (p->policy_v))
66      {
67         policy_h = _scroller_policy_choices_setting_get(p->policy_h);
68         policy_v = _scroller_policy_choices_setting_get(p->policy_v);
69         elm_list_scroller_policy_set(obj, policy_h, policy_v);
70      }
71    else if ((p->policy_h) || (p->policy_v))
72      {
73         elm_list_scroller_policy_get(obj, &policy_h, &policy_v);
74         if (p->policy_h)
75           {
76              policy_h = _scroller_policy_choices_setting_get(p->policy_h);
77              elm_list_scroller_policy_set(obj, policy_h, policy_v);
78           }
79         else
80           {
81              policy_v = _scroller_policy_choices_setting_get(p->policy_v);
82              elm_list_scroller_policy_set(obj, policy_h, policy_v);
83           }
84      }
85
86    if (p->h_mode_exists)
87      elm_list_horizontal_set(obj, p->h_mode);
88    if (p->multi_exists)
89      elm_list_multi_select_set(obj, p->multi);
90    if (p->always_select_exists)
91      elm_list_always_select_mode_set(obj, p->always_select);
92 }
93
94 static Eina_Bool
95 external_list_param_set(void *data __UNUSED__, Evas_Object *obj, const Edje_External_Param *param)
96 {
97    if (!strcmp(param->name, "list mode"))
98      {
99         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
100           {
101              Elm_List_Mode set = _list_mode_setting_get(param->s);
102              if (set == ELM_LIST_LAST) return EINA_FALSE;
103              elm_list_mode_set(obj, set);
104              return EINA_TRUE;
105           }
106      }
107    else if (!strcmp(param->name, "horizontal scroll"))
108      {
109         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
110           {
111              Elm_Scroller_Policy h, v;
112              elm_list_scroller_policy_get(obj, &h, &v);
113              h = _scroller_policy_choices_setting_get(param->s);
114              if (h == ELM_SCROLLER_POLICY_LAST) return EINA_FALSE;
115              elm_list_scroller_policy_set(obj, h, v);
116              return EINA_TRUE;
117           }
118      }
119    else if (!strcmp(param->name, "vertical scroll"))
120      {
121         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
122           {
123              Elm_Scroller_Policy h, v;
124              elm_list_scroller_policy_get(obj, &h, &v);
125              v = _scroller_policy_choices_setting_get(param->s);
126              if (v == ELM_SCROLLER_POLICY_LAST) return EINA_FALSE;
127              elm_list_scroller_policy_set(obj, h, v);
128              return EINA_TRUE;
129           }
130      }
131    else if (!strcmp(param->name, "horizontal mode"))
132      {
133         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
134           {
135              elm_list_horizontal_set(obj, param->i);
136              return EINA_TRUE;
137           }
138      }
139    else if (!strcmp(param->name, "multi-select mode"))
140      {
141         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
142           {
143              elm_list_multi_select_set(obj, param->i);
144              return EINA_TRUE;
145           }
146      }
147    else if (!strcmp(param->name, "always-select mode"))
148      {
149         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
150           {
151              elm_list_always_select_mode_set(obj, param->i);
152              return EINA_TRUE;
153           }
154      }
155
156    ERR("unknown parameter '%s' of type '%s'",
157        param->name, edje_external_param_type_str(param->type));
158
159    return EINA_FALSE;
160 }
161
162 static Eina_Bool
163 external_list_param_get(void *data __UNUSED__, const Evas_Object *obj, Edje_External_Param *param)
164 {
165    if (!strcmp(param->name, "horizontal mode"))
166      {
167         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
168           {
169              param->i = elm_list_horizontal_get(obj);
170              return EINA_TRUE;
171           }
172      }
173    else if (!strcmp(param->name, "multi-select mode"))
174      {
175         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
176           {
177              param->i = elm_list_multi_select_get(obj);
178              return EINA_TRUE;
179           }
180      }
181    else if (!strcmp(param->name, "always-select mode"))
182      {
183         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL)
184           {
185              param->i = elm_list_always_select_mode_get(obj);
186              return EINA_TRUE;
187           }
188      }
189    else if (!strcmp(param->name, "horizontal scroll"))
190      {
191         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
192           {
193              Elm_Scroller_Policy h, v;
194              elm_list_scroller_policy_get(obj, &h, &v);
195
196              param->s = scroller_policy_choices[h];
197              return EINA_TRUE;
198           }
199      }
200    else if (!strcmp(param->name, "vertical scroll"))
201      {
202         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
203           {
204              Elm_Scroller_Policy h, v;
205              elm_list_scroller_policy_get(obj, &h, &v);
206
207              param->s = scroller_policy_choices[v];
208              return EINA_TRUE;
209           }
210      }
211    else if (!strcmp(param->name, "list mode"))
212      {
213         if (param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE)
214           {
215              Elm_List_Mode m = elm_list_mode_get(obj);
216
217              if (m == ELM_LIST_LAST)
218                return EINA_FALSE;
219
220              param->s = list_mode_choices[m];
221              return EINA_TRUE;
222           }
223      }
224
225    ERR("unknown parameter '%s' of type '%s'",
226        param->name, edje_external_param_type_str(param->type));
227
228    return EINA_FALSE;
229 }
230
231 static void *
232 external_list_params_parse(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const Eina_List *params)
233 {
234    Elm_Params_List *mem;
235    Edje_External_Param *param;
236    const Eina_List *l;
237
238    mem = ELM_NEW(Elm_Params_List);
239    if (!mem)
240      return NULL;
241
242    EINA_LIST_FOREACH(params, l, param)
243      {
244         if (!strcmp(param->name, "horizontal mode"))
245           {
246              mem->h_mode = param->i;
247              mem->h_mode_exists = EINA_TRUE;
248           }
249         else if (!strcmp(param->name, "multi-select mode"))
250           {
251              mem->multi = param->i;
252              mem->multi_exists = EINA_TRUE;
253           }
254         else if (!strcmp(param->name, "always-select mode"))
255           {
256              mem->always_select = param->i;
257              mem->always_select_exists = EINA_TRUE;
258           }
259         else if (!strcmp(param->name, "horizontal scroll"))
260           mem->policy_h = eina_stringshare_add(param->s);
261         else if (!strcmp(param->name, "vertical scroll"))
262           mem->policy_v = eina_stringshare_add(param->s);
263         else if (!strcmp(param->name, "list mode"))
264           mem->mode = eina_stringshare_add(param->s);
265      }
266    return mem;
267 }
268
269 static Evas_Object *external_list_content_get(void *data __UNUSED__, const Evas_Object *obj __UNUSED__, const char *content __UNUSED__)
270 {
271    ERR("No content.");
272    return NULL;
273 }
274
275 static void
276 external_list_params_free(void *params)
277 {
278    Elm_Params_List *mem = params;
279
280    if (mem->mode)
281      eina_stringshare_del(mem->mode);
282    if (mem->policy_h)
283      eina_stringshare_del(mem->policy_h);
284    if (mem->policy_v)
285      eina_stringshare_del(mem->policy_v);
286
287    free(mem);
288 }
289
290 static Edje_External_Param_Info external_list_params[] = {
291   DEFINE_EXTERNAL_COMMON_PARAMS,
292   EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("list mode", "scroll",
293                                        list_mode_choices),
294   EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("horizontal scroll", "auto",
295                                        scroller_policy_choices),
296   EDJE_EXTERNAL_PARAM_INFO_CHOICE_FULL("vertical scroll", "auto",
297                                        scroller_policy_choices),
298   EDJE_EXTERNAL_PARAM_INFO_BOOL("horizontal mode"),
299   EDJE_EXTERNAL_PARAM_INFO_BOOL("multi-select mode"),
300   EDJE_EXTERNAL_PARAM_INFO_BOOL("always-select mode"),
301   EDJE_EXTERNAL_PARAM_INFO_SENTINEL
302 };
303
304 DEFINE_EXTERNAL_ICON_ADD(list, "list")
305 DEFINE_EXTERNAL_TYPE_SIMPLE(list, "List");