[Title] Initial upload the browser for tizen 2.0
[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                         Evas_Object *delete_button = elm_button_add(obj);
1363                         if (!delete_button) {
1364                                 BROWSER_LOGE("elm_button_add is failed.\n");
1365                                 return NULL;
1366                         }
1367                         elm_object_style_set(delete_button, "text_only/sweep");
1368                         elm_object_text_set(delete_button, BR_STRING_DELETE);
1369                         if (!item->is_editable)
1370                                 elm_object_disabled_set(delete_button, EINA_TRUE);
1371                         evas_object_smart_callback_add(delete_button, "clicked", __slide_delete_button_clicked_cb, item);
1372                         return delete_button;
1373                 }
1374
1375                 if (elm_genlist_decorate_mode_get(obj)) {
1376                         if (!strncmp(part, "elm.edit.icon.1", strlen("elm.edit.icon.1"))) {
1377                                 Evas_Object *check_button = elm_check_add(obj);
1378                                 if (!check_button) {
1379                                         BROWSER_LOGE("elm_check_add is failed.\n");
1380                                         return NULL;
1381                                 }
1382                                 evas_object_propagate_events_set(check_button, EINA_FALSE);
1383
1384                                 if (!item->is_editable)
1385                                         elm_object_disabled_set(check_button, EINA_TRUE);
1386
1387                                 elm_check_state_pointer_set(check_button, &item->is_delete);
1388                                 evas_object_smart_callback_add(check_button, "changed",
1389                                                                 __edit_mode_item_check_changed_cb, item);
1390                                 return check_button;
1391                         } else if (!strncmp(part, "elm.edit.icon.2", strlen("elm.edit.icon.2"))) {
1392                                 Evas_Object *button = elm_button_add(obj);
1393                                 if (!button) {
1394                                         BROWSER_LOGE("elm_button_add is failed.\n");
1395                                         return NULL;
1396                                 }
1397                                 evas_object_propagate_events_set(button, EINA_FALSE);
1398
1399                                 if (!item->is_editable)
1400                                         elm_object_disabled_set(button, EINA_TRUE);
1401                                 if (item->is_folder) {
1402                                         elm_object_style_set(button, "rename");
1403                                         evas_object_smart_callback_add(button, "clicked",
1404                                                                 __rename_folder_button_clicked_cb, item);
1405                                 } else {
1406                                         elm_object_style_set(button, "reveal");
1407                                         evas_object_smart_callback_add(button, "clicked",
1408                                                                 __edit_bookmark_item_button_clicked_cb, item);
1409                                 }
1410                                 return button;
1411                         } else if (!strncmp(part, "elm.flip.content", strlen("elm.flip.content"))) {
1412                                 Evas_Object *edit_field = br_elm_editfield_add(obj);
1413                                 br_elm_editfield_entry_single_line_set(edit_field, EINA_TRUE);
1414                                 br_elm_editfield_eraser_set(edit_field, EINA_TRUE);
1415
1416                                 bookmark_view->m_rename_edit_field = edit_field;
1417                                 evas_object_data_set(bookmark_view->m_rename_edit_field, "item", item);
1418
1419                                 Evas_Object *edit_field_entry = br_elm_editfield_entry_get(edit_field);
1420                                 elm_entry_entry_set(edit_field_entry, item->title.c_str());
1421                                 elm_entry_cursor_end_set(edit_field_entry);
1422
1423                                 evas_object_smart_callback_add(edit_field_entry, "unfocused",
1424                                                                 __rename_folder_unfocus_cb, data);
1425                                 evas_object_smart_callback_add(edit_field_entry, "activated",
1426                                                                 __rename_folder_entry_enter_key_cb, edit_field);
1427
1428                                 ecore_idler_add(__set_focus_editfield_idler_cb, edit_field);
1429
1430                                 return edit_field;
1431                         }
1432                 }
1433         }
1434
1435         return NULL;
1436 }
1437
1438 Eina_Bool Browser_Bookmark_View::_is_empty_folder(string folder_name)
1439 {
1440         BROWSER_LOGD("[%s]", __func__);
1441         Browser_Bookmark_DB *bookmark_db = m_data_manager->get_bookmark_db();
1442         int folder_id;
1443         Eina_Bool ret = bookmark_db->get_folder_id(BROWSER_BOOKMARK_MAIN_FOLDER_ID, folder_name.c_str(), &folder_id);
1444         if (!ret) {
1445                 BROWSER_LOGE("get_folder_id is failed.");
1446                 return EINA_FALSE;
1447         }
1448
1449         vector<Browser_Bookmark_DB::bookmark_item *> bookmark_list;
1450         ret = bookmark_db->get_bookmark_list(bookmark_list, folder_id);
1451         if (!ret) {
1452                 BROWSER_LOGE("get_bookmark_list failed");
1453                 return EINA_FALSE;
1454         }
1455
1456         int count = bookmark_list.size();
1457
1458         for(int i = 0 ; i < bookmark_list.size() ; i++ ) {
1459                 if (bookmark_list[i])
1460                         delete bookmark_list[i];
1461         }
1462         bookmark_list.clear();
1463
1464         if(count)
1465                 return EINA_FALSE;
1466         else
1467                 return EINA_TRUE;
1468 }
1469
1470 void Browser_Bookmark_View::__slide_edit_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1471 {
1472         BROWSER_LOGD("[%s]", __func__);
1473         if (!data)
1474                 return;
1475
1476         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)data;
1477         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)(item->user_data_1);
1478         bookmark_view->m_current_genlist_item_to_edit = (Elm_Object_Item *)(item->user_data_2);
1479
1480         if (item->is_folder) {
1481                 /* edit folder by slide genlist item */
1482                 if (bookmark_view->_is_empty_folder(item->title)) {
1483                         bookmark_view->show_msg_popup(BR_STRING_EMPTY);
1484                         return;
1485                 }
1486
1487                 bookmark_view->_go_to_sub_foler(item->title.c_str());
1488
1489                 bookmark_view->_set_edit_mode(EINA_TRUE);
1490
1491                 Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
1492                 elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_INSTANT_OPEN);
1493                 evas_object_data_set(m_navi_bar, "visible", (void *)EINA_TRUE);
1494
1495                 edje_object_signal_emit(elm_layout_edje_get(bookmark_view->m_main_layout),
1496                                         "expand_header_no_animation,signal", "");
1497         } else {
1498                 /* edit bookmark item by slide genlist item */
1499                 /* Pass the selected genlist item as parameter when bookmark -> Edit item
1500                     because of increase performance. */
1501                 if (!m_data_manager->create_edit_bookmark_view(item->title, item->url,
1502                                                         bookmark_view->m_current_folder_id)) {
1503                         BROWSER_LOGE("create_edit_bookmark_view failed");
1504                         return;
1505                 }
1506
1507                 if (!m_data_manager->get_edit_bookmark_view()->init()) {
1508                         BROWSER_LOGE("new get_edit_bookmark_view()->init() failed");
1509                         m_data_manager->destroy_edit_bookmark_view();
1510                         return;
1511                 }
1512         }
1513
1514         elm_genlist_item_decorate_mode_set(bookmark_view->m_current_genlist_item_to_edit, "slide", EINA_FALSE);
1515         elm_genlist_item_select_mode_set(bookmark_view->m_current_genlist_item_to_edit, ELM_OBJECT_SELECT_MODE_DEFAULT);
1516 }
1517
1518 void Browser_Bookmark_View::__delete_confirm_response_by_slide_button_cb(void *data, Evas_Object *obj,
1519                                                                 void *event_info)
1520 {
1521         BROWSER_LOGD("event_info = %d", (int)event_info);
1522
1523         if (!data)
1524                 return;
1525
1526         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)data;
1527         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)(item->user_data_1);
1528
1529         evas_object_del(bookmark_view->m_delete_confirm_popup);
1530
1531         bookmark_view->_delete_bookmark_item_by_slide_button(item);
1532 }
1533
1534 void Browser_Bookmark_View::__cancel_confirm_response_by_slide_button_cb(void *data, Evas_Object *obj,
1535                                                                 void *event_info)
1536 {
1537         BROWSER_LOGD("event_info = %d", (int)event_info);
1538
1539         if (!data)
1540                 return;
1541
1542         Evas_Object *popup = (Evas_Object *)data;
1543
1544         evas_object_del(popup);
1545 }
1546
1547 void Browser_Bookmark_View::__delete_confirm_response_by_edit_mode_cb(void *data, Evas_Object *obj,
1548                                                                 void *event_info)
1549 {
1550         BROWSER_LOGD("event_info = %d", (int)event_info);
1551
1552         if (!data)
1553                 return;
1554
1555         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
1556
1557         if (bookmark_view->m_delete_confirm_popup) {
1558                 evas_object_del(bookmark_view->m_delete_confirm_popup);
1559                 bookmark_view->m_delete_confirm_popup = NULL;
1560         }
1561
1562         bookmark_view->_delete_selected_bookmark();
1563
1564         bookmark_view->_set_edit_mode(EINA_FALSE);
1565 }
1566
1567 Evas_Object *Browser_Bookmark_View::_show_delete_confirm_popup(void)
1568 {
1569         BROWSER_LOGD("[%s]", __func__);
1570
1571         m_delete_confirm_popup = elm_popup_add(m_navi_bar);
1572         if (!m_delete_confirm_popup) {
1573                 BROWSER_LOGE("elm_popup_add failed");
1574                 return NULL;
1575         }
1576
1577         evas_object_size_hint_weight_set(m_delete_confirm_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1578         elm_object_text_set(m_delete_confirm_popup, BR_STRING_DELETE_Q);
1579
1580         Evas_Object *ok_button = elm_button_add(m_delete_confirm_popup);
1581         elm_object_text_set(ok_button, BR_STRING_YES);
1582         elm_object_part_content_set(m_delete_confirm_popup, "button1", ok_button);
1583
1584         Evas_Object *cancel_button = elm_button_add(m_delete_confirm_popup);
1585         elm_object_text_set(cancel_button, BR_STRING_NO);
1586         elm_object_part_content_set(m_delete_confirm_popup, "button2", cancel_button);
1587
1588         evas_object_smart_callback_add(cancel_button, "clicked", __cancel_confirm_response_by_slide_button_cb,
1589                                                                                 m_delete_confirm_popup);
1590
1591         evas_object_show(m_delete_confirm_popup);
1592
1593         return ok_button;
1594 }
1595
1596 void Browser_Bookmark_View::_delete_bookmark_item_by_slide_button(Browser_Bookmark_DB::bookmark_item *item)
1597 {
1598         BROWSER_LOGD("[%s]", __func__);
1599         Elm_Object_Item *it = (Elm_Object_Item *)(item->user_data_2);
1600         int ret = EINA_TRUE;
1601
1602         if (item->is_folder) {
1603                 int folder_id = 0;
1604                 ret = m_data_manager->get_bookmark_db()->get_folder_id(m_current_folder_id,
1605                                                                         item->title.c_str(), &folder_id);
1606                 if (!ret) {
1607                         BROWSER_LOGE("bookmark_db->get_folder_id failed");
1608                         return;
1609                 }
1610                 ret = m_data_manager->get_bookmark_db()->delete_folder(folder_id);
1611                 if (!ret) {
1612                         BROWSER_LOGE("bookmark_db->delete_folder failed");
1613                         return;
1614                 }
1615         } else {
1616                 ret = m_data_manager->get_bookmark_db()->delete_bookmark(item->id);
1617                 if (!ret) {
1618                         BROWSER_LOGE("bookmark_db->delete_bookmark failed");
1619                         return;
1620                 }
1621         }
1622
1623         _delete_bookmark_item_from_folder_list(item);
1624
1625         elm_object_item_del(it);
1626
1627         if (_get_current_folder_item_list().size() == 0) {
1628                 _show_empty_content_layout(EINA_TRUE);
1629         }
1630
1631         show_notify_popup(BR_STRING_DELETED, 3, EINA_TRUE);
1632 }
1633
1634 void Browser_Bookmark_View::__slide_delete_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1635 {
1636         BROWSER_LOGD("[%s]", __func__);
1637         if (!data)
1638                 return;
1639
1640         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)data;
1641         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)(item->user_data_1);
1642
1643         Evas_Object *ok_button = bookmark_view->_show_delete_confirm_popup();
1644         if (ok_button)
1645                 evas_object_smart_callback_add(ok_button, "clicked",
1646                         __delete_confirm_response_by_slide_button_cb, item);
1647 }
1648
1649 void Browser_Bookmark_View::__genlist_move_cb(void *data, Evas_Object *obj, void *event_info)
1650 {
1651         Elm_Object_Item *it = (Elm_Object_Item *)event_info;
1652
1653         BROWSER_LOGD("moved it = %d", it);
1654
1655         Browser_Bookmark_DB::bookmark_item *item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
1656         Elm_Object_Item *next_it = elm_genlist_item_next_get(it);
1657         Browser_Bookmark_DB::bookmark_item *next_item = NULL;
1658
1659         if (next_it)
1660                 next_item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(next_it);
1661
1662         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)(item->user_data_1);
1663
1664         Elm_Object_Item *index_it = NULL;
1665         Browser_Bookmark_DB::bookmark_item *test_item = NULL;
1666         it = elm_genlist_first_item_get(obj);
1667         while (index_it) {
1668                 test_item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(index_it);
1669                 BROWSER_LOGD("title=%s, order index=%d", test_item->title.c_str(), test_item->order_index);
1670                 index_it = elm_genlist_item_next_get(index_it);
1671         }
1672
1673         if (next_item && (item->order_index < next_item->order_index))
1674                 /* move down */
1675                 bookmark_view->_reorder_bookmark_item(item->order_index, EINA_TRUE);
1676         else
1677                 /* move up */
1678                 bookmark_view->_reorder_bookmark_item(item->order_index, EINA_FALSE);
1679 }
1680
1681 void Browser_Bookmark_View::_reorder_bookmark_item(int order_index, Eina_Bool is_move_down)
1682 {
1683         BROWSER_LOGD("[%s]", __func__);
1684         Browser_Bookmark_DB *bookmark_db = m_data_manager->get_bookmark_db();
1685
1686         Elm_Object_Item *it = NULL;
1687         Elm_Object_Item *next_it = NULL;
1688         Browser_Bookmark_DB::bookmark_item *item = NULL;
1689         Browser_Bookmark_DB::bookmark_item *next_item = NULL;
1690         Eina_Bool ret = EINA_TRUE;
1691         int index = order_index;
1692
1693         if (is_move_down) {
1694                 it = elm_genlist_first_item_get(_get_current_folder_genlist());
1695                 while(it) {
1696                         item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
1697                         if (item->order_index > index) {
1698                                 ret = bookmark_db->modify_bookmark_order_index(item->id, m_current_folder_id, index);
1699                                 if (!ret)
1700                                         BROWSER_LOGD("modify_bookmark_order_index failed");
1701                                 int temp = item->order_index;
1702                                 item->order_index = index;
1703                                 index = temp;
1704                                 elm_object_item_data_set(it, item);
1705                         } else if (item->order_index == order_index) {
1706                                 ret = bookmark_db->modify_bookmark_order_index(item->id, m_current_folder_id, index);
1707                                 item->order_index = index;
1708                                 elm_object_item_data_set(it, item);
1709                                 if (!ret)
1710                                         BROWSER_LOGD("modify_bookmark_order_index failed");
1711                                 break;
1712                         }
1713                         it = elm_genlist_item_next_get(it);
1714                 }
1715         } else {
1716                 index = order_index;
1717                 it = elm_genlist_last_item_get(_get_current_folder_genlist());
1718                 while(it) {
1719                         item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
1720                         if (item->order_index < index) {
1721                                 ret = bookmark_db->modify_bookmark_order_index(item->id, m_current_folder_id, index);
1722                                 if (!ret)
1723                                         BROWSER_LOGD("modify_bookmark_order_index failed");
1724                                 int temp = item->order_index;
1725                                 item->order_index = index;
1726                                 index = temp;
1727                                 elm_object_item_data_set(it, item);
1728                         } else if (item->order_index == order_index) {
1729                                 ret = bookmark_db->modify_bookmark_order_index(item->id, m_current_folder_id, index);
1730                                 item->order_index = index;
1731                                 elm_object_item_data_set(it, item);
1732                                 if (!ret)
1733                                         BROWSER_LOGD("modify_bookmark_order_index failed");
1734                                 break;
1735                         }
1736                         it = elm_genlist_item_prev_get(it);
1737                 }
1738         }
1739 }
1740
1741 void Browser_Bookmark_View::history_item_clicked(const char *url)
1742 {
1743         BROWSER_LOGD("[%s]", __func__);
1744
1745         if (m_data_manager->get_browser_view())
1746                 m_data_manager->get_browser_view()->load_url(url);
1747
1748         if (elm_naviframe_bottom_item_get(m_navi_bar) != elm_naviframe_top_item_get(m_navi_bar))
1749                 elm_naviframe_item_pop(m_navi_bar);
1750 }
1751
1752 void Browser_Bookmark_View::__bookmark_item_clicked_cb(void *data, Evas_Object *obj, void *eventInfo)
1753 {
1754         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
1755         if (!data)
1756                 return;
1757
1758         Elm_Object_Item *seleted_item = elm_genlist_selected_item_get(obj);
1759         Browser_Bookmark_DB::bookmark_item *item = NULL;
1760         item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(seleted_item);
1761
1762         if (!elm_genlist_decorate_mode_get(obj)) {
1763                 if (!item->is_folder) {
1764                         std::string url = std::string(item->url.c_str());
1765
1766                         if (m_data_manager->get_browser_view())
1767                                 m_data_manager->get_browser_view()->load_url(url.c_str());
1768
1769                         if (elm_naviframe_bottom_item_get(bookmark_view->m_navi_bar)
1770                             != elm_naviframe_top_item_get(bookmark_view->m_navi_bar))
1771                                 elm_naviframe_item_pop(bookmark_view->m_navi_bar);
1772                 } else
1773                         bookmark_view->_go_to_sub_foler(item->title.c_str());
1774         } else {
1775                 Elm_Object_Item *it = elm_genlist_selected_item_get(obj);
1776                 Browser_Bookmark_DB::bookmark_item *item = NULL;
1777                 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
1778                 if (item && item->is_editable) {
1779                         item->is_delete = !(item->is_delete);
1780                         elm_genlist_item_update(it);
1781                 }
1782
1783                 int delete_item_count = 0;
1784                 int editable_item_count = 0;
1785                 it = elm_genlist_first_item_get(bookmark_view->_get_current_folder_genlist());
1786                 while(it) {
1787                         if (item->is_editable)
1788                                 editable_item_count++;
1789                         item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
1790                         if (item->is_delete)
1791                                 delete_item_count++;
1792                         it = elm_genlist_item_next_get(it);
1793                 }
1794
1795                 if (editable_item_count == delete_item_count)
1796                         elm_check_state_set(bookmark_view->m_edit_mode_select_all_check_button, EINA_TRUE);
1797                 else
1798                         elm_check_state_set(bookmark_view->m_edit_mode_select_all_check_button, EINA_FALSE);
1799
1800                 bookmark_view->_show_selection_info();
1801         }
1802
1803         elm_genlist_item_selected_set(seleted_item, EINA_FALSE);
1804 }
1805
1806 void Browser_Bookmark_View::__upper_folder_clicked_cb(void *data, Evas_Object *obj, void *eventInfo)
1807 {
1808         BROWSER_LOGD("[%s]", __func__);
1809         if (!data)
1810                 return;
1811
1812         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
1813         bookmark_view->_go_up_to_main_folder();
1814
1815         bookmark_view->_set_navigationbar_title(BR_STRING_BOOKMARKS);
1816 }
1817
1818 Evas_Object *Browser_Bookmark_View::_get_current_folder_genlist(void)
1819 {
1820         if (m_current_folder_id == BROWSER_BOOKMARK_MAIN_FOLDER_ID)
1821                 return m_main_folder_genlist;
1822         else
1823                 return m_sub_folder_genlist;
1824 }
1825
1826 /* This just returns the copy of item list instance.
1827   * Just refer to read. Do not modify(insert or delete) the contents of this return value.
1828   * It doesn't modify the actual m_main_folder_list, m_sub_folder_list contents. */
1829 vector<Browser_Bookmark_DB::bookmark_item *> Browser_Bookmark_View::_get_current_folder_item_list(void)
1830 {
1831         if (m_current_folder_id == BROWSER_BOOKMARK_MAIN_FOLDER_ID)
1832                 return m_main_folder_list;
1833         else
1834                 return m_sub_folder_list;
1835 }
1836
1837 void Browser_Bookmark_View::_show_empty_content_layout(Eina_Bool is_empty)
1838 {
1839         BROWSER_LOGD("is_empty=%d", is_empty);
1840         if (m_view_mode == BOOKMARK_VIEW) {
1841                 if (!_set_controlbar_type(BOOKMARK_VIEW_DEFAULT))
1842                         BROWSER_LOGE("_set_controlbar_type(BOOKMARK_VIEW_DEFAULT) failed");
1843         }
1844
1845         if (is_empty) {
1846                 if (m_edit_mode_select_all_check_button) {
1847                         evas_object_del(m_edit_mode_select_all_check_button);
1848                         m_edit_mode_select_all_check_button = NULL;
1849                 }
1850                 if (m_edit_mode_select_all_layout) {
1851                         elm_box_unpack(m_genlist_content_box, m_edit_mode_select_all_layout);
1852                         evas_object_del(m_edit_mode_select_all_layout);
1853                         m_edit_mode_select_all_layout = NULL;
1854                 }
1855
1856                 if (m_no_contents) {
1857                         evas_object_del(m_no_contents);
1858                         m_no_contents = NULL;
1859                 }
1860
1861                 m_no_contents = elm_layout_add(m_main_layout);
1862                 if (!m_no_contents) {
1863                         BROWSER_LOGE("elm_layout_add failed");
1864                 }
1865                 elm_layout_theme_set(m_no_contents, "layout", "no_bookmark", "full");
1866                 elm_object_part_text_set (m_no_contents, "elm.text", BR_STRING_NO_BOOKMARKS);
1867                 evas_object_size_hint_weight_set(m_no_contents, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1868                 evas_object_size_hint_align_set(m_no_contents, EVAS_HINT_FILL, EVAS_HINT_FILL);
1869                 elm_object_part_content_set(m_genlist_content_layout, "elm.swallow.no_content", m_no_contents);
1870                 edje_object_signal_emit(elm_layout_edje_get(m_genlist_content_layout), "hide,content_box,signal", "");
1871                 evas_object_show(m_no_contents);
1872
1873                 elm_object_item_disabled_set(m_bookmark_edit_controlbar_item, EINA_TRUE);
1874         }else {
1875                 if (m_no_contents) {
1876                         elm_object_part_content_unset(m_genlist_content_layout, "elm.swallow.no_content");
1877                         evas_object_del(m_no_contents);
1878                         m_no_contents = NULL;
1879                         edje_object_signal_emit(elm_layout_edje_get(m_genlist_content_layout),
1880                                                 "show,content_box,signal", "");
1881                 }
1882
1883                 elm_object_item_disabled_set(m_bookmark_edit_controlbar_item, EINA_FALSE);
1884         }
1885 }
1886
1887 void Browser_Bookmark_View::_go_up_to_main_folder(void)
1888 {
1889         BROWSER_LOGD("[%s]", __func__);
1890
1891         m_current_folder_id = BROWSER_BOOKMARK_MAIN_FOLDER_ID;
1892
1893         elm_box_unpack(m_genlist_content_box, m_sub_folder_conformant);
1894         elm_box_pack_end(m_genlist_content_box, m_conformant);
1895         evas_object_show(m_conformant);
1896
1897         edje_object_signal_emit(elm_layout_edje_get(m_genlist_content_layout), "hide,upper_folder,signal", "");
1898
1899         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
1900         elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_INSTANT_OPEN);
1901         evas_object_data_set(m_navi_bar, "visible", (void *)EINA_TRUE);
1902
1903         for(int i = 0 ; i < m_sub_folder_list.size() ; i++) {
1904                 if (m_sub_folder_list[i]) {
1905                         delete m_sub_folder_list[i];
1906                         m_sub_folder_list.erase(m_sub_folder_list.begin() + i);
1907                 }
1908         }
1909         m_sub_folder_list.clear();
1910
1911         if (m_upper_folder_icon) {
1912                 evas_object_del(m_upper_folder_icon);
1913                 m_upper_folder_icon = NULL;
1914         }
1915         if (m_upper_folder_list) {
1916                 evas_object_del(m_upper_folder_list);
1917                 m_upper_folder_list = NULL;
1918         }
1919         if (m_sub_folder_genlist) {
1920                 evas_object_del(m_sub_folder_genlist);
1921                 m_sub_folder_genlist = NULL;
1922         }
1923         if (m_sub_folder_conformant) {
1924                 evas_object_del(m_sub_folder_conformant);
1925                 m_sub_folder_conformant = NULL;
1926         }
1927
1928         if (m_main_folder_list.size() == 0)
1929                 _show_empty_content_layout(EINA_TRUE);
1930         else
1931                 _show_empty_content_layout(EINA_FALSE);
1932
1933         elm_object_item_disabled_set(m_create_folder_controlbar_item, EINA_FALSE);
1934 }
1935
1936 void Browser_Bookmark_View::_go_to_sub_foler(const char *folder_name)
1937 {
1938         int folder_id;
1939         string navigationbar_title = folder_name;
1940         Eina_Bool ret = m_data_manager->get_bookmark_db()->get_folder_id(BROWSER_BOOKMARK_MAIN_FOLDER_ID,
1941                                                                         folder_name, &folder_id);
1942         if (!ret) {
1943                 BROWSER_LOGE("get_folder_id is failed.");
1944                 return;
1945         }
1946
1947         m_sub_folder_genlist = _create_sub_folder_genlist(folder_id);
1948         if (!m_sub_folder_genlist) {
1949                 BROWSER_LOGD("_create_sub_folder_genlist failed");
1950                 return;
1951         }
1952
1953         m_current_bookmark_navigationbar_title = navigationbar_title.c_str();
1954         _set_navigationbar_title(navigationbar_title.c_str());
1955
1956         elm_object_item_disabled_set(m_create_folder_controlbar_item, EINA_TRUE);
1957
1958         if (!m_sub_folder_list.size())
1959                 elm_object_item_disabled_set(m_bookmark_edit_controlbar_item, EINA_TRUE);
1960 }
1961
1962 void Browser_Bookmark_View::_set_navigationbar_title(const char *title)
1963 {
1964         BROWSER_LOGD("title=[%s]", title);
1965         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
1966         if (elm_object_item_content_get(top_it) == m_main_layout)
1967                 elm_object_item_text_set(top_it, title);
1968 }
1969
1970 Evas_Object *Browser_Bookmark_View::_create_sub_folder_genlist(int folder_id)
1971 {
1972         BROWSER_LOGD("[%s]", __func__);
1973         Evas_Object *genlist = elm_genlist_add(m_main_layout);
1974         if (genlist) {
1975                 elm_box_unpack(m_genlist_content_box, m_conformant);
1976                 evas_object_hide(m_conformant);
1977
1978                 m_sub_folder_conformant = elm_conformant_add(m_main_layout);
1979                 if (!m_sub_folder_conformant) {
1980                         BROWSER_LOGE("elm_conformant_add failed");
1981                         return EINA_FALSE;
1982                 }
1983                 elm_object_style_set(m_sub_folder_conformant, "internal_layout");
1984                 evas_object_size_hint_weight_set(m_sub_folder_conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1985                 evas_object_size_hint_align_set(m_sub_folder_conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
1986                 evas_object_show(m_sub_folder_conformant);
1987                 elm_box_pack_end(m_genlist_content_box, m_sub_folder_conformant);
1988
1989                 m_current_folder_id = folder_id;
1990
1991                 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1992                 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
1993                 elm_genlist_block_count_set(genlist, BROWSER_BOOKMARK_GENLIST_BLOCK_COUNT);
1994                 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
1995
1996 #if defined(GENLIST_SWEEP)
1997                 evas_object_smart_callback_add(genlist, "drag,start,up", __sweep_cancel_genlist_cb, genlist);
1998                 evas_object_smart_callback_add(genlist, "drag,start,down", __sweep_cancel_genlist_cb, genlist);
1999                 evas_object_smart_callback_add(genlist, "drag,start,right", __sweep_right_genlist_cb, this);
2000                 evas_object_smart_callback_add(genlist, "drag,start,left", __sweep_left_genlist_cb, this);
2001 #endif
2002
2003                 evas_object_smart_callback_add(genlist, "moved", __genlist_move_cb, this);
2004
2005                 elm_object_content_set(m_sub_folder_conformant, genlist);
2006                 evas_object_show(genlist);
2007
2008                 m_upper_folder_list = elm_list_add(m_main_layout);
2009                 if (m_upper_folder_list) {
2010                         elm_list_bounce_set(m_upper_folder_list,  EINA_FALSE, EINA_FALSE);
2011                         evas_object_size_hint_weight_set(m_upper_folder_list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2012                         evas_object_size_hint_align_set(m_upper_folder_list, EVAS_HINT_FILL, EVAS_HINT_FILL);
2013                         evas_object_show(m_upper_folder_list);
2014                         elm_object_part_content_set(m_genlist_content_layout, "elm.swallow.upperlist", m_upper_folder_list);
2015                         m_upper_folder_icon = elm_icon_add(m_upper_folder_list);
2016                         if (!m_upper_folder_icon) {
2017                                 BROWSER_LOGE("elm_icon_add failed");
2018                                 return NULL;
2019                         }
2020                         if (!elm_icon_file_set(m_upper_folder_icon, BROWSER_IMAGE_DIR"/I01_icon_upper_folder.png", NULL))
2021                                 BROWSER_LOGE("elm_icon_file_set is failed. [%s]");
2022
2023                         evas_object_size_hint_min_set(m_upper_folder_icon, UPPER_FOLDER_ICON_SIZE, UPPER_FOLDER_ICON_SIZE);
2024                         evas_object_resize(m_upper_folder_icon, UPPER_FOLDER_ICON_SIZE, UPPER_FOLDER_ICON_SIZE);
2025                         elm_list_item_append(m_upper_folder_list, BR_STRING_BOOKMARKS, m_upper_folder_icon,
2026                                                 NULL, __upper_folder_clicked_cb, this);
2027                         evas_object_show(m_upper_folder_icon);
2028                         edje_object_signal_emit(elm_layout_edje_get(m_genlist_content_layout), "show,upper_folder,signal", "");
2029
2030                         Elm_Object_Item *top_it = elm_naviframe_top_item_get(m_navi_bar);
2031                         elm_object_item_signal_emit(top_it, ELM_NAVIFRAME_ITEM_SIGNAL_OPTIONHEADER_INSTANT_CLOSE);
2032                         evas_object_data_set(m_navi_bar, "visible", (void *)EINA_FALSE);
2033                 }
2034
2035                 /* Fill bookmark list */
2036                 Eina_Bool ret = m_data_manager->get_bookmark_db()->get_bookmark_list(m_sub_folder_list,
2037                                                                                         m_current_folder_id);
2038                 if (!ret) {
2039                         return NULL;
2040                         BROWSER_LOGE("get_bookmark_list failed");
2041                 }
2042
2043                 int size = m_sub_folder_list.size();
2044                 BROWSER_LOGD("bookmark count=%d", size);
2045                 for (int i = 0 ; i < size ; i++ ) {
2046                         m_sub_folder_list[i]->user_data_1 = (void *)this;
2047                         m_sub_folder_list[i]->user_data_2 = (void *)elm_genlist_item_append(genlist,
2048                                                 &m_bookmark_genlist_item_class, m_sub_folder_list[i], NULL,
2049                                                 ELM_GENLIST_ITEM_NONE, __bookmark_item_clicked_cb, this);
2050                 }
2051
2052                 if (size == 0)
2053                         _show_empty_content_layout(EINA_TRUE);
2054                 else
2055                         _show_empty_content_layout(EINA_FALSE);
2056         }
2057
2058         return genlist;
2059 }
2060
2061 Evas_Object *Browser_Bookmark_View::_create_main_folder_genlist(void)
2062 {
2063         BROWSER_LOGD("[%s]", __func__);
2064         Evas_Object *genlist = elm_genlist_add(m_main_layout);
2065         if (genlist) {
2066                 m_current_folder_id = BROWSER_BOOKMARK_MAIN_FOLDER_ID;
2067
2068                 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2069                 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
2070                 elm_genlist_block_count_set(genlist, BROWSER_BOOKMARK_GENLIST_BLOCK_COUNT);
2071                 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
2072
2073 #if defined(GENLIST_SWEEP)
2074                 evas_object_smart_callback_add(genlist, "drag,start,up", __sweep_cancel_genlist_cb, genlist);
2075                 evas_object_smart_callback_add(genlist, "drag,start,down", __sweep_cancel_genlist_cb, genlist);
2076                 evas_object_smart_callback_add(genlist, "drag,start,right", __sweep_right_genlist_cb, this);
2077                 evas_object_smart_callback_add(genlist, "drag,start,left", __sweep_left_genlist_cb, this);
2078 #endif
2079                 evas_object_smart_callback_add(genlist, "moved", __genlist_move_cb, this);
2080
2081                 m_bookmark_genlist_item_class.item_style = "1text.1icon.2";
2082                 m_bookmark_genlist_item_class.decorate_item_style = "mode/slide2";
2083                 m_bookmark_genlist_item_class.decorate_all_item_style = "edit_default";
2084                 m_bookmark_genlist_item_class.func.text_get = __genlist_label_get_cb;
2085                 m_bookmark_genlist_item_class.func.content_get = __genlist_icon_get_cb;
2086                 m_bookmark_genlist_item_class.func.state_get = NULL;
2087                 m_bookmark_genlist_item_class.func.del = NULL;
2088 //              m_bookmark_genlist_item_class.func.moved = __genlist_move_cb;
2089
2090                 evas_object_show(genlist);
2091
2092                 /* Fill bookmark list */
2093                 Eina_Bool ret = m_data_manager->get_bookmark_db()->get_bookmark_list(m_main_folder_list,
2094                                                                                         m_current_folder_id);
2095                 if (!ret) {
2096                         return NULL;
2097                         BROWSER_LOGE("get_bookmark_list failed");
2098                 }
2099
2100                 int size = m_main_folder_list.size();
2101                 BROWSER_LOGD("bookmark count=%d", size);
2102                 for (int i = 0 ; i < size ; i++ ) {
2103                         m_main_folder_list[i]->user_data_1 = (void *)this;
2104                         m_main_folder_list[i]->user_data_2 = (void *)elm_genlist_item_append(genlist,
2105                                                 &m_bookmark_genlist_item_class, m_main_folder_list[i], NULL,
2106                                                 ELM_GENLIST_ITEM_NONE, __bookmark_item_clicked_cb, this);
2107                 }
2108         }
2109
2110         return genlist;
2111 }
2112
2113 void Browser_Bookmark_View::__create_folder_button(void *data, Evas_Object *obj, void *event_info)
2114 {
2115         if (!data)
2116                 return;
2117         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
2118
2119         /* New folder */
2120         if (!m_data_manager->create_new_folder_view()) {
2121                 BROWSER_LOGE("create_new_folder_view failed");
2122                 return;
2123         }
2124
2125         if (!m_data_manager->get_new_folder_view()->init()) {
2126                 BROWSER_LOGE("get_new_folder_view()->init() failed");
2127                 m_data_manager->destroy_new_folder_view();
2128                 return;
2129         }
2130 }
2131
2132 void Browser_Bookmark_View::__add_to_bookmark_cb(void *data, Evas_Object *obj, void *event_info)
2133 {
2134         if (!data)
2135                 return;
2136         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
2137         if (!m_data_manager->create_add_to_bookmark_view(m_data_manager->get_browser_view()->get_title(),
2138                                                 m_data_manager->get_browser_view()->get_url(), bookmark_view->m_current_folder_id)) {
2139                 BROWSER_LOGE("m_data_manager->create_add_to_bookmark_view failed");
2140                 return;
2141         }
2142
2143         if (!m_data_manager->get_add_to_bookmark_view()->init())
2144                 m_data_manager->destroy_add_to_bookmark_view();
2145 }
2146
2147 Eina_Bool Browser_Bookmark_View::_set_controlbar_type(controlbar_type type)
2148 {
2149         if (m_bottom_control_bar)
2150                 evas_object_del(m_bottom_control_bar);
2151
2152         m_bookmark_delete_controlbar_item = NULL;
2153         m_create_folder_controlbar_item = NULL;
2154
2155         if (type == BOOKMARK_VIEW_DEFAULT) {
2156                 elm_object_style_set(m_bg, "default");
2157
2158                 Elm_Object_Item *navi_it = elm_naviframe_top_item_get(m_navi_bar);
2159
2160                 m_back_button = elm_button_add(m_main_layout);
2161                 if (!m_back_button) {
2162                         BROWSER_LOGE("elm_button_add failed");
2163                         return EINA_FALSE;
2164                 }
2165                 elm_object_style_set(m_back_button, "browser/bookmark_controlbar_back");
2166                 evas_object_smart_callback_add(m_back_button, "clicked", __back_button_clicked_cb, this);
2167                 evas_object_show(m_back_button);
2168                 elm_object_item_part_content_set(navi_it, ELM_NAVIFRAME_ITEM_PREV_BTN, m_back_button);
2169
2170                 m_bottom_control_bar = elm_toolbar_add(m_main_layout);
2171                 if (!m_bottom_control_bar) {
2172                         BROWSER_LOGE("elm_toolbar_add failed");
2173                         return EINA_TRUE;
2174                 }
2175                 elm_object_style_set(m_bottom_control_bar, "browser/default");
2176                 elm_toolbar_shrink_mode_set(m_bottom_control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
2177
2178                 m_create_folder_controlbar_item = elm_toolbar_item_append(m_bottom_control_bar,
2179                                                         BROWSER_IMAGE_DIR"/I01_controlbar_icon_create.png",
2180                                                         NULL, __add_to_bookmark_cb, this);
2181                 m_bookmark_edit_controlbar_item = elm_toolbar_item_append(m_bottom_control_bar,
2182                                                         BROWSER_IMAGE_DIR"/01_controlbar_icon_compose.png", NULL,
2183                                                         __edit_controlbar_item_clicked_cb, this);
2184                 m_create_folder_controlbar_item = elm_toolbar_item_append(m_bottom_control_bar,
2185                                                         BROWSER_IMAGE_DIR"/01_controlbar_icon_create_folder.png",
2186                                                         NULL, __create_folder_button, this);
2187                 evas_object_show(m_bottom_control_bar);
2188
2189                 if (m_current_folder_id != BROWSER_BOOKMARK_MAIN_FOLDER_ID)
2190                         elm_object_item_disabled_set(m_create_folder_controlbar_item, EINA_TRUE);
2191
2192                 if (!_get_current_folder_item_list().size())
2193                         elm_object_item_disabled_set(m_bookmark_edit_controlbar_item, EINA_TRUE);
2194
2195                 elm_object_item_part_content_set(navi_it, ELM_NAVIFRAME_ITEM_CONTROLBAR, m_bottom_control_bar);
2196         } else if (type == BOOKMARK_VIEW_EDIT_MODE || type == HISTORY_VIEW_EDIT_MODE) {
2197                 elm_object_style_set(m_bg, "edit_mode");
2198
2199                 Elm_Object_Item *navi_it = elm_naviframe_top_item_get(m_navi_bar);
2200                 elm_object_item_part_content_set(navi_it, ELM_NAVIFRAME_ITEM_PREV_BTN, NULL);
2201
2202                 m_bottom_control_bar = elm_toolbar_add(m_main_layout);
2203                 if (!m_bottom_control_bar) {
2204                         BROWSER_LOGE("elm_toolbar_add failed");
2205                         return EINA_FALSE;
2206                 }
2207                 elm_object_style_set(m_bottom_control_bar, "browser/default");
2208                 elm_toolbar_shrink_mode_set(m_bottom_control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
2209
2210                 Elm_Object_Item *empty_item = elm_toolbar_item_append(m_bottom_control_bar, NULL, NULL, NULL, NULL);
2211                 elm_object_item_disabled_set(empty_item, EINA_TRUE);
2212
2213                 m_bookmark_delete_controlbar_item = elm_toolbar_item_append(m_bottom_control_bar,
2214                                                                         BROWSER_IMAGE_DIR"/01_controlbar_icon_delete.png",
2215                                                                         NULL, __delete_controlbar_item_clicked_cb, this);
2216
2217                 empty_item = elm_toolbar_item_append(m_bottom_control_bar, NULL, NULL, NULL, NULL);
2218                 elm_object_item_disabled_set(empty_item, EINA_TRUE);
2219
2220                 elm_toolbar_item_append(m_bottom_control_bar, BROWSER_IMAGE_DIR"/01_controllbar_icon_close.png", NULL,
2221                                                                                 __edit_controlbar_item_clicked_cb, this);
2222
2223                 if (type == BOOKMARK_VIEW_EDIT_MODE) {
2224                         int delete_item_count = 0;
2225                         Elm_Object_Item *it = elm_genlist_first_item_get(_get_current_folder_genlist());
2226                         while(it) {
2227                                 Browser_Bookmark_DB::bookmark_item *item = NULL;
2228                                 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(it);
2229                                 if (item->is_delete)
2230                                         delete_item_count++;
2231                                 it = elm_genlist_item_next_get(it);
2232                         }
2233
2234                         if (delete_item_count)
2235                                 elm_object_item_disabled_set(m_bookmark_delete_controlbar_item, EINA_FALSE);
2236                         else
2237                                 elm_object_item_disabled_set(m_bookmark_delete_controlbar_item, EINA_TRUE);
2238                 } else {
2239                         int delete_item_count = 0;
2240                         Elm_Object_Item *it = elm_genlist_first_item_get(m_data_manager->get_history_layout()->m_history_genlist);
2241                         while(it) {
2242                                 Browser_History_DB::history_item *item = NULL;
2243                                 item = (Browser_History_DB::history_item *)elm_object_item_data_get(it);
2244
2245                                 /* Ignore the date label. */
2246                                 if (elm_genlist_item_select_mode_get(it) != ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) {
2247                                         if (item->is_delete)
2248                                                 delete_item_count++;
2249                                 }
2250                                 it = elm_genlist_item_next_get(it);
2251                         }
2252                         if (delete_item_count)
2253                                 elm_object_item_disabled_set(m_bookmark_delete_controlbar_item, EINA_FALSE);
2254                         else
2255                                 elm_object_item_disabled_set(m_bookmark_delete_controlbar_item, EINA_TRUE);
2256                 }
2257
2258                 evas_object_show(m_bottom_control_bar);
2259                 elm_object_item_part_content_set(navi_it, ELM_NAVIFRAME_ITEM_CONTROLBAR, m_bottom_control_bar);
2260         } else if (type == HISTORY_VIEW_DEFAULT) {
2261                 elm_object_style_set(m_bg, "default");
2262
2263                 Elm_Object_Item *navi_it = elm_naviframe_top_item_get(m_navi_bar);
2264
2265                 m_back_button = elm_button_add(m_main_layout);
2266                 if (!m_back_button) {
2267                         BROWSER_LOGE("elm_button_add failed");
2268                         return EINA_FALSE;
2269                 }
2270                 elm_object_style_set(m_back_button, "browser/bookmark_controlbar_back");
2271                 evas_object_smart_callback_add(m_back_button, "clicked", __back_button_clicked_cb, this);
2272                 evas_object_show(m_back_button);
2273                 elm_object_item_part_content_set(navi_it, ELM_NAVIFRAME_ITEM_PREV_BTN, m_back_button);
2274
2275                 m_bottom_control_bar = elm_toolbar_add(m_main_layout);
2276                 if (!m_bottom_control_bar) {
2277                         BROWSER_LOGE("elm_toolbar_add failed");
2278                         return EINA_TRUE;
2279                 }
2280                 elm_object_style_set(m_bottom_control_bar, "browser/default");
2281                 elm_toolbar_shrink_mode_set(m_bottom_control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
2282
2283                 Elm_Object_Item *empty_item = elm_toolbar_item_append(m_bottom_control_bar, NULL, NULL, NULL, NULL);
2284                 elm_object_item_disabled_set(empty_item, EINA_TRUE);
2285
2286                 m_bookmark_edit_controlbar_item = elm_toolbar_item_append(m_bottom_control_bar,
2287                                                                 BROWSER_IMAGE_DIR"/01_controlbar_icon_compose.png", NULL,
2288                                                                 __edit_controlbar_item_clicked_cb, this);
2289
2290                 empty_item = elm_toolbar_item_append(m_bottom_control_bar, NULL, NULL, NULL, NULL);
2291                 elm_object_item_disabled_set(empty_item, EINA_TRUE);
2292
2293                 Browser_History_Layout *history_layout = m_data_manager->get_history_layout();
2294                 if (history_layout) {
2295                         if (!history_layout->m_history_list.size())
2296                                 elm_object_item_disabled_set(m_bookmark_edit_controlbar_item, EINA_TRUE);
2297                         else
2298                                 elm_object_item_disabled_set(m_bookmark_edit_controlbar_item, EINA_FALSE);
2299                 }
2300
2301                 evas_object_show(m_bottom_control_bar);
2302
2303                 elm_object_item_part_content_set(navi_it, ELM_NAVIFRAME_ITEM_CONTROLBAR, m_bottom_control_bar);
2304         }
2305
2306         elm_object_focus_allow_set(m_bottom_control_bar, EINA_FALSE);
2307
2308         return EINA_TRUE;
2309 }
2310
2311 void Browser_Bookmark_View::__naviframe_pop_finished_cb(void *data , Evas_Object *obj, void *event_info)
2312 {
2313         BROWSER_LOGD("[%s]", __func__);
2314         if (!data)
2315                 return;
2316
2317         Browser_Bookmark_View *bookmark_view = (Browser_Bookmark_View *)data;
2318         Elm_Object_Item *it = (Elm_Object_Item *)event_info;
2319
2320         if (bookmark_view->m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
2321                 return;
2322
2323         /* Bookmark view -> Edit one bookmark item, then cancel. */
2324         m_data_manager->destroy_edit_bookmark_view();
2325
2326         /* History view -> slide one item -> add to bookmark, then done. */
2327         m_data_manager->destroy_add_to_bookmark_view();
2328
2329         m_data_manager->destroy_new_folder_view();
2330 }
2331
2332 Eina_Bool Browser_Bookmark_View::_create_main_layout(void)
2333 {
2334         BROWSER_LOGD("[%s]", __func__);
2335         m_main_layout = elm_layout_add(m_navi_bar);
2336         if (!m_main_layout) {
2337                 BROWSER_LOGE("elm_layout_add failed");
2338                 return EINA_FALSE;
2339         }
2340         if (!elm_layout_file_set(m_main_layout, BROWSER_EDJE_DIR"/browser-bookmark-view.edj",
2341                                         "bookmark/main_layout")) {
2342                 BROWSER_LOGE("elm_layout_file_set failed");
2343                 return EINA_FALSE;
2344         }
2345
2346         elm_win_conformant_set(m_win, EINA_TRUE);
2347         m_conformant = elm_conformant_add(m_main_layout);
2348         if (!m_conformant) {
2349                 BROWSER_LOGE("elm_conformant_add failed");
2350                 return EINA_FALSE;
2351         }
2352         elm_object_style_set(m_conformant, "internal_layout");
2353         evas_object_size_hint_weight_set(m_conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2354         evas_object_size_hint_align_set(m_conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
2355         evas_object_show(m_conformant);
2356
2357         elm_object_style_set(m_bg, "default");
2358
2359         m_genlist_content_layout = elm_layout_add(m_main_layout);
2360         if (!m_genlist_content_layout) {
2361                 BROWSER_LOGE("elm_layout_add failed");
2362                 return EINA_FALSE;
2363         }
2364         if (!elm_layout_file_set(m_genlist_content_layout, BROWSER_EDJE_DIR"/browser-bookmark-view.edj",
2365                                         "bookmark/content_layout")) {
2366                 BROWSER_LOGE("elm_layout_file_set failed");
2367                 return EINA_FALSE;
2368         }
2369         evas_object_size_hint_weight_set(m_genlist_content_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2370         evas_object_show(m_genlist_content_layout);
2371         edje_object_signal_emit(elm_layout_edje_get(m_genlist_content_layout), "show,content_box,signal", "");
2372
2373         m_genlist_content_box = elm_box_add(m_genlist_content_layout);
2374         if (!m_genlist_content_box) {
2375                 BROWSER_LOGE("elm_box_add failed");
2376                 return EINA_FALSE;
2377         }
2378         evas_object_size_hint_weight_set(m_genlist_content_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2379         evas_object_show(m_genlist_content_box);
2380         elm_object_part_content_set(m_genlist_content_layout, "elm.swallow.content_box", m_genlist_content_box);
2381         elm_box_pack_end(m_genlist_content_box, m_conformant);
2382
2383         m_main_folder_genlist = _create_main_folder_genlist();
2384         if (!m_main_folder_genlist) {
2385                 BROWSER_LOGE("_create_main_folder_genlist failed");
2386                 return EINA_FALSE;
2387         }
2388
2389         elm_object_content_set(m_conformant, m_main_folder_genlist);
2390
2391         m_back_button = elm_button_add(m_main_layout);
2392         if (!m_back_button) {
2393                 BROWSER_LOGE("elm_button_add failed");
2394                 return EINA_FALSE;
2395         }
2396         elm_object_style_set(m_back_button, "browser/bookmark_controlbar_back");
2397         evas_object_smart_callback_add(m_back_button, "clicked", __back_button_clicked_cb, this);
2398         evas_object_show(m_back_button);
2399
2400         elm_object_part_content_set(m_main_layout, "elm.swallow.content", m_genlist_content_layout);
2401
2402         m_top_control_bar = elm_toolbar_add(m_main_layout);
2403         if (!m_top_control_bar) {
2404                 BROWSER_LOGE("elm_toolbar_add failed");
2405                 return EINA_FALSE;
2406         }
2407         elm_object_style_set(m_top_control_bar, "browser/tabbar");
2408
2409         elm_toolbar_shrink_mode_set(m_top_control_bar, ELM_TOOLBAR_SHRINK_EXPAND);
2410
2411         elm_object_part_content_set(m_main_layout, "elm.swallow.tabbar", m_top_control_bar);
2412
2413         Elm_Object_Item *bookmark_tab_item = elm_toolbar_item_append(m_top_control_bar, NULL,
2414                                                                 BR_STRING_BOOKMARKS, __controlbar_tab_changed_cb, this);
2415         elm_toolbar_item_append(m_top_control_bar, NULL, BR_STRING_HISTORY, __controlbar_tab_changed_cb, this);
2416
2417         elm_toolbar_select_mode_set(m_top_control_bar, ELM_OBJECT_SELECT_MODE_ALWAYS);
2418         elm_toolbar_item_selected_set(bookmark_tab_item, EINA_TRUE);
2419
2420         evas_object_show(m_top_control_bar);
2421
2422         m_navi_it = elm_naviframe_item_push(m_navi_bar, NULL, m_back_button, NULL,
2423                                                                 m_main_layout, "browser/tabbar");
2424
2425         evas_object_smart_callback_add(m_navi_bar, "transition,finished", __naviframe_pop_finished_cb, this);
2426
2427         int size = m_main_folder_list.size();
2428         if (size == 0)
2429                 _show_empty_content_layout(EINA_TRUE);
2430         else
2431                 _show_empty_content_layout(EINA_FALSE);
2432
2433         return EINA_TRUE;
2434 }
2435