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

📄 listedit.c

📁 ELinks is an advanced and well-established feature-rich text mode web (HTTP/FTP/..) browser. ELinks
💻 C
📖 第 1 页 / 共 5 页
字号:
			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;			}			/* everything except head */			if (l!=ld->list)x+=draw_bfu_element(term,dlg->x+DIALOG_LB,y,COLOR_MENU,0,0,BFU_ELEMENT_TEE,(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+DIALOG_LB+x,y,w-x,1,' ');			set_line_color(term,dlg->x+DIALOG_LB+x,y,w-x,COLOR_MENU);			mem_free(txt);		}		skip_old_1:;#ifdef G	}	else	{		unsigned char *txt;		struct rect old_area;		int n=0;		int x=0;		int b;		struct list *l;		unsigned char element=BFU_ELEMENT_PIPE;		long bg_color,fg_color;		bg_color=dip_get_color_sRGB(G_BFU_BG_COLOR);		fg_color=dip_get_color_sRGB(G_BFU_FG_COLOR);		/* current */		l=ld->current_pos;		txt=ld->type_item(term, l,1);		if (!txt)		{			txt=mem_alloc(sizeof(unsigned char));			*txt=0;		}		if (!ld->type)			element=BFU_ELEMENT_TEE;		else			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");			}		if (ld->type)		{			for (b=0;b<l->depth;b++)				x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,0,fg_color,bg_color,BFU_ELEMENT_PIPE,0);			if (l->depth>=0)/* everything except head */				x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,0,fg_color,bg_color,element,(l->type)&4);		}		else		{			if (l!=ld->list)/* everything except head */				x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,0,fg_color,bg_color,element,(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,bfu_style_wb,txt,0);		x+=g_text_width(bfu_style_wb,txt);		term->dev->drv->fill_area(term->dev,dlg->x+DIALOG_LB+x,y,dlg->x+DIALOG_LB+w,y+G_BFU_FONT_SIZE,fg_color);		term->dev->drv->set_clip_area(term->dev,&old_area);		mem_free(txt);				if (!direction) goto skip_old_2;		n=0;		x=0;		/* previous/next */		if (direction==1)l=next_in_tree(ld,ld->current_pos);		else l=prev_in_tree(ld,ld->current_pos);				if (!ld->type)			element=BFU_ELEMENT_TEE;		else			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");			}		txt=ld->type_item(term, l,1);		if (!txt)		{			txt=mem_alloc(sizeof(unsigned char));			*txt=0;		}		y+=direction*G_BFU_FONT_SIZE;		if (ld->type)		{			for (b=0;b<l->depth;b++)				x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,0,bg_color,fg_color,BFU_ELEMENT_PIPE,0);			if (l->depth>=0)/* everything except head */				x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,0,bg_color,fg_color,element,(l->type)&4);		}		else			if (l!=ld->list)/* everything except head */				x+=draw_bfu_element(term,dlg->x+DIALOG_LB+x,y,0,bg_color,fg_color,element,(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,bfu_style_bw,txt,0);		x+=g_text_width(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,bg_color);		term->dev->drv->set_clip_area(term->dev,&old_area);		mem_free(txt);		skip_old_2:;#endif	}}/* like redraw_list, but scrolls window, prints new line to top/bottom *//* in text mode calls redraw list *//* direction: -1=up, 1=down */void scroll_list(struct terminal *term, void *bla){#ifdef G	struct redraw_data *rd=(struct redraw_data *)bla;	struct list_description *ld=rd->ld;	struct dialog_data *dlg=rd->dlg;	int direction=rd->n;	struct rect_set *set;#endif		if (!F)	{		redraw_list(term, bla);#ifdef G	}	else	{		struct rect old_area;		struct graphics_device *dev=term->dev;		int w=dlg->xw-2*DIALOG_LB-sirka_scrollovadla;		int y=dlg->y+DIALOG_TB;		int top=0,bottom=0;				switch(direction)		{			case 1:  /* down */			top=G_BFU_FONT_SIZE;			break;			case -1:  /* up */			bottom=-G_BFU_FONT_SIZE;			break;			default:			internal("Wrong direction %d in function scroll_list.\n",direction);		}				restrict_clip_area(term->dev,&old_area,dlg->x+DIALOG_LB,y+top,dlg->x+DIALOG_LB+w,y+bottom+G_BFU_FONT_SIZE*(ld->n_items));		set=NULL;		drv->vscroll(dev,&set,top+bottom);		if (set)	/* redraw rectangles in the set - we cannot redraw particular rectangles, we are only able to redraw whole window */		{			redraw_list(term, bla);			mem_free(set);		}		drv->set_clip_area(term->dev,&old_area);		/* redraw scroll bar */		{			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	}}void list_find_next(struct redraw_data *rd, int direction){	struct list_description *ld=rd->ld;	struct dialog_data *dlg=rd->dlg;	struct session *ses=(struct session *)(dlg->dlg->udata);	struct list* item;	if (!ld->search_word) {msg_box(ses->term, NULL, TEXT(T_SEARCH), AL_CENTER, TEXT(T_NO_PREVIOUS_SEARCH), NULL, 1, TEXT(T_CANCEL), NULL, B_ENTER | B_ESC); return;}		if ((item=ld->find_item(ld->current_pos,ld->search_word,direction)))	{		struct list *l;		ld->current_pos=item;		ld->win_offset=item;		ld->win_pos=0;		if (ld->type)			for (l=item;l->depth>=0;l=l->fotr) 				if (l!=item) l->type|=2;		draw_to_window(dlg->win,redraw_list,rd);		if (!F) if (!ses->term->spec->block_cursor || ses->term->spec->braille) set_cursor(ses->term, dlg->x + DIALOG_LB, dlg->y+DIALOG_TB+ld->win_pos, dlg->x + DIALOG_LB, dlg->y+DIALOG_TB+ld->win_pos);	}	else 		msg_box(ses->term, NULL, TEXT(T_SEARCH), AL_CENTER, TEXT(T_SEARCH_STRING_NOT_FOUND), NULL, 1, TEXT(T_CANCEL), NULL, B_ENTER | B_ESC);	}void list_search_for_back(struct redraw_data *rd, unsigned char *str){	struct list_description *ld=rd->ld;		if (!*str) return;	if (!ld->open) return;	if (ld->search_word) mem_free(ld->search_word);	ld->search_word = to_utf8_upcase(str, rd->dlg->win->term->spec->charset);	ld->search_direction = -1;	list_find_next(rd, ld->search_direction);}void list_search_for(struct redraw_data *rd, unsigned char *str){	struct list_description *ld=rd->ld;		if (!*str) return;	if (!ld->open) return;	if (ld->search_word) mem_free(ld->search_word);	ld->search_word = to_utf8_upcase(str, rd->dlg->win->term->spec->charset);	ld->search_direction = 1;	list_find_next(rd, ld->search_direction);}int list_event_handler(struct dialog_data *dlg, struct event *ev){	struct list_description *ld=(struct list_description*)(dlg->dlg->udata2);	static struct redraw_data rd;	struct session *ses=(struct session *)(dlg->dlg->udata);	rd.ld=ld;	rd.dlg=dlg;	switch ((int)ev->ev)	{		case EV_KBD:		if (ld->type==1)  /* tree list */		{			if (ev->x==' ')  /* toggle folder */			{				if (!((ld->current_pos->type)&1))return EVENT_PROCESSED;  /* item */				ld->current_pos->type^=2;				if (!(ld->current_pos->type&2))unselect_in_folder(ld, ld->current_pos);				rd.n=0;				draw_to_window(dlg->win,redraw_list,&rd);				return EVENT_PROCESSED;			}			if (ev->x=='+'||ev->x=='=')  /* open folder */			{				if (!((ld->current_pos->type)&1))return EVENT_PROCESSED;  /* item */				if ((ld->current_pos->type)&2)return EVENT_PROCESSED; /* already open */				ld->current_pos->type|=2;				rd.n=0;				draw_to_window(dlg->win,redraw_list,&rd);				return EVENT_PROCESSED;			}			if (ev->x=='-')  /* close folder */			{				if (!((ld->current_pos->type)&1))return EVENT_PROCESSED;  /* item */				if (!((ld->current_pos->type)&2))return EVENT_PROCESSED; /* already closed */				ld->current_pos->type&=~2;				unselect_in_folder(ld,ld->current_pos);				rd.n=0;				draw_to_window(dlg->win,redraw_list,&rd);				return EVENT_PROCESSED;			}		}		if (ev->x=='/') /* search forward */		{			struct redraw_data *r;			r=mem_alloc(sizeof(struct redraw_data));			r->ld=ld;			r->dlg=dlg;			input_field(ses->term, getml(r,NULL), TEXT(T_SEARCH), TEXT(T_SEARCH_FOR_TEXT), r, ld->search_history, MAX_INPUT_URL_LEN, "", 0, 0, NULL, TEXT(T_OK), (void (*)(void *, unsigned char *)) list_search_for, TEXT(T_CANCEL), NULL, NULL);			return EVENT_PROCESSED;		}		if (ev->x=='?') /* search back */		{			struct redraw_data *r;			r=mem_alloc(sizeof(struct redraw_data));			r->ld=ld;			r->dlg=dlg;			input_field(ses->term, getml(r,NULL), TEXT(T_SEARCH_BACK), TEXT(T_SEARCH_FOR_TEXT), r, ld->search_history, MAX_INPUT_URL_LEN, "", 0, 0, NULL, TEXT(T_OK), (void (*)(void *, unsigned char *)) list_search_for_back, TEXT(T_CANCEL), NULL, NULL);			return EVENT_PROCESSED;		}		if (ev->x=='n') /* find next */		{						list_find_next(&rd, ld->search_direction);			return EVENT_PROCESSED;		}		if (ev->x=='N') /* find prev */		{			list_find_next(&rd, - ld->search_direction);			return EVENT_PROCESSED;		}		if (ev->x==KBD_UP)		{			if (ld->current_pos==ld->list)return EVENT_PROCESSED;  /* already on the top */			ld->current_pos=prev_in_tree(ld,ld->current_pos);			ld->win_pos--;			rd.n=+1;			if (ld->win_pos<0)  /* scroll up */			{				ld->win_pos=0;				ld->win_offset=prev_in_tree(ld,ld->win_offset);				draw_to_window(dlg->win,scroll_list,&rd);			}			draw_to_window(dlg->win,redraw_list_line,&rd);			return EVENT_PROCESSED;		}		if (ev->x=='i'||ev->x=='*'||ev->x=='8'||ev->x==KBD_INS)		{			if (ld->current_pos!=ld->list)ld->current_pos->type^=4;			rd.n=-1;			if (next_in_tree(ld,ld->current_pos)==ld->list) /* already at the bottom */			{				draw_to_window(dlg->win,redraw_list_line,&rd);				return EVENT_PROCESSED;			}			ld->current_pos=next_in_tree(ld,ld->current_pos);			ld->win_pos++;			if (ld->win_pos>ld->n_items-1)  /* scroll down */			{				ld->win_pos=ld->n_items-1;				ld->win_offset=next_in_tree(ld,ld->win_offset);				draw_to_window(dlg->win,scroll_list,&rd);			}			draw_to_window(dlg->win,redraw_list_line,&rd);			return EVENT_PROCESSED;		}		if (ev->x==KBD_DOWN)		{			if (next_in_tree(ld,ld->current_pos)==ld->list)return EVENT_PROCESSED;  /* already at the bottom */			ld->current_pos=next_in_tree(ld,ld->current_pos);			ld->win_pos++;			rd.n=-1;			if (ld->win_pos>ld->n_items-1)  /* scroll down */			{				ld->win_pos=ld->n_items-1;				ld->win_offset=next_in_tree(ld,ld->win_offset);				draw_to_window(dlg->win,scroll_list,&rd);			}			draw_to_window(dlg->win,redraw_list_line,&rd);			return EVENT_PROCESSED;		}		if (ev->x==KBD_HOME || (upcase(ev->x) == 'A' && ev->y & KBD_CTRL))		{			if (ld->current_pos==ld->list)return EVENT_PROCESSED;  /* already on the top */			ld->win_offset=ld->list;			ld->current_pos=ld->win_offset;			ld->win_pos=0;			rd.n=0;			draw_to_window(dlg->win,redraw_list,&rd);			draw_to_window(dlg->win,redraw_list_line,&rd);			return EVENT_PROCESSED;		}		if (ev->x==KBD_END || (upcase(ev->x) == 'E' && ev->y & KBD_CTRL))		{			int a;			if (ld->current_pos==prev_in_tree(ld,ld->list))return EVENT_PROCESSED;  /* already on the top */			ld->win_offset=prev_in_tree(ld,ld->list);			for (a=1;a<ld->n_items&&ld->win_offset!=ld->list;a++)				ld->win_offset=prev_in_tree(ld,ld->win_offset);			ld->current_pos=prev_in_tree(ld,ld->list);			ld->win_pos=a-1;			rd.n=0;			draw_to_window(dlg->win,redraw_list,&rd);			draw_to_window(dlg->win,redraw_list_line,&rd);			return EVENT_PROCESSED;		}		if (ev->x==KBD_PAGE_UP || (upcase(ev->x) == 'B' && ev->y & KBD_CTRL))		{			int a;			if (ld->current_pos==ld->list)return EVENT_PROCESSED;  /* already on the top */			for (a=0;a<ld->n_items&&ld->win_offset!=ld->list;a++)			{				ld->win_offset=prev_in_tree(ld,ld->win_offset);				ld->current_pos=prev_in_tree(ld,ld->current_pos);			}			if (a<ld->n_items){ld->current_pos=ld->win_offset;ld->win_pos=0;}			rd.n=0;

⌨️ 快捷键说明

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