DictionaryInspectorView.st
author Claus Gittinger <cg@exept.de>
Tue, 29 Oct 2002 13:49:17 +0100
changeset 4095 5bd36b14723d
parent 3874 ed3a652e5ce0
child 4100 d515e0e48272
permissions -rw-r--r--
labels; added suppressPseudoVars & dereferenceValueHolders (for Workspace-Variable inspector)

"
 COPYRIGHT (c) 1993 by Claus Gittinger
	      All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"

"{ Package: 'stx:libtool' }"

InspectorView subclass:#DictionaryInspectorView
	instanceVariableNames:'keys hideClassVars hideClasses hideAliases'
	classVariableNames:''
	poolDictionaries:''
	category:'Interface-Inspector'
!

!DictionaryInspectorView class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 1993 by Claus Gittinger
	      All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
!

documentation
"
    a modified Inspector for Dictionaries

    [author:]
        Claus Gittinger
"
! !

!DictionaryInspectorView methodsFor:'menu'!

fieldMenu
    <resource: #programMenu >

    |items m idx|

    inspectedObject isNameSpace ifTrue:[
        items := #(
                       ('Copy Key'             doCopyKey      )
                       ('-')
                       ('Inspect'              doInspect      )
                       ('Inspect Key'          doInspectKey   )
                       ('BasicInspect'         doBasicInspect )
                       ('Inspect Hierarchical' doNewInspect   )
                       ('-')
                       ('Ref chains'           showReferences )
                       ('References to Key'    showKeyReferences )
                       ('-')
                       ('Browse'               browse         )
                       ('-')
                       ('Add Key'              doAddKey       )
                       ('Remove Key'           doRemoveKey    )
                       ('-')
                   ).

        hideClassVars == true ifTrue:[
            items := items , #(
                           ('Show classVars'   doShowClassVars )
                       ).
        ] ifFalse:[
            items := items , #(
                           ('Hide classVars'   doHideClassVars )
                       ).
        ].
        hideClasses == true ifTrue:[
            items := items , #(
                           ('Show classes'     doShowClasses )
                       ).
        ] ifFalse:[
            items := items , #(
                           ('Hide classes'     doHideClasses )
                       ).
        ].
        hideAliases == true ifTrue:[
            items := items , #(
                           ('Show aliases'     doShowAliases )
                       ).
        ] ifFalse:[
            items := items , #(
                           ('Hide aliases'     doHideAliases )
                       ).
        ]
    ] ifFalse:[
        items := #(
                       ('Copy Key'             doCopyKey      )
                       ('-')
                       ('Inspect'              doInspect      )
                       ('Inspect Key'          doInspectKey   )
                       ('BasicInspect'         doBasicInspect )
                       ('Inspect Hierarchical' doNewInspect   )
                       ('-')
                       ('Ref chains'           showReferences )
                       ('-')
                       ('Browse'                       browse                 )
                       ('Browse class hierarchy'       browseClassHierarchy   )
                       ('Browse full class protocol'   browseFullClassProtocol)
                       ('-')
                       ('Add Key'              doAddKey       )
                       ('Remove Key'           doRemoveKey    )
                   ).
    ].

    monitorProcess isNil ifTrue:[
        items := items , #(
                       ('-')
                       ('Start Monitor'    doStartMonitor )
                          ).
    ] ifFalse:[
        items := items , #(
                       ('-')
                       ('Stop Monitor'     doStopMonitor  )
                          ).
    ].

    items := items , #(
                   ('-')
                   ('Update'     doUpdate  )
                      ).

    m := PopUpMenu itemList:items resources:resources.

    selectionIndex isNil ifTrue:[
        m disableAll:#(doInspect doInspectKey doBasicInspect doNewInspect
                       doRemoveKey doStartMonitor doStopMonitor doCopyKey
                      )
    ] ifFalse:[
        (self keyIndexForLine:selectionIndex) isNil ifTrue:[
            m disableAll:#(doInspectKey doRemoveKey doCopyKey)
        ]
    ].

    ^ m.

    "Modified: / 21.5.1998 / 13:25:10 / cg"
! !

!DictionaryInspectorView methodsFor:'menu actions'!

browse
    |cls|

    cls := self selection class theNonMetaclass.
"/    cls isNameSpace ifTrue:[
"/        self halt.
"/    ].
    cls browserClass openInClass:cls selector:nil
!

doAddKey
    "add a key"

    |keyName key val l|

    keyName := Dialog request:'Key to add (storeString):' initialAnswer:''.
    keyName notEmpty ifTrue:[
        key := Object readFrom:keyName onError:[ self information:'Bad input.'. ^ self].
        (inspectedObject includesKey:key) ifFalse:[
            val := Dialog request:'Value to add (storeString):' initialAnswer:''.
            val notNil ifTrue:[
                val := Object readFrom:val onError:[ self information:'Bad input.'. ^ self].
            ].

            inspectedObject at:key put:val.
            selectionIndex := selectedLine := nil.
            inspectedObject changed.
            l := listView firstLineShown.
            self reinspect. "force list update"
            listView scrollToLine:l
        ]
    ]
!

doHideAliases
    hideAliases := true.
    self reinspect
!

doHideClassVars
    hideClassVars := true.
    self reinspect
!

doHideClasses
    hideClasses := true.
    self reinspect
!

doInspectKey
    "inspect selected items key"

    |idx|

    idx := self keyIndexForLine:selectionIndex.
    idx notNil ifTrue:[
        (keys at:idx) inspect
    ]
!

doReferences
    "show users of selected key (i.e. global).
     Only useful when inspecting smalltalk"

    |idx|

    idx := self keyIndexForLine:selectionIndex.
    idx notNil ifTrue:[
        UserPreferences systemBrowserClass browseReferendsOf:(keys at:idx) asSymbol.
        ^ self
    ].
!

doRemoveKey
    "remove selected item from keys"

    |idx key l|

    idx := self keyIndexForLine:selectionIndex.
    idx notNil ifTrue:[
        key := keys at:idx.
        (inspectedObject includesKey:key) ifTrue:[
            listView cursor:(Cursor wait).
            inspectedObject removeKey:key.
            keys := nil.
            selectionIndex := selectedLine := nil.
            inspectedObject changed.
            listView cursor:(Cursor hand).
            l := listView firstLineShown.
            self reinspect. "force list update"
            listView scrollToLine:l.
        ].
    ]
!

doShowAliases
    hideAliases := false.
    self reinspect
!

doShowClassVars
    hideClassVars := false.
    self reinspect
!

doShowClasses
    hideClasses := false.
    self reinspect
!

showKeyReferences
    "show users of selected key (i.e. global).
     Only useful when inspecting smalltalk"

    |idx key|

    idx := self keyIndexForLine:selectionIndex.
    idx notNil ifTrue:[
        self topView withWaitCursorDo:[
            UserPreferences systemBrowserClass browseReferendsOf:(keys at:idx) asSymbol
        ].
    ]
! !

!DictionaryInspectorView methodsFor:'private'!

baseInspectedObjectClass

    (inspectedObject isMemberOf:Dictionary) ifFalse:[
        (inspectedObject class inheritsFrom:Dictionary) ifFalse:[
            "this is true for e.g. MethodDictionary"
            ^ Object
        ]
    ].
    ^ Dictionary

    "Modified: / 23.7.1999 / 10:39:11 / stefan"


!

defaultLabel
    ^ 'Keys'

    "Created: 28.6.1996 / 19:46:51 / cg"
!

indexList
    "return a list of indexes to show in the selectionList.
     Set hasMore to true, if a '...' entry should be added."

    inspectedObject isNameSpace ifTrue:[
        ^ self indexListForNameSpace.
    ].

    "/ do not use 'inspectedObjectkeys',
    "/ since Sets cannot hold nils (which are now valid keys)
    keys := OrderedCollection new.
    inspectedObject keysDo:[:k | keys add:k].
    keys := keys asSortedCollection:[:a :b | a displayString < b displayString].
    ^ keys
!

indexListForNameSpace
    "return a list of indexes to show in the selectionList.
     Set hasMore to true, if a '...' entry should be added."

    keys := SortedCollection new:1000.

    (hideClassVars or:[hideClasses or:[hideAliases]]) ifTrue:[
        inspectedObject keysDo:[:k |
            |hidden i o|

            hidden := false.
            hideClassVars == true ifTrue:[
                (i := k lastIndexOf:$:) ~~ 0 ifTrue:[
                    (i > 1 and:[(k at:i-1) ~~ $:]) ifTrue:[
                        hidden := true
                    ].
                ].
            ].
            (hidden not and:[hideClasses == true]) ifTrue:[
                o := inspectedObject at:k ifAbsent:nil.
                o isBehavior ifTrue:[
                    inspectedObject == Smalltalk ifTrue:[
                        o name == k ifTrue:[
                            hidden := true
                        ]
                    ] ifFalse:[
                        o nameWithoutNameSpacePrefix = k ifTrue:[
                            hidden := true
                        ]
                    ]
                ].
            ].
            (hidden not and:[hideAliases == true]) ifTrue:[
                o := inspectedObject at:k ifAbsent:nil.
                o isBehavior ifTrue:[
                    inspectedObject == Smalltalk ifTrue:[
                        o name ~~ k ifTrue:[
                            hidden := true
                        ]
                    ] ifFalse:[
                        o nameWithoutNameSpacePrefix ~= k ifTrue:[
                            hidden := true
                        ].
                    ].
                ].
            ].
            hidden ifFalse:[keys add:k]
        ].
    ] ifFalse:[
        inspectedObject keysDo:[:k | keys add:k].
    ].
    ^ keys
!

indexedFieldList 
    "return a list of indexed-variable names to show in the selectionList.
     Set hasMore to true, if a '...' entry should be added."

    |keys|

    keys := self indexList.
    ^ keys 
        collect:[:k | 
            k isSymbol 
                ifTrue:[
                    k printString] 
                ifFalse:[
                    k displayString]].
!

instVarIndexForLine:lineNr
    "helper - return the index for a named instVar;
     nil, if self or a keyed instvar is selected."

    inspectedObject isNameSpace ifTrue:[
        ^ nil
    ].
    ^ super instVarIndexForLine:lineNr
!

keyIndexForLine:lineNr
    "helper - return the index of the key-list"

    inspectedObject isNameSpace ifTrue:[
        (self hasSelfEntry
        and:[lineNr == 1 or:[lineNr isNil]]) ifTrue:[
            ^ nil "/ self selected
        ].
        (self hasSelfEntry not or:[self suppressPseudoSlots]) ifTrue:[
            ^ lineNr
        ].
        ^ lineNr - 5    "/ self, hash, idHash, deps, allInstVars
    ].
    ^ super keyIndexForLine:lineNr
!

namedFieldList 
    "return a list of instVar names to show in the selectionList."

    inspectedObject isNameSpace ifTrue:[
        "/ empty ...
        ^ OrderedCollection new
    ].
    ^ super namedFieldList

!

release 
    "release inspected object"

    keys := nil.
    super release
! !

!DictionaryInspectorView methodsFor:'user interaction'!

indexedValueAtIndex:idx
    |key|

    key := keys at:idx.
    ^ inspectedObject at:key ifAbsent:nil.

!

indexedValueAtIndex:idx put:newValue
    |key|

    key := keys at:idx.
    inspectedObject at:key put:newValue.
! !

!DictionaryInspectorView class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/libtool/DictionaryInspectorView.st,v 1.53 2002-10-29 12:49:12 cg Exp $'
! !