dialogs.c
来自「一个很有名的浏览器」· C语言 代码 · 共 692 行 · 第 1/2 页
C
692 行
}/* Traverse all bookmarks and move all marked items * _into_ destb or, if destb is NULL, _after_ dest. */static voiddo_move_bookmark(struct bookmark *dest, struct list_head *destb, struct list_head *desti, struct list_head *src, struct listbox_data *box){ static int move_bookmark_event_id = EVENT_NONE; struct bookmark *bm, *next; assert((destb && desti) || (!destb && !desti)); set_event_id(move_bookmark_event_id, "bookmark-move"); foreachsafe (bm, next, *src) { if (bm != dest /* prevent moving a folder into itself */ && bm->box_item->marked && bm != move_cache_root_avoid) { bm->box_item->marked = 0; trigger_event(move_bookmark_event_id, bm, destb ? (struct bookmark *) destb : dest); if (box->top == bm->box_item) { /* It's theoretically impossible that bm->next * would be invalid (point to list_head), as it * would be case only when there would be only * one item in the list, and then bm != dest * will save us already. */ box->top = bm->box_item->next; } del_from_list(bm->box_item); del_from_list(bm); add_at_pos(destb ? (struct bookmark *) destb : dest, bm); add_at_pos(desti ? (struct listbox_item *) desti : dest->box_item, bm->box_item); bm->root = destb ? dest : dest->root; bm->box_item->depth = bm->root ? bm->root->box_item->depth + 1 : 0; if (bm->box_item->type == BI_FOLDER) update_depths(bm->box_item); dest = bm; desti = destb = NULL; /* We don't want to care about anything marked inside * of the marked folder, let's move it as a whole * directly. I believe that this is more intuitive. * --pasky */ continue; } if (bm->box_item->type == BI_FOLDER) { do_move_bookmark(dest, destb, desti, &bm->child, box); } }}static t_handler_event_statuspush_move_button(struct dialog_data *dlg_data, struct widget_data *blah){ struct listbox_data *box = get_dlg_listbox_data(dlg_data); struct bookmark *dest = NULL; struct list_head *destb = NULL, *desti = NULL; struct widget_data *widget_data = dlg_data->widgets_data; if (!box->sel) return EVENT_PROCESSED; /* nowhere to move to */ dest = box->sel->udata; if (box->sel->type == BI_FOLDER && box->sel->expanded) { destb = &((struct bookmark *) box->sel->udata)->child; desti = &box->sel->child; } /* Avoid recursion headaches (prevents moving a folder into itself). */ move_cache_root_avoid = NULL; { struct bookmark *bm = dest->root; while (bm) { if (bm->box_item->marked) move_cache_root_avoid = bm; bm = bm->root; } } do_move_bookmark(dest, destb, desti, &bookmarks, box); bookmarks_set_dirty();#ifdef BOOKMARKS_RESAVE write_bookmarks();#endif display_widget(dlg_data, widget_data); return EVENT_PROCESSED;}/**** MANAGEMENT *****************************************************/#define BOOKMARK_MANAGER_BUTTONS 8static struct hierbox_browser_button bookmark_buttons[] = { { N_("~Goto"), push_hierbox_goto_button, 1 }, { N_("~Edit"), push_edit_button, 0 }, { N_("~Delete"), push_hierbox_delete_button, 0 }, { N_("~Add"), push_add_button, 0 }, { N_("Add se~parator"), push_add_separator_button, 0 }, { N_("Add ~folder"), push_add_folder_button, 0 }, { N_("~Move"), push_move_button, 0 }, { N_("~Search"), push_search_button, 1 },#if 0 /* This one is too dangerous, so just let user delete * the bookmarks file if needed. --Zas */ { N_("Clear"), push_hierbox_clear_button, 0 }, /* TODO: Would this be useful? --jonas */ { N_("Save"), push_save_button },#endif};struct_hierbox_browser( bookmark_browser, N_("Bookmark manager"), bookmark_buttons, &bookmarks_listbox_ops);/* Builds the "Bookmark manager" dialog */voidbookmark_manager(struct session *ses){ /* Reset momorized search criterias */ mem_free_set(&bm_last_searched_name, NULL); mem_free_set(&bm_last_searched_url, NULL); bookmark_browser.expansion_callback = bookmarks_set_dirty; hierbox_browser(&bookmark_browser, ses);}/****************************************************************************\ Bookmark add dialog.\****************************************************************************//* Adds the bookmark */static voidbookmark_add_add(void *data){ struct dialog *dlg = data; struct widget_data *widget_data = NULL; /* silence stupid gcc */ struct listbox_data *box = NULL; struct bookmark *bm = NULL; struct bookmark *selected = NULL; if (dlg->udata) { struct dialog_data *dlg_data = (struct dialog_data *) dlg->udata; widget_data = dlg_data->widgets_data; box = get_dlg_listbox_data(dlg_data); if (box->sel) { selected = box->sel->udata; if (box->sel->type == BI_FOLDER) { bm = selected; } else { bm = selected->root; } } } bm = add_bookmark(bm, 1, dlg->widgets[0].data, dlg->widgets[1].data); if (!bm) return; move_bookmark_after_selected(bm, selected);#ifdef BOOKMARKS_RESAVE write_bookmarks();#endif if (dlg->udata) { /* We touch only the actual bookmark dialog, not all of them; * that's right, right? ;-) --pasky */ focus_bookmark(widget_data, box, bm); }}/* Searchs a substring either in title or url fields (ignoring * case). If search_title and search_url are not empty, it selects bookmarks * matching the first OR the second. * * Perhaps another behavior could be to search bookmarks matching both * (replacing OR by AND), but it would break a cool feature: when on a page, * opening search dialog will have fields corresponding to that page, so * pressing ok will find any bookmark with that title or url, permitting a * rapid search of an already existing bookmark. --Zas */struct bookmark_search_ctx { unsigned char *search_url; unsigned char *search_title; int found; int ofs;};#define NULL_BOOKMARK_SEARCH_CTX {NULL, NULL, 0, 0}static inttest_search(struct listbox_item *item, void *data_, int *offset) { struct bookmark_search_ctx *ctx = data_; struct bookmark *bm = item->udata; int m = ((ctx->search_title && *ctx->search_title && strcasestr(bm->title, ctx->search_title)) || (ctx->search_url && *ctx->search_url && strcasestr(bm->url, ctx->search_url))); if (!ctx->ofs) m = 0; /* ignore possible match on first item */ ctx->found = m; ctx->ofs++; if (m) *offset = 0; return 0;}/* Search bookmarks */static voidbookmark_search_do(void *data){ struct dialog *dlg = data; unsigned char *search_title = dlg->widgets[0].data; unsigned char *search_url = dlg->widgets[1].data; struct bookmark_search_ctx ctx = NULL_BOOKMARK_SEARCH_CTX; struct widget_data *widget_data = NULL; struct listbox_data *box = NULL; struct dialog_data *dlg_data; if (!search_title || !search_url) return; assertm(dlg->udata, "Bookmark search with NULL udata in dialog"); if_assert_failed return; dlg_data = (struct dialog_data *) dlg->udata; widget_data = dlg_data->widgets_data; box = get_dlg_listbox_data(dlg_data); /* Memorize last searched title */ mem_free_set(&bm_last_searched_name, stracpy(search_title)); if (!bm_last_searched_name) return; /* Memorize last searched url */ mem_free_set(&bm_last_searched_url, stracpy(search_url)); if (!bm_last_searched_url) { mem_free(bm_last_searched_name); return; } ctx.search_url = search_url; ctx.search_title = search_title; traverse_listbox_items_list(box->sel, box, 0, 0, test_search, &ctx); if (!ctx.found) return; listbox_sel_move(widget_data, ctx.ofs - 1);}/* launch_bm_search_doc_dialog() */static voidlaunch_bm_search_doc_dialog(struct terminal *term, struct dialog_data *parent, struct session *ses){ do_edit_dialog(term, 1, N_("Search bookmarks"), bm_last_searched_name, bm_last_searched_url, ses, parent, bookmark_search_do, NULL, NULL, EDIT_DLG_SEARCH);}voidlaunch_bm_add_dialog(struct terminal *term, struct dialog_data *parent, struct session *ses, unsigned char *title, unsigned char *url){ do_edit_dialog(term, 1, N_("Add bookmark"), title, url, ses, parent, bookmark_add_add, NULL, NULL, EDIT_DLG_ADD);}voidlaunch_bm_add_doc_dialog(struct terminal *term, struct dialog_data *parent, struct session *ses){ launch_bm_add_dialog(term, parent, ses, NULL, NULL);}voidlaunch_bm_add_link_dialog(struct terminal *term, struct dialog_data *parent, struct session *ses){ unsigned char title[MAX_STR_LEN], url[MAX_STR_LEN]; launch_bm_add_dialog(term, parent, ses, get_current_link_name(ses, title, MAX_STR_LEN), get_current_link_url(ses, url, MAX_STR_LEN));}voidbookmark_terminal_tabs_dialog(struct terminal *term){ struct string string; if (!init_string(&string)) return; add_to_string(&string, _("Saved session", term));#ifdef HAVE_STRFTIME add_to_string(&string, " - "); add_date_to_string(&string, get_opt_str("ui.date_format"), NULL);#endif input_dialog(term, NULL, N_("Bookmark tabs"), N_("Enter folder name"), term, NULL, MAX_STR_LEN, string.source, 0, 0, NULL, (void (*)(void *, unsigned char *)) bookmark_terminal_tabs, NULL); done_string(&string);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?