tizen 2.4 release
[apps/home/attach-panel.git] / src / toolbar.c
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <Elementary.h>
18
19 #include "attach_panel.h"
20 #include "attach_panel_internal.h"
21 #include "conf.h"
22 #include "log.h"
23 #include "toolbar.h"
24
25
26
27 static const char *const PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST = "pdkec";
28
29
30
31 struct _event_cb {
32         int event_type;
33         void (*event_cb)(Evas_Object *toolbar, int event_type, void *event_info, void *user_data);
34         void *user_data;
35 };
36 typedef struct _event_cb event_cb_s;
37
38
39
40 static void __resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
41 {
42         Evas_Object *toolbar = obj;
43
44         int x, y, w, h;
45
46         ret_if(!toolbar);
47
48         evas_object_geometry_get(toolbar, &x, &y, &w, &h);
49         _D("toolbar resize(%d, %d, %d, %d)", x, y, w, h);
50 }
51
52
53
54 Evas_Object *_toolbar_create(Evas_Object *ui_manager, attach_panel_h attach_panel)
55 {
56         Evas_Object *toolbar = NULL;
57
58         retv_if(!ui_manager, NULL);
59         retv_if(!attach_panel, NULL);
60
61         toolbar = elm_toolbar_add(ui_manager);
62         goto_if(!toolbar, ERROR);
63
64         /* This will expand the transverse(horizontal) length of items according to the length of toolbar */
65         elm_toolbar_transverse_expanded_set(toolbar, EINA_TRUE);
66         elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
67         elm_toolbar_homogeneous_set(toolbar, EINA_FALSE);
68         elm_toolbar_select_mode_set(toolbar, ELM_OBJECT_SELECT_MODE_ALWAYS);
69         elm_object_style_set(toolbar, "light_view");
70         elm_object_focus_set(toolbar, EINA_TRUE);
71
72         evas_object_show(toolbar);
73         evas_object_data_set(toolbar, DATA_KEY_ATTACH_PANEL_INFO, attach_panel);
74
75         evas_object_event_callback_add(toolbar, EVAS_CALLBACK_RESIZE, __resize_cb, NULL);
76
77         return toolbar;
78
79 ERROR:
80         _toolbar_destroy(toolbar);
81         return NULL;
82 }
83
84
85
86 void _toolbar_destroy(Evas_Object *toolbar)
87 {
88         attach_panel_h attach_panel = NULL;
89
90         ret_if(!toolbar);
91
92         attach_panel = evas_object_data_del(toolbar, DATA_KEY_ATTACH_PANEL_INFO);
93         ret_if(!attach_panel);
94
95         evas_object_event_callback_del(toolbar, EVAS_CALLBACK_RESIZE, __resize_cb);
96         evas_object_del(toolbar);
97 }
98
99
100
101 static void __view_changed_cb(void *user_data, Evas_Object *obj, void *event_info)
102 {
103         Evas_Object *toolbar = obj;
104         Evas_Object *page = user_data;
105         Eina_List *event_cb_list = NULL;
106         const Eina_List *l = NULL;
107         const Eina_List *ln = NULL;
108         event_cb_s *event_cb_info = NULL;
109
110         ret_if(!toolbar);
111         ret_if(!page);
112
113         event_cb_list = evas_object_data_get(toolbar, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST);
114         ret_if(!event_cb_list);
115
116         EINA_LIST_FOREACH_SAFE(event_cb_list, l, ln, event_cb_info) {
117                 if (TOOLBAR_EVENT_TYPE_CHANGE_TAB == event_cb_info->event_type) {
118                         if (event_cb_info->event_cb) {
119                                 event_cb_info->event_cb(toolbar, TOOLBAR_EVENT_TYPE_CHANGE_TAB, page, event_cb_info->user_data);
120                         }
121                 }
122         }
123 }
124
125
126
127 Elm_Object_Item *_toolbar_append_item(Evas_Object *toolbar, const char *tab_name, Evas_Object *page)
128 {
129         Elm_Object_Item *tab_item = NULL;
130
131         retv_if(!toolbar, NULL);
132         retv_if(!tab_name, NULL);
133
134         tab_item = elm_toolbar_item_append(toolbar, NULL, tab_name, __view_changed_cb, page);
135         elm_object_item_domain_text_translatable_set(tab_item, PACKAGE, EINA_TRUE);
136         retv_if(!tab_item, NULL);
137
138         return tab_item;
139 }
140
141
142
143 void _toolbar_remove_item(Evas_Object *toolbar, Elm_Object_Item *tabbar_item)
144 {
145         ret_if(!toolbar);
146         ret_if(!tabbar_item);
147
148         elm_object_item_del(tabbar_item);
149
150         /* If the selected item is removed, we have to activate the current */
151 }
152
153
154
155 void _toolbar_bring_in(Evas_Object *toolbar, Elm_Object_Item *tabbar_item)
156 {
157         Elm_Object_Item *selected_item = NULL;
158
159         ret_if(!toolbar);
160         ret_if(!tabbar_item);
161
162         selected_item = elm_toolbar_selected_item_get(toolbar);
163         if (selected_item && selected_item == tabbar_item) {
164                 return;
165         }
166
167         elm_toolbar_item_selected_set(tabbar_item, EINA_TRUE);
168         elm_object_focus_set(toolbar, EINA_TRUE);
169 }
170
171
172
173 unsigned int _toolbar_count_item(Evas_Object *toolbar)
174 {
175         retv_if(!toolbar, 0);
176
177         return elm_toolbar_items_count(toolbar);
178 }
179
180
181
182 int _toolbar_register_event_cb(Evas_Object *toolbar, int event_type, void (*event_cb)(Evas_Object *toolbar, int event_type, void *event_info, void *user_data), void *user_data)
183 {
184         Eina_List *event_cb_list = NULL;
185         event_cb_s *event_cb_info = NULL;
186
187         retv_if(!toolbar, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
188         retv_if(event_type <= TOOLBAR_EVENT_TYPE_INVALID, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
189         retv_if(event_type >= TOOLBAR_EVENT_TYPE_MAX, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
190         retv_if(!event_cb, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
191
192         event_cb_info = calloc(1, sizeof(event_cb_s));
193         retv_if(!event_cb_info, ATTACH_PANEL_ERROR_OUT_OF_MEMORY);
194
195         event_cb_info->event_type = event_type;
196         event_cb_info->event_cb = event_cb;
197         event_cb_info->user_data = user_data;
198
199         event_cb_list = evas_object_data_get(toolbar, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST);
200         event_cb_list = eina_list_append(event_cb_list, event_cb_info);
201         evas_object_data_set(toolbar, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST, event_cb_list);
202
203         return ATTACH_PANEL_ERROR_NONE;
204 }
205
206
207
208 int _toolbar_unregister_event_cb(Evas_Object *toolbar, int event_type, void (*event_cb)(Evas_Object *toolbar, int event_type, void *event_info, void *user_data))
209 {
210         Eina_List *event_cb_list = NULL;
211         const Eina_List *l = NULL;
212         const Eina_List *ln = NULL;
213         event_cb_s *event_cb_info = NULL;
214
215         retv_if(!toolbar, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
216         retv_if(event_type <= TOOLBAR_EVENT_TYPE_INVALID, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
217         retv_if(event_type >= TOOLBAR_EVENT_TYPE_MAX, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
218         retv_if(!event_cb, ATTACH_PANEL_ERROR_INVALID_PARAMETER);
219
220         event_cb_list = evas_object_data_get(toolbar, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST);
221         retv_if(!event_cb_list, ATTACH_PANEL_ERROR_NOT_INITIALIZED);
222
223         EINA_LIST_FOREACH_SAFE(event_cb_list, l, ln, event_cb_info) {
224                 if (event_cb_info->event_type == event_type
225                         && event_cb_info->event_cb == event_cb) {
226                         event_cb_list = eina_list_remove(event_cb_list, event_cb_info);
227                         break;
228                 }
229         }
230
231         evas_object_data_set(toolbar, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST, event_cb_list);
232
233         return ATTACH_PANEL_ERROR_NONE;
234 }