#Region - TimeStamp
; 2013-12-04 09:05:03   v 0.3
#EndRegion - TimeStamp

#include-once
#include <GuiTreeView.au3>
#include <Array.au3>
#cs ============================================================================= F U N C T I O N S =============================

	• _GUICtrlTreeView_CreateItemFromOrderFile
		Erstellt Treeview Item aus einer Datei gemäß der gespeicherten Ordnung

	• _GUICtrlTreeView_GetItemOrder
		Liest die Ordnungsreihenfolge der Einträge eines Treeview in einen speicherbaren String (Standard) oder in ein Array

#ce =============================================================================================================================

; #FUNCTION# ====================================================================================================================
; Name ..........: _GUICtrlTreeView_CreateItemFromOrderFile
; Description ...: Erstellt Treeview Item aus einer Datei gemäß der gespeicherten Ordnung
; Syntax ........: _GUICtrlTreeView_CreateItemFromOrderFile($_sFile, $_hWnd[, $_sDelim = -1])
; Parameters ....: $_sFile              - Dateipfad.
; ...............: $_hWnd               - Treeview Handle.
; ...............: $_sDelim             - [optional] Trenner. Standard ist -1 = Opt("GUIDataSeparatorChar")
; ...............:                        $_sDelim trennt Ordnungsnummer von Itemtext
; Return values .: Erfolg               Array [[Handle-Item, Ordnungsnummer, Item-Text]]
; ...............: Fehler               0  @error = 1: Datei lesen fehlgeschlagen
; ...............:                                = 2: Datei enthält keine Einträge
; Author ........: BugFix ( bugfix@autoit.de )
; ===============================================================================================================================
Func _GUICtrlTreeView_CreateItemFromOrderFile($_sFile, $_hWnd, $_sDelim=-1)
	If $_sDelim = -1 Then $_sDelim = Opt("GUIDataSeparatorChar")
	Local $sRead = FileRead($_sFile)
	If @error Then Return SetError(1,0,0)
	Local $aItem = StringRegExp($sRead, "([\d\.]*)\" & $_sDelim & "([a-zA-Z0-9ßäöüÄÖÜ _,.+-|µ€§%$&]+)", 3)
	If Not IsArray($aItem) Then Return SetError(2,0,0)
	Local $n = 0, $aTree[UBound($aItem)/2][3]  ; == [[Handle-Item, sOrder, Item-Text]]
	Local $sOrderParent
	For $i = 0 To UBound($aItem) -2 Step 2
		$sOrderParent = __OrderNumber($aItem[$i], False)
		Switch $sOrderParent
			Case ''
				$aTree[$n][0] = _GUICtrlTreeView_Add($_hWnd, 0, $aItem[$i+1])
			Case Else
				For $j = 0 To $n
					If $aTree[$j][1] = $sOrderParent Then
						$aTree[$n][0] = _GUICtrlTreeView_AddChild($_hWnd, $aTree[$j][0], $aItem[$i+1])
					EndIf
				Next
		EndSwitch
		$aTree[$n][1] = $aItem[$i]     ; == sOrder
		$aTree[$n][2] = $aItem[$i+1]   ; == Item-Name
		$n += 1
	Next
	Return $aTree
EndFunc  ;==>_GUICtrlTreeView_CreateItemFromOrderFile

; #FUNCTION# ====================================================================================================================
; Name ..........: _GUICtrlTreeView_GetItemOrder
; Description ...: Liest die Ordnungsreihenfolge der Einträge eines Treeview in einen speicherbaren String (Standard)
; ...............: oder in ein Array
; ...............: Root hat die Ornungsnummer "0". Childs unter Root bekommen "0.1", "0.2" ...
; ...............: Deren Childs erhalten dann "0.1.1", "0.1.2", "0.2.1", "0.2.2" ... usw.
; Syntax ........: _GUICtrlTreeView_GetItemOrder($_hWnd[, $_fString = 1[, $_sDelim = -1]])
; Parameters ....: $_hWnd       Handle des Treeview
; ...............: $_fString    1 (Standard): Ausgabe als String "OrdnungsNr TRENNER ItemText CRLF", 0 gibt Array zurück
; ...............: $_sDelim     -1 (Standard): Trennzeichen von Opt(GUIDataSeparatorChar)
; Return values .: Erfolg       String um Inhalte mit Ordnungsreihenfolge in Datei zu speichern  oder
; ...............:              Array [[Item-Handle, Ordnungsnummer, Item-Text]]
; Author ........: BugFix ( bugfix@autoit.de )
;================================================================================================================================
Func _GUICtrlTreeView_GetItemOrder($_hWnd, $_fString=1, $_sDelim=-1)
	If $_sDelim = -1 Then $_sDelim = Opt("GUIDataSeparatorChar")
	Local $iCount = _GUICtrlTreeView_GetCount($_hWnd)
	If $iCount = 0 Then Return SetError(1,0,0)
	Local $hItem = _GUICtrlTreeView_GetFirstItem($_hWnd), $sOrder = '0'
	Local $aItem[$iCount][3] = [[$hItem, $sOrder, _GUICtrlTreeView_GetText($_hWnd, $hItem)]], $iCurrIndex = 1
	If $iCount > 1 Then __GetItemArray($_hWnd, $hItem, $aItem, $iCurrIndex, $sOrder)
	If Not $_fString Then Return $aItem
	Local $sRet = ''
	For $i = 0 To UBound($aItem) -1
		$sRet &= $aItem[$i][1] & $_sDelim & $aItem[$i][2] & @CRLF
	Next
	Return $sRet
EndFunc  ;==>_GUICtrlTreeView_GetItemOrder

#Region - Helper Functions
Func __GetItemArray($_hWnd, $_hParent, ByRef $_aItem, ByRef $_iIndex, $_sOrderParent)
	Local $sOrder = __OrderNumber($_sOrderParent, True, True)
	Local $hItem = _GUICtrlTreeView_GetFirstChild($_hWnd, $_hParent)
	$_aItem[$_iIndex][0] = $hItem
	$_aItem[$_iIndex][1] = $sOrder
	$_aItem[$_iIndex][2] = _GUICtrlTreeView_GetText($_hWnd, $hItem)
	$_iIndex += 1
	If _GUICtrlTreeView_GetChildCount($_hWnd, $hItem) > 0 Then
		__GetItemArray($_hWnd, $hItem, $_aItem, $_iIndex, $sOrder)
	EndIf
	While 1
		$hItem = _GUICtrlTreeView_GetNextSibling($_hWnd, $hItem)
		If $hItem = 0 Then ExitLoop
		$sOrder = __OrderNumber($sOrder)
		$_aItem[$_iIndex][0] = $hItem
		$_aItem[$_iIndex][1] = $sOrder
		$_aItem[$_iIndex][2] = _GUICtrlTreeView_GetText($_hWnd, $hItem)
		$_iIndex += 1
		If _GUICtrlTreeView_GetChildCount($_hWnd, $hItem) > 0 Then
			__GetItemArray($_hWnd, $hItem, $_aItem, $_iIndex, $sOrder)
		EndIf
	WEnd
EndFunc  ;==>__GetItemArray

Func __OrderNumber($_sOrder, $_fIncrease=True, $_fNextSub=False)
	If $_fIncrease Then  ; == increase order number
		If $_fNextSub Then Return $_sOrder & '.1'
		Local $sLeft, $sRight, $iPos
		$iPos = StringInStr($_sOrder, '.', 1, -1)
		$sLeft = StringLeft($_sOrder, $iPos)
		$sRight = StringTrimLeft($_sOrder, $iPos)
		Return $sLeft & ($sRight +1)
	Else                 ; == get parent order number
		If $_sOrder = '0' Then Return ''
		Local $iPos = StringInStr($_sOrder, '.', 1, -1)
		Return StringLeft($_sOrder, $iPos -1)
	EndIf
EndFunc  ;==>__OrderNumber
#EndRegion - Helper Functions