[Telegram] Modify the push type; pack_end and pack_start
[apps/native/telegram-tizen.git] / TelegramTizen / src / contact_selection_view.c
1 /*
2     This file is part of Telegram application for tizen
3
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Lesser General Public
6     License as published by the Free Software Foundation; either
7     version 2.1 of the License, or (at your option) any later version.
8
9     This library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12     Lesser General Public License for more details.
13
14     You should have received a copy of the GNU Lesser General Public
15     License along with this library; if not, write to the Free Software
16     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17 */
18
19 #include "contact_selection_view.h"
20 #include "group_chat_entry_view.h"
21 #include "ucol.h"
22
23 static Evas_Object* create_image_object_from_file(const char *icon_name, Evas_Object *parent)
24 {
25         Evas_Object *icon = elm_image_add(parent);
26         evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
27         evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
28         elm_image_file_set(icon, icon_name, NULL);
29         evas_object_show(icon);
30         return icon;
31 }
32
33 void on_buddy_selected(void *data, Evas_Object *obj, void *event_info)
34 {
35         Elm_Object_Item *it = event_info;
36         elm_genlist_item_selected_set(it, EINA_FALSE);
37         Evas_Object *layout = elm_object_item_part_content_get(event_info, "elm.swallow.end");
38         Evas_Object *checkbox = elm_object_part_content_get(layout, "elm.swallow.content");
39         Eina_Bool checked = elm_check_state_get(checkbox);
40         checked = !checked;
41         elm_check_state_set(checkbox, checked);
42
43         int id = (int)data;
44         appdata_s* ad = evas_object_data_get(obj, "app_data");
45
46         if (ad && ad->buddy_list && eina_list_count(ad->buddy_list) > 0) {
47                 if (id == 0) {
48                         for (int i = 0 ; i < eina_list_count(ad->buddy_list) ; i++) {
49                                 user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, i);
50                                 user_data_s* user = item->use_data;
51                                 user->is_selected = checked;
52
53
54                                 Elm_Object_Item* list_item = elm_genlist_nth_item_get(obj, i+1);
55                                 if (list_item) {
56                                         elm_genlist_item_selected_set(list_item, EINA_FALSE);
57                                         Evas_Object *llayout = elm_object_item_part_content_get(list_item, "elm.swallow.end");
58                                         Evas_Object *lcheckbox = elm_object_part_content_get(llayout, "elm.swallow.content");
59                                         elm_check_state_set(lcheckbox, checked);
60                                 }
61                         }
62                 } else {
63                         user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, id - 1);
64                         user_data_s* user = item->use_data;
65                         user->is_selected = checked;
66
67                         if (!checked) {
68                                 Elm_Object_Item* list_item = elm_genlist_nth_item_get(obj, 0);
69                                 if (list_item) {
70                                         elm_genlist_item_selected_set(list_item, EINA_FALSE);
71                                         Evas_Object *llayout = elm_object_item_part_content_get(list_item, "elm.swallow.end");
72                                         Evas_Object *lcheckbox = elm_object_part_content_get(llayout, "elm.swallow.content");
73                                         elm_check_state_set(lcheckbox, EINA_FALSE);
74                                 }
75                         } else {
76                                 Eina_Bool all_items_selected = EINA_TRUE;
77                                 for (int i = 0 ; i < eina_list_count(ad->buddy_list) ; i++) {
78                                         user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, i);
79                                         user_data_s* user = item->use_data;
80                                         if (!user->is_selected) {
81                                                 all_items_selected = EINA_FALSE;
82                                                 break;
83                                         }
84                                 }
85                                 Elm_Object_Item* list_item = elm_genlist_nth_item_get(obj, 0);
86                                 if (list_item) {
87                                         elm_genlist_item_selected_set(list_item, EINA_FALSE);
88                                         Evas_Object *llayout = elm_object_item_part_content_get(list_item, "elm.swallow.end");
89                                         Evas_Object *lcheckbox = elm_object_part_content_get(llayout, "elm.swallow.content");
90                                         elm_check_state_set(lcheckbox, all_items_selected);
91                                 }
92                         }
93                 }
94         }
95 }
96
97 char* on_buddy_name_get_cb(void *data, Evas_Object *obj, const char *part)
98 {
99         int id = (int)data;
100         appdata_s* ad = evas_object_data_get(obj, "app_data");
101         Eina_List *list = evas_object_data_get(obj, "result_list");
102
103         if (!list) {
104                 list = ad->buddy_list;
105         }
106
107         if (list && eina_list_count(list) > 0) {
108                 if (!strcmp(part, "elm.text")) {
109                         if (id == 0) {
110                                 char buf[512] = { 0, };
111                                 snprintf(buf, 512, "%s", i18n_get_text("IDS_TGRAM_MBODY_SELECT_ALL"));
112                                 return strdup(buf);
113                         }
114
115                         user_data_with_pic_s* item = eina_list_nth(list, id - 1);
116                         user_data_s* user = item->use_data;
117
118                         if (user && user->print_name) {
119                                 char* user_name = replace(user->print_name, '_', " ");
120                                 char buf[512] = {'\0'};
121                                 snprintf(buf, 512, "<align=left><font_size=35><color=#000000>%s</color></font_size></align>", user_name);
122                                 free(user_name);
123                                 return strdup(buf);
124                         }
125                 }
126         }
127
128         return NULL;
129 }
130
131 void on_item_checkbox_sel_cb(void *data, Evas_Object *obj, void *event_info)
132 {
133         int id = (int)data;
134         appdata_s* ad = evas_object_data_get(obj, "app_data");
135         Eina_Bool checked = elm_check_state_get(obj);
136         Evas_Object* buddy_gen_list = evas_object_data_get(obj, "buddy_gen_list");
137         Eina_List *list = evas_object_data_get(buddy_gen_list, "result_list");
138
139         if (!list) {
140                 list = ad->buddy_list;
141         }
142         if (ad && list && eina_list_count(list) > 0) {
143                 if (id == 0) {
144                         for (int i = 0 ; i < eina_list_count(list) ; i++) {
145                                 user_data_with_pic_s *item = eina_list_nth(list, i);
146                                 user_data_s* user = item->use_data;
147                                 user->is_selected = checked;
148
149                                 Elm_Object_Item* list_item = elm_genlist_nth_item_get(buddy_gen_list, i + 1);
150                                 if (list_item) {
151                                         elm_genlist_item_selected_set(list_item, EINA_FALSE);
152                                         Evas_Object *llayout = elm_object_item_part_content_get(list_item, "elm.swallow.end");
153                                         Evas_Object *lcheckbox = elm_object_part_content_get(llayout, "elm.swallow.content");
154                                         elm_check_state_set(lcheckbox, checked);
155                                 }
156                         }
157                 } else {
158                         user_data_with_pic_s *item = eina_list_nth(list, id - 1);
159                         user_data_s* user = item->use_data;
160                         user->is_selected = checked;
161
162                         if (!checked) {
163                                 Elm_Object_Item* list_item = elm_genlist_nth_item_get(buddy_gen_list, 0);
164                                 if (list_item) {
165                                         elm_genlist_item_selected_set(list_item, EINA_FALSE);
166                                         Evas_Object *llayout = elm_object_item_part_content_get(list_item, "elm.swallow.end");
167                                         Evas_Object *lcheckbox = elm_object_part_content_get(llayout, "elm.swallow.content");
168                                         elm_check_state_set(lcheckbox, EINA_FALSE);
169                                 }
170                         } else {
171                                 Eina_Bool all_items_selected = EINA_TRUE;
172                                 for (int i = 0 ; i < eina_list_count(list) ; i++) {
173                                         user_data_with_pic_s *item = eina_list_nth(list, i);
174                                         user_data_s* user = item->use_data;
175                                         if (!user->is_selected) {
176                                                 all_items_selected = EINA_FALSE;
177                                                 break;
178                                         }
179                                 }
180                                 Elm_Object_Item* list_item = elm_genlist_nth_item_get(buddy_gen_list, 0);
181                                 if (list_item) {
182                                         elm_genlist_item_selected_set(list_item, EINA_FALSE);
183                                         Evas_Object *llayout = elm_object_item_part_content_get(list_item, "elm.swallow.end");
184                                         Evas_Object *lcheckbox = elm_object_part_content_get(llayout, "elm.swallow.content");
185                                         elm_check_state_set(lcheckbox, all_items_selected);
186                                 }
187                         }
188                 }
189         }
190 }
191
192 Evas_Object* on_buddy_selection_part_content_get_cb(void *data, Evas_Object *obj, const char *part)
193 {
194         Evas_Object *eo = NULL;
195         appdata_s *ad;
196         int id;
197
198         id = (int)data;
199
200         ad = evas_object_data_get(obj, "app_data");
201         if (!ad) {
202                 return NULL;
203         }
204
205         Eina_List *list = evas_object_data_get(obj, "result_list");
206
207         if (!list) {
208                 list = ad->buddy_list;
209         }
210
211         if (!strcmp(part, "elm.swallow.icon")) {
212                 Evas_Object *image = NULL;
213
214                 if (id == 0 && list && eina_list_count(list) > 0) {
215                         return eo;
216                 }
217
218                 user_data_with_pic_s *item = eina_list_nth(list, id - 1);
219                 user_data_s* user = item->use_data;
220
221                 if (user->photo_path && strcmp(user->photo_path, "") != 0) {
222                         image = create_image_object_from_file(user->photo_path, obj);
223                 } else {
224                         image = create_image_object_from_file(ui_utils_get_resource(DEFAULT_LIST_THUMB_SINGLE_PIC), obj);
225                         evas_object_color_set(image, 45, 165, 224, 255);
226                 }
227
228                 item->contact_icon = image;
229                 evas_object_event_callback_add(item->contact_icon, EVAS_CALLBACK_DEL, buddy_icon_del_cb, item);
230
231                 if (image) {
232                         char edj_path[PATH_MAX] = {0, };
233                         app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
234                         Evas_Object* user_pic_layout = elm_layout_add(ad->nf);
235                         elm_layout_file_set(user_pic_layout, edj_path, "search_circle_layout");
236                         evas_object_size_hint_weight_set(user_pic_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
237                         evas_object_size_hint_align_set(user_pic_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
238                         evas_object_show(user_pic_layout);
239                         elm_object_part_content_set(user_pic_layout, "content", item->contact_icon);
240
241                         eo = elm_layout_add(obj);
242                         elm_layout_theme_set(eo, "layout", "list/B/type.2", "default");
243                         elm_layout_content_set(eo, "elm.swallow.content", user_pic_layout);
244
245                 }
246         } else if (!strcmp(part, "elm.swallow.end")) {
247                 if (id == 0 && list && eina_list_count(list) > 0) {
248
249                         Eina_Bool all_items_selected = (Eina_Bool)evas_object_data_get(obj, "all_selected");
250
251                         eo = elm_layout_add(obj);
252                         elm_layout_theme_set(eo, "layout", "list/C/type.2", "default");
253                         Evas_Object *check = elm_check_add(obj);
254                         elm_check_state_set(check, all_items_selected);
255                         elm_object_focus_set(check, EINA_FALSE);
256                         evas_object_propagate_events_set(check, EINA_FALSE);
257                         evas_object_data_set(check, "app_data", ad);
258                         evas_object_data_set(check, "buddy_gen_list", obj);
259                         evas_object_smart_callback_add(check, "changed", on_item_checkbox_sel_cb, data);
260                         elm_layout_content_set(eo, "elm.swallow.content", check);
261                         return eo;
262                 }
263
264                 user_data_with_pic_s *item = eina_list_nth(list, id - 1);
265                 user_data_s* user = item->use_data;
266
267                 eo = elm_layout_add(obj);
268                 elm_layout_theme_set(eo, "layout", "list/C/type.2", "default");
269                 Evas_Object *check = elm_check_add(obj);
270                 elm_check_state_set(check, user->is_selected);
271                 elm_check_state_pointer_set(check, &user->is_selected);
272                 elm_object_focus_set(check, EINA_FALSE);
273                 evas_object_propagate_events_set(check, EINA_FALSE);
274                 evas_object_data_set(check, "app_data", ad);
275                 evas_object_data_set(check, "buddy_gen_list", obj);
276                 evas_object_smart_callback_add(check, "changed", on_item_checkbox_sel_cb, data);
277                 elm_layout_content_set(eo, "elm.swallow.content", check);
278         } else {
279
280         }
281
282         return eo;
283 }
284
285 void on_done_buton_clicked(void *data, Evas_Object *object, void *event_info)
286 {
287         int selected_item_count = 0;
288         appdata_s* ad = data;
289         if (ad && ad->buddy_list) {
290                 for (int i = 0 ; i < eina_list_count(ad->buddy_list) ; i++) {
291                         user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, i);
292                         user_data_s* user = item->use_data;
293                         if (user->is_selected) {
294                                 selected_item_count++;
295                         }
296                 }
297         }
298
299         if (selected_item_count > 1) {
300                 appdata_s* ad = data;
301                 // elm_naviframe_item_pop(ad->nf);
302                 // Load chat name entry view
303                 launch_group_chat_name_entry_view(ad);
304         } else {
305                 show_toast(ad, "Select at least 2 buddies.");
306         }
307 }
308
309 void on_cancel_buton_clicked(void *data, Evas_Object *object, void *event_info)
310 {
311         appdata_s* ad = data;
312         if (ad && ad->buddy_list) {
313                 for (int i = 0 ; i < eina_list_count(ad->buddy_list) ; i++) {
314                         user_data_with_pic_s *item = eina_list_nth(ad->buddy_list, i);
315                         user_data_s* user = item->use_data;
316                         user->is_selected = EINA_FALSE;
317                 }
318         }
319         elm_naviframe_item_pop(ad->nf);
320         ad->current_app_state = TG_PEER_SEARCH_VIEW_STATE;
321         evas_object_show(ad->panel);
322 }
323
324 #if 0
325 static char* _util_get_first_char(char *input_text)
326 {       /*
327         int unicode_len = eina_unicode_utf8_get_len(input_text);
328         int str_len = strlen(input_text);
329         int lang_byte = str_len / unicode_len + (str_len % unicode_len > 0 ? 1 : 0);
330
331         first_char = strndup(input_text, lang_byte);
332         */
333         char *first_char = NULL;
334         int count;
335         int flag;
336         unsigned char mask = 0x80;
337
338         count = 0;
339         while (*input_text & mask) {
340                 mask = mask >> 1;
341                 count++;
342         }
343
344         count = count == 0 ? 1 : count;
345         first_char = strndup(input_text, count);
346
347         return first_char;
348 }
349
350 static void _update_index_item(void *data, void *item_data, int id, Eina_List *list)
351 {
352         appdata_s* ad = data;
353         if (id == 0) {
354                 return;
355         }
356         user_data_with_pic_s* item = eina_list_nth(list, id-1);
357         user_data_s* user = item->use_data;
358
359         Evas_Object *index = evas_object_data_get(ad->nf, "fs_index");
360
361         /*
362         char *index_text = NULL;
363         int unicode_len = eina_unicode_utf8_get_len(user->print_name);
364         int str_len = strlen(user->print_name);
365         int lang_byte = str_len / unicode_len + (str_len % unicode_len > 0 ? 1 : 0);
366
367         index_text = strndup(user->print_name, lang_byte);
368         */
369
370         char *index_text = _util_get_first_char(user->print_name);
371
372         Elm_Object_Item *it = elm_index_item_append(index, index_text, NULL, NULL);
373
374         elm_object_item_data_set(it, item_data);
375
376 }
377 #endif
378
379 static void _append_peer_item(Evas_Object *genlist, appdata_s *ad, Eina_List* item_list)
380 {
381         int i;
382         static Elm_Genlist_Item_Class itc;
383         Elm_Object_Item* item = NULL;
384
385         itc.item_style = "type1";
386         itc.func.text_get = on_buddy_name_get_cb;
387         itc.func.content_get = on_buddy_selection_part_content_get_cb;
388         itc.func.state_get = NULL;
389         itc.func.del = NULL;
390
391         int count = eina_list_count(item_list);
392
393         evas_object_data_set(genlist, "result_list", item_list);
394
395         if (count > 0) {
396                 for (i = 0; i < count+1; i++) {
397                         item = elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, on_buddy_selected, (void*) i);
398                         //_update_index_item(ad, item, i, item_list);
399                 }
400         } else {
401                 i = 1;
402                 elm_genlist_item_append(genlist, &itc, (void *) i, NULL, ELM_GENLIST_ITEM_NONE, NULL, (void*) i);
403         }
404 }
405
406 static void _on_search_entry_changed(void *data, Evas_Object *obj, void *event_info)
407 {
408         appdata_s* ad = data;
409         char* entry_text = NULL;
410
411         Evas_Object *buddy_list = evas_object_data_get(ad->nf, "buddy_list");
412         Evas_Object *main_layout = evas_object_data_get(ad->nf, "main_layout");
413         Evas_Object *index = evas_object_data_get(ad->nf, "fs_index");
414
415         user_data_with_pic_s *item;
416         user_data_s* user; // = item->use_data;
417
418         if (!buddy_list) {
419                 DBG("buddy_list is null");
420                 return;
421         }
422
423         elm_genlist_clear(buddy_list);
424         //elm_index_item_clear(index);
425
426         entry_text = trim(elm_entry_markup_to_utf8(elm_object_text_get(obj)));
427
428         Eina_List *result_list = NULL;
429         Eina_List *l = NULL;
430
431         if (ucol_is_jamo(entry_text)) {
432                 LOGD("entry_text is jamo, %s", entry_text);
433                 EINA_LIST_FOREACH(ad->buddy_list, l, item) {
434                         int result;
435                         user = item->use_data;
436                         result = ucol_compare_first_letters(user->print_name, entry_text);
437                         if (result == 0) {
438                                 result_list = eina_list_append(result_list, item);
439                         }
440                 }
441         } else {
442                 LOGD("entry_text is not jamo, %s", entry_text);
443                 EINA_LIST_FOREACH(ad->buddy_list, l, item) {
444                         user = item->use_data;
445
446                         if (ucol_search(user->print_name, entry_text) != -ENOENT) {
447                                 result_list = eina_list_append(result_list, item);
448                         }
449                 }
450         }
451
452         if ((entry_text == NULL || strlen(entry_text) == 0) && result_list == NULL) {
453                 result_list = ad->buddy_list;
454         }
455
456         LOGD("count of result_list is %d", eina_list_count(result_list));
457
458         if (result_list) {
459                 Evas_Object *fs_layout = evas_object_data_get(ad->nf, "fs_layout");
460                 _append_peer_item(buddy_list, data, result_list);
461                 Evas_Object *content = elm_object_part_content_unset(main_layout, "elm.swallow.content");
462                 if (evas_object_data_get(ad->nf, "no_contents_layout") == content) {
463                         evas_object_hide(content);
464                 }
465                 elm_object_part_content_set(main_layout, "elm.swallow.content", fs_layout);
466
467         } else {
468                 Evas_Object *no_contents = evas_object_data_get(ad->nf, "no_contents_layout");
469
470                 elm_object_part_content_unset(main_layout, "elm.swallow.content");
471                 elm_object_part_content_set(main_layout, "elm.swallow.content", no_contents);
472         }
473
474         elm_index_level_go(index, 0);
475         elm_genlist_realized_items_update(buddy_list);
476         if (entry_text) {
477                 free(entry_text);
478         }
479 }
480
481 static void _on_search_entry_focused(void *data, Evas_Object *obj, void *event_info)
482 {
483         Evas_Object *layout = data;
484         if (elm_object_focus_get(layout)) {
485                 elm_object_signal_emit(layout, "elm,state,focused", "");
486         } else{
487                 elm_object_signal_emit(layout, "elm,state,unfocused", "");
488         }
489 }
490
491 static Evas_Object *create_searchbar(Evas_Object* parent, void* data)
492 {
493         char edj_path[PATH_MAX] = {0, };
494         app_get_resource(TELEGRAM_INIT_VIEW_EDJ, edj_path, (int)PATH_MAX);
495
496         Evas_Object* layout = elm_layout_add(parent);
497         elm_layout_file_set(layout, edj_path, "");
498
499         /* edit field layout */
500         Evas_Object* searchbar_layout = elm_layout_add(parent);
501         elm_layout_theme_set(searchbar_layout, "layout", "searchfield", "singleline");
502         evas_object_size_hint_align_set(searchbar_layout, EVAS_HINT_FILL, 0.0);
503         evas_object_size_hint_weight_set(searchbar_layout, EVAS_HINT_EXPAND, 0.0);
504         //evas_object_event_callback_add(searchbar_layout, EVAS_CALLBACK_DEL, _searchbar_layout_del_cb, NULL);
505
506         /* entry */
507         Evas_Object* searchbar_entry = elm_entry_add(searchbar_layout);
508         elm_entry_cursor_end_set(searchbar_entry);
509         evas_object_size_hint_weight_set(searchbar_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
510         evas_object_size_hint_align_set(searchbar_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
511         elm_entry_single_line_set(searchbar_entry,  EINA_TRUE);
512         elm_entry_scrollable_set(searchbar_entry, EINA_FALSE);
513         elm_entry_cnp_mode_set(searchbar_entry, ELM_CNP_MODE_NO_IMAGE);
514         elm_entry_context_menu_disabled_set(searchbar_entry, EINA_TRUE);
515         elm_object_part_text_set(searchbar_entry, "elm.guide", i18n_get_text("IDS_TGRAM_NPBODY_SEARCH"));
516         elm_object_focus_set(searchbar_entry, EINA_FALSE);
517
518         limit_filter_data.max_char_count = 255;
519         elm_entry_markup_filter_append(searchbar_entry, elm_entry_filter_limit_size, &limit_filter_data);
520
521
522         evas_object_smart_callback_add(searchbar_entry, "changed", _on_search_entry_changed, data);
523         evas_object_smart_callback_add(searchbar_entry, "preedit,changed", _on_search_entry_changed, data);
524         evas_object_smart_callback_add(searchbar_entry, "focused", _on_search_entry_focused, searchbar_layout);
525
526         elm_object_part_content_set(searchbar_layout, "elm.swallow.content", searchbar_entry);
527         return searchbar_layout;
528 }
529
530 static void _index_selected_cb(void *data, Evas_Object *obj, void *event_info)
531 {
532         appdata_s* ad = data;
533         Evas_Object *buddy_list = evas_object_data_get(ad->nf, "buddy_list");
534         //Elm_Object_Item *gl_item = elm_genlist_first_item_get(search_list);
535
536         user_data_with_pic_s* gl_item = NULL;//eina_list_nth(ad->search_peer_list, 0);
537
538         //tg_peer_info_s* user = item->use_data;
539         Eina_List* list = ad->buddy_list;
540         int index = 0;
541         Eina_List *l;
542
543         EINA_LIST_FOREACH(list, l, gl_item) {
544                 if (ucol_compare_first_letters(gl_item->use_data->print_name, elm_index_item_letter_get(event_info)) == 0) {
545                         break;
546                 }
547                 index++;
548         }
549
550         if (eina_list_count(list) == index) {
551                 return;
552         }
553
554         Elm_Object_Item *item = elm_genlist_nth_item_get(buddy_list, ++index);
555         elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
556 }
557
558 static Evas_Object* create_fastscroll(appdata_s *ad)
559 {
560         Evas_Object *parent = ad->nf;
561         Evas_Object *index;
562         int i = 0, j, len;
563         char *str;
564         char buf[PATH_MAX] = {0, };
565
566         index = elm_index_add(parent);
567         elm_object_part_content_set(parent, "elm.swallow.fastscroll", index);
568         elm_index_autohide_disabled_set(index, EINA_TRUE);
569         elm_index_omit_enabled_set(index, EINA_TRUE);
570
571         /* 1. Special character & Numbers */
572         elm_index_item_append(index, "#", NULL, NULL);
573
574         /* 2. Local language */
575         str = i18n_get_text("IDS_COM_BODY_ABCDEFGHIJKLMNOPQRSTUVWXYZ");
576         len = strlen(str);
577
578         while (i < len) {
579                 j = i;
580                 eina_unicode_utf8_next_get(str, &i);
581                 snprintf(buf, i - j + 1, "%s", str + j);
582                 buf[i - j + 1] = 0;
583
584                 elm_index_item_append(index, buf, NULL, NULL);
585         }
586         elm_index_level_go(index, 0);
587
588         evas_object_smart_callback_add(index, "selected", _index_selected_cb, ad);
589         //evas_object_smart_callback_add(index, "changed", _index_changed_cb, NULL);
590         //evas_object_smart_callback_add(index, "language,changed", _index_language_changed_cb, NULL);
591
592         return index;
593 }
594
595 void launch_contact_selction_view(void *data)
596 {
597         appdata_s* ad = data;
598         ad->current_app_state = TG_BUDDY_LIST_SELECTION_STATE;
599
600         if (ad->panel) {
601                 evas_object_hide(ad->panel);
602                 elm_panel_hidden_set(ad->panel, EINA_TRUE);
603         }
604
605         elm_layout_theme_set(ad->layout, "layout", "application", "default");
606
607         /* Modified */
608         Evas_Object* layout = elm_layout_add(ad->nf);
609         elm_layout_theme_set(layout, "layout", "application", "searchbar_base");
610         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
611         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
612         evas_object_show(layout);
613
614         Evas_Object* searchbar_layout = create_searchbar(layout, ad);
615         elm_object_part_content_set(layout, "searchbar", searchbar_layout);
616
617         Evas_Object* fs_layout = elm_layout_add(layout);
618         elm_layout_theme_set(fs_layout, "layout", "application", "fastscroll");
619         elm_object_part_content_set(layout, "elm.swallow.content", fs_layout);
620
621         Evas_Object* index = create_fastscroll(ad);
622         elm_object_part_content_set(fs_layout, "elm.swallow.fastscroll", index);
623
624         Evas_Object* buddy_gen_list = elm_genlist_add(ad->nf);
625         elm_list_mode_set(buddy_gen_list, ELM_LIST_COMPRESS);
626
627         // FIXME: Deprecated API
628         // elm_genlist_decorate_mode_set(buddy_gen_list, ELM_LIST_COMPRESS);
629         evas_object_size_hint_weight_set(buddy_gen_list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
630         evas_object_size_hint_align_set(buddy_gen_list, EVAS_HINT_FILL, EVAS_HINT_FILL);
631
632         evas_object_data_set(buddy_gen_list, "app_data", ad);
633         elm_object_part_content_set(fs_layout, "elm.swallow.content", buddy_gen_list);
634
635         Eina_Bool all_items_selected = EINA_FALSE;
636         evas_object_data_set(buddy_gen_list, "all_selected", (void *)((int)all_items_selected));
637 #if 0
638         static Elm_Genlist_Item_Class itc;
639
640         itc.item_style = "type1";
641         itc.func.text_get = on_buddy_name_get_cb;
642         itc.func.content_get = on_buddy_selection_part_content_get_cb;
643         itc.func.state_get = NULL;
644         itc.func.del = NULL;
645
646         int size = 0;
647         if (ad->buddy_list) {
648                 size = eina_list_count(ad->buddy_list);
649                 size++;
650         } else {
651                 size = 1; // no items
652         }
653
654         for (int i = 0; i < size; i++) {
655                 elm_genlist_item_append(buddy_gen_list, &itc, (void*)i, NULL, ELM_GENLIST_ITEM_NONE, on_buddy_selected, (void*)i);
656         }
657 #endif
658         evas_object_show(buddy_gen_list);
659
660         _append_peer_item(buddy_gen_list, ad, ad->buddy_list);
661
662         /* no contents */
663         Evas_Object *nocontents = elm_layout_add(ad->nf);
664         elm_layout_theme_set(nocontents, "layout", "nocontents", "default");
665         evas_object_size_hint_weight_set(nocontents, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
666         evas_object_size_hint_align_set(nocontents, EVAS_HINT_FILL, EVAS_HINT_FILL);
667         elm_object_part_text_set(nocontents, "elm.text", _("IDS_TGRAM_NPBODY_NO_RESULTS_FOUND_ABB"));
668         evas_object_data_set(ad->nf, "no_contents_layout", nocontents);
669
670         evas_object_data_set(ad->nf, "fs_layout", fs_layout);
671         evas_object_data_set(ad->nf, "fs_index", index);
672         evas_object_data_set(ad->nf, "main_layout", layout);
673         evas_object_data_set(ad->nf, "buddy_list", buddy_gen_list);
674
675         Evas_Object* done_btn = elm_button_add(ad->layout);
676         elm_object_style_set(done_btn, "naviframe/title_right");
677         evas_object_smart_callback_add(done_btn, "clicked", on_done_buton_clicked, ad);
678         elm_object_text_set(done_btn, i18n_get_text("IDS_TGRAM_ACBUTTON_DONE_ABB"));
679         evas_object_show(done_btn);
680
681         Evas_Object* cancel_btn = elm_button_add(ad->layout);
682         elm_object_style_set(cancel_btn, "naviframe/title_left");
683         evas_object_smart_callback_add(cancel_btn, "clicked", on_cancel_buton_clicked, ad);
684         elm_object_text_set(cancel_btn, i18n_get_text("IDS_TGRAM_ACBUTTON_CANCEL_ABB"));
685         evas_object_show(cancel_btn);
686
687         Elm_Object_Item* buddy_sel_nav_item = NULL;
688         buddy_sel_nav_item = elm_naviframe_item_push(ad->nf, i18n_get_text("IDS_TGRAM_TMBODY_SELECT_CONTACTS_ABB"), NULL, NULL, layout, NULL);
689         elm_object_item_part_content_set(buddy_sel_nav_item, "title_right_btn", done_btn);
690         elm_object_item_part_content_set(buddy_sel_nav_item, "title_left_btn", cancel_btn);
691
692 }