From d0dad6bc962431ae9716f04dc7e52b6a1a7c3836 Mon Sep 17 00:00:00 2001 From: Nicolas Potel Date: Thu, 5 Feb 2026 13:12:39 +0100 Subject: [PATCH 01/36] feat: adding records to browser --- .../BaselineOfDebuggingSpy.class.st | 16 ++-- RecordBrowser/RecordBrowserPresenter.class.st | 84 +++++++++++++++++++ RecordBrowser/package.st | 1 + 3 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 RecordBrowser/RecordBrowserPresenter.class.st create mode 100644 RecordBrowser/package.st diff --git a/BaselineOfDebuggingSpy/BaselineOfDebuggingSpy.class.st b/BaselineOfDebuggingSpy/BaselineOfDebuggingSpy.class.st index 7d92234..abdb873 100644 --- a/BaselineOfDebuggingSpy/BaselineOfDebuggingSpy.class.st +++ b/BaselineOfDebuggingSpy/BaselineOfDebuggingSpy.class.st @@ -9,15 +9,13 @@ Class { BaselineOfDebuggingSpy >> baseline: spec [ - - spec baseline: 'ExperimentModel' with: [ - spec repository: - 'github://Pharo-XP-Tools/ExperimentModel:main' ]. - - spec for: #common do: [ - spec postLoadDoIt: #postloadAction. - spec package: 'DebuggingSpy'. - spec package: 'DebuggingSpy-Tests' ] + spec baseline: 'ExperimentModel' with: [ spec repository: 'github://Pharo-XP-Tools/ExperimentModel:main' ]. + + spec for: #common do: [ + spec postLoadDoIt: #postloadAction. + spec package: 'DebuggingSpy'. + spec package: 'DebuggingSpy-Tests'. + spec package: 'RecordBrowser' ] ] { #category : 'baselines' } diff --git a/RecordBrowser/RecordBrowserPresenter.class.st b/RecordBrowser/RecordBrowserPresenter.class.st new file mode 100644 index 0000000..b2fa745 --- /dev/null +++ b/RecordBrowser/RecordBrowserPresenter.class.st @@ -0,0 +1,84 @@ +" +Record browser for DsSpy data. +" +Class { + #name : 'RecordBrowserPresenter', + #superclass : 'SpPresenter', + #instVars : [ + 'files', + 'listPresenter', + 'addButton', + 'toolbar', + 'fileContent' + ], + #category : 'RecordBrowser', + #package : 'RecordBrowser' +} + +{ #category : 'adding' } +RecordBrowserPresenter >> addFile: newFile [ + + files add: newFile. + listPresenter items: files +] + +{ #category : 'layout' } +RecordBrowserPresenter >> defaultLayout [ + + ^ SpBoxLayout newVertical + add: toolbar expand: false; + add: (SpPanedLayout newHorizontal + positionOfSlider: 30 percent; + add: listPresenter; + add: fileContent; + yourself); + yourself +] + +{ #category : 'accessing' } +RecordBrowserPresenter >> files [ + + ^ files +] + +{ #category : 'initialization' } +RecordBrowserPresenter >> initializePresenters [ + + files := OrderedCollection new. + + addButton := SpToolbarButtonPresenter new + label: 'Add'; + icon: (self iconNamed: #smallAdd); + help: 'Add a new record'; + action: [ self openAddFileDialog ]; + yourself. + + toolbar := self newToolbar addItem: addButton. + + listPresenter := self newList + items: files; + display: [ :file | file basenameWithoutExtension ]; + whenSelectionChangedDo: [ :file | file ifNotNil: [ self updateContentViewer: file selectedItem ] ]. + + fileContent := self newText beNotEditable +] + +{ #category : 'operations' } +RecordBrowserPresenter >> openAddFileDialog [ + + | fileNames | + fileNames := StOpenFilePresenter chooseModal. + fileNames do: [ :file | self addFile: file asFileReference ] +] + +{ #category : 'operations' } +RecordBrowserPresenter >> updateContentViewer: aFileReference [ + + fileContent text: aFileReference contents +] + +{ #category : 'accessing' } +RecordBrowserPresenter >> windowTitle [ + + ^ 'Debugging record browser' +] diff --git a/RecordBrowser/package.st b/RecordBrowser/package.st new file mode 100644 index 0000000..6e314a3 --- /dev/null +++ b/RecordBrowser/package.st @@ -0,0 +1 @@ +Package { #name : 'RecordBrowser' } From 8b1479ca7ddabb8c3599c0530e79a37ac806d70f Mon Sep 17 00:00:00 2001 From: Nicolas Potel Date: Thu, 5 Feb 2026 18:12:07 +0100 Subject: [PATCH 02/36] feat: displaying history on tree table --- RecordBrowser/RecordBrowserPresenter.class.st | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/RecordBrowser/RecordBrowserPresenter.class.st b/RecordBrowser/RecordBrowserPresenter.class.st index b2fa745..4ac26fd 100644 --- a/RecordBrowser/RecordBrowserPresenter.class.st +++ b/RecordBrowser/RecordBrowserPresenter.class.st @@ -9,7 +9,8 @@ Class { 'listPresenter', 'addButton', 'toolbar', - 'fileContent' + 'selectedRecordsPresenter', + 'selectedRecords' ], #category : 'RecordBrowser', #package : 'RecordBrowser' @@ -22,6 +23,15 @@ RecordBrowserPresenter >> addFile: newFile [ listPresenter items: files ] +{ #category : 'initialization' } +RecordBrowserPresenter >> connectPresenters [ + + selectedRecords ifNotNil: [ + selectedRecordsPresenter + roots: selectedRecords records; + children: [ :item | OrderedCollection new ] ] +] + { #category : 'layout' } RecordBrowserPresenter >> defaultLayout [ @@ -30,7 +40,7 @@ RecordBrowserPresenter >> defaultLayout [ add: (SpPanedLayout newHorizontal positionOfSlider: 30 percent; add: listPresenter; - add: fileContent; + add: selectedRecordsPresenter; yourself); yourself ] @@ -60,21 +70,32 @@ RecordBrowserPresenter >> initializePresenters [ display: [ :file | file basenameWithoutExtension ]; whenSelectionChangedDo: [ :file | file ifNotNil: [ self updateContentViewer: file selectedItem ] ]. - fileContent := self newText beNotEditable + selectedRecordsPresenter := self newTreeTable + addColumn: (SpStringTableColumn title: 'Event type' evaluated: [ :item | item eventName asString ]); + addColumn: (SpStringTableColumn title: 'Date' evaluated: [ :item | item dateTime asString ]); + beResizable; + yourself ] { #category : 'operations' } RecordBrowserPresenter >> openAddFileDialog [ | fileNames | - fileNames := StOpenFilePresenter chooseModal. + fileNames := StOpenFilePresenter new + defaultFolder: DSSpy logger loggingDirectory; + openModal. fileNames do: [ :file | self addFile: file asFileReference ] ] { #category : 'operations' } RecordBrowserPresenter >> updateContentViewer: aFileReference [ - fileContent text: aFileReference contents + | raw history | + aFileReference ifNotNil: [ + raw := DSSpy materialize: aFileReference. + history := DSRecordHistory on: raw. + selectedRecords := history. + self connectPresenters ] ] { #category : 'accessing' } From 23ec5e0ee5744fc870e7eae199da4f9514d8bbd3 Mon Sep 17 00:00:00 2001 From: Nicolas Potel Date: Fri, 6 Feb 2026 09:52:09 +0100 Subject: [PATCH 03/36] feat: open history when adding a file --- RecordBrowser/RecordBrowserPresenter.class.st | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/RecordBrowser/RecordBrowserPresenter.class.st b/RecordBrowser/RecordBrowserPresenter.class.st index 4ac26fd..e6a6da0 100644 --- a/RecordBrowser/RecordBrowserPresenter.class.st +++ b/RecordBrowser/RecordBrowserPresenter.class.st @@ -17,10 +17,11 @@ Class { } { #category : 'adding' } -RecordBrowserPresenter >> addFile: newFile [ +RecordBrowserPresenter >> addFile: aFileReference [ - files add: newFile. - listPresenter items: files + files add: aFileReference. + listPresenter items: files. + self updateContentViewer: aFileReference ] { #category : 'initialization' } From 486cfedb8e511a59f555f4c78e9548ef093a531a Mon Sep 17 00:00:00 2001 From: Nicolas Potel Date: Fri, 6 Feb 2026 15:28:50 +0100 Subject: [PATCH 04/36] feat: DSSpy button & start/stop buttons on toolbar --- RecordBrowser/RecordBrowserPresenter.class.st | 106 ++++++++++++++---- 1 file changed, 83 insertions(+), 23 deletions(-) diff --git a/RecordBrowser/RecordBrowserPresenter.class.st b/RecordBrowser/RecordBrowserPresenter.class.st index e6a6da0..cb37b80 100644 --- a/RecordBrowser/RecordBrowserPresenter.class.st +++ b/RecordBrowser/RecordBrowserPresenter.class.st @@ -1,29 +1,62 @@ " -Record browser for DsSpy data. +Debugging Spy interface. " Class { #name : 'RecordBrowserPresenter', #superclass : 'SpPresenter', #instVars : [ 'files', - 'listPresenter', - 'addButton', 'toolbar', 'selectedRecordsPresenter', - 'selectedRecords' + 'selectedRecords', + 'addedFilesPresenter', + 'startRecordButton', + 'stopRecordButton', + 'addRecordButton' + ], + #classInstVars : [ + 'browser' ], #category : 'RecordBrowser', #package : 'RecordBrowser' } +{ #category : 'accessing' } +RecordBrowserPresenter class >> browser [ + + ^ browser +] + +{ #category : 'world menu' } +RecordBrowserPresenter class >> menuCommandOn: aBuilder [ + + + (aBuilder item: #DSSpy) + order: 100; + help: 'Open the Debugging Spy browser.'; + action: [ self new open ] +] + { #category : 'adding' } RecordBrowserPresenter >> addFile: aFileReference [ files add: aFileReference. - listPresenter items: files. + addedFilesPresenter items: files. self updateContentViewer: aFileReference ] +{ #category : 'layout' } +RecordBrowserPresenter >> addRecordButton [ + + ^ addRecordButton ifNil: [ + addRecordButton := SpToolbarButtonPresenter new + label: 'Add'; + icon: (self iconNamed: #smallAdd); + help: 'Add a new record.'; + action: [ self openAddFileDialog ]; + yourself ] +] + { #category : 'initialization' } RecordBrowserPresenter >> connectPresenters [ @@ -40,7 +73,7 @@ RecordBrowserPresenter >> defaultLayout [ add: toolbar expand: false; add: (SpPanedLayout newHorizontal positionOfSlider: 30 percent; - add: listPresenter; + add: addedFilesPresenter; add: selectedRecordsPresenter; yourself); yourself @@ -49,31 +82,26 @@ RecordBrowserPresenter >> defaultLayout [ { #category : 'accessing' } RecordBrowserPresenter >> files [ - ^ files + ^ files ifNil: [ files := OrderedCollection new ] ] { #category : 'initialization' } RecordBrowserPresenter >> initializePresenters [ - files := OrderedCollection new. - - addButton := SpToolbarButtonPresenter new - label: 'Add'; - icon: (self iconNamed: #smallAdd); - help: 'Add a new record'; - action: [ self openAddFileDialog ]; - yourself. - - toolbar := self newToolbar addItem: addButton. + toolbar := self newToolbar + addItem: self addRecordButton; + addItem: self startRecordButton; + addItem: self stopRecordButton. - listPresenter := self newList - items: files; - display: [ :file | file basenameWithoutExtension ]; - whenSelectionChangedDo: [ :file | file ifNotNil: [ self updateContentViewer: file selectedItem ] ]. + addedFilesPresenter := self newList + items: self files; + display: [ :file | file basenameWithoutExtension ]; + whenSelectionChangedDo: [ :file | file ifNotNil: [ self updateContentViewer: file selectedItem ] ]; + yourself. selectedRecordsPresenter := self newTreeTable addColumn: (SpStringTableColumn title: 'Event type' evaluated: [ :item | item eventName asString ]); - addColumn: (SpStringTableColumn title: 'Date' evaluated: [ :item | item dateTime asString ]); + addColumn: (SpStringTableColumn title: 'Time' evaluated: [ :item | item dateTime asTime print24 ]); beResizable; yourself ] @@ -85,7 +113,39 @@ RecordBrowserPresenter >> openAddFileDialog [ fileNames := StOpenFilePresenter new defaultFolder: DSSpy logger loggingDirectory; openModal. - fileNames do: [ :file | self addFile: file asFileReference ] + fileNames ifNotNil: [ fileNames do: [ :file | self addFile: file asFileReference ] ] +] + +{ #category : 'layout' } +RecordBrowserPresenter >> startRecordButton [ + + ^ startRecordButton ifNil: [ + startRecordButton := SpToolbarButtonPresenter new + label: 'Start'; + icon: (self iconNamed: #glamorousGo); + help: 'Start recording events.'; + action: [ + DSSpyInstrumenter instrumentSystem. + startRecordButton enabled: false. + stopRecordButton enabled: true ]; + enabled: DSSpy recordingSession not; + yourself ] +] + +{ #category : 'layout' } +RecordBrowserPresenter >> stopRecordButton [ + + ^ stopRecordButton ifNil: [ + stopRecordButton := SpToolbarButtonPresenter new + label: 'Stop'; + icon: (self iconNamed: #stop); + help: 'Stop recording events.'; + action: [ + DSSpyInstrumenter stopInstrumentation. + startRecordButton enabled: true. + stopRecordButton enabled: false ]; + enabled: DSSpy recordingSession; + yourself ] ] { #category : 'operations' } From f911360549248d08004d09f324e1d56946a58d01 Mon Sep 17 00:00:00 2001 From: Nicolas Potel Date: Mon, 9 Feb 2026 17:50:45 +0100 Subject: [PATCH 05/36] feat: adding a recorder window fix: using now only one instance of browser refactor: renaming package --- .../DSRecordBrowserPresenter.class.st | 113 +++++++++++----- .../DSRecorderWindow.class.st | 124 ++++++++++++++++++ DebuggingSpy-Browser/package.st | 1 + RecordBrowser/package.st | 1 - 4 files changed, 202 insertions(+), 37 deletions(-) rename RecordBrowser/RecordBrowserPresenter.class.st => DebuggingSpy-Browser/DSRecordBrowserPresenter.class.st (59%) create mode 100644 DebuggingSpy-Browser/DSRecorderWindow.class.st create mode 100644 DebuggingSpy-Browser/package.st delete mode 100644 RecordBrowser/package.st diff --git a/RecordBrowser/RecordBrowserPresenter.class.st b/DebuggingSpy-Browser/DSRecordBrowserPresenter.class.st similarity index 59% rename from RecordBrowser/RecordBrowserPresenter.class.st rename to DebuggingSpy-Browser/DSRecordBrowserPresenter.class.st index cb37b80..a84be7e 100644 --- a/RecordBrowser/RecordBrowserPresenter.class.st +++ b/DebuggingSpy-Browser/DSRecordBrowserPresenter.class.st @@ -1,44 +1,65 @@ " -Debugging Spy interface. +Debugging Spy main interface thats includes : +- an interface that could be opened with a button on the topside bar +- a button that adds files to the list displayed on the interface +- a button to start the instrumentation and another to stop it +- an interface that shows the content of a selected file " Class { - #name : 'RecordBrowserPresenter', + #name : 'DSRecordBrowserPresenter', #superclass : 'SpPresenter', #instVars : [ 'files', - 'toolbar', - 'selectedRecordsPresenter', 'selectedRecords', - 'addedFilesPresenter', 'startRecordButton', 'stopRecordButton', - 'addRecordButton' + 'addRecordButton', + 'toolbar', + 'addedFilesPresenter', + 'selectedRecordsPresenter', + 'recorderWindow' ], #classInstVars : [ - 'browser' + 'presenterWindow' ], - #category : 'RecordBrowser', - #package : 'RecordBrowser' + #category : 'DebuggingSpy-Browser', + #package : 'DebuggingSpy-Browser' } -{ #category : 'accessing' } -RecordBrowserPresenter class >> browser [ - - ^ browser -] - { #category : 'world menu' } -RecordBrowserPresenter class >> menuCommandOn: aBuilder [ +DSRecordBrowserPresenter class >> menuCommandOn: aBuilder [ + "Adds the DSSpy button on topside bar, the order is 100 just to make sure the DSSpy button is at the end" (aBuilder item: #DSSpy) order: 100; help: 'Open the Debugging Spy browser.'; - action: [ self new open ] + action: [ self toggleBrowser ] +] + +{ #category : 'initialization' } +DSRecordBrowserPresenter class >> resetBrowser [ + +