fixed access to namedInstvars
authorClaus Gittinger <cg@exept.de>
Wed, 23 Jun 1999 18:39:52 +0200
changeset 2193 3d7b1044e8c8
parent 2192 c7bce869223c
child 2194 e95ad72c0f46
fixed access to namedInstvars
DictInspV.st
DictionaryInspectorView.st
InspView.st
InspectorView.st
OCInspView.st
OrderedCollectionInspectorView.st
SetInspV.st
SetInspectorView.st
--- a/DictInspV.st	Wed Jun 23 18:04:06 1999 +0200
+++ b/DictInspV.st	Wed Jun 23 18:39:52 1999 +0200
@@ -47,7 +47,7 @@
 fieldMenu
     <resource: #programMenu >
 
-    |items m|
+    |items m idx|
 
     inspectedObject == Smalltalk ifTrue:[
         items := #(
@@ -98,6 +98,10 @@
         m disableAll:#(doInspect doInspectKey doBasicInspect doNewInspect
                        doRemoveKey doStartMonitor doStopMonitor doCopyKey
                       )
+    ] ifFalse:[
+        (self keyIndexForLine:selectedLine) isNil ifTrue:[
+            m disableAll:#(doInspectKey doRemoveKey doCopyKey)
+        ]
     ].
     ^ m.
 
@@ -113,69 +117,70 @@
 
     keyName := Dialog request:'key to add:' initialAnswer:''.
     keyName notEmpty ifTrue:[
-	key := keyName asSymbol.
-	(inspectedObject includesKey:key) ifFalse:[
-	    inspectedObject at:key put:nil.
-	    selectedLine := nil.
-	    inspectedObject changed.
-	    self inspect:inspectedObject. "force list update"
-	]
+        key := keyName asSymbol.
+        (inspectedObject includesKey:key) ifFalse:[
+            inspectedObject at:key put:nil.
+            selectedLine := nil.
+            inspectedObject changed.
+            self reinspect. "force list update"
+        ]
     ]
 !
 
 doInspectKey
     "inspect selected items key"
 
-    selectedLine notNil ifTrue:[
-	selectedLine ~~ 1 ifTrue:[
-	    (keys at:selectedLine - 1) inspect
-	].
+    |idx|
+
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
+        (keys at:idx) inspect
     ]
 !
 
 doReferences
-    "show users of selected key (i.e. global)"
+    "show users of selected key (i.e. global).
+     Only useful when inspecting smalltalk"
 
-    |k|
+    |idx|
 
-    selectedLine notNil ifTrue:[
-	selectedLine == 1 ifFalse:[
-	    k := (keys at:selectedLine - 1).
-	    SystemBrowser browseReferendsOf:k asSymbol
-	].
-    ]
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
+        SystemBrowser browseReferendsOf:(keys at:idx) asSymbol.
+        ^ self
+    ].
 !
 
 doRemoveKey
     "remove selected item from keys"
 
-    |key|
+    |idx key|
 
-    selectedLine == 1 ifFalse:[
-	key := (keys at:selectedLine - 1).
-	(inspectedObject includesKey:key) ifTrue:[
-	    listView cursor:(Cursor wait).
-	    inspectedObject removeKey:key.
-	    keys := nil.
-	    selectedLine := nil.
-	    inspectedObject changed.
-	    listView cursor:(Cursor hand).
-	    self inspect:inspectedObject. "force list update"
-	].
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
+        key := keys at:idx.
+        (inspectedObject includesKey:key) ifTrue:[
+            listView cursor:(Cursor wait).
+            inspectedObject removeKey:key.
+            keys := nil.
+            selectedLine := nil.
+            inspectedObject changed.
+            listView cursor:(Cursor hand).
+            self reinspect. "force list update"
+        ].
     ]
 !
 
 showKeyReferences
-    "show users of selected key (i.e. global)"
+    "show users of selected key (i.e. global).
+     Only useful when inspecting smalltalk"
 
-    |k|
+    |idx key|
 
-    selectedLine notNil ifTrue:[
-        selectedLine == 1 ifFalse:[
-            k := (keys at:selectedLine - 1).
-            self withWaitCursorDo:[
-                SystemBrowser browseReferendsOf:k asSymbol
-            ]
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
+        self withWaitCursorDo:[
+            SystemBrowser browseReferendsOf:(keys at:idx) asSymbol
         ].
     ]
 
@@ -183,6 +188,10 @@
 
 !DictionaryInspectorView methodsFor:'private'!
 
+baseInspectedObjectClass
+    ^ Dictionary
+!
+
 defaultLabel
     ^ 'keys'
 
@@ -234,26 +243,25 @@
 doAccept:theText
     "accept value for selected item"
 
-    |value idx|
+    |value idx key|
 
     value := Compiler evaluate:theText receiver:inspectedObject notifying:workspace.
 
-    idx := selectedLine.
-    (idx notNil and:[idx > 1]) ifTrue:[
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
+        key := keys at:idx.
+        inspectedObject at:key put:value.
+    ] ifFalse:[
+        idx := self instVarIndexForLine:selectedLine.
+        idx notNil ifTrue:[
+            inspectedObject instVarAt:idx put:value.
+        ] ifFalse:[
+            ^ self "/ self selected
+        ]
+    ].
 
-        inspectedObject ~~ Smalltalk ifTrue:[
-            idx := idx + Dictionary instSize.
-            idx <= inspectedObject class instSize ifTrue:[
-                inspectedObject at:idx put:value.
-                inspectedObject changed.
-                ^ self
-            ].
-            idx := idx - inspectedObject class instSize.
-        ].
-
-        inspectedObject at:(keys at:idx) put:value.
-        inspectedObject changed
-    ]
+    inspectedObject changed.
+    self reinspect.
 !
 
 valueAtLine:lineNr
@@ -261,30 +269,28 @@
 
     |key idx|
 
-    idx := lineNr.
+    idx := self keyIndexForLine:lineNr.
+    idx notNil ifTrue:[
+        key := keys at:idx.
+        ^ inspectedObject at:key ifAbsent:nil.
+    ].
+    idx := self instVarIndexForLine:lineNr.
+    idx notNil ifTrue:[
+        ^ inspectedObject instVarAt:idx.
+    ].
+
     hideReceiver ifFalse:[
         (lineNr == 1 or:[lineNr isNil]) ifTrue:[
             ^ inspectedObject
         ].
-        idx := idx - 1.
     ].
 
-    inspectedObject ~~ Smalltalk ifTrue:[
-        idx := idx + Dictionary instSize.
-        idx <= inspectedObject class instSize ifTrue:[
-            ^ inspectedObject instVarAt:idx
-        ].
-        idx := idx - inspectedObject class instSize.
-    ].
+    ^ nil
 
-    key := keys at:idx.
-    ^ inspectedObject at:key ifAbsent:nil.
-
-    "Modified: 30.7.1996 / 17:44:50 / cg"
 ! !
 
 !DictionaryInspectorView class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/Attic/DictInspV.st,v 1.35 1999-06-23 16:02:04 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/Attic/DictInspV.st,v 1.36 1999-06-23 16:39:52 cg Exp $'
 ! !
--- a/DictionaryInspectorView.st	Wed Jun 23 18:04:06 1999 +0200
+++ b/DictionaryInspectorView.st	Wed Jun 23 18:39:52 1999 +0200
@@ -47,7 +47,7 @@
 fieldMenu
     <resource: #programMenu >
 
-    |items m|
+    |items m idx|
 
     inspectedObject == Smalltalk ifTrue:[
         items := #(
@@ -98,6 +98,10 @@
         m disableAll:#(doInspect doInspectKey doBasicInspect doNewInspect
                        doRemoveKey doStartMonitor doStopMonitor doCopyKey
                       )
+    ] ifFalse:[
+        (self keyIndexForLine:selectedLine) isNil ifTrue:[
+            m disableAll:#(doInspectKey doRemoveKey doCopyKey)
+        ]
     ].
     ^ m.
 
@@ -113,69 +117,70 @@
 
     keyName := Dialog request:'key to add:' initialAnswer:''.
     keyName notEmpty ifTrue:[
-	key := keyName asSymbol.
-	(inspectedObject includesKey:key) ifFalse:[
-	    inspectedObject at:key put:nil.
-	    selectedLine := nil.
-	    inspectedObject changed.
-	    self inspect:inspectedObject. "force list update"
-	]
+        key := keyName asSymbol.
+        (inspectedObject includesKey:key) ifFalse:[
+            inspectedObject at:key put:nil.
+            selectedLine := nil.
+            inspectedObject changed.
+            self reinspect. "force list update"
+        ]
     ]
 !
 
 doInspectKey
     "inspect selected items key"
 
-    selectedLine notNil ifTrue:[
-	selectedLine ~~ 1 ifTrue:[
-	    (keys at:selectedLine - 1) inspect
-	].
+    |idx|
+
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
+        (keys at:idx) inspect
     ]
 !
 
 doReferences
-    "show users of selected key (i.e. global)"
+    "show users of selected key (i.e. global).
+     Only useful when inspecting smalltalk"
 
-    |k|
+    |idx|
 
-    selectedLine notNil ifTrue:[
-	selectedLine == 1 ifFalse:[
-	    k := (keys at:selectedLine - 1).
-	    SystemBrowser browseReferendsOf:k asSymbol
-	].
-    ]
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
+        SystemBrowser browseReferendsOf:(keys at:idx) asSymbol.
+        ^ self
+    ].
 !
 
 doRemoveKey
     "remove selected item from keys"
 
-    |key|
+    |idx key|
 
-    selectedLine == 1 ifFalse:[
-	key := (keys at:selectedLine - 1).
-	(inspectedObject includesKey:key) ifTrue:[
-	    listView cursor:(Cursor wait).
-	    inspectedObject removeKey:key.
-	    keys := nil.
-	    selectedLine := nil.
-	    inspectedObject changed.
-	    listView cursor:(Cursor hand).
-	    self inspect:inspectedObject. "force list update"
-	].
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
+        key := keys at:idx.
+        (inspectedObject includesKey:key) ifTrue:[
+            listView cursor:(Cursor wait).
+            inspectedObject removeKey:key.
+            keys := nil.
+            selectedLine := nil.
+            inspectedObject changed.
+            listView cursor:(Cursor hand).
+            self reinspect. "force list update"
+        ].
     ]
 !
 
 showKeyReferences
-    "show users of selected key (i.e. global)"
+    "show users of selected key (i.e. global).
+     Only useful when inspecting smalltalk"
 
-    |k|
+    |idx key|
 
-    selectedLine notNil ifTrue:[
-        selectedLine == 1 ifFalse:[
-            k := (keys at:selectedLine - 1).
-            self withWaitCursorDo:[
-                SystemBrowser browseReferendsOf:k asSymbol
-            ]
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
+        self withWaitCursorDo:[
+            SystemBrowser browseReferendsOf:(keys at:idx) asSymbol
         ].
     ]
 
@@ -183,6 +188,10 @@
 
 !DictionaryInspectorView methodsFor:'private'!
 
+baseInspectedObjectClass
+    ^ Dictionary
+!
+
 defaultLabel
     ^ 'keys'
 
@@ -234,26 +243,25 @@
 doAccept:theText
     "accept value for selected item"
 
-    |value idx|
+    |value idx key|
 
     value := Compiler evaluate:theText receiver:inspectedObject notifying:workspace.
 
-    idx := selectedLine.
-    (idx notNil and:[idx > 1]) ifTrue:[
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
+        key := keys at:idx.
+        inspectedObject at:key put:value.
+    ] ifFalse:[
+        idx := self instVarIndexForLine:selectedLine.
+        idx notNil ifTrue:[
+            inspectedObject instVarAt:idx put:value.
+        ] ifFalse:[
+            ^ self "/ self selected
+        ]
+    ].
 
-        inspectedObject ~~ Smalltalk ifTrue:[
-            idx := idx + Dictionary instSize.
-            idx <= inspectedObject class instSize ifTrue:[
-                inspectedObject at:idx put:value.
-                inspectedObject changed.
-                ^ self
-            ].
-            idx := idx - inspectedObject class instSize.
-        ].
-
-        inspectedObject at:(keys at:idx) put:value.
-        inspectedObject changed
-    ]
+    inspectedObject changed.
+    self reinspect.
 !
 
 valueAtLine:lineNr
@@ -261,30 +269,28 @@
 
     |key idx|
 
-    idx := lineNr.
+    idx := self keyIndexForLine:lineNr.
+    idx notNil ifTrue:[
+        key := keys at:idx.
+        ^ inspectedObject at:key ifAbsent:nil.
+    ].
+    idx := self instVarIndexForLine:lineNr.
+    idx notNil ifTrue:[
+        ^ inspectedObject instVarAt:idx.
+    ].
+
     hideReceiver ifFalse:[
         (lineNr == 1 or:[lineNr isNil]) ifTrue:[
             ^ inspectedObject
         ].
-        idx := idx - 1.
     ].
 
-    inspectedObject ~~ Smalltalk ifTrue:[
-        idx := idx + Dictionary instSize.
-        idx <= inspectedObject class instSize ifTrue:[
-            ^ inspectedObject instVarAt:idx
-        ].
-        idx := idx - inspectedObject class instSize.
-    ].
+    ^ nil
 
-    key := keys at:idx.
-    ^ inspectedObject at:key ifAbsent:nil.
-
-    "Modified: 30.7.1996 / 17:44:50 / cg"
 ! !
 
 !DictionaryInspectorView class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/DictionaryInspectorView.st,v 1.35 1999-06-23 16:02:04 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/DictionaryInspectorView.st,v 1.36 1999-06-23 16:39:52 cg Exp $'
 ! !
--- a/InspView.st	Wed Jun 23 18:04:06 1999 +0200
+++ b/InspView.st	Wed Jun 23 18:39:52 1999 +0200
@@ -296,6 +296,25 @@
     ^ listView
 !
 
+reinspect
+    "update display for a changed inspectedObject"
+
+    |aList|
+
+    hasMore := false.
+    aList := self fieldList.
+    hasMore ifTrue:[
+        aList add:' ... '
+    ].
+
+    listView contents:aList.
+
+    workspace contents:nil.
+    self setDoItAction.
+
+    selectedLine := nil
+!
+
 workspace
     ^ workspace
 ! !
@@ -767,6 +786,62 @@
     "Modified: 28.6.1996 / 15:13:41 / cg"
 !
 
+instVarIndexForLine:lineNr
+    "helper - return the index for a named instVar;
+     nil, if self or a keyed instvar is selected."
+
+    |idx|
+
+    lineNr isNil ifTrue:[^ nil].
+
+    idx := lineNr.
+    hideReceiver ifFalse:[
+        (lineNr == 1 or:[lineNr isNil]) ifTrue:[
+            ^ nil "/ self selected
+        ].
+        idx := idx - 1.
+    ].
+
+    inspectedObject ~~ Smalltalk ifTrue:[
+        idx := idx + self baseInspectedObjectClass instSize.
+        idx <= inspectedObject class instSize ifTrue:[
+            ^ idx "/ instVar selected
+        ].
+        idx := idx - inspectedObject class instSize.
+    ].
+
+    ^ nil
+
+!
+
+keyIndexForLine:lineNr
+    "helper - return the index of the key-list;
+     nil, if self or a namedInstVar is selected."
+
+    |idx|
+
+    lineNr isNil ifTrue:[^ nil].
+
+    idx := lineNr.
+    hideReceiver ifFalse:[
+        (lineNr == 1 or:[lineNr isNil]) ifTrue:[
+            ^ nil "/ self selected
+        ].
+        idx := idx - 1.
+    ].
+
+    inspectedObject ~~ Smalltalk ifTrue:[
+        idx := idx + self baseInspectedObjectClass instSize.
+        idx <= inspectedObject class instSize ifTrue:[
+            ^ nil "/ instVar selected
+        ].
+        idx := idx - inspectedObject class instSize.
+    ].
+
+    ^ idx
+
+!
+
 setDoItAction
     "set the codeViews doit action"
 
@@ -937,18 +1012,16 @@
     |val obj|
 
     (hasMore and:[lineNr == listView list size]) ifTrue:[
-	"clicked on the '...' entry"
-	self showMore.
-	listView setSelection:lineNr.
+        "clicked on the '...' entry"
+        self showMore.
+        listView setSelection:lineNr.
     ].
 
     hideReceiver ifFalse:[
-	(self hasSelfEntry and:[lineNr == 1]) ifTrue:[
-	    "selecting self also does a re-set, this allows updating the list"
-	    obj := inspectedObject.    "/ force re-evaluation of the fieldList.
-	    inspectedObject := nil.
-	    self inspect:obj.
-	].
+        (self hasSelfEntry and:[lineNr == 1]) ifTrue:[
+            "selecting self also does a re-set, this allows updating the list"
+            self reinspect.
+        ].
     ].
     val := self valueAtLine:lineNr.
     selectedLine := lineNr.
@@ -1031,5 +1104,5 @@
 !InspectorView class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/Attic/InspView.st,v 1.89 1999-06-23 15:54:44 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/Attic/InspView.st,v 1.90 1999-06-23 16:39:45 cg Exp $'
 ! !
--- a/InspectorView.st	Wed Jun 23 18:04:06 1999 +0200
+++ b/InspectorView.st	Wed Jun 23 18:39:52 1999 +0200
@@ -296,6 +296,25 @@
     ^ listView
 !
 
+reinspect
+    "update display for a changed inspectedObject"
+
+    |aList|
+
+    hasMore := false.
+    aList := self fieldList.
+    hasMore ifTrue:[
+        aList add:' ... '
+    ].
+
+    listView contents:aList.
+
+    workspace contents:nil.
+    self setDoItAction.
+
+    selectedLine := nil
+!
+
 workspace
     ^ workspace
 ! !
@@ -767,6 +786,62 @@
     "Modified: 28.6.1996 / 15:13:41 / cg"
 !
 
+instVarIndexForLine:lineNr
+    "helper - return the index for a named instVar;
+     nil, if self or a keyed instvar is selected."
+
+    |idx|
+
+    lineNr isNil ifTrue:[^ nil].
+
+    idx := lineNr.
+    hideReceiver ifFalse:[
+        (lineNr == 1 or:[lineNr isNil]) ifTrue:[
+            ^ nil "/ self selected
+        ].
+        idx := idx - 1.
+    ].
+
+    inspectedObject ~~ Smalltalk ifTrue:[
+        idx := idx + self baseInspectedObjectClass instSize.
+        idx <= inspectedObject class instSize ifTrue:[
+            ^ idx "/ instVar selected
+        ].
+        idx := idx - inspectedObject class instSize.
+    ].
+
+    ^ nil
+
+!
+
+keyIndexForLine:lineNr
+    "helper - return the index of the key-list;
+     nil, if self or a namedInstVar is selected."
+
+    |idx|
+
+    lineNr isNil ifTrue:[^ nil].
+
+    idx := lineNr.
+    hideReceiver ifFalse:[
+        (lineNr == 1 or:[lineNr isNil]) ifTrue:[
+            ^ nil "/ self selected
+        ].
+        idx := idx - 1.
+    ].
+
+    inspectedObject ~~ Smalltalk ifTrue:[
+        idx := idx + self baseInspectedObjectClass instSize.
+        idx <= inspectedObject class instSize ifTrue:[
+            ^ nil "/ instVar selected
+        ].
+        idx := idx - inspectedObject class instSize.
+    ].
+
+    ^ idx
+
+!
+
 setDoItAction
     "set the codeViews doit action"
 
@@ -937,18 +1012,16 @@
     |val obj|
 
     (hasMore and:[lineNr == listView list size]) ifTrue:[
-	"clicked on the '...' entry"
-	self showMore.
-	listView setSelection:lineNr.
+        "clicked on the '...' entry"
+        self showMore.
+        listView setSelection:lineNr.
     ].
 
     hideReceiver ifFalse:[
-	(self hasSelfEntry and:[lineNr == 1]) ifTrue:[
-	    "selecting self also does a re-set, this allows updating the list"
-	    obj := inspectedObject.    "/ force re-evaluation of the fieldList.
-	    inspectedObject := nil.
-	    self inspect:obj.
-	].
+        (self hasSelfEntry and:[lineNr == 1]) ifTrue:[
+            "selecting self also does a re-set, this allows updating the list"
+            self reinspect.
+        ].
     ].
     val := self valueAtLine:lineNr.
     selectedLine := lineNr.
@@ -1031,5 +1104,5 @@
 !InspectorView class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/InspectorView.st,v 1.89 1999-06-23 15:54:44 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/InspectorView.st,v 1.90 1999-06-23 16:39:45 cg Exp $'
 ! !
--- a/OCInspView.st	Wed Jun 23 18:04:06 1999 +0200
+++ b/OCInspView.st	Wed Jun 23 18:39:52 1999 +0200
@@ -45,6 +45,11 @@
 
 !OrderedCollectionInspectorView methodsFor:'private'!
 
+baseInspectedObjectClass
+    ^ OrderedCollection
+
+!
+
 defaultLabel
     ^ 'contents'
 
@@ -130,9 +135,9 @@
                        browse browseClassHierarchy browseFullClassProtocol
                        doStartMonitor removeIndex)
     ] ifFalse:[
-        selectedLine == 1 ifTrue:[
+        (self keyIndexForLine:selectedLine) isNil ifTrue:[
             m disable:#removeIndex
-        ]
+        ].
     ].
 
     ^ m
@@ -143,63 +148,65 @@
 !OrderedCollectionInspectorView methodsFor:'user interaction'!
 
 doAccept:theText
-    |value|
+    |value idx|
 
     value := Compiler evaluate:theText
-		      receiver:inspectedObject 
-		     notifying:workspace.
-
-    selectedLine notNil ifTrue:[
-	selectedLine == 1 ifFalse:[
-	    inspectedObject at:selectedLine - 1 put:value.
-	    inspectedObject changed
-	]
-    ].
-!
+                      receiver:inspectedObject 
+                     notifying:workspace.
 
-doInspect
-    "user selected inspect-menu entry"
-
-    selectedLine notNil ifTrue:[
-	(selectedLine == 1) ifTrue:[
-	    inspectedObject inspect
-	] ifFalse:[
-	    (inspectedObject at:selectedLine - 1) inspect
-	].
-    ]
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
+        inspectedObject at:idx put:value.
+    ] ifFalse:[
+        idx := self instVarIndexForLine:selectedLine.
+        idx notNil ifTrue:[
+            inspectedObject instVarAt:idx put:value.
+        ] ifFalse:[
+            ^ self "/ self selected
+        ]
+    ].
 !
 
 removeIndex
     "remove selected item from the collection"
 
-    selectedLine == 1 ifFalse:[
-	inspectedObject removeIndex:selectedLine -1.
-	selectedLine := nil.
-	inspectedObject changed.
-	self inspect:inspectedObject. "force list update"
+    |idx|
+
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
+        inspectedObject removeIndex:idx.
+        selectedLine := nil.
+        inspectedObject changed.
+        self reinspect.
     ]
 !
 
 valueAtLine:lineNr
     "helper - return the value of the selected entry"
 
-    |index|
+    |key idx|
+
+    idx := self keyIndexForLine:lineNr.
+    idx notNil ifTrue:[
+        ^ inspectedObject at:idx ifAbsent:nil.
+    ].
+    idx := self instVarIndexForLine:lineNr.
+    idx notNil ifTrue:[
+        ^ inspectedObject instVarAt:idx.
+    ].
 
     hideReceiver ifFalse:[
-        (lineNr isNil or:[lineNr == 1]) ifTrue:[
+        (lineNr == 1 or:[lineNr isNil]) ifTrue:[
             ^ inspectedObject
         ].
-        index := lineNr - 1.   "/ skip self
-    ] ifTrue:[
-        index := lineNr
     ].
-    ^ inspectedObject at:index
 
-    "Modified: 28.6.1996 / 15:53:56 / cg"
+    ^ nil
+
 ! !
 
 !OrderedCollectionInspectorView class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/Attic/OCInspView.st,v 1.24 1999-03-29 15:10:59 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/Attic/OCInspView.st,v 1.25 1999-06-23 16:39:50 cg Exp $'
 ! !
--- a/OrderedCollectionInspectorView.st	Wed Jun 23 18:04:06 1999 +0200
+++ b/OrderedCollectionInspectorView.st	Wed Jun 23 18:39:52 1999 +0200
@@ -45,6 +45,11 @@
 
 !OrderedCollectionInspectorView methodsFor:'private'!
 
+baseInspectedObjectClass
+    ^ OrderedCollection
+
+!
+
 defaultLabel
     ^ 'contents'
 
@@ -130,9 +135,9 @@
                        browse browseClassHierarchy browseFullClassProtocol
                        doStartMonitor removeIndex)
     ] ifFalse:[
-        selectedLine == 1 ifTrue:[
+        (self keyIndexForLine:selectedLine) isNil ifTrue:[
             m disable:#removeIndex
-        ]
+        ].
     ].
 
     ^ m
@@ -143,63 +148,65 @@
 !OrderedCollectionInspectorView methodsFor:'user interaction'!
 
 doAccept:theText
-    |value|
+    |value idx|
 
     value := Compiler evaluate:theText
-		      receiver:inspectedObject 
-		     notifying:workspace.
-
-    selectedLine notNil ifTrue:[
-	selectedLine == 1 ifFalse:[
-	    inspectedObject at:selectedLine - 1 put:value.
-	    inspectedObject changed
-	]
-    ].
-!
+                      receiver:inspectedObject 
+                     notifying:workspace.
 
-doInspect
-    "user selected inspect-menu entry"
-
-    selectedLine notNil ifTrue:[
-	(selectedLine == 1) ifTrue:[
-	    inspectedObject inspect
-	] ifFalse:[
-	    (inspectedObject at:selectedLine - 1) inspect
-	].
-    ]
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
+        inspectedObject at:idx put:value.
+    ] ifFalse:[
+        idx := self instVarIndexForLine:selectedLine.
+        idx notNil ifTrue:[
+            inspectedObject instVarAt:idx put:value.
+        ] ifFalse:[
+            ^ self "/ self selected
+        ]
+    ].
 !
 
 removeIndex
     "remove selected item from the collection"
 
-    selectedLine == 1 ifFalse:[
-	inspectedObject removeIndex:selectedLine -1.
-	selectedLine := nil.
-	inspectedObject changed.
-	self inspect:inspectedObject. "force list update"
+    |idx|
+
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
+        inspectedObject removeIndex:idx.
+        selectedLine := nil.
+        inspectedObject changed.
+        self reinspect.
     ]
 !
 
 valueAtLine:lineNr
     "helper - return the value of the selected entry"
 
-    |index|
+    |key idx|
+
+    idx := self keyIndexForLine:lineNr.
+    idx notNil ifTrue:[
+        ^ inspectedObject at:idx ifAbsent:nil.
+    ].
+    idx := self instVarIndexForLine:lineNr.
+    idx notNil ifTrue:[
+        ^ inspectedObject instVarAt:idx.
+    ].
 
     hideReceiver ifFalse:[
-        (lineNr isNil or:[lineNr == 1]) ifTrue:[
+        (lineNr == 1 or:[lineNr isNil]) ifTrue:[
             ^ inspectedObject
         ].
-        index := lineNr - 1.   "/ skip self
-    ] ifTrue:[
-        index := lineNr
     ].
-    ^ inspectedObject at:index
 
-    "Modified: 28.6.1996 / 15:53:56 / cg"
+    ^ nil
+
 ! !
 
 !OrderedCollectionInspectorView class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/OrderedCollectionInspectorView.st,v 1.24 1999-03-29 15:10:59 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/OrderedCollectionInspectorView.st,v 1.25 1999-06-23 16:39:50 cg Exp $'
 ! !
--- a/SetInspV.st	Wed Jun 23 18:04:06 1999 +0200
+++ b/SetInspV.st	Wed Jun 23 18:39:52 1999 +0200
@@ -39,6 +39,10 @@
                        doRemoveKey
                    ).
 
+    (self keyIndexForLine:selectedLine) isNil ifTrue:[
+        menu disableAll:#(doRemoveKey)
+    ].
+
     ^ menu
 
     "Modified: / 29.10.1997 / 03:41:47 / cg"
@@ -46,6 +50,11 @@
 
 !SetInspectorView methodsFor:'private'!
 
+baseInspectedObjectClass
+    ^ Set
+
+!
+
 defaultLabel
     ^ 'contents'
 
@@ -104,7 +113,7 @@
 
     inspectedObject add:value.
     inspectedObject changed.
-    self inspect:inspectedObject
+    self reinspect.
 
 
 !
@@ -114,14 +123,8 @@
 
     |key idx|
 
-    idx := selectedLine.
-    (idx notNil and:[idx ~~ 1]) ifTrue:[
-        idx := idx + Set instSize.
-        idx <= inspectedObject class instSize ifTrue:[
-            ^ self
-        ].
-        idx := idx - inspectedObject class instSize.
-
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
         key := keys at:idx.
         (inspectedObject includes:key) ifTrue:[
             listView cursor:(Cursor wait).
@@ -130,7 +133,7 @@
             selectedLine := nil.
             inspectedObject changed.
             listView cursor:(Cursor hand).
-            self inspect:inspectedObject. "force list update"
+            self reinspect.
         ].
     ]
 
@@ -138,32 +141,32 @@
 !
 
 valueAtLine:lineNr
-    "helper - return the value of the selected entry;
-     Here, the key itself is the value."
+    "helper - return the value of the selected entry"
 
     |key idx|
 
-    idx := lineNr.
+    idx := self keyIndexForLine:lineNr.
+    idx notNil ifTrue:[
+        key := keys at:idx.
+        ^ key.
+    ].
+    idx := self instVarIndexForLine:lineNr.
+    idx notNil ifTrue:[
+        ^ inspectedObject instVarAt:idx.
+    ].
+
     hideReceiver ifFalse:[
         (lineNr == 1 or:[lineNr isNil]) ifTrue:[
             ^ inspectedObject
         ].
-        idx := idx - 1.
     ].
 
-    idx := idx + Set instSize.
-    idx <= inspectedObject class instSize ifTrue:[
-        ^ inspectedObject instVarAt:idx
-    ].
-    idx := idx - inspectedObject class instSize.
-
-    key := keys at:idx.
-    ^ key.
+    ^ nil
 
 ! !
 
 !SetInspectorView class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/Attic/SetInspV.st,v 1.10 1999-06-23 16:04:06 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/Attic/SetInspV.st,v 1.11 1999-06-23 16:39:47 cg Exp $'
 ! !
--- a/SetInspectorView.st	Wed Jun 23 18:04:06 1999 +0200
+++ b/SetInspectorView.st	Wed Jun 23 18:39:52 1999 +0200
@@ -39,6 +39,10 @@
                        doRemoveKey
                    ).
 
+    (self keyIndexForLine:selectedLine) isNil ifTrue:[
+        menu disableAll:#(doRemoveKey)
+    ].
+
     ^ menu
 
     "Modified: / 29.10.1997 / 03:41:47 / cg"
@@ -46,6 +50,11 @@
 
 !SetInspectorView methodsFor:'private'!
 
+baseInspectedObjectClass
+    ^ Set
+
+!
+
 defaultLabel
     ^ 'contents'
 
@@ -104,7 +113,7 @@
 
     inspectedObject add:value.
     inspectedObject changed.
-    self inspect:inspectedObject
+    self reinspect.
 
 
 !
@@ -114,14 +123,8 @@
 
     |key idx|
 
-    idx := selectedLine.
-    (idx notNil and:[idx ~~ 1]) ifTrue:[
-        idx := idx + Set instSize.
-        idx <= inspectedObject class instSize ifTrue:[
-            ^ self
-        ].
-        idx := idx - inspectedObject class instSize.
-
+    idx := self keyIndexForLine:selectedLine.
+    idx notNil ifTrue:[
         key := keys at:idx.
         (inspectedObject includes:key) ifTrue:[
             listView cursor:(Cursor wait).
@@ -130,7 +133,7 @@
             selectedLine := nil.
             inspectedObject changed.
             listView cursor:(Cursor hand).
-            self inspect:inspectedObject. "force list update"
+            self reinspect.
         ].
     ]
 
@@ -138,32 +141,32 @@
 !
 
 valueAtLine:lineNr
-    "helper - return the value of the selected entry;
-     Here, the key itself is the value."
+    "helper - return the value of the selected entry"
 
     |key idx|
 
-    idx := lineNr.
+    idx := self keyIndexForLine:lineNr.
+    idx notNil ifTrue:[
+        key := keys at:idx.
+        ^ key.
+    ].
+    idx := self instVarIndexForLine:lineNr.
+    idx notNil ifTrue:[
+        ^ inspectedObject instVarAt:idx.
+    ].
+
     hideReceiver ifFalse:[
         (lineNr == 1 or:[lineNr isNil]) ifTrue:[
             ^ inspectedObject
         ].
-        idx := idx - 1.
     ].
 
-    idx := idx + Set instSize.
-    idx <= inspectedObject class instSize ifTrue:[
-        ^ inspectedObject instVarAt:idx
-    ].
-    idx := idx - inspectedObject class instSize.
-
-    key := keys at:idx.
-    ^ key.
+    ^ nil
 
 ! !
 
 !SetInspectorView class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/SetInspectorView.st,v 1.10 1999-06-23 16:04:06 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/SetInspectorView.st,v 1.11 1999-06-23 16:39:47 cg Exp $'
 ! !