Tizen 2.1 release
[platform/core/uifw/e17.git] / src / bin / e_widget_button.c
1 #include "e.h"
2
3 typedef enum _E_Widget_Button_Type E_Widget_Button_Type;
4 enum _E_Widget_Button_Type
5 {
6    E_WIDGET_BUTTON_TEXT = 1 << 0,
7    E_WIDGET_BUTTON_ICON = 1 << 1
8 };
9
10 typedef struct _E_Widget_Data E_Widget_Data;
11 struct _E_Widget_Data
12 {
13    Evas_Object         *o_button;
14    Evas_Object         *o_icon;
15    void                 (*func)(void *data, void *data2);
16    void                *data;
17    void                *data2;
18    E_Widget_Button_Type type;
19 };
20
21 static void _e_wid_del_hook(Evas_Object *obj);
22 static void _e_wid_focus_hook(Evas_Object *obj);
23 static void _e_wid_activate_hook(Evas_Object *obj);
24 static void _e_wid_disable_hook(Evas_Object *obj);
25 static void _e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char *source);
26 static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info);
27 static void _e_wid_button_state_send(E_Widget_Data *wd);
28 /* local subsystem functions */
29
30 /* externally accessible functions */
31 EAPI Evas_Object *
32 e_widget_button_add(Evas *evas, const char *label, const char *icon, void (*func)(void *data, void *data2), void *data, void *data2)
33 {
34    Evas_Object *obj, *o;
35    E_Widget_Data *wd;
36    Evas_Coord mw, mh;
37
38    obj = e_widget_add(evas);
39
40    e_widget_del_hook_set(obj, _e_wid_del_hook);
41    e_widget_focus_hook_set(obj, _e_wid_focus_hook);
42    e_widget_activate_hook_set(obj, _e_wid_activate_hook);
43    e_widget_disable_hook_set(obj, _e_wid_disable_hook);
44    wd = calloc(1, sizeof(E_Widget_Data));
45    wd->func = func;
46    wd->data = data;
47    wd->data2 = data2;
48    e_widget_data_set(obj, wd);
49
50    o = edje_object_add(evas);
51    wd->o_button = o;
52    e_theme_edje_object_set(o, "base/theme/widgets",
53                            "e/widgets/button");
54    edje_object_signal_callback_add(o, "e,action,click", "",
55                                    _e_wid_signal_cb1, obj);
56    if ((label) && (label[0] != 0))
57      {
58         edje_object_part_text_set(o, "e.text.label", label);
59         wd->type |= E_WIDGET_BUTTON_TEXT;
60      }
61
62    e_widget_sub_object_add(obj, o);
63    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
64                                   _e_wid_focus_steal, obj);
65    e_widget_resize_object_set(obj, o);
66    evas_object_show(o);
67
68    if (icon)
69      {
70         o = e_icon_add(evas);
71         wd->o_icon = o;
72         e_util_icon_theme_set(o, icon);
73         edje_object_part_swallow(wd->o_button, "e.swallow.icon", o);
74         e_widget_sub_object_add(obj, o);
75         evas_object_show(o);
76         wd->type |= E_WIDGET_BUTTON_ICON;
77      }
78
79    _e_wid_button_state_send(wd);
80    edje_object_size_min_calc(wd->o_button, &mw, &mh);
81    e_widget_size_min_set(obj, mw, mh);
82
83    return obj;
84 }
85
86 EAPI void
87 e_widget_button_label_set(Evas_Object *obj, const char *label)
88 {
89    E_Widget_Data *wd;
90    int mw, mh;
91
92    wd = e_widget_data_get(obj);
93    edje_object_part_text_set(wd->o_button, "e.text.label", label);
94    if ((label) && (label[0] != 0))
95      wd->type |= E_WIDGET_BUTTON_TEXT;
96    else
97      wd->type = ~(wd->type & E_WIDGET_BUTTON_TEXT);
98    _e_wid_button_state_send(wd);
99    edje_object_size_min_calc(wd->o_button, &mw, &mh);
100    e_widget_size_min_set(obj, mw, mh);
101 }
102
103 EAPI void
104 e_widget_button_icon_set(Evas_Object *obj, Evas_Object *icon)
105 {
106    E_Widget_Data *wd;
107    int mw, mh;
108
109    wd = e_widget_data_get(obj);
110    if (wd->o_icon)
111      {
112         e_widget_sub_object_del(obj, wd->o_icon);
113         evas_object_hide(wd->o_icon);
114         edje_object_part_unswallow(wd->o_button, wd->o_icon);
115         evas_object_del(wd->o_icon);
116         wd->o_icon = NULL;
117      }
118    if (icon)
119      {
120         wd->o_icon = icon;
121         edje_object_part_swallow(wd->o_button, "e.swallow.icon", icon);
122         evas_object_pass_events_set(icon, 1);
123         evas_object_show(icon);
124         e_widget_sub_object_add(obj, icon);
125         wd->type |= E_WIDGET_BUTTON_ICON;
126      }
127    else
128      wd->type = ~(wd->type & E_WIDGET_BUTTON_ICON);
129    _e_wid_button_state_send(wd);
130    edje_object_size_min_calc(wd->o_button, &mw, &mh);
131    e_widget_size_min_set(obj, mw, mh);
132 }
133
134 static void
135 _e_wid_del_hook(Evas_Object *obj)
136 {
137    E_Widget_Data *wd;
138
139    wd = e_widget_data_get(obj);
140    free(wd);
141 }
142
143 static void
144 _e_wid_focus_hook(Evas_Object *obj)
145 {
146    E_Widget_Data *wd;
147
148    wd = e_widget_data_get(obj);
149    if (e_widget_focus_get(obj))
150      {
151         edje_object_signal_emit(wd->o_button, "e,state,focused", "e");
152         evas_object_focus_set(wd->o_button, 1);
153      }
154    else
155      {
156         edje_object_signal_emit(wd->o_button, "e,state,unfocused", "e");
157         evas_object_focus_set(wd->o_button, 0);
158      }
159 }
160
161 static void
162 _e_wid_activate_hook(Evas_Object *obj)
163 {
164    E_Widget_Data *wd;
165
166    wd = e_widget_data_get(obj);
167    if (wd->func) wd->func(wd->data, wd->data2);
168 }
169
170 static void
171 _e_wid_disable_hook(Evas_Object *obj)
172 {
173    E_Widget_Data *wd;
174
175    wd = e_widget_data_get(obj);
176    if (e_widget_disabled_get(obj))
177      edje_object_signal_emit(wd->o_button, "e,state,disabled", "e");
178    else
179      edje_object_signal_emit(wd->o_button, "e,state,enabled", "e");
180 }
181
182 static void
183 _e_wid_signal_cb1(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
184 {
185    Evas_Object *wid;
186
187    wid = data;
188    if ((!wid) || (e_widget_disabled_get(wid))) return;
189    e_widget_focus_steal(wid);
190    e_widget_change(wid);
191    _e_wid_activate_hook(wid);
192 }
193
194 static void
195 _e_wid_focus_steal(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
196 {
197    e_widget_focus_steal(data);
198 }
199
200 static void
201 _e_wid_button_state_send(E_Widget_Data *wd)
202 {
203    if ((!wd) || (!wd->o_button)) return;
204    if (wd->type & E_WIDGET_BUTTON_TEXT)
205      {
206         if (wd->type & E_WIDGET_BUTTON_ICON)
207           edje_object_signal_emit(wd->o_button, "e,state,combo", "e");
208         else
209           edje_object_signal_emit(wd->o_button, "e,state,text", "e");
210      }
211    else if (wd->type & E_WIDGET_BUTTON_ICON)
212      edje_object_signal_emit(wd->o_button, "e,state,icon", "e");
213    edje_object_message_signal_process(wd->o_button);
214 }