znilTail/Tail.au3

219 lines
9.5 KiB
Plaintext

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
; ===============================================================================================================================
#include <GuiConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
; ===============================================================================================================================
Global Const $INI = @ScriptDir & "\Tail.ini"
Global Const $W = 750
Global Const $H = 500
Global Const $MinW = 600
Global Const $MinH = 400
; ===============================================================================================================================
Global $LogFile = ""
Global $LogPath = IniRead($INI, "Tail", "Path", "")
Global $MaxBytes = 1024
$aM = DllCall("User32.dll", "Int", "GetSystemMetrics", "Int", 15) ; SM_CYMENU = 15
$DH = 20 + $aM[0]
; ===============================================================================================================================
Opt("GUIOnEventMode", 1)
Opt("GUICloseOnESC", 0)
Opt("GUIResizeMode", BitOR($GUI_DOCKSIZE, $GUI_DOCKLEFT, $GUI_DOCKBOTTOM))
$hGUI = GUICreate("Tail", $W, $H, -1, -1, BitOr($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MAXIMIZEBOX))
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$idFileMenu = GUICtrlCreateMenu("&File")
$idOpen = GUICtrlCreateMenuItem("&Open", $idFileMenu)
GUICtrlSetOnEvent(-1, "_Open")
$idRead = GUICtrlCreateMenuItem("&Read", $idFileMenu)
GUICtrlSetOnEvent(-1, "_Read")
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateMenuItem("", $idFileMenu)
$idExit = GUICtrlCreateMenuItem("&Exit", $idFileMenu)
GUICtrlSetOnEvent(-1, "_Exit")
$idEditMenu = GUICtrlCreateMenu("&Edit")
$idClear = GUICtrlCreateMenuItem("&Clear", $idEditMenu)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetOnEvent(-1, "_Clear")
$idSave = GUICtrlCreateMenuItem("&Save", $idEditMenu)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetOnEvent(-1, "_Save")
$idTailMenu = GUICtrlCreateMenu("&Tail")
$idStart = GUICtrlCreateMenuItem("&Start", $idTailMenu)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetOnEvent(-1, "_StartStop")
$idBytesMenu = GUICtrlCreateMenu("&Bytes")
$idBytes = GUICtrlCreateMenuItem($MaxBytes, $idBytesMenu)
GUICtrlSetOnEvent(-1, "_Bytes")
$idEdit = GUICtrlCreateEdit("", 0, 0, $W, $H - $DH, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY))
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
GUICtrlSetColor(-1, 0x000080)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlSetFont(-1, 9, -1, -1, "Courier New")
GUICtrlSendMsg(-1, $EM_LIMITTEXT, 0, 0)
$idStatus = GUICtrlCreateInput("", 0, $H - $DH, $W, 20, $ES_READONLY)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKBOTTOM, $GUI_DOCKHEIGHT))
$idDummy = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, "_Update")
GUIRegisterMsg($WM_GETMINMAXINFO, "_MinInfo")
GUISetState()
While True
Sleep(1000)
WEnd
; ===============================================================================================================================
; GUI & menu functions
; ===============================================================================================================================
Func _Exit()
AdlibUnRegister("_Tail_AdLib")
GUIDelete()
Sleep(250)
Exit
EndFunc
; ===============================================================================================================================
Func _MinInfo($hWnd, $iMsg, $wParam, $lParam)
Local $MINMAXINFO = DllStructCreate("LONG[10]", $lParam)
DllStructSetData($MINMAXINFO, 1, $MinW, 7)
DllStructSetData($MINMAXINFO, 1, $MinH, 8)
Return $GUI_RUNDEFMSG
EndFunc
; ===============================================================================================================================
Func _Update()
Local $Tail = _Tail_Content()
GUICtrlSendMsg($idEdit, $EM_SETSEL, -2, -1)
GUICtrlSetData($idEdit, $Tail, 1)
GUICtrlSetData($idStatus, StringLen($Tail) & " bytes read")
EndFunc
; ===============================================================================================================================
Func _Open()
GUICtrlSetData($idStatus, "")
Local $File, $Pos
$File = FileOpenDialog( "Tail - Open File", $LogPath, "Text (*.*)", 3, "" , $hGUI)
If @error Then Return
$Pos = StringInStr($File, "\", 0, -1)
$LogPath = StringLeft($File, $Pos)
IniWrite($INI, "Tail", "Path", $LogPath)
_Clear()
GUICtrlSetState($idRead, $GUI_ENABLE)
GUICtrlSetState($idClear, $GUI_ENABLE)
GUICtrlSetState($idSave, $GUI_ENABLE)
GUICtrlSetState($idStart, $GUI_ENABLE)
WinSetTitle($hGUI, "", "Tail - " & $File)
$LogFile = $File
_Tail($LogFile, $MaxBytes)
EndFunc
; ===============================================================================================================================
Func _Read()
_Clear()
_Tail($LogFile, $MaxBytes)
EndFunc
; ===============================================================================================================================
Func _Clear()
GUICtrlSetData($idStatus, "")
GUICtrlSetData($idEdit, "")
EndFunc
; ===============================================================================================================================
Func _Save()
GUICtrlSetData($idStatus, "")
Local $Sel, $File, $Handle, $Now
$Sel = ControlCommand($hGUI, "", $idEdit, "GetSelected")
If Not $Sel Then Return GUICtrlSetData($idStatus, "ERROR: Save - No text selected!")
$File = FileSaveDialog("Tail - Append Selection to File", @ScriptDir, "Text (*.txt)", 0, "Log.txt", $hGUI)
If @error Then Return
$Handle = FileOpen($File, 1)
If $Handle = -1 Then Return GUICtrlSetData($idStatus, "ERROR: Save - Cannot open file for writing!")
$Now = StringFormat("%04d-%02d-%02d %02d:%02d:%02d > ", @YEAR, @MON, @MDAY, @HOUR, @MIN, @SEC)
FileWrite($Handle, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" & @CRLF)
FileWrite($Handle, $Now & $LogFile & @CRLF)
FileWrite($Handle, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" & @CRLF)
FileWrite($Handle, $Sel & @CRLF)
FileClose($Handle)
GUICtrlSetData($idStatus, "Save: " & StringLen($Sel) & " chars saved to file " & $File)
EndFunc
; ===============================================================================================================================
Func _StartStop()
GUICtrlSetData($idStatus, "")
If GUICtrlRead($idStart, 1) = "&Start" Then
AdlibRegister("_Tail_AdLib", 500)
GUICtrlSetData($idStart, "&Stop")
$State = $GUI_DISABLE
Else
AdlibUnRegister("_Tail_AdLib")
GUICtrlSetData($idStart, "&Start")
$State = $GUI_ENABLE
EndIf
GUICtrlSetState($idOpen, $State)
GUICtrlSetState($idRead, $State)
GUICtrlSetState($idExit, $State)
GUICtrlSetState($idClear, $State)
GUICtrlSetState($idSave, $State)
GUICtrlSetState($idBytes, $State)
EndFunc
; ===============================================================================================================================
Func _Bytes()
Opt("GUIOnEventMode", 0)
GUISetState(@SW_DISABLE, $hGUI)
Local $hBytesGUI = Guicreate("Tail - Bytes", 300, 125, -1, -1, -1, -1, $hGUI)
GUICtrlCreateLabel("Initial number of bytes (max. 999999):", 20, 20, 260, 20)
Local $idInp = GUICtrlCreateInput($MaxBytes, 20, 40, 260, 20, $ES_NUMBER)
GUICtrlSetLimit(-1, 6)
Local $idBtn = GUICtrlCreateButton("OK", 20, 80, 260, 25)
GUICtrlSetState(-1, $GUI_DEFBUTTON)
GUISetState()
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idBtn
$MaxBytes = GUICtrlRead($idInp)
GUICtrlSetData($idBytes, $MaxBytes)
ExitLoop
EndSwitch
WEnd
Opt("GUIOnEventMode", 1)
GUISetState(@SW_ENABLE, $hGUI)
GUIDelete($hBytesGui)
EndFunc
; ===============================================================================================================================
; Tail functions
; ===============================================================================================================================
Func _Tail_AdLib()
_Tail()
EndFunc
; ===============================================================================================================================
Func _Tail_Content($bSet = False, $sNew = "")
Local Static $Tail = ""
If $bSet Then $Tail = $sNew
Return $Tail
EndFunc
; ===============================================================================================================================
Func _Tail($sFile = "", $nBytes = 1024)
Local Static $TailPos = 0
Local Static $TailFile = ""
Local $TailNew = ""
If $sFile Then
$TailFile = $sFile
$TailPos = 0
EndIf
Local $Handle = FileOpen($TailFile)
If $Handle = -1 Then Return
FileSetPos($Handle, 0, 2)
Local $Size = FileGetPos($Handle)
If $TailPos = 0 Then
If $Size > $nBytes Then
$TailPos = $Size - $nBytes
EndIf
ElseIf $Size < $TailPos Then
$TailPos = $Size
EndIf
If $Size > $TailPos Then
FileSetPos($Handle, $TailPos, 0)
$TailNew = FileRead($Handle)
$TailPos = FileGetPos($Handle)
EndIf
FileClose($Handle)
If $TailNew Then
_Tail_Content(True, $TailNew)
GUICtrlSendToDummy($idDummy)
EndIf
EndFunc