#include <Array.au3>
#include <File.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>
#include <StructureConstants.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)


Global $a_Tren[4] = ['', '*', '\', '|'], $a_Save[1][2], $b_Save[1][2], $a_Psave[1], $a_Ende, $a_Zsave, $a_Split, $a_NewSave, $z_0, $z_1, $z_2, $z_3, $a_W, $a_W1, $F, $a_La, $a_SU
Global $Form, $a_PE, $a_PP, $hLVH, $hLVH1, $prog, $za = 0.2

$Form = GUICreate('Dubletten - Find - List', 670, 388, -1, -1)
GUISetOnEvent(-3, '_Exit')
$a_PE = GUICtrlCreateListView('', 8, 80, 250, 300)
_GUICtrlListView_AddColumn($a_PE, 'Datei/Name', 166, 0)
_GUICtrlListView_AddColumn($a_PE, 'Fund/Anzahl', 80, 1)
_GUICtrlListView_SetExtendedListViewStyle($a_PE, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_ONECLICKACTIVATE, $LVS_EX_DOUBLEBUFFER))
$hLVH = GUICtrlGetHandle($a_PE)
$a_PP = GUICtrlCreateListView('', 260, 80, 402, 300)
_GUICtrlListView_AddColumn($a_PP, 'Datei/Pfad', 500, 0)
_GUICtrlListView_SetExtendedListViewStyle($a_PP, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_ONECLICKACTIVATE, $LVS_EX_DOUBLEBUFFER))
$hLVH1 = GUICtrlGetHandle($a_PP)
GUICtrlCreateButton('Suche Starten', 560, 15, 100, 50)
GUICtrlSetOnEvent(-1, '_SDL')
$prog = GUICtrlCreateProgress(8, 28, 544, 25)
GUISetState()

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

Func _SDL()
	;GUISetState(@SW_DISABLE, $Form)
	$F = _List_Folder_Dubel(FileSelectFolder('Bitte Zielverzeichnis auswählen', @DesktopDir, 2, '', $Form))
	ToolTip('Bitte warten...', Default, Default, 'Liste wird erstellt!', 1, 3)
	$a_W = $F[0]
	_GUICtrlListView_DeleteAllItems($hLVH)
	Sleep(100)
	If IsArray($a_W) Then
		_GUICtrlListView_BeginUpdate($a_PE)
		_GUICtrlListView_AddArray($hLVH, $a_W)
		_GUICtrlListView_EndUpdate($a_PE)
	EndIf
	_GUICtrlListView_SetColumnWidth($hLVH, 0, $LVSCW_AUTOSIZE_USEHEADER)
	_GUICtrlListView_SetColumnWidth($hLVH, 1, $LVSCW_AUTOSIZE_USEHEADER)
	ToolTip('')
	;GUISetState(@SW_ENABLE, $Form)
EndFunc   ;==>_SDL

Func _PAl()
	GUISetState(@SW_DISABLE, $Form)
	$a_W1 = $F[1]
	$a_NewSave = ''
	$a_La = _GUICtrlListView_GetItemText($a_PE, _GUICtrlListView_GetHotItem($a_PE))
	If IsArray($a_W1) Then
		For $i = 0 To UBound($a_W1) - 1
			$a_Split = StringSplit($a_W1[$i], $a_Tren[2])
			$a_SU = $a_Split[UBound($a_Split) - 1]
			If (StringLeft($a_SU, 5) <> StringLeft($a_La, 5) Or StringRight($a_SU, 5) <> StringRight($a_La, 5)) Then ContinueLoop
			If ($a_SU = $a_La) Then $a_NewSave &= $a_W1[$i] & $a_Tren[3]
		Next
	EndIf
	If ($a_NewSave = '') Then Return
	$a_Split = StringSplit($a_NewSave, $a_Tren[3])
	If IsArray($a_Split) Then
		_GUICtrlListView_BeginUpdate($hLVH1)
		For $i = 1 To UBound($a_Split) - 1
			GUICtrlCreateListViewItem($a_Split[$i], $a_PP)
		Next
		_GUICtrlListView_SetColumnWidth($hLVH1, 0, $LVSCW_AUTOSIZE_USEHEADER)
		_GUICtrlListView_EndUpdate($hLVH1)
	EndIf
	GUISetState(@SW_ENABLE, $Form)
EndFunc   ;==>_PAl

Func _List_Folder_Dubel($a_Pfad)
	ToolTip('Benachrichtigung bei Aktionen' & @CRLF & 'Bitte warten...', Default, Default, 'Daten werden Eingelesen', 1, 3)
	;GUISetState(@SW_HIDE, $Form)
	If StringRight($a_Pfad, 1) <> $a_Tren[2] Then $a_Pfad = $a_Pfad & $a_Tren[2]
	ReDim $b_Save[999999][2]
	ReDim $a_Save[999999][2]
	ReDim $a_Psave[999999]
	$z_0 = 0
	$z_2 = 0
	$z_3 = 0
	_Show_Dubel($a_Pfad)
	ReDim $a_Save[$z_0][2]
	_ArraySort($a_Save)
	ToolTip('')
	ToolTip('Bitte warten...', Default, Default, 'Prüfung gestartet!', 1)
	_Dubel_Finder($a_Save)
	ReDim $b_Save[$z_2][2]
	ReDim $a_Psave[$z_3]
	Dim $a_Dubbel_Save[2] = [$b_Save, $a_Psave]
	;GUISetState(@SW_SHOW, $Form)
	ToolTip('')
	Return ($a_Dubbel_Save)
EndFunc   ;==>_List_Folder_Dubel

Func _Show_Dubel($a_Pfad)
	Dim $a_D = _FileListToArray($a_Pfad, $a_Tren[1], 1);$a_Tren[1]
	For $i = 1 To UBound($a_D) - 1
		$a_Save[$z_0][0] = $a_D[$i]
		$a_Save[$z_0][1] = $a_Pfad & $a_D[$i]
		$z_0 += 1
	Next
	Dim $a_V = _FileListToArray($a_Pfad, $a_Tren[1], 2)
	For $i = 1 To UBound($a_V) - 1
		_Show_Dubel($a_Pfad & $a_V[$i] & $a_Tren[2])
	Next
EndFunc   ;==>_Show_Dubel

Func _Dubel_Finder($c_Save)
	$a_Ende = UBound($c_Save) - 1
	For $i = 0 To $a_Ende Step +1
		;ConsoleWrite($i & '   ' & $a_Ende & '    ' & $c_Save[$i] & @CRLF)
		If ($c_Save[$i][0] = $a_Tren[0]) Then ContinueLoop
		$z_1 = 0
		$d_Save = $a_Tren[0]
		$a_Zsave = $a_Tren[0]
		For $j = $i To $a_Ende Step +1
			If (StringLeft($c_Save[$j][0], 5) <> StringLeft($c_Save[$i][0], 5) Or StringRight($c_Save[$j][0], 5) <> StringRight($c_Save[$i][0], 5)) Then ExitLoop
			If ($c_Save[$j][0] <> $c_Save[$i][0]) Then ContinueLoop
			$z_1 += 1
			$d_Save &= ($j & $a_Tren[3])
			$a_Zsave &= ($c_Save[$j][1] & $a_Tren[3])
		Next
		GUICtrlSetData($prog, $i * 100 / $a_Ende)
		If ($z_1 > 1) Then
			$b_Save[$z_2][0] = $c_Save[$i][0]
			$b_Save[$z_2][1] = $z_1
			$z_2 += 1
			$a_Split = StringSplit($a_Zsave, $a_Tren[3])
			For $s = 1 To UBound($a_Split) - 1
				$a_Psave[$z_3] = $a_Split[$s]
				$z_3 += 1
			Next
			$a_Split = StringSplit($d_Save, $a_Tren[3])
			For $e = 1 To UBound($a_Split) - 1
				$c_Save[$a_Split[$e]][0] = $a_Tren[0]
			Next
		EndIf
	Next
EndFunc   ;==>_Dubel_Finder

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
	$hWndListView = $hLVH
	If Not IsHWnd($hLVH) Then $hWndListView = GUICtrlGetHandle($hLVH)
	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
	$iIDFrom = DllStructGetData($tNMHDR, 'IDFrom')
	$iCode = DllStructGetData($tNMHDR, 'Code')
	Switch $hWndFrom
		Case $hWndListView
			Switch $iCode
				Case $NM_CLICK
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
					ToolTip('Liste wird erstellt Bitte warten...', Default, Default, 'Speicher wird abgefragt!', 1, 3)
					_GUICtrlListView_DeleteAllItems($a_PP)
					_PAl()
					ToolTip('')
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _Exit()
	Exit
EndFunc   ;==>_Exit

While 1 * Sleep(10)
WEnd