⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listedit.c

📁 ELinks is an advanced and well-established feature-rich text mode web (HTTP/FTP/..) browser. ELinks
💻 C
📖 第 1 页 / 共 5 页
字号:
	for (i=item->next,depth=item->depth;i!=ld->list&&i->depth>depth;)	{		j=i;		i=i->next;		ld->delete_item(j);	}			/* strong premise: we can't delete head of the list */	if (ld->current_pos->next!=ld->list) {		if (ld->current_pos == ld->win_offset) ld->win_offset = ld->current_pos->next;		ld->current_pos=ld->current_pos->next;	}	else  /* last item */	{		if (!(ld->win_pos))  /* only one line on the screen */			ld->win_offset=prev_in_tree(ld,ld->win_offset);		else ld->win_pos--;		ld->current_pos=prev_in_tree(ld,ld->current_pos);	}	ld->delete_item(item);	rd.ld=ld;	rd.dlg=dlg;	rd.n=0;		ld->modified=1;	draw_to_window(dlg->win,redraw_list,&rd);}/* tests if directory is emty */int is_empty_dir(struct list_description *ld, struct list *dir){	if (!(ld->type))return 1;  /* flat list */	if (!((dir->type)&1))return 1;   /* not a directory */	return (((struct list *)(dir->next))->depth<=dir->depth);  /* head depth is -1 */}/* delete dialog */int list_item_delete(struct dialog_data *dlg,struct dialog_item_data *useless){	struct terminal *term=dlg->win->term;	struct list_description *ld=(struct list_description*)(dlg->dlg->udata2);	struct list *item=ld->current_pos;	/*struct session *ses=(struct session *)(dlg->dlg->udata);*/	unsigned char *txt;	struct ve_skodarne_je_jeste_vetsi_narez *narez;	useless=useless;	if (item==(ld->list)||list_empty(*item))return 0;  /* head or empty list */		narez=mem_alloc(sizeof(struct ve_skodarne_je_jeste_vetsi_narez));	narez->ld=ld;narez->item=item;narez->dlg=dlg;	txt=ld->type_item(term, item,0);	if (!txt)	{		txt=mem_alloc(sizeof(unsigned char));		*txt=0;	}	if ((item->type)&1)   /* folder */	{		if (!is_empty_dir(ld,item))			msg_box(				term,   /* terminal */				getml(txt,narez,NULL),  /* blocks to free */				TEXT(T_DELETE_FOLDER),  /* title */				AL_CENTER|AL_EXTD_TEXT,  /* alignment */				TEXT(T_FOLDER)," \"",txt,"\" ",TEXT(T_NOT_EMPTY_SURE_DELETE),NULL,  /* text */				narez,  /* data for ld->delete_item */				2,  /* # of buttons */				TEXT(T_NO),NULL,B_ESC,  /* button1 */				TEXT(T_YES),delete_folder_recursively,B_ENTER  /* button2 */			);		else			msg_box(				term,   /* terminal */				getml(txt,narez,NULL),  /* blocks to free */				TEXT(T_DELETE_FOLDER),  /* title */				AL_CENTER|AL_EXTD_TEXT,  /* alignment */				TEXT(T_SURE_DELETE)," ",TEXT(T_fOLDER)," \"",txt,"\"?",NULL,  /* null-terminated text */				narez,  /* data for ld->delete_item */				2,  /* # of buttons */				TEXT(T_YES),delete_ok,B_ENTER,  /* button1 */				TEXT(T_NO),NULL,B_ESC  /* button2 */			);	}	else   /* item */		msg_box(			term,   /* terminal */			getml(txt,narez,NULL),  /* blocks to free */			TEXT(ld->delete_dialog_title),  /* title */			AL_CENTER|AL_EXTD_TEXT,  /* alignment */			TEXT(T_SURE_DELETE)," ",TEXT(ld->item_description)," \"",txt,"\"?",NULL,  /* null-terminated text */			narez,  /* data for ld->delete_item */			2,  /* # of buttons */			TEXT(T_YES),delete_ok,B_ENTER,  /* button1 */			TEXT(T_NO),NULL,B_ESC  /* button2 */		);	return 0;}/* redraws list */void redraw_list(struct terminal *term, void *bla){	struct redraw_data* rd=(struct redraw_data *)bla;	struct list_description *ld=rd->ld;	struct dialog_data *dlg=rd->dlg;	/*struct session *ses=(struct session*)(dlg->dlg->udata);*/	int y,a;	struct list *l;	int w=dlg->xw-2*DIALOG_LB-(F?sirka_scrollovadla:0);	y=dlg->y+DIALOG_TB;#ifdef G	if (F)	{		int total=get_total_items(ld);		int visible=get_visible_items(ld);		int pos=get_scroll_pos(ld);		struct rect old_area;		restrict_clip_area(term->dev,&old_area,dlg->x+w+DIALOG_LB+G_SCROLL_BAR_WIDTH,y,dlg->x+DIALOG_LB+w+sirka_scrollovadla,y+G_BFU_FONT_SIZE*ld->n_items);		term->dev->drv->set_clip_area(term->dev,&old_area);		draw_vscroll_bar(term->dev,dlg->x+DIALOG_LB+w+G_SCROLL_BAR_WIDTH,y,G_BFU_FONT_SIZE*ld->n_items,total,visible,pos);		if (dlg->s)exclude_from_set(&(dlg->s),dlg->x+DIALOG_LB+w+G_SCROLL_BAR_WIDTH,y,dlg->x+DIALOG_LB+w+sirka_scrollovadla,y+G_BFU_FONT_SIZE*ld->n_items);	}#endif	switch (ld->type)	{		case 0:  /* flat */		for (a=0,l=ld->win_offset;a<ld->n_items;)		{			unsigned char *txt;			int x=0;						txt=ld->type_item(term, l,1);			if (!txt)			{				txt=mem_alloc(sizeof(unsigned char));				*txt=0;			}			/* everything except head */			if (!F)			{				unsigned color=(l==ld->current_pos)?COLOR_MENU_SELECTED:COLOR_MENU;								if (l!=ld->list)x+=draw_bfu_element(term,dlg->x+DIALOG_LB,y,color,0,0,BFU_ELEMENT_TEE,(l->type)&4);				print_text(term,dlg->x+x+DIALOG_LB,y,w-x,txt,color);				x+=strlen(txt);				fill_area(term,dlg->x+DIALOG_LB+x,y,w-x,1,' ');				set_line_color(term,dlg->x+DIALOG_LB+x,y,w-x,color);			}#ifdef G			else			{				struct rect old_area;				long bgcolor=(l==ld->current_pos)?G_BFU_FG_COLOR:G_BFU_BG_COLOR;				long fgcolor=(l==ld->current_pos)?G_BFU_BG_COLOR:G_BFU_FG_COLOR;				struct style* stl=(l==ld->current_pos)?bfu_style_wb:bfu_style_bw;				bgcolor=dip_get_color_sRGB(bgcolor);				fgcolor=dip_get_color_sRGB(fgcolor);				if (l!=ld->list)x+=draw_bfu_element(term,dlg->x+DIALOG_LB,y,0,bgcolor,fgcolor,BFU_ELEMENT_TEE,(l->type)&4);				restrict_clip_area(term->dev,&old_area,dlg->x+x+DIALOG_LB,y,dlg->x+DIALOG_LB+w,y+G_BFU_FONT_SIZE);				g_print_text(term->dev->drv,term->dev,dlg->x+x+DIALOG_LB,y,stl,txt,0);				x+=g_text_width(stl,txt);				term->dev->drv->fill_area(term->dev,dlg->x+DIALOG_LB+x,y,dlg->x+DIALOG_LB+w,y+G_BFU_FONT_SIZE,bgcolor);				term->dev->drv->set_clip_area(term->dev,&old_area);				if (dlg->s)exclude_from_set(&(dlg->s),dlg->x+DIALOG_LB,y,dlg->x+DIALOG_LB+w,y+G_BFU_FONT_SIZE);			}#endif			mem_free(txt);			l=l->next;			a++;			y+=gf_val(1,G_BFU_FONT_SIZE);			if (l==ld->list) break;		}		if (!F) fill_area(term,dlg->x+DIALOG_LB,y,w,ld->n_items-a,' '|COLOR_MENU);#ifdef G		else		{			term->dev->drv->fill_area(term->dev,dlg->x+DIALOG_LB,y,dlg->x+DIALOG_LB+w,dlg->y+DIALOG_TB+(ld->n_items)*G_BFU_FONT_SIZE,dip_get_color_sRGB(G_BFU_BG_COLOR));		}#endif		break;				case 1:   /* tree */		for (a=0,l=ld->win_offset;a<ld->n_items;)		{			unsigned char *txt;			int b;			int x=0;			unsigned color=0;			long fgcolor=0;			long bgcolor=0;			int element=0;			if (!F){				color=(l==ld->current_pos)?COLOR_MENU_SELECTED:COLOR_MENU;#ifdef G			}else{				bgcolor=(l==ld->current_pos)?G_BFU_FG_COLOR:G_BFU_BG_COLOR;				fgcolor=(l==ld->current_pos)?G_BFU_BG_COLOR:G_BFU_FG_COLOR;				bgcolor=dip_get_color_sRGB(bgcolor);				fgcolor=dip_get_color_sRGB(fgcolor);#endif			};						txt=ld->type_item(term,l,1);			if (!txt)			{				txt=mem_alloc(sizeof(unsigned char));				*txt=0;			}			for (b=0;b<l->depth;b++)				x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,color,bgcolor,fgcolor,BFU_ELEMENT_PIPE,0);			if (l->depth>=0)  /* everything except head */			{				switch((l->type)&1)				{					case 0:  /* item */					element=BFU_ELEMENT_TEE;					break;						case 1:  /* directory */					element=((l->type)&2)?BFU_ELEMENT_OPEN:BFU_ELEMENT_CLOSED;					break;						default:  /* this should never happen */					internal("=8-Q  lunacy level too high! Call "BOHNICE".\n");				}				x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,color,bgcolor,fgcolor,element,(l->type)&4);			}			if (!F)			{				print_text(term,dlg->x+x+DIALOG_LB,y,w-x,txt,color);				x+=strlen(txt);				fill_area(term,dlg->x+x+DIALOG_LB,y,w-x,1,' ');				set_line_color(term,dlg->x+x+DIALOG_LB,y,w-x,color);			}#ifdef G			else			{				struct rect old_area;				restrict_clip_area(term->dev,&old_area,dlg->x+x+DIALOG_LB,y,dlg->x+DIALOG_LB+w,y+G_BFU_FONT_SIZE);				g_print_text(term->dev->drv,term->dev,dlg->x+x+DIALOG_LB,y,(l==ld->current_pos)?bfu_style_wb:bfu_style_bw,txt,0);				x+=g_text_width((l==ld->current_pos)?bfu_style_wb:bfu_style_bw,txt);				term->dev->drv->fill_area(term->dev,dlg->x+DIALOG_LB+x,y,dlg->x+DIALOG_LB+w,y+G_BFU_FONT_SIZE,bgcolor);				term->dev->drv->set_clip_area(term->dev,&old_area);				if (dlg->s)exclude_from_set(&(dlg->s),dlg->x+DIALOG_LB,y,dlg->x+DIALOG_LB+w,y+G_BFU_FONT_SIZE);			}#endif			mem_free(txt);			l=next_in_tree(ld,l);			a++;			y+=gf_val(1,G_BFU_FONT_SIZE);			if (l==ld->list) break;		}		if (!F) fill_area(term,dlg->x+DIALOG_LB,y,w,ld->n_items-a,' '|COLOR_MENU);#ifdef G		else		{			term->dev->drv->fill_area(term->dev,dlg->x+DIALOG_LB,y,dlg->x+DIALOG_LB+w,dlg->y+DIALOG_TB+(ld->n_items)*G_BFU_FONT_SIZE,dip_get_color_sRGB(G_BFU_BG_COLOR));		}#endif		break;				default:		internal(			"Invalid list description type.\n"			"Somebody's probably shooting into memory.\n"			"_______________\n"			"`--|_____|--|___ `\\\n"			"             \"  \\___\\\n");				break;	}}/* moves cursor from old position to a new one *//* direction: -1=old is previous, +1=old is next */void redraw_list_line(struct terminal *term, void *bla){	struct redraw_data *rd=(struct redraw_data *)bla;	struct list_description *ld=rd->ld;	struct dialog_data *dlg=rd->dlg;	/*struct session *ses=(struct session *)(dlg->dlg->udata);*/	int direction=rd->n;	int w=dlg->xw-2*DIALOG_LB-(F?sirka_scrollovadla:0);	int y=dlg->y+DIALOG_TB+gf_val(ld->win_pos,ld->win_pos*G_BFU_FONT_SIZE);		if (!F)	{		/* novou radku musim prekreslit celou, protoze ji BFU mohlo oznacit a mohla to byt posledni radka v seznamu */		set_line_color(term,dlg->x+DIALOG_LB,y,w,COLOR_MENU_SELECTED);		if (ld->type)	/* tree */		{			unsigned char *txt;			int b;			int x=0;			int element=0;			struct list*l=ld->current_pos;			txt=ld->type_item(term, l,1);			if (!txt)			{				txt=mem_alloc(sizeof(unsigned char));				*txt=0;			}			if (!term->spec->block_cursor || term->spec->braille) set_cursor(term, dlg->x + DIALOG_LB + x, y, dlg->x + DIALOG_LB + x, y);			for (b=0;b<l->depth;b++)				x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,COLOR_MENU_SELECTED,0,0,BFU_ELEMENT_PIPE,0);			if (l->depth>=0)  /* everything except head */			{				switch((l->type)&1)				{					case 0:  /* item */					element=BFU_ELEMENT_TEE;					break;						case 1:  /* directory */					element=((l->type)&2)?BFU_ELEMENT_OPEN:BFU_ELEMENT_CLOSED;					break;						default:  /* this should never happen */					internal("=8-Q  lunacy level too high! Call "BOHNICE".\n");				}				x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,COLOR_MENU_SELECTED,0,0,element,(l->type)&4);			}			print_text(term,dlg->x+x+DIALOG_LB,y,w-x,txt,COLOR_MENU_SELECTED);			x+=strlen(txt);			fill_area(term,dlg->x+x+DIALOG_LB,y,w-x,1,' ');			set_line_color(term,dlg->x+x+DIALOG_LB,y,w-x,COLOR_MENU_SELECTED);			mem_free(txt);		}		else	/* flat */		{			unsigned char *txt;			int x=0;			struct list *l=ld->current_pos;						txt=ld->type_item(term, l,1);			if (!txt)			{				txt=mem_alloc(sizeof(unsigned char));				*txt=0;			}			if (!term->spec->block_cursor || term->spec->braille) set_cursor(term, dlg->x + DIALOG_LB + x, y, dlg->x + DIALOG_LB + x, y);			/* everything except head */			if (l!=ld->list)x+=draw_bfu_element(term,dlg->x+DIALOG_LB,y,COLOR_MENU_SELECTED,0,0,BFU_ELEMENT_TEE,(l->type)&4);			print_text(term,dlg->x+x+DIALOG_LB,y,w-x,txt,COLOR_MENU_SELECTED);			x+=strlen(txt);			fill_area(term,dlg->x+DIALOG_LB+x,y,w-x,1,' ');			set_line_color(term,dlg->x+DIALOG_LB+x,y,w-x,COLOR_MENU_SELECTED);			mem_free(txt);		}		/* starou radku musim prekreslit celou, protoze ji BFU mohlo oznacit */		if (!direction) goto skip_old_1;		if (ld->type)	/* tree */		{			unsigned char *txt;			int b;			int x=0;			int element=0;			struct list*l;			y+=direction;			if (direction==1)l=next_in_tree(ld,ld->current_pos);			else l=prev_in_tree(ld,ld->current_pos);						txt=ld->type_item(term, l,1);			if (!txt)			{				txt=mem_alloc(sizeof(unsigned char));				*txt=0;			}			for (b=0;b<l->depth;b++)				x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,COLOR_MENU,0,0,BFU_ELEMENT_PIPE,0);			if (l->depth>=0)  /* everything except head */			{				switch((l->type)&1)				{					case 0:  /* item */					element=BFU_ELEMENT_TEE;					break;						case 1:  /* directory */					element=((l->type)&2)?BFU_ELEMENT_OPEN:BFU_ELEMENT_CLOSED;					break;						default:  /* this should never happen */					internal("=8-Q  lunacy level too high! Call "BOHNICE".\n");				}				x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,COLOR_MENU,0,0,element,(l->type)&4);			}			print_text(term,dlg->x+x+DIALOG_LB,y,w-x,txt,COLOR_MENU);			x+=strlen(txt);			fill_area(term,dlg->x+x+DIALOG_LB,y,w-x,1,' ');			set_line_color(term,dlg->x+x+DIALOG_LB,y,w-x,COLOR_MENU);			mem_free(txt);		}		else	/* flat */		{			unsigned char *txt;			int x=0;			struct list *l;						y+=direction;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -