! Creates MBS-macro, compiles and runs it ! AB DATERRA 1994-06-02. ! J.Kjellander. MACRO MODULE m_test(); CONSTANT INT PART_TYPE=16384,MAXBUTTS=100; CONSTANT STRING DQ=chr(34); REF main_id,button_id,edit_id,icon_id; REF buttons(MAXBUTTS),edits(MAXBUTTS),icons(MAXBUTTS); STRING macro_name*10,main_title*32,str1*132,str2*132; VECTOR main_pos,but_pos,edit_pos,icon_pos; INT i,main_dx,main_dy,nbuttons,nedits,nchars,nicons; FLOAT but_dx,but_dy,but_bw,edit_dx,edit_dy,edit_bw,icon_bw; FILE f; BEGINMODULE !* !***Get ID of main window from GM. !* set_root_gm(); main_id:=get_next_gm(1,PART_TYPE,"m_main"); if main_id=#0 then exit("There is no main window !"); endif; !* !***Get main window attributes. !* macro_name:=getstr(main_id,1); main_pos:=getvec(main_id,2); main_dx:=getint(main_id,3); main_dy:=getint(main_id,4); main_title:=getstr(main_id,5); !* !***Find all buttons. !* nbuttons:=0; set_root_gm(); loop1: button_id:=get_next_gm(1,PART_TYPE,"men_button"); if button_id <> #0 then nbuttons:=nbuttons+1; buttons(nbuttons):=button_id; goto loop1; endif; !* !***Find all edits. !* nedits:=0; set_root_gm(); loop2: edit_id:=get_next_gm(1,PART_TYPE,"men_edit"); if edit_id <> #0 then nedits:=nedits+1; edits(nedits):=edit_id; goto loop2; endif; !* !***Find all icons. !* nicons:=0; set_root_gm(); loop3: icon_id:=get_next_gm(1,PART_TYPE,"men_icon"); if icon_id <> #0 then nicons:=nicons+1; icons(nicons):=icon_id; goto loop3; endif; !* !***Create new MBS-file. !* open(f,"W",act_jobdir()+macro_name+".MBS"); !* !***Write the MBS-code. !* outstr(f,"! MBS-code automatically generated by COW"); outlin(f); outstr(f,"! Version 1.0 Daterra AB, Sweden"); outlin(f); outlin(f); outstr(f,"MACRO MODULE "+macro_name+"();"); outlin(f); outlin(f); !* !***Local variables. !* outstr(f,"INT main_id,bidx;"); outlin(f); if nbuttons > 0 then outstr(f,"INT "); for i:= 1 to nbuttons do outstr(f,"bid"+str(i,-1,0)); if i < nbuttons then outstr(f,","); outlin(f); outstr(f," "); endif; endfor; outstr(f,";"); outlin(f); endif; if nedits > 0 then outstr(f,"INT "); for i:= 1 to nedits do outstr(f,"eid"+str(i,-1,0)); if i < nedits then outstr(f,","); outlin(f); outstr(f," "); endif; endfor; outstr(f,";"); outlin(f); endif; if nicons > 0 then outstr(f,"INT "); for i:= 1 to nicons do outstr(f,"iid"+str(i,-1,0)); if i < nicons then outstr(f,","); outlin(f); outstr(f," "); endif; endfor; outstr(f,";"); outlin(f); endif; !* !***Create main window. !* outlin(f); outstr(f,"BEGINMODULE"); outlin(f); outlin(f); outstr(f,"main_id:=cre_win(vec("); outstr(f,str(main_pos.x,-1,0)+","+str(main_pos.y,-1,0)+"),"); outstr(f,str(main_dx,-1,0)+","+str(main_dy,-1,0)+","); outstr(f,DQ+main_title+DQ+");"); outlin(f); !* !***Create buttons. !* for i:= 1 to nbuttons do but_pos:=getvec(buttons(i),2); but_dx:=getflt(buttons(i),3); but_dy:=getflt(buttons(i),4); but_bw:=getflt(buttons(i),5); str1:=getstr(buttons(i),6); str2:=getstr(buttons(i),7); outstr(f,"bid"+str(i,-1,0)+":=cre_button(main_id,vec("); outstr(f,str(but_pos.x-main_pos.x,-1,0)+","); outstr(f,str(main_pos.y-but_pos.y,-1,0)+"),"); outstr(f,str(but_dx,-1,0)+","+str(but_dy,-1,0)+","); outstr(f,str(but_bw,-1,0)+","+DQ+str1+DQ+","+DQ+str2+DQ+");"); outlin(f); endfor; !* !***Create edits. !* for i:= 1 to nedits do edit_pos:=getvec(edits(i),2); edit_dx:=getflt(edits(i),3); edit_dy:=getflt(edits(i),4); edit_bw:=getflt(edits(i),5); str1:=getstr(edits(i),6); nchars:=getint(edits(i),7); outstr(f,"eid"+str(i,-1,0)+":=cre_edit(main_id,vec("); outstr(f,str(edit_pos.x-main_pos.x,-1,0)+","); outstr(f,str(main_pos.y-edit_pos.y,-1,0)+"),"); outstr(f,str(edit_dx,-1,0)+","+str(edit_dy,-1,0)+","); outstr(f,str(edit_bw,-1,0)+","+DQ+str1+DQ+","); outstr(f,str(nchars,-1,0)+");"); outlin(f); endfor; !* !***Create icons. !* for i:= 1 to nicons do icon_pos:=getvec(icons(i),2); icon_bw:=getflt(icons(i),5); str1:=getstr(icons(i),6); outstr(f,"iid"+str(i,-1,0)+":=cre_icon(main_id,vec("); outstr(f,str(icon_pos.x-main_pos.x,-1,0)+","); outstr(f,str(main_pos.y-icon_pos.y,-1,0)+"),"); outstr(f,str(icon_bw,-1,0)+","+DQ+str1+DQ+");"); outlin(f); endfor; !* !***Wait for event. !* outlin(f); outstr(f,"show_win(main_id);"); outlin(f); outlin(f); outstr(f,"loop: bidx:=wait_win(main_id);"); outlin(f); outlin(f); !* !***Event handles. !* for i:=1 to nbuttons do outstr(f,"! "+getstr(buttons(i),6)); outlin(f); outstr(f,"if bidx = bid"+str(i,-1,0)+" then"); outlin(f); outstr(f,";"); outlin(f); outstr(f,"endif;"); outlin(f); outlin(f); endfor; for i:=1 to nedits do outstr(f,"! "+getstr(edits(i),6)); outlin(f); outstr(f,"if bidx = eid"+str(i,-1,0)+" then"); outlin(f); outstr(f,";"); outlin(f); outstr(f,"endif;"); outlin(f); outlin(f); endfor; for i:=1 to nicons do outstr(f,"! "+getstr(icons(i),6)); outlin(f); outstr(f,"if bidx = iid"+str(i,-1,0)+" then"); outlin(f); outstr(f,";"); outlin(f); outstr(f,"endif;"); outlin(f); outlin(f); endfor; !* !***Delete window and exit. !* outstr(f,"del_win(main_id);"); outlin(f); outlin(f); outstr(f,"ENDMODULE"); outlin(f); close(f); !* !***Compile. !* if act_ostype() = "UNIX" then os("cd "+act_jobdir()+";mbsc "+macro_name); endif; !* !***Give it a try. Clear PM first so old copy of !***module is removed from cache. !* clear_pm(); part(#1,macro_name,()); ENDMODULE