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