Code archives/File Utilities/Search Tool

This code has been declared by its author to be Public Domain code.

Download source code

Search Tool by JoshK2009
Windows search tool that actually works
Framework maxgui.drivers
Import brl.eventqueue
Import "search.bmx"
Import "PathEdit.bmx"

AppTitle="Search Tool"

Global window:TGadget=CreateWindow(AppTitle,0,0,600,400,,WINDOW_TITLEBAR|WINDOW_STATUS|WINDOW_RESIZABLE|WINDOW_CENTER)

Local panel:TGadget=CreatePanel(0,0,182,400,window)
SetGadgetLayout panel,1,0,1,0

Local x:Int=2
Local y:Int=2

Global Gadget_Token:TGadget
Global Gadget_Folder:TGadget
Global Gadget_Extensions:TGadget
Global Gadget_Search:TGadget
Global Gadget_Results:TGadget
Global Gadget_Recursive:TGadget
Global Gadget_Contents:TGadget
Global Gadget_CaseSensitive:TGadget

CreateLabel("Search for:",x,y,120,16,panel)
y:+16
Gadget_Token=CreateTextField(x,y,180,18,panel)
y:+22
ActivateGadget Gadget_Token

CreateLabel("File extensions:",x,y,180,16,panel)
y:+16
Gadget_Extensions=CreateTextField(x,y,180,18,panel)
y:+22

CreateLabel("In folder:",x,y,180,16,panel)
y:+16
Gadget_Folder=CreatePathEdit(x,y,180,18,panel,PATHEDIT_DIR|PATHEDIT_READONLY)

y:+22
Gadget_Recursive=CreateButton("Search subfolders",x,y,180,18,panel,BUTTON_CHECKBOX)
SetButtonState Gadget_Recursive,1

y:+22
Gadget_Contents=CreateButton("Search file contents",x,y,180,18,panel,BUTTON_CHECKBOX)

y:+22
Gadget_CaseSensitive=CreateButton("Case-sensitive",x,y,180,18,panel,BUTTON_CHECKBOX)

y:+22
Gadget_Search=CreateButton("Search",x,y,180,26,panel,BUTTON_OK)

y=2
Gadget_Results=CreateListBox(x+180,y,window.ClientWidth()-x-(x+180),window.ClientHeight()-2*y,window)
SetGadgetLayout Gadget_Results,1,1,1,1

'SearchFolder:String[](path:String,token:String,extensions:String[]=Null,options:Int=SEARCH_RECURSIVE,results:String[]=Null)

Global popupmenu:TGadget=CreateMenu("",0,Null)
CreateMenu("Open file",0,popupmenu)
CreateMenu("Open containing folder",0,popupmenu)

Repeat

	WaitEvent()
	Select EventID()
	Case EVENT_WINDOWCLOSE
		End

	Case EVENT_MENUACTION
		Select String(GadgetText(TGadget(EventSource())))
		Case "Open file"
			OpenURL String(EventExtra())
		Case "Open containing folder"
			OpenURL ExtractDir(String(EventExtra()))
		EndSelect
		
	Case EVENT_GADGETMENU
		Select EventSource()
		Case Gadget_Results
			PopupWindowMenu window,popupmenu,GadgetItemExtra(Gadget_results,EventData())
			
		EndSelect
		
	Case EVENT_GADGETACTION
		Select EventSource()

		Case Gadget_Results
			OpenURL String(GadgetItemExtra(Gadget_results,EventData()))
			
		Case Gadget_Search
			Local results:String[]
			Local path:String
			Local token:String
			Local extensions:String[]
			Local options:Int
			Local n:Int
			
			ClearGadgetItems(Gadget_Results)
			
			If ButtonState(Gadget_Recursive) options=options|SEARCH_RECURSIVE
			If ButtonState(Gadget_Contents) options=options|SEARCH_CONTENTS
			If ButtonState(Gadget_CaseSensitive) options=options|SEARCH_CASESENSITIVE
			
			path=GadgetText(Gadget_Folder)
			
			token=GadgetText(Gadget_Token)
			
			extensions=GadgetText(Gadget_Extensions).split(",")
			For n=0 To extensions.length-1
				extensions[n]=extensions[n].Trim()
			Next
			If extensions.length=1
				If extensions[0]="" extensions=Null
			EndIf
			
			SetStatusText window,"Searching..."
			results=SearchFolder(path,token,extensions,options)
			SetStatusText window,results.length+" files found"
			
			
			For n=0 To results.length-1
				AddGadgetItem Gadget_Results,StripDir(results[n]),0,-1,results[n],results[n]
			Next
			
			ActivateGadget Gadget_Results
			
		EndSelect
	EndSelect

Forever

Comments

JoshK2009
PathEdit.bmx:
SuperStrict

Import MaxGui.Drivers
Import brl.retro
Import "FileRequester.bmx"

Rem
Local window:TGadget

window=CreateWindow("pathedit Example",40,40,320,240)

Local label:TGadget
Local pathedit:TPathEdit
Local x:Int=4,y:Int=4

label=CreateLabel("Pick File:",x,y,60,18,window)
SetGadgetLayout label,1,0,1,0
pathedit=CreatePathEdit(x+60,y,200,20,window,PATHEDIT_FILE|PATHEDIT_STRIPDIR|PATHEDIT_CHOICES)
SetGadgetLayout pathedit,1,1,1,0


While True
	WaitEvent 
	Print CurrentEvent.ToString()
	Select EventID()
		Case EVENT_WINDOWCLOSE
			End
	End Select
Wend
EndRem

'-------------------------------------------------------------------

Const PATHEDIT_FILE:Int=0
Const PATHEDIT_DIR:Int=1
Const PATHEDIT_STRIPDIR:Int=2
Const PATHEDIT_CHOICES:Int=4
Const PATHEDIT_READONLY:Int=8

Type TPathEdit Extends TProxygadget
	
	Field panel:TGadget
	Field textfield:TGadget
	Field button:TGadget
	Field style:Int
	Field extensions:String="All Files:*"
	Field value:String
	Field choices:TMap
	Field folder:String
	
	Method Cleanup()
		RemoveHook(EmitEventHook,EventHook,Self)
		Super.cleanup()
	EndMethod
	
	Method InsertItem:Int(index%,text$,tip$,icon%,extra:Object,flags%)
		Return textfield.InsertItem(index,text,tip,icon,extra,flags)
	EndMethod	
	
	Method GetText$()
		Return textfield.GetText()
	EndMethod
	
	Method SetText:Int(text$)
		If PATHEDIT_CHOICES & style
			If Not choices
				choices=New TMap
			EndIf
			If Not choices.valueforkey(text)
				choices.insert(text,text)
				ClearGadgetItems(textfield)
				For Local key:String=EachIn choices.keys()
					AddGadgetItem(textfield,key)
				Next
			EndIf
		EndIf
		value=text
		Return textfield.SetText(text)
	EndMethod

	Method SetTextColor(r:Int,g:Int,b:Int)
		Local gadget:TGadget
		Super.SetTextColor(r,g,b)
		textfield.SetTextColor(r,g,b)
		button.SetTextColor(r,g,b)
	EndMethod
	
	Method SetColor(r:Int,g:Int,b:Int)
		Local gadget:TGadget
		Super.SetColor(r,g,b)
		textfield.SetColor(r,g,b)
		button.SetColor(r,g,b)
	EndMethod
	
	Function Create:TPathEdit(x:Int,y:Int,width:Int,height:Int,group:TGadget,style:Int=0)
		Local pathedit:TPathEdit
		
		pathedit=New TPathEdit
		
		pathedit.panel=CreatePanel(x,y,width,height,group)
		
		If PATHEDIT_CHOICES & style
			If PATHEDIT_READONLY & style
				pathedit.textfield=CreateComboBox(0,0,pathedit.panel.ClientWidth()-pathedit.panel.ClientHeight(),pathedit.panel.ClientHeight(),pathedit.panel)
			Else
				pathedit.textfield=CreateComboBox(0,0,pathedit.panel.ClientWidth()-pathedit.panel.ClientHeight(),pathedit.panel.ClientHeight(),pathedit.panel,COMBOBOX_EDITABLE)
			EndIf
			?win32
			SendMessageA(QueryGadget(pathedit.textfield,QUERY_HWND),CB_SETITEMHEIGHT,-1,height);
			?
		Else
			pathedit.textfield=CreateTextField(0,0,pathedit.panel.ClientWidth()-pathedit.panel.ClientHeight(),pathedit.panel.ClientHeight(),pathedit.panel)
		EndIf
		
		SetGadgetLayout pathedit.textfield,1,1,1,1
		
		pathedit.style=style
		
		pathedit.button=CreateButton("...",pathedit.panel.ClientWidth()-pathedit.panel.ClientHeight(),0,pathedit.panel.ClientHeight(),pathedit.panel.ClientHeight(),pathedit.panel)		
		SetGadgetLayout pathedit.button,0,1,1,1
		
		pathedit.setproxy(pathedit.panel)
		SetGadgetFilter(pathedit.textfield,Filter,pathedit)
				
		AddHook(EmitEventHook,EventHook,pathedit)
		Return pathedit
	EndFunction
	
	Function Filter:Int(event:TEvent,context:Object)
		Local pathedit:TPathEdit=TPathEdit(context)
		If PATHEDIT_READONLY & pathedit.style
			Return 0
		Else
			Return 1
		EndIf
	EndFunction
	
	Function EventHook:Object(id:Int,data:Object,context:Object)
		Local event:TEvent
		Local pathedit:TPathEdit
		
		event=TEvent(data)
		If event
			pathedit=TPathEdit(context)
			If pathedit
				Select event.id
				Case EVENT_GADGETLOSTFOCUS
					If event.source=pathedit.textfield
						Local text$
						text=GadgetText(pathedit.textfield)
						If text<>pathedit.value
							pathedit.value=text
							EmitEvent CreateEvent(EVENT_GADGETACTION,pathedit,0,0,0,0,text)
						EndIf
						Return Null
					EndIf				
				Case EVENT_GADGETACTION
					Select event.source
					Case pathedit.textfield
						'If PATHEDIT_CHOICES And pathedit.style
						'	Local text:String
						'	text=GadgetText(pathedit.textfield)
						'	If text<>pathedit.value
						'		pathedit.value=text
						'		EmitEvent CreateEvent(EVENT_GADGETACTION,pathedit,0,0,0,0,text)
						'	EndIf
						'EndIf
						Return Null
					Case pathedit.button
						Local file:String
						If PATHEDIT_DIR & pathedit.style
							file=RequestDir("Select Folder",GadgetText(pathedit.textfield))
						Else
							file=GadgetText(pathedit.textfield)
							If file=""
								If pathedit.folder
									file=pathedit.folder+"\"
								EndIf
							Else
								If PATHEDIT_STRIPDIR & pathedit.style
									file=pathedit.folder+"\"+file
								EndIf
							EndIf
							file=RequestFile("Open File",pathedit.extensions,0,file)
							If file
								pathedit.folder=ExtractDir(file)
							EndIf
							If PATHEDIT_STRIPDIR & pathedit.style
								file=StripDir(file)
							EndIf
						EndIf
						If file
							If file<>pathedit.value
								pathedit.value=file
								SetGadgetText pathedit,file
								EmitEvent CreateEvent(EVENT_GADGETACTION,pathedit,0,0,0,0,file)
							EndIf
						EndIf
						Return Null
					EndSelect
				EndSelect
			EndIf
		EndIf
		Return data
	EndFunction
	
EndType

Rem
bbdoc:
EndRem
Function CreatePathEdit:TPathEdit(x:Int,y:Int,width:Int,height:Int,group:TGadget,flags:Int=0)
	Return Tpathedit.Create(x,y,width,height,group,flags)
EndFunction

Rem
bbdoc:
EndRem
Function SetPathEditExtensions(pathedit:TPathEdit,extensions:String)
	pathedit.extensions=extensions
EndFunction



JoshK2009
search.bmx:
SuperStrict

Import brl.filesystem
'Import brl.standardio

Rem
Local file:String
Local results:String[]

results=SearchFolder(AppDir,"GCStackTop",["bmx"],SEARCH_RECURSIVE|SEARCH_CONTENTS)
If results
	Print results.length+" search results found:"
	For file=EachIn results
		Print file
	Next
EndIf
EndRem

Const SEARCH_RECURSIVE:Int=1
Const SEARCH_CONTENTS:Int=2
Const SEARCH_CASESENSITIVE:Int=4

Function SearchFolder:String[](path:String,token:String,extensions:String[]=Null,options:Int=SEARCH_RECURSIVE,results:String[]=Null)
	Local dir:String[],ext:String,n:Int,i:Int
	
	If path.Trim()="" path=CurrentDir()
	
	dir=LoadDir(path)	
	If Not dir Return results
	
	If Not results results=New String[0]

	For n=0 To dir.length-1
		Select FileType(path+"/"+dir[n])
		Case 1
			If extensions
				ext=ExtractExt(dir[n])
				If Not (SEARCH_CASESENSITIVE & options)
					ext=ext.tolower()
				EndIf
				For i=0 To extensions.length-1
					If extensions[i]=ext
						If SearchFile(path+"/"+dir[n],token,options)
							results=results[..results.length+1]
							results[results.length-1]=path+"/"+dir[n]
						EndIf
						Exit
					EndIf
				Next
			Else
				If SearchFile(path+"/"+dir[n],token,options)
					results=results[..results.length+1]
					results[results.length-1]=path+"/"+dir[n]
				EndIf
			EndIf
		Case 2
			If (SEARCH_RECURSIVE & options)
				results=SearchFolder(path+"/"+dir[n],token,extensions,options,results)
			EndIf
			'If Not (SEARCH_CONTENTS & options)
			If Not extensions
				If SearchFile(path+"/"+dir[n],token,options)
					results=results[..results.length+1]
					results[results.length-1]=path+"/"+dir[n]
				EndIf
			EndIf
		EndSelect
	Next
	Return results
EndFunction

Function SearchFile:Int(path:String,token:String,options:Int=0)
	Local stream:TStream,s:String
	Local spath:String
	
	If Not (SEARCH_CASESENSITIVE & options)
		token=token.tolower()
	EndIf
	
	spath=path
	If Not (SEARCH_CASESENSITIVE & options)
		spath=spath.tolower()
	EndIf
	spath=StripAll(spath)
	If spath.contains(token) Return True
	
	If (SEARCH_CONTENTS & options)
		stream=ReadFile(path)
		If Not stream Return False
		While Not stream.Eof()
			s=stream.ReadLine()
			If Not (SEARCH_CASESENSITIVE & options)
				s=s.tolower()
			EndIf
			If s.contains(token)
				stream.close()
				Return True
			EndIf
		Wend
		stream.close()
	'Else
	'	If Not (SEARCH_CASESENSITIVE & options)
	'		path=path.tolower()
	'	EndIf
	'	path=StripDir(path)
	'	If path.contains(token) Return True
	EndIf
	Return False
EndFunction



JoshK2009
FileRequester:
Strict

Import brl.system
Import brl.standardio
Import pub.win32
Import maxgui.maxgui

Private

Extern "win32"
	Function GetOpenFileNameA:Int(of:Byte Ptr)
	Function GetSaveFileNameA:Int(of:Byte Ptr)
	Function CommDlgExtendedError:Int()
	Function GetDlgItem(hDlg:Int,nIDDlgItem:Int)
	Function GetParent:Int(hwnd:Int)
	Function SetWindowTextA(hwnd:Int,text$z)
EndExtern

Public

'requestfileex("Open file")
'GCCollect()
'End


'--------------------------------------------------
'Examples
'--------------------------------------------------
Rem
'Print RequestFile("Open Sesame","All Files:*;My File Format (*.mff):mff;Windows Bitmap (*.bmp):bmp",0,"c:/")
Print RequestFileEx("Open Sesame","All Files:*;My File Format (*.mff):mff;Windows Bitmap (*.bmp):bmp",1,"c:/",Null,Hook,"&Options")

Function Hook()
	Notify "Your stuff goes here."
EndFunction
EndRem
'--------------------------------------------------
'
'--------------------------------------------------


Rem
'=======================================================================
'Original unmolested version used for testing
'=======================================================================
Function RequestFile$(text$,exts$="",save_flag=False,path$="")
	Local result
	Local of:OPENFILENAME
	Local file$,dir$

	'Fix path
	path=path.Replace( "/","\" )
	Local i=path.FindLast( "\" )
	If i<>-1
		dir=path[..i]
		file=path[i+1..]
	Else
		file=path
	EndIf
	
	'Calculate extension string
	Local ext$,defext,p,q
	p=path.Find(".")
	If (p>-1)
		ext=","+path[p+1..].toLower()+","
		Local exs$=exts.toLower()
		exs=exs.Replace(":",":,")
		exs=exs.Replace(";",",;")
		p=exs.find(ext)
		If p>-1
			Local q=-1
			defext=1
			While True
				q=exs.find(";",q+1)
				If q>p Exit
				If q=-1 defext=0;Exit
				defext:+1
			Wend
		EndIf
	EndIf
	If exts
		If exts.Find(":")=-1
			exts="Files~0*."+exts
		Else
			exts=exts.Replace(":","~0*.")
		EndIf
		exts=exts.Replace(";","~0")
		exts=exts.Replace(",",";*.")+"~0"
	EndIf
	
	of=New OPENFILENAME
	of.lpstrTitle=text.tocstring()
	of.lpstrInitialDir=dir.tocstring()
	of.lpstrFilter=exts.tocstring()

	'Flags
	of.Flags=OFN_HIDEREADONLY|OFN_NOCHANGEDIR
	If save_flag
		of.lpstrDefExt=of.lpstrFilter
		of.Flags:|OFN_OVERWRITEPROMPT
	Else
		of.Flags:|OFN_FILEMUSTEXIST
	EndIf
	
	'Return string array
	Local lpstrFile:Byte[4096]
	of.lpstrFile=lpstrFile
	of.nMaxFile=4095

	Local cs:Byte Ptr
	cs=file.tocstring()
	MemCopy lpstrFile,cs,file.length
	MemFree cs
	
	If save_flag
		result=GetSaveFileNameA(of)
	Else
		result=GetOpenFileNameA(of)
	EndIf
	
	MemFree of.lpstrTitle
	MemFree of.lpstrInitialDir
	MemFree of.lpstrFilter
	
	If result Return String.FromCString(lpstrFile)
EndFunction
'=======================================================================
'
'=======================================================================
EndRem

'=======================================================================
'Whored out version
'=======================================================================
Function RequestFile$(text$,exts$="",save_flag=False,path$="",owner:TGadget=Null,hook()=Null,helpbuttontext$="Help")
	Rem
	Local parent:TGadget
	Local s:String
	parent=owner
	While parent
		DisableGadget(parent)
		parent=GadgetGroup(parent)
	Wend
	s=RequestFile(text,exts,save_flag,path)
	parent=owner
	While parent
		EnableGadget(parent)
		parent=GadgetGroup(parent)
	Wend
	If owner ActivateGadget(owner)
	Return s	
	EndRem
		
	Local result
	Local of:OPENFILENAME
	Local file:String,dir:String
	Local parent:TGadget

	owner=GadgetWindow(ActiveGadget())

	parent=owner
	If parent
		For Local gadget:TGadget=EachIn parent.kids
			If GadgetClass(gadget)=GADGET_WINDOW DisableGadget gadget
		Next
	EndIf
	While parent
		DisableGadget(parent)
		parent=GadgetGroup(parent)
	Wend
	
	'Fix path
	path=path.Replace( "/","\" )
	Local i=path.FindLast( "\" )
	If i<>-1
		dir=path[..i]
		file=path[i+1..]
	Else
		file=path
	EndIf
	
	'Calculate extension string
	Local ext$,defext,p,q
	p=path.Find(".")
	If (p>-1)
		ext=","+path[p+1..].toLower()+","
		Local exs$=exts.toLower()
		exs=exs.Replace(":",":,")
		exs=exs.Replace(";",",;")
		p=exs.find(ext)
		If p>-1
			Local q=-1
			defext=1
			While True
				q=exs.find(";",q+1)
				If q>p Exit
				If q=-1 defext=0;Exit
				defext:+1
			Wend
		EndIf
	EndIf
	If exts
		If exts.Find(":")=-1
			exts="Files~0*."+exts
		Else
			exts=exts.Replace(":","~0*.")
		EndIf
		exts=exts.Replace(";","~0")
		exts=exts.Replace(",",";*.")+"~0"
	EndIf
	
	of=New OPENFILENAME
	of.lpstrTitle=text.tocstring()
	of.lpstrInitialDir=dir.tocstring()
	of.lpstrFilter=exts.tocstring()
	
	If owner
		of.hwndowner=QueryGadget(owner,QUERY_HWND)
	EndIf
	
	'Flags
	of.Flags=OFN_HIDEREADONLY|OFN_NOCHANGEDIR
	If save_flag
		of.lpstrDefExt=of.lpstrFilter
		of.Flags:|OFN_OVERWRITEPROMPT
	Else
		of.Flags:|OFN_FILEMUSTEXIST
	EndIf
	
	'Add hook
	If hook
		RequestFileHook=hook
		RequestFileHelpButtonText=helpbuttontext
		of.lpfnHook=lpfnHook 
		of.Flags:|OFN_EXPLORER|OFN_ENABLEHOOK|OFN_SHOWHELP
	EndIf
	
	'Return string array
	Local lpstrFile:Byte[4096]
	Local cs:Byte Ptr
	If file
		cs=file.tocstring()
		MemCopy lpstrFile,cs,file.length
	EndIf
	
	of.lpstrFile=lpstrFile
	of.nMaxFile=4095
	
	If save_flag
		result=GetSaveFileNameA(of)
	Else
		result=GetOpenFileNameA(of)
	EndIf
	
	If result
		file=String.FromCString(lpstrFile)
	Else
		file=""
	EndIf
	
	MemFree cs
	MemFree of.lpstrTitle
	MemFree of.lpstrInitialDir
	MemFree of.lpstrFilter

	parent=owner
	For Local gadget:TGadget=EachIn parent.kids
		If GadgetClass(gadget)=GADGET_WINDOW EnableGadget gadget
	Next
	While parent
		EnableGadget(parent)
		parent=GadgetGroup(parent)
	Wend
	If owner ActivateGadget(owner)
	
	Return file
EndFunction

Private

Function GadgetWindow:TGadget(gadget:TGadget)
	While gadget
		If GadgetClass(gadget)=GADGET_WINDOW Return gadget
		gadget=GadgetGroup(gadget)
	Wend
	Return Null
EndFunction

Public

'=======================================================================
' ****ing Windows Madness 
'=======================================================================

Private

Global RequestFileHook()
Global RequestFileHelpButtonText$

Function lpfnHook:Int(hwnd:Int,uMsg:Int,lp:Int,pData:Byte Ptr) "win32"
	Local hdlg:Int
	Const CDN_HELP=-605
	Select uMsg
		Case WM_INITDIALOG
			hdlg=GetDlgItem(GetParent(hwnd),$040e)
			SetWindowTextA(hdlg,RequestFileHelpButtonText)
		Case WM_NOTIFY
			If pData<>Null
				Local o:OFNOTIFY=New OFNOTIFY
				MemCopy Varptr o.hwndFrom,pData,12
				If o.code=CDN_HELP
					hwnd=GetParent(hwnd)
					EnableWindow(hwnd,0)
					RequestFileHook()
					EnableWindow hwnd,1
					SetFocus hwnd
				EndIf
			EndIf
	EndSelect
	Return 0
EndFunction

Type NMHDR
	Field hwndFrom:Int
	Field idFrom:Int
	Field code:Int
EndType

Type OFNOTIFY Extends NMHDR
	Field lpOFN:Byte Ptr
	Field pszFile:Byte Ptr
EndType

Const OFN_READONLY                 =$00000001
Const OFN_OVERWRITEPROMPT          =$00000002
Const OFN_HIDEREADONLY             =$00000004
Const OFN_NOCHANGEDIR              =$00000008
Const OFN_SHOWHELP                 =$00000010
Const OFN_ENABLEHOOK               =$00000020
Const OFN_ENABLETEMPLATE           =$00000040
Const OFN_ENABLETEMPLATEHANDLE     =$00000080
Const OFN_NOVALIDATE               =$00000100
Const OFN_ALLOWMULTISELECT         =$00000200
Const OFN_EXTENSIONDIFFERENT       =$00000400
Const OFN_PATHMUSTEXIST            =$00000800
Const OFN_FILEMUSTEXIST            =$00001000
Const OFN_CREATEPROMPT             =$00002000
Const OFN_SHAREAWARE               =$00004000
Const OFN_NOREADONLYRETURN         =$00008000
Const OFN_NOTESTFILECREATE         =$00010000
Const OFN_NONETWORKBUTTON          =$00020000
Const OFN_NOLONGNAMES              =$00040000
Const OFN_EXPLORER                 =$00080000
Const OFN_NODEREFERENCELINKS       =$00100000
Const OFN_LONGNAMES                =$00200000

Const CDERR_DIALOGFAILURE		=$FFFF
Const CDERR_FINDRESFAILURE		=$0006
Const CDERR_INITIALIZATION		=$0002
Const CDERR_LOADRESFAILURE		=$0007
Const CDERR_LOADSTRFAILURE		=$0005
Const CDERR_LOCKRESFAILURE		=$0008
Const CDERR_MEMALLOCFAILURE		=$0009
Const CDERR_MEMLOCKFAILURE		=$000A
Const CDERR_NOHINSTANCE		=$0004
Const CDERR_NOHOOK			=$000B
Const CDERR_NOTEMPLATE			=$0003
Const CDERR_REGISTERMSGFAIL		=$000C
Const CDERR_STRUCTSIZE			=$0001
Const FNERR_BUFFERTOOSMALL		=$3003
Const FNERR_INVALIDFILENAME		=$3002
Const FNERR_SUBCLASSFAILURE		=$3001

Type OPENFILENAME
	Field lStructSize:Int=88
	Field hwndOwner:Int
	Field hInstance:Int=0
	Field lpstrFilter:Byte Ptr' File filter
	Field lpstrCustomFilter:Byte Ptr
	Field nMaxCustFilter:Int=0
	Field nFilterIndex:Int=0
	Field lpstrFile:Byte Ptr
	Field nMaxFile:Int
	Field lpstrFileTitle:Byte Ptr'[4096] 
	Field nMaxFileTitle=4095
	Field lpstrInitialDir:Byte Ptr'start directory
	Field lpstrTitle:Byte Ptr' Dialog title
	Field Flags:Int=0
	Field nFileOffset:Short 
	Field nFileExtension:Short
	Field lpstrDefExt:Byte Ptr
	Field lCustData:Int
	Field lpfnHook:Byte Ptr=Null' Callback function
	Field lpTemplateName:Byte Ptr
	Field pvReserved:Byte Ptr' not sure if from here on is needed
	Field dwReserved:Int
	Field FlagsEx:Int
EndType

Public

'C++ stuff:
Rem
typedef struct tagOFN { 
  DWORD         lStructSize; 
  HWND          hwndOwner; 
  HINSTANCE     hInstance; 
  LPCTSTR       lpstrFilter; 
  LPTSTR        lpstrCustomFilter; 
  DWORD         nMaxCustFilter; 
  DWORD         nFilterIndex; 
  LPTSTR        lpstrFile; 
  DWORD         nMaxFile; 
  LPTSTR        lpstrFileTitle; 
  DWORD         nMaxFileTitle; 
  LPCTSTR       lpstrInitialDir; 
  LPCTSTR       lpstrTitle; 
  DWORD         Flags; 
  WORD          nFileOffset; 
  WORD          nFileExtension; 
  LPCTSTR       lpstrDefExt; 
  LPARAM        lCustData; 
  LPOFNHOOKPROC lpfnHook; 
  LPCTSTR       lpTemplateName; 
#If (_WIN32_WINNT >= =$0500)
  void *        pvReserved;
  DWORD         dwReserved;
  DWORD         FlagsEx;
#EndIf ' (_WIN32_WINNT >= =$0500)
} OPENFILENAME, *LPOPENFILENAME;
EndRem



Code Archives Forum