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 + -
显示快捷键?