├── LogBrokerResource.rc ├── LogViewerResource.rc ├── LogBroker.res ├── LogViewer.dres ├── LogViewer.res ├── LogViewer.otares ├── Resources ├── hex.png ├── MIDI.png ├── MQTT.png ├── trace.ico ├── actAdd.png ├── actCopy.png ├── actRun.png ├── actSave.png ├── actStop.png ├── actTrack.png ├── binary.png ├── msgColor.png ├── msgJson.png ├── msgXml.png ├── status.png ├── zeromq.ico ├── MID_blackI.png ├── Shader_16x.png ├── actDelete.png ├── actExpand.png ├── actFilter.png ├── actMoveUp.png ├── actSaveAs.png ├── actSendSQL.png ├── logviewer.ico ├── text-x-hex.png ├── actCollapse.png ├── actDashboard.png ├── actGotoFirst.png ├── actGotoLast.png ├── actLogLevel.png ├── actMoveDown.png ├── actOpenFile.png ├── actSettings.png ├── mqttorg-logo.png ├── serial port.png ├── status-busy.png ├── DeleteQuery_16x.png ├── Equal Sign_16px.png ├── actCloseWindow.png ├── edit-alignment.png ├── go-next-context.png ├── status-offline.png ├── RS-232 Female_16px.png ├── RS-232 Male_16px.png ├── actCenterToScreen.png ├── DeleteBreakpoint_16x.png ├── actToggleAlwaysOnTop.png ├── actToggleFullScreen.png ├── clock-history-frame.png ├── CloseGroup_inverse_16x.png ├── Message Types │ ├── lmtAction.png │ ├── lmtBitmap.png │ ├── lmtClear.png │ ├── lmtColor.png │ ├── lmtError.png │ ├── lmtInfo.png │ ├── lmtMemory.png │ ├── lmtObject.png │ ├── lmtText.png │ ├── lmtWatch.png │ ├── lmtCounter.png │ ├── lmtDataSet.png │ ├── lmtStrings.png │ ├── lmtWarning.png │ ├── lmtAlphaColor.png │ ├── lmtCallStack.png │ ├── lmtCheckpoint.png │ ├── lmtComponent.png │ ├── lmtConditional.png │ ├── lmtEnterMethod.png │ ├── lmtException.png │ ├── lmtInterface.png │ ├── lmtLeaveMethod.png │ ├── lmtPersistent.png │ └── lmtScreenShot.png ├── media-playback-pause-7.png ├── DeleteBreakpoint_grey_16x.png ├── actToggleLeftPanelVisible.png ├── CloseSolution_inverse_16x_24.bmp ├── CloseSolution_inverse_16x_32.bmp ├── actCloseTerminatedProcesses.png ├── actToggleRightPanelVisible.png └── stock_macro-watch-variable.png ├── LogBroker_Icon.ico ├── LogViewer_Icon.ico ├── LogViewer_Icon1.ico ├── LogViewer_Icon2.ico ├── Bin └── Win32 │ ├── libzmq.dll │ └── Highlighters │ ├── C.json │ ├── D.json │ ├── R.json │ ├── ABAP.json │ ├── Bash.json │ ├── C#.json │ ├── C++.json │ ├── Dart.json │ ├── Elm.json │ ├── F#.json │ ├── GLSL.json │ ├── Go.json │ ├── Java.json │ ├── Lisp.json │ ├── Lua.json │ ├── NSIS.json │ ├── PHP.json │ ├── Perl.json │ ├── Red.json │ ├── Ruby.json │ ├── Rust.json │ ├── Erlang.json │ ├── Groovy.json │ ├── Julia.json │ ├── Kotlin.json │ ├── MATLAB.json │ ├── OCaml.json │ ├── Scala.json │ ├── Swift.json │ ├── TclTk.json │ ├── Euphoria.json │ ├── FreeBASIC.json │ ├── GDScript.json │ ├── Gravity.json │ ├── AutoHotkey.json │ ├── JavaScript.json │ ├── Objective-C.json │ ├── PowerShell.json │ ├── TypeScript.json │ ├── ActionScript.json │ ├── CoffeeScript.json │ ├── UnrealScript.json │ ├── Visual Basic.json │ ├── Visual FoxPro.json │ ├── Assembler - 6502.json │ ├── readme.txt │ ├── Git Ignore.json │ ├── Diff.json │ ├── INI.json │ ├── MIME.json │ ├── Delphi Form Module.json │ ├── LaTex.json │ ├── XML.json │ └── XSL.json ├── Images ├── LogViewer.png ├── LogViewer1.png ├── LogViewer2.png ├── LogViewer3.png ├── LogViewer.CallStack.png ├── LogViewer.WatchList.png ├── LogViewer.SettingsDialog.png ├── LogViewer.ILogViewerManager.png ├── LogViewer.TLogViewerSettings.png ├── LogViewer.MessageFilter.Client.png └── LogViewer.MessageFilter.Source.png ├── LogViewerResource.aps ├── Documents ├── LogViewer.xmind └── LogViewer.Mindmap.png ├── LogViewer.Subscribers.Zmq.pas ├── cleanup.bat ├── LogViewer.CallStack.View.dfm ├── LogBroker.dpr ├── LogViewer.DataSet.View.dfm ├── .gitignore ├── LogViewer.CallStack.Settings.View.dfm ├── LogViewer.LogLevels.Settings.View.dfm ├── LogViewer.DisplayValues.Settings.View.dfm ├── LogViewer.Receivers.Winods.Settings.View.dfm ├── LogViewer.MessageData.View.dfm ├── LogViewer.Receivers.ComPort.Settings.View.dfm ├── LogViewer.Subscribers.Winods.pas ├── LogViewer.Receivers.Winipc.Settings.View.dfm ├── LogViewer.Watches.Settings.View.dfm ├── LogViewer.ValueList.View.dfm ├── LogViewer.RawData.View.dfm ├── LogViewer.MessageFilter.View.dfm ├── LogViewer.Receivers.Zmq.Settings.View.dfm ├── LogViewer.MessageList.Settings.View.dfm ├── LogViewer.Watches.View.dfm ├── LogBroker.MainForm.dfm ├── LogViewer.Receivers.Winods.Settings.View.pas ├── LogViewer.Settings.Dialog.Data.pas ├── LogViewer.CallStack.Settings.View.pas ├── LogViewer.CallStack.Data.pas ├── LogViewer.RawData.View.pas ├── LogViewer.Receivers.ComPort.Settings.View.pas ├── LogViewer.Receivers.Zmq.Settings.View.pas ├── LogViewer.Receivers.Winipc.Settings.View.pas ├── LogViewer.DataSet.View.pas ├── LogViewer.Receivers.FileSystem.pas ├── LogViewer.CallStack.Settings.pas ├── LogViewer.Image.View.pas ├── LogViewer.Subscribers.FileSystem.pas ├── LogViewer.Watches.Settings.View.pas ├── LogViewer.Receivers.FileSystem.Settings.pas ├── LogViewer.MessageList.Settings.View.pas ├── LogViewer.Receivers.Winipc.Settings.pas ├── LogViewer.Dashboard.Data.pas ├── LogViewer.Receivers.Winods.Settings.pas ├── LogViewer.DisplayValues.Settings.ValueManager.pas ├── LogViewer.Subscribers.Winipc.pas ├── LogViewer.Image.View.dfm ├── LogViewer.Commands.pas ├── LogViewer.Receivers.Zmq.pas ├── LogViewer.Receivers.ComPort.pas ├── LogViewer.Watches.Settings.pas ├── LogBroker.Settings.pas ├── LogViewer.dpr ├── LogViewer.MessageFilter.Data.pas ├── LogViewer.Events.pas ├── README.md ├── LogViewer.ComPort.Settings.pas └── LogViewer.Resources.pas /LogBrokerResource.rc: -------------------------------------------------------------------------------- 1 | libzmq RCDATA "Bin\\Win32\\libzmq.dll" 2 | -------------------------------------------------------------------------------- /LogViewerResource.rc: -------------------------------------------------------------------------------- 1 | libzmq RCDATA "Bin\\Win32\\libzmq.dll" 2 | -------------------------------------------------------------------------------- /LogBroker.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/LogBroker.res -------------------------------------------------------------------------------- /LogViewer.dres: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/LogViewer.dres -------------------------------------------------------------------------------- /LogViewer.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/LogViewer.res -------------------------------------------------------------------------------- /LogViewer.otares: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/LogViewer.otares -------------------------------------------------------------------------------- /Resources/hex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/hex.png -------------------------------------------------------------------------------- /LogBroker_Icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/LogBroker_Icon.ico -------------------------------------------------------------------------------- /LogViewer_Icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/LogViewer_Icon.ico -------------------------------------------------------------------------------- /LogViewer_Icon1.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/LogViewer_Icon1.ico -------------------------------------------------------------------------------- /LogViewer_Icon2.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/LogViewer_Icon2.ico -------------------------------------------------------------------------------- /Resources/MIDI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/MIDI.png -------------------------------------------------------------------------------- /Resources/MQTT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/MQTT.png -------------------------------------------------------------------------------- /Resources/trace.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/trace.ico -------------------------------------------------------------------------------- /Bin/Win32/libzmq.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/libzmq.dll -------------------------------------------------------------------------------- /Images/LogViewer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Images/LogViewer.png -------------------------------------------------------------------------------- /Images/LogViewer1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Images/LogViewer1.png -------------------------------------------------------------------------------- /Images/LogViewer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Images/LogViewer2.png -------------------------------------------------------------------------------- /Images/LogViewer3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Images/LogViewer3.png -------------------------------------------------------------------------------- /LogViewerResource.aps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/LogViewerResource.aps -------------------------------------------------------------------------------- /Resources/actAdd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actAdd.png -------------------------------------------------------------------------------- /Resources/actCopy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actCopy.png -------------------------------------------------------------------------------- /Resources/actRun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actRun.png -------------------------------------------------------------------------------- /Resources/actSave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actSave.png -------------------------------------------------------------------------------- /Resources/actStop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actStop.png -------------------------------------------------------------------------------- /Resources/actTrack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actTrack.png -------------------------------------------------------------------------------- /Resources/binary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/binary.png -------------------------------------------------------------------------------- /Resources/msgColor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/msgColor.png -------------------------------------------------------------------------------- /Resources/msgJson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/msgJson.png -------------------------------------------------------------------------------- /Resources/msgXml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/msgXml.png -------------------------------------------------------------------------------- /Resources/status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/status.png -------------------------------------------------------------------------------- /Resources/zeromq.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/zeromq.ico -------------------------------------------------------------------------------- /Resources/MID_blackI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/MID_blackI.png -------------------------------------------------------------------------------- /Resources/Shader_16x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Shader_16x.png -------------------------------------------------------------------------------- /Resources/actDelete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actDelete.png -------------------------------------------------------------------------------- /Resources/actExpand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actExpand.png -------------------------------------------------------------------------------- /Resources/actFilter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actFilter.png -------------------------------------------------------------------------------- /Resources/actMoveUp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actMoveUp.png -------------------------------------------------------------------------------- /Resources/actSaveAs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actSaveAs.png -------------------------------------------------------------------------------- /Resources/actSendSQL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actSendSQL.png -------------------------------------------------------------------------------- /Resources/logviewer.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/logviewer.ico -------------------------------------------------------------------------------- /Resources/text-x-hex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/text-x-hex.png -------------------------------------------------------------------------------- /Documents/LogViewer.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Documents/LogViewer.xmind -------------------------------------------------------------------------------- /Resources/actCollapse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actCollapse.png -------------------------------------------------------------------------------- /Resources/actDashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actDashboard.png -------------------------------------------------------------------------------- /Resources/actGotoFirst.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actGotoFirst.png -------------------------------------------------------------------------------- /Resources/actGotoLast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actGotoLast.png -------------------------------------------------------------------------------- /Resources/actLogLevel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actLogLevel.png -------------------------------------------------------------------------------- /Resources/actMoveDown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actMoveDown.png -------------------------------------------------------------------------------- /Resources/actOpenFile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actOpenFile.png -------------------------------------------------------------------------------- /Resources/actSettings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actSettings.png -------------------------------------------------------------------------------- /Resources/mqttorg-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/mqttorg-logo.png -------------------------------------------------------------------------------- /Resources/serial port.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/serial port.png -------------------------------------------------------------------------------- /Resources/status-busy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/status-busy.png -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/C.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/C.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/D.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/D.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/R.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/R.json -------------------------------------------------------------------------------- /LogViewer.Subscribers.Zmq.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/LogViewer.Subscribers.Zmq.pas -------------------------------------------------------------------------------- /Resources/DeleteQuery_16x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/DeleteQuery_16x.png -------------------------------------------------------------------------------- /Resources/Equal Sign_16px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Equal Sign_16px.png -------------------------------------------------------------------------------- /Resources/actCloseWindow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actCloseWindow.png -------------------------------------------------------------------------------- /Resources/edit-alignment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/edit-alignment.png -------------------------------------------------------------------------------- /Resources/go-next-context.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/go-next-context.png -------------------------------------------------------------------------------- /Resources/status-offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/status-offline.png -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/ABAP.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/ABAP.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Bash.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Bash.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/C#.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/C#.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/C++.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/C++.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Dart.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Dart.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Elm.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Elm.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/F#.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/F#.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/GLSL.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/GLSL.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Go.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Go.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Java.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Java.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Lisp.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Lisp.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Lua.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Lua.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/NSIS.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/NSIS.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/PHP.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/PHP.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Perl.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Perl.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Red.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Red.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Ruby.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Ruby.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Rust.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Rust.json -------------------------------------------------------------------------------- /Documents/LogViewer.Mindmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Documents/LogViewer.Mindmap.png -------------------------------------------------------------------------------- /Images/LogViewer.CallStack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Images/LogViewer.CallStack.png -------------------------------------------------------------------------------- /Images/LogViewer.WatchList.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Images/LogViewer.WatchList.png -------------------------------------------------------------------------------- /Resources/RS-232 Female_16px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/RS-232 Female_16px.png -------------------------------------------------------------------------------- /Resources/RS-232 Male_16px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/RS-232 Male_16px.png -------------------------------------------------------------------------------- /Resources/actCenterToScreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actCenterToScreen.png -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Erlang.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Erlang.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Groovy.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Groovy.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Julia.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Julia.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Kotlin.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Kotlin.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/MATLAB.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/MATLAB.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/OCaml.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/OCaml.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Scala.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Scala.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Swift.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Swift.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/TclTk.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/TclTk.json -------------------------------------------------------------------------------- /Resources/DeleteBreakpoint_16x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/DeleteBreakpoint_16x.png -------------------------------------------------------------------------------- /Resources/actToggleAlwaysOnTop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actToggleAlwaysOnTop.png -------------------------------------------------------------------------------- /Resources/actToggleFullScreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actToggleFullScreen.png -------------------------------------------------------------------------------- /Resources/clock-history-frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/clock-history-frame.png -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Euphoria.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Euphoria.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/FreeBASIC.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/FreeBASIC.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/GDScript.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/GDScript.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Gravity.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Gravity.json -------------------------------------------------------------------------------- /Images/LogViewer.SettingsDialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Images/LogViewer.SettingsDialog.png -------------------------------------------------------------------------------- /Resources/CloseGroup_inverse_16x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/CloseGroup_inverse_16x.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtAction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtAction.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtBitmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtBitmap.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtClear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtClear.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtColor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtColor.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtError.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtError.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtInfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtInfo.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtMemory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtMemory.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtObject.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtObject.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtText.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtText.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtWatch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtWatch.png -------------------------------------------------------------------------------- /Resources/media-playback-pause-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/media-playback-pause-7.png -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/AutoHotkey.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/AutoHotkey.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/JavaScript.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/JavaScript.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Objective-C.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Objective-C.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/PowerShell.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/PowerShell.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/TypeScript.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/TypeScript.json -------------------------------------------------------------------------------- /Images/LogViewer.ILogViewerManager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Images/LogViewer.ILogViewerManager.png -------------------------------------------------------------------------------- /Images/LogViewer.TLogViewerSettings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Images/LogViewer.TLogViewerSettings.png -------------------------------------------------------------------------------- /Resources/DeleteBreakpoint_grey_16x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/DeleteBreakpoint_grey_16x.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtCounter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtCounter.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtDataSet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtDataSet.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtStrings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtStrings.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtWarning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtWarning.png -------------------------------------------------------------------------------- /Resources/actToggleLeftPanelVisible.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actToggleLeftPanelVisible.png -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/ActionScript.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/ActionScript.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/CoffeeScript.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/CoffeeScript.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/UnrealScript.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/UnrealScript.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Visual Basic.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Visual Basic.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Visual FoxPro.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Visual FoxPro.json -------------------------------------------------------------------------------- /Images/LogViewer.MessageFilter.Client.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Images/LogViewer.MessageFilter.Client.png -------------------------------------------------------------------------------- /Images/LogViewer.MessageFilter.Source.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Images/LogViewer.MessageFilter.Source.png -------------------------------------------------------------------------------- /Resources/CloseSolution_inverse_16x_24.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/CloseSolution_inverse_16x_24.bmp -------------------------------------------------------------------------------- /Resources/CloseSolution_inverse_16x_32.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/CloseSolution_inverse_16x_32.bmp -------------------------------------------------------------------------------- /Resources/Message Types/lmtAlphaColor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtAlphaColor.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtCallStack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtCallStack.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtCheckpoint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtCheckpoint.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtComponent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtComponent.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtConditional.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtConditional.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtEnterMethod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtEnterMethod.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtException.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtException.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtInterface.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtInterface.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtLeaveMethod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtLeaveMethod.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtPersistent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtPersistent.png -------------------------------------------------------------------------------- /Resources/Message Types/lmtScreenShot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/Message Types/lmtScreenShot.png -------------------------------------------------------------------------------- /Resources/actCloseTerminatedProcesses.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actCloseTerminatedProcesses.png -------------------------------------------------------------------------------- /Resources/actToggleRightPanelVisible.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/actToggleRightPanelVisible.png -------------------------------------------------------------------------------- /Resources/stock_macro-watch-variable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Resources/stock_macro-watch-variable.png -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Assembler - 6502.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/beNative/LogViewer/HEAD/Bin/Win32/Highlighters/Assembler - 6502.json -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/readme.txt: -------------------------------------------------------------------------------- 1 | If you create a new highlighter file and you want others to enjoy it, send it to lasse@bonecode.com. 2 | 3 | Highlighter requests can be sent to the above e-mail address. 4 | -------------------------------------------------------------------------------- /cleanup.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | for /d /r %%f in (__history;__recovery;*.log) do rmdir /s /q %%f 3 | for /r %%f in (*.dcu;*.dsk;*.cbk;*.vlb;*.dsm;*.rsm;*.stat;*.identcache;*.dproj.local;*.drc;*.map;*.o;*.log;*.skincfg;*.tvsconfig;*.d;*.tds) do del /f /q %%f 4 | -------------------------------------------------------------------------------- /LogViewer.CallStack.View.dfm: -------------------------------------------------------------------------------- 1 | object frmCallStackView: TfrmCallStackView 2 | Left = 0 3 | Top = 0 4 | ClientHeight = 405 5 | ClientWidth = 302 6 | Color = clWhite 7 | DoubleBuffered = True 8 | Font.Charset = ANSI_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | TextHeight = 13 14 | end 15 | -------------------------------------------------------------------------------- /LogBroker.dpr: -------------------------------------------------------------------------------- 1 | {$SetPEFlags 1} // strip relocation info 2 | 3 | program LogBroker; 4 | 5 | {$R *.dres} 6 | 7 | uses 8 | Vcl.Forms, 9 | LogBroker.MainForm in 'LogBroker.MainForm.pas' {frmMain}, 10 | LogBroker.Settings in 'LogBroker.Settings.pas'; 11 | 12 | {$R *.res} 13 | 14 | begin 15 | Application.Initialize; 16 | Application.MainFormOnTaskbar := True; 17 | Application.CreateForm(TfrmMain, frmMain); 18 | Application.Run; 19 | end. 20 | -------------------------------------------------------------------------------- /LogViewer.DataSet.View.dfm: -------------------------------------------------------------------------------- 1 | object frmDataSetView: TfrmDataSetView 2 | Left = 0 3 | Top = 0 4 | BorderStyle = bsNone 5 | ClientHeight = 488 6 | ClientWidth = 363 7 | Color = clBtnFace 8 | DoubleBuffered = True 9 | Font.Charset = ANSI_CHARSET 10 | Font.Color = clWindowText 11 | Font.Height = -11 12 | Font.Name = 'Segoe UI' 13 | Font.Style = [] 14 | TextHeight = 13 15 | object dscMain: TDataSource 16 | Left = 16 17 | Top = 8 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /Library/Win32/Debug/*.dcu 2 | /__history 3 | *.dcu 4 | /Library/Win32/Debug/Highlighters 5 | /Library/Win32/Debug/Colors 6 | /Library/Win32/Release/Highlighters 7 | /Library/Win32/Release/Colors 8 | /Library/Win32/Release/*.exe 9 | *.local 10 | *.dll 11 | *.7z 12 | *.exe 13 | /Library/Win64/Debug/Colors 14 | /Library/Win64/Debug/Highlighters 15 | *.rsm 16 | *.identcache 17 | *.stat 18 | *.db 19 | *.skincfg 20 | /__recovery 21 | /*.cbk 22 | *.d 23 | *.drc 24 | *.map 25 | *.tds 26 | /Bin/Win32/LogViewer_MemoryManager_EventLog.txt 27 | /LogViewer_project.tvsconfig 28 | -------------------------------------------------------------------------------- /LogViewer.CallStack.Settings.View.dfm: -------------------------------------------------------------------------------- 1 | object frmCallStackSettings: TfrmCallStackSettings 2 | Left = 342 3 | Top = 342 4 | ClientHeight = 36 5 | ClientWidth = 188 6 | Color = clBtnFace 7 | DoubleBuffered = True 8 | Font.Charset = ANSI_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | TextHeight = 13 14 | object chkHideColumnHeaders: TCheckBox 15 | Left = 16 16 | Top = 8 17 | Width = 137 18 | Height = 17 19 | Caption = 'Hide column headers' 20 | TabOrder = 0 21 | OnClick = chkHideColumnHeadersClick 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /LogViewer.LogLevels.Settings.View.dfm: -------------------------------------------------------------------------------- 1 | object frmLogLevelSettings: TfrmLogLevelSettings 2 | Left = 304 3 | Top = 304 4 | ClientHeight = 411 5 | ClientWidth = 584 6 | Color = clBtnFace 7 | DoubleBuffered = True 8 | Font.Charset = ANSI_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | TextHeight = 13 14 | object splVertical: TSplitter 15 | Left = 281 16 | Top = 0 17 | Width = 4 18 | Height = 411 19 | Color = clScrollBar 20 | ParentColor = False 21 | ResizeStyle = rsLine 22 | end 23 | object pnlRight: TPanel 24 | Left = 285 25 | Top = 0 26 | Width = 299 27 | Height = 411 28 | Align = alClient 29 | BevelOuter = bvNone 30 | TabOrder = 0 31 | ExplicitWidth = 293 32 | ExplicitHeight = 394 33 | end 34 | object pnlLeft: TPanel 35 | Left = 0 36 | Top = 0 37 | Width = 281 38 | Height = 411 39 | Align = alLeft 40 | BevelOuter = bvNone 41 | TabOrder = 1 42 | ExplicitHeight = 394 43 | end 44 | end 45 | -------------------------------------------------------------------------------- /LogViewer.DisplayValues.Settings.View.dfm: -------------------------------------------------------------------------------- 1 | object frmDisplayValuesSettings: TfrmDisplayValuesSettings 2 | Left = 0 3 | Top = 0 4 | BorderStyle = bsNone 5 | ClientHeight = 378 6 | ClientWidth = 489 7 | Color = clBtnFace 8 | DoubleBuffered = True 9 | Font.Charset = ANSI_CHARSET 10 | Font.Color = clWindowText 11 | Font.Height = -11 12 | Font.Name = 'Segoe UI' 13 | Font.Style = [] 14 | TextHeight = 13 15 | object splVertical: TSplitter 16 | Left = 145 17 | Top = 0 18 | Width = 4 19 | Height = 378 20 | Color = clScrollBar 21 | ParentColor = False 22 | ResizeStyle = rsUpdate 23 | end 24 | object pnlRight: TPanel 25 | Left = 149 26 | Top = 0 27 | Width = 340 28 | Height = 378 29 | Align = alClient 30 | BevelOuter = bvNone 31 | TabOrder = 0 32 | ExplicitLeft = 147 33 | ExplicitWidth = 342 34 | end 35 | object pnlLeft: TPanel 36 | Left = 0 37 | Top = 0 38 | Width = 145 39 | Height = 378 40 | Align = alLeft 41 | BevelOuter = bvNone 42 | TabOrder = 1 43 | end 44 | end 45 | -------------------------------------------------------------------------------- /LogViewer.Receivers.Winods.Settings.View.dfm: -------------------------------------------------------------------------------- 1 | object frmWinodsSettings: TfrmWinodsSettings 2 | Left = 0 3 | Top = 0 4 | ClientHeight = 61 5 | ClientWidth = 215 6 | Color = clBtnFace 7 | DoubleBuffered = True 8 | Font.Charset = ANSI_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | ShowHint = True 14 | TextHeight = 13 15 | object lblProcess: TLabel 16 | Left = 16 17 | Top = 8 18 | Width = 41 19 | Height = 13 20 | Caption = 'Process:' 21 | FocusControl = edtProcess 22 | end 23 | object lblProcessId: TLabel 24 | Left = 16 25 | Top = 32 26 | Width = 54 27 | Height = 13 28 | Caption = 'Process Id:' 29 | FocusControl = edtProcessId 30 | end 31 | object edtProcess: TButtonedEdit 32 | Left = 76 33 | Top = 5 34 | Width = 121 35 | Height = 21 36 | TabOrder = 0 37 | end 38 | object edtProcessId: TButtonedEdit 39 | Left = 76 40 | Top = 29 41 | Width = 121 42 | Height = 21 43 | TabOrder = 1 44 | end 45 | end 46 | -------------------------------------------------------------------------------- /LogViewer.MessageData.View.dfm: -------------------------------------------------------------------------------- 1 | object frmMessageDataView: TfrmMessageDataView 2 | Left = 0 3 | Top = 0 4 | ClientHeight = 287 5 | ClientWidth = 603 6 | Color = clBtnFace 7 | DoubleBuffered = True 8 | Font.Charset = ANSI_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | TextHeight = 13 14 | object pnlMain: TOMultiPanel 15 | Left = 0 16 | Top = 0 17 | Width = 603 18 | Height = 287 19 | PanelCollection = < 20 | item 21 | Control = pnlLeft 22 | Position = 1.000000000000000000 23 | Visible = True 24 | Index = 0 25 | end> 26 | MinPosition = 0.020000000000000000 27 | Align = alClient 28 | TabOrder = 0 29 | ExplicitWidth = 597 30 | ExplicitHeight = 270 31 | DesignSize = ( 32 | 603 33 | 287) 34 | object pnlLeft: TPanel 35 | Left = 0 36 | Top = 0 37 | Width = 603 38 | Height = 287 39 | Anchors = [] 40 | BevelOuter = bvNone 41 | TabOrder = 0 42 | end 43 | end 44 | end 45 | -------------------------------------------------------------------------------- /LogViewer.Receivers.ComPort.Settings.View.dfm: -------------------------------------------------------------------------------- 1 | object frmComPortSettings: TfrmComPortSettings 2 | Left = 228 3 | Top = 228 4 | ClientHeight = 69 5 | ClientWidth = 270 6 | Color = clBtnFace 7 | DoubleBuffered = True 8 | Font.Charset = ANSI_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | TextHeight = 13 14 | object lblPort: TLabel 15 | Left = 16 16 | Top = 11 17 | Width = 24 18 | Height = 13 19 | Margins.Bottom = 2 20 | Caption = 'Port:' 21 | FocusControl = cbxPort 22 | end 23 | object lblBaudRate: TLabel 24 | Left = 16 25 | Top = 38 26 | Width = 49 27 | Height = 13 28 | Margins.Bottom = 2 29 | Caption = 'Baudrate:' 30 | FocusControl = cbxBaudRate 31 | end 32 | object cbxPort: TComboBox 33 | Left = 88 34 | Top = 8 35 | Width = 145 36 | Height = 31 37 | TabOrder = 0 38 | end 39 | object cbxBaudRate: TComboBox 40 | Left = 88 41 | Top = 35 42 | Width = 145 43 | Height = 31 44 | TabOrder = 1 45 | end 46 | end 47 | -------------------------------------------------------------------------------- /LogViewer.Subscribers.Winods.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Subscribers.Winods; 18 | 19 | { Winods subscriber. } 20 | 21 | interface 22 | 23 | uses 24 | LogViewer.Interfaces, LogViewer.Subscribers.Base; 25 | 26 | type 27 | TWinodsSubscriber = class(TSubscriber, ISubscriber, IWinods) 28 | protected 29 | function GetIsSourceActive: Boolean; override; 30 | 31 | end; 32 | 33 | implementation 34 | 35 | uses 36 | DDuce.Utils.Winapi; 37 | 38 | {$REGION 'property access methods'} 39 | function TWinodsSubscriber.GetIsSourceActive: Boolean; 40 | begin 41 | Result := CheckProcessExists(SourceId); 42 | end; 43 | {$ENDREGION} 44 | 45 | end. 46 | -------------------------------------------------------------------------------- /LogViewer.Receivers.Winipc.Settings.View.dfm: -------------------------------------------------------------------------------- 1 | object frmWinipcSettings: TfrmWinipcSettings 2 | Left = 0 3 | Top = 0 4 | ClientHeight = 84 5 | ClientWidth = 326 6 | Color = clBtnFace 7 | DoubleBuffered = True 8 | Font.Charset = ANSI_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | ShowHint = True 14 | TextHeight = 13 15 | object lblWindowHandleName: TLabel 16 | Left = 8 17 | Top = 8 18 | Width = 117 19 | Height = 13 20 | Caption = 'Window handle name:' 21 | FocusControl = edtWindowHandleName 22 | end 23 | object lblPollingIntervalMs: TLabel 24 | Left = 183 25 | Top = 36 26 | Width = 14 27 | Height = 13 28 | Caption = 'ms' 29 | end 30 | object edtWindowHandleName: TEdit 31 | Left = 131 32 | Top = 6 33 | Width = 182 34 | Height = 21 35 | TabOrder = 0 36 | end 37 | object edtPollingInterval: TLabeledEdit 38 | Left = 131 39 | Top = 33 40 | Width = 57 41 | Height = 21 42 | Alignment = taRightJustify 43 | EditLabel.Width = 80 44 | EditLabel.Height = 21 45 | EditLabel.Caption = 'Polling &interval:' 46 | LabelPosition = lpLeft 47 | NumbersOnly = True 48 | TabOrder = 1 49 | Text = '' 50 | OnChange = edtPollingIntervalChange 51 | end 52 | end 53 | -------------------------------------------------------------------------------- /LogViewer.Watches.Settings.View.dfm: -------------------------------------------------------------------------------- 1 | object frmWatchSettings: TfrmWatchSettings 2 | Left = 190 3 | Top = 190 4 | ClientHeight = 209 5 | ClientWidth = 366 6 | Color = clBtnFace 7 | DoubleBuffered = True 8 | Font.Charset = DEFAULT_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | TextHeight = 13 14 | object chkOnlyTrackChanges: TCheckBox 15 | Left = 16 16 | Top = 8 17 | Width = 153 18 | Height = 17 19 | Caption = 'Only track changes.' 20 | TabOrder = 0 21 | OnClick = chkOnlyTrackChangesClick 22 | end 23 | object chkSyncWithSelectedMessage: TCheckBox 24 | Left = 16 25 | Top = 31 26 | Width = 281 27 | Height = 17 28 | Caption = 'Synchronize watch value with selected log message.' 29 | TabOrder = 1 30 | OnClick = chkSyncWithSelectedMessageClick 31 | end 32 | object chkShowWatchHistory: TCheckBox 33 | Left = 16 34 | Top = 54 35 | Width = 129 36 | Height = 17 37 | Caption = 'Show watch history.' 38 | TabOrder = 2 39 | OnClick = chkShowWatchHistoryClick 40 | end 41 | object chkHideColumnHeaders: TCheckBox 42 | Left = 16 43 | Top = 77 44 | Width = 281 45 | Height = 17 46 | Caption = 'Hide column headers' 47 | TabOrder = 3 48 | OnClick = chkHideColumnHeadersClick 49 | end 50 | end 51 | -------------------------------------------------------------------------------- /LogViewer.ValueList.View.dfm: -------------------------------------------------------------------------------- 1 | object frmValueListView: TfrmValueListView 2 | Left = 0 3 | Top = 0 4 | ClientHeight = 569 5 | ClientWidth = 400 6 | Color = clWhite 7 | DoubleBuffered = True 8 | ParentFont = True 9 | TextHeight = 15 10 | object pnlMain: TOMultiPanel 11 | Left = 0 12 | Top = 0 13 | Width = 400 14 | Height = 569 15 | PanelType = ptVertical 16 | PanelCollection = < 17 | item 18 | Control = pnlTop 19 | Position = 0.500000000000000000 20 | Visible = True 21 | Index = 0 22 | end 23 | item 24 | Control = pnlBottom 25 | Position = 1.000000000000000000 26 | Visible = True 27 | Index = 1 28 | end> 29 | MinPosition = 0.020000000000000000 30 | SplitterSize = 8 31 | SplitterColor = clScrollBar 32 | SplitterHoverColor = clScrollBar 33 | Align = alClient 34 | AutoSize = True 35 | BevelEdges = [] 36 | TabOrder = 0 37 | ExplicitWidth = 394 38 | ExplicitHeight = 552 39 | object pnlBottom: TPanel 40 | Left = 0 41 | Top = 292 42 | Width = 400 43 | Height = 277 44 | Align = alBottom 45 | BevelOuter = bvNone 46 | TabOrder = 1 47 | end 48 | object pnlTop: TPanel 49 | Left = 0 50 | Top = 0 51 | Width = 400 52 | Height = 284 53 | Align = alClient 54 | BevelOuter = bvNone 55 | TabOrder = 0 56 | end 57 | end 58 | end 59 | -------------------------------------------------------------------------------- /LogViewer.RawData.View.dfm: -------------------------------------------------------------------------------- 1 | object frmRawDataView: TfrmRawDataView 2 | Left = 0 3 | Top = 0 4 | BorderStyle = bsNone 5 | ClientHeight = 450 6 | ClientWidth = 567 7 | Color = clBtnFace 8 | DoubleBuffered = True 9 | Font.Charset = ANSI_CHARSET 10 | Font.Color = clWindowText 11 | Font.Height = -11 12 | Font.Name = 'Segoe UI' 13 | Font.Style = [] 14 | TextHeight = 13 15 | object heMain: TKHexEditor 16 | Left = 0 17 | Top = 0 18 | Width = 567 19 | Height = 450 20 | Align = alClient 21 | BorderStyle = bsNone 22 | Colors.HorzLines = clScrollBar 23 | Colors.Separators = clScrollBar 24 | Colors.VertLines = clScrollBar 25 | Font.Charset = ANSI_CHARSET 26 | Font.Color = clWindowText 27 | Font.Height = -16 28 | Font.Name = 'Consolas' 29 | Font.Pitch = fpFixed 30 | Font.Style = [] 31 | LineHeightPercent = 100 32 | Options = [eoDisableCaret, eoGroupUndo, eoScrollWindow, eoShowFormatting] 33 | PopupMenu = ppmMain 34 | ReadOnly = True 35 | ScrollSpeed = 200 36 | TabOrder = 0 37 | end 38 | object ppmMain: TPopupMenu 39 | Left = 432 40 | Top = 179 41 | object mniCopy: TMenuItem 42 | Action = actCopy 43 | ShortCut = 16451 44 | end 45 | end 46 | object aclMain: TActionList 47 | Left = 512 48 | Top = 176 49 | object actCopy: TAction 50 | Caption = 'Copy' 51 | Hint = 'Copy image to clipboard' 52 | OnExecute = actCopyExecute 53 | end 54 | end 55 | end 56 | -------------------------------------------------------------------------------- /LogViewer.MessageFilter.View.dfm: -------------------------------------------------------------------------------- 1 | object frmMessageFilter: TfrmMessageFilter 2 | Left = 76 3 | Top = 76 4 | BorderIcons = [biSystemMenu] 5 | BorderStyle = bsSizeToolWin 6 | Caption = 'Message filter' 7 | ClientHeight = 627 8 | ClientWidth = 233 9 | Color = clBtnFace 10 | DoubleBuffered = True 11 | Font.Charset = ANSI_CHARSET 12 | Font.Color = clWindowText 13 | Font.Height = -11 14 | Font.Name = 'Segoe UI' 15 | Font.Style = [] 16 | FormStyle = fsStayOnTop 17 | PopupMode = pmAuto 18 | ScreenSnap = True 19 | TextHeight = 13 20 | object pnlMessageFilter: TPanel 21 | Left = 0 22 | Top = 0 23 | Width = 233 24 | Height = 627 25 | Align = alClient 26 | BevelOuter = bvNone 27 | Color = clWhite 28 | ParentBackground = False 29 | TabOrder = 0 30 | object pgcMain: TKPageControl 31 | Left = 0 32 | Top = 0 33 | Width = 233 34 | Height = 627 35 | ActivePageIndex = 0 36 | Align = alClient 37 | ParentBackground = False 38 | TabOrder = 0 39 | object tsClientSide: TKTabSheet 40 | Caption = 'Client side' 41 | end 42 | object tsSourceSide: TKTabSheet 43 | Caption = 'Source side' 44 | ExplicitTop = 16 45 | ExplicitWidth = 0 46 | ExplicitHeight = 611 47 | end 48 | end 49 | end 50 | object imlMain: TVirtualImageList 51 | AutoFill = True 52 | Images = <> 53 | ImageNameAvailable = False 54 | Left = 96 55 | Top = 184 56 | end 57 | end 58 | -------------------------------------------------------------------------------- /LogViewer.Receivers.Zmq.Settings.View.dfm: -------------------------------------------------------------------------------- 1 | object frmZmqSettings: TfrmZmqSettings 2 | Left = 0 3 | Top = 0 4 | ClientHeight = 202 5 | ClientWidth = 280 6 | Color = clBtnFace 7 | DoubleBuffered = True 8 | Font.Charset = ANSI_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | ShowHint = True 14 | TextHeight = 13 15 | object lblPollingTimeoutMs: TLabel 16 | Left = 151 17 | Top = 11 18 | Width = 14 19 | Height = 13 20 | Caption = 'ms' 21 | end 22 | object lblPollingIntervalMs: TLabel 23 | Left = 151 24 | Top = 38 25 | Width = 14 26 | Height = 13 27 | Caption = 'ms' 28 | end 29 | object edtPollingTimeout: TLabeledEdit 30 | Left = 88 31 | Top = 8 32 | Width = 57 33 | Height = 21 34 | Alignment = taRightJustify 35 | EditLabel.Width = 82 36 | EditLabel.Height = 21 37 | EditLabel.Caption = 'Polling &timeout:' 38 | LabelPosition = lpLeft 39 | NumbersOnly = True 40 | TabOrder = 0 41 | Text = '' 42 | OnChange = edtPollingTimeoutChange 43 | end 44 | object edtPollingInterval: TLabeledEdit 45 | Left = 88 46 | Top = 35 47 | Width = 57 48 | Height = 21 49 | Alignment = taRightJustify 50 | EditLabel.Width = 80 51 | EditLabel.Height = 21 52 | EditLabel.Caption = 'Polling &interval:' 53 | LabelPosition = lpLeft 54 | NumbersOnly = True 55 | TabOrder = 1 56 | Text = '' 57 | OnChange = edtPollingIntervalChange 58 | end 59 | end 60 | -------------------------------------------------------------------------------- /LogViewer.MessageList.Settings.View.dfm: -------------------------------------------------------------------------------- 1 | object frmViewSettings: TfrmViewSettings 2 | Left = 0 3 | Top = 0 4 | ClientHeight = 153 5 | ClientWidth = 216 6 | Color = clBtnFace 7 | DoubleBuffered = True 8 | Font.Charset = ANSI_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | TextHeight = 13 14 | object chkSmartTimeStamps: TCheckBox 15 | Left = 16 16 | Top = 8 17 | Width = 145 18 | Height = 17 19 | Caption = 'Use smart timestamps' 20 | TabOrder = 0 21 | OnClick = chkSmartTimeStampsClick 22 | end 23 | object chkAutoScrollMessages: TCheckBox 24 | Left = 16 25 | Top = 31 26 | Width = 169 27 | Height = 17 28 | Caption = 'Auto scroll messages' 29 | TabOrder = 1 30 | OnClick = chkAutoScrollMessagesClick 31 | end 32 | object chkAutoFilterMessages: TCheckBox 33 | Left = 16 34 | Top = 54 35 | Width = 145 36 | Height = 17 37 | Caption = 'Auto filter messages' 38 | TabOrder = 2 39 | OnClick = chkAutoFilterMessagesClick 40 | end 41 | object chkDynamicAutoSizeColumns: TCheckBox 42 | Left = 16 43 | Top = 77 44 | Width = 145 45 | Height = 17 46 | Caption = 'Dynamic autosize columns' 47 | TabOrder = 3 48 | OnClick = chkDynamicAutoSizeColumnsClick 49 | end 50 | object chkHideColumnHeaders: TCheckBox 51 | Left = 16 52 | Top = 100 53 | Width = 145 54 | Height = 17 55 | Caption = 'Hide column headers' 56 | TabOrder = 4 57 | OnClick = chkHideColumnHeadersClick 58 | end 59 | end 60 | -------------------------------------------------------------------------------- /LogViewer.Watches.View.dfm: -------------------------------------------------------------------------------- 1 | object frmWatchesView: TfrmWatchesView 2 | Left = 4068 3 | Top = 228 4 | ClientHeight = 739 5 | ClientWidth = 450 6 | Color = clWhite 7 | DoubleBuffered = True 8 | Font.Charset = ANSI_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | ShowHint = True 14 | TextHeight = 13 15 | object pnlMain: TOMultiPanel 16 | Left = 0 17 | Top = 0 18 | Width = 450 19 | Height = 739 20 | PanelType = ptVertical 21 | PanelCollection = < 22 | item 23 | Control = pnlWatches 24 | Position = 0.500000000000000000 25 | Visible = True 26 | Index = 0 27 | end 28 | item 29 | Control = pnlWatchHistory 30 | Position = 1.000000000000000000 31 | Visible = False 32 | Index = 1 33 | end> 34 | MinPosition = 0.020000000000000000 35 | SplitterSize = 8 36 | SplitterColor = clScrollBar 37 | SplitterHoverColor = clScrollBar 38 | Align = alClient 39 | BevelEdges = [] 40 | TabOrder = 0 41 | ExplicitWidth = 444 42 | ExplicitHeight = 722 43 | object pnlWatches: TPanel 44 | Left = 0 45 | Top = 0 46 | Width = 450 47 | Height = 370 48 | Align = alTop 49 | BevelOuter = bvNone 50 | TabOrder = 0 51 | end 52 | object pnlWatchHistory: TPanel 53 | Left = 0 54 | Top = 378 55 | Width = 450 56 | Height = 361 57 | Align = alBottom 58 | BevelOuter = bvNone 59 | TabOrder = 1 60 | Visible = False 61 | end 62 | end 63 | end 64 | -------------------------------------------------------------------------------- /LogBroker.MainForm.dfm: -------------------------------------------------------------------------------- 1 | object frmMain: TfrmMain 2 | Left = 0 3 | Top = 0 4 | BorderIcons = [biSystemMenu, biMinimize] 5 | BorderStyle = bsSingle 6 | ClientHeight = 30 7 | ClientWidth = 306 8 | Color = clWindow 9 | DoubleBuffered = True 10 | Font.Charset = DEFAULT_CHARSET 11 | Font.Color = clWindowText 12 | Font.Height = -11 13 | Font.Name = 'Segoe UI' 14 | Font.Style = [] 15 | Position = poScreenCenter 16 | ScreenSnap = True 17 | Visible = True 18 | TextHeight = 13 19 | object lblIPC: TLabel 20 | Left = 4 21 | Top = 8 22 | Width = 19 23 | Height = 13 24 | Caption = 'IPC:' 25 | end 26 | object shpStat: TShape 27 | Left = 276 28 | Top = 6 29 | Width = 21 30 | Height = 19 31 | Brush.Color = clBackground 32 | end 33 | object edtIPCPort: TLabeledEdit 34 | Left = 140 35 | Top = 5 36 | Width = 68 37 | Height = 21 38 | Alignment = taCenter 39 | EditLabel.Width = 24 40 | EditLabel.Height = 21 41 | EditLabel.Caption = 'Port:' 42 | Font.Charset = DEFAULT_CHARSET 43 | Font.Color = clWindowText 44 | Font.Height = -11 45 | Font.Name = 'Segoe UI' 46 | Font.Style = [fsBold] 47 | LabelPosition = lpLeft 48 | NumbersOnly = True 49 | ParentFont = False 50 | TabOrder = 0 51 | Text = '5555' 52 | end 53 | object chkIPCAutoPort: TCheckBox 54 | Left = 213 55 | Top = 7 56 | Width = 58 57 | Height = 17 58 | Hint = 'Auto assign TCP port for IPC messages' 59 | Caption = 'Auto' 60 | TabOrder = 1 61 | OnClick = chkIPCAutoPortClick 62 | end 63 | object tsIPC: TToggleSwitch 64 | Left = 27 65 | Top = 5 66 | Width = 81 67 | Height = 20 68 | TabOrder = 2 69 | end 70 | end 71 | -------------------------------------------------------------------------------- /LogViewer.Receivers.Winods.Settings.View.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Receivers.Winods.Settings.View; 18 | 19 | interface 20 | 21 | uses 22 | Winapi.Windows, Winapi.Messages, 23 | System.SysUtils, System.Variants, System.Classes, 24 | Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, 25 | 26 | LogViewer.Receivers.Winods.Settings; 27 | 28 | type 29 | TfrmWinodsSettings = class(TForm) 30 | {$REGION 'designer controls'} 31 | lblProcess : TLabel; 32 | lblProcessId : TLabel; 33 | edtProcess : TButtonedEdit; 34 | edtProcessId : TButtonedEdit; 35 | {$ENDREGION} 36 | 37 | private 38 | FSettings : TWinodsSettings; 39 | 40 | public 41 | constructor Create( 42 | AOwner : TComponent; 43 | ASettings : TWinodsSettings 44 | ); reintroduce; 45 | destructor Destroy; override; 46 | 47 | end; 48 | 49 | implementation 50 | 51 | {$R *.dfm} 52 | 53 | {$REGION 'construction and destruction'} 54 | constructor TfrmWinodsSettings.Create(AOwner: TComponent; 55 | ASettings: TWinodsSettings); 56 | begin 57 | inherited Create(AOwner); 58 | FSettings := ASettings; 59 | end; 60 | 61 | destructor TfrmWinodsSettings.Destroy; 62 | begin 63 | FSettings := nil; 64 | inherited Destroy; 65 | end; 66 | {$ENDREGION} 67 | 68 | end. 69 | -------------------------------------------------------------------------------- /LogViewer.Settings.Dialog.Data.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Settings.Dialog.Data; 18 | 19 | interface 20 | 21 | uses 22 | Vcl.ComCtrls, 23 | 24 | kpagecontrol; 25 | 26 | type 27 | TConfigData = class 28 | private 29 | FText : string; 30 | FTabSheet : TKTabSheet; 31 | 32 | protected 33 | {$REGION 'property access methods'} 34 | function GetText: string; 35 | procedure SetText(const Value: string); 36 | {$ENDREGION} 37 | 38 | public 39 | constructor Create( 40 | const AText : string = ''; 41 | ATabSheet : TKTabSheet = nil 42 | ); 43 | 44 | property Text: string 45 | read GetText write SetText; 46 | 47 | property TabSheet: TKTabSheet 48 | read FTabSheet write FTabSheet; 49 | 50 | end; 51 | 52 | implementation 53 | 54 | {$REGION 'construction and destruction'} 55 | constructor TConfigData.Create(const AText: string; ATabSheet: TKTabSheet); 56 | begin 57 | inherited Create; 58 | FText := AText; 59 | FTabSheet := ATabSheet; 60 | end; 61 | {$ENDREGION} 62 | 63 | {$REGION 'property access methods'} 64 | function TConfigData.GetText: string; 65 | begin 66 | Result := FText; 67 | end; 68 | 69 | procedure TConfigData.SetText(const Value: string); 70 | begin 71 | FText := Value; 72 | end; 73 | {$ENDREGION} 74 | 75 | end. 76 | -------------------------------------------------------------------------------- /LogViewer.CallStack.Settings.View.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.CallStack.Settings.View; 18 | 19 | interface 20 | 21 | uses 22 | Winapi.Windows, Winapi.Messages, 23 | System.SysUtils, System.Variants, System.Classes, 24 | Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, 25 | 26 | LogViewer.CallStack.Settings; 27 | 28 | type 29 | TfrmCallStackSettings = class(TForm) 30 | chkHideColumnHeaders : TCheckBox; 31 | 32 | procedure chkHideColumnHeadersClick(Sender: TObject); 33 | 34 | private 35 | FSettings : TCallStackSettings; 36 | 37 | public 38 | constructor Create( 39 | AOwner : TComponent; 40 | ASettings : TCallStackSettings 41 | ); reintroduce; 42 | destructor Destroy; override; 43 | end; 44 | 45 | implementation 46 | 47 | {$R *.dfm} 48 | 49 | {$REGION 'construction and destruction'} 50 | constructor TfrmCallStackSettings.Create(AOwner: TComponent; 51 | ASettings: TCallStackSettings); 52 | begin 53 | inherited Create(AOwner); 54 | FSettings := ASettings; 55 | chkHideColumnHeaders.Checked := not FSettings.ColumnHeadersVisible; 56 | end; 57 | 58 | destructor TfrmCallStackSettings.Destroy; 59 | begin 60 | FSettings := nil; 61 | inherited Destroy; 62 | end; 63 | {$ENDREGION} 64 | 65 | {$REGION 'event handlers'} 66 | procedure TfrmCallStackSettings.chkHideColumnHeadersClick(Sender: TObject); 67 | begin 68 | FSettings.ColumnHeadersVisible := not (Sender as TCheckBox).Checked; 69 | end; 70 | {$ENDREGION} 71 | 72 | end. 73 | -------------------------------------------------------------------------------- /LogViewer.CallStack.Data.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.CallStack.Data; 18 | 19 | { Class holding information shown in the callstack list. } 20 | 21 | interface 22 | 23 | uses 24 | LogViewer.MessageList.LogNode; 25 | 26 | type 27 | TCallStackData = class 28 | private 29 | FTitle : string; 30 | FLevel : Integer; 31 | FDuration : Integer; 32 | FNode1 : TLogNode; 33 | FNode2 : TLogNode; 34 | 35 | public 36 | constructor Create( 37 | ANode1 : TLogNode; 38 | ANode2 : TLogNode; 39 | const ATitle : string = ''; 40 | ALevel : Integer = 0; 41 | ADuration : Integer = 0 42 | ); 43 | 44 | property Level: Integer 45 | read FLevel write FLevel; 46 | 47 | property Title: string 48 | read FTitle write FTitle; 49 | 50 | { Duration in ms. } 51 | property Duration: Integer 52 | read FDuration write FDuration; 53 | 54 | property Node1: TLogNode 55 | read FNode1 write FNode1; 56 | 57 | property Node2: TLogNode 58 | read FNode2 write FNode2; 59 | end; 60 | 61 | implementation 62 | 63 | {$REGION 'construction and destruction'} 64 | constructor TCallStackData.Create(ANode1: TLogNode; ANode2: TLogNode; 65 | const ATitle: string; ALevel, ADuration: Integer); 66 | begin 67 | inherited Create; 68 | FNode1 := ANode1; 69 | FNode2 := ANode2; 70 | FTitle := ATitle; 71 | FLevel := ALevel; 72 | FDuration := ADuration; 73 | end; 74 | {$ENDREGION} 75 | 76 | end. 77 | -------------------------------------------------------------------------------- /LogViewer.RawData.View.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.RawData.View; 18 | 19 | interface 20 | 21 | uses 22 | Winapi.Windows, Winapi.Messages, 23 | System.SysUtils, System.Variants, System.Classes, System.Actions, 24 | Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Clipbrd, Vcl.Menus, 25 | Vcl.ActnList, 26 | 27 | kcontrols, khexeditor; 28 | 29 | type 30 | TfrmRawDataView = class(TForm) 31 | heMain : TKHexEditor; 32 | ppmMain : TPopupMenu; 33 | mniCopy : TMenuItem; 34 | aclMain : TActionList; 35 | actCopy : TAction; 36 | 37 | procedure actCopyExecute(Sender: TObject); 38 | 39 | public 40 | procedure Clear; 41 | procedure LoadFromStream(AStream: TStream); 42 | 43 | end; 44 | 45 | implementation 46 | 47 | {$R *.dfm} 48 | 49 | uses 50 | Spring; 51 | 52 | {$REGION 'action handlers'} 53 | procedure TfrmRawDataView.actCopyExecute(Sender: TObject); 54 | var 55 | SS : TStringStream; 56 | begin 57 | SS := TStringStream.Create; 58 | try 59 | heMain.SaveToStream(SS); 60 | Clipboard.AsText := SS.DataString; 61 | finally 62 | SS.Free; 63 | end; 64 | end; 65 | {$ENDREGION} 66 | 67 | {$REGION 'public methods'} 68 | procedure TfrmRawDataView.Clear; 69 | begin 70 | heMain.Clear; 71 | end; 72 | 73 | procedure TfrmRawDataView.LoadFromStream(AStream: TStream); 74 | begin 75 | if Assigned(AStream) then 76 | begin 77 | Guard.CheckNotNull(AStream, 'AStream'); 78 | AStream.Position := 0; 79 | heMain.LoadFromStream(AStream); 80 | end 81 | else 82 | begin 83 | Clear; 84 | end; 85 | end; 86 | {$ENDREGION} 87 | 88 | end. 89 | -------------------------------------------------------------------------------- /LogViewer.Receivers.ComPort.Settings.View.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Receivers.ComPort.Settings.View; 18 | 19 | { ComPort configuration view. } 20 | 21 | interface 22 | 23 | uses 24 | Winapi.Windows, Winapi.Messages, 25 | System.SysUtils, System.Variants, System.Classes, 26 | Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, 27 | 28 | LogViewer.Receivers.ComPort.Settings; 29 | 30 | type 31 | TfrmComPortSettings = class(TForm) 32 | cbxPort : TComboBox; 33 | cbxBaudRate : TComboBox; 34 | lblPort : TLabel; 35 | lblBaudRate : TLabel; 36 | 37 | private 38 | FSettings: TComPortSettings; 39 | 40 | protected 41 | procedure UpdateActions; override; 42 | 43 | public 44 | constructor Create( 45 | AOwner : TComponent; 46 | ASettings : TComPortSettings 47 | ); reintroduce; 48 | procedure BeforeDestruction; override; 49 | 50 | end; 51 | 52 | implementation 53 | 54 | {$R *.dfm} 55 | 56 | {$REGION 'construction and destruction'} 57 | constructor TfrmComPortSettings.Create(AOwner: TComponent; 58 | ASettings: TComPortSettings); 59 | begin 60 | inherited Create(AOwner); 61 | FSettings := ASettings; 62 | end; 63 | 64 | procedure TfrmComPortSettings.BeforeDestruction; 65 | begin 66 | FSettings := nil; 67 | inherited BeforeDestruction; 68 | end; 69 | {$ENDREGION} 70 | 71 | {$REGION 'protected methods'} 72 | procedure TfrmComPortSettings.UpdateActions; 73 | begin 74 | inherited UpdateActions; 75 | cbxPort.Text := FSettings.Port; 76 | cbxBaudRate.Text := FSettings.BaudRate.ToString; 77 | end; 78 | {$ENDREGION} 79 | 80 | end. 81 | -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Git Ignore.json: -------------------------------------------------------------------------------- 1 | { 2 | "Highlighter": { 3 | "Sample": [ 4 | "# Hello, World! in Git Ignore\r\n", 5 | "\r\n", 6 | "*.helloword" 7 | ], 8 | "MainRules": { 9 | "Attributes": { 10 | "Element": "Editor" 11 | }, 12 | "SubRules": { 13 | "Range": [ 14 | { 15 | "Type": "LineComment", 16 | "Attributes": { 17 | "Element": "Comment" 18 | }, 19 | "Properties": { 20 | "CloseOnEndOfLine": true 21 | }, 22 | "TokenRange": { 23 | "Open": "#" 24 | } 25 | }, 26 | { 27 | "Type": "String", 28 | "Attributes": { 29 | "Element": "String" 30 | }, 31 | "Properties": { 32 | "CloseOnEndOfLine": true 33 | }, 34 | "TokenRange": { 35 | "Open": "[", 36 | "Close": "]" 37 | } 38 | } 39 | ], 40 | "KeyList": [ 41 | { 42 | "Type": "ReservedWord", 43 | "Words": [ 44 | "*", 45 | "!", 46 | "~" 47 | ], 48 | "Attributes": { 49 | "Element": "ReservedWord" 50 | } 51 | }, 52 | { 53 | "Type": "Symbol", 54 | "Words": [ 55 | "/", 56 | "." 57 | ], 58 | "Attributes": { 59 | "Element": "Symbol" 60 | } 61 | } 62 | ], 63 | "Set": [ 64 | { 65 | "Type": "Numbers", 66 | "Symbols": "0123456789", 67 | "Attributes": { 68 | "Element": "Number" 69 | } 70 | }, 71 | { 72 | "Type": "Float", 73 | "Symbols": ".0123456789", 74 | "Attributes": { 75 | "Element": "Number" 76 | } 77 | } 78 | ] 79 | } 80 | } 81 | }, 82 | "MatchingPair": { 83 | "Pairs": [ 84 | { 85 | "OpenToken": "[", 86 | "CloseToken": "]" 87 | } 88 | ] 89 | }, 90 | "CompletionProposal": { 91 | "SkipRegion": [ 92 | { 93 | "OpenToken": "#", 94 | "RegionType": "SingleLine" 95 | } 96 | ] 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /LogViewer.Receivers.Zmq.Settings.View.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Receivers.Zmq.Settings.View; 18 | 19 | interface 20 | 21 | uses 22 | Winapi.Windows, Winapi.Messages, 23 | System.SysUtils, System.Variants, System.Classes, 24 | Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, 25 | 26 | LogViewer.Receivers.Zmq.Settings, Vcl.Mask; 27 | 28 | type 29 | TfrmZmqSettings = class(TForm) 30 | edtPollingTimeout : TLabeledEdit; 31 | edtPollingInterval : TLabeledEdit; 32 | lblPollingTimeoutMs : TLabel; 33 | lblPollingIntervalMs : TLabel; 34 | 35 | procedure edtPollingTimeoutChange(Sender: TObject); 36 | procedure edtPollingIntervalChange(Sender: TObject); 37 | 38 | private 39 | FSettings : TZmqSettings; 40 | 41 | public 42 | constructor Create( 43 | AOwner : TComponent; 44 | ASettings : TZmqSettings 45 | ); reintroduce; virtual; 46 | 47 | end; 48 | 49 | implementation 50 | 51 | {$R *.dfm} 52 | 53 | uses 54 | Spring; 55 | 56 | {$REGION 'construction and destruction'} 57 | constructor TfrmZmqSettings.Create(AOwner: TComponent; 58 | ASettings: TZmqSettings); 59 | begin 60 | inherited Create(AOwner); 61 | Guard.CheckNotNull(ASettings, 'ASettings'); 62 | FSettings := ASettings; 63 | edtPollingTimeout.Text := FSettings.PollingTimeout.ToString; 64 | edtPollingInterval.Text := FSettings.PollingInterval.ToString; 65 | end; 66 | {$ENDREGION} 67 | 68 | {$REGION 'event handlers'} 69 | procedure TfrmZmqSettings.edtPollingIntervalChange(Sender: TObject); 70 | begin 71 | FSettings.PollingInterval := StrToIntDef(edtPollingInterval.Text, 100); 72 | end; 73 | 74 | procedure TfrmZmqSettings.edtPollingTimeoutChange(Sender: TObject); 75 | begin 76 | FSettings.PollingTimeout := StrToIntDef(edtPollingTimeout.Text, 10); 77 | end; 78 | {$ENDREGION} 79 | 80 | end. 81 | -------------------------------------------------------------------------------- /LogViewer.Receivers.Winipc.Settings.View.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Receivers.Winipc.Settings.View; 18 | 19 | interface 20 | 21 | uses 22 | Winapi.Windows, Winapi.Messages, 23 | System.SysUtils, System.Variants, System.Classes, 24 | Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, 25 | 26 | LogViewer.Receivers.Winipc.Settings, Vcl.Mask; 27 | 28 | type 29 | TfrmWinipcSettings = class(TForm) 30 | lblWindowHandleName : TLabel; 31 | edtWindowHandleName : TEdit; 32 | edtPollingInterval : TLabeledEdit; 33 | lblPollingIntervalMs : TLabel; 34 | 35 | procedure edtPollingIntervalChange(Sender: TObject); 36 | 37 | private 38 | FSettings : TWinipcSettings; 39 | 40 | protected 41 | procedure UpdateActions; override; 42 | 43 | public 44 | constructor Create( 45 | AOwner : TComponent; 46 | ASettings : TWinipcSettings 47 | ); reintroduce; 48 | destructor Destroy; override; 49 | 50 | end; 51 | 52 | implementation 53 | 54 | {$R *.dfm} 55 | 56 | {$REGION 'construction and destruction'} 57 | constructor TfrmWinipcSettings.Create(AOwner: TComponent; 58 | ASettings: TWinipcSettings); 59 | begin 60 | inherited Create(AOwner); 61 | FSettings := ASettings; 62 | edtPollingInterval.Text := FSettings.PollingInterval.ToString; 63 | end; 64 | 65 | destructor TfrmWinipcSettings.Destroy; 66 | begin 67 | FSettings := nil; 68 | inherited Destroy; 69 | end; 70 | {$ENDREGION} 71 | 72 | {$REGION 'event handlers'} 73 | procedure TfrmWinipcSettings.edtPollingIntervalChange(Sender: TObject); 74 | begin 75 | FSettings.PollingInterval := StrToIntDef(edtPollingInterval.Text, 100); 76 | end; 77 | {$ENDREGION} 78 | 79 | {$REGION 'protected methods'} 80 | procedure TfrmWinipcSettings.UpdateActions; 81 | begin 82 | inherited UpdateActions; 83 | end; 84 | {$ENDREGION} 85 | 86 | end. 87 | -------------------------------------------------------------------------------- /LogViewer.DataSet.View.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.DataSet.View; 18 | 19 | interface 20 | 21 | uses 22 | Winapi.Windows, Winapi.Messages, 23 | System.SysUtils, System.Variants, System.Classes, 24 | Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, 25 | Data.DB, 26 | FireDAC.Comp.Client, FireDAC.Stan.Intf, FireDAC.Comp.DataSet, 27 | FireDAC.Stan.StorageBin, 28 | 29 | DDuce.Components.DBGridView; 30 | 31 | type 32 | TfrmDataSetView = class(TForm) 33 | dscMain : TDataSource; 34 | 35 | private 36 | FDataSet : TFDMemTable; 37 | FDBGridView : TDBGridView; 38 | 39 | public 40 | procedure AfterConstruction; override; 41 | destructor Destroy; override; 42 | 43 | procedure Clear; 44 | procedure LoadFromStream(AStream: TStream); 45 | 46 | end; 47 | 48 | implementation 49 | 50 | {$R *.dfm} 51 | 52 | uses 53 | Spring, 54 | 55 | DDuce.Factories.GridView; 56 | 57 | {$REGION 'construction and destruction'} 58 | procedure TfrmDataSetView.AfterConstruction; 59 | begin 60 | inherited AfterConstruction; 61 | FDataSet := TFDMemTable.Create(Self); 62 | FDBGridView := TGridViewFactory.CreateDBGridView(Self, Self, dscMain); 63 | FDBGridView.AlignWithMargins := False; 64 | FDBGridView.GridLines := False; 65 | FDBGridView.BorderStyle := bsNone; 66 | end; 67 | 68 | destructor TfrmDataSetView.Destroy; 69 | begin 70 | FreeAndNil(FDataSet); 71 | FreeAndNil(FDBGridView); 72 | inherited Destroy; 73 | end; 74 | {$ENDREGION} 75 | 76 | {$REGION 'public methods'} 77 | procedure TfrmDataSetView.Clear; 78 | begin 79 | FDataSet.Active := False; 80 | end; 81 | 82 | procedure TfrmDataSetView.LoadFromStream(AStream: TStream); 83 | begin 84 | if Assigned(AStream) then 85 | begin 86 | AStream.Position := 0; 87 | FDataSet.LoadFromStream(AStream); 88 | dscMain.DataSet := FDataSet; 89 | FDBGridView.AutoSizeCols; 90 | end 91 | else 92 | Clear; 93 | end; 94 | {$ENDREGION} 95 | 96 | end. 97 | -------------------------------------------------------------------------------- /LogViewer.Receivers.FileSystem.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Receivers.FileSystem; 18 | 19 | { Monitors FileSystem changes for a given path (directory or file). } 20 | 21 | interface 22 | 23 | uses 24 | System.Classes, 25 | Vcl.ExtCtrls, 26 | 27 | Spring, 28 | 29 | LogViewer.Interfaces, LogViewer.Receivers.Base, 30 | LogViewer.Receivers.FileSystem.Settings; 31 | 32 | type 33 | TFileSystemChannelReceiver = class(TChannelReceiver, IChannelReceiver, 34 | IFileSystem 35 | ) 36 | private 37 | FPath : string; 38 | 39 | function GetSettings: TFileSystemSettings; 40 | 41 | procedure SettingsChanged(Sender: TObject); 42 | 43 | public 44 | constructor Create( 45 | AManager : ILogViewerManager; 46 | const APath : string; 47 | const AName : string 48 | ); reintroduce; virtual; 49 | procedure AfterConstruction; override; 50 | 51 | property Settings: TFileSystemSettings 52 | read GetSettings; 53 | 54 | end; 55 | 56 | implementation 57 | 58 | uses 59 | System.SysUtils, 60 | Vcl.Forms; 61 | 62 | {$REGION 'construction and destruction'} 63 | procedure TFileSystemChannelReceiver.AfterConstruction; 64 | begin 65 | inherited AfterConstruction; 66 | PollTimer.Interval := 1000; 67 | PollTimer.Enabled := True; 68 | PollTimer.OnTimer := PollTimerTimer; 69 | Settings.OnChanged.Add(SettingsChanged); 70 | end; 71 | 72 | constructor TFileSystemChannelReceiver.Create(AManager: ILogViewerManager; 73 | const APath, AName: string); 74 | begin 75 | inherited Create(AManager, AName); 76 | if APath.IsEmpty then 77 | FPath := ExtractFilePath(Application.ExeName) 78 | else 79 | FPath := APath; 80 | end; 81 | {$ENDREGION} 82 | 83 | {$REGION 'property access methods'} 84 | function TFileSystemChannelReceiver.GetSettings: TFileSystemSettings; 85 | begin 86 | Result := Manager.Settings.FileSystemSettings; 87 | end; 88 | {$ENDREGION} 89 | 90 | {$REGION 'event handlers'} 91 | procedure TFileSystemChannelReceiver.SettingsChanged(Sender: TObject); 92 | begin 93 | Enabled := Settings.Enabled; 94 | end; 95 | {$ENDREGION} 96 | 97 | end. 98 | -------------------------------------------------------------------------------- /LogViewer.CallStack.Settings.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.CallStack.Settings; 18 | 19 | { Persistable settings for callstack display. } 20 | 21 | interface 22 | 23 | uses 24 | System.Classes, 25 | 26 | Spring; 27 | 28 | type 29 | TCallStackSettings = class(TPersistent) 30 | private 31 | FOnChanged : Event; 32 | FColumnHeadersVisible : Boolean; 33 | 34 | protected 35 | {$REGION 'property access methods'} 36 | function GetColumnHeadersVisible: Boolean; 37 | procedure SetColumnHeadersVisible(const Value: Boolean); 38 | function GetOnChanged: IEvent; 39 | {$ENDREGION} 40 | 41 | procedure Changed; 42 | 43 | public 44 | procedure Assign(Source: TPersistent); override; 45 | 46 | property OnChanged: IEvent 47 | read GetOnChanged; 48 | 49 | published 50 | property ColumnHeadersVisible: Boolean 51 | read GetColumnHeadersVisible write SetColumnHeadersVisible; 52 | 53 | end; 54 | 55 | implementation 56 | 57 | {$REGION 'property access methods'} 58 | function TCallStackSettings.GetColumnHeadersVisible: Boolean; 59 | begin 60 | Result := FColumnHeadersVisible; 61 | end; 62 | 63 | procedure TCallStackSettings.SetColumnHeadersVisible(const Value: Boolean); 64 | begin 65 | if Value <> ColumnHeadersVisible then 66 | begin 67 | FColumnHeadersVisible := Value; 68 | Changed; 69 | end; 70 | end; 71 | 72 | function TCallStackSettings.GetOnChanged: IEvent; 73 | begin 74 | Result := FOnChanged; 75 | end; 76 | {$ENDREGION} 77 | 78 | {$REGION 'event dispatch methods'} 79 | procedure TCallStackSettings.Changed; 80 | begin 81 | FOnChanged.Invoke(Self); 82 | end; 83 | {$ENDREGION} 84 | 85 | {$REGION 'public methods'} 86 | procedure TCallStackSettings.Assign(Source: TPersistent); 87 | var 88 | LSettings: TCallStackSettings; 89 | begin 90 | if Source is TCallStackSettings then 91 | begin 92 | LSettings := TCallStackSettings(Source); 93 | ColumnHeadersVisible := LSettings.ColumnHeadersVisible; 94 | end 95 | else 96 | inherited Assign(Source); 97 | end; 98 | {$ENDREGION} 99 | 100 | end. 101 | -------------------------------------------------------------------------------- /LogViewer.Image.View.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Image.View; 18 | 19 | interface 20 | 21 | uses 22 | Winapi.Windows, Winapi.Messages, 23 | System.SysUtils, System.Variants, System.Classes, System.Actions, 24 | Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, 25 | Vcl.StdCtrls, Vcl.ActnList, Vcl.Menus, Vcl.Mask; 26 | 27 | type 28 | TfrmImageView = class(TForm) 29 | {$REGION 'designer controls'} 30 | aclMain : TActionList; 31 | actCopy : TAction; 32 | edtHandleType : TLabeledEdit; 33 | edtHeight : TLabeledEdit; 34 | edtPixelFormat : TLabeledEdit; 35 | edtWidth : TLabeledEdit; 36 | imgBitmap : TImage; 37 | mniCopy : TMenuItem; 38 | ppmMain : TPopupMenu; 39 | sbxMain : TScrollBox; 40 | {$ENDREGION} 41 | 42 | procedure actCopyExecute(Sender: TObject); 43 | 44 | private 45 | function GetBitmap: TBitmap; 46 | 47 | public 48 | procedure Clear; 49 | procedure LoadFromStream(AStream: TStream); 50 | 51 | property Bitmap : TBitmap 52 | read GetBitmap; 53 | 54 | end; 55 | 56 | implementation 57 | 58 | {$R *.dfm} 59 | 60 | uses 61 | Vcl.Clipbrd, 62 | 63 | Spring, 64 | 65 | DDuce.Reflect; 66 | 67 | {$REGION 'property access methods'} 68 | function TfrmImageView.GetBitmap: TBitmap; 69 | begin 70 | Result := imgBitmap.Picture.Bitmap; 71 | end; 72 | {$ENDREGION} 73 | 74 | {$REGION 'action handlers'} 75 | procedure TfrmImageView.actCopyExecute(Sender: TObject); 76 | begin 77 | Clipboard.Assign(imgBitmap.Picture); 78 | end; 79 | {$ENDREGION} 80 | 81 | {$REGION 'public methods'} 82 | procedure TfrmImageView.Clear; 83 | begin 84 | imgBitmap.Picture := nil; 85 | edtWidth.Text := ''; 86 | edtHeight.Text := ''; 87 | edtPixelFormat.Text := ''; 88 | edtHandleType.Text := ''; 89 | end; 90 | 91 | procedure TfrmImageView.LoadFromStream(AStream: TStream); 92 | begin 93 | Guard.CheckNotNull(AStream, 'AStream'); 94 | AStream.Position := 0; 95 | imgBitmap.Picture.LoadFromStream(AStream); 96 | with imgBitmap.Picture do 97 | begin 98 | edtWidth.Text := imgBitmap.Width.ToString; 99 | edtHeight.Text := imgBitmap.Height.ToString; 100 | //edtPixelFormat.Text := Bitmap.PixelFormat.ToString; 101 | //edtHandleType.Text := Bitmap.HandleType.ToString; 102 | end; 103 | end; 104 | {$ENDREGION} 105 | 106 | end. 107 | -------------------------------------------------------------------------------- /LogViewer.Subscribers.FileSystem.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Subscribers.FileSystem; 18 | 19 | interface 20 | 21 | uses 22 | System.Classes, 23 | 24 | Spring, Spring.Helpers, 25 | 26 | LogViewer.Interfaces, LogViewer.Subscribers.Base; 27 | 28 | type 29 | TFileSystemSubscriber = class(TSubscriber, ISubscriber, IFileSystem) 30 | private 31 | FPosition : Int64; 32 | FStream : TFileStream; 33 | FBuffer : TMemoryStream; // message buffer 34 | 35 | public 36 | procedure AfterConstruction; override; 37 | procedure BeforeDestruction; override; 38 | 39 | procedure Poll; override; 40 | 41 | end; 42 | 43 | implementation 44 | 45 | uses 46 | System.SysUtils, 47 | 48 | DDuce.Logger, DDuce.Logger.Interfaces; 49 | 50 | {$REGION 'construction and destruction'} 51 | procedure TFileSystemSubscriber.AfterConstruction; 52 | begin 53 | inherited AfterConstruction; 54 | FStream := TFileStream.Create(SourceName, fmOpenRead or fmShareDenyNone); 55 | FBuffer := TMemoryStream.Create; 56 | FPosition := 0; 57 | end; 58 | 59 | procedure TFileSystemSubscriber.BeforeDestruction; 60 | begin 61 | FStream.Free; 62 | FBuffer.Free; 63 | inherited BeforeDestruction; 64 | end; 65 | 66 | procedure TFileSystemSubscriber.Poll; 67 | const 68 | ZERO_BUF : Integer = 0; 69 | var 70 | LTextSize : Integer; 71 | LStringStream : Shared; 72 | LMsgType : Byte; 73 | LDummy : Byte; 74 | begin 75 | if Enabled and (FPosition <> FStream.Size) then 76 | begin 77 | FStream.Seek(FPosition, soBeginning); 78 | LStringStream := TStringStream.Create; 79 | 80 | LStringStream.Value.CopyFrom(FStream, FStream.Size - FPosition); 81 | Logger.Send('Text', LStringStream.Value.DataString); 82 | 83 | FBuffer.Clear; 84 | LMsgType := Integer(lmtText); 85 | LTextSize := LStringStream.Value.Size; 86 | LDummy := 0; 87 | Logger.Send('LTextSize', LTextSize); 88 | FBuffer.Seek(0, soBeginning); 89 | FBuffer.WriteBuffer(LMsgType); 90 | FBuffer.WriteBuffer(LDummy); 91 | FBuffer.WriteBuffer(LDummy); 92 | FBuffer.WriteBuffer(LDummy); 93 | FBuffer.WriteBuffer(Now); 94 | FBuffer.WriteBuffer(LTextSize); 95 | FBuffer.WriteBuffer(LStringStream.Value.Bytes, LTextSize); 96 | FBuffer.WriteBuffer(ZERO_BUF); 97 | DoReceiveMessage(FBuffer); 98 | //Receiver.DoReceiveMessage(FBuffer, SourceId, 0, SourceName); 99 | FPosition := FStream.Size; 100 | end; 101 | end; 102 | {$ENDREGION} 103 | 104 | end. 105 | -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Diff.json: -------------------------------------------------------------------------------- 1 | { 2 | "Highlighter": { 3 | "Sample": [ 4 | "--- /path/to/original timestampr\n", 5 | "+++ /path/to/new timestampr\n", 6 | "@@ -1,4 +1,4 @@r\n", 7 | "Hellor\n", 8 | "-wrldr\n", 9 | "+world!" 10 | ], 11 | "MainRules": { 12 | "Attributes": { 13 | "Element": "Editor" 14 | }, 15 | "SubRules": { 16 | "Range": [ 17 | { 18 | "Type": "LineComment", 19 | "Attributes": { 20 | "Element": "Comment" 21 | }, 22 | "Properties": { 23 | "CloseOnEndOfLine": true, 24 | "OpenBeginningOfLine": true 25 | }, 26 | "TokenRange": { 27 | "Open": "---" 28 | } 29 | }, 30 | { 31 | "Type": "LineComment", 32 | "Attributes": { 33 | "Element": "Comment" 34 | }, 35 | "Properties": { 36 | "CloseOnEndOfLine": true, 37 | "OpenBeginningOfLine": true 38 | }, 39 | "TokenRange": { 40 | "Open": "+++" 41 | } 42 | }, 43 | { 44 | "Type": "LineComment", 45 | "Attributes": { 46 | "Element": "Comment" 47 | }, 48 | "Properties": { 49 | "CloseOnEndOfLine": true, 50 | "OpenBeginningOfLine": true 51 | }, 52 | "TokenRange": { 53 | "Open": "@@" 54 | } 55 | }, 56 | { 57 | "Type": "LineComment", 58 | "Attributes": { 59 | "Element": "Comment" 60 | }, 61 | "Properties": { 62 | "CloseOnEndOfLine": true, 63 | "OpenBeginningOfLine": true 64 | }, 65 | "TokenRange": { 66 | "Open": "***" 67 | } 68 | }, 69 | { 70 | "Type": "LineComment", 71 | "Attributes": { 72 | "Element": "ReservedWord" 73 | }, 74 | "Properties": { 75 | "CloseOnEndOfLine": true, 76 | "OpenBeginningOfLine": true 77 | }, 78 | "TokenRange": { 79 | "Open": "-" 80 | } 81 | }, 82 | { 83 | "Type": "LineComment", 84 | "Attributes": { 85 | "Element": "Attribute" 86 | }, 87 | "Properties": { 88 | "CloseOnEndOfLine": true, 89 | "OpenBeginningOfLine": true 90 | }, 91 | "TokenRange": { 92 | "Open": "+" 93 | } 94 | }, 95 | { 96 | "Type": "LineComment", 97 | "Attributes": { 98 | "Element": "String" 99 | }, 100 | "Properties": { 101 | "CloseOnEndOfLine": true, 102 | "OpenBeginningOfLine": true 103 | }, 104 | "TokenRange": { 105 | "Open": "!" 106 | } 107 | } 108 | ] 109 | } 110 | } 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /LogViewer.Watches.Settings.View.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Watches.Settings.View; 18 | 19 | interface 20 | 21 | uses 22 | Winapi.Windows, Winapi.Messages, 23 | System.SysUtils, System.Variants, System.Classes, 24 | Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, 25 | 26 | LogViewer.Watches.Settings; 27 | 28 | type 29 | TfrmWatchSettings = class(TForm) 30 | chkOnlyTrackChanges : TCheckBox; 31 | chkSyncWithSelectedMessage : TCheckBox; 32 | chkShowWatchHistory : TCheckBox; 33 | chkHideColumnHeaders : TCheckBox; 34 | 35 | {$REGION 'event handlers'} 36 | procedure chkOnlyTrackChangesClick(Sender: TObject); 37 | procedure chkShowWatchHistoryClick(Sender: TObject); 38 | procedure chkSyncWithSelectedMessageClick(Sender: TObject); 39 | procedure chkHideColumnHeadersClick(Sender: TObject); 40 | {$ENDREGION} 41 | 42 | private 43 | FSettings : TWatchSettings; 44 | 45 | public 46 | constructor Create( 47 | AOwner : TComponent; 48 | ASettings : TWatchSettings 49 | ); reintroduce; 50 | 51 | destructor Destroy; override; 52 | 53 | end; 54 | 55 | implementation 56 | 57 | {$R *.dfm} 58 | 59 | {$REGION 'construction and destruction'} 60 | constructor TfrmWatchSettings.Create(AOwner: TComponent; 61 | ASettings: TWatchSettings); 62 | begin 63 | inherited Create(AOwner); 64 | FSettings := ASettings; 65 | chkOnlyTrackChanges.Checked := FSettings.OnlyTrackChanges; 66 | chkSyncWithSelectedMessage.Checked := FSettings.SyncWithSelection; 67 | chkShowWatchHistory.Checked := FSettings.WatchHistoryVisible; 68 | chkHideColumnHeaders.Checked := not FSettings.ColumnHeadersVisible; 69 | end; 70 | 71 | destructor TfrmWatchSettings.Destroy; 72 | begin 73 | FSettings := nil; 74 | inherited Destroy; 75 | end; 76 | {$ENDREGION} 77 | 78 | {$REGION 'event handlers'} 79 | procedure TfrmWatchSettings.chkHideColumnHeadersClick(Sender: TObject); 80 | begin 81 | FSettings.ColumnHeadersVisible := not (Sender as TCheckBox).Checked; 82 | end; 83 | 84 | procedure TfrmWatchSettings.chkOnlyTrackChangesClick(Sender: TObject); 85 | begin 86 | FSettings.OnlyTrackChanges := (Sender as TCheckBox).Checked; 87 | end; 88 | 89 | procedure TfrmWatchSettings.chkShowWatchHistoryClick(Sender: TObject); 90 | begin 91 | FSettings.WatchHistoryVisible := (Sender as TCheckBox).Checked; 92 | end; 93 | 94 | procedure TfrmWatchSettings.chkSyncWithSelectedMessageClick(Sender: TObject); 95 | begin 96 | FSettings.SyncWithSelection := (Sender as TCheckBox).Checked; 97 | end; 98 | {$ENDREGION} 99 | 100 | end. 101 | -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/INI.json: -------------------------------------------------------------------------------- 1 | { 2 | "Highlighter": { 3 | "Sample": [ 4 | "; Comment\r\n", 5 | "[Section]\r\n", 6 | "Name=Value" 7 | ], 8 | "MainRules": { 9 | "Attributes": { 10 | "Element": "Editor" 11 | }, 12 | "SubRules": { 13 | "Range": [ 14 | { 15 | "Type": "LineComment", 16 | "Attributes": { 17 | "Element": "Comment" 18 | }, 19 | "Properties": { 20 | "CloseOnEndOfLine": true 21 | }, 22 | "TokenRange": { 23 | "Open": "; " 24 | } 25 | }, 26 | { 27 | "Type": "LineComment", 28 | "Attributes": { 29 | "Element": "Comment" 30 | }, 31 | "Properties": { 32 | "CloseOnEndOfLine": true, 33 | "OpenBeginningOfLine": true 34 | }, 35 | "TokenRange": { 36 | "Open": "# " 37 | } 38 | }, 39 | { 40 | "Type": "String", 41 | "Attributes": { 42 | "Element": "ReservedWord" 43 | }, 44 | "Properties": { 45 | "CloseOnEndOfLine": true, 46 | "OpenBeginningOfLine": true 47 | }, 48 | "TokenRange": { 49 | "Open": "[", 50 | "Close": "]" 51 | } 52 | }, 53 | { 54 | "Type": "String", 55 | "Attributes": { 56 | "Element": "String" 57 | }, 58 | "Properties": { 59 | "CloseOnEndOfLine": true 60 | }, 61 | "TokenRange": { 62 | "Open": "=" 63 | } 64 | } 65 | ], 66 | "KeyList": [ 67 | { 68 | "Type": "Symbol", 69 | "Words": [ 70 | "=" 71 | ], 72 | "Attributes": { 73 | "Element": "Symbol" 74 | } 75 | } 76 | ] 77 | } 78 | } 79 | }, 80 | "CodeFolding": { 81 | "Ranges": [ 82 | { 83 | "Options": { 84 | "MatchingPairHighlight": false 85 | }, 86 | "SkipRegion": [ 87 | { 88 | "OpenToken": ";", 89 | "RegionType": "SingleLine" 90 | } 91 | ], 92 | "FoldRegion": [ 93 | { 94 | "OpenToken": "[", 95 | "CloseToken": "[", 96 | "Properties": { 97 | "OpenTokenBeginningOfLine": true, 98 | "CloseTokenBeginningOfLine": true, 99 | "OpenIsClose": true, 100 | "ShowGuideLine": false, 101 | "TokenEndIsPreviousLine": true, 102 | "OpenTokenEnd": "]", 103 | "BreakCharFollows": false 104 | } 105 | } 106 | ] 107 | } 108 | ] 109 | }, 110 | "MatchingPair": { 111 | "Pairs": [ 112 | { 113 | "OpenToken": "[", 114 | "CloseToken": "]" 115 | } 116 | ] 117 | }, 118 | "CompletionProposal": { 119 | "SkipRegion": [ 120 | { 121 | "OpenToken": ";", 122 | "RegionType": "SingleLine" 123 | } 124 | ] 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /LogViewer.Receivers.FileSystem.Settings.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Receivers.FileSystem.Settings; 18 | 19 | interface 20 | 21 | uses 22 | System.Classes, 23 | 24 | Spring; 25 | 26 | type 27 | TFileSystemSettings = class(TPersistent) 28 | private 29 | FOnChanged : Event; 30 | FEnabled : Boolean; 31 | FPathNames : TStrings; 32 | 33 | protected 34 | {$REGION 'property access methods'} 35 | function GetPathNames: TStrings; 36 | function GetEnabled: Boolean; 37 | procedure SetEnabled(const Value: Boolean); 38 | function GetOnChanged: IEvent; 39 | {$ENDREGION} 40 | 41 | procedure Changed; 42 | 43 | public 44 | procedure AfterConstruction; override; 45 | destructor Destroy; override; 46 | 47 | procedure Assign(Source: TPersistent); override; 48 | 49 | property OnChanged: IEvent 50 | read GetOnChanged; 51 | 52 | published 53 | property Enabled: Boolean 54 | read GetEnabled write SetEnabled; 55 | 56 | property PathNames: TStrings 57 | read GetPathNames; 58 | 59 | end; 60 | 61 | implementation 62 | 63 | {$REGION 'construction and destruction'} 64 | procedure TFileSystemSettings.AfterConstruction; 65 | begin 66 | inherited AfterConstruction; 67 | FPathNames := TStringList.Create; 68 | end; 69 | 70 | destructor TFileSystemSettings.Destroy; 71 | begin 72 | FPathNames.Free; 73 | inherited Destroy; 74 | end; 75 | {$ENDREGION} 76 | 77 | {$REGION 'property access methods'} 78 | function TFileSystemSettings.GetEnabled: Boolean; 79 | begin 80 | Result := FEnabled; 81 | end; 82 | 83 | procedure TFileSystemSettings.SetEnabled(const Value: Boolean); 84 | begin 85 | if Value <> Enabled then 86 | begin 87 | FEnabled := Value; 88 | Changed; 89 | end; 90 | end; 91 | 92 | function TFileSystemSettings.GetOnChanged: IEvent; 93 | begin 94 | Result := FOnChanged; 95 | end; 96 | 97 | function TFileSystemSettings.GetPathNames: TStrings; 98 | begin 99 | Result := FPathNames; 100 | end; 101 | {$ENDREGION} 102 | 103 | {$REGION 'protected methods'} 104 | procedure TFileSystemSettings.Changed; 105 | begin 106 | FOnChanged.Invoke(Self); 107 | end; 108 | {$ENDREGION} 109 | 110 | {$REGION 'public methods'} 111 | procedure TFileSystemSettings.Assign(Source: TPersistent); 112 | var 113 | LSettings: TFileSystemSettings; 114 | begin 115 | if Source is TFileSystemSettings then 116 | begin 117 | LSettings := TFileSystemSettings(Source); 118 | Enabled := LSettings.Enabled; 119 | FPathNames.Assign(LSettings.PathNames); 120 | end 121 | else 122 | inherited Assign(Source); 123 | end; 124 | {$ENDREGION} 125 | end. 126 | -------------------------------------------------------------------------------- /LogViewer.MessageList.Settings.View.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.MessageList.Settings.View; 18 | 19 | interface 20 | 21 | uses 22 | Winapi.Windows, Winapi.Messages, 23 | System.SysUtils, System.Variants, System.Classes, 24 | Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, 25 | 26 | LogViewer.MessageList.Settings; 27 | 28 | type 29 | TfrmViewSettings = class(TForm) 30 | chkSmartTimeStamps : TCheckBox; 31 | chkAutoScrollMessages : TCheckBox; 32 | chkAutoFilterMessages : TCheckBox; 33 | chkDynamicAutoSizeColumns : TCheckBox; 34 | chkHideColumnHeaders : TCheckBox; 35 | 36 | procedure chkSmartTimeStampsClick(Sender: TObject); 37 | procedure chkAutoScrollMessagesClick(Sender: TObject); 38 | procedure chkAutoFilterMessagesClick(Sender: TObject); 39 | procedure chkDynamicAutoSizeColumnsClick(Sender: TObject); 40 | procedure chkHideColumnHeadersClick(Sender: TObject); 41 | 42 | private 43 | FSettings : TMessageListSettings; 44 | 45 | protected 46 | procedure UpdateActions; override; 47 | 48 | public 49 | constructor Create( 50 | AOwner : TComponent; 51 | ASettings : TMessageListSettings 52 | ); reintroduce; virtual; 53 | 54 | end; 55 | 56 | implementation 57 | 58 | {$R *.dfm} 59 | 60 | {$REGION 'construction and destruction'} 61 | constructor TfrmViewSettings.Create(AOwner: TComponent; 62 | ASettings: TMessageListSettings); 63 | begin 64 | inherited Create(AOwner); 65 | FSettings := ASettings; 66 | end; 67 | {$ENDREGION} 68 | 69 | {$REGION 'event handlers'} 70 | procedure TfrmViewSettings.chkAutoFilterMessagesClick(Sender: TObject); 71 | begin 72 | FSettings.AutoFilterMessages := (Sender as TCheckBox).Checked; 73 | end; 74 | 75 | procedure TfrmViewSettings.chkAutoScrollMessagesClick(Sender: TObject); 76 | begin 77 | FSettings.AutoScrollMessages := (Sender as TCheckBox).Checked; 78 | end; 79 | 80 | procedure TfrmViewSettings.chkDynamicAutoSizeColumnsClick(Sender: TObject); 81 | begin 82 | FSettings.DynamicAutoSizeColumns := (Sender as TCheckBox).Checked; 83 | end; 84 | 85 | procedure TfrmViewSettings.chkHideColumnHeadersClick(Sender: TObject); 86 | begin 87 | FSettings.ColumnHeadersVisible := not (Sender as TCheckBox).Checked; 88 | end; 89 | 90 | procedure TfrmViewSettings.chkSmartTimeStampsClick(Sender: TObject); 91 | begin 92 | FSettings.SmartTimeStamps := (Sender as TCheckBox).Checked; 93 | end; 94 | {$ENDREGION} 95 | 96 | {$REGION 'public methods'} 97 | procedure TfrmViewSettings.UpdateActions; 98 | begin 99 | inherited UpdateActions; 100 | chkSmartTimeStamps.Checked := FSettings.SmartTimeStamps; 101 | chkAutoScrollMessages.Checked := FSettings.AutoScrollMessages; 102 | chkAutoFilterMessages.Checked := FSettings.AutoFilterMessages; 103 | chkDynamicAutoSizeColumns.Checked := FSettings.DynamicAutoSizeColumns; 104 | chkHideColumnHeaders.Checked := not FSettings.ColumnHeadersVisible; 105 | end; 106 | {$ENDREGION} 107 | 108 | end. 109 | -------------------------------------------------------------------------------- /LogViewer.Receivers.Winipc.Settings.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Receivers.Winipc.Settings; 18 | 19 | { Persistable settings for WinIPC receivers. } 20 | 21 | interface 22 | 23 | uses 24 | System.Classes, 25 | 26 | Spring; 27 | 28 | type 29 | TWinipcSettings = class(TPersistent) 30 | const 31 | DEFAULT_POLLING_INTERVAL = 10; 32 | 33 | private 34 | FOnChanged : Event; 35 | FEnabled : Boolean; 36 | FPollingInterval : Integer; 37 | 38 | protected 39 | {$REGION 'property access methods'} 40 | function GetOnChanged: IEvent; 41 | function GetEnabled: Boolean; 42 | procedure SetEnabled(const Value: Boolean); 43 | function GetPollingInterval: Integer; 44 | procedure SetPollingInterval(const Value: Integer); 45 | {$ENDREGION} 46 | 47 | procedure Changed; 48 | 49 | public 50 | procedure AfterConstruction; override; 51 | destructor Destroy; override; 52 | 53 | procedure Assign(Source: TPersistent); override; 54 | 55 | property OnChanged: IEvent 56 | read GetOnChanged; 57 | 58 | published 59 | property Enabled: Boolean 60 | read GetEnabled write SetEnabled; 61 | 62 | property PollingInterval: Integer // in ms 63 | read GetPollingInterval write SetPollingInterval 64 | default DEFAULT_POLLING_INTERVAL; 65 | 66 | end; 67 | 68 | implementation 69 | 70 | {$REGION 'construction and destruction'} 71 | procedure TWinipcSettings.AfterConstruction; 72 | begin 73 | inherited AfterConstruction; 74 | FPollingInterval := DEFAULT_POLLING_INTERVAL; 75 | FOnChanged.UseFreeNotification := False; 76 | end; 77 | 78 | destructor TWinipcSettings.Destroy; 79 | begin 80 | FOnChanged.RemoveAll(Self); 81 | inherited Destroy; 82 | end; 83 | {$ENDREGION} 84 | 85 | {$REGION 'property access methods'} 86 | function TWinipcSettings.GetEnabled: Boolean; 87 | begin 88 | Result := FEnabled; 89 | end; 90 | 91 | procedure TWinipcSettings.SetEnabled(const Value: Boolean); 92 | begin 93 | if Value <> Enabled then 94 | begin 95 | FEnabled := Value; 96 | Changed; 97 | end; 98 | end; 99 | 100 | function TWinipcSettings.GetOnChanged: IEvent; 101 | begin 102 | Result := FOnChanged; 103 | end; 104 | 105 | function TWinipcSettings.GetPollingInterval: Integer; 106 | begin 107 | Result := FPollingInterval; 108 | end; 109 | 110 | procedure TWinipcSettings.SetPollingInterval(const Value: Integer); 111 | begin 112 | if Value <> PollingInterval then 113 | begin 114 | FPollingInterval := Value; 115 | Changed; 116 | end; 117 | end; 118 | {$ENDREGION} 119 | 120 | {$REGION 'protected methods'} 121 | procedure TWinipcSettings.Changed; 122 | begin 123 | FOnChanged.Invoke(Self); 124 | end; 125 | {$ENDREGION} 126 | 127 | {$REGION 'public methods'} 128 | procedure TWinipcSettings.Assign(Source: TPersistent); 129 | var 130 | LSettings: TWinipcSettings; 131 | begin 132 | if Source is TWinipcSettings then 133 | begin 134 | LSettings := TWinipcSettings(Source); 135 | Enabled := LSettings.Enabled; 136 | end 137 | else 138 | inherited Assign(Source); 139 | end; 140 | {$ENDREGION} 141 | end. 142 | -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/MIME.json: -------------------------------------------------------------------------------- 1 | { 2 | "Highlighter": { 3 | "Sample": [ 4 | "MIME-Version: 1.0\r\n", 5 | "Content-Type: multipart/mixed; boundary=frontier\r\n", 6 | "\r\n", 7 | "This is a message with multiple parts in MIME format.\r\n", 8 | "--frontier\r\n", 9 | "Content-Type: text/plain\r\n", 10 | "\r\n", 11 | "This is the body of the message.\r\n", 12 | "--frontier\r\n", 13 | "Content-Type: application/octet-stream\r\n", 14 | "Content-Transfer-Encoding: base64\r\n", 15 | "\r\n", 16 | "PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg\r\n", 17 | "Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==\r\n", 18 | "--frontier--" 19 | ], 20 | "MainRules": { 21 | "Attributes": { 22 | "Element": "Editor" 23 | }, 24 | "SubRules": { 25 | "Range": [ 26 | { 27 | "Type": "LineComment", 28 | "Attributes": { 29 | "Element": "Comment" 30 | }, 31 | "Properties": { 32 | "CloseOnEndOfLine": true 33 | }, 34 | "TokenRange": { 35 | "Open": "--" 36 | } 37 | }, 38 | { 39 | "Type": "String", 40 | "Attributes": { 41 | "Element": "String" 42 | }, 43 | "Properties": { 44 | "CloseOnEndOfLine": true 45 | }, 46 | "TokenRange": { 47 | "Open": "=?", 48 | "Close": "?=" 49 | } 50 | }, 51 | { 52 | "Type": "ReservedWord", 53 | "Attributes": { 54 | "Element": "ReservedWord" 55 | }, 56 | "Delimiters": " :", 57 | "Properties": { 58 | "CloseOnEndOfLine": true, 59 | "CloseOnTerm": true 60 | }, 61 | "TokenRange": { 62 | "Open": "Content-" 63 | } 64 | } 65 | ], 66 | "KeyList": [ 67 | { 68 | "Type": "ReservedWord", 69 | "Words": [ 70 | "boundary", 71 | "MIME-Version", 72 | "Subject" 73 | ], 74 | "Attributes": { 75 | "Element": "ReservedWord" 76 | } 77 | }, 78 | { 79 | "Type": "Symbol", 80 | "Words": [ 81 | ":", 82 | ";", 83 | "<", 84 | ">", 85 | "=", 86 | "/", 87 | "*", 88 | ".", 89 | ",", 90 | "-", 91 | "+", 92 | "(", 93 | ")", 94 | "[", 95 | "]", 96 | "{", 97 | "}" 98 | ], 99 | "Attributes": { 100 | "Element": "Symbol" 101 | } 102 | } 103 | ], 104 | "Set": [ 105 | { 106 | "Type": "Numbers", 107 | "Symbols": "0123456789", 108 | "Attributes": { 109 | "Element": "Number" 110 | } 111 | }, 112 | { 113 | "Type": "Float", 114 | "Symbols": ".0123456789", 115 | "Attributes": { 116 | "Element": "Number" 117 | } 118 | } 119 | ] 120 | } 121 | } 122 | }, 123 | "MatchingPair": { 124 | "Pairs": [ 125 | { 126 | "OpenToken": "(", 127 | "CloseToken": ")" 128 | }, 129 | { 130 | "OpenToken": "[", 131 | "CloseToken": "]" 132 | }, 133 | { 134 | "OpenToken": "{", 135 | "CloseToken": "}" 136 | } 137 | ] 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /LogViewer.Dashboard.Data.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Dashboard.Data; 18 | 19 | { Data structure holding the data displayed in the dashboard treeview. } 20 | 21 | interface 22 | 23 | uses 24 | System.Classes, 25 | Vcl.Forms, 26 | 27 | LogViewer.Interfaces; 28 | 29 | type 30 | TDashboardData = class 31 | private 32 | FReceiver : IChannelReceiver; 33 | FSubscriber : ISubscriber; 34 | FCaption : string; 35 | 36 | protected 37 | {$REGION 'property access methods'} 38 | function GetSubscriber: ISubscriber; 39 | procedure SetSubscriber(const Value: ISubscriber); 40 | function GetReceiver: IChannelReceiver; 41 | procedure SetReceiver(const Value: IChannelReceiver); 42 | function GetCaption: string; 43 | {$ENDREGION} 44 | 45 | public 46 | constructor Create( 47 | AReceiver : IChannelReceiver; 48 | ASubscriber : ISubscriber = nil 49 | ); 50 | destructor Destroy; override; 51 | 52 | property Caption: string 53 | read GetCaption; 54 | 55 | property Receiver: IChannelReceiver 56 | read GetReceiver write SetReceiver; 57 | 58 | property Subscriber: ISubscriber 59 | read GetSubscriber write SetSubscriber; 60 | 61 | end; 62 | 63 | implementation 64 | 65 | uses 66 | System.SysUtils, 67 | 68 | LogViewer.Resources; 69 | 70 | {$REGION 'construction and destruction'} 71 | constructor TDashboardData.Create(AReceiver: IChannelReceiver; 72 | ASubscriber: ISubscriber); 73 | begin 74 | if not Assigned(ASubscriber) then 75 | begin 76 | Receiver := AReceiver; 77 | if Supports(Receiver, IWinIpc) then 78 | begin 79 | FCaption := SReceiverCaptionWinIPC; 80 | end 81 | else if Supports(Receiver, IZmq) then 82 | begin 83 | FCaption := SReceiverCaptionZeroMQ; 84 | end 85 | else if Supports(Receiver, IWinOds) then 86 | begin 87 | FCaption := SReceiverCaptionWinODS; 88 | end 89 | else if Supports(Receiver, IComPort) then 90 | begin 91 | FCaption := SReceiverCaptionComPort; 92 | end 93 | else if Supports(Receiver, IFileSystem) then 94 | begin 95 | FCaption := SReceiverCaptionFileSystem; 96 | end 97 | end; 98 | Subscriber := ASubscriber; 99 | if Assigned(Subscriber) then 100 | begin 101 | FCaption := Subscriber.SourceName; 102 | end; 103 | end; 104 | 105 | destructor TDashboardData.Destroy; 106 | begin 107 | FReceiver := nil; 108 | FSubscriber := nil; 109 | inherited Destroy; 110 | end; 111 | {$ENDREGION} 112 | 113 | {$REGION 'property access methods'} 114 | function TDashboardData.GetCaption: string; 115 | begin 116 | Result := FCaption; 117 | end; 118 | 119 | function TDashboardData.GetReceiver: IChannelReceiver; 120 | begin 121 | Result := FReceiver; 122 | end; 123 | 124 | procedure TDashboardData.SetReceiver(const Value: IChannelReceiver); 125 | begin 126 | FReceiver := Value; 127 | end; 128 | 129 | function TDashboardData.GetSubscriber: ISubscriber; 130 | begin 131 | Result := FSubscriber; 132 | end; 133 | 134 | procedure TDashboardData.SetSubscriber(const Value: ISubscriber); 135 | begin 136 | FSubscriber := Value; 137 | end; 138 | {$ENDREGION} 139 | 140 | end. 141 | 142 | -------------------------------------------------------------------------------- /LogViewer.Receivers.Winods.Settings.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Receivers.Winods.Settings; 18 | 19 | { Persistable settings for Winods receivers. } 20 | 21 | interface 22 | 23 | uses 24 | System.Classes, 25 | 26 | Spring; 27 | 28 | type 29 | TWinodsSettings = class(TPersistent) 30 | private 31 | FOnChanged : Event; 32 | FProcessId : Integer; 33 | FProcessName : string; 34 | FEnabled : Boolean; 35 | 36 | {$REGION 'property access methods'} 37 | function GetOnChanged: IEvent; 38 | function GetProcessId: Integer; 39 | function GetProcessName: string; 40 | procedure SetProcessId(const Value: Integer); 41 | procedure SetProcessName(const Value: string); 42 | function GetEnabled: Boolean; 43 | procedure SetEnabled(const Value: Boolean); 44 | {$ENDREGION} 45 | 46 | protected 47 | procedure Changed; 48 | 49 | public 50 | procedure Assign(Source: TPersistent); override; 51 | 52 | property ProcessName: string 53 | read GetProcessName write SetProcessName; 54 | 55 | property ProcessId: Integer 56 | read GetProcessId write SetProcessId; 57 | 58 | property OnChanged: IEvent 59 | read GetOnChanged; 60 | 61 | published 62 | property Enabled: Boolean 63 | read GetEnabled write SetEnabled; 64 | 65 | end; 66 | 67 | implementation 68 | 69 | uses 70 | DDuce.Utils.Winapi; 71 | 72 | {$REGION 'property access methods'} 73 | function TWinodsSettings.GetEnabled: Boolean; 74 | begin 75 | Result := FEnabled; 76 | end; 77 | 78 | procedure TWinodsSettings.SetEnabled(const Value: Boolean); 79 | begin 80 | if Value <> Enabled then 81 | begin 82 | FEnabled := Value; 83 | Changed; 84 | end; 85 | end; 86 | 87 | function TWinodsSettings.GetOnChanged: IEvent; 88 | begin 89 | Result := FOnChanged; 90 | end; 91 | 92 | function TWinodsSettings.GetProcessId: Integer; 93 | begin 94 | Result := FProcessId; 95 | end; 96 | 97 | 98 | procedure TWinodsSettings.SetProcessId(const Value: Integer); 99 | begin 100 | if Value <> ProcessId then 101 | begin 102 | FProcessId := Value; 103 | Changed; 104 | end; 105 | end; 106 | 107 | function TWinodsSettings.GetProcessName: string; 108 | begin 109 | Result := FProcessName; 110 | end; 111 | 112 | procedure TWinodsSettings.SetProcessName(const Value: string); 113 | begin 114 | if Value <> ProcessName then 115 | begin 116 | FProcessName := Value; 117 | Changed; 118 | end; 119 | end; 120 | {$ENDREGION} 121 | 122 | {$REGION 'event dispatch methods'} 123 | procedure TWinodsSettings.Changed; 124 | begin 125 | FOnChanged.Invoke(Self); 126 | end; 127 | {$ENDREGION} 128 | 129 | {$REGION 'public methods'} 130 | procedure TWinodsSettings.Assign(Source: TPersistent); 131 | var 132 | LSettings: TWinodsSettings; 133 | begin 134 | if Source is TWinodsSettings then 135 | begin 136 | LSettings := TWinodsSettings(Source); 137 | ProcessName := LSettings.ProcessName; 138 | ProcessId := LSettings.ProcessId; 139 | Enabled := LSettings.Enabled; 140 | end 141 | else 142 | inherited Assign(Source); 143 | end; 144 | {$ENDREGION} 145 | end. 146 | -------------------------------------------------------------------------------- /LogViewer.DisplayValues.Settings.ValueManager.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.DisplayValues.Settings.ValueManager; 18 | 19 | interface 20 | 21 | { The ValueManager class allows us to customize the property inspector used in 22 | the settings dialog. } 23 | 24 | uses 25 | System.Classes, System.Rtti, System.Types, 26 | Vcl.Graphics, 27 | 28 | zObjInspTypes, zValueManager; 29 | 30 | type 31 | TDisplayValuesValueManager = class(TzCustomValueManager) 32 | public 33 | procedure SetValue( 34 | const PItem : PPropItem; 35 | var Value : TValue 36 | ); override; 37 | 38 | function HasButton(const PItem: PPropItem): Boolean; override; 39 | function HasList(const PItem: PPropItem): Boolean; override; 40 | function HasDialog(const PItem: PPropItem): Boolean; override; 41 | 42 | function GetDialog(const PItem: PPropItem): TComponentClass; override; 43 | function DialogResultValue( 44 | const PItem : PPropItem; 45 | Dialog : TComponent 46 | ): TValue; override; 47 | 48 | procedure GetListItems( 49 | const PItem : PPropItem; 50 | Items : TStrings 51 | ); override; 52 | 53 | end; 54 | 55 | implementation 56 | 57 | uses 58 | System.StrUtils, System.UITypes, 59 | Vcl.Dialogs, 60 | 61 | DDuce.Settings.TextFormat, DDuce.Logger; 62 | 63 | {$REGION 'public methods'} 64 | function TDisplayValuesValueManager.DialogResultValue( 65 | const PItem: PPropItem; Dialog: TComponent): TValue; 66 | var 67 | S : string; 68 | TF : TTextFormatSettings; 69 | begin 70 | if MatchStr(PItem.Name, ['FontName']) then 71 | begin 72 | S := TFontDialog(Dialog).Font.Name; 73 | Result := GetValue(PItem, S); 74 | TF := (PItem.Component) as TTextFormatSettings; 75 | TF.FontColor := TFontDialog(Dialog).Font.Color; 76 | TF.FontSize := TFontDialog(Dialog).Font.Size; 77 | TF.FontStyle := TFontDialog(Dialog).Font.Style; 78 | end 79 | else 80 | begin 81 | Result := inherited DialogResultValue(PItem, Dialog) 82 | end; 83 | end; 84 | 85 | function TDisplayValuesValueManager.GetDialog( 86 | const PItem: PPropItem): TComponentClass; 87 | begin 88 | if MatchStr(PItem.Name, ['FontName']) then 89 | Result := TFontDialog 90 | else 91 | Result := inherited GetDialog(PItem) 92 | end; 93 | 94 | procedure TDisplayValuesValueManager.GetListItems(const PItem: PPropItem; 95 | Items: TStrings); 96 | begin 97 | inherited GetListItems(PItem, Items); 98 | end; 99 | 100 | function TDisplayValuesValueManager.HasButton( 101 | const PItem: PPropItem): Boolean; 102 | begin 103 | Result := inherited HasButton(PItem); 104 | end; 105 | 106 | function TDisplayValuesValueManager.HasDialog( 107 | const PItem: PPropItem): Boolean; 108 | begin 109 | if MatchStr(PItem.Name, ['FontName']) then 110 | begin 111 | Result := True; 112 | end 113 | else 114 | Result := inherited HasDialog(PItem); 115 | end; 116 | 117 | function TDisplayValuesValueManager.HasList( 118 | const PItem: PPropItem): Boolean; 119 | begin 120 | Result := inherited HasList(PItem); 121 | end; 122 | 123 | procedure TDisplayValuesValueManager.SetValue(const PItem: PPropItem; 124 | var Value: TValue); 125 | begin 126 | inherited SetValue(PItem, Value); 127 | end; 128 | {$ENDREGION} 129 | 130 | end. 131 | 132 | 133 | -------------------------------------------------------------------------------- /LogViewer.Subscribers.Winipc.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Subscribers.Winipc; 18 | 19 | { WinIPC subscriber. } 20 | 21 | interface 22 | 23 | uses 24 | System.Classes, 25 | 26 | Spring, ZeroMQ, 27 | 28 | LogViewer.Interfaces, LogViewer.Subscribers.Base; 29 | 30 | type 31 | TWinipcSubscriber = class(TSubscriber, ISubscriber, IWinipc) 32 | private 33 | FZmq : Weak; 34 | FSubscriber : IZMQPair; 35 | FPoll : IZMQPoll; 36 | FZmqStream : TStringStream; 37 | 38 | protected 39 | function GetIsSourceActive: Boolean; override; 40 | 41 | procedure CreateSubscriberSocket(const AEndPoint: string); 42 | procedure Close; override; 43 | procedure Poll; override; 44 | 45 | public 46 | constructor Create( 47 | const AReceiver : IChannelReceiver; 48 | const AZmq : IZeroMQ; 49 | const AEndPoint : string; 50 | ASourceId : UInt32; 51 | const AKey : string; 52 | const ASourceName : string; 53 | AEnabled : Boolean 54 | ); reintroduce; virtual; 55 | destructor Destroy; override; 56 | 57 | end; 58 | 59 | implementation 60 | 61 | uses 62 | System.SysUtils, 63 | 64 | DDuce.Utils.Winapi, 65 | DDuce.Logger; 66 | 67 | {$REGION 'construction and destruction'} 68 | constructor TWinipcSubscriber.Create(const AReceiver: IChannelReceiver; 69 | const AZmq: IZeroMQ; const AEndPoint: string; ASourceId: UInt32; const AKey, 70 | ASourceName: string; AEnabled: Boolean); 71 | begin 72 | Logger.Track(Self, 'Create'); 73 | FZmq := AZmq; 74 | FZmqStream := TStringStream.Create; 75 | CreateSubscriberSocket(AEndPoint); 76 | inherited Create(AReceiver, ASourceId, AKey, ASourceName, AEnabled); 77 | end; 78 | 79 | destructor TWinipcSubscriber.Destroy; 80 | begin 81 | Logger.Track(Self, 'Destroy'); 82 | FZmqStream.Free; 83 | FSubscriber.Close; 84 | FPoll := nil; 85 | FSubscriber := nil; 86 | FZmq := nil; 87 | inherited Destroy; 88 | end; 89 | 90 | procedure TWinipcSubscriber.CreateSubscriberSocket(const AEndPoint: string); 91 | begin 92 | FSubscriber := FZmq.Target.Start(ZMQSocket.Subscriber); 93 | Guard.CheckTrue( 94 | FSubscriber.Connect(AEndPoint) = 0, 95 | Format('Connect to %s failed.', [AEndPoint]) 96 | ); 97 | Guard.CheckTrue(FSubscriber.Subscribe('') = 0, 'Subscribe failed'); 98 | FPoll := FZmq.Target.Poller; 99 | FPoll.RegisterPair( 100 | FSubscriber, 101 | [PollEvent.PollIn], 102 | procedure(Event: PollEvents) 103 | begin 104 | FZmqStream.WriteString(FSubscriber.ReceiveString); 105 | DoReceiveMessage(FZmqStream); 106 | FZmqStream.Clear; 107 | end 108 | ); 109 | end; 110 | {$ENDREGION} 111 | 112 | {$REGION 'property access methods'} 113 | function TWinipcSubscriber.GetIsSourceActive: Boolean; 114 | begin 115 | Result := CheckProcessExists(SourceId); 116 | end; 117 | {$ENDREGION} 118 | 119 | {$REGION 'protected methods'} 120 | procedure TWinipcSubscriber.Poll; 121 | begin 122 | if Enabled then 123 | begin 124 | while FPoll.PollOnce(1) > 0 do 125 | begin 126 | FPoll.FireEvents; 127 | end; 128 | end; 129 | end; 130 | 131 | procedure TWinipcSubscriber.Close; 132 | begin 133 | inherited Close; 134 | FSubscriber.Close; 135 | end; 136 | {$ENDREGION} 137 | 138 | end. 139 | -------------------------------------------------------------------------------- /LogViewer.Image.View.dfm: -------------------------------------------------------------------------------- 1 | object frmImageView: TfrmImageView 2 | Left = 0 3 | Top = 0 4 | ClientHeight = 909 5 | ClientWidth = 684 6 | Color = clWhite 7 | DoubleBuffered = True 8 | Font.Charset = DEFAULT_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -11 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | ShowHint = True 14 | TextHeight = 13 15 | object edtPixelFormat: TLabeledEdit 16 | Left = 303 17 | Top = 3 18 | Width = 73 19 | Height = 17 20 | Alignment = taCenter 21 | BevelOuter = bvNone 22 | BevelKind = bkFlat 23 | BorderStyle = bsNone 24 | EditLabel.Width = 63 25 | EditLabel.Height = 17 26 | EditLabel.Caption = 'Pixel format:' 27 | Font.Charset = DEFAULT_CHARSET 28 | Font.Color = clWindowText 29 | Font.Height = -11 30 | Font.Name = 'Segoe UI' 31 | Font.Style = [fsBold] 32 | LabelPosition = lpLeft 33 | ParentFont = False 34 | ReadOnly = True 35 | TabOrder = 0 36 | Text = '' 37 | end 38 | object edtHandleType: TLabeledEdit 39 | Left = 448 40 | Top = 3 41 | Width = 73 42 | Height = 17 43 | Alignment = taCenter 44 | BevelOuter = bvNone 45 | BevelKind = bkFlat 46 | BorderStyle = bsNone 47 | EditLabel.Width = 65 48 | EditLabel.Height = 17 49 | EditLabel.Caption = 'Handle type:' 50 | Font.Charset = DEFAULT_CHARSET 51 | Font.Color = clWindowText 52 | Font.Height = -11 53 | Font.Name = 'Segoe UI' 54 | Font.Style = [fsBold] 55 | LabelPosition = lpLeft 56 | ParentFont = False 57 | ReadOnly = True 58 | TabOrder = 1 59 | Text = '' 60 | end 61 | object edtHeight: TLabeledEdit 62 | Left = 160 63 | Top = 3 64 | Width = 73 65 | Height = 17 66 | Alignment = taCenter 67 | BevelOuter = bvNone 68 | BevelKind = bkFlat 69 | BorderStyle = bsNone 70 | EditLabel.Width = 38 71 | EditLabel.Height = 17 72 | EditLabel.Caption = 'Height:' 73 | Font.Charset = DEFAULT_CHARSET 74 | Font.Color = clWindowText 75 | Font.Height = -11 76 | Font.Name = 'Segoe UI' 77 | Font.Style = [fsBold] 78 | LabelPosition = lpLeft 79 | ParentFont = False 80 | ReadOnly = True 81 | TabOrder = 2 82 | Text = '' 83 | end 84 | object edtWidth: TLabeledEdit 85 | Left = 40 86 | Top = 3 87 | Width = 73 88 | Height = 17 89 | Alignment = taCenter 90 | BevelOuter = bvNone 91 | BevelKind = bkFlat 92 | BorderStyle = bsNone 93 | EditLabel.Width = 35 94 | EditLabel.Height = 17 95 | EditLabel.Caption = 'Width:' 96 | Font.Charset = DEFAULT_CHARSET 97 | Font.Color = clWindowText 98 | Font.Height = -11 99 | Font.Name = 'Segoe UI' 100 | Font.Style = [fsBold] 101 | LabelPosition = lpLeft 102 | ParentFont = False 103 | ReadOnly = True 104 | TabOrder = 3 105 | Text = '' 106 | end 107 | object sbxMain: TScrollBox 108 | Left = 0 109 | Top = 21 110 | Width = 684 111 | Height = 888 112 | HorzScrollBar.Smooth = True 113 | HorzScrollBar.Tracking = True 114 | VertScrollBar.Smooth = True 115 | VertScrollBar.Tracking = True 116 | Align = alBottom 117 | Anchors = [akLeft, akTop, akRight, akBottom] 118 | BevelEdges = [] 119 | BevelInner = bvNone 120 | BorderStyle = bsNone 121 | Color = clWhite 122 | ParentColor = False 123 | TabOrder = 4 124 | ExplicitWidth = 678 125 | ExplicitHeight = 871 126 | object imgBitmap: TImage 127 | Left = 3 128 | Top = 3 129 | Width = 676 130 | Height = 585 131 | AutoSize = True 132 | Center = True 133 | IncrementalDisplay = True 134 | PopupMenu = ppmMain 135 | Proportional = True 136 | end 137 | end 138 | object aclMain: TActionList 139 | Left = 512 140 | Top = 176 141 | object actCopy: TAction 142 | Caption = 'Copy' 143 | Hint = 'Copy image to clipboard' 144 | OnExecute = actCopyExecute 145 | end 146 | end 147 | object ppmMain: TPopupMenu 148 | Left = 432 149 | Top = 179 150 | object mniCopy: TMenuItem 151 | Action = actCopy 152 | ShortCut = 16451 153 | end 154 | end 155 | end 156 | -------------------------------------------------------------------------------- /LogViewer.Commands.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Commands; 18 | 19 | { Handles execution of user commands on the active view (called from actions). } 20 | 21 | interface 22 | 23 | uses 24 | Spring, 25 | 26 | LogViewer.Interfaces; 27 | 28 | type 29 | TLogViewerCommands = class(TInterfaceBase, ILogViewerCommands) // no refcount 30 | private 31 | FManager : ILogViewerManager; 32 | 33 | {$REGION 'property access methods'} 34 | function GetActiveView: ILogViewer; 35 | function GetReceiver: IChannelReceiver; 36 | {$ENDREGION} 37 | 38 | protected 39 | procedure ClearMessages; 40 | procedure UpdateView; 41 | procedure Start; 42 | procedure Stop; 43 | procedure CollapseAll; 44 | procedure ExpandAll; 45 | procedure GotoFirst; 46 | procedure GotoLast; 47 | procedure SetFocusToFilter; 48 | 49 | public 50 | constructor Create(AManager: ILogViewerManager); 51 | destructor Destroy; override; 52 | 53 | property ActiveView: ILogViewer 54 | read GetActiveView; 55 | 56 | property Receiver: IChannelReceiver 57 | read GetReceiver; 58 | 59 | end; 60 | 61 | implementation 62 | 63 | uses 64 | DDuce.Logger; 65 | 66 | {$REGION 'construction and destruction'} 67 | constructor TLogViewerCommands.Create(AManager: ILogViewerManager); 68 | begin 69 | inherited Create; 70 | Guard.CheckNotNull(AManager, 'AManager'); 71 | FManager := AManager; 72 | end; 73 | 74 | destructor TLogViewerCommands.Destroy; 75 | begin 76 | FManager := nil; 77 | inherited Destroy; 78 | end; 79 | {$ENDREGION} 80 | 81 | {$REGION 'property access methods'} 82 | function TLogViewerCommands.GetActiveView: ILogViewer; 83 | begin 84 | Result := FManager.ActiveView; 85 | end; 86 | 87 | function TLogViewerCommands.GetReceiver: IChannelReceiver; 88 | begin 89 | if Assigned(ActiveView) then 90 | Result := ActiveView.Subscriber.Receiver 91 | else 92 | Result := nil; 93 | end; 94 | {$ENDREGION} 95 | 96 | {$REGION 'protected methods'} 97 | procedure TLogViewerCommands.ClearMessages; 98 | begin 99 | if Assigned(ActiveView) then 100 | begin 101 | ActiveView.Clear; 102 | end 103 | else 104 | begin 105 | Logger.Warn('No active view assigned!'); 106 | end; 107 | end; 108 | 109 | procedure TLogViewerCommands.CollapseAll; 110 | begin 111 | if Assigned(ActiveView) then 112 | begin 113 | ActiveView.CollapseAll; 114 | end; 115 | end; 116 | 117 | procedure TLogViewerCommands.ExpandAll; 118 | begin 119 | if Assigned(ActiveView) then 120 | begin 121 | ActiveView.ExpandAll; 122 | end; 123 | end; 124 | 125 | procedure TLogViewerCommands.GotoFirst; 126 | begin 127 | if Assigned(ActiveView) then 128 | begin 129 | ActiveView.GotoFirst; 130 | end; 131 | end; 132 | 133 | procedure TLogViewerCommands.GotoLast; 134 | begin 135 | if Assigned(ActiveView) then 136 | begin 137 | ActiveView.GotoLast; 138 | end; 139 | end; 140 | 141 | procedure TLogViewerCommands.SetFocusToFilter; 142 | begin 143 | if Assigned(ActiveView) then 144 | begin 145 | ActiveView.SetFocusToFilter; 146 | end; 147 | end; 148 | 149 | procedure TLogViewerCommands.Start; 150 | begin 151 | if Assigned(ActiveView) and Assigned(ActiveView.Subscriber) then 152 | begin 153 | ActiveView.Subscriber.Enabled := True; 154 | end; 155 | end; 156 | 157 | procedure TLogViewerCommands.Stop; 158 | begin 159 | if Assigned(ActiveView) and Assigned(ActiveView.Subscriber) then 160 | begin 161 | ActiveView.Subscriber.Enabled := False; 162 | end; 163 | end; 164 | 165 | procedure TLogViewerCommands.UpdateView; 166 | begin 167 | if Assigned(ActiveView) then 168 | begin 169 | ActiveView.UpdateView; 170 | end; 171 | end; 172 | {$ENDREGION} 173 | 174 | end. 175 | -------------------------------------------------------------------------------- /LogViewer.Receivers.Zmq.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Receivers.Zmq; 18 | 19 | { ZeroMQ channel receiver. } 20 | 21 | interface 22 | 23 | uses 24 | System.Classes, 25 | Vcl.ExtCtrls, 26 | 27 | Spring, 28 | 29 | ZeroMQ, 30 | 31 | LogViewer.Interfaces, LogViewer.Receivers.Base, 32 | LogViewer.Receivers.Zmq.Settings; 33 | 34 | {$REGION 'documentation'} 35 | { Receives logmessages from one or more ZMQ publisher through a subscriber 36 | socket. 37 | 38 | A ZeroMQChannelReceiver can receive messages from multiple channels that are 39 | bound to one or more ZMQ publisher sockets. 40 | 41 | In this setup the source application (sender of log messages) acts as a server 42 | which binds to a ZeroMQ socket (publisher). 43 | Multiple subscribers (TZeroMQChannelReceiver instances) can connect to the 44 | same publisher. 45 | 46 | REMARKS: 47 | - communication with ZeroMQ sockets is asynchronious. So the source 48 | application is never blocked as all messages are queued. 49 | - when the receiver cannot keep up with the publisher, messages are thrown 50 | away by the ZeroMQ subscriber. 51 | 52 | TODO: 53 | - list of connectionstrings to subscribe to? 54 | } 55 | {$ENDREGION} 56 | 57 | type 58 | TZmqChannelReceiver = class(TChannelReceiver, IChannelReceiver, IZmq) 59 | private 60 | FZmq : IZeroMQ; 61 | 62 | protected 63 | {$REGION 'property access methods'} 64 | function GetSettings: TZmqSettings; 65 | procedure SetEnabled(const Value: Boolean); override; 66 | {$ENDREGION} 67 | 68 | procedure SettingsChanged(Sender: TObject); 69 | 70 | public 71 | procedure AfterConstruction; override; 72 | 73 | constructor Create( 74 | AManager : ILogViewerManager; 75 | AZmq : IZeroMQ; 76 | const AName : string 77 | ); reintroduce; 78 | destructor Destroy; override; 79 | 80 | property Settings: TZmqSettings 81 | read GetSettings; 82 | 83 | end; 84 | 85 | implementation 86 | 87 | uses 88 | System.SysUtils, 89 | Vcl.Forms; 90 | 91 | {$REGION 'construction and destruction'} 92 | procedure TZmqChannelReceiver.AfterConstruction; 93 | begin 94 | inherited AfterConstruction; 95 | PollTimer.OnTimer := PollTimerTimer; 96 | PollTimer.Interval := Settings.PollingInterval; 97 | Settings.OnChanged.Add(SettingsChanged); 98 | end; 99 | 100 | constructor TZmqChannelReceiver.Create(AManager: ILogViewerManager; AZmq: 101 | IZeroMQ; const AName: string); 102 | begin 103 | inherited Create(AManager, AName); 104 | FZmq := AZmq; 105 | end; 106 | 107 | destructor TZmqChannelReceiver.Destroy; 108 | begin 109 | PollTimer.Enabled := False; 110 | Settings.OnChanged.RemoveAll(Self); 111 | FZmq := nil; 112 | inherited Destroy; 113 | end; 114 | {$ENDREGION} 115 | 116 | {$REGION 'property access methods'} 117 | procedure TZmqChannelReceiver.SetEnabled(const Value: Boolean); 118 | begin 119 | inherited SetEnabled(Value); 120 | PollTimer.Enabled := Value; 121 | end; 122 | 123 | function TZmqChannelReceiver.GetSettings: TZmqSettings; 124 | begin 125 | Result := Manager.Settings.ZmqSettings; 126 | end; 127 | {$ENDREGION} 128 | 129 | {$REGION 'event handlers'} 130 | procedure TZmqChannelReceiver.SettingsChanged(Sender: TObject); 131 | var 132 | LSubscriber : ISubscriber; 133 | begin 134 | Enabled := Settings.Enabled; 135 | PollTimer.Interval := Settings.PollingInterval; 136 | for LSubscriber in SubscriberList.Values do 137 | begin 138 | (LSubscriber as ILogMessageSubscriptionFilter).LogMessageTypes := 139 | Settings.LogMessageTypes; 140 | (LSubscriber as ILogMessageSubscriptionFilter).LogMessageLevels := 141 | Settings.LogMessageLevels; 142 | end; 143 | end; 144 | {$ENDREGION} 145 | 146 | end. 147 | -------------------------------------------------------------------------------- /LogViewer.Receivers.ComPort.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Receivers.ComPort; 18 | 19 | { COM-port channel receiver. } 20 | 21 | interface 22 | 23 | uses 24 | System.Classes, 25 | Vcl.ExtCtrls, 26 | 27 | Spring, 28 | 29 | synaser, 30 | 31 | LogViewer.Interfaces, LogViewer.Receivers.Base, 32 | LogViewer.Receivers.ComPort.Settings; 33 | 34 | {$REGION 'documentation'} 35 | { Receives data from a serial port. The data is queued as a TLogMessage 36 | compatible stream. 37 | 38 | For now the serial data is handled as: 39 | - a watch message if the text has a format like '%s=%s' (name-value pair 40 | with '=' as delimiter) 41 | - a text message otherwise 42 | } 43 | {$ENDREGION} 44 | 45 | type 46 | TComPortChannelReceiver = class(TChannelReceiver, IChannelReceiver, IComPort) 47 | private 48 | procedure SettingsChanged(Sender: TObject); 49 | 50 | protected 51 | {$REGION 'property access methods'} 52 | function GetSettings: TComPortSettings; 53 | procedure SetEnabled(const Value: Boolean); override; 54 | {$ENDREGION} 55 | 56 | procedure UpdateSubscribers; 57 | 58 | property Settings: TComPortSettings 59 | read GetSettings; 60 | 61 | public 62 | procedure AfterConstruction; override; 63 | destructor Destroy; override; 64 | 65 | function CreateSubscriber( 66 | ASourceId : UInt32; 67 | AThreadId : UInt32; 68 | const ASourceName : string 69 | ): ISubscriber; 70 | 71 | end; 72 | 73 | implementation 74 | 75 | uses 76 | System.SysUtils, 77 | 78 | DDuce.Logger, 79 | 80 | LogViewer.Subscribers.ComPort; 81 | 82 | {$REGION 'construction and destruction'} 83 | procedure TComPortChannelReceiver.AfterConstruction; 84 | begin 85 | inherited AfterConstruction; 86 | Settings.OnChanged.Add(SettingsChanged); 87 | PollTimer.Interval := Settings.PollingInterval; 88 | PollTimer.Enabled := False; 89 | PollTimer.OnTimer := PollTimerTimer; 90 | end; 91 | 92 | destructor TComPortChannelReceiver.Destroy; 93 | begin 94 | PollTimer.Enabled := False; 95 | inherited Destroy; 96 | end; 97 | {$ENDREGION} 98 | 99 | {$REGION 'property access methods'} 100 | procedure TComPortChannelReceiver.SetEnabled(const Value: Boolean); 101 | begin 102 | inherited SetEnabled(Value); 103 | if Value then 104 | begin 105 | UpdateSubscribers; 106 | PollTimer.Enabled := True; 107 | end 108 | else 109 | begin 110 | PollTimer.Enabled := False; 111 | end; 112 | end; 113 | 114 | function TComPortChannelReceiver.GetSettings: TComPortSettings; 115 | begin 116 | Result := Manager.Settings.ComPortSettings; 117 | end; 118 | {$ENDREGION} 119 | 120 | {$REGION 'event handlers'} 121 | procedure TComPortChannelReceiver.SettingsChanged(Sender: TObject); 122 | begin 123 | PollTimer.Interval := Settings.PollingInterval; 124 | end; 125 | {$ENDREGION} 126 | 127 | {$REGION 'protected methods'} 128 | procedure TComPortChannelReceiver.UpdateSubscribers; 129 | var 130 | I : Integer; 131 | SL : Shared; 132 | S : ISubscriber; 133 | begin 134 | Logger.Track(Self, 'UpdateSubscribers'); 135 | SL := TStringList.Create; 136 | SL.Value.CommaText := GetSerialPortNames; 137 | for I := 0 to SL.Value.Count - 1 do 138 | begin 139 | S := CreateSubscriber(I, 0, SL.Value[I]); 140 | if Assigned(S) then 141 | SubscriberList[I] := S; 142 | end; 143 | end; 144 | {$ENDREGION} 145 | 146 | {$REGION 'public methods'} 147 | function TComPortChannelReceiver.CreateSubscriber(ASourceId, AThreadId: UInt32; 148 | const ASourceName: string): ISubscriber; 149 | begin 150 | Logger.Track(Self, 'CreateSubscriber'); 151 | Settings.Port := ASourceName; 152 | if ASourceName <> '' then 153 | begin 154 | Result := TComPortSubscriber.Create( 155 | Self, 156 | ASourceId, 157 | ASourceName, 158 | ASourceName, 159 | False, 160 | Settings 161 | ); 162 | end 163 | else 164 | begin 165 | Result := nil; 166 | end; 167 | end; 168 | {$ENDREGION} 169 | 170 | end. 171 | -------------------------------------------------------------------------------- /LogViewer.Watches.Settings.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2021 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Watches.Settings; 18 | 19 | interface 20 | 21 | uses 22 | System.Classes, 23 | 24 | Spring; 25 | 26 | type 27 | TWatchSettings = class(TPersistent) 28 | private 29 | FOnChanged : Event; 30 | FOnlyTrackChanges : Boolean; 31 | FWatchHistoryVisible : Boolean; 32 | FSyncWithSelection : Boolean; 33 | FColumnHeadersVisible : Boolean; 34 | 35 | protected 36 | {$REGION 'property access methods'} 37 | function GetOnChanged: IEvent; 38 | function GetSyncWithSelection: Boolean; 39 | procedure SetSyncWithSelection(const Value: Boolean); 40 | function GetOnlyTrackChanges: Boolean; 41 | procedure SetOnlyTrackChanges(const Value: Boolean); 42 | function GetWatchHistoryVisible: Boolean; 43 | procedure SetWatchHistoryVisible(const Value: Boolean); 44 | function GetColumnHeadersVisible: Boolean; 45 | procedure SetColumnHeadersVisible(const Value: Boolean); 46 | {$ENDREGION} 47 | 48 | procedure Changed; 49 | 50 | public 51 | procedure AfterConstruction; override; 52 | 53 | procedure Assign(Source: TPersistent); override; 54 | 55 | property OnChanged: IEvent 56 | read GetOnChanged; 57 | 58 | published 59 | property ColumnHeadersVisible: Boolean 60 | read GetColumnHeadersVisible write SetColumnHeadersVisible; 61 | 62 | property OnlyTrackChanges: Boolean 63 | read GetOnlyTrackChanges write SetOnlyTrackChanges; 64 | 65 | property WatchHistoryVisible: Boolean 66 | read GetWatchHistoryVisible write SetWatchHistoryVisible; 67 | 68 | property SyncWithSelection: Boolean 69 | read GetSyncWithSelection write SetSyncWithSelection; 70 | 71 | end; 72 | 73 | implementation 74 | 75 | {$REGION 'construction and destruction'} 76 | procedure TWatchSettings.AfterConstruction; 77 | begin 78 | inherited AfterConstruction; 79 | end; 80 | {$ENDREGION} 81 | 82 | {$REGION 'property access methods'} 83 | function TWatchSettings.GetColumnHeadersVisible: Boolean; 84 | begin 85 | Result := FColumnHeadersVisible; 86 | end; 87 | 88 | procedure TWatchSettings.SetColumnHeadersVisible(const Value: Boolean); 89 | begin 90 | if Value <> ColumnHeadersVisible then 91 | begin 92 | FColumnHeadersVisible := Value; 93 | Changed; 94 | end; 95 | end; 96 | 97 | function TWatchSettings.GetOnChanged: IEvent; 98 | begin 99 | Result := FOnChanged; 100 | end; 101 | 102 | function TWatchSettings.GetOnlyTrackChanges: Boolean; 103 | begin 104 | Result := FOnlyTrackChanges; 105 | end; 106 | 107 | procedure TWatchSettings.SetOnlyTrackChanges(const Value: Boolean); 108 | begin 109 | if Value <> OnlyTrackChanges then 110 | begin 111 | FOnlyTrackChanges := Value; 112 | Changed; 113 | end; 114 | end; 115 | 116 | function TWatchSettings.GetSyncWithSelection: Boolean; 117 | begin 118 | Result := FSyncWithSelection; 119 | end; 120 | 121 | procedure TWatchSettings.SetSyncWithSelection(const Value: Boolean); 122 | begin 123 | if Value <> SyncWithSelection then 124 | begin 125 | FSyncWithSelection := Value; 126 | Changed; 127 | end; 128 | end; 129 | 130 | function TWatchSettings.GetWatchHistoryVisible: Boolean; 131 | begin 132 | Result := FWatchHistoryVisible; 133 | end; 134 | 135 | procedure TWatchSettings.SetWatchHistoryVisible(const Value: Boolean); 136 | begin 137 | FWatchHistoryVisible := Value; 138 | Changed; 139 | end; 140 | {$ENDREGION} 141 | 142 | {$REGION 'event dispatch methods'} 143 | procedure TWatchSettings.Changed; 144 | begin 145 | FOnChanged.Invoke(Self); 146 | end; 147 | {$ENDREGION} 148 | 149 | {$REGION 'public methods'} 150 | procedure TWatchSettings.Assign(Source: TPersistent); 151 | var 152 | LSettings: TWatchSettings; 153 | begin 154 | if Source is TWatchSettings then 155 | begin 156 | LSettings := TWatchSettings(Source); 157 | OnlyTrackChanges := LSettings.OnlyTrackChanges; 158 | WatchHistoryVisible := LSettings.WatchHistoryVisible; 159 | SyncWithSelection := LSettings.SyncWithSelection; 160 | ColumnHeadersVisible := LSettings.ColumnHeadersVisible; 161 | end 162 | else 163 | inherited Assign(Source); 164 | end; 165 | {$ENDREGION} 166 | 167 | end. 168 | -------------------------------------------------------------------------------- /LogBroker.Settings.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogBroker.Settings; 18 | 19 | { Provides access to application settings. } 20 | 21 | interface 22 | 23 | uses 24 | System.Classes, System.IniFiles; 25 | 26 | type 27 | ISettings = interface 28 | ['{2C05F3B9-2416-4E4E-B336-13213554457C}'] 29 | function ReadString( 30 | const ASection : string; 31 | const AIdent : string; 32 | const ADefault : string = '' 33 | ): string; 34 | procedure WriteString( 35 | const ASection : string; 36 | const AIdent : string; 37 | const AValue : string); 38 | function ReadInteger( 39 | const ASection : string; 40 | const AIdent : string; 41 | const ADefault : Integer = 0 42 | ) : Integer; 43 | procedure WriteInteger( 44 | const ASection : string; 45 | const AIdent : string; 46 | const AValue : Integer 47 | ); 48 | function ReadBool( 49 | const ASection : string; 50 | const AIdent : string; 51 | const ADefault : Boolean = False 52 | ) : Boolean; 53 | procedure WriteBool( 54 | const ASection : string; 55 | const AIdent : string; 56 | const AValue : Boolean 57 | ); 58 | end; 59 | 60 | function Settings: ISettings; 61 | 62 | implementation 63 | 64 | uses 65 | System.SysUtils, 66 | Vcl.Forms; 67 | 68 | type 69 | TSettings = class(TInterfacedObject, ISettings) 70 | private 71 | FIniFile : TIniFile; 72 | 73 | public 74 | procedure AfterConstruction; override; 75 | procedure BeforeDestruction; override; 76 | 77 | function ReadString( 78 | const ASection : string; 79 | const AIdent : string; 80 | const ADefault : string = '' 81 | ): string; 82 | procedure WriteString( 83 | const ASection : string; 84 | const AIdent : string; 85 | const AValue : string); 86 | function ReadInteger( 87 | const ASection : string; 88 | const AIdent : string; 89 | const ADefault : Integer = 0 90 | ) : Integer; 91 | procedure WriteInteger( 92 | const ASection : string; 93 | const AIdent : string; 94 | const AValue : Integer 95 | ); 96 | function ReadBool( 97 | const ASection : string; 98 | const AIdent : string; 99 | const ADefault : Boolean = False 100 | ) : Boolean; 101 | procedure WriteBool( 102 | const ASection : string; 103 | const AIdent : string; 104 | const AValue : Boolean 105 | ); 106 | end; 107 | 108 | var 109 | FSettings: ISettings; 110 | 111 | function Settings: ISettings; 112 | begin 113 | if not Assigned(FSettings) then 114 | FSettings := TSettings.Create; 115 | Result := FSettings; 116 | end; 117 | 118 | {$REGION 'construction and destruction'} 119 | procedure TSettings.AfterConstruction; 120 | var 121 | S : string; 122 | begin 123 | inherited; 124 | S := ExtractFilePath(Application.ExeName) + 125 | ExtractFileName(ChangeFileExt(Application.ExeName, '.ini')); 126 | FIniFile := TIniFile.Create(S); 127 | end; 128 | 129 | procedure TSettings.BeforeDestruction; 130 | begin 131 | FIniFile.Free; 132 | inherited; 133 | end; 134 | {$ENDREGION} 135 | 136 | {$REGION 'public methods'} 137 | function TSettings.ReadBool(const ASection, AIdent: string; 138 | const ADefault: Boolean): Boolean; 139 | begin 140 | Result := FIniFile.ReadBool(ASection, AIdent, ADefault); 141 | end; 142 | 143 | function TSettings.ReadInteger(const ASection, AIdent: string; 144 | const ADefault: Integer): Longint; 145 | begin 146 | Result := FIniFile.ReadInteger(ASection, AIdent, ADefault); 147 | end; 148 | 149 | function TSettings.ReadString(const ASection, AIdent, ADefault: string): string; 150 | begin 151 | Result := FIniFile.ReadString(ASection, AIdent, ADefault); 152 | end; 153 | 154 | procedure TSettings.WriteBool(const ASection, AIdent: string; const AValue: Boolean); 155 | begin 156 | FIniFile.WriteBool(ASection, AIdent, AValue); 157 | end; 158 | 159 | procedure TSettings.WriteInteger(const ASection, AIdent: string; const AValue: Integer); 160 | begin 161 | FIniFile.WriteInteger(ASection, AIdent, AValue); 162 | end; 163 | 164 | procedure TSettings.WriteString(const ASection, AIdent, AValue: string); 165 | begin 166 | FIniFile.WriteString(ASection, AIdent, AValue); 167 | end; 168 | {$ENDREGION} 169 | 170 | end. 171 | -------------------------------------------------------------------------------- /LogViewer.dpr: -------------------------------------------------------------------------------- 1 | {$SetPEFlags 1} // strip relocation info 2 | 3 | program LogViewer; 4 | 5 | {$R *.dres} 6 | 7 | uses 8 | System.SysUtils, 9 | Vcl.Themes, 10 | Vcl.Styles, 11 | Vcl.Forms, 12 | VirtualTrees, 13 | DDuce.Logger, 14 | DDuce.Logger.Interfaces, 15 | DDuce.Logger.Channels.Zmq, 16 | LogViewer.CallStack.Data in 'LogViewer.CallStack.Data.pas', 17 | LogViewer.CallStack.Settings in 'LogViewer.CallStack.Settings.pas', 18 | LogViewer.CallStack.View in 'LogViewer.CallStack.View.pas' {frmCallStackView}, 19 | LogViewer.Commands in 'LogViewer.Commands.pas', 20 | LogViewer.ComPort.Settings in 'LogViewer.ComPort.Settings.pas', 21 | LogViewer.Dashboard.Data in 'LogViewer.Dashboard.Data.pas', 22 | LogViewer.Dashboard.View in 'LogViewer.Dashboard.View.pas' {frmDashboard}, 23 | LogViewer.DataSet.View in 'LogViewer.DataSet.View.pas' {frmDataSetView}, 24 | LogViewer.DisplayValues.Settings in 'LogViewer.DisplayValues.Settings.pas', 25 | LogViewer.DisplayValues.Settings.View in 'LogViewer.DisplayValues.Settings.View.pas' {frmDisplayValuesSettings}, 26 | LogViewer.Events in 'LogViewer.Events.pas', 27 | LogViewer.Factories in 'LogViewer.Factories.pas', 28 | LogViewer.Factories.Toolbars in 'LogViewer.Factories.Toolbars.pas', 29 | LogViewer.Image.View in 'LogViewer.Image.View.pas' {frmImageView}, 30 | LogViewer.Interfaces in 'LogViewer.Interfaces.pas', 31 | LogViewer.MainForm in 'LogViewer.MainForm.pas' {frmMain}, 32 | LogViewer.Manager in 'LogViewer.Manager.pas' {dmManager: TDataModule}, 33 | LogViewer.MessageFilter.Data in 'LogViewer.MessageFilter.Data.pas', 34 | LogViewer.MessageFilter.View in 'LogViewer.MessageFilter.View.pas' {frmMessageFilter}, 35 | LogViewer.MessageList.LogNode in 'LogViewer.MessageList.LogNode.pas', 36 | LogViewer.MessageList.Settings in 'LogViewer.MessageList.Settings.pas', 37 | LogViewer.MessageList.Settings.View in 'LogViewer.MessageList.Settings.View.pas' {frmViewSettings}, 38 | LogViewer.MessageList.View in 'LogViewer.MessageList.View.pas' {frmMessageList}, 39 | LogViewer.RawData.View in 'LogViewer.RawData.View.pas' {frmRawDataView}, 40 | LogViewer.Receivers.Base in 'LogViewer.Receivers.Base.pas', 41 | LogViewer.Receivers.ComPort in 'LogViewer.Receivers.ComPort.pas', 42 | LogViewer.Receivers.ComPort.Settings in 'LogViewer.Receivers.ComPort.Settings.pas', 43 | LogViewer.Receivers.ComPort.Settings.View in 'LogViewer.Receivers.ComPort.Settings.View.pas' {frmComPortSettings}, 44 | LogViewer.Receivers.FileSystem in 'LogViewer.Receivers.FileSystem.pas', 45 | LogViewer.Receivers.FileSystem.Settings in 'LogViewer.Receivers.FileSystem.Settings.pas', 46 | LogViewer.Receivers.Winipc in 'LogViewer.Receivers.Winipc.pas', 47 | LogViewer.Receivers.Winipc.Settings in 'LogViewer.Receivers.Winipc.Settings.pas', 48 | LogViewer.Receivers.Winipc.Settings.View in 'LogViewer.Receivers.Winipc.Settings.View.pas' {frmWinipcSettings}, 49 | LogViewer.Receivers.Winods in 'LogViewer.Receivers.Winods.pas', 50 | LogViewer.Receivers.Winods.Settings in 'LogViewer.Receivers.Winods.Settings.pas', 51 | LogViewer.Receivers.Winods.Settings.View in 'LogViewer.Receivers.Winods.Settings.View.pas' {frmWinodsSettings}, 52 | LogViewer.Receivers.Zmq in 'LogViewer.Receivers.Zmq.pas', 53 | LogViewer.Receivers.Zmq.Settings in 'LogViewer.Receivers.Zmq.Settings.pas', 54 | LogViewer.Receivers.Zmq.Settings.View in 'LogViewer.Receivers.Zmq.Settings.View.pas' {frmZmqSettings}, 55 | LogViewer.Resources in 'LogViewer.Resources.pas', 56 | LogViewer.Settings.Dialog.Data in 'LogViewer.Settings.Dialog.Data.pas', 57 | LogViewer.Settings.Dialog in 'LogViewer.Settings.Dialog.pas' {frmLogViewerSettings}, 58 | LogViewer.Settings in 'LogViewer.Settings.pas', 59 | LogViewer.Subscribers.Base in 'LogViewer.Subscribers.Base.pas', 60 | LogViewer.Subscribers.ComPort in 'LogViewer.Subscribers.ComPort.pas', 61 | LogViewer.Subscribers.FileSystem in 'LogViewer.Subscribers.FileSystem.pas', 62 | LogViewer.Subscribers.Winipc in 'LogViewer.Subscribers.Winipc.pas', 63 | LogViewer.Subscribers.Winods in 'LogViewer.Subscribers.Winods.pas', 64 | LogViewer.Subscribers.Zmq in 'LogViewer.Subscribers.Zmq.pas', 65 | LogViewer.ValueList.View in 'LogViewer.ValueList.View.pas' {frmValueListView}, 66 | LogViewer.Watches.Data in 'LogViewer.Watches.Data.pas', 67 | LogViewer.Watches.Settings in 'LogViewer.Watches.Settings.pas', 68 | LogViewer.Watches.Settings.View in 'LogViewer.Watches.Settings.View.pas' {frmWatchSettings}, 69 | LogViewer.Watches.View in 'LogViewer.Watches.View.pas' {frmWatchesView}, 70 | LogViewer.MessageData.View in 'LogViewer.MessageData.View.pas' {TfrmMessageData}, 71 | LogViewer.CallStack.Settings.View in 'LogViewer.CallStack.Settings.View.pas' {frmCallStackSettings}, 72 | LogViewer.DisplayValues.Settings.ValueManager in 'LogViewer.DisplayValues.Settings.ValueManager.pas', 73 | LogViewer.LogLevels.Settings in 'LogViewer.LogLevels.Settings.pas', 74 | LogViewer.LogLevels.Settings.View in 'LogViewer.LogLevels.Settings.View.pas' {frmLogLevelSettings}, 75 | LogViewer.WinipcBroker in 'LogViewer.WinipcBroker.pas'; 76 | 77 | {$R *.res} 78 | 79 | begin 80 | {$WARNINGS OFF} 81 | ReportMemoryLeaksOnShutdown := DebugHook > 0; 82 | {$WARNINGS ON} 83 | Application.Initialize; 84 | Application.ActionUpdateDelay := 50; 85 | Application.Title := 'Log viewer'; 86 | Application.CreateForm(TfrmMain, frmMain); 87 | Logger.Info('LogViewer Started.'); 88 | Application.Run; 89 | end. 90 | -------------------------------------------------------------------------------- /LogViewer.MessageFilter.Data.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2021 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.MessageFilter.Data; 18 | 19 | { Holds fields and criteria to filter messages on. } 20 | 21 | interface 22 | 23 | uses 24 | System.Classes, 25 | Vcl.Graphics, 26 | 27 | Spring, 28 | 29 | VirtualTrees, 30 | 31 | DDuce.Logger.Interfaces; 32 | 33 | type 34 | TFilterData = class 35 | private 36 | FMessageTypes : TLogMessageTypes; 37 | FMessageLevels : TLogMessageLevels; 38 | FIsMessageTypeFilter : Boolean; // two seperate flags to allow for more 39 | FIsMessageLevelFilter : Boolean; // finetuned control in the future. 40 | FCaption : string; 41 | FImageIndex : Integer; 42 | FColor : TColor; 43 | 44 | {$REGION 'property access methods'} 45 | function GetMessageTypes: TLogMessageTypes; 46 | procedure SetMessageTypes(const Value: TLogMessageTypes); 47 | function GetCaption: string; 48 | procedure SetCaption(const Value: string); 49 | function GetImageIndex: Integer; 50 | procedure SetImageIndex(const Value: Integer); 51 | function GetMessageLevels: TLogMessageLevels; 52 | procedure SetMessageLevels(const Value: TLogMessageLevels); 53 | function GetColor: TColor; 54 | procedure SetColor(const Value: TColor); 55 | function GetIsMessageLevelFilter: Boolean; 56 | function GetIsMessageTypeFilter: Boolean; 57 | {$ENDREGION} 58 | 59 | public 60 | constructor Create( 61 | const ACaption : string; 62 | AMessageTypes : TLogMessageTypes = []; 63 | AImageIndex : Integer = -1 64 | ); overload; 65 | 66 | constructor Create( 67 | const ACaption : string; 68 | AMessageLevels : TLogMessageLevels = []; 69 | AColor : TColor = clNone 70 | ); overload; 71 | 72 | property IsMessageTypeFilter: Boolean 73 | read GetIsMessageTypeFilter; 74 | 75 | property IsMessageLevelFilter: Boolean 76 | read GetIsMessageLevelFilter; 77 | 78 | property MessageTypes: TLogMessageTypes 79 | read GetMessageTypes write SetMessageTypes; 80 | 81 | property MessageLevels: TLogMessageLevels 82 | read GetMessageLevels write SetMessageLevels; 83 | 84 | property Caption: string 85 | read GetCaption write SetCaption; 86 | 87 | property ImageIndex: Integer 88 | read GetImageIndex write SetImageIndex; 89 | 90 | property Color: TColor 91 | read GetColor write SetColor; 92 | 93 | end; 94 | 95 | implementation 96 | 97 | {$REGION 'construction and destruction'} 98 | constructor TFilterData.Create(const ACaption: string; 99 | AMessageTypes: TLogMessageTypes; AImageIndex: Integer); 100 | begin 101 | FMessageTypes := AMessageTypes; 102 | FCaption := ACaption; 103 | FImageIndex := AImageIndex; 104 | FIsMessageTypeFilter := True; 105 | end; 106 | 107 | constructor TFilterData.Create(const ACaption: string; 108 | AMessageLevels: TLogMessageLevels; AColor: TColor); 109 | begin 110 | FMessageLevels := AMessageLevels; 111 | FCaption := ACaption; 112 | FColor := AColor; 113 | FIsMessageLevelFilter := True; 114 | end; 115 | {$ENDREGION} 116 | 117 | {$REGION 'property access methods'} 118 | function TFilterData.GetCaption: string; 119 | begin 120 | Result := FCaption; 121 | end; 122 | 123 | procedure TFilterData.SetCaption(const Value: string); 124 | begin 125 | FCaption := Value; 126 | end; 127 | 128 | function TFilterData.GetColor: TColor; 129 | begin 130 | Result := FColor; 131 | end; 132 | 133 | procedure TFilterData.SetColor(const Value: TColor); 134 | begin 135 | FColor := Value; 136 | end; 137 | 138 | function TFilterData.GetImageIndex: Integer; 139 | begin 140 | Result := FImageIndex; 141 | end; 142 | 143 | function TFilterData.GetIsMessageLevelFilter: Boolean; 144 | begin 145 | Result := FIsMessageLevelFilter; 146 | end; 147 | 148 | function TFilterData.GetIsMessageTypeFilter: Boolean; 149 | begin 150 | Result := FIsMessageTypeFilter; 151 | end; 152 | 153 | procedure TFilterData.SetImageIndex(const Value: Integer); 154 | begin 155 | FImageIndex := Value; 156 | end; 157 | 158 | function TFilterData.GetMessageLevels: TLogMessageLevels; 159 | begin 160 | Result := FMessageLevels; 161 | end; 162 | 163 | procedure TFilterData.SetMessageLevels(const Value: TLogMessageLevels); 164 | begin 165 | FMessageLevels := Value; 166 | end; 167 | 168 | function TFilterData.GetMessageTypes: TLogMessageTypes; 169 | begin 170 | Result := FMessageTypes; 171 | end; 172 | 173 | procedure TFilterData.SetMessageTypes(const Value: TLogMessageTypes); 174 | begin 175 | FMessageTypes := Value; 176 | end; 177 | {$ENDREGION} 178 | 179 | end. 180 | -------------------------------------------------------------------------------- /LogViewer.Events.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Events; 18 | 19 | { Dispatches events on the active view. } 20 | 21 | interface 22 | 23 | uses 24 | System.Classes, 25 | 26 | Spring, 27 | 28 | LogViewer.Interfaces; 29 | 30 | type 31 | TLogViewerEvents = class(TInterfaceBase, ILogViewerEvents) // no refcount 32 | private 33 | FManager : ILogViewerManager; 34 | FOnAddLogViewer : Event; 35 | FOnDeleteLogViewer : Event; 36 | FOnAddReceiver : Event; 37 | FOnActiveViewChange : Event; 38 | FOnShowDashboard : Event; 39 | 40 | protected 41 | {$REGION 'property access methods'} 42 | function GetOnActiveViewChange: IEvent; 43 | function GetOnAddLogViewer: IEvent; 44 | function GetOnDeleteLogViewer: IEvent; 45 | function GetOnAddReceiver: IEvent; 46 | function GetOnShowDashboard: IEvent; 47 | {$ENDREGION} 48 | 49 | {$REGION 'event dispatch methods'} 50 | procedure DoAddLogViewer(ALogViewer: ILogViewer); virtual; 51 | procedure DoDeleteLogViewer(ALogViewer: ILogViewer); virtual; 52 | procedure DoActiveViewChange(ALogViewer: ILogViewer); virtual; 53 | procedure DoAddReceiver(AReceiver: IChannelReceiver); virtual; 54 | procedure DoShowDashboard; virtual; 55 | {$ENDREGION} 56 | 57 | procedure Clear; 58 | 59 | public 60 | constructor Create(AManager: ILogViewerManager); 61 | destructor Destroy; override; 62 | 63 | property OnActiveViewChange: IEvent 64 | read GetOnActiveViewChange; 65 | 66 | property OnAddLogViewer: IEvent 67 | read GetOnAddLogViewer; 68 | 69 | property OnDeleteLogViewer: IEvent 70 | read GetOnDeleteLogViewer; 71 | 72 | property OnAddReceiver: IEvent 73 | read GetOnAddReceiver; 74 | 75 | property OnShowDashboard: IEvent 76 | read GetOnShowDashboard; 77 | 78 | end; 79 | 80 | implementation 81 | 82 | uses 83 | DDuce.Logger; 84 | 85 | {$REGION 'construction and destruction'} 86 | constructor TLogViewerEvents.Create(AManager: ILogViewerManager); 87 | begin 88 | Guard.CheckNotNull(AManager, 'AManager'); 89 | FManager := AManager; 90 | FOnAddLogViewer.UseFreeNotification := False; 91 | FOnDeleteLogViewer.UseFreeNotification := False; 92 | FOnAddReceiver.UseFreeNotification := False; 93 | FOnActiveViewChange.UseFreeNotification := False; 94 | end; 95 | 96 | destructor TLogViewerEvents.Destroy; 97 | begin 98 | Logger.Track(Self, 'Destroy'); 99 | Clear; 100 | FManager := nil; 101 | inherited Destroy; 102 | end; 103 | {$ENDREGION} 104 | 105 | {$REGION 'property access methods'} 106 | function TLogViewerEvents.GetOnActiveViewChange: IEvent; 107 | begin 108 | Result := FOnActiveViewChange; 109 | end; 110 | 111 | function TLogViewerEvents.GetOnAddLogViewer: IEvent; 112 | begin 113 | Result := FOnAddLogViewer; 114 | end; 115 | 116 | function TLogViewerEvents.GetOnAddReceiver: IEvent; 117 | begin 118 | Result := FOnAddReceiver; 119 | end; 120 | 121 | function TLogViewerEvents.GetOnDeleteLogViewer: IEvent; 122 | begin 123 | Result := FOnDeleteLogViewer; 124 | end; 125 | 126 | function TLogViewerEvents.GetOnShowDashboard: IEvent; 127 | begin 128 | Result := FOnShowDashboard; 129 | end; 130 | {$ENDREGION} 131 | 132 | {$REGION 'event dispatch methods'} 133 | procedure TLogViewerEvents.DoActiveViewChange(ALogViewer: ILogViewer); 134 | begin 135 | Logger.Track(Self, 'DoActiveViewChange'); 136 | FOnActiveViewChange.Invoke(Self, ALogViewer); 137 | end; 138 | 139 | procedure TLogViewerEvents.DoAddLogViewer(ALogViewer: ILogViewer); 140 | begin 141 | Logger.Track(Self, 'DoAddLogViewer'); 142 | FOnAddLogViewer.Invoke(Self, ALogViewer); 143 | end; 144 | 145 | procedure TLogViewerEvents.DoAddReceiver(AReceiver: IChannelReceiver); 146 | begin 147 | Logger.Track(Self, 'DoAddReceiver'); 148 | FOnAddReceiver.Invoke(Self, AReceiver); 149 | end; 150 | 151 | procedure TLogViewerEvents.DoDeleteLogViewer(ALogViewer: ILogViewer); 152 | begin 153 | Logger.Track(Self, 'DoDeleteLogViewer'); 154 | FOnDeleteLogViewer.Invoke(Self, ALogViewer); 155 | end; 156 | 157 | procedure TLogViewerEvents.DoShowDashboard; 158 | begin 159 | Logger.Track(Self, 'DoShowDashboard'); 160 | FOnShowDashboard.Invoke(Self); 161 | end; 162 | {$ENDREGION} 163 | 164 | {$REGION 'protected methods'} 165 | procedure TLogViewerEvents.Clear; 166 | begin 167 | FOnAddLogViewer.Clear; 168 | FOnDeleteLogViewer.Clear; 169 | FOnAddReceiver.Clear; 170 | FOnActiveViewChange.Clear; 171 | FOnShowDashboard.Clear; 172 | end; 173 | {$ENDREGION} 174 | 175 | end. 176 | -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/Delphi Form Module.json: -------------------------------------------------------------------------------- 1 | { 2 | "Highlighter": { 3 | "Sample": [ 4 | "object Form1: TForm1\r\n", 5 | " Left = 0\r\n", 6 | " Top = 0\r\n", 7 | " Caption = 'Form1'\r\n", 8 | " object Label1: TLabel\r\n", 9 | " Left = 30\r\n", 10 | " Top = 20\r\n", 11 | " Width = 55\r\n", 12 | " Height = 13\r\n", 13 | " Caption = 'Hello, World!'\r\n", 14 | " end\r\n", 15 | "end" 16 | ], 17 | "MainRules": { 18 | "Attributes": { 19 | "Element": "Editor" 20 | }, 21 | "SubRules": { 22 | "Range": [ 23 | { 24 | "Type": "BlockComment", 25 | "Attributes": { 26 | "Element": "Comment" 27 | }, 28 | "TokenRange": { 29 | "Open": "{", 30 | "Close": "}" 31 | } 32 | }, 33 | { 34 | "Type": "String", 35 | "Attributes": { 36 | "Element": "String" 37 | }, 38 | "Properties": { 39 | "CloseOnEndOfLine": true 40 | }, 41 | "TokenRange": { 42 | "Open": "'", 43 | "Close": "'" 44 | } 45 | }, 46 | { 47 | "Type": "HexNumber", 48 | "Attributes": { 49 | "Element": "HexNumber" 50 | }, 51 | "Properties": { 52 | "CloseOnTerm": true, 53 | "CloseOnEndOfLine": true 54 | }, 55 | "TokenRange": { 56 | "Open": "$", 57 | "Close": " " 58 | } 59 | }, 60 | { 61 | "Type": "Character", 62 | "Attributes": { 63 | "Element": "Number" 64 | }, 65 | "Properties": { 66 | "CloseOnTerm": true, 67 | "CloseOnEndOfLine": true 68 | }, 69 | "TokenRange": { 70 | "Open": "#", 71 | "Close": " " 72 | } 73 | } 74 | ], 75 | "KeyList": [ 76 | { 77 | "Type": "ReservedWord", 78 | "Words": [ 79 | "end", 80 | "inherited", 81 | "inline", 82 | "nil", 83 | "object" 84 | ], 85 | "Attributes": { 86 | "Element": "ReservedWord" 87 | } 88 | }, 89 | { 90 | "Type": "Symbol", 91 | "Words": [ 92 | ":", 93 | "<", 94 | ">", 95 | "=", 96 | "/", 97 | "*", 98 | ".", 99 | ",", 100 | "-", 101 | "+", 102 | "(", 103 | ")", 104 | "[", 105 | "]" 106 | ], 107 | "Attributes": { 108 | "Element": "Symbol" 109 | } 110 | } 111 | ], 112 | "Set": [ 113 | { 114 | "Type": "Number", 115 | "Symbols": "0123456789", 116 | "Attributes": { 117 | "Element": "Number" 118 | } 119 | }, 120 | { 121 | "Type": "Float", 122 | "Symbols": ".0123456789", 123 | "Attributes": { 124 | "Element": "Number" 125 | } 126 | } 127 | ] 128 | } 129 | } 130 | }, 131 | "CodeFolding": { 132 | "Ranges": [ 133 | { 134 | "SkipRegion": [ 135 | { 136 | "OpenToken": "'", 137 | "CloseToken": "'", 138 | "RegionType": "SingleLineString" 139 | } 140 | ], 141 | "FoldRegion": [ 142 | { 143 | "OpenToken": "OBJECT", 144 | "CloseToken": "END", 145 | "Properties": { 146 | "OpenTokenBeginningOfLine": true 147 | } 148 | }, 149 | { 150 | "OpenToken": "INLINE", 151 | "CloseToken": "END", 152 | "Properties": { 153 | "OpenTokenBeginningOfLine": true 154 | } 155 | }, 156 | { 157 | "OpenToken": "ITEM", 158 | "CloseToken": "END", 159 | "Properties": { 160 | "OpenTokenBeginningOfLine": true 161 | } 162 | }, 163 | { 164 | "OpenToken": "INHERITED", 165 | "CloseToken": "END", 166 | "Properties": { 167 | "OpenTokenBeginningOfLine": true 168 | } 169 | } 170 | ] 171 | } 172 | ] 173 | }, 174 | "MatchingPair": { 175 | "Pairs": [ 176 | { 177 | "OpenToken": "'", 178 | "CloseToken": "'" 179 | }, 180 | { 181 | "OpenToken": "\"", 182 | "CloseToken": "\"" 183 | }, 184 | { 185 | "OpenToken": "object", 186 | "CloseToken": "end" 187 | }, 188 | { 189 | "OpenToken": "inline", 190 | "CloseToken": "end" 191 | }, 192 | { 193 | "OpenToken": "inherited", 194 | "CloseToken": "end" 195 | }, 196 | { 197 | "OpenToken": "(", 198 | "CloseToken": ")" 199 | }, 200 | { 201 | "OpenToken": "[", 202 | "CloseToken": "]" 203 | }, 204 | { 205 | "OpenToken": "<", 206 | "CloseToken": ">" 207 | } 208 | ] 209 | } 210 | } 211 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LogViewer 2 | 3 | **LogViewer** is a general purpose message viewer for log messages with support for multiple sources to receive messages from. The application is a modular design which can easily be extended to support other message types and transfer protocols. 4 | 5 | Currently supported are: 6 | 7 | * Windows IPC (using ``WM_COPY`` messages) 8 | * [ZeroMQ](https://github.com/zeromq/libzmq) (`PUB`/`SUB` socket) for logging over the network. It demonstrates the brilliant performance of ZMQ sockets. 9 | 10 | Currently in progress: 11 | * Serial port (native RS232, USB or Bluetooth) 12 | * Windows ``OutputDebugString`` API 13 | * MQTT (commonly used by IOT devices) 14 | 15 | Each of these **receivers** support multiple **subscribers** for which messages can be displayed in a dedicated logviewer. 16 | 17 | I compiled a pre-release version to play with in the [releases](https://github.com/beNative/LogViewer/releases) section. I included the unit test executable that can be used to generate some sample logging. 18 | 19 | ## Screenshots 20 | 21 | ### Message viewer 22 | 23 | ![LogViewer](https://github.com/beNative/LogViewer/blob/master/Images/LogViewer.png) 24 | 25 | ![LogViewer](https://github.com/beNative/LogViewer/blob/master/Images/LogViewer1.png) 26 | 27 | ![LogViewer](https://github.com/beNative/LogViewer/blob/master/Images/LogViewer2.png) 28 | 29 | ![LogViewer](https://github.com/beNative/LogViewer/blob/master/Images/LogViewer3.png) 30 | 31 | ### Call Stack 32 | 33 | ![CallStack](https://github.com/beNative/LogViewer/blob/master/Images/LogViewer.CallStack.png) 34 | 35 | ### Watch List 36 | 37 | Watch list with value history support. The history list can be automatically synchronize with the message list to monitor the value at any given time. 38 | 39 | ![WatchList](https://github.com/beNative/LogViewer/blob/master/Images/LogViewer.WatchList.png) 40 | 41 | ### Message Filter 42 | 43 | #### Client side 44 | ![MessageFilterClient](https://github.com/beNative/LogViewer/blob/master/Images/LogViewer.MessageFilter.Client.png) 45 | 46 | #### Source side 47 | ![MessageFilterSource](https://github.com/beNative/LogViewer/blob/master/Images/LogViewer.MessageFilter.Source.png) 48 | 49 | ### Settings Dialog 50 | 51 | Fully customizable message display settings. 52 | 53 | ![Settings](https://github.com/beNative/LogViewer/blob/master/Images/LogViewer.SettingsDialog.png) 54 | 55 | ## UML diagrams 56 | 57 | In the [Documents](https://github.com/beNative/LogViewer/tree/master/Documents) folder you will find some UML diagrams which reveal the main application architecture. 58 | 59 | ![ILogViewerManager](https://github.com/beNative/LogViewer/blob/master/Images/LogViewer.ILogViewerManager.png) 60 | ![TLogViewerSettings](https://github.com/beNative/LogViewer/blob/master/Images/LogViewer.TLogViewerSettings.png) 61 | 62 | There is also a mindmap with a technical overview of the application: [LogViewer.xmind](https://github.com/beNative/LogViewer/blob/master/Documents/LogViewer.xmind) 63 | You need XMind to open this document. You can download a free version from the main website: [XMind](https://www.xmind.net/). 64 | 65 | I made an image snapshot of the mindmap that you can open here: [LogViewer.Mindmap.png](https://raw.githubusercontent.com/beNative/LogViewer/master/Documents/LogViewer.Mindmap.png) 66 | 67 | ## ILogger API 68 | 69 | The [DDuce](http://github.com/beNative/dduce) library provides the Logger module to add logging to your application (Delphi/FreePascal-Lazarus). 70 | The DDuce demo application demonstrates the currently supported message types. 71 | 72 | ![Logger demo](https://github.com/beNative/LogViewer/blob/master/Wiki/DDuce%20Logger24-10-2018%2022-12-44.png) 73 | 74 | More examples can be found in my other Delphi projects listed on Github. LogViewer is also able to emit log messages by itself which can be monitored in another instance. Therefore the source instance needs to have the setting 'Emit log messages' enabled. The other instance needs to be started in 'debug mode' which also can be configured in the application settings. 75 | 76 | A subset of this API has been ported to FPC/Lazarus. Take a look at my Lazarus projects to see examples how they are used. 77 | 78 | ## Features currently supported using the ILogger interface methods 79 | - Info/Warning and Error messages 80 | - Method tracking with stack display showing execution times 81 | - Screenshot capture 82 | - Conditional logging 83 | - Checkpoints 84 | - Counters 85 | - Watches + value history support 86 | - Datasets 87 | - Bitmaps, and various other image formats 88 | - Objects 89 | - Components 90 | - Native value types with type information 91 | - Text with suppport for multiple highlighters 92 | - Actions 93 | - Up to 32 user-definable logging levels 94 | 95 | ## Libraries used 96 | The Object Pascal (Delphi) sources depend on the following open source libraries and components: 97 | * [Spring4D](http://bitbucket.org/sglienke/spring4d) 98 | * [DSharp](http://bitbucket.org/sglienke/dsharp) 99 | * [Virtual treeview](http://github.com/Virtual-TreeView/Virtual-TreeView) 100 | * [DDuce](http://github.com/beNative/dduce) 101 | * [ZeroMQ](http://github.com/beNative/Delphi-ZeroMQ) 102 | * [zcontrols](http://github.com/beNative/zcontrols) 103 | * [TTextEditor](https://github.com/TextEditorPro/TTextEditor) 104 | * [TChromeTabs](http://github.com/norgepaul/TChromeTabs) 105 | * [Ararat Synapse](http://github.com/beNative/synapse) 106 | * [OMultiPanel](http://github.com/beNative/omultipanel) 107 | * [KControls](http://github.com/beNative/kcontrols) 108 | * [JsonDataObjects](http://github.com/ahausladen/JsonDataObjects) 109 | -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/LaTex.json: -------------------------------------------------------------------------------- 1 | { 2 | "Highlighter": { 3 | "Sample": [ 4 | "\\documentclass{article}\r\n", 5 | "\\usepackage{graphicx}\r\n", 6 | "\r\n", 7 | "\\begin{document}\r\n", 8 | "\r\n", 9 | "\\title{Introduction to \\LaTeX{}}\r\n", 10 | "\\author{Author's Name}\r\n", 11 | "\r\n", 12 | "\\maketitle\r\n", 13 | "\r\n", 14 | "\\begin{abstract}\r\n", 15 | "The abstract text goes here.\r\n", 16 | "\\end{abstract}\r\n", 17 | "\r\n", 18 | "\\section{Introduction}\r\n", 19 | "Here is the text of your introduction.\r\n", 20 | "\r\n", 21 | "\\begin{equation}\r\n", 22 | " \\label{simple_equation}\r\n", 23 | " \\alpha = \\sqrt{ \\beta }\r\n", 24 | "\\end{equation}\r\n", 25 | "\r\n", 26 | "\\subsection{Subsection Heading Here}\r\n", 27 | "Write your subsection text here.\r\n", 28 | "\r\n", 29 | "\\begin{figure}\r\n", 30 | " \\centering\r\n", 31 | " \\includegraphics[width=3.0in]{myfigure}\r\n", 32 | " \\caption{Simulation Results}\r\n", 33 | " \\label{simulationfigure}\r\n", 34 | "\\end{figure}\r\n", 35 | "\r\n", 36 | "\\section{Conclusion}\r\n", 37 | "Write your conclusion here.\r\n", 38 | "\r\n", 39 | "\\end{document}" 40 | ], 41 | "MainRules": { 42 | "Attributes": { 43 | "Element": "Editor" 44 | }, 45 | "SubRules": { 46 | "Range": [ 47 | { 48 | "Type": "LineComment", 49 | "Attributes": { 50 | "Element": "Comment" 51 | }, 52 | "Properties": { 53 | "CloseOnEndOfLine": true 54 | }, 55 | "TokenRange": { 56 | "Open": "%" 57 | } 58 | }, 59 | { 60 | "Type": "String", 61 | "Attributes": { 62 | "Element": "String" 63 | }, 64 | "TokenRange": { 65 | "Open": "{", 66 | "Close": "}" 67 | }, 68 | "SubRules": { 69 | "Range": [ 70 | { 71 | "Type": "Command", 72 | "Attributes": { 73 | "Element": "Method" 74 | }, 75 | "Properties": { 76 | "CloseOnTerm": true 77 | }, 78 | "TokenRange": { 79 | "Open": "\\" 80 | } 81 | } 82 | ], 83 | "KeyList": [ 84 | { 85 | "Type": "Symbol", 86 | "Words": [ 87 | "{", 88 | "}" 89 | ], 90 | "Attributes": { 91 | "Element": "Symbol" 92 | } 93 | } 94 | ] 95 | } 96 | }, 97 | { 98 | "Type": "String", 99 | "Attributes": { 100 | "Element": "MethodName" 101 | }, 102 | "TokenRange": { 103 | "Open": "[", 104 | "Close": "]" 105 | } 106 | }, 107 | { 108 | "Type": "Command", 109 | "Attributes": { 110 | "Element": "Method" 111 | }, 112 | "Properties": { 113 | "CloseOnTerm": true 114 | }, 115 | "TokenRange": { 116 | "Open": "\\" 117 | } 118 | } 119 | ], 120 | "KeyList": [ 121 | { 122 | "Name": "Keywords", 123 | "Type": "ReservedWord", 124 | "Words": [ 125 | "\\documentclass", 126 | "\\label", 127 | "\\usepackage" 128 | ], 129 | "Attributes": { 130 | "Element": "ReservedWord" 131 | } 132 | }, 133 | { 134 | "Type": "Symbol", 135 | "Words": [ 136 | ":", 137 | ";", 138 | "<", 139 | ">", 140 | "=", 141 | "/", 142 | "*", 143 | ".", 144 | ",", 145 | "-", 146 | "+", 147 | "(", 148 | ")", 149 | "[", 150 | "]", 151 | "{", 152 | "}" 153 | ], 154 | "Attributes": { 155 | "Element": "Symbol" 156 | } 157 | } 158 | ], 159 | "Set": [ 160 | { 161 | "Type": "Numbers", 162 | "Symbols": "0123456789", 163 | "Attributes": { 164 | "Element": "Number" 165 | } 166 | }, 167 | { 168 | "Type": "Float", 169 | "Symbols": ".0123456789", 170 | "Attributes": { 171 | "Element": "Number" 172 | } 173 | } 174 | ] 175 | } 176 | } 177 | }, 178 | "MatchingPair": { 179 | "Pairs": [ 180 | { 181 | "OpenToken": "(", 182 | "CloseToken": ")" 183 | }, 184 | { 185 | "OpenToken": "[", 186 | "CloseToken": "]" 187 | }, 188 | { 189 | "OpenToken": "{", 190 | "CloseToken": "}" 191 | } 192 | ] 193 | }, 194 | "CompletionProposal": { 195 | "SkipRegion": [ 196 | { 197 | "OpenToken": "%", 198 | "RegionType": "SingleLine" 199 | } 200 | ] 201 | } 202 | } 203 | -------------------------------------------------------------------------------- /LogViewer.ComPort.Settings.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.ComPort.Settings; 18 | 19 | { Persistable settings for ComPort subscriber. } 20 | 21 | interface 22 | 23 | uses 24 | System.Classes, 25 | 26 | Spring; 27 | 28 | type 29 | TComPortSettings = class(TPersistent) 30 | const 31 | DEFAULT_BAUDRATE = 115200; 32 | DEFAULT_POLLING_INTERVAL = 50; 33 | 34 | private 35 | FBaudRate : Integer; 36 | FDataBits : Integer; 37 | FStopBits : Integer; 38 | FParity : Char; 39 | FPort : string; 40 | FPollingInterval : Integer; 41 | FOnChanged : Event; 42 | 43 | {$REGION 'property access methods'} 44 | function GetBaudRate: Integer; 45 | procedure SetBaudRate(const Value: Integer); 46 | function GetPort: string; 47 | procedure SetPort(const Value: string); 48 | function GetOnChanged: IEvent; 49 | function GetPollingInterval: Integer; 50 | procedure SetPollingInterval(const Value: Integer); 51 | function GetDataBits: Integer; 52 | procedure SetDataBits(const Value: Integer); 53 | function GetStopBits: Integer; 54 | procedure SetStopBits(const Value: Integer); 55 | function GetParity: Char; 56 | procedure SetParity(const Value: Char); 57 | {$ENDREGION} 58 | 59 | protected 60 | procedure Changed; 61 | 62 | public 63 | procedure AfterConstruction; override; 64 | 65 | procedure Assign(Source: TPersistent); override; 66 | 67 | property BaudRate: Integer 68 | read GetBaudRate write SetBaudRate default DEFAULT_BAUDRATE; 69 | 70 | property DataBits: Integer 71 | read GetDataBits write SetDataBits; 72 | 73 | property StopBits: Integer 74 | read GetStopBits write SetStopBits; 75 | 76 | property Parity: Char 77 | read GetParity write SetParity; 78 | 79 | property Port: string 80 | read GetPort write SetPort; 81 | 82 | property PollingInterval: Integer // in ms 83 | read GetPollingInterval write SetPollingInterval 84 | default DEFAULT_POLLING_INTERVAL; 85 | 86 | property OnChanged: IEvent 87 | read GetOnChanged; 88 | 89 | end; 90 | 91 | implementation 92 | 93 | {$REGION 'construction and destruction'} 94 | procedure TComPortSettings.AfterConstruction; 95 | begin 96 | inherited AfterConstruction; 97 | FBaudRate := DEFAULT_BAUDRATE; 98 | FPollingInterval := DEFAULT_POLLING_INTERVAL; 99 | end; 100 | {$ENDREGION} 101 | 102 | {$REGION 'property access methods'} 103 | function TComPortSettings.GetBaudRate: Integer; 104 | begin 105 | Result := FBaudRate; 106 | end; 107 | 108 | procedure TComPortSettings.SetBaudRate(const Value: Integer); 109 | begin 110 | if Value <> BaudRate then 111 | begin 112 | FBaudRate := Value; 113 | Changed; 114 | end; 115 | end; 116 | 117 | function TComPortSettings.GetDataBits: Integer; 118 | begin 119 | Result := FDataBits; 120 | end; 121 | 122 | procedure TComPortSettings.SetDataBits(const Value: Integer); 123 | begin 124 | if Value <> DataBits then 125 | begin 126 | FDataBits := Value; 127 | Changed; 128 | end; 129 | end; 130 | 131 | function TComPortSettings.GetOnChanged: IEvent; 132 | begin 133 | Result := FOnChanged; 134 | end; 135 | 136 | function TComPortSettings.GetPollingInterval: Integer; 137 | begin 138 | Result := FPollingInterval; 139 | end; 140 | 141 | procedure TComPortSettings.SetPollingInterval(const Value: Integer); 142 | begin 143 | if Value <> PollingInterval then 144 | begin 145 | FPollingInterval := Value; 146 | Changed; 147 | end; 148 | end; 149 | 150 | function TComPortSettings.GetParity: Char; 151 | begin 152 | Result := FParity; 153 | end; 154 | 155 | procedure TComPortSettings.SetParity(const Value: Char); 156 | begin 157 | if Value <> Parity then 158 | begin 159 | FParity := Value; 160 | Changed; 161 | end; 162 | end; 163 | 164 | function TComPortSettings.GetPort: string; 165 | begin 166 | Result := FPort; 167 | end; 168 | 169 | procedure TComPortSettings.SetPort(const Value: string); 170 | begin 171 | if Value <> Port then 172 | begin 173 | FPort := Value; 174 | Changed; 175 | end; 176 | end; 177 | 178 | function TComPortSettings.GetStopBits: Integer; 179 | begin 180 | Result := FStopBits; 181 | end; 182 | 183 | procedure TComPortSettings.SetStopBits(const Value: Integer); 184 | begin 185 | if Value <> StopBits then 186 | begin 187 | FStopBits := Value; 188 | Changed; 189 | end; 190 | end; 191 | {$ENDREGION} 192 | 193 | {$REGION 'event dispatch methods'} 194 | procedure TComPortSettings.Changed; 195 | begin 196 | FOnChanged.Invoke(Self); 197 | end; 198 | {$ENDREGION} 199 | 200 | {$REGION 'protected methods'} 201 | procedure TComPortSettings.Assign(Source: TPersistent); 202 | var 203 | CPS: TComPortSettings; 204 | begin 205 | if Source is TComPortSettings then 206 | begin 207 | CPS := TComPortSettings(Source); 208 | FBaudRate := CPS.BaudRate; 209 | FPort := CPS.Port; 210 | FPollingInterval := CPS.PollingInterval; 211 | end 212 | else 213 | inherited Assign(Source); 214 | end; 215 | {$ENDREGION} 216 | 217 | end. 218 | -------------------------------------------------------------------------------- /LogViewer.Resources.pas: -------------------------------------------------------------------------------- 1 | { 2 | Copyright (C) 2013-2025 Tim Sinaeve tim.sinaeve@gmail.com 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | } 16 | 17 | unit LogViewer.Resources; 18 | 19 | { Application wide type definitions, constants and resource strings. } 20 | 21 | interface 22 | 23 | uses 24 | Winapi.Windows, Winapi.Messages, 25 | System.Classes, 26 | Vcl.Graphics, 27 | 28 | DDuce.Logger.Interfaces; 29 | 30 | type 31 | TVKSet = set of Byte; 32 | 33 | var 34 | VK_EDIT_KEYS : TVKSet = [ 35 | VK_DELETE, 36 | VK_BACK, 37 | VK_LEFT, 38 | VK_RIGHT, 39 | VK_HOME, 40 | VK_END, 41 | VK_SHIFT, 42 | VK_CONTROL, 43 | VK_SPACE, 44 | Ord('0')..Ord('9'), 45 | Ord('A')..Ord('Z'), 46 | VK_OEM_1..VK_OEM_102, 47 | VK_NUMPAD0..VK_DIVIDE 48 | ]; 49 | 50 | VK_CTRL_EDIT_KEYS : TVKSet = [ 51 | VK_INSERT, 52 | VK_DELETE, 53 | VK_LEFT, 54 | VK_RIGHT, 55 | VK_HOME, 56 | VK_END, 57 | Ord('C'), 58 | Ord('X'), 59 | Ord('V'), 60 | Ord('Z') 61 | ]; 62 | 63 | VK_SHIFT_EDIT_KEYS : TVKSet = [ 64 | VK_INSERT, 65 | VK_DELETE, 66 | VK_LEFT, 67 | VK_RIGHT, 68 | VK_HOME, 69 | VK_END 70 | ]; 71 | 72 | resourcestring 73 | // message types 74 | SName = 'Name'; 75 | SType = 'Type'; 76 | SValue = 'Value'; 77 | STimestamp = 'Timestamp'; 78 | SProcessName = 'ProcessName'; 79 | SColor = 'Color'; 80 | SBitmap = 'Bitmap'; 81 | SComponent = 'Component'; 82 | SObject = 'Object'; 83 | SPersistent = 'Persistent'; 84 | SInterface = 'Interface'; 85 | SStrings = 'Strings'; 86 | SCheckpoint = 'Checkpoint'; 87 | SDataSet = 'DataSet'; 88 | SScreenShot = 'ScreenShot'; 89 | SText = 'Text'; 90 | SAction = 'Action'; 91 | SInfo = 'Info'; 92 | SWarning = 'Warning'; 93 | SError = 'Error'; 94 | SException = 'Exception'; 95 | SCounter = 'Counter'; 96 | SEnter = 'Enter'; 97 | SLeave = 'Leave'; 98 | 99 | // dashboard columns 100 | SId = 'Id'; 101 | SMessageCount = 'Messagecount'; 102 | 103 | // dashboard action captions 104 | SSubscribe = 'Subscribe'; 105 | 106 | STextMessages = 'Text messages'; 107 | SNotificationMessages = 'Notification messages'; 108 | SValueMessages = 'Value messages'; 109 | STraceMessages = 'Trace messages'; 110 | STrackMethod = 'Track method'; 111 | 112 | // settings dialog 113 | SViewSettings = 'View settings'; 114 | SDisplaySettings = 'Message display'; 115 | SLogLevels = 'Logging levels'; 116 | SWatches = 'Watches'; 117 | SCallStack = 'Callstack'; 118 | SChannelSettings = 'Channel settings'; 119 | SGeneralSettings = 'General settings'; 120 | SAdvanced = 'Advanced'; 121 | 122 | SWinIPC = 'WinIPC'; 123 | SWinODS = 'OutputDebugString API'; 124 | SComPort = 'Serial port'; 125 | SZeroMQ = 'ZeroMQ'; 126 | 127 | SLogLevelAlias = 'Loglevel alias'; 128 | 129 | STimeStampFirst = 'Time first message'; 130 | STimeStampLast = 'Time last message'; 131 | SBytesReceived = 'Data received'; 132 | 133 | // channel receiver names 134 | const 135 | RECEIVERNAME_WINIPC = 'WinIPC'; 136 | RECEIVERNAME_WINODS = 'WinODS'; 137 | RECEIVERNAME_ZEROMQ = 'ZeroMQ'; 138 | RECEIVERNAME_COMPORT = 'ComPort'; 139 | RECEIVERNAME_FILESYSTEM = 'FileSystem'; 140 | 141 | resourcestring 142 | SReceiverCaptionWinIPC = 'Windows IPC receiver'; 143 | SReceiverCaptionWinODS = 'Windows API OutputDebugString receiver'; 144 | SReceiverCaptionZeroMQ = 'ZeroMQ receiver'; 145 | SReceiverCaptionComPort = 'ComPort receiver'; 146 | SReceiverCaptionFileSystem = 'File system receiver'; 147 | 148 | // main form 149 | SReceivedCount = 'Received: %d'; 150 | SSubscriberSource = 'Source: %s (%d)'; 151 | 152 | const 153 | LIBZMQ = 'libzmq'; 154 | 155 | // message viewer 156 | COLUMN_LEVEL = 0; 157 | COLUMN_MAIN = 1; // make variable 158 | COLUMN_VALUENAME = 2; 159 | COLUMN_VALUE = 3; 160 | COLUMN_VALUETYPE = 4; 161 | COLUMN_TIMESTAMP = 5; 162 | 163 | // column names 164 | COLUMNNAME_TIMESTAMP = 'TimeStamp'; 165 | COLUMNNAME_NAME = 'Name'; 166 | COLUMNNAME_VALUE = 'Value'; 167 | COLUMNNAME_VALUETYPE = 'ValueType'; 168 | COLUMNNAME_ID = 'Id'; 169 | 170 | // dashboard 171 | COLUMN_SOURCENAME = 0; 172 | COLUMN_KEY = 1; 173 | COLUMN_SOURCEID = 2; 174 | COLUMN_MESSAGECOUNT = 3; 175 | COLUMN_BYTES_RECEIVED = 4; 176 | COLUMN_TIMESTAMP_FIRST = 5; 177 | COLUMN_TIMESTAMP_LAST = 6; 178 | 179 | // loglevels 180 | COLUMN_LOGLEVEL = 0; 181 | COLUMN_LOGCOLOR = 1; 182 | COLUMN_LOGCOLORVALUE = 2; 183 | COLUMN_LOGALIAS = 3; 184 | 185 | COLUMNNAME_LOGLEVEL = 'Level'; 186 | COLUMNNAME_LOGCOLOR = 'Color'; 187 | COLUMNNAME_LOGCOLORNAME = 'ColorName'; 188 | COLUMNNAME_LOGALIAS = 'Alias'; 189 | 190 | { max. amount of characters allowed to be displayed in the value column of the 191 | logtree. } 192 | MAX_TEXTLENGTH_VALUECOLUMN = 200; 193 | 194 | { TCP port used for debugging another LogViewer instance using ZMQ. } 195 | LOGVIEWER_ZMQ_PORT : Integer = 42134; 196 | 197 | implementation 198 | 199 | end. 200 | -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/XML.json: -------------------------------------------------------------------------------- 1 | { 2 | "Highlighter": { 3 | "Sample": [ 4 | "\r\n", 5 | "\r\n", 6 | "\r\n", 7 | "\r\n", 8 | " Hello, World!\r\n", 9 | "" 10 | ], 11 | "MainRules": { 12 | "Attributes": { 13 | "Element": "Editor" 14 | }, 15 | "SubRules": { 16 | "Range": [ 17 | { 18 | "Type": "BlockComment", 19 | "Attributes": { 20 | "Element": "Comment" 21 | }, 22 | "TokenRange": { 23 | "Open": "" 25 | } 26 | }, 27 | { 28 | "Type": "String", 29 | "Attributes": { 30 | "Element": "Editor" 31 | }, 32 | "TokenRange": { 33 | "Open": "{", 34 | "Close": "}" 35 | } 36 | }, 37 | { 38 | "Name": "XML", 39 | "Type": "Tag", 40 | "Attributes": { 41 | "Element": "ReservedWord" 42 | }, 43 | "TokenRange": { 44 | "Open": "<", 45 | "Close": ">" 46 | }, 47 | "SubRules": { 48 | "Range": [ 49 | { 50 | "Type": "BlockComment", 51 | "Attributes": { 52 | "Element": "Comment" 53 | }, 54 | "TokenRange": { 55 | "Open": "" 57 | } 58 | }, 59 | { 60 | "Type": "String", 61 | "Attributes": { 62 | "Element": "String" 63 | }, 64 | "TokenRange": { 65 | "Open": "\"", 66 | "Close": "\"" 67 | } 68 | }, 69 | { 70 | "Type": "String", 71 | "Attributes": { 72 | "Element": "String" 73 | }, 74 | "Properties": { 75 | "CloseOnEndOfLine": true 76 | }, 77 | "TokenRange": { 78 | "Open": "'", 79 | "Close": "'" 80 | } 81 | }, 82 | { 83 | "Type": "Attribute", 84 | "Attributes": { 85 | "Element": "MethodName" 86 | }, 87 | "Properties": { 88 | "AlternativeClose": [ 89 | ">", 90 | "<" 91 | ] 92 | }, 93 | "TokenRange": { 94 | "Open": " ", 95 | "Close": "=" 96 | }, 97 | "SubRules": { 98 | "KeyList": [ 99 | { 100 | "Type": "Symbol", 101 | "Words": [ 102 | "=" 103 | ], 104 | "Attributes": { 105 | "Element": "Symbol" 106 | } 107 | } 108 | ] 109 | } 110 | } 111 | ], 112 | "KeyList": [ 113 | { 114 | "Type": "Symbol", 115 | "Words": [ 116 | ">", 117 | "/", 118 | "=", 119 | "?" 120 | ], 121 | "Attributes": { 122 | "Element": "Symbol" 123 | } 124 | } 125 | ] 126 | } 127 | } 128 | ], 129 | "KeyList": [ 130 | { 131 | "Type": "Symbol", 132 | "Words": [ 133 | "<" 134 | ], 135 | "Attributes": { 136 | "Element": "Symbol" 137 | } 138 | } 139 | ] 140 | } 141 | } 142 | }, 143 | "CodeFolding": { 144 | "Ranges": [ 145 | { 146 | "Options": { 147 | "FoldTags": "true" 148 | }, 149 | "SkipRegion": [ 150 | { 151 | "OpenToken": "'", 152 | "CloseToken": "'", 153 | "RegionType": "SingleLineString" 154 | }, 155 | { 156 | "OpenToken": "\"", 157 | "CloseToken": "\"", 158 | "RegionType": "SingleLineString" 159 | }, 160 | { 161 | "OpenToken": "", 163 | "RegionType": "MultiLine" 164 | } 165 | ] 166 | } 167 | ] 168 | }, 169 | "MatchingPair": { 170 | "Pairs": [ 171 | { 172 | "OpenToken": "'", 173 | "CloseToken": "'" 174 | }, 175 | { 176 | "OpenToken": "\"", 177 | "CloseToken": "\"" 178 | }, 179 | { 180 | "OpenToken": "<", 181 | "CloseToken": ">" 182 | } 183 | ] 184 | }, 185 | "CompletionProposal": { 186 | "SkipRegion": [ 187 | { 188 | "OpenToken": "'", 189 | "CloseToken": "'", 190 | "RegionType": "SingleLineString" 191 | }, 192 | { 193 | "OpenToken": "\"", 194 | "CloseToken": "\"", 195 | "RegionType": "SingleLineString" 196 | }, 197 | { 198 | "OpenToken": "", 200 | "RegionType": "MultiLine" 201 | } 202 | ] 203 | } 204 | } 205 | -------------------------------------------------------------------------------- /Bin/Win32/Highlighters/XSL.json: -------------------------------------------------------------------------------- 1 | { 2 | "Highlighter": { 3 | "Sample": [ 4 | "\r\n", 5 | "\r\n", 6 | " \r\n", 7 | " \r\n", 8 | " \r\n", 9 | " \r\n", 10 | " \r\n", 11 | " \r\n", 12 | "

\r\n", 13 | " \r\n", 14 | "

\r\n", 15 | " \r\n", 16 | " \r\n", 17 | " \r\n", 18 | "
\r\n", 19 | " \r\n", 20 | "
from
\r\n", 21 | "
\r\n", 22 | "
" 23 | ], 24 | "MainRules": { 25 | "Attributes": { 26 | "Element": "Editor" 27 | }, 28 | "SubRules": { 29 | "Range": [ 30 | { 31 | "Type": "BlockComment", 32 | "Attributes": { 33 | "Element": "Comment" 34 | }, 35 | "TokenRange": { 36 | "Open": "" 38 | } 39 | }, 40 | { 41 | "Name": "XML", 42 | "Type": "Tag", 43 | "Attributes": { 44 | "Element": "ReservedWord" 45 | }, 46 | "TokenRange": { 47 | "Open": "<", 48 | "Close": ">" 49 | }, 50 | "SubRules": { 51 | "Range": [ 52 | { 53 | "Type": "BlockComment", 54 | "Attributes": { 55 | "Element": "Comment" 56 | }, 57 | "TokenRange": { 58 | "Open": "" 60 | } 61 | }, 62 | { 63 | "Type": "String", 64 | "Attributes": { 65 | "Element": "String" 66 | }, 67 | "TokenRange": { 68 | "Open": "\"", 69 | "Close": "\"" 70 | } 71 | }, 72 | { 73 | "Type": "String", 74 | "Attributes": { 75 | "Element": "String" 76 | }, 77 | "Properties": { 78 | "CloseOnEndOfLine": true 79 | }, 80 | "TokenRange": { 81 | "Open": "'", 82 | "Close": "'" 83 | } 84 | }, 85 | { 86 | "Type": "Attribute", 87 | "Attributes": { 88 | "Element": "MethodName" 89 | }, 90 | "Properties": { 91 | "AlternativeClose": [ 92 | ">", 93 | "<" 94 | ] 95 | }, 96 | "TokenRange": { 97 | "Open": " ", 98 | "Close": "=" 99 | }, 100 | "SubRules": { 101 | "KeyList": [ 102 | { 103 | "Type": "Symbol", 104 | "Words": [ 105 | "=" 106 | ], 107 | "Attributes": { 108 | "Element": "Symbol" 109 | } 110 | } 111 | ] 112 | } 113 | } 114 | ], 115 | "KeyList": [ 116 | { 117 | "Type": "Symbol", 118 | "Words": [ 119 | ">", 120 | "/", 121 | "=", 122 | "?" 123 | ], 124 | "Attributes": { 125 | "Element": "Symbol" 126 | } 127 | } 128 | ] 129 | } 130 | } 131 | ], 132 | "KeyList": [ 133 | { 134 | "Type": "Symbol", 135 | "Words": [ 136 | "<" 137 | ], 138 | "Attributes": { 139 | "Element": "Symbol" 140 | } 141 | } 142 | ], 143 | "Set": [ 144 | { 145 | "Type": "Number", 146 | "Symbols": "0123456789", 147 | "Attributes": { 148 | "Element": "Number" 149 | } 150 | }, 151 | { 152 | "Type": "Float", 153 | "Symbols": ".0123456789", 154 | "Attributes": { 155 | "Element": "Number" 156 | } 157 | } 158 | ] 159 | } 160 | } 161 | }, 162 | "MatchingPair": { 163 | "Pairs": [ 164 | { 165 | "OpenToken": "'", 166 | "CloseToken": "'" 167 | }, 168 | { 169 | "OpenToken": "\"", 170 | "CloseToken": "\"" 171 | }, 172 | { 173 | "OpenToken": "<", 174 | "CloseToken": ">" 175 | } 176 | ] 177 | }, 178 | "CompletionProposal": { 179 | "SkipRegion": [ 180 | { 181 | "OpenToken": "'", 182 | "CloseToken": "'", 183 | "RegionType": "SingleLineString" 184 | }, 185 | { 186 | "OpenToken": "\"", 187 | "CloseToken": "\"", 188 | "RegionType": "SingleLineString" 189 | }, 190 | { 191 | "OpenToken": "", 193 | "RegionType": "MultiLine" 194 | } 195 | ] 196 | } 197 | } 198 | --------------------------------------------------------------------------------