Advertisement
AZJIO

Renaming variables

Dec 7th, 2012
909
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 9.11 KB | None | 0 0
  1. #include <EditConstants.au3>
  2. #include <GUIConstantsEx.au3>
  3. #include <WindowsConstants.au3>
  4. #include <GuiListView.au3>
  5. #include <ButtonConstants.au3>
  6. #include <Crypt.au3>
  7.  
  8. Global $ItemIndex, $iInput, $CacheText, $CurrentPath, $sTextAU3, $iChanges = 0, $aVar2D
  9. Global $hGui, $iListView, $hListView, $dummy1, $dummy2, $CurMD5
  10.  
  11. ; En
  12. $LngTitle = 'Renaming variables'
  13. $LngOpn = 'Open'
  14. $LngSv = 'Save'
  15. $LngVar = 'Variable'
  16. $LngCnt = 'Count'
  17. $LngErr = 'Error'
  18. $LngMB1 = 'The number of substitutions does not match'
  19. $LngMB2 = 'Save changes?'
  20. $LngMB3 = 'The text contains invalid characters:'
  21. $LngMB4 = 'Variable with the same name already exists'
  22. $LngMB5 = 'The File was changed by other application.,' & @LF & 'these change can be lost.' & @LF & @LF & 'Save?'
  23.  
  24. ; Ru
  25. If @OSLang = 0419 Then
  26.     $LngAbout = 'О программе'
  27.     $LngOpn = 'Открыть'
  28.     $LngSv = 'Сохранить'
  29.     $LngVar = 'Переменная'
  30.     $LngCnt = 'Количество'
  31.     $LngErr = 'Ошибка'
  32.     $LngMB1 = 'Количество замен не соответствует'
  33.     $LngMB2 = 'Сохранить изменения?'
  34.     $LngMB3 = 'Текст содержит недопустимые символы:'
  35.     $LngMB4 = 'Переменная с таким именем уже существует'
  36.     $LngMB5 = 'С момента открытия скрипт был изменён другим' & @LF & 'приложением, эти изменения будут потеряны.' & @LF & @LF & @TAB & 'Сохранить?'
  37. EndIf
  38.  
  39. $hGui = GUICreate($LngTitle, 450, 450, -1, -1, $WS_OVERLAPPEDWINDOW, $WS_EX_ACCEPTFILES)
  40.  
  41. $iInput = GUICtrlCreateInput("", 0, 0, 0, 0)
  42. GUICtrlSetState(-1, $GUI_HIDE)
  43.  
  44. ; $iListView = GUICtrlCreateListView('Var|Count 2', 5, 35, 440, 330, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_REPORT, $LVS_SHOWSELALWAYS))
  45. ; $hListView = GUICtrlGetHandle(-1)
  46. _CreateListView()
  47.  
  48. $iBtnOpen = GUICtrlCreateButton('-', 5, 4, 21, 21, $BS_ICON)
  49. GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 4, 0)
  50. GUICtrlSetResizing(-1, 2 + 32 + 256 + 512)
  51. GUICtrlSetTip(-1, $LngOpn)
  52.  
  53. $iBtnSave = GUICtrlCreateButton('-', 30, 4, 21, 21, $BS_ICON)
  54. GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 6, 0)
  55. GUICtrlSetResizing(-1, 2 + 32 + 256 + 512)
  56. GUICtrlSetTip(-1, $LngSv)
  57.  
  58. $dummy1 = GUICtrlCreateDummy()
  59. $dummy2 = GUICtrlCreateDummy()
  60. Global $AccelKeys[2][2] = [["{F2}", $dummy1],["{ENTER}", $dummy2]]
  61. GUISetAccelerators($AccelKeys)
  62. GUISetState()
  63. GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
  64. GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ; для скрытия поля ввода при потере фокуса.
  65. _Crypt_Startup()
  66.  
  67.  
  68. If $CmdLine[0] Then _Open($CmdLine[1])
  69.  
  70. While 1
  71.     Switch GUIGetMsg()
  72.         Case $iBtnSave
  73.             _Save()
  74.         Case $iBtnOpen
  75.             $tmp = FileOpenDialog('', @ScriptDir & "\", "AutoIt Script (*.au3)", 1, '', $hGui)
  76.             If @error Then ContinueLoop
  77.             _Open($tmp)
  78.         Case -13
  79.             _Open(@GUI_DragFile)
  80.         Case $dummy1
  81.             $tmp = _GUICtrlListView_GetSelectedIndices($hListView, True)
  82.             If $tmp[0] > 0 Then _GUICtrlListView_EditItem($hListView, $tmp[1])
  83.         Case $dummy2
  84.             If ControlGetFocus($hGui) = 'Edit1' Then
  85.                 _SaveChange()
  86.                 GUICtrlSetState($iListView, $GUI_FOCUS)
  87.             EndIf
  88.         Case -3
  89.             If $iChanges Then
  90.                 Switch MsgBox(3, $LngTitle, $LngMB2, 0, $hGui)
  91.                     Case 6
  92.                         _Save()
  93.                     Case 2
  94.                         ContinueLoop
  95.                 EndSwitch
  96.             EndIf
  97.             _Crypt_Shutdown()
  98.             Exit
  99.     EndSwitch
  100. WEnd
  101.  
  102. Func _Save()
  103.     If Not ($CurrentPath And $iChanges) Then Return
  104.    
  105.     Local $bDigest = _Crypt_HashFile($CurrentPath, $CALG_MD5)
  106.     If @error Then
  107.         $tmpMD5 = 'Error ' & Random()
  108.     Else
  109.         $tmpMD5 = $bDigest
  110.     EndIf
  111.     If $tmpMD5 <> $CurMD5 And MsgBox(4 + 256, $LngErr, @TAB & @TAB & ' ------ MD5 ------' & @LF & 'Old:' & @TAB & $CurMD5 & @LF & 'New:' & @TAB & $tmpMD5 & @LF & @LF & $LngMB5, 0, $hGui) = 7 Then Return
  112.    
  113.     $hFile = FileOpen($CurrentPath, 2)
  114.     FileWrite($hFile, $sTextAU3)
  115.     FileClose($hFile)
  116.     $iChanges = 0
  117.  
  118.     Local $bDigest = _Crypt_HashFile($CurrentPath, $CALG_MD5) ; обновляем контрольную сумму после сохранения
  119.     If @error Then
  120.         $CurMD5 = 'Error ' & Random()
  121.     Else
  122.         $CurMD5 = $bDigest
  123.     EndIf
  124. EndFunc   ;==>_Save
  125.  
  126. Func _Open($sFilePath)
  127.     $sTmp = _FO_IsDir($sFilePath)
  128.     If @error Or $sTmp Or StringRight($sFilePath, 4) <> '.au3' Then Return
  129.  
  130.     $sTextAU3 = FileRead($sFilePath)
  131.     Local $aVar = _GetVar($sTextAU3)
  132.     If @error Then
  133.         $CurrentPath = ''
  134.         $sTextAU3 = ''
  135.         GUICtrlDelete($iListView)
  136.         _CreateListView()
  137.         Return
  138.     EndIf
  139.     $CurrentPath = $sFilePath
  140.     GUICtrlDelete($iListView)
  141.     _CreateListView()
  142.     _GUICtrlListView_BeginUpdate($hListView)
  143.     For $i = 1 To $aVar[0][0]
  144.         GUICtrlCreateListViewItem($aVar[$i][0] & '|' & $aVar[$i][1], $iListView)
  145.     Next
  146.     For $i = 0 To 1
  147.         GUICtrlSendMsg($iListView, $LVM_SETCOLUMNWIDTH, $i, -1)
  148.         GUICtrlSendMsg($iListView, $LVM_SETCOLUMNWIDTH, $i, -2)
  149.     Next
  150.    
  151.     WinSetTitle($hGui, '', $LngTitle & ' (' & StringRegExpReplace($CurrentPath, '^.*\\(.*)$', '\1') & ')')
  152.    
  153.     _GUICtrlListView_EndUpdate($hListView)
  154.     Local $bDigest = _Crypt_HashFile($CurrentPath, $CALG_MD5)
  155.     If @error Then
  156.         $CurMD5 = 'Error ' & Random()
  157.     Else
  158.         $CurMD5 = $bDigest
  159.     EndIf
  160. EndFunc   ;==>_Open
  161.  
  162. Func _CreateListView()
  163.     $GuiPos = WinGetClientSize($hGui)
  164.     $iListView = GUICtrlCreateListView($LngVar & '|' & $LngCnt, 5, 30, $GuiPos[0] - 10, $GuiPos[1] - 45, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_REPORT, $LVS_SHOWSELALWAYS))
  165.     GUICtrlSetState(-1, $GUI_DROPACCEPTED)
  166.     ; GUICtrlSetBkColor(-1, 0xf0f0f0) ; 0xE0DFE3
  167.     GUICtrlSetResizing(-1, 6 + 32 + 64)
  168.     $hListView = GUICtrlGetHandle(-1)
  169. EndFunc   ;==>_CreateListView
  170.  
  171. Func _GetVar($sText)
  172.     Local $k = 0
  173.     $aNameVar = StringRegExp($sText & @CRLF, '(?<=\$)\w+', 3) ; детектируем переменные в массив
  174.     If @error Then
  175.         $aVar2D = ''
  176.         Return SetError(1)
  177.     Else
  178.         For $i = 0 To UBound($aNameVar) - 1
  179.             Assign($aNameVar[$i] & '/', Eval($aNameVar[$i] & '/') + 1, 1)
  180.             If Eval($aNameVar[$i] & '/') = 1 Then
  181.                 $aNameVar[$k] = $aNameVar[$i]
  182.                 $k += 1
  183.             EndIf
  184.         Next
  185.         ReDim $aNameVar[$k]
  186.  
  187.         _ArraySort($aNameVar) ; сортировка массива
  188.         Dim $aVar2D[$k + 1][2] = [[$k]]
  189.  
  190.         For $i = 0 To $k - 1
  191.             $aVar2D[$i + 1][0] = $aNameVar[$i]
  192.             $aVar2D[$i + 1][1] = Eval($aNameVar[$i] & '/')
  193.         Next
  194.  
  195.         Return $aVar2D
  196.     EndIf
  197. EndFunc   ;==>_GetVar
  198.  
  199. ; Выводит элемент Input на передний план
  200. Func _GUICtrlListView_EditItem($hWnd, $iIndex)
  201.     ;funkey 19.02.2010, Mod AZJIO
  202.     If $iIndex < 0 Then Return
  203.     Local $aPos, $aRect, $x, $y, $w, $h
  204.     $aRect = _GUICtrlListView_GetItemRect($hWnd, $iIndex, 2)
  205.     $aPos = ControlGetPos($hGui, "", $hWnd)
  206.     $x = $aPos[0] + $aRect[0]
  207.     $y = $aPos[1] + $aRect[1]
  208.     $w = $aRect[2] - $aRect[0]
  209.     $h = $aRect[3] - $aRect[1]
  210.     GUICtrlSetPos($iInput, $x - 1, $y + 1, $w + 1, $h + 1)
  211.     $CacheText = _GUICtrlListView_GetItemText($hWnd, $iIndex)
  212.     GUICtrlSetData($iInput, $CacheText)
  213.     GUICtrlSetState($iInput, $GUI_SHOW)
  214.     GUICtrlSetState($iInput, $GUI_FOCUS)
  215.     $ItemIndex = $iIndex
  216. EndFunc   ;==>_GUICtrlListView_EditItem
  217.  
  218. ; Сохранить изменения редактирования пункта
  219. Func _SaveChange()
  220.     Local $sText = GUICtrlRead($iInput)
  221.     GUICtrlSetState($iInput, $GUI_HIDE)
  222.     If StringRegExp($sText, '\W') Then
  223.         MsgBox(0, $LngTitle, $LngMB3 & ' ' & StringRegExpReplace($sText, '\w', ''), 0, $hGui)
  224.     Else
  225.         For $i = 1 To $aVar2D[0][0]
  226.             If $sText = $aVar2D[$i][0] Then
  227.                 MsgBox(0, $LngTitle, $LngMB4, 0, $hGui)
  228.                 Return
  229.             EndIf
  230.         Next
  231.         _GUICtrlListView_SetItemText($hListView, $ItemIndex, $sText, 0)
  232.         _GUICtrlListView_SetColumnWidth($hListView, 0, -2) ;$LVSCW_AUTOSIZE_USEHEADER
  233.         $sTextAU3 = StringRegExpReplace($sTextAU3, '(?<=\$)' & $CacheText & '(?!\w)', $sText)
  234.         Local $cnt1 = @extended
  235.         Local $cnt2 = _GUICtrlListView_GetItemText($hListView, $ItemIndex, 1)
  236.         If $cnt2 <> $cnt1 Then MsgBox(0, $LngMB1, $cnt1 & ' --> ' & $cnt2, 0, $hGui)
  237.         $iChanges = 1
  238.     EndIf
  239. EndFunc   ;==>_SaveChange
  240.  
  241. Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
  242.     Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
  243.     $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
  244.     $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
  245.     ; $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
  246.     $iCode = DllStructGetData($tNMHDR, "Code")
  247.     Switch $hWndFrom
  248.         Case $hListView
  249.             Switch $iCode
  250.                 Case $NM_DBLCLK ; двойной клик - редактируем пункт ListView
  251.                     Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  252.                     _GUICtrlListView_EditItem($hListView, DllStructGetData($tInfo, "Index"))
  253.             EndSwitch
  254.     EndSwitch
  255.     Return $GUI_RUNDEFMSG
  256. EndFunc   ;==>WM_NOTIFY
  257.  
  258. Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
  259.     #forceref $hWnd, $iMsg
  260.     Local $iIDFrom, $iCode
  261.     $iIDFrom = BitAND($iwParam, 0xFFFF) ; младшее слово
  262.     $iCode = BitShift($iwParam, 16) ; старшее слово
  263.     Switch $iIDFrom
  264.         Case $iInput
  265.             Switch $iCode
  266.                 Case $EN_KILLFOCUS
  267.                     GUICtrlSetState($iInput, $GUI_HIDE)
  268.             EndSwitch
  269.     EndSwitch
  270.     Return $GUI_RUNDEFMSG
  271. EndFunc   ;==>WM_COMMAND
  272.  
  273. ; FileOperations.au3
  274. Func _FO_IsDir($sTmp)
  275.     $sTmp = FileGetAttrib($sTmp)
  276.     Return SetError(@error, 0, StringInStr($sTmp, 'D', 2) > 0)
  277. EndFunc   ;==>_FO_IsDir
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement