;~ AutoIt Version: 3.3.14.5
;~ Author: Tempo
#AutoIt3Wrapper_UseX64=y
#include <GUIConstants.au3>
#include <GuiEdit.au3>
#include <File.au3>
#include <WinAPI.au3>
#include <WinAPIEx.au3>
Global Const $INI_FILE = StringLeft(@ScriptFullPath, StringInStr(@ScriptFullPath, ".", 0, -1)) & "ini"
Global $g_hGuiMain, _
$g_idDmEditor, _
$g_idInpFolder, _
$g_idInpKeyword, _
$g_idInpMask, _
$g_idListFiles, _
$g_idChkRegExp, _
$g_aFiles[] = [0]
Exit Main()
Func Main()
Opt("TrayAutoPause", 0)
Opt("GUIResizeMode", BitOR($GUI_DOCKMENUBAR, $GUI_DOCKLEFT, $GUI_DOCKRIGHT))
$g_hGuiMain = GUICreate(@ScriptName, 600, 400, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPCHILDREN), $WS_EX_COMPOSITED)
GUISetOnEvent($GUI_EVENT_CLOSE, OnClose)
$g_idDmEditor = GUICtrlCreateDummy()
$g_idInpFolder = GUICtrlCreateInput("", 5, 5, 380, 20)
GUICtrlSetTip(-1, "Каталог")
_GUICtrlEdit_SetCueBanner(-1, "Каталог", True)
$g_idInpMask = GUICtrlCreateInput(IniRead($INI_FILE, "Config", "Mask", "*.txt"), 390, 5, 100, 20)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKMENUBAR, $GUI_DOCKWIDTH, $GUI_DOCKRIGHT))
GUICtrlSetTip(-1, "Маска")
_GUICtrlEdit_SetCueBanner(-1, "Маска", True)
Local $idBtnSelect = GUICtrlCreateButton("Выбрать", 495, 5, 100, 20, $BS_DEFPUSHBUTTON)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKMENUBAR, $GUI_DOCKWIDTH, $GUI_DOCKRIGHT))
Local $idMenuUpdate = GUICtrlCreateMenuItem("Обновить", GUICtrlCreateContextMenu($idBtnSelect))
$g_idInpKeyword = GUICtrlCreateInput("", 5, 30, 485, 20)
GUICtrlSetTip(-1, "Ключевое слово")
_GUICtrlEdit_SetCueBanner(-1, "Ключевое слово", True)
$g_idChkRegExp = GUICtrlCreateCheckbox("Рег. выраж.", 495, 30, 100, 20)
GUICtrlSetTip(-1, "Регулярные выражения")
GUICtrlSetResizing(-1, BitOR($GUI_DOCKMENUBAR, $GUI_DOCKWIDTH, $GUI_DOCKRIGHT))
If Number(IniRead($INI_FILE, "Config", "RegExp", 0)) Then GUICtrlSetState(-1, $GUI_CHECKED)
$g_idListFiles = GUICtrlCreateList("", 0, 55, 600, 345, BitOR($LBS_NOINTEGRALHEIGHT, $WS_VSCROLL), 0)
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
GUICtrlSetFont(-1, 10)
GUIRegisterMsg($WM_COMMAND, WM_COMMAND)
LoadWindowPlacement()
GUICtrlSetData($g_idInpFolder, IniRead($INI_FILE, "Config", "Folder", @ScriptDir))
OnAutoItExitRegister(OnExit)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $g_idDmEditor
ShowEditor()
Case $g_idChkRegExp
FilterFiles()
Case $idBtnSelect
SelectFolder()
Case $idMenuUpdate
OnChangeFolder()
EndSwitch
WEnd
EndFunc ;==>Main
Func LoadWindowPlacement()
GUISetState(@SW_HIDE) ; Resizing
Local $aRECT = StringSplit(IniRead($INI_FILE, "WindowPlacement", "rcNormalPosition", ""), "|")
If $aRECT[0] = 4 Then
Local $tWP = _WinAPI_GetWindowPlacement($g_hGuiMain)
$tWP.rcNormalPosition(1) = $aRECT[1]
$tWP.rcNormalPosition(2) = $aRECT[2]
$tWP.rcNormalPosition(3) = $aRECT[3]
$tWP.rcNormalPosition(4) = $aRECT[4]
_WinAPI_SetWindowPlacement($g_hGuiMain, $tWP)
EndIf
GUISetState(IniRead($INI_FILE, "WindowPlacement", "showCmd", @SW_SHOW))
EndFunc ;==>LoadWindowPlacement
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $lParam, $wParam
If $hWnd = $g_hGuiMain Then
Switch _WinAPI_HiWord($wParam)
Case $EN_CHANGE
Switch _WinAPI_LoWord($wParam)
Case $g_idInpFolder, $g_idInpMask
AdlibRegister(OnChangeFolder, 500)
Case $g_idInpKeyword
If $g_aFiles[0] Then AdlibRegister(OnChangeKeyword, 500)
EndSwitch
Case $LBN_DBLCLK
If _WinAPI_LoWord($wParam) = $g_idListFiles Then
Local $sFile = GUICtrlRead($g_idListFiles)
If $sFile Then GUICtrlSendToDummy($g_idDmEditor, $sFile)
EndIf
EndSwitch
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Func OnChangeFolder()
AdlibUnRegister(OnChangeFolder)
Local $sFolder = GUICtrlRead($g_idInpFolder)
If Not $sFolder Then $sFolder = @ScriptDir
Local $aFiles = _FileListToArray($sFolder, GUICtrlRead($g_idInpMask), $FLTA_FILES)
If Not @error Then
FileChangeDir($sFolder)
$g_aFiles = $aFiles
FilterFiles()
Else
Dim $g_aFiles[] = [0]
GUICtrlSetData($g_idListFiles, "")
EndIf
EndFunc ;==>OnChangeFolder
Func OnChangeKeyword()
AdlibUnRegister(OnChangeKeyword)
FilterFiles()
EndFunc ;==>OnChangeKeyword
Func FilterFiles()
Local $fuCompare = BitAND(GUICtrlRead($g_idChkRegExp), $GUI_CHECKED) ? StringRegExp : StringInStr
Local $sKeyword = GUICtrlRead($g_idInpKeyword), $bFilter = Not $sKeyword, $sFiles
For $i = 1 To $g_aFiles[0]
If $bFilter Or $fuCompare(FileRead($g_aFiles[$i]), $sKeyword) Then $sFiles &= "|" & $g_aFiles[$i]
Next
GUICtrlSetData($g_idListFiles, $sFiles)
EndFunc ;==>FilterFiles
Func SelectFolder()
Local $sFolder = FileSelectFolder("", @WorkingDir, 0, "", $g_hGuiMain)
If @error Then Return
GUICtrlSetData($g_idInpFolder, $sFolder)
EndFunc ;==>SelectFolder
Func OnClose()
Exit
EndFunc ;==>OnClose
Func OnExit()
IniWrite($INI_FILE, "Config", "Folder", GUICtrlRead($g_idInpFolder))
IniWrite($INI_FILE, "Config", "Mask", GUICtrlRead($g_idInpMask))
IniWrite($INI_FILE, "Config", "RegExp", Number(BitAND(GUICtrlRead($g_idChkRegExp), $GUI_CHECKED) = $GUI_CHECKED))
Local $tWP = _WinAPI_GetWindowPlacement($g_hGuiMain)
If $tWP.showCmd = @SW_SHOWMINIMIZED Then $tWP.showCmd = BitAND($tWP.flags, $WPF_RESTORETOMAXIMIZED) ? @SW_SHOWMAXIMIZED : @SW_SHOW
IniWrite($INI_FILE, "WindowPlacement", "showCmd", $tWP.showCmd)
IniWrite($INI_FILE, "WindowPlacement", "rcNormalPosition", _
$tWP.rcNormalPosition(1) & "|" & _
$tWP.rcNormalPosition(2) & "|" & _
$tWP.rcNormalPosition(3) & "|" & _
$tWP.rcNormalPosition(4))
EndFunc ;==>OnExit
Func ShowEditor()
GUISetState(@SW_HIDE)
Local $tWP = _WinAPI_GetWindowPlacement($g_hGuiMain)
Local $sFile = GUICtrlRead($g_idDmEditor)
Local $sText = FileRead($sFile)
Local $hGuiEdit = GUICreate($sFile, 805, 600, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPCHILDREN), $WS_EX_COMPOSITED)
Local $idEditText = GUICtrlCreateEdit("", 0, 0, 805, 560, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY), 0)
_GUICtrlEdit_SetLimitText($idEditText, -1)
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
GUICtrlSetData(-1, $sText)
Local $idBtnEdit = GUICtrlCreateButton("Редактировать", 300, 565, 100, 30)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKHCENTER, $GUI_DOCKSTATEBAR, $GUI_DOCKSIZE))
Local $idBtnSave = GUICtrlCreateButton("Сохранить", 300, 565, 100, 30)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKHCENTER, $GUI_DOCKSTATEBAR, $GUI_DOCKSIZE))
GUICtrlSetState(-1, $GUI_HIDE)
Local $idBtnCancel = GUICtrlCreateButton("Отмена", 405, 565, 100, 30, $BS_DEFPUSHBUTTON)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKHCENTER, $GUI_DOCKSTATEBAR, $GUI_DOCKSIZE))
GUISetState(@SW_HIDE) ; Resizing
_WinAPI_SetWindowPlacement($hGuiEdit, $tWP)
GUISetState($tWP.showCmd) ; Msg
Local $iMsg, $bReadOnly = True, $hFile, $iVisibleLine
While 1
$iMsg = GUIGetMsg()
Switch $iMsg
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idBtnEdit
GUICtrlSetState($idBtnEdit, $GUI_HIDE)
$bReadOnly = False
_GUICtrlEdit_SetReadOnly($idEditText, $bReadOnly)
GUICtrlSetState($idBtnSave, $GUI_SHOW)
Case $idBtnCancel
If $bReadOnly Then ExitLoop
ContinueCase
Case $idBtnSave
GUICtrlSetState($idBtnSave, $GUI_HIDE)
$bReadOnly = True
_GUICtrlEdit_BeginUpdate($idEditText)
_GUICtrlEdit_SetReadOnly($idEditText, $bReadOnly)
If $iMsg = $idBtnSave Then
$sText = GUICtrlRead($idEditText)
$hFile = FileOpen($sFile, BitOR($FO_OVERWRITE, FileGetEncoding($sFile)))
FileWrite($hFile, $sText)
FileClose($hFile)
Else
If $sText <> GUICtrlRead($idEditText) Then
$iVisibleLine = _GUICtrlEdit_GetFirstVisibleLine($idEditText)
GUICtrlSetData($idEditText, $sText)
_GUICtrlEdit_LineScroll($idEditText, 0, $iVisibleLine)
EndIf
EndIf
_GUICtrlEdit_EndUpdate($idEditText)
GUICtrlSetState($idBtnEdit, $GUI_SHOW)
EndSwitch
WEnd
$tWP = _WinAPI_GetWindowPlacement($hGuiEdit)
GUIDelete()
_WinAPI_SetWindowPlacement($g_hGuiMain, $tWP)
GUISetState($tWP.showCmd) ; Msg
EndFunc ;==>ShowEditor