; @AZJIO 12.05.2010 ; панелька для сохранения и ввода готовых конструкций кода AutoIt3 в редакторы Notepad++ и SciTE #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <MenuConstants.au3> #include <WinAPI.au3> ;#NoTrayIcon Global $defaultstatus = "Ready", $status Global $initext, $kol, $aSet Global $Ini = @ScriptDir & '\panfun.ini' ; путь к panfun.ini ;Проверка существования panfun.ini If Not FileExists($Ini) Then If MsgBox(4, "Выгодное предложение", "Хотите создать необходимый panfun.ini" & @CRLF & "для примера? Иначе выход.") = "6" Then $iniopen = FileOpen($Ini, 2) FileWrite($iniopen, _ '[Setting]' & @CRLF & _ '272,46,2,30|Notepad++' & @CRLF & _ '[z--z]' & @CRLF & _ 'Msg|' & @CRLF & _ 'MsgBox(0, ''Сообщение'', $text)' & @CRLF & _ 'Exit' & @CRLF & _ '[z--z]' & @CRLF & _ 'FO|' & @CRLF & _ '$file = FileOpen(@ScriptDir&''\file.txt'',2)' & @CRLF & _ 'FileWrite($file, $text)' & @CRLF & _ 'FileClose($file)' & @CRLF & _ 'Exit' & @CRLF & _ '[z--z]' & @CRLF & _ 'If|' & @CRLF & _ 'If $var = 0 Then' & @CRLF & _ ' ' & @CRLF & _ 'Else' & @CRLF & _ ' ' & @CRLF & _ 'EndIf' & @CRLF & _ '[z--z]' & @CRLF & _ 'Sw|' & @CRLF & _ 'Switch @HOUR' & @CRLF & _ 'Case 6 To 11' & @CRLF & _ ' $msg = "Good Morning"' & @CRLF & _ 'Case 12 To 17' & @CRLF & _ ' $msg = "Good Afternoon"' & @CRLF & _ 'Case 18 To 21' & @CRLF & _ ' $msg = "Good Evening"' & @CRLF & _ 'Case Else' & @CRLF & _ ' $msg = "What are you still doing up?"' & @CRLF & _ 'EndSwitch' & @CRLF & _ '[z--z]' & @CRLF & _ 'Wh|' & @CRLF & _ 'While 1' & @CRLF & _ ' MsgBox(0, "Сообщение", ''Вот опять сообщение'')' & @CRLF & _ 'WEnd' & @CRLF & _ '[z--z]' & @CRLF & _ 'Se|' & @CRLF & _ 'Select' & @CRLF & _ ' Case $var = 1' & @CRLF & _ ' MsgBox(0, "", "Если 1 тогда")' & @CRLF & _ ' Case $var2 = "test"' & @CRLF & _ ' MsgBox(0, "", "Если test тогда")' & @CRLF & _ ' Case Else' & @CRLF & _ ' MsgBox(0, "", "Иначе")' & @CRLF & _ 'EndSelect' & @CRLF & _ '[z--z]' & @CRLF & _ 'DU|' & @CRLF & _ 'Do' & @CRLF & _ ' MsgBox(0, "Сообщение", ''Вот опять сообщение'')' & @CRLF & _ 'Until 0' & @CRLF & _ '[z--z]' & @CRLF & _ 'cse|' & @CRLF & _ '#cs' & @CRLF & _ 'Блок комментариев' & @CRLF & _ '#ce' & @CRLF & _ '[z--z]' & @CRLF & _ 'FU|' & @CRLF & _ 'Func _funcname()' & @CRLF & _ ' return (@MON & "/" & @MDAY & "/" & @YEAR)' & @CRLF & _ 'EndFunc' & @CRLF & _ '[z--z]') FileClose($iniopen) Else Exit EndIf EndIf $iniopen = FileOpen($Ini, 0) $initext = FileRead($iniopen) FileClose($iniopen) $aSet = StringSplit(StringRegExpReplace($initext, "(?s).*\[Setting\]\r\n(.*?)(?:\r\n\[.*)", "\1"), '|') $aPos = StringSplit($aSet[1], ',') $Gui = GUICreate("панель", $aPos[1], $aPos[2], $aPos[3], $aPos[4], BitOR($WS_POPUP, $WS_THICKFRAME, $WS_SIZEBOX, $WS_SYSMENU)) GUISetBkColor(0x3f3f3f) $filemenu = GUICtrlCreateMenu("Файл") $Quit2 = GUICtrlCreateMenuItem("Перезапуск панели", $filemenu) $recreate = GUICtrlCreateMenuItem("Добавить образец из буфера", $filemenu) $Saveini = GUICtrlCreateMenuItem("Сохранить текущие настройки", $filemenu) $Editini = GUICtrlCreateMenuItem("Редактировать ini", $filemenu) GUICtrlCreateMenuItem("", $filemenu) $Npad = GUICtrlCreateMenuItem("Использовать Notepad++", $filemenu) $SciTE = GUICtrlCreateMenuItem("Использовать SciTE", $filemenu) GUICtrlCreateMenuItem("", $filemenu) $Quit1 = GUICtrlCreateMenuItem("Выход", $filemenu) If $aSet[2] = "Notepad++" Then GUICtrlSetState($Npad,$GUI_CHECKED) Else GUICtrlSetState($SciTE,$GUI_CHECKED) EndIf $delmenu = GUICtrlCreateMenu("Удаление") $helpmenu = GUICtrlCreateMenu("?") $helpitem = GUICtrlCreateMenuItem("О программе", $helpmenu) $aPattern = StringRegExp($initext, '(?s)z\]\r\n(.*?)(?=\r\n\[z)', 3) $kol = UBound($aPattern) - 1 $Width = $aPos[1] - Mod($aPos[1], 30) ; вычисление позиции кнопок при старте скрипта (12 строк) $y = 0 $x = 0 $posy = 1 For $i = 0 To $kol $x += 1 If $x * 30 > $aPos[1] Then $x = 1 $y += 1 $posy = $y * 25 + 1 EndIf $posx = $x * 30 - 29 $tmp = StringSplit($aPattern[$i], '|') Assign('Button' & $i, GUICtrlCreateButton($tmp[1], $posx, $posy, 30, 25)) GUICtrlSetResizing(-1, $GUI_DOCKALL) GUICtrlSetTip(-1, $tmp[2]) Assign('execute' & $i, $tmp[2]) Assign('name_b' & $i, $tmp[1]) Assign('del' & $i, GUICtrlCreateMenuItem("Удалить - "&$tmp[1], $delmenu)) Next $r = 0 GUISetState() While 1 $msg = GUIGetMsg() _SendMessage($Gui, $WM_SYSCOMMAND, BitOR($SC_MOVE, $HTCAPTION), 0) ; для перемещения окна за само окно For $i = 0 To $kol If $msg = Eval('Button' & $i) Then _insert(Eval('execute' & $i)) If $msg = Eval('del' & $i) Then _delitem($i) Next $r += 1 If $r = 200 Then ; каждые 0,2 секунд проверка распределения кнопок $r = 0 $GuiPos = WinGetPos($Gui) $Width = $GuiPos[2] - Mod($GuiPos[2], 30) ; ширине окна по кнопкам $y = 0 $x = 0 $posy = 1 For $i = 0 To $kol $x += 1 If $x * 30 > $GuiPos[2] Then $x = 1 $y += 1 $posy = $y * 25 + 1 EndIf $posx = $x * 30 - 29 GUICtrlSetPos(Eval('Button' & $i), $posx, $posy) Next $GuiPos[2]=$GuiPos[2]-Mod( $GuiPos[2], 30 )+3; подгоняем размер под кнопки окна при ресайзе (пять строк), можно закомментировать их. If $kol * 30 < $GuiPos[2] Then $GuiPos[2]=$kol * 30+38 If $y > 0 Then $GuiPos[2]=$Width+8 If $GuiPos[2] < 182 Then $GuiPos[2]=182 WinMove($Gui, "", $GuiPos[0], $GuiPos[1], $GuiPos[2], $posy+51) EndIf Select Case $msg = $Saveini $GuiPos = WinGetPos($Gui) $GuiPos[2]=$GuiPos[2]-Mod( $GuiPos[2], 30 )+2 ; подгоняем размер под кнопки окна при сохранении (четыре строки), можно закомментировать их. If $kol * 30 < $GuiPos[2] Then $GuiPos[2]=$kol * 30+32 If $kol * 30 < 178 Then $GuiPos[2]=182 $GuiPos[3]=$posy+45 $initext = StringRegExpReplace($initext, "(?s)(?:\[Setting\]\r\n)(.*?)(?=\r\n\[)", '[Setting]' & @CRLF & $GuiPos[2] & ',' & $GuiPos[3] & ',' & $GuiPos[0] & ',' & $GuiPos[1] & '|' & $aSet[2]) $iniopen = FileOpen($Ini, 2) FileWrite($iniopen, $initext) FileClose($iniopen) Case $msg = $recreate $newButtom = ClipGet() $nameButt = StringRegExpReplace($newButtom, "(?sx).*?(\w[b]{3}).*"[/b], '\1') $varnew = InputBox("Сообщение", 'Введите имя переменной' & @CRLF & 'желательно три символа', $nameButt, "", 170, 150, $GuiPos[0], $GuiPos[3] + $GuiPos[1]) If $varnew = '' Then ContinueLoop Else $initext &= @CRLF & $varnew & '|' & $newButtom & @CRLF & '[z--z]' EndIf If $y=0 Then $GuiPos = WinGetPos($Gui) $GuiPos[2]+=30 WinMove($Gui, "", $GuiPos[0], $GuiPos[1], $GuiPos[2],$GuiPos[3]) EndIf $kol += 1 Assign('Button' & $kol, GUICtrlCreateButton($varnew, 1, 1, 30, 25)) GUICtrlSetTip(-1, $newButtom) GUICtrlSetResizing(-1, $GUI_DOCKALL) Assign('execute' & $kol, $newButtom) Assign('name_b' & $kol, $varnew) Assign('del' & $kol, GUICtrlCreateMenuItem("Удалить - "&$varnew, $delmenu)) Case $msg = $Npad $aSet[2] = 'Notepad++' GUICtrlSetState($Npad,$GUI_CHECKED) GUICtrlSetState($SciTE,$GUI_UNCHECKED) Case $msg = $SciTE $aSet[2] = 'SciTEWindow' GUICtrlSetState($SciTE,$GUI_CHECKED) GUICtrlSetState($Npad,$GUI_UNCHECKED) Case $msg = $helpitem MsgBox(0, 'О программе', 'Панелька для вставки готовых конструкций'&@CRLF&'кода в окно редактора Notepad++ или SciTE'&@CRLF&@CRLF&' @AZJIO 12.05.2010') Case $msg = $Editini ShellExecute(@ScriptDir & '\panfun.ini', "", @ScriptDir, "") Case $msg = -3 Or $msg = $Quit1 Exit Case $msg = $Quit2 _restart() EndSelect WEnd Func _delitem($d) For $i = 0 To $kol GUICtrlDelete(Eval('Button' & $i)) GUICtrlDelete(Eval('execute' & $i)) GUICtrlDelete(Eval('name_b' & $i)) GUICtrlDelete(Eval('del' & $i)) Next $initext = StringRegExpReplace($initext, '(?s)\[z--z\]\r\n('&Eval('name_b' & $d)&'\|.*?)(?=\[z)', '') $aPattern = StringRegExp($initext, '(?s)z\]\r\n(.*?)(?=\r\n\[z)', 3) $kol = UBound($aPattern) - 1 $Width = $aPos[1] - Mod($aPos[1], 30) ; вычисление позиции кнопок при старте скрипта (12 строк) $y = 0 $x = 0 $posy = 1 For $i = 0 To $kol $x += 1 If $x * 30 > $aPos[1] Then $x = 1 $y += 1 $posy = $y * 25 + 1 EndIf $posx = $x * 30 - 29 $tmp = StringSplit($aPattern[$i], '|') Assign('Button' & $i, GUICtrlCreateButton($tmp[1], $posx, $posy, 30, 25)) GUICtrlSetResizing(-1, $GUI_DOCKALL) GUICtrlSetTip(-1, $tmp[2]) Assign('execute' & $i, $tmp[2]) Assign('name_b' & $i, $tmp[1]) Assign('del' & $i, GUICtrlCreateMenuItem("Удалить - "&$tmp[1], $delmenu)) Next EndFunc Func _insert($pattern) $NP = '[CLASS:' & $aSet[2] & ']' ; здесь можно указать другой редактор, или в ini If WinExists($NP) Then WinActivate($NP) WinWaitActive($NP) $byfertmp=ClipGet() ClipPut($pattern) Send("[b]+{ins}"[/b]) ClipPut($byfertmp) $byfertmp='' EndIf EndFunc Func _restart() Local $sAutoIt_File = @TempDir & "\~Au3_ScriptRestart_TempFile.au3" Local $sRunLine, $sScript_Content, $hFile $sRunLine = @ScriptFullPath If Not @Compiled Then $sRunLine = @AutoItExe & ' /AutoIt3ExecuteScript ""' & $sRunLine & '""' If $CmdLine[0] > 0 Then $sRunLine &= ' ' & $CmdLineRaw $sScript_Content &= '#NoTrayIcon' & @CRLF & _ 'While ProcessExists(' & @AutoItPID & ')' & @CRLF & _ ' Sleep(10)' & @CRLF & _ 'WEnd' & @CRLF & _ 'Run("' & $sRunLine & '")' & @CRLF & _ 'FileDelete(@ScriptFullPath)' & @CRLF $hFile = FileOpen($sAutoIt_File, 2) FileWrite($hFile, $sScript_Content) FileClose($hFile) Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sAutoIt_File & '"', @ScriptDir, @SW_HIDE) Sleep(1000) Exit EndFunc |