Merge "[Password]: New design based changes, a new style removed password mode contro...
[framework/uifw/elementary.git] / src / lib / elm_actionslider.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4 /*
5  * SLP
6  * Copyright (c) 2009 Samsung Electronics, Inc.
7  * All rights reserved.
8  *
9  * This software is a confidential and proprietary information
10  * of Samsung Electronics, Inc. ("Confidential Information").  You
11  * shall not disclose such Confidential Information and shall use
12  * it only in accordance with the terms of the license agreement
13  * you entered into with Samsung Electronics.
14  */
15
16 /**
17  *
18  * @defgroup Actionslider Actionslider
19  * @ingroup Elementary
20  *
21  * A magnet slider is a switcher for 3 labels with customizable
22  * magnet properties. When the position is set with magnet, the knob
23  * will be moved to it if it's nearest the magnetized position.
24  *
25  * Signals that you can add callbacks for are:
26  *
27  * "selected" - when user selects a position (the label is passed as
28  *              event info)".
29  * "pos_changed" - when a button reaches to the special position like
30  *                 "left", "right" and "center".
31  */
32
33 #include <Elementary.h>
34 #include <math.h>
35 #include "elm_priv.h"
36
37 /**
38  * internal data structure of actionslider object
39  */
40 typedef struct _Widget_Data Widget_Data;
41
42 struct _Widget_Data
43 {
44    Evas_Object  *as;            // actionslider
45    Evas_Object  *icon;          // an icon for a button or a bar
46    Evas_Object  *icon_fake;             // an icon for a button or a bar
47
48    // setting
49    Elm_Actionslider_Magnet_Pos  magnet_position, enabled_position;
50    const char *text_left, *text_right, *text_center, *text_button;
51
52    // status
53    Eina_Bool    mouse_down;
54    Eina_Bool    mouse_hold;
55
56    // icon animation
57    Ecore_Animator       *icon_animator;
58    double               final_position;
59 };
60
61 static void _del_hook(Evas_Object *obj);
62 static void _theme_hook(Evas_Object *obj);
63 static void _disable_hook(Evas_Object *obj);
64 static void _sizing_eval(Evas_Object *obj);
65 static void _sub_del(void *data, Evas_Object *obj, void *event_info);
66
67 /*
68  * callback functions
69  */
70 static void _icon_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__);
71 static void _icon_move_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__);
72 static void _icon_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__);
73
74 /*
75  * internal functions
76  */
77 static Eina_Bool _icon_animation(void *data);
78
79 static const char *widtype = NULL;
80
81 #define SIG_CHANGED "position"
82 #define SIG_SELECTED "selected"
83
84 static const Evas_Smart_Cb_Description _signals[] =
85 {
86    {SIG_CHANGED, ""},
87    {SIG_SELECTED, ""},
88    {NULL, NULL}
89 };
90
91
92 static void
93 _del_hook(Evas_Object *obj)
94 {
95    Widget_Data *wd = elm_widget_data_get(obj);
96    if (!wd) return;
97    if (wd->icon) 
98      {
99         evas_object_del(wd->icon);
100         wd->icon = NULL;
101      }
102    if (wd->icon_fake) 
103      {
104         evas_object_del(wd->icon_fake);
105         wd->icon_fake = NULL;
106      }
107    if (wd->text_left) eina_stringshare_del(wd->text_left);
108    if (wd->text_right) eina_stringshare_del(wd->text_right);
109    if (wd->text_center) eina_stringshare_del(wd->text_center);
110    if (wd->text_button) eina_stringshare_del(wd->text_button);
111    if (wd->as) 
112      {
113         evas_object_smart_member_del(wd->as);
114         evas_object_del(wd->as);
115         wd->as = NULL;
116      }
117    free(wd);
118 }
119
120 static Elm_Actionslider_Indicator_Pos
121 _get_pos_by_orientation(const Evas_Object *obj, Elm_Actionslider_Pos pos)
122 {
123    if (elm_widget_mirrored_get(obj))
124      {
125         switch (pos)
126           {
127            case ELM_ACTIONSLIDER_INDICATOR_LEFT:
128               pos = ELM_ACTIONSLIDER_INDICATOR_RIGHT;
129               break;
130            case ELM_ACTIONSLIDER_INDICATOR_RIGHT:
131               pos = ELM_ACTIONSLIDER_INDICATOR_LEFT;
132               break;
133            default:
134               break;
135           }
136      }
137    return pos;
138 }
139
140 static void
141 _mirrored_set(Evas_Object *obj, Eina_Bool rtl)
142 {
143    Widget_Data *wd = elm_widget_data_get(obj);
144    double pos;
145
146    if (!wd) return;
147    if (edje_object_mirrored_get(wd->as) == rtl)
148      return;
149
150    edje_object_mirrored_set(wd->as, rtl);
151    if (!elm_widget_mirrored_get(obj))
152      {
153         edje_object_part_text_set(wd->as, "elm.text.left", wd->text_left);
154         edje_object_part_text_set(wd->as, "elm.text.right", wd->text_right);
155      }
156    else
157      {
158         edje_object_part_text_set(wd->as, "elm.text.left", wd->text_right);
159         edje_object_part_text_set(wd->as, "elm.text.right", wd->text_left);
160      }
161    edje_object_part_drag_value_get(wd->as, "elm.swallow.icon", &pos, NULL);
162    edje_object_part_drag_value_set(wd->as, "elm.swallow.icon", 1.0 - pos, 0.5);
163 }
164
165 static void
166 _sizing_eval(Evas_Object *obj)
167 {
168    Widget_Data *wd = elm_widget_data_get(obj);
169    Evas_Coord minw = -1, minh = -1;
170
171    if (!wd) return;
172    elm_coords_finger_size_adjust(1, &minw, 1, &minh);
173    evas_object_size_hint_min_set(wd->icon, minw, minh);
174    evas_object_size_hint_max_set(wd->icon, -1, -1);
175
176    minw = -1;
177    minh = -1;
178    elm_coords_finger_size_adjust(3, &minw, 1, &minh);
179    edje_object_size_min_restricted_calc(wd->as, &minw, &minh, minw, minh);
180    evas_object_size_hint_min_set(obj, minw, minh);
181    evas_object_size_hint_max_set(obj, -1, -1);
182 }
183
184 static void
185 _theme_hook(Evas_Object *obj)
186 {
187    Widget_Data *wd = elm_widget_data_get(obj);
188    if (!wd) return;
189    _elm_widget_mirrored_reload(obj);
190    if (edje_object_part_swallow_get(wd->as, "elm.swallow.icon") == NULL) 
191      edje_object_part_unswallow(wd->as, wd->icon);
192    if (edje_object_part_swallow_get(wd->as, "elm.swallow.space") == NULL) 
193      edje_object_part_unswallow(wd->as, wd->icon_fake);
194
195    _elm_theme_object_set(obj, wd->as, "actionslider", "base", elm_widget_style_get(obj));
196    _elm_theme_object_set(obj, wd->icon, "actionslider", "icon", elm_widget_style_get(obj));
197    _elm_theme_object_set(obj, wd->icon_fake, "actionslider", "icon", elm_widget_style_get(obj));
198    edje_object_part_swallow(wd->as, "elm.swallow.icon", wd->icon);
199    edje_object_part_swallow(wd->as, "elm.swallow.space", wd->icon_fake);
200
201    _mirrored_set(obj, elm_widget_mirrored_get(obj));
202    edje_object_part_text_set(wd->as, "elm.text.center", wd->text_center);
203    edje_object_part_text_set(wd->as, "elm.text.button", wd->text_button);
204    edje_object_message_signal_process(wd->as);
205    //edje_object_scale_set(wd->as, elm_widget_scale_get(obj) * _elm_config->scale);
206    _sizing_eval(obj);
207 }
208
209 static void
210 _disable_hook(Evas_Object *obj)
211 {
212    Widget_Data *wd = elm_widget_data_get(obj);
213
214    if (elm_widget_disabled_get(obj))
215      edje_object_signal_emit(wd->icon, "elm,state,disabled", "elm");
216    else
217      edje_object_signal_emit(wd->icon, "elm,state,enabled", "elm");
218
219 }
220
221 static void
222 _icon_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
223 {
224    Widget_Data *wd = elm_widget_data_get((Evas_Object *)data);
225    if (!wd) return;
226    wd->mouse_down = EINA_TRUE;
227 }
228
229 static void
230 _icon_move_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
231 {
232    Evas_Object *as = (Evas_Object *)data;
233    Widget_Data *wd = elm_widget_data_get(as);
234    double pos = 0.0;
235    if (!wd) return;
236    elm_actionslider_hold(as, EINA_FALSE);
237    if (wd->mouse_down == EINA_FALSE) return;
238
239    edje_object_part_drag_value_get(wd->as, "elm.swallow.icon", &pos, NULL);
240
241    if (pos == 0.0) 
242      evas_object_smart_callback_call(as, SIG_CHANGED, (void *) ((!elm_widget_mirrored_get(as)) ? "left" : "right"));
243    else if (pos == 1.0) 
244      evas_object_smart_callback_call(as, SIG_CHANGED, (void *) ((!elm_widget_mirrored_get(as)) ? "right" : "left"));
245    else if (pos >= 0.495 && pos <= 0.505) 
246      evas_object_smart_callback_call(as, SIG_CHANGED, (void *)"center");
247
248 /*
249  * TODO
250 if (wd->type == ELM_ACTIONSLIDER_TYPE_BAR_GREEN ||
251 wd->type == ELM_ACTIONSLIDER_TYPE_BAR_RED ) {
252 if (pos == 1.0) {
253 //edje_object_signal_emit(wd->as, "elm,show,bar,text,center", "elm");
254 edje_object_signal_emit(wd->as, "elm,show,text,center", "elm");
255 } else {
256 //edje_object_signal_emit(wd->as, "elm,hide,bar,text,center", "elm");
257 edje_object_signal_emit(wd->as, "elm,hide,text,center", "elm");
258 }
259 }
260 */
261 }
262
263 static void
264 _icon_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
265 {
266    Evas_Object *as = (Evas_Object *)data;
267    Widget_Data *wd = elm_widget_data_get((Evas_Object *)data);
268    double position = 0.0;
269
270    wd->mouse_down = EINA_FALSE;
271
272    if (wd->mouse_hold == EINA_FALSE) 
273      {
274         edje_object_part_drag_value_get(wd->as, "elm.drag_button_base", &position, NULL);
275
276         if ((wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_LEFT) && ((!elm_widget_mirrored_get(as) && position == 0.0) ||(elm_widget_mirrored_get(obj) && position == 1.0))) 
277           {
278              wd->final_position = 0.0;
279              evas_object_smart_callback_call(data, SIG_SELECTED,(void *) wd->text_left);
280           }
281         else if (position >= 0.495 && position <= 0.505 && (wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_CENTER))
282           {
283              wd->final_position = 0.5;
284              evas_object_smart_callback_call(data, SIG_SELECTED,(void *)wd->text_center);
285           }
286         else if ((wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_RIGHT) && ((!elm_widget_mirrored_get(as) && position == 1.0) ||(elm_widget_mirrored_get(obj) && position == 0.0)))
287           {
288              wd->final_position = 1.0; 
289              evas_object_smart_callback_call(data, SIG_SELECTED, (void *) wd->text_right);
290           }
291         if (wd->magnet_position == ELM_ACTIONSLIDER_MAGNET_NONE) return;
292
293         #define _FINAL_POS_BY_ORIENTATION(x) (x)
294         #define _POS_BY_ORIENTATION(x) ((!elm_widget_mirrored_get(as)) ? x : 1.0 - x)
295
296         position = _POS_BY_ORIENTATION(position);
297
298         if (position < 0.3)
299           {
300              if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_LEFT)
301                wd->final_position = _FINAL_POS_BY_ORIENTATION(0);
302              else if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_CENTER)
303                wd->final_position = 0.5;
304              else if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_RIGHT)
305                wd->final_position = _FINAL_POS_BY_ORIENTATION(1);
306           }
307         else if ((position >= 0.3) && (position <= 0.7))
308           {
309              if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_CENTER)
310                wd->final_position = 0.5;
311              else if (position < 0.5)
312                {
313                   if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_LEFT)
314                     wd->final_position = _FINAL_POS_BY_ORIENTATION(0);
315                   else
316                     wd->final_position = _FINAL_POS_BY_ORIENTATION(1);
317                }
318              else
319                {
320                   if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_RIGHT)
321                     wd->final_position = _FINAL_POS_BY_ORIENTATION(1);
322                   else
323                     wd->final_position = _FINAL_POS_BY_ORIENTATION(0);
324                }
325            }
326         else
327           {
328              if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_RIGHT)
329                wd->final_position = _FINAL_POS_BY_ORIENTATION(1);
330              else if (wd->magnet_position & ELM_ACTIONSLIDER_MAGNET_CENTER)
331                wd->final_position = 0.5;
332              else
333                wd->final_position = _FINAL_POS_BY_ORIENTATION(0);
334           }
335         wd->icon_animator = ecore_animator_add(_icon_animation, wd);
336
337         #undef _FINAL_POS_BY_ORIENTATION
338      }
339 }
340
341 static Eina_Bool
342 _icon_animation(void *data)
343 {
344    Evas_Object *as = data;
345    Widget_Data *wd = (Widget_Data *)data;
346    if (!wd) return EINA_FALSE;
347    double cur_position = 0.0, new_position = 0.0;
348    double move_amount = 0.05;
349    double adjusted_final;
350    Eina_Bool flag_finish_animation = EINA_FALSE;
351
352    edje_object_part_drag_value_get(wd->as, "elm.swallow.icon", &cur_position, NULL);
353    adjusted_final = (!elm_widget_mirrored_get(as)) ? wd->final_position : 1.0 - wd->final_position;
354
355    if ( (adjusted_final == 0.0) ||(adjusted_final == 0.5 && cur_position >= adjusted_final) ) 
356      {
357         new_position = cur_position - move_amount;
358         if (new_position <= adjusted_final) 
359           {
360              new_position = adjusted_final;
361              flag_finish_animation = EINA_TRUE;
362           }
363      } 
364    else if ((adjusted_final == 1.0) || (adjusted_final == 0.5 && cur_position < adjusted_final) ) 
365      {
366         new_position = cur_position + move_amount;
367         if (new_position >= adjusted_final) 
368           {
369              new_position = adjusted_final;
370              flag_finish_animation = EINA_TRUE;
371              /*
372              // TODO
373              if (wd->type == ELM_ACTIONSLIDER_TYPE_BAR_GREEN ||
374                wd->type == ELM_ACTIONSLIDER_TYPE_BAR_RED ) {
375                edje_object_signal_emit(wd->as, "elm,show,bar,text,center", "elm");
376              }
377              */
378           }
379      }
380    edje_object_part_drag_value_set(wd->as, "elm.swallow.icon", new_position, 0.5);
381
382    if (flag_finish_animation)
383      {
384         if ((!wd->final_position) &&
385             (wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_LEFT))
386           evas_object_smart_callback_call(data, SIG_SELECTED,
387                                           (void *)wd->text_left);
388         else if ((wd->final_position == 0.5) &&
389                  (wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_CENTER))
390           evas_object_smart_callback_call(data, SIG_SELECTED,
391                                           (void *)wd->text_center);
392         else if ((wd->final_position == 1) &&
393                  (wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_RIGHT))
394           evas_object_smart_callback_call(data, SIG_SELECTED,
395                                           (void *)wd->text_right);
396         return EINA_FALSE;
397      }
398    return EINA_TRUE;
399
400 }
401
402 /**
403  * Add a new actionslider to the parent.
404  *
405  * @param[in] parent The parent object
406  * @return The new actionslider object or NULL if it cannot be created
407  *
408  * @ingroup Actionslider
409  */
410 EAPI Evas_Object *
411 elm_actionslider_add(Evas_Object *parent)
412 {
413    Evas_Object *obj;
414    Evas *e;
415    Widget_Data *wd = NULL;
416
417    wd = ELM_NEW(Widget_Data);
418    e = evas_object_evas_get(parent);
419    if (e == NULL) return NULL;
420    ELM_SET_WIDTYPE(widtype, "actionslider");
421    obj = elm_widget_add(e);
422    elm_widget_type_set(obj, "actionslider");
423    elm_widget_sub_object_add(parent, obj);
424    elm_widget_data_set(obj, wd);
425
426    elm_widget_del_hook_set(obj, _del_hook);
427    elm_widget_theme_hook_set(obj, _theme_hook);
428    elm_widget_disable_hook_set(obj, _disable_hook);
429
430    wd->mouse_down = EINA_FALSE;
431    wd->mouse_hold = EINA_FALSE;
432    wd->enabled_position = ELM_ACTIONSLIDER_MAGNET_ALL;
433
434    // load background edj
435    wd->as = edje_object_add(e);
436    if(wd->as == NULL) 
437      {
438         printf("Cannot load actionslider edj!\n");
439         return NULL;
440      }
441    _elm_theme_object_set(obj, wd->as, "actionslider", "base", "default");
442    elm_widget_resize_object_set(obj, wd->as);
443
444    // load icon
445    wd->icon = edje_object_add(e);
446    if (wd->icon == NULL) 
447      {
448         printf("Cannot load acitionslider icon!\n");
449         return NULL;
450      }
451    evas_object_smart_member_add(wd->icon, obj);
452    _elm_theme_object_set(obj, wd->icon, "actionslider", "icon", "default");
453    edje_object_part_swallow(wd->as, "elm.swallow.icon", wd->icon);
454
455    wd->icon_fake = edje_object_add(e);
456    evas_object_smart_member_add(wd->icon_fake, obj);
457    _elm_theme_object_set(obj, wd->icon_fake, "actionslider", "icon", "default");
458    edje_object_part_swallow(wd->as, "elm.swallow.space", wd->icon_fake);
459
460    // event callbacks
461    evas_object_event_callback_add(wd->icon, EVAS_CALLBACK_MOUSE_DOWN, _icon_down_cb, obj);
462    evas_object_event_callback_add(wd->icon, EVAS_CALLBACK_MOUSE_MOVE, _icon_move_cb, obj);
463    evas_object_event_callback_add(wd->icon, EVAS_CALLBACK_MOUSE_UP, _icon_up_cb, obj);
464
465    _mirrored_set(obj, elm_widget_mirrored_get(obj));
466
467    return obj;
468 }
469
470 /*
471 EAPI Evas_Object *
472 elm_actionslider_add_with_set(Evas_Object *parent, Elm_Actionslider_Icon_Pos pos, Elm_Actionslider_Magnet_Pos magnet, const char* label_left, const char* label_center, const char* label_right)
473 {
474    Evas_Object *obj;
475
476    obj = elm_actionslider_add(parent);
477
478    elm_actionslider_icon_set(obj, pos);
479    elm_actionslider_magnet_set(obj, magnet);
480    if (label_left != NULL)
481      elm_actionslider_label_set(obj, ELM_ACTIONSLIDER_LABEL_LEFT, label_left);
482    if (label_center != NULL)
483      elm_actionslider_label_set(obj, ELM_ACTIONSLIDER_LABEL_CENTER, label_center);
484    if (label_right != NULL)
485      elm_actionslider_label_set(obj, ELM_ACTIONSLIDER_LABEL_RIGHT, label_right);
486
487    return obj;
488 }
489 */
490
491 /**
492  * Set actionslider indicator position. 
493  *
494  * @param[in] obj The actionslider object. 
495  * @param[in] pos The position of the indicator.
496  * (ELM_ACTIONSLIDER_INDICATOR_LEFT, ELM_ACTIONSLIDER_INDICATOR_RIGHT,
497  *  ELM_ACTIONSLIDER_INDICATOR_CENTER)
498  *
499  * @ingroup Actionslider
500  */
501 EAPI void
502 elm_actionslider_indicator_pos_set(Evas_Object *obj, Elm_Actionslider_Indicator_Pos pos)
503 {
504    ELM_CHECK_WIDTYPE(obj, widtype);
505
506    Widget_Data *wd = elm_widget_data_get(obj);
507    double position = 0.0;
508    if (!wd) return;
509
510    pos = _get_pos_by_orientation(obj, pos);
511    if (pos == ELM_ACTIONSLIDER_INDICATOR_LEFT) position = 0.0;
512    else if (pos == ELM_ACTIONSLIDER_INDICATOR_RIGHT) position = 1.0;
513    else if (pos == ELM_ACTIONSLIDER_INDICATOR_CENTER) position = 0.5;
514    else position = 0.0;
515
516    edje_object_part_drag_value_set(wd->as, "elm.swallow.icon", position, 0.5);
517 }
518
519 /**
520  * Get actionslider indicator position.
521  *
522  * @param obj The actionslider object.
523  * @return The position of the indicator.
524  *
525  * @ingroup Actionslider
526  */
527 EAPI Elm_Actionslider_Indicator_Pos
528 elm_actionslider_indicator_pos_get(const Evas_Object *obj)
529 {
530    ELM_CHECK_WIDTYPE(obj, widtype) ELM_ACTIONSLIDER_INDICATOR_NONE;
531    Widget_Data *wd = elm_widget_data_get(obj);
532    double position;
533    if (!wd) return ELM_ACTIONSLIDER_INDICATOR_NONE;
534
535    edje_object_part_drag_value_get(wd->as, "elm.swallow.icon", &position, NULL);
536    if (position < 0.3)
537      return _get_pos_by_orientation(obj, ELM_ACTIONSLIDER_INDICATOR_LEFT);
538    else if (position < 0.7)
539      return ELM_ACTIONSLIDER_INDICATOR_CENTER;
540    else
541      return _get_pos_by_orientation(obj, ELM_ACTIONSLIDER_INDICATOR_RIGHT);
542 }
543 /**
544  * Set actionslider magnet position. 
545  *
546  * @param[in] obj The actionslider object. 
547  * @param[in] pos The position of the magnet.
548  * (ELM_ACTIONSLIDER_MAGNET_LEFT, ELM_ACTIONSLIDER_MAGNET_RIGHT,
549  *  ELM_ACTIONSLIDER_MAGNET_BOTH, ELM_ACTIONSLIDER_MAGNET_CENTER)
550  *
551  * @ingroup Actionslider
552  */
553 EAPI void
554 elm_actionslider_magnet_pos_set(Evas_Object *obj, Elm_Actionslider_Magnet_Pos pos)
555 {
556    ELM_CHECK_WIDTYPE(obj, widtype);
557    Widget_Data *wd = elm_widget_data_get(obj);
558    if (!wd) return;
559    wd->magnet_position = pos;
560 }
561
562 /**
563  * Get actionslider magnet position.
564  *
565  * @param obj The actionslider object.
566  * @return The positions with magnet property.
567  *
568  * @ingroup Actionslider
569  */
570 EAPI Elm_Actionslider_Magnet_Pos
571 elm_actionslider_magnet_pos_get(const Evas_Object *obj)
572 {
573    ELM_CHECK_WIDTYPE(obj, widtype) ELM_ACTIONSLIDER_MAGNET_NONE;
574    Widget_Data *wd = elm_widget_data_get(obj);
575    if (!wd) return ELM_ACTIONSLIDER_MAGNET_NONE;
576    return wd->magnet_position;
577 }
578
579 /**
580  * Set actionslider enabled position.
581  *
582  * All the positions are enabled by default.
583  *
584  * @param obj The actionslider object.
585  * @param pos Bit mask indicating the enabled positions.
586  * Example: use (ELM_ACTIONSLIDER_MAGNET_LEFT | ELM_ACTIONSLIDER_MAGNET_RIGHT)
587  * to enable both positions, so the user can select it.
588  *
589  * @ingroup Actionslider
590  */
591 EAPI void
592 elm_actionslider_enabled_pos_set(Evas_Object *obj, Elm_Actionslider_Magnet_Pos pos)
593 {
594    ELM_CHECK_WIDTYPE(obj, widtype);
595    Widget_Data *wd = elm_widget_data_get(obj);
596    if (!wd) return;
597    wd->enabled_position = pos;
598 }
599
600 /**
601  * Get actionslider enabled position.
602  *
603  * All the positions are enabled by default.
604  *
605  * @param obj The actionslider object.
606  * @return The enabled positions.
607  *
608  * @ingroup Actionslider
609  */
610 EAPI Elm_Actionslider_Magnet_Pos
611 elm_actionslider_enabled_pos_get(const Evas_Object *obj)
612 {
613    ELM_CHECK_WIDTYPE(obj, widtype) ELM_ACTIONSLIDER_MAGNET_NONE;
614    Widget_Data *wd = elm_widget_data_get(obj);
615    if (!wd) return ELM_ACTIONSLIDER_MAGNET_NONE;
616    return wd->enabled_position;
617 }
618
619 /**
620  * Set actionslider label.
621  *
622  * @param[in] obj The actionslider object
623  * @param[in] pos The position of the label.
624  * (ELM_ACTIONSLIDER_LABEL_LEFT, ELM_ACTIONSLIDER_LABEL_RIGHT)
625  * @param label The label which is going to be set.
626  *
627  * @ingroup Actionslider
628  */
629 EAPI void 
630 elm_actionslider_label_set(Evas_Object *obj, Elm_Actionslider_Label_Pos pos, const char *label)
631 {
632    ELM_CHECK_WIDTYPE(obj, widtype);
633    Widget_Data *wd = elm_widget_data_get(obj);
634    if (!wd) return;
635
636    if(label == NULL) label = "";
637
638    if (pos == ELM_ACTIONSLIDER_LABEL_RIGHT) 
639      {
640         if (wd->text_right)  eina_stringshare_del(wd->text_right);
641         wd->text_right = eina_stringshare_add(label);
642         if (!elm_widget_mirrored_get(obj))
643           edje_object_part_text_set(wd->as, "elm.text.right", label);
644         else
645           edje_object_part_text_set(wd->as, "elm.text.left", label);
646      } 
647    else if (pos == ELM_ACTIONSLIDER_LABEL_LEFT) 
648      {
649         if (wd->text_left)  eina_stringshare_del(wd->text_left);
650         wd->text_left = eina_stringshare_add(label);
651         if (!elm_widget_mirrored_get(obj))
652           edje_object_part_text_set(wd->as, "elm.text.left", label);
653         else
654           edje_object_part_text_set(wd->as, "elm.text.right", label);
655      } 
656    else if (pos == ELM_ACTIONSLIDER_LABEL_CENTER) 
657      {
658         if (wd->text_center)  eina_stringshare_del(wd->text_center);
659         wd->text_center = eina_stringshare_add(label);
660         edje_object_part_text_set(wd->as, "elm.text.center", label);
661      }
662    else if (pos == ELM_ACTIONSLIDER_LABEL_BUTTON)
663      {
664         if (wd->text_button) eina_stringshare_del(wd->text_button);
665         wd->text_button = eina_stringshare_add(label);
666         edje_object_part_text_set(wd->icon, "elm.text.button", label);
667
668         /* Resize button width */
669         Evas_Object *txt;
670         txt = (Evas_Object *)edje_object_part_object_get (wd->icon, "elm.text.button");
671         if (txt != NULL) 
672           {
673              evas_object_text_text_set (txt, wd->text_button);
674
675              Evas_Coord x,y,w,h;
676              evas_object_geometry_get (txt, &x,&y,&w,&h);
677
678              char *data_left = NULL, *data_right = NULL;
679              int pad_left = 0, pad_right = 0;
680
681              data_left = (char *)edje_object_data_get (wd->icon, "left");
682              data_right = (char *)edje_object_data_get (wd->icon, "right");
683
684              if (data_left) pad_left = atoi(data_left);
685              if (data_right) pad_right = atoi(data_right);
686
687              evas_object_size_hint_min_set (wd->icon, w + pad_left + pad_right, 0);
688              evas_object_size_hint_min_set (wd->icon_fake, w + pad_left + pad_right, 0);
689           }
690      }
691
692 }
693
694 /**
695  * Get actionslider labels.
696  *
697  * @param obj The actionslider object
698  * @param left_label A char** to place the left_label of @p obj into
699  * @param center_label A char** to place the center_label of @p obj into
700  * @param right_label A char** to place the right_label of @p obj into
701  *
702  * @ingroup Actionslider
703  */
704 EAPI void
705 elm_actionslider_labels_get(const Evas_Object *obj, const char **left_label, const char **center_label, const char **right_label)
706 {
707    if (left_label) *left_label= NULL;
708    if (center_label) *center_label= NULL;
709    if (right_label) *right_label= NULL;
710    ELM_CHECK_WIDTYPE(obj, widtype);
711    Widget_Data *wd = elm_widget_data_get(obj);
712    if (!wd) return;
713    if (left_label) *left_label = wd->text_left;
714    if (center_label) *center_label = wd->text_center;
715    if (right_label) *right_label = wd->text_right;
716 }
717
718 /**
719  * Get actionslider selected label.
720  *
721  * @param obj The actionslider object
722  * @return The selected label
723  *
724  * @ingroup Actionslider
725  */
726 EAPI const char *
727 elm_actionslider_selected_label_get(const Evas_Object *obj)
728 {
729    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
730    Widget_Data *wd = elm_widget_data_get(obj);
731    if (!wd) return NULL;
732
733    if ((wd->final_position == 0.0) &&
734        (wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_LEFT))
735      return wd->text_left;
736
737    if ((wd->final_position == 0.5) &&
738        (wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_CENTER))
739      return wd->text_center;
740
741    if ((wd->final_position == 1.0) &&
742        (wd->enabled_position & ELM_ACTIONSLIDER_MAGNET_RIGHT))
743      return wd->text_right;
744
745    return NULL;
746 }
747
748 /**
749  * Set the label used on the indicator object.
750  *
751  * @param obj The actionslider object
752  * @param label The label which is going to be set.
753  *
754  * @ingroup Actionslider
755  */
756 EAPI void 
757 elm_actionslider_indicator_label_set(Evas_Object *obj, const char *label)
758 {
759    ELM_CHECK_WIDTYPE(obj, widtype);
760    Widget_Data *wd = elm_widget_data_get(obj);
761    if (!wd) return;
762
763    eina_stringshare_replace(&wd->text_button, label);
764    edje_object_part_text_set(wd->as, "elm.text.button", wd->text_button);
765 }
766
767 /**
768  * Get the label used on the indicator object.
769  *
770  * @param obj The actionslider object
771  * @return The indicator label
772  *
773  * @ingroup Actionslider
774  */
775 EAPI const char *
776 elm_actionslider_indicator_label_get(Evas_Object *obj)
777 {
778    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
779    Widget_Data *wd = elm_widget_data_get(obj);
780    if (!wd) return NULL;
781    return wd->text_button;
782 }
783
784 /**
785  * Hold actionslider object movement.
786  *
787  * @param[in] obj The actionslider object
788  * @param[in] flag Actionslider hold/release
789  * (EINA_TURE = hold/EIN_FALSE = release)
790  *
791  * @ingroup Actionslider
792  */
793 EAPI void
794 elm_actionslider_hold(Evas_Object *obj, Eina_Bool flag)
795 {
796    ELM_CHECK_WIDTYPE(obj, widtype);
797    Widget_Data *wd = elm_widget_data_get(obj);
798
799    wd->mouse_hold = flag;
800 }