home *** CD-ROM | disk | FTP | other *** search
/ Millennium Time Capsule / AC2000.BIN / disks / hbasic_1 / dragdrop / dragdrop.bas next >
Encoding:
BASIC Source File  |  1997-06-19  |  11.3 KB  |  394 lines

  1. REM $option y+,q300
  2. WINDOW OFF : REM Goodbye! BASIC window routines, NOW!
  3. LIBRARY "GEMAES","GEMDOS"
  4. DEFINT a-z
  5. REM $include gemaes.bh
  6. REM $include dragdrop.bh
  7.  
  8. DECLARE FUNCTION newform_alert(BYVAL button,BYVAL num)
  9. DECLARE FUNCTION form_window(BYVAL tree,BYVAL title,BYVAL myco)
  10.  
  11. myco=win_name+win_close+win_move+win_size
  12.  
  13. j=wind_get(0,wf_workxywh,XM,YM,WM,HM)
  14.  
  15. DIM mess(7)
  16.  
  17. f=rsrc_load("DRAGDROP.RSC")
  18. IF f=0 THEN mm=form_alert(1,"[3][DRAGDROP.RSC][OK]") : SYSTEM
  19.  
  20. mm=rsrc_gaddr(0,0,menu&)
  21. menu_bar menu&,1 : REM Put in menu mar
  22.  
  23. mpos=menu_register(PEEKW(PEEKL(GB+4)+4),"  DragDrop test prg ") : REM my app's name
  24.  
  25. REM setup done, main program.
  26.  
  27. main:
  28. e=evnt_multi(mu_mesag+mu_button,258,3,0,0,0,0,0,0,0,0,0,0,0,VARPTR(mess(0)),time&,xa,ya,buttona,kstate,k,br) 
  29. IF e AND mu_mesag THEN do_message mess(0) : ' deal with a message
  30. IF e AND mu_button AND buttona>0 THEN do_mouse xa,ya,buttona : ' deal with a click
  31. GOTO main:
  32.  
  33.  
  34.  
  35. REM end routine
  36. Pquit:
  37. menu_bar menu&,0 : REM remove menu bar
  38. IF m_handle>0 THEN close_window(m_handle) : m_handle=0
  39. r=rsrc_free
  40. IF r=0 THEN r=form_alert(1,"[1][Centre:|rsrc_free][OK]")
  41. SYSTEM
  42.  
  43.  
  44. SUB do_message(BYVAL mes_type)
  45. SHARED mess(1),menu&,tt
  46. SHARED m_handle,tree&,tree,x_in,y_in,w_in,h_in,myco,nde&,xm,ym,wm,hm
  47. STATIC title,item,j,jj,f,gdf,x,y,w,h,x2,y2,w2,h2,x,y,w,h
  48. LOCAL xre,yre,wre,hre,pip,cc$,m&,n,iconname$,filename$,output$,myobject
  49.  
  50. j=form_alert(1,"[4]["+STR$(mes_type)+"][ok]")
  51.  
  52. SELECT CASE mes_type
  53. CASE ap_dragdrop
  54. pip=fopen("U:\PIPE\DRAGDROP."+CHR$(PEEKB(VARPTR(mess(7))))+CHR$(PEEKB(VARPTR(mess(7))+1)),2)
  55. IF pip<0 THEN f=form_error(ABS(pip)-31) : GOTO mm:
  56.  
  57. REM the dragdrop command can fail...
  58. 'cc$=CHR$(1)
  59. 'm&=fwrite&(pip,1&,VARPTR(cc$))
  60. 'goto mm:
  61.  
  62.  
  63. REM but we choose to continue
  64. cc$=CHR$(0)
  65. m&=fwrite&(pip,1&,VARPTR(cc$))
  66.  
  67.  
  68. IF mess(3)=m_handle THEN tree=MAIN3
  69. j=rsrc_gaddr(0,tree,tree&)
  70. myobject=objc_find(tree&,0,2,mess(4),mess(5))
  71. IF mess(3)=m_handle THEN
  72.     j=objc_change(tree&,myobject,PEEKW(tree&+ob_x),PEEKW(tree&+ob_y),PEEKW(tree&+ob_width),PEEKW(tree&+ob_height),(PEEKW(tree&+ob_sizeof*myobject+ob_state) AND &HFFFE)+1,1)
  73. END IF
  74.  
  75.  
  76.  
  77. REM mess(0)=ap_dragdrop
  78. REM mess(1)=sender's ap_id
  79. REM mess(2)=0
  80. REM mess(3)=handle of window dropped on
  81. REM mess(4)=X pos of mouse when dropped
  82. REM mess(5)=Y pos of mouse at time of drop
  83. REM mess(6)=shift keys(control,shift, alt,etc..) state when dropped
  84. REM mess(7)=?? for U:\PIPE\DRAGDROP.??
  85.  
  86.  
  87. REM 32 byte string of supported filenames andor ARGS+PATH e.g .EXT, ARGS, PATH
  88. cc$="ARGS.TXT.MOD"+STRING$(20,0) : REM unused bytes filled with chr$(0)
  89.  
  90. REM THIS window does not accept PATH
  91. m&=fwrite&(pip,LEN(cc$),VARPTR(cc$))
  92.  
  93. REM read a word then read header
  94.  
  95. redo:
  96.  
  97. cc$=STRING$(2,0)
  98. m&=fread&(pip,LEN(cc$),VARPTR(cc$))
  99. IF m&<1 THEN GOTO mm: REM originator aborted dragdrop: 
  100.  
  101. n=PEEKW(VARPTR(cc$))
  102.  
  103. cc$=STRING$(n,0) : REM about to read an n byte header.
  104. m&=fread&(pip,n,VARPTR(cc$))
  105. IF m&<1 THEN GOTO mm: REM fault:
  106.  
  107. REM now for the fun bit!
  108.  
  109. cconws LEFT$(cc$,4)+CHR$(0)
  110. cconws STR$(PEEKL(VARPTR(cc$)+4))+CHR$(0)
  111. output$=STRING$(PEEKL(VARPTR(cc$)+4),0)
  112.  
  113.  
  114. iconname$="" : filename$="" : n=8
  115. geticonname:
  116. IF PEEKB(VARPTR(cc$)+n)=0 THEN INCR n : GOTO getfilename:
  117. iconname$=iconname$+CHR$(PEEKB(VARPTR(cc$)+n)) : INCR n : GOTO geticonname: 
  118.  
  119. getfilename:
  120. IF PEEKB(VARPTR(cc$)+n)=0 THEN GOTO getout:
  121. filename$=filename$+CHR$(PEEKB(VARPTR(cc$)+n)) : INCR n : GOTO getfilename: 
  122.  
  123. getout:  
  124.  
  125. cconws iconname$+CHR$(0)
  126. cconws filename$+CHR$(0)
  127.  
  128. ' if we supported PATH. This program does not recieve "PATH" because
  129. ' the window is not a directory window like those of the desktop.
  130. '
  131. ' this is what the desktop might do if a file was dragged from an
  132. ' application to one of it's windows.
  133. '
  134. ' IF left$(cc$,4)="PATH"
  135. ' path$="C:\FILES\"+chr$(0) rem save file here (from the title bar of a desktop window)
  136. ' if PEEKL(VARPTR(cc$)+4)<len(path$) then gg&=PEEKL(VARPTR(cc$)+4) : rem note to originator applications, this would cause a problem, an incomplete path would be transferred.
  137. ' if len(path$)<PEEKL(VARPTR(cc$)+4) then gg&=len(path$)
  138. ' if len(path$)=PEEKL(VARPTR(cc$)+4) then gg&=len(path$)
  139. ' r&=fwrite&(pip,gg&,varptr(path$))
  140. ' goto mm:  rem fclose(pip)
  141.  
  142.  
  143.  
  144.  IF LEFT$(cc$,4)="ARGS" OR LEFT$(cc$,1)="." THEN cc$=CHR$(myobject) : ELSE cc$=CHR$(2) : m&=fwrite&(pip,1&,VARPTR(cc$)) : GOTO redo:
  145. m&=fwrite&(pip,1&,VARPTR(cc$))
  146.  
  147. REM if myobject=0 then continue...
  148. IF myobject=1 THEN GOTO mm: REM abort
  149. IF myobject=2 THEN GOTO redo: REM I cannnot accept data in this file format e.g. .???, try another format.
  150. IF myobject=3 THEN GOTO redo: REM I cannot accept this much data (I.e. out of memory), try with less data to be sent.
  151. IF myobject=4 THEN GOTO mm: REM Delete data
  152. IF myobject=5 THEN GOTO mm: REM Print data
  153. IF myobject=6 THEN GOTO mm: REM Copy data to clipboard
  154.  
  155. m&=fread&(pip,LEN(output$),VARPTR(output$))
  156. j=form_alert(1,"[4][Path to load module from|"+output$+"][OK]")
  157.  
  158.  
  159. mm:
  160. IF mess(3)=M_handle THEN
  161.     j=objc_change(tree&,myobject,PEEKW(tree&+ob_x),PEEKW(tree&+ob_y),PEEKW(tree&+ob_width),PEEKW(tree&+ob_height),(PEEKW(tree&+ob_sizeof*myobject+ob_state) AND &HFFFE),1)
  162. END IF
  163. IF pip>-1 THEN j=fclose(pip)
  164.  
  165. CASE 37
  166. REM wm_toolbar
  167. f=form_alert(1,"[4][TOOLBAR:|WINDOW="+STR$(mess(3))+"|Object="+STR$(mess(4))+"|Clicks="+STR$(mess(5))+"|Shiftstate="+STR$(mess(6))+"][ok]")
  168.  
  169.  
  170. CASE mn_selected 
  171. title=mess(3)
  172. item=mess(4)
  173. menu_tnormal menu&,title,1
  174.  
  175.  
  176. IF title=desk AND item=DRAGANDDROP THEN
  177.     j=rsrc_gaddr(0,ABOUT2,tree&)
  178.     j=objc_offset(menu&,DESK,x2,y2)
  179.     w2=PEEKW(menu&+ob_sizeof*DESK+ob_width) : h2=PEEKW(menu&+ob_sizeof*DESK+ob_height)  
  180.     form_center tree&,x,y,w,h
  181.     form_dial 1,x2,y2,w2,h2,x,y,w,h
  182.     form_dial 0,x2,y2,w2,h2,x,y,w,h
  183.     j=objc_draw(tree&,0,10,x,y,w,h)
  184.     j=form_do(tree&,0)
  185.     POKEW tree&+ob_sizeof*ABOUT2+ob_state,PEEKW(tree&+ob_sizeof*ABOUT2+ob_state) AND &HFFFE
  186.     form_dial 3,x2,y2,w2,h2,x,y,w,h
  187.     form_dial 2,x2,y2,w2,h2,x,y,w,h
  188.     END IF
  189.  
  190. IF title=file AND item=openwindow AND m_handle=0 THEN m_handle=form_window(MAIN3,TITLE4,MYCO)
  191. IF title=file AND item=closewindow AND m_handle>0 THEN close_window m_handle : m_handle=0
  192.  
  193. IF title=file AND item=endprog THEN GOTO Pquit:
  194. 'IF title=SYSTEM AND item=newd THEN
  195. '    j=rsrc_gaddr(0,NEWDESK,nde&)
  196. '    POKEW nde&+ob_x,xm
  197. '    POKEW nde&+ob_y,ym
  198. '    POKEW nde&+ob_width,wm
  199. '    POKEW nde&+ob_height,hm
  200. '    j=wind_set(0,WF_NEWDESK,PEEKW(VARPTR(nde&)),PEEKW(VARPTR(nde&)+2),0,0)
  201. '    form_dial 3,0,0,0,0,xm,ym,wm,hm
  202. 'IF (title<>Msystem) OR (Item<>24) THEN GOTO skipck:
  203. 'IF PEEKW(menu&+ob_sizeof*24+ob_state)*mask_checked=0 THEN j=1 : ELSE j=0
  204. 'menu_icheck menu&,24,j
  205.  
  206. 'j=wind_set(0,WF_NEWDESK,0,0,0,0)
  207.  
  208.  
  209. CASE wm_redraw
  210. IF mess(3)=m_handle THEN
  211.     j=wind_update(1)
  212.     j=wind_get(mess(3),wf_firstxywh,xre,yre,wre,hre)
  213.     DO
  214.     IF wre=0 AND hre=0 THEN EXIT LOOP
  215.     j=rsrc_gaddr(0,MAIN3,tree&)
  216.     j=objc_draw(tree&,0,4,xre,yre,wre,hre)
  217.     j=wind_get(mess(3),wf_nextxywh,xre,yre,wre,hre)
  218.     LOOP
  219.     j=wind_update(0)
  220. END IF
  221. menu_tnormal menu&,title,1
  222. CASE wm_sized,wm_moved
  223. IF mess(3)=m_handle THEN
  224. j=rsrc_gaddr(0,MAIN3,tree&)
  225.     j=wind_calc(1,myco,mess(4),mess(5),mess(6),mess(7),x_in,y_in,w_in,h_in)
  226.     POKEW tree&+ob_sizeof*0+ob_x,x_in : REM set form to new value
  227.     POKEW tree&+ob_sizeof*0+ob_y,y_in : REM set form to new value
  228.     POKEW tree&+ob_sizeof*0+ob_width,w_in
  229.     POKEW tree&+ob_sizeof*0+ob_height,h_in
  230.     j=wind_set(mess(3),wf_currxywh,mess(4),mess(5),mess(6),mess(7))
  231.     END IF
  232. CASE wm_closed
  233. close_window(mess(3)) 
  234. IF mess(3)=m_handle THEN m_handle=0
  235. CASE wm_topped
  236. j=wind_set(mess(3),wf_top,tt,0,0,0)
  237. END SELECT
  238. END SUB
  239.  
  240. SUB do_mouse(BYVAL x,BYVAL y,BYVAL button)
  241. STATIC handle,x,y,button,tree&,h,j,xm,ym,wm,hm,bx,by,st,wcel,hcel,ob&,mstate,mflags,ddx,ddy,slid
  242. SHARED m_handle
  243.  
  244. REM what's this? One of the windows has been clicked on
  245. handle=wind_find(x,y)
  246.  
  247.  
  248. REM was it the about form dialogue?
  249. REM if it's mine and mine is open then...
  250. IF (handle<>m_handle) OR (m_handle=0) THEN GOTO mieow:
  251.  
  252. IF handle=m_handle THEN j=rsrc_gaddr(0,MAIN3,tree&)
  253. h=objc_find(tree&,0,4,x,y)
  254.  
  255.  
  256.  
  257. REM The drag and drop part!
  258. IF h<>7 THEN GOTO ddskip:
  259.  
  260. j=wind_get(0,wf_workxywh,XM,YM,WM,HM)
  261. ob&=tree&+ob_sizeof*h
  262. mstate=PEEKW(tree&+h*ob_sizeof+ob_state)
  263. mstate=(mstate AND (NOT mask_selected))+mask_selected
  264. J=objc_change(tree&,h,xm,ym,wm,hm,mstate,1)
  265. ob&=tree&+ob_sizeof*h
  266.  
  267.  
  268. j=objc_offset(tree&,h,wcel,hcel)
  269. graf_dragbox PEEKW(ob&+ob_width),PEEKW(ob&+ob_height),wcel,hcel,xm,ym,wm,hm,ddx,ddy
  270.  
  271. j=form_alert(1,"[4][Dragdrop concluded at|x="+STR$(ddx)+"|y="+STR$(ddy)+"][OK]")
  272.  
  273. mstate=(mstate AND (NOT mask_selected))+mask_normal
  274. J=objc_change(tree&,h,xm,ym,wm,hm,mstate,1)
  275. EXIT SUB
  276.  
  277. ddskip:
  278.  
  279.  
  280. mstate=PEEKW(tree&+h*ob_sizeof+ob_state)
  281. mflags=PEEKW(tree&+h*ob_sizeof+ob_flags)
  282. IF mflags AND mask_touchexit THEN
  283.     close_window handle
  284.     IF handle=m_handle THEN m_handle=0
  285.     EXIT SUB
  286.     END IF
  287. IF (mflags AND mask_selectable)=0 THEN GOTO mieow:
  288. j=mflags AND (mask_rbutton+mask_exit)
  289. SELECT CASE j
  290.     CASE mask_rbutton
  291.     mstate=(mstate AND (NOT mask_selected))+mask_selected
  292.     CASE mask_exit
  293.     mstate=(mstate AND (NOT mask_selected))+mask_selected
  294.     CASE mask_exit+mask_rbutton
  295.     mstate=(mstate AND (NOT mask_selected))+mask_selected
  296.     CASE mask_normal
  297.     mstate=(mstate AND (NOT mask_selected))+(mask_selected-(mstate AND mask_selected))
  298. END SELECT
  299. J=objc_change(tree&,h,xm,ym,wm,hm,mstate,1)
  300. IF (mflags AND mask_exit)=0 THEN GOTO mieow: : REM exit button part
  301. graf_mkstate bx,by,st,j
  302. DO UNTIL objc_find(tree&,0,4,bx,by)<>h OR st=0
  303. graf_mkstate bx,by,st,j
  304. LOOP
  305. mstate=(mstate AND (NOT mask_selected))+mask_normal
  306. J=objc_change(tree&,h,xm,ym,wm,hm,mstate,1)
  307. IF st<>0 THEN mieow:
  308. close_window handle : IF handle=M_handle THEN m_handle=0
  309. EXIT SUB
  310. mieow:
  311. END SUB
  312.  
  313.  
  314.  
  315.  
  316.  
  317. SUB close_window(handle)
  318. STATIC handle
  319. LOCAL j,x,y,w,h,x2,y2,w2,h2
  320. IF handle=0 THEN EXIT SUB
  321. W=10 : H=10
  322. graf_mkstate x,y,0,0
  323. j=wind_get(handle,wf_workxywh,x2,y2,w2,h2)
  324. j=wind_close(handle)
  325. j=wind_delete(handle)
  326. form_dial 2,x,y,w,h,x2,y2,w2,h2
  327. form_dial 3,x,y,w,h,x2,y2,w2,h2
  328. END SUB
  329.  
  330.  
  331.  
  332.  
  333. FUNCTION form_window(BYVAL tree,BYVAL title,BYVAL myco)
  334.  
  335. STATIC mm,j,tree,tree&,x_in,y_in,w_in,h_in,myco,handle
  336. STATIC XSM,YSM,WSM,HSM,xab,yab,wab,hab,title,attl&
  337. LOCAL toolbar&
  338. j=rsrc_gaddr(0,4,toolbar&)
  339.  
  340.  
  341.  
  342.  
  343. WSM=10 : HSM=10
  344. graf_mkstate xsm,ysm,0,0
  345.  
  346. mm=rsrc_gaddr(0,tree,tree&)
  347. form_center tree&,x_in,y_in,w_in,h_in
  348. x_in=(x_in+4) AND &hFFF8 : REM align form window
  349. POKEW tree&+ob_sizeof*0+ob_x,x_in : REM set form to new value
  350. j=wind_calc(0,myco,x_in,y_in,w_in,h_in,xab,yab,wab,hab) : REM what is the size of my form window?
  351.  
  352. handle=wind_create(myco,xab,yab,wab,hab) : REM create window
  353. IF handle<0 THEN form_window=0 : EXIT SUB
  354. j=wind_set(handle,30,PEEKW(VARPTR(toolbar&)),PEEKW(VARPTR(toolbar&)+2),0,0)
  355.  
  356.  
  357. form_dial 0,xsm,ysm,wsm,hsm,x_in,y_in,w_in,h_in
  358. form_dial 1,xsm,ysm,wsm,hsm,x_in,y_in,w_in,h_in
  359.  
  360.  
  361.  
  362.  
  363. REM give my form window a title
  364. IF title>-1 THEN
  365.     j=rsrc_gaddr(5,title,attl&) : REM GET title string
  366.     j=wind_set(handle,wf_name,PEEKW(VARPTR(attl&)),PEEKW(VARPTR(attl&)+2),0,0)
  367.     REM give it to my form_window
  368. END IF
  369.  
  370. j=wind_open(handle,xab,yab,wab,hab)
  371. 'j=objc_draw(tree&,0,10,x_in,y_in,w_in,h_in)
  372. form_window=handle
  373.  
  374. END FUNCTION
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.  
  383. FUNCTION newform_alert(BYVAL button,BYVAL num)
  384. LOCAL addr&,j
  385. j=rsrc_gaddr(5,num,addr&)
  386. POKEW PEEKL(GB+8),button    'int_in
  387. POKEL PEEKL(GB+16),addr&    'addr_in
  388. GEMSYS(52)                    
  389. newform_alert%=PEEKW(PEEKL(GB+20))
  390. END FUNCTION
  391.  
  392.  
  393.  
  394.