Code archives/File Utilities/FILE SELECTOR (save/load) for BlitzUI

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

Download source code

FILE SELECTOR (save/load) for BlitzUI by mrtricks2003
Instructions are at the top of the code in Rems: Just Include this file as "save_gui.bb" and with a few inserted lines in Chris Fuller's BlitzUI code, you have a full-featured file selector much like those in other Windows apps. More advanced than that which comes with BlitzUI.

(I've used a couple of icons from the icons.bb file included with BlitzUI... And made a couple new for the "Go up one folder" button and the "New Folder" button.)
;---------------------------------;
;---FILE SELECTOR by Robin King---;
;-----------19 Jun 2003-----------;
;---for BlitzUI by Chris Fuller---;
;---------------------------------;

;INSTRUCTIONS: (Hope this isn't too confusing!)
;
; Save this as "save_gui.bb"
; 
; In your main program, after the line:
;
;
;
;--------------------------------------------------------
;;;;		Initialise(  )
;--------------------------------------------------------
;
;
;
; ...type the Line:
;
;
;
;--------------------------------------------------------
;;;;		Include "save_gui.bb"
;--------------------------------------------------------
;
;
;
; Next, in the GUI code, after the section:
;
;
;
;--------------------------------------------------------
;;;;		;Event Handling
;;;;		Select app\Event
;;;;			Case EVENT_WINDOW
;;;;				Select app\WindowEvent
;;;;
;;;;					- ALL YOUR WINDOW EVENTS
;;;;
;;;;				End Select
;;;;			Case EVENT_MENU
;;;;				Select app\MenuEvent
;;;;
;;;;					- ALL YOUR MENU EVENTS
;;;;
;;;;				End Select
;;;;			Case EVENT_GADGET
;;;;				Select app\GadgetEvent
;;;;
;;;;					- ALL YOUR GADGET EVENTS
;;;;
;;;;				End Select
;--------------------------------------------------------
;
;
; 
; ... type this line:
;
;
;
;--------------------------------------------------------
;;;;			FILE_SELECTOR_GADGETS
;--------------------------------------------------------
;			
;
;
; NB: It's VERY important that it comes before the final:
;
;
;
;--------------------------------------------------------
;;;;		End Select
;--------------------------------------------------------
;
;
; Then, just AFTER that final End Select and before
; the DrawMouse(  ) Line, Type:
;
;
;
;--------------------------------------------------------
;;;;		SAVE_GUI_OTHER_FUNCTIONS
;--------------------------------------------------------
;
;
;
; These are functions that need to be called every frame,
; such as checking for double-click.
;
;
;
;
; Then: to start the save dialogue running
; (at any point in your program), type:
;
;
;
;--------------------------------------------------------
;;;;		SAVE_DIALOGUE( "All Files (.*);Image Files (.bmp .jpg .tif)*;Blitz Code (.bb)" , "New File" )
;--------------------------------------------------------
;
;
;
; The first parameter is all the extensions you wish to show
; in the file selector - Put the description (if you want), then IN BRACKETS,
; the actual extensions separated by a space. The * after the brackets in the Image
; Files entry in the example above denotes that this filter is the default one.
; Put "" if you wish not to filter at all.
;
; The first extension in a group will be appended to a save name if there is none
; added by the user. (ie if you type in Image1, it will be called Image1.bmp)
;
; And the 2nd parameter is a default Filename you want to save as.
; (Again, put "" if you want it left blank.)
;
;
;
; To start the open dialogue running
; (at any point in your program), type:
;
;
;
;--------------------------------------------------------
;;;;		OPEN_DIALOGUE( "All Files (.*);Image Files (.bmp .jpg .tif)*;Blitz Code (.bb)" )
;--------------------------------------------------------
;
;
;
; The first parameter is all the extensions you wish to show
; in the file selector - Put the description (if you want), then IN BRACKETS
; (only if you've put descriptions),
; the actual extensions separated by a space. Separate the filter groups with a semi colon (;)
; The * After the brackets in the Image
; Files entry in the example above denotes that this filter is the default one.
; Put "" if you wish not to filter at all.
;
;
;
;
;
;
;
;
;
; Lastly, you must include functions in your main program:
; OPEN(f$) and SAVE(f$) - where f$ is the filename -
; where you do your file saving and opening.
;

;-------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------



;create images for buttons and file list
Global imgNew, imgOpen, imgNewFolder, imgUpFolder
MAKE_ICONS



;Main File selector Window
	Global win_sav = Window(100,100,266,316,"Save/Open","0",1,0,0,1)
	Global btn_sav_up = Button(212,8,20,21,"","0",1,0,0)
	sendmessage(btn_sav_up,"BM_SETIMAGE",imgUpFolder)
	Global btn_sav_newfolder = Button(234,8,21,21,"","0",1,0,0)
	sendmessage(btn_sav_newfolder,"BM_SETIMAGE",imgNewFolder)
	Global btn_sav_yes = Button(195,237,60,21,"Save","0",1,0,0)
	Global btn_sav_no = Button(195,262,60,21,"Cancel","0",1,0,0)
	Global lbl_sav_saveas = Label(8,242,"Name:",0)
	Global lst_sav_files = ListBox(8,33,247,200,20,20,10,0)
	Global txt_sav_filename = TextBox(40,237,152,21,0,0,18,10,0)
	Global cbo_sav_foldername = ComboBox(8,8,200,21)	
	Global cbo_sav_filter = ComboBox(8,262,184,21)

;Create new folder Window
	Global win_newfolder = Window(180,150,219,87,"Create New Folder","0",1,0,0,1)
	Global btn_newfolder_yes = Button(148,33,60,21,"Create","0",1,0,0)
	Global btn_newfolder_no = Button(86,33,60,21,"Cancel","0",1,0,0)
	Global txt_newfolder = TextBox(8,8,200,21,0,0,18,10,1)
	SendMessage(txt_newfolder,"TM_SETTEXT",0,"New Folder")

;File already exists. Overwrite? Window
	Global win_overwrite = Window(210,180,204,88,"Warning","0",1,0,0,0)
	Global btn_overwrite_yes = Button(30,34,60,21,"Yes","0",1,0,0)
	Global btn_overwrite_no = Button(110,34,60,21,"No","0",1,0,0)
	l$="That file already exists."+Chr(10)+"Do you wish to overwrite?"
	Global lbl_overwrite = Label(100,4,l$,1)

;Folder already exists window
	Global win_folderalreadyexists = Window(210,180,204,88,"Warning","0",1,0,0,0)
	Global btn_folderalreadyexists_okay = Button(72,34,60,21,"Okay","0",1,0,0)
	l$="That folder already exists."+Chr(10)+"Please choose a different name."
	Global lbl_folderalreadyexists = Label(102,3,l$,1)

;Filename contains illegal characters Window
	Global win_illegalchars = Window(210,180,204,88,"Warning","0",1,0,0,0)
	Global btn_illegalchars_okay = Button(72,34,54,20,"Okay","0",1,0,0)
	l$="The characters \ / * "+Chr$(34)+" ? : | < > are"+Chr(10)+"not allowed and have been edited out."
	Global lbl_illegalchars = Label(102,3,l$,1)



;close all folders
sendmessage(win_sav,"WM_CLOSE")
sendmessage(win_newfolder,"WM_CLOSE")
sendmessage(win_overwrite,"WM_CLOSE")
sendmessage(win_folderalreadyexists,"WM_CLOSE")
sendmessage(win_illegalchars,"WM_CLOSE")

;for folder sorting
Type folderitem
	Field name$
	Field what
End Type

;other save_gui variables
Global doubleclick=300,singleclick,doubleclicked
Global path$

Global filter$,extension$

Global save_open ;1=open, 2=save
Global file_list







;--------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------
Function FILE_SELECTOR_GADGETS()
;--------------------------------------------------------------------------------------------			
;--------------------------------------------------------------------------------------------

	Select app\GadgetEvent

;-------MAIN FILE SELECTOR WINDOW------------------------------------------------------------
				
			;CREATE NEW FOLDER BUTTON
				Case btn_sav_newfolder
				sendmessage(win_newfolder,"WM_OPEN")
				sendmessage(win_newfolder,"WM_SETMODAL")
				If FileType("New Folder")>1
					a=1
					While FileType("New Folder "+Str$(a))>1
						a=a+1
					Wend
					SendMessage(txt_newfolder,"TM_SETTEXT",0,"New Folder "+Str$(a))
				Else
					SendMessage(txt_newfolder,"TM_SETTEXT",0,"New Folder")
				EndIf				
			;GO UP A FOLDER
				Case btn_sav_up
				ft=FileType(sendmessage(txt_sav_filename,"TM_GETTEXT"))
				If MOVE_DIR_UP()=True
					If ft=2 Then sendmessage(txt_sav_filename,"TM_SETTEXT",0,"")
					GET_DIR
				EndIf
			;CHOOSE FOLDER FROM COMBO BOX
				Case cbo_sav_foldername
				i=sendmessage(cbo_sav_foldername,"CM_GETINDEX")+1
				c$=sendmessage(cbo_sav_foldername,"CM_GETCAPTION")
				f$=""
				a=0
				Repeat
					sendmessage(cbo_sav_foldername,"CM_SETINDEX",a)
					cn$=sendmessage(cbo_sav_foldername,"CM_GETCAPTION")
					f$=f$+cn$+"\"
					a=a+1
				Until cn$=c$
				ChangeDir f$
				;	sendmessage(txt_sav_filename,"TM_SETTEXT",0,f$)
				If FileType(sendmessage(txt_sav_filename,"TM_GETTEXT"))=2
					sendmessage(txt_sav_filename,"TM_SETTEXT",0,"")
				EndIf
				GET_DIR
			;CLICK ON A LIST ENTRY
				Case lst_sav_files
				f$=SendMessage(lst_sav_files,"LM_GETCAPTION")
				If f$<>"" Then sendmessage(txt_sav_filename,"TM_SETTEXT",0,f$)
				;are you double clicking, ie selecting?
				If doubleclicked
					doubleclicked=False
					SELECT_ITEM(f$)
				EndIf
			;SAVE/OPEN/OVERWRITE BUTTON
				Case btn_sav_yes
				f$=SendMessage(txt_sav_filename,"TM_GETTEXT")
				If f$<>"" Then SELECT_ITEM(f$)
			;CANCEL SAVE
				Case btn_sav_no
				sendmessage(win_sav,"WM_CLOSE")			
			;PRESS ENTER WHILE TYPING FILENAME
				Case txt_sav_filename
				If KeyHit(28) Or KeyHit(156)
					f$=SendMessage(txt_sav_filename,"TM_GETTEXT")
					If f$<>"" Then SELECT_ITEM(f$)
				EndIf
			;CONFIRM SAVE BUTTON
				Case btn_sav_yes
				f$=SendMessage(txt_sav_filename,"TM_GETTEXT")
				SELECT_ITEM(f$)
			;CHANGE FILTER
				Case cbo_sav_filter
				f$=sendmessage(cbo_sav_filter,"CM_GETCAPTION")
				filter$=EXTRACT_FILTER$(f$)
				extension$=EXTRACT_EXTENSION$(filter$)
				GET_DIR
				
			
				
				
;-------CREATE NEW FOLDER WINDOW------------------------------------------------------------

			;CANCEL CREATE NEW FOLDER
				Case btn_newfolder_no
				sendmessage(win_newfolder,"WM_CLOSE")
			;CONFIRM CREATE NEW FOLDER
				Case btn_newfolder_yes
				CREATE_NEW_FOLDER
			;ALTERNATIVE CONFIRM - PRESS RETURN OR ENTER
				Case txt_newfolder
				If KeyHit(28) Or KeyHit(156) Then CREATE_NEW_FOLDER
				
				
				
;-------ESCAPE FOLDER ALREADY EXISTS WINDOW--------------------------------------------------

			;OKAY
				Case btn_folderalreadyexists_okay
				sendmessage(win_folderalreadyexists,"WM_CLOSE")



;-------ESCAPE ILLEGAL CHARS WINDOW----------------------------------------------------------

			;OKAY
				Case btn_illegalchars_okay
				sendmessage(win_illegalchars,"WM_CLOSE")



;-------OVERWRITE WINDOW---------------------------------------------------------------------

			;NO
				Case btn_overwrite_no
				sendmessage(win_overwrite,"WM_CLOSE")
			;YES
				Case btn_overwrite_yes
				sendmessage(win_overwrite,"WM_CLOSE")
				f$=sendmessage(txt_sav_filename,"TM_GETTEXT")
				sendmessage(win_sav,"WM_CLOSE")
				SAVE(f$) ;perhaps put a backup of original file?

	End Select

End Function






;-------------------------------------------------------------------------------------------------
Function SAVE_GUI_OTHER_FUNCTIONS()
	;doubleclick?
	If MouseHit(1)
		If MilliSecs()<=singleclick+doubleclick
			doubleclicked=True: singleclick=0
		Else
			singleclick=MilliSecs()
		EndIf
	EndIf
	;change confirm button text
	f$=SendMessage(txt_sav_filename,"TM_GETTEXT")
	If FileType(f$)<>2
		;cannot end with .
		While Right$(f$,1)="."
			f$=Left$(f$,Len(f$)-1)
		Wend
		;get current extension
		If Instr(f$,".",1)
			a=Len(f$)
			While Mid$(f$,a,1)<>"."
				a=a-1
			Wend
			ext$=Right$(f$,Len(f$)-(a-1))
		Else
			ext$=""
		EndIf
		If Instr(filter$,ext$,1)=0 Or (ext$="" And f$<>"")
		;If Instr(f$,".",1)=0
			f$=f$+extension$
		EndIf
	EndIf
	Select FileType(f$)
		Case 0
			If save_open=2
				SendMessage(btn_sav_yes,"BM_SETTEXT","Save")
				If f$=""
					SendMessage(btn_sav_yes,"BM_DISABLE")
				Else
					SendMessage(btn_sav_yes,"BM_ENABLE")
				EndIf
			Else
				SendMessage(btn_sav_yes,"BM_SETTEXT","Open")
				SendMessage(btn_sav_yes,"BM_DISABLE")
			EndIf
		Case 1
			If save_open=2
				SendMessage(btn_sav_yes,"BM_SETTEXT","Overwrite")
			Else
				SendMessage(btn_sav_yes,"BM_SETTEXT","Open")
			EndIf
			SendMessage(btn_sav_yes,"BM_ENABLE")
		Case 2
			If save_open=2 Then SendMessage(btn_sav_yes,"BM_SETTEXT","Open")
			SendMessage(btn_sav_yes,"BM_ENABLE")
	End Select
	
End Function



;-------------------------------------------------------------------------------------------------
Function CREATE_NEW_FOLDER()

	f$=SendMessage(txt_newfolder,"TM_GETTEXT")
	;does it already exist?
	If f$<>""
		If FileType(f$)>0
			sendmessage(win_folderalreadyexists,"WM_OPEN")
			sendmessage(win_folderalreadyexists,"WM_SETMODAL")
		Else
			;need to stop certain chars ie *:/\?"<>|
			ff$=ILLEGAL_CHARS(f$)
			If ff$=f$
				;create new folder
				sendmessage(win_newfolder,"WM_CLOSE")
				CreateDir CurrentDir$()+f$
				GET_DIR
			Else
				sendmessage(txt_newfolder,"TM_SETTEXT",0,ff$)
				sendmessage(win_illegalchars,"WM_OPEN")
				sendmessage(win_illegalchars,"WM_SETMODAL")
			EndIf
		EndIf
	EndIf

End Function



;-------------------------------------------------------------------------------------------------
Function ILLEGAL_CHARS$(f$)
	a=0
	Repeat
		a=a+1
		For b=1 To 9
			If Mid$(f$,a,1)=Mid$("*:/\?<>|"+Chr$(34),b,1)
				f$=Left$(f$,a-1)+Right$(f$,Len(f$)-a)
				a=0
				Exit
			EndIf
		Next
	Until a=Len(f$)
	Return f$

End Function



;-------------------------------------------------------------------------------------------------
Function SAVE_DIALOGUE(f$,n$)
	If sendmessage(win_sav,"WM_VISIBLE")=0
		sendmessage(win_sav,"WM_OPEN")
		sendmessage(win_sav,"WM_SETMODAL")
		save_open=2
		SendMessage(btn_sav_yes,"BM_SETTEXT","Save")					
		SendMessage(btn_sav_newfolder,"BM_ENABLE")
		sendmessage(win_sav,"WM_SETCAPTION","Save") ;doesn't yet work - may in future BlitzUI's
		
		;filter box
		sendmessage(cbo_sav_filter,"CM_RESET") ;get rid of all items in combo box
		aa=0: fa=0
		Repeat
			a=Instr(f$,";",1)
			If a>0
				fi$=Left$(f$,a-1)
				f$=Right$(f$,Len(f$)-a)
			Else
				fi$=f$
			EndIf
			If Right$(fi$,1)="*"
				fa=aa
				fi$=Left$(fi$,Len(fi$)-1)
			EndIf
			AddComboBoxItem(cbo_sav_filter,0,fi$)
			aa=aa+1
		Until a=0
		sendmessage(cbo_sav_filter,"CM_SETINDEX",fa)
		f$=sendmessage(cbo_sav_filter,"CM_GETCAPTION")
		filter$=EXTRACT_FILTER$(f$)
		
		;default extension
		extension$=EXTRACT_EXTENSION$(filter$)
		;If Len(n$)>Len(extension$)
		;	If Right$(n$,Len(extension$))<>extension$ Then n$=n$+extension$
		;Else
		;	If n$<>"" Then n$=n$+extension$
		;EndIf
		sendmessage(txt_sav_filename,"TM_SETTEXT",0,n$)

		GET_DIR
		
	EndIf
End Function



;-------------------------------------------------------------------------------------------------
Function OPEN_DIALOGUE(f$)
	If sendmessage(win_sav,"WM_VISIBLE")=0
		sendmessage(win_sav,"WM_OPEN")
		sendmessage(win_sav,"WM_SETMODAL")
		save_open=1
		SendMessage(btn_sav_yes,"BM_SETTEXT","Open")
		SendMessage(btn_sav_yes,"BM_DISABLE")
		SendMessage(btn_sav_newfolder,"BM_DISABLE")
		
		sendmessage(win_sav,"WM_SETCAPTION","Open") ;doesn't yet work - may in future BlitzUI's
		
		;filter box
		sendmessage(cbo_sav_filter,"CM_RESET") ;get rid of all items in combo box
		aa=0: fa=0
		Repeat
			a=Instr(f$,";",1)
			If a>0
				fi$=Left$(f$,a-1)
				f$=Right$(f$,Len(f$)-a)
			Else
				fi$=f$
			EndIf
			If Right$(fi$,1)="*"
				fa=aa
				fi$=Left$(fi$,Len(fi$)-1)
			EndIf
			AddComboBoxItem(cbo_sav_filter,0,fi$)
			aa=aa+1
		Until a=0
		sendmessage(cbo_sav_filter,"CM_SETINDEX",fa)
		f$=sendmessage(cbo_sav_filter,"CM_GETCAPTION")
		filter$=EXTRACT_FILTER$(f$)
		extension$=""
		
		GET_DIR
		
	EndIf
End Function



;-------------------------------------------------------------------------------------------------
Function EMPTY_DIR_LIST()
	For dir.folderitem=Each folderitem
		Delete dir
	Next
End Function



;-------------------------------------------------------------------------------------------------
Function EXTRACT_EXTENSION$(f$)
	If f$=""
		e$=""
	Else
		a=Instr(f$," ",1)
		If a>0
			e$=Left$(f$,a-1)
		Else
			e$=f$
		EndIf
	EndIf
	Return e$
End Function



;-------------------------------------------------------------------------------------------------
Function EXTRACT_FILTER$(f$)
	If f$="All Files" Then f$=""
	a=Instr(f$,"(",1)
	If a>0 Then f$=Right$(f$,Len(f$)-a)
	a=Instr(f$,")",1)
	If a>0 Then f$=Left$(f$,a-1)
	If f$=".*" Then f$=""
	Return f$
End Function



;-------------------------------------------------------------------------------------------------
Function EXTRACT_TOP_DIR$(p$)
	;;take off last \
	;p$=Left$(p$,Len(p$)-1)
	If Instr(p$,"\",1)<Len(p$)
		l=Len(p$)-1
		While Mid$(p$,l,1)<>"\"
			l=l-1
		Wend
		p$=Right$(p$,Len(p$)-l)
	EndIf
	Return p$
End Function



;------------------------------------------------------------------------------------------
Function MOVE_DIR_UP()
	LastSlash=0
	Slash=0
	Repeat
		Slash=Instr(path$,"\",Slash+1)
		If Slash>0 And Slash<Len(path$)
			LastSlash=Slash
		EndIf
	Until Slash=0
	If Left(path$,LastSlash)<>path$
		path$=Left(path$,LastSlash)
	EndIf
	If path$<>CurrentDir$()
		ChangeDir path$
		Return True
	Else
		Return False
	EndIf
End Function



;------------------------------------------------------------------------------------------
Function SELECT_ITEM(f$)
	;cannot end with .
	While Right$(f$,1)="."
		f$=Left$(f$,Len(f$)-1)
	Wend
	;add default extension?
	If FileType(f$)<>2
		;get current extension
		If Instr(f$,".",1)
			a=Len(f$)
			While Mid$(f$,a,1)<>"."
				a=a-1
			Wend
			ext$=Right$(f$,Len(f$)-(a-1))
		Else
			ext$=""
		EndIf
		If Instr(filter$,ext$,1)=0 Or (ext$="" And f$<>"")
		;If Right$(f$,Len(extension$))<>extension$
			f$=f$+extension$
		EndIf
	EndIf
	Select FileType(f$)
	;folder?
	Case 2
		sendmessage(txt_sav_filename,"TM_SETTEXT",0,"")
		path$=CurrentDir$()+f$
		ChangeDir path$
		GET_DIR()
	;file already existing?
	Case 1
		If save_open=2
			sendmessage(win_overwrite,"WM_OPEN")
			sendmessage(win_overwrite,"WM_SETMODAL")
		Else
			sendmessage(win_sav,"WM_CLOSE")
			OPEN(f$)
		EndIf
	;new filename?
	Case 0
		If save_open=2
			;any illegal characters ie *:/\?"<>|
			ff$=ILLEGAL_CHARS(f$)
			If ff$=f$
				While Right$(f$,1)="."
					f$=Left$(f$,Len(f$)-1)
				Wend
				;NOW does it already exist?
				If FileType(f$)<>0
				Else
					;create new file
					sendmessage(win_sav,"WM_CLOSE")
					SAVE(f$)
				EndIf
			Else
				sendmessage(txt_sav_filename,"TM_SETTEXT",0,ff$)
				sendmessage(win_illegalchars,"WM_OPEN")
				sendmessage(win_illegalchars,"WM_SETMODAL")
			EndIf
		EndIf
	End Select
End Function



;------------------------------------------------------------------------------------------
Function GET_DIR()

	;set folder name
	path$=CurrentDir$()
	;If Len(path$)>3 Then folder$=EXTRACT_TOP_DIR$(path$) Else folder$=path$
	folder$=EXTRACT_TOP_DIR$(path$)
	;sendmessage(txt_sav_foldername,"TM_SETTEXT",0,folder$)
	
	;folder combo box
	path_c$=path$
	n=0 ;number of folders
	o=1
	Repeat
		o=Instr(path_c$,"\",o)+1
		If o>1 n=n+1
		If KeyDown(1) End
	Until o=1
	nm=n
	sendmessage(cbo_sav_foldername,"CM_RESET")
	Repeat
		path_t$=EXTRACT_TOP_DIR$(path_c$)
		AddComboBoxItem(cbo_sav_foldername,n,Left$(path_t$,Len(path_t$)-1))
		path_c$=Left$(path_c$,Len(path_c$)-Len(path_t$))
		n=n-1
		If KeyDown(1) End
	Until path_c$=""
	sendmessage(cbo_sav_foldername,"CM_SETINDEX",nm-1)

	
	
	EMPTY_DIR_LIST
	;put files into type
	items=0
	thisdir=ReadDir(path$)
	Repeat
		;f$=Lower$(NextFile$(thisdir))
		f$=NextFile$(thisdir)
		If f$<>"" And f$<>"." And f$<>".."
			;extension filtering
			legal=False
			If filter$="" Or FileType(f$)=2
				legal=True
			Else
				;get the extension of the item
				If Instr(f$,".",1)
					ff=Len(f$)
					While Mid$(f$,ff,1)<>"."
						ff=ff-1
					Wend
					ext$=Right$(f$,Len(f$)-(ff-1))
					If Instr(filter$,ext$,1)>0
						legal=True
					EndIf
				EndIf
			EndIf
			If legal
				dir.folderitem=New folderitem
				dir\name$=f$
				dir\what=FileType(f$)
				items=items+1
			EndIf
		EndIf
	Until f$=""
	CloseDir thisdir
	;SORT ALPHABETICALLY AND INTO FOLDERS / FILES / FILE TYPES
	dir.folderitem=First folderitem
	Repeat
		If dir=Null Then Exit
		a$=Lower$(dir\name$): aa=dir\what
			;put extension before name
			If Instr(a$,".")
				aaa=Len(a$)
				Repeat
					aaa=aaa-1
				Until Mid$(a$,aaa,1)="."
				a$=Right$(a$,Len(a$)-(aaa-1))+Left$(a$,aaa-1)
			EndIf
		dir.folderitem=After dir
		If dir=Null Then Exit
		b$=Lower$(dir\name$): bb=dir\what
			;put extension before name
			If Instr(b$,".")
				bbb=Len(b$)
				Repeat
					bbb=bbb-1
				Until Mid$(b$,bbb,1)="."
				b$=Right$(b$,Len(b$)-(bbb-1))+Left$(b$,bbb-1)
			EndIf
		If (bb=aa And a$>b$) Or bb>aa
			Insert dir Before Before dir
			If dir.folderitem<>First folderitem Then dir=Before dir
		EndIf
	Forever
	;put into GUI
	file_list=0
	sendmessage(lst_sav_files,"LM_RESET") ;get rid of all items in list
	For dir.folderitem=Each folderitem
		If dir\what=2
			AddListBoxItem(lst_sav_files,0,dir\name$,imgOpen)
		Else
			AddListBoxItem(lst_sav_files,0,dir\name$,imgNew)
		EndIf
		file_list=file_list+1
	Next
End Function



;------------------------------------------------------------------------------------------
Function MAKE_ICONS()

Restore NewIcon
imgNew = createimage(16, 16)
for A = 0 to 15
	for B = 0 to 15
		read RGB
		writepixel B, A, RGB, imagebuffer( imgNew )
	next
next
MaskImage imgNew, 255, 0, 0

Restore OpenIcon
imgOpen = CreateImage(16, 16)
For A = 0 To 15
	For B = 0 To 15
		Read RGB
		WritePixel B, A, RGB, ImageBuffer( imgOpen )
	Next
Next
MaskImage imgOpen, 255, 0, 0

Restore NewFolderIcon
imgNewFolder = CreateImage(16, 16)
For A = 0 To 15
	For B = 0 To 15
		Read RGB
		WritePixel B, A, RGB, ImageBuffer( imgNewFolder )
	Next
Next
MaskImage imgNewFolder, 0, 255, 0

Restore UpFolderIcon
imgUpFolder = CreateImage(16, 16)
For A = 0 To 15
	For B = 0 To 15
		Read RGB
		WritePixel B, A, RGB, ImageBuffer( imgUpFolder )
	Next
Next
MaskImage imgUpFolder, 0, 255, 0

End Function



;NEW ICON
;--------
.NewIcon
Data -65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536
Data -65536,-65536,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-65536,-65536,-65536,-65536,-65536,-65536
Data -65536,-65536,-16777216,-1,-1,-1,-1,-1,-1,-8355712,-16777216,-65536,-65536,-65536,-65536,-65536
Data -65536,-65536,-16777216,-1,-1,-1,-1,-1,-1,-8355712,-1,-16777216,-65536,-65536,-65536,-65536
Data -65536,-65536,-16777216,-1,-1,-1,-1,-1,-1,-16777216,-16777216,-16777216,-16777216,-65536,-65536,-65536
Data -65536,-65536,-16777216,-1,-1,-1,-1,-1,-1,-1,-1,-1,-16777216,-65536,-65536,-65536
Data -65536,-65536,-16777216,-1,-1,-1,-1,-1,-1,-1,-1,-1,-16777216,-65536,-65536,-65536
Data -65536,-65536,-16777216,-1,-1,-1,-1,-1,-1,-1,-1,-1,-16777216,-65536,-65536,-65536
Data -65536,-65536,-16777216,-1,-1,-1,-1,-1,-1,-1,-1,-1,-16777216,-65536,-65536,-65536
Data -65536,-65536,-16777216,-1,-1,-1,-1,-1,-1,-1,-1,-1,-16777216,-65536,-65536,-65536
Data -65536,-65536,-16777216,-1,-1,-1,-1,-1,-1,-1,-1,-1,-16777216,-65536,-65536,-65536
Data -65536,-65536,-16777216,-1,-1,-1,-1,-1,-1,-1,-1,-1,-16777216,-65536,-65536,-65536
Data -65536,-65536,-16777216,-1,-1,-1,-1,-1,-1,-1,-1,-1,-16777216,-65536,-65536,-65536
Data -65536,-65536,-16777216,-1,-1,-1,-1,-1,-1,-1,-1,-1,-16777216,-65536,-65536,-65536
Data -65536,-65536,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-65536,-65536,-65536
Data -65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536


;OPEN ICON
;---------
.OpenIcon
Data -65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536
Data -65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-16777216,-16777216,-16777216,-65536,-65536,-65536,-65536
Data -65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-16777216,-65536,-65536,-65536,-16777216,-65536,-16777216,-65536
Data -65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-16777216,-16777216,-65536
Data -65536,-16777216,-16777216,-16777216,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-16777216,-16777216,-16777216,-65536
Data -16777216,-459584,-459584,-459584,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-65536,-65536,-65536,-65536,-65536
Data -16777216,-459584,-459584,-459584,-459584,-459584,-459584,-459584,-459584,-459584,-16777216,-65536,-65536,-65536,-65536,-65536
Data -16777216,-459584,-459584,-459584,-459584,-459584,-459584,-459584,-459584,-459584,-16777216,-65536,-65536,-65536,-65536,-65536
Data -16777216,-459584,-459584,-459584,-459584,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-65536
Data -16777216,-459584,-459584,-459584,-16777216,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-16777216,-65536
Data -16777216,-459584,-459584,-16777216,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-16777216,-65536,-65536
Data -16777216,-459584,-16777216,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-16777216,-65536,-65536,-65536
Data -16777216,-16777216,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-16777216,-65536,-65536,-65536,-65536
Data -16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-65536,-65536,-65536,-65536,-65536
Data -65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536
Data -65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536

;NEW FOLDER ICON
;---------
.NewFolderIcon
Data -16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936
Data -16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936
Data -16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-65536,-16711936,-16711936,-16711936,-16711936
Data -16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-65536,-16711936,-16711936,-65536,-16711936,-16711936,-65536,-16711936
Data -16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-65536,-16711936,-65536,-16711936,-65536,-16711936,-16711936
Data -16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-65536,-65536,-65536,-16711936,-16711936,-16711936
Data -16711936,-16711936,-16777216,-16777216,-16777216,-16711936,-16711936,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536
Data -16711936,-16777216,-459584,-459584,-459584,-16777216,-16777216,-16777216,-16777216,-16777216,-65536,-65536,-65536,-16711936,-16711936,-16711936
Data -16711936,-16777216,-459584,-459584,-459584,-459584,-459584,-459584,-459584,-65536,-459584,-65536,-16711936,-65536,-16711936,-16711936
Data -16711936,-16777216,-459584,-459584,-459584,-459584,-459584,-459584,-65536,-459584,-459584,-65536,-16711936,-16711936,-65536,-16711936
Data -16711936,-16777216,-459584,-459584,-459584,-459584,-16777216,-16777216,-16777216,-16777216,-16777216,-65536,-16777216,-16777216,-16777216,-16777216
Data -16711936,-16777216,-459584,-459584,-459584,-16777216,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-16777216
Data -16711936,-16777216,-459584,-459584,-16777216,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-16777216,-16711936
Data -16711936,-16777216,-459584,-16777216,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-16777216,-16711936,-16711936
Data -16711936,-16777216,-16777216,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-16777216,-16711936,-16711936,-16711936
Data -16711936,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16711936,-16711936,-16711936,-16711936


;UP FOLDER ICON
;---------
.UpFolderIcon
Data -16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16777216,-16777216,-16711936,-16711936,-16711936,-16711936
Data -16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16777216,-65281,-65281,-16777216,-16711936,-16711936,-16711936
Data -16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16777216,-65281,-65281,-65281,-65281,-16777216,-16711936,-16711936
Data -16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16777216,-16777216,-16777216,-65281,-65281,-16777216,-16777216,-16777216,-16711936
Data -16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16777216,-65281,-65281,-16777216,-16711936,-16711936,-16711936
Data -16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16711936,-16777216,-65281,-65281,-16777216,-16711936,-16711936,-16711936
Data -16711936,-16711936,-16777216,-16777216,-16777216,-16711936,-16711936,-16711936,-16711936,-16777216,-65281,-65281,-16777216,-16711936,-16711936,-16711936
Data -16711936,-16777216,-459584,-459584,-459584,-16777216,-16777216,-16777216,-16777216,-16777216,-65281,-65281,-16777216,-16711936,-16711936,-16711936
Data -16711936,-16777216,-459584,-459584,-459584,-459584,-459584,-459584,-459584,-16777216,-65281,-65281,-16777216,-16711936,-16711936,-16711936
Data -16711936,-16777216,-459584,-459584,-459584,-459584,-459584,-459584,-459584,-16777216,-65281,-65281,-16777216,-16711936,-16711936,-16711936
Data -16711936,-16777216,-459584,-459584,-459584,-459584,-16777216,-16777216,-16777216,-16777216,-65281,-65281,-16777216,-16777216,-16777216,-16777216
Data -16711936,-16777216,-459584,-459584,-459584,-16777216,-7829504,-4145152,-7829504,-16777216,-65281,-65281,-16777216,-4145152,-7829504,-16777216
Data -16711936,-16777216,-459584,-459584,-16777216,-7829504,-4145152,-7829504,-4145152,-16777216,-65281,-65281,-16777216,-7829504,-16777216,-16711936
Data -16711936,-16777216,-459584,-16777216,-7829504,-4145152,-7829504,-4145152,-7829504,-16777216,-16777216,-16777216,-16777216,-16777216,-16711936,-16711936
Data -16711936,-16777216,-16777216,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-4145152,-7829504,-16777216,-16711936,-16711936,-16711936
Data -16711936,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16777216,-16711936,-16711936,-16711936,-16711936


;------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------

Comments

None.

Code Archives Forum