;~ AutoIt Version: 3.3.14.5
#include <GUIConstants.au3>
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
Global Const $INI_FILE = @ScriptDir & "\" & StringLeft(@ScriptName, StringInStr(@ScriptName, ".", 0, -1)) & "ini"
Global Const $HISTORY_AMOUNT = 10
Global Enum $HISTORY_COUNT, $HISTORY_START
Global Const $HISTORY_MAX = $HISTORY_START + $HISTORY_AMOUNT
Global $g_sFile, $g_idCmbWord, $g_idChbRegExp, $g_idChbCaseSence, $g_aHistory[$HISTORY_MAX]
_MyGUI_Start()
Func _MyGUI_Start()
Local Const $DEFTEXT = "Очистить историю - ПКМ"
Local $hGUI = GUICreate("Подсчет слов", 400, 140)
$g_sFile = IniRead($INI_FILE, "Input", "File", "")
GUICtrlCreateLabel("Файл:", 10, 10, 40, 20, $SS_CENTERIMAGE)
Local $idInpFile = GUICtrlCreateInput($g_sFile, 50, 10, 230, 20, BitOR($GUI_SS_DEFAULT_INPUT, $ES_READONLY))
Local $idBtnOpen = GUICtrlCreateButton("Обзор", 290, 10, 100, 20)
GUICtrlCreateLabel("Слово:", 10, 40, 40, 20, $SS_CENTERIMAGE)
$g_idCmbWord = GUICtrlCreateCombo("", 50, 40, 230, 20)
GUICtrlSetData(-1, _LoadHistory(), $g_aHistory[$HISTORY_START])
Local $idBtnCalc = GUICtrlCreateButton("Подсчитать", 290, 40, 100, 20)
GUICtrlSetState(-1, $GUI_DEFBUTTON)
Local $idLblCnt = GUICtrlCreateLabel($DEFTEXT, 10, 70, 380, 30, BitOR($WS_BORDER, $SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetColor(-1, 0x0000FF)
Local $idMnItClear = GUICtrlCreateMenuItem("Очистить историю", GUICtrlCreateContextMenu($idLblCnt))
GUICtrlCreateLabel("", 10, 110, 0, 20, $SS_ETCHEDVERT)
$g_idChbRegExp = GUICtrlCreateCheckbox("Регулярные выражения", 20, 110, 170, 20)
GUICtrlSetState(-1, Number(IniRead($INI_FILE, "Settings", "RegExp", "")))
GUICtrlCreateLabel("", 200, 110, 0, 20, $SS_ETCHEDVERT)
$g_idChbCaseSence = GUICtrlCreateCheckbox("Учитывать регистр", 210, 110, 170, 20)
GUICtrlSetState(-1, Number(IniRead($INI_FILE, "Settings", "CaseSense", "")))
GUISetState()
OnAutoItExitRegister("_MyGUI_SaveInput")
Local $sFile, $sWord, $aRegExp
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_NONE
ContinueLoop
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idBtnOpen
$sFile = FileOpenDialog("", "", "Все (*.*)", $FD_FILEMUSTEXIST, $g_sFile, $hGUI)
If Not @error Then
$g_sFile = $sFile
GUICtrlSetData($idInpFile, $g_sFile)
GUICtrlSetData($idLblCnt, $DEFTEXT)
GUICtrlSetState($idBtnCalc, $GUI_ENABLE)
EndIf
Case $idBtnCalc
If Not FileExists($g_sFile) Then
MsgBox($MB_TOPMOST + $MB_ICONERROR, Default, "Файл не существует!", 0, $hGUI)
GUICtrlSetData($idLblCnt, $DEFTEXT)
ContinueLoop
EndIf
$sWord = GUICtrlRead($g_idCmbWord)
_MyGUI_UpdateCombo($sWord)
If BitAND(GUICtrlRead($g_idChbRegExp), $GUI_UNCHECKED) Then $sWord = "\Q" & $sWord & "\E"
If BitAND(GUICtrlRead($g_idChbCaseSence), $GUI_UNCHECKED) Then $sWord = "(?i)" & $sWord
$aRegExp = StringRegExp(FileRead($g_sFile), $sWord, $STR_REGEXPARRAYGLOBALMATCH)
GUICtrlSetData($idLblCnt, "Кол-во совпадений: " & (@error ? 0 : UBound($aRegExp)))
Case $idMnItClear
Dim $g_aHistory[$HISTORY_MAX]
GUICtrlSetData($g_idCmbWord, "")
EndSwitch
WEnd
EndFunc ;==>_MyGUI_Start
Func _MyGUI_UpdateCombo($sWord)
If Not $sWord Then Return
Local $iIndex = -1, $sTemp
For $i = $HISTORY_START To $g_aHistory[$HISTORY_COUNT]
If $sWord = $g_aHistory[$i] Then
$iIndex = $i
ExitLoop
EndIf
Next
If $iIndex = -1 Then
$g_aHistory[$HISTORY_COUNT] += 1
If $g_aHistory[$HISTORY_COUNT] >= $HISTORY_MAX Then $g_aHistory[$HISTORY_COUNT] = $HISTORY_MAX - 1
For $i = $g_aHistory[$HISTORY_COUNT] To $HISTORY_START + 1 Step -1
$g_aHistory[$i] = $g_aHistory[$i - 1]
Next
$g_aHistory[$HISTORY_START] = $sWord
Else
$g_aHistory[$iIndex] = $sWord
For $i = $iIndex To $HISTORY_START + 1 Step -1
$sTemp = $g_aHistory[$i]
$g_aHistory[$i] = $g_aHistory[$i - 1]
$g_aHistory[$i - 1] = $sTemp
Next
EndIf
Local $sWords, $sDelim = Opt("GUIDataSeparatorChar")
For $i = $HISTORY_START To $g_aHistory[$HISTORY_COUNT]
$sWords &= $sDelim & $g_aHistory[$i]
Next
GUICtrlSetData($g_idCmbWord, $sWords, $sWord)
EndFunc ;==>_MyGUI_UpdateCombo
Func _MyGUI_SaveInput()
IniWrite($INI_FILE, "Input", "File", $g_sFile)
IniWrite($INI_FILE, "Settings", "RegExp", GUICtrlRead($g_idChbRegExp))
IniWrite($INI_FILE, "Settings", "CaseSense", GUICtrlRead($g_idChbCaseSence))
IniWrite($INI_FILE, "History", "Count", $g_aHistory[$HISTORY_COUNT])
For $i = $HISTORY_START To $g_aHistory[$HISTORY_COUNT]
IniWrite($INI_FILE, "History", $i, $g_aHistory[$i])
Next
EndFunc ;==>_MyGUI_SaveInput
Func _LoadHistory()
Local $sWords, $sDelim = Opt("GUIDataSeparatorChar")
$g_aHistory[$HISTORY_COUNT] = Int(IniRead($INI_FILE, "History", "Count", ""))
If $g_aHistory[$HISTORY_COUNT] Then
If $g_aHistory[$HISTORY_COUNT] >= $HISTORY_MAX Then $g_aHistory[$HISTORY_COUNT] = $HISTORY_MAX - 1
For $i = $HISTORY_START To $g_aHistory[$HISTORY_COUNT]
$g_aHistory[$i] = IniRead($INI_FILE, "History", $i, $g_aHistory[$i])
$sWords &= $sDelim & $g_aHistory[$i]
Next
EndIf
Return $sWords
EndFunc ;==>_LoadHistory