2 * Copyright (c) 2016 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.
20 #include <Elementary.h>
24 #include "w-input-keyboard.h"
25 #include "w-input-selector.h"
27 extern InputKeyboardData g_input_keyboard_data;
28 extern App_Data* app_data;
32 bool input_keyboard_init(app_control_h app_control)
35 char *default_text = NULL;
36 char *guide_text = NULL;
37 char *return_key_type = _("IDS_AMEMO_BUTTON_SEND");
38 char *max_text_length = NULL;
39 char *cursor_position_set = NULL;
41 input_keyboard_deinit();
43 ret = app_control_get_extra_data(app_control, APP_CONTROL_DATA_INPUT_DEFAULT_TEXT, &default_text);
44 if (ret == APP_CONTROL_ERROR_NONE) {
45 g_input_keyboard_data.default_text = default_text;
47 ret = app_control_get_extra_data(app_control, APP_CONTROL_DATA_INPUT_GUIDE_TEXT, &guide_text);
48 if (ret == APP_CONTROL_ERROR_NONE) {
49 g_input_keyboard_data.guide_text = guide_text;
51 ret = app_control_get_extra_data(app_control, "return_key_type", &return_key_type);
52 if (ret == APP_CONTROL_ERROR_NONE) {
53 g_input_keyboard_data.return_key_type = return_key_type;
55 ret = app_control_get_extra_data(app_control, "max_text_length", &max_text_length);
56 if (ret == APP_CONTROL_ERROR_NONE) {
57 g_input_keyboard_data.max_text_length = atoi(max_text_length);
58 free(max_text_length);
60 ret = app_control_get_extra_data(app_control, "cursor_position_set", &cursor_position_set);
61 if (ret == APP_CONTROL_ERROR_NONE) {
62 g_input_keyboard_data.cursor_position_set = atoi(cursor_position_set);
63 free(cursor_position_set);
69 void input_keyboard_deinit(void)
71 if (g_input_keyboard_data.guide_text)
72 free(g_input_keyboard_data.guide_text);
74 if (g_input_keyboard_data.default_text)
75 free(g_input_keyboard_data.default_text);
77 if (g_input_keyboard_data.return_key_type)
78 free(g_input_keyboard_data.return_key_type);
80 g_input_keyboard_data.default_text = NULL;
81 g_input_keyboard_data.guide_text = NULL;
82 g_input_keyboard_data.return_key_type = _("IDS_AMEMO_BUTTON_SEND");
83 g_input_keyboard_data.max_text_length = KEYBOARD_EDITOR_CHAR_COUNT_MAX;
84 g_input_keyboard_data.cursor_position_set = 0;
91 app_control_h app_control;
92 int ret = app_control_create(&app_control);
93 if (ret != APP_CONTROL_ERROR_NONE) {
94 PRINTFUNC(DLOG_ERROR, "Can not create app_control : %d", ret);
98 const char *getText = elm_entry_entry_get(entry);
99 SECURE_LOGD("button key clicked!! : getText = %s", getText);
101 char cursorPosition[512];
102 snprintf(cursorPosition, sizeof(cursorPosition), "%d", elm_entry_cursor_pos_get(entry));
105 app_control_get_caller(app_data->source_app_control, &app_id);
107 app_control_set_app_id(app_control, app_id);
108 app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
109 set_source_caller_app_id(app_control);
111 reply_to_sender_by_callback(getText, "keyboard", NULL, cursorPosition);
115 void btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
120 static Eina_Bool custom_back_cb(void *data, Elm_Object_Item *it)
122 _back_to_genlist_for_selector();
126 static void maxlength_cb(void *data, Evas_Object *obj, void *event_info)
128 LOGD("maxlength_cb : size = %d", KEYBOARD_EDITOR_CHAR_COUNT_MAX);
130 const char *guide = _(MAX_TEXT_LENGTH_REACH);
131 snprintf(text, sizeof(text), guide, g_input_keyboard_data.max_text_length);
132 show_popup_toast((const char *)text, false);
135 static void enter_keydown_cb(void *data, Evas_Object *obj, void *event_info)
137 LOGD("enter_keydown_cb");
138 Evas_Object *entry = obj;
142 Ecore_IMF_Context *imf_context = NULL;
143 imf_context = (Ecore_IMF_Context*)elm_entry_imf_context_get(entry);
145 ecore_imf_context_input_panel_hide(imf_context);
147 elm_object_focus_set(entry, EINA_FALSE);
152 void create_fullscreen_editor(void *data)
154 App_Data *ad = (App_Data *)data;
156 Evas_Object *box = elm_box_add(ad->naviframe);
157 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
158 evas_object_show(box);
159 elm_win_resize_object_add(ad->naviframe, box);
161 entry = elm_entry_add(box);
163 static Elm_Entry_Filter_Limit_Size limit_filter_data;
164 limit_filter_data.max_char_count = g_input_keyboard_data.max_text_length;
165 elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data);
166 evas_object_smart_callback_add(entry, "maxlength,reached", maxlength_cb, data);
168 elm_entry_single_line_set(entry, EINA_TRUE);
169 elm_entry_scrollable_set(entry, EINA_TRUE);
170 elm_scroller_policy_set(entry, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
171 elm_object_part_text_set(entry, "elm.guide", g_input_keyboard_data.guide_text);
172 elm_entry_entry_set(entry, g_input_keyboard_data.default_text);
173 elm_entry_cursor_end_set(entry);
174 evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
175 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
176 if (g_input_keyboard_data.return_key_type && strcmp(g_input_keyboard_data.return_key_type, "DONE") == 0) {
177 elm_entry_input_panel_return_key_type_set(entry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE);
178 evas_object_smart_callback_add(entry, "activated", enter_keydown_cb, ad);
180 if (g_input_keyboard_data.cursor_position_set != 0) {
181 elm_entry_cursor_pos_set(entry, g_input_keyboard_data.cursor_position_set);
183 evas_object_show(entry);
184 elm_box_pack_end(box, entry);
186 Evas_Object *btn = elm_button_add(box);
187 elm_object_text_set(btn, g_input_keyboard_data.return_key_type);
188 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.5);
189 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
190 evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, NULL);
191 evas_object_show(btn);
192 elm_box_pack_end(box, btn);
193 evas_object_resize(ad->naviframe, 360, 360);
194 evas_object_show(ad->naviframe);
196 const char *item_style = NULL;
198 item_style = "empty";
199 Elm_Object_Item *nf_item = elm_naviframe_item_push(ad->naviframe, NULL, NULL, NULL, box, item_style);
200 elm_naviframe_item_pop_cb_set(nf_item, custom_back_cb, NULL);
203 static void editfield_focused_cb(void *data, Evas_Object *obj, void *event_info)
205 Evas_Object *editfield = (Evas_Object *)data;
206 elm_object_signal_emit(editfield, "elm,state,focused", "");
208 if (!elm_entry_is_empty(obj))
209 elm_object_signal_emit(editfield, "elm,action,show,button", "");
212 static void editfield_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
214 Evas_Object *editfield = (Evas_Object *)data;
215 elm_object_signal_emit(editfield, "elm,state,unfocused", "");
216 elm_object_signal_emit(editfield, "elm,action,hide,button", "");
219 static Evas_Object *create_multiline_editfield_layout(Evas_Object *parent, void *data)
221 App_Data *ad = (App_Data *)data;
222 Evas_Object *editfield;
224 editfield = elm_layout_add(parent);
225 elm_layout_theme_set(editfield, "layout", "editfield", "multiline");
226 evas_object_size_hint_align_set(editfield, EVAS_HINT_FILL, 0.0);
227 evas_object_size_hint_weight_set(editfield, EVAS_HINT_EXPAND, 0.0);
229 entry = elm_entry_add(editfield);
230 static Elm_Entry_Filter_Limit_Size limit_filter_data;
231 limit_filter_data.max_char_count = g_input_keyboard_data.max_text_length;
232 elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data);
233 evas_object_smart_callback_add(entry, "maxlength,reached", maxlength_cb, data);
235 elm_entry_scrollable_set(entry, EINA_TRUE);
236 elm_scroller_policy_set(entry, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
237 elm_object_part_text_set(entry, "elm.guide", g_input_keyboard_data.guide_text);
238 elm_entry_entry_set(entry, g_input_keyboard_data.default_text);
239 elm_entry_cursor_end_set(entry);
240 evas_object_smart_callback_add(entry, "focused", editfield_focused_cb, editfield);
241 evas_object_smart_callback_add(entry, "unfocused", editfield_unfocused_cb, editfield);
242 if (g_input_keyboard_data.return_key_type && strcmp(g_input_keyboard_data.return_key_type, "DONE") == 0) {
243 elm_entry_input_panel_return_key_type_set(entry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE);
244 evas_object_smart_callback_add(entry, "activated", enter_keydown_cb, ad);
246 if (g_input_keyboard_data.cursor_position_set != 0) {
247 elm_entry_cursor_pos_set(entry, g_input_keyboard_data.cursor_position_set);
250 evas_object_show(entry);
251 elm_object_part_content_set(editfield, "elm.swallow.content", entry);
256 static Evas_Object *create_editfield_view(void *data)
258 App_Data *ad = (App_Data *)data;
260 Evas_Object *main_scroller, *main_box, *editfield;
262 main_scroller = elm_scroller_add(ad->naviframe);
263 elm_scroller_bounce_set(main_scroller, EINA_FALSE, EINA_TRUE);
264 evas_object_size_hint_weight_set(main_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
265 evas_object_size_hint_align_set(main_scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
266 evas_object_show(main_scroller);
268 main_box = elm_box_add(main_scroller);
269 evas_object_size_hint_align_set(main_box, EVAS_HINT_FILL, 0.0);
270 evas_object_size_hint_weight_set(main_box, EVAS_HINT_EXPAND, 0.0);
271 evas_object_show(main_box);
273 editfield = create_multiline_editfield_layout(main_box, data);
274 elm_box_pack_end(main_box, editfield);
275 evas_object_show(editfield);
277 Evas_Object *btn = elm_button_add(main_box);
278 elm_object_text_set(btn, "OK");
279 evas_object_size_hint_weight_set(btn, 0.5, 0.5);
280 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
281 evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, NULL);
282 evas_object_show(btn);
283 elm_box_pack_end(main_box, btn);
285 elm_object_content_set(main_scroller, main_box);
287 evas_object_show(ad->naviframe);
288 const char *item_style = NULL;
290 item_style = "empty";
291 Elm_Object_Item *nf_item = elm_naviframe_item_push(ad->naviframe, NULL, NULL, NULL, main_scroller, item_style);
292 elm_naviframe_item_pop_cb_set(nf_item, custom_back_cb, NULL);
294 return main_scroller;
297 bool input_keyboard_launch(Evas_Object *window, void *data) {
298 if (window == NULL) {
299 PRINTFUNC(DLOG_ERROR, "Can not get window");
304 create_fullscreen_editor(data);
306 create_editfield_view(data);