#include #include "strlite.c" #include "devices.h" #include "event.h" #include "bmouse.h" #include "bgraph.h" #include "gui.h" #include "strlists.h" TSTR_LIST read_directory(const char *mask,int view_type,int attrs) { TSTR_LIST flist = create_list(256); return flist; } void name_conv(char *c) { char *a,*b; a=c;b=c; while (*a) if (*a==32) a++; else *b++=*a++; *b--='\0'; if (*b=='.') *b='\0'; } typedef struct string_list_data { TSTR_LIST list; int topline,maxitems,maxview; int selcolor,skipshow; int obj_win; } STRING_LIST_DATA; void string_list_init(OBJREC *o,va_list params) { STRING_LIST_DATA *p; p=(STRING_LIST_DATA *)getmem(sizeof(STRING_LIST_DATA)); p->topline=0; p->list=va_arg(params,TSTR_LIST); p->selcolor=va_arg(params, int); p->skipshow=va_arg(params, int); o->userptr=p; p->obj_win=waktual->id; } void string_list_change(void) { OBJREC *o1,*o2; STRING_LIST_DATA *p; o2=o_aktual; o1=find_object(waktual,o2->id-1); if (o1==NULL) return; p=o1->userptr; p->topline=f_get_value(0,o2->id); redraw_object(o1); } static int get_to_topline(TSTR_LIST ls,int line,int *retu) { int cnt; int ret,i,cn; cnt=str_count(ls);ret=0;cn=0; for(i=0;i=0) ret=i; if (ls[i]!=NULL) line--,cn++; } if (retu!=NULL) *retu=cn; return ret; } static int set_line_back(TSTR_LIST ls,int line) { int i,c=-1,c1=str_count(ls); if (line>=c1) line=c1-1; for (i=0;i<=line;i++) if (ls[i]!=NULL) c++; return c; } void string_list_draw(int x1,int y1,int x2,int y2,OBJREC *o) { STRING_LIST_DATA *p; int y; char savech[]=" "; int znh,i,j,max = 1; TSTR_LIST ls; int savcolor=curcolor; p=o->userptr; ls=p->list; bar32(x1,y1,x2,y2); y=y1;p->maxitems=str_count(ls); for(j=p->maxitems-1;j>=0;j--) if (ls[j]!=NULL) break; j++; if (ls) { do { i=get_to_topline(ls,p->topline,&max); p->maxview=0; y=y1; do { char *c; int x,j; c=ls[i]; if (c!=NULL && y+(znh=text_height(c))skipshow; while (j-- && *c) c++; if (i==*(int *)(o->data)) { curcolor=p->selcolor; bar32(x1,y,x2,y+znh-1); } position(x1,y); for(j=0,x=x1,savech[0]=c[j]; c[j]!='\0' && x+text_width(savech)maxview++; } else znh=0; i++; } while (y+znhmaxitems); if (p->topline && y+2*znhtopline-=(dif*2/3)/znh+1; curcolor=savcolor; bar32(x1,y1,x2,y2); } } while (p->topline && y+2*znhid==p->obj_win) { OBJREC *ob; ob=find_object(waktual,o->id+1); if (ob!=NULL) { send_message(E_GUI,o->id+1,E_CONTROL,0,max-p->maxview,p->maxview); ob->on_change=string_list_change; } c_set_value(p->obj_win,o->id+1,p->topline); } } void string_list_event(EVENT_MSG *msg,OBJREC *o) { STRING_LIST_DATA *p; int y; int znh,i; TSTR_LIST ls; MS_EVENT *ms; static char clicked=0; p=o->userptr; ls=p->list; y=o->locy; switch (msg->msg) { case E_MOUSE: i=get_to_topline(ls,p->topline,NULL); ms=get_mouse(msg); curfont=o->font; if ((ms->tl1 && clicked) || (ms->event_type & 0x2)) { if (ls) do { char *c; clicked=1; c=ls[i]; if (i>=p->maxitems) return; if (c!=NULL) znh=text_height(c); else znh=0; if (y+znh>o->locy+o->ys) return; if (ms->y>=y && ms->yid,i);else clicked=0; return; } i++; y+=znh; } while (1); } if (ms->event_type & 0x4 && clicked) { clicked=0;set_change(); } return; case E_KEYBOARD: { int pos=*(int *)(o->data); int key=(*(int *)msg->data) & 0xff; if (!key) { int save; int curLine; key=*(int *)msg->data >> 8; { do { save=pos; switch (key) { case 'H':pos--;break; case 'P':pos++;break; case 'I':pos-=p->maxview;break; case 'Q':pos+=p->maxview;break; } if (pos<0) pos=0; if (pos>=p->maxitems) pos=p->maxitems-1; curLine=set_line_back(p->list,pos); if (curLine>=p->topline+p->maxview) p->topline=curLine-p->maxview+1; if (curLinetopline) p->topline=curLine; } while (save!=pos && p->list[pos]==NULL); c_set_value(0,o->id,pos); } } break; } case E_CONTROL: { int q = va_arg(msg->data, int); switch (q) { case 1:p->list=va_arg(msg->data, TSTR_LIST); redraw_object(o); break; case 0:*va_arg(msg->data, char ***)=p->list; break; case 2: i=get_to_topline(ls,p->topline,NULL); if (*(int *)o->datatopline=set_line_back(ls,*(int *)o->data); if (*(int *)o->data>=i+p->maxview) p->topline=set_line_back(ls,*(int *)o->data); break; } } break; case E_LOST_FOCUS:clicked=0; } } void listbox(OBJREC *o) { o->datasize=sizeof(int); o->call_init=string_list_init; o->call_draw=string_list_draw; o->call_event=string_list_event; //o->done=string_list_done; } /*void main() { TSTR_LIST test; int i,j; test=read_directory("c:\\windows\\system\\*.*",DIR_BREIF,_A_NORMAL); j=str_count(test); for(i=0;i