; This UDF is Open-Source. Please use it and give me Feedback. Its allowed to modify it. Please write my Name if you use it :)
; Ein Beispiel-Scipt befindet sich am Ende der UDF
#include-once

#include <GuiListView.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#include <GuiTreeView.au3>
#include <StructureConstants.au3>
#include <TreeViewConstants.au3>
#include <array.au3>
#include <file.au3>
#include "AutoItObject.au3"

; #INDEX# =======================================================================================================================
; Title .........: TreeAndListviewExplorer (TLE)
; AutoIt Version : 3.3.12.0
; Language ......: English/Deutsch
; Description ...: This UDF is for making an easy Treeview and Listview Explorer.
; Author(s) .....: Kanashius
; ===============================================================================================================================

; #CURRENT# =====================================================================================================================
; _TLE_CreateTreeViewExplorer()
; ===============================================================================================================================

; #INTERNAL_USE_ONLY#============================================================================================================
;
; ===============================================================================================================================

; #CONSTANTS# ===================================================================================================================
Global $__hImage_TLE = _GUIImageList_Create(16, 16, 5, 1)
; ===============================================================================================================================

_GUIImageList_AddIcon($__hImage_TLE, 'shell32.dll', 3) ; Verzeichnis-Icon
_GUIImageList_AddIcon($__hImage_TLE, 'shell32.dll', 110) ; Verzeichnis-Icon mit Haken
_GUIImageList_AddIcon($__hImage_TLE, 'shell32.dll', 1) ; Datei-Icon
_GUIImageList_AddIcon($__hImage_TLE, 'shell32.dll', 5) ; Diskette
_GUIImageList_AddIcon($__hImage_TLE, 'shell32.dll', 7) ; Wechseldatenträger
_GUIImageList_AddIcon($__hImage_TLE, 'shell32.dll', 8) ; Festplatte
_GUIImageList_AddIcon($__hImage_TLE, 'shell32.dll', 11) ; CDROM
_GUIImageList_AddIcon($__hImage_TLE, 'shell32.dll', 12) ; Netzwerklaufwerk
_GUIImageList_AddIcon($__hImage_TLE, 'shell32.dll', 53) ; Unbekannt

; #FUNCTION# ====================================================================================================================
; Name...........: _TLE_CreateTreeViewExplorer()
; Description ...: Erzeugt ein Objekt und setzt die benötigten Einstellungen der Tree und Listview.
; Syntax.........: _TLE_CreateTreeViewExplorer([$initialize=true[,$TreeView=-1[,$ListView=-1]]])
; Parameters ....: - $initialize	- true:  Bei Aufruf der Funktion wird das Rootverzeichnis geöffnet
;									- false: Bei Aufruf der Funktion wird das Rootverzeichnis nicht geöffnet (Verwendung der
;											 TreeView nicht möglich, solange _TLE_InitializeTreeViewExplorer() nicht aufgerufen
;											 wurde. Die ListView kann verwendet werden mit _TLE_SetListViewFolder()
;				   - $TreeView		- ControlId einer TreeView. Wenn sie weggelassen wird (-1) wird nur die ListView genutzt
;				   - $ListView		- ControlId einer ListView. Wenn sie weggelassen wird (-1) wird nur die TreeView genutzt
; Return values .:
;				   - Objekt, welches für alle Handlungen mit der UDF übergeben werden muss
;				   - Error: 		- 1: TreeView und ListView haben den Wert -1, es muss aber mindestens eine ControlId
;										 übergeben werden.
; Author ........: Kanashius
; ===============================================================================================================================
Func _TLE_CreateTreeViewExplorer($initialize=true,$TreeView=-1,$ListView=-1)
	if $TreeView=-1 and $ListView=-1 then
		SetError(1,0,-1)
	endif
	_AutoItObject_Startup()
	$oTreeViewExplorer = _AutoItObject_Create()
	_AutoItObject_AddProperty($oTreeViewExplorer, "TreeViewID")
	$oTreeViewExplorer.TreeViewID=$TreeView
	_AutoItObject_AddProperty($oTreeViewExplorer, "ListViewID")
	$oTreeViewExplorer.ListViewID=$ListView
	_AutoItObject_AddProperty($oTreeViewExplorer, "FoldersCount")
	$oTreeViewExplorer.FoldersCount=0
	_AutoItObject_AddProperty($oTreeViewExplorer, "Folder")
	$oTreeViewExplorer.Folder=-1
	_AutoItObject_Shutdown()
	if $TreeView<>-1 then
		_GUICtrlTreeView_SetNormalImageList($oTreeViewExplorer.TreeViewID,$__hImage_TLE)
	endif
	if $ListView<>-1 then
		_GUICtrlListView_SetImageList($oTreeViewExplorer.ListViewID,$__hImage_TLE,1)
		_GUICtrlListView_SetExtendedListViewStyle($oTreeViewExplorer.ListViewID,BitOR( $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
		GUICtrlSetStyle($oTreeViewExplorer.ListViewID,BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_REPORT))
		for $i=0 to _GUICtrlListView_GetColumnCount($oTreeViewExplorer.ListViewID)+1 step 1
			_GUICtrlListView_DeleteColumn($oTreeViewExplorer.ListViewID,0)
		next
		_GUICtrlListView_AddColumn($oTreeViewExplorer.ListViewID,"Dateiname")
		_GUICtrlListView_SetColumnWidth($oTreeViewExplorer.ListViewID,0,200)
		_GUICtrlListView_AddColumn($oTreeViewExplorer.ListViewID,"Größe")
		_GUICtrlListView_SetColumnWidth($oTreeViewExplorer.ListViewID,1,100)
		_GUICtrlListView_AddColumn($oTreeViewExplorer.ListViewID,"Erstelldatum (YYYY/MM/DD HH:MM:SS)")
		_GUICtrlListView_SetColumnWidth($oTreeViewExplorer.ListViewID,2,100)
	endif
	if $initialize then
		_TLE_InitializeTreeViewExplorer($oTreeViewExplorer)
	endif
	return $oTreeViewExplorer
EndFunc ;==> _TLE_CreateTreeViewExplorer

; #FUNCTION# ====================================================================================================================
; Name...........: _TLE_InitializeTreeViewExplorer()
; Description ...: Läd die Laufwerke in die TreeView oder ListView
; Syntax.........: _TLE_InitializeTreeViewExplorer($oTreeViewExplorer)
; Parameters ....: - $oTreeViewExplorer		- Objekt welches von der Funktion _TLE_CreateTreeViewExplorer() zurückgegeben wird
; Author ........: Kanashius
; ===============================================================================================================================
Func _TLE_InitializeTreeViewExplorer($oTreeViewExplorer)
	if $oTreeViewExplorer.TreeViewID<>-1 then
		_GUICtrlTreeView_DeleteAll($oTreeViewExplorer.TreeViewID)
		if $oTreeViewExplorer.ListViewID<>-1 Then
			_GUICtrlListView_DeleteAllItems($oTreeViewExplorer.ListViewID)
		endif
		If ToolTip('Please wait...', Default, Default, 'Read Directory', 1) Then Local $aDrives = DriveGetDrive('ALL'), $iLWindex, $hRoot
		For $i = 1 To $aDrives[0]
			$iLWindex = 0
			Switch DriveGetType($aDrives[$i])
				Case 'Fixed'
					$iLWindex = 5
				Case 'CDROM'
					$iLWindex = 6
				Case 'RAMDisk'
					$iLWindex = 7
				Case 'Removable'
					$iLWindex = 4
					If StringLeft($aDrives[$i], 2) = 'a:' Or StringLeft($aDrives[$i], 2) = 'b:' Then $iLWindex = 3
				Case Else
					$iLWindex = 8
			EndSwitch
			$hRoot = _GUICtrlTreeView_Add(GUICtrlGetHandle($oTreeViewExplorer.TreeViewID), 0, StringUpper($aDrives[$i]), $iLWindex, $iLWindex)
			__TLE_DirInTree("C:\",$oTreeViewExplorer.TreeViewID,$hRoot,true,true)
			_GUICtrlTreeView_AddChild(GUICtrlGetHandle($oTreeViewExplorer.TreeViewID), $hRoot, "test", 0, 0)
			If DriveStatus($aDrives[$i]) <> 'READY' Then ContinueLoop
		Next
		ToolTip('')
	elseif $oTreeViewExplorer.ListViewID<>-1 then
		_GUICtrlListView_DeleteAllItems($oTreeViewExplorer.ListViewID)
		If ToolTip('Please wait...', Default, Default, 'Read Directory', 1) Then Local $aDrives = DriveGetDrive('ALL'), $iLWindex, $hRoot
		For $i = 1 To $aDrives[0]
			$iLWindex = 0
			Switch DriveGetType($aDrives[$i])
				Case 'Fixed'
					$iLWindex = 5
				Case 'CDROM'
					$iLWindex = 6
				Case 'RAMDisk'
					$iLWindex = 7
				Case 'Removable'
					$iLWindex = 4
					If StringLeft($aDrives[$i], 2) = 'a:' Or StringLeft($aDrives[$i], 2) = 'b:' Then $iLWindex = 3
				Case Else
					$iLWindex = 8
			EndSwitch
			$item = GUICtrlCreateListViewItem(StringUpper($aDrives[$i]) & "||", $oTreeViewExplorer.ListViewID)
			_GUICtrlListView_AddSubItem($oTreeViewExplorer.ListViewID, $i-1,StringUpper($aDrives[$i]),0,$iLWindex)
			If DriveStatus($aDrives[$i]) <> 'READY' Then ContinueLoop
		Next
		ToolTip('')
	else
		SetError(1,0,-1)
	endif
EndFunc ;==>

; #FUNCTION# ====================================================================================================================
; Name...........: _TLE_getActPath()
; Description ...: Gibt den aktuellen Pfad zurück
; Syntax.........: _TLE_getActPath($oTreeViewExplorer)
; Parameters ....: - $oTreeViewExplorer		- Objekt welches von der Funktion _TLE_CreateTreeViewExplorer() zurückgegeben wird
; Return values .: - aktueller Pfad, der ausgewählt ist bzw. angezeigt wird Bsp.: C:\Windows
; Author ........: Kanashius
; ===============================================================================================================================
Func _TLE_getActPath($oTreeViewExplorer)
	if $oTreeViewExplorer.TreeViewID<>-1 then
		$hItem=_GUICtrlTreeView_GetSelection($oTreeViewExplorer.TreeViewID)
		return StringReplace(_GUICtrlTreeView_GetTree($oTreeViewExplorer.TreeViewID,$hItem),"|","\")
	elseif $oTreeViewExplorer.ListViewID<>-1 then
		return $oTreeViewExplorer.Folder
	else
		SetError(1,0,-1)
	endif
EndFunc

; #FUNCTION# ====================================================================================================================
; Name...........: _TLE_SetListViewFolder()
; Description ...: Setzt den aktuellen Ordner in der ListView (Falls die TreeView genutzt wird sollte _TLE_TreeViewOpenPath()
;				   genutzt werden, damit die Markierung dort ebenfalls gesetzt wird)
; Syntax.........: _TLE_SetListViewFolder($directory,$oTreeViewExplorer)
; Parameters ....: - $directory				- Pfad  (Bsp.: C:\Windows)
;				   - $oTreeViewExplorer		- Objekt welches von der Funktion _TLE_CreateTreeViewExplorer() zurückgegeben wird
; Author ........: Kanashius
; ===============================================================================================================================
Func _TLE_SetListViewFolder($directory,$oTreeViewExplorer) ;ListView mit Dateien und Ordnern füllen
	__TLE_Content($directory,$oTreeViewExplorer)
	$oTreeViewExplorer.Folder=$directory
EndFunc

; #FUNCTION# ====================================================================================================================
; Name...........: _TLE_TreeViewOpenPath()
; Description ...: Öffnet den angegebenen Ordner in der TreeView und/oder in der Listview
; Syntax.........: _TLE_TreeViewOpenPath($dir,$oTreeViewExplorer)
; Parameters ....: - $dir					- Pfad  (Bsp.: C:\Windows)
;				   - $oTreeViewExplorer		- Objekt welches von der Funktion _TLE_CreateTreeViewExplorer() zurückgegeben wird
; Author ........: Kanashius
; ===============================================================================================================================
Func _TLE_TreeViewOpenPath($dir,$oTreeViewExplorer) ;automatisch in ein bestimmtes Verzeichnis wechseln
	if $oTreeViewExplorer.TreeViewID<>-1 then
		__TLE_openTreePath($dir,$oTreeViewExplorer)
	elseif $oTreeViewExplorer.ListViewID<>-1 then
		_TLE_SetListViewFolder($dir,$oTreeViewExplorer)
	endif
EndFunc

; #FUNCTION# ====================================================================================================================
; Name...........: _TLE_WM_NOTIFY()
; Description ...: Diese Funktion MUSS in der WM_Notifity-Funktion aufgerufen werden! (GUIRegisterMsg($WM_NOTIFY, '_WM_NOTIFY'))
;				   Reagiert auf das Expandieren der TreeView, Änderung der Selektion der Treeview und das Doppelklicken in der
;				   ListView
; Syntax.........: _TLE_WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam,$oTreeViewExplorer)
; Parameters ....: - $hWnd				- Selber Parameter wie bei der WM_Notivity (Window Handle der Message)
;				   - $iMsg				- Selber Parameter wie bei der WM_Notivity (Messagecode)
;				   - $iwParam			- Selber Parameter wie bei der WM_Notivity
;				   - $ilParam			- Selber Parameter wie bei der WM_Notivity
;				   - $oTreeViewExplorer - Objekt welches von der Funktion _TLE_CreateTreeViewExplorer() zurückgegeben wird
; Return values .: - $GUI_RUNDEFMSG
; Author ........: Kanashius
; ===============================================================================================================================
Func _TLE_WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam,$oTreeViewExplorer)
	Local $hChild, $hITEM, $tNMTREEVIEW = DllStructCreate($tagNMTREEVIEW, $ilParam)
	if $oTreeViewExplorer.TreeViewID<>-1 then
		;Notify Event für die Treeview
		If DllStructGetData($tNMTREEVIEW, 'hWndFrom') = GUICtrlGetHandle($oTreeViewExplorer.TreeViewID) Then
			Switch DllStructGetData($tNMTREEVIEW, 'Code')
				Case $TVN_ITEMEXPANDINGA, $TVN_ITEMEXPANDINGW
					;Eintrag wird expandiert
					Switch DllStructGetData($tNMTREEVIEW, 'Action')
						Case $TVE_EXPAND
							$hITEM = DllStructGetData($tNMTREEVIEW, 'NewhItem')
							__TLE_DirInTree("",$oTreeViewExplorer.TreeViewID,$hITEM,true,true)
					EndSwitch
				Case $TVN_SELCHANGEDW
					if $oTreeViewExplorer.ListViewID<>-1 then
						;Selektion wurde geändert
						$sel=_GUICtrlTreeView_GetSelection(GUICtrlGetHandle($oTreeViewExplorer.TreeViewID))
						if $sel<>0 then
							__TLE_Content(__TLE_getPathFromTreeView(GUICtrlGetHandle($oTreeViewExplorer.TreeViewID),$sel)&"\",$oTreeViewExplorer)
						endif
					endif
			EndSwitch
		EndIf
	endif
	if $oTreeViewExplorer.ListViewID<>-1 then
		;Notify Event für die ListView
		If DllStructGetData($tNMTREEVIEW, 'hWndFrom') = GUICtrlGetHandle($oTreeViewExplorer.ListViewID) Then
			Switch DllStructGetData($tNMTREEVIEW, 'Code')
				Case $NM_DBLCLK
					;doppelklick auf ein ListViewItem
					$selIndex=int(_GUICtrlListView_GetSelectedIndices($oTreeViewExplorer.ListViewID))
					if ($oTreeViewExplorer.Folder=-1 and $oTreeViewExplorer.TreeViewID=-1) or ($selIndex>0 and $selIndex<$oTreeViewExplorer.FoldersCount+1) then ;wechsle zum angeklickten Ordner $Folderscount, damit keine Dateien angeklickt werden können
						if $oTreeViewExplorer.TreeViewID<>-1 then
							$selText=_GUICtrlListView_GetItemText($oTreeViewExplorer.ListViewID,$selIndex,0)
							__TLE_openTreePath($selText,$oTreeViewExplorer,_GUICtrlTreeView_GetSelection(GUICtrlGetHandle($oTreeViewExplorer.TreeViewID)))
							__TLE_DirInTree("C:\",$oTreeViewExplorer.TreeViewID,_GUICtrlTreeView_GetSelection(GUICtrlGetHandle($oTreeViewExplorer.TreeViewID)),true,true)
						else
							if $oTreeViewExplorer.Folder<>-1 then
								$string=$oTreeViewExplorer.Folder&"\"&_GUICtrlListView_GetItemText($oTreeViewExplorer.ListViewID,$selIndex,0)
								_TLE_SetListViewFolder($string,$oTreeViewExplorer)
							else
								$string=_GUICtrlListView_GetItemText($oTreeViewExplorer.ListViewID,$selIndex,0)
								_TLE_SetListViewFolder($string,$oTreeViewExplorer)
							endif
						endif
					elseif $selIndex=0 then ;erster Eintrag in der Listview angeklickt: in Übergeordneten Ordner wechseln
						if $oTreeViewExplorer.TreeViewID<>-1 then
							$path=__TLE_getPathFromTreeView($oTreeViewExplorer.TreeViewID,_GUICtrlTreeView_GetSelection(GUICtrlGetHandle($oTreeViewExplorer.TreeViewID)))
							$ar=StringSplit($path,"\")
							$string=""
							for $i=1 to UBound($ar)-2 step 1
								$string&=$ar[$i]&"\"
							next
							__TLE_openTreePath($string,$oTreeViewExplorer,_GUICtrlTreeView_GetSelection(GUICtrlGetHandle($oTreeViewExplorer.TreeViewID)),true)
							__TLE_DirInTree("C:\",$oTreeViewExplorer.TreeViewID,_GUICtrlTreeView_GetSelection(GUICtrlGetHandle($oTreeViewExplorer.TreeViewID)),true,true)
						else
							$ar=StringSplit($oTreeViewExplorer.Folder,"\")
							$string=""
							for $i=1 to UBound($ar)-3 step 1
								$string&=$ar[$i]&"\"
							next
							$string&=$ar[UBound($ar)-2]
							if $string<>1 then
								_TLE_SetListViewFolder($string,$oTreeViewExplorer)
							else
								_TLE_InitializeTreeViewExplorer($oTreeViewExplorer)
								$oTreeViewExplorer.Folder=-1
							endif
						endif
					endif
			EndSwitch
		EndIf
	endif
	Return $GUI_RUNDEFMSG
EndFunc ;==>

; #FUNCTION# ====================================================================================================================
; Name...........: __TLE_openTreePath()
; Description ...: Öffnet den angegebenen Ordner in der TreeView
; Syntax.........: __TLE_openTreePath($dir,$oTreeViewExplorer,$current=0,$back=false)
; Parameters ....: - $dir				- Pfad
;				   - $oTreeViewExplorer - Objekt welches von der Funktion _TLE_CreateTreeViewExplorer() zurückgegeben wird
;				   - $current			- aktueller Index, welcher in der TreeView ausgewählt ist
;				   - $back				- true, wenn das übergeordnete Verzeichnis gewechselt werden soll
; Author ........: Kanashius
; ===============================================================================================================================
Func __TLE_openTreePath($dir,$oTreeViewExplorer,$current=0,$back=false) ;automatisch in ein bestimmtes Verzeichnis wechseln
	$text=""
	if $current=0 then
		$text=-1
	elseif $back then
		$ar=StringSplit(_GUICtrlTreeView_GetTree($oTreeViewExplorer.TreeViewID,$current),"|")
		$dir=""
		for $i=1 to UBound($ar)-3 step 1
			$dir&=$ar[$i]&"\"
		next
		$dir&=$ar[UBound($ar)-2]
		$text=$ar[UBound($ar)-3]
	else
		$text=_GUICtrlTreeView_GetText($oTreeViewExplorer.TreeViewID,$current)
	endif
	$ar=StringSplit($dir,"\")
	for $i=1 to UBound($ar)-1 step 1
		if $ar[$i]<>"" then
			$ready=false
			while not $ready
				if $current<>0 then
					$current=_GUICtrlTreeView_FindItem($oTreeViewExplorer.TreeViewID,$ar[$i],false,$current)
				else
					$current=_GUICtrlTreeView_FindItem($oTreeViewExplorer.TreeViewID,$ar[$i])
				endif
				$str=_GUICtrlTreeView_GetTree($oTreeViewExplorer.TreeViewID,$current)
				$ar1=StringSplit($str,"|")
				if $i<>UBound($ar)-1 or $text=-1 or $ar1[UBound($ar1)-2]=$text then
					__TLE_GUICtrlTreeView_Expand_self($oTreeViewExplorer.TreeViewID,$current,true)
					$ready=true
				else
					$current=_GUICtrlTreeView_GetNext ( $oTreeViewExplorer.TreeViewID, $current)
				endif
			WEnd
		endif
	next
	if UBound($ar)-1<3 then
		__TLE_GUICtrlTreeView_Expand_self($oTreeViewExplorer.TreeViewID,$current,true)
	endif
	if $oTreeViewExplorer.ListViewID<>-1 then
		_GUICtrlTreeView_SelectItem($oTreeViewExplorer.TreeViewID,$current)
		__TLE_Content(__TLE_getPathFromTreeView($oTreeViewExplorer.TreeViewID,$current),$oTreeViewExplorer)
	endif
EndFunc

; #FUNCTION# ====================================================================================================================
; Name...........: __TLE_Content()
; Description ...: Öffnet einen Ordner in der ListView
; Syntax.........: __TLE_Content($directory,$oTreeViewExplorer)
; Parameters ....: - $directory			-Pfad (Bsp.: C:\Windows)
;				   - $oTreeViewExplorer - Objekt welches von der Funktion _TLE_CreateTreeViewExplorer() zurückgegeben wird
; Author ........: Kanashius
; ===============================================================================================================================
Func __TLE_Content($directory,$oTreeViewExplorer) ;ListView mit Dateien und Ordnern füllen
	_GUICtrlListView_DeleteAllItems($oTreeViewExplorer.ListViewID)
	$item = GUICtrlCreateListViewItem("..||", $oTreeViewExplorer.ListViewID)
	_GUICtrlListView_AddSubItem($oTreeViewExplorer.ListViewID, 0, "..",0,0)
	$FileList=_FileListToArray($directory,'*.*',  2) ; Only files
	if @error then
		$oTreeViewExplorer.FoldersCount=0
	else
		$oTreeViewExplorer.FoldersCount=UBound($FileList)-1
	endif
    for $n = 1 to UBound($FileList)-1
        $File_Name = $FileList[$n]
        $File_size = ""
        $File_t =  FileGetTime($directory & "\" & $File_Name, 1) ; creation Time
        $File_time = $File_t[0] & "/" & $File_t[1] & "/" & $File_t[2] & " " & $File_t[3] & ":" & $File_t[4] & ":" & $File_t[5] ; detailed
        $item = GUICtrlCreateListViewItem($File_Name & "|" & $File_size & "|" & $File_time, $oTreeViewExplorer.ListViewID)
		;_GUICtrlListView_SetItemImage ( $oTreeViewExplorer.ListViewID, $n-1, 0,0)
		_GUICtrlListView_AddSubItem( $oTreeViewExplorer.ListViewID, $n, $File_Name,0,0)
    Next
    $FileList=_FileListToArray($directory,'*.*',  1) ; Only files
    for $n = 1 to UBound($FileList)-1
        $File_Name = $FileList[$n]
        $File_size = int(FileGetSize ( $directory & "\" & $File_Name)/100)&" KB"
        $File_t =  FileGetTime($directory & "\" & $File_Name, 1) ; creation Time
        $File_time = $File_t[0] & "/" & $File_t[1] & "/" & $File_t[2] & " " & $File_t[3] & ":" & $File_t[4] & ":" & $File_t[5] ; detailed
        $item = GUICtrlCreateListViewItem($File_Name & "|" & $File_size & "|" & $File_time, $oTreeViewExplorer.ListViewID)
		_GUICtrlListView_AddSubItem( $oTreeViewExplorer.ListViewID,$oTreeViewExplorer.FoldersCount+$n, $File_Name,0,2)
    Next
EndFunc   ;==>Content

; #FUNCTION# ====================================================================================================================
; Name...........: __TLE_getPathFromTreeView($TreeView,$hItem)
; Description ...: Gibt den Pfad des aktuell ausgewählten Elementes
; Syntax.........: __TLE_getPathFromTreeView($TreeView,$hItem)
; Parameters ....: - $TreeView	- Handle der TreeView
;				   - $hItem		- ItemId
; Return values .: - String im Format eines Pfades (Bsp.: C:\Windows)
; Author ........: Kanashius
; ===============================================================================================================================
Func __TLE_getPathFromTreeView($TreeView,$hItem)
	return StringReplace(_GUICtrlTreeView_GetTree($TreeView,$hItem),"|","\")
EndFunc

; #FUNCTION# ====================================================================================================================
; Name...........: __TLE_DirInTree()
; Description ...: Rekursiv aufgerufene Funktion, um die Ordner in der TreeView anzuzeigen
; Syntax.........: __TLE_DirInTree($sSearchPath,$Tree,$hItem=-1,$SearchAll=true,$ext=false)
; Parameters ....: - $sSearchPath 		- Pfad des Ordners der geöffnet werden soll
;				   - $Tree				- Handle der TreeView
;				   - $hItem=-1			- aktuell ausgewähltes Objekt
;				   - $SearchAll=true	- Abbruch Kriterium, um herauszufinden, ob Unterordner vorhanden sind
;				   - $ext=false			- gibt an, ob vorhandene Ordner in dem zu expandierenden Verzeichnis sind
; Return values .: - true 	- Falls Unterordner vorhanden sind
;				   - false	- Wenn keine Unterordner vorhanden sind
; Author ........: Kanashius
; ===============================================================================================================================
Func __TLE_DirInTree($sSearchPath,$Tree,$hItem=-1,$SearchAll=true,$ext=false) ;rekursiver Aufruf, um jeweils die nächste Ebenen anzuzeigen
	if $SearchAll then
		ToolTip('Please wait...', Default, Default, 'Read Directory', 1)
		_GUICtrlTreeView_BeginUpdate($Tree)
	endif
	local $hItemNew,$parent
	if $ext then
		$sSearchPath=__TLE_getPathFromTreeView($Tree,$hItem)
		_GUICtrlTreeView_DeleteChildren($Tree,$hItem)
	endif
	$search=FileFindFirstFile($sSearchPath&"\"&"*.*")
	$ChildDirs=false
	While 1
		$path=FileFindNextFile($search)
		;msgbox(48,"",$path)
		if @extended then
			if $hItem=-1 then
				$hItemNew=_GUICtrlTreeView_Add($Tree,0,$path,0,0)
			else
				$hItemNew=_GUICtrlTreeView_AddChild($Tree,$hItem,$path,0,0)
			endif
			if $SearchAll then
				if not __TLE_DirInTree($sSearchPath&"\"&$path,$Tree,$hItemNew,false) then
					_GUICtrlTreeView_Delete($Tree,$hItemNew)
					if $hItem=-1 then
						$hItemNew=_GUICtrlTreeView_AddChild($Tree,0,$path,0,0)
					else
						$hItemNew=_GUICtrlTreeView_AddChild($Tree,$hItem,$path,0,0)
					endif
				endif
			endif
			$ChildDirs=true
		endif
		if @error=1 then
			#cs
			if not $ChildDirs then
				if $hItem=-1 then
					$hItemNew=_GUICtrlTreeView_Add($Tree,0,$path,0,0)
				else
					_GUICtrlTreeView_AddChild($Tree,$hItem,$path,0,0)
				endif
			endif
			#ce
			ExitLoop 1
		endif
	WEnd
	FileClose($search)
	if $SearchAll then
		_GUICtrlTreeView_EndUpdate($Tree)
		ToolTip('')
	endif
	return $ChildDirs
EndFunc

; #FUNCTION# ====================================================================================================================
; Author ........: Holger Kotsch
; Modified.......: Gary Frost, Kanashius
; ===============================================================================================================================
Func __TLE_GUICtrlTreeView_Expand_self($hWnd, $hItem = 0, $fExpand = True)
	If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)

	If $hItem = 0 Then $hItem = 0x00000000

	If $hItem = 0x00000000 Then
		$hItem = $TVI_ROOT
	Else
		If Not IsHWnd($hItem) Then
			Local $hItem_tmp = GUICtrlGetHandle($hItem)
			If $hItem_tmp <> 0x00000000 Then $hItem = $hItem_tmp
		EndIf
	EndIf

	If $fExpand Then
		__TLE_GUICtrlTreeView_ExpandItem_self($hWnd, $TVE_EXPAND, $hItem)
	Else
		__TLE_GUICtrlTreeView_ExpandItem_self($hWnd, $TVE_COLLAPSE, $hItem)
	EndIf
EndFunc   ;==>_GUICtrlTreeView_Expand

; #FUNCTION# ====================================================================================================================
; Name...........: __GUICtrlTreeView_ExpandItem($hWnd, $iExpand, $hItem)
; Description ...: Expands/Collapes the item and child(ren), if any
; Syntax.........: __GUICtrlTreeView_ExpandItem ( $hWnd, $iExpand, $hItem )
; Parameters ....: $hWnd  - Handle to the control
; Author ........: Holger Kotsch
; Modified.......: Gary Frost (gafrost), Kanashius
; ===============================================================================================================================
Func __TLE_GUICtrlTreeView_ExpandItem_self($hWnd, $iExpand, $hItem)
	If Not IsHWnd($hWnd) Then

		If $hItem = 0x00000000 Then
			$hItem = $TVI_ROOT
		Else
			$hItem = GUICtrlGetHandle($hItem)
			If $hItem = 0 Then Return
		EndIf
		$hWnd = GUICtrlGetHandle($hWnd)
	EndIf

	_SendMessage($hWnd, $TVM_EXPAND, $iExpand, $hItem, 0, "wparam", "handle")

	If $iExpand = $TVE_EXPAND And $hItem > 0 Then _SendMessage($hWnd, $TVM_ENSUREVISIBLE, 0, $hItem, 0, "wparam", "handle")

	$hItem = _SendMessage($hWnd, $TVM_GETNEXTITEM, $TVGN_CHILD, $hItem, 0, "wparam", "handle")
EndFunc   ;==>__GUICtrlTreeView_ExpandItem

#cs
;Script Beispiel
#include "FileExplorerTreeAndListview UDF.au3"
Opt("GUIOnEventMode", 1)

$GUI=GUICreate("Explorer",500,800)
$TreeView=GUICtrlCreateTreeView(10,10,480,385)
$ListView=GUICtrlCreateListView("",10,405,480,385)
GUISetState(@SW_SHOW)
$oExplorer=_TLE_CreateTreeViewExplorer(true,$TreeView,$ListView)
GUIRegisterMsg($WM_NOTIFY, '_WM_NOTIFY')
GUISetOnEvent($GUI_EVENT_CLOSE, "_ExplorerGui_Close")

_TLE_TreeViewOpenPath(@DesktopDir,$oExplorer)

while 1
	sleep(100)
WEnd

Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	_TLE_WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam,$oExplorer)
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_NOTIFY

Func _ExplorerGui_Close()
	exit
EndFunc
#ce