2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #include <Elementary.h>
19 #include "attach_panel.h"
20 #include "attach_panel_internal.h"
27 static const char *const PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST = "pdkec";
33 void (*event_cb)(Evas_Object *toolbar, int event_type, void *event_info, void *user_data);
36 typedef struct _event_cb event_cb_s;
40 static void __resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
42 Evas_Object *toolbar = obj;
48 evas_object_geometry_get(toolbar, &x, &y, &w, &h);
49 _D("toolbar resize(%d, %d, %d, %d)", x, y, w, h);
54 Evas_Object *_toolbar_create(Evas_Object *ui_manager, attach_panel_h attach_panel)
56 Evas_Object *toolbar = NULL;
58 retv_if(!ui_manager, NULL);
59 retv_if(!attach_panel, NULL);
61 toolbar = elm_toolbar_add(ui_manager);
62 goto_if(!toolbar, ERROR);
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);
72 evas_object_show(toolbar);
73 evas_object_data_set(toolbar, DATA_KEY_ATTACH_PANEL_INFO, attach_panel);
75 evas_object_event_callback_add(toolbar, EVAS_CALLBACK_RESIZE, __resize_cb, NULL);
80 _toolbar_destroy(toolbar);
86 void _toolbar_destroy(Evas_Object *toolbar)
88 attach_panel_h attach_panel = NULL;
92 attach_panel = evas_object_data_del(toolbar, DATA_KEY_ATTACH_PANEL_INFO);
93 ret_if(!attach_panel);
95 evas_object_event_callback_del(toolbar, EVAS_CALLBACK_RESIZE, __resize_cb);
96 evas_object_del(toolbar);
101 static void __view_changed_cb(void *user_data, Evas_Object *obj, void *event_info)
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;
113 event_cb_list = evas_object_data_get(toolbar, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST);
114 ret_if(!event_cb_list);
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);
127 Elm_Object_Item *_toolbar_append_item(Evas_Object *toolbar, const char *tab_name, Evas_Object *page)
129 Elm_Object_Item *tab_item = NULL;
131 retv_if(!toolbar, NULL);
132 retv_if(!tab_name, NULL);
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);
143 void _toolbar_remove_item(Evas_Object *toolbar, Elm_Object_Item *tabbar_item)
146 ret_if(!tabbar_item);
148 elm_object_item_del(tabbar_item);
150 /* If the selected item is removed, we have to activate the current */
155 void _toolbar_bring_in(Evas_Object *toolbar, Elm_Object_Item *tabbar_item)
157 Elm_Object_Item *selected_item = NULL;
160 ret_if(!tabbar_item);
162 selected_item = elm_toolbar_selected_item_get(toolbar);
163 if (selected_item && selected_item == tabbar_item) {
167 elm_toolbar_item_selected_set(tabbar_item, EINA_TRUE);
168 elm_object_focus_set(toolbar, EINA_TRUE);
173 unsigned int _toolbar_count_item(Evas_Object *toolbar)
175 retv_if(!toolbar, 0);
177 return elm_toolbar_items_count(toolbar);
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)
184 Eina_List *event_cb_list = NULL;
185 event_cb_s *event_cb_info = NULL;
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);
192 event_cb_info = calloc(1, sizeof(event_cb_s));
193 retv_if(!event_cb_info, ATTACH_PANEL_ERROR_OUT_OF_MEMORY);
195 event_cb_info->event_type = event_type;
196 event_cb_info->event_cb = event_cb;
197 event_cb_info->user_data = user_data;
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);
203 return ATTACH_PANEL_ERROR_NONE;
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))
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;
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);
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);
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);
231 evas_object_data_set(toolbar, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST, event_cb_list);
233 return ATTACH_PANEL_ERROR_NONE;