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

  1. FUNCTION popable(BYVAL obj)
  2. STATIC disabled,hidden
  3. disabled=curob_state(obj,mask_disabled)    
  4. hidden=curob_flags(obj,mask_hidetree)        
  5. IF (NOT (disabled OR hidden)) THEN 
  6.     popable=-1
  7. ELSE
  8.     popable=0
  9. END IF
  10. END FUNCTION
  11.  
  12. FUNCTION pop_keybd(BYVAL k,finished_pop)
  13. STATIC last_obj,sel_obj
  14. last_obj=0
  15. sel_obj=0
  16. DO
  17.     INCR last_obj
  18.     IF curob_state(last_obj,mask_selected) THEN sel_obj=last_obj
  19. LOOP UNTIL curob_flags(last_obj,mask_lastob)
  20. SELECT CASE k
  21.     CASE &h5000
  22.         INCR sel_obj
  23.         IF NOT popable(sel_obj) THEN INCR sel_obj
  24.     CASE &h4800
  25.         DECR sel_obj
  26.         IF NOT popable(sel_obj) THEN DECR sel_obj
  27.     CASE &h1C0D:finished_pop=-1
  28.     CASE &h6100:pop_keybd=-1:finished_pop=-1:EXIT FUNCTION
  29.     CASE &h4700:sel_obj=1
  30.     CASE &h4737:sel_obj=last_obj
  31. END SELECT
  32. sel_obj=MAX(1,MIN(sel_obj,last_obj))
  33. pop_keybd=sel_obj
  34. END FUNCTION
  35.  
  36. SUB DeselectObject(BYVAL obj)
  37. STATIC state
  38. state=getob_state(obj)
  39. junk=objc_change(tree&,obj,0,0,0,0,state AND (NOT mask_selected),1)
  40. END SUB
  41.  
  42. SUB SelectObject(BYVAL obj)
  43. STATIC state
  44. state=getob_state(obj)
  45. junk=objc_change(tree&,obj,0,0,0,0,state OR mask_selected,1)
  46. END SUB
  47.  
  48. SUB objc_rect(BYVAL obj,x,y,w,h)
  49. junk=objc_offset(tree&,obj,x,y)
  50. w=getob_width(obj)
  51. h=getob_height(obj)
  52. END SUB
  53.  
  54. FUNCTION do_popup(BYVAL old_obj)
  55. STATIC mx,my,new_obj
  56. STATIC objx,objy,objw,objh,ev,k,finished_pop
  57. STATIC boxx,boxy,boxw,boxh,mu_flag,flag2
  58. finished_pop=0
  59. new_obj=old_obj
  60. IF old_obj THEN 
  61.     objc_rect old_obj,objx,objy,objw,objh
  62. ELSE
  63.     objw=0:objh=0
  64. END IF
  65. objc_rect 0,boxx,boxy,boxw,boxh
  66. mu_flag=MU_M2
  67. flag2=0
  68. DO
  69.     ev=evnt_multi(MU_BUTTON+mu_flag+MU_KEYBD,257,3,0,_
  70.                                             1,objx,objy,objw,objh,_
  71.                                             flag2,boxx,boxy,boxw,boxh,_
  72.                                             0,0,_
  73.                                             mx,my,0,0,k,0)
  74.     IF ev AND MU_KEYBD THEN new_obj=pop_keybd(k,finished_pop)
  75.     IF ev AND MU_M2 THEN
  76.         flag2=flag2 XOR 1
  77.         mu_flag=mu_flag XOR MU_M1
  78.         IF flag2 THEN
  79.             objw=0:objh=0
  80.         ELSE
  81.             IF old_obj THEN
  82.                 DeselectObject old_obj
  83.                 old_obj=0
  84.             END IF
  85.         END IF
  86.     END IF
  87.     IF ev AND MU_M1 THEN 
  88.         new_obj=objc_find(tree&,0,10,mx,my)
  89.         IF new_obj>0 THEN objc_rect new_obj,objx,objy,objw,objh
  90.     END IF
  91.     IF ev AND MU_BUTTON THEN
  92.         IF flag2=0 THEN new_obj=-1 
  93.         finished_pop=-1
  94.     END IF
  95.     IF new_obj<>old_obj AND new_obj>0 THEN
  96.         IF popable(new_obj) THEN
  97.             SelectObject new_obj
  98.             IF old_obj THEN
  99.                 DeselectObject old_obj
  100.             END IF
  101.             old_obj=new_obj
  102.         ELSE
  103.             new_obj=0
  104.         END IF
  105.     END IF
  106. LOOP UNTIL finished_pop
  107. IF old_obj THEN exclob_state old_obj,mask_selected
  108. IF new_obj>0 THEN
  109.     do_popup=new_obj
  110. ELSE
  111.     do_popup=0
  112. END IF
  113. junk=evnt_button(0,3,0,0,0,0,0)        'wait for button release
  114. END FUNCTION
  115.  
  116. FUNCTION popup(BYVAL wind_handle,BYVAL treenum,BYVAL oldpop,BYVAL x,BYVAL y)
  117. STATIC w,h,pop,oldtree&,winx,winy,winw,winh,top,hcell,button
  118. STATIC dskx,dsky,dskh,dskw,x1,y1,w1,h1,add&
  119. 'junk=evnt_button(0,3,0,0,0,0,0)        'wait for button release
  120. junk=wind_update(1)                            
  121. junk=wind_update(3)
  122. junk=wind_get(0,WF_WORKXYWH,dskx,dsky,dskw,dskh)
  123. IF wind_handle THEN
  124.     junk=wind_get(wind_handle,WF_WORKXYWH,winx,winy,winw,winh)
  125.     intersection dskx,dsky,dskw,dskh,winx,winy,winw,winh,x1,y1,w1,h1
  126. ELSE
  127.     x1=dskx:y1=dsky:w1=dskw:h1=dskh
  128. END IF
  129. oldtree&=tree&
  130. selecttree treenum
  131. IF oldpop THEN 
  132.     inclob_state oldpop,mask_checked+mask_selected
  133.     junk=graf_handle(junk,hcell,junk,junk)
  134.     y=y-((oldpop-1)*hcell)
  135. END IF
  136. w=getob_width(0)+4
  137. h=getob_height(0)+4
  138. IF x+w>x1+w1 THEN
  139.     x=x1+w1-w-1
  140. ELSEIF x<x1 THEN 
  141.     x=x1
  142. END IF
  143. IF y+h>y1+h1 THEN
  144.     y=y1+h1-h-1
  145. ELSEIF y<y1 THEN
  146.     y=y1
  147. END IF
  148. x=byte_align(x)
  149. setob_x 0,x
  150. setob_y 0,y
  151. DECR x:DECR y
  152. save_scr x,y,w,h,1
  153. junk=objc_draw(tree&,0,10,x,y,w,h)
  154. pop=do_popup(oldpop)
  155. exclob_state oldpop,mask_checked
  156. IF pop THEN
  157.     exclob_state pop,mask_selected
  158. ELSE
  159.     pop=oldpop
  160. END IF
  161. save_scr x,y,w,h,0
  162. popup=pop
  163. tree&=oldtree&
  164. junk=wind_update(2)
  165. junk=wind_update(0)
  166. END FUNCTION
  167.  
  168. SUB save_scr(BYVAL x,BYVAL y,BYVAL w,BYVAL h,BYVAL mode)
  169. STATIC p,size&,tmp(),quick
  170. x=MAX(x,0)                'winx allows negative values
  171. IF mode THEN
  172.     p=PEEKW(SYSTAB)
  173.     size&=2*(h+1)*((w+1)\16+1)+6
  174.     IF size&\2*p<malloc&(-1) THEN 
  175.         quick=-1
  176.         REDIM tmp(size&*p)
  177.         GET (x,y)-(x+w,y+h),tmp
  178.     ELSE
  179.         quick=0
  180.         form_dial FMD_START,0,0,0,0,x,y,w,h
  181.     END IF
  182. ELSE
  183.     IF quick THEN
  184.         PUT(x,y),tmp,PSET
  185.         ERASE tmp
  186.     ELSE
  187.         form_dial FMD_FINISH,0,0,0,0,x,y,w,h
  188.     END IF
  189. END IF
  190. END SUB
  191.