[Title] immediately erasing bookmark list item after it is deleted.
[profile/ivi/org.tizen.browser.git] / src / browser-bookmark / browser-bookmark-view.cpp
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
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
18 #include "browser-add-to-bookmark-view.h"
19 #include "browser-bookmark-db.h"
20 #include "browser-bookmark-view.h"
21 #include "browser-history-layout.h"
22 #include "browser-new-folder-view.h"
23 #include "browser-string.h"
24 #include "browser-view.h"
25
26 #define UPPER_FOLDER_ICON_SIZE  (64 * elm_scale_get())
27
28 Browser_Bookmark_View::Browser_Bookmark_View(void)
29 :       m_back_button(NULL)
30         ,m_top_control_bar(NULL)
31         ,m_conformant(NULL)
32         ,m_content_layout(NULL)
33         ,m_genlist_content_layout(NULL)
34         ,m_genlist_content_box(NULL)
35         ,m_main_folder_genlist(NULL)
36         ,m_sub_folder_genlist(NULL)
37         ,m_main_layout(NULL)
38         ,m_upper_folder_list(NULL)
39         ,m_upper_folder_icon(NULL)
40         ,m_view_mode(BOOKMARK_VIEW)
41         ,m_edit_mode_select_all_layout(NULL)
42         ,m_edit_mode_select_all_check_button(NULL)
43         ,m_current_folder_id(BROWSER_BOOKMARK_MAIN_FOLDER_ID)
44         ,m_no_contents(NULL)
45         ,m_current_genlist_item_to_edit(NULL)
46         ,m_sub_folder_conformant(NULL)
47         ,m_processing_popup_timer(NULL)
48         ,m_processing_progress_bar(NULL)
49         ,m_processed_it(NULL)
50         ,m_processed_count(0)
51         ,m_total_item_count(0)
52         ,m_processing_popup(NULL)
53         ,m_processing_popup_layout(NULL)
54         ,m_select_all_check_value(EINA_FALSE)
55         ,m_bottom_control_bar(NULL)
56         ,m_bookmark_delete_controlbar_item(NULL)
57         ,m_bookmark_edit_controlbar_item(NULL)
58         ,m_create_folder_controlbar_item(NULL)
59         ,m_current_sweep_item(NULL)
60         ,m_navi_it(NULL)
61         ,m_delete_confirm_popup(NULL)
62         ,m_rename_edit_field(NULL)
63 {
64         BROWSER_LOGD("[%s]", __func__);
65         m_current_bookmark_navigationbar_title = "";
66 }
67
68 Browser_Bookmark_View::~Browser_Bookmark_View(void)
69 {
70         BROWSER_LOGD("[%s]", __func__);
71         hide_notify_popup();
72
73         for(int i = 0 ; i < m_sub_folder_list.size() ; i++ ) {
74                 if (m_sub_folder_list[i]) {
75                         delete m_sub_folder_list[i];
76                         m_sub_folder_list.erase(m_sub_folder_list.begin() + i);
77                 }
78         }
79         m_sub_folder_list.clear();
80
81         for(int i = 0 ; i < m_main_folder_list.size() ; i++ ) {
82                 if (m_main_folder_list[i]) {
83                         delete m_main_folder_list[i];
84                         m_main_folder_list.erase(m_main_folder_list.begin() + i);
85                 }
86         }
87         m_main_folder_list.clear();
88
89         m_data_manager->destroy_bookmark_db();
90
91         evas_object_smart_callback_del(m_navi_bar, "transition,finished", __naviframe_pop_finished_cb);
92
93         if (m_delete_confirm_popup)
94                 evas_object_del(m_delete_confirm_popup);
95
96 }
97
98 Eina_Bool Browser_Bookmark_View::init(void)
99 {
100         BROWSER_LOGD("[%s]", __func__);
101         if (!m_data_manager->create_bookmark_db()) {
102                 BROWSER_LOGE("m_data_manager->create_bookmark_db failed");
103                 return EINA_FALSE;
104         }
105
106         return _create_main_layout();
107 }
108
109 Eina_Bool Browser_Bookmark_View::append_bookmark_item(const char *title, const char *url)
110 {
111         if (!url || !title) {
112                 BROWSER_LOGE("url or title is null");
113                 return EINA_FALSE;
114         }
115
116         if (!m_data_manager->get_bookmark_db()->save_bookmark(BROWSER_BOOKMARK_MAIN_FOLDER_ID, title, url)) {
117                 BROWSER_LOGE("save_bookmark failed");
118                 return EINA_FALSE;
119         }
120
121         Browser_Bookmark_DB::bookmark_item *item = new(nothrow) Browser_Bookmark_DB::bookmark_item;
122         if (!item) {
123                 BROWSER_LOGE("new(nothrow) Browser_Bookmark_DB::bookmark_item failed");
124                 return EINA_FALSE;
125         }
126
127         int bookmark_id = -1;
128         m_data_manager->get_bookmark_db()->get_bookmark_id_by_title_url(BROWSER_BOOKMARK_MAIN_FOLDER_ID, title,
129                                 url, &bookmark_id);
130
131         item->parent = BROWSER_BOOKMARK_MAIN_FOLDER_ID;
132         item->user_data_1 = (void *)this;
133         item->url = std::string(url);
134         item->title = std::string(title);
135         item->is_folder = EINA_FALSE;
136         item->id = bookmark_id;
137         item->user_data_2 = (void *)elm_genlist_item_append(m_main_folder_genlist, &m_bookmark_genlist_item_class,
138                                                         item, NULL, ELM_GENLIST_ITEM_NONE,
139                                                         __bookmark_item_clicked_cb, this);
140
141         m_main_folder_list.push_back(item);
142
143         _show_empty_content_layout(EINA_FALSE);
144
145         return EINA_TRUE;
146 }
147
148 void Browser_Bookmark_View::delete_bookmark_item(int bookmark_id)
149 {
150         BROWSER_LOGD("[%s]", __func__);
151         int ret = EINA_TRUE;
152
153         ret = m_data_manager->get_bookmark_db()->delete_bookmark(bookmark_id);
154         if (!ret) {
155                 BROWSER_LOGE("bookmark_db->delete_bookmark failed");
156                 return;
157         }
158
159         Elm_Object_Item *it = elm_genlist_first_item_get(m_main_folder_genlist);
160         while (it) {
161                 Browser_Bookmark_DB::bookmark_item *item = NULL;
162                 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
163                 if (item->id == bookmark_id) {
164                         elm_object_item_del(it);
165                         break;
166                 }
167
168                 it = elm_genlist_item_next_get(it);
169         }
170
171         for(int index = 0 ; index <  m_main_folder_list.size() ; index++) {
172                 if (m_main_folder_list[index]->id == bookmark_id) {
173                         delete m_main_folder_list[index];
174                         m_main_folder_list.erase(m_main_folder_list.begin() + index);
175                         break;
176                 }
177         }
178
179         if (m_main_folder_list.size() == 0) {
180                 _show_empty_content_layout(EINA_TRUE);
181         }
182 }
183
184 void Browser_Bookmark_View::return_to_bookmark_view(int added_bookmark_id)
185 {
186         BROWSER_LOGD("added_bookmark_id = %d", added_bookmark_id);
187         if (m_view_mode == BOOKMARK_VIEW) {
188                 /* In case that bookmark view -> Edit bookmark item, then return to bookmark view. */
189                 if (elm_genlist_decorate_mode_get(_get_current_folder_genlist())) {
190                         int delete_item_count = 0;
191                         int editable_item_count = 0;
192                         Elm_Object_Item *it = elm_genlist_first_item_get(_get_current_folder_genlist());
193                         while(it) {
194                                 Browser_Bookmark_DB::bookmark_item *item = NULL;
195                                 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
196                                 if (item->is_editable)
197                                         editable_item_count++;
198                                 if (item->is_delete)
199                                         delete_item_count++;
200                                 it = elm_genlist_item_next_get(it);
201                         }
202
203                         if (editable_item_count == delete_item_count)
204                                 elm_check_state_set(m_edit_mode_select_all_check_button, EINA_TRUE);
205                         else
206                                 elm_check_state_set(m_edit_mode_select_all_check_button, EINA_FALSE);
207
208                         if (delete_item_count == 0)
209                                 elm_object_item_disabled_set(m_bookmark_delete_controlbar_item, EINA_TRUE);
210                 }
211
212                 int size = _get_current_folder_item_list().size();
213                 if (size == 0)
214                         _show_empty_content_layout(EINA_TRUE);
215                 else
216                         _show_empty_content_layout(EINA_FALSE);
217         } else {
218                 if (!m_data_manager->get_history_layout())
219                         return;
220
221                 /* In case that history view -> add to bookmark by slide-right, then return to history view. */
222                 if (m_data_manager->get_history_layout()->m_current_sweep_item) {
223                         elm_genlist_item_decorate_mode_set(m_data_manager->get_history_layout()->m_current_sweep_item, "slide", EINA_FALSE);
224                         elm_genlist_item_select_mode_set(m_data_manager->get_history_layout()->m_current_sweep_item, ELM_OBJECT_SELECT_MODE_DEFAULT);
225                         m_data_manager->get_history_layout()->m_current_sweep_item = NULL;
226                 }
227         }
228
229         /* boomark view -> history -> add to bookmark by slide button, then done. */
230         if (added_bookmark_id != -1) {
231                 Browser_Bookmark_DB::bookmark_item *item = m_data_manager->get_bookmark_db()->get_bookmark_item_by_id(added_bookmark_id);
232                 if (!item) {
233                         BROWSER_LOGE("get_bookmark_item_by_id failed");
234                         return;
235                 }
236
237                 Elm_Object_Item *it = elm_genlist_first_item_get(_get_current_folder_genlist());
238                 while (it) {
239                         Browser_Bookmark_DB::bookmark_item *exist_item = NULL;
240                         exist_item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
241                         if (exist_item->id == added_bookmark_id) {
242                                 exist_item->url = item->url;
243                                 exist_item->title = item->title;
244                                 exist_item->parent = item->parent;
245                                 elm_genlist_item_update(it);
246                                 return;
247                         }
248                         it = elm_genlist_item_next_get(it);
249                 }
250
251                 if (m_current_folder_id == item->parent) {
252                         /* If the saved bookmark item is in the current folder, just add it to current folder. */
253                         Evas_Object *genlist = NULL;
254                         if (item->parent == BROWSER_BOOKMARK_MAIN_FOLDER_ID)
255                                 genlist = m_main_folder_genlist;
256                         else
257                                 genlist = m_sub_folder_genlist;
258
259                         item->user_data_1 = (void *)this;
260                         if (item->is_folder) {
261                                 item->user_data_2 = (void *)elm_genlist_item_append(genlist, &m_folder_genlist_item_class,
262                                                                         item, NULL, ELM_GENLIST_ITEM_NONE,
263                                                                         __bookmark_item_clicked_cb, this);
264
265                         } else {
266                                 item->user_data_2 = (void *)elm_genlist_item_append(genlist, &m_bookmark_genlist_item_class,
267                                                                         item, NULL, ELM_GENLIST_ITEM_NONE,
268                                                                         __bookmark_item_clicked_cb, this);
269                         }
270
271                         if (item->parent == BROWSER_BOOKMARK_MAIN_FOLDER_ID)
272                                 m_main_folder_list.push_back(item);
273                         else
274                                 m_sub_folder_list.push_back(item);
275                 } else if (m_current_folder_id != BROWSER_BOOKMARK_MAIN_FOLDER_ID
276                            && item->parent == BROWSER_BOOKMARK_MAIN_FOLDER_ID){
277                         /* If the current folder is sub folder but the saved folder is main folder,
278                           * add the saved bookmark item to main folder. */
279                         item->user_data_1 = (void *)this;
280                         if (item->is_folder) {
281                         item->user_data_2 = (void *)elm_genlist_item_append(m_main_folder_genlist, &m_folder_genlist_item_class,
282                                                                         item, NULL, ELM_GENLIST_ITEM_NONE,
283                                                                         __bookmark_item_clicked_cb, this);
284                         } else {
285                         item->user_data_2 = (void *)elm_genlist_item_append(m_main_folder_genlist, &m_bookmark_genlist_item_class,
286                                                                         item, NULL, ELM_GENLIST_ITEM_NONE,
287                                                                         __bookmark_item_clicked_cb, this);
288                         }
289                         m_main_folder_list.push_back(item);
290                 }
291
292                 /* If the bookmark is empty page, destroy the empty layout to show the bookmark list. */
293                 if (_get_current_folder_item_list().size() == 0)
294                         _show_empty_content_layout(EINA_TRUE);
295                 else
296                         _show_empty_content_layout(EINA_FALSE);
297         }
298 }
299
300 void Browser_Bookmark_View::__back_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
301 {
302         BROWSER_LOGD("[%s]", __func__);
303         if (!data)
304                 return;
305
306         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
307         Evas_Object *navi_bar = bookmark_view->m_navi_bar;
308
309         if (elm_naviframe_bottom_item_get(navi_bar) != elm_naviframe_top_item_get(navi_bar))
310                 elm_naviframe_item_pop(navi_bar);
311
312         /* Set the title if enter the add to bookmark while loading. */
313         m_data_manager->get_browser_view()->return_to_browser_view();
314 }
315
316 void Browser_Bookmark_View::__edit_controlbar_item_clicked_cb(void *data, Evas_Object *obj, void *event_info)
317 {
318         BROWSER_LOGD("[%s]", __func__);
319         if (!data)
320                 return;
321
322         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
323         Browser_History_Layout *history_layout = m_data_manager->get_history_layout();
324
325         if (bookmark_view->m_view_mode == BOOKMARK_VIEW) {
326                 if (!elm_genlist_decorate_mode_get(bookmark_view->_get_current_folder_genlist()))
327                         /* Edit bookmark */
328                         bookmark_view->_set_edit_mode(EINA_TRUE);
329                 else {
330                         if (bookmark_view->m_rename_edit_field) {
331                                 Browser_Bookmark_DB::bookmark_item *item = NULL;
332                                 item = (Browser_Bookmark_DB::bookmark_item *)evas_object_data_get(bookmark_view->m_rename_edit_field, "item");
333                                 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(bookmark_view->m_rename_edit_field);
334                                 elm_entry_entry_set(edit_field_entry, item->title.c_str());
335                         }
336
337                         /* Cancel Edit bookmark */
338                         bookmark_view->_set_edit_mode(EINA_FALSE);
339                 }
340         } else if (history_layout) {
341                 if (!elm_genlist_decorate_mode_get(history_layout->m_history_genlist)) {
342                         /* Delete history */
343                         history_layout->_set_edit_mode(EINA_TRUE);
344                 } else {
345                         /* Cancel Delete bookmark */
346                         history_layout->_set_edit_mode(EINA_FALSE);
347                 }
348         }
349
350         if (bookmark_view->m_rename_edit_field)
351                 elm_object_focus_set(bookmark_view->m_rename_edit_field, EINA_FALSE);
352 }
353
354 void Browser_Bookmark_View::__delete_controlbar_item_clicked_cb(void *data, Evas_Object *obj, void *event_info)
355 {
356         if (!data)
357                 return;
358
359         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
360         Browser_History_Layout *history_layout = m_data_manager->get_history_layout();
361
362         if (bookmark_view->m_view_mode == BOOKMARK_VIEW) {
363                 if (elm_genlist_decorate_mode_get(bookmark_view->_get_current_folder_genlist())) {
364                         /* Delete bookmark */
365                         Evas_Object *ok_button = bookmark_view->_show_delete_confirm_popup();
366                         if (ok_button)
367                                 evas_object_smart_callback_add(ok_button, "clicked",
368                                                 __delete_confirm_response_by_edit_mode_cb, bookmark_view);
369
370                 }
371         } else {
372                 if (history_layout && elm_genlist_decorate_mode_get(history_layout->m_history_genlist)) {
373                         /* Delete bookmark */
374                         Evas_Object *ok_button = history_layout->_show_delete_confirm_popup();
375                         if (ok_button)
376                                 evas_object_smart_callback_add(ok_button, "clicked",
377                                                 Browser_History_Layout::__delete_confirm_response_by_edit_mode_cb,
378                                                 history_layout);
379                 }
380         }
381 }
382
383 void Browser_Bookmark_View::_delete_bookmark_item_from_folder_list(Browser_Bookmark_DB::bookmark_item *item)
384 {
385         if (m_current_folder_id == BROWSER_BOOKMARK_MAIN_FOLDER_ID) {
386                 for(int index = 0 ; index <  m_main_folder_list.size() ; index++) {
387                         if (m_main_folder_list[index] == item) {
388                                 delete m_main_folder_list[index];
389                                 m_main_folder_list.erase(m_main_folder_list.begin() + index);
390                         }
391                 }
392         } else {
393                 for(int index = 0 ; index <  m_sub_folder_list.size() ; index++) {
394                         if (m_sub_folder_list[index] == item) {
395                                 delete m_sub_folder_list[index];
396                                 m_sub_folder_list.erase(m_sub_folder_list.begin() + index);
397                         }
398                 }
399         }
400 }
401
402 void Browser_Bookmark_View::_delete_selected_bookmark(void)
403 {
404         BROWSER_LOGD("[%s]", __func__);
405         Browser_Bookmark_DB *bookmark_db = m_data_manager->get_bookmark_db();
406         Eina_List *delete_item_list = NULL;
407         Elm_Object_Item *it = elm_genlist_first_item_get(_get_current_folder_genlist());
408         int remain_count = 0;
409         while(it) {
410                 Browser_Bookmark_DB::bookmark_item *item = NULL;
411                 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
412                 if (item->is_delete)
413                         delete_item_list = eina_list_append(delete_item_list, it);
414                 else
415                         remain_count++;
416                 it = elm_genlist_item_next_get(it);
417         }
418
419         int count = eina_list_count(delete_item_list);
420
421         if (count >= BROWSER_BOOKMARK_PROCESS_BLOCK_COUNT) {
422                 /* If delete more than 100 items, show the processing popup. */
423                 _show_delete_processing_popup();
424         } else {
425                 for (int i = 0; i < count; i++) {
426                         it = (Elm_Object_Item *)eina_list_data_get(delete_item_list);
427                         Browser_Bookmark_DB::bookmark_item *item = NULL;
428                         Eina_Bool ret = EINA_TRUE;
429                         item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
430                         if (item->is_folder) {
431                                 int folder_id = 0;
432                                 ret = bookmark_db->get_folder_id(m_current_folder_id, item->title.c_str(), &folder_id);
433                                 if (!ret) {
434                                         BROWSER_LOGE("bookmark_db->get_folder_id failed");
435                                         return;
436                                 }
437                                 ret = bookmark_db->delete_folder(folder_id);
438                                 if (!ret) {
439                                         BROWSER_LOGE("bookmark_db->delete_folder failed");
440                                         return;
441                                 }
442                         } else {
443                                 ret = bookmark_db->delete_bookmark(item->id);
444                                 if (!ret) {
445                                         BROWSER_LOGE("bookmark_db->delete_bookmark failed");
446                                         return;
447                                 }
448                         }
449                         delete_item_list = eina_list_next(delete_item_list);
450
451                         _delete_bookmark_item_from_folder_list(item);
452
453                         elm_object_item_del(it);
454                 }
455                 eina_list_free(delete_item_list);
456
457                 elm_check_state_set(m_edit_mode_select_all_check_button, EINA_FALSE);
458
459                 if (remain_count == 0)
460                         _show_empty_content_layout(EINA_TRUE);
461
462                 show_notify_popup(BR_STRING_DELETED, 3, EINA_TRUE);
463         }
464 }
465
466 void Browser_Bookmark_View::__edit_mode_item_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
467 {
468         BROWSER_LOGD("[%s]", __func__);
469         if (!data)
470                 return;
471         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)data;
472         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)(item->user_data_1);
473         int delete_item_count = 0;
474         int editable_item_count = 0;
475
476         Elm_Object_Item *it = elm_genlist_first_item_get(bookmark_view->_get_current_folder_genlist());
477         while(it) {
478                 Browser_Bookmark_DB::bookmark_item *item = NULL;
479                 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
480                 if (item->is_editable)
481                         editable_item_count++;
482                 if (item->is_delete)
483                         delete_item_count++;
484                 it = elm_genlist_item_next_get(it);
485         }
486
487         if (editable_item_count == delete_item_count)
488                 elm_check_state_set(bookmark_view->m_edit_mode_select_all_check_button, EINA_TRUE);
489         else
490                 elm_check_state_set(bookmark_view->m_edit_mode_select_all_check_button, EINA_FALSE);
491
492         bookmark_view->_show_selection_info();
493 }
494
495 void Browser_Bookmark_View::_show_delete_processing_popup(void)
496 {
497         BROWSER_LOGD("[%s]", __func__);
498         if (m_processing_popup)
499                 evas_object_del(m_processing_popup);
500
501         m_processing_popup = elm_popup_add(m_main_layout);
502         if (!m_processing_popup) {
503                 BROWSER_LOGE("elm_popup_add failed");
504                 return;
505         }
506
507         if (m_processing_popup_layout)
508                 evas_object_del(m_processing_popup_layout);
509         m_processing_popup_layout = elm_layout_add(m_processing_popup);
510         if (!m_processing_popup_layout) {
511                 BROWSER_LOGE("elm_layout_add failed");
512                 return;
513         }
514         if (!elm_layout_file_set(m_processing_popup_layout, BROWSER_EDJE_DIR"/browser-bookmark-view.edj",
515                                                         "browser/popup_center_progressview")) {
516                 BROWSER_LOGE("elm_layout_file_set failed");
517                 return;
518         }
519         evas_object_size_hint_weight_set(m_processing_popup_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
520
521         m_processing_progress_bar = elm_progressbar_add(m_processing_popup);
522         elm_object_style_set(m_processing_progress_bar, "list_progress");
523         elm_progressbar_horizontal_set(m_processing_progress_bar, EINA_TRUE);
524         evas_object_size_hint_align_set(m_processing_progress_bar, EVAS_HINT_FILL, EVAS_HINT_FILL);
525         evas_object_size_hint_weight_set(m_processing_progress_bar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
526         elm_progressbar_value_set(m_processing_progress_bar, 0.0);
527
528         if (m_processing_popup_timer)
529                 ecore_timer_del(m_processing_popup_timer);
530
531         m_processed_count = 0;
532         m_processed_it = elm_genlist_last_item_get(_get_current_folder_genlist());
533
534         Elm_Object_Item *it = elm_genlist_first_item_get(_get_current_folder_genlist());
535         m_total_item_count = 0;
536         while(it) {
537                 Browser_Bookmark_DB::bookmark_item *item = NULL;
538                 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
539                 if (item) {
540                         if(item->is_editable && item->is_delete)
541                                 m_total_item_count++;
542                 }
543                 it = elm_genlist_item_next_get(it);
544         }
545
546         m_processing_popup_timer = ecore_timer_add(0.1, __delete_processing_popup_timer_cb, this);
547         evas_object_show(m_processing_progress_bar);
548
549         elm_object_part_content_set(m_processing_popup_layout, "elm.swallow.content", m_processing_progress_bar);
550         edje_object_part_text_set(elm_layout_edje_get(m_processing_popup_layout), "elm.title", BR_STRING_PROCESSING);
551         edje_object_part_text_set(elm_layout_edje_get(m_processing_popup_layout), "elm.text.left", "");
552         edje_object_part_text_set(elm_layout_edje_get(m_processing_popup_layout), "elm.text.right", "");
553
554         elm_object_content_set(m_processing_popup, m_processing_popup_layout);
555
556         Evas_Object *cancel_button = elm_button_add(m_processing_popup);
557         elm_object_text_set(cancel_button, BR_STRING_CANCEL);
558         elm_object_part_content_set(m_processing_popup, "button1", cancel_button);
559         evas_object_smart_callback_add(cancel_button, "clicked", __delete_processing_popup_response_cb, this);
560
561         evas_object_show(m_processing_popup);
562 }
563
564 Eina_Bool Browser_Bookmark_View::__delete_processing_popup_timer_cb(void *data)
565 {
566         if (!data)
567                 return ECORE_CALLBACK_CANCEL;
568
569         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
570         Evas_Object* progress_bar = bookmark_view->m_processing_progress_bar;
571
572         Eina_Bool check_value = bookmark_view->m_select_all_check_value;
573
574         double value = elm_progressbar_value_get(progress_bar);
575         if (value >= 1.0) {
576                 __delete_processing_popup_response_cb(bookmark_view, NULL, NULL);
577
578                 bookmark_view->m_processing_popup_timer = NULL;
579                 bookmark_view->show_notify_popup(BR_STRING_DELETED, 3, EINA_TRUE);
580
581                 return ECORE_CALLBACK_CANCEL;
582         }
583
584         while(bookmark_view->m_processed_it) {
585                 Browser_Bookmark_DB::bookmark_item *item = NULL;
586                 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(bookmark_view->m_processed_it);
587                 if (item) {
588                         if(item->is_editable && item->is_delete) {
589                                 Browser_Bookmark_DB *bookmark_db = m_data_manager->get_bookmark_db();
590                                 int ret = EINA_TRUE;
591                                 if (item->is_folder) {
592                                         int folder_id = 0;
593                                         ret = bookmark_db->get_folder_id(bookmark_view->m_current_folder_id,
594                                                                                 item->title.c_str(), &folder_id);
595                                         if (!ret) {
596                                                 BROWSER_LOGE("bookmark_db->get_folder_id failed");
597                                                 return ECORE_CALLBACK_CANCEL;
598                                         }
599                                         ret = bookmark_db->delete_folder(folder_id);
600                                         if (!ret) {
601                                                 BROWSER_LOGE("bookmark_db->delete_folder failed");
602                                                 return ECORE_CALLBACK_CANCEL;
603                                         }
604                                 } else {
605                                         ret = bookmark_db->delete_bookmark(item->id);
606                                         if (!ret) {
607                                                 BROWSER_LOGE("bookmark_db->delete_bookmark failed");
608                                                 return ECORE_CALLBACK_CANCEL;
609                                         }
610                                 }
611                                 bookmark_view->_delete_bookmark_item_from_folder_list(item);
612                                 bookmark_view->m_processed_count++;
613                                 Elm_Object_Item *it = bookmark_view->m_processed_it;
614                                 bookmark_view->m_processed_it = elm_genlist_item_prev_get(bookmark_view->m_processed_it);
615                                 elm_object_item_del(it);
616                         } else
617                                 bookmark_view->m_processed_it = elm_genlist_item_prev_get(bookmark_view->m_processed_it);
618                 } else
619                         bookmark_view->m_processed_it = elm_genlist_item_prev_get(bookmark_view->m_processed_it);
620
621                 if (bookmark_view->m_processed_count % 5 == 0)
622                         break;
623         }
624
625         elm_progressbar_value_set(bookmark_view->m_processing_progress_bar,
626                                 (float)((float)bookmark_view->m_processed_count / (float)bookmark_view->m_total_item_count));
627
628         char progress_text[20] = {0, };
629         snprintf(progress_text, sizeof(progress_text) - 1, "%d / %d",
630                         bookmark_view->m_processed_count, bookmark_view->m_total_item_count);
631
632         edje_object_part_text_set(elm_layout_edje_get(bookmark_view->m_processing_popup_layout),
633                                 "elm.text.right", progress_text);
634
635         return ECORE_CALLBACK_RENEW;
636 }
637
638 void Browser_Bookmark_View::_show_select_processing_popup(void)
639 {
640         BROWSER_LOGD("[%s]", __func__);
641         if (m_processing_popup)
642                 evas_object_del(m_processing_popup);
643
644         m_processing_popup = elm_popup_add(m_main_layout);
645         if (!m_processing_popup) {
646                 BROWSER_LOGE("elm_popup_add failed");
647                 return;
648         }
649
650         if (m_processing_popup_layout)
651                 evas_object_del(m_processing_popup_layout);
652         m_processing_popup_layout = elm_layout_add(m_processing_popup);
653         if (!m_processing_popup_layout) {
654                 BROWSER_LOGE("elm_layout_add failed");
655                 return;
656         }
657         if (!elm_layout_file_set(m_processing_popup_layout, BROWSER_EDJE_DIR"/browser-bookmark-view.edj",
658                                                         "browser/popup_center_progressview")) {
659                 BROWSER_LOGE("elm_layout_file_set failed");
660                 return;
661         }
662         evas_object_size_hint_weight_set(m_processing_popup_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
663
664         m_processing_progress_bar = elm_progressbar_add(m_processing_popup);
665         elm_object_style_set(m_processing_progress_bar, "list_progress");
666         elm_progressbar_horizontal_set(m_processing_progress_bar, EINA_TRUE);
667         evas_object_size_hint_align_set(m_processing_progress_bar, EVAS_HINT_FILL, EVAS_HINT_FILL);
668         evas_object_size_hint_weight_set(m_processing_progress_bar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
669         elm_progressbar_value_set(m_processing_progress_bar, 0.0);
670
671         if (m_processing_popup_timer)
672                 ecore_timer_del(m_processing_popup_timer);
673
674         m_processed_count = 0;
675         m_processed_it = elm_genlist_first_item_get(_get_current_folder_genlist());
676
677         Elm_Object_Item *it = elm_genlist_first_item_get(_get_current_folder_genlist());
678         m_total_item_count = 0;
679         while(it) {
680                 Browser_Bookmark_DB::bookmark_item *item = NULL;
681                 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
682                 if (item) {
683                         if(item->is_editable)
684                                 m_total_item_count++;
685                 }
686                 it = elm_genlist_item_next_get(it);
687         }
688
689         m_processing_popup_timer = ecore_timer_add(0.1, __select_processing_popup_timer_cb, this);
690         evas_object_show(m_processing_progress_bar);
691
692         elm_object_part_content_set(m_processing_popup_layout, "elm.swallow.content", m_processing_progress_bar);
693         edje_object_part_text_set(elm_layout_edje_get(m_processing_popup_layout), "elm.title", BR_STRING_PROCESSING);
694         edje_object_part_text_set(elm_layout_edje_get(m_processing_popup_layout), "elm.text.left", "");
695         edje_object_part_text_set(elm_layout_edje_get(m_processing_popup_layout), "elm.text.right", "");
696
697         elm_object_content_set(m_processing_popup, m_processing_popup_layout);
698
699         Evas_Object *cancel_button = elm_button_add(m_processing_popup);
700         elm_object_text_set(cancel_button, BR_STRING_CANCEL);
701         elm_object_part_content_set(m_processing_popup, "button1", cancel_button);
702         evas_object_smart_callback_add(cancel_button, "clicked", __select_processing_popup_response_cb, this);
703
704         evas_object_show(m_processing_popup);
705
706         Eina_Bool check_value = elm_check_state_get(m_edit_mode_select_all_check_button);
707         m_select_all_check_value = check_value;
708
709         if (check_value)
710                 elm_check_state_set(m_edit_mode_select_all_check_button, !check_value);
711 }
712
713 Eina_Bool Browser_Bookmark_View::__select_processing_popup_timer_cb(void *data)
714 {
715         if (!data)
716                 return ECORE_CALLBACK_CANCEL;
717
718         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
719         Evas_Object* progress_bar = bookmark_view->m_processing_progress_bar;
720
721         Eina_Bool check_value = bookmark_view->m_select_all_check_value;
722
723         double value = elm_progressbar_value_get(progress_bar);
724         if (value >= 1.0) {
725                 __select_processing_popup_response_cb(bookmark_view, NULL, NULL);
726
727                 bookmark_view->m_processing_popup_timer = NULL;
728                 elm_check_state_set(bookmark_view->m_edit_mode_select_all_check_button, !check_value);
729                 bookmark_view->_show_selection_info();
730
731                 return ECORE_CALLBACK_CANCEL;
732         }
733
734         while(bookmark_view->m_processed_it) {
735                 Browser_Bookmark_DB::bookmark_item *item = NULL;
736                 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(bookmark_view->m_processed_it);
737                 if (item) {
738                         if(item->is_editable) {
739                                 item->is_delete = !check_value;
740                                 elm_genlist_item_update(bookmark_view->m_processed_it);
741                                 bookmark_view->m_processed_count++;
742                         }
743                 }
744                 bookmark_view->m_processed_it = elm_genlist_item_next_get(bookmark_view->m_processed_it);
745
746                 if (bookmark_view->m_processed_count % 30 == 0)
747                         break;
748         }
749
750         elm_progressbar_value_set(bookmark_view->m_processing_progress_bar,
751                                 (float)((float)bookmark_view->m_processed_count / (float)bookmark_view->m_total_item_count));
752
753         char progress_text[20] = {0, };
754         snprintf(progress_text, sizeof(progress_text) - 1, "%d / %d",
755                         bookmark_view->m_processed_count, bookmark_view->m_total_item_count);
756
757         edje_object_part_text_set(elm_layout_edje_get(bookmark_view->m_processing_popup_layout),
758                                 "elm.text.right", progress_text);
759
760         return ECORE_CALLBACK_RENEW;
761 }
762
763 void Browser_Bookmark_View::__delete_processing_popup_response_cb(void *data, Evas_Object *obj, void *event_info)
764 {
765         BROWSER_LOGD("[%s]", __func__);
766         if (!data)
767                 return;
768
769         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
770
771         bookmark_view->m_processing_progress_bar = NULL;
772         bookmark_view->m_processed_it = NULL;
773
774         evas_object_del(bookmark_view->m_processing_popup);
775
776         if (bookmark_view->m_processing_popup_timer) {
777                 ecore_timer_del(bookmark_view->m_processing_popup_timer);
778                 bookmark_view->m_processing_popup_timer = NULL;
779         }
780
781         bookmark_view->show_notify_popup(BR_STRING_DELETED, 3, EINA_TRUE);
782
783         vector<Browser_Bookmark_DB::bookmark_item *> item_list = bookmark_view->_get_current_folder_item_list();
784         if (item_list.size() == 0)
785                 bookmark_view->_show_empty_content_layout(EINA_TRUE);
786 }
787
788 void Browser_Bookmark_View::__select_processing_popup_response_cb(void *data, Evas_Object *obj, void *event_info)
789 {
790         BROWSER_LOGD("[%s]", __func__);
791         if (!data)
792                 return;
793
794         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
795
796         evas_object_del(bookmark_view->m_processing_popup);
797         bookmark_view->m_processing_progress_bar = NULL;
798         bookmark_view->m_processed_it = NULL;
799
800         if (bookmark_view->m_processing_popup_timer) {
801                 ecore_timer_del(bookmark_view->m_processing_popup_timer);
802                 bookmark_view->m_processing_popup_timer = NULL;
803         }
804
805         Elm_Object_Item *it = elm_genlist_first_item_get(bookmark_view->_get_current_folder_genlist());
806         int check_count = 0;
807         while(it) {
808                 Browser_Bookmark_DB::bookmark_item *item = NULL;
809                 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
810                 if (item) {
811                         if(item->is_editable && item->is_delete)
812                                 check_count++;
813                 }
814                 it = elm_genlist_item_next_get(it);
815         }
816
817         if (check_count)
818                 elm_object_item_disabled_set(bookmark_view->m_bookmark_delete_controlbar_item, EINA_FALSE);
819         else
820                 elm_object_item_disabled_set(bookmark_view->m_bookmark_delete_controlbar_item, EINA_TRUE);
821 }
822
823 void Browser_Bookmark_View::__edit_mode_select_all_clicked_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
824 {
825         if (!data)
826                 return;
827
828         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
829         int item_count = bookmark_view->_get_current_folder_item_list().size();
830         BROWSER_LOGD("item_count=%d", item_count);
831
832         if (item_count >= BROWSER_BOOKMARK_PROCESS_BLOCK_COUNT)
833                 bookmark_view->_show_select_processing_popup();
834         else {
835                 Eina_Bool value = elm_check_state_get(bookmark_view->m_edit_mode_select_all_check_button);
836                 elm_check_state_set(bookmark_view->m_edit_mode_select_all_check_button, !value);
837
838                 Elm_Object_Item *it = elm_genlist_first_item_get(bookmark_view->_get_current_folder_genlist());
839                 while(it) {
840                         Browser_Bookmark_DB::bookmark_item *item = NULL;
841                         item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
842                         if (item) {
843                                 if(item->is_editable) {
844                                         item->is_delete = !value;
845                                         elm_genlist_item_update(it);
846                                 }
847                         }
848                         it = elm_genlist_item_next_get(it);
849                 }
850
851                 bookmark_view->_show_selection_info();
852         }
853 }
854
855 void Browser_Bookmark_View::__edit_mode_select_all_check_changed_cb(void *data,
856                                                         Evas_Object *obj, void *event_info)
857 {
858         BROWSER_LOGD("[%s]", __func__);
859         if (!data)
860                 return;
861
862         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
863         int item_count = bookmark_view->_get_current_folder_item_list().size();
864         BROWSER_LOGD("item_count=%d", item_count);
865         Eina_Bool value = elm_check_state_get(obj);
866
867         if (item_count >= BROWSER_BOOKMARK_PROCESS_BLOCK_COUNT) {
868                 /* Workaround to share the same code with __edit_mode_select_all_clicked_cb */
869                 elm_check_state_set(obj, !value);
870                 bookmark_view->_show_select_processing_popup();
871         } else {
872                 Elm_Object_Item *it = elm_genlist_first_item_get(bookmark_view->_get_current_folder_genlist());
873                 while(it) {
874                         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
875                         if (item) {
876                                 if(item->is_editable) {
877                                         item->is_delete = value;
878                                         elm_genlist_item_update(it);
879                                 }
880                         }
881                         it = elm_genlist_item_next_get(it);
882                 }
883
884                 bookmark_view->_show_selection_info();
885         }
886 }
887
888 void Browser_Bookmark_View::_show_selection_info(void)
889 {
890         BROWSER_LOGD("[%s]", __func__);
891         int editable_item_count = 0;
892         int editable_folder_count = 0;
893
894         Elm_Object_Item *it = elm_genlist_first_item_get(_get_current_folder_genlist());
895         while(it) {
896                 Browser_Bookmark_DB::bookmark_item *item = NULL;
897                 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
898                 if (item->is_delete) {
899                         if (item->is_folder)
900                                 editable_folder_count++;
901                         else
902                                 editable_item_count++;
903                 }
904                 it = elm_genlist_item_next_get(it);
905         }
906
907         if (editable_folder_count == 0 && editable_item_count == 0) {
908                 elm_object_item_disabled_set(m_bookmark_delete_controlbar_item, EINA_TRUE);
909                 hide_notify_popup();
910                 return;
911         } else
912                 elm_object_item_disabled_set(m_bookmark_delete_controlbar_item, EINA_FALSE);
913
914         if (editable_folder_count + editable_item_count == 1) {
915                 show_notify_popup(BR_STRING_ONE_ITEM_SELECTED, 0, EINA_TRUE);
916         } else if (editable_folder_count + editable_item_count > 1) {
917                 char *small_popup_text = NULL;
918                 int string_len = strlen(BR_STRING_ITEMS_SELECTED) + 4; /* 4 : reserved for maximun count */
919
920                 small_popup_text = (char *)malloc(string_len * sizeof(char));
921                 memset(small_popup_text, 0x00, string_len);
922
923                 snprintf(small_popup_text, string_len, BR_STRING_ITEMS_SELECTED, editable_folder_count + editable_item_count);
924                 show_notify_popup(small_popup_text, 0, EINA_TRUE);
925
926                 if (small_popup_text)
927                         free(small_popup_text);
928                 small_popup_text = 0x00;
929         }
930 }
931
932 void Browser_Bookmark_View::_set_edit_mode(Eina_Bool edit_mode)
933 {
934         BROWSER_LOGD("[%s]", __func__);
935         hide_notify_popup();
936
937         if (edit_mode) {
938                 elm_object_style_set(m_bg, "edit_mode");
939
940                 m_edit_mode_select_all_layout = elm_layout_add(m_genlist_content_box);
941                 if (!m_edit_mode_select_all_layout) {
942                         BROWSER_LOGE("elm_layout_add failed");
943                         return;
944                 }
945                 elm_layout_theme_set(m_edit_mode_select_all_layout, "genlist", "item", "select_all/default");
946                 evas_object_size_hint_weight_set(m_edit_mode_select_all_layout, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
947                 evas_object_size_hint_align_set(m_edit_mode_select_all_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
948                 evas_object_event_callback_add(m_edit_mode_select_all_layout, EVAS_CALLBACK_MOUSE_DOWN,
949                                                 __edit_mode_select_all_clicked_cb, this);
950                 m_edit_mode_select_all_check_button = elm_check_add(m_edit_mode_select_all_layout);
951                 if (!m_edit_mode_select_all_check_button) {
952                         BROWSER_LOGE("elm_layout_add failed");
953                         return;
954                 }
955                 evas_object_smart_callback_add(m_edit_mode_select_all_check_button, "changed",
956                                                 __edit_mode_select_all_check_changed_cb, this);
957                 evas_object_propagate_events_set(m_edit_mode_select_all_check_button, EINA_FALSE);
958
959                 elm_object_part_content_set(m_edit_mode_select_all_layout, "elm.icon", m_edit_mode_select_all_check_button);
960                 elm_object_text_set(m_edit_mode_select_all_layout, BR_STRING_SELECT_ALL);
961
962                 elm_box_pack_start(m_genlist_content_box, m_edit_mode_select_all_layout);
963                 evas_object_show(m_edit_mode_select_all_layout);
964
965                 Elm_Object_Item *it = NULL;
966                 Browser_Bookmark_DB::bookmark_item *item = NULL;
967                 it = elm_genlist_first_item_get(_get_current_folder_genlist());
968                 while(it) {
969                         item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
970                         if (!item->is_editable)
971                                 elm_object_item_disabled_set(it, EINA_TRUE);
972
973                         it = elm_genlist_item_next_get(it);
974                 }
975                 elm_genlist_reorder_mode_set(_get_current_folder_genlist(), EINA_TRUE);
976                 elm_genlist_decorate_mode_set(_get_current_folder_genlist(), EINA_TRUE);
977                 elm_genlist_select_mode_set(_get_current_folder_genlist(), ELM_OBJECT_SELECT_MODE_ALWAYS);
978
979                 _set_navigationbar_title(BR_STRING_SELECT_ITEMS);
980
981                 if (m_current_folder_id != BROWSER_BOOKMARK_MAIN_FOLDER_ID) {
982                         edje_object_signal_emit(elm_layout_edje_get(m_genlist_content_layout),
983                                                                 "hide,upper_folder,signal", "");
984                         evas_object_hide(m_upper_folder_list);
985                 }
986
987                 if (!_set_controlbar_type(BOOKMARK_VIEW_EDIT_MODE))
988                         BROWSER_LOGE("_set_controlbar_type(BOOKMARK_VIEW_DEFAULT) failed");
989         }else {
990                 elm_object_style_set(m_bg, "default");
991
992                 if (m_edit_mode_select_all_check_button) {
993                         evas_object_del(m_edit_mode_select_all_check_button);
994                         m_edit_mode_select_all_check_button = NULL;
995                 }
996                 if (m_edit_mode_select_all_layout) {
997                         elm_box_unpack(m_genlist_content_box, m_edit_mode_select_all_layout);
998                         evas_object_del(m_edit_mode_select_all_layout);
999                         m_edit_mode_select_all_layout = NULL;
1000                 }
1001
1002                 Elm_Object_Item *it = NULL;
1003                 Browser_Bookmark_DB::bookmark_item *item = NULL;
1004                 it = elm_genlist_first_item_get(_get_current_folder_genlist());
1005                 while(it) {
1006                         item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
1007                         if (!item->is_editable)
1008                                 elm_object_item_disabled_set(it, EINA_FALSE);
1009                         item->is_delete = EINA_FALSE;
1010                         it = elm_genlist_item_next_get(it);
1011                 }
1012                 elm_genlist_decorate_mode_set(_get_current_folder_genlist(), EINA_FALSE);
1013                 elm_genlist_reorder_mode_set(_get_current_folder_genlist(), EINA_FALSE);
1014
1015                 elm_genlist_select_mode_set(_get_current_folder_genlist(), ELM_OBJECT_SELECT_MODE_DEFAULT);
1016
1017                 _set_navigationbar_title(BR_STRING_BOOKMARKS);
1018
1019                 if (m_current_folder_id != BROWSER_BOOKMARK_MAIN_FOLDER_ID) {
1020                         edje_object_signal_emit(elm_layout_edje_get(m_genlist_content_layout),
1021                                                                 "show,upper_folder,signal", "");
1022                         evas_object_show(m_upper_folder_list);
1023                 }
1024
1025                 if (!_set_controlbar_type(BOOKMARK_VIEW_DEFAULT))
1026                         BROWSER_LOGE("_set_controlbar_type(BOOKMARK_VIEW_DEFAULT) failed");
1027         }
1028 }
1029
1030 void Browser_Bookmark_View::_set_view_mode(view_mode mode)
1031 {
1032         BROWSER_LOGD("mode=%d", mode);
1033         Evas_Object *history_layout = NULL;
1034         if (m_data_manager->get_history_layout())
1035                 history_layout = m_data_manager->get_history_layout()->get_main_layout();
1036
1037         m_view_mode = mode;
1038         if (mode == HISTORY_VIEW) {
1039                 if (history_layout) {
1040                         elm_object_part_content_set(m_main_layout, "elm.swallow.content1", history_layout);
1041                         evas_object_show(history_layout);
1042                 }
1043
1044                 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,content1,signal", "");
1045
1046                 _set_navigationbar_title(BR_STRING_HISTORY);
1047
1048                 if (elm_genlist_decorate_mode_get(m_data_manager->get_history_layout()->m_history_genlist))      {
1049                         if (!_set_controlbar_type(HISTORY_VIEW_EDIT_MODE))
1050                                 BROWSER_LOGE("_set_controlbar_type HISTORY_VIEW_EDIT_MODE failed");
1051                 } else {
1052                         if (!_set_controlbar_type(HISTORY_VIEW_DEFAULT))
1053                                 BROWSER_LOGE("_set_controlbar_type HISTORY_VIEW_DEFAULT failed");
1054                 }
1055         } else if (mode == BOOKMARK_VIEW){
1056                 if (history_layout)
1057                         evas_object_hide(history_layout);
1058                 edje_object_signal_emit(elm_layout_edje_get(m_main_layout), "show,content0,signal", "");
1059
1060                 if (m_current_folder_id == BROWSER_BOOKMARK_MAIN_FOLDER_ID)
1061                         _set_navigationbar_title(BR_STRING_BOOKMARKS);
1062                 else {
1063                         _set_navigationbar_title(m_current_bookmark_navigationbar_title.c_str());
1064                 }
1065
1066                 if (elm_genlist_decorate_mode_get(_get_current_folder_genlist())) {
1067                         if (!_set_controlbar_type(BOOKMARK_VIEW_EDIT_MODE))
1068                                 BROWSER_LOGE("_set_controlbar_type BOOKMARK_VIEW_EDIT_MODE failed");
1069                 } else {
1070                         if (!_set_controlbar_type(BOOKMARK_VIEW_DEFAULT))
1071                                 BROWSER_LOGE("_set_controlbar_type BOOKMARK_VIEW_DEFAULT failed");
1072                 }
1073         }
1074 }
1075
1076 void Browser_Bookmark_View::__controlbar_tab_changed_cb(void *data, Evas_Object *obj, void *event_info)
1077 {
1078         if (!data)
1079                 return;
1080
1081         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
1082         Elm_Object_Item *selected_item = elm_toolbar_selected_item_get(obj);
1083         Elm_Object_Item *history_item = elm_toolbar_last_item_get(obj);
1084         if (!selected_item) {
1085                 BROWSER_LOGD("no item selected");
1086                 return;
1087         }
1088
1089         if (selected_item == history_item) {
1090                 BROWSER_LOGD("tab history");
1091                 /* history selected */
1092                 if (!m_data_manager->get_history_layout()) {
1093                         if (!m_data_manager->create_history_layout()) {
1094                                 BROWSER_LOGE("m_data_manager->create_history_layout() failed");
1095                                 return;
1096                         }
1097
1098                         if (!m_data_manager->get_history_layout()->init()) {
1099                                 BROWSER_LOGE("get_history_layout()->init() failed");
1100                                 return;
1101                         }
1102                 }
1103
1104                 bookmark_view->hide_notify_popup();
1105                 bookmark_view->_set_view_mode(HISTORY_VIEW);
1106
1107         } else {
1108                 BROWSER_LOGD("tab bookmark");
1109                 if (m_data_manager->get_history_layout()) {
1110                         m_data_manager->get_history_layout()->hide_notify_popup();
1111                         bookmark_view->_set_view_mode(BOOKMARK_VIEW);
1112                 }
1113         }
1114 }
1115
1116 /* bookmark -> edit(left option button -> edit button of each bookmark item. */
1117 void Browser_Bookmark_View::__edit_bookmark_item_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1118 {
1119         BROWSER_LOGD("[%s]", __func__);
1120         if (!data)
1121                 return;
1122         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)data;
1123         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)(item->user_data_1);
1124
1125         /* Pass the selected genlist item as parameter when bookmark -> Edit item
1126             because of increase performance. */
1127         bookmark_view->m_current_genlist_item_to_edit = (Elm_Object_Item *)(item->user_data_2);
1128
1129         elm_check_state_set(bookmark_view->m_edit_mode_select_all_check_button, EINA_FALSE);
1130
1131         bookmark_view->hide_notify_popup();
1132
1133         bookmark_view->_set_edit_mode(EINA_FALSE);
1134
1135         if (!m_data_manager->create_edit_bookmark_view(item->title, item->url,
1136                                         bookmark_view->m_current_folder_id)) {
1137                 BROWSER_LOGE("create_edit_bookmark_view failed");
1138                 return;
1139         }
1140
1141         if (!m_data_manager->get_edit_bookmark_view()->init()) {
1142                 BROWSER_LOGE("get_edit_bookmark_view()->init() failed");
1143                 m_data_manager->destroy_edit_bookmark_view();
1144                 return;
1145         }
1146 }
1147
1148 void Browser_Bookmark_View::__rename_folder_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1149 {
1150         BROWSER_LOGD("[%s]", __func__);
1151         if (!data)
1152                 return;
1153         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)data;
1154         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)(item->user_data_1);
1155         Elm_Object_Item *it = (Elm_Object_Item *)(item->user_data_2);
1156         elm_genlist_item_flip_set(it, EINA_TRUE);
1157
1158         elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1159
1160         evas_object_data_set(bookmark_view->_get_current_folder_genlist(), "selected_it", it);
1161 }
1162
1163 void Browser_Bookmark_View::__rename_folder_entry_enter_key_cb(void *data, Evas_Object *obj,
1164                                                                                         void *event_info)
1165 {
1166         BROWSER_LOGD("[%s]", __func__);
1167         if (!data)
1168                 return;
1169
1170         Evas_Object *rename_edit_field = (Evas_Object *)data;
1171         elm_object_focus_set(rename_edit_field, EINA_FALSE);
1172 }
1173
1174 void Browser_Bookmark_View::__rename_folder_unfocus_cb(void *data, Evas_Object *obj, void *event_info)
1175 {
1176         BROWSER_LOGD("[%s]", __func__);
1177         if (!data)
1178                 return;
1179
1180         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)data;
1181         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)item->user_data_1;
1182
1183         Evas_Object *genlist = bookmark_view->_get_current_folder_genlist();
1184
1185         Evas_Object *edit_field_entry = obj;
1186         char *markup_text = elm_entry_markup_to_utf8(elm_entry_entry_get(edit_field_entry));
1187         char *text = bookmark_view->_trim(markup_text);
1188         if (!text) {
1189                 BROWSER_LOGE("elm_entry_markup_to_utf8 failed");
1190                 return;
1191         }
1192         Elm_Object_Item *it = (Elm_Object_Item *)evas_object_data_get(genlist, "selected_it");
1193
1194         Eina_Bool only_has_space = EINA_FALSE;
1195         int space_count = 0;
1196         if (text && strlen(text)) {
1197                 for (int i = 0 ; i < strlen(text) ; i++) {
1198                         if (text[i] == ' ')
1199                                 space_count++;
1200                 }
1201                 if (space_count == strlen(text))
1202                         only_has_space = EINA_TRUE;
1203         }
1204
1205         if (!text || strlen(text) == 0 || only_has_space) {
1206                 bookmark_view->show_msg_popup(BR_STRING_ENTER_FOLDER_NAME);
1207                 elm_entry_entry_set(edit_field_entry, item->title.c_str());
1208         } else {
1209                 if (strcmp(text, item->title.c_str())) {
1210                         if (!m_data_manager->get_bookmark_db()->is_duplicated(text)) {
1211                                 item->title = text;
1212                                 m_data_manager->get_bookmark_db()->modify_bookmark_title(item->id, text);
1213                         } else {
1214                                 if (elm_genlist_decorate_mode_get(bookmark_view->_get_current_folder_genlist()))
1215                                         bookmark_view->show_msg_popup(BR_STRING_ALREADY_EXISTS);
1216
1217                                 std::string folder_name = m_data_manager->get_bookmark_db()->get_folder_name_by_id(item->id);
1218                                 elm_entry_entry_set(edit_field_entry, folder_name.c_str());
1219                         }
1220                 }
1221         }
1222         elm_genlist_item_flip_set(it, EINA_FALSE);
1223
1224         elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT);
1225
1226         bookmark_view->m_rename_edit_field = NULL;
1227
1228         free(markup_text);
1229 }
1230
1231 void Browser_Bookmark_View::__drag_genlist_cb(void *data, Evas_Object *obj, void *event_info)
1232 {
1233         BROWSER_LOGD("[%s]", __func__);
1234 }
1235
1236 #if defined(GENLIST_SWEEP)
1237 void Browser_Bookmark_View::__sweep_right_genlist_cb(void *data, Evas_Object *obj, void *event_info)
1238 {
1239         BROWSER_LOGD("[%s]", __func__);
1240         if (!data)
1241                 return;
1242         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
1243
1244         if (elm_genlist_decorate_mode_get(obj))
1245                 return;
1246         else {
1247                 elm_genlist_item_decorate_mode_set((Elm_Object_Item *)event_info, "slide", EINA_TRUE);
1248                 elm_genlist_item_select_mode_set((Elm_Object_Item *)event_info, ELM_OBJECT_SELECT_MODE_NONE);
1249         }
1250
1251         if (bookmark_view->m_current_sweep_item
1252             && (Elm_Object_Item *)event_info != bookmark_view->m_current_sweep_item) {
1253                 elm_genlist_item_select_mode_set(bookmark_view->m_current_sweep_item, ELM_OBJECT_SELECT_MODE_DEFAULT);
1254                 bookmark_view->m_current_sweep_item = (Elm_Object_Item *)event_info;
1255         }
1256 }
1257
1258 void Browser_Bookmark_View::__sweep_cancel_genlist_cb(void *data,
1259                                                 Evas_Object *obj, void *event_info)
1260 {
1261         BROWSER_LOGD("[%s]", __func__);
1262
1263         if (!data)
1264                 return;
1265
1266         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
1267         Elm_Object_Item *it = (Elm_Object_Item*)elm_genlist_decorated_item_get(obj);
1268         if (it) {
1269                 elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
1270                 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT);
1271
1272                 if (it == bookmark_view->m_current_sweep_item)
1273                         bookmark_view->m_current_sweep_item = NULL;
1274         }
1275 }
1276
1277 void Browser_Bookmark_View::__sweep_left_genlist_cb(void *data, Evas_Object *obj, void *event_info)
1278 {
1279         BROWSER_LOGD("[%s]", __func__);
1280         if (!data)
1281                 return;
1282         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
1283
1284         if (elm_genlist_decorate_mode_get(obj))
1285                 return;
1286         else {
1287                 elm_genlist_item_decorate_mode_set((Elm_Object_Item *)event_info, "slide", EINA_FALSE);
1288                 elm_genlist_item_select_mode_set((Elm_Object_Item *)event_info, ELM_OBJECT_SELECT_MODE_DEFAULT);
1289         }
1290
1291         bookmark_view->m_current_sweep_item = NULL;
1292 }
1293 #endif
1294
1295 char *Browser_Bookmark_View::__genlist_label_get_cb(void *data, Evas_Object *obj, const char *part)
1296 {
1297         BROWSER_LOGD("part=%s", part);
1298         if (!data)
1299                 return NULL;
1300
1301         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)data;
1302
1303         const char *title = item->title.c_str();
1304         BROWSER_LOGD("title(%p)=%s", title, title);
1305         const char *url = item->url.c_str();
1306         BROWSER_LOGD("url(%p)=%s", url, url);
1307
1308         if (part && strlen(part) > 0) {
1309                 if (!strncmp(part,"elm.text", strlen("elm.text"))
1310                     || !strncmp(part, "elm.base.text", strlen("elm.base.text"))
1311                     || !strncmp(part, "elm.slide.text.1", strlen("elm.slide.text.1"))) {
1312                         if (title && strlen(title))
1313                                 return strdup(title);
1314                         else
1315                                 return NULL;
1316                 } else if (!strncmp(part, "elm.text.sub", strlen("elm.text.sub"))) {
1317                         if (url && strlen(url))
1318                                 return strdup(url);
1319                         else
1320                                 return NULL;
1321                 }
1322         }
1323
1324         return NULL;
1325 }
1326
1327 Evas_Object *Browser_Bookmark_View::__genlist_icon_get_cb(void *data, Evas_Object *obj, const char *part)
1328 {
1329         BROWSER_LOGD("[%s]", __func__);
1330         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)data;
1331         if (!data)
1332                 return NULL;
1333
1334         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)item->user_data_1;
1335
1336         if (part && strlen(part) > 0) {
1337                 if (!strncmp(part, "elm.icon", strlen("elm.icon"))) {
1338                         if (item->is_folder) {
1339                                 Evas_Object *folder_icon = elm_icon_add(obj);
1340                                 if (!elm_icon_file_set(folder_icon, BROWSER_IMAGE_DIR"/folder.png", NULL)) {
1341                                         BROWSER_LOGE("elm_icon_file_set is failed.\n");
1342                                         return NULL;
1343                                 }
1344                                 evas_object_size_hint_aspect_set(folder_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1345                                 return folder_icon;
1346                         } else {
1347                                 Evas_Object *favicon = NULL;
1348                                 favicon = m_data_manager->get_browser_view()->get_favicon(item->url.c_str());
1349                                 if (favicon)
1350                                         return favicon;
1351                                 else {
1352                                         Evas_Object *default_icon = elm_icon_add(obj);
1353                                         if (!default_icon)
1354                                                 return NULL;
1355                                         if (!elm_icon_file_set(default_icon, BROWSER_IMAGE_DIR"/faviconDefault.png", NULL)) {
1356                                                 BROWSER_LOGE("elm_icon_file_set is failed.\n");
1357                                                 return NULL;
1358                                         }
1359                                         evas_object_size_hint_aspect_set(default_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
1360                                         return default_icon;
1361                                 }
1362                         }
1363                 } else if (!strncmp(part, "elm.slide.swallow.1", strlen("elm.slide.swallow.1"))) {
1364                         Evas_Object *edit_button = elm_button_add(obj);
1365                         if (!edit_button) {
1366                                 BROWSER_LOGE("elm_button_add is failed.\n");
1367                                 return NULL;
1368                         }
1369                         elm_object_style_set(edit_button, "text_only/sweep");
1370                         elm_object_text_set(edit_button, BR_STRING_EDIT);
1371                         if (!item->is_editable)
1372                                 elm_object_disabled_set(edit_button, EINA_TRUE);
1373                         evas_object_smart_callback_add(edit_button, "clicked", __slide_edit_button_clicked_cb, item);
1374                         return edit_button;
1375                 } else if (!strncmp(part, "elm.slide.swallow.2", strlen("elm.slide.swallow.2"))) {
1376                         if (item->is_folder) {
1377                                 Evas_Object *delete_button = elm_button_add(obj);
1378                                 if (!delete_button) {
1379                                         BROWSER_LOGE("elm_button_add is failed.\n");
1380                                         return NULL;
1381                                 }
1382                                 elm_object_style_set(delete_button, "text_only/sweep");
1383                                 elm_object_text_set(delete_button, BR_STRING_DELETE);
1384                                 if (!item->is_editable)
1385                                         elm_object_disabled_set(delete_button, EINA_TRUE);
1386                                 evas_object_smart_callback_add(delete_button, "clicked", __slide_delete_button_clicked_cb, item);
1387                                 return delete_button;
1388                         } else {
1389                                 Evas_Object *share_button = elm_button_add(obj);
1390                                 if (!share_button) {
1391                                         BROWSER_LOGE("elm_button_add is failed.\n");
1392                                         return NULL;
1393                                 }
1394                                 elm_object_style_set(share_button, "text_only/sweep");
1395                                 elm_object_text_set(share_button, BR_STRING_SHARE);
1396                                 evas_object_smart_callback_add(share_button, "clicked", __slide_share_button_clicked_cb, item);
1397                                 return share_button;
1398                         }
1399                 } else if (!strncmp(part, "elm.slide.swallow.3", strlen("elm.slide.swallow.3"))) {
1400                         Evas_Object *delete_button = elm_button_add(obj);
1401                         if (!delete_button) {
1402                                 BROWSER_LOGE("elm_button_add is failed.\n");
1403                                 return NULL;
1404                         }
1405                         elm_object_style_set(delete_button, "text_only/sweep");
1406                         elm_object_text_set(delete_button, BR_STRING_DELETE);
1407                         if (!item->is_editable)
1408                                 elm_object_disabled_set(delete_button, EINA_TRUE);
1409                         evas_object_smart_callback_add(delete_button, "clicked", __slide_delete_button_clicked_cb, item);
1410                         return delete_button;
1411                 }
1412
1413                 if (elm_genlist_decorate_mode_get(obj)) {
1414                         if (!strncmp(part, "elm.edit.icon.1", strlen("elm.edit.icon.1"))) {
1415                                 Evas_Object *check_button = elm_check_add(obj);
1416                                 if (!check_button) {
1417                                         BROWSER_LOGE("elm_check_add is failed.\n");
1418                                         return NULL;
1419                                 }
1420                                 evas_object_propagate_events_set(check_button, EINA_FALSE);
1421
1422                                 if (!item->is_editable)
1423                                         elm_object_disabled_set(check_button, EINA_TRUE);
1424
1425                                 elm_check_state_pointer_set(check_button, &item->is_delete);
1426                                 evas_object_smart_callback_add(check_button, "changed",
1427                                                                 __edit_mode_item_check_changed_cb, item);
1428                                 return check_button;
1429                         } else if (!strncmp(part, "elm.edit.icon.2", strlen("elm.edit.icon.2"))) {
1430                                 Evas_Object *button = elm_button_add(obj);
1431                                 if (!button) {
1432                                         BROWSER_LOGE("elm_button_add is failed.\n");
1433                                         return NULL;
1434                                 }
1435                                 evas_object_propagate_events_set(button, EINA_FALSE);
1436
1437                                 if (!item->is_editable)
1438                                         elm_object_disabled_set(button, EINA_TRUE);
1439                                 if (item->is_folder) {
1440                                         elm_object_style_set(button, "rename");
1441                                         evas_object_smart_callback_add(button, "clicked",
1442                                                                 __rename_folder_button_clicked_cb, item);
1443                                 } else {
1444                                         elm_object_style_set(button, "reveal");
1445                                         evas_object_smart_callback_add(button, "clicked",
1446                                                                 __edit_bookmark_item_button_clicked_cb, item);
1447                                 }
1448                                 return button;
1449                         } else if (!strncmp(part, "elm.flip.content", strlen("elm.flip.content"))) {
1450                                 Evas_Object *edit_field = br_elm_editfield_add(obj);
1451                                 br_elm_editfield_entry_single_line_set(edit_field, EINA_TRUE);
1452                                 br_elm_editfield_eraser_set(edit_field, EINA_TRUE);
1453
1454                                 bookmark_view->m_rename_edit_field = edit_field;
1455                                 evas_object_data_set(bookmark_view->m_rename_edit_field, "item", item);
1456
1457                                 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(edit_field);
1458                                 elm_entry_entry_set(edit_field_entry, item->title.c_str());
1459                                 elm_entry_cursor_end_set(edit_field_entry);
1460
1461                                 evas_object_smart_callback_add(edit_field_entry, "unfocused",
1462                                                                 __rename_folder_unfocus_cb, data);
1463                                 evas_object_smart_callback_add(edit_field_entry, "activated",
1464                                                                 __rename_folder_entry_enter_key_cb, edit_field);
1465
1466                                 ecore_idler_add(__set_focus_editfield_idler_cb, edit_field);
1467
1468                                 return edit_field;
1469                         }
1470                 }
1471         }
1472
1473         return NULL;
1474 }
1475
1476 Eina_Bool Browser_Bookmark_View::_is_empty_folder(string folder_name)
1477 {
1478         BROWSER_LOGD("[%s]", __func__);
1479         Browser_Bookmark_DB *bookmark_db = m_data_manager->get_bookmark_db();
1480         int folder_id;
1481         Eina_Bool ret = bookmark_db->get_folder_id(BROWSER_BOOKMARK_MAIN_FOLDER_ID, folder_name.c_str(), &folder_id);
1482         if (!ret) {
1483                 BROWSER_LOGE("get_folder_id is failed.");
1484                 return EINA_FALSE;
1485         }
1486
1487         vector<Browser_Bookmark_DB::bookmark_item *> bookmark_list;
1488         ret = bookmark_db->get_bookmark_list(bookmark_list, folder_id);
1489         if (!ret) {
1490                 BROWSER_LOGE("get_bookmark_list failed");
1491                 return EINA_FALSE;
1492         }
1493
1494         int count = bookmark_list.size();
1495
1496         for(int i = 0 ; i < bookmark_list.size() ; i++ ) {
1497                 if (bookmark_list[i])
1498                         delete bookmark_list[i];
1499         }
1500         bookmark_list.clear();
1501
1502         if(count)
1503                 return EINA_FALSE;
1504         else
1505                 return EINA_TRUE;
1506 }
1507
1508 void Browser_Bookmark_View::__slide_edit_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1509 {
1510         BROWSER_LOGD("[%s]", __func__);
1511         if (!data)
1512                 return;
1513
1514         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)data;
1515         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)(item->user_data_1);
1516         bookmark_view->m_current_genlist_item_to_edit = (Elm_Object_Item *)(item->user_data_2);
1517
1518         if (item->is_folder) {
1519                 /* edit folder by slide genlist item */
1520                 if (bookmark_view->_is_empty_folder(item->title)) {
1521                         bookmark_view->show_msg_popup(BR_STRING_EMPTY);
1522                         return;
1523                 }
1524
1525                 bookmark_view->_go_to_sub_foler(item->title.c_str());
1526
1527                 bookmark_view->_set_edit_mode(EINA_TRUE);
1528
1529                 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
1530                 elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_INSTANT_OPEN);
1531                 evas_object_data_set(m_navi_bar, "visible", (void *)EINA_TRUE);
1532
1533                 edje_object_signal_emit(elm_layout_edje_get(bookmark_view->m_main_layout),
1534                                         "expand_header_no_animation,signal", "");
1535         } else {
1536                 /* edit bookmark item by slide genlist item */
1537                 /* Pass the selected genlist item as parameter when bookmark -> Edit item
1538                     because of increase performance. */
1539                 if (!m_data_manager->create_edit_bookmark_view(item->title, item->url,
1540                                                         bookmark_view->m_current_folder_id)) {
1541                         BROWSER_LOGE("create_edit_bookmark_view failed");
1542                         return;
1543                 }
1544
1545                 if (!m_data_manager->get_edit_bookmark_view()->init()) {
1546                         BROWSER_LOGE("new get_edit_bookmark_view()->init() failed");
1547                         m_data_manager->destroy_edit_bookmark_view();
1548                         return;
1549                 }
1550         }
1551
1552         elm_genlist_item_decorate_mode_set(bookmark_view->m_current_genlist_item_to_edit, "slide", EINA_FALSE);
1553         elm_genlist_item_select_mode_set(bookmark_view->m_current_genlist_item_to_edit, ELM_OBJECT_SELECT_MODE_DEFAULT);
1554 }
1555
1556 void Browser_Bookmark_View::__delete_confirm_response_by_slide_button_cb(void *data, Evas_Object *obj,
1557                                                                 void *event_info)
1558 {
1559         BROWSER_LOGD("event_info = %d", (int)event_info);
1560
1561         if (!data)
1562                 return;
1563
1564         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)data;
1565         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)(item->user_data_1);
1566
1567         evas_object_del(bookmark_view->m_delete_confirm_popup);
1568
1569         bookmark_view->_delete_bookmark_item_by_slide_button(item);
1570 }
1571
1572 void Browser_Bookmark_View::__cancel_confirm_response_by_slide_button_cb(void *data, Evas_Object *obj,
1573                                                                 void *event_info)
1574 {
1575         BROWSER_LOGD("event_info = %d", (int)event_info);
1576
1577         if (!data)
1578                 return;
1579
1580         Evas_Object *popup = (Evas_Object *)data;
1581
1582         evas_object_del(popup);
1583 }
1584
1585 void Browser_Bookmark_View::__delete_confirm_response_by_edit_mode_cb(void *data, Evas_Object *obj,
1586                                                                 void *event_info)
1587 {
1588         BROWSER_LOGD("event_info = %d", (int)event_info);
1589
1590         if (!data)
1591                 return;
1592
1593         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
1594
1595         if (bookmark_view->m_delete_confirm_popup) {
1596                 evas_object_del(bookmark_view->m_delete_confirm_popup);
1597                 bookmark_view->m_delete_confirm_popup = NULL;
1598         }
1599
1600         bookmark_view->_delete_selected_bookmark();
1601
1602         bookmark_view->_set_edit_mode(EINA_FALSE);
1603 }
1604
1605 Evas_Object *Browser_Bookmark_View::_show_delete_confirm_popup(void)
1606 {
1607         BROWSER_LOGD("[%s]", __func__);
1608
1609         m_delete_confirm_popup = elm_popup_add(m_navi_bar);
1610         if (!m_delete_confirm_popup) {
1611                 BROWSER_LOGE("elm_popup_add failed");
1612                 return NULL;
1613         }
1614
1615         evas_object_size_hint_weight_set(m_delete_confirm_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1616         elm_object_text_set(m_delete_confirm_popup, BR_STRING_DELETE_Q);
1617
1618         Evas_Object *ok_button = elm_button_add(m_delete_confirm_popup);
1619         elm_object_text_set(ok_button, BR_STRING_YES);
1620         elm_object_part_content_set(m_delete_confirm_popup, "button1", ok_button);
1621
1622         Evas_Object *cancel_button = elm_button_add(m_delete_confirm_popup);
1623         elm_object_text_set(cancel_button, BR_STRING_NO);
1624         elm_object_part_content_set(m_delete_confirm_popup, "button2", cancel_button);
1625
1626         evas_object_smart_callback_add(cancel_button, "clicked", __cancel_confirm_response_by_slide_button_cb,
1627                                                                                 m_delete_confirm_popup);
1628
1629         evas_object_show(m_delete_confirm_popup);
1630
1631         return ok_button;
1632 }
1633
1634 void Browser_Bookmark_View::_delete_bookmark_item_by_slide_button(Browser_Bookmark_DB::bookmark_item *item)
1635 {
1636         BROWSER_LOGD("[%s]", __func__);
1637         Elm_Object_Item *it = (Elm_Object_Item *)(item->user_data_2);
1638         int ret = EINA_TRUE;
1639
1640         if (item->is_folder) {
1641                 int folder_id = 0;
1642                 ret = m_data_manager->get_bookmark_db()->get_folder_id(m_current_folder_id,
1643                                                                         item->title.c_str(), &folder_id);
1644                 if (!ret) {
1645                         BROWSER_LOGE("bookmark_db->get_folder_id failed");
1646                         return;
1647                 }
1648                 ret = m_data_manager->get_bookmark_db()->delete_folder(folder_id);
1649                 if (!ret) {
1650                         BROWSER_LOGE("bookmark_db->delete_folder failed");
1651                         return;
1652                 }
1653         } else {
1654                 ret = m_data_manager->get_bookmark_db()->delete_bookmark(item->id);
1655                 if (!ret) {
1656                         BROWSER_LOGE("bookmark_db->delete_bookmark failed");
1657                         return;
1658                 }
1659         }
1660
1661         _delete_bookmark_item_from_folder_list(item);
1662
1663         elm_object_item_del(it);
1664
1665         if (_get_current_folder_item_list().size() == 0) {
1666                 _show_empty_content_layout(EINA_TRUE);
1667         }
1668
1669         show_notify_popup(BR_STRING_DELETED, 3, EINA_TRUE);
1670 }
1671
1672 void Browser_Bookmark_View::__slide_share_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1673 {
1674         BROWSER_LOGD("[%s]", __func__);
1675         if (!data)
1676                 return;
1677
1678         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)data;
1679         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)(item->user_data_1);
1680         if (!bookmark_view->_show_share_popup(item->url.c_str()))
1681                 BROWSER_LOGE("_show_share_popup failed");
1682 }
1683
1684 void Browser_Bookmark_View::__slide_delete_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1685 {
1686         BROWSER_LOGD("[%s]", __func__);
1687         if (!data)
1688                 return;
1689
1690         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)data;
1691         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)(item->user_data_1);
1692
1693         Evas_Object *ok_button = bookmark_view->_show_delete_confirm_popup();
1694         if (ok_button)
1695                 evas_object_smart_callback_add(ok_button, "clicked",
1696                         __delete_confirm_response_by_slide_button_cb, item);
1697 }
1698
1699 void Browser_Bookmark_View::__genlist_move_cb(void *data, Evas_Object *obj, void *event_info)
1700 {
1701         Elm_Object_Item *it = (Elm_Object_Item *)event_info;
1702
1703         BROWSER_LOGD("moved it = %d", it);
1704
1705         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
1706         Elm_Object_Item *next_it = elm_genlist_item_next_get(it);
1707         Browser_Bookmark_DB::bookmark_item *next_item = NULL;
1708
1709         if (next_it)
1710                 next_item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(next_it);
1711
1712         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)(item->user_data_1);
1713
1714         Elm_Object_Item *index_it = NULL;
1715         Browser_Bookmark_DB::bookmark_item *test_item = NULL;
1716         it = elm_genlist_first_item_get(obj);
1717         while (index_it) {
1718                 test_item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(index_it);
1719                 BROWSER_LOGD("title=%s, order index=%d", test_item->title.c_str(), test_item->order_index);
1720                 index_it = elm_genlist_item_next_get(index_it);
1721         }
1722
1723         if (next_item && (item->order_index < next_item->order_index))
1724                 /* move down */
1725                 bookmark_view->_reorder_bookmark_item(item->order_index, EINA_TRUE);
1726         else
1727                 /* move up */
1728                 bookmark_view->_reorder_bookmark_item(item->order_index, EINA_FALSE);
1729 }
1730
1731 void Browser_Bookmark_View::_reorder_bookmark_item(int order_index, Eina_Bool is_move_down)
1732 {
1733         BROWSER_LOGD("[%s]", __func__);
1734         Browser_Bookmark_DB *bookmark_db = m_data_manager->get_bookmark_db();
1735
1736         Elm_Object_Item *it = NULL;
1737         Elm_Object_Item *next_it = NULL;
1738         Browser_Bookmark_DB::bookmark_item *item = NULL;
1739         Browser_Bookmark_DB::bookmark_item *next_item = NULL;
1740         Eina_Bool ret = EINA_TRUE;
1741         int index = order_index;
1742
1743         if (is_move_down) {
1744                 it = elm_genlist_first_item_get(_get_current_folder_genlist());
1745                 while(it) {
1746                         item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
1747                         if (item->order_index > index) {
1748                                 ret = bookmark_db->modify_bookmark_order_index(item->id, m_current_folder_id, index);
1749                                 if (!ret)
1750                                         BROWSER_LOGD("modify_bookmark_order_index failed");
1751                                 int temp = item->order_index;
1752                                 item->order_index = index;
1753                                 index = temp;
1754                                 elm_object_item_data_set(it, item);
1755                         } else if (item->order_index == order_index) {
1756                                 ret = bookmark_db->modify_bookmark_order_index(item->id, m_current_folder_id, index);
1757                                 item->order_index = index;
1758                                 elm_object_item_data_set(it, item);
1759                                 if (!ret)
1760                                         BROWSER_LOGD("modify_bookmark_order_index failed");
1761                                 break;
1762                         }
1763                         it = elm_genlist_item_next_get(it);
1764                 }
1765         } else {
1766                 index = order_index;
1767                 it = elm_genlist_last_item_get(_get_current_folder_genlist());
1768                 while(it) {
1769                         item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
1770                         if (item->order_index < index) {
1771                                 ret = bookmark_db->modify_bookmark_order_index(item->id, m_current_folder_id, index);
1772                                 if (!ret)
1773                                         BROWSER_LOGD("modify_bookmark_order_index failed");
1774                                 int temp = item->order_index;
1775                                 item->order_index = index;
1776                                 index = temp;
1777                                 elm_object_item_data_set(it, item);
1778                         } else if (item->order_index == order_index) {
1779                                 ret = bookmark_db->modify_bookmark_order_index(item->id, m_current_folder_id, index);
1780                                 item->order_index = index;
1781                                 elm_object_item_data_set(it, item);
1782                                 if (!ret)
1783                                         BROWSER_LOGD("modify_bookmark_order_index failed");
1784                                 break;
1785                         }
1786                         it = elm_genlist_item_prev_get(it);
1787                 }
1788         }
1789 }
1790
1791 void Browser_Bookmark_View::history_item_clicked(const char *url)
1792 {
1793         BROWSER_LOGD("[%s]", __func__);
1794
1795         if (m_data_manager->get_browser_view())
1796                 m_data_manager->get_browser_view()->load_url(url);
1797
1798         if (elm_naviframe_bottom_item_get(m_navi_bar) != elm_naviframe_top_item_get(m_navi_bar))
1799                 elm_naviframe_item_pop(m_navi_bar);
1800 }
1801
1802 void Browser_Bookmark_View::__bookmark_item_clicked_cb(void *data, Evas_Object *obj, void *eventInfo)
1803 {
1804         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
1805         if (!data)
1806                 return;
1807
1808         Elm_Object_Item *seleted_item = elm_genlist_selected_item_get(obj);
1809         Browser_Bookmark_DB::bookmark_item *item = NULL;
1810         item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(seleted_item);
1811
1812         if (!elm_genlist_decorate_mode_get(obj)) {
1813                 if (!item->is_folder) {
1814                         std::string url = std::string(item->url.c_str());
1815
1816                         if (m_data_manager->get_browser_view())
1817                                 m_data_manager->get_browser_view()->load_url(url.c_str());
1818
1819                         if (elm_naviframe_bottom_item_get(bookmark_view->m_navi_bar)
1820                             != elm_naviframe_top_item_get(bookmark_view->m_navi_bar))
1821                                 elm_naviframe_item_pop(bookmark_view->m_navi_bar);
1822                 } else
1823                         bookmark_view->_go_to_sub_foler(item->title.c_str());
1824         } else {
1825                 Elm_Object_Item *it = elm_genlist_selected_item_get(obj);
1826                 Browser_Bookmark_DB::bookmark_item *item = NULL;
1827                 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
1828                 if (item && item->is_editable) {
1829                         item->is_delete = !(item->is_delete);
1830                         elm_genlist_item_update(it);
1831                 }
1832
1833                 int delete_item_count = 0;
1834                 int editable_item_count = 0;
1835                 it = elm_genlist_first_item_get(bookmark_view->_get_current_folder_genlist());
1836                 while(it) {
1837                         if (item->is_editable)
1838                                 editable_item_count++;
1839                         item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
1840                         if (item->is_delete)
1841                                 delete_item_count++;
1842                         it = elm_genlist_item_next_get(it);
1843                 }
1844
1845                 if (editable_item_count == delete_item_count)
1846                         elm_check_state_set(bookmark_view->m_edit_mode_select_all_check_button, EINA_TRUE);
1847                 else
1848                         elm_check_state_set(bookmark_view->m_edit_mode_select_all_check_button, EINA_FALSE);
1849
1850                 bookmark_view->_show_selection_info();
1851         }
1852
1853         elm_genlist_item_selected_set(seleted_item, EINA_FALSE);
1854 }
1855
1856 void Browser_Bookmark_View::__upper_folder_clicked_cb(void *data, Evas_Object *obj, void *eventInfo)
1857 {
1858         BROWSER_LOGD("[%s]", __func__);
1859         if (!data)
1860                 return;
1861
1862         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
1863         bookmark_view->_go_up_to_main_folder();
1864
1865         bookmark_view->_set_navigationbar_title(BR_STRING_BOOKMARKS);
1866 }
1867
1868 Evas_Object *Browser_Bookmark_View::_get_current_folder_genlist(void)
1869 {
1870         if (m_current_folder_id == BROWSER_BOOKMARK_MAIN_FOLDER_ID)
1871                 return m_main_folder_genlist;
1872         else
1873                 return m_sub_folder_genlist;
1874 }
1875
1876 /* This just returns the copy of item list instance.
1877   * Just refer to read. Do not modify(insert or delete) the contents of this return value.
1878   * It doesn't modify the actual m_main_folder_list, m_sub_folder_list contents. */
1879 vector<Browser_Bookmark_DB::bookmark_item *> Browser_Bookmark_View::_get_current_folder_item_list(void)
1880 {
1881         if (m_current_folder_id == BROWSER_BOOKMARK_MAIN_FOLDER_ID)
1882                 return m_main_folder_list;
1883         else
1884                 return m_sub_folder_list;
1885 }
1886
1887 void Browser_Bookmark_View::_show_empty_content_layout(Eina_Bool is_empty)
1888 {
1889         BROWSER_LOGD("is_empty=%d", is_empty);
1890         if (m_view_mode == BOOKMARK_VIEW) {
1891                 if (!_set_controlbar_type(BOOKMARK_VIEW_DEFAULT))
1892                         BROWSER_LOGE("_set_controlbar_type(BOOKMARK_VIEW_DEFAULT) failed");
1893         }
1894
1895         if (is_empty) {
1896                 if (m_edit_mode_select_all_check_button) {
1897                         evas_object_del(m_edit_mode_select_all_check_button);
1898                         m_edit_mode_select_all_check_button = NULL;
1899                 }
1900                 if (m_edit_mode_select_all_layout) {
1901                         elm_box_unpack(m_genlist_content_box, m_edit_mode_select_all_layout);
1902                         evas_object_del(m_edit_mode_select_all_layout);
1903                         m_edit_mode_select_all_layout = NULL;
1904                 }
1905
1906                 if (m_no_contents) {
1907                         evas_object_del(m_no_contents);
1908                         m_no_contents = NULL;
1909                 }
1910
1911                 m_no_contents = elm_layout_add(m_main_layout);
1912                 if (!m_no_contents) {
1913                         BROWSER_LOGE("elm_layout_add failed");
1914                 }
1915                 elm_layout_theme_set(m_no_contents, "layout", "no_bookmark", "full");
1916                 elm_object_part_text_set (m_no_contents, "elm.text", BR_STRING_NO_BOOKMARKS);
1917                 evas_object_size_hint_weight_set(m_no_contents, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1918                 evas_object_size_hint_align_set(m_no_contents, EVAS_HINT_FILL, EVAS_HINT_FILL);
1919                 elm_object_part_content_set(m_genlist_content_layout, "elm.swallow.no_content", m_no_contents);
1920                 edje_object_signal_emit(elm_layout_edje_get(m_genlist_content_layout), "hide,content_box,signal", "");
1921                 evas_object_show(m_no_contents);
1922
1923                 elm_object_item_disabled_set(m_bookmark_edit_controlbar_item, EINA_TRUE);
1924         }else {
1925                 if (m_no_contents) {
1926                         elm_object_part_content_unset(m_genlist_content_layout, "elm.swallow.no_content");
1927                         evas_object_del(m_no_contents);
1928                         m_no_contents = NULL;
1929                         edje_object_signal_emit(elm_layout_edje_get(m_genlist_content_layout),
1930                                                 "show,content_box,signal", "");
1931                 }
1932
1933                 elm_object_item_disabled_set(m_bookmark_edit_controlbar_item, EINA_FALSE);
1934         }
1935 }
1936
1937 void Browser_Bookmark_View::_go_up_to_main_folder(void)
1938 {
1939         BROWSER_LOGD("[%s]", __func__);
1940
1941         m_current_folder_id = BROWSER_BOOKMARK_MAIN_FOLDER_ID;
1942
1943         elm_box_unpack(m_genlist_content_box, m_sub_folder_conformant);
1944         elm_box_pack_end(m_genlist_content_box, m_conformant);
1945         evas_object_show(m_conformant);
1946
1947         edje_object_signal_emit(elm_layout_edje_get(m_genlist_content_layout), "hide,upper_folder,signal", "");
1948
1949         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
1950         elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_INSTANT_OPEN);
1951         evas_object_data_set(m_navi_bar, "visible", (void *)EINA_TRUE);
1952
1953         for(int i = 0 ; i < m_sub_folder_list.size() ; i++) {
1954                 if (m_sub_folder_list[i]) {
1955                         delete m_sub_folder_list[i];
1956                         m_sub_folder_list.erase(m_sub_folder_list.begin() + i);
1957                 }
1958         }
1959         m_sub_folder_list.clear();
1960
1961         if (m_upper_folder_icon) {
1962                 evas_object_del(m_upper_folder_icon);
1963                 m_upper_folder_icon = NULL;
1964         }
1965         if (m_upper_folder_list) {
1966                 evas_object_del(m_upper_folder_list);
1967                 m_upper_folder_list = NULL;
1968         }
1969         if (m_sub_folder_genlist) {
1970                 evas_object_del(m_sub_folder_genlist);
1971                 m_sub_folder_genlist = NULL;
1972         }
1973         if (m_sub_folder_conformant) {
1974                 evas_object_del(m_sub_folder_conformant);
1975                 m_sub_folder_conformant = NULL;
1976         }
1977
1978         if (m_main_folder_list.size() == 0)
1979                 _show_empty_content_layout(EINA_TRUE);
1980         else
1981                 _show_empty_content_layout(EINA_FALSE);
1982
1983         elm_object_item_disabled_set(m_create_folder_controlbar_item, EINA_FALSE);
1984 }
1985
1986 void Browser_Bookmark_View::_go_to_sub_foler(const char *folder_name)
1987 {
1988         int folder_id;
1989         string navigationbar_title = folder_name;
1990         Eina_Bool ret = m_data_manager->get_bookmark_db()->get_folder_id(BROWSER_BOOKMARK_MAIN_FOLDER_ID,
1991                                                                         folder_name, &folder_id);
1992         if (!ret) {
1993                 BROWSER_LOGE("get_folder_id is failed.");
1994                 return;
1995         }
1996
1997         m_sub_folder_genlist = _create_sub_folder_genlist(folder_id);
1998         if (!m_sub_folder_genlist) {
1999                 BROWSER_LOGD("_create_sub_folder_genlist failed");
2000                 return;
2001         }
2002
2003         m_current_bookmark_navigationbar_title = navigationbar_title.c_str();
2004         _set_navigationbar_title(navigationbar_title.c_str());
2005
2006         elm_object_item_disabled_set(m_create_folder_controlbar_item, EINA_TRUE);
2007
2008         if (!m_sub_folder_list.size())
2009                 elm_object_item_disabled_set(m_bookmark_edit_controlbar_item, EINA_TRUE);
2010 }
2011
2012 void Browser_Bookmark_View::_set_navigationbar_title(const char *title)
2013 {
2014         BROWSER_LOGD("title=[%s]", title);
2015         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
2016         if (elm_object_item_content_get(top_it) == m_main_layout)
2017                 elm_object_item_text_set(top_it, title);
2018 }
2019
2020 Evas_Object *Browser_Bookmark_View::_create_sub_folder_genlist(int folder_id)
2021 {
2022         BROWSER_LOGD("[%s]", __func__);
2023         Evas_Object *genlist = elm_genlist_add(m_main_layout);
2024         if (genlist) {
2025                 elm_box_unpack(m_genlist_content_box, m_conformant);
2026                 evas_object_hide(m_conformant);
2027
2028                 m_sub_folder_conformant = elm_conformant_add(m_main_layout);
2029                 if (!m_sub_folder_conformant) {
2030                         BROWSER_LOGE("elm_conformant_add failed");
2031                         return EINA_FALSE;
2032                 }
2033                 elm_object_style_set(m_sub_folder_conformant, "internal_layout");
2034                 evas_object_size_hint_weight_set(m_sub_folder_conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2035                 evas_object_size_hint_align_set(m_sub_folder_conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
2036                 evas_object_show(m_sub_folder_conformant);
2037                 elm_box_pack_end(m_genlist_content_box, m_sub_folder_conformant);
2038
2039                 m_current_folder_id = folder_id;
2040
2041                 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2042                 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
2043                 elm_genlist_block_count_set(genlist, BROWSER_BOOKMARK_GENLIST_BLOCK_COUNT);
2044                 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
2045
2046 #if defined(GENLIST_SWEEP)
2047                 evas_object_smart_callback_add(genlist, "drag,start,up", __sweep_cancel_genlist_cb, genlist);
2048                 evas_object_smart_callback_add(genlist, "drag,start,down", __sweep_cancel_genlist_cb, genlist);
2049                 evas_object_smart_callback_add(genlist, "drag,start,right", __sweep_right_genlist_cb, this);
2050                 evas_object_smart_callback_add(genlist, "drag,start,left", __sweep_left_genlist_cb, this);
2051 #endif
2052
2053                 evas_object_smart_callback_add(genlist, "moved", __genlist_move_cb, this);
2054
2055                 elm_object_content_set(m_sub_folder_conformant, genlist);
2056                 evas_object_show(genlist);
2057
2058                 m_upper_folder_list = elm_list_add(m_main_layout);
2059                 if (m_upper_folder_list) {
2060                         elm_list_bounce_set(m_upper_folder_list,  EINA_FALSE, EINA_FALSE);
2061                         evas_object_size_hint_weight_set(m_upper_folder_list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2062                         evas_object_size_hint_align_set(m_upper_folder_list, EVAS_HINT_FILL, EVAS_HINT_FILL);
2063                         evas_object_show(m_upper_folder_list);
2064                         elm_object_part_content_set(m_genlist_content_layout, "elm.swallow.upperlist", m_upper_folder_list);
2065                         m_upper_folder_icon = elm_icon_add(m_upper_folder_list);
2066                         if (!m_upper_folder_icon) {
2067                                 BROWSER_LOGE("elm_icon_add failed");
2068                                 return NULL;
2069                         }
2070                         if (!elm_icon_file_set(m_upper_folder_icon, BROWSER_IMAGE_DIR"/I01_icon_upper_folder.png", NULL))
2071                                 BROWSER_LOGE("elm_icon_file_set is failed. [%s]");
2072
2073                         evas_object_size_hint_min_set(m_upper_folder_icon, UPPER_FOLDER_ICON_SIZE, UPPER_FOLDER_ICON_SIZE);
2074                         evas_object_resize(m_upper_folder_icon, UPPER_FOLDER_ICON_SIZE, UPPER_FOLDER_ICON_SIZE);
2075                         elm_list_item_append(m_upper_folder_list, BR_STRING_BOOKMARKS, m_upper_folder_icon,
2076                                                 NULL, __upper_folder_clicked_cb, this);
2077                         evas_object_show(m_upper_folder_icon);
2078                         edje_object_signal_emit(elm_layout_edje_get(m_genlist_content_layout), "show,upper_folder,signal", "");
2079
2080                         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
2081                         elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_INSTANT_CLOSE);
2082                         evas_object_data_set(m_navi_bar, "visible", (void *)EINA_FALSE);
2083                 }
2084
2085                 /* Fill bookmark list */
2086                 Eina_Bool ret = m_data_manager->get_bookmark_db()->get_bookmark_list(m_sub_folder_list,
2087                                                                                         m_current_folder_id);
2088                 if (!ret) {
2089                         return NULL;
2090                         BROWSER_LOGE("get_bookmark_list failed");
2091                 }
2092
2093                 int size = m_sub_folder_list.size();
2094                 BROWSER_LOGD("bookmark count=%d", size);
2095                 for (int i = 0 ; i < size ; i++ ) {
2096                         m_sub_folder_list[i]->user_data_1 = (void *)this;
2097                         m_sub_folder_list[i]->user_data_2 = (void *)elm_genlist_item_append(genlist,
2098                                                 &m_bookmark_genlist_item_class, m_sub_folder_list[i], NULL,
2099                                                 ELM_GENLIST_ITEM_NONE, __bookmark_item_clicked_cb, this);
2100                 }
2101
2102                 if (size == 0)
2103                         _show_empty_content_layout(EINA_TRUE);
2104                 else
2105                         _show_empty_content_layout(EINA_FALSE);
2106         }
2107
2108         return genlist;
2109 }
2110
2111 Evas_Object *Browser_Bookmark_View::_create_main_folder_genlist(void)
2112 {
2113         BROWSER_LOGD("[%s]", __func__);
2114         Evas_Object *genlist = elm_genlist_add(m_main_layout);
2115         if (genlist) {
2116                 m_current_folder_id = BROWSER_BOOKMARK_MAIN_FOLDER_ID;
2117
2118                 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2119                 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
2120                 elm_genlist_block_count_set(genlist, BROWSER_BOOKMARK_GENLIST_BLOCK_COUNT);
2121                 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
2122
2123 #if defined(GENLIST_SWEEP)
2124                 evas_object_smart_callback_add(genlist, "drag,start,up", __sweep_cancel_genlist_cb, genlist);
2125                 evas_object_smart_callback_add(genlist, "drag,start,down", __sweep_cancel_genlist_cb, genlist);
2126                 evas_object_smart_callback_add(genlist, "drag,start,right", __sweep_right_genlist_cb, this);
2127                 evas_object_smart_callback_add(genlist, "drag,start,left", __sweep_left_genlist_cb, this);
2128 #endif
2129                 evas_object_smart_callback_add(genlist, "moved", __genlist_move_cb, this);
2130
2131                 m_bookmark_genlist_item_class.item_style = "1text.1icon.2";
2132                 m_bookmark_genlist_item_class.decorate_item_style = "mode/slide3.text";
2133                 m_bookmark_genlist_item_class.decorate_all_item_style = "edit_default";
2134                 m_bookmark_genlist_item_class.func.text_get = __genlist_label_get_cb;
2135                 m_bookmark_genlist_item_class.func.content_get = __genlist_icon_get_cb;
2136                 m_bookmark_genlist_item_class.func.state_get = NULL;
2137                 m_bookmark_genlist_item_class.func.del = NULL;
2138 //              m_bookmark_genlist_item_class.func.moved = __genlist_move_cb;
2139
2140                 m_folder_genlist_item_class.item_style = "1text.1icon.2";
2141                 m_folder_genlist_item_class.decorate_item_style = "mode/slide2";
2142                 m_folder_genlist_item_class.decorate_all_item_style = "edit_default";
2143                 m_folder_genlist_item_class.func.text_get = __genlist_label_get_cb;
2144                 m_folder_genlist_item_class.func.content_get = __genlist_icon_get_cb;
2145                 m_folder_genlist_item_class.func.state_get = NULL;
2146                 m_folder_genlist_item_class.func.del = NULL;
2147                 evas_object_show(genlist);
2148
2149                 /* Fill bookmark list */
2150                 Eina_Bool ret = m_data_manager->get_bookmark_db()->get_bookmark_list(m_main_folder_list,
2151                                                                                         m_current_folder_id);
2152                 if (!ret) {
2153                         return NULL;
2154                         BROWSER_LOGE("get_bookmark_list failed");
2155                 }
2156
2157                 int size = m_main_folder_list.size();
2158                 BROWSER_LOGD("bookmark count=%d", size);
2159                 for (int i = 0 ; i < size ; i++ ) {
2160                         m_main_folder_list[i]->user_data_1 = (void *)this;
2161                         if (m_main_folder_list[i]->is_folder) {
2162                                 m_main_folder_list[i]->user_data_2 = (void *)elm_genlist_item_append(genlist,
2163                                                         &m_folder_genlist_item_class, m_main_folder_list[i], NULL,
2164                                                         ELM_GENLIST_ITEM_NONE, __bookmark_item_clicked_cb, this);
2165
2166                         } else {
2167                                 m_main_folder_list[i]->user_data_2 = (void *)elm_genlist_item_append(genlist,
2168                                                         &m_bookmark_genlist_item_class, m_main_folder_list[i], NULL,
2169                                                         ELM_GENLIST_ITEM_NONE, __bookmark_item_clicked_cb, this);
2170                         }
2171                 }
2172         }
2173
2174         return genlist;
2175 }
2176
2177 void Browser_Bookmark_View::__create_folder_button(void *data, Evas_Object *obj, void *event_info)
2178 {
2179         if (!data)
2180                 return;
2181         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
2182
2183         /* New folder */
2184         if (!m_data_manager->create_new_folder_view()) {
2185                 BROWSER_LOGE("create_new_folder_view failed");
2186                 return;
2187         }
2188
2189         if (!m_data_manager->get_new_folder_view()->init()) {
2190                 BROWSER_LOGE("get_new_folder_view()->init() failed");
2191                 m_data_manager->destroy_new_folder_view();
2192                 return;
2193         }
2194 }
2195
2196 void Browser_Bookmark_View::__add_to_bookmark_cb(void *data, Evas_Object *obj, void *event_info)
2197 {
2198         if (!data)
2199                 return;
2200         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
2201         if (!m_data_manager->create_add_to_bookmark_view(m_data_manager->get_browser_view()->get_title(),
2202                                                 m_data_manager->get_browser_view()->get_url(), bookmark_view->m_current_folder_id)) {
2203                 BROWSER_LOGE("m_data_manager->create_add_to_bookmark_view failed");
2204                 return;
2205         }
2206
2207         if (!m_data_manager->get_add_to_bookmark_view()->init())
2208                 m_data_manager->destroy_add_to_bookmark_view();
2209 }
2210
2211 Eina_Bool Browser_Bookmark_View::_set_controlbar_type(controlbar_type type)
2212 {
2213         if (m_bottom_control_bar)
2214                 evas_object_del(m_bottom_control_bar);
2215
2216         m_bookmark_delete_controlbar_item = NULL;
2217         m_create_folder_controlbar_item = NULL;
2218
2219         if (type == BOOKMARK_VIEW_DEFAULT) {
2220                 elm_object_style_set(m_bg, "default");
2221
2222                 Elm_Object_Item *navi_it = elm_naviframe_top_item_get(m_navi_bar);
2223
2224                 m_back_button = elm_button_add(m_main_layout);
2225                 if (!m_back_button) {
2226                         BROWSER_LOGE("elm_button_add failed");
2227                         return EINA_FALSE;
2228                 }
2229                 elm_object_style_set(m_back_button, "browser/bookmark_controlbar_back");
2230                 evas_object_smart_callback_add(m_back_button, "clicked", __back_button_clicked_cb, this);
2231                 evas_object_show(m_back_button);
2232                 elm_object_item_part_content_set(navi_it, ELM_NAVIFRAME_ITEM_PREV_BTN, m_back_button);
2233
2234                 m_bottom_control_bar = elm_toolbar_add(m_main_layout);
2235                 if (!m_bottom_control_bar) {
2236                         BROWSER_LOGE("elm_toolbar_add failed");
2237                         return EINA_TRUE;
2238                 }
2239                 elm_object_style_set(m_bottom_control_bar, "browser/default");
2240                 elm_toolbar_shrink_mode_set(m_bottom_control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
2241
2242                 m_create_folder_controlbar_item = elm_toolbar_item_append(m_bottom_control_bar,
2243                                                         BROWSER_IMAGE_DIR"/I01_controlbar_icon_create.png",
2244                                                         NULL, __add_to_bookmark_cb, this);
2245                 m_bookmark_edit_controlbar_item = elm_toolbar_item_append(m_bottom_control_bar,
2246                                                         BROWSER_IMAGE_DIR"/01_controlbar_icon_compose.png", NULL,
2247                                                         __edit_controlbar_item_clicked_cb, this);
2248                 m_create_folder_controlbar_item = elm_toolbar_item_append(m_bottom_control_bar,
2249                                                         BROWSER_IMAGE_DIR"/01_controlbar_icon_create_folder.png",
2250                                                         NULL, __create_folder_button, this);
2251                 evas_object_show(m_bottom_control_bar);
2252
2253                 if (m_current_folder_id != BROWSER_BOOKMARK_MAIN_FOLDER_ID)
2254                         elm_object_item_disabled_set(m_create_folder_controlbar_item, EINA_TRUE);
2255
2256                 if (!_get_current_folder_item_list().size())
2257                         elm_object_item_disabled_set(m_bookmark_edit_controlbar_item, EINA_TRUE);
2258
2259                 elm_object_item_part_content_set(navi_it, ELM_NAVIFRAME_ITEM_CONTROLBAR, m_bottom_control_bar);
2260         } else if (type == BOOKMARK_VIEW_EDIT_MODE || type == HISTORY_VIEW_EDIT_MODE) {
2261                 elm_object_style_set(m_bg, "edit_mode");
2262
2263                 Elm_Object_Item *navi_it = elm_naviframe_top_item_get(m_navi_bar);
2264                 elm_object_item_part_content_set(navi_it, ELM_NAVIFRAME_ITEM_PREV_BTN, NULL);
2265
2266                 m_bottom_control_bar = elm_toolbar_add(m_main_layout);
2267                 if (!m_bottom_control_bar) {
2268                         BROWSER_LOGE("elm_toolbar_add failed");
2269                         return EINA_FALSE;
2270                 }
2271                 elm_object_style_set(m_bottom_control_bar, "browser/default");
2272                 elm_toolbar_shrink_mode_set(m_bottom_control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
2273
2274                 Elm_Object_Item *empty_item = elm_toolbar_item_append(m_bottom_control_bar, NULL, NULL, NULL, NULL);
2275                 elm_object_item_disabled_set(empty_item, EINA_TRUE);
2276
2277                 m_bookmark_delete_controlbar_item = elm_toolbar_item_append(m_bottom_control_bar,
2278                                                                         BROWSER_IMAGE_DIR"/01_controlbar_icon_delete.png",
2279                                                                         NULL, __delete_controlbar_item_clicked_cb, this);
2280
2281                 empty_item = elm_toolbar_item_append(m_bottom_control_bar, NULL, NULL, NULL, NULL);
2282                 elm_object_item_disabled_set(empty_item, EINA_TRUE);
2283
2284                 elm_toolbar_item_append(m_bottom_control_bar, BROWSER_IMAGE_DIR"/01_controllbar_icon_close.png", NULL,
2285                                                                                 __edit_controlbar_item_clicked_cb, this);
2286
2287                 if (type == BOOKMARK_VIEW_EDIT_MODE) {
2288                         int delete_item_count = 0;
2289                         Elm_Object_Item *it = elm_genlist_first_item_get(_get_current_folder_genlist());
2290                         while(it) {
2291                                 Browser_Bookmark_DB::bookmark_item *item = NULL;
2292                                 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
2293                                 if (item->is_delete)
2294                                         delete_item_count++;
2295                                 it = elm_genlist_item_next_get(it);
2296                         }
2297
2298                         if (delete_item_count)
2299                                 elm_object_item_disabled_set(m_bookmark_delete_controlbar_item, EINA_FALSE);
2300                         else
2301                                 elm_object_item_disabled_set(m_bookmark_delete_controlbar_item, EINA_TRUE);
2302                 } else {
2303                         int delete_item_count = 0;
2304                         Elm_Object_Item *it = elm_genlist_first_item_get(m_data_manager->get_history_layout()->m_history_genlist);
2305                         while(it) {
2306                                 Browser_History_DB::history_item *item = NULL;
2307                                 item = (Browser_History_DB::history_item *)elm_object_item_data_get(it);
2308
2309                                 /* Ignore the date label. */
2310                                 if (elm_genlist_item_select_mode_get(it) != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) {
2311                                         if (item->is_delete)
2312                                                 delete_item_count++;
2313                                 }
2314                                 it = elm_genlist_item_next_get(it);
2315                         }
2316                         if (delete_item_count)
2317                                 elm_object_item_disabled_set(m_bookmark_delete_controlbar_item, EINA_FALSE);
2318                         else
2319                                 elm_object_item_disabled_set(m_bookmark_delete_controlbar_item, EINA_TRUE);
2320                 }
2321
2322                 evas_object_show(m_bottom_control_bar);
2323                 elm_object_item_part_content_set(navi_it, ELM_NAVIFRAME_ITEM_CONTROLBAR, m_bottom_control_bar);
2324         } else if (type == HISTORY_VIEW_DEFAULT) {
2325                 elm_object_style_set(m_bg, "default");
2326
2327                 Elm_Object_Item *navi_it = elm_naviframe_top_item_get(m_navi_bar);
2328
2329                 m_back_button = elm_button_add(m_main_layout);
2330                 if (!m_back_button) {
2331                         BROWSER_LOGE("elm_button_add failed");
2332                         return EINA_FALSE;
2333                 }
2334                 elm_object_style_set(m_back_button, "browser/bookmark_controlbar_back");
2335                 evas_object_smart_callback_add(m_back_button, "clicked", __back_button_clicked_cb, this);
2336                 evas_object_show(m_back_button);
2337                 elm_object_item_part_content_set(navi_it, ELM_NAVIFRAME_ITEM_PREV_BTN, m_back_button);
2338
2339                 m_bottom_control_bar = elm_toolbar_add(m_main_layout);
2340                 if (!m_bottom_control_bar) {
2341                         BROWSER_LOGE("elm_toolbar_add failed");
2342                         return EINA_TRUE;
2343                 }
2344                 elm_object_style_set(m_bottom_control_bar, "browser/default");
2345                 elm_toolbar_shrink_mode_set(m_bottom_control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
2346
2347                 Elm_Object_Item *empty_item = elm_toolbar_item_append(m_bottom_control_bar, NULL, NULL, NULL, NULL);
2348                 elm_object_item_disabled_set(empty_item, EINA_TRUE);
2349
2350                 m_bookmark_edit_controlbar_item = elm_toolbar_item_append(m_bottom_control_bar,
2351                                                                 BROWSER_IMAGE_DIR"/01_controlbar_icon_compose.png", NULL,
2352                                                                 __edit_controlbar_item_clicked_cb, this);
2353
2354                 empty_item = elm_toolbar_item_append(m_bottom_control_bar, NULL, NULL, NULL, NULL);
2355                 elm_object_item_disabled_set(empty_item, EINA_TRUE);
2356
2357                 Browser_History_Layout *history_layout = m_data_manager->get_history_layout();
2358                 if (history_layout) {
2359                         if (!history_layout->m_history_list.size())
2360                                 elm_object_item_disabled_set(m_bookmark_edit_controlbar_item, EINA_TRUE);
2361                         else
2362                                 elm_object_item_disabled_set(m_bookmark_edit_controlbar_item, EINA_FALSE);
2363                 }
2364
2365                 evas_object_show(m_bottom_control_bar);
2366
2367                 elm_object_item_part_content_set(navi_it, ELM_NAVIFRAME_ITEM_CONTROLBAR, m_bottom_control_bar);
2368         }
2369
2370         elm_object_focus_allow_set(m_bottom_control_bar, EINA_FALSE);
2371
2372         return EINA_TRUE;
2373 }
2374
2375 void Browser_Bookmark_View::__naviframe_pop_finished_cb(void *data , Evas_Object *obj, void *event_info)
2376 {
2377         BROWSER_LOGD("[%s]", __func__);
2378         if (!data)
2379                 return;
2380
2381         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
2382         Elm_Object_Item *it = (Elm_Object_Item *)event_info;
2383
2384         if (bookmark_view->m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
2385                 return;
2386
2387         /* Bookmark view -> Edit one bookmark item, then cancel. */
2388         m_data_manager->destroy_edit_bookmark_view();
2389
2390         /* History view -> slide one item -> add to bookmark, then done. */
2391         m_data_manager->destroy_add_to_bookmark_view();
2392
2393         m_data_manager->destroy_new_folder_view();
2394 }
2395
2396 Eina_Bool Browser_Bookmark_View::_create_main_layout(void)
2397 {
2398         BROWSER_LOGD("[%s]", __func__);
2399         m_main_layout = elm_layout_add(m_navi_bar);
2400         if (!m_main_layout) {
2401                 BROWSER_LOGE("elm_layout_add failed");
2402                 return EINA_FALSE;
2403         }
2404         if (!elm_layout_file_set(m_main_layout, BROWSER_EDJE_DIR"/browser-bookmark-view.edj",
2405                                         "bookmark/main_layout")) {
2406                 BROWSER_LOGE("elm_layout_file_set failed");
2407                 return EINA_FALSE;
2408         }
2409
2410         elm_win_conformant_set(m_win, EINA_TRUE);
2411         m_conformant = elm_conformant_add(m_main_layout);
2412         if (!m_conformant) {
2413                 BROWSER_LOGE("elm_conformant_add failed");
2414                 return EINA_FALSE;
2415         }
2416         elm_object_style_set(m_conformant, "internal_layout");
2417         evas_object_size_hint_weight_set(m_conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2418         evas_object_size_hint_align_set(m_conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
2419         evas_object_show(m_conformant);
2420
2421         elm_object_style_set(m_bg, "default");
2422
2423         m_genlist_content_layout = elm_layout_add(m_main_layout);
2424         if (!m_genlist_content_layout) {
2425                 BROWSER_LOGE("elm_layout_add failed");
2426                 return EINA_FALSE;
2427         }
2428         if (!elm_layout_file_set(m_genlist_content_layout, BROWSER_EDJE_DIR"/browser-bookmark-view.edj",
2429                                         "bookmark/content_layout")) {
2430                 BROWSER_LOGE("elm_layout_file_set failed");
2431                 return EINA_FALSE;
2432         }
2433         evas_object_size_hint_weight_set(m_genlist_content_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2434         evas_object_show(m_genlist_content_layout);
2435         edje_object_signal_emit(elm_layout_edje_get(m_genlist_content_layout), "show,content_box,signal", "");
2436
2437         m_genlist_content_box = elm_box_add(m_genlist_content_layout);
2438         if (!m_genlist_content_box) {
2439                 BROWSER_LOGE("elm_box_add failed");
2440                 return EINA_FALSE;
2441         }
2442         evas_object_size_hint_weight_set(m_genlist_content_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2443         evas_object_show(m_genlist_content_box);
2444         elm_object_part_content_set(m_genlist_content_layout, "elm.swallow.content_box", m_genlist_content_box);
2445         elm_box_pack_end(m_genlist_content_box, m_conformant);
2446
2447         m_main_folder_genlist = _create_main_folder_genlist();
2448         if (!m_main_folder_genlist) {
2449                 BROWSER_LOGE("_create_main_folder_genlist failed");
2450                 return EINA_FALSE;
2451         }
2452
2453         elm_object_content_set(m_conformant, m_main_folder_genlist);
2454
2455         m_back_button = elm_button_add(m_main_layout);
2456         if (!m_back_button) {
2457                 BROWSER_LOGE("elm_button_add failed");
2458                 return EINA_FALSE;
2459         }
2460         elm_object_style_set(m_back_button, "browser/bookmark_controlbar_back");
2461         evas_object_smart_callback_add(m_back_button, "clicked", __back_button_clicked_cb, this);
2462         evas_object_show(m_back_button);
2463
2464         elm_object_part_content_set(m_main_layout, "elm.swallow.content", m_genlist_content_layout);
2465
2466         m_top_control_bar = elm_toolbar_add(m_main_layout);
2467         if (!m_top_control_bar) {
2468                 BROWSER_LOGE("elm_toolbar_add failed");
2469                 return EINA_FALSE;
2470         }
2471         elm_object_style_set(m_top_control_bar, "browser/tabbar");
2472
2473         elm_toolbar_shrink_mode_set(m_top_control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
2474
2475         elm_object_part_content_set(m_main_layout, "elm.swallow.tabbar", m_top_control_bar);
2476
2477         Elm_Object_Item *bookmark_tab_item = elm_toolbar_item_append(m_top_control_bar, NULL,
2478                                                                 BR_STRING_BOOKMARKS, __controlbar_tab_changed_cb, this);
2479         elm_toolbar_item_append(m_top_control_bar, NULL, BR_STRING_HISTORY, __controlbar_tab_changed_cb, this);
2480
2481         elm_toolbar_select_mode_set(m_top_control_bar, ELM_OBJECT_SELECT_MODE_ALWAYS);
2482         elm_toolbar_item_selected_set(bookmark_tab_item, EINA_TRUE);
2483
2484         evas_object_show(m_top_control_bar);
2485
2486         m_navi_it = elm_naviframe_item_push(m_navi_bar, NULL, m_back_button, NULL,
2487                                                                 m_main_layout, "browser/tabbar");
2488
2489         evas_object_smart_callback_add(m_navi_bar, "transition,finished", __naviframe_pop_finished_cb, this);
2490
2491         int size = m_main_folder_list.size();
2492         if (size == 0)
2493                 _show_empty_content_layout(EINA_TRUE);
2494         else
2495                 _show_empty_content_layout(EINA_FALSE);
2496
2497         return EINA_TRUE;
2498 }
2499