Tizen 2.1 base
[apps/core/preloaded/calendar.git] / common / searchbar.c
1 /*
2   *
3   *  Copyright 2012  Samsung Electronics Co., Ltd
4   *
5   *  Licensed under the Flora License, Version 1.0 (the "License");
6   *  you may not use this file except in compliance with the License.
7   *  You may obtain a copy of the License at
8   *
9   *       http://floralicense.org/license/
10   *
11   *  Unless required by applicable law or agreed to in writing, software
12   *  distributed under the License is distributed on an "AS IS" BASIS,
13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   *  See the License for the specific language governing permissions and
15   *  limitations under the License.
16   */
17
18 #include "searchbar.h"
19
20 static void __cal_util_searchbar_changed_callback(void *data, Evas_Object *obj, void *event_info)
21 {
22         c_ret_if(!data);
23         c_ret_if(!obj);
24
25         if (elm_object_focus_get(data)) {
26                 if (elm_entry_is_empty(obj))
27                         elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
28                 else
29                         elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
30         } else {
31                 if (elm_entry_is_empty(obj))
32                         elm_object_signal_emit(data, "elm,state,guidetext,show", "elm");
33                 else
34                         elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
35         }
36 }
37
38 static void __cal_util_searchbar_with_cancel_btn_focused_callback(void *data, Evas_Object *obj, void *event_info)
39 {
40         c_retm_if(!data, "data is null");
41         c_retm_if(!obj, "obj is null");
42
43         if (!elm_entry_is_empty(obj))
44                 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
45
46         elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
47
48         elm_object_signal_emit(data, "cancel,in", "");
49 }
50
51 static void __cal_util_searchbar_focused_callback(void *data, Evas_Object *obj, void *event_info)
52 {
53         c_retm_if(!data, "data is null");
54         c_retm_if(!obj, "obj is null");
55
56         elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
57
58         elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
59 }
60
61 static void __cal_util_searchbar_eraser_clicked_callback(void *data, Evas_Object *obj, const char *emission, const char *source) // When X marked button is clicked, empty entry's contents.
62 {
63         c_retm_if(!data, "data is null");
64
65         elm_entry_entry_set(data, "");
66 }
67
68 static void __cal_util_searchbar_cancel_btn_clicked_callback(void *data, Evas_Object *obj, void *event_info)
69 {
70         c_retm_if(!data, "data is null");
71
72         c_retm_if(!obj, "obj is null");
73
74         Evas_Object *searchbar_layout = data;
75         Evas_Object *entry = elm_object_part_content_get(searchbar_layout, "elm.swallow.content");
76         c_retm_if(!entry, "entry is null");
77
78         evas_object_hide(obj);
79
80         elm_entry_input_panel_hide(entry);
81
82         elm_entry_entry_set(entry, NULL);
83
84         elm_object_focus_set(entry, EINA_FALSE);
85 }
86
87 static void __cal_util_searchbar_unfocused_callback(void *data, Evas_Object *obj, void *event_info)
88 {
89         c_ret_if(!data);
90         c_ret_if(!obj);
91
92         if (elm_entry_is_empty(obj))
93                 elm_object_signal_emit(data, "elm,state,guidetext,show", "elm");
94
95         elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
96
97         elm_object_signal_emit(data, "cancel,out", "");
98 }
99
100 static void __cal_util_searchbar_symbol_clicked_callback(void *data, Evas_Object *obj, const char *emission, const char *source)
101 {
102         c_retm_if(!data, "data is null");
103
104         elm_object_focus_set(data, EINA_TRUE);
105 }
106
107 static void __cal_util_searchbar_bg_clicked_callback(void *data, Evas_Object *obj, const char *emission, const char *source)
108 {
109         c_retm_if(!data, "data is null");
110
111         elm_object_focus_set(data, EINA_TRUE);
112 }
113
114 Evas_Object * cal_util_add_searchbar(Evas_Object *parent, const char *text,  const char *guide,
115                         Eina_Bool cancel_button, Evas_Smart_Cb cancel_callback, void* cancel_callback_data)
116 {
117         c_retvm_if(!parent, NULL, "parent is null");
118
119         Evas_Object *searchbar_layout = elm_layout_add(parent);
120         c_retvm_if(!searchbar_layout, NULL, "searchbar_layout is null");
121
122         if (cancel_button)
123                 elm_layout_theme_set(searchbar_layout, "layout", "searchbar", "cancel_button");
124         else
125                 elm_layout_theme_set(searchbar_layout, "layout", "searchbar", "default");
126
127         Evas_Object *entry = elm_entry_add(searchbar_layout);
128         c_retvm_if(!entry, searchbar_layout, "entry is null");
129
130         elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT);
131         evas_object_show(entry);
132
133         elm_entry_scrollable_set(entry, EINA_TRUE);
134         elm_entry_single_line_set(entry, EINA_TRUE);
135         ecore_imf_context_input_panel_return_key_type_set(elm_entry_imf_context_get(entry), ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_SEARCH);
136
137         elm_object_part_content_set(searchbar_layout, "elm.swallow.content", entry);
138
139         if (guide && strlen(guide))
140                 elm_object_part_text_set(searchbar_layout, "elm.guidetext", guide);
141         else
142                 elm_object_part_text_set(searchbar_layout, "elm.guidetext", S_("IDS_COM_BODY_SEARCH"));
143
144         if (text && strlen(text))
145                 elm_object_text_set(entry, text);
146
147         if (cancel_button) {
148                 Evas_Object *cancel_btn = elm_button_add(searchbar_layout);
149                 c_retvm_if(!cancel_btn, searchbar_layout, "cancel_btn is null");
150
151                 elm_object_part_content_set(searchbar_layout, "button_cancel", cancel_btn);
152                 elm_object_style_set(cancel_btn, "searchbar/default");
153                 elm_object_text_set(cancel_btn, S_("IDS_COM_SK_CANCEL"));
154
155                 evas_object_smart_callback_add(entry, "focused", __cal_util_searchbar_with_cancel_btn_focused_callback, searchbar_layout);
156                 if (cancel_callback == NULL)
157                         evas_object_smart_callback_add(cancel_btn, "clicked", __cal_util_searchbar_cancel_btn_clicked_callback, searchbar_layout);
158                 else
159                         evas_object_smart_callback_add(cancel_btn, "clicked", cancel_callback, cancel_callback_data);
160         }
161         else {
162                 evas_object_smart_callback_add(entry, "focused", __cal_util_searchbar_focused_callback, searchbar_layout);
163         }
164
165         evas_object_smart_callback_add(entry, "changed", __cal_util_searchbar_changed_callback, searchbar_layout);
166         evas_object_smart_callback_add(entry, "preedit,changed", __cal_util_searchbar_changed_callback, searchbar_layout);
167         evas_object_smart_callback_add(entry, "unfocused", __cal_util_searchbar_unfocused_callback, searchbar_layout);
168         elm_object_signal_callback_add(searchbar_layout, "elm,eraser,clicked", "elm", __cal_util_searchbar_eraser_clicked_callback, entry);
169         elm_object_signal_callback_add(searchbar_layout, "elm,bg,clicked", "elm", __cal_util_searchbar_bg_clicked_callback, entry);
170         elm_object_signal_callback_add(searchbar_layout, "elm,action,click", "", __cal_util_searchbar_symbol_clicked_callback, entry);
171
172         return searchbar_layout;
173 }