#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListBoxConstants.au3>
#include <StaticConstants.au3>
Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)
Global $hGUI, $nCombo, $nList, $nDummy, $nCheckBox, $nLabel, $iMaxLen, $sTextList, $hEdit, $fNoCasesense = True, $sOldText, $sFile, $nBtn, $nLabelFile
If WinExists(@ScriptName & '{[/@$@\]}') Then Exit
AutoItWinSetTitle(@ScriptName & '{[/@$@\]}')
$hGUI = GUICreate('ListBox & ComboBox', 300, 600)
$nLabelFile = GUICtrlCreateLabel(@ScriptDir & '\test.txt', 5, 5, 265, 20, $SS_CENTERIMAGE)
GUICtrlSetBkColor(-1, 0xFFFFFF)
$nBtn = GUICtrlCreateButton('...', 272, 4, 22, 22)
$nCheckBox = GUICtrlCreateCheckbox('Учитывать регистр', 75, 30, 150, 20)
$nCombo = GUICtrlCreateCombo('', 75, 55, 150, 190, BitOR($CBS_AUTOHSCROLL, $WS_VSCROLL, $CBS_SIMPLE))
__GetComboEdit($nCombo, $hEdit)
GUICtrlCreateLabel('№ строки: ', 75, 245, 75, 20, BitOR($SS_RIGHT, $SS_CENTERIMAGE))
$nLabel = GUICtrlCreateLabel('', 150, 245, 50, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, 0xFFFFFF)
$nList = GUICtrlCreateList('', 50, 270, 200, 320)
$nDummy = GUICtrlCreateDummy()
GUISetState()
ConsoleWrite('1 __Set_FileText_to_ListBox: ' & __Set_FileText_to_ListBox($nList, $nCombo, @ScriptDir & '\test.txt', $sTextList, $iMaxLen) & @LF)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $nBtn
$sFile = FileOpenDialog('Выберите файл', @ScriptDir & '\', 'Текстовый файл (*.txt)', 3, '', $hGUI)
If @error Then ContinueLoop
ConsoleWrite('2 __Set_FileText_to_ListBox: ' & __Set_FileText_to_ListBox($nList, $nCombo, $sFile, $sTextList, $iMaxLen) & @LF)
Case $nCheckBox
$fNoCasesense = (BitAND(GUICtrlRead($nCheckBox), $GUI_CHECKED) = 0)
$sOldText = ''
ConsoleWrite('2 __Set_Combo_Lines: ' & __Set_Combo_Lines($nCombo, $hEdit, $sTextList, $iMaxLen, $fNoCasesense, $sOldText) & @LF)
Case $nDummy
GUICtrlSetData($nLabel, '')
Switch GUICtrlRead($nDummy)
Case 1
ConsoleWrite('1 __Set_Combo_Lines: ' & __Set_Combo_Lines($nCombo, $hEdit, $sTextList, $iMaxLen, $fNoCasesense, $sOldText) & @LF)
Case 2
ConsoleWrite(' __Select_List: ' & __Select_List($nCombo, $hEdit, $nList, $nLabel, $sOldText) & @LF)
EndSwitch
EndSwitch
WEnd
Func __Select_List($n_Combo, $h_Edit, $n_List, $n_Label, $s_OldText)
Local $s_Text, $i_Len, $i_Tmp
$s_Text = GUICtrlRead($n_Combo, 1)
$i_Len = StringLen($s_Text)
If $i_Len Then
$i_Tmp = GUICtrlSendMsg($n_List, $LB_SELECTSTRING, -1, $s_Text)
If $i_Tmp >= 0 Then GUICtrlSetData($n_Label, $i_Tmp + 1)
Else
DllCall('user32.dll', 'bool', 'SetWindowTextW', 'hwnd', $h_Edit, 'wstr', $s_OldText)
$i_Len = StringLen($s_OldText)
EndIf
GUICtrlSetState($n_Combo, $GUI_FOCUS)
GUICtrlSendMsg($n_Combo, $CB_SETEDITSEL, 0, BitOR(BitShift($i_Len, -16), BitAND($i_Len, 0xFFFF)))
Return (GUICtrlSendMsg($n_Combo, $CB_SETEDITSEL, 0, BitOR(BitShift($i_Len, -16), BitAND($i_Len, 0xFFFF))) = 1)
EndFunc ;==>__Select_List
Func __Set_Combo_Lines($n_Combo, $h_Edit, $s_TextList, $i_MaxLen, $f_NoCasesense, ByRef $s_OldText)
Local $s_Text, $i_Len, $a_Tmp, $i_Tmp, $i_Err = 0
Local Const $___WM_SETREDRAW = 0x000B
$s_Text = GUICtrlRead($n_Combo, 1)
If $s_OldText == $s_Text Then Return True
$s_OldText = $s_Text
GUICtrlSendMsg($n_Combo, $CB_RESETCONTENT, 0, 0)
$i_Len = StringLen($s_Text)
If Not $i_Len Then Return True
GUICtrlSendMsg($n_Combo, $___WM_SETREDRAW, 0, 0)
Do
Switch $i_Len
Case 1 To $i_MaxLen
$a_Tmp = DllCall('user32.dll', 'bool', 'SetWindowTextW', 'hwnd', $hEdit, 'wstr', $s_Text)
If @error Or Not $a_Tmp[0] Then ExitLoop
$a_Tmp = StringRegExp($s_TextList, __Pattern($s_Text, $f_NoCasesense), 3)
$i_Tmp = UBound($a_Tmp)
If $i_Tmp Then
For $i = 0 To $i_Tmp - 1
If GUICtrlSendMsg($n_Combo, $CB_ADDSTRING, $i, $a_Tmp[$i]) <> $i Then ExitLoop 2
Next
Else
$sOldText = ''
DllCall('user32.dll', 'bool', 'MessageBeep', 'uint', 16)
GUICtrlSetBkColor($n_Combo, 0xFFE4E1)
AdlibRegister('_DelColor', 2000)
EndIf
EndSwitch
$i_Err = 1
Until 1
GUICtrlSendMsg($n_Combo, $___WM_SETREDRAW, 1, 0)
GUICtrlSetState($n_Combo, $GUI_FOCUS)
If $i_Err Then $i_Err = GUICtrlSendMsg($n_Combo, $CB_SETEDITSEL, 0, BitOR(BitShift($i_Len, -16), BitAND($i_Len, 0xFFFF)))
Return ($i_Err = 1)
EndFunc ;==>__Set_Combo_Lines
Func _DelColor()
GUICtrlSetBkColor($nCombo, 0xFFFFFF)
GUICtrlSetState($nCombo, $GUI_FOCUS)
AdlibUnRegister('_DelColor')
EndFunc ;==>_DelColor
Func __Pattern($s_Text, $f_NoCasesense)
Local $a_Tmp, $i_Rus, $s_Pattern
$s_Text = StringRegExpReplace($s_Text, '[.^$()\[\]*+?{}|\\]', '\\$0')
If $f_NoCasesense Then
$s_Pattern = '(?im)^('
$i_Rus = StringRegExp($s_Text, '[ЁёА-я]')
If $i_Rus Then
$a_Tmp = StringSplit($s_Text, '')
For $i = 1 To $a_Tmp[0]
Switch Asc($a_Tmp[$i])
Case 168, 184
$s_Pattern &= '[' & Chr(168) & Chr(184) & ']'
Case 192 To 223
$s_Pattern &= '[' & $a_Tmp[$i] & StringLower($a_Tmp[$i]) & ']'
Case 224 To 255
$s_Pattern &= '[' & StringUpper($a_Tmp[$i]) & $a_Tmp[$i] & ']'
Case Else
$s_Pattern &= $a_Tmp[$i]
EndSwitch
Next
Else
$s_Pattern &= $s_Text
EndIf
Else
$s_Pattern = '(?m)^(' & $s_Text
EndIf
$s_Pattern &= '.*?)$'
Return $s_Pattern
EndFunc ;==>__Pattern
Func WM_COMMAND($h_Wnd, $i_Msg, $i_wParam, $i_lParam)
#forceref $h_Wnd, $i_Msg
Local $i_IDFrom, $i_Code
$i_IDFrom = BitAND($i_wParam, 0xFFFF)
$i_Code = BitShift($i_wParam, 16)
Switch $i_IDFrom
Case $nCombo
Switch $i_Code
Case $CBN_EDITUPDATE
GUICtrlSendToDummy($nDummy, 1)
Case $CBN_SELCHANGE
GUICtrlSendToDummy($nDummy, 2)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Func __GetComboEdit($n_Combo, ByRef $h_Edit)
Local $t_Info = DllStructCreate('dword Size;long EditLeft;long EditTop;long EditRight;long EditBottom;long BtnLeft;long BtnTop;' & _
'long BtnRight;long BtnBottom;dword BtnState;hwnd hCombo;hwnd hEdit;hwnd hList');$tagCOMBOBOXINFO
DllStructSetData($t_Info, 'Size', DllStructGetSize($t_Info))
GUICtrlSendMsg($n_Combo, $CB_GETCOMBOBOXINFO, 0, DllStructGetPtr($t_Info))
$h_Edit = DllStructGetData($t_Info, 'hEdit')
Return IsHWnd($h_Edit)
EndFunc ;==>__GetComboEdit
Func __Set_FileText_to_ListBox($n_List, $n_Combo, $s_File, ByRef $s_TextList, ByRef $i_MaxLen)
Local $i_Tmp, $h_File, $s_Tmp, $a_Tmp
Local Const $___WM_SETREDRAW = 0x000B
If Not FileExists($s_File) Then Return False
$i_Tmp = FileGetEncoding($s_File)
$h_File = FileOpen($s_File, $i_Tmp)
If $h_File = -1 Then Return False
$s_Tmp = FileRead($h_File)
$i_Tmp = @extended
FileClose($h_File)
If Not $i_Tmp Then Return False
$s_Tmp = StringRegExpReplace($s_Tmp, '[\x00-\x09\x0b-\x1f]', '')
$i_Tmp -= @extended
$s_Tmp = StringRegExpReplace($s_Tmp, '\n*$', '')
$s_Tmp = StringRegExpReplace($s_Tmp, '(\n)(\s+)(\n)', '$1$3')
$s_Tmp = StringRegExpReplace($s_Tmp, '(\n){2,}', '$1')
$a_Tmp = StringSplit($s_Tmp, @LF)
$i_Tmp -= $a_Tmp[0]
GUICtrlSendMsg($n_Combo, $CB_RESETCONTENT, 0, 0)
GUICtrlSendMsg($n_List, $LB_RESETCONTENT, 0, 0)
If GUICtrlSendMsg($n_List, $___WM_SETREDRAW, 0, 0) Then Return False
$i_Tmp = GUICtrlSendMsg($n_List, $LB_INITSTORAGE, $a_Tmp[0], $i_Tmp)
If Not $i_Tmp Then Return False
$i_MaxLen = 0
For $i = 1 To $a_Tmp[0]
If GUICtrlSendMsg($n_List, $LB_INSERTSTRING, $i - 1, $a_Tmp[$i]) = -1 Then Return False
$i_Tmp = StringLen($a_Tmp[$i])
If $i_MaxLen < $i_Tmp Then $i_MaxLen = $i_Tmp
Next
$s_TextList = $s_Tmp
GUICtrlSetState($n_Combo, $GUI_FOCUS)
Return (GUICtrlSendMsg($n_List, $___WM_SETREDRAW, 1, 0) = 0)
EndFunc ;==>__Set_FileText_to_ListBox