'$undeclare ZFILEREQUEST
'global ZFILEREQUEST
'EXTERN _sys_string[32767] as ISTRING

autodefine "off"

$include "windowssdk.inc"

CONST WM_COMMAND = 0x111

WINDOW win
ISTRING filter[544]

TYPE OPENFILENAME
	DEF lStructSize:INT
	DEF hwndOwner:INT
	DEF hInstance:INT
	DEF lpstrFilter:POINTER
	DEF lpstrCustomFilter:POINTER
	DEF nMaxCustFilter:INT
	DEF nFilterIndex:INT
	DEF lpstrFile:POINTER
	DEF nMaxFile:INT
	DEF lpstrFileTitle:POINTER
	DEF nMaxFileTitle:INT
	DEF lpstrInitialDir:POINTER
	DEF lpstrTitle:POINTER
	DEF flags:INT
	DEF nFileOffset:WORD
	DEF nFileExtension:WORD
	DEF lpstrDefExt:POINTER
	DEF lCustData:INT
	DEF lpfnHook:INT
	DEF lpTemplateName:POINTER
ENDTYPE

TYPE OPENFILENAMEEX
	DEF ofn as OPENFILENAME
	DEF pvReserved as POINTER
	DEF dwReserved as UINT
	DEF FlagsEx as UINT
ENDTYPE

SETID "OFN_ALLOWMULTISELECT" , 0x200
SETID "OFN_CREATEPROMPT" , 0x2000
SETID "OFN_DONTADDTORECENT" , 0x2000000
SETID "OFN_ENABLEHOOK" , 0x20
SETID "OFN_ENABLEINCLUDENOTIFY" , 0x400000
SETID "OFN_ENABLESIZING" , 0x800000
SETID "OFN_ENABLETEMPLATE" , 0x40
SETID "OFN_ENABLETEMPLATEHANDLE" , 0x80
SETID "OFN_EX_NOPLACESBAR" , 0x1
SETID "OFN_EXPLORER" , 0x80000
SETID "OFN_EXTENSIONDIFFERENT" , 0x400
SETID "OFN_FILEMUSTEXIST" , 0x1000
SETID "OFN_FORCESHOWHIDDEN" , 0x10000000
SETID "OFN_HIDEREADONLY" , 0x4
SETID "OFN_LONGNAMES" , 0x200000
SETID "OFN_NOCHANGEDIR" , 0x8
SETID "OFN_NODEREFERENCELINKS" , 0x100000
SETID "OFN_NOLONGNAMES" , 0x40000
SETID "OFN_NONETWORKBUTTON" , 0x20000
SETID "OFN_NOREADONLYRETURN" , 0x8000
SETID "OFN_NOTESTFILECREATE" , 0x10000
SETID "OFN_NOVALIDATE" , 0x100
SETID "OFN_OVERWRITEPROMPT" , 0x2
SETID "OFN_PATHMUSTEXIST" , 0x800
SETID "OFN_READONLY" , 0x1
SETID "OFN_SHAREAWARE" , 0x4000
SETID "OFN_SHAREFALLTHROUGH" , 2
SETID "OFN_SHARENOWARN" , 1
SETID "OFN_SHAREWARN", 0
SETID "OFN_SHOWHELP" , 0x10
SETID "OFN_USEMONIKERS" , 0x1000000

DECLARE zFileRequest(title as STRING,parent as POINTER,nOpen as INT,OPT filter as STRING,OPT ext as STRING,OPT flags as INT,OPT initdir as STRING),HEAP
DECLARE ofnIBHookProc2(hdlg as UINT,uiMsg as UINT,wParam as UINT, lParam as UINT),INT

filter="Windows Bitmap (*.bmp)|*.bmp|C-style Header (*.h)|*.h|DirectDraw Surface (*.dds)|*.dds|JPEG (*.jpg)|*.jpg|"
filter+="JPEG (*.jpe)|*.jpe|JPEG (*.jpeg)|*.jpeg|Palette (*.pal)|*.pal|ZSoft PCX (*.pcx)|*.pcx|"
filter+="Portable Network Graphics (*.png)|*.png|PNM (*.pbm)|*.pbm|PNM (*.pgm)|*.pgm|PNM (*.ppm)|*.ppm|Adobe Photoshop (*.psd)|*.psd|Raw Data (*.raw)|*.raw|"
filter+="Silicon Graphics (*.sgi)|*.sgi|Silicon Graphics (*.bw)|*.bw|Silicon Graphics (*.rgb)|*.rgb|Silicon Graphics (*.rgba)|*.rgba|"
filter+="Targa (*.tga)|*.tga|TIF (*.tif)|*.tif|TIF (*.tiff)|*.tiff||"

OPENWINDOW win,0,0,800,600,@MINBOX|@MAXBOX|@SIZE,0,"Simple Window",&main
	SETCAPTION win,"Filter String Length:"+str$(len(filter))

	zFileRequest("Save Image",win,0,filter,"jpg",0,GETSTARTPATH)

WAITUNTIL IsWindowClosed(win)
	END

SUB main(),INT
	SELECT @MESSAGE
CASE @IDCREATE
	CENTERWINDOW win
CASE @IDCLOSEWINDOW
	CLOSEWINDOW win
ENDSELECT
RETURN 0
ENDSUB

SUB zFileRequest(title as STRING,parent as POINTER,nOpen as INT,OPT filter as STRING,OPT ext as STRING,OPT flags as INT,OPT initdir as STRING)
	OPENFILENAMEEX ofn
	POINTER pTest,p1,p2
	POINTER mem,copymem
	INT bMulti,nReturn,x
	CHAR filtercopy[544]
	ISTRING strPath[260]
	ZeroMemory(ofn,LEN(OPENFILENAMEEX))
	'memstr = AllocHeap(260)
	'_sys_string = ""
	filtercopy[0] = 0
	mem = 0
	copymem = 0
	IF (GetVersion() & 0x000000FF) >= 5
		ofn.ofn.lStructSize = LEN(OPENFILENAMEEX)
	ELSE
		ofn.ofn.lStructSize = LEN(OPENFILENAME)
	ENDIF
	ofn.ofn.lpstrTitle = title
	IF parent <> 0 THEN ofn.ofn.hwndOwner = #<WINDOW>parent.hwnd

	pTest = filter
	IF pTest <> 0
		x = 0
		DO
			IF filter[x] = ASC("|") THEN filtercopy[x] = 0 ELSE filtercopy[x] = filter[x]
			x++
			IF x > 543 THEN filter[x] = 0
		UNTIL filter[x] = 0
		filtercopy[x] = 0
		filtercopy[x+1] = 0
	ENDIF
	ofn.ofn.lpstrFilter = filtercopy
	ofn.ofn.lpstrDefExt = ext
	ofn.ofn.lpstrInitialDir = initdir
	ofn.ofn.lpfnHook = &OFNIBHookProc2
	ofn.ofn.flags = @OFN_HIDEREADONLY | @OFN_EXPLORER | @OFN_ENABLEHOOK | @OFN_NONETWORKBUTTON
	ofn.ofn.flags = ofn.ofn.flags | flags
	IF (flags & @OFN_ALLOWMULTISELECT) = @OFN_ALLOWMULTISELECT
		bMulti = 1
		mem = AllocHeap(30000)
		copymem = AllocHeap(30000)
		ofn.ofn.lpstrFile = mem
		ofn.ofn.nMaxFile = 32767
	ELSE
		bMulti = 0
		copymem = AllocHeap(544)
		ofn.ofn.lpstrFile = copymem
		ofn.ofn.nMaxFile = 544
	ENDIF
	IF nOpen = 0 THEN ofn.ofn.flags = ofn.ofn.flags | @OFN_OVERWRITEPROMPT

	IF nOpen
		nReturn = GetOpenFileNameA(ofn)		
	ELSE
		nReturn = GetSaveFileNameA(ofn)
	ENDIF
	IF(bMulti <> 0)
		IF nReturn <> 0
			p1 = mem
			p2 = mem
			WHILE #<char>p1 <> 0:p1 = p1 + 1:ENDWHILE
			p1++
			IF (p1 - p2) > ofn.ofn.nFileOffset
				lstrcpynA(copymem,mem,544)
				lstrcatA(copymem,"|")
			ELSE
				strPath = #<STRING>p2
				IF len(strPath) AND ( strPath[len(strPath)-1] <> ASC("\\") )
					strPath = strPath + "\\"
				ENDIF
				#<STRING>copymem = strPath
				p2 = copymem
				p2 = p2 + lstrlenA(strPath)
				#<STRING>p2 = #<STRING>p1
				p2 = p2 + lstrlenA(p1)
				#<CHAR>p2 = "|"
				p2++
				#<CHAR>p2 = 0
				p1=p1+lstrlenA(p1)+1
				do
					#<STRING>p2 = strPath
					p2 = p2 + lstrlenA(strPath)
					#<STRING>p2 = #<STRING>p1
					p2 = p2 + lstrlenA(p1)
					#<CHAR>p2 = "|"
					p2++
					#<CHAR>p2 = 0
					p1=p1+lstrlenA(p1)+1
				until #<char>p1 = 0
			ENDIF
		ENDIF
		FreeHeap(mem)
	ENDIF
IF nReturn = 0 THEN #<STRING>copymem = ""
RETURN #<STRING>copymem
ENDSUB

SUB ofnIBHookProc2(hdlg as UINT,uiMsg as UINT,wParam as UINT, lParam as UINT)
	WINDOW wTemp
	INT thWnd
IF uiMsg = 0x110
	wTemp.hwnd = GetParent(hDlg)
	CENTERWINDOW wTemp
	thWnd = FindWindowExA(wTemp.hWnd,0,"SHELLDLL_DefView","")
IF thWnd
	SendMessage thWnd,WM_COMMAND,0x702E,0
ENDIF
ENDIF
RETURN 0
ENDSUB
