#region INCLUDES & STUFF
; ### GUI-Includes ###
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ProgressConstants.au3>
#include <ComboConstants.au3>
#include <GuiCombobox.au3>
#include <GuiComboBoxEx.au3>

; ### Other Includes ###
#include <File.au3>
#include <Array.au3>
#include <GuiListView.au3>
#include <SendMessage.au3>
#include <SQLite.au3>
#include <SQLite.dll.au3>

#NoAutoIt3Execute

; ### OPT  & REGISTER ###
Opt("TrayAutoPause", 0)
Opt("TrayMenuMode", 1)
Opt("GuiOnEventMode", 1)
Opt("TrayOnEventMode", 1)

OnAutoItExitRegister("_Exit")

AdlibRegister("_UpdateTime", 1000)

_SQLite_Startup()

$hFileList = _SQLite_Open("Filelist.db")
If @error Then _SQLite_Err()

; ### VAR ###
Global $aData[2][3]
Global $aTemp[1]
Global $aParts[3] = [200, 635, 30]
Global $bAbort = False

Global $iSearch
Global $iSearchBackup
Global $sQuery
Global $iIndex
Global $sRadioState
Global $bCloseWindow
Global $sLastComment
Global $hFileList
Global $sRetType
Global $aRet

Local $aResult, $iRows, $iColumns
If Not _SQLite_GetTable2d(-1, "SELECT * FROM Settings;", $aResult, $iRows, $iColumns) = $SQLITE_OK Then
	If Not _SQLite_Exec($hFileList, "CREATE TABLE Settings (Type, Value);") = $SQLITE_OK Then
		$bAbort = True
		_SQLite_Err()
	EndIf
	_SQLite_Exec(-1,"INSERT INTO Settings values ('DBLCLICK','RUN'); INSERT INTO Settings values ('CLOSEWND','FALSE');") ; buggy
EndIf

If _SQLite_GetTable2d(-1, "SELECT * FROM Settings WHERE Type='DBLCLICK';", $aResult, $iRows, $iColumns) = $SQLITE_OK Then $sRadioState = $aResult[1][1]
If _SQLite_GetTable2d(-1, "SELECT * FROM Settings WHERE Type='CLOSEWND';", $aResult, $iRows, $iColumns) = $SQLITE_OK Then $bCloseWindow = $aResult[1][1]

#endregion INCLUDES & STUFF

#region ### GUI ###

$hMain = GUICreate("Programmdatenbank", 692, 378, 203, 126)
$ListView1 = GUICtrlCreateListView("Dateiname|Pfad|Beschreibung|Größe", 8, 64, 538, 286)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 100)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 100)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 250)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 3, 50)
$Group1 = GUICtrlCreateGroup("Funktionen ", 552, 64, 137, 145)
$ButtonAddEntry = GUICtrlCreateButton("Eintrag hinzufügen", 560, 112, 123, 25, $WS_GROUP)
$ButtonDelEntry = GUICtrlCreateButton("Eintrag löschen", 560, 176, 123, 25, $WS_GROUP)
$ButtonOpenAddFolderGui = GUICtrlCreateButton("Ordner hinzufügen", 560, 80, 123, 25, $WS_GROUP)
$ButtonChangeDesc = GUICtrlCreateButton("Details", 560, 144, 123, 25, $WS_GROUP)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup("Suchfeld ", 8, 8, 681, 49)
$InputSearchMain = GUICtrlCreateInput("", 16, 24, 409, 21)
$ButtonSearchMain = GUICtrlCreateButton("Suchen", 432, 24, 123, 25, $WS_GROUP)
$ButtonNextResult = GUICtrlCreateButton("Nächstes Ergebnis", 560, 24, 123, 25, $WS_GROUP)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group3 = GUICtrlCreateGroup("Programmfunktionen ", 552, 216, 137, 81)
$ButtonRunFile = GUICtrlCreateButton("Starten", 560, 232, 123, 25, $WS_GROUP)
$Button10 = GUICtrlCreateButton("Einstellungen", 560, 264, 123, 25)
GUICtrlSetOnEvent(-1, "_Settings")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group4 = GUICtrlCreateGroup("Andere Funktionen ", 552, 304, 137, 49)
$ButtonExit = GUICtrlCreateButton("Beenden", 560, 320, 123, 25, $WS_GROUP)
GUICtrlCreateGroup("", -99, -99, 1, 1)

$hDesc = GUICreate("Beschreibung ändern", 385, 297, 202, 129)
$Group1 = GUICtrlCreateGroup("Daten", 8, 8, 273, 185)
$LabelFileName = GUICtrlCreateLabel("Dateiname:", 16, 24, 61, 17)
$InputFileName = GUICtrlCreateInput("", 16, 40, 129, 21, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$LabelFilePath = GUICtrlCreateLabel("Dateipfad:", 16, 64, 53, 17)
$InputFilePath = GUICtrlCreateInput("", 16, 80, 257, 21, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$LabelFileDesc = GUICtrlCreateLabel("Beschreibung:", 16, 104, 72, 17)
$InputFileDesc = GUICtrlCreateEdit("", 16, 128, 257, 57, $ES_WANTRETURN)
GUICtrlSetData(-1, "")
$LabelFileSizeDesc = GUICtrlCreateLabel("Dateigröße: (MB)", 152, 24, 83, 17)
$InputFileSizeDesc = GUICtrlCreateInput("", 152, 40, 121, 21, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup("Aktionen", 288, 8, 89, 121)
$ButtonSaveDesc = GUICtrlCreateButton("Speichern", 296, 24, 75, 30, $WS_GROUP)
$ButtonDelEntry_Desc = GUICtrlCreateButton("Löschen", 296, 88, 75, 30, $WS_GROUP)
$ButtonAbort = GUICtrlCreateButton("Abbrechen", 296, 56, 75, 30, $WS_GROUP)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$ButtonRunFileDesc = GUICtrlCreateButton("STARTEN", 288, 136, 89, 57, $WS_GROUP)
$Group4 = GUICtrlCreateGroup("Element auswählen", 8, 200, 369, 89)
$Combo1 = GUICtrlCreateCombo("", 16, 216, 273, 30)
$ButtonNextEntry = GUICtrlCreateButton("Nächstes", 296, 216, 75, 30, $WS_GROUP)
$ButtonPrevEntry = GUICtrlCreateButton("Vorheriges", 296, 248, 75, 30, $WS_GROUP)
$InputSearchDesc = GUICtrlCreateInput("", 16, 254, 193, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL))
$ButtonSearchDesc = GUICtrlCreateButton("Suchen", 216, 248, 75, 30, $WS_GROUP)
GUICtrlCreateGroup("", -99, -99, 1, 1)

$hAddFolder = GUICreate("Ordner hinzufügen", 377, 220, 190, 124)
$Group1 = GUICtrlCreateGroup("Pfad ", 8, 8, 361, 49)
$InputFolderPath = GUICtrlCreateInput("", 16, 24, 257, 21)
$ButtonSelectFolder = GUICtrlCreateButton("Durchsuchen", 280, 22, 83, 25, $WS_GROUP)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup("Optionen (Derzeit deaktiviert)", 8, 64, 361, 113)
$CheckboxExludeFiles = GUICtrlCreateCheckbox("Dateien ausschließen", 16, 80, 129, 17)
$LabelFileExtensions = GUICtrlCreateLabel("Datenendungen: ", 16, 104, 87, 17)
$InputFileTypes = GUICtrlCreateInput("", 104, 100, 145, 21)
GUICtrlSetTip(-1, "Verschiedene Dateitypen mit '|' trennen.")
$Label1FileSize = GUICtrlCreateLabel("Datei muss ", 16, 128, 59, 17)
$ComboFileCompareType = GUICtrlCreateCombo("", 80, 124, 49, 25)
GUICtrlSetData(-1, ">|<|=")
$InputFileSize = GUICtrlCreateInput("", 136, 124, 113, 21, BitOR($ES_AUTOHSCROLL, $ES_NUMBER))
$ComboFileSize = GUICtrlCreateCombo("", 256, 124, 73, 25)
GUICtrlSetData(-1, "Byte|Kilobyte|Megabyte|Gigabyte")
$Label2FileSize = GUICtrlCreateLabel("sein", 336, 128, 23, 17)
$Label1NotAllowedChar = GUICtrlCreateLabel("Darf ", 16, 152, 27, 17)
$InputNotAllowedChar = GUICtrlCreateInput("", 48, 148, 201, 21)
GUICtrlSetTip(-1, "Mehrere Phrasen mit '|' trennen.")
$Label2NotAllowedChar = GUICtrlCreateLabel("nicht enthalten", 256, 152, 74, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$ButtonAddFolder = GUICtrlCreateButton("Ordner hinzufügen", 8, 184, 363, 30, $WS_GROUP)

$hSettings = GUICreate("Einstellungen", 209, 120, 206, 145)
$Group1 = GUICtrlCreateGroup("Items", 8, 0, 193, 89)
$Label1 = GUICtrlCreateLabel("Aktion bei Doppelklick in Listview:", 16, 16, 168, 17)
$RadioRunProgramm = GUICtrlCreateRadio("Programm starten", 16, 40, 113, 17)
$RadioShowDetails = GUICtrlCreateRadio("Details anzeigen", 16, 64, 113, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$CheckboxCloseAfterSave = GUICtrlCreateCheckbox("Detail-GUI nach Speichern schließen", 8, 96, 193, 17)

; 1. GUI
GUICtrlSetOnEvent($ButtonAddEntry, "_AddEntry")
GUICtrlSetOnEvent($ButtonDelEntry, "_DeleteEntry")
GUICtrlSetOnEvent($ButtonOpenAddFolderGui, "_AddFolderGui")
GUICtrlSetOnEvent($ButtonChangeDesc, "_ChangeDesc")
GUICtrlSetOnEvent($ButtonSearchMain, "_Search")
GUICtrlSetOnEvent($ButtonNextResult, "_Next")
GUICtrlSetOnEvent($ButtonRunFile, "_Run")
GUICtrlSetOnEvent($ButtonExit, "_Exit")
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $hMain)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
; 2.GUI
GUICtrlSetOnEvent($ButtonSearchDesc, "_hDescSearch")
GUICtrlSetOnEvent($ButtonSaveDesc, "_SaveDesc")
GUICtrlSetOnEvent($ButtonDelEntry_Desc, "_DeleteEntry")
GUICtrlSetOnEvent($ButtonAbort, "_ChangeDesc")
GUICtrlSetOnEvent($ButtonRunFileDesc, "_Run")
GUICtrlSetOnEvent($Combo1, "_SelElement")
GUICtrlSetOnEvent($ButtonNextEntry, "_ChangeElement")
GUICtrlSetOnEvent($ButtonPrevEntry, "_ChangeElement")
GUISetOnEvent($GUI_EVENT_CLOSE, "_ChangeDesc", $hDesc)
; 3.GUI
GUICtrlSetOnEvent($ButtonSelectFolder, "_FileSelectFolder")
GUICtrlSetOnEvent($CheckboxExludeFiles, "_ExcludeFiles")
GUICtrlSetOnEvent($ButtonAddFolder, "_AddFolder")
GUISetOnEvent($GUI_EVENT_CLOSE, "_AddFolderGui", $hAddFolder)
GUICtrlSetState($CheckboxExludeFiles, $GUI_DISABLE)
GUICtrlSetState($InputFileTypes, $GUI_DISABLE)
GUICtrlSetState($ComboFileSize, $GUI_DISABLE)
GUICtrlSetState($InputFileSize, $GUI_DISABLE)
GUICtrlSetState($ComboFileCompareType, $GUI_DISABLE)
GUICtrlSetState($InputNotAllowedChar, $GUI_DISABLE)
GUICtrlSetState($LabelFileExtensions, $GUI_DISABLE)
GUICtrlSetState($Label1FileSize, $GUI_DISABLE)
GUICtrlSetState($Label2FileSize, $GUI_DISABLE)
GUICtrlSetState($Label1NotAllowedChar, $GUI_DISABLE)
GUICtrlSetState($Label2NotAllowedChar, $GUI_DISABLE)
; 4.GUI
Switch $sRadioState
	Case "RUN"
		GUICtrlSetState($RadioRunProgramm, $GUI_CHECKED)
	Case "SHOWDETAILS"
		GUICtrlSetState($RadioShowDetails, $GUI_CHECKED)
EndSwitch

Switch $bCloseWindow
	Case True
		GUICtrlSetState($CheckboxCloseAfterSave, $GUI_CHECKED)
	Case False
		GUICtrlSetState($CheckboxCloseAfterSave, $GUI_UNCHECKED)
EndSwitch
GUISetOnEvent($GUI_EVENT_CLOSE, "_Settings", $hSettings)
#endregion ### GUI ###

#region STATUSBAR

$hStatusBar1 = _GUICtrlStatusBar_Create($hMain)
_GUICtrlStatusBar_SetParts($hStatusBar1, $aParts)
_Status("Bereit")
$Progress1 = GUICtrlCreateProgress(0, 0, -1, -1, $PBS_MARQUEE)
GUICtrlSetData($Progress1, 0)
$hProgress = GUICtrlGetHandle($Progress1)
_GUICtrlStatusBar_EmbedControl($hStatusBar1, 1, $hProgress)
_UpdateTime()

Global $hListView1 = GUICtrlGetHandle($ListView1)
Global $hCombo1 = GUICtrlGetHandle($Combo1)
#endregion STATUSBAR

#region MAIN PROGRAMM



GUICtrlSetState($InputSearchMain, $GUI_FOCUS)

GUISetState(@SW_SHOW, $hMain)

_ReadSQLiteDB()

#endregion MAIN PROGRAMM


While 1
	Sleep(100)
WEnd

#region ############################## ################ ##############################
#region ############################## SQLITE FUNCTIONS ##############################
#region ############################## ################ ##############################

Func _ReadSQLiteDB()
	Local $aData, $iRows, $iColumns
	If Not _SQLite_GetTable2d(-1, "SELECT * FROM Programms;", $aData, $iRows, $iColumns) = $SQLITE_OK Then
		If Not _SQLite_Exec($hFileList, "CREATE TABLE Programms (Name, Path, Comment, Size);") = $SQLITE_OK Then
			$bAbort = True
			_SQLite_Err()
		EndIf
	EndIf
	_GUICtrlListView_DeleteAllItems($hListView1)
	_GUICtrlListView_AddArray($hListView1, $aData)
	_GUICtrlListView_DeleteItem($hListView1, 0)
EndFunc   ;==>_ReadSQLiteDB

Func _SQLite_Err($bExit = True)
	MsgBox(16, "SQLite Error", _SQLite_ErrMsg())
	If $bExit Then Exit
EndFunc   ;==>_SQLite_Err

#endregion ############################## ################ ##############################

#region ############################## ################ ##############################
#region ############################## ADDING FUNCTIONS ##############################
#region ############################## ################ ##############################

Func _FileSelectFolder()
	$sFolder = FileSelectFolder("Bitte Ordner auswählen", "", 2, Default, $hMain)
	If $sFolder = "" Then Return
	GUICtrlSetData($InputFolderPath, $sFolder)
	WinActivate(_WinAPI_GetWindowText($hAddFolder))
EndFunc   ;==>_FileSelectFolder

Func _ExcludeFiles()
	If GUICtrlRead($CheckboxExludeFiles) = 1 Then
		GUICtrlSetState($InputFileTypes, $GUI_ENABLE)
		GUICtrlSetState($ComboFileSize, $GUI_ENABLE)
		GUICtrlSetState($InputFileSize, $GUI_ENABLE)
		GUICtrlSetState($ComboFileCompareType, $GUI_ENABLE)
		GUICtrlSetState($InputNotAllowedChar, $GUI_ENABLE)
		GUICtrlSetState($LabelFileExtensions, $GUI_ENABLE)
		GUICtrlSetState($Label1FileSize, $GUI_ENABLE)
		GUICtrlSetState($Label2FileSize, $GUI_ENABLE)
		GUICtrlSetState($Label1NotAllowedChar, $GUI_ENABLE)
		GUICtrlSetState($Label2NotAllowedChar, $GUI_ENABLE)
	Else
		GUICtrlSetState($InputFileTypes, $GUI_DISABLE)
		GUICtrlSetState($ComboFileSize, $GUI_DISABLE)
		GUICtrlSetState($InputFileSize, $GUI_DISABLE)
		GUICtrlSetState($ComboFileCompareType, $GUI_DISABLE)
		GUICtrlSetState($InputNotAllowedChar, $GUI_DISABLE)
		GUICtrlSetState($LabelFileExtensions, $GUI_DISABLE)
		GUICtrlSetState($Label1FileSize, $GUI_DISABLE)
		GUICtrlSetState($Label2FileSize, $GUI_DISABLE)
		GUICtrlSetState($Label1NotAllowedChar, $GUI_DISABLE)
		GUICtrlSetState($Label2NotAllowedChar, $GUI_DISABLE)
	EndIf
EndFunc   ;==>_ExcludeFiles

Func _AddFolderGui()
	Switch _WinAPI_IsWindowVisible($hAddFolder)
		Case True
			GUISetState(@SW_HIDE, $hAddFolder)

		Case False
			GUISetState(@SW_SHOW, $hAddFolder)
	EndSwitch
EndFunc   ;==>_AddFolderGui

Func _AddFolder()
	Local $aDataRawNew[1]
	Local $szDrive, $szDir, $szFName, $szExt, $sPercGes, $sQuery
	Local $sFolder = GUICtrlRead($InputFolderPath)
	Local $sFileExtentions = GUICtrlRead($InputFileTypes)
	Local $sFileCompareType = GUICtrlRead($ComboFileCompareType)
	Local $sFileSize = GUICtrlRead($InputFileSize)
	Local $sFileSizeType = GUICtrlRead($ComboFileSize)
	Local $sNotAllowedChar = GUICtrlRead($InputNotAllowedChar)

	If GUICtrlRead($CheckboxExludeFiles) = 1 And ($sFileCompareType = "" Or $sFileSize = "" Or $sFileSizeType = "") Then
		MsgBox(48, "Fehler", "Bitte die Felder zur Größenangabe ausfüllen!")
		Return
	EndIf
	Switch $sFileSizeType
		Case "Byte"
			$sDivisor = "*1"
		Case "Megabyte"
			$sDivisor = "*1048576"
		Case "Kilobyte"
			$sDivisor = "*1024"
		Case "Gigabyte"
			$sDivisor = "*1073741824"
	EndSwitch
	If $sFolder = "" Or Not FileExists($sFolder) Then Return
	_AddFolderGui()
	_Status("Ordner wird durchsucht")
	_SendMessage($hProgress, $PBM_SETMARQUEE, True, 10)
	$aDataRawNew = _GetFilesFolder_Rekursiv($sFolder, "exe|zip|rar|7z|tar|gz|bz2", 0)
	$sPerc = 100 / (UBound($aDataRawNew) - 1)
	For $i = 1 To UBound($aDataRawNew) - 1
		ReDim $aData[UBound($aData) + 1][3]
		$aTempPath = _PathSplit($aDataRawNew[$i], $szDrive, $szDir, $szFName, $szExt)
		If GUICtrlRead($CheckboxExludeFiles) = 1 Then
			If Not StringInStr($aTempPath[3] & $aTempPath[4], $sNotAllowedChar, 1) And Execute(FileGetSize($aDataRawNew[$i]) & " " & $sFileCompareType & " " & Execute($sFileSize & $sDivisor)) = True And Not StringInStr($sFileExtentions, $aTempPath[4], 1) = 1 Then _SQLite_Exec(-1, "INSERT INTO Programms values ('" & $aTempPath[3] & $aTempPath[4] & "','" & $aTempPath[0] & "','Keine Beschreibung angegeben!'," & "'" & Round(FileGetSize($aTempPath[0]) / 1048576, 3) & "');")
		Else
;~ 			$sQuery &= "INSERT INTO Programms values ('" & $aTempPath[3] & $aTempPath[4] & "','" & $aTempPath[0] & "','Keine Beschreibung angegeben!'," & "'" & Round(FileGetSize($aTempPath[0]) / 1048576, 3) & "');"
			_SQLite_Exec(-1, "INSERT INTO Programms values ('" & $aTempPath[3] & $aTempPath[4] & "','" & $aTempPath[0] & "','Keine Beschreibung angegeben!'," & "'" & Round(FileGetSize($aTempPath[0]) / 1048576, 3) & "');")
		EndIf
		$sPercGes += $sPerc
		_Status("Einträge schreiben: " & Round($sPercGes, 0) & "%")
	Next
	_ReadSQLiteDB()
	_Status("Bereit")
EndFunc   ;==>_AddFolder

Func _AddEntry()
	Local $szDrive, $szDir, $szFName, $szExt

	$sNewEntry = FileOpenDialog("Neue Datei hinzufügen", Default, "Zugelassene Dateien (*.exe;*.7z;*.zip;*.rar)")
	If @error Then Return
	ReDim $aData[UBound($aData) + 1][3]
	$aTempPath = _PathSplit($sNewEntry, $szDrive, $szDir, $szFName, $szExt)
	_SQLite_Exec(-1, "INSERT INTO Programms values ('" & $aTempPath[3] & $aTempPath[4] & "','" & $aTempPath[0] & "','Keine Beschreibung angegeben!'," & "'" & Round(FileGetSize($aTempPath[0]) / 1048576, 3) & "');")
	_ReadSQLiteDB()
EndFunc   ;==>_AddEntry
#endregion ############################## ################ ##############################

#region ############################## ################ ##############################
#region ############################## DETAIL FUNCTIONS ##############################
#region ############################## ################ ##############################

Func _ChangeElement()
	Switch @GUI_CtrlId
		Case $ButtonNextEntry
			_GUICtrlComboBox_SetCurSel($hCombo1, _GUICtrlComboBox_GetCurSel($hCombo1) + 1)
		Case $ButtonPrevEntry
			_GUICtrlComboBox_SetCurSel($hCombo1, _GUICtrlComboBox_GetCurSel($hCombo1) - 1)
		Case Else
			_GUICtrlComboBox_SetCurSel($hCombo1, _GUICtrlComboBox_GetCurSel($hCombo1) + 1)
	EndSwitch
	_SelElement()
EndFunc   ;==>_ChangeElement

Func _SelElement()
	Local $sNewEntryMarked = GUICtrlRead($Combo1), $aResult[1], $iRows, $iColumns
	If $sNewEntryMarked <> "" Then
		_SQLite_GetTable2d(-1, "SELECT * FROM Programms Where Name='" & $sNewEntryMarked & "'", $aResult, $iRows, $iColumns)
		GUICtrlSetData($InputFileName, $aResult[1][0])
		GUICtrlSetData($InputFilePath, $aResult[1][1])
		GUICtrlSetData($InputFileDesc, $aResult[1][2])
		GUICtrlSetData($InputFileSizeDesc, $aResult[1][3])
	EndIf
EndFunc   ;==>_SelElement

Func _ChangeDesc($iIndex = -1)
	Local $sFileNames, $aResult[1], $iRows, $iColumns
	If _WinAPI_IsWindowVisible($hDesc) = True Then
		GUISetState(@SW_HIDE, $hDesc)
		GUICtrlSetState($InputSearchMain, $GUI_FOCUS)
		Return
	Else
		GUISetState(@SW_SHOW, $hDesc)
	EndIf

	If Not IsDeclared($iIndex) Then $iIndex = -1
	$aTemp = _GUICtrlListView_GetItemTextArray($hListView1, $iIndex)
	If $aTemp[1] = "" Then
		_ChangeDesc()
		Return
	EndIf

	_SQLite_GetTable2d(-1, "SELECT Name FROM Programms", $aResult, $iRows, $iColumns)

	For $iTemp = 1 To UBound($aResult, 1) - 1
		$sFileNames &= "|" & $aResult[$iTemp][0]
	Next

	GUICtrlSetData($Combo1, $sFileNames)

	_SQLite_GetTable2d(-1, "SELECT * FROM Programms Where Name='" & $aTemp[1] & "'", $aResult, $iRows, $iColumns, -1, True)

	GUICtrlSetData($InputFileName, $aResult[0][1])
	GUICtrlSetData($InputFilePath, $aResult[1][1])
	GUICtrlSetData($InputFileDesc, $aResult[2][1])
	GUICtrlSetData($InputFileSizeDesc, $aResult[3][1])

	$sTemp = GUICtrlRead($InputFileName)
	$aTempList = _GUICtrlComboBox_GetListArray($Combo1)
	For $iTemp = 1 To $aTempList[0]
		If StringInStr($aTempList[$iTemp], $sTemp, 1) Then ExitLoop
	Next
	_GUICtrlComboBox_SetCurSel($hCombo1, $iTemp - 1)
EndFunc   ;==>_ChangeDesc

Func _SaveDesc()
	Local $sTempName = GUICtrlRead($InputFileName)
	Local $sTempDesc = GUICtrlRead($InputFileDesc)
	If StringLen($sTempDesc) = 0 Then Return
	_SQLite_Exec(-1, "UPDATE Programms SET Comment='" & $sTempDesc & "' WHERE Name='" & $sTempName & "';")
	_ReadSQLiteDB()
	If BitAND(GUICtrlRead($CheckboxCloseAfterSave), $GUI_CHECKED) = $GUI_CHECKED Then _ChangeDesc()
EndFunc   ;==>_SaveDesc
#endregion ############################## ################ ##############################

#region ############################## ################ ##############################
#region ############################## SEARCH FUNCTIONS ##############################
#region ############################## ################ ##############################

Func _hDescSearch()
	$sQuery = GUICtrlRead($InputSearchDesc)
	If $sQuery = "" Or @error Then Return
	$iSearch = _GUICtrlComboBox_FindString($hCombo1, $sQuery)
	If $iSearch <> -1 Then
		_GUICtrlComboBox_SetCurSel($hCombo1, $iSearch)
		_SelElement()
	Else
		MsgBox(48, "Fehler", "Kein passender Eintrag gefunden!")
	EndIf
EndFunc   ;==>_hDescSearch

Func _Search()
	$sQuery = GUICtrlRead($InputSearchMain)
	If $sQuery = "" Or @error Then Return
	_Status("Suchvorgang läuft")
	_SendMessage($hProgress, $PBM_SETMARQUEE, True, 10)
	For $iSearch = 0 To _GUICtrlListView_GetItemCount($hListView1)
		$aTemp = _GUICtrlListView_GetItemTextArray($hListView1, $iSearch)
		$sTemp = _ArrayToString($aTemp, "|", 1, 3)
		If StringInStr($sTemp, $sQuery, 2) <> 0 Then ExitLoop
	Next
	If $iSearch = _GUICtrlListView_GetItemCount($hListView1) Then
		MsgBox(48, "Fehler", "Kein passender Eintrag gefunden!")
		_Status("Kein Ergebnis gefunden - Bereit")
	Else
		_GUICtrlListView_SetItemSelected($hListView1, $iSearch, True, True)
		_Status("Ergebnis gefunden - Bereit")
		_GUICtrlListView_ClickItem($hListView1, $iSearch)
		$iSearchBackup = $iSearch
	EndIf
	_SendMessage($hProgress, $PBM_SETMARQUEE, False, 10)
	GUICtrlSetState($ButtonNextResult, $GUI_FOCUS)
EndFunc   ;==>_Search

Func _Next()
	Switch $iSearchBackup
		Case 0
			MsgBox(48, "Fehler", "Bitte zuerst einen Suchvorgang ausführen!")
			Return
		Case Else
			If $sQuery <> GUICtrlRead($InputSearchMain) Then
				MsgBox(48, "Error", "Der Suchbegriff hat sich geändert!")
				Return
			Else
				_Status("Suchvorgang läuft")
				_SendMessage($hProgress, $PBM_SETMARQUEE, True, 10)
				For $iTemp = $iSearchBackup + 1 To _GUICtrlListView_GetItemCount($hListView1)
					$aTemp = _GUICtrlListView_GetItemTextArray($hListView1, $iTemp)
					$sTemp = _ArrayToString($aTemp, "|", 1, 3)
					If StringInStr($sTemp, $sQuery, 2) <> 0 Then ExitLoop
				Next
				If $iTemp = _GUICtrlListView_GetItemCount($hListView1) Then
					MsgBox(48, "Fehler", "Kein passender Eintrag gefunden!")
					_Status("Kein Ergebnis gefunden - Bereit")
				Else
					_GUICtrlListView_SetItemSelected($hListView1, $iTemp, True, True)
					_Status("Ergebnis gefunden - Bereit")
					_GUICtrlListView_ClickItem($hListView1, $iTemp)
					$iSearchBackup = $iTemp
				EndIf
				_SendMessage($hProgress, $PBM_SETMARQUEE, False, 10)
			EndIf
	EndSwitch
EndFunc   ;==>_Next

#endregion ############################## ################ ##############################

#region ############################## ############### ###############################
#region	############################## ENTRY FUNCTIONS ###############################
#region	############################## ############### ###############################

Func _Run()
	Switch @GUI_CtrlId
		Case $ButtonRunFileDesc
			$aTemp = _GUICtrlComboBoxEx_GetItem($hCombo1, _GUICtrlComboBoxEx_GetCurSel($hCombo1))
			$aTempList = _GUICtrlComboBox_GetListArray($Combo1)
			For $iTemp = 1 To $aTempList[0]
				If StringInStr($aTempList[$iTemp], $aTemp[0], 1) Then ExitLoop
			Next
			$iIndex = $iTemp - 1
		Case $ButtonRunFile
			$iIndex = -1
	EndSwitch

	$aTemp = _GUICtrlListView_GetItemTextArray($hListView1, $iIndex)
	ShellExecute($aTemp[2])
EndFunc   ;==>_Run

Func _DeleteEntry()
	If MsgBox(48 + 4, "Achtung!", "Wollen Sie dieses Element wirklich löschen?") = 6 Then
		$aTemp = _GUICtrlListView_GetItemTextArray($hListView1)
		_SQLite_Exec(-1, "DELETE FROM Programms Where Path='" & $aTemp[2] & "';")
		If WinActive(_WinAPI_GetWindowText($hDesc)) Then _ChangeElement()
		_ReadSQLiteDB()
	EndIf
EndFunc   ;==>_DeleteEntry
#endregion	############################## ############### ###############################

#region ############################## ############### ###############################
#region ############################## OTHER FUNCTIONS ###############################
#region ############################## ############### ###############################

Func _Exit()
	OnAutoItExitUnregister("_Exit")
	_SQLite_Close($hFileList)
	_SQLite_Shutdown()
	Exit
EndFunc   ;==>_Exit

Func _Settings()
	Switch _WinAPI_IsWindowVisible($hSettings)
		Case True
			GUISetState(@SW_HIDE, $hSettings)
			Select
				Case BitAND(GUICtrlRead($RadioRunProgramm), $GUI_CHECKED) = $GUI_CHECKED
					$sRadioState = "RUN"
				Case BitAND(GUICtrlRead($RadioShowDetails), $GUI_CHECKED) = $GUI_CHECKED
					$sRadioState = "SHOWDETAILS"
				Case Bitand(GUICtrlRead($CheckboxCloseAfterSave), $GUI_CHECKED) = $GUI_CHECKED
					$bCloseWindow = True
				Case Bitand(GUICtrlRead($CheckboxCloseAfterSave), $GUI_CHECKED) <> $GUI_CHECKED
					$bCloseWindow = False
			EndSelect
			_SQLite_Exec(-1,"UPDATE Settings SET Value='" & $sRadioState & "' WHERE Type='DBLCLICK';")
			_SQLite_Exec(-1,"UPDATE Settings SET Value='" & $bCloseWindow & "' WHERE Type='CLOSEWND';")

		Case False
			GUISetState(@SW_SHOW, $hSettings)
	EndSwitch
EndFunc   ;==>_Settings

Func _UpdateTime()
	_GUICtrlStatusBar_SetText($hStatusBar1, @HOUR & ":" & @MIN & ":" & @SEC, 2)
EndFunc   ;==>_UpdateTime

Func _Status($sText)
	_GUICtrlStatusBar_SetText($hStatusBar1, $sText)
EndFunc   ;==>_Status

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
	$hWndListView = $ListView1
	If Not IsHWnd($ListView1) Then $hWndListView = GUICtrlGetHandle($ListView1)
	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	If $hWndFrom = $hWndListView And $iCode = $NM_DBLCLK Then
		$iIndex = ((DllStructGetData(DllStructCreate($tagNMITEMACTIVATE, $ilParam), "Index")))
		Switch $sRadioState

			Case "RUN"
				$aTemp = _GUICtrlListView_GetItemTextArray($hListView1, $iIndex)
				If ShellExecute($aTemp[2]) = 0 Then MsgBox(48, "Fehler", "Konnte Programm(" & $aTemp[1] & ") nicht starten!")
			Case "SHOWDETAILS"
				_ChangeDesc($iIndex)
		EndSwitch
	EndIf
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
#endregion ############################## ############### ###############################

#region ##############################################################################
#region ##############################################################################
#region ###############################################################################

; ### Funktion von mir leicht verändert, um nach mehrerern Dateiendungen suchen zu können ###

;==================================================================================================
; Function Name:   _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
; Description:     Rekursive Auflistung von Dateien und/oder Ordnern
; Parameter(s):    $sPath     der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
;                  $sExt      Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
;                  $iDir      -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
;      optional:   $iRetType  0 gibt Array, 1 gibt String zurück
;      optional:   $sDelim    legt Trennzeichen für Stringrückgabe fest
;                             0 -@CRLF (Standard)  1 -@CR  2 -@LF  3 -';'  4 -'|'
; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
;                  Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
; Author(s):       BugFix (bugfix@autoit.de)
; Modified:		   oetzn
;==================================================================================================
Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $iRetType = 0, $sDelim = '0')
	Global $oFSO = ObjCreate('Scripting.FileSystemObject')
	Global $strFiles = ''
	Switch $sDelim
		Case '1'
			$sDelim = @CR
		Case '2'
			$sDelim = @LF
		Case '3'
			$sDelim = ';'
		Case '4'
			$sDelim = '|'
		Case Else
			$sDelim = @CRLF
	EndSwitch
	If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
	If $sExt = -1 Then $sExt = '*'
	If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
	_ShowSubFolders($oFSO.GetFolder($sPath), $sExt, $iDir, $sDelim)
	If $iRetType = 0 Then
		Local $aOut
		$aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
		If $aOut[1] = '' Then
			ReDim $aOut[1]
			$aOut[0] = 0
		EndIf
		Return $aOut
	Else
		Return StringTrimRight($strFiles, StringLen($sDelim))
	EndIf
EndFunc   ;==>_GetFilesFolder_Rekursiv

Func _ShowSubFolders($Folder, $Ext = '*', $Dir = -1, $Delim = @CRLF)
	$aExt = StringSplit($Ext, "|", 2) ;von mir eingefügt
	If Not IsDeclared("strFiles") Then Global $strFiles = ''
	If ($Dir = -1) Or ($Dir = 0) Then
		For $file In $Folder.Files
			If $Ext <> '*' Then
				For $i = 0 To UBound($aExt) - 1 ;von mir eingefügt
					If StringRight($file.Name, StringLen($aExt[$i])) = $aExt[$i] Then _ ; $Ext in $Ext[$i] geändert
							$strFiles &= $file.Path & $Delim
				Next ;von mir eingefügt
			Else
				$strFiles &= $file.Path & $Delim
			EndIf
		Next
	EndIf
	For $Subfolder In $Folder.SubFolders
		If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
		_ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
	Next
EndFunc   ;==>_ShowSubFolders
#endregion ###############################################################################
