
' **   SOURCE FINDER    **
' COMPILE AS WINDOW TARGET

' ---------------------------------------------------------------
' DECLARATIONS
' ---------------------------------------------------------------
TYPE BROWSEINFO
     DEF hOwner:UINT
     DEF pidlRoot:UINT
     DEF pszDisplayName:POINTER
     DEF lpszTitle:POINTER
     DEF ulFlags:UINT
     DEF lpfn:UINT
     DEF lParam:INT
     DEF iImage:INT
ENDTYPE

DECLARE IMPORT,SHGetPathFromIDList(pidl:INT,pszPath:STRING),INT 
DECLARE IMPORT,SHBrowseForFolder(lpbi:BROWSEINFO),INT
DECLARE IMPORT,CoTaskMemFree(pidl:int)   
DECLARE IMPORT,ZeroMemory ALIAS RtlZeroMemory(pData as POINTER,length as INT)
DECLARE "shlwapi.dll",_PathFindFileName ALIAS "PathFindFileNameA"(pszPath As STRING), STRING
DECLARE IMPORT, _LockWindowUpdate ALIAS LockWindowUpdate(hwndLock AS INT),INT
DECLARE IMPORT, _Sleep ALIAS Sleep(dwMilliseconds AS INT)
DECLARE IMPORT, _SetWindowLong ALIAS SetWindowLongA(hwnd AS INT,nIndex AS INT,dwNewLong AS INT),INT
DECLARE IMPORT, _CallWindowProc ALIAS CallWindowProcA(lpPrevWndFunc AS INT,hWnd AS INT,Msg AS INT,wParam AS INT,lParam AS INT),INT
DECLARE IMPORT, _GetClientRect ALIAS GetClientRect(hwnd AS INT,lpRect AS WINRECT),INT

const BIF_RETURNONLYFSDIRS	=0x0001
const BIF_DONTGOBELOWDOMAIN	=0x0002
const BIF_STATUSTEXT		=0x0004
const BIF_RETURNFSANCESTORS	=0x0008
const BIF_EDITBOX			=0x0010
const BIF_VALIDATE			=0x0020
const BIF_NEWDIALOGSTYLE	=0x0040
const BIF_USENEWUI			=(BIF_NEWDIALOGSTYLE | BIF_EDITBOX)
const BIF_BROWSEINCLUDEURLS	=0x0080
const BIF_UAHINT            =0x0100
const BIF_NONEWFOLDERBUTTON	=0x0200
const BIF_NOTRANSLATETARGETS=0x0400
const BIF_BROWSEFORCOMPUTER	=0x1000
const BIF_BROWSEFORPRINTER	=0x2000
const BIF_BROWSEINCLUDEFILES=0x4000
const BIF_SHAREABLE         =0x8000
const BFFM_INITIALIZED		=1
const BFFM_SELCHANGED		=2
const BFFM_VALIDATEFAILEDA	=3
const BFFM_VALIDATEFAILEDW	=4
const BFFM_IUNKNOWN			=5
const BFFM_SETSTATUSTEXTA	=(0x400 + 100)
const BFFM_ENABLEOK			=(0x400 + 101)
const BFFM_SETSELECTIONA	=(0x400 + 102)
const BFFM_SETSELECTIONW	=(0x400 + 103)
const BFFM_SETSTATUSTEXTW	=(0x400 + 104)
const BFFM_SETOKTEXT		=(0x400 + 105)
const BFFM_SETEXPANDED		=(0x400 + 106)

TYPE TVFINDER
	INT actualid
	INT nivel
	INT childhab
	INT tipo ' 1 begin, 2 normal, 3 end
	INT hwndtv ' handle of the treeview
ENDTYPE

TYPE TVSORTCB
    uint hParent
    INT lpfnCompare
    INT lParam
ENDTYPE

CONST TV_FIRST						= 0x1100
CONST TVM_EXPAND					= (TV_FIRST+2)
CONST TVM_GETNEXTITEM				= (TV_FIRST+10)
CONST TVM_SORTCHILDREN				= (TV_FIRST+19)
CONST TVM_SORTCHILDRENCB			= (TV_FIRST+21)
CONST TVE_EXPAND					= 0x2
CONST TVGN_NEXT						= 1
CONST TVGN_PREVIOUS					= 2
CONST TVGN_PARENT					= 3
CONST TVGN_CHILD					= 4

CONST LVS_EX_FULLROWSELECT 		= 32
CONST LVM_FIRST								= 0x1000
CONST LVM_SETEXTENDEDLISTVIEWSTYLE 			= (LVM_FIRST+54)
CONST LVM_GETCOLUMNWIDTH					= (LVM_FIRST+29)

TYPE NMLISTVIEW
    def hwndFrom:UINT
    def idFrom:INT
    def code:INT
    def iItem:INT
    def iSubItem:INT
    def uNewState:UINT
    def uOldState:UINT
    def uChanged:UINT
    def ptActionx:INT
    def ptActiony:INT
    def lParam:INT
ENDTYPE

CONST GWL_WNDPROC = (-4)
CONST WM_NOTIFY 				= 0x4E
CONST NM_FIRST					= 0
CONST NM_CLICK 					= (NM_FIRST-2)
CONST NM_DBLCLK 				= (NM_FIRST-3)
CONST NM_RCLICK 				= (NM_FIRST-5)

TYPE NMHDR
	DEF hwndFrom AS INT
	DEF idfrom AS INT
	DEF code AS INT
ENDTYPE

' ---------------------------------------------------------------
' CONTROLS - VARIABLES
' ---------------------------------------------------------------

CONST STATIC_1 = 1
CONST EDIT_2 = 2
CONST BUTTON_3 = 3
CONST TREEVIEW_4 = 4
CONST BUTTON_5 = 5
CONST BUTTON_6 = 21
CONST BUTTON_8 = 22
CONST BUTTON_9 = 23
CONST RADIO_18 = 24
CONST RADIO_19 = 25
CONST BUTTON_15 = 26
CONST LISTVIEW_20 = 30
CONST STATUS_100 = 100

DIALOG d1

CREATEDIALOG d1,0,0,656,499,0x80C80080|@MINBOX|@SIZE|@MAXBOX,0,"Source Finder",&d1_handler
CONTROL d1,@STATIC,"Project directory:",14,16,90,21,0x5000010B,STATIC_1
CONTROL d1,@EDIT,"",106,13,387,21,0x50800880,EDIT_2
CONTROL d1,@BUTTON,"...",502,11,27,25,0x50000000,BUTTON_3
CONTROL d1,@TREEVIEW,"Static",15,46,624,400,0x50800007,TREEVIEW_4
CONTROL d1,@BUTTON,"Go!",542,11,45,25,0x50000000,BUTTON_5
CONTROL d1,@BUTTON,"Clear",15,459,70,25,0x50000000,BUTTON_6
CONTROL d1,@BUTTON,"Export",97,459,70,25,0x50000000,BUTTON_8
CONTROL d1,@BUTTON,"Import",178,459,70,25,0x50000000,BUTTON_9
CONTROL d1,@BUTTON,"Exit",502,459,70,25,0x50000000,BUTTON_15
CONTROL d1,@RADIOBUTTON,"Treeview",58,127,70,20,0x50000009,RADIO_18
CONTROL d1,@RADIOBUTTON,"Report",142,128,70,20,0x50000009,RADIO_19
CONTROL d1,@LISTVIEW,"",113,36,70,60,0x50808015,LISTVIEW_20
CONTROL D1,@STATUS,"Ready",0,0,0,0,0,STATUS_100

CONST STATIC_101 = 101
CONST STATIC_102 = 102
CONST BUTTON_103 = 103
DIALOG d2
CREATEDIALOG d2,0,0,188,98,0x80C00080,0,"Source Finder",&d2_handler
CONTROL d2,@STATIC,"Searching...",59,8,70,20,0x5000010B,STATIC_101
CONTROL d2,@STATIC,"Please wait...",59,28,70,20,0x5000010B,STATIC_102
'CONTROL d2,@BUTTON,"Cancel",59,55,70,28,0x50000000,BUTTON_103

INT OldProc
INT TV_visible : TV_visible=1

' ---------------------------------------------------------------
' MAIN LOOP
' ---------------------------------------------------------------
DOMODAL d1
END

' ---------------------------------------------------------------
' MAIN PROCEDURE
' ---------------------------------------------------------------
SUB d1_handler
	SELECT @MESSAGE
		CASE @IDINITDIALOG
			CENTERWINDOW d1
			/* Initialize any controls here */
			OnInit()
		CASE @IDCLOSEWINDOW
			OnFinish()
			CLOSEDIALOG d1,@IDOK
		CASE @IDSIZE
			OnResize()
		CASE @IDSIZECHANGED
			OnResize()
		CASE @IDCONTROL
			SELECT @CONTROLID
				CASE EDIT_2
				/* respond to edit notifications here */
				CASE BUTTON_3
					IF @NOTIFYCODE = 0
						/*button clicked*/
						OnChooseDir()
					ENDIF
				CASE TREEVIEW_4
				/* respond to control notifications here */
				CASE BUTTON_5
					IF @NOTIFYCODE = 0
						/*button clicked*/
						OnGo()
					ENDIF
				CASE BUTTON_6
					IF @NOTIFYCODE = 0
						/*button clicked*/
						OnClear()
					ENDIF
				CASE BUTTON_8
					IF @NOTIFYCODE = 0
						/*button clicked*/
						OnExportFile()
					ENDIF
				CASE BUTTON_9
					IF @NOTIFYCODE = 0
						/*button clicked*/
						OnImportFile()
					ENDIF
				CASE BUTTON_15
					IF @NOTIFYCODE = 0
						/*button clicked*/
						OnFinish()
						CLOSEDIALOG d1,@IDOK
					ENDIF
				CASE RADIO_18 ' treeview
					IF @NOTIFYCODE = 0
						/*button clicked*/
						SetVisibility(1)
					ENDIF
				CASE RADIO_19 ' listview
					IF @NOTIFYCODE = 0
						/*button clicked*/
						SetVisibility(0)
					ENDIF
				CASE LISTVIEW_20
				/* respond to control notifications here */
					SELECT @NOTIFYCODE
						CASE @NMDBLCLK
							OnOpenSourceLV(*<NMLISTVIEW>@LPARAM.iItem)
					ENDSELECT
			ENDSELECT
	ENDSELECT
RETURN
ENDSUB

SUB derived_handler(hWnd:INT,uMsg:INT,wParam:INT,lParam:INT),INT
	SELECT uMsg
        CASE WM_NOTIFY
			SELECT INT(wParam)
				CASE TREEVIEW_4
					SELECT *<NMHDR>lparam.code
						CASE NM_DBLCLK
							OnOpenSource()
						CASE NM_RCLICK
							OnOpenSource()
					ENDSELECT
			ENDSELECT
	ENDSELECT
	RETURN _CallWindowProc(OldProc,hWnd,uMsg,wParam,lParam)
ENDSUB

SUB d2_handler
	SELECT @MESSAGE
		CASE @IDINITDIALOG
			CENTERWINDOW d2
			/* Initialize any controls here */
		CASE @IDCLOSEWINDOW
			CLOSEDIALOG d2,@IDOK
		CASE @IDCONTROL
			SELECT @CONTROLID
				CASE BUTTON_103
					IF @NOTIFYCODE = 0
						/*button clicked*/
					ENDIF
			ENDSELECT
	ENDSELECT
RETURN
ENDSUB

' ---------------------------------------------------------------
' EVENTS
' ---------------------------------------------------------------

SUB OnInit()
	INT l, t, w, h

	OldProc=_SetWindowLong(d1.hwnd, GWL_WNDPROC, &derived_handler)
	CREATEDIR( GETSTARTPATH+"Files")
	LoadInfo()
	GETSIZE d1, l, t, w, h
	SETSIZE d1, l, t, w, h+1
ENDSUB

SUB OnFinish()
	SaveInfo()
	'_SetWindowLong(GETCONTROLHANDLE(d1, TREEVIEW_4), GWL_WNDPROC, OldProc)
ENDSUB

SUB OnExportFile()
	ExportFile()
ENDSUB

SUB OnImportFile()
	ImportFile()
ENDSUB

SUB OnChooseDir()
	STRING path

	path=BrowseFolders(d1, "Please select the project directory", 0)
	IF LEN(path) THEN
		SETCONTROLTEXT(d1, EDIT_2, path+"\\")
	ENDIF
ENDSUB

SUB OnGo()
	STRING pathbase

	pathbase= GETCONTROLTEXT(d1, EDIT_2)
	IF LEN(pathbase) THEN
		ClearControls()
		CONTROLCMD d1, STATUS_100, @SWSETPANETEXT, 0, "Searching..."
		FindSources(pathbase)
	ENDIF
ENDSUB

SUB OnClear()
	ClearControls()
ENDSUB

SUB OnOpenSource()
	INT item
	STRING path

	item=tvGetSelectedItem(d1, TREEVIEW_4)
	path=GETCONTROLTEXT(d1, EDIT_2)
	IF item>0 AND LEN(path) THEN
		path=TreeviewItemGetDir(path, item)
		SYSTEM(path)
	ENDIF
ENDSUB

SUB OnOpenSourceLV(int pos)
	STRING path

	IF pos>-1 THEN 
		CONTROLCMD(d1, LISTVIEW_20, @LVGETTEXT, pos, 1, path)
		SYSTEM(path)
	ENDIF
ENDSUB

SUB OnResize()
	INT l, t, w, h, d, bwidth, width
	uint j, a
	WINRECT rc

	bwidth=70
	d=10
	GETCLIENTSIZE d1, l, t, w, h
	SETSIZE d1, d, d, 90, 21, STATIC_1
	SETSIZE d1, w-d-45-d-27, d, 27, 21, BUTTON_3	
	SETSIZE d1, w-d-45, d, 45, 21, BUTTON_5
	SETSIZE d1, d+90+d, d, w-5*d-90-27-45, 21, EDIT_2
	SETSIZE d1, d, d+21+d, w-2*d, h-6*d-2*25, TREEVIEW_4
	SETSIZE d1, d, d+21+d, w-2*d, h-6*d-2*25, LISTVIEW_20
	SETSIZE d1, d*1+bwidth*0, h-21-3*d-5, bwidth, 25, BUTTON_6
	SETSIZE d1, d*2+bwidth*1, h-21-3*d-5, bwidth, 25, BUTTON_8
	SETSIZE d1, d*3+bwidth*2, h-21-3*d-5, bwidth, 25, BUTTON_9
	SETSIZE d1, d*4+bwidth*3, h-21-3*d-5, bwidth, 25, RADIO_18
	SETSIZE d1, d*5+bwidth*4, h-21-3*d-5, bwidth, 25, RADIO_19
	SETSIZE d1, d*6+bwidth*5, h-21-3*d-5, bwidth, 25, BUTTON_15
	IF CONTROLEXISTS(d1, STATUS_100) THEN CONTROLCMD d1,STATUS_100,@SWRESIZE
	IF _GetClientRect(GETCONTROLHANDLE(d1, LISTVIEW_20), rc)>0 THEN
		width=rc.right-rc.left
		CONTROLCMD  d1, LISTVIEW_20, @LVSETCOLWIDTH, 0, 200
		CONTROLCMD  d1, LISTVIEW_20, @LVSETCOLWIDTH, 1, width-200
	ENDIF
ENDSUB


' ---------------------------------------------------------------
' FUNCTIONS
' ---------------------------------------------------------------

' CONTROL FUNCTIONS

SUB ClearControls()
	IF TV_visible=1 THEN
		_LockWindowUpdate( GETCONTROLHANDLE(d1, TREEVIEW_4) )
	ELSE
		_LockWindowUpdate( GETCONTROLHANDLE(d1, LISTVIEW_20) )
	ENDIF
	tvDeleteAllItems(d1, TREEVIEW_4)
	CONTROLCMD d1, LISTVIEW_20, @LVDELETEALL
	CONTROLCMD d1, STATUS_100, @SWSETPANETEXT, 0, "Ready"
	_LockWindowUpdate(0)
ENDSUB

SUB SetVisibility(int vis)
	TV_visible=vis
	IF TV_visible=1 THEN
		SHOWWINDOW d1, @SWRESTORE, TREEVIEW_4
		SHOWWINDOW d1, @SWHIDE, LISTVIEW_20
	ELSE
		SHOWWINDOW d1, @SWHIDE, TREEVIEW_4
		SHOWWINDOW d1, @SWRESTORE, LISTVIEW_20
	ENDIF
ENDSUB

SUB ListviewAddItem(string path)
	INT pos

	pos=CONTROLCMD d1, LISTVIEW_20, @LVINSERTITEM, 0, _PathFindFileName(path)
	CONTROLCMD d1, LISTVIEW_20, @LVSETTEXT, pos, 1, path
ENDSUB

' SOURCE FUNCTIONS

SUB FindSources(string pathbase)
	uint dir, attrib
	STRING filename
	STRING CurrentPath : CurrentPath=pathbase
	INT continue : continue=1
	uint parent : parent=0
	TVFINDER tvf
	uint itemid
	INT dircount, ebacount, inccount, sec1, sec2
	dircount=0 : ebacount=0 : inccount=0
	STRING message 

	SHOWDIALOG d2, d1
	IF TV_visible=1 THEN
		_LockWindowUpdate( GETCONTROLHANDLE(d1, TREEVIEW_4) )
	ELSE
		_LockWindowUpdate( GETCONTROLHANDLE(d1, LISTVIEW_20) )
	ENDIF
	sec1=MILLISECS()
	WHILE continue=1
		' here the program add to the treeview all the directories
		' and files *.eba and *.inc founded into the directory
		' "CurrentPath", the items are added as childs of "parent"
		continue=0
		dir=FINDOPEN(CurrentPath+"*.*")
		IF dir THEN
			DO
				filename=FINDNEXT(dir,attrib)
				IF attrib &@FILE_DIRECTORY THEN
					IF filename<>"." AND filename<>".." THEN TreeviewAddItem(filename, parent, 1000) : dircount++
				ELSE
					SELECT LCASE$( RIGHT$(filename, 3)  )
						CASE "inc"
							TreeviewAddItem(filename, parent, 1)
							inccount++
							ListviewAddItem(CurrentPath+filename)
						CASE "eba"
							TreeviewAddItem(CurrentPath+filename, parent, 2)
							ebacount++
							ListviewAddItem(CurrentPath+filename)
						' you can add more extensions here, for example
						'CASE "ebp"
							'TreeviewAddItem(filename, parent, 3)
							'ListviewAddItem(CurrentPath+filename)
						' ... and so on
					ENDSELECT
				ENDIF
			UNTIL filename = ""
			FINDCLOSE dir
		ENDIF
		IF parent>0 THEN tvSetItemData(d1, TREEVIEW_4, parent, 0)
		TreeviewSortItems(parent)
		SENDMESSAGE(GETCONTROLHANDLE(d1, TREEVIEW_4), TVM_EXPAND, TVE_EXPAND, parent)
		' now the program looking for a treeview item with a
		' custom data=1000, this means a directory not yet
		' revised for files
		TvFinderStart(tvf, 0)
		DO
			itemid=TvFinderFindNext(tvf)
			IF itemid>0 THEN
				IF tvGetItemData(d1, TREEVIEW_4, itemid)=1000 THEN
					continue=1
					tvf.nivel=-1
					parent=itemid
					CurrentPath=TreeviewItemGetDir(pathbase, itemid)
				ENDIF
			ENDIF
		UNTIL (tvf.nivel<=0)
	ENDWHILE
	_LockWindowUpdate(0)
	sec2=MILLISECS()
	IF (sec2-sec1)/1000<2 THEN
		_Sleep(1000)
	ENDIF
	sec2=MILLISECS()
	' when all ends, show a little inform
	message="Details:"+"   "
	message+="Directories: "+STR$(dircount)+"   "
	message+="Source Files (*.eba): "+STR$(ebacount)+"   "
	message+="Include Files (*.inc): "+STR$(inccount)+"   "
	message+="Load time (seconds): "+STR$( (sec2-sec1)/1000 )
	CONTROLCMD d1, STATUS_100, @SWSETPANETEXT, 0, message
	CLOSEDIALOG d2,@IDOK
ENDSUB

' TREEVIEW FUNCTIONS

GLOBAL SUB TvFinderStart(TVFINDER tvf, uint initialid)
	tvf.actualid=initialid
	tvf.nivel=0
	tvf.childhab=1
	tvf.tipo=1
	tvf.hwndtv=GETCONTROLHANDLE(d1, TREEVIEW_4)
ENDSUB

GLOBAL SUB TvFinderFindNext(TVFINDER tvf), uint
	uint itemid

	itemid=SENDMESSAGE(tvf.hwndtv, TVM_GETNEXTITEM, TVGN_CHILD, tvf.actualid)
	IF itemid>0 AND tvf.childhab=1 THEN
		tvf.nivel++
		tvf.actualid=itemid
		tvf.tipo=1
	ELSE
		itemid=SENDMESSAGE(tvf.hwndtv, TVM_GETNEXTITEM, TVGN_NEXT, tvf.actualid)
		IF itemid>0 THEN
			tvf.childhab=1
			tvf.actualid=itemid
			tvf.tipo=2
		ELSE
			tvf.childhab=0
			tvf.nivel=tvf.nivel-1
			tvf.actualid=SENDMESSAGE (tvf.hwndtv, TVM_GETNEXTITEM, TVGN_PARENT, tvf.actualid)
			tvf.tipo=3
		ENDIF
	ENDIF
	RETURN itemid
ENDSUB

SUB TreeviewAddItem(STRING filename, uint parent, uint nData)
	uint itemid

	IF LEN(filename) THEN
		itemid=tvInsertItem(d1, TREEVIEW_4, _PathFindFileName(filename), parent)
		tvSetItemData(d1, TREEVIEW_4, itemid, nData)
	ENDIF
ENDSUB

SUB TreeviewItemGetDir(string pathbase, uint itemid), STRING
	STRING temp, path
	uint parent : parent=itemid
	path=""
	
	DO
		tvGetItemText(d1, TREEVIEW_4, parent, temp, 255)
		path=temp+"\\"+path
		parent=SENDMESSAGE (GETCONTROLHANDLE(d1, TREEVIEW_4), TVM_GETNEXTITEM, TVGN_PARENT, parent)
	UNTIL parent=0
	RETURN pathbase+path
ENDSUB

SUB TreeviewSortItems(uint itemid), INT
	RETURN SENDMESSAGE(GETCONTROLHANDLE(d1, TREEVIEW_4), TVM_SORTCHILDREN,  0, itemid)
ENDSUB


' FOLDER REQUEST FUNCTIONS

/* subroutine to open the system folder browser, by Krypt 2007 */
GLOBAL SUB BrowseFolders(WINDOW win, STRING title , opt INT newfolder),STRING
DEF path[260] as ISTRING
DEF bi:BROWSEINFO
DEF lpIDList:INT
DEF Buffer:STRING
	path[0] = 0
	ZeroMemory(bi,LEN(bi))
	bi.hOwner = win.hwnd
	bi.pszDisplayName = Buffer
	bi.lpszTitle = Title
    IF newfolder = 1
      bi.ulFlags = 0x00000001|BIF_USENEWUI
    ELSE
      if newfolder = 0 | newfolder = null
         bi.ulFlags = 0x00000001
      endif
    ENDIF
	lpIDList = SHBrowseForFolder(bi)
	if lpIDList <> 0
		pszPath = SHGetPathFromIDList(lpIDList,path)
	    CoTaskMemFree(lpIDList)
	ENDIF
RETURN path
ENDSUB

' FILE FUNCTIONS

SUB ExportFile()
	DEF filename[10000]:ISTRING
	DEF filter,filetemp:STRING
	DEF pos:int
	filter="SourceFinder files (*.sff)|*.sff||"
	FILE myfile

	IF LEN(GETCONTROLTEXT (d1, EDIT_2)) THEN
		filename=FILEREQUEST("Export file",d1,0,filter,"sff",0, GETSTARTPATH+"Files")
		IF LEN(filename) THEN
			IF OPENFILE(myfile, filename, "W")=0 THEN
				WRITE myfile, GETCONTROLTEXT d1, EDIT_2
				CLOSEFILE myfile
			ENDIF
		ENDIF
	ENDIF
ENDSUB

SUB ImportFile()
	DEF filename[10000]:ISTRING
	DEF filter,filetemp:STRING
	DEF pos:int
	filter="SourceFinder files (*.sff)|*.sff||"
	FILE myfile
	STRING path

	filename=FILEREQUEST("Import file",d1,1,filter,"sff",0, GETSTARTPATH+"Files")
	IF LEN(filename) THEN
		IF OPENFILE(myfile, filename, "R")=0 THEN
			READ myfile, path
			CLOSEFILE myfile
			IF LEN(path) THEN
				ClearControls()
				SETCONTROLTEXT d1, EDIT_2, path
				FindSources(path)
			ENDIF
		ENDIF
	ENDIF
ENDSUB

SUB SaveInfo()
	FILE myfile
	STRING path

	IF OPENFILE(myfile, GETSTARTPATH+"Data.dat", "W")=0 THEN
		path=GETCONTROLTEXT (d1, EDIT_2)
		WRITE myfile, path
		WRITE myfile, TV_visible
		CLOSEFILE myfile
	ENDIF
ENDSUB

SUB LoadInfo()
	FILE myfile
	STRING path

	IF OPENFILE(myfile, GETSTARTPATH+"Data.dat", "R")=0 THEN
		READ myfile, path
		READ myfile, TV_visible
		CLOSEFILE myfile
		SETCONTROLTEXT (d1, EDIT_2, path)
	ELSE
		TV_visible=1
		columnwidth=200
	ENDIF
	SetVisibility(TV_visible)
	IF TV_visible=1 THEN SETSTATE(d1, RADIO_18, 1) ELSE SETSTATE(d1, RADIO_19, 1)
	CONTROLCMD d1, LISTVIEW_20, @LVINSERTCOLUMN, 0, "File"
	CONTROLCMD d1, LISTVIEW_20, @LVINSERTCOLUMN, 1, "Path"
	SENDMESSAGE( GETCONTROLHANDLE(d1, LISTVIEW_20), LVM_SETEXTENDEDLISTVIEWSTYLE,  0, LVS_EX_FULLROWSELECT)
ENDSUB
