Advertisement
AZJIO

JumpToString

Sep 22nd, 2011
414
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 29.18 KB | None | 0 0
  1. #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
  2. #AutoIt3Wrapper_OutFile=JumpToString.exe
  3. #AutoIt3Wrapper_icon=JumpToString.ico
  4. #AutoIt3Wrapper_Compression=n
  5. #AutoIt3Wrapper_UseUpx=n
  6. #AutoIt3Wrapper_UseAnsi=y
  7. #AutoIt3Wrapper_Res_Comment=-
  8. #AutoIt3Wrapper_Res_Description=JumpToString.exe
  9. #AutoIt3Wrapper_Res_Fileversion=0.2.0.0
  10. #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=n
  11. #AutoIt3Wrapper_Res_LegalCopyright=AZJIO
  12. #AutoIt3Wrapper_Res_Language=1049
  13. #AutoIt3Wrapper_Run_AU3Check=n
  14. #AutoIt3Wrapper_Res_Field=Version|0.2
  15. #AutoIt3Wrapper_Res_Field=Build|2011.10.9
  16. #AutoIt3Wrapper_Res_Field=Coded by|AZJIO
  17. #AutoIt3Wrapper_Res_Field=Compile date|%longdate% %time%
  18. #AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer%
  19. #AutoIt3Wrapper_Res_Icon_Add=1.ico
  20. #AutoIt3Wrapper_Res_Icon_Add=2.ico
  21. #AutoIt3Wrapper_Res_Icon_Add=3.ico
  22. #AutoIt3Wrapper_Res_Icon_Add=4.ico
  23. #AutoIt3Wrapper_Run_Obfuscator=y
  24. #Obfuscator_Parameters=/sf /sv /om /cs=0 /cn=0
  25. #AutoIt3Wrapper_Run_After=%autoitdir%\SciTE\upx\upx.exe -7 --compress-icons=0 "%out%"
  26. #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_Obfuscated.au3"
  27. #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
  28.  
  29. ;  @AZJIO 9.10.2011 (AutoIt3_v3.3.6.1)
  30. #NoTrayIcon
  31. #include <nppUDF.au3>
  32. #include <Array.au3>
  33. #include <GUIConstantsEx.au3>
  34. #include <WindowsConstants.au3>
  35. #include <GuiImageList.au3>
  36. #include <GuiTreeView.au3>
  37. #include <Misc.au3>
  38.  
  39. Opt("GUIResizeMode", 802)
  40. Opt("GUIOnEventMode", 1)
  41. ;==========================================================
  42. ; En
  43. $LngTitle='Jump to string'
  44. $LngAbout='About'
  45. $LngVer='Version'
  46. $LngSite='Site'
  47. $LngCopy='Copy'
  48. $LngLVFN='Function name'
  49. $LngMB1='Message'
  50. $LngMB2='The program requires to run Notepad++ editor'
  51. $LngMB3='Error'
  52. $LngMB4='The label is not found, so removed'
  53. $LngIB1='Add'
  54. $LngIB2='Item name'
  55. $LngDel='Delete selected'
  56. $LngUsr='1 User'
  57. $LngRgn='2 Regions'
  58. $LngFnc='3 Functions'
  59. $LngCmm='4 Comments'
  60.  
  61. $Lang_dll = DllOpen("kernel32.dll")
  62. $UserIntLang=DllCall ( $Lang_dll, "int", "GetUserDefaultUILanguage" )
  63. If Not @error Then $UserIntLang=Hex($UserIntLang[0],4)
  64. DllClose($Lang_dll)
  65.  
  66. ; Ru
  67. ; если русская локализация, то русский язык
  68. If $UserIntLang = 0419 Then
  69.     ; $LngTitle='Перейти к строке'
  70.     $LngAbout='О программе'
  71.     $LngVer='Версия'
  72.     $LngSite='Сайт'
  73.     $LngCopy='Копировать'
  74.     $LngLVFN='Имя функции'
  75.     $LngMB1='Сообщение'
  76.     $LngMB2='Для работы программы требуется запустить редактор Notepad++'
  77.     $LngMB3='Ошибка'
  78.     $LngMB4='Метка не найдена, поэтому удалена'
  79.     $LngIB1='Добавить'
  80.     $LngIB2='Название пункта'
  81.     $LngDel='Удалить пункт'
  82.     $LngUsr='1 Пользовательские'
  83.     $LngRgn='2 Регион'
  84.     $LngFnc='3 Функции'
  85.     $LngCmm='4 Комментарии'
  86. EndIf
  87. ;==========================================================
  88.  
  89. If Not WinExists('[CLASS:Notepad++]') Then
  90.     MsgBox(262144, $LngMB1, $LngMB2)
  91.     Exit
  92. EndIf
  93.  
  94. Global $TabNameNP, $TabNameNP2, $aTabNameNP[1][2], $UserItem, $Funcitem, $Regionitem, $Commentsitem, $aFunc[1][4], $aRegion[1][4], $aComments[1][4], $aUser[1][4], $geUser, $geFunc, $geRegion, $geComments, $aFont[1]=[0]
  95. Global $FileData=@ScriptDir&'\JumpToStringData.txt', $DelIItemI=-1, $DelIItemH=-1, $Tr7=0, $XYPos[4]
  96. Global $Gui1, $TrSort=1, $OnTop=0, $Ini=@ScriptDir&'\JumpToString.ini'
  97. Global $RedExp1='(?mi)^\h*(Func\h+)(\w+\W)', $RedExp2='(?mi)^\h*(\#Region\h*)([^\r\n]*)', $RedExp3='(?mi)^\h*(?:.*?''.*?''.*?|.*?".*?".*?|[^''"]*?)*(;|#cs)([^\r\n]*)'
  98. ; Global $RedExp1='(?mi)^\h*(Func\h+)(\w+\W)', $RedExp2='(?mi)^\h*(\#Region\h*)([^\r\n]*)', $RedExp3='(?mi)^\h*[^''"]*?(?:''.*?''.*?|".*?".*?)*(;|#cs)([^\r\n]*)'
  99.  
  100. Switch @OSVersion
  101.     Case 'WIN_VISTA', 'WIN_7'
  102.         $Tr7=1
  103. EndSwitch
  104.  
  105. If DriveStatus(StringLeft(@ScriptDir, 1))<>'NOTREADY' Then
  106.     $DriveRead=1
  107. Else
  108.     $DriveRead=0
  109. EndIf
  110.  
  111. If Not FileExists($Ini) And $DriveRead=1 Then
  112. $file = FileOpen($Ini,2)
  113. FileWrite($file, '[Set]' & @CRLF & _
  114. 'Sort=1' & @CRLF & _
  115. 'OnTop=0' & @CRLF & _
  116. 'RedExp1='&$RedExp1 & @CRLF & _
  117. 'RedExp2='&$RedExp2 & @CRLF & _
  118. 'HotKey=^{F11}' &@CRLF& _
  119. 'NameUser='&$LngUsr &@CRLF& _
  120. 'NameRegions='&$LngRgn &@CRLF& _
  121. 'NameFunctions='&$LngFnc &@CRLF& _
  122. 'NameComments='&$LngCmm &@CRLF& _
  123. 'geUser=1' &@CRLF& _
  124. 'geFunc=1' &@CRLF& _
  125. 'geRegion=1' &@CRLF& _
  126. 'geComments=1' &@CRLF& _
  127. 'W=230' &@CRLF& _
  128. 'H=420' &@CRLF& _
  129. 'X=' &@CRLF& _
  130. 'Y=')
  131. FileClose($file)
  132. EndIf
  133. ; 'Font=0,Arial,10,400' &@CRLF& _
  134.  
  135. $LngUsr=IniRead($Ini, 'Set', 'NameUser', $LngUsr)
  136. $LngRgn=IniRead($Ini, 'Set', 'NameRegions', $LngRgn)
  137. $LngFnc=IniRead($Ini, 'Set', 'NameFunctions', $LngFnc)
  138. $LngCmm=IniRead($Ini, 'Set', 'NameComments', $LngCmm)
  139.  
  140. $TrOnTop=Number(IniRead($Ini, 'Set', 'OnTop', 0))
  141. $TrSort=Number(IniRead($Ini, 'Set', 'Sort', 1))
  142. $RedExp1=IniRead($Ini, 'Set', 'RedExp1', $RedExp1)
  143. $RedExp2=IniRead($Ini, 'Set', 'RedExp2', $RedExp2)
  144. $HotKey=IniRead($Ini, 'Set', 'HotKey', '^{F11}')
  145.  
  146.  
  147. $iniFont=IniRead($Ini, 'Set', 'Font', '')
  148.  
  149. $geUser=Number(IniRead($Ini, 'Set', 'geUser', 1))
  150. $geFunc=Number(IniRead($Ini, 'Set', 'geFunc', 1))
  151. $geRegion=Number(IniRead($Ini, 'Set', 'geRegion', 1))
  152. $geComments=Number(IniRead($Ini, 'Set', 'geComments', 1))
  153.  
  154. $XYPos[0]=Number(IniRead($Ini, 'Set', 'W', '230'))
  155. $XYPos[1]=Number(IniRead($Ini, 'Set', 'H', '420'))
  156. $XYPos[2]=IniRead($Ini, 'Set', 'X', '')
  157. $XYPos[3]=IniRead($Ini, 'Set', 'Y', '')
  158.  
  159. If BitAnd(WinGetState('[CLASS:Notepad++]'), 16) Then WinSetState('[CLASS:Notepad++]','',@SW_RESTORE)
  160. $tmp = ControlGetPos('[CLASS:Notepad++]', "", "[CLASSNN:Scintilla1]")
  161. If $XYPos[0]<230 Then $XYPos[0]=230
  162. If $tmp[3]<150 Then
  163.     $XYPos[1]=150
  164. Else
  165.     $XYPos[1]=$tmp[3]
  166. EndIf
  167. _SetCoor($XYPos)
  168.  
  169. _ReadData()
  170.  
  171. HotKeySet($HotKey, "_AddUserItem")
  172. ; HotKeySet("^1", "_FuncName")
  173. $Gui = GUICreate($LngTitle, $XYPos[0], $XYPos[1], $XYPos[2], $XYPos[3], $WS_OVERLAPPEDWINDOW)
  174. If @compiled Then
  175.     $AutoItExe=@AutoItExe
  176. Else
  177.     $AutoItExe=@ScriptDir&'\JumpToString.dll'
  178.     GUISetIcon($AutoItExe, 99)
  179. EndIf
  180. GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
  181. If $iniFont<>'' Then
  182.     $aFont=StringSplit($iniFont, ',')
  183.     If $aFont[0]=4 Then GUISetFont($aFont[3], $aFont[4], $aFont[1], $aFont[2])
  184. EndIf
  185.  
  186. GUICtrlCreateButton("@", 4, 1, 20, 20)
  187. GUICtrlSetResizing(-1, 2+32 + 256 + 512)
  188. GUICtrlSetOnEvent(-1, "_About")
  189.  
  190. GUICtrlCreateButton("font", $XYPos[0]-65, 1, 35, 20)
  191. GUICtrlSetResizing(-1, 4+32 + 256 + 512)
  192. GUICtrlSetOnEvent(-1, "_SelFont")
  193.  
  194. GUICtrlCreateButton("+", $XYPos[0]-24, 1, 20, 20)
  195. GUICtrlSetResizing(-1, 4+32 + 256 + 512)
  196. GUICtrlSetOnEvent(-1, "_AddUserItem")
  197.  
  198. $ChSort=GUICtrlCreateCheckbox('Sort', 40, 2, 50, 17)
  199. GUICtrlSetOnEvent(-1, "_Sort")
  200. If $TrSort=1 Then GUICtrlSetState(-1, 1)
  201.  
  202. $ChOnTop=GUICtrlCreateCheckbox('on top', 90, 2, 70, 17)
  203. GUICtrlSetOnEvent(-1, "_On_top")
  204.  
  205. $TreeView = GUICtrlCreateTreeView(5, 22, $XYPos[0]-10, $XYPos[1]-25)
  206. GUICtrlSetResizing(-1, 2 + 4 + 32 + 64)
  207. $hTreeView = GUICtrlGetHandle($TreeView)
  208.  
  209. $hImage = _GUIImageList_Create (16, 16, 5)
  210. _GUIImageList_AddIcon ( $hImage, $AutoItExe, -201 )
  211. _GUIImageList_AddIcon ( $hImage, $AutoItExe, -202 )
  212. _GUIImageList_AddIcon ( $hImage, $AutoItExe, -203 )
  213. _GUIImageList_AddIcon ( $hImage, $AutoItExe, -204 )
  214. _GUICtrlTreeView_SetNormalImageList ($hTreeView, $hImage)
  215.  
  216. Global $ContMenu = GUICtrlCreateContextMenu(GUICtrlCreateDummy())
  217. GUICtrlCreateMenuItem($LngDel, $ContMenu)
  218. GUICtrlSetOnEvent(-1, "_DelUserItem")
  219.  
  220. _FillingList()
  221. GUISetState()
  222. GUISetState(@SW_RESTORE)
  223. Sleep(200)
  224. WinSetOnTop($GUI, '', 1)
  225. WinSetOnTop($GUI, '', 0)
  226.  
  227. If Not @error And $TrOnTop=1 Then
  228.     WinSetOnTop($GUI, '', 1)
  229.     GUICtrlSetState($ChOnTop, 1)
  230. EndIf
  231.  
  232. GUIRegisterMsg(0x0024, "WM_GETMINMAXINFO")
  233. GUIRegisterMsg(0x004E, 'WM_NOTIFY')
  234. GUIRegisterMsg(0x0046 , "WM_WINDOWPOSCHANGING")
  235. AdlibRegister("_NPPGetTitle", 400)
  236. OnAutoItExitRegister("_Save_Exit")
  237.  
  238. While 1
  239.     Sleep(100000)
  240. WEnd
  241.  
  242. Func _SelFont()
  243.     If $aFont[0]=4 Then
  244.         $a_font = _ChooseFont($aFont[2], $aFont[3], 0, $aFont[4], False, False, False, $Gui)
  245.     Else
  246.         $a_font = _ChooseFont('Arial', 10, 0, 0, False, False, False, $Gui)
  247.     EndIf
  248.     If Not @error Then
  249.         IniWrite($Ini, 'Set', 'Font', _ArrayToString($a_font, ',', 1, 4))
  250.         If MsgBox (4, 'Сообщение', 'Для применения параметров необходим перезапуск утилиты. '&@CRLF&'Выполнить перезапуск?', 0, $Gui)=6 Then _restart()
  251.     EndIf
  252. EndFunc
  253.  
  254. Func _restart()
  255.     Local $sAutoIt_File = @TempDir & "\~Au3_ScriptRestart_TempFile.au3"
  256.     Local $sRunLine, $sScript_Content, $hFile
  257.  
  258.     $sRunLine = @ScriptFullPath
  259.     If Not @Compiled Then $sRunLine = @AutoItExe & ' /AutoIt3ExecuteScript ""' & $sRunLine & '""'
  260.     If $CmdLine[0] > 0 Then $sRunLine &= ' ' & $CmdLineRaw
  261.  
  262.     $sScript_Content &= '#NoTrayIcon' & @CRLF & _
  263.             'While ProcessExists(' & @AutoItPID & ')' & @CRLF & _
  264.             '   Sleep(10)' & @CRLF & _
  265.             'WEnd' & @CRLF & _
  266.             'Run("' & $sRunLine & '")' & @CRLF & _
  267.             'FileDelete(@ScriptFullPath)' & @CRLF
  268.  
  269.     $hFile = FileOpen($sAutoIt_File, 2)
  270.     FileWrite($hFile, $sScript_Content)
  271.     FileClose($hFile)
  272.  
  273.     Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sAutoIt_File & '"', @ScriptDir, @SW_HIDE)
  274.     Sleep(1000)
  275.     Exit
  276. EndFunc
  277.  
  278. ; добавление пункта пользователя
  279. Func _AddUserItem()
  280.     Local $AllText, $CurLine, $gp, $i, $n, $sempl, $tmp, $word
  281.     $word=_npp_GetText(0)
  282.     If $word = '' Then
  283.         $word=_npp_GetText(1)
  284.         If $word = '' Then Return
  285.     EndIf
  286.     $gp=WinGetPos($Gui)
  287.     $GP=_ChildCoor($Gui, 170, 150, 1) ; центрирование диалога в окне
  288.     $sempl=InputBox($LngIB1, $LngIB2, StringLeft(StringStripWS ($word, 7 ), 19), '', $GP[2], $GP[3], $GP[0], $GP[1], -1, $Gui)
  289.     If Not @error And $sempl<>'' Then
  290.         ; поиск номера совпадения, если образец повторяется многократно по тексту
  291.         $AllText=_npp_GetText()
  292.         $CurLine=_SendMessage(WinGetHandle('[CLASS:Notepad++]'), $NPPM_GETCURRENTLINE, 0, 0)
  293.         $i=0
  294.         Do
  295.             $i+=1
  296.             $tmp=StringInStr($AllText, $word, 1, $i)
  297.             If $tmp = 0 Then Return
  298.             ; $tmp=StringSplit(StringLeft($AllText, $tmp), @LF)
  299.             ; $tmp=$tmp[0]-1
  300.             $tmp=StringRegExp(StringLeft($AllText, $tmp), '(\r\n|\r|\n)', 3)
  301.             $tmp=UBound($tmp)
  302.         Until Abs($tmp-$CurLine)<2 ; выход из цикла если номер строки совпадает с найденным по количеству переносов строк
  303.         ;Добавляем пункт в дерево и атрибуты в массив
  304.         $n=UBound($aUser)
  305.         ReDim $aUser[$n+1][4]
  306.         $aUser[$n][0]=$sempl
  307.         $aUser[$n][1]=$word
  308.         $aUser[$n][2]=_GUICtrlTreeView_GetItemHandle ($TreeView, _GUICtrlTreeView_AddChild ( $TreeView, $UserItem, $sempl, 2, 2 ))
  309.         $aUser[$n][3]=$i
  310.         _GUICtrlTreeView_Expand ($TreeView)
  311.     EndIf
  312.     WinActivate('[CLASS:Notepad++]')
  313. EndFunc
  314.  
  315. ; получить путь из заголовка редактора, проверка каждые 400 милисекунд
  316. Func _NPPGetTitle()
  317.     Local $Title = WinGetTitle('[CLASS:Notepad++]')
  318.     If $Title = '0' Then
  319.         AdlibUnRegister("_NPPGetTitle")
  320.         MsgBox(0, $LngMB3, $LngMB2)
  321.         Exit
  322.     EndIf
  323.     If $TabNameNP == $Title Then Return
  324.     ; индекс 2 ($Title2 и $TabNameNP2) избавляет зависимость от * в загловке
  325.     If StringLeft($Title, 1)='*' Then
  326.         $Title2=StringTrimLeft($Title, 1)
  327.     Else
  328.         $Title2=$Title
  329.     EndIf
  330.     If Not($TabNameNP2 == $Title2) Then
  331.         If UBound($aUser)>1 Then
  332.             $iItem = _ArraySearch($aTabNameNP, $TabNameNP2, 0, 0, 0, 0, 1, 0) ; поиск для сохранения имя+массив
  333.             If @error Then
  334.                 $n=UBound($aTabNameNP)
  335.                 ReDim $aTabNameNP[$n+1][2]
  336.                 $aTabNameNP[$n][0]=$TabNameNP2
  337.                 $aTabNameNP[$n][1]=$aUser
  338.             Else
  339.                 $aTabNameNP[$iItem][1]=$aUser
  340.             EndIf
  341.         EndIf
  342.         $iItem = _ArraySearch($aTabNameNP, $Title2, 0, 0, 0, 0, 1, 0) ; поиск в сохранениях чтобы использовать
  343.         If @error Then
  344.             $aUser=''
  345.             Dim $aUser[1][4]
  346.         Else
  347.             $aUser=$aTabNameNP[$iItem][1]
  348.         EndIf
  349.     EndIf
  350.     $TabNameNP2 = $Title2
  351.     $TabNameNP = $Title
  352.     _FillingList()
  353.     ; Local $path = StringRegExpReplace($tTitle, '^*?(.*?)([ ]-[ ]Notepad\+\+)','\1')
  354. EndFunc
  355.  
  356. ; пересоздание дерева
  357. Func _FillingList()
  358.     $err=0
  359.     _GUICtrlTreeView_BeginUpdate ( $TreeView )
  360.     If _GUICtrlTreeView_GetChildCount($TreeView, $UserItem)>0 Then $geUser=_GUICtrlTreeView_GetExpanded($TreeView, $UserItem)
  361.     If _GUICtrlTreeView_GetChildCount($TreeView, $Funcitem)>0 Then $geFunc=_GUICtrlTreeView_GetExpanded($TreeView, $Funcitem)
  362.     If _GUICtrlTreeView_GetChildCount($TreeView, $Regionitem)>0 Then $geRegion=_GUICtrlTreeView_GetExpanded($TreeView, $Regionitem)
  363.     If _GUICtrlTreeView_GetChildCount($TreeView, $Commentsitem)>0 Then $geComments=_GUICtrlTreeView_GetExpanded($TreeView, $Commentsitem)
  364.     _GUICtrlTreeView_DeleteAll ( $TreeView )
  365.     $UserItem = _GUICtrlTreeView_Add ( $TreeView, 0, $LngUsr, 2, 2 )
  366.     $Funcitem = _GUICtrlTreeView_Add ( $TreeView, 0, $LngFnc, 0, 0 )
  367.     $Regionitem = _GUICtrlTreeView_Add ( $TreeView, 0, $LngRgn, 1, 1 )
  368.     $Commentsitem = _GUICtrlTreeView_Add ( $TreeView, 0, $LngCmm, 3, 3 )
  369.     ; _GUICtrlTreeView_SetImageIndex ($TreeView, $UserItem, 1)
  370.     $AllText=_npp_GetText()
  371.     $aFunc=StringRegExp($AllText, $RedExp1, 3) ; добавляем функции скрипта
  372.     If Not @error Then _AddItem($aFunc, $Funcitem, 0)
  373.     $aRegion=StringRegExp($AllText, $RedExp2, 3) ; добавляем областей скрипта
  374.     If Not @error Then _AddItem1($aRegion, $Regionitem, 1)
  375.     _AddItem2($AllText)
  376.     $n=UBound($aUser)
  377.     If $n>1 Then
  378.         For $i = 1 to $n-1
  379.             $aUser[$i][2]=_GUICtrlTreeView_GetItemHandle ($TreeView, _GUICtrlTreeView_AddChild ( $TreeView, $UserItem, $aUser[$i][0], 2, 2 ))
  380.         Next
  381.     EndIf
  382.     If $TrSort = 1 Then _GUICtrlTreeView_Sort ($TreeView)
  383.     If $geUser = True Then _GUICtrlTreeView_Expand($TreeView, $UserItem)
  384.     If $geFunc = True Then _GUICtrlTreeView_Expand($TreeView, $Funcitem)
  385.     If $geRegion = True Then _GUICtrlTreeView_Expand($TreeView, $Regionitem)
  386.     If $geComments = True Then _GUICtrlTreeView_Expand($TreeView, $Commentsitem)
  387.     ; _GUICtrlTreeView_Expand ($TreeView)
  388.     _GUICtrlTreeView_EndUpdate ( $TreeView )
  389. EndFunc
  390.  
  391. ; придаток к _FillingList, создаёт полноценный массив
  392. Func _AddItem(ByRef $aFunc, $Parent, $x)
  393.     $tmp=UBound($aFunc)
  394.     Local $aTmp[$tmp/2][4]
  395.     For $i = 0 to $tmp-1 Step 2
  396.         ; If $aFunc[$i]='#Region' And $aFunc[$i+1]='' Then $aFunc[$i+1]='#Region'
  397.         $aTmp[$i/2][0]=StringTrimRight($aFunc[$i+1], 1)
  398.         $aTmp[$i/2][1]=$aFunc[$i]&$aFunc[$i+1]
  399.         $aTmp[$i/2][2]=_GUICtrlTreeView_GetItemHandle ($TreeView, _GUICtrlTreeView_AddChild ( $TreeView, $Parent, $aTmp[$i/2][0], $x, $x ))
  400.         $aTmp[$i/2][3]=1
  401.     Next
  402.     $aFunc=$aTmp
  403. EndFunc
  404.  
  405. Func _AddItem1(ByRef $aFunc, $Parent, $x)
  406.     $tmp=UBound($aFunc)
  407.     Local $aTmp[$tmp/2][4]
  408.     For $i = 0 to $tmp-1 Step 2
  409.         If $aFunc[$i]='#Region' And $aFunc[$i+1]='' Then $aFunc[$i+1]='#Region'
  410.         $aTmp[$i/2][0]=$aFunc[$i+1]
  411.         $aTmp[$i/2][1]=$aFunc[$i]&$aFunc[$i+1]
  412.         $aTmp[$i/2][2]=_GUICtrlTreeView_GetItemHandle ($TreeView, _GUICtrlTreeView_AddChild ( $TreeView, $Parent, $aTmp[$i/2][0], $x, $x ))
  413.         $aTmp[$i/2][3]=1
  414.     Next
  415.     $aFunc=$aTmp
  416. EndFunc
  417.  
  418. Func _AddItem2($AllText)
  419.     $TmpAll=StringRegExpReplace($AllText, '(?s)(\h*;.*?\r\n)+', '\1') ; удаляет повторные строки комментариев
  420.     $TmpAll=StringRegExpReplace($TmpAll, '(?ms)^[^;]*?\r\n', '') ; удаляет строки без комментариев
  421.     $aComments=StringRegExp($TmpAll, $RedExp3, 3) ; добавляем комментарии скрипта
  422.     If Not @error Then
  423.         $tmp=UBound($aComments)
  424.         Local $aTmp[$tmp/2][4]
  425.         For $i = 0 to $tmp-1 Step 2
  426.             If $aComments[$i]='#cs' And $aComments[$i+1]='' Then $aComments[$i+1]='#cs'
  427.             If StringLeft($aComments[$i+1], 3)='==>' Then ContinueLoop
  428.             $aTmp[$i/2][0]=$aComments[$i+1]
  429.             $aTmp[$i/2][1]=$aComments[$i]&$aComments[$i+1]
  430.             $aTmp[$i/2][3]=1
  431.         Next
  432. ; _ArrayDisplay($aTmp, 'Array')
  433.        
  434.         Assign('/', 1, 1) ;для исключения пустых строк и не совпадения с локальными переменными
  435.         $k=0
  436.         For $i = 0 To UBound($aTmp)-1
  437.             Assign($aTmp[$i][0]&'/', Eval($aTmp[$i][0]&'/')+1, 1)
  438.             If Eval($aTmp[$i][0]&'/') = 1 Then
  439.                 $aTmp[$k][0]=$aTmp[$i][0]
  440.                 $aTmp[$k][1]=$aTmp[$i][1]
  441.                 ; $aTmp[$k][2]=$aTmp[$i][2]
  442.                 $aTmp[$k][2]=_GUICtrlTreeView_GetItemHandle ($TreeView, _GUICtrlTreeView_AddChild ( $TreeView, $Commentsitem, $aTmp[$i][0], 3, 3 ))
  443.                 $aTmp[$k][3]=$aTmp[$i][3]
  444.                 $k+=1
  445.             EndIf
  446.         Next
  447.         If $k = 0 Then Return SetError(1, 0, 0)
  448.         ReDim $aTmp[$k][4]
  449.        
  450.         $aComments=$aTmp
  451.        
  452.     EndIf
  453. EndFunc
  454.  
  455. Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
  456.     Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $aTmp, $tmp, $tmp2
  457.  
  458.     $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
  459.     $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
  460.     $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
  461.     $iCode = DllStructGetData($tNMHDR, "Code")
  462.     Switch $hWndFrom
  463.         Case $hTreeView
  464.             Switch $iCode
  465.                 Case $NM_CLICK
  466.                     ;http://www.autoitscript.com/forum/topic/64632-checked-all-and-treeview/page__view__findpost__p__481808
  467.                     ; получение хэндла кликнутого пункта и поиск его в массиве
  468.                     Local $tMPos = _WinAPI_GetMousePos(True, $hWndFrom), $tHit = _GUICtrlTreeView_HitTestEx($hWndFrom, DllStructGetData($tMPos, 1), DllStructGetData($tMPos, 2))
  469.                     Local $hItem = DllStructGetData($tHit, "Item")
  470.                     If $hItem <> -1 And $hItem<>0x0 Then
  471.                         $iItem = _ArraySearch($aFunc, $hItem, 0, 0, 0, 0, 1, 2)
  472.                         If $iItem=-1 Then
  473.                             $iItem = _ArraySearch($aRegion, $hItem, 0, 0, 0, 0, 1, 2)
  474.                             If $iItem=-1 Then
  475.                                 $iItem = _ArraySearch($aComments, $hItem, 0, 0, 0, 0, 1, 2)
  476.                                 If $iItem=-1 Then
  477.                                     $iItem = _ArraySearch($aUser, $hItem, 0, 0, 0, 0, 1, 2)
  478.                                     If $iItem=-1 Then
  479.                                         Return $GUI_RUNDEFMSG
  480.                                     Else
  481.                                         $aTmp=$aUser
  482.                                     EndIf
  483.                                 Else
  484.                                     $aTmp=$aComments
  485.                                 EndIf
  486.                             Else
  487.                                 $aTmp=$aRegion
  488.                             EndIf
  489.                         Else
  490.                             $aTmp=$aFunc
  491.                         EndIf
  492.                     Else
  493.                         Return $GUI_RUNDEFMSG
  494.                     EndIf
  495.                    
  496.                     ; Поиск найденного в тексте кода
  497.                     $AllText=_npp_GetText()
  498.                     $tmp=StringInStr($AllText, $aTmp[$iItem][1], 1 , $aTmp[$iItem][3])
  499.                     If $tmp = 0 Then
  500.                         $DelIItemH=$hItem
  501.                         $DelIItemI=$iItem
  502.                         _DelUserItem()
  503.                         MsgBox(8192+262144, $LngMB3, $LngMB4)
  504.                         WinActivate('[CLASS:Notepad++]')
  505.                         Return $GUI_RUNDEFMSG
  506.                     EndIf
  507.                     $tmp=StringRegExp(StringLeft($AllText, $tmp), '(\r\n|\r|\n)', 3)
  508.                     $tmp=UBound($tmp)
  509.                     ; делаем поправку, чтоб передвинуть строку к центру окна
  510.                     $CurLine=_SendMessage(WinGetHandle('[CLASS:Notepad++]'), $NPPM_GETCURRENTLINE, 0, 0)
  511.                     $pos = ControlGetPos('[CLASS:Notepad++]', "", "[CLASSNN:Scintilla1]")
  512.                     $tmp2=$pos[3]/32
  513.                     If $tmp>$CurLine Then
  514.                         $tmp2=$tmp+$tmp2
  515.                     Else
  516.                         $tmp2=$tmp-$tmp2
  517.                     EndIf
  518.                     _npp_SetCurPos($tmp2)
  519.                     _npp_SetCurPos($tmp)
  520.                     WinActivate('[CLASS:Notepad++]')
  521.                 Case $NM_RCLICK
  522.                     Local $tMPos = _WinAPI_GetMousePos(True, $hWndFrom), $tHit = _GUICtrlTreeView_HitTestEx($hWndFrom, DllStructGetData($tMPos, 1), DllStructGetData($tMPos, 2))
  523.                     Local $hItem = DllStructGetData($tHit, "Item")
  524.                     If $hItem <> -1 And $hItem<>0x0 Then
  525.                         $iItem = _ArraySearch($aUser, $hItem, 0, 0, 0, 0, 1, 2)
  526.                         If $iItem<>-1 Then
  527.                             $DelIItemH=$hItem
  528.                             $DelIItemI=$iItem
  529.                             Local $hMenu = GUICtrlGetHandle($ContMenu)
  530.                             $x = MouseGetPos(0)
  531.                             $y = MouseGetPos(1)
  532.                             DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $x, "int", $y, "hwnd", $Gui, "ptr", 0)
  533.                         EndIf
  534.                     Else
  535.                         Return $GUI_RUNDEFMSG
  536.                     EndIf
  537.             EndSwitch
  538.     EndSwitch
  539.     Return $GUI_RUNDEFMSG
  540. EndFunc
  541.  
  542. Func _DelUserItem()
  543.     If $DelIItemI<>-1 Then
  544.         _ArrayDelete($aUser, $DelIItemI)
  545.         _GUICtrlTreeView_Delete($TreeView, $DelIItemH)
  546.         $DelIItemI=-1
  547.         $DelIItemH=-1
  548.     EndIf
  549. EndFunc
  550.  
  551. ; Func _FuncName()
  552.     ; MsgBox(0, 'Message', $test)
  553. ; EndFunc
  554.  
  555. ; ограничения размеров окна
  556. Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
  557.     #forceref $iMsg, $wParam
  558.     If $hWnd = $GUI Then
  559.         Local $tMINMAXINFO = DllStructCreate("int;int;" & _
  560.                 "int MaxSizeX; int MaxSizeY;" & _
  561.                 "int MaxPositionX;int MaxPositionY;" & _
  562.                 "int MinTrackSizeX; int MinTrackSizeY;" & _
  563.                 "int MaxTrackSizeX; int MaxTrackSizeY", _
  564.                 $lParam)
  565.         DllStructSetData($tMINMAXINFO, "MaxTrackSizeX", 500)
  566.         DllStructSetData($tMINMAXINFO, "MaxTrackSizeY", @DesktopHeight-60)
  567.         DllStructSetData($tMINMAXINFO, "MinTrackSizeX", 235)
  568.         DllStructSetData($tMINMAXINFO, "MinTrackSizeY", 150)
  569.         DllStructSetData($tMINMAXINFO, "MaxSizeX", $XYPos[0])
  570.         DllStructSetData($tMINMAXINFO, "MaxSizeY", @DesktopHeight-60)
  571.         DllStructSetData($tMINMAXINFO, "MaxPositionX", 0)
  572.         DllStructSetData($tMINMAXINFO, "MaxPositionY", 0)
  573.     EndIf
  574. EndFunc
  575.  
  576. ; вычисление координат дочернего окна
  577. ; 1 - дескриптор родительского окна
  578. ; 2 - ширина дочернего окна
  579. ; 3 - высота дочернего окна
  580. ; 4 - тип 0 - по центру, или 0 - к левому верхнему родительского окна
  581. ; 5 - отступ от краёв
  582. Func _ChildCoor($Gui, $w, $h, $c=0, $d=0)
  583.     Local $aWA = _WinAPI_GetWorkingArea(), _
  584.     $GP = WinGetPos($Gui), _
  585.     $wgcs=WinGetClientSize($Gui)
  586.     Local $dLeft=($GP[2]-$wgcs[0])/2, _
  587.     $dTor=$GP[3]-$wgcs[1]-$dLeft
  588.     If $c = 0 Then
  589.         $GP[0]=$GP[0]+($GP[2]-$w)/2-$dLeft
  590.         $GP[1]=$GP[1]+($GP[3]-$h-$dLeft-$dTor)/2
  591.     EndIf
  592.     If $d>($aWA[2]-$aWA[0]-$w-$dLeft*2)/2 Or $d>($aWA[3]-$aWA[1]-$h-$dLeft+$dTor)/2 Then $d=0
  593.     If $GP[0]+$w+$dLeft*2+$d>$aWA[2] Then $GP[0]=$aWA[2]-$w-$d-$dLeft*2
  594.     If $GP[1]+$h+$dLeft+$dTor+$d>$aWA[3] Then $GP[1]=$aWA[3]-$h-$dLeft-$dTor-$d
  595.     If $GP[0]<=$aWA[0]+$d Then $GP[0]=$aWA[0]+$d
  596.     If $GP[1]<=$aWA[1]+$d Then $GP[1]=$aWA[1]+$d
  597.     $GP[2]=$w
  598.     $GP[3]=$h
  599.     Return $GP
  600. EndFunc
  601.  
  602. Func _WinAPI_GetWorkingArea()
  603.     Local Const $SPI_GETWORKAREA = 48
  604.     Local $stRECT = DllStructCreate("long; long; long; long")
  605.  
  606.     Local $SPIRet = DllCall("User32.dll", "int", "SystemParametersInfo", "uint", $SPI_GETWORKAREA, "uint", 0, "ptr", DllStructGetPtr($stRECT), "uint", 0)
  607.     If @error Then Return 0
  608.     If $SPIRet[0] = 0 Then Return 0
  609.  
  610.     Local $sLeftArea = DllStructGetData($stRECT, 1)
  611.     Local $sTopArea = DllStructGetData($stRECT, 2)
  612.     Local $sRightArea = DllStructGetData($stRECT, 3)
  613.     Local $sBottomArea = DllStructGetData($stRECT, 4)
  614.  
  615.     Local $aRet[4] = [$sLeftArea, $sTopArea, $sRightArea, $sBottomArea]
  616.     Return $aRet
  617. EndFunc
  618.  
  619. Func _Exit()
  620.     Exit
  621. EndFunc
  622.  
  623. Func _Sort()
  624.     $TrSort=GUICtrlRead($ChSort)
  625.     _FillingList()
  626. EndFunc
  627.  
  628. Func _On_top()
  629.     $TrOnTop=GUICtrlRead($ChOnTop)
  630.     If $TrOnTop = 1 Then
  631.         WinSetOnTop($GUI, '', 1)
  632.     Else
  633.         WinSetOnTop($GUI, '', 0)
  634.     EndIf
  635. EndFunc
  636.  
  637. ; валидность координат проверяем при запуске
  638. Func _SetCoor(ByRef $XYPos)
  639.     $Xtmp=Number($XYPos[2])
  640.     $Ytmp=Number($XYPos[3])
  641.     If $Xtmp < 0 Then $Xtmp=0
  642.     If $Xtmp > @DesktopWidth-$XYPos[0] Then $Xtmp=@DesktopWidth-$XYPos[0]
  643.     If $XYPos[2]='' Then $Xtmp=0
  644.     If $Ytmp < 0 And $Ytmp <>-1 Then $Ytmp=0
  645.     If $Ytmp > @DesktopHeight-$XYPos[1] Then $Ytmp=@DesktopHeight-$XYPos[1]
  646.     If $XYPos[3]='' Then $Ytmp=-1
  647.     $XYPos[2]=$Xtmp
  648.     $XYPos[3]=$Ytmp
  649. EndFunc
  650.  
  651. Func WM_WINDOWPOSCHANGING($hWnd, $Msg, $wParam, $lParam)
  652.     Local $sRect = DllStructCreate("Int[6]", $lparam)
  653.     Switch $Tr7
  654.         Case 1
  655.             If DllStructGetData($sRect, 1, 5)<>0 And Not BitAnd(WinGetState($Gui), 16) Then
  656.                 $XYPos[2]=DllStructGetData($sRect, 1, 3)
  657.                 $XYPos[3]=DllStructGetData($sRect, 1, 4)
  658.                 $XYPos[0]=DllStructGetData($sRect, 1, 5)
  659.             EndIf
  660.         Case Else
  661.             If DllStructGetData($sRect, 1, 2) And DllStructGetData($sRect, 1, 5)<>0 And Not BitAnd(WinGetState($Gui), 16) Then
  662.                 $XYPos[2]=DllStructGetData($sRect, 1, 3)
  663.                 $XYPos[3]=DllStructGetData($sRect, 1, 4)
  664.                 $XYPos[0]=DllStructGetData($sRect, 1, 5)
  665.             EndIf
  666.     EndSwitch
  667.     Return 'GUI_RUNDEFMSG'
  668. EndFunc
  669.  
  670. ; сохранение пользовательских меток в файл
  671. Func _Save_Exit()
  672.     If $DriveRead=0 Then Exit
  673.     IniWrite($Ini, 'Set', 'Sort', $TrSort)
  674.     IniWrite($Ini, 'Set', 'OnTop', $TrOnTop)
  675.     ; сохранить координаты окна
  676.     IniWrite($Ini, 'Set', 'X', $XYPos[2])
  677.     IniWrite($Ini, 'Set', 'Y', $XYPos[3])
  678.     IniWrite($Ini, 'Set', 'W', $XYPos[0])
  679.     IniWrite($Ini, 'Set', 'H', $XYPos[1])
  680.    
  681.  
  682.     If _GUICtrlTreeView_GetChildCount($TreeView, $UserItem)>0 Then $geUser=_GUICtrlTreeView_GetExpanded($TreeView, $UserItem)
  683.     If _GUICtrlTreeView_GetChildCount($TreeView, $Funcitem)>0 Then $geFunc=_GUICtrlTreeView_GetExpanded($TreeView, $Funcitem)
  684.     If _GUICtrlTreeView_GetChildCount($TreeView, $Regionitem)>0 Then $geRegion=_GUICtrlTreeView_GetExpanded($TreeView, $Regionitem)
  685.     If _GUICtrlTreeView_GetChildCount($TreeView, $Commentsitem)>0 Then $geComments=_GUICtrlTreeView_GetExpanded($TreeView, $Commentsitem)
  686.     IniWrite($Ini, 'Set', 'geUser', Number($geUser))
  687.     IniWrite($Ini, 'Set', 'geFunc', Number($geFunc))
  688.     IniWrite($Ini, 'Set', 'geRegion', Number($geRegion))
  689.     IniWrite($Ini, 'Set', 'geComments', Number($geComments))
  690.    
  691.     Local $n
  692.     ; обновить последние данные об изменении
  693.         $iItem = _ArraySearch($aTabNameNP, $TabNameNP2, 0, 0, 0, 0, 1, 0) ; поиск для сохранения имя+массив
  694.         If @error Then
  695.             If UBound($aUser)>1 Then
  696.                 $n=UBound($aTabNameNP)
  697.                 ReDim $aTabNameNP[$n+1][2]
  698.                 $aTabNameNP[$n][0]=$TabNameNP2
  699.                 $aTabNameNP[$n][1]=$aUser
  700.             EndIf
  701.         Else
  702.             If UBound($aUser)>1 Then
  703.                 $aTabNameNP[$iItem][1]=$aUser
  704.             Else
  705.                 $n=UBound($aTabNameNP)-1
  706.                 For $i = $iItem to $n-1
  707.                     $aTabNameNP[$i][0]=$aTabNameNP[$i+1][0]
  708.                     $aTabNameNP[$i][1]=$aTabNameNP[$i+1][1]
  709.                 Next
  710.                 ReDim $aTabNameNP[$n][2]
  711.             EndIf
  712.         EndIf
  713.     ; EndIf
  714.     ; сохранить, конвертируя данные в строку
  715.     $n=UBound($aTabNameNP)
  716.     If $n>1 Then
  717.         $TextSaveFile=''
  718.         For $i = 1 to $n-1
  719.             $aTmp=$aTabNameNP[$i][1]
  720.             $mTmp=''
  721.             For $s = 1 to UBound($aTmp)-1
  722.                 $mTmp&=$aTmp[$s][0]&'<¤>'&$aTmp[$s][1]&'<¤><¤>'&$aTmp[$s][3]&'<|¤|>'
  723.             Next
  724.             If StringMid($aTabNameNP[$i][0], 2, 1)=':' And Not FileExists(StringRegExpReplace($aTabNameNP[$i][0], '(.*?)(?: - Notepad\+\+)', '\1')) Then ContinueLoop
  725.             $TextSaveFile&=$aTabNameNP[$i][0]&'<|>'&StringTrimRight($mTmp, 5)&@CRLF&'//>>'
  726.         Next
  727.         $file = FileOpen($FileData,2)
  728.         FileWrite($file, '//>>'&StringTrimRight($TextSaveFile, 6))
  729.         FileClose($file)
  730.     Else
  731.         If FileExists($FileData) Then
  732.             FileDelete($FileData)
  733.         EndIf
  734.     EndIf
  735. EndFunc
  736.  
  737. ; чтение пользовательских меток из файла
  738. Func _ReadData()
  739.     Local $tmp, $aTmp, $tmp1
  740.     If FileExists($FileData) Then
  741.         $tmp = FileRead($FileData)
  742.         $tmp = StringTrimLeft($tmp, 4)
  743.         $aTmp = StringSplit($tmp, @CRLF&'//>>', 1)
  744.         If @error And $aTmp[1]='' Then
  745.             MsgBox(0, $LngMB3, $FileData)
  746.             Return
  747.         EndIf
  748.         ReDim $aTabNameNP[$aTmp[0]+1][2]
  749.         Local $tmpUser[1][4]
  750.         $d = 1 ; индекс исключающий сбойные строки в файле
  751.         For $i = 1 to $aTmp[0]
  752.             $tmp = StringRegExp($aTmp[$d], '(?s)^(.*?)<\|>(.*)$', 3)
  753.             $aTabNameNP[$d][0]=$tmp[0]
  754.            
  755.             $tmp = StringSplit($tmp[1], '<|¤|>', 1)
  756.             If @error And $tmp[1]='' Then ContinueLoop
  757.             ReDim $tmpUser[$tmp[0]+1][4]
  758.             For $j = 1 to $tmp[0]
  759.                 $tmp1 = StringSplit($tmp[$j], '<¤>', 1)
  760.                 If @error Or $tmp1[0]<>4 Then ContinueLoop 2
  761.                 For $s = 0 to 3
  762.                     $tmpUser[$j][$s]=$tmp1[$s+1]
  763.                 Next
  764.             Next
  765.             $aTabNameNP[$d][1]=$tmpUser
  766.             $d += 1
  767.         Next
  768.         ReDim $aTabNameNP[$d][2]
  769.     EndIf
  770. EndFunc
  771.  
  772. Func _About()
  773.     $GP=_ChildCoor($Gui, 270, 180)
  774.     GUIRegisterMsg(0x05 , "")
  775.     GUISetState(@SW_DISABLE, $Gui)
  776.     $font="Arial"
  777.     $Gui1 = GUICreate($LngAbout, $GP[2], $GP[3], $GP[0], $GP[1], 0x00C00000+0x00080000, -1, $Gui) ; WS_CAPTION+WS_SYSMENU
  778.     If Not @compiled Then GUISetIcon($AutoItExe, 99)
  779.     GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit1")
  780.     GUISetBkColor (0xffca48)
  781.     GUICtrlCreateLabel($LngTitle, 0, 0, 270, 63, 0x01+0x0200)
  782.     GUICtrlSetFont (-1,14, 600, -1, $font)
  783.     GUICtrlSetColor(-1,0xa13d00)
  784.     GUICtrlSetBkColor (-1, 0xfbe13f)
  785.     GUICtrlCreateLabel ("-", 2,64,268,1,0x10)
  786.    
  787.     GUISetFont (9, 600, -1, $font)
  788.     GUICtrlCreateLabel($LngVer&' 0.2  9.10.2011', 55, 100, 210, 17)
  789.     GUICtrlCreateLabel($LngSite&':', 55, 115, 40, 17)
  790.     $url=GUICtrlCreateLabel('http://azjio.ucoz.ru', 92, 115, 170, 17)
  791.     GUICtrlSetOnEvent(-1, "_url")
  792.     GUICtrlSetCursor(-1, 0)
  793.     GUICtrlSetColor(-1, 0x0000ff)
  794.     GUICtrlCreateLabel('WebMoney:', 55, 130, 85, 17)
  795.     $WbMn=GUICtrlCreateLabel('R939163939152', 130, 130, 125, 17)
  796.     GUICtrlSetOnEvent(-1, "_WbMn")
  797.     GUICtrlSetColor(-1,0xa21a10)
  798.     GUICtrlSetTip(-1, $LngCopy)
  799.     GUICtrlSetCursor(-1, 0)
  800.     GUICtrlCreateLabel('Copyright AZJIO © 2009-2011', 55, 145, 210, 17)
  801.     GUISetState(@SW_SHOW, $Gui1)
  802. EndFunc
  803.  
  804. Func _url()
  805.     ShellExecute ('http://azjio.ucoz.ru')
  806. EndFunc
  807.  
  808. Func _WbMn()
  809.     ClipPut('R939163939152')
  810. EndFunc
  811.  
  812. Func _Exit1()
  813.     GUISetState(@SW_ENABLE, $Gui)
  814.     GUIDelete($Gui1)
  815.     GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
  816.     ; GUIRegisterMsg(0x05 , "WM_SIZE")
  817. EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement