home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / HISOFT.LZH / HISOFT_A.MSA / HGT / FORMWIND.BAS < prev    next >
BASIC Source File  |  1993-09-23  |  13KB  |  462 lines

  1. ' Form window handling for HiSoft BASIC GEM Toolbox
  2.  
  3. SUB InitFormWindows
  4. SHARED woCancelObj(1),woIdx(1),woCur_edit(1),woCloseForm&(1),FormWindowsInitialised,max_windows
  5. REDIM  woCancelObj(max_windows),woIdx(max_windows),woCur_edit(max_windows),woCloseForm&(max_windows)
  6. FormWindowsInitialised=-1
  7. END SUB
  8.  
  9. SUB FormReDraw
  10. SHARED commonx,commony,commonw,commonh,commonhandle
  11. STATIC i,x,y,w,h
  12. SHARED woObjectTree&(1),woOffX(1),woOffY(1),woBaseX(1),woBaseY(1),woCur_edit(1)
  13.  
  14. STATIC    oldtree&
  15.     oldtree&=tree&
  16.     i=WhichWindow(commonHandle)
  17.     IF i=0 THEN EXIT SUB ' panic
  18.     SelectTreeAddr woObjectTree&(i)
  19.     junk=wind_get(CommonHandle,WF_CURRXYWH,x,y,w,h)
  20.  
  21.     Setob_x 0,woBaseX(i)-woOffX(i)+x
  22.     Setob_y 0,woBasey(i)-woOffY(i)+y
  23.     xobjc_draw 0,10,commonx,commony,commonw,commonh
  24.     IF woCur_edit(i) THEN
  25.         junk=wind_get(0,WF_TOP,x,0,0,0)
  26.         IF x=CommonHandle THEN
  27.             do_cursor x,1
  28.         END IF
  29.     END IF
  30.     SelectTreeAddr oldtree&
  31. END SUB
  32.  
  33. FUNCTION xobj_watch(BYVAL win,BYVAL obj)
  34. STATIC x,y,w,h,ev,flag
  35. junk=objc_offset(tree&,obj,x,y)
  36. w=getob_width(obj)
  37. h=getob_height(obj)
  38. flag=1
  39. DO
  40.     ev=evnt_multi(MU_BUTTON+MU_M1,0,3,0,_
  41.                     flag,x,y,w,h,_
  42.                     0,x,y,w,h,_
  43.                     0,0,0,0,0,0,0,0)
  44.     IF (ev AND MU_BUTTON) THEN
  45.         EXIT DO
  46.     ELSEIF (ev AND MU_M1) THEN
  47.         IF flag THEN 
  48.             exclob_state obj,mask_selected
  49.         ELSE
  50.             inclob_state obj,mask_selected
  51.         END IF
  52.     END IF
  53.     flag=flag XOR 1
  54.     Object_Redraw win,obj
  55. LOOP
  56. xobj_watch=curob_state(obj,mask_selected)
  57. END FUNCTION
  58.  
  59. FUNCTION reset_radio(VAL win,VAL object)
  60. STATIC first,last,parent,i
  61. parent=getparent(object)
  62. first=Getob_head(parent)
  63. IF first=-1 THEN EXIT FUNCTION
  64. last=getob_tail(parent)
  65. i=first
  66. DO
  67.     IF i<>object AND curob_state(i,mask_selected)<>0 THEN 
  68.         exclob_state i,mask_selected
  69.         reset_radio=i
  70.         EXIT FUNCTION
  71.     END IF
  72.     i=getob_next(i)
  73. LOOP UNTIL i=parent
  74. reset_radio=0
  75. END FUNCTION
  76.  
  77. FUNCTION xform_button(BYVAL win,BYVAL obj,next_obj)
  78. STATIC res,flags,state,tmp,selectable,radio,selected,deselect,exitable,touchexit
  79. state=getob_state(obj)
  80. flags=getob_flags(obj)
  81. selectable=flags AND mask_selectable
  82. radio=flags AND mask_rbutton
  83. selected=state AND mask_selected
  84. exitable=flags AND mask_exit
  85. touchexit=flags AND mask_touchexit
  86. next_obj=0
  87. IF (state AND mask_disabled) OR (flags AND mask_hidetree) THEN
  88.     xform_button=1
  89.     EXIT FUNCTION
  90. END IF
  91. next_obj=0
  92. deselect=0
  93. res=-1
  94. IF selectable THEN
  95.     IF selected THEN
  96.         IF radio=0 THEN exclob_state obj,mask_selected
  97.     ELSE
  98.         inclob_state obj,mask_selected
  99.         IF radio THEN deselect=reset_radio(win,obj)
  100.     END IF
  101.     Object_Redraw win,obj
  102.     IF deselect THEN Object_Redraw win,deselect
  103.     IF exitable=0 AND touchexit=0 THEN
  104.         junk=evnt_button(0,3,0,0,0,0,0)
  105.     END IF
  106. END IF
  107. IF exitable<>0 AND selectable<>0 THEN
  108.     tmp=xobj_watch(win,obj)
  109.     IF tmp=0 THEN 
  110.         xform_button=1
  111.         EXIT FUNCTION
  112.     END IF
  113. END IF
  114. IF flags AND mask_editable THEN
  115.     next_obj=obj
  116. END IF
  117. IF exitable OR touchexit THEN
  118.     next_obj=obj
  119.     res=0
  120. END IF
  121. xform_button=res
  122. END FUNCTION 
  123.  
  124. 'this utility routine is for general use
  125. 'it should only be used to redraw a single object
  126. SUB Object_Redraw(WindowHandle,BYVAL obj)
  127. STATIC x1,y1,w1,h1,x,y,w,h,topwin
  128. SHARED commonx,commony,commonw,commonh
  129. objcextent obj,x,y,w,h
  130. junk=wind_get(0,WF_TOP,topwin,0,0,0)
  131. IF WindowHandle=topwin THEN
  132.     junk=objc_draw(tree&,0,10,x,y,w,h)
  133.     vs_clip 1,x,y,x+w-1,y+h-1
  134.     show_cuts obj,0
  135. ELSE
  136.     junk=wind_get(WindowHandle,WF_FIRSTXYWH,x1,y1,w1,h1)
  137.     WHILE (w1<>0) AND (h1<>0)
  138.         IF MyInterSection(x,y,w,h,x1,y1,w1,h1,commonx,commony,commonw,commonh) THEN
  139.             vs_clip 1,commonx,commony,commonx+commonw-1,commony+commonh-1
  140.             junk=objc_draw(tree&,0,10,commonx,commony,commonw,commonh)
  141.             show_cuts obj,0
  142.         END IF
  143.         junk=wind_get(WindowHandle,WF_NEXTXYWH,x1,y1,w1,h1)
  144.     WEND
  145. END IF
  146. END SUB
  147.  
  148. 'this utility routine should be used to redraw
  149. 'one object or more, it is not as fast as Object_Redraw
  150. 'but can redraw several objects in one go
  151. SUB MultipleObjectRedraw(BYVAL win,BYVAL obj)
  152. STATIC x,y,w,h
  153.     objcextent obj,x,y,w,h
  154.     redraw win,x,y,w,h
  155. END SUB
  156.  
  157. FUNCTION FormClose
  158. SHARED commoni,commonobj,wocancelobj(1),wocloseform&(1),woType(1)
  159. SHARED commonclose,woObjectTree&(1)
  160. STATIC j,oldtree&
  161. IF woType(commoni)<> woTform THEN FormClose=-1: EXIT FUNCTION
  162. oldtree&=tree&
  163. SelectTreeAddr woObjectTree&(commoni)
  164. IF commonobj=-1 THEN commonobj=woCancelobj(commoni)
  165. IF curob_flags(commonobj,mask_exit) THEN
  166.     Exclob_state commonobj,mask_selected
  167. END IF
  168. commonclose=-1
  169. CALLS wocloseForm&(commoni)
  170. commonobj=-1
  171. FormClose=commonclose
  172. SelectTreeAddr oldtree&
  173. END FUNCTION
  174.  
  175. SUB FormDelete
  176. SHARED commoni,wocancelobj(1),Howmanywindows
  177. SHARED woCloseForm&(1),woObjectTree&(1),woBaseX(1),woBaseY(1),woCancelObj(1),woCur_edit(1),woidx(1)
  178. STATIC j
  179. FOR j=commoni TO HowManyWindows
  180.     woCloseForm&(j)=woCloseForm&(j+1)
  181.     woObjectTree&(j)=woObjectTree&(j+1)
  182.     woBaseX(j)=woBaseX(j+1)
  183.     woBaseY(j)=woBaseY(j+1)
  184.     woCancelObj(j)=woCancelObj(j+1)
  185.     woCur_edit(j)=woCur_edit(j+1)
  186.     woIdx(j)=woIdx(j+1)
  187. NEXT j
  188.  
  189. END SUB
  190.  
  191. FUNCTION Gette_ptmplt$(BYVAL object)
  192. STATIC t&,a$
  193. a$=""
  194. t&=Getob_spec&(object)
  195. t&=PEEKL(t&+te_ptmplt)
  196. WHILE PEEKB(t&)
  197.     a$=a$+CHR$(PEEKB(t&))
  198.     INCR t&
  199. WEND
  200. Gette_ptmplt$=a$
  201. END FUNCTION
  202.  
  203. FUNCTION getcur_offset(BYVAL obj,BYVAL idx)
  204. STATIC tmp$,curspos
  205. tmp$=(gette_ptmplt$(obj))
  206. curspos=INSTR(tmp$,"_")-1+idx
  207. getcur_offset=curspos*8
  208. END FUNCTION
  209.  
  210. SUB do_cursor(BYVAL win_handle,BYVAL mode)
  211. SHARED woCur_edit(),woIdx(),woObjectTree&()
  212. STATIC x1,y1,w1,h1,i
  213. i=WhichWindow(win_Handle)
  214. IF woCur_edit(i) THEN
  215.     SelectTreeAddr woObjectTree&(i)
  216.     objcextent wocur_edit(i),x1,y1,w1,h1
  217.     x1=x1+getcur_offset(wocur_edit(i),woidx(i))
  218.     junk=objc_draw(tree&,0,10,x1,y1-3,1,h1+6)
  219.     IF mode THEN junk=objc_edit(tree&,woCur_edit(i),0,woIdx(i),3)
  220. END IF
  221. END SUB
  222.  
  223. '     As OpenAWindow except the Object Tree whose Address is given by
  224. '    p  is always - rather than a specific redraw routine. This will
  225. '    handle scroll events
  226. FUNCTION OpenFormWindow(WindowName$,BYVAL WindComp,BYVAL treeno,BYVAL startobj,BYVAL cancelobj,BYVAL Closeproc&)
  227. STATIC WindowHandle,oldtree&
  228. SHARED woObjectTree&(1),woBaseX(1),woBaseY(1),forms_enabled
  229. SHARED woType(1),HowManyWindows,ObjectWindowsInitialised,FormWindowsInitialised
  230. STATIC WindowHandle,t$
  231. STATIC x,y,w,h,id,x1,y1
  232. SHARED WindX,WindY,WindW,WindH,HowManyWindows,WindowsInitialised,max_windows
  233. SHARED woHandle(1),woRedraw&(1),woSliderMax&(1),woClose&(1)
  234. SHARED woType(1),woOffx(1),woOffy(1),woCloseForm&(1),woCancelObj(1),woCur_edit(1),woidx(1)
  235.  
  236.     IF WindowsInitialised=0 THEN CALL InitWindowSystem
  237.     IF ObjectWindowsInitialised=0 THEN  CALL InitObjectWindows
  238.     IF FormWindowsInitialised=0 THEN CALL InitFormWindows
  239.     IF HowManyWindows=max_windows THEN
  240.         CALL NoMoreWindows
  241.         EXIT SUB
  242.     END IF
  243.     SelectTree treeno
  244.     form_center tree&,x1,y1,w,h
  245.     x1=byte_align(x1)
  246.     setob_x 0,x1
  247.     junk=wind_calc(0,WindComp,x1,y1,w,h,x,y,w,h)
  248. 'Find an unused BASIC window id
  249.     id=0
  250.     DO WHILE VARPTR(#257+id)
  251.         INCR id
  252.     LOOP
  253. ' OK we can use BASIC window id - we will get a runtime error if
  254. ' this doesn't work.
  255.     graf_mouse 256,0
  256.  
  257.     WINDOW OPEN id,WindowName$,x,y,w,h,WindComp
  258.     
  259.     INCR HowManyWindows
  260.     
  261.     WINDOW READ id,5,WindowHandle    'read the AES handle
  262.     woHandle(HowManyWindows)=WindowHandle
  263.     woRedraw&(HowManywindows)=VARPTRS(FormRedraw)
  264.     woSliderMax&(HowManyWindows)=VARPTRS(ObjectSliderMax)
  265.     woClose&(HowManyWindows)=VARPTRS(FormDelete)
  266.     woCloseForm&(HowManyWindows)=closeproc&
  267.     woType(HowManyWindows)=woTform
  268.     woObjectTree&(HowManyWindows)=tree&
  269.     woOffX(HowManyWindows)=0
  270.     woOffy(HowManyWindows)=0
  271.  
  272.     woBaseX(HowManyWindows)=x1-x
  273.     woBaseY(HowManyWindows)=y1-y
  274.     woCancelObj(HowManywindows)=cancelobj
  275.     IF startobj THEN
  276.         t$=gette_ptext$(startobj)
  277.         IF LEFT$(t$,1)="@" THEN woidx(HowManyWindows)=0 ELSE woidx(HowManyWindows)=LEN(t$)
  278.     END IF
  279.  
  280.     graf_mouse 257,0
  281.     woCur_edit(HowManywindows)=startobj
  282.     forms_enabled=-1    
  283.     OpenFormWindow=WindowHandle
  284.  
  285. END FUNCTION
  286.  
  287. SUB move_cursor(idx,BYVAL obj,BYVAL xpos,BYVAL new)
  288. STATIC curs_pos,chars,t$,objx,old_obj,new_idx
  289. IF curob_flags(obj,mask_editable)=0 THEN EXIT SUB
  290. junk=objc_offset(tree&,obj,objx,junk)
  291. curs_pos=objx+getcur_offset(obj,idx)
  292. new_idx=Idx+(xpos-curs_pos)/8
  293. t$=gette_ptext$(obj)
  294. IF LEFT$(t$,1)="@" THEN chars=0 ELSE chars=LEN(t$)
  295. new_idx=MAX(0,MIN(new_idx,chars))
  296. IF obj=old_obj AND idx=new_idx THEN
  297.     EXIT SUB
  298. ELSE
  299.  
  300.     old_obj=obj
  301. END IF
  302. IF NOT new THEN junk=objc_edit(tree&,obj,0,Idx,3)
  303. idx=new_idx
  304. junk=objc_edit(tree&,obj,0,Idx,3)
  305. END SUB
  306.  
  307. FUNCTION ProcessFormClicks(byval button,BYVAL clicks,BYVAL kstate,BYVAL x,BYVAL y)
  308. SHARED woType(1),woObjectTree&(1),tree&,commonobj
  309. SHARED woCancelObj(1),woIdx(1),woCur_edit(1),woclose&(1)
  310. STATIC cur_win,cur_wind,cont,new_edit,oldtree&,cur_front
  311.     cur_win=wind_find(x,y)
  312.     cur_wind=WhichWindow(cur_win)
  313.     IF woType(cur_wind)<> woTform THEN EXIT FUNCTION
  314.     oldtree&=tree&
  315.     SelectTreeAddr woObjecttree&(cur_wind)
  316.     cont=-1
  317.     new_edit=objc_find(tree&,0,10,x,y)
  318.     IF button=1 or curob_flags(new_edit,mask_editable)<>0 THEN                
  319.         junk=wind_get(0,WF_TOP,cur_front,junk,junk,junk)
  320.         IF cur_win<>cur_front THEN
  321.             SelectTreeAddr oldtree&
  322.             EXIT FUNCTION
  323.         END IF
  324.     END IF
  325.     IF new_edit=-1 THEN 
  326.         new_edit=0
  327.     ELSE
  328.         cont=xform_button(cur_win,new_edit,new_edit)
  329.         IF new_edit=wocur_edit(cur_wind) THEN
  330.             move_cursor woIdx(cur_wind),new_edit,x,0
  331.         END IF
  332.     END IF
  333.     IF (cont<>0) AND (new_edit<>0 AND new_edit<>wocur_edit(cur_wind)) THEN
  334.         junk=objc_edit(tree&,wocur_edit(cur_wind),0,woIdx(cur_wind),3)
  335.     END IF
  336.     IF cont=0 THEN
  337.         commonobj=new_edit
  338.         CloseAwindow cur_win
  339.         commonobj=-1
  340.     ELSE
  341.         IF new_edit<>0 AND wocur_edit(cur_wind)<>new_edit THEN
  342.             wocur_edit(cur_wind)=new_edit
  343.             move_cursor woIdx(cur_wind),new_edit,x,-1
  344.             new_edit=0
  345.         END IF
  346.  
  347.     END IF
  348.     SelectTreeAddr oldtree&
  349. END FUNCTION
  350.  
  351.  
  352. FUNCTION ProcessFormKey(BYVAL key_pressed,BYVAL kstate)
  353. SHARED woType(1),woObjectTree&(1),commonobj
  354. SHARED woExit_obj(1),woIdx(1),woCur_edit(1),wocancelobj(1)
  355. STATIC cur_front,cur_wind,cont,new_edit,oldtree&
  356. STATIC old_curpos
  357.     ProcessFormkey=0
  358.     junk=wind_get(0,WF_TOP,cur_front,junk,junk,junk)
  359.     cur_wind=WhichWindow(cur_front)
  360.     IF woType(cur_wind)<> woTform THEN EXIT FUNCTION
  361.     oldtree&=tree&
  362.     SelectTreeAddr woObjecttree&(cur_wind)
  363.     cont=-1
  364.     IF kstate=8 OR key_pressed=&h6100 THEN
  365.         new_edit=formcuts(key_pressed,woCancelObj(cur_wind))
  366.         if new_edit then ProcessFormKey=-1
  367.         IF new_edit THEN cont=xform_button(cur_front,new_edit,new_edit)
  368.     ELSE
  369.         cont=xform_keybd(wocur_edit(cur_wind),kstate,new_edit,key_pressed,woIdx(cur_wind))
  370.         IF key_pressed THEN
  371.             old_curpos=woIdx(cur_wind) 
  372.             junk=objc_edit(tree&,wocur_edit(cur_wind),key_pressed,woIdx(cur_wind),2)
  373.             IF old_curpos<>woIdx(cur_wind) THEN ProcessFormKey=-1
  374.         END IF
  375.     END IF
  376.  
  377.  
  378.     IF (cont<>0) AND (new_edit<>0 AND new_edit<>wocur_edit(cur_wind)) THEN
  379.         junk=objc_edit(tree&,wocur_edit(cur_wind),0,woIdx(cur_wind),3)
  380.     END IF
  381.     IF  cont=0 THEN
  382.         commonobj=new_edit
  383.         CloseAwindow cur_front
  384.         commonobj=-1
  385.     ELSE
  386.         IF new_edit<>0 AND wocur_edit(cur_wind)<>new_edit THEN
  387.             wocur_edit(cur_wind)=new_edit
  388.             junk=objc_edit(tree&,new_edit,0,woIdx(cur_wind),1)
  389.             new_edit=0
  390.         END IF
  391.  
  392.     END IF
  393.     SelectTreeAddr oldtree&
  394. END FUNCTION    
  395.  
  396.  
  397. SUB KeyboardEvent(BYVAL key_pressed,BYVAL kstate)
  398. SHARED menus_enabled,keys_enabled,forms_enabled
  399.     IF forms_enabled THEN
  400.         IF ProcessFormKey(key_pressed,kstate) THEN EXIT SUB
  401.     END IF
  402.     IF menus_enabled THEN
  403.         IF CreateshortCut(key_pressed) THEN
  404.             do_message
  405.         ELSE
  406.             IF keys_enabled THEN
  407. ' process keystrokes that aren't menu items
  408.                     ProcessKeys CHR$(key_pressed AND 255),key_pressed,kstate
  409.             END IF
  410.         END IF
  411.     ELSEIF keys_enabled THEN
  412.         ' process keystrokes
  413.             ProcessKeys CHR$(key_pressed AND 255),key_pressed,kstate
  414. ' otherwise ignore keys
  415.     END IF
  416. END SUB
  417.  
  418. 'The New Toolbox's main loop
  419. SUB xHGTloop
  420. STATIC ev,key_pressed,clicks,x,y,kstate,button
  421. STATIC mclicks,mmask,mstate
  422. SHARED finished_flag,Mess(1),clicks_enabled,keys_enabled,menus_enabled,forms_enabled
  423.  REDIM mess(7)
  424. SHARED mouse_detect_both
  425. IF mouse_detect_both THEN
  426.     mclicks=258
  427.     mmask=3
  428.     mstate=0
  429. ELSE
  430.     mclicks=2
  431.     mmask=1
  432.     mstate=1
  433. END IF    
  434.  
  435.  finished_flag=0
  436.  DO
  437.     junk=wind_update(END_UPDATE)
  438.     ev=evnt_multi(MU_MESAG+MU_KEYBD+MU_BUTTON,mclicks,mmask,mstate, _
  439.             0,0,0,0,0,_
  440.             0,0,0,0,0,_
  441.             VARPTR(mess(0)),0,_
  442.             x,y, _
  443.             button,kstate, _
  444.             key_pressed,clicks)
  445.     junk=wind_update(BEG_UPDATE)
  446.  
  447.     IF ev AND MU_KEYBD THEN    KeyboardEvent key_pressed,kstate
  448.     IF ev AND MU_MESAG THEN
  449.         do_message
  450.     END IF
  451.     IF ev AND MU_BUTTON THEN
  452.         IF forms_enabled THEN
  453.             IF NOT ProcessFormClicks(button,clicks,kstate,x,y) THEN
  454.                 IF clicks_enabled THEN     ProcessClicks clicks,kstate,x,y
  455.             END IF
  456.         ELSE
  457.             IF clicks_enabled THEN     ProcessClicks clicks,kstate,x,y
  458.         END IF
  459.     END IF
  460.  LOOP UNTIL finished_flag
  461. END SUB
  462.