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