Home
Products
Community
Manuals
Contact
Login or Signup

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 JoshK(Posted 1+ years ago)
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

JoshK(Posted 1+ years ago)
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



JoshK(Posted 1+ years ago)
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



JoshK(Posted 1+ years ago)
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