2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://www.tizenopensource.org/license
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.
18 #include "browser-add-to-bookmark-view.h"
19 #include "browser-bookmark-db.h"
20 #include "browser-bookmark-view.h"
21 #include "browser-view.h"
22 #include "browser-select-folder-view.h"
24 Browser_Add_To_Bookmark_View::Browser_Add_To_Bookmark_View(string title, string url,
25 Eina_Bool is_edit_mode, int current_folder_id)
29 ,m_title_cancel_button(NULL)
30 ,m_title_done_button(NULL)
31 ,m_title_edit_field(NULL)
32 ,m_url_edit_field(NULL)
33 ,m_is_edit_mode(is_edit_mode)
34 ,m_folder_id_to_save(current_folder_id)
35 ,m_current_folder_id(current_folder_id)
38 BROWSER_LOGD("[%s]", __func__);
43 Browser_Add_To_Bookmark_View::~Browser_Add_To_Bookmark_View(void)
45 BROWSER_LOGD("[%s]", __func__);
47 /* If browser view -> add to bookmark, then back to browser view. */
48 if (!m_data_manager->is_in_view_stack(BR_BOOKMARK_VIEW))
49 m_data_manager->destroy_bookmark_db();
51 evas_object_smart_callback_del(m_navi_bar, "transition,finished", __naviframe_pop_finished_cb);
54 Eina_Bool Browser_Add_To_Bookmark_View::init(void)
56 BROWSER_LOGD("[%s]", __func__);
58 /* If the bookmark view is in view stack, bookmark view -> edit bookmark item. */
59 /* Otherwise, this case is browser view -> add to bookmark, then create the bookmar db */
60 if (!m_data_manager->is_in_view_stack(BR_BOOKMARK_VIEW)) {
61 if (!m_data_manager->create_bookmark_db()) {
62 BROWSER_LOGE("m_data_manager->create_bookmark_db() failed");
67 return _create_main_layout();
70 void Browser_Add_To_Bookmark_View::return_to_add_to_bookmark_view(int changed_folder_id)
72 BROWSER_LOGD("[%s]", __func__);
74 /* If changed_folder_id is -1, just cancel the folder view. */
75 if (changed_folder_id != -1) {
76 m_folder_id_to_save = changed_folder_id;
77 Elm_Object_Item *folder_it = elm_genlist_last_item_get(m_genlist);
79 elm_genlist_item_update(folder_it);
84 void Browser_Add_To_Bookmark_View::__title_entry_changed_cb(void *data, Evas_Object *obj, void *eventInfo)
86 BROWSER_LOGD("[%s]", __func__);
90 Browser_Add_To_Bookmark_View *add_to_bookmark_view = (Browser_Add_To_Bookmark_View *)data;
91 const char *title = elm_entry_entry_get(br_elm_editfield_entry_get(add_to_bookmark_view->m_title_edit_field));
92 const char *url = elm_entry_entry_get(br_elm_editfield_entry_get(add_to_bookmark_view->m_url_edit_field));
94 Eina_Bool only_has_space = EINA_FALSE;
96 if (title && strlen(title)) {
97 for (int i = 0 ; i < strlen(title) ; i++) {
101 if (space_count == strlen(title))
102 only_has_space = EINA_TRUE;
106 if (url && strlen(url)) {
107 for (int i = 0 ; i < strlen(url) ; i++) {
111 if (space_count == strlen(url))
112 only_has_space = EINA_TRUE;
115 char *text = elm_entry_markup_to_utf8(elm_entry_entry_get(obj));
116 if (!text || strlen(text) == 0 || !title || strlen(title) == 0
117 || !url || strlen(url) == 0 || only_has_space)
118 elm_object_disabled_set(add_to_bookmark_view->m_title_done_button, EINA_TRUE);
120 elm_object_disabled_set(add_to_bookmark_view->m_title_done_button, EINA_FALSE);
126 char *Browser_Add_To_Bookmark_View::__genlist_label_get_cb(void *data, Evas_Object *obj, const char *part)
128 BROWSER_LOGD("[%s]", __func__);
132 if (!strncmp(part, "elm.text.1", strlen("elm.text.1"))) {
133 Browser_Add_To_Bookmark_View *add_to_bookmark_view = (Browser_Add_To_Bookmark_View *)data;
134 Browser_Bookmark_DB *bookmark_db = m_data_manager->get_bookmark_db();
135 int folder_id = add_to_bookmark_view->m_folder_id_to_save;
137 if (add_to_bookmark_view->m_folder_id_to_save == BROWSER_BOOKMARK_MAIN_FOLDER_ID)
138 return strdup(BR_STRING_BOOKMARKS);
140 string default_folder_name = bookmark_db->get_folder_name_by_id(folder_id);
141 return strdup(default_folder_name.c_str());
143 } else if (!strncmp(part, "elm.text.2", strlen("elm.text.2")))
144 return strdup(BR_STRING_FOLDER);
149 Evas_Object *Browser_Add_To_Bookmark_View::__genlist_icon_get_cb(void *data, Evas_Object *obj, const char *part)
151 BROWSER_LOGD("[%s]", part);
155 genlist_item_param *param = (genlist_item_param *)data;
156 field_type type = param->type;
157 Browser_Add_To_Bookmark_View *add_to_bookmark_view = param->add_to_bookmark_view;
158 string title = add_to_bookmark_view->m_title;
159 string url = add_to_bookmark_view->m_url;
161 if (!strncmp(part, "elm.icon", strlen("elm.icon"))) {
162 if (type == TITLE_EDIT_FIELD) {
163 add_to_bookmark_view->m_title_edit_field = br_elm_editfield_add(obj, EINA_TRUE);
164 if (!add_to_bookmark_view->m_title_edit_field)
166 br_elm_editfield_entry_single_line_set(add_to_bookmark_view->m_title_edit_field, EINA_TRUE);
167 br_elm_editfield_guide_text_set(add_to_bookmark_view->m_title_edit_field, BR_STRING_ENTER_BOOKMARK_NAME);
168 br_elm_editfield_label_set(add_to_bookmark_view->m_title_edit_field, BR_STRING_TITLE);
170 evas_object_smart_callback_add(br_elm_editfield_entry_get(add_to_bookmark_view->m_title_edit_field),
171 "changed", __title_entry_changed_cb, add_to_bookmark_view);
173 if (!add_to_bookmark_view->m_input_title.empty()) {
174 elm_entry_entry_set(br_elm_editfield_entry_get(add_to_bookmark_view->m_title_edit_field),
175 add_to_bookmark_view->m_input_title.c_str());
176 add_to_bookmark_view->m_input_title.clear();
178 char *mark_up = elm_entry_utf8_to_markup(title.c_str());
180 BROWSER_LOGE("elm_entry_utf8_to_markup failed");
183 elm_entry_entry_set(br_elm_editfield_entry_get(add_to_bookmark_view->m_title_edit_field), mark_up);
189 return add_to_bookmark_view->m_title_edit_field;
191 add_to_bookmark_view->m_url_edit_field = br_elm_editfield_add(obj, EINA_TRUE);
192 if (!add_to_bookmark_view->m_url_edit_field)
194 br_elm_editfield_entry_single_line_set(add_to_bookmark_view->m_url_edit_field, EINA_TRUE);
195 br_elm_editfield_label_set(add_to_bookmark_view->m_url_edit_field, BR_STRING_URL);
196 elm_entry_input_panel_layout_set(br_elm_editfield_entry_get(add_to_bookmark_view->m_url_edit_field),
197 ELM_INPUT_PANEL_LAYOUT_URL);
199 evas_object_smart_callback_add(br_elm_editfield_entry_get(add_to_bookmark_view->m_url_edit_field),
200 "changed", __title_entry_changed_cb, add_to_bookmark_view);
202 if (!add_to_bookmark_view->m_input_url.empty()) {
203 elm_entry_entry_set(br_elm_editfield_entry_get(add_to_bookmark_view->m_url_edit_field),
204 add_to_bookmark_view->m_input_url.c_str());
205 add_to_bookmark_view->m_input_url.clear();
209 char *mark_up = elm_entry_utf8_to_markup(url.c_str());
211 BROWSER_LOGE("elm_entry_utf8_to_markup failed");
214 elm_entry_entry_set(br_elm_editfield_entry_get(add_to_bookmark_view->m_url_edit_field), mark_up);
219 return add_to_bookmark_view->m_url_edit_field;
226 Evas_Object *Browser_Add_To_Bookmark_View::_create_content_genlist(void)
228 BROWSER_LOGD("[%s]", __func__);
229 Evas_Object *genlist = elm_genlist_add(m_conformant);
231 BROWSER_LOGE("elm_genlist_add failed");
235 m_edit_field_item_class.item_style = "dialogue/1icon";
236 m_edit_field_item_class.func.text_get = NULL;
237 m_edit_field_item_class.func.content_get = __genlist_icon_get_cb;
238 m_edit_field_item_class.func.state_get = NULL;
239 m_edit_field_item_class.func.del = NULL;
241 m_title_param.type = TITLE_EDIT_FIELD;
242 m_title_param.add_to_bookmark_view = this;
243 elm_genlist_item_append(genlist, &m_edit_field_item_class, &m_title_param, NULL,
244 ELM_GENLIST_ITEM_NONE, NULL, NULL);
246 m_seperator_item_class.item_style = "dialogue/seperator";
247 m_seperator_item_class.func.text_get = NULL;
248 m_seperator_item_class.func.del = NULL;
249 m_seperator_item_class.func.content_get = NULL;
250 m_seperator_item_class.func.state_get = NULL;
251 Elm_Object_Item *it = elm_genlist_item_append(genlist, &m_seperator_item_class, NULL, NULL,
252 ELM_GENLIST_ITEM_NONE, NULL, NULL);
253 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
255 m_url_param.type = URL_EDIT_FIELD;
256 m_url_param.add_to_bookmark_view = this;
257 elm_genlist_item_append(genlist, &m_edit_field_item_class, &m_url_param, NULL,
258 ELM_GENLIST_ITEM_NONE, NULL, NULL);
260 it = elm_genlist_item_append(genlist, &m_seperator_item_class, NULL, NULL,
261 ELM_GENLIST_ITEM_NONE, NULL, NULL);
263 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
265 m_folder_item_class.item_style = "dialogue/2text.2";
266 m_folder_item_class.func.text_get = __genlist_label_get_cb;
267 m_folder_item_class.func.content_get = NULL;
268 m_folder_item_class.func.state_get = NULL;
269 m_folder_item_class.func.del = NULL;
271 elm_genlist_item_append(genlist, &m_folder_item_class, this, NULL, ELM_GENLIST_ITEM_NONE,
272 _select_folder_clicked_cb, this);
274 evas_object_show(genlist);
279 void Browser_Add_To_Bookmark_View::_select_folder_clicked_cb(void *data, Evas_Object *obj, void *eventInfo)
281 BROWSER_LOGD("[%s]", __func__);
285 Browser_Add_To_Bookmark_View *add_to_bookmark_view = (Browser_Add_To_Bookmark_View *)data;
286 if (!m_data_manager->create_select_folder_view(add_to_bookmark_view->m_folder_id_to_save)) {
287 BROWSER_LOGE("m_data_manager->create_select_folder_view failed");
291 if (!m_data_manager->get_select_folder_view()->init()) {
292 BROWSER_LOGE("get_select_folder_view()->init failed");
293 m_data_manager->destroy_select_folder_view();
296 Elm_Object_Item *it = elm_genlist_selected_item_get(obj);
297 elm_genlist_item_selected_set(it, EINA_FALSE);
299 add_to_bookmark_view->m_input_title = std::string(elm_entry_entry_get(br_elm_editfield_entry_get(add_to_bookmark_view->m_title_edit_field)));
300 add_to_bookmark_view->m_input_url = std::string(elm_entry_entry_get(br_elm_editfield_entry_get(add_to_bookmark_view->m_url_edit_field)));
303 void Browser_Add_To_Bookmark_View::__cancel_button_clicked_cb(void *data, Evas_Object *obj, void *eventInfo)
305 BROWSER_LOGD("[%s]", __func__);
309 Browser_Add_To_Bookmark_View *add_to_bookmark_view = (Browser_Add_To_Bookmark_View *)data;
310 Evas_Object *navi_bar = add_to_bookmark_view->m_navi_bar;
312 if (elm_naviframe_bottom_item_get(navi_bar) != elm_naviframe_top_item_get(navi_bar))
313 elm_naviframe_item_pop(navi_bar);
315 if (m_data_manager->is_in_view_stack(BR_ADD_TO_BOOKMARK_VIEW)) {
316 /* Set the title if enter the add to bookmark while loading. */
317 m_data_manager->get_browser_view()->return_to_browser_view();
320 if (m_data_manager->is_in_view_stack(BR_BOOKMARK_VIEW) && m_data_manager->get_bookmark_view())
321 /* boomark view -> edit one bookmark item, then cancel. */
322 m_data_manager->get_bookmark_view()->return_to_bookmark_view();
325 /* bookmark -> edit -> edit each bookmark item then bookmark edit view -> done */
326 Eina_Bool Browser_Add_To_Bookmark_View::_modify_bookmark_item(const char *title, const char *url)
330 Browser_Bookmark_DB *bookmark_db = m_data_manager->get_bookmark_db();
331 ret = bookmark_db->get_bookmark_id_by_title_url(m_current_folder_id, m_title.c_str(), m_url.c_str(), &bookmark_id);
334 ret = bookmark_db->modify_bookmark(bookmark_id, m_folder_id_to_save, title, url);
338 Browser_Bookmark_DB::bookmark_item *item = NULL;
340 Browser_Bookmark_View *bookmark_view = m_data_manager->get_bookmark_view();
341 Elm_Object_Item *bookmark_edit_it = bookmark_view->m_current_genlist_item_to_edit;
342 item = (Browser_Bookmark_DB::bookmark_item *)elm_object_item_data_get(bookmark_edit_it);
346 elm_object_item_data_set(bookmark_edit_it, item);
348 if (m_current_folder_id != m_folder_id_to_save) {
349 if (m_folder_id_to_save == BROWSER_BOOKMARK_MAIN_FOLDER_ID) {
350 /* If the bookmark item in sub folder is moved to main folder,
351 * remove it from sub folder and append it to main folder. */
352 for(int i = 0 ; i < bookmark_view->m_sub_folder_list.size() ; i++) {
353 if (bookmark_view->m_sub_folder_list[i] == item) {
354 bookmark_view->m_sub_folder_list.erase(bookmark_view->m_sub_folder_list.begin() + i);
359 /* If the bookmark is empty page, destroy the empty layout to show the bookmark list. */
360 if (bookmark_view->m_main_folder_list.size() == 0)
361 bookmark_view->_show_empty_content_layout(EINA_TRUE);
363 bookmark_view->_show_empty_content_layout(EINA_FALSE);
364 } else if (m_current_folder_id == BROWSER_BOOKMARK_MAIN_FOLDER_ID) {
365 /* Move one bookmark item from main folder to sub folder. */
366 for(int i = 0 ; i < bookmark_view->m_main_folder_list.size() ; i++) {
367 if (bookmark_view->m_main_folder_list[i] == item) {
368 delete bookmark_view->m_main_folder_list[i];
369 bookmark_view->m_main_folder_list.erase(bookmark_view->m_main_folder_list.begin() + i);
374 /* If the bookmark item in sub folder is moved to another sub folder,
375 * just remove the item from the genlist and delete the malloced item.*/
376 for(int i = 0 ; i < bookmark_view->m_sub_folder_list.size() ; i++) {
377 if (bookmark_view->m_sub_folder_list[i] == item) {
379 bookmark_view->m_sub_folder_list.erase(bookmark_view->m_sub_folder_list.begin() + i);
385 elm_object_item_del(bookmark_edit_it);
391 Eina_Bool Browser_Add_To_Bookmark_View::_save_bookmark_item(const char *title, const char *url)
393 BROWSER_LOGD("[%s]", __func__);
394 return m_data_manager->get_bookmark_db()->save_bookmark(m_folder_id_to_save, title, url);
397 void Browser_Add_To_Bookmark_View::__done_button_clicked_cb(void *data, Evas_Object *obj, void *eventInfo)
399 BROWSER_LOGD("[%s]", __func__);
403 Browser_Add_To_Bookmark_View *add_to_bookmark_view = (Browser_Add_To_Bookmark_View *)data;
404 Evas_Object *navi_bar = add_to_bookmark_view->m_navi_bar;
405 Evas_Object *url_edit_field_entry = br_elm_editfield_entry_get(add_to_bookmark_view->m_url_edit_field);
406 char *url = elm_entry_markup_to_utf8(elm_entry_entry_get(url_edit_field_entry));
407 Evas_Object *title_edit_field_entry = br_elm_editfield_entry_get(add_to_bookmark_view->m_title_edit_field);
408 char *title = elm_entry_markup_to_utf8(elm_entry_entry_get(title_edit_field_entry));
410 if (!url || strlen(url) == 0) {
411 add_to_bookmark_view->show_msg_popup(BR_STRING_ENTER_URL);
414 if (!title || strlen(title) == 0) {
415 add_to_bookmark_view->show_msg_popup(BR_STRING_ENTER_TITLE);
419 add_to_bookmark_view->_done_button_clicked(title, url);
427 void Browser_Add_To_Bookmark_View::_done_button_clicked(const char *title, const char* url)
429 Browser_Bookmark_DB *bookmark_db = m_data_manager->get_bookmark_db();
430 Eina_Bool is_duplicate = bookmark_db->is_duplicated(m_folder_id_to_save, title, url);
432 if (bookmark_db->is_full()) {
433 show_msg_popup(BR_STRING_WARNING,
434 BR_STRING_WARNING_OVER_BOOKMARK_LIMIT, 5);
439 ret = _save_bookmark_item(title, url);
441 ret = _modify_bookmark_item(title, url);
444 show_msg_popup(BR_STRING_FAILED);
447 if (elm_naviframe_bottom_item_get(m_navi_bar) != elm_naviframe_top_item_get(m_navi_bar))
448 elm_naviframe_item_pop(m_navi_bar);
450 if (!m_data_manager->is_in_view_stack(BR_BOOKMARK_VIEW)) {
451 #if defined(FEATURE_MOST_VISITED_SITES)
452 /* Set the title if enter the add to bookmark while loading. */
453 if (m_data_manager->get_browser_view()->is_most_visited_sites_running())
454 m_data_manager->get_browser_view()->return_to_browser_view(EINA_TRUE);
457 m_data_manager->get_browser_view()->return_to_browser_view();
459 #if defined(FEATURE_MOST_VISITED_SITES)
460 if (m_data_manager->get_browser_view()->is_most_visited_sites_running())
461 m_data_manager->get_browser_view()->show_notify_popup(BR_STRING_SAVED, 3,
465 m_data_manager->get_browser_view()->show_notify_popup(BR_STRING_SAVED, 3);
467 int added_bookmark_id = -1;
468 bookmark_db->get_bookmark_id_by_title_url(m_folder_id_to_save, title,
469 url, &added_bookmark_id);
470 BROWSER_LOGD("added_bookmark_id=%d", added_bookmark_id);
471 /* History view -> slide one item -> add to bookmark, then done. */
472 m_data_manager->get_bookmark_view()->return_to_bookmark_view(added_bookmark_id);
474 m_data_manager->get_browser_view()->show_notify_popup(BR_STRING_SAVED, 3, EINA_TRUE);
479 show_msg_popup(BR_STRING_ALREADY_EXISTS);
481 void Browser_Add_To_Bookmark_View::__naviframe_pop_finished_cb(void *data , Evas_Object *obj, void *event_info)
483 BROWSER_LOGD("[%s]", __func__);
487 Browser_Add_To_Bookmark_View *add_to_bookmark_view = (Browser_Add_To_Bookmark_View *)data;
488 Elm_Object_Item *it = (Elm_Object_Item *)event_info;
490 if (add_to_bookmark_view->m_navi_it != elm_naviframe_top_item_get(m_navi_bar))
493 m_data_manager->destroy_select_folder_view();
496 Eina_Bool Browser_Add_To_Bookmark_View::_create_main_layout(void)
498 BROWSER_LOGD("[%s]", __func__);
499 elm_win_conformant_set(m_win, EINA_TRUE);
500 m_conformant = elm_conformant_add(m_win);
502 BROWSER_LOGE("elm_conformant_add failed");
505 elm_object_style_set(m_conformant, "internal_layout");
506 evas_object_size_hint_weight_set(m_conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
507 evas_object_show(m_conformant);
509 m_genlist = _create_content_genlist();
511 BROWSER_LOGE("_create_content_genlist failed");
515 elm_object_content_set(m_conformant, m_genlist);
517 m_navi_it = elm_naviframe_item_push(m_navi_bar, BR_STRING_EDIT_BOOKMARK, NULL,
518 NULL, m_conformant, "browser_titlebar");
520 m_navi_it = elm_naviframe_item_push(m_navi_bar, BR_STRING_ADD_TO_BOOKMARKS, NULL,
521 NULL, m_conformant, "browser_titlebar");
523 elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_PREV_BTN, NULL);
525 evas_object_smart_callback_add(m_navi_bar, "transition,finished", __naviframe_pop_finished_cb, this);
527 m_title_cancel_button = elm_button_add(m_conformant);
528 if (!m_title_cancel_button) {
529 BROWSER_LOGE("elm_button_add failed!");
532 elm_object_style_set(m_title_cancel_button, "browser/title_button");
533 elm_object_text_set(m_title_cancel_button, BR_STRING_CANCEL);
534 evas_object_smart_callback_add(m_title_cancel_button, "clicked", __cancel_button_clicked_cb, this);
536 elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_TITLE_LEFT_BTN, m_title_cancel_button);
537 evas_object_show(m_title_cancel_button);
539 m_title_done_button = elm_button_add(m_conformant);
540 if (!m_title_done_button) {
541 BROWSER_LOGE("elm_button_add failed!");
544 elm_object_style_set(m_title_done_button, "browser/title_button");
545 elm_object_text_set(m_title_done_button, BR_STRING_DONE);
546 evas_object_smart_callback_add(m_title_done_button, "clicked", __done_button_clicked_cb, this);
548 elm_object_item_part_content_set(m_navi_it, ELM_NAVIFRAME_ITEM_TITLE_RIGHT_BTN, m_title_done_button);
549 evas_object_show(m_title_done_button);