Added toolbar and icons. Show all thread groups and threads in stack view.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Mon, 22 Sep 2014 09:57:54 +0100
changeset 23 ed5f4b55cee5
parent 22 6684f4d82301
child 24 c33a063cb363
Added toolbar and icons. Show all thread groups and threads in stack view.
VDBDebuggerApplication.st
VDBFramePresenter.st
VDBModelPresenter.st
VDBStackApplication.st
VDBThreadGroupPresenter.st
VDBThreadPresenter.st
application/applicationWinRC.rc
tests/tests.rc
vdb.rc
--- a/VDBDebuggerApplication.st	Sun Sep 21 23:46:10 2014 +0100
+++ b/VDBDebuggerApplication.st	Mon Sep 22 09:57:54 2014 +0100
@@ -57,8 +57,17 @@
                   (Array
                      
                     (SubChannelInfoSpec
-                       subAspect: selectionHolder
+                       subAspect: selectedFrameHolder
                        aspect: selectedFrameHolder
+                     ) 
+                    (SubChannelInfoSpec
+                       subAspect: selectedThreadGroupHolder
+                       aspect: selectedThreadGroupHolder
+                     )
+                     
+                    (SubChannelInfoSpec
+                       subAspect: selectedThreadHolder
+                       aspect: selectedThreadHolder
                      )
                    )
                    createNewApplication: true
@@ -100,7 +109,7 @@
                 )
               
              )
-             handles: (Any 0.33333333333333337 0.66666666666666674 1.0)
+             handles: (Any 0.33333333333333343 0.66666666666666685 1.0)
            )
           )
         
@@ -235,46 +244,44 @@
      #(Menu
         (
          (MenuItem
-            enabled: canExecRunHolder
             label: 'Run'
             itemValue: doExecRun
             labelImage: (ResourceRetriever VDBIconLibrary #'i14089_start_task' 'Run')
           )
          (MenuItem
-            enabled: canExecResumeHolder
             label: 'Resume'
             itemValue: doExecResume
             labelImage: (ResourceRetriever VDBIconLibrary #'resume_co' 'Resume')
           )
          (MenuItem
-            enabled: canExecSuspendHolder
             label: 'Suspend'
             itemValue: doExecSuspend
             labelImage: (ResourceRetriever VDBIconLibrary #'suspend_co' 'Suspend')
           )
          (MenuItem
-            enabled: canExecTerminateHolder
             label: 'Terminate'
             itemValue: doExecTerminate
             labelImage: (ResourceRetriever VDBIconLibrary #'terminate_co' 'Terminate')
           )
          (MenuItem
+            label: 'Restart'
+            itemValue: doExecRestart
+            labelImage: (ResourceRetriever VDBIconLibrary #'i18776_term_restart' 'Restart')
+          )
+         (MenuItem
             label: '-'
           )
          (MenuItem
-            enabled: canExecStepOverHolder
             label: 'Step Over'
             itemValue: doExecStepOver
             labelImage: (ResourceRetriever VDBIconLibrary #'stepover_co' 'Step Over')
           )
          (MenuItem
-            enabled: canExecStepIntoHolder
             label: 'Step Into'
             itemValue: doExecStepInto
             labelImage: (ResourceRetriever VDBIconLibrary #'stepinto_co' 'Step Into')
           )
          (MenuItem
-            enabled: canExecStepReturnHolder
             label: 'Step Return'
             itemValue: doExecStepReturn
             labelImage: (ResourceRetriever VDBIconLibrary #'stepinto_co' 'Step Return')
@@ -283,8 +290,6 @@
         nil
         nil
       )
-
-    "Modified: / 21-09-2014 / 22:40:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 mainMenu
--- a/VDBFramePresenter.st	Sun Sep 21 23:46:10 2014 +0100
+++ b/VDBFramePresenter.st	Mon Sep 22 09:57:54 2014 +0100
@@ -7,12 +7,16 @@
 	category:'VDB-Presentation'
 !
 
-!VDBFramePresenter methodsFor:'displaying'!
+!VDBFramePresenter methodsFor:'accessing'!
 
-displayString
+frame
+    ^ frame
+!
+
+label
     ^ frame displayString
 
-    "Created: / 21-09-2014 / 23:31:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 22-09-2014 / 00:14:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !VDBFramePresenter methodsFor:'initialization'!
@@ -36,3 +40,11 @@
     "Created: / 21-09-2014 / 23:37:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!VDBFramePresenter methodsFor:'testing'!
+
+isFramePresenter
+    ^ true
+
+    "Created: / 21-09-2014 / 23:54:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/VDBModelPresenter.st	Sun Sep 21 23:46:10 2014 +0100
+++ b/VDBModelPresenter.st	Mon Sep 22 09:57:54 2014 +0100
@@ -17,3 +17,23 @@
     "Created: / 21-09-2014 / 23:43:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!VDBModelPresenter methodsFor:'testing'!
+
+isFramePresenter
+    ^ false
+
+    "Created: / 21-09-2014 / 23:53:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+isThreadGroupPresenter
+    ^ false
+
+    "Created: / 21-09-2014 / 23:54:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+isThreadPresenter
+    ^ false
+
+    "Created: / 21-09-2014 / 23:54:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/VDBStackApplication.st	Sun Sep 21 23:46:10 2014 +0100
+++ b/VDBStackApplication.st	Mon Sep 22 09:57:54 2014 +0100
@@ -1,7 +1,8 @@
 "{ Package: 'jv:vdb' }"
 
 VDBAbstractApplication subclass:#VDBStackApplication
-	instanceVariableNames:'selectionHolder internalListHolder internalSelectionHolder'
+	instanceVariableNames:'selectedThreadGroupHolder selectedThreadHolder
+		selectedFrameHolder internalListHolder internalSelectionHolder'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'VDB-UI-Others'
@@ -42,18 +43,54 @@
              name: 'Stack'
              layout: (LayoutFrame 0 0 0 0 0 1 0 1)
              model: internalSelectionHolder
+             menu: contextMenu
              hasHorizontalScrollBar: true
              hasVerticalScrollBar: true
              listModel: internalListHolder
              useIndex: false
              highlightMode: line
+             useDefaultIcons: false
+             showRoot: false
            )
           )
         
        )
      )
+! !
 
-    "Modified: / 20-09-2014 / 23:53:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!VDBStackApplication class methodsFor:'menu specs'!
+
+contextMenu
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+
+    "
+     MenuEditor new openOnClass:VDBStackApplication andSelector:#contextMenu
+     (Menu new fromLiteralArrayEncoding:(VDBStackApplication contextMenu)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(Menu
+        (
+         (MenuItem
+            enabled: hasSelection
+            label: 'Inspect Model'
+            itemValue: doInspectModel
+          )
+         (MenuItem
+            label: 'Inspect Presenter'
+            itemValue: doInspectPresenter
+          )
+         )
+        nil
+        nil
+      )
 ! !
 
 !VDBStackApplication class methodsFor:'plugIn spec'!
@@ -71,39 +108,103 @@
 
     ^ #(
         #debuggerHolder
-        #selectionHolder
+        #selectedFrameHolder
+        #selectedThreadGroupHolder
+        #selectedThreadHolder
       ).
 
 ! !
 
 !VDBStackApplication methodsFor:'aspects'!
 
-selectionHolder
+selectedFrameHolder
     "return/create the 'selectionHolder' value holder (automatically generated)"
 
-    selectionHolder isNil ifTrue:[
-        selectionHolder := ValueHolder new.
-        selectionHolder addDependent:self.
+    selectedFrameHolder isNil ifTrue:[
+        selectedFrameHolder := ValueHolder new.
+        selectedFrameHolder addDependent:self.
     ].
-    ^ selectionHolder
+    ^ selectedFrameHolder
+
+    "Created: / 21-09-2014 / 23:51:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-selectionHolder:something
+selectedFrameHolder:aValueModel
     "set the 'selectionHolder' value holder (automatically generated)"
 
     |oldValue newValue|
 
-    selectionHolder notNil ifTrue:[
-        oldValue := selectionHolder value.
-        selectionHolder removeDependent:self.
+    selectedFrameHolder notNil ifTrue:[
+        oldValue := selectedFrameHolder value.
+        selectedFrameHolder removeDependent:self.
+    ].
+    selectedFrameHolder := aValueModel.
+    selectedFrameHolder notNil ifTrue:[
+        selectedFrameHolder addDependent:self.
+    ].
+    newValue := selectedFrameHolder value.
+    oldValue ~~ newValue ifTrue:[
+        self update:#value with:newValue from:selectedFrameHolder.
+    ].
+
+    "Created: / 21-09-2014 / 23:50:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+selectedThreadGroupHolder
+    "return/create the 'selectedThreadGroupHolder' value holder (automatically generated)"
+
+    selectedThreadGroupHolder isNil ifTrue:[
+        selectedThreadGroupHolder := ValueHolder new.
+        selectedThreadGroupHolder addDependent:self.
+    ].
+    ^ selectedThreadGroupHolder
+!
+
+selectedThreadGroupHolder:something
+    "set the 'selectedThreadGroupHolder' value holder (automatically generated)"
+
+    |oldValue newValue|
+
+    selectedThreadGroupHolder notNil ifTrue:[
+        oldValue := selectedThreadGroupHolder value.
+        selectedThreadGroupHolder removeDependent:self.
     ].
-    selectionHolder := something.
-    selectionHolder notNil ifTrue:[
-        selectionHolder addDependent:self.
+    selectedThreadGroupHolder := something.
+    selectedThreadGroupHolder notNil ifTrue:[
+        selectedThreadGroupHolder addDependent:self.
+    ].
+    newValue := selectedThreadGroupHolder value.
+    oldValue ~~ newValue ifTrue:[
+        self update:#value with:newValue from:selectedThreadGroupHolder.
+    ].
+!
+
+selectedThreadHolder
+    "return/create the 'selectedThreadHolder' value holder (automatically generated)"
+
+    selectedThreadHolder isNil ifTrue:[
+        selectedThreadHolder := ValueHolder new.
+        selectedThreadHolder addDependent:self.
     ].
-    newValue := selectionHolder value.
+    ^ selectedThreadHolder
+!
+
+selectedThreadHolder:something
+    "set the 'selectedThreadHolder' value holder (automatically generated)"
+
+    |oldValue newValue|
+
+    selectedThreadHolder notNil ifTrue:[
+        oldValue := selectedThreadHolder value.
+        selectedThreadHolder removeDependent:self.
+    ].
+    selectedThreadHolder := something.
+    selectedThreadHolder notNil ifTrue:[
+        selectedThreadHolder addDependent:self.
+    ].
+    newValue := selectedThreadHolder value.
     oldValue ~~ newValue ifTrue:[
-        self update:#value with:newValue from:selectionHolder.
+        self update:#value with:newValue from:selectedThreadHolder.
     ].
 ! !
 
@@ -139,7 +240,7 @@
 
     "stub code automatically generated - please change as required"
 
-    sender == selectionHolder ifTrue:[
+    sender == selectedFrameHolder ifTrue:[
          self updateInternalSelection.
          ^ self.
     ].
@@ -153,75 +254,66 @@
 !
 
 updateInternalList
-    | inferior thread root list |
+    | root list |
 
     debugger isNil ifTrue:[  
         self internalListHolder root children:#().
         ^ self.
     ].
-    debugger inferiors isEmptyOrNil ifTrue:[ 
-        self internalListHolder root children:#().
-        ^ self.
-    ].
-    debugger inferiors size > 1 ifTrue:[ 
-        self error: 'Only one inferior supported'.
-        ^ self.
-    ].
-    inferior := debugger inferiors anElement.
-    inferior threads isEmptyOrNil ifTrue:[ 
-        self internalListHolder root children:#().
-        ^ self.
-    ].
-    debugger inferiors size > 1 ifTrue:[ 
-        self error: 'Only one thread supported (yet)'.
-        ^ self.
-    ].          
-    thread := inferior threads anElement.
-    thread isTerminated ifTrue:[ 
-        self internalListHolder root children:#().
-        ^ self.
-    ].
     root := self internalListHolder root.
-    list := thread stack collect:[ :frame | 
-        HierarchicalItemWithLabelAndIconAndValue new
-            label: frame printString;
-            value: frame;
-            parent: root.
-    ].
-    root children: list.
+    list := debugger inferiors collect:[ :inferior | VDBThreadGroupPresenter new setThreadGroup: inferior; parent: root ].  
+    root children: list.  
     root expand.
-    list notEmptyOrNil ifTrue:[ 
-        self internalSelectionHolder value: list first.
+    root children size == 1 ifTrue:[ 
+        root children anElement expand.
+        root children anElement children size == 1 ifTrue:[ 
+            root children anElement children anElement expand.
+        ]
     ].
 
     "Created: / 20-09-2014 / 23:05:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 21-09-2014 / 00:31:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 22-09-2014 / 00:04:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 updateInternalSelection
-    | selection internalSelection |
-
-    selection := self selectionHolder value.
-    internalSelection := self internalListHolder value 
-            detect:[:e | e value == selection ] ifNone:[ nil ].
-    self internalSelectionHolder
-        value: internalSelection
-        withoutNotifying: self.
+"/    | selection internalSelection |
+"/
+"/    selection := self selectionHolder value.
+"/    internalSelection := self internalListHolder value 
+"/            detect:[:e | e value == selection ] ifNone:[ nil ].
+"/    self internalSelectionHolder
+"/        value: internalSelection
+"/        withoutNotifying: self.
 
     "Created: / 20-09-2014 / 23:05:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 21-09-2014 / 23:52:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 updateSelection
-    | internalSelection selection |
+    | internalSelection frame thread group |
 
     internalSelection := self internalSelectionHolder value.
-    selection := internalSelection value.
+    internalSelection notNil ifTrue:[ 
+        internalSelection isFramePresenter ifTrue:[
+            frame := internalSelection frame.
+            thread := frame thread.
+            group := thread group.
+        ] ifFalse:[ 
+            internalSelection isThreadPresenter ifTrue:[ 
+                thread := internalSelection thread.
+                group := thread group.
+            ] ifFalse:[  
+                group := internalSelection threadGroup.
+            ]
+        ].
+    ].
 
-    self selectionHolder
-        value: selection
-        withoutNotifying: self.
+    self selectedThreadGroupHolder value: group withoutNotifying: self.
+    self selectedThreadHolder value: thread withoutNotifying: self.
+    self selectedFrameHolder value: frame withoutNotifying: self.
 
     "Created: / 20-09-2014 / 23:10:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 22-09-2014 / 00:17:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !VDBStackApplication methodsFor:'change & update-dekayed'!
@@ -280,6 +372,35 @@
     "Modified: / 18-09-2014 / 23:30:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!VDBStackApplication methodsFor:'menu actions'!
+
+doInspectModel
+    | selection |
+
+    selection := self internalSelectionHolder value.
+    selection notEmptyOrNil ifTrue:[ 
+        selection isThreadGroupPresenter ifTrue: [ selection threadGroup inspect ].
+        selection isThreadPresenter ifTrue: [ selection thread inspect ].
+        selection isFramePresenter ifTrue: [ selection frame inspect ].    
+    ].
+
+    "Modified: / 22-09-2014 / 01:17:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doInspectPresenter
+    self internalSelectionHolder value inspect
+
+    "Modified: / 22-09-2014 / 01:17:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!VDBStackApplication methodsFor:'queries'!
+
+hasSelection
+    ^ self internalSelectionHolder value notEmptyOrNil
+
+    "Modified: / 22-09-2014 / 01:13:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !VDBStackApplication class methodsFor:'documentation'!
 
 version_HG
--- a/VDBThreadGroupPresenter.st	Sun Sep 21 23:46:10 2014 +0100
+++ b/VDBThreadGroupPresenter.st	Mon Sep 22 09:57:54 2014 +0100
@@ -7,12 +7,16 @@
 	category:'VDB-Presentation'
 !
 
-!VDBThreadGroupPresenter methodsFor:'displaying'!
+!VDBThreadGroupPresenter methodsFor:'accessing'!
 
-displayString
+label
     ^ threadGroup displayString
 
-    "Created: / 21-09-2014 / 23:31:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 22-09-2014 / 00:14:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+threadGroup
+    ^ threadGroup
 ! !
 
 !VDBThreadGroupPresenter methodsFor:'initialization'!
@@ -36,3 +40,11 @@
     "Created: / 21-09-2014 / 23:41:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!VDBThreadGroupPresenter methodsFor:'testing'!
+
+isThreadGroupPresenter
+    ^ true
+
+    "Created: / 21-09-2014 / 23:54:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/VDBThreadPresenter.st	Sun Sep 21 23:46:10 2014 +0100
+++ b/VDBThreadPresenter.st	Mon Sep 22 09:57:54 2014 +0100
@@ -7,12 +7,16 @@
 	category:'VDB-Presentation'
 !
 
-!VDBThreadPresenter methodsFor:'displaying'!
+!VDBThreadPresenter methodsFor:'accessing'!
 
-displayString
+label
     ^ thread displayString
 
-    "Created: / 21-09-2014 / 23:31:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 22-09-2014 / 00:14:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+thread
+    ^ thread
 ! !
 
 !VDBThreadPresenter methodsFor:'initialization'!
@@ -31,8 +35,18 @@
      a O(n*log n) or even O(n^2) behavior here.
      *** to optimize: redefine by subClass"
 
-     ^ thread frames collect:[ :f | VDBFramePresenter new setFrame: f; parent: self ]
+     thread isDead ifTrue:[ ^ #() ].
+     ^ thread stack collect:[ :f | VDBFramePresenter new setFrame: f; parent: self ]
 
     "Created: / 21-09-2014 / 23:42:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 22-09-2014 / 00:54:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!VDBThreadPresenter methodsFor:'testing'!
+
+isThreadPresenter
+    ^ true
+
+    "Created: / 21-09-2014 / 23:54:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/application/applicationWinRC.rc	Sun Sep 21 23:46:10 2014 +0100
+++ b/application/applicationWinRC.rc	Mon Sep 22 09:57:54 2014 +0100
@@ -39,7 +39,7 @@
       VALUE "LegalCopyright", "Copyring (C) 2014 Jan Vrany\0"
       VALUE "ProductName", "Visual Debugger\0"
       VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Sun, 21 Sep 2014 22:44:47 GMT\0"
+      VALUE "ProductDate", "Mon, 22 Sep 2014 08:57:09 GMT\0"
     END
   END
 
--- a/tests/tests.rc	Sun Sep 21 23:46:10 2014 +0100
+++ b/tests/tests.rc	Mon Sep 22 09:57:54 2014 +0100
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "LibraryName\0"
       VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Sun, 21 Sep 2014 22:44:46 GMT\0"
+      VALUE "ProductDate", "Mon, 22 Sep 2014 08:57:07 GMT\0"
     END
 
   END
--- a/vdb.rc	Sun Sep 21 23:46:10 2014 +0100
+++ b/vdb.rc	Mon Sep 22 09:57:54 2014 +0100
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "LibraryName\0"
       VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Sun, 21 Sep 2014 22:44:44 GMT\0"
+      VALUE "ProductDate", "Mon, 22 Sep 2014 08:57:06 GMT\0"
     END
 
   END