📄 listedit.c
字号:
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 + -