SystemBrowser.st
author Claus Gittinger <cg@exept.de>
Mon, 04 Nov 2002 12:51:53 +0100
changeset 4150 1b60aaf75f2d
parent 4143 abafc869f5ce
child 4152 92e3975f1904
permissions -rw-r--r--
icons

"
 COPYRIGHT (c) 1989 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' }"

ApplicationModel subclass:#SystemBrowser
	instanceVariableNames:''
	classVariableNames:'CheckForInstancesWhenRemovingClasses ClassHistory
		EmphasisForDifferentPackage EmphasisForModifiedBuffer
		EmphasisForObsoleteCode EmphasisForReadVariable
		EmphasisForWrittenVariable EmphasisForChangedCode'
	poolDictionaries:''
	category:'Interface-Browsers'
!

Object subclass:#BrowserHistoryEntry
	instanceVariableNames:'className meta selector'
	classVariableNames:''
	poolDictionaries:''
	privateIn:SystemBrowser
!

!SystemBrowser class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 1989 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
"
    this class implements all kinds of class browsers.
    Typically, it is started with 'SystemBrowser open', but there are many other 
    startup messages, to launch special browsers.
    See the categories 'startup' and 'special search startup' in the classes
    protocol.

    Alse, see the extra document 'doc/misc/sbrowser.doc' or the HTML online doc
    for how to use the browser.

    written winter 89 by claus.

    Notice: SystemBrowser is currently being rewritten to be an instance
    of ApplicationModel - this transition is not yet complete and you see
    here an intermediate version. The instance variables defined here are NOT
    currently used - instead, everything is really done in the BrowserView
    which (currently) keeps the real state of the browser.
    This will certainly change ...

    [author:]
        Claus Gittinger

"
! !

!SystemBrowser class methodsFor:'initialization'!

initialize
    "Browser configuration;
     (values can be changed from your private startup file)"

"/    self classResources.

    "
     setting this to false, the removeClass function will remove
     classes WITHOUT checking for instances. Otherwise,
     it will check and let you confirm in case there are instances.
     Checking for instances may be a bit time consuming, though.
     The default is true - therefore, it will check
    "
    CheckForInstancesWhenRemovingClasses := true

    "
     CheckForInstancesWhenRemovingClasses := true
     CheckForInstancesWhenRemovingClasses := false

     SystemBrowser initialize
    "
! !

!SystemBrowser class methodsFor:'instance creation'!

open
    "launch a standard browser"

    self == SystemBrowser ifFalse:[
        ^ super open
    ].

    ^ self openOnDevice:(Screen current) 

    "
     SystemBrowser open
    "
!

openInClass:aClass
    "launch a standard browser which immediately switches
     to aClass"

    ^ self openInClass:aClass selector:nil

    "
     SystemBrowser openInClass:Object
    "

    "Created: 30.4.1996 / 14:43:45 / cg"
!

openInClass:aClass selector:aSelector
    "launch a standard browser which immediately switches
     to aClass>>aSelector."

    |brwsr classesName|

    brwsr := self openOnDevice:(Screen current).
    brwsr waitUntilVisible.

    aClass notNil ifTrue:[
"/        cls := aClass.
"/        cls isMeta ifTrue:[
"/            cls := aClass soleInstance
"/        ].
        aClass isMeta ifTrue:[
            brwsr instanceProtocol:false
        ].
        aClass isJavaClass ifTrue:[
            classesName := aClass fullName. 
        ] ifFalse:[
            classesName := aClass name. 
        ].
        brwsr switchToClassNamed:classesName.
        brwsr classSelectionChanged.
        aSelector notNil ifTrue:[
            brwsr switchToMethodNamed:aSelector.
        ]
    ].
    ^ brwsr

    "
     SystemBrowser openInClass:Object selector:#at:put:
     SystemBrowser openInClass:Object selector:nil
     SystemBrowser openInClass:nil selector:nil
    "

    "Created: / 22.11.1995 / 21:04:50 / cg"
    "Modified: / 5.11.2001 / 16:51:02 / cg"
!

openOn:anEnvironment
    |browser|

    browser := self 
                newWithLabel:(self classResources string:'System Browser')
                setupBlock:[:browser | browser environment:anEnvironment.
                                       browser setupForAll]
                onDevice:(Screen current).
    ^ browser

    "
     SystemBrowser openOn:Smalltalk
     SystemBrowser openOn:Demos
    "
!

openOnDevice:aDisplay
    "launch a standard browser on another display."

    self == SystemBrowser ifFalse:[
        ^ super openOnDevice:aDisplay
    ].

    ^ self 
        newWithLabel:(self classResources string:'System Browser')
        setupBlock:[:browser | browser setupForAll]
        onDevice:aDisplay

    "|d|

     d := XWorkstation new initializeFor:'porty:0'.
     d startDispatch.
     SystemBrowser openOnDevice:d
    "
!

openOnRemoteImageOnHost:aHostName port:portOrNil
    |environment browser|

    environment := RemoteImage onHost:aHostName port:portOrNil.
    browser := self 
                newWithLabel:(self classResources string:'RemoteImage Browser - %1' with:aHostName)
                setupBlock:[:browser | browser environment:environment.
                                       browser setupForAll]
                onDevice:(Screen current).
    ^ browser

    "
     SystemBrowser openOnRemoteImageOnHost:'funkfix' port:nil
    "
!

openOnSnapShotImage:anImageFileName
    |environment browser|

    environment := SnapShotImage for:anImageFileName.
    browser := self 
                newWithLabel:(self classResources string:'Image Browser - %1' with:anImageFileName asFilename baseName)
                setupBlock:[:browser | browser environment:environment.
                                       browser setupForAll]
                onDevice:(Screen current).
    ^ browser

    "
     SystemBrowser openOnSnapShotImage:('/tmp/stmeas.img')
    "
! !

!SystemBrowser class methodsFor:'Compatibility - ST80'!

newOnClass:aClass
    ^ self browseClass:aClass

    "Created: / 27.10.1997 / 20:10:39 / cg"
! !

!SystemBrowser class methodsFor:'accessing - history'!

addToHistory:aClass selector:aSelectorOrNil
    |newEntry oldEntry classHistory|

    (newEntry := self historyEntryForClass:aClass selector:aSelectorOrNil) isNil ifTrue:[^ self].
    classHistory := self classHistory.

    oldEntry := classHistory detect:[:entry | entry className = newEntry className] ifNone:nil.
    oldEntry notNil ifTrue:[
        classHistory removeIdentical:oldEntry.
    ].
    classHistory addFirst:newEntry.
    classHistory size > self visitedHistoryMaxSize ifTrue:[
        classHistory removeLast
    ].
!

checkClassHistory
    "checks the class history for non-existing classes"

    "/ reverse, since we might modify while enumerating
    self classHistory reverseDo:[:histEntry|
        (Smalltalk at: (histEntry className) asSymbol) isBehavior
        ifFalse:[
            self classHistory remove: histEntry
        ]
    ]
!

classHistory
    ClassHistory isNil ifTrue:[
        ClassHistory := List new
    ].
    ^ ClassHistory 
!

classHistory:newCollection
    ClassHistory := newCollection
!

emptyClassHistory
    "removes all class history entries"

    self classHistory removeAll
!

historyEntryForClass:aClass selector:aSelectorOrNil
    |newEntry meta cls|

    aClass isBehavior ifFalse:[^ nil].

    (meta := aClass isMeta) ifTrue:[
        cls := aClass theNonMetaclass.
    ] ifFalse:[
        cls := aClass
    ].
    newEntry := BrowserHistoryEntry new.
    newEntry 
        className:cls name
        meta:meta
        selector:aSelectorOrNil.
    ^ newEntry

    "Modified: / 24.2.2000 / 18:03:52 / cg"
! !

!SystemBrowser class methodsFor:'defaults'!

classHistoryMaxLevels
    ^ 3
!

classHistoryMaxSize
    ^ 15
!

methodTemplate
    "return a method definition template string"

    |s|

    s := TextStream on:''.
    s nextPutAll:'message selector and argument names
    "comment stating purpose of this message"

    |temporaries|

    statement.
    statement.


    "
     optional: comment giving example use
    "
'.
    s cr.
    s emphasis:(UserPreferences current commentEmphasisAndColor).
    s nextPutAll:'"
 change the above template into real code.
 Then `accept'' either via the menu 
 or via the keyboard (usually CMD-A).

 You do not need this template; you can also
 select any existing methods code, change it,
 and finally `accept''. The method will then be
 installed under the selector as defined in the
 actual text - no matter which method is selected
 in the browser.

 Or clear this text, type in the method from scratch
 and install it with `accept''.
"
'.
    ^ s contents
!

visitedHistoryMaxSize
    "the maximum number of remembered visited-class-history entries"

    ^ 15
! !

!SystemBrowser class methodsFor:'defaults - presentation'!

emphasisForChangedCode
    ^  UserPreferences current emphasisForChangedCode.

    "
     EmphasisForChangedCode := #underwave
     EmphasisForChangedCode := #color->Color blue
     EmphasisForChangedCode := #color->Color red lightened lightened lightened
    "

    "Created: / 31.10.2001 / 10:15:33 / cg"
!

emphasisForChangedCode:anEmphasis
    EmphasisForChangedCode := anEmphasis

    "
     self emphasisForChangedCode:#underwave
     self emphasisForChangedCode:(#color->Color red lightened lightened lightened)
    "

    "Created: / 31.10.2001 / 10:15:44 / cg"
!

emphasisForDifferentPackage
    EmphasisForDifferentPackage isNil ifTrue:[
        EmphasisForDifferentPackage := UserPreferences current at:#emphasisForDifferentPackage ifAbsent:nil.
        EmphasisForDifferentPackage isNil ifTrue:[EmphasisForDifferentPackage := #color->Color brown darkened].
    ].
    ^ EmphasisForDifferentPackage

    "
     EmphasisForDifferentPackage := nil.
     EmphasisForDifferentPackage := #underwave
     EmphasisForDifferentPackage := #color->Color red lightened lightened lightened
    "

    "Modified: / 31.10.2001 / 10:47:25 / cg"
!

emphasisForDifferentPackage:anEmphasis
    EmphasisForDifferentPackage := anEmphasis

    "
     self emphasisForDifferentPackage:#underwave
     self emphasisForDifferentPackage:(#color->Color red lightened lightened lightened)
    "
!

emphasisForModifiedBuffer
    EmphasisForModifiedBuffer isNil ifTrue:[
        EmphasisForModifiedBuffer := UserPreferences current at:#emphasisForModifiedBuffer ifAbsent:nil.
        EmphasisForModifiedBuffer isNil ifTrue:[EmphasisForModifiedBuffer := #color->Color red darkened].
    ].
    ^ EmphasisForModifiedBuffer
!

emphasisForModifiedBuffer:anEmphasis
    EmphasisForModifiedBuffer := anEmphasis
!

emphasisForObsoleteCode
    EmphasisForObsoleteCode isNil ifTrue:[
        EmphasisForObsoleteCode := UserPreferences current at:#emphasisForObsoleteCode ifAbsent:nil.
        EmphasisForObsoleteCode isNil ifTrue:[EmphasisForObsoleteCode := #color->Color red].
    ].
    ^ EmphasisForObsoleteCode
!

emphasisForObsoleteCode:anEmphasis
    EmphasisForObsoleteCode := anEmphasis
!

emphasisForReadVariable
    EmphasisForReadVariable isNil ifTrue:[
        EmphasisForReadVariable := UserPreferences current at:#emphasisForReadVariable ifAbsent:nil.
        EmphasisForReadVariable isNil ifTrue:[EmphasisForReadVariable := #underline].
    ].
    ^ EmphasisForReadVariable

    "
     EmphasisForReadVariable := #underline
     EmphasisForReadVariable := Array with:#underline with:#underlineColor->Color yellow
    "
!

emphasisForReadVariable:anEmphasis
    EmphasisForReadVariable := anEmphasis

    "
     self emphasisForReadVariable:#underline
     self emphasisForReadVariable:(Array with:#underline with:#underlineColor->Color yellow)
    "
!

emphasisForWrittenVariable
    EmphasisForWrittenVariable isNil ifTrue:[
        EmphasisForWrittenVariable := UserPreferences current at:#emphasisForWrittenVariable ifAbsent:nil.
        EmphasisForWrittenVariable isNil ifTrue:[EmphasisForWrittenVariable := Array with:#underline with:#underlineColor->Color red].
    ].
    ^ EmphasisForWrittenVariable

    "
     EmphasisForWrittenVariable := #underline
     EmphasisForWrittenVariable := Array with:#underline with:#underlineColor->Color red lightened
    "
!

emphasisForWrittenVariable:anEmphasis
    EmphasisForWrittenVariable := anEmphasis

    "
     self emphasisForWrittenVariable:#underline
     self emphasisForWrittenVariable:(Array with:#underline with:#underlineColor->Color red lightened)
    "
! !

!SystemBrowser class methodsFor:'image specs'!

abstractMethodIcon
    <resource: #programImage>

    ^ self padLockGrayMiniIcon
!

addBreakPointIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self addBreakPointIcon inspect
     ImageEditor openOnClass:self andSelector:#addBreakPointIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class addBreakPointIcon'
        ifAbsentPut:[(Depth1Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@8@C @N@@8@A@@@@@P@C @D@@@@@@@@@@@@b') ; colorMapFromArray:#[255 0 0 255 255 255]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@O8A?0O?!!??G?<_?1??G?<_?1??C?8G?@O8@@@@@@b') ; yourself); yourself]
!

addBreakPointIcon2
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self addBreakPointIcon2 inspect
     ImageEditor openOnClass:self andSelector:#addBreakPointIcon2
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class addBreakPointIcon2'
        ifAbsentPut:[(Depth2Image new) width: 12; height: 20; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'****/??>/:+>/%V>.TA..P@..P@..@@./ B>/:+>/??>/:+>/**>.)V..%U..%U..UU./%V>/:+>****') ; colorMapFromArray:#[255 0 0 63 63 63 0 0 0 127 127 127]; mask:((Depth1Image new) width: 12; height: 20; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'??C?<O?0??C?<O?0??C?<O?0??C?<O?0??C?<O?0??C?<O?0??C?<@@a') ; yourself); yourself]
!

canvasIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     ImageEditor openOnClass:self andSelector:#canvasIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser canvasIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@.;.;.;.0@@@@@@@@@@C.;/C.;/@@9&XP9&XP@NY&DNY&D@C&Y!!C&Y!!@@9&XP9&XP@NY&DNY&D@C1DQC1DQ@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 255 0 0 0 255 0 0 0 255 0 255 255 255 255 0 255 0 255 127 0 0 0 127 0 0 0 127 0 127 127 127 127 0 127 0 127 127 127 127 170 170 170]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'??#?>O?8??#?>O?8??#?>O?8??#?>@@a') ; yourself); yourself]
!

containerClassIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self containerClassIcon inspect
     ImageEditor openOnClass:self andSelector:#containerClassIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class containerClassIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'B;.0@K.;@@.;,@B;.0@K,@@@@K,@B;@@@@B;@@.0@@@@.0@K,@@@@K,@B;@@@@B;@@.0@@@@.0@K,@@@@K,@B;.0@K.;@@.;,@B;.0@b') ; colorMapFromArray:#[0 0 0 255 255 255 255 0 0 0 255 0 0 0 255 0 255 255 255 255 0 255 0 255 127 0 0 0 127 0 0 0 127 0 127 127]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'^OA8<F@0XCA LF@0XCA LF@0^OA8<@@a') ; yourself); yourself]
!

defaultIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self defaultIcon inspect
     ImageEditor openOnClass:self andSelector:#defaultIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class defaultIcon'
        ifAbsentPut:[(Depth4Image new) width: 28; height: 28; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
@@@@@@@@@@@@@@@@@@@FY&Y&Y&X0@@@@@@@@@@YDQDQDQB@@@@@@@@@@A$QDQDQDH@@@@@@@@@@CH"H"H"H @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@@@
@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@B@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@A&Y&Y&Y#@@@@@F@"H"HFDQDQDQH@@@@@@@@@@@L"H"H"
H @@@@@ @@@@@@@@@@@@@@@@@B@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@A&Y&Y&Y#@@@@@F@"H"HFUUUUUUH@@@@@@@@@@@L"H"H"H @@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@@@@B@B@ @@H@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@H@@ @@@@Hb') ; colorMapFromArray:#[0 0 0 0 255 0 127 127 127 170 170 170 255 0 0 255 255 0 255 255 255]; mask:((Depth1Image new) width: 28; height: 28; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
??0@@O?<@@C??@@@??0@@O?<@@C??@@@@ @@@@H@@@@B@@@@@ O?8@\C?>@G??? A0O?8@HC?>@B@@@@@ O?8@\C?>@G??? A0O?8@@C?>@@@@@@9O\7\IRT
QDBD%DQ@!!OH''HHRQEABT$QPP99]7\@@a') ; yourself); yourself]
!

emptyIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self emptyIcon inspect
     ImageEditor openOnClass:self andSelector:#emptyIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class emptyIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; yourself); yourself]

    "Created: / 5.11.2001 / 09:39:54 / cg"
!

errorClassIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self errorClassIcon inspect
     ImageEditor openOnClass:self andSelector:#errorClassIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class errorClassIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@BH@@@@@@@@"@@@@@@@BH"@@@@@@@"H @@@@@@H"H@@@@@@BH"@@@@@@@"H @@@@@@@"@@@@@@@@@@@@@@@@@BH@@@@@@@@"@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 255 0 0]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'A @F@@<@C0@O@@<@C0@F@@@@A @F@@@a') ; yourself); yourself]
!

exceptionClassIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self exceptionClassIcon inspect
     ImageEditor openOnClass:self andSelector:#exceptionClassIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class exceptionClassIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@BH@@@@@@@@"@@@@@@@BH"@@@@@@@"H @@@@@@H"H@@@@@@BH"@@@@@@@"H @@@@@@@"@@@@@@@@@@@@@@@@@BH@@@@@@@@"@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 255 255 0]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'A @F@@<@C0@O@@<@C0@F@@@@A @F@@@a') ; yourself); yourself]
!

fileImageIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self fileImageIcon inspect
     ImageEditor openOnClass:self andSelector:#fileImageIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser fileImageIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@H"H"H"@@@BQBH!!D"@@@$P"HQH"@@H"H"DQH @BH"HQDRH@@"H"DQH"@@L3L3DSL0@CL3L1D3L@@3L3L3L3@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 51 153 153 51 255 255 255 153 0 255 255 0]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'?<C?8O?0??#?>O?8??#?>O?8??#?>@@a') ; yourself); yourself]
!

greenLockIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self greenLockIcon inspect
     ImageEditor openOnClass:self andSelector:#greenLockIcon
    "

    <resource: #programImage>

    ^ self padLockGreenMiniIcon

    "Modified: / 5.11.2001 / 09:40:12 / cg"
!

helpIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self helpIcon inspect
     ImageEditor openOnClass:self andSelector:#helpIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser helpIcon'
        ifAbsentPut:[(Depth1Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@A?<G#0]7A?\G;0__A?<G72_?@@@@@a') ; colorMapFromArray:#[0 0 0 255 255 255]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'??#?>O?8??#?>O?8??#?>O?8??#?>@@a') ; yourself); yourself]
!

hierarchicalListIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     ImageEditor openOnClass:self andSelector:#hierarchicalListIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser hierarchicalListIcon'
        ifAbsentPut:[(Depth2Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@NAUUU0@R??8@GO?>@A0@C @\??88G@@N@A3?? @^@@8@N***@@@@@C b') ; colorMapFromArray:#[0 0 0 255 255 255 127 127 127 170 170 170]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'??#?>O?8??#?>O?8??#?>O?8??#?>@@a') ; yourself); yourself]
!

imageIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self imageIcon inspect
     ImageEditor openOnClass:self andSelector:#imageIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser imageIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@H"H"H"H @BQBH!!D"H@@$P"HQH"@@H"H"DQH @BH"HQDRH@@"H"DQH"@@L3L3DSL0@CL3L1D3L@@3L3L3L3@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 51 153 153 51 255 255 255 153 0 255 255 0]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'??#?>O?8??#?>O?8??#?>O?8??#?>@@a') ; yourself); yourself]
!

medium_methodEmptyInheritedIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self medium_methodEmptyInheritedIcon inspect
     ImageEditor openOnClass:self andSelector:#medium_methodEmptyInheritedIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class medium_methodEmptyInheritedIcon'
        ifAbsentPut:[(Depth4Image new) width: 9; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; colorMapFromArray:#[0 0 0]; mask:((Depth1Image new) width: 9; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; yourself); yourself]
!

medium_methodInheritedFromAboveAndRedefinedBelowIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self medium_methodInheritedFromAboveAndRedefinedBelowIcon inspect
     ImageEditor openOnClass:self andSelector:#medium_methodInheritedFromAboveAndRedefinedBelowIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class medium_methodInheritedFromAboveAndRedefinedBelowIcon'
        ifAbsentPut:[(Depth2Image new) width: 9; height: 11; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@B()@B(@A@ @A@ @A@ (EP@HEP@@@@@@@@@@') ; colorMapFromArray:#[0 0 0 255 255 127 255 127 127]; mask:((Depth1Image new) width: 9; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@/ B>@K8A7@G\@]0C:@O(@> @@@@@a') ; yourself); yourself]
!

medium_methodInheritedFromAboveIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self medium_methodInheritedFromAboveIcon inspect
     ImageEditor openOnClass:self andSelector:#medium_methodInheritedFromAboveIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class medium_methodInheritedFromAboveIcon'
        ifAbsentPut:[(Depth1Image new) width: 9; height: 11; photometric:(#palette); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@A@@@ @B@@HA=0LG@@@@@@@@@a') ; colorMapFromArray:#[0 0 0 255 255 127]; mask:((Depth1Image new) width: 9; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@ @B@@H@A0@G@@\@C8@O @>@@@@@@a') ; yourself); yourself]
!

medium_methodRedefinedBelowIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self medium_methodRedefinedBelowIcon inspect
     ImageEditor openOnClass:self andSelector:#medium_methodRedefinedBelowIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class medium_methodRedefinedBelowIcon'
        ifAbsentPut:[(Depth1Image new) width: 9; height: 11; photometric:(#palette); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@ED@L@\@A0@B@@H@@"8@P@@@@@@@@@@a') ; colorMapFromArray:#[0 0 0 255 127 127]; mask:((Depth1Image new) width: 9; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@O @>@C8@G@@\@A0@B@@H@@ @@@@@a') ; yourself); yourself]
!

menuIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self menuIcon inspect
     ImageEditor openOnClass:self andSelector:#menuIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser menuIcon'
        ifAbsentPut:[(Depth2Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@B***P@%UUT@@@@@@B***P@%UUT@@@@@@B***P@%UUT@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 170 170 170 255 255 255]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'??#?>O?8??#?>O?8??#?>O?8?? @@@@a') ; yourself); yourself]
!

methodEmptyInheritedIcon
    ^ self small_methodEmptyInheritedIcon
!

methodInheritedFromAboveAndRedefinedBelowIcon
    ^ self small_methodInheritedFromAboveAndRedefinedBelowIcon
!

methodInheritedFromAboveIcon
    ^ self small_methodInheritedFromAboveIcon
!

methodRedefinedBelowIcon
    ^ self small_methodRedefinedBelowIcon
!

nameSpaceIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self nameSpaceIcon inspect
     ImageEditor openOnClass:self andSelector:#nameSpaceIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class nameSpaceIcon'
        ifAbsentPut:[(Depth2Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@AO8C?DS:"?1D:(/<QN*J?DS*"/1D:(+<QN*J/DR*"+1AJ(*!!@DJJA@@T@E@@@UT@@@a') ; colorMapFromArray:#[0 0 0 190 190 0 194 194 194 255 255 255]; mask:((ImageMask new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@G#1??7??_?=??7??_?=??7??O?8_?@?8@>@b') ; yourself); yourself]
!

packageIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self packageIcon inspect
     ImageEditor openOnClass:self andSelector:#packageIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser packageIcon'
        ifAbsentPut:[(Depth2Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@ATET@AUEE@APQAP@TDQT@AY%Z@@UUUX@J%*F@@E@I B)Z"X@*V(&@J%*I B)Z"X@*V($@J%*I@B)Z @@@T@@@@a') ; colorMapFromArray:#[0 0 0 132 0 132 255 255 0]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'A30O[A%LF?<O?0??G?<??3??O?<??3??O?8??C?8O?@b') ; yourself); yourself]
!

padLockBlueMiniIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self padLockBlueMiniIcon inspect
     ImageEditor openOnClass:self andSelector:#padLockBlueMiniIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser padLockBlueMiniIcon'
        ifAbsentPut:[(Depth2Image new) width: 12; height: 12; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'?0C??F$?<TEO<S1O<@@O2**#2UUS2TES2VES2UUS<@@O????') ; colorMapFromArray:#[0 0 0 128 128 255 212 212 255 255 255 255]; mask:((Depth1Image new) width: 12; height: 12; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
C0@_ C?@N\@?0G? _>A?8G? _>@?0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@') ; yourself); yourself]
!

padLockGrayMiniIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self padLockGrayMiniIcon inspect
     ImageEditor openOnClass:self andSelector:#padLockGrayMiniIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser padLockGrayMiniIcon'
        ifAbsentPut:[(Depth2Image new) width: 12; height: 12; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'?0C??F$?<TEO<S1O<@@O2**#2UUS2TES2VES2UUS<@@O????') ; colorMapFromArray:#[0 0 0 128 128 128 212 212 212 255 255 255]; mask:((Depth1Image new) width: 12; height: 12; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
C0@_ C?@N\@?0G? _>A?8G? _>@?0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@') ; yourself); yourself]
!

padLockGreenMiniIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self padLockGreenMiniIcon inspect
     ImageEditor openOnClass:self andSelector:#padLockGreenMiniIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser padLockGreenMiniIcon'
        ifAbsentPut:[(Depth2Image new) width: 12; height: 12; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'?0C??F$?<TEO<S1O<@@O2**#2UUS2TES2VES2UUS<@@O????') ; colorMapFromArray:#[0 0 0 128 255 128 212 255 212 255 255 255]; mask:((Depth1Image new) width: 12; height: 12; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
C0@_ C?@N\@?0G? _>A?8G? _>@?0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@') ; yourself); yourself]
!

padLockRedMiniIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self padLockRedMiniIcon inspect
     ImageEditor openOnClass:self andSelector:#padLockRedMiniIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser padLockRedMiniIcon'
        ifAbsentPut:[(Depth2Image new) width: 12; height: 12; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'?0C??F$?<TEO<S1O<@@O2**#2UUS2TES2VES2UUS<@@O????') ; colorMapFromArray:#[0 0 0 255 128 128 255 212 212 255 255 255]; mask:((Depth1Image new) width: 12; height: 12; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
C0@_ C?@N\@?0G? _>A?8G? _>@?0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@') ; yourself); yourself]
!

privateMethodIcon
    <resource: #programImage>

    ^ self padLockRedMiniIcon
!

programImageIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self programImageIcon inspect
     ImageEditor openOnClass:self andSelector:#programImageIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser programImageIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@H"H"H"H @BQBH!!D"H@@$P"HQH"@@H"H"DQH @BH"HQDRH@@"H"DQH"@@L3L3DSL0@CL3L1D3L@@3L3L3L3@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 25 77 77 51 255 255 128 128 0 128 77 0]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'??#?>O?8??#?>O?8??#?>O?8??#?>@@a') ; yourself); yourself]
!

programMenuIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self programMenuIcon inspect
     ImageEditor openOnClass:self andSelector:#programMenuIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser programMenuIcon'
        ifAbsentPut:[(Depth1Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@A?<G?0@@A?<G?0@@A?<G?3@@@@@@@a') ; colorMapFromArray:#[0 0 0 170 170 170]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'??#?>O?8??#?>O?8??#?>O?8?? @@@@a') ; yourself); yourself]
!

protectedMethodIcon
    <resource: #programImage>

    ^ self padLockGreenMiniIcon
!

redLockIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self redLockIcon inspect
     ImageEditor openOnClass:self andSelector:#redLockIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser redLockIcon'
        ifAbsentPut:[(Depth2Image new) width: 9; height: 11; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@T@@AA@@AA@@EUP@EUP@EQP@EQP@EQP@EAP@AU@@@@@@') ; colorMapFromArray:#[0 0 0 255 0 0]; mask:((Depth1Image new) width: 9; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'F@@$@BP@_ A>@G8@_ A>@G8@O@@@@@@a') ; yourself); yourself]
!

removeBreakPointIcon2
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self removeBreakPointIcon2 inspect
     ImageEditor openOnClass:self andSelector:#removeBreakPointIcon2
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class removeBreakPointIcon2'
        ifAbsentPut:[(Depth2Image new) width: 12; height: 20; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'****/??>/:+>/**>.)V..%U..%U..UU./%V>/:+>/??>/:+>/%V>.TA..P@..P@..@@./ B>/:+>****') ; colorMapFromArray:#[0 255 0 63 63 63 0 0 0 127 127 127]; mask:((Depth1Image new) width: 12; height: 20; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'??C?<O?0??C?<O?0??C?<O?0??C?<O?0??C?<O?0??C?<O?0??C?<@@a') ; yourself); yourself]
!

small_methodEmptyInheritedIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self small_methodEmptyInheritedIcon inspect
     ImageEditor openOnClass:self andSelector:#small_methodEmptyInheritedIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class small_methodEmptyInheritedIcon'
        ifAbsentPut:[(Depth4Image new) width: 5; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@') ; colorMapFromArray:#[0 0 0]; mask:((Depth1Image new) width: 5; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@b') ; yourself); yourself]
!

small_methodInheritedFromAboveAndRedefinedBelowIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self small_methodInheritedFromAboveAndRedefinedBelowIcon inspect
     ImageEditor openOnClass:self andSelector:#small_methodInheritedFromAboveAndRedefinedBelowIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class small_methodInheritedFromAboveAndRedefinedBelowIcon'
        ifAbsentPut:[(Depth2Image new) width: 5; height: 11; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'L1@DLLS,ES@@@@@0@@@*@L#@B@@3@@@a') ; colorMapFromArray:#[0 0 0 255 255 127 255 127 127 127 127 127]; mask:((Depth1Image new) width: 5; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'\GC8>O @>O#8\G@b') ; yourself); yourself]
!

small_methodInheritedFromAboveIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self small_methodInheritedFromAboveIcon inspect
     ImageEditor openOnClass:self andSelector:#small_methodInheritedFromAboveIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class small_methodInheritedFromAboveIcon'
        ifAbsentPut:[(Depth2Image new) width: 5; height: 11; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'H#HDLHR@EP@@@@@@@BD@IP@!!@B@@IP@a') ; colorMapFromArray:#[0 0 0 255 255 127 127 127 127]; mask:((Depth1Image new) width: 5; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'\GC8>O @@@@@@@@b') ; yourself); yourself]
!

small_methodRedefinedBelowIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self small_methodRedefinedBelowIcon inspect
     ImageEditor openOnClass:self andSelector:#small_methodRedefinedBelowIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class small_methodRedefinedBelowIcon'
        ifAbsentPut:[(Depth2Image new) width: 5; height: 11; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@D@@@@@@@@@@@@@@@4UBHR@A@@"@@@a') ; colorMapFromArray:#[0 0 0 255 127 127 127 127 127]; mask:((Depth1Image new) width: 5; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@>O#8\G@b') ; yourself); yourself]
!

startableClassIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self startableClassIcon inspect
     ImageEditor openOnClass:self andSelector:#startableClassIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class startableClassIcon'
        ifAbsentPut:[(Depth2Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'**J*NJ*"*#"*!!J(@*!!T*@J(DJ B*DR(@*!!T*NJ(*J B*O2(@*+.*@J*** @b') ; colorMapFromArray:#[0 0 0 127 127 127 255 0 0 255 255 0]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@ @B@@\@C8@O @>@C8@H @>@A0@G@@@a') ; yourself); yourself]

    "Created: / 5.11.2001 / 09:50:16 / cg"
!

startableVisualAppIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self startableVisualAppIcon inspect
     ImageEditor openOnClass:self andSelector:#startableVisualAppIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class startableVisualAppIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@A@P@@@@9&XPE&XP@NY!!C E&D@C&DN; E!!@@9!!@N@AXP@NXP8N@VD@C&DN; E!!@@9!!A&XAXP@NXPY&@VD@C1DVI!!DQ@@@@D"HP@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 255 0 0 0 255 0 0 0 255 0 255 255 255 255 0 255 0 255 127 0 0 0 127 0 0 0 127 0 127 127 127 127 0 127 0 127 127 127 127 170 170 170]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'??#?>O?8??#?>O?8??#?>O?8??#?>@@a') ; yourself); yourself]

    "Created: / 5.11.2001 / 09:49:00 / cg"
!

stopIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self stopIcon inspect
     ImageEditor openOnClass:self andSelector:#stopIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class stopIcon'
        ifAbsentPut:[(Depth1Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@N@@8@C @N@@P@@@@D@@8@A@@@@@@a') ; colorMapFromArray:#[255 0 0 255 255 255]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'G0@? G?@?>C?8O? ?>C?8G?@O8@_@@@a') ; yourself); yourself]
!

tabListIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self tabListIcon inspect
     ImageEditor openOnClass:self andSelector:#tabListIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser tabListIcon'
        ifAbsentPut:[(Depth2Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@D3!!QP@@8TT@@N@@J@C***P@:**$AN**)@C***P@:**$@IUUUB @@@@@b') ; colorMapFromArray:#[0 0 0 127 127 127 170 170 170 255 255 255]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'?8C?0O?0??#?>O?8??#?>O?8??#?>@@a') ; yourself); yourself]
!

tableColumnsIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self tableColumnsIcon inspect
     ImageEditor openOnClass:self andSelector:#tableColumnsIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser tableColumnsIcon'
        ifAbsentPut:[(Depth2Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@C??? @8(($@L@@AHC"""R@0@@D@NJJI@C@@@P@8(($@IUUU@@@@@@@b') ; colorMapFromArray:#[0 0 0 127 127 127 170 170 170 255 255 255]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'??#?>O?8??#?>O?8??#?>O?8??#?>@@a') ; yourself); yourself]
!

testCaseClassIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self testCaseClassIcon inspect
     ImageEditor openOnClass:self andSelector:#testCaseClassIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class testCaseClassIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@H @@@@@@@"@@@@@@@@H@@@@@@ @"@@@@@@H H@@@@@@@H"@@@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 0 127 0]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@C@@X@A@AL@F @N@@P@@@@@@@@a') ; yourself); yourself]
!

testCaseClassIconFor:cls
    |lastResult|

    lastResult := cls lastTestrunResultOrNil.

    lastResult == true ifTrue:[
        ^ self testCasePassedIcon
    ].
    lastResult == false ifTrue:[
        ^ self testCaseFailedIcon
    ].
    ^ self testCaseUnknownResultIcon
!

testCaseFailedIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self testCaseFailedIcon inspect
     ImageEditor openOnClass:self andSelector:#testCaseFailedIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class testCaseFailedIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@H @@@@@@@"@@@@@@@@H@@@@@@ @"@@@@@@H H@@@@@@@H"@@@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 255 0 0]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@C@@X@A@AL@F @N@@P@@@@@@@@a') ; yourself); yourself]
!

testCasePassedIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self testCasePassedIcon inspect
     ImageEditor openOnClass:self andSelector:#testCasePassedIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class testCasePassedIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@H @@@@@@@"@@@@@@@@H@@@@@@ @"@@@@@@H H@@@@@@@H"@@@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 0 127 0]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@C@@X@A@AL@F @N@@P@@@@@@@@a') ; yourself); yourself]
!

testCaseUnknownResultIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self testCaseUnknownResultIcon inspect
     ImageEditor openOnClass:self andSelector:#testCaseUnknownResultIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class testCaseUnknownResultIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@H @@@@@@@"@@@@@@@@H@@@@@@ @"@@@@@@H H@@@@@@@H"@@@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 127 127 127]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@C@@X@A@AL@F @N@@P@@@@@@@@a') ; yourself); yourself]
!

timeIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self timeIcon inspect
     ImageEditor openOnClass:self andSelector:#timeIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser timeIcon'
        ifAbsentPut:[(Depth1Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@G@A7@G\@=8C0 O>@_0A?@A0@@@@@a') ; colorMapFromArray:#[0 0 0 255 255 255]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'A0@_0C? O>A?<G?0_?@?8C? G<@G@@@a') ; yourself); yourself]
!

traceIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self traceIcon inspect
     ImageEditor openOnClass:self andSelector:#traceIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser traceIcon'
        ifAbsentPut:[(Depth1Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@>@C8@G@@\@@ @B@@@@@@@@@@@a') ; colorMapFromArray:#[255 0 0 255 255 255]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'_?A?<C? O>@_0A?@C8@O @\@A0@B@@@a') ; yourself); yourself]
!

visualStartableClassIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self visualStartableClassIcon inspect
     ImageEditor openOnClass:self andSelector:#visualStartableClassIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class visualStartableClassIcon'
        ifAbsentPut:[(Depth2Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(2 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'**J*NJ*"*#"*!!J(@*!!T*@J(DJ B*DR(@*!!T*NJ(*J B*O2(@*+.*@J*** @b') ; colorMapFromArray:#[0 0 0 127 127 127 255 0 0 255 255 0]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@ @B@@\@C8@O @>@C8@H @>@A0@G@@@a') ; yourself); yourself]

    "Modified: / 5.11.2001 / 09:49:30 / cg"
!

watchIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self watchIcon inspect
     ImageEditor openOnClass:self andSelector:#watchIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class watchIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 12; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@X@@@X@@@@AE XQY @@XALCDFD@@AD0@CDV@@XAL@@1A @AD0@P@1D@XBI!!DVH A QUPQEEU@@%"EDAVHT@IX]R@%!!5@FQUH@@%U@A&H$@@P"X@') ; colorMapFromArray:#[0 0 51 0 0 60 0 51 102 51 102 153 71 102 145 128 213 221 153 153 204 153 255 255 255 255 255]; mask:((Depth1Image new) width: 13; height: 12; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'FL@]0C7 O>A?<G?0??#=>O78?_#8>GA0') ; yourself); yourself]
!

windowClassIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self windowClassIcon inspect
     ImageEditor openOnClass:self andSelector:#windowClassIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class windowClassIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@;.;.;.8P@N??????D@C/?????1@@;?????<P@N??????D@C/?????1@@;?????<P@N??????D@@QDQDQDQ@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 255 0 0 0 255 0 0 0 255 0 255 255 255 255 0 255 0 255 127 0 0 0 127 0 0 0 127 0 127 127 127 127 0 127 0 127 127 127 127 170 170 170]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'??#?>O?8??#?>O?8??#?>O?8??#?>@@a') ; yourself); yourself]
!

windowIcon
    "This resource specification was automatically generated
     by the ImageEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the ImageEditor may not be able to read the specification."

    "
     self windowIcon inspect
     ImageEditor openOnClass:self andSelector:#windowIcon
    "

    <resource: #image>

    ^Icon
        constantNamed:#'SystemBrowser class windowIcon'
        ifAbsentPut:[(Depth4Image new) width: 13; height: 11; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@.;.;.;.0@@@@@@@@@@C.;.;.;/@@9&Y&Y&XP@NY&Y&Y&D@C&Y&Y&Y!!@@9&Y&Y&XP@NY&Y&Y&D@C1DQDQDQ@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255 255 0 0 0 255 0 0 0 255 0 255 255 255 255 0 255 0 255 127 0 0 0 127 0 0 0 127 0 127 127 127 127 0 127 0 127 127 127 127 170 170 170]; mask:((Depth1Image new) width: 13; height: 11; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'??#?>O?8??#?>O?8??#?>O?8??#?>@@a') ; yourself); yourself]

    "Created: / 5.11.2001 / 09:39:03 / cg"
! !

!SystemBrowser class methodsFor:'interface specs'!

metaSpec
        "UIPainter new openOnClass: self andSelector: #metaSpec"

        <resource: #canvas>
        ^#(#FullSpec 
                #window: 
                #(#WindowSpec 
                        #label: 'Unlabeled Canvas' 
                        #bounds: #(#Rectangle 27 249 325 334 ) ) 
                #component: 
                #(#SpecCollection 
                        #collection: #(
                                #(#RadioButtonSpec 
                                        #layout: #(#LayoutFrame 0 0 4 0 -1 0.575 20 0 ) 
                                        #name: #instanceSwitch 
                                        #model: #metaHolder 
                                        #callbacksSpec: 
                                        #(#UIEventCallbackSubSpec 
                                                #requestValueChangeSelector: #changeRequest ) 
                                        #label: 'instance' 
                                        #select: false ) 
                                #(#RadioButtonSpec 
                                        #layout: #(#LayoutFrame 1 0.575 4 0 -1 1 20 0 ) 
                                        #name: #classSwitch 
                                        #model: #metaHolder 
                                        #callbacksSpec: 
                                        #(#UIEventCallbackSubSpec 
                                                #requestValueChangeSelector: #changeRequest ) 
                                        #label: 'class' 
                                        #select: true ) ) ) )

    "Created: / 30.10.1997 / 19:07:29 / cg"
!

methodMoveDialogSpec
    "this window spec was automatically generated by the ST/X UIPainter"

    "do not manually edit this - the painter/builder may not be able to
     handle the specification if its corrupted."

    "
     UIPainter new openOnClass:SystemBrowser andSelector:#methodMoveDialogSpec
     SystemBrowser new openDialogInterface:#methodMoveDialogSpec
    "

    <resource: #canvas>

    ^
     
       #(#FullSpec
          #'window:' 
           #(#WindowSpec
              #'name:' 'uIPainterView'
              #'layout:' #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
              #'label:' 'move method'
              #'bounds:' #(#Rectangle 0 0 279 118)
          )
          #'component:' 
           #(#SpecCollection
              #'collection:' 
               #(
                 #(#HorizontalPanelViewSpec
                    #'name:' 'horizontalPanelView'
                    #'layout:' #(#LayoutFrame 0 0.0 -35 1.0 0 1.0 -2 1.0)
                    #'component:' 
                     #(#SpecCollection
                        #'collection:' 
                         #(
                           #(#ActionButtonSpec
                              #'name:' 'actionButton2'
                              #'label:' 'cancel'
                              #'tabable:' true
                              #'model:' #cancel
                              #'extent:' #(#Point 133 27)
                          )
                           #(#ActionButtonSpec
                              #'name:' 'actionButton1'
                              #'label:' 'move'
                              #'tabable:' true
                              #'isDefault:' true
                              #'model:' #accept
                              #'extent:' #(#Point 134 27)
                          )
                        )
                    )
                    #'level:' 0
                    #'horizontalLayout:' #fitSpace
                    #'verticalLayout:' #center
                    #'horizontalSpace:' 4
                    #'verticalSpace:' 4
                )
                 #(#LabelSpec
                    #'name:' 'label'
                    #'layout:' #(#LayoutFrame 2 0 2 0 -2 1.0 25 0)
                    #'label:' 'move current method to which class:'
                    #'style:' 
                     #(#Font
                        'helvetica' 'medium'
                        'roman' 12
                    )
                    #'foregroundColor:' #(#Color 0.0 0.0 0.0)
                    #'backgroundColor:' #(#Color 66.9993 66.9993 66.9993)
                    #'adjust:' #left
                )
                 #(#ComboBoxSpec
                    #'name:' 'comboBox1'
                    #'layout:' #(#LayoutFrame 2 0 29 0 -2 1.0 51 0)
                    #'tabable:' true
                    #'model:' #className
                    #'comboList:' #classList
                )
              )
          )
      )

    "Created: 25.6.1997 / 13:45:20 / cg"
    "Modified: 25.6.1997 / 13:46:44 / cg"
! !

!SystemBrowser class methodsFor:'private helpers'!

askForPackageChangeFrom:oldPkg to:newPkg
    |answer box notAgain chk|

    box := OptionBox 
                title:
('You are about to change a method from another (system-) package.
The methods original packageID was ''%1''. 
If you proceed, the new method will be marked as belonging
to the ''%2'' package (and this warning will not be shown again).
If you proceed with ''keep'', the new method will be installed
but the old packageID will be preserved.
Otherwise, hit ''cancel'' to leave the code unchanged.

PS: if you disable this check here, it can be reenabled it in the launchers settings-compilation dialog.' 
                        bindWith:(oldPkg allBold)
                            with:(newPkg allBold))
                numberOfOptions:3.

    box buttonTitles:#('Cancel' 'Keep' 'Continue').
    box defaultButtonIndex:3. 
    box action:[:n | answer := #(#cancel #keep #continue) at:n].
    box label:'Method redefinition'; form:(WarningBox iconBitmap).
    box yPosition:(box formLabel bottom max:box textLabel bottom).
    box addVerticalSpace:10.
    chk := box addCheckBox:'Dont show this dialog again (never keep)' on:(notAgain := false asValue).
    box preferredExtent:(box preferredExtent + (0 @ chk preferredExtent y) + (0@10)).
    box resize.
    box showAtPointer.
    box destroy.

    (answer ~~ #cancel) ifTrue:[
        notAgain value ifTrue:[
            Class catchMethodRedefinitions:false.
        ].
    ].
    ^ answer.
!

showNoneFound
    self warn:(self classResources string:'None found.').
!

showNoneFound:what
    |rs|

    rs := self classResources.
    self information:((rs string:what) , (rs string:'...\\... none found.')) withCRs.
! !

!SystemBrowser class methodsFor:'private instance creation'!

newWithLabel:aString setupBlock:aBlock
    "common helper method for all creation methods"

    ^ self newWithLabel:aString setupBlock:aBlock onDevice:Screen current
!

newWithLabel:aString setupBlock:aBlock onDevice:aWorkstation
    "common helper method for all creation methods"

    |newBrowser|

    newBrowser := BrowserView onDevice:aWorkstation.
    newBrowser title:aString.
    aBlock value:newBrowser.

    newBrowser open.
    ^ newBrowser
!

newWithLabel:aString setupSelector:aSymbol arg:arg
    "common helper method for all creation methods"

    ^ self newWithLabel:aString setupSelector:aSymbol arg:arg onDevice:Screen current 
!

newWithLabel:aString setupSelector:aSymbol arg:arg onDevice:aWorkstation
    "common helper method for all creation methods"

    |newBrowser|

    newBrowser := BrowserView onDevice:aWorkstation.
    newBrowser title:aString.
    newBrowser perform:aSymbol with:arg.
    newBrowser open.
    ^ newBrowser
! !

!SystemBrowser class methodsFor:'special search startup'!

allCallsOn:aSelectorString
    "return a collection of methods which send aSelector."

    ^ self 
        allCallsOn:aSelectorString 
        in:(Smalltalk allClasses)

    "
     SystemBrowser allCallsOn:#at:put:
    "

    "Created: 24.1.1997 / 19:42:57 / cg"
!

allCallsOn:aSelectorString in:aCollectionOfClasses
    "return a collection of methods which send aSelector.
     Methods from classes in aCollectionOfClasses are searched only."

    ^ self
        allCallsOn:aSelectorString 
        in:aCollectionOfClasses 
        ignoreCase:false

!

allCallsOn:aSelectorString in:aCollectionOfClasses ignoreCase:ignoreCase
    "return a collection of methods which send aSelector.
     Methods from classes in aCollectionOfClasses are searched only."

    |sel searchBlock lcString  quickMatch classesSearched|

    aSelectorString size == 0 ifTrue:[ ^ #() ].
    classesSearched := aCollectionOfClasses.

    ((aSelectorString ~= '*') 
     and:[(aSelectorString includesMatchCharacters or:[ignoreCase])]) ifTrue:[
        "/ a matchString - need string matching procedure

        ignoreCase ifTrue:[
            lcString := aSelectorString asLowercase.
        ] ifFalse:[
            lcString := aSelectorString.
        ].

        quickMatch := aSelectorString.
        (quickMatch startsWith:'*') ifTrue:[
            quickMatch := quickMatch copyFrom:2
        ].
        (quickMatch endsWith:'*') ifTrue:[
            quickMatch := quickMatch copyWithoutLast:1
        ].
        (quickMatch includes:$:) ifTrue:[
            quickMatch := quickMatch copyTo:(quickMatch indexOf:$:)-1.
        ].
        searchBlock := [:class :method :s |
                            |src|

                            (ignoreCase not and:[quickMatch includesMatchCharacters not]) ifTrue:[
                                "/ do quick search first
                                method isLazyMethod ifTrue:[
                                    src := method source.
                                    (src notNil 
                                    and:[src includesString:quickMatch]) ifTrue:[
                                        method makeRealMethod.
                                        (method literalsDetect:[:aLiteral|
                                            (aLiteral isMemberOf:Symbol) 
                                              and:[(lcString includesString:quickMatch)
                                              and:[(lcString match:aLiteral)]]
                                        ] ifNone:nil) notNil
                                    ] ifFalse:[
                                        false
                                    ]
                                ] ifFalse:[
                                    (method literalsDetect:[:aLiteral|
                                        (aLiteral isMemberOf:Symbol) 
                                          and:[(lcString includesString:quickMatch)
                                          and:[(lcString match:aLiteral)]]
                                    ] ifNone:nil) notNil
                                ]
                            ] ifFalse:[
                                "/ expensive search
                                method isLazyMethod ifTrue:[
                                    src := method source.
                                    (src notNil and:[src includesMatchString:aSelectorString]) ifTrue:[
                                        method makeRealMethod.
                                        (method literalsDetect:[:aLiteral|
                                            (aLiteral isMemberOf:Symbol) 
                                              and:[(ignoreCase and:[lcString match:aLiteral asLowercase])
                                                   or:[ignoreCase not and:[lcString match:aLiteral]]]
                                        ] ifNone:nil) notNil
                                    ] ifFalse:[
                                        false
                                    ]
                                ] ifFalse:[
                                    (method literalsDetect:[:aLiteral|
                                        (aLiteral isMemberOf:Symbol) 
                                          and:[(ignoreCase and:[lcString match:aLiteral asLowercase])
                                               or:[ignoreCase not and:[lcString match:aLiteral]]]
                                    ] ifNone:nil) notNil
                                ]
                            ]
                       ].
    ] ifFalse:[
        (aSelectorString = '*') ifTrue:[
            searchBlock := [:class :method :s | true].
        ] ifFalse:[
            "/ no matchString - can do it much faster

            sel := aSelectorString asSymbolIfInterned.
            sel isNil ifTrue:[
                ^ nil     "/ none
            ].

            "/ exclude javaClasses, if selector cannot be a valid java-selector
            (sel includes:$() ifFalse:[
                classesSearched := classesSearched select:[:eachClass | eachClass theNonMetaclass isJavaClass not].
            ].

            quickMatch := sel.
            (quickMatch includes:$:) ifTrue:[
                quickMatch := quickMatch copyTo:(quickMatch indexOf:$:)-1.
            ].
            searchBlock := [:class :method :s |
                                |src|

                                method isLazyMethod ifTrue:[
                                    src := method source.
                                    (src notNil and:[src includesString:quickMatch]) ifTrue:[
                                        method makeRealMethod.
                                        method sends:sel.
                                    ] ifFalse:[
                                        false
                                    ]
                                ] ifFalse:[
                                    method sends:sel
                                ]
                           ].
        ]
    ].
    ^ self allMethodsIn:classesSearched where:searchBlock

    "
     SystemBrowser allCallsOn:#at:put: in:(Smalltalk allClasses)
    "

    "Modified: 18.4.1997 / 10:32:50 / cg"
!

allMethodsIn:aCollectionOfClasses inst:wantInst class:wantClass where:aBlock
    "return a collection of methods which pass the given test.
     wantInst/wantClass control if instMethods and/or classMethods are to be
     considered.
     Only classes in aCollectionOfClasses are inspected in the search"

    |list activePriority|

    "
     since this may take a long time, lower my priority ...
    "
    activePriority := Processor activePriority.
    Processor activeProcess 
        withPriority:activePriority-1 to:activePriority
    do:[
        |checkedClasses checkBlock detectedMethods|

        checkedClasses := IdentitySet new.
        list := OrderedCollection new.
        detectedMethods := IdentitySet new.

        checkBlock := [:cls |
            (checkedClasses includes:cls) ifFalse:[
                cls isObsolete ifTrue:[
                    Transcript showCR:'Browser method search: skipping obsolete class: ' , cls displayString
                ] ifFalse:[
                    cls methodDictionary keysAndValuesDo:[:sel :method |
                        (aBlock value:cls value:method value:sel) ifTrue:[
                            "/ care for methods being in multiple classes (should not happen)
                            (detectedMethods includes:method) ifFalse:[
                                list add:method.
                                detectedMethods add:method
                            ]
                        ]
                    ].
                    checkedClasses add:cls.
                ]
            ]
        ].

        aCollectionOfClasses do:[:aClass |
            "
             output disabled - it slows down things too much (when searching for
             implementors or senders)
            "
            wantInst ifTrue:[
"/                Transcript show:'searching '; show:aClass name; showCR:' ...'; endEntry.
                checkBlock value:aClass
            ].
            wantClass ifTrue:[
"/                Transcript show:'searching '; show:aClass class name; showCR:' ...'; endEntry.
                checkBlock value:(aClass class)
            ].
            Processor yield
        ]
    ].
    ^ list

    "Created: / 24.1.1997 / 19:41:12 / cg"
    "Modified: / 14.12.1999 / 14:59:02 / cg"
!

allMethodsIn:aCollectionOfClasses where:aBlock
    "return a collection of methods which pass the given test.
     Only classes in aCollectionOfClasses are inspected in the search"

    ^ self
        allMethodsIn:aCollectionOfClasses 
        inst:true 
        class:true
        where:aBlock

    "Created: 24.1.1997 / 19:41:49 / cg"
!

aproposSearch:aString
    "browse all methods, which have aString in their selector."

    ^ self aproposSearch:aString in:(Smalltalk allClasses)

!

aproposSearch:aString in:aCollectionOfClasses
    "browse all methods, which have aString.
     This is relatively slow, since all source must be processed."

    |matchString list s searchBlock browser|

    matchString := '*' , aString , '*'.

    list := OrderedCollection new.

    (aString includesMatchCharacters) ifTrue:[
        s := '*' , aString asLowercase , '*'.
        "a matchString"
        searchBlock := [:text | (text asCollectionOfLinesfindFirst:[:line | s match:line]) ~~ 0].
    ] ifFalse:[
        searchBlock := [:source | (source findString:aString asLowercase) ~~ 0]
    ].

    browser := self browseMethodsIn:aCollectionOfClasses 
                     where:[:class :method :sel |
                                |comment|

                                (searchBlock value:sel asLowercase)
                           ]
                     title:(self classResources string:'selectors containing: %1' with:aString).

    browser notNil ifTrue:[
        browser autoSearch:aString 
    ].
    ^ browser

    "
     SystemBrowser aproposSearch:'append' in:(Collection withAllSubclasses)
     SystemBrowser aproposSearch:'add'    in:(Collection withAllSubclasses)
     SystemBrowser aproposSearch:'sort'   in:(Collection withAllSubclasses)
     SystemBrowser aproposSearch:'[Aa]bsent' in:(Collection withAllSubclasses)
    "

    "Created: 9.12.1995 / 18:02:36 / cg"
!

browseAllCallsOn:aSelectorString
    "launch a browser for all senders of aSelector"

    ^ self 
        browseAllCallsOn:aSelectorString 
        in:(Smalltalk allClasses)

    "
     SystemBrowser browseAllCallsOn:#+
    "

    "Created: 9.12.1995 / 18:00:41 / cg"
    "Modified: 10.7.1996 / 10:26:15 / cg"
!

browseAllCallsOn:aSelectorString in:aSetOfClasses
    "launch a browser for all senders of aSelector"

    ^ self
        browseAllCallsOn:aSelectorString 
        in:aSetOfClasses
        title:(self classResources string:'senders of: %1' with:aSelectorString)

    "
     SystemBrowser browseAllCallsOn:#+ in:(Number withAllSubclasses)
    "

    "Created: 10.7.1996 / 10:25:49 / cg"
    "Modified: 24.1.1997 / 19:49:34 / cg"
!

browseAllCallsOn:aSelectorString in:aSetOfClasses ignoreCase:ignoreCase
    "launch a browser for all senders of aSelector"

    ^ self
        browseAllCallsOn:aSelectorString 
        in:aSetOfClasses
        ignoreCase:ignoreCase
        title:(self classResources string:'senders of: %1' with:aSelectorString)

    "
     SystemBrowser browseAllCallsOn:#+ in:(Number withAllSubclasses)
    "

    "Created: 10.7.1996 / 10:25:49 / cg"
    "Modified: 24.1.1997 / 19:49:34 / cg"
!

browseAllCallsOn:aSelectorString in:aCollectionOfClasses ignoreCase:ignoreCase title:title
    "launch a browser for all senders of aSelector in aCollectionOfClasses"

    |browser|

    browser := self
                browseMethods:(self allCallsOn:aSelectorString in:aCollectionOfClasses ignoreCase:ignoreCase)
                title:title.

    browser notNil ifTrue:[
        |s|

        "
         kludge for now, if its a multipart selector,
         no easy search is (as yet) possible
        "
        s := aSelectorString.
        (s includes:$:) ifTrue:[
            s := s copyTo:(s indexOf:$:)
        ].
        browser autoSearch:s 
    ].
    ^ browser

    "
     SystemBrowser
        browseAllCallsOn:#+ 
        in:(Number withAllSubclasses) 
        title:'just a test'
    "

    "Modified: 24.1.1997 / 19:48:54 / cg"
!

browseAllCallsOn:aSelectorString in:aCollectionOfClasses title:title
    "launch a browser for all senders of aSelector in aCollectionOfClasses"

    ^ self
        browseAllCallsOn:aSelectorString 
        in:aCollectionOfClasses 
        ignoreCase:false 
        title:title

    "
     SystemBrowser
        browseAllCallsOn:#+ 
        in:(Number withAllSubclasses) 
        title:'just a test'
    "

    "Modified: 24.1.1997 / 19:48:54 / cg"
!

browseCallsOn:aSelectorString under:aClass
    "launch a browser for all senders of aSelector in aClass and subclasses"

    ^ self 
        browseAllCallsOn:aSelectorString
                      in:(aClass withAllSubclasses)
                   title:(self classResources 
                                string:'senders of: %1 (in and below %2)'
                                with:aSelectorString 
                                with:aClass name)

    "
     SystemBrowser browseCallsOn:#+ under:Number
    "

    "Created: 9.12.1995 / 17:59:57 / cg"
    "Modified: 24.1.1997 / 19:50:33 / cg"
!

browseClassRefsTo:aString in:aCollectionOfClasses modificationsOnly:modsOnly
    "launch a browser for all methods in aClass where the classVar named
     aString is referenced; if modsOnly is true, browse only methods where the
     classvar is modified"

    ^ self browseRefsTo:aString classVars:true in:aCollectionOfClasses modificationsOnly:modsOnly
!

browseClassRefsTo:varName in:aCollectionOfClasses modificationsOnly:modsOnly title:title
    "launch a browser for all methods in aCollectionOfClasses,
     where the classVar named aString is referenced; 
     if modsOnly is true, browse only methods where the classvar is modified"

    ^ self browseRefsTo:varName classVars:true in:aCollectionOfClasses modificationsOnly:modsOnly title:title
!

browseClassRefsTo:aString under:aClass modificationsOnly:modsOnly
    "launch a browser for all methods in aClass and subclasses
     where the classVar named aString is referenced; 
     if modsOnly is true, browse only methods where the classvar is modified"

    ^ self browseClassRefsTo:aString in:(aClass withAllSubclasses) modificationsOnly:modsOnly

!

browseForResource:aResourceSymbol containing:item in:aCollectionOfClasses title:title
    "launch a browser for all methods which have a particular (or any, ifNil)
     resource in aCollectionOfClasses.
     If aKey is nonNil, only methods which have aKey in the (any) resourceSpec
     are parsed.
     I.e. to find all methods, which access the styleSheets, use:
        browseForResource:#style containing:nil in:... title:...
     to find methods which access the 'arrowButtonDownForm' styleSheet entry, use:
        browseForResource:#style containing:'arrowButtonDownForm' in:... title:..."

    |browser searchBlock|

    "/ search for any resource can be done without looking
    "/ at the source ...
    (aResourceSymbol isNil and:[item isNil]) ifTrue:[
        searchBlock := [:class :method :s | method hasResource]
    ] ifFalse:[
        searchBlock := [:class :method :s |
                            |rsrc val found|

                            found := false.
                            method hasResource ifTrue:[
                                rsrc := method resources.
                                rsrc notNil ifTrue:[
                                    aResourceSymbol isNil ifTrue:[
                                        item isNil ifTrue:[
                                            found := true
                                        ] ifFalse:[
                                            rsrc isCollection ifTrue:[
                                                rsrc keysAndValuesDo:[:rsrc :val |
                                                    val isCollection ifTrue:[
                                                        val do:[:v |
                                                            found := item match:v printString 
                                                        ]
                                                    ] ifFalse:[
                                                        found := item match:val printString 
                                                    ]
                                                ]
                                            ] ifFalse:[
                                                found := item match:rsrc printString
                                            ]
                                        ]
                                    ] ifFalse:[
                                        (rsrc includesKey:aResourceSymbol) ifTrue:[
                                            item isNil ifTrue:[
                                                found := true
                                            ] ifFalse:[
                                                rsrc isCollection ifTrue:[
                                                    val := rsrc at:aResourceSymbol.
                                                    val isCollection ifTrue:[
                                                        val do:[:v |
                                                            found := item match:v printString 
                                                        ]
                                                    ] ifFalse:[
                                                        found := item match:val printString 
                                                    ]
                                                ] ifFalse:[
                                                    found := item match:rsrc printString
                                                ]
                                            ]
                                        ]
                                    ]
                                ].
                            ].
                            found
                       ].
    ].

    browser := self browseMethodsIn:aCollectionOfClasses
                              where:searchBlock
                              title:title.
    browser notNil ifTrue:[
        browser autoSearch:'resource:' 
    ].
    ^ browser

    "
     SystemBrowser
        browseForResource:nil
        in:Smalltalk allClasses
        title:'methods with a resource'
    "
    "
     SystemBrowser
        browseForResource:#style
        containing:nil
        in:Smalltalk allClasses
        title:'methods with a #style resource'
    "
    "
     SystemBrowser
        browseForResource:#style
        containing:'arrowButton*'
        in:Smalltalk allClasses
        title:'methods with a #style resource'
    "

    "Modified: / 22.4.1998 / 10:29:20 / cg"
!

browseForResource:aResourceSymbol in:aCollectionOfClasses title:title
    "launch a browser for all methods which have a particular (or any, ifNil)
     resource in aCollectionOfClasses"

    ^ self
        browseForResource:aResourceSymbol
        containing:nil
        in:aCollectionOfClasses 
        title:title

    "
     SystemBrowser
        browseForResource:#style
        in:Smalltalk allClasses
        title:'methods accessing styleSheet values'
    "
    "
     SystemBrowser
        browseForResource:#keyboard
        in:Smalltalk allClasses
        title:'methods handling keyboard events'
    "
    "
     SystemBrowser
        browseForResource:nil
        in:Smalltalk allClasses
        title:'methods with a resource'
    "

    "Modified: 9.1.1997 / 12:44:38 / cg"
!

browseForString:aString
    "launch a browser for all methods containing a string in their source.
     This may be slow, since source-code has to be scanned."

    ^ self browseForString:aString in:(Smalltalk allClasses) ignoreCase:false

    "Modified: / 18.6.1998 / 16:42:39 / cg"
!

browseForString:aString in:aCollectionOfClasses
    "launch a browser for all methods in aCollectionOfClasses  
     containing a string in their source.
     This may be slow, since source-code has to be scanned."

    ^ self
        browseForString:aString 
        in:aCollectionOfClasses 
        ignoreCase:false

    "
     SystemBrowser browseForString:'all'      in:(Array with:Object)
     SystemBrowser browseForString:'should'   in:(Array with:Object)
     SystemBrowser browseForString:'[eE]rror' in:(Array with:Object)
    "

    "Created: / 9.12.1995 / 18:03:12 / cg"
    "Modified: / 18.6.1998 / 16:43:27 / cg"
!

browseForString:aString in:aCollectionOfClasses ignoreCase:ignoreCase
    "launch a browser for all methods in aCollectionOfClasses  
     containing a string in their source.
     This may be slow, since source-code has to be scanned."

    |browser searchBlock title s|

    title := self classResources string:'methods containing: %1' with:aString displayString.

    (aString includesMatchCharacters
    or:[ignoreCase]) ifTrue:[
        s := '*' , aString , '*'.
        "a matchString"
        searchBlock := [:c :m :sel | 
                            |src|       
                            src := m source.
                            src isNil ifTrue:[
                                ('Browser [info]: no source for ' , m printString) infoPrintCR.
                                false
                            ] ifFalse:[
                                s match:src ignoreCase:ignoreCase
                            ]
                       ]
    ] ifFalse:[
        searchBlock := [:c :m :sel | 
                            |src|

                            src := m source.
                            src isNil ifTrue:[
                                ('Browser [info]: no source for ' , m printString) infoPrintCR.
                                false
                            ] ifFalse:[
                                (src findString:aString) ~~ 0
                            ]
                       ]
    ].
    browser := self browseMethodsIn:aCollectionOfClasses where:searchBlock title:title.

    browser notNil ifTrue:[
        browser autoSearch:aString ignoreCase:ignoreCase
    ].
    ^ browser

    "
     SystemBrowser browseForString:'all'      in:(Array with:Object)
     SystemBrowser browseForString:'should'   in:(Array with:Object)
     SystemBrowser browseForString:'[eE]rror' in:(Array with:Object)
    "

    "Created: / 18.6.1998 / 16:42:50 / cg"
    "Modified: / 18.6.1998 / 16:51:25 / cg"
!

browseForSymbol:aSymbol
    "launch a browser for all methods referencing aSymbol"

    ^ self 
        browseForSymbol:aSymbol 
        title:(self classResources string:'users of: %1' with:aSymbol) 
        warnIfNone:true

    "Created: 9.12.1995 / 18:04:34 / cg"
    "Modified: 10.7.1996 / 10:35:34 / cg"
!

browseForSymbol:aSymbol in:aSetOfClasses title:title warnIfNone:doWarn
    "launch a browser for all methods referencing aSymbol"

    |browser searchBlock sym|

    (aSymbol includesMatchCharacters) ifTrue:[
        "a matchString"
        searchBlock := [:c :m :s |
                            (m literalsDetect:[:aLiteral|
                                (aLiteral isMemberOf:Symbol) 
                                  and:[aSymbol match:aLiteral]
                            ] ifNone:nil) notNil
                       ].
    ] ifFalse:[
        "
         can do a faster search
        "
        sym := aSymbol asSymbolIfInterned.
        sym isNil ifTrue:[
            self showNoneFound:title.
            ^ nil
        ].

        searchBlock := [:c :m :s |
                            (m literalsDetect:[:aLiteral|
                                (sym == aLiteral) 
                            ] ifNone:nil) notNil
                       ].
    ].
    doWarn ifFalse:[
        WarningSignal ignoreIn:[
            browser := self browseMethodsIn:aSetOfClasses where:searchBlock title:title.
        ]
    ] ifTrue:[
        browser := self browseMethodsIn:aSetOfClasses where:searchBlock title:title.
    ].
    browser notNil ifTrue:[
        browser autoSearch:aSymbol
    ].
    ^ browser

    "Modified: 24.6.1996 / 14:39:07 / stefan"
    "Modified: 30.6.1996 / 16:45:25 / cg"
    "Created: 10.7.1996 / 10:36:36 / cg"
!

browseForSymbol:aSymbol in:aSetOfClasses title:title warnIfNone:doWarn searchFor:searchString
    "launch a browser for all methods referencing aSymbol"

    |browser searchBlock sym|

    (aSymbol includesMatchCharacters) ifTrue:[
        "a matchString"
        searchBlock := [:c :m :s |
                            (m literalsDetect:[:aLiteral|
                                (aLiteral isMemberOf:Symbol) 
                                  and:[aSymbol match:aLiteral]
                            ] ifNone:nil) notNil
                       ].
    ] ifFalse:[
        "
         can do a faster search
        "
        sym := aSymbol asSymbolIfInterned.
        sym isNil ifTrue:[
            self showNoneFound:title.
            ^ nil
        ].

        searchBlock := [:c :m :s |
                            (m literalsDetect:[:aLiteral|
                                (sym == aLiteral) 
                            ] ifNone:nil) notNil
                       ].
    ].
    doWarn ifFalse:[
        WarningSignal ignoreIn:[
            browser := self browseMethodsIn:aSetOfClasses where:searchBlock title:title.
        ]
    ] ifTrue:[
        browser := self browseMethodsIn:aSetOfClasses where:searchBlock title:title.
    ].

    (browser notNil 
    and:[searchString notNil]) ifTrue:[
        browser autoSearch:searchString
    ].
    ^ browser

    "Modified: 24.6.1996 / 14:39:07 / stefan"
    "Modified: 30.6.1996 / 16:45:25 / cg"
    "Created: 31.10.1996 / 14:57:30 / cg"
!

browseForSymbol:aSymbol title:title ifNone:actionIfNoneFound searchFor:searchString
    "launch a browser for all methods referencing aSymbol"

    |browser searchBlock sym|

    (aSymbol includesMatchCharacters) ifTrue:[
        "a matchString"
        searchBlock := [:c :m :s |
                            m referencesGlobalMatching:aSymbol
"/                            (m literalsDetect:[:aLiteral|
"/                                (aLiteral isMemberOf:Symbol) 
"/                                  and:[aSymbol match:aLiteral]
"/                            ] ifNone:nil) notNil
                       ].
    ] ifFalse:[
        "
         can do a faster search
        "
        sym := aSymbol asSymbolIfInterned.
        sym isNil ifTrue:[
            actionIfNoneFound value.
            ^ nil
        ].

        searchBlock := [:c :m :s |
                            m referencesGlobal:sym
"/                            (m literalsDetect:[:aLiteral|
"/                                (sym == aLiteral) 
"/                            ] ifNone:nil) notNil
                       ].
    ].

    WarningSignal ignoreIn:[
        InformationSignal ignoreIn:[
            browser := self browseMethodsWhere:searchBlock title:title.
        ]
    ].
    browser isNil ifTrue:[
        actionIfNoneFound value
    ].

    (browser notNil 
    and:[searchString notNil]) ifTrue:[
        browser autoSearch:searchString
    ].
    ^ browser

    "Modified: / 24.6.1996 / 14:39:07 / stefan"
    "Created: / 31.10.1996 / 14:45:08 / cg"
    "Modified: / 9.11.1999 / 17:04:30 / cg"
!

browseForSymbol:aSymbol title:title warnIfNone:doWarn
    "launch a browser for all methods referencing aSymbol"

    ^ self
        browseForSymbol:aSymbol 
        title:title 
        warnIfNone:doWarn 
        searchFor:aSymbol

    "Modified: 31.10.1996 / 14:45:38 / cg"
!

browseForSymbol:aSymbol title:title warnIfNone:doWarn searchFor:searchString
    "launch a browser for all methods referencing aSymbol"

    |b|

    doWarn ifTrue: [
	b := [self showNoneFound:title]
    ].
    ^ self
        browseForSymbol:aSymbol 
        title:title 
        ifNone:b
        searchFor:searchString
!

browseImplementorsOf:aSelectorString
    "launch a browser for all implementors of aSelector"

    ^ self 
        browseImplementorsOf:aSelectorString 
        in:(Smalltalk allClasses)

    "
     SystemBrowser browseImplementorsOf:#+
     NewSystemBrowser browseImplementorsOf:#+
    "

    "Created: / 9.12.1995 / 18:01:18 / cg"
    "Modified: / 5.11.2001 / 17:31:11 / cg"
!

browseImplementorsOf:aSelectorString in:aSetOfClasses
    "launch a browser for all implementors of aSelector"

    ^ self 
        browseImplementorsOf:aSelectorString
        in:aSetOfClasses
        title:(self classResources string:'implementors of: %1' with:aSelectorString)

    "
     SystemBrowser browseImplementorsOf:#+ in:(Number withAllSubclasses)
     NewSystemBrowser browseImplementorsOf:#+ in:(Number withAllSubclasses)
    "

    "Created: / 10.7.1996 / 10:20:59 / cg"
    "Modified: / 5.11.2001 / 17:30:57 / cg"
!

browseImplementorsOf:aSelectorString in:aSetOfClasses ignoreCase:ignoreCase
    "launch a browser for all implementors of aSelector"

    ^ self 
        browseImplementorsOf:aSelectorString
        in:aSetOfClasses
        ignoreCase:ignoreCase
        title:(self classResources string:'implementors of: %1' with:aSelectorString)

    "
     SystemBrowser browseImplementorsOf:#+ in:(Number withAllSubclasses)
     NewSystemBrowser browseImplementorsOf:#+ in:(Number withAllSubclasses)
    "

    "Created: / 10.7.1996 / 10:20:59 / cg"
    "Modified: / 5.11.2001 / 17:30:43 / cg"
!

browseImplementorsOf:aSelectorString in:aCollectionOfClasses ignoreCase:ignoreCase title:title
    "launch a browser for all implementors of aSelector in
     the classes contained in aCollectionOfClasses and its metaclasses"

    |list|

    list := self 
                findImplementorsMatching:aSelectorString 
                in:aCollectionOfClasses 
                ignoreCase:ignoreCase.

    list size == 0 ifTrue:[
        self showNoneFound:title.
        ^ nil
    ].

    ^ self browseMethods:list asOrderedCollection title:title

    "
     SystemBrowser browseImplementorsOf:#+
                                     in:(Array with:Number
                                               with:Float
                                               with:SmallInteger)
                                  title:'some implementors of +'

     NewSystemBrowser browseImplementorsOf:#+
                                     in:(Array with:Number
                                               with:Float
                                               with:SmallInteger)
                                  title:'some implementors of +'
    "

    "Modified: / 4.9.1995 / 17:33:39 / claus"
    "Modified: / 19.6.1996 / 14:19:02 / stefan"
    "Modified: / 5.11.2001 / 17:30:38 / cg"
!

browseImplementorsOf:aSelectorString in:aCollectionOfClasses title:title
    "launch a browser for all implementors of aSelector in
     the classes contained in aCollectionOfClasses and its metaclasses"

    ^ self
        browseImplementorsOf:aSelectorString 
        in:aCollectionOfClasses 
        ignoreCase:false
        title:title

!

browseImplementorsOf:aSelectorString under:aClass
    "launch a browser for all implementors of aSelector in aClass
     and its subclasses"

    ^ self 
        browseImplementorsOf:aSelectorString
        in:(aClass withAllSubclasses)
        title:(self classResources 
                string:'implementors of: %1 (in and below %2)' 
                with:aSelectorString
                with:aClass name)

    "
     SystemBrowser browseImplementorsOf:#+ under:Integer
     NewSystemBrowser browseImplementorsOf:#+ under:Integer
    "

    "Created: / 9.12.1995 / 18:06:09 / cg"
    "Modified: / 5.11.2001 / 17:30:15 / cg"
!

browseImplementorsOfAny:setOfSelectors 
    "launch a browser for all implementors of aSelector"

    ^ self 
        browseImplementorsOfAny:setOfSelectors
        in:(Smalltalk allClasses)

    "
     SystemBrowser browseImplementorsOfAny:#( #+ #- )
     NewSystemBrowser browseImplementorsOfAny:#( #+ #- )
    "

    "Created: / 9.12.1995 / 18:01:18 / cg"
    "Modified: / 5.11.2001 / 17:31:11 / cg"
!

browseImplementorsOfAny:setOfSelectors in:aSetOfClasses
    "launch a browser for all implementors of aSelector"

    ^ self 
        browseImplementorsOfAny:setOfSelectors
        in:aSetOfClasses
        title:(self classResources string:'implementors of some')

    "
     SystemBrowser browseImplementorsOf:#+ in:(Number withAllSubclasses)
     NewSystemBrowser browseImplementorsOf:#+ in:(Number withAllSubclasses)
    "

    "Created: / 10.7.1996 / 10:20:59 / cg"
    "Modified: / 5.11.2001 / 17:30:57 / cg"
!

browseImplementorsOfAny:setOfSelectors in:aCollectionOfClasses ignoreCase:ignoreCase title:title
    "launch a browser for all implementors of aSelector in
     the classes contained in aCollectionOfClasses and its metaclasses"

    |list|

    list := self 
                findImplementorsOfAny:setOfSelectors 
                in:aCollectionOfClasses 
                ignoreCase:ignoreCase.

    list size == 0 ifTrue:[
        self showNoneFound:title.
        ^ nil
    ].

    ^ self browseMethods:list asOrderedCollection title:title

    "
     SystemBrowser browseImplementorsOf:#+
                                     in:(Array with:Number
                                               with:Float
                                               with:SmallInteger)
                                  title:'some implementors of +'

     NewSystemBrowser browseImplementorsOf:#+
                                     in:(Array with:Number
                                               with:Float
                                               with:SmallInteger)
                                  title:'some implementors of +'
    "

    "Modified: / 4.9.1995 / 17:33:39 / claus"
    "Modified: / 19.6.1996 / 14:19:02 / stefan"
    "Modified: / 5.11.2001 / 17:30:38 / cg"
!

browseImplementorsOfAny:setOfSelectors in:aCollectionOfClasses title:title
    "launch a browser for all implementors of aSelector in
     the classes contained in aCollectionOfClasses and its metaclasses"

    ^ self
        browseImplementorsOfAny:setOfSelectors 
        in:aCollectionOfClasses 
        ignoreCase:false
        title:title
!

browseInstRefsTo:aString in:aCollectionOfClasses modificationsOnly:modsOnly
    "launch a browser for all methods in aClass where the instVar named
     aString is referenced; if modsOnly is true, browse only methods where the
     instvar is modified"

    ^ self browseRefsTo:aString classVars:false in:aCollectionOfClasses modificationsOnly:modsOnly
!

browseInstRefsTo:varName in:aCollectionOfClasses modificationsOnly:modsOnly title:title
    "launch a browser for all methods in aClass where the instVar named
     varName is referenced; if modsOnly is true, browse only methods where the
     instvar is modified"

    ^ self browseRefsTo:varName classVars:false in:aCollectionOfClasses modificationsOnly:modsOnly title:title
!

browseInstRefsTo:aString under:aClass modificationsOnly:modsOnly
    "launch a browser for all methods in aClass and subclasses
     where the instVar named aString is referenced; 
     if modsOnly is true, browse only methods where the instvar is modified"

    ^ self browseInstRefsTo:aString in:(aClass withAllSubclasses) modificationsOnly:modsOnly
!

browseReferendsOf:aGlobalName
    "launch a browser for all methods referencing a global
     named aGlobalName. The argument may be a symbol, a string or
     a matchPattern.
    "

    ^ self browseReferendsOf:aGlobalName warnIfNone:true 

   "
    Browser browseReferendsOf:#Transcript
    Browser browseReferendsOf:'Tr*'
   "

    "Modified: / 30.10.1997 / 23:45:52 / cg"
!

browseReferendsOf:aGlobalName ifNone:actionIfNone
    "launch a browser for all methods referencing a global
     named aGlobalName.
    "

    ^ self
        browseReferendsOf:aGlobalName 
        title:(self classResources string:'users of: %1' with:aGlobalName)
        ifNone:actionIfNone

    "Modified: / 31.10.1997 / 15:42:05 / cg"


!

browseReferendsOf:aGlobalName in:aSetOfClasses
    "launch a browser for all methods referencing a global
     named aGlobalName.
    "

    ^ self browseReferendsOf:aGlobalName in:aSetOfClasses warnIfNone:true 

   "
    Browser browseReferendsOf:#Transcript
   "

    "Created: 10.7.1996 / 10:37:30 / cg"
!

browseReferendsOf:aGlobalName in:aSetOfClasses warnIfNone:doWarn
    "launch a browser for all methods referencing a global
     named aGlobalName.
    "

    |globalsPlainName idx|

    globalsPlainName := aGlobalName.
    (idx := globalsPlainName lastIndexOf:$:) ~~ 0 ifTrue:[
        globalsPlainName := globalsPlainName copyFrom:idx+1
    ].

    ^ self browseForSymbol:aGlobalName
                        in:aSetOfClasses
                     title:(self classResources string:'users of: %1' with:aGlobalName) 
                warnIfNone:doWarn
                 searchFor:globalsPlainName

    "Created: 10.7.1996 / 10:37:02 / cg"
    "Modified: 31.10.1996 / 14:56:38 / cg"
!

browseReferendsOf:aGlobalName title:title ifNone:actionIfNone
    "launch a browser for all methods referencing a global
     named aGlobalName.
    "

    |globalsPlainName idx searchBlock
     sym browser|

    globalsPlainName := aGlobalName.
    (idx := globalsPlainName lastIndexOf:$:) ~~ 0 ifTrue:[
        globalsPlainName := globalsPlainName copyFrom:idx+1.
        (globalsPlainName size == 0
        or:[globalsPlainName = '*']) ifTrue:[
            globalsPlainName := aGlobalName
        ]
    ].

    (sym := aGlobalName asSymbolIfInterned) notNil ifTrue:[
        searchBlock := [:cls :mthd :sel | |mSource|
                        "/ kludge: Lazy methods do not include symbols in the literal array - sigh
                        mthd isLazyMethod ifTrue:[
                            mSource := mthd source.
                            (mSource notNil
                            and:[(mSource includesString:sym)
                            and:[mthd usedGlobals includes:sym]])
                        ] ifFalse:[ 
                            ((mthd refersToLiteral:sym)
                             and:[mthd usedGlobals includes:sym])
                        ]
                      ]
    ] ifFalse:[
        aGlobalName includesMatchCharacters ifFalse:[
            actionIfNone value.
            ^ nil
        ].
        searchBlock := [:cls :mthd :sel | |mSource|
                        "/ kludge: Lazy methods do not include symbols in the literal array - sigh
                        mthd isLazyMethod ifTrue:[
                            mSource := mthd source.
                            (mSource notNil
                            and:[mthd usedGlobals contains:[:lit | aGlobalName match:lit]])
                        ] ifFalse:[
                            ((mthd literals contains:[:lit | aGlobalName match:lit])
                             and:[mthd usedGlobals contains:[:lit | aGlobalName match:lit] ])
                        ]
                      ]
    ].
    "/ WarningSignal ignoreIn:[
        "/ InformationSignal ignoreIn:[
            browser := self browseMethodsWhere:searchBlock title:title ifNone:[actionIfNone value. ^ nil].
        "/ ].
    "/ ].
    browser isNil ifTrue:[
        actionIfNone value
    ] ifFalse:[
        browser autoSearch:globalsPlainName
    ].
    ^ browser
!

browseReferendsOf:aGlobalName title:title warnIfNone:doWarn
    "launch a browser for all methods referencing a global
     named aGlobalName.
    "

    |b|

    doWarn ifTrue: [
	b := [self showNoneFound:title]
    ].

    ^ self
        browseReferendsOf:aGlobalName 
        title:title 
        ifNone:b

!

browseReferendsOf:aGlobalName warnIfNone:doWarn
    "launch a browser for all methods referencing a global
     named aGlobalName.
    "

    ^ self
        browseReferendsOf:aGlobalName 
        title:(self classResources string:'users of: %1' with:aGlobalName)
        warnIfNone:doWarn

    "Modified: / 31.10.1997 / 15:42:05 / cg"
!

browseRefsTo:aString classVars:classVars in:aCollectionOfClasses modificationsOnly:modsOnly
    "launch a browser for all methods in aClass where the instVar/classVar named
     aString is referenced; if modsOnly is true, browse only methods where the
     instvar is modified"

    |title|

    modsOnly ifTrue:[
        title := 'modifications of: %1'
    ] ifFalse:[
        title := 'references to: %1 '
    ].
    ^ self 
        browseRefsTo:aString 
        classVars:classVars 
        in:aCollectionOfClasses 
        modificationsOnly:modsOnly 
        title:(self classResources string:title with:aString)

    "Created: 9.12.1995 / 18:07:05 / cg"
    "Modified: 9.12.1995 / 18:11:49 / cg"
!

browseRefsTo:varName classVars:classVars in:aCollectionOfClasses modificationsOnly:modsOnly title:title
    "launch a browser for all methods in aClass where the instVar/classVar named
     varName is referenced; if modsOnly is true, browse only methods where the
     instvar is modified"

    |filter browser pattern|

    filter := self filterToSearchRefsTo:varName classVars:classVars modificationsOnly:modsOnly.
    browser := self browseMethodsIn:aCollectionOfClasses inst:true class:classVars where:filter title:title.

    browser notNil ifTrue:[
        modsOnly ifTrue:[
            pattern := varName , ' :='
        ] ifFalse:[
            pattern := varName
        ].
        browser autoSearch:pattern 
    ].
    ^ browser
!

browseSendersOf:aSelectorString
    "launch a browser for all senders of aSelector"

    ^ self browseAllCallsOn:aSelectorString

    "
     SystemBrowser browseSendersOf:#+
    "

    "Modified: / 10.7.1996 / 10:26:15 / cg"
    "Created: / 13.11.2001 / 13:52:12 / cg"
!

browseSuperCallsIn:aCollectionOfClasses title:title
    "launch a browser for all super sends in aCollectionOfClasses"

    |browser searchBlock|

    searchBlock := [:class :method :s | 
        |src parser|

        src := method source.
        (src notNil and:[src findString:'super']) ~~ 0 ifTrue:[
            parser := Parser 
                        parseMethod:src 
                        in:class 
                        ignoreErrors:true 
                        ignoreWarnings:true.

            parser notNil and:[parser usesSuper]
        ] ifFalse:[
            false
        ]
    ].

    browser := self browseMethodsIn:aCollectionOfClasses
                              where:searchBlock
                              title:title.

    browser notNil ifTrue:[
        browser autoSearch:'super' 
    ].
    ^ browser

    "
     SystemBrowser
         browseSuperCallsIn:(Array with:SortedCollection)
                      title:'superSends in SortedCollection'
    "

    "Created: 23.11.1995 / 14:08:55 / cg"
    "Modified: 24.4.1996 / 13:25:31 / cg"
!

browseSuperCallsUnder:aClass
    "launch a browser for all supersends in aClass and subclasses"

    ^ self browseSuperCallsIn:(aClass withAllSubclasses)
                        title:(self classResources string:'supersends (in and below %1)' with:aClass name)

    "
     SystemBrowser browseSuperCallsUnder:Number
    "

    "Created: 23.11.1995 / 12:06:06 / cg"
    "Modified: 9.12.1995 / 18:11:59 / cg"
!

browseUsesOf:aClass
    |dict owners offsets
     sz  "{ Class: SmallInteger }"
     n   "{ Class: SmallInteger }"
     removeSet newDict|

    owners := ObjectMemory whoReferencesInstancesOf:aClass.

    "
     collect set of offsets in dict; key is class
    "
    dict := IdentityDictionary new.
    owners do:[:someObject |
	|cls create|

	someObject isContext ifFalse:[
	    "
	     someObject refers to an instance of aClass;
	     find out, which instVar(s)
	    "
	    cls := someObject class.
	    cls ~~ Array ifTrue:[
		n := cls instSize.
		create := [|s| s := Set new. dict at:cls put:s. s].

		1 to:n do:[:i |
		    |ref|

		    ref := someObject instVarAt:i.
		    (ref isMemberOf:aClass) ifTrue:[
			offsets := dict at:cls ifAbsent:create.
			offsets add:i.
		    ]
		].
		cls isVariable ifTrue:[
		    cls isPointers ifTrue:[
			| idx "{ Class: SmallInteger }" |

			sz := someObject basicSize.
			idx := 1.
			[idx <= sz] whileTrue:[
			    |ref|

			    ref := someObject basicAt:idx.
			    (ref isMemberOf:aClass) ifTrue:[
				offsets := dict at:cls ifAbsent:create.
				offsets add:0.
				idx := sz
			    ].
			    idx := idx + 1
			]
		    ]        
		]
	    ]
	]
    ].

    "
     merge with superclass refs
    "
    dict keysAndValuesDo:[:cls :set |
	cls allSuperclasses do:[:aSuperclass |
	    |superSet|

	    superSet := dict at:aSuperclass ifAbsent:[].
	    superSet notNil ifTrue:[
		|removeSet|

		superSet := dict at:aSuperclass.
		removeSet := Set new.
		set do:[:offset |
		    (superSet includes:offset) ifTrue:[
			removeSet add:offset
		    ]
		].
		set removeAll:removeSet
	    ]
	]
    ].

    "
     remove empty ones
    "
    removeSet := Set new.
    dict keysAndValuesDo:[:cls :set |
	set isEmpty ifTrue:[
	    removeSet add:cls
	]
    ].
    removeSet do:[:cls |
	dict removeKey:cls
    ].

    "
     replace the indices by real names
    "
    newDict := IdentityDictionary new.
    dict keysAndValuesDo:[:cls :set |
	|newSet names|

	names := cls allInstVarNames.
	newSet := set collect:[:index | 
		index == 0 ifTrue:['*indexed*'] ifFalse:[names at:index].
	].
	newDict at:cls put:newSet
    ].

    newDict inspect


!

filterToSearchRefsTo:varName classVars:classVars access:accessType
    "return a searchblock for variable references"

    |searchBlock|

    searchBlock := [:c :m :s |
        |src result parser vars needMatch|

        needMatch := varName includesMatchCharacters.

        src := m source.
        src isNil ifTrue:[
            result := false
        ] ifFalse:[
            needMatch ifFalse:[
                "
                 before doing a slow parse, quickly scan the
                 methods source for the variables name ...
                "
                result := (src findString:varName) ~~ 0.
            ] ifTrue:[
                result := true.
            ].
            result ifTrue:[
                result := false.
                parser := Parser
                                parseMethod:src 
                                in:c 
                                ignoreErrors:true 
                                ignoreWarnings:true.

                (parser notNil and:[parser ~~ #Error]) ifTrue:[
                    classVars ifFalse:[
                        accessType == #read ifTrue:[
                            vars := parser readInstVars
                        ] ifFalse:[
                            accessType == #write ifTrue:[
                                vars := parser modifiedInstVars
                            ] ifFalse:[
                                vars := parser usedInstVars
                            ]
                        ].
                    ] ifTrue:[    
                        accessType == #read ifTrue:[
                            vars := parser readClassVars
                        ] ifFalse:[
                            accessType == #write ifTrue:[
                                vars := parser modifiedClassVars
                            ] ifFalse:[
                                vars := parser usedClassVars
                            ]
                        ].
                    ].
                    vars size > 0 ifTrue:[
                        needMatch ifTrue:[
                            vars do:[:cv |
                                (varName match:cv) ifTrue:[result := true]
                            ]
                        ] ifFalse:[
                            result := vars includes:varName
                        ]
                    ]
                ].
            ].
        ].
        Processor yield.
        result
    ].
    ^ searchBlock

    "Modified: 19.6.1997 / 18:27:57 / cg"
!

filterToSearchRefsTo:varName classVars:classVars modificationsOnly:modsOnly
    "return a searchblock for variable references"

    |searchBlock|

    searchBlock := [:c :m :s |
        |src result parser vars needMatch|

        needMatch := varName includesMatchCharacters.

        src := m source.
        src isNil ifTrue:[
            result := false
        ] ifFalse:[
            needMatch ifFalse:[
                "
                 before doing a slow parse, quickly scan the
                 methods source for the variables name ...
                "
                result := (src findString:varName) ~~ 0.
            ] ifTrue:[
                result := true.
            ].
            result ifTrue:[
                result := false.
                parser := Parser
                                parseMethod:src 
                                in:c 
                                ignoreErrors:true 
                                ignoreWarnings:true.

                (parser notNil and:[parser ~~ #Error]) ifTrue:[
                    classVars ifFalse:[
                        modsOnly ifTrue:[
                            vars := parser modifiedInstVars
                        ] ifFalse:[
                            vars := parser usedInstVars
                        ].
                    ] ifTrue:[    
                        modsOnly ifTrue:[
                            vars := parser modifiedClassVars
                        ] ifFalse:[
                            vars := parser usedClassVars
                        ].
                    ].
                    vars size > 0 ifTrue:[
                        needMatch ifTrue:[
                            vars do:[:cv |
                                (varName match:cv) ifTrue:[result := true]
                            ]
                        ] ifFalse:[
                            result := vars includes:varName
                        ]
                    ]
                ].
            ].
        ].
        Processor yield.
        result
    ].
    ^ searchBlock

    "Modified: 19.6.1997 / 18:27:57 / cg"
!

findAnyResourceIn:aCollectionOfClasses 
    "return a collection of all methods in aCollectionOfClasses containing any resource."

    ^ self findMethodsIn:aCollectionOfClasses where:[:c :m :sel | m hasResource ].

    "
     SystemBrowser findAnyResourceIn:(ApplicationModel withAllSubclasses)
    "
!

findClassRefsTo:aString in:aCollectionOfClasses access:accessType
    "return all methods in aCollectionOfClasses where the classVar named
     aString is referenced; 
     if modsOnly is true, browse only methods where the classvar is modified"

    ^ self findRefsTo:aString classVars:true in:aCollectionOfClasses access:accessType
!

findClassRefsTo:aString in:aCollectionOfClasses modificationsOnly:modsOnly
    "return all methods in aCollectionOfClasses where the classVar named
     aString is referenced; 
     if modsOnly is true, browse only methods where the classvar is modified"

    ^ self findRefsTo:aString classVars:true in:aCollectionOfClasses modificationsOnly:modsOnly
!

findClassRefsTo:aString inClass:aClass access:accessType
    "return all methods in aClass where the classVar named
     aString is referenced; 
     if modsOnly is true, browse only methods where the classvar is modified"

    ^ self findRefsTo:aString classVars:true in:(Array with:aClass) access:accessType
!

findClassRefsTo:aString inClass:aClass modificationsOnly:modsOnly
    "return all methods in aClass where the classVar named
     aString is referenced; 
     if modsOnly is true, browse only methods where the classvar is modified"

    ^ self findRefsTo:aString classVars:true in:(Array with:aClass) modificationsOnly:modsOnly
!

findClassRefsTo:aString under:aClass access:accessType
    "return all methods in aClass and subclasses
     where the classVar named aString is referenced; 
     if modsOnly is true, browse only methods where the classvar is modified"

    ^ self findClassRefsTo:aString in:(aClass withAllSubclasses) access:accessType
!

findClassRefsTo:aString under:aClass modificationsOnly:modsOnly
    "return all methods in aClass and subclasses
     where the classVar named aString is referenced; 
     if modsOnly is true, browse only methods where the classvar is modified"

    ^ self findClassRefsTo:aString in:(aClass withAllSubclasses) modificationsOnly:modsOnly

!

findHelpSpecMethodsWithString:aString in:aCollectionOfClasses ignoreCase:ignoreCase
    "return a collection of all help-spec methods in aCollectionOfClasses  
     containing a string in their source.
     This may be slow, since source-code has to be scanned."

    ^ self findSpecMethodsFor:#help withString:aString in:aCollectionOfClasses ignoreCase:ignoreCase
!

findImplementorsMatching:aSelectorMatchString in:aCollectionOfClasses ignoreCase:ignoreCase
    "search for all implementors of aSelector in
     the classes contained in aCollectionOfClasses and its metaclasses.
     Return a collection of methods"

    |list srchST srchJava lcSelector|

    aSelectorMatchString size == 0 ifTrue:[ ^ #() ].

    list := IdentitySet new.

    ignoreCase == true ifTrue:[
        lcSelector := aSelectorMatchString asLowercase.

        srchST := [:aSelector :aMethod |
                        (lcSelector match:aMethod name asLowercase) ifTrue:[
                            list add:aMethod
                        ]
                  ].
        srchJava := [:aSelector :aMethod |
                        (aSelector match:aMethod name asLowercase) ifTrue:[
                            list add:aMethod
                        ]
                  ].
    ] ifFalse:[
        srchST := [:aSelector :aMethod |
                        (aSelectorMatchString match:aSelector) ifTrue:[
                            list add:aMethod
                        ]
                  ].
        srchJava := [:aSelector :aMethod |
                        (aSelectorMatchString match:aMethod name) ifTrue:[
                            list add:aMethod
                        ]
                  ].
    ].

    aCollectionOfClasses do:[:aClass |
        |srchBlock|

        aClass isObsolete ifFalse:[
            aClass isJavaClass ifTrue:[
                srchBlock := srchJava
            ] ifFalse:[
                srchBlock := srchST
            ].
            aClass methodDictionary keysAndValuesDo:srchBlock.
            aClass isMeta ifFalse:[
                aClass class methodDictionary keysAndValuesDo:srchBlock
            ]
        ]
    ].

    ^ list

    "
     SystemBrowser findImplementorsOf:#+
                                     in:(Array with:Number
                                               with:Float
                                               with:SmallInteger)
    "
!

findImplementorsMatchingAny:aCollectionOfSelectors in:aCollectionOfClasses ignoreCase:ignoreCase
    "search for all implementors of any in aCollectionOfSelectors in
     the classes contained in aCollectionOfClasses and its metaclasses.
     Return a collection of methods.
     CAVEAT: searches multiple times (could be tuned alot if heavily used)"

    |implementors|

    implementors := IdentitySet new.
    aCollectionOfSelectors do:[:eachSelector |
        implementors addAll:(self findImplementorsMatching:eachSelector in:aCollectionOfClasses ignoreCase:ignoreCase).
    ].
    ^ implementors
!

findImplementorsOf:aSelectorString in:aCollectionOfClasses ignoreCase:ignoreCase
    "search for all implementors of aSelector in
     the classes contained in aCollectionOfClasses and its metaclasses.
     Return a collection of methods"

    |list sel srchST srchJava lcSelector|

    aSelectorString size == 0 ifTrue:[ ^ #() ].

    list := IdentitySet new.

"/    ((aSelectorString ~= '*') and:[aSelectorString includesMatchCharacters]) ifTrue:[
"/        "a matchString"
"/
"/        ignoreCase == true ifTrue:[
"/            lcSelector := aSelectorString asLowercase.
"/
"/            srchST := [:aSelector :aMethod |
"/                            (lcSelector match:aSelector asLowercase) ifTrue:[
"/                                list add:aMethod
"/                            ]
"/                      ].
"/            srchJava := [:aSelector :aMethod |
"/                            (aSelector match:aMethod name asLowercase) ifTrue:[
"/                                list add:aMethod
"/                            ]
"/                      ].
"/        ] ifFalse:[
"/            srchST := [:aSelector :aMethod |
"/                            (aSelectorString match:aSelector) ifTrue:[
"/                                list add:aMethod
"/                            ]
"/                      ].
"/            srchJava := [:aSelector :aMethod |
"/                            (aSelectorString match:aMethod name) ifTrue:[
"/                                list add:aMethod
"/                            ]
"/                      ].
"/        ].
"/    ] ifFalse:[

        sel := aSelectorString asSymbolIfInterned.
        sel isNil ifTrue:[
            ^ #()
        ].

        ignoreCase == true ifTrue:[
            lcSelector := sel asLowercase.
            srchJava := [:aSelector :aMethod |
                            "/ allow search for signature AND
                            "/ search for plain name
                            ((aMethod name asLowercase = lcSelector)
                            or:[aSelector asLowercase = lcSelector]) ifTrue:[
                                list add:aMethod
                            ]
                        ].
            srchST := [:aSelector :aMethod |
                            (aSelector asLowercase = lcSelector) ifTrue:[
                                list add:aMethod
                            ]
                        ].
        ] ifFalse:[
            srchJava := [:aSelector :aMethod |
                            "/ allow search for signature AND
                            "/ search for plain name
                            ((aMethod name = sel)
                            or:[aSelector == sel]) ifTrue:[
                                list add:aMethod
                            ]
                        ].
            srchST := [:aSelector :aMethod |
                            (aSelector == sel) ifTrue:[
                                list add:aMethod
                            ]
                        ].
        ].
"/    ].

    aCollectionOfClasses do:[:aClass |
        |srchBlock|

        aClass isObsolete ifFalse:[
            aClass isJavaClass ifTrue:[
                srchBlock := srchJava
            ] ifFalse:[
                srchBlock := srchST
            ].
            aClass methodDictionary keysAndValuesDo:srchBlock.
            aClass isMeta ifFalse:[
                aClass class methodDictionary keysAndValuesDo:srchBlock
            ]
        ]
    ].

    ^ list

    "
     SystemBrowser findImplementorsOf:#+
                                     in:(Array with:Number
                                               with:Float
                                               with:SmallInteger)
    "
!

findImplementorsOfAny:aCollectionOfSelectors in:aCollectionOfClasses ignoreCase:ignoreCase
    "search for all implementors of any in aCollectionOfSelectors in
     the classes contained in aCollectionOfClasses and its metaclasses.
     Return a collection of methods.
     CAVEAT: searches multiple times (could be tuned alot if heavily used)"

    |implementors|

    implementors := IdentitySet new.
    aCollectionOfSelectors do:[:eachSelector |
        implementors addAll:(self findImplementorsOf:eachSelector in:aCollectionOfClasses ignoreCase:ignoreCase).
    ].
    ^ implementors
!

findInstRefsTo:aString in:aCollectionOfClasses access:accessType
    "return all methods in aCollectionOfClasses where the instVar named
     aString is referenced; 
     if modsOnly is true, browse only methods where the classvar is modified"

    ^ self findRefsTo:aString classVars:false in:aCollectionOfClasses access:accessType
!

findInstRefsTo:aString in:aCollectionOfClasses modificationsOnly:modsOnly
    "return all methods in aCollectionOfClasses where the instVar named
     aString is referenced; if modsOnly is true, browse only methods where the
     instvar is modified"

    ^ self findRefsTo:aString classVars:false in:aCollectionOfClasses modificationsOnly:modsOnly
!

findInstRefsTo:aString inClass:aClass access:accessType
    "return all methods in aClass where the instVar named
     aString is referenced; if modsOnly is true, browse only methods where the
     instvar is modified"

    ^ self findRefsTo:aString classVars:false in:(Array with:aClass) access:accessType
!

findInstRefsTo:aString inClass:aClass modificationsOnly:modsOnly
    "return all methods in aClass where the instVar named
     aString is referenced; if modsOnly is true, browse only methods where the
     instvar is modified"

    ^ self findRefsTo:aString classVars:false in:(Array with:aClass) modificationsOnly:modsOnly
!

findInstRefsTo:aString under:aClass access:accessType
    "return all methods in aClass and subclasses
     where the classVar named aString is referenced; 
     if modsOnly is true, browse only methods where the classvar is modified"

    ^ self findInstRefsTo:aString in:(aClass withAllSubclasses) access:accessType
!

findInstRefsTo:aString under:aClass modificationsOnly:modsOnly
    "return all methods in aClass and subclasses
     where the instVar named aString is referenced; 
     if modsOnly is true, browse only methods where the instvar is modified"

    ^ self findInstRefsTo:aString in:(aClass withAllSubclasses) modificationsOnly:modsOnly
!

findMenuSpecMethodsWithString:aString in:aCollectionOfClasses ignoreCase:ignoreCase
    "return a collection of all menu-spec methods in aCollectionOfClasses  
     containing a string in their source.
     This may be slow, since source-code has to be scanned."

    ^ self findSpecMethodsFor:#menu withString:aString in:aCollectionOfClasses ignoreCase:ignoreCase
!

findRefsTo:varName classVars:classVars in:aCollectionOfClasses access:accessType
    "return a list of all methods in aCollectionOfClasses where the instVar/classVar named
     varName is referenced; 
     if modsOnly is true, browse only methods where the instvar is modified"

    |filter|

    filter := self filterToSearchRefsTo:varName classVars:classVars access:accessType.
    ^ self findMethodsIn:aCollectionOfClasses inst:true class:classVars where:filter.

    "
     self
        findRefsTo:'x'
        classVars:false
        in:(Array with:Point)
        modificationsOnly:true
    "
!

findRefsTo:varName classVars:classVars in:aCollectionOfClasses modificationsOnly:modsOnly
    "return a list of all methods in aCollectionOfClasses where the instVar/classVar named
     varName is referenced; 
     if modsOnly is true, browse only methods where the instvar is modified"

    |filter|

    filter := self filterToSearchRefsTo:varName classVars:classVars modificationsOnly:modsOnly.
    ^ self findMethodsIn:aCollectionOfClasses inst:true class:classVars where:filter.

    "
     self
        findRefsTo:'x'
        classVars:false
        in:(Array with:Point)
        modificationsOnly:true
    "
!

findResource:aResourceSymbolOrCollectionOfSymbols in:aCollectionOfClasses 
    "return a collection of all methods in aCollectionOfClasses  
     containing a resource."

    |searchBlock|

    aResourceSymbolOrCollectionOfSymbols isSymbol ifTrue:[
        searchBlock := [:c :m :sel | |resources|
                            (resources := m resources) size > 0
                            and:[resources includesKey:aResourceSymbolOrCollectionOfSymbols]
                       ].
    ] ifFalse:[
        searchBlock := [:c :m :sel | |resources|
                            (resources := m resources) size > 0
                            and:[resources keys includesAny:aResourceSymbolOrCollectionOfSymbols]
                       ].
    ].

    ^ self findMethodsIn:aCollectionOfClasses where:searchBlock.

    "
     SystemBrowser findResource:#image in:(ApplicationModel withAllSubclasses)
     SystemBrowser findResource:#menu in:(ApplicationModel withAllSubclasses)
     SystemBrowser findResource:#(menu programMenu) in:(ApplicationModel withAllSubclasses)
    "
!

findSendersOf:aSelectorString in:aCollectionOfClasses ignoreCase:ignoreCase
    "search for all senders of aSelector in
     the classes contained in aCollectionOfClasses and its metaclasses.
     Return a collection of methods"

    ^ self allCallsOn:aSelectorString in:aCollectionOfClasses ignoreCase:ignoreCase

    "
     SystemBrowser findSendersOf:#+
                   in:(Array with:Number
                             with:Float
                             with:SmallInteger)
                   ignoreCase:false
    "

!

findSendersOfAny:aCollectionOfSelectors in:aCollectionOfClasses ignoreCase:ignoreCase
    "search for all senders of any selector in aCollectionOfSelectors in
     the classes contained in aCollectionOfClasses and its metaclasses.
     Return a collection of methods.
     CAVEAT: searches multiple times (could be tuned alot if heavily used)"

    |allSenders|

    allSenders := IdentitySet new.
    aCollectionOfSelectors do:[:eachSelector |
        allSenders addAll:(self allCallsOn:eachSelector in:aCollectionOfClasses ignoreCase:ignoreCase)
    ].
    ^ allSenders

    "
     SystemBrowser findSendersOfAny:#(#'+' #'-')
                   in:(Array with:Number
                             with:Float
                             with:SmallInteger)
                   ignoreCase:false  
    "
!

findSpecMethodsFor:specSymbol withString:aString in:aCollectionOfClasses ignoreCase:ignoreCase
    "return a collection of all specSymbol-spec methods in aCollectionOfClasses  
     containing a string in their source.
     This may be slow, since source-code has to be scanned."

    |searchBlock s|

    (aString includesMatchCharacters
    or:[ignoreCase]) ifTrue:[
        s := '*' , aString , '*'.
        "a matchString"
        searchBlock := [:c :m :sel | 
                            |src resources| 

                            ((resources := m resources) size > 0
                            and:[resources includesKey:specSymbol]) ifTrue:[
                                src := m source.
                                src isNil ifTrue:[
                                    ('Browser [info]: no source for ' , m printString) infoPrintCR.
                                    false
                                ] ifFalse:[
                                    s match:src ignoreCase:ignoreCase
                                ]
                            ]
                       ]
    ] ifFalse:[
        searchBlock := [:c :m :sel | 
                            |src resources|

                            ((resources := m resources) size > 0
                            and:[resources includesKey:specSymbol]) ifTrue:[
                                src := m source.
                                src isNil ifTrue:[
                                    ('Browser [info]: no source for ' , m printString) infoPrintCR.
                                    false
                                ] ifFalse:[
                                    (src findString:aString) ~~ 0
                                ]
                            ]
                       ]
    ].
    ^ self findMethodsIn:aCollectionOfClasses where:searchBlock.
!

findString:aString in:aCollectionOfClasses ignoreCase:ignoreCase
    "return a colelction of all methods in aCollectionOfClasses  
     containing a string in their source.
     This may be slow, since source-code has to be scanned."

    |searchBlock s|

    (aString includesMatchCharacters
    or:[ignoreCase]) ifTrue:[
        s := '*' , aString , '*'.
        "a matchString"
        searchBlock := [:c :m :sel | 
                            |src|       
                            src := m source.
                            src isNil ifTrue:[
                                ('Browser [info]: no source for ' , m printString) infoPrintCR.
                                false
                            ] ifFalse:[
                                s match:src ignoreCase:ignoreCase
                            ]
                       ]
    ] ifFalse:[
        searchBlock := [:c :m :sel | 
                            |src|

                            src := m source.
                            src isNil ifTrue:[
                                ('Browser [info]: no source for ' , m printString) infoPrintCR.
                                false
                            ] ifFalse:[
                                (src findString:aString) ~~ 0
                            ]
                       ]
    ].
    ^ self findMethodsIn:aCollectionOfClasses where:searchBlock.

    "
     SystemBrowser findString:'should'   in:(Array with:Object) ignoreCase:false
    "
! !

!SystemBrowser class methodsFor:'startup'!

browseAllSelect:aBlock
    "launch a browser for all methods where aBlock returns true.
     The block is called with 3 arguments, class, method and selector."

    ^ self 
        browseMethodsWhere:aBlock 
        title:'selected messages'

    "
     SystemBrowser browseAllSelect:[:aClass :aMethod :selector | selector numArgs == 3]
    "

    "Modified: 24.1.1997 / 19:45:05 / cg"
!

browseClass:aClass
    "launch a browser for aClass"

    ^ self 
        newWithLabel:aClass name
        setupSelector:#setupForClass:
        arg:aClass

    "
     SystemBrowser browseClass:Object
    "

    "Modified: 24.1.1997 / 19:45:16 / cg"
!

browseClass:aClass methodCategory:aCategory
    "launch a browser for all methods under aCategory in aClass"

    ^ self newWithLabel:(aClass name , ' ' , aCategory)
          setupBlock:[:browser | browser setupForClass:aClass methodCategory:aCategory]

    "
     SystemBrowser browseClass:String methodCategory:'copying'
    "

    "Modified: 24.1.1997 / 19:45:23 / cg"
!

browseClass:aClass selector:selector
    "launch a browser for the method at selector in aClass"

    ^ self 
	newWithLabel:(aClass name , ' ' , selector , ' ' , selector)
	setupBlock:[:newBrowser | newBrowser setupForClass:aClass selector:selector]

    "
     SystemBrowser browseClass:Object selector:#printString
    "
!

browseClassCategory:aClassCategory
    "launch a browser for all classes under aCategory"

    ^ self 
        newWithLabel:aClassCategory
        setupSelector:#setupForClassCategory:
        arg:aClassCategory

    "
     SystemBrowser browseClassCategory:'Kernel-Objects'
    "

    "Modified: 24.1.1997 / 19:45:32 / cg"
!

browseClassHierarchy:aClass
    "launch a browser for aClass and all its superclasses.
     this is different from the fullProtocol browser."

    ^ self 
	newWithLabel:(aClass name , '-' , 'hierarchy')
	setupSelector:#setupForClassHierarchy:
	arg:aClass

    "
     SystemBrowser browseClassHierarchy:Number
    "
!

browseClasses:aList title:title
    "launch a browser for all classes in aList"

    ^ self 
        newWithLabel:title
        setupBlock:[:b | b setupForClassList:aList sort:true]

    "
     SystemBrowser browseClasses:(Array with:Object
                                        with:Float)
                           title:'two classes'
    "

    "Modified: 28.5.1996 / 13:52:25 / cg"
!

browseClasses:aList title:title sort:doSort
    "launch a browser for all classes in aList"

    ^ self 
        newWithLabel:title
        setupBlock:[:b | b setupForClassList:aList sort:doSort]

    "
     SystemBrowser browseClasses:(Array with:Object
                                        with:Float)
                           title:'two classes'
    "

    "Created: 28.5.1996 / 13:52:09 / cg"
!

browseFullClassProtocol:aClass
    "launch a browser for aClasses full protocol.
     This is different from hierarchy browsing."

    ^ self 
	newWithLabel:(aClass name , '-' , 'full protocol')
	setupSelector:#setupForFullClassProtocol:
	arg:aClass

    "
     SystemBrowser browseFullClassProtocol:Number
    "
!

browseFullClasses
    "launch a browser showing all methods at once"

    ^ self 
	newWithLabel:'Full Class Browser'
	setupBlock:[:newBrowser | newBrowser setupForFullClass]

    "SystemBrowser browseFullClasses"
!

browseInstMethodsFrom:aClass where:aBlock title:title
    "launch a browser for all instance methods in aClass and all subclasses
     where aBlock evaluates to true"

    ^ self      
        browseMethodsIn:(aClass withAllSubclasses) 
        inst:true 
        class:false 
        where:aBlock 
        title:title

    "Modified: 24.1.1997 / 19:44:45 / cg"
!

browseInstMethodsIn:aCollectionOfClasses where:aBlock title:title
    "launch a browser for all instance methods of all classes in
     aCollectionOfClasses where aBlock evaluates to true"

    ^ self 
        browseMethodsIn:aCollectionOfClasses 
        inst:true class:false 
        where:aBlock title:title

    "Modified: 24.1.1997 / 19:43:41 / cg"
!

browseInstMethodsOf:aClass where:aBlock title:title
    "launch a browser for all instance methods in aClass
     where aBlock evaluates to true"

    ^ self 
        browseMethodsIn:(Array with:aClass) 
        inst:true 
        class:false 
        where:aBlock title:title

    "Modified: 24.1.1997 / 19:43:50 / cg"
!

browseMethodCategory:aCategory
    "launch a browser for all methods where category = aCategory"

    |searchBlock|

    aCategory includesMatchCharacters ifTrue:[
        searchBlock := [:c :m :s | aCategory match:m category].
    ] ifFalse:[
        searchBlock := [:c :m :s | m category = aCategory]
    ].

    ^ self browseMethodsWhere:searchBlock title:('all methods with category of ' , aCategory)

    "
     SystemBrowser browseMethodCategory:'printing & storing'
     SystemBrowser browseMethodCategory:'print*'
    "
!

browseMethods:aListOfMethods
    "launch a multi-method browser."

    ^ self browseMethods:aListOfMethods title:'some methods'

    "
     self 
        browseMethods:(Array with:(Array compiledMethodAt:#at:)
                             with:(OrderedCollection compiledMethodAt:#at:))

     self 
        browseMethods:(Array with:(Array compiledMethodAt:#at:)
                             with:(Array compiledMethodAt:#at:put:))
    "
!

browseMethods:aList title:aString
    "launch a browser for an explicit list of class/selectors.
     Each entry in the list can be either a method, or a string
     consisting of the classes name and the selector, separated by spaces. 
     For class methods, the string ' class' must be appended to the classname."

    ^ self
        browseMethods:aList
        title:aString
        sort:true


    "
     SystemBrowser 
        browseMethods:#('Object printOn:' 'Collection add:')
        title:'some methods'

     SystemBrowser 
        browseMethods:#('Behavior new:' 'Setclass new:')
        title:'some new: methods'

     SystemBrowser 
        browseMethods:(Array with:(Object compiledMethodAt:#printOn:)
                             with:(Collection compiledMethodAt:#add:)
                             with:(Object class compiledMethodAt:#initialize))
        title:'some methods'

    "

    "Modified: 1.11.1996 / 16:30:17 / cg"
!

browseMethods:aList title:aString sort:doSort
    "launch a browser for an explicit list of class/selectors.
     Each entry in the list can be either a method, or a string
     consisting of the classes name and the selector, separated by spaces. 
     For class methods, the string ' class' must be appended to the classname."

    |l|

    (aList size == 0) ifTrue:[
        self showNoneFound:aString.
        ^ nil
    ].
    l := aList asOrderedCollection.
    l := l collect:[:entry |
        |who cls clsName|

        entry isString ifTrue:[
            entry
        ] ifFalse:[
            cls := entry mclass.
            cls isNil ifTrue:[
                '??? unbound'
            ] ifFalse:[
                cls isJavaClass ifTrue:[
                    clsName := 'JAVA::' , cls fullName 
                ] ifFalse:[
                    clsName := cls name
                ].
(cls selectorAtMethod:entry) isNil ifTrue:[
    self halt.
].
                clsName
                , ' ' 
                , (entry printStringForBrowserWithSelector:(cls selectorAtMethod:entry))
            ]
        ]
      ].
        
    doSort ifTrue:[l sort].

    ^ self 
        newWithLabel:aString
        setupSelector:#setupForList:
        arg:l 

    "
     SystemBrowser 
        browseMethods:#('Object printOn:' 'Collection add:')
        title:'some methods'

     SystemBrowser 
        browseMethods:#('Behavior new:' 'Setclass new:')
        title:'some new: methods'

     SystemBrowser 
        browseMethods:(Array with:(Object compiledMethodAt:#printOn:)
                             with:(Collection compiledMethodAt:#add:)
                             with:(Object class compiledMethodAt:#initialize))
        title:'some methods'

    "

    "Modified: / 17.6.1996 / 17:07:46 / stefan"
    "Modified: / 17.10.1998 / 11:25:53 / cg"
!

browseMethodsFrom:aClass where:aBlock title:title
    "launch a browser for all instance- and classmethods in aClass
     and all its subclasses where aBlock evaluates to true.
     The block is called with 3 arguments, class, method and seelctor."

    ^ self 
        browseMethodsIn:(aClass withAllSubclasses) 
        where:aBlock 
        title:title

    "Modified: 24.1.1997 / 19:44:00 / cg"
!

browseMethodsIn:aCollectionOfClasses inst:wantInst class:wantClass where:aBlock title:title
    "launch a browser for all instance- (if wantInst is true) and/or
     classmethods (if wantClass is true) from classes in aCollectionOfClasses,
     where aBlock evaluates to true.
     The block is called with 3 arguments, class, method and selector."

    |list|

    "
     since this may take a long time, lower my priority ...
    "
    Processor activeProcess 
        withPriority:Processor activePriority-1 to:Processor activePriority
    do:[
        list := self findMethodsIn:aCollectionOfClasses inst:wantInst class:wantClass where:aBlock
    ].
    ^ self browseMethods:list title:title
!

browseMethodsIn:aCollectionOfClasses inst:wantInst class:wantClass where:aBlock title:title ifNone:warnBlock
    "launch a browser for all instance- (if wantInst is true) and/or
     classmethods (if wantClass is true) from classes in aCollectionOfClasses,
     where aBlock evaluates to true.
     The block is called with 3 arguments, class, method and selector."

    |list|

    "
     since this may take a long time, lower my priority ...
    "
    Processor activeProcess 
        withPriority:Processor activePriority-1 to:Processor activePriority
    do:[
        list := self findMethodsIn:aCollectionOfClasses inst:wantInst class:wantClass where:aBlock.
        list size == 0 ifTrue:[warnBlock value].
    ].
    ^ self browseMethods:list title:title
!

browseMethodsIn:aCollectionOfClasses where:aBlock title:title
    "launch a browser for all instance- and classmethods from 
     all classes in aCollectionOfClasses where aBlock evaluates to true.
     The block is called with 3 arguments, class, method and seelctor."

    ^ self 
        browseMethodsIn:aCollectionOfClasses 
        inst:true 
        class:true 
        where:aBlock 
        title:title

    "Modified: 24.1.1997 / 19:44:17 / cg"
!

browseMethodsIn:aCollectionOfClasses where:aBlock title:title ifNone:warnBlock
    "launch a browser for all instance- and classmethods from 
     all classes in aCollectionOfClasses where aBlock evaluates to true.
     The block is called with 3 arguments, class, method and seelctor."

    ^ self 
        browseMethodsIn:aCollectionOfClasses 
        inst:true 
        class:true 
        where:aBlock 
        title:title
        ifNone:warnBlock

    "Modified: 24.1.1997 / 19:44:17 / cg"
!

browseMethodsOf:aClass where:aBlock title:title
    "launch a browser for all instance- and classmethods in aClass 
     where aBlock evaluates to true.
     The block is called with 3 arguments, class, method and seelctor."

    ^ self browseMethodsIn:(Array with:aClass) where:aBlock title:title
!

browseMethodsWhere:aBlock title:title
    "launch a browser for all methods where aBlock returns true.
     The block is called with 3 arguments, class, method and seelctor."

    ^ self 
        browseMethodsIn:(Smalltalk allClasses) 
        where:aBlock 
        title:title

    "Modified: 24.1.1997 / 19:44:30 / cg"
!

browseMethodsWhere:aBlock title:title ifNone:warnBlock
    "launch a browser for all methods where aBlock returns true.
     The block is called with 3 arguments, class, method and seelctor."

    ^ self 
        browseMethodsIn:(Smalltalk allClasses) 
        where:aBlock 
        title:title
        ifNone:warnBlock

    "Modified: 24.1.1997 / 19:44:30 / cg"
!

findMethodsIn:aCollectionOfClasses inst:wantInst class:wantClass where:aBlock
    "return all instance- (if wantInst is true) and/or classmethods (if wantClass is true) 
     from classes in aCollectionOfClasses, where aBlock evaluates to true."

    |list checkedClasses checkBlock|

    checkedClasses := IdentitySet new.
    list := OrderedCollection new.

    checkBlock := [:cls |
        (checkedClasses includes:cls) ifFalse:[
            cls isObsolete ifTrue:[
                Transcript showCR:'Browser method search: skipping obsolete class: ' , cls displayString
            ] ifFalse:[
                cls methodDictionary keysAndValuesDo:[:sel :method |
                    (aBlock value:cls value:method value:sel) ifTrue:[
                        list add:method "/ (cls name , ' ' , sel)
                    ]
                ].
                checkedClasses add:cls.
            ]
        ]
    ].

    aCollectionOfClasses do:[:aClass |
        (aClass notNil and:[aClass isObsolete not]) ifTrue:[
            "
             output disabled - it slows down things too much (when searching for
             implementors or senders)
            "
            wantInst ifTrue:[
"/                Transcript show:'searching '; show:aClass name; showCR:' ...'; endEntry.
                checkBlock value:aClass
            ].
            wantClass ifTrue:[
"/                Transcript show:'searching '; show:aClass class name; showCR:' ...'; endEntry.
                checkBlock value:(aClass class)
            ].
            Processor yield
        ]
    ].
    ^ list
!

findMethodsIn:aCollectionOfClasses where:aBlock
    "return all instance- and classmethods 
     from classes in aCollectionOfClasses, where aBlock evaluates to true."

    ^ self
        findMethodsIn:aCollectionOfClasses 
        inst:true
        class:true      
        where:aBlock
! !

!SystemBrowser class methodsFor:'startup with query'!

askThenBrowseClass
    self getClassThenPerform:#browseClass:

    "
     SystemBrowser askThenBrowseClass
    "
!

askThenBrowseClassHierarchy
    self getClassThenPerform:#browseClassHierarchy:

    "
     SystemBrowser askThenBrowseClassHierarchy
    "
!

askThenBrowseFullClassProtocol
    self getClassThenPerform:#browseFullClassProtocol:

    "
     SystemBrowser askThenBrowseFullClassProtocol
    "
!

getClassThenPerform:aSelector
    |enterBox resources|

    resources := self classResources.

    enterBox := EnterBox title:(self classResources at:'Browse which class:') withCRs.
    enterBox okText:(resources at:'browse').
    enterBox entryCompletionBlock:[:contents |
        |s what m|

        s := contents withoutSpaces.
        what := Smalltalk classnameCompletion:s.
        enterBox contents:what first.
    ].
    enterBox action:[:className |
        |cls|

        cls := Smalltalk classNamed:className.
        cls isNil ifTrue:[
            self warn:(resources at:'no such class').
        ] ifFalse:[
            self perform:aSelector with:cls  
        ]
    ].
    enterBox showAtPointer

    "
     SystemBrowser getClassThenPerform:#browseClass:
    "
! !

!SystemBrowser class methodsFor:'utilities'!

classWithNameSimilarTo:className
    "helper for class-name entry; finds a class by name tolerant w.r.t. case"

    |nm lcName class allClasses|

    (className startsWith:'Smalltalk::') ifTrue:[
        nm := className copyFrom:('Smalltalk::' size + 1).
    ] ifFalse:[
        nm := className.
    ].

    class := Smalltalk at:nm asSymbol.
    class notNil ifTrue:[^ class].

    lcName := className asLowercase.
    allClasses := Smalltalk allClasses.
    class := allClasses 
                    detect:[:cls | cls name asLowercase = lcName]
                    ifNone:nil.
    class notNil ifTrue:[^ class].

    class := allClasses 
                    detect:[:cls | cls name asLowercase startsWith:lcName]
                    ifNone:nil.
    class notNil ifTrue:[^ class].

    class := allClasses 
                    detect:[:cls | cls nameWithoutNameSpacePrefix asLowercase = lcName]
                    ifNone:nil.
    class notNil ifTrue:[^ class].

    class := allClasses 
                    detect:[:cls | cls nameWithoutNameSpacePrefix asLowercase startsWith:lcName]
                    ifNone:nil.
    class notNil ifTrue:[^ class].

    class := allClasses 
                    detect:[:cls | cls nameWithoutPrefix asLowercase = lcName]
                    ifNone:nil.
    class notNil ifTrue:[^ class].

    class := allClasses 
                    detect:[:cls | cls nameWithoutPrefix asLowercase startsWith:lcName]
                    ifNone:nil.
    class notNil ifTrue:[^ class].

    class := allClasses 
                    detect:[:cls | ('*' , lcName , '*') match:cls nameWithoutPrefix asLowercase]
                    ifNone:nil.
    ^ class
!

extractClassAndSelectorFrom:aString into:aBlock
    "given a string which can be either 'class>>sel' or
     'class sel', extract className and selector, and call aBlock with
     the result.
     Useful to open browser on a method as selected in some documentation."

    |sel clsName isMeta sep s|

    sel := aString.
    sel notNil ifTrue:[
        sel := sel asString withoutSeparators.
        ('*>>*' match:sel) ifTrue:[
            sep := $>
        ] ifFalse:[
            ('* *' match:sel) ifTrue:[
                sep := Character space
            ]
        ].
        sep notNil ifTrue:[
            "
             extract class/sel from selection
            "
            s := ReadStream on:sel.
            clsName := s upTo:sep.
            [s peek == sep] whileTrue:[s next].
            sel := s upToEnd.

            (clsName endsWith:' class') ifTrue:[
                isMeta := true.
                clsName := clsName copyWithoutLast:6 "copyTo:(clsName size - 5)"
            ] ifFalse:[
                isMeta := false
            ].
        ]
    ].
    aBlock value:clsName value:sel value:isMeta

    "Modified: / 17.6.1996 / 16:52:14 / stefan"
    "Created: / 6.2.2000 / 00:51:51 / cg"
    "Modified: / 6.2.2000 / 00:56:43 / cg"
!

extractSelectorFrom:aString
    "given an arbitrary string, try to extract a useful selector.
     Useful to open browser on a selected code fragment."

    |s sel t|

    aString isNil ifTrue:[^ nil].

    s := aString asString string.
    s := s withoutSeparators.
    sel := s.
    sel knownAsSymbol ifTrue:[
        "/ might be already correct ...
        ^ sel
    ].
    (sel startsWith:'#') ifTrue:[
        t := Symbol readFrom:sel onError:nil.
        (t notNil and:[ t knownAsSymbol ]) ifTrue:[
            ^ t
        ]
    ].

    t := Parser selectorInExpression:sel.
    t notNil ifTrue:[
        sel := t
    ].
    (sel = s or:[sel isNil or:[t == #>>]]) ifTrue:[
        "oops - thats probably not what we want here ..."
        self extractClassAndSelectorFrom:s into:[:c :s :m |
            sel := s
        ]
    ].
    ^ sel

    "
     self extractSelectorFrom:'at:put:'      
     self extractSelectorFrom:'#at:put:'                       
     self extractSelectorFrom:'at:something put:someValue'     
     self extractSelectorFrom:'self at:something put:someValue'
     self extractSelectorFrom:'(self at:something put:someValue)' 
     self extractSelectorFrom:'[self at:something put:someValue] value' 
     self extractSelectorFrom:'Array>>at:put:' 
    "

    "Created: / 6.2.2000 / 00:49:44 / cg"
    "Modified: / 6.2.2000 / 00:57:08 / cg"
! !

!SystemBrowser::BrowserHistoryEntry methodsFor:'accessing'!

className
    "return the value of the instance variable 'className' (automatically generated)"

    ^ className
!

className:something
    "set the value of the instance variable 'className' (automatically generated)"

    className := something.
!

className:classNameArg meta:metaArg selector:selectorArg
    className := classNameArg.
    meta := metaArg.
    selector := selectorArg.
!

meta
    "return the value of the instance variable 'meta' (automatically generated)"

    ^ meta
!

meta:something
    "set the value of the instance variable 'meta' (automatically generated)"

    meta := something.
!

selector
    "return the value of the instance variable 'selector' (automatically generated)"

    ^ selector
!

selector:something
    "set the value of the instance variable 'selector' (automatically generated)"

    selector := something.
!

theClass
    ^ Smalltalk at:className asSymbol
! !

!SystemBrowser::BrowserHistoryEntry methodsFor:'comparing'!

= anEntry
    ^ className = anEntry className
      and:[meta = anEntry meta
      and:[selector = anEntry selector]]
! !

!SystemBrowser class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/libtool/SystemBrowser.st,v 1.167 2002-11-04 11:51:53 cg Exp $'
! !

SystemBrowser initialize!