#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPIShPath.au3>
#include <WinAPISys.au3>
#include <String.au3>
#include <File.au3>
Opt("TrayAutoPause", 0)
FileChangeDir(@ScriptDir)
Global Const $HOTKEY_CHECKBOX1 = "1"
Global Const $HOTKEY_CHECKBOX2 = "2"
Global Const $HOTKEY_CHECKBOX3 = "3"
Global Const $HOTKEY_NEXT = "{ENTER}"
Global Const $HOTKEY_NEXT_TIP = "Далее - Enter"
Global Const $HOTKEY_SAVE = "^{SPACE}"
Global Const $HOTKEY_SAVE_TIP = "Cохранить фразу - Ctrl + Space"
Global Const $GUI_TITLE = "Тренажер"
Global Const $GUI_WIDTH = 600
Global Const $CONTROL_INDENT = 10
Global Const $CHECKBOX_HEIGHT = 20
Global Const $INPUT_HEIGHT = 20
Global Const $LABEL_TIP_HEIGHT = 20
Global Const $CHECKBOX_TEXT_DEFAULT = " . . . "
Global Const $CHECKBOX_TEXT_SETTINGS = "Отображать по умолчанию"
Global Const $MENU_TEXT_FILE = "Файл"
Global Const $MENU_TEXT_FILE_OPEN = "Открыть"
Global Const $MENU_TEXT_FILE_EXIT = "Выйти"
Global Const $MENU_TEXT_MODE_SETTING = "Режим настройки"
Global Const $MENU_TEXT_MODE_TRAIN = "Режим тренажера"
Global Const $MENU_TEXT_SHOWINPUT = "Показать поля ввода"
Global Const $MENU_TEXT_HIDEINPUT = "Cкрыть поля ввода"
Global Const $INI_FILE = StringLeft(@ScriptName, StringInStr(@ScriptName, ".", 0, -1)) & "ini"
Global Const $SAVE_FILE_FORMAT = "%s - Saved"
Global Const $OPEN_FILE_FILTER = "Текстовые документы (*.txt)|Все (*.*)"
Global Const $OPEN_FILE_ERROR_FORMAT = 'Фразы не найдены -> "%s"'
Global Enum $DCT_ENG, $DCT_TRANSC, $DCT_TRANSL, $DCT_MAX
Global Enum $CB_ID, $CB_DUMMY, $CB_INPUT, $CB_SEP, $CB_DEFSTATE, $CB_MAX
Global $g_hGUI, $g_idMenuFile, $g_idMenuShowInput, $g_aDict[1][$DCT_MAX] = [[0]], $g_aDictSave[1] = [-1], $g_aCB[$DCT_MAX][$CB_MAX], _
$g_sFileOpen, $g_sFileSave, $g_bShowInput
_GUI_Init()
While Sleep(10)
WEnd
Func _GUI_Init()
Opt("GUIResizeMode", $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKMENUBAR)
Opt("GUIOnEventMode", 1)
AutoItWinSetTitle($GUI_TITLE & @MDAY & @MON & @YEAR & @HOUR & @MIN & @SEC)
_WinAPI_SetKeyboardLayout(WinGetHandle(AutoItWinGetTitle()), 0x0409)
Local $iFullWidth = $GUI_WIDTH - $CONTROL_INDENT * 2, $iY = $CONTROL_INDENT
$g_hGUI = GUICreate($GUI_TITLE, $GUI_WIDTH)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Event_Exit")
$g_idMenuFile = GUICtrlCreateMenu($MENU_TEXT_FILE)
GUICtrlCreateMenuItem($MENU_TEXT_FILE_OPEN, $g_idMenuFile)
GUICtrlSetOnEvent(-1, "_Event_Open")
GUICtrlCreateMenuItem("", $g_idMenuFile)
GUICtrlCreateMenuItem($MENU_TEXT_FILE_EXIT, $g_idMenuFile)
GUICtrlSetOnEvent(-1, "_Event_Exit")
GUICtrlCreateMenuItem($MENU_TEXT_MODE_SETTING, -1)
GUICtrlSetOnEvent(-1, "_Event_SetView")
$g_bShowInput = IniRead($INI_FILE, "Data", "Input", "False") = "True"
Local $aAccel[$DCT_MAX + 2][2], $iAcIdx = 0, $iShowed = 0, $bChecked
For $i = 0 To $DCT_MAX - 1
$g_aCB[$i][$CB_DEFSTATE] = Number(IniRead($INI_FILE, "View", $i, $GUI_CHECKED))
$g_aCB[$i][$CB_ID] = GUICtrlCreateCheckbox($CHECKBOX_TEXT_DEFAULT, $CONTROL_INDENT, $iY, $iFullWidth, $CHECKBOX_HEIGHT)
GUICtrlSetState(-1, $g_aCB[$i][$CB_DEFSTATE])
GUICtrlSetOnEvent(-1, "_Event_ShowText")
$g_aCB[$i][$CB_DUMMY] = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Event_ShowText")
$iY += $CHECKBOX_HEIGHT + $CONTROL_INDENT / 2
$g_aCB[$i][$CB_INPUT] = GUICtrlCreateInput("", $CONTROL_INDENT, $iY, $iFullWidth, $INPUT_HEIGHT)
$bChecked = $g_aCB[$i][$CB_DEFSTATE] = $GUI_CHECKED
$iShowed += $bChecked
If Not $g_bShowInput Or $bChecked Then
GUICtrlSetState(-1, $GUI_HIDE)
Else
$iY += $INPUT_HEIGHT + $CONTROL_INDENT
EndIf
$g_aCB[$i][$CB_SEP] = GUICtrlCreateLabel("", $CONTROL_INDENT, $iY, $iFullWidth, 0, $SS_ETCHEDHORZ)
$iY += $CONTROL_INDENT
$aAccel[$iAcIdx][0] = Eval("HOTKEY_CHECKBOX" & $iAcIdx + 1)
$aAccel[$iAcIdx][1] = $g_aCB[$i][$CB_DUMMY]
If Not @error Then $iAcIdx += 1
Next
GUICtrlCreateLabel($HOTKEY_NEXT_TIP & ", " & $HOTKEY_SAVE_TIP, $CONTROL_INDENT, $iY, $iFullWidth, $LABEL_TIP_HEIGHT, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKSTATEBAR)
$g_idMenuShowInput = GUICtrlCreateMenuItem($g_bShowInput ? $MENU_TEXT_HIDEINPUT : $MENU_TEXT_SHOWINPUT, -1)
GUICtrlSetOnEvent(-1, "_Event_ShowInput")
GUICtrlSetState($g_idMenuShowInput, ($iShowed = $DCT_MAX) ? $GUI_DISABLE : $GUI_ENABLE)
$iY += $LABEL_TIP_HEIGHT + $CONTROL_INDENT
_GUIResize($g_hGUI, Default, Default, Default, $iY)
Local $sFile = IniRead($INI_FILE, "Data", "File", "")
If FileExists($sFile) Then
_Open($sFile)
_Next(Int(IniRead($INI_FILE, "Data", "Index", "1")))
EndIf
OnAutoItExitRegister("_OnExit")
$aAccel[$iAcIdx][0] = $HOTKEY_NEXT
$aAccel[$iAcIdx][1] = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Event_Next")
$iAcIdx += 1
$aAccel[$iAcIdx][0] = $HOTKEY_SAVE
$aAccel[$iAcIdx][1] = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Event_Save")
ReDim $aAccel[$iAcIdx + 1][2]
GUISetAccelerators($aAccel)
GUISetState()
EndFunc ;==>_GUI_Init
Func _Event_Save()
If $g_aDict[0][1] > 0 And Not $g_aDictSave[$g_aDict[0][1]] Then
$g_aDictSave[$g_aDict[0][1]] = True
Local $sOut
For $i = 0 To $DCT_MAX - 1
$sOut &= $g_aDict[$g_aDict[0][1]][$i] & @CRLF
Next
FileWrite($g_sFileSave, $sOut & @CRLF)
_SetTitle()
EndIf
EndFunc ;==>_Event_Save
Func _Event_ShowText()
Local $bChecked
For $i = 0 To $DCT_MAX - 1
Switch @GUI_CtrlId
Case $g_aCB[$i][$CB_DUMMY], $g_aCB[$i][$CB_ID]
$bChecked = _IsChecked($g_aCB[$i][$CB_ID])
If @GUI_CtrlId = $g_aCB[$i][$CB_DUMMY] Then
GUICtrlSetState($g_aCB[$i][$CB_ID], $bChecked ? $GUI_UNCHECKED : $GUI_CHECKED)
$bChecked = Not $bChecked
EndIf
Return _SetData($i, $bChecked)
EndSwitch
Next
EndFunc ;==>_Event_ShowText
Func _Event_ShowInput()
$g_bShowInput = Not $g_bShowInput
_ControlsFormat()
EndFunc ;==>_Event_ShowInput
Func _ControlsFormat()
Local $iY = $CONTROL_INDENT
GUICtrlSetData($g_idMenuShowInput, $g_bShowInput ? $MENU_TEXT_HIDEINPUT : $MENU_TEXT_SHOWINPUT)
For $i = 0 To $DCT_MAX - 1
GUICtrlSetPos($g_aCB[$i][$CB_ID], Default, $iY)
$iY += $CHECKBOX_HEIGHT + $CONTROL_INDENT / 2
If $g_bShowInput And $g_aCB[$i][$CB_DEFSTATE] = $GUI_UNCHECKED Then
GUICtrlSetPos($g_aCB[$i][$CB_INPUT], Default, $iY)
GUICtrlSetState($g_aCB[$i][$CB_INPUT], $GUI_SHOW)
$iY += $INPUT_HEIGHT + $CONTROL_INDENT
Else
GUICtrlSetState($g_aCB[$i][$CB_INPUT], $GUI_HIDE)
EndIf
GUICtrlSetPos($g_aCB[$i][$CB_SEP], Default, $iY)
$iY += $CONTROL_INDENT
Next
$iY += $LABEL_TIP_HEIGHT + $CONTROL_INDENT
_GUIResize($g_hGUI, Default, Default, Default, $iY)
EndFunc ;==>_ControlsFormat
Func _Event_SetView()
Local $idMenuMode = @GUI_CtrlId, $bChecked
If GUICtrlRead($idMenuMode, $GUI_READ_EXTENDED) = $MENU_TEXT_MODE_SETTING Then
Opt("GUIOnEventMode", 0)
WinSetTitle($g_hGUI, "", $MENU_TEXT_MODE_SETTING)
GUICtrlSetState($g_idMenuFile, $GUI_DISABLE)
GUICtrlSetState($g_idMenuShowInput, $GUI_DISABLE)
GUICtrlSetData($idMenuMode, $MENU_TEXT_MODE_TRAIN)
For $i = 0 To $DCT_MAX - 1
GUICtrlSetData($g_aCB[$i][$CB_ID], $CHECKBOX_TEXT_SETTINGS)
GUICtrlSetState($g_aCB[$i][$CB_ID], $g_aCB[$i][$CB_DEFSTATE])
Next
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $idMenuMode
ExitLoop
EndSwitch
WEnd
Local $iShowed = 0
For $i = 0 To $DCT_MAX - 1
$bChecked = _IsChecked($g_aCB[$i][$CB_ID])
$iShowed += $bChecked
$g_aCB[$i][$CB_DEFSTATE] = $bChecked ? $GUI_CHECKED : $GUI_UNCHECKED
_SetData($i, $bChecked)
Next
GUICtrlSetData($idMenuMode, $MENU_TEXT_MODE_SETTING)
GUICtrlSetState($g_idMenuFile, $GUI_ENABLE)
GUICtrlSetState($g_idMenuShowInput, ($iShowed = $DCT_MAX) ? $GUI_DISABLE : $GUI_ENABLE)
_ControlsFormat()
_SetTitle()
Opt("GUIOnEventMode", 1)
EndIf
EndFunc ;==>_Event_SetView
Func _Event_Open()
Local $sFile = FileOpenDialog("", "", $OPEN_FILE_FILTER, $FD_FILEMUSTEXIST, $g_sFileOpen, $g_hGUI)
If Not @error Then
_Open($sFile)
_Event_Next()
EndIf
EndFunc ;==>_Event_Open
Func _Open($sFile)
Local $aRegExp = StringRegExp(FileRead($sFile) & @CRLF & @CRLF, _StringRepeat("(.+?)\R", $DCT_MAX) & "\R", $STR_REGEXPARRAYGLOBALMATCH)
If @error Then Return MsgBox($MB_ICONERROR + $MB_TOPMOST, $GUI_TITLE, StringFormat($OPEN_FILE_ERROR_FORMAT, $sFile), 0, $g_hGUI)
Local $sDrive, $sDir, $sFName, $sExt
$g_sFileOpen = $sFile
_PathSplit($sFile, $sDrive, $sDir, $sFName, $sExt)
$g_sFileSave = _PathMake($sDrive, $sDir, StringFormat($SAVE_FILE_FORMAT, $sFName), $sExt)
;$g_sFileSave = _WinAPI_PathYetAnotherMakeUniqueName($g_sFileSave)
Local $iCount = UBound($aRegExp), $sSaved = FileRead($g_sFileSave) & @CRLF & @CRLF, $sCheck
Dim $g_aDict[$iCount / $DCT_MAX + 1][$DCT_MAX] = [[0, 0]]
Dim $g_aDictSave[$iCount / $DCT_MAX + 1] = [-1]
For $i = 0 To $iCount - 1 Step $DCT_MAX
$g_aDict[0][0] += 1
$sCheck = ""
For $j = 0 To $DCT_MAX - 1
$g_aDict[$g_aDict[0][0]][$j] = $aRegExp[$j]
$sCheck &= $aRegExp[$i] & @CRLF
Next
$g_aDictSave[$g_aDict[0][0]] = StringInStr($sSaved, StringTrimRight($sCheck, StringLen(@CRLF)))
Next
EndFunc ;==>_Open
Func _Event_Next()
_Next($g_aDict[0][1] + 1)
EndFunc ;==>_Event_Next
Func _Next($iIndex)
If $g_aDict[0][0] > 0 Then
$g_aDict[0][1] = $iIndex
If $g_aDict[0][1] > $g_aDict[0][0] Then $g_aDict[0][1] = 0
For $i = 0 To $DCT_MAX - 1
_SetData($i, $g_aCB[$i][$CB_DEFSTATE] = $GUI_CHECKED)
GUICtrlSetState($g_aCB[$i][$CB_ID], $g_aCB[$i][$CB_DEFSTATE])
GUICtrlSetData($g_aCB[$i][$CB_INPUT], "")
Next
_SetTitle()
EndIf
EndFunc ;==>_Next
Func _GUIResize($hGUI, $iX, $iY = Default, $iW = Default, $iH = Default)
Local $aClientWH = WinGetClientSize($hGUI)
If @error Then Return SetError(@error, 0, 0)
Local $aXYWH = WinGetPos($hGUI)
If @error Then Return SetError(@error, 0, 0)
If $iW <> Default Then $iW += $aXYWH[2] - $aClientWH[0]
If $iH <> Default Then $iH += $aXYWH[3] - $aClientWH[1]
Return WinMove($hGUI, "", $iX, $iY, $iW, $iH)
EndFunc ;==>_GUIResize
Func _OnExit()
For $i = 0 To $DCT_MAX - 1
IniWrite($INI_FILE, "View", $i, $g_aCB[$i][$CB_DEFSTATE])
Next
IniWrite($INI_FILE, "Data", "File", $g_sFileOpen)
IniWrite($INI_FILE, "Data", "Index", $g_aDict[0][1])
IniWrite($INI_FILE, "Data", "Input", $g_bShowInput)
EndFunc ;==>_OnExit
Func _SetTitle()
Local $sFormat = "%s: *%s (%i/%i)"
If $g_aDictSave[$g_aDict[0][1]] Then $sFormat = "%s: %s (%i/%i)"
WinSetTitle($g_hGUI, "", StringFormat($sFormat, $GUI_TITLE, _WinAPI_PathFindFileName($g_sFileOpen), $g_aDict[0][1], $g_aDict[0][0]))
EndFunc ;==>_SetTitle
Func _SetData($iIdx, $bSet)
GUICtrlSetData($g_aCB[$iIdx][$CB_ID], ($bSet And $g_aDict[0][1] > 0) ? $g_aDict[$g_aDict[0][1]][$iIdx] : $CHECKBOX_TEXT_DEFAULT)
EndFunc ;==>_SetData
Func _IsChecked($idCheckBox)
Return BitAND(GUICtrlRead($idCheckBox), $GUI_CHECKED) = $GUI_CHECKED
EndFunc ;==>_IsChecked
Func _Event_Exit()
Exit
EndFunc ;==>_Event_Exit