some refactoring;
authorClaus Gittinger <cg@exept.de>
Mon, 08 Oct 2001 16:16:22 +0200
changeset 3269 9566fbc92617
parent 3268 1e2896e1b1a1
child 3270 cd3562cffc61
some refactoring; preps for new layout
DebugView.st
--- a/DebugView.st	Mon Oct 08 13:04:56 2001 +0200
+++ b/DebugView.st	Mon Oct 08 16:16:22 2001 +0200
@@ -25,7 +25,8 @@
 		stackInspector steppedContext wrapperContext verboseBacktrace
 		firstContext stepHow cachable currentMethod ignoreBreakpoints
 		stepUntilEntering lastStepUntilEntering
-		lastSelectionInReceiverInspector lastSelectionInContextInspector'
+		lastSelectionInReceiverInspector lastSelectionInContextInspector
+		canShowMore'
 	classVariableNames:'CachedDebugger CachedExclusive OpenDebuggers MoreDebuggingDetail
 		DebuggingDebugger VerboseBacktraceDefault DefaultIcon
 		InitialNCHAINShown'
@@ -432,6 +433,209 @@
     "Created: 11.1.1997 / 12:14:44 / cg"
 ! !
 
+!DebugView class methodsFor:'menu specs'!
+
+menuSpec
+    "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:DebugView andSelector:#menuSpec
+     (Menu new fromLiteralArrayEncoding:(DebugView menuSpec)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(#Menu
+        #(
+         #(#MenuItem
+            #label: 'Process'
+            #translateLabel: true
+            #submenu: 
+           #(#Menu
+              #(
+               #(#MenuItem
+                  #label: 'Continue'
+                  #translateLabel: true
+                  #value: #doContinue
+                )
+               #(#MenuItem
+                  #label: '-'
+                )
+               #(#MenuItem
+                  #label: 'Abort'
+                  #translateLabel: true
+                  #value: #doAbort
+                )
+               #(#MenuItem
+                  #label: '-'
+                )
+               #(#MenuItem
+                  #label: 'Terminate'
+                  #translateLabel: true
+                  #value: #doTerminate
+                )
+               )
+              nil
+              nil
+            )
+          )
+         #(#MenuItem
+            #label: 'Class'
+            #translateLabel: true
+            #submenu: 
+           #(#Menu
+              #(
+               #(#MenuItem
+                  #label: 'Browse Implementing Class'
+                  #translateLabel: true
+                  #value: #browseImplementingClass
+                  #enabled: #canBrowseImplementingClass
+                )
+               #(#MenuItem
+                  #label: 'Browse Receivers Class'
+                  #translateLabel: true
+                  #value: #browseReceiversClass
+                  #enabled: #canBrowseReceiversClass
+                )
+               #(#MenuItem
+                  #label: '-'
+                )
+               #(#MenuItem
+                  #label: 'Browse Receivers Class Hierarchy'
+                  #translateLabel: true
+                  #value: #browseClassHierarchy
+                  #enabled: #canBrowseClassHierarchy
+                )
+               #(#MenuItem
+                  #label: 'Browse Receivers Full Protocol'
+                  #translateLabel: true
+                  #value: #browseFullClassProtocol
+                  #enabled: #canBrowseFullClassProtocol
+                )
+               )
+              nil
+              nil
+            )
+          )
+         #(#MenuItem
+            #label: 'Selector'
+            #translateLabel: true
+            #submenu: 
+           #(#Menu
+              #(
+               #(#MenuItem
+                  #label: 'Browse Implementors...'
+                  #translateLabel: true
+                  #value: #browseImplementorsOf
+                )
+               #(#MenuItem
+                  #label: 'Browse Senders...'
+                  #translateLabel: true
+                  #value: #browseSendersOf
+                )
+               #(#MenuItem
+                  #label: '-'
+                )
+               #(#MenuItem
+                  #label: 'Define'
+                  #translateLabel: true
+                  #value: #doDefineMethod
+                  #enabled: #canDefineMethod
+                )
+               )
+              nil
+              nil
+            )
+          )
+         #(#MenuItem
+            #label: 'View'
+            #translateLabel: true
+            #submenu: 
+           #(#Menu
+              #(
+               #(#MenuItem
+                  #label: 'Show More'
+                  #translateLabel: true
+                  #value: #doShowMore
+                  #enabled: #canShowMore
+                )
+               #(#MenuItem
+                  #label: 'Show Verbose'
+                  #translateLabel: true
+                  #value: #doSHowVerbose
+                )
+               )
+              nil
+              nil
+            )
+          )
+         #(#MenuItem
+            #label: 'Breakpoint'
+            #translateLabel: true
+            #submenu: 
+           #(#Menu
+              #(
+               #(#MenuItem
+                  #label: 'Remove'
+                  #translateLabel: true
+                  #value: #doRemoveBreakPoint
+                  #enabled: #canRemoveBreakpoint
+                )
+               #(#MenuItem
+                  #label: 'Remove All Breakpoints'
+                  #translateLabel: true
+                  #value: #doRemoveAllBreakPoint
+                )
+               #(#MenuItem
+                  #label: '-'
+                )
+               #(#MenuItem
+                  #label: 'Allow Breakpoints in Debugger'
+                  #translateLabel: true
+                  #indication: #allowBreakPointsInDebugger
+                )
+               )
+              nil
+              nil
+            )
+          )
+         #(#MenuItem
+            #label: 'Help'
+            #translateLabel: true
+            #startGroup: #right
+            #submenu: 
+           #(#Menu
+              #(
+               #(#MenuItem
+                  #label: 'Debuggers Documentation'
+                  #translateLabel: true
+                  #value: #openHTMLDocument:
+                  #argument: 'tools/debugView/TOP.html'
+                )
+               #(#MenuItem
+                  #label: '-'
+                )
+               #(#MenuItem
+                  #label: 'About DebugView...'
+                  #translateLabel: true
+                  #value: #openAboutThisApplication
+                )
+               )
+              nil
+              nil
+            )
+          )
+         )
+        nil
+        nil
+      )
+! !
+
 !DebugView class methodsFor:'misc'!
 
 interestingContextFrom:aContext
@@ -795,6 +999,8 @@
 
     m := contextView middleButtonMenu.
     m notNil ifTrue:[
+        self updateMenuItems.
+
         (inspecting or:[Object abortSignal isHandled]) ifTrue:[
             abortButton enable.
             m enable:#doAbort.
@@ -1352,7 +1558,7 @@
 !
 
 initialize
-    |v panel hpanel bpanel separator img|
+    |menuPanel mH panel bpanel bH bpanel1 bH1 bpanel2 bH2 codePanel oldLayout v|
 
     super initialize.
 
@@ -1370,49 +1576,158 @@
     stepHow := nil.
     canContinue := false.
 
-    bpanel := HorizontalPanelView in:self.
+"/    menuPanel := MenuPanel in:self.
+"/    menuPanel verticalLayout:false.
+"/    menuPanel receiver:self.
+"/    menuPanel menu:(self pullDownMenu).
+"/
+"/    mH := menuPanel preferredExtent y.
+"/    menuPanel origin:(0.0 @ 0.0) corner:(1.0 @ (mH)).
+    mH := 0.
+
+    "/ oldLayout := false.
+    oldLayout := true.
+    oldLayout ifTrue:[
+        bpanel := HorizontalPanelView in:self.
+        self initializeButtonsIn:bpanel.
+
+        bH := bpanel preferredExtent y.
+        bpanel origin:(0.0 @ mH)
+               extent:(1.0 @ bH).
+        panel := VariableVerticalPanel
+                            origin:(0.0 @ (mH + bH))
+                            corner:(1.0 @ 1.0)
+                            in:self.
+
+        v := self initializeContextListViewIn:panel.
+        v origin:(0.0 @ 0.0) corner:(1.0 @ 0.25).
+
+        codePanel := View in:panel.
+        v := self initializeCodeViewIn:codePanel.
+        v origin:(0.0 @ 0.0) corner:(1.0 @ 1.0).
+        codePanel origin:(0.0 @ 0.25) corner:(1.0 @ 0.75).
+
+        v := self initializeInspectorViewsIn:panel.
+        v origin:(0.0 @ 0.75) corner:(1.0 @ 1.0).
+
+    ] ifFalse:[
+        bpanel1 := HorizontalPanelView in:self.
+        self initializeButtons1In:bpanel1.
+
+        bH1 := bpanel1 preferredExtent y.
+        bpanel1 origin:(0.0 @ mH)
+                extent:(1.0 @ bH1).
+        panel := VariableVerticalPanel
+                            origin:(0.0 @ (mH + bH1))
+                            corner:(1.0 @ 1.0)
+                                in:self.
+
+        v := self initializeContextListViewIn:panel.
+        v origin:(0.0 @ 0.0) corner:(1.0 @ 0.25).
+
+        codePanel := View in:panel.
+        bpanel2 := HorizontalPanelView in:codePanel.
+        self initializeButtons2In:bpanel2.
+
+        bH2 := bpanel2 preferredExtent y.
+        bpanel2 origin:(0.0 @ 0.0)
+                extent:(1.0 @ bH2).
+
+        v := self initializeCodeViewIn:codePanel.
+        v origin:(0.0 @ bH2) corner:(1.0 @ 1.0).
+        codePanel origin:(0.0 @ 0.25) corner:(1.0 @ 0.75).
+
+        v := self initializeInspectorViewsIn:panel.
+        v origin:(0.0 @ 0.75) corner:(1.0 @ 1.0).
+    ].
+
+    "
+     Debugger newDebugger
+    "
+!
+
+initializeButtons1In:bpanel 
+    |separator|
+
     bpanel horizontalLayout:#left.
     bpanel verticalLayout:#centerMax.
     bpanel verticalSpace:ViewSpacing // 2.
 
-    abortButton := Button
-                        label:(resources at:'abort')
-                        action:[abortButton turnOffWithoutRedraw. self doAbort]
-                        in:bpanel.
-
+    abortButton := Button 
+                label:(resources at:'abort')
+                action:[
+                    abortButton turnOffWithoutRedraw.
+                    self doAbort
+                ]
+                in:bpanel.
     separator := View extent:(10 @ 5) in:bpanel.
     separator borderWidth:0; level:0.
-    continueButton := Button
-                        label:(resources at:'continue')
-                        action:[continueButton turnOffWithoutRedraw. self doContinue]
-                        in:bpanel.
+
+    continueButton := Button 
+                label:(resources at:'continue')
+                action:[
+                    continueButton turnOffWithoutRedraw.
+                    self doContinue
+                ]
+                in:bpanel.
 
     separator := View extent:(10 @ 5) in:bpanel.
     separator borderWidth:0; level:0.
-    returnButton := Button
-                        label:(resources at:'return')
-                        action:[returnButton turnOff. self doReturn]
-                        in:bpanel.
-
-    restartButton := Button
-                        label:(resources at:'restart')
-                        action:[restartButton turnOff. self doRestart]
-                        in:bpanel.
-
+
+    terminateButton := Button 
+                label:(resources at:'terminate')
+                action:[
+                    terminateButton turnOffWithoutRedraw.
+                    self doTerminate
+                ]
+                in:bpanel.
+!
+
+initializeButtons2In:bpanel 
+    |separator|
+
+    bpanel horizontalLayout:#left.
+    bpanel verticalLayout:#centerMax.
+    bpanel verticalSpace:ViewSpacing // 2.
+
+    returnButton := Button 
+                label:(resources at:'return')
+                action:[
+                    returnButton turnOff.
+                    self doReturn
+                ]
+                in:bpanel.
+    restartButton := Button 
+                label:(resources at:'restart')
+                action:[
+                    restartButton turnOff.
+                    self doRestart
+                ]
+                in:bpanel.
 
     separator := View extent:(10 @ 5) in:bpanel.
     separator borderWidth:0; level:0.
 
-    nextButton := Button
-                        label:(resources at:'next')
-                        action:[stepButton turnOff. self doNext]
-                        in:bpanel.
-
+    nextButton := Button 
+                label:(resources at:'next')
+                action:[
+                    stepButton turnOff.
+                    self doNext
+                ]
+                in:bpanel.
+    stepButton := Button 
+                label:(resources at:'step')
+                action:[
+                    stepButton turnOff.
+                    self doStep
+                ]
+                in:bpanel.
 "/ cg:
 "/ I disabled the stepIn / stepOut buttons - for now.
 "/ they do not work relyable with inlined blocks yet.
 "/
 
+
 "/    img := Image fromFile:'bitmaps/stepIn.xpm'.
 "/    img isNil ifTrue:[
 "/        img := (resources at:'next')
@@ -1440,38 +1755,166 @@
 "/                        action:[stepButton turnOff. self doNextOut]
 "/                        in:bpanel.
 
-    stepButton := Button
-                        label:(resources at:'step')
-                        action:[stepButton turnOff. self doStep]
-                        in:bpanel.
-    sendButton := Button
-                        label:(resources at:'send')
-                        action:[sendButton turnOff. self doSend]
-                        in:bpanel.
-
+    sendButton := Button 
+                label:(resources at:'send')
+                action:[
+                    sendButton turnOff.
+                    self doSend
+                ]
+                in:bpanel.
     separator := View extent:(30 @ 5) in:bpanel.
     separator borderWidth:0; level:0.
-    terminateButton := Button
-                        label:(resources at:'terminate')
-                        action:[terminateButton turnOffWithoutRedraw. self doTerminate]
-                        in:bpanel.
-
-
+
+    defineButton := Button 
+                label:(resources at:'define')
+                action:[
+                    defineButton turnOffWithoutRedraw.
+                    self doDefine
+                ]
+                in:bpanel.
+    defineButton beInvisible
+!
+
+initializeButtonsIn:bpanel 
+    |separator|
+
+    bpanel horizontalLayout:#left.
+    bpanel verticalLayout:#centerMax.
+    bpanel verticalSpace:ViewSpacing // 2.
+
+    abortButton := Button 
+                label:(resources at:'abort')
+                action:[
+                    abortButton turnOffWithoutRedraw.
+                    self doAbort
+                ]
+                in:bpanel.
+    separator := View extent:(10 @ 5) in:bpanel.
+    separator borderWidth:0; level:0.
+
+    continueButton := Button 
+                label:(resources at:'continue')
+                action:[
+                    continueButton turnOffWithoutRedraw.
+                    self doContinue
+                ]
+                in:bpanel.
+
+    separator := View extent:(10 @ 5) in:bpanel.
+    separator borderWidth:0; level:0.
+
+    returnButton := Button 
+                label:(resources at:'return')
+                action:[
+                    returnButton turnOff.
+                    self doReturn
+                ]
+                in:bpanel.
+    restartButton := Button 
+                label:(resources at:'restart')
+                action:[
+                    restartButton turnOff.
+                    self doRestart
+                ]
+                in:bpanel.
+
+    separator := View extent:(10 @ 5) in:bpanel.
+    separator borderWidth:0; level:0.
+
+    nextButton := Button 
+                label:(resources at:'next')
+                action:[
+                    stepButton turnOff.
+                    self doNext
+                ]
+                in:bpanel.
+    stepButton := Button 
+                label:(resources at:'step')
+                action:[
+                    stepButton turnOff.
+                    self doStep
+                ]
+                in:bpanel.
+"/ cg:
+"/ I disabled the stepIn / stepOut buttons - for now.
+"/ they do not work relyable with inlined blocks yet.
+"/
+
+
+"/    img := Image fromFile:'bitmaps/stepIn.xpm'.
+"/    img isNil ifTrue:[
+"/        img := (resources at:'next')
+"/    ].
+"/    nextButton := Button
+"/                        label:img
+"/                        action:[stepButton turnOff. self doNext]
+"/                        in:bpanel.
+"/
+"/    img := Image fromFile:'bitmaps/stepOver.xpm'.
+"/    img isNil ifTrue:[
+"/        img := (resources at:'over')
+"/    ].
+"/    nextOverButton := Button
+"/                        label:img
+"/                        action:[stepButton turnOff. self doNextOver]
+"/                        in:bpanel.
+"/
+"/    img := Image fromFile:'bitmaps/stepOut.xpm'.
+"/    img isNil ifTrue:[
+"/        img := (resources at:'out')
+"/    ].
+"/    nextOutButton := Button
+"/                        label:img
+"/                        action:[stepButton turnOff. self doNextOut]
+"/                        in:bpanel.
+
+    sendButton := Button 
+                label:(resources at:'send')
+                action:[
+                    sendButton turnOff.
+                    self doSend
+                ]
+                in:bpanel.
     separator := View extent:(30 @ 5) in:bpanel.
     separator borderWidth:0; level:0.
-    defineButton := Button
-                        label:(resources at:'define')
-                        action:[defineButton turnOffWithoutRedraw. self doDefine]
-                        in:bpanel.
-    defineButton beInvisible.
-
-    bpanel origin:(0.0 @ 0.0)
-           extent:(1.0 @ (bpanel preferredExtent y)).
-
-    panel := VariableVerticalPanel
-                        origin:(0.0 @ bpanel height)
-                        corner:(1.0 @ 1.0)
-                            in:self.
+
+    terminateButton := Button 
+                label:(resources at:'terminate')
+                action:[
+                    terminateButton turnOffWithoutRedraw.
+                    self doTerminate
+                ]
+                in:bpanel.
+    separator := View extent:(30 @ 5) in:bpanel.
+    separator borderWidth:0; level:0.
+
+    defineButton := Button 
+                label:(resources at:'define')
+                action:[
+                    defineButton turnOffWithoutRedraw.
+                    self doDefine
+                ]
+                in:bpanel.
+    defineButton beInvisible
+!
+
+initializeCodeViewIn:panel
+    |v|
+
+    v := HVScrollableView 
+                for:CodeView 
+                miniScrollerH:true
+                miniScrollerV:false
+                in:panel.
+
+"/    v autoHideScrollBars:true.
+    codeView := v scrolledView.
+
+    ^ v
+!
+
+initializeContextListViewIn:panel
+    |v|
 
     v := HVScrollableView 
                 for:SelectionInListView 
@@ -1479,24 +1922,19 @@
                 miniScrollerV:false
                 in:panel.
     v autoHideHorizontalScrollBar:true.
-    v origin:(0.0 @ 0.0) corner:(1.0 @ 0.25).
 
     contextView := v scrolledView.
     contextView action:[:lineNr | self showSelection:lineNr].
-    contextView doubleClickAction:[:line | self browse].
+    contextView doubleClickAction:[:line | self browseImplementingClass].
     contextView selectConditionBlock:[:line | self checkSelectionChangeAllowed:line].
 
-    v := HVScrollableView 
-                for:CodeView 
-                miniScrollerH:true
-                miniScrollerV:false
-                in:panel.
-    v origin:(0.0 @ 0.25) corner:(1.0 @ 0.75).
-"/    v autoHideScrollBars:true.
-    codeView := v scrolledView.
+    ^ v
+!
+
+initializeInspectorViewsIn:panel
+    |hpanel|
 
     hpanel := VariableHorizontalPanel in:panel.
-    hpanel origin:(0.0 @ 0.75) corner:(1.0 @ 1.0).
 
     receiverInspector := InspectorView
                                 origin:(0.0 @ 0.0) corner:(0.5 @ 1.0)
@@ -1508,7 +1946,7 @@
                                     in:hpanel.
     contextInspector label:'context'.
 
-    "Modified: / 29.7.1998 / 21:56:51 / cg"
+    ^ hpanel
 !
 
 initializeMiddleButtonMenu
@@ -1567,8 +2005,8 @@
 
         items := items , #(
                     ('-'                                                        )
-                    ('Browse (implementing class)'      browse                  )
-                    ('Browse (receivers class)'         browseClass             )
+                    ('Browse (implementing class)'      browseImplementingClass )
+                    ('Browse (receivers class)'         browseReceiversClass    )
                     ('Browse class hierarchy'           browseClassHierarchy    )
                     ('Browse full class protocol'       browseFullClassProtocol )
                     ('Implementors'                     browseImplementors      )
@@ -1601,11 +2039,12 @@
 
     inspecting ifTrue:[
         m notNil ifTrue:[
-            m disableAll:#(doTraceStep removeBreakpoint browse browseClass
+            m disableAll:#(doTraceStep removeBreakpoint browseImplementingClass browseReceiversClass
                            browseClassHierarchy browseFullClassProtocol
                            browseImplementors browseSenders inspectContext skip doStepOut).
         ].
-    ]
+    ].
+    self updateMenuItems
 
     "Modified: / 29.10.1997 / 03:40:16 / cg"
 !
@@ -1627,6 +2066,20 @@
     "Created: 24.7.1997 / 18:17:44 / cg"
 !
 
+pullDownMenu
+    "return the top (pullDown) menu"
+
+    <resource: #programMenu>
+
+    |m|
+
+    m := self class menuSpec.
+    m := m decodeAsLiteralArray.
+    m receiver:self.
+    m findGuiResourcesIn:self.
+    ^ m.
+!
+
 reinitialize
     "/ redefined - since the debugView runs on top of
     "/ the debuggee, there would be no event loop for me.
@@ -2266,7 +2719,62 @@
 
 !
 
-browse
+browseClass
+    "browse the reveivers class (of the selected contexts message)"
+
+    |cls sel|
+
+    selectedContext isNil ifTrue:[^ self].
+
+    cls := selectedContext receiver class.
+    sel := selectedContext selector.
+    (cls implements:sel) ifFalse:[
+        sel := nil
+    ].
+    cls browserClass openInClass:cls selector:sel.
+
+    "Modified: / 3.2.1998 / 20:23:36 / cg"
+!
+
+browseClassHierarchy
+    "browse the reveivers classHierarchy (of the selected contexts message)"
+
+    |cls mthd|
+
+    selectedContext isNil ifTrue:[^ self].
+
+    mthd := selectedContext method.
+    mthd isNil ifTrue:[
+        cls := selectedContext receiver class
+    ] ifFalse:[
+        cls := mthd containingClass.
+    ].
+    cls browserClass browseClassHierarchy:cls.
+
+    "Modified: / 3.2.1998 / 20:23:40 / cg"
+!
+
+browseFullClassProtocol
+    "browse the reveivers full protocol (of the selected contexts message)"
+
+    |cls mthd|
+
+    selectedContext isNil ifTrue:[^ self].
+
+    mthd := selectedContext method.
+    mthd isNil ifTrue:[
+        cls := selectedContext receiver class
+    ] ifFalse:[
+        cls := mthd containingClass.
+    ].
+    cls browserClass browseFullClassProtocol:cls.
+
+    "Modified: / 3.2.1998 / 20:23:44 / cg"
+!
+
+browseImplementingClass
+    "browse the implementing class (of the selected contexts message)"
+
     |mthd who sel cls|
 
     selectedContext isNil ifTrue:[^ self].
@@ -2290,49 +2798,6 @@
     "Modified: / 3.2.1998 / 19:46:40 / cg"
 !
 
-browseClass
-    |cls|
-
-    selectedContext isNil ifTrue:[^ self].
-
-    cls := selectedContext receiver class.
-    cls browserClass openInClass:cls selector:nil.
-
-    "Modified: / 3.2.1998 / 20:23:36 / cg"
-!
-
-browseClassHierarchy
-    |cls mthd|
-
-    selectedContext isNil ifTrue:[^ self].
-
-    mthd := selectedContext method.
-    mthd isNil ifTrue:[
-        cls := selectedContext receiver class
-    ] ifFalse:[
-        cls := mthd containingClass.
-    ].
-    cls browserClass browseClassHierarchy:cls.
-
-    "Modified: / 3.2.1998 / 20:23:40 / cg"
-!
-
-browseFullClassProtocol
-    |cls mthd|
-
-    selectedContext isNil ifTrue:[^ self].
-
-    mthd := selectedContext method.
-    mthd isNil ifTrue:[
-        cls := selectedContext receiver class
-    ] ifFalse:[
-        cls := mthd containingClass.
-    ].
-    cls browserClass browseFullClassProtocol:cls.
-
-    "Modified: / 3.2.1998 / 20:23:44 / cg"
-!
-
 browseImplementors
     "open a browser on the implementors of the selected methods selector"
 
@@ -2368,6 +2833,23 @@
     "Modified: / 6.2.2000 / 01:05:14 / cg"
 !
 
+browseReceiversClass
+    "browse the reveivers class (of the selected contexts message)"
+
+    |cls sel|
+
+    selectedContext isNil ifTrue:[^ self].
+
+    cls := selectedContext receiver class.
+    sel := selectedContext selector.
+    (cls implements:sel) ifFalse:[
+        sel := nil
+    ].
+    cls browserClass openInClass:cls selector:sel.
+
+    "Modified: / 3.2.1998 / 20:23:36 / cg"
+!
+
 browseSenders
     "open a browser on the senders of the selected methods selector"
 
@@ -2528,9 +3010,16 @@
 !
 
 doDefine
+    |sel|
+
+    sel := contextView selection.
+
     self 
         codeAccept:('%1\    self halt:''%1 is not yet implemented''.' bindWith:actualContext selector) withCRs
         unwind:false.
+
+    self doShowSelection:sel.
+    self doRestart
 !
 
 doIgnoreBreakpoints
@@ -3021,6 +3510,49 @@
     ^ busy
 !
 
+canBrowseClassHierarchy
+    |m|
+
+    m := contextView middleButtonMenu.
+    ^ m notNil and:[m isEnabled:#browseClassHierarchy]
+!
+
+canBrowseFullClassProtocol
+    |m|
+
+    m := contextView middleButtonMenu.
+    ^ m notNil and:[m isEnabled:#browseFullClassProtocol]
+!
+
+canBrowseImplementingClass
+    |m|
+
+    m := contextView middleButtonMenu.
+    ^ m notNil and:[m isEnabled:#browseImplementingClass]
+!
+
+canBrowseReceiversClass
+    |m|
+
+    m := contextView middleButtonMenu.
+    ^ m notNil and:[m isEnabled:#browseReceiversClass]
+!
+
+canDefineMethod
+    ^ defineButton isVisible
+!
+
+canRemoveBreakpoint
+    |m|
+
+    m := contextView middleButtonMenu.
+    ^ m notNil and:[m isEnabled:#removeBreakpoint]
+!
+
+canShowMore
+    ^ canShowMore
+!
+
 exclusive:aBoolean
     exclusive := aBoolean
 !
@@ -3140,6 +3672,7 @@
     m notNil ifTrue:[
         m disable:#showMore.
     ].
+    canShowMore := false.
 
     aContext isNil ifTrue:[
         text := Array with:'** no context **'.
@@ -3327,6 +3860,7 @@
             m notNil ifTrue:[
                 m enable:#showMore.
             ].
+            canShowMore := true.
             text add:(resources string:'*** more walkback follows - click here to see them ***')
         ].
     ].
@@ -3342,7 +3876,7 @@
         m disable:#removeBreakpoint.
         m disable:#browseImplementors.
         m disable:#browseSenders.
-        m disable:#browseClass.
+        m disable:#browseReceiversClass.
     ].
     ^ true
 
@@ -4006,7 +4540,8 @@
         ].
     ] ifFalse:[
         self updateForContext:lineNr
-    ]
+    ].
+    self updateMenuItems
 !
 
 showSelection:lineNr
@@ -4055,7 +4590,7 @@
     |con homeContext sel method code canAccept
      implementorClass lineNrInMethod rec m line
      sender selSender tryVars possibleBlocks errMsg 
-     mthd cls mCls rCls codeSet highlighter evaluatorClass
+     codeSet highlighter evaluatorClass
      canDefine|
 
     canDefine := false.
@@ -4394,45 +4929,60 @@
     "
      enable/disable some menu items
     "
-    m := contextView middleButtonMenu.
-    (m notNil and:[selectedContext notNil]) ifTrue:[
-        m enableAll:#(browseImplementors browseSenders inspectContext skip skipForReturn).
-
-        (method notNil and:[method isWrapped]) ifTrue:[
-            m enable:#removeBreakpoint.
-        ] ifFalse:[
-            m disable:#removeBreakpoint.
-        ].
-
-        mthd := selectedContext method.
-        mthd notNil ifTrue:[
-            cls := mCls := mthd containingClass.
-        ].
-        rCls := selectedContext receiver class.
-        cls isNil ifTrue:[
-            cls := rCls
-        ].
-        cls notNil ifTrue:[
-            m enableAll:#(browse browseClass browseClassHierarchy browseFullClassProtocol).
-            rCls == mCls ifTrue:[
-                m disable:#browseClass
-            ].
-            mCls isNil ifTrue:[
-                m disable:#browse
-            ]
-
-        ] ifFalse:[
-            m disableAll:#(browse browseClass browseClassHierarchy browseFullClassProtocol).
-        ].
-    ]
+    self updateMenuItems
 
     "Created: / 14.8.1997 / 20:15:00 / cg"
     "Modified: / 13.11.1998 / 23:19:35 / cg"
+!
+
+updateMenuItems
+    |m mthd cls mCls rCls|
+
+    "
+     enable/disable some menu items
+    "
+    m := contextView middleButtonMenu.
+    m notNil ifTrue:[
+        m disable:#removeBreakpoint.
+        canShowMore ifFalse:[
+            m disable:#showMore
+        ].
+
+        selectedContext notNil ifTrue:[
+            m enableAll:#(browseImplementors browseSenders inspectContext skip skipForReturn).
+
+            mthd := selectedContext method.
+            mthd notNil ifTrue:[
+                cls := mCls := mthd containingClass.
+                mthd isBreakpointed ifTrue:[
+                    m enable:#removeBreakpoint.
+                ]
+            ].
+            rCls := selectedContext receiver class.
+            cls isNil ifTrue:[
+                cls := rCls
+            ].
+            cls notNil ifTrue:[
+                m enableAll:#(browseImplementingClass browseReceiversClass browseClassHierarchy browseFullClassProtocol).
+                rCls == mCls ifTrue:[
+                    m disable:#browseReceiversClass
+                ].
+                mCls isNil ifTrue:[
+                    m disable:#browseImplementingClass
+                ]
+
+            ] ifFalse:[
+                m disableAll:#(browseImplementingClass browseReceiversClass browseClassHierarchy browseFullClassProtocol).
+            ].
+        ] ifFalse:[
+            m disableAll:#(browseImplementingClass browseReceiversClass browseClassHierarchy browseFullClassProtocol).
+        ]
+    ]
 ! !
 
 !DebugView class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/DebugView.st,v 1.283 2001-09-26 09:57:05 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/DebugView.st,v 1.284 2001-10-08 14:16:22 cg Exp $'
 ! !
 DebugView initialize!