d7e2bf240dbd5567f094590e80cc7c741c95a993
[platform/core/uifw/inputdelegator.git] / src / w-input-keyboard.cpp
1 /*
2  * Copyright (c) 2016 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 "Debug.h"
18
19 #include <app.h>
20 #include <Elementary.h>
21
22 #include <stdlib.h>
23
24 #include "w-input-keyboard.h"
25 #include "w-input-selector.h"
26
27 extern InputKeyboardData g_input_keyboard_data;
28 extern App_Data* app_data;
29
30 Evas_Object *entry;
31
32 bool input_keyboard_init(app_control_h app_control)
33 {
34         int ret = -1;
35         char *default_text = NULL;
36         char *guide_text = NULL;
37
38         input_keyboard_deinit();
39
40         ret = app_control_get_extra_data(app_control, APP_CONTROL_DATA_INPUT_DEFAULT_TEXT, &default_text);
41         if (ret == APP_CONTROL_ERROR_NONE) {
42                 g_input_keyboard_data.default_text = default_text;
43         }
44         ret = app_control_get_extra_data(app_control, APP_CONTROL_DATA_INPUT_GUIDE_TEXT, &guide_text);
45         if (ret == APP_CONTROL_ERROR_NONE) {
46                 g_input_keyboard_data.guide_text = guide_text;
47         }
48
49         return true;
50 }
51
52 void input_keyboard_deinit(void)
53 {
54         if (g_input_keyboard_data.guide_text)
55                 free(g_input_keyboard_data.guide_text);
56
57         if (g_input_keyboard_data.default_text)
58                 free(g_input_keyboard_data.default_text);
59
60         g_input_keyboard_data.default_text = NULL;
61         g_input_keyboard_data.guide_text = NULL;
62
63         return;
64 }
65
66 void btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
67 {
68         app_control_h app_control;
69         int ret = app_control_create(&app_control);
70         if (ret != APP_CONTROL_ERROR_NONE) {
71                 PRINTFUNC(DLOG_ERROR, "Can not create app_control : %d", ret);
72                 return;
73         }
74
75         const char *getText = elm_entry_entry_get(entry);
76         LOGD("button key clicked!! : getText = %s", getText);
77
78         char *app_id = NULL;
79         app_control_get_caller(app_data->source_app_control, &app_id);
80         if (app_id != NULL)
81                 app_control_set_app_id(app_control, app_id);
82         app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
83         set_source_caller_app_id(app_control);
84         free(app_id);
85         reply_to_sender_by_callback(getText, "keyboard");
86         elm_exit();
87 }
88
89 static Eina_Bool custom_back_cb(void *data, Elm_Object_Item *it)
90 {
91         _back_to_genlist_for_selector();
92         return EINA_TRUE;
93 }
94
95 static void maxlength_cb(void *data, Evas_Object *obj, void *event_info)
96 {
97         LOGD("maxlength_cb : size = %d", KEYBOARD_EDITOR_CHAR_COUNT_MAX);
98 }
99
100 void create_fullscreen_editor(void *data)
101 {
102         App_Data *ad = (App_Data *)data;
103
104         Evas_Object *box = elm_box_add(ad->naviframe);
105         evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
106         evas_object_show(box);
107         elm_win_resize_object_add(ad->naviframe, box);
108
109         entry = elm_entry_add(box);
110
111         static Elm_Entry_Filter_Limit_Size limit_filter_data;
112         limit_filter_data.max_char_count = KEYBOARD_EDITOR_CHAR_COUNT_MAX;
113         elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data);
114         evas_object_smart_callback_add(entry, "maxlength,reached", maxlength_cb, data);
115
116         elm_entry_single_line_set(entry, EINA_TRUE);
117         elm_entry_scrollable_set(entry, EINA_TRUE);
118         elm_scroller_policy_set(entry, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
119         elm_object_part_text_set(entry, "elm.guide", g_input_keyboard_data.guide_text);
120         elm_entry_entry_set(entry, g_input_keyboard_data.default_text);
121         elm_entry_cursor_end_set(entry);
122         evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
123         evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
124         evas_object_show(entry);
125         elm_box_pack_end(box, entry);
126
127         Evas_Object *btn = elm_button_add(box);
128         elm_object_text_set(btn, "SEND");
129         evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.5);
130         evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
131         evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, NULL);
132         evas_object_show(btn);
133         elm_box_pack_end(box, btn);
134         evas_object_resize(ad->naviframe, 360, 360);
135         evas_object_show(ad->naviframe);
136
137         const char *item_style = NULL;
138         if (_WEARABLE)
139                 item_style = "empty";
140         Elm_Object_Item *nf_item = elm_naviframe_item_push(ad->naviframe, NULL, NULL, NULL, box, item_style);
141         elm_naviframe_item_pop_cb_set(nf_item, custom_back_cb, NULL);
142 }
143
144 static void editfield_focused_cb(void *data, Evas_Object *obj, void *event_info)
145 {
146         Evas_Object *editfield = (Evas_Object *)data;
147         elm_object_signal_emit(editfield, "elm,state,focused", "");
148
149         if (!elm_entry_is_empty(obj))
150                 elm_object_signal_emit(editfield, "elm,action,show,button", "");
151 }
152
153 static void editfield_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
154 {
155         Evas_Object *editfield = (Evas_Object *)data;
156         elm_object_signal_emit(editfield, "elm,state,unfocused", "");
157         elm_object_signal_emit(editfield, "elm,action,hide,button", "");
158 }
159
160 static Evas_Object *create_multiline_editfield_layout(Evas_Object *parent, void *data)
161 {
162         Evas_Object *editfield;
163
164         editfield = elm_layout_add(parent);
165         elm_layout_theme_set(editfield, "layout", "editfield", "multiline");
166         evas_object_size_hint_align_set(editfield, EVAS_HINT_FILL, 0.0);
167         evas_object_size_hint_weight_set(editfield, EVAS_HINT_EXPAND, 0.0);
168
169         entry = elm_entry_add(editfield);
170         static Elm_Entry_Filter_Limit_Size limit_filter_data;
171         limit_filter_data.max_char_count = KEYBOARD_EDITOR_CHAR_COUNT_MAX;
172         elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data);
173         evas_object_smart_callback_add(entry, "maxlength,reached", maxlength_cb, data);
174
175         elm_object_part_text_set(entry, "elm.guide", g_input_keyboard_data.guide_text);
176         evas_object_smart_callback_add(entry, "focused", editfield_focused_cb, editfield);
177         evas_object_smart_callback_add(entry, "unfocused", editfield_unfocused_cb, editfield);
178         elm_object_part_content_set(editfield, "elm.swallow.content", entry);
179
180         return editfield;
181 }
182
183 static Evas_Object *create_editfield_view(void *data)
184 {
185         App_Data *ad = (App_Data *)data;
186
187         Evas_Object *main_scroller, *main_box, *editfield;
188
189         main_scroller = elm_scroller_add(ad->naviframe);
190         elm_scroller_bounce_set(main_scroller, EINA_FALSE, EINA_TRUE);
191         evas_object_size_hint_weight_set(main_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
192         evas_object_size_hint_align_set(main_scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
193         evas_object_show(main_scroller);
194
195         main_box = elm_box_add(main_scroller);
196         evas_object_size_hint_align_set(main_box, EVAS_HINT_FILL, 0.0);
197         evas_object_size_hint_weight_set(main_box, EVAS_HINT_EXPAND, 0.0);
198         evas_object_show(main_box);
199
200         editfield = create_multiline_editfield_layout(main_box, data);
201         elm_box_pack_end(main_box, editfield);
202         evas_object_show(editfield);
203
204         Evas_Object *btn = elm_button_add(main_box);
205         elm_object_text_set(btn, "OK");
206         evas_object_size_hint_weight_set(btn, 0.5, 0.5);
207         evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
208         evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, NULL);
209         evas_object_show(btn);
210         elm_box_pack_end(main_box, btn);
211
212         elm_object_content_set(main_scroller, main_box);
213
214         evas_object_show(ad->naviframe);
215         const char *item_style = NULL;
216         if (_WEARABLE)
217                 item_style = "empty";
218         Elm_Object_Item *nf_item = elm_naviframe_item_push(ad->naviframe, NULL, NULL, NULL, main_scroller, item_style);
219         elm_naviframe_item_pop_cb_set(nf_item, custom_back_cb, NULL);
220
221         return main_scroller;
222 }
223
224 bool input_keyboard_launch(Evas_Object *window, void *data) {
225         if (window == NULL) {
226                 PRINTFUNC(DLOG_ERROR, "Can not get window");
227                 return false;
228         }
229
230         if (_WEARABLE)
231                 create_fullscreen_editor(data);
232         else
233                 create_editfield_view(data);
234
235         return true;
236 }
237