/***************************************************************************** * * 7UP * Modul: FORMS.C * (c) by TheoSoft '90 * *****************************************************************************/ #include #include #include #include #include #include #include #include #include "ufsl.h" #include "ltmf_lib.h" #define Objc_edit(a,b,c,d,e,f) objc_edit(a,b,c,f,e) #define FLAGS11 0x0800 #define FLAGS12 0x1000 #define FLAGS13 0x2000 #define FLAGS14 0x4000 #define FLAGS15 0x8000 #define SCROLLBOX FLAGS12 #define SCROLLUP FLAGS13 #define SCROLLDN FLAGS14 #define BACKDROP 0x2000 /* Fensterelement */ #define WM_BACKDROPPED 31 /* Message vom Eventhandler */ #define WF_BACKDROP 100 /* Fenster setzen */ #if GEMDOS #define FMD_FORWARD 1 #define FMD_BACKWARD 2 #define FMD_DEFLT 0 #else #define ED_START 0 /* editable text field definitions */ #define ED_INIT 1 #define ED_CHAR 2 #define ED_END 3 #endif #define CR 0x1C0D #define ENTER 0x720D #define TAB 0x0F09 #define UPARR 0x4800 #define DNARR 0x5000 #define F1 0x3B00 #define F12 0x4600 #define UNDO 0x6100 #define HELP 0x6200 extern UFSL fselptr; int windials=FALSE; int dial_handle=-1; extern int boxh; /*------------------------------------------------------------------------*/ /* */ /*------------------------------------------------------------------------*/ int rc_intersect(register int p1[], register int p2[]) { register int tx = max(p1[0], p2[0]); register int ty = max(p1[1], p2[1]); register int tw = min(p1[0] + p1[2], p2[0] + p2[2]); register int th = min(p1[1] + p1[3], p2[1] + p2[3]); p2[0] = tx; p2[1] = ty; p2[2] = tw - tx; p2[3] = th - ty; return ((tw > tx) && (th > ty)); } void fwind_redraw(OBJECT *tree, int wh, int pxyarray[]) { int full[4],area[4],array[4],ret; wind_update(BEG_UPDATE); wind_get( 0, WF_WORKXYWH, &full[0], &full[1], &full[2], &full[3]); wind_get(wh, WF_FIRSTXYWH, &area[0], &area[1], &area[2], &area[3]); while( area[2] && area[3] ) { if(rc_intersect(full,area)) { if(rc_intersect(pxyarray,area)) { objc_draw(tree,ROOT,MAX_DEPTH,area[0],area[1],area[2],area[3]); } } wind_get(wh, WF_NEXTXYWH,&area[0],&area[1],&area[2],&area[3]); } wind_update(END_UPDATE); } void fwind_move(OBJECT *tree, int wh, int buf[]) { int xwork,ywork,wwork,hwork; wind_set(wh,WF_CURRXYWH,buf[0],buf[1],buf[2],buf[3]); wind_get(wh,WF_WORKXYWH,&xwork,&ywork,&wwork,&hwork); tree->ob_x=xwork; tree->ob_y=ywork; } static int find_fflag(OBJECT *tree, int start, int flag) /* first_flag */ { register int i; for(i=start; !(tree[i].ob_flags & LASTOB); i++) { if(tree[i].ob_flags & flag) return(i); } if(tree[i].ob_flags & flag) return(i); return(-1); } static int count_flag(OBJECT *tree, int start, int flag) /* first_flag */ { register int i,count=0; for(i=start; !(tree[i].ob_flags & LASTOB); i++) { if(tree[i].ob_flags & flag) count++; } if(tree[i].ob_flags & flag) count++; return(count); } static int find_lflag(OBJECT *tree, int start, int flag) /* last_flag */ { register int i,k; for(i=start; !(tree[i].ob_flags & LASTOB); i++) { if(tree[i].ob_flags & flag) { for(k=i; !(tree[k].ob_flags & LASTOB); k++) { if(!(tree[k].ob_flags & flag)) return(k-1); } return(i); } } return(-1); } static int find_bflag(OBJECT *tree, int start, int flag) /* rckw„rts */ { register int i; for(i=start; i>=ROOT+2; i--) { if(tree[i].ob_flags & flag) return(i); } return(-1); } static int form_click(OBJECT *tree, int next_obj, int e_br, int *next_obj2) { int fm_cont=TRUE; switch(next_obj) { case ROOT: break; case (-1): Bconout(2,7); *next_obj2=0; break; default: fm_cont=form_button(tree,next_obj,e_br,next_obj2); break; } return(fm_cont); } static WORD find_obj(OBJECT *tree, WORD fm_start_obj, WORD fm_which) { WORD fm_obj,fm_flag,fm_theflag,fm_inc; fm_obj=0; fm_flag=EDITABLE; fm_inc=1; switch(fm_which) { case FMD_BACKWARD: fm_inc=-1; case FMD_FORWARD: fm_obj=fm_start_obj+fm_inc;break; case FMD_DEFLT: fm_flag=2; break; } while(fm_obj>=0) { fm_theflag=tree[fm_obj].ob_flags; if(fm_theflag&fm_flag) return(fm_obj); if(fm_theflag&LASTOB) fm_obj=-1; else fm_obj+=fm_inc; } return(fm_start_obj); } /*------------------------------------------------------------------------*/ /* */ /*------------------------------------------------------------------------*/ static WORD fm_inifld(OBJECT *tree, WORD fm_start_fld) { if(fm_start_fld==0) fm_start_fld=find_obj(tree,0,FMD_FORWARD); return(fm_start_fld); } int form_exdo(OBJECT *tree, WORD fm_start_fld) { WORD obj,fm_edit_obj,fm_next_obj,fm_which,fm_cont,fm_idx,fm_kr2; WORD kb_obj,keys,i,selected=FALSE; static int msgbuf[8]; static MEVENT mevent= { MU_KEYBD|MU_BUTTON, 2,1,1, 0,0,0,0,0, 0,0,0,0,0, msgbuf, 0L, /* bei Makro: 16L, */ 0,0,0,0,0,0, /* nur der Vollst„ndigkeit halber die Variablen von XGEM */ 0,0,0,0,0, 0, 0L, 0L,0L }; mevent.e_flags=MU_KEYBD|MU_BUTTON|MU_M1|MU_TIMER; if(windials) mevent.e_flags|=MU_MESAG; fm_next_obj=fm_inifld(tree,fm_start_fld); keys = init_keys(tree); fm_edit_obj=0; fm_cont=TRUE; while(fm_cont) { if((fm_next_obj!=0)&&(fm_edit_obj!=fm_next_obj)) { fm_edit_obj=fm_next_obj; fm_next_obj=0; Objc_edit(tree,fm_edit_obj,0,fm_idx,ED_INIT,&fm_idx); } fm_which=evnt_event(&mevent); /* wind_update(BEG_UPDATE); */ if(fm_which & MU_MESAG) { if(msgbuf[3]==dial_handle) /* Dialogfenster */ { switch(msgbuf[0]) { case WM_BACKDROPPED: /* nein, niemals */ break; case WM_REDRAW: Objc_edit(tree,fm_edit_obj,0,fm_idx,ED_END,&fm_idx); fwind_redraw(tree,msgbuf[3],&msgbuf[4]); Objc_edit(tree,fm_edit_obj,0,fm_idx,ED_INIT,&fm_idx); break; case WM_MOVED: Objc_edit(tree,fm_edit_obj,0,fm_idx,ED_END,&fm_idx); fwind_move(tree,msgbuf[3],&msgbuf[4]); Objc_edit(tree,fm_edit_obj,0,fm_idx,ED_INIT,&fm_idx); break; case WM_TOPPED: wind_set(msgbuf[3],WF_TOP,0,0,0,0); break; } } else if(fselptr.msgfunc) fselptr.msgfunc(fm_which,msgbuf); } if(fm_which & MU_KEYBD) { switch(mevent.e_kr) { case 0x4700: /* home */ if(count_flag(tree,ROOT+2,EDITABLE)>1) goto WEITER3; /* kein Scrollen m”glich, weil EDITABLE */ if((fm_next_obj=find_fflag(tree,ROOT+2,FLAGS12))>-1) { fm_cont=form_click(tree,fm_next_obj,1,&fm_next_obj); fm_next_obj=find_fflag(tree,ROOT+2,FLAGS13); fm_cont=form_click(tree,fm_next_obj,2,&fm_next_obj); /* fm_next_obj|=FLAGS15; */ } break; case 0x4737: /* clr */ if(count_flag(tree,ROOT+2,EDITABLE)>1) goto WEITER3; /* kein Scrollen m”glich, weil EDITABLE */ if((fm_next_obj=find_lflag(tree,ROOT+2,FLAGS12))>-1) { fm_cont=form_click(tree,fm_next_obj,1,&fm_next_obj); fm_next_obj=find_fflag(tree,ROOT+2,FLAGS14); fm_cont=form_click(tree,fm_next_obj,2,&fm_next_obj); /* fm_next_obj|=FLAGS15; */ } break; case 0x4838: /* shift up */ if(count_flag(tree,ROOT+2,EDITABLE)>1) goto WEITER3; /* kein Scrollen m”glich, weil EDITABLE */ if((fm_next_obj=find_fflag(tree,ROOT+2,FLAGS12))>-1) { if(!(tree[fm_next_obj].ob_state & SELECTED)) fm_cont=form_click(tree,fm_next_obj,1,&fm_next_obj); else { fm_next_obj=find_fflag(tree,ROOT+2,FLAGS13); fm_cont=form_click(tree,fm_next_obj,1,&fm_next_obj); } } break; case 0x4800: /* up */ if(count_flag(tree,ROOT+2,EDITABLE)>1) goto WEITER3; if((fm_next_obj=find_fflag(tree,ROOT+2,FLAGS12))>-1) { for(i=fm_next_obj; !(tree[i].ob_flags & LASTOB); i++) if((tree[i].ob_flags & FLAGS12) && (tree[i].ob_state & SELECTED)) { selected=TRUE; if(tree[i-1].ob_flags & FLAGS12) { fm_next_obj=--i; break; } } if(!selected) fm_next_obj=find_lflag(tree,ROOT+2,FLAGS12); else if(i!=fm_next_obj) fm_next_obj=find_fflag(tree,ROOT+2,FLAGS13); } fm_cont=form_click(tree,fm_next_obj,1,&fm_next_obj); break; case 0x5032: /* shift dn */ if(count_flag(tree,ROOT+2,EDITABLE)>1) goto WEITER3; /* kein Scrollen m”glich, weil EDITABLE */ if((fm_next_obj=find_lflag(tree,ROOT+2,FLAGS12))>-1) { if(!(tree[fm_next_obj].ob_state & SELECTED)) fm_cont=form_click(tree,fm_next_obj,1,&fm_next_obj); else { fm_next_obj=find_fflag(tree,ROOT+2,FLAGS14); fm_cont=form_click(tree,fm_next_obj,1,&fm_next_obj); } } break; case 0x5000: /* dn */ if(count_flag(tree,ROOT+2,EDITABLE)>1) goto WEITER3; /* kein Scrollen m”glich, weil EDITABLE */ if((fm_next_obj=find_fflag(tree,ROOT+2,FLAGS12))>-1) /* gibt es eine Scrolliste? */ { /* erstes selektiertes Objekt suchen */ for(i=fm_next_obj; !(tree[i].ob_flags & LASTOB); i++) if((tree[i].ob_flags & FLAGS12) && (tree[i].ob_state & SELECTED)) { selected=TRUE; /* hier ist es! */ if(tree[i+1].ob_flags & FLAGS12) { /* ist das n„chste Objekt auch scrollbar? */ fm_next_obj=++i; /* nur Cursor weitersetzen */ break; } } if(!selected) /* Es wurde kein selektiertes Objekt gefunden */ fm_next_obj=find_fflag(tree,ROOT+2,FLAGS12); /* erstes Objekt selektieren */ else if(i!=fm_next_obj) /* es gibt ein sel. Objekt, es ist aber das letzte */ fm_next_obj=find_fflag(tree,ROOT+2,FLAGS14); /* also Pfeil klicken */ } fm_cont=form_click(tree,fm_next_obj,1,&fm_next_obj); break; case 0x4B00: /* lf */ case 0x4B34: /* lf */ case 0x4D00: /* rt */ case 0x4D36: /* rt */ if(count_flag(tree,ROOT+2,EDITABLE)>0) goto WEITER3; fm_next_obj=-1; fm_cont=form_click(tree,fm_next_obj,1,&fm_next_obj); break; default: WEITER3: kb_obj = keys ? lookup_key(mevent.e_kr, mevent.e_ks) : 0; if(kb_obj) fm_cont = form_button(tree, kb_obj, 0x01, &fm_next_obj); else { fm_cont=form_keybd(tree, fm_edit_obj, fm_next_obj, mevent.e_kr, &fm_next_obj, &mevent.e_kr); if(mevent.e_kr) { Objc_edit(tree,fm_edit_obj,mevent.e_kr,fm_idx,ED_CHAR,&fm_idx); } } break; } while(evnt_event(&mevent)==MU_KEYBD) ; } if(fm_which & MU_BUTTON) { fm_next_obj=objc_find(tree,ROOT,MAX_DEPTH,mevent.e_mx,mevent.e_my); switch(fm_next_obj) { case (-1): if(!di_moveto(tree, mevent.e_mx, mevent.e_my)) Bconout(2, 7); fm_next_obj=0; break; case ROOT+1: di_fly(tree); /* Let 'em Fly! */ fm_next_obj=0; break; default: if((tree[fm_next_obj].ob_flags & 0xff) == NONE) { if(mevent.e_br == 2) di_center(tree); /* else di_fly(tree); /* Let 'em Fly! */ */ fm_next_obj = 0; } else fm_cont=form_button(tree,fm_next_obj,mevent.e_br,&fm_next_obj); break; } } if((!fm_cont) || ((fm_next_obj != 0) && (fm_next_obj != fm_edit_obj))) { Objc_edit(tree,fm_edit_obj,mevent.e_kr,fm_idx,ED_END,&fm_idx); } /* wind_update(END_UPDATE); */ } return(fm_next_obj); } static void form_size(OBJECT *tree, int h) { register int i; tree[ROOT].ob_state&=~OUTLINED; tree[ROOT].ob_spec.obspec.framesize=0; tree[ROOT+1].ob_flags|=HIDETREE; tree[ROOT+2].ob_flags|=HIDETREE; /* if(!(tree->ob_flags & 0x0400))/* W„re Hilfedialog, aber kein Handle */ */ { tree[ROOT].ob_y+=(h/2); tree[ROOT].ob_height-=h; for(i=ROOT+1; i; i=tree[i].ob_next) { tree[i].ob_y-=h; if(tree[i].ob_next==ROOT) break; } } } static void form_resize(OBJECT *tree, int h) { register int i; tree[ROOT].ob_state|=OUTLINED; tree[ROOT].ob_spec.obspec.framesize=2; tree[ROOT+1].ob_flags&=~HIDETREE; tree[ROOT+2].ob_flags&=~HIDETREE; /* if(!(tree->ob_flags & 0x0400)) /* W„re Hilfedialog, aber kein Handle */ */ { tree[ROOT].ob_y-=(h/2); tree[ROOT].ob_height+=h; for(i=ROOT+1; i; i=tree[i].ob_next) { tree[i].ob_y+=h; if(tree[i].ob_next==ROOT) break; } } } void form_open(OBJECT *tree,int modus) { int x,y,w,h,xdesk,ydesk,wdesk,hdesk; int wi_kind=NAME|MOVER; if(get_cookie('MagX')) wi_kind|=BACKDROP; wind_get(0,WF_WORKXYWH,&xdesk,&ydesk,&wdesk,&hdesk); if(windials && (dial_handle=wind_create(wi_kind,xdesk,ydesk,wdesk,hdesk))>0) { wind_set(dial_handle,WF_NAME,(char *)((TEDINFO *)tree[ROOT+2].ob_spec.userblk->ub_parm)->te_ptext); form_size(tree, 2*boxh); wind_calc(WC_BORDER,NAME|MOVER,tree->ob_x,tree->ob_y,tree->ob_width,tree->ob_height,&x,&y,&w,&h); if(yob_y+=(ydesk-y); y=ydesk; } if(modus) form_dial(FMD_GROW,0,0,0,0,tree->ob_x,tree->ob_y,tree->ob_width,tree->ob_height); wind_open(dial_handle,x,y,w,h); return(dial_handle); } else { wind_update(BEG_UPDATE); wind_update(BEG_MCTRL); /* wg, graf_slidebox() lt. Profibuch S.691 */ if(tree->ob_yob_y+=(ydesk+3-tree->ob_y); } /* Korrektur der Koordinaten */ if((tree->ob_x+tree->ob_width > xdesk+wdesk) || (tree->ob_y+tree->ob_height > ydesk+hdesk)) form_center(tree,&x,&y,&w,&h); form_dial(FMD_START,0,0,0,0,tree->ob_x-3,tree->ob_y-3, tree->ob_width+6,tree->ob_height+6); if(modus) form_dial(FMD_GROW,0,0,0,0,tree->ob_x-3,tree->ob_y-3, tree->ob_width+6,tree->ob_height+6); objc_draw(tree,ROOT,MAX_DEPTH,tree->ob_x-3,tree->ob_y-3, tree->ob_width+6,tree->ob_height+6); } } int form_close(OBJECT *tree, int exit_obj,int modus) { if(dial_handle>0) { wind_close(dial_handle); wind_delete(dial_handle); if(modus) form_dial(FMD_SHRINK,0,0,0,0,tree->ob_x,tree->ob_y,tree->ob_width,tree->ob_height); form_resize(tree, 2*boxh); if(exit_obj > -1) tree[exit_obj].ob_state &= ~SELECTED; dial_handle=-1; } else { if(modus) form_dial(FMD_SHRINK,0,0,0,0,tree->ob_x-3,tree->ob_y-3, tree->ob_width+6,tree->ob_height+6); form_dial(FMD_FINISH,0,0,0,0,tree->ob_x-3,tree->ob_y-3, tree->ob_width+6,tree->ob_height+6); if(exit_obj > -1 && exit_obj < 256) tree[exit_obj].ob_state &= ~SELECTED; wind_update(END_MCTRL); /* wg, graf_slidebox() lt. Profibuch S.691 */ wind_update(END_UPDATE); } return(exit_obj); } void form_write(OBJECT *tree, int item, char *string, int modus) { int x,y; strcpy(tree[item].ob_spec.tedinfo->te_ptext,string); if(modus) { objc_offset(tree,item,&x,&y); objc_draw(tree,item,0,x,y,tree[item].ob_width,tree[item].ob_height); } } char *form_read(OBJECT *tree, int item, char *string) { strcpy(string,tree[item].ob_spec.tedinfo->te_ptext); return(string); }