;*************************************
;* File dialog tool                  *
;* Written By R Collier              *
;* #Developer/PhatBoi
;*************************************

.include 'taort'
.include 'ave/toolkit/toolkit'
.include 'ave/toolkit/rsc/rsc'

tool 'ave/avo/gdg/std/filedlg',VP,TF_MAIN, 8096, 0

	; we return filename, filedir, filter
	; the defp maps filestr to p0, dirstr to p1 etc.
	ent		p0-p2 i0:p0-p2 i0
	
	defbegin 0
	
	defp	filestr,dirstr,filtstr,    file,filedlg,filelayout,filecnt,ftkit,fprp,fave,fapp,favo,fmsg,fname,fdir,ffilt
	defi	status,    fw,fh,fevt,bytes

	; get Ave
	qcall sys/kn/dev/lookup,(avename.p:fave,fapp)
	
	; open ave
	ncall fave,open,(fave,fapp,0,0:fapp)
	
	; open toolkit
	ncall fave,opentoolkit,(fave:ftkit)
	
	; get properties
	ncall fapp,getprop,(fapp:fprp)
	
	; Use scrollpane layout manager
	qcall ave/layout/scrollpane/open,(0,0:filelayout)
	
	; create filedlg
	ncall ftkit,createfile,(ftkit,fprp,0.p,0.p,0,0,status:file)

	; get fields from dialog
	ncall file,getfields,(file:fdir,fname,ffilt)
	
	; set default values
	if.p (filestr!=NULL)
		ncall fname,settext,(fname,filestr:i~)
	endif
   	if.p (dirstr!=NULL)
		ncall fdir,settext,(fdir,dirstr:i~)
	endif
	if.p (filtstr!=NULL)
		ncall ffilt,settext,(ffilt,filtstr:i~)
	endif
			
	; create window
	ncall ftkit,createdialog,(ftkit,fprp,appname.p,0.p,0,0,FDI_INNER|FDI_CLOSE|FDI_BORDER|FDI_TITLE|FDI_CONTENT|FDI_DRAG|FDI_RESIZE|FDI_MIN|FDI_MAX:filedlg)
	
	; get windows container
	ncall filedlg,getgadgets,(filedlg:p~,p~,filecnt)
	
	; add layout to container
	ncall filecnt,addlayout,(filecnt,filelayout:-)
	
	; add filedialog to window
	ncall filecnt,add,(filecnt,file,0:-)
	
	; setup dialog size
	ncall filedlg,getprefsize,(filedlg:fw,fh)
	ncall filedlg,change,(filedlg,0,0,fw,fh,CM_NONE:-)
	
	; add window to application
	ncall fapp,add,(fapp,filedlg,0:-)

	;update window
	ncall filedlg,update,(filedlg:-)
	
	; Refresh file list
	ncall file,readdir,(file:i~)
	
	;event loop
	repeat
		;wait till msg arrives
		ncall fapp,getevent,(fapp,-1.l:favo,fmsg,fevt)
		continueif favo=0
						
		;pass out to event handler
		ncall favo,event,(favo,fmsg,fevt:-)

		; Window close causes same as cancel button
		if (favo = filedlg && fevt = EV_DIALOG_CLOSE)
			; Set status to CANCEL
			cpy		0,status
			
			; set to close
			cpy EV_USER+00,fevt
		endif
		
		; File OK button pressed
		if (favo = file && fevt = EV_FILE_OK)
			
			; get dir from text field
			qcall lib/free,(dirstr:-)
			ncall fdir,gettextsize,(fdir:bytes,i~)
			qcall lib/malloc,(bytes:dirstr)
			ncall fdir,gettext,(fdir,dirstr.p:-)
			
			; get name from text field
			qcall lib/free,(filestr:-)
			ncall fname,gettextsize,(fname:bytes,i~)
			qcall lib/malloc,(bytes:filestr)
			ncall fname,gettext,(fname,filestr.p:-)
			
			; get filter from text field
			qcall lib/free,(filtstr:-)
			ncall ffilt,gettextsize,(ffilt:bytes,i~)
			qcall lib/malloc,(bytes:filtstr)
			ncall ffilt,gettext,(ffilt,filtstr.p:-)
			
			; Set status to OK
			cpy		1,status
			
			; set to close
			cpy EV_USER+00,fevt
		endif;
		
		if (favo = file && fevt = EV_FILE_CANCEL)
			; set status to cancel
			cpy		0,status
			
			; set to close
			cpy EV_USER+00,fevt
		endif;			
				
		;free event
		ncall fave,freeevent,(fave,fmsg:-)
	
	until (fevt=EV_USER+00)
	
	; close dialog
	qcall ave/avo/close,(file:-)
	
	;close layout manager
	qcall ave/avo/close,(filelayout:-)
	
	; close toolkit
	ncall fave,closetoolkit,(fave,ftkit:-)
	
	; close application
	ncall fave,close,(fave,fapp:i~)
			
	ret	
	
defendnz
	
	data

avename:
	dc.b '/device/ave/'
appname:
	dc.b 'File Requester',0

toolend
.end
