#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=..\..\..\..\Dateien\Bilder\Icons\Zerode-Plump-Folder-Archive-zip.ico
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GuiListView.au3>
#include <GuiButton.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Array.au3>

Global $PassedFiles, $FileCounter, $InputFileArray[100]

HotKeySet("{DEL}", "DeleteListViewElement")

#region ### START Koda GUI section ### Form=e:\programme\autoit3\projecte\packer\packer_form.kxf
$Form1_1 = GUICreate("Packer", 359, 395, 323, 205)
$Group1 = GUICtrlCreateGroup("Ausgewählte Dateien", 16, 24, 329, 185)
$ListView1 = GUICtrlCreateListView("Dateiname|Zähler", 24, 40, 313, 161)
_GUICtrlListView_SetColumnWidth($ListView1, 0, 250)
_GUICtrlListView_SetColumnWidth($ListView1, 1, 63)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$lbl_AddFile = GUICtrlCreateLabel("Datei:", 16, 224, 39, 17)
$btn_AddFile = GUICtrlCreateButton("... Durchsuchen", 64, 216, 281, 33)
$btn_MakeArchive = GUICtrlCreateButton("Packen", 16, 344, 329, 33, BitOR($BS_CENTER, $WS_BORDER))
$btn_PathArchive = GUICtrlCreateButton("... Durchsuchen", 64, 256, 281, 33)
$lbl_PathArchive = GUICtrlCreateLabel("Ordner:", 16, 264, 39, 17)
$prog_MakeArchive = GUICtrlCreateProgress(16, 304, 329, 25)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Local $GetArchivPath
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $btn_AddFile
			$InputFile = FileOpenDialog("Gepackte Dateien speichern...", "Bibliotheken\Dokumente", "Alle Dateien (*.*)|Archive (*.zip)", 4) ;Gibt im zweiten Feld den Dateipfad zum Ordner und in den restlichen Feldern die einzelnen Dateien zurück
			$InputFileArray = StringSplit($InputFile, "|")
			If StringLen($InputFileArray[0]) <> 0 Then
				For $k = 2 To UBound($InputFileArray) -1
					$FileCounter = _GUICtrlListView_GetItemCount($ListView1)
					GUICtrlCreateListViewItem($InputFileArray[$k], $ListView1)
					_GUICtrlListView_AddSubItem($ListView1, $FileCounter, $FileCounter + 1, 1)
				Next
			EndIf
		Case $btn_PathArchive
			GUICtrlSetData($btn_PathArchive, "...Durchsuchen")
			$GetArchivePath = FileSelectFolder("Platz zum speichern der Archive auswählen...", "Bibliotheken\Dokumente", "Alle Dateien (*.*)")
			If StringLen($GetArchivePath) <> 0 Then
				GUICtrlSetData($btn_PathArchive, $GetArchivePath)
			EndIf
		Case $btn_MakeArchive
			If _GUICtrlListView_GetItemCount($ListView1) = 0 Then
				MsgBox(64, "Fehlende Dateien!", "Bitte zuerst Dateien der Liste hinzufügen!")
			Else
				If _GUICtrlButton_GetText($btn_PathArchive) == "...Durchsuchen" Then
					MsgBox(64, "Kein Archiv-Pfad angegeben!", "Bitte einen Archiv Pfad angeben!")
				Else
					For $counter = 2 To _GUICtrlListView_GetItemCount($ListView1) + 1
						_BuildInZIP($GetArchivePath & "\" & GetFileName($InputFileArray[$counter]) & ".zip", $InputFileArray[1] & $InputFileArray[$counter])
						$PassedFiles &= "   -" & GetFileName($InputFileArray[$counter]) & @CRLF
						GUICtrlSetData($prog_MakeArchive, (($counter - 1) / _GUICtrlListView_GetItemCount($ListView1)) * 100)
					Next
					MsgBox(64, "Archive wurden erstellt.", "Archive wurden für: " & @CRLF & $PassedFiles & " erstellt!" & @CRLF & "Der Speicherort ist: " & $GetArchivePath & ".")
					ResetAllData()
				EndIf
			EndIf
	EndSwitch
WEnd

#region ResetAllData
Func ResetAllData()
	GUICtrlSetData($btn_PathArchive, "...Durchsuchen")
	GUICtrlSetData($prog_MakeArchive, 0)
	_GUICtrlListView_DeleteAllItems($ListView1)
EndFunc   ;==>ResetAllData
#endregion ResetAllData

#region DeleteListViewElement
Func DeleteListViewElement()
	Dim $SelectedItemsArray = _GUICtrlListView_GetSelectedIndices($ListView1, True)
	If $SelectedItemsArray[0] > 0 Then
		_GUICtrlListView_DeleteItem($ListView1, $SelectedItemsArray[0])
		_ArrayDelete($InputFileArray, $SelectedItemsArray[0])
		For $c = 0 To _GUICtrlListView_GetItemCount($ListView1)
			_GUICtrlListView_AddSubItem($ListView1, $c, $c + 1, 1)
		Next
	EndIf
EndFunc   ;==>DeleteListViewElement
#endregion DeleteListViewElement

#region GetFileName
Func GetFileName($Path)
	$ret = StringSplit($Path, "\", 2)
	If IsArray($ret) Then
		Return $ret[UBound($ret) - 1]
	EndIf
	If @error Then Return -1
EndFunc   ;==>GetFileName
#endregion GetFileName

#region BuildZIPFiles
;===============================================================================
; Function Name:   _BuildInZIP($sPath, $s_a_ToZip, $fUnZip=True, $iIndexBase=1, $fOverwrite=True)
; Description:     Erstellt aus einer Datei od. einem Array von Dateien eine ZIP-Datei
;                  mit Hilfe der Windows eigenen ZIP-Funktion
; Parameter(s):    $sPath       Pfad der zu erstellenden ZIP-Datei // Bestehenden ZIP-Datei
;                  $s_a_ToZip   String der Einzeldatei oder Array der zu zippenden Dateien
;                               // Pfad des Zielordners, in den entpackt werden soll
;                  $fUnZip=True Entpacken=True, Packen=False (Standard)
;                  $iIndexBase  Index Basis (erstes Element mit Pfad) des übergebenen Arrays (0 od.1)
;                  $fOverwrite  Falls $sPath existiert ==> Überschreiben (Standard=True)
; Return Value(s): Erfolg  1
;                  Fehler  set @error  1 - Überschreiben aus, aber Zieldatei existiert
;                                      2 - Zieldatei endet nicht auf ".zip"
;                                      3 - zu komprimierende Datei existiert nicht
;                                          @extended: Anzahl der fehlenden Dateien
; Author(s):       BugFix (bugfix@autoit.de)
;===============================================================================

Func _BuildInZIP($sPath, $s_a_ToZip, $fUnZip = False, $iIndexBase = 1, $fOverwrite = True)
	Local $fh, $sNul = '', $sZIPHeader, $objShell = ObjCreate("Shell.Application"), $objZipOrdner, $err = 0
	$sPath = FileGetLongName($sPath, 1)
	If $fUnZip Then
		Local $temp, $objZip
		If Not FileExists($s_a_ToZip) Then DirCreate($s_a_ToZip)
		$temp = $objShell.Namespace($s_a_ToZip)
		$objZip = $objShell.Namespace($sPath)
		$temp.CopyHere($objZip.Items)
		Return 1
	EndIf
	If (Not $fOverwrite) And FileExists($sPath) Then Return SetError(1, 0, 0)
	If StringRight($sPath, 4) <> '.zip' Then Return SetError(2, 0, 0)
	For $i = 1 To 18
		$sNul &= Chr(0)
	Next
	$sZIPHeader = Chr(80) & Chr(75) & Chr(5) & Chr(6) & $sNul
	$fh = FileOpen($sPath, 10)
	FileWrite($fh, $sZIPHeader)
	FileClose($fh)
	$objZipOrdner = $objShell.Namespace($sPath)
	If Not IsArray($s_a_ToZip) Then
		If Not FileExists($s_a_ToZip) Then Return SetError(3, 1, 0)
		$objZipOrdner.CopyHere($s_a_ToZip)
		Sleep(1000)
		Return 1
	EndIf
	For $i = $iIndexBase To UBound($s_a_ToZip) - 1
		If Not FileExists($s_a_ToZip[$i]) Then
			$err += 1
			ContinueLoop
		EndIf
		$objZipOrdner.CopyHere($s_a_ToZip[$i])
		Sleep(1000)
	Next
	If $err Then Return SetError(3, $err, 0)
	Return 1
EndFunc   ;==>_BuildInZIP
#endregion BuildZIPFiles