Example program - A file/directory browser using a tree control


The following example program uses a tree control

DEFFORM Form1()={.Form,.Form$,.Style=0x50C000C4,.Width=316,.Height=212,.Text$="Tree demo",.Id=1024},\
{.ok,.button$,.Style=0x50010001,.Left=261,.Top=5,.Width=50,.Height=14,.Text$="OK",.__Anchor=5,.Id=1},\
{.cancel,.button$,.Style=0x50010000,.Left=261,.Top=22,.Width=50,.Height=14,.Text$="Cancel",.__Anchor=5,.Id=2},\
{.help,.button$,.Style=0x50010000,.Left=260,.Top=42,.Width=50,.Height=14,.Text$="&Collapse",.__Anchor=5,.Id=9},\
{.treeControl1,.tree$,.Style=0x50A10027,.Left=18,.Top=14,.Width=188,.Height=177,.Id=1000,.HasPictures=1,.Sorted=1},\
{.menu1,.Menu$,.Style=0x01,.Id=1001,.option1={.Text$="Option1"},.separator={.Flag=2048},.option2={.Flag=128,.Text$="Option2"}},\
{.txtControl1,.static$,.Style=0x50000000,.Left=211,.Top=68,.Width=95,.Height=13,.Id=1002},\
{.txtControl2,.static$,.Style=0x50000000,.Left=211,.Top=88,.Width=96,.Height=13,.Id=1003},\
{.txtControl3,.static$,.Style=0x50000000,.Left=211,.Top=108,.Width=99,.Height=12,.Id=1004}
LOCAL DIM a(4), FileSystem
LOCAL DIM count, i, root$16
LOCAL DIM pathlen=64
DEFEVENT Form1.Enter()
	REM fill tree with some static elements    
	a(1) = .treeControl1.Add("Hello1", 1)
	a(2) = .treeControl1.Add("PGoodbye2", 0)
	a(3) = .treeControl1.Item(a(1)).Add("Hello3", 0)
	.treeControl1.Item(a(1)).Expand()
	a(4) = .treeControl1.Add("Bonjour4", 0)
	REM fill a node with the contents of a filesystem
	root$ = (STR($MACHINE,, 1) == "U" ? "/user1" : "c:/")
	FileSystem = .treeControl1.Add("File system", TRUE)
END EVENT
DEFEVENT Form1.fileexpand(dir$, parent)
	REM subroutine used to populate tree at node 'parent'
	REM with directory dir$.  This is not an event handler.    
	LOCAL DIM dir$(1)pathlen, name$pathlen
	LOCAL DIM i, count, dir, newidx
	REM Note the "B" flag. Same as "N" but just basename
	CALL KI_DIR dir$, 1, "TB", pathlen, -SYM(dir$()) TO count
	FOR i = 1 TO count
		name$ = STR(dir$(i), 2)
		IF (STR(dir$(i),, 1) == "D" OR STR(name$,, 1) <> ".")
			dir = COND(STR(dir$(i),, 1) == "D")
			newidx = .treeControl1.Item(parent).Add(name$, dir + 10)
		END IF
	NEXT i
END EVENT
DEFEVENT Form1.treeControl1.Expand()
	LOCAL DIM name$pathlen, dir$pathlen, tdir$pathlen,a,p
	a = ..ExpandItem
	IF (a >= FileSystem)
		IF (a == FileSystem)
			dir$ = root$
		ELSE 
			p = a
			WHILE TRUE DO
				IF (p == FileSystem)
					name$ = root$
				ELSE 
					name$ = ..Item(p).Text$
				END IF
				IF (name$ <> " ")
					IF (STR(name$, LEN(name$), 1) <> "/" AND STR(name$, LEN(name$), 1) <> "\")
						IF (dir$ <> "")
							tdir$ = name$ & "/" & dir$
						ELSE 
							tdir$ = name$
						END IF
					ELSE 
						tdir$ = name$ & dir$
					END IF
				ELSE 
					tdir$ = "/" & dir$
				END IF
				dir$ = tdir$
				p = ..Item(p).Parent
				IF (p <= 0)
					BREAK
				END IF
			WEND
		END IF
	Form1.fileexpand(dir$, a)
	END IF
END EVENT
DEFEVENT Form1.treeControl1.LeftClick()
	.txtControl1.Text$ = "Item Index = " & ..Index
	.txtControl2.Text$ = "Item Text = " & ..Item(..Index).Text$
END EVENT
DEFEVENT Form1.treeControl1.RightClick()
	.menu1.TrackPopup(..Left + ..MouseX + 20, ..Top + ..MouseY)
END EVENT
DEFEVENT Form1.help.Click()
	REM collapse tree    
	Form1.treeControl1.Delete()
	Form1.Enter()
END EVENT
DEFEVENT Form1.treeControl1.ExpandChange()
	.txtControl3.Text$ = "Parent = " & ..Item(..ExpandItem).Text$
END EVENT
FORM END Form1
Form1.Open()