--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_BrowserList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,1215 @@
+"{ Package: 'stx:libtool' }"
+
+"{ NameSpace: Tools }"
+
+NewSystemBrowser::NavigatorModel subclass:#BrowserList
+ instanceVariableNames:'menuHolder inGeneratorHolder outGeneratorHolder
+ selectionChangeCondition immediateUpdate doubleClickChannel
+ filter updateTrigger forceGeneratorTrigger hideUnloadedClasses
+ showClassPackages selectionHolder packageFilter nameSpaceFilter
+ organizerMode slaveMode listValid pseudoListLabelHolder icons
+ sortBy'
+ classVariableNames:'SynchronousUpdate Icons'
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!BrowserList class methodsFor:'documentation'!
+
+documentation
+"
+ embeddable application displaying the class-categories.
+ Provides an outputGenerator, which enumerates the classes in
+ the selected categories.
+
+ [author:]
+ Claus Gittinger (cg@exept.de)
+"
+! !
+
+!BrowserList class methodsFor:'image specs'!
+
+nameSpaceIcon
+ ^ SystemBrowser nameSpaceIcon
+!
+
+packageIcon
+ ^ SystemBrowser packageIcon
+!
+
+padLockBlueMiniIcon
+ ^ SystemBrowser padLockBlueMiniIcon
+!
+
+padLockGrayMiniIcon
+ ^ SystemBrowser padLockGrayMiniIcon
+!
+
+padLockGreenMiniIcon
+ ^ SystemBrowser padLockGreenMiniIcon
+!
+
+padLockRedMiniIcon
+ ^ SystemBrowser padLockRedMiniIcon
+!
+
+programImageIcon
+ ^ SystemBrowser programImageIcon
+!
+
+protectedMethod
+ ^ self padLockRedMiniIcon
+!
+
+redLockIcon
+ ^ SystemBrowser redLockIcon
+! !
+
+!BrowserList methodsFor:'aspects'!
+
+defaultSlaveModeValue
+ ^ nil.
+
+ "Created: / 25.2.2000 / 22:36:40 / cg"
+!
+
+doubleClickChannel
+ doubleClickChannel isNil ifTrue:[
+ doubleClickChannel := TriggerValue new.
+ ].
+ ^ doubleClickChannel.
+
+ "Modified: / 31.1.2000 / 00:42:44 / cg"
+ "Created: / 5.2.2000 / 22:38:32 / cg"
+!
+
+doubleClickChannel:aChannel
+ doubleClickChannel := aChannel
+!
+
+filter:aValueHolder
+ filter notNil ifTrue:[
+ filter removeDependent:self
+ ].
+ filter := aValueHolder.
+ filter notNil ifTrue:[
+ filter addDependent:self
+ ].
+
+ "Modified: / 4.2.2000 / 23:29:30 / cg"
+ "Created: / 5.2.2000 / 13:42:12 / cg"
+!
+
+forceGeneratorTrigger
+ forceGeneratorTrigger isNil ifTrue:[
+ forceGeneratorTrigger := TriggerValue new.
+ forceGeneratorTrigger addDependent:self.
+ ].
+ ^ forceGeneratorTrigger.
+
+ "Modified: / 18.2.2000 / 02:02:52 / cg"
+ "Created: / 18.2.2000 / 02:46:40 / cg"
+!
+
+forceGeneratorTrigger:aTriggerValue
+ forceGeneratorTrigger notNil ifTrue:[
+ forceGeneratorTrigger removeDependent:self
+ ].
+ forceGeneratorTrigger := aTriggerValue.
+ forceGeneratorTrigger notNil ifTrue:[
+ forceGeneratorTrigger addDependent:self
+ ].
+
+ "Modified: / 4.2.2000 / 23:29:30 / cg"
+ "Created: / 18.2.2000 / 02:46:52 / cg"
+!
+
+hideUnloadedClasses
+ hideUnloadedClasses isNil ifTrue:[
+ hideUnloadedClasses := false asValue.
+ hideUnloadedClasses addDependent:self.
+ ].
+ ^ hideUnloadedClasses.
+
+ "Modified: / 18.2.2000 / 02:02:52 / cg"
+ "Created: / 18.2.2000 / 17:36:30 / cg"
+!
+
+hideUnloadedClasses:aValueHolder
+ hideUnloadedClasses notNil ifTrue:[
+ hideUnloadedClasses removeDependent:self
+ ].
+ hideUnloadedClasses := aValueHolder.
+ hideUnloadedClasses notNil ifTrue:[
+ hideUnloadedClasses addDependent:self
+ ].
+
+ "Modified: / 4.2.2000 / 23:29:30 / cg"
+ "Created: / 18.2.2000 / 17:46:36 / cg"
+!
+
+menuHolder
+ ^ menuHolder
+
+ "Created: / 5.2.2000 / 13:42:06 / cg"
+!
+
+menuHolder:aValueHolder
+ menuHolder := aValueHolder.
+
+ "Created: / 5.2.2000 / 13:42:06 / cg"
+!
+
+nameSpaceFilter
+ nameSpaceFilter isNil ifTrue:[
+ nameSpaceFilter := ValueHolder new.
+ nameSpaceFilter addDependent:self.
+ ].
+ ^ nameSpaceFilter.
+
+ "Modified: / 24.2.2000 / 23:57:13 / cg"
+ "Created: / 18.8.2000 / 14:18:56 / cg"
+!
+
+nameSpaceFilter:aValueHolder
+ nameSpaceFilter notNil ifTrue:[
+ nameSpaceFilter removeDependent:self
+ ].
+ nameSpaceFilter := aValueHolder.
+ nameSpaceFilter notNil ifTrue:[
+ nameSpaceFilter addDependent:self
+ ].
+
+ "Modified: / 24.2.2000 / 23:56:22 / cg"
+ "Created: / 18.8.2000 / 14:19:06 / cg"
+!
+
+organizerMode
+ organizerMode isNil ifTrue:[
+ organizerMode := #category asValue.
+ organizerMode addDependent:self.
+ ].
+ ^ organizerMode
+
+ "Modified: / 31.1.2000 / 00:51:06 / cg"
+ "Created: / 25.2.2000 / 22:36:15 / cg"
+!
+
+organizerMode:aValueHolder
+ organizerMode notNil ifTrue:[
+ organizerMode removeDependent:self
+ ].
+ organizerMode := aValueHolder.
+ organizerMode notNil ifTrue:[
+ organizerMode addDependent:self
+ ].
+
+ "Modified: / 4.2.2000 / 23:34:28 / cg"
+ "Created: / 25.2.2000 / 22:36:28 / cg"
+!
+
+packageFilter
+ packageFilter isNil ifTrue:[
+ packageFilter := ValueHolder new.
+ packageFilter addDependent:self.
+
+"/ debug-check only
+"/ packageFilter onChangeEvaluate:[packageFilter value isValueModel ifTrue:[self halt:'debug halt']].
+ ].
+ ^ packageFilter.
+
+ "Modified: / 18.8.2000 / 19:26:36 / cg"
+!
+
+packageFilter:aValueHolder
+ packageFilter notNil ifTrue:[
+ packageFilter removeDependent:self
+ ].
+ packageFilter := aValueHolder.
+ packageFilter notNil ifTrue:[
+ packageFilter addDependent:self.
+
+"/ debug-check only
+"/ packageFilter onChangeEvaluate:[packageFilter value isValueModel ifTrue:[self halt:'debug halt']].
+ ].
+
+ "Modified: / 18.8.2000 / 19:26:40 / cg"
+!
+
+pseudoListLabelHolder
+ pseudoListLabelHolder isNil ifTrue:[
+ pseudoListLabelHolder := '' asValue.
+ ].
+ ^ pseudoListLabelHolder
+!
+
+selectionChangeCondition:aBlockOrValueHolder
+ selectionChangeCondition := aBlockOrValueHolder
+!
+
+selectionHolder
+ selectionHolder isNil ifTrue:[
+ selectionHolder := ValueHolder new.
+ selectionHolder addDependent:self
+ ].
+ ^ selectionHolder.
+
+!
+
+selectionHolder:aValueHolder
+ |prevSelection|
+
+ prevSelection := selectionHolder value ? #().
+
+ selectionHolder notNil ifTrue:[
+ selectionHolder removeDependent:self
+ ].
+ selectionHolder := aValueHolder.
+ selectionHolder notNil ifTrue:[
+ selectionHolder addDependent:self
+ ].
+ (selectionHolder value ? #()) ~= prevSelection ifTrue:[
+ "/ update
+ self update:#value with:nil from:selectionHolder
+ ].
+
+
+!
+
+showClassPackages
+ showClassPackages isNil ifTrue:[
+ showClassPackages := false asValue.
+ showClassPackages addDependent:self.
+ ].
+ ^ showClassPackages.
+
+ "Modified: / 18.2.2000 / 02:02:52 / cg"
+ "Created: / 18.2.2000 / 17:36:30 / cg"
+!
+
+showClassPackages:aValueHolder
+ showClassPackages notNil ifTrue:[
+ showClassPackages removeDependent:self
+ ].
+ showClassPackages := aValueHolder.
+ showClassPackages notNil ifTrue:[
+ showClassPackages addDependent:self
+ ].
+!
+
+slaveMode
+ slaveMode isNil ifTrue:[
+ slaveMode := self defaultSlaveModeValue asValue.
+ slaveMode addDependent:self.
+ ].
+ ^ slaveMode.
+
+ "Created: / 25.2.2000 / 22:36:40 / cg"
+!
+
+slaveMode:aValueHolder
+ |prev|
+
+ slaveMode notNil ifTrue:[
+ slaveMode removeDependent:self.
+ prev := slaveMode value.
+ ].
+ slaveMode := aValueHolder.
+ slaveMode notNil ifTrue:[
+ slaveMode addDependent:self
+ ].
+ prev ~~ slaveMode value ifTrue:[
+ (prev isNil and:[slaveMode value]) ifFalse:[
+ self update:#value with:nil from:slaveMode.
+ ]
+ ].
+!
+
+sortBy
+ sortBy isNil ifTrue:[
+ sortBy := nil asValue.
+ sortBy addDependent:self.
+ ].
+ ^ sortBy.
+
+ "Created: / 25.2.2000 / 22:36:40 / cg"
+!
+
+sortBy:aValueHolder
+ |prev|
+
+ prev := sortBy value.
+ sortBy notNil ifTrue:[
+ sortBy removeDependent:self
+ ].
+ sortBy := aValueHolder.
+ sortBy notNil ifTrue:[
+ sortBy addDependent:self
+ ].
+ prev ~~ sortBy value ifTrue:[
+ self update:#value with:nil from:sortBy.
+ ].
+
+ "Modified: / 4.2.2000 / 23:29:30 / cg"
+ "Created: / 5.2.2000 / 13:42:12 / cg"
+!
+
+updateTrigger
+ updateTrigger isNil ifTrue:[
+ updateTrigger := TriggerValue new.
+ updateTrigger addDependent:self.
+ ].
+ ^ updateTrigger.
+
+ "Created: / 18.2.2000 / 01:59:58 / cg"
+ "Modified: / 18.2.2000 / 02:02:52 / cg"
+!
+
+updateTrigger:aTriggerValue
+ updateTrigger notNil ifTrue:[
+ updateTrigger removeDependent:self
+ ].
+ updateTrigger := aTriggerValue.
+ updateTrigger notNil ifTrue:[
+ updateTrigger addDependent:self
+ ].
+
+ "Modified: / 4.2.2000 / 23:29:30 / cg"
+ "Created: / 18.2.2000 / 02:03:15 / cg"
+! !
+
+!BrowserList methodsFor:'change & update'!
+
+delayedUpdate:something with:aParameter from:changedObject
+
+ "/ if any of my subclasses want those, they should look for them.
+ changedObject == Smalltalk ifTrue:[
+ (something == #Language or:[something == #LanguageTerritory]) ifTrue:[
+ ^ self
+ ].
+ something == #organization ifTrue:[
+ ^ self
+ ].
+ something == #classDefinition ifTrue:[
+ ^ self
+ ].
+ something == #classVariables ifTrue:[
+ ^ self
+ ].
+ something == #methodTrap ifTrue:[
+ ^ self
+ ].
+ something == #methodInClassRemoved ifTrue:[
+ ^ self.
+ ].
+ something == #methodDictionary ifTrue:[
+ ^ self
+ ].
+ something == #newClass ifTrue:[
+ ^ self
+ ].
+ ].
+
+ changedObject == slaveMode ifTrue:[
+ slaveMode value ~~ true ifTrue:[
+ listValid ~~ true ifTrue:[
+ self updateList.
+ ].
+ self updateOutputGenerator.
+ ].
+ ^ self.
+ ].
+
+ changedObject == selectionHolder ifTrue:[
+ listValid ifFalse:[
+ self updateList.
+ ].
+ ^ self selectionChanged
+ ].
+
+ changedObject == forceGeneratorTrigger ifTrue:[
+ self updateOutputGenerator.
+ ^ self.
+ ].
+
+ changedObject == hideUnloadedClasses ifTrue:[
+ self invalidateList.
+ slaveMode value ~~ true ifTrue:[
+ self updateOutputGenerator.
+ ].
+ ^ self.
+ ].
+
+ changedObject == updateTrigger ifTrue:[
+ self enqueueDelayedUpdateList.
+ ^ self
+ ].
+
+ changedObject == inGeneratorHolder ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+
+"/ changedObject == outGeneratorHolder ifTrue:[
+"/ self enqueueDelayedUpdateList.
+"/ ^ self
+"/ ].
+
+ changedObject == packageFilter ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+ changedObject == nameSpaceFilter ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+
+ changedObject == organizerMode ifTrue:[
+ ^ self
+ ].
+
+ self invalidateList.
+ ^ self
+
+ "Created: / 5.2.2000 / 13:42:06 / cg"
+ "Modified: / 18.8.2000 / 14:19:24 / cg"
+!
+
+enqueueDelayedUpdate:something with:aParameter from:changedObject
+ "support for delayed updates - to be invoked from a concrete classes
+ #update:with:from: method.
+ This will enqueue a delayed update, and resend #delayedUpdate:with:from:
+ whenever the receiver is handling events.
+ Especially useful, if many updates arrive at high frequency, to avoid
+ multiple redraws."
+
+ ^ self
+ enqueueMessage:#delayedUpdate:with:from:
+ for:self
+ arguments:(Array
+ with:something
+ with:aParameter
+ with:changedObject).
+!
+
+enqueueDelayedUpdateList
+ (NewSystemBrowser synchronousUpdate == true
+ or:[ immediateUpdate value == true ])
+ ifTrue:[
+ self updateList.
+ ^ self.
+ ].
+
+ self enqueueMessage:#updateList for:self arguments:#()
+!
+
+enqueueDelayedUpdateOutputGenerator
+ slaveMode value == true ifTrue:[
+ self halt:'should not be invoked'
+ ].
+ (NewSystemBrowser synchronousUpdate == true
+ or:[ immediateUpdate value == true ])
+ ifTrue:[
+ self updateOutputGenerator.
+ ^ self.
+ ].
+ listValid := false.
+ self enqueueMessage:#updateOutputGenerator for:self arguments:#()
+!
+
+forceReselect
+ |selectionHolder prevSelection|
+
+ selectionHolder := self selectionHolder.
+ prevSelection := selectionHolder value.
+ selectionHolder setValue:nil.
+ selectionHolder value:prevSelection.
+!
+
+forceSelectionClear
+ self selectionHolder setValue:nil
+!
+
+forceUpdateList
+ |listView|
+
+ listView := builder componentAt:#List.
+ listView notNil ifTrue:[
+ listView list:#()
+ ].
+ self updateList
+!
+
+immediateUpdate:aBooleanOrBooleanHolder
+ immediateUpdate := aBooleanOrBooleanHolder
+
+ "Created: / 13.2.2000 / 22:26:06 / cg"
+ "Modified: / 13.2.2000 / 22:28:09 / cg"
+!
+
+prioDelayedUpdate:something with:aParameter from:changedObject
+ Processor activeProcess withPriority:7 do:[
+ self delayedUpdate:something with:aParameter from:changedObject
+ ]
+!
+
+selectionChangeAllowed
+ selectionChangeCondition isNil ifTrue:[^ true].
+ selectionChangeCondition isBlock ifTrue:[
+ selectionChangeCondition numArgs == 1 ifTrue:[
+ ^ selectionChangeCondition value:self
+ ]
+ ].
+ ^ selectionChangeCondition value
+!
+
+selectionChanged
+ slaveMode value ~~ true ifTrue:[
+ self enqueueDelayedUpdateOutputGenerator
+ "/ self updateOutputGenerator.
+ ]
+
+ "Modified: / 4.2.2000 / 15:49:23 / cg"
+ "Created: / 5.2.2000 / 13:42:07 / cg"
+!
+
+selectionChangedByClick
+
+ "Created: / 25.2.2000 / 21:19:25 / cg"
+!
+
+syncDelayedUpdateList
+ |sensor|
+
+ sensor := self window sensor.
+ sensor isNil ifTrue:[
+ ^ self
+ ].
+
+ "/
+ "/ if an update is in the queue, process it.
+ "/
+ (sensor
+ hasEvent:#updateList
+ for:self
+ withArguments:#()
+ ) ifTrue:[
+ sensor flushEventsFor:self withType:#updateList.
+ self updateList.
+ ^ self
+ ].
+!
+
+update:something with:aParameter from:changedObject
+ (NewSystemBrowser synchronousUpdate == true
+ or:[ immediateUpdate value == true ])
+ ifTrue:[
+ self delayedUpdate:something with:aParameter from:changedObject.
+ ^ self.
+ ].
+
+"/ (changedObject == ChangeSet)
+"/ ifTrue:[
+"/ self delayedUpdate:something with:aParameter from:changedObject.
+"/ ^ self.
+"/ ].
+
+"/ changedObject == selectionHolder ifTrue:[
+"/ listValid ifFalse:[
+"/ self slaveMode value ifTrue:[
+"/ ^ self
+"/ ]
+"/ ]
+"/ ].
+
+ changedObject == inGeneratorHolder ifTrue:[
+ listValid := false.
+ ].
+ self enqueueDelayedUpdate:something with:aParameter from:changedObject.
+
+ "Created: / 5.2.2000 / 13:42:07 / cg"
+ "Modified: / 13.11.2001 / 11:30:19 / cg"
+! !
+
+!BrowserList methodsFor:'generators'!
+
+inGeneratorHolder
+ ^ inGeneratorHolder
+
+ "Created: / 5.2.2000 / 13:42:07 / cg"
+!
+
+inGeneratorHolder:aConditionBlockHolder
+ |prevHolder|
+
+ (prevHolder := inGeneratorHolder) notNil ifTrue:[
+ inGeneratorHolder removeDependent:self
+ ].
+ inGeneratorHolder := aConditionBlockHolder.
+ inGeneratorHolder notNil ifTrue:[
+ inGeneratorHolder addDependent:self
+ ].
+ (prevHolder isNil and:[inGeneratorHolder isNil]) ifFalse:[
+ (prevHolder value isNil
+ and:[
+ (inGeneratorHolder value isNil
+ or:[inGeneratorHolder value isArray
+ and:[inGeneratorHolder value size == 0]])])
+ ifFalse:[
+ self update:#value with:nil from:inGeneratorHolder
+ ].
+ ].
+!
+
+makeGenerator
+ self subclassResponsibility
+
+ "Created: / 5.2.2000 / 13:42:07 / cg"
+!
+
+outGeneratorHolder
+ outGeneratorHolder isNil ifTrue:[
+ outGeneratorHolder := ValueHolder new
+ ].
+ ^ outGeneratorHolder
+
+ "Modified: / 4.2.2000 / 17:17:16 / cg"
+ "Created: / 5.2.2000 / 13:42:07 / cg"
+!
+
+outGeneratorHolder:aConditionBlockHolder
+ outGeneratorHolder := aConditionBlockHolder.
+
+ "Created: / 5.2.2000 / 13:42:08 / cg"
+!
+
+updateOutputGenerator
+ "create a generator which enumerates my elements,
+ and place it into the outputGenerator holder"
+
+ self outGeneratorHolder value: self makeGenerator.
+
+ "Modified: / 4.2.2000 / 17:16:34 / cg"
+ "Created: / 5.2.2000 / 13:42:08 / cg"
+! !
+
+!BrowserList methodsFor:'icons'!
+
+abstractMethodIcon
+ "answer an icon to mark abstract methods"
+
+ ^ self fetchIcon:#abstractMethod selector:#abstractMethodIcon
+!
+
+canvasIcon
+ "answer an icon to mark canvas spec methods"
+
+ ^ self fetchIcon:#canvas selector:#canvasIcon
+
+!
+
+fetchIcon:name selector:fetchSelector
+ "answer an icon to mark breakPointed methods"
+
+ icons isNil ifTrue:[icons := IdentityDictionary new].
+ Icons isNil ifTrue:[Icons := IdentityDictionary new].
+
+ ^ icons at:name ifAbsentPut:[
+ |fh icn h|
+
+ (icn := Icons at:name ifAbsent:nil) isNil ifTrue: [
+ Icons at:name put:(icn := (SystemBrowser perform:fetchSelector) onDevice:Display).
+ icn clearMaskedPixels.
+ ].
+ h := icn height.
+ h > (fh := SelectionInListView defaultFont heightOn:device) ifTrue:[
+ icn := icn magnifiedBy:(fh / h)
+ ].
+ icn onDevice:device
+ ]
+
+ "
+ Icons := nil
+ Icon flushCachedIcons
+ "
+!
+
+fileImageIcon
+ "answer an icon to mark file-image spec methods"
+
+ ^ self fetchIcon:#fileImage selector:#fileImageIcon
+!
+
+helpIcon
+ "answer an icon to mark help spec methods"
+
+ ^ self fetchIcon:#help selector:#helpIcon
+
+!
+
+hierarchicalListIcon
+ "answer an icon to mark hierarchicalList spec methods"
+
+ ^ self fetchIcon:#hierarchicalList selector:#hierarchicalListIcon
+
+!
+
+imageIcon
+ "answer an icon to mark image spec methods"
+
+ ^ self fetchIcon:#image selector:#imageIcon
+!
+
+menuIcon
+ "answer an icon to mark menu spec methods"
+
+ ^ self fetchIcon:#menu selector:#menuIcon
+
+!
+
+methodEmptyInheritedIcon
+ ^ self fetchIcon:#methodEmptyInherited selector:#methodEmptyInheritedIcon
+!
+
+methodInheritedFromAboveAndRedefinedBelowIcon
+ ^ self fetchIcon:#methodInheritedFromAboveAndRedefinedBelow selector:#methodInheritedFromAboveAndRedefinedBelowIcon
+!
+
+methodInheritedFromAboveIcon
+ ^ self fetchIcon:#methodInheritedFromAbove selector:#methodInheritedFromAboveIcon
+!
+
+methodRedefinedBelowIcon
+ ^ self fetchIcon:#methodRedefinedBelow selector:#methodRedefinedBelowIcon
+!
+
+privateMethodIcon
+ "answer an icon to mark private methods"
+
+ ^ self fetchIcon:#privateMethod selector:#privateMethodIcon
+!
+
+programImageIcon
+ "answer an icon to mark image spec methods"
+
+ ^ self fetchIcon:#programImage selector:#programImageIcon
+!
+
+programMenuIcon
+ "answer an icon to mark program generated menu methods"
+
+ ^ self fetchIcon:#programMenu selector:#programMenuIcon
+
+!
+
+protectedMethodIcon
+ "answer an icon to mark protected methods"
+
+ ^ self fetchIcon:#protectedMethod selector:#protectedMethodIcon
+!
+
+stopIcon
+ "answer an icon to mark breakPointed methods"
+
+ ^ self fetchIcon:#stop selector:#stopIcon
+
+
+!
+
+tabListIcon
+ "answer an icon to mark tabList spec methods"
+
+ ^ self fetchIcon:#tabList selector:#tabListIcon
+
+!
+
+tableColumnsIcon
+ "answer an icon to mark tableColumns spec methods"
+
+ ^ self fetchIcon:#tableColumns selector:#tableColumnsIcon
+
+!
+
+timeIcon
+ "answer an icon to mark timed methods"
+
+ ^ self fetchIcon:#time selector:#timeIcon
+
+!
+
+traceIcon
+ "answer an icon to mark traced methods"
+
+"/ ^ self fetchIcon:#watch selector:#watchIcon
+ ^ self fetchIcon:#trace selector:#traceIcon
+! !
+
+!BrowserList methodsFor:'misc'!
+
+invalidateList
+ listValid := false.
+ slaveMode value ~~ true ifTrue:[
+ self enqueueDelayedUpdateList.
+ ]
+!
+
+resources
+ |master|
+
+ (master := self masterApplication) notNil ifTrue:[^ master resources].
+ ^ super resources
+! !
+
+!BrowserList methodsFor:'private'!
+
+browserNameList
+ self subclassResponsibility
+!
+
+classesToProcessForClasses:classes withVisibility:visibility
+ |classesToProcess classesToProcessInOrder|
+
+ visibility isNil ifTrue:[^classes].
+ visibility == #class ifTrue:[^classes].
+
+ classesToProcess := IdentitySet new.
+ classesToProcessInOrder := OrderedCollection new.
+ classes notNil ifTrue:[
+ classes do:[:eachClass |
+ |withAllSupers|
+
+ withAllSupers := eachClass withAllSuperclasses.
+ visibility == #allButObject ifTrue:[
+ eachClass isMeta ifTrue:[
+ withAllSupers removeAllFoundIn:(Object class withAllSuperclasses)
+ ] ifFalse:[
+ withAllSupers remove:Object ifAbsent:nil
+ ]
+ ].
+ withAllSupers do:[:each |
+ (classesToProcess includes:each) ifFalse:[
+ classesToProcess add:each.
+ classesToProcessInOrder add:each.
+ ]
+ ]
+ ].
+ ].
+ ^ classesToProcessInOrder
+!
+
+colorizeForChangedCode:someString
+ ^ someString asText emphasisAllAdd:(UserPreferences current emphasisForChangedCode)
+
+ "Created: / 31.10.2001 / 10:17:56 / cg"
+!
+
+colorizeForDifferentPackage:someString
+ ^ someString asText emphasisAllAdd:(UserPreferences current emphasisForDifferentPackage)
+!
+
+colorizeGrey:someString
+ ^ someString asText emphasisAllAdd:(#color->Color darkGrey)
+!
+
+emphasizeForChangedCode:someString
+ ^ self colorizeForChangedCode:someString
+
+ "Modified: / 31.10.2001 / 10:18:57 / cg"
+!
+
+emphasizeForDifferentPackage:someString
+ ^ self colorizeForDifferentPackage:(' [' , (' ' , someString , ' ') allItalic , ']')
+
+ "Modified: / 31.10.2001 / 10:13:35 / cg"
+!
+
+inSlaveModeOrInvisible
+ (self slaveMode value == true) ifTrue:[^ true].
+"/ self slaveMode value isNil ifTrue:[
+"/ self window shown ifFalse:[
+"/ ^ true
+"/ ].
+"/ ].
+ ^ false
+!
+
+isClass:aClass shownWithNameSpaceFilter:nameSpaceFilter
+ |nsName|
+
+ nameSpaceFilter isNil ifTrue:[^ true].
+ nsName := aClass topNameSpace name.
+
+ (nameSpaceFilter includes:nsName) ifTrue:[^ true].
+ (nameSpaceFilter contains:[:ns | nsName startsWith:(ns , '::')]) ifTrue:[^ true].
+ ^ false
+!
+
+isClass:aClass shownWithPackageFilter:packageFilter
+ packageFilter isNil ifTrue:[^ true].
+ (packageFilter includes:aClass package) ifTrue:[^ true].
+
+ aClass instAndClassSelectorsAndMethodsDo:[:sel :mthd |
+ (packageFilter includes:mthd package) ifTrue:[^ true].
+ ].
+ ^ false
+!
+
+makeDependent
+ self subclassResponsibility
+
+ "Created: / 5.2.2000 / 13:42:08 / cg"
+!
+
+makeIndependent
+ self subclassResponsibility
+
+ "Created: / 5.2.2000 / 13:42:08 / cg"
+!
+
+release
+ self makeIndependent.
+ super release.
+
+ filter removeDependent:self.
+ forceGeneratorTrigger removeDependent:self.
+ hideUnloadedClasses removeDependent:self.
+ inGeneratorHolder removeDependent:self.
+ nameSpaceFilter removeDependent:self.
+ organizerMode removeDependent:self.
+ packageFilter removeDependent:self.
+ selectionHolder removeDependent:self.
+ showClassPackages removeDependent:self.
+ slaveMode removeDependent:self.
+ sortBy removeDependent:self.
+ updateTrigger removeDependent:self.
+
+ "Created: / 5.2.2000 / 13:42:09 / cg"
+ "Modified: / 13.2.2000 / 23:32:23 / cg"
+!
+
+releaseAsSubCanvas
+ self makeIndependent.
+ super releaseAsSubCanvas.
+
+ "Created: / 13.2.2000 / 23:11:29 / cg"
+ "Modified: / 13.2.2000 / 23:32:29 / cg"
+!
+
+updateList
+ self subclassResponsibility.
+!
+
+updateListFor:newList
+ "update the browsers list in a way which avoids scrolls
+ and flicker; returns true, if the newList is the same."
+
+ |"oldListSize newListSize" sameContents sameStrings oldEntry browserNameList
+ "firstDifferentFromBeginning firstDifferentFromEnd" listView prevMode sav|
+
+ browserNameList := self browserNameList value.
+ sameContents := sameStrings := (newList size == browserNameList size).
+
+ sameContents ifTrue:[
+ newList with:browserNameList do:[:newLine :oldLine |
+ sameStrings ifTrue:[
+ sameStrings := ((newLine ? '') = (oldLine ? '')).
+ ].
+ sameContents ifTrue:[
+ ((newLine ? '') sameStringAndEmphasisAs:(oldLine ? '')) ifFalse:[
+ sameContents := false
+ ]
+ ].
+ ]
+ ].
+
+ listView := builder componentAt:#List.
+ listView isNil ifTrue:[
+ "/ called early during setup ...
+ browserNameList contents:newList.
+ ^ sameContents.
+ ].
+
+ sameContents ifTrue:[
+ ^ sameContents
+ ].
+ sameStrings ifTrue:[
+ newList keysAndValuesDo:[:lineNr :line |
+ oldEntry := browserNameList at:lineNr.
+ (oldEntry sameStringAndEmphasisAs:line) ifFalse:[
+ browserNameList at:lineNr put:line.
+ ]
+ ].
+ ^ sameContents
+ ].
+
+ listView := listView scrolledView.
+ listView isNil ifTrue:[self halt. ^ self].
+ prevMode := listView scrollWhenUpdating.
+ listView scrollWhenUpdating:nil.
+
+ [
+ "/ dont want to be called if selection is changed by selListView
+ sav := listView action.
+ listView action:nil.
+ browserNameList contents:newList.
+ ] ensure:[
+ listView action:sav.
+ ].
+
+ listView scrollWhenUpdating:prevMode.
+ ^ sameContents.
+
+"/ oldListSize := browserNameList size.
+"/ newListSize := newList size.
+"/ newListSize == 0 ifTrue:[
+"/ oldListSize == 0 ifTrue:[
+"/ ^ true "/ same
+"/ ].
+"/ browserNameList removeAll.
+"/ ^ false "/ not same
+"/ ].
+"/
+"/ oldListSize == 0 ifTrue:[
+"/ browserNameList contents:newList.
+"/ ^ false. "/ not same
+"/ ].
+"/
+"/ (newListSize between:(oldListSize-1) and:(oldListSize+1)) ifTrue:[
+"/ "/ individually exchange changed lines, to avoid flicker.
+"/ "/ the old code was: self browserNameList value:newList
+"/ "/ but if only a single method is changed (or an instrumentation icon changes),
+"/ "/ this results in avoidable flicker.
+"/
+"/ newListSize > oldListSize ifTrue:[
+"/ "/ an entry seems to be added
+"/ "/ try to find it.
+"/ firstDifferentFromBeginning := 1.
+"/
+"/ [firstDifferentFromBeginning <= oldListSize
+"/ and:[(newList at:firstDifferentFromBeginning) sameStringAndEmphasisAs: (browserNameList at:firstDifferentFromBeginning)]]
+"/ whileTrue:[
+"/ firstDifferentFromBeginning := firstDifferentFromBeginning + 1.
+"/ ].
+"/ firstDifferentFromEnd := newListSize.
+"/ [firstDifferentFromEnd >= 1
+"/ and:[(newList at:firstDifferentFromEnd) sameStringAndEmphasisAs: (browserNameList at:firstDifferentFromEnd-1)]]
+"/ whileTrue:[
+"/ firstDifferentFromEnd := firstDifferentFromEnd - 1.
+"/ ].
+"/ (firstDifferentFromEnd - firstDifferentFromBeginning) > (newList size // 10) ifTrue:[
+"/ "/ too many differences - exchange the list en-bloque
+"/ browserNameList contents:newList.
+"/ ^ false. "/ not same
+"/ ].
+"/ "/ entries from firstDifferentFromBeginning to firstDifferentFromEnd in newList are different
+"/
+"/ (firstDifferentFromEnd - firstDifferentFromBeginning + 1 "number of different items") == (newListSize - oldListSize) ifTrue:[
+"/ "/ for now, only handle single-added-item case
+"/ firstDifferentFromEnd ~~ firstDifferentFromBeginning ifTrue:[
+"/ self halt
+"/ ].
+"/
+"/ "/ item at firstDifferentFromBeginning has been inserted.
+"/ browserNameList add:(newList at:firstDifferentFromBeginning) beforeIndex:firstDifferentFromEnd.
+"/ ^ false "/ not the same
+"/ ].
+"/ ] ifFalse:[
+"/ newListSize < oldListSize ifTrue:[
+"/ "/ an entry seems to be removed
+"/ "/ try to find it.
+"/ firstDifferentFromBeginning := 1.
+"/
+"/ [firstDifferentFromBeginning <= newListSize
+"/ and:[(newList at:firstDifferentFromBeginning) sameStringAndEmphasisAs: (browserNameList at:firstDifferentFromBeginning)]]
+"/ whileTrue:[
+"/ firstDifferentFromBeginning := firstDifferentFromBeginning + 1.
+"/ ].
+"/ firstDifferentFromEnd := newListSize.
+"/ [firstDifferentFromEnd >= 1
+"/ and:[(newList at:firstDifferentFromEnd) sameStringAndEmphasisAs: (browserNameList at:firstDifferentFromEnd+1)]]
+"/ whileTrue:[
+"/ firstDifferentFromEnd := firstDifferentFromEnd - 1.
+"/ ].
+"/ (firstDifferentFromEnd - firstDifferentFromBeginning) > (newList size // 10) ifTrue:[
+"/ "/ too many differences - exchange the list en-bloque
+"/ browserNameList contents:newList.
+"/ ^ false. "/ not same
+"/ ].
+"/ "/ entries from firstDifferentFromBeginning to firstDifferentFromEnd in newList are different
+"/
+"/ (firstDifferentFromBeginning - firstDifferentFromEnd) == (oldListSize - newListSize) ifTrue:[
+"/ "/ for now, only handle single-removed-item case
+"/ firstDifferentFromEnd ~~ (firstDifferentFromBeginning-1) ifTrue:[self halt].
+"/
+"/ "/ item at firstDifferentFromBeginning has been removed.
+"/ browserNameList removeFromIndex:firstDifferentFromBeginning toIndex:firstDifferentFromBeginning.
+"/ ^ false "/ not the same
+"/ ].
+"/ ]
+"/ ].
+"/
+"/ sameContents := true.
+"/ newList keysAndValuesDo:[:lineNr :line |
+"/ lineNr > browserNameList size ifTrue:[
+"/ browserNameList add:line.
+"/ sameContents := false.
+"/ ] ifFalse:[
+"/ oldEntry := browserNameList at:lineNr.
+"/ (oldEntry ~= line
+"/ or:[(oldEntry sameStringAndEmphasisAs:line) not]) ifTrue:[
+"/ browserNameList at:lineNr put:line.
+"/ sameContents := false.
+"/ ]
+"/ ]
+"/ ].
+"/ newList size < browserNameList size ifTrue:[
+"/ browserNameList removeFromIndex:(newList size + 1) toIndex:(browserNameList size).
+"/ sameContents := false.
+"/ ].
+"/ ^ sameContents
+"/ ].
+"/
+"/ browserNameList contents:newList.
+"/ ^ false "/ not the same
+! !
+
+!BrowserList methodsFor:'setup'!
+
+commonPostBuildWith:aBuilder
+ |list|
+
+ self slaveMode value == true ifFalse:[
+ self updateList.
+ ] ifTrue:[
+ self invalidateList
+ ].
+
+ self makeDependent.
+
+ list := aBuilder componentAt:#List.
+ list notNil ifTrue:[
+ list selectConditionBlock:[:item | self selectionChangeAllowed].
+ list ignoreReselect:false.
+ ].
+
+ "Modified: / 13.11.2001 / 10:27:49 / cg"
+!
+
+postBuildAsSubcanvasWith:aBuilder
+ self commonPostBuildWith:aBuilder.
+ super postBuildAsSubcanvasWith:aBuilder.
+!
+
+postBuildWith:aBuilder
+ self commonPostBuildWith:aBuilder.
+ super postBuildWith:aBuilder.
+
+ "Modified: / 4.2.2000 / 22:59:45 / cg"
+ "Created: / 5.2.2000 / 13:42:09 / cg"
+! !
+
+!BrowserList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_BrowserList.st,v 1.1 2004-02-26 18:54:59 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_ClassCategoryList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,758 @@
+"{ Package: 'stx:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+BrowserList subclass:#ClassCategoryList
+ instanceVariableNames:'categoryList classes allSelected'
+ classVariableNames:'AdditionalEmptyCategories'
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!ClassCategoryList class methodsFor:'documentation'!
+
+documentation
+"
+ embeddable application displaying the class-categories.
+ Provides an outputGenerator, which enumerates the classes in
+ the selected categories.
+
+ [author:]
+ Claus Gittinger (cg@exept.de)
+"
+! !
+
+!ClassCategoryList class methodsFor:'interface specs'!
+
+singleCategoryWindowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:ClassCategoryList andSelector:#singleCategoryWindowSpec
+ ClassCategoryList new openInterface:#singleCategoryWindowSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #singleCategoryWindowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ClassCategoryList'
+ #name: 'ClassCategoryList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 218 175 518 475)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#LabelSpec
+ #label: 'ClassCategoryName'
+ #name: 'ClassCategoryLabel'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #translateLabel: true
+ #labelChannel: #classCategoryLabelHolder
+ #menu: #menuHolder
+ )
+ )
+
+ )
+ )
+!
+
+windowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:ClassCategoryList andSelector:#windowSpec
+ ClassCategoryList new openInterface:#windowSpec
+ ClassCategoryList open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ClassCategoryList'
+ #name: 'ClassCategoryList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 13 23 313 323)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SequenceViewSpec
+ #name: 'List'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #tabable: true
+ #model: #selectedCategories
+ #menu: #menuHolder
+ #hasHorizontalScrollBar: true
+ #hasVerticalScrollBar: true
+ #miniScrollerHorizontal: true
+ #isMultiSelect: true
+ #valueChangeSelector: #selectionChangedByClick
+ #useIndex: false
+ #sequenceList: #categoryList
+ #doubleClickChannel: #doubleClickChannel
+ #properties:
+ #(#PropertyListDictionary
+ #dragArgument: nil
+ #dropArgument: nil
+ #canDropSelector: #canDrop:
+ #dropSelector: #doDrop:
+ )
+ )
+ )
+
+ )
+ )
+
+ "Created: / 5.2.2000 / 13:42:11 / cg"
+ "Modified: / 18.8.2000 / 20:11:49 / cg"
+! !
+
+!ClassCategoryList class methodsFor:'plugIn spec'!
+
+aspectSelectors
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this. If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "Return a description of exported aspects;
+ these can be connected to aspects of an embedding application
+ (if this app is embedded in a subCanvas)."
+
+ ^ #(
+ #(#doubleClickChannel #action )
+ #forceGeneratorTrigger
+ #hideUnloadedClasses
+ #immediateUpdate
+ #inGeneratorHolder
+ #menuHolder
+ #nameSpaceFilter
+ #organizerMode
+ #outGeneratorHolder
+ #packageFilter
+ #selectedCategories
+ #selectionChangeCondition
+ #slaveMode
+ #updateTrigger
+ ).
+
+! !
+
+!ClassCategoryList methodsFor:'aspects'!
+
+categoryList
+ categoryList isNil ifTrue:[
+ categoryList := ValueHolder new.
+ ].
+ ^ categoryList
+
+ "Created: / 25.2.2000 / 02:23:08 / cg"
+!
+
+categoryList:aValueHolder
+ categoryList notNil ifTrue:[
+ categoryList removeDependent:self
+ ].
+ categoryList := aValueHolder.
+ categoryList notNil ifTrue:[
+ categoryList addDependent:self
+ ].
+
+ "Created: / 18.8.2000 / 15:21:42 / cg"
+!
+
+classCategoryLabelHolder
+ ^ self pseudoListLabelHolder
+!
+
+selectedCategories
+ ^ self selectionHolder
+!
+
+selectedCategories:aValueHolder
+ ^ self selectionHolder:aValueHolder
+! !
+
+!ClassCategoryList methodsFor:'change & update'!
+
+delayedUpdate:something with:aParameter from:changedObject
+ |selectedCategoriesHolder selectedCategories allSelectedBefore
+ nameListEntryForALL categoryOfClass wg|
+
+ selectedCategories := self selectedCategoriesStrings.
+
+ changedObject == Smalltalk ifTrue:[
+ ((something == #classVariables)
+ or:[something == #classDefinition]) ifTrue:[
+ listValid == true ifTrue:[
+ categoryOfClass := aParameter category.
+ (categoryList value includes:categoryOfClass) ifFalse:[
+ self invalidateList.
+ ].
+ slaveMode value ~~ true ifTrue:[
+ (selectedCategories includes:categoryOfClass) ifTrue:[
+ "/ a selected class has changed
+ "/ in order to give others a chance to update their list before,
+ "/ this one is always enqueued for delayed update (even if immediateUpdate is true)
+ "/ self enqueueDelayedUpdateOutputGenerator
+ self enqueueMessage:#updateOutputGenerator for:self arguments:#()
+ ].
+ ].
+ ].
+ ^ self
+ ].
+ something == #newClass ifTrue:[
+ categoryOfClass := aParameter category.
+"/ listValid == true ifTrue:[
+ (categoryList value includes:categoryOfClass) ifFalse:[
+ self invalidateList.
+ ].
+"/ ].
+ slaveMode value ~~ true ifTrue:[
+ (selectedCategories includes:categoryOfClass) ifTrue:[
+ self enqueueDelayedUpdateOutputGenerator
+ ].
+ ].
+ ^ self
+ ].
+
+ self invalidateList.
+
+ (something == #classRemove
+ or:[something == #projectOrganization
+ or:[something == #organization]]) ifTrue:[
+ slaveMode value ~~ true ifTrue:[
+ "/ sorry: cannot filter on category (already changed to #removed)
+ self enqueueDelayedUpdateOutputGenerator
+ ].
+ ].
+ ^ self
+ ].
+
+ changedObject == ChangeSet ifTrue:[
+ "/ remove all other change notifications from the eventQueue
+ wg := self windowGroup.
+ wg isNil ifTrue:[
+ "/ oops - should no longer be dependent...
+ changedObject removeDependent:self.
+ ] ifFalse:[
+ wg sensor
+ flushEventsFor:self
+ where:[:ev | ev isMessageSendEvent
+ and:[ev selector == #delayedUpdate:with:from:
+ and:[(ev arguments at:3) == ChangeSet]]].
+ ].
+
+ something == #addChange: ifTrue:[
+ "/ only need to invalidate, if that change changes my emphasis
+ "/ (i.e. if its a new methodChange)
+"/ self invalidateList.
+
+ aParameter isMethodChange ifTrue:[
+ (ChangeSet current
+ count:[:chg | chg notNil and:[chg isMethodChange
+ and:[ chg className = aParameter className ]]])
+ == 1 ifTrue:[
+ "/ that methodChange is the first for this method.
+ aParameter changeClass ifNotNil:[
+ self colorizeCategoryAsChanged:(aParameter changeClass category).
+ ]
+ ]
+ ].
+ ^ self
+ ].
+
+ self invalidateList.
+ ^ self
+ ].
+
+ changedObject == nameSpaceFilter ifTrue:[
+ "/ all might be more or less than before ...
+ allSelected := false.
+ ].
+ changedObject == packageFilter ifTrue:[
+ "/ all might be more or less than before ...
+ allSelected := false.
+ ].
+
+ selectedCategoriesHolder := self selectedCategories.
+ changedObject == selectedCategoriesHolder ifTrue:[
+ categoryList isNil ifTrue:[
+ "/ oops - hurry up
+ self invalidateList.
+ ].
+
+ nameListEntryForALL := self class nameListEntryForALL.
+
+ selectedCategories size > 1 ifTrue:[
+ (selectedCategories includes:nameListEntryForALL) ifTrue:[
+ self makeSelectionOtherThanAllVisible.
+ ]
+ ].
+
+ "/ if all selected before AND allSelected after, no need to update the output generator
+ allSelectedBefore := allSelected ? false.
+ allSelected := selectedCategories includes:nameListEntryForALL.
+ (allSelectedBefore and:[allSelected]) ifTrue:[
+ ^ self
+ ].
+ ].
+
+ super delayedUpdate:something with:aParameter from:changedObject
+
+ "Created: / 5.2.2000 / 13:42:12 / cg"
+ "Modified: / 12.11.2001 / 19:36:16 / cg"
+!
+
+forceUpdateList
+ self categoryList setValue:#().
+ self updateList.
+ self categoryList changed.
+!
+
+selectionChangedByClick
+ "we are not interested in that - get another notification
+ via the changed valueHolder"
+
+ "Created: / 11.2.2000 / 11:39:48 / cg"
+!
+
+update:something with:aParameter from:changedObject
+ |categoryOfClass|
+
+ changedObject == Smalltalk ifTrue:[
+ something == #methodDictionary ifTrue:[
+ ^ self
+ ].
+ something == #classComment ifTrue:[
+ ^ self.
+ ].
+ (something == #classVariables
+ or:[something == #classDefinition]) ifTrue:[
+ categoryOfClass := aParameter category.
+ ((self selectedCategories value ? #()) includes:categoryOfClass) ifTrue:[
+"/ self halt.
+ self updateOutputGenerator.
+ ].
+ ].
+ something == #methodTrap ifTrue:[
+ ^ self
+ ].
+ something == #methodInClass ifTrue:[
+ ^ self
+ ].
+ something == #methodInClassRemoved ifTrue:[
+ ^ self
+ ].
+ ].
+
+"/ changedObject == ChangeSet ifTrue:[
+"/ something == #addChange: ifTrue:[
+"/ ^ self
+"/ ]
+"/ ].
+
+ super update:something with:aParameter from:changedObject
+
+ "Modified: / 5.11.2001 / 14:31:18 / cg"
+! !
+
+!ClassCategoryList methodsFor:'drag & drop'!
+
+canDrop:aDropContext
+ |cat classes|
+
+ classes := aDropContext dropObjects collect:[:obj | obj theObject].
+ (classes contains:[:aClass | aClass isClass not]) ifTrue:[^ false].
+ (classes contains:[:aClass | aClass isPrivate not]) ifFalse:[^ false].
+
+ cat := self categoryAtTargetPointOf:aDropContext.
+ cat isNil ifTrue:[
+ ^ false
+ ].
+ cat = '* obsolete *' ifTrue:[
+ ^ false
+ ].
+
+ (classes contains:[:aClass | aClass category ~= cat]) ifFalse:[^ false].
+ ^ true.
+!
+
+categoryAtTargetPointOf:aDropContext
+ |p categoryListView lineNr cat|
+
+ p := aDropContext targetPoint.
+
+ categoryListView := aDropContext targetWidget.
+
+ lineNr := categoryListView lineAtY:p y.
+ lineNr isNil ifTrue:[^ nil].
+
+ cat := categoryList value at:lineNr.
+ cat := cat string.
+ cat = self class nameListEntryForALL ifTrue:[^ nil].
+
+ ^ cat
+!
+
+doDrop:aDropContext
+ |cat classes|
+
+ classes := aDropContext dropObjects collect:[:aDropObject | aDropObject theObject].
+ (classes contains:[:something | something isClass not]) ifTrue:[^ self].
+
+ cat := self categoryAtTargetPointOf:aDropContext.
+ cat notNil ifTrue:[
+ self masterApplication moveClasses:classes toCategory:cat.
+ ].
+! !
+
+!ClassCategoryList methodsFor:'generators'!
+
+makeGenerator
+ "return a generator which enumerates the classes from the selected category."
+
+ |cats hideUnloadedClasses allName nameSpaceFilter packageFilter|
+
+ cats := self selectedCategories value.
+ cats size == 0 ifTrue:[
+ ^ #()
+ ].
+ cats := cats collect:[:each | each string].
+
+ allName := self class nameListEntryForALL.
+
+ hideUnloadedClasses := self hideUnloadedClasses value ? false.
+ nameSpaceFilter := self nameSpaceFilter value.
+ nameSpaceFilter notNil ifTrue:[
+ (nameSpaceFilter includes:allName) ifTrue:[nameSpaceFilter := nil].
+ ].
+ packageFilter := self packageFilter value.
+ packageFilter notNil ifTrue:[
+ (packageFilter includes:allName) ifTrue:[packageFilter := nil].
+ ].
+
+ (cats includes:allName) ifTrue:[
+ hideUnloadedClasses ifTrue:[
+ ^ Iterator on:[:whatToDo |
+ Smalltalk allClassesDo:[:cls |
+ cls isLoaded ifTrue:[
+ (cls isNameSpace not or:[cls == Smalltalk]) ifTrue:[
+ (nameSpaceFilter isNil
+ or:[self isClass:cls shownWithNameSpaceFilter:nameSpaceFilter]) ifTrue:[
+ (packageFilter isNil
+ or:[self isClass:cls shownWithPackageFilter:packageFilter]) ifTrue:[
+ whatToDo value:cls
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ].
+ ^ Iterator on:[:whatToDo |
+ Smalltalk allClassesDo:[:cls |
+ (cls isNameSpace not or:[cls == Smalltalk]) ifTrue:[
+ (nameSpaceFilter isNil
+ or:[self isClass:cls shownWithNameSpaceFilter:nameSpaceFilter]) ifTrue:[
+ (packageFilter isNil
+ or:[self isClass:cls shownWithPackageFilter:packageFilter]) ifTrue:[
+ whatToDo value:cls
+ ]
+ ]
+ ]
+ ]
+ ]
+ ].
+
+ ^ Iterator on:[:whatToDo |
+ Smalltalk allClassesDo:[:cls |
+ (hideUnloadedClasses not or:[cls isLoaded])
+ ifTrue:[
+ (cls isNameSpace not or:[cls == Smalltalk]) ifTrue:[
+ (cats includes:cls category) ifTrue:[
+ (nameSpaceFilter isNil
+ or:[self isClass:cls shownWithNameSpaceFilter:nameSpaceFilter]) ifTrue:[
+ (packageFilter isNil
+ or:[self isClass:cls shownWithPackageFilter:packageFilter]) ifTrue:[
+ whatToDo value:cls
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+
+ "Created: / 5.2.2000 / 13:42:12 / cg"
+ "Modified: / 18.8.2000 / 15:52:41 / cg"
+! !
+
+!ClassCategoryList methodsFor:'private'!
+
+colorizeCategoryAsChanged:category
+ |colorizedCategoryItem categoryList idx|
+
+ colorizedCategoryItem := self colorizeForChangedCode:category copy asText.
+
+ categoryList := self categoryList value.
+ idx := categoryList indexOf:category.
+ idx ~~ 0 ifTrue:[
+ ((categoryList at:idx) sameStringAndEmphasisAs:colorizedCategoryItem) ifFalse:[
+ categoryList at:idx put:colorizedCategoryItem.
+ self categoryList changed.
+ ]
+ ].
+!
+
+listOfCategories
+ |categories hideUnloadedClasses generator nameSpaceFilter packageFilter allName
+ categoriesWithExtensions categoriesWithChangedCode classesInCangeSet|
+
+ allName := self class nameListEntryForALL.
+
+ hideUnloadedClasses := self hideUnloadedClasses value.
+ nameSpaceFilter := self nameSpaceFilter value.
+ nameSpaceFilter notNil ifTrue:[
+ (nameSpaceFilter includes:allName) ifTrue:[nameSpaceFilter := nil].
+ ].
+ packageFilter := self packageFilter value.
+ packageFilter notNil ifTrue:[
+ (packageFilter includes:allName) ifTrue:[packageFilter := nil].
+ ].
+
+ categories := Set new.
+ categoriesWithExtensions := Set new.
+ categoriesWithChangedCode := Set new.
+
+ classesInCangeSet := ChangeSet current changedClasses.
+ classesInCangeSet := classesInCangeSet collect:[:eachClass | eachClass theNonMetaclass].
+
+ classes := IdentitySet new.
+ inGeneratorHolder isNil ifTrue:[
+ Smalltalk allClassesDo:[:cls |
+ |cat|
+
+ (hideUnloadedClasses not or:[cls isLoaded])
+ ifTrue:[
+ (cls isNameSpace not
+ or:[cls == Smalltalk]) ifTrue:[
+ (nameSpaceFilter isNil
+ or:[self isClass:cls shownWithNameSpaceFilter:nameSpaceFilter]) ifTrue:[
+ (packageFilter isNil
+ or:[self isClass:cls shownWithPackageFilter:packageFilter]) ifTrue:[
+ cat := cls category.
+ cat isString ifFalse:[self halt:'oops - strange category'].
+ categories add:cat.
+ classes add:cls.
+
+ (classesInCangeSet includes:cls theNonMetaclass) ifTrue:[
+ categoriesWithChangedCode add:cat
+ ] ifFalse:[
+ cls hasExtensions ifTrue:[
+ categoriesWithExtensions add:cat
+ ]
+ ].
+ ]
+ ]
+ ]
+ ]
+ ].
+
+ "/ those are simulated - in ST/X, empty categories do not
+ "/ really exist; however, during browsing, it makes sense.
+ AdditionalEmptyCategories size > 0 ifTrue:[
+ "/ remove those that are present ...
+ AdditionalEmptyCategories := AdditionalEmptyCategories select:[:cat | (categories includes:cat) not].
+ categories addAll:AdditionalEmptyCategories.
+ ].
+ ] ifFalse:[
+ generator := inGeneratorHolder value.
+ generator isNil ifTrue:[^ #() ].
+ generator do:[:cat | categories add:cat].
+ ].
+
+ categories := categories asOrderedCollection.
+
+ categories sort.
+ categories := categories collect:[:cat |
+ (categoriesWithChangedCode includes:cat) ifTrue:[
+ (self colorizeForChangedCode:cat copy asText).
+ "/ cannot add a + here - need separate list for presentation and filter
+ ] ifFalse:[
+ (categoriesWithExtensions includes:cat) ifTrue:[
+ (self colorizeForDifferentPackage:cat copy asText)
+ "/ cannot add a + here - need separate list for presentation and filter
+ ] ifFalse:[
+ cat
+ ]
+ ]
+ ].
+ categories size == 1 ifTrue:[
+ self classCategoryLabelHolder value:(categories first)
+ ].
+ categories size == 0 ifFalse:[
+ categories addFirst:(self class nameListEntryForALL).
+ ].
+ ^ categories
+
+ "Created: / 5.2.2000 / 13:42:12 / cg"
+ "Modified: / 13.11.2001 / 11:32:36 / cg"
+!
+
+listView
+ ^ self builder componentAt:#List
+!
+
+makeDependent
+ Smalltalk addDependent:self.
+ ChangeSet addDependent:self.
+
+ "Created: / 5.2.2000 / 13:42:13 / cg"
+!
+
+makeIndependent
+ Smalltalk removeDependent:self.
+ ChangeSet removeDependent:self.
+
+ "Created: / 5.2.2000 / 13:42:13 / cg"
+!
+
+makeItemVisible:item
+ |idx listView|
+
+ idx := categoryList value indexOf:item.
+ idx ~~ 0 ifTrue:[
+ (listView := self listView) notNil ifTrue:[
+ listView makeLineVisible:idx.
+ ]
+ ]
+!
+
+makeSelectionOtherThanAllVisible
+ |selectedCategories item|
+
+ selectedCategories := self selectedCategoriesStrings.
+ "/ the first item after the *all* item
+ item := (selectedCategories copy remove:self class nameListEntryForALL; yourself) first.
+ self makeItemVisible:item.
+!
+
+release
+ super release.
+
+ categoryList removeDependent:self.
+!
+
+selectedCategoriesStrings
+ |selectedCategoriesHolder selectedCategories|
+
+ selectedCategoriesHolder := self selectedCategories.
+ selectedCategories := selectedCategoriesHolder value ? #().
+ selectedCategories := selectedCategories collect:[:each | each string].
+ ^ selectedCategories
+!
+
+updateList
+ |oldList newList oldSelection newSelection prevClasses
+ selectedCategoriesHolder|
+
+ selectedCategoriesHolder := self selectedCategories.
+ oldSelection := selectedCategoriesHolder value ? #().
+ prevClasses := classes copy.
+
+ newList := self listOfCategories.
+ oldList := (self categoryList value) ? #().
+ (newList sameContentsAs:oldList whenComparedWith:[:a :b | a sameStringAndEmphasisAs: b])
+ ifFalse:[
+ oldSelection size > 0 ifTrue:[
+ selectedCategoriesHolder removeDependent:self.
+ selectedCategoriesHolder value:#().
+ selectedCategoriesHolder addDependent:self.
+ ].
+ categoryList value:newList.
+
+ oldSelection size > 0 ifTrue:[
+ newSelection := oldSelection select:[:cat | newList includes:cat].
+ selectedCategoriesHolder value:newSelection.
+ ]
+ ] ifTrue:[
+ "/ in case the same categories are present, but classes have changed ...
+ (prevClasses isNil or:[(classes identicalContentsAs:prevClasses) not]) ifTrue:[
+ self updateOutputGenerator.
+ ]
+ ].
+ listValid := true.
+
+ "Created: / 5.2.2000 / 13:42:13 / cg"
+ "Modified: / 18.8.2000 / 15:52:22 / cg"
+! !
+
+!ClassCategoryList methodsFor:'setup'!
+
+commonPostBuildWith:aBuilder
+ |listView|
+
+ listView := self listView.
+ listView notNil ifTrue:[
+ listView scrollWhenUpdating:nil
+ ].
+ super commonPostBuildWith:aBuilder
+! !
+
+!ClassCategoryList methodsFor:'special'!
+
+addAdditionalCategory:aCategory
+ "/ those are simulated - in ST/X, empty categories do not
+ "/ really exist; however, during browsing, it makes sense.
+ AdditionalEmptyCategories isNil ifTrue:[
+ AdditionalEmptyCategories := Set new.
+ ].
+ AdditionalEmptyCategories add:aCategory.
+
+ Smalltalk changed:#organization "/ not really ... to force update
+!
+
+removeAdditionalCategories:aListOfCategories
+
+ "/ those are simulated - in ST/X, empty categories do not
+ "/ really exist; however, during browsing, it makes sense.
+ AdditionalEmptyCategories isNil ifTrue:[^ self].
+ aListOfCategories do:[:eachCategory |
+ AdditionalEmptyCategories remove:eachCategory ifAbsent:nil.
+ ].
+
+ Smalltalk changed:#organization "/ not really ... to force update
+!
+
+removeAllAdditionalCategories
+ "/ those are simulated - in ST/X, empty categories do not
+ "/ really exist; however, during browsing, it makes sense.
+ AdditionalEmptyCategories := nil
+! !
+
+!ClassCategoryList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_ClassCategoryList.st,v 1.1 2004-02-26 18:55:56 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_ClassChecker.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,760 @@
+"{ Package: 'stx:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+Object subclass:#ClassChecker
+ instanceVariableNames:'checkedClass badClasses badClassInfo badMethods badMethodInfo
+ obsoleteWarners allObsoleteMethods checksPerformed'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!ClassChecker class methodsFor:'documentation'!
+
+documentation
+"
+ embeddable application displaying the class-categories.
+ Provides an outputGenerator, which enumerates the classes in
+ the selected categories.
+
+ [author:]
+ Claus Gittinger (cg@exept.de)
+"
+! !
+
+!ClassChecker class methodsFor:'queries'!
+
+individualChecks
+ "return a list of supported checks"
+
+ |checks|
+
+ checks := OrderedCollection new.
+ self methodDictionary keysAndValuesDo:[:sel :mthd |
+ (mthd category startsWith:'checks') ifTrue:[checks add:sel]
+ ].
+ checks sort.
+ ^ checks
+
+ "
+ self individualChecks
+ "
+
+ "Created: / 18.8.2000 / 22:30:46 / cg"
+ "Modified: / 18.8.2000 / 22:31:02 / cg"
+! !
+
+!ClassChecker methodsFor:'accessing'!
+
+badClassInfo
+ ^ badClassInfo
+!
+
+badMethodInfo
+ ^ badMethodInfo
+!
+
+checkedClass
+ "return the value of the instance variable 'checkedClass' (automatically generated)"
+
+ ^ checkedClass
+!
+
+checkedClass:something
+ "set the value of the instance variable 'checkedClass' (automatically generated)"
+
+ checkedClass := something.
+ checksPerformed := nil.
+! !
+
+!ClassChecker methodsFor:'checking'!
+
+allChecks
+ self errorChecks.
+ self warningChecks.
+ self styleChecks.
+!
+
+doCheck:whichCheck
+ checksPerformed isNil ifTrue:[
+ checksPerformed := Set new.
+ ].
+ (checksPerformed includes:whichCheck) ifFalse:[
+ checksPerformed add:whichCheck.
+ self perform:whichCheck
+ ]
+!
+
+errorChecks
+ self doCheck:#subclassResponsibilityNotDefined.
+ self doCheck:#sentNotImplemented.
+ self doCheck:#definesEqualButNotHash.
+ self doCheck:#instanceVariablesNeverWritten.
+!
+
+styleChecks
+ self doCheck:#checkProtocols.
+!
+
+warningChecks
+ self doCheck:#messageNeverSentAndNotUsedAsSymbol.
+ self doCheck:#sendsObsoleteMessages.
+ self doCheck:#instanceVariablesNeverUsed.
+ self doCheck:#instanceVariablesNeverWritten.
+ self doCheck:#classVariablesNeverUsed.
+ self doCheck:#classVariablesNeverWritten.
+ self doCheck:#classInstanceVariablesNeverUsed.
+ self doCheck:#classInstanceVariablesNeverWritten.
+! !
+
+!ClassChecker methodsFor:'checks-individual'!
+
+checkProtocols
+ checkedClass instAndClassSelectorsAndMethodsDo:[:mSelector :method |
+ self checkProtocolOf:method
+ ]
+!
+
+checkVariableNameConventions
+ |badInstVars badClassVars|
+
+ badInstVars := checkedClass instanceVariableNames select:[:varName | varName first isUppercase].
+ badClassVars := checkedClass classVarNames select:[:varName | varName first isLowercase].
+
+ badInstVars notEmpty ifTrue:[
+ badInstVars := (badInstVars collect:[:v | '''' , v , '''']) asStringWith:$, .
+ self
+ rememberBadClass:checkedClass
+ info:('instVars ' , badInstVars , ' should be lowercase (#checkNameConventions)').
+ ].
+ badClassVars notEmpty ifTrue:[
+ badClassVars := (badClassVars collect:[:v | '''' , v , '''']) asStringWith:$, .
+ self
+ rememberBadClass:checkedClass
+ info:('classVars ' , badClassVars , ' should be uppercase (#checkNameConventions)').
+ ].
+!
+
+classInstanceVariablesNeverUsed
+ self instanceVariablesNeverUsedIn:checkedClass theMetaclass.
+!
+
+classInstanceVariablesNeverWritten
+ self instanceVariablesNeverWrittenIn:checkedClass theMetaclass.
+!
+
+classVariablesNeverUsed
+ |cls notUsedHere notUsedAnyWhere anySubclass|
+
+ cls := checkedClass theNonMetaclass.
+ notUsedHere := cls classVarNames asSet.
+ notUsedHere isEmpty ifTrue:[^ self].
+
+ self removeUsedClassVariablesIn:cls from:notUsedHere.
+ self removeUsedClassVariablesIn:cls class from:notUsedHere.
+
+ notUsedHere notEmpty ifTrue:[
+ notUsedAnyWhere := notUsedHere copy.
+ anySubclass := false.
+ cls allSubclassesDo:[:eachSubclass |
+ anySubclass := true.
+ notUsedAnyWhere notEmpty ifTrue:[
+ self removeUsedClassVariablesIn:eachSubclass from:notUsedAnyWhere.
+ self removeUsedClassVariablesIn:eachSubclass class from:notUsedAnyWhere.
+ ]
+ ].
+
+ notUsedHere do:[:eachVariable |
+ |className|
+
+ className := checkedClass name allBold.
+ self
+ rememberBadClass:cls
+ info:('classVar ' , eachVariable allBold , ' is unused in ' , className , ' (#classVariablesNeverUsed)').
+ (notUsedAnyWhere includes:eachVariable) ifTrue:[
+ self
+ rememberBadClass:cls
+ info:('classVar ' , eachVariable allBold , ' is not even used in subclasses of ' , className , ' (#classVariablesNeverUsed)')
+ ]
+ ].
+ ]
+!
+
+classVariablesNeverWritten
+ |cls notWrittenHere notWrittenAnyWhere anySubclass|
+
+ cls := checkedClass theNonMetaclass.
+ notWrittenHere := cls classVarNames asSet.
+ notWrittenHere isEmpty ifTrue:[^ self].
+
+ self removeWrittenClassVariablesIn:cls from:notWrittenHere.
+ self removeWrittenClassVariablesIn:cls class from:notWrittenHere.
+
+ notWrittenHere notEmpty ifTrue:[
+ notWrittenAnyWhere := notWrittenHere copy.
+ anySubclass := false.
+ cls allSubclassesDo:[:eachSubclass |
+ anySubclass := true.
+ notWrittenAnyWhere notEmpty ifTrue:[
+ self removeWrittenClassVariablesIn:eachSubclass from:notWrittenAnyWhere.
+ self removeWrittenClassVariablesIn:eachSubclass class from:notWrittenAnyWhere.
+ ]
+ ].
+
+ notWrittenHere do:[:eachVariable |
+ |className|
+
+ className := cls name allBold.
+ self
+ rememberBadClass:cls
+ info:('classVar ' , eachVariable allBold , ' is not set in ' , className , ' (#classVariablesNeverWritten)').
+ (notWrittenAnyWhere includes:eachVariable) ifTrue:[
+ self
+ rememberBadClass:cls
+ info:('classVar ' , eachVariable allBold , ' is not even set in subclasses of ' , className , ' (#classVariablesNeverWritten)')
+ ]
+ ].
+ ]
+!
+
+definesEqualButNotHash
+ (checkedClass includesSelector:#=) ifTrue:[
+ (checkedClass includesSelector:#hash) ifFalse:[
+ self
+ rememberBadClass:checkedClass
+ info:(checkedClass name allBold, ' redefines #=, but not #hash (#definesEqualButNotHash)').
+ ]
+ ]
+!
+
+instanceVariablesNeverUsed
+ self instanceVariablesNeverUsedIn:checkedClass theNonMetaclass.
+!
+
+instanceVariablesNeverWritten
+ self instanceVariablesNeverWrittenIn:checkedClass theNonMetaclass.
+!
+
+messageNeverSent
+ "/ old code: (slow)
+"/ checkedClass instAndClassSelectorsAndMethodsDo:[:mSelector :method |
+"/ (self anySendsOf:mSelector) ifFalse:[
+"/ self
+"/ rememberBadMethod:method
+"/ info:('#' , mSelector , ' is nowhere sent (#messageNeverSent)')
+"/ ].
+"/ ].
+
+ |selectorsOfInterest|
+
+ selectorsOfInterest := IdentitySet new.
+ checkedClass instAndClassSelectorsAndMethodsDo:[:mSelector :method | selectorsOfInterest add:mSelector].
+ (self messagesNeverSentIn:selectorsOfInterest) do:[:eachNeverSent |
+ self
+ rememberBadMethod:(checkedClass compiledMethodAt:eachNeverSent)
+ key:#messageNeverSent
+ info:('#' , eachNeverSent allBold, ' is nowhere sent (#messageNeverSent)')
+ ].
+
+ "Modified: / 18.8.2000 / 22:54:45 / cg"
+!
+
+messageNeverSentAndNotUsedAsSymbol
+ |selectorsOfInterest|
+
+ selectorsOfInterest := IdentitySet new.
+ checkedClass instAndClassSelectorsAndMethodsDo:[:mSelector :method | selectorsOfInterest add:mSelector].
+ (self messagesNeverSentAndNotUsedAsSymbolIn:selectorsOfInterest) do:[:eachNeverSent |
+ self
+ rememberBadMethod:(checkedClass compiledMethodAt:eachNeverSent)
+ key:#messageNeverSentAndNotUsedAsSymbol
+ info:('#' , eachNeverSent allBold, ' is nowhere sent and selector-symbol not used in any method (#messageNeverSentAndNotUsedAsSymbol)')
+ ].
+
+ "Modified: / 18.8.2000 / 23:10:56 / cg"
+!
+
+sendsObsoleteMessages
+ obsoleteWarners isNil ifTrue:[
+ obsoleteWarners := Object selectors select:[:each | each startsWith:'obsoleteMethodWarning'].
+ ].
+ allObsoleteMethods isNil ifTrue:[
+ allObsoleteMethods := IdentitySet new.
+ Method allSubInstancesDo:[:eachMethod | |lits|
+ ((lits := eachMethod literals) notNil
+ and:[lits includesAny:obsoleteWarners]) ifTrue:[
+ (eachMethod messagesSent includesAny:obsoleteWarners) ifTrue:[
+ allObsoleteMethods add:(eachMethod selector).
+ ].
+ ].
+ ].
+
+ "/ manually patchup; there are some which should not be considered as bad ...
+ allObsoleteMethods removeAllFoundIn:#( #',' #'at:' #'at:put:' #'raise').
+ allObsoleteMethods removeAllFoundIn:#( #'asText').
+ allObsoleteMethods removeAllFoundIn:obsoleteWarners.
+ ].
+
+ checkedClass instAndClassSelectorsAndMethodsDo:[:sel :mthd |
+ |lits sentMessages whichOnes pT searcher nodes|
+
+ ((lits := mthd literals) notNil
+ and:[lits includesAny:allObsoleteMethods]) ifTrue:[
+ sentMessages := mthd messagesSent.
+ (sentMessages includesAny:allObsoleteMethods) ifTrue:[
+ whichOnes := sentMessages select:[:each | allObsoleteMethods includes:each].
+
+ (RBParser notNil
+ and:[RBParser isLoaded]) ifTrue:[
+ "/ lets look at this a bit more detailed;
+ "/ parse it and see if we can filter out any messages
+ "/ (i.e. look if we can figure out the receiver type)
+
+"/ pT := RBParser
+"/ parseMethod: (mthd source)
+"/ onError: [:aString :pos | nil].
+"/ pT notNil ifTrue:[
+"/ searcher := ParseTreeSearcher
+"/ allMessageSendsMatchingAny:whichOnes ignoreCase:false.
+"/ nodes := searcher executeTree:pT initialAnswer:(OrderedCollection new).
+"/ nodes := nodes
+"/ select:
+"/ [:aSendNode |
+"/ self halt.
+"/ ].
+"/ whichOnes := nodes collect:[:aSendNode | aSendNode selector].
+"/ ].
+ ].
+
+ whichOnes asOrderedCollection sort do:[:eachObsoleteMessage |
+ self
+ rememberBadMethod:mthd
+ key:#sendsObsoleteMessages
+ info:('possibly sends an obsolete message: ' , eachObsoleteMessage , ' (#sendsObsoleteMessages)')
+ ].
+ ].
+ ]
+ ]
+!
+
+sentNotImplemented
+ |alreadyChecked alreadyCheckedSelf alreadyCheckedSuper|
+
+ alreadyChecked := IdentitySet new.
+ alreadyCheckedSelf := IdentitySet new.
+ alreadyCheckedSuper := IdentitySet new.
+
+ checkedClass methodDictionary keysAndValuesDo:[:mSelector :method |
+ |sentSelectors selfSelectors superSelectors selectorsNoWhereImplemented|
+
+ selectorsNoWhereImplemented := IdentitySet new.
+ sentSelectors := method messagesSent.
+ sentSelectors do:[:eachSelector |
+ (alreadyChecked includes:eachSelector) ifFalse:[
+ (self anyImplementationOf:eachSelector) ifTrue:[
+ alreadyChecked add:eachSelector
+ ] ifFalse:[
+ selectorsNoWhereImplemented add:eachSelector.
+ self
+ rememberBadMethod:method
+ key:#sentNotImplemented
+ info:('#' , eachSelector allBold, ' is nowhere implemented (#sentNotImplemented)')
+ ]
+ ]
+ ].
+
+ selfSelectors := method messagesSentToSelf.
+ selfSelectors do:[:eachSelector |
+ (selectorsNoWhereImplemented includes:eachSelector) ifFalse:[
+ (alreadyCheckedSelf includes:eachSelector) ifFalse:[
+ (self anyImplementationOf:eachSelector inOrAbove:checkedClass) ifTrue:[
+ alreadyCheckedSelf add:eachSelector
+ ] ifFalse:[
+ self
+ rememberBadMethod:method
+ key:#sentNotImplemented
+ info:('#' , eachSelector allBold, ' is not implemented in the class (#sentNotImplemented)')
+ ]
+ ]
+ ]
+ ].
+
+ superSelectors := method messagesSentToSuper.
+ superSelectors do:[:eachSelector |
+ (selectorsNoWhereImplemented includes:eachSelector) ifFalse:[
+ (alreadyCheckedSuper includes:eachSelector) ifFalse:[
+ (self anyImplementationOf:eachSelector inOrAbove:(checkedClass superclass)) ifTrue:[
+ alreadyCheckedSuper add:eachSelector
+ ] ifFalse:[
+ self
+ rememberBadMethod:method
+ key:#sentNotImplemented
+ info:('#' , eachSelector allBold, ' is not implemented in any superclass (#sentNotImplemented)')
+ ]
+ ]
+ ]
+ ].
+ ].
+!
+
+subclassResponsibilityNotDefined
+ |classesInBetween|
+
+ checkedClass allSuperclasses do:[:eachSuperClass |
+ eachSuperClass methodDictionary keysAndValuesDo:[:mSelector :method |
+ (method referencesLiteral:#subclassResponsibility) ifTrue:[
+ "/ parse it to see if it really does ...
+ (method sends:#subclassResponsibility) ifTrue:[
+ "/ ok, got one;
+ "/ now, see if it is defined below this superClass
+ classesInBetween := checkedClass withAllSuperclasses copy.
+ classesInBetween removeAll:(eachSuperClass withAllSuperclasses).
+ (self anyImplementationOf:mSelector in:classesInBetween) ifFalse:[
+ (self methodShouldBeIgnoredInSubclassResponsibilityNotDefined:method)
+ ifFalse:[
+ self
+ rememberBadMethod:method
+ key:#subclassResponsibilityNotDefined
+ info:(checkedClass name allBold , ' should redefine the #' , mSelector allBold , ' method (#subclassResponsibilityNotDefined)').
+ ].
+ ].
+ ]
+ ]
+ ]
+ ].
+! !
+
+!ClassChecker methodsFor:'helpers'!
+
+anyImplementationOf:aSelector
+ Smalltalk allClassesDo:[:eachClass |
+ (eachClass theNonMetaclass includesSelector:aSelector) ifTrue:[^ true].
+ (eachClass theMetaclass includesSelector:aSelector) ifTrue:[^ true].
+ ].
+ ^ false
+!
+
+anyImplementationOf:aSelector in:aCollectionOfClasses
+ aCollectionOfClasses do:[:eachClass |
+ (eachClass includesSelector:aSelector) ifTrue:[^ true].
+ ].
+ ^ false
+!
+
+anyImplementationOf:aSelector inOrAbove:aClass
+ aClass withAllSuperclassesDo:[:eachClass |
+ (eachClass includesSelector:aSelector) ifTrue:[^ true].
+ ].
+ ^ false
+!
+
+anySendsOf:aSelector
+ Smalltalk allClassesDo:[:eachClass |
+ eachClass instAndClassSelectorsAndMethodsDo:[:mSelector :mthd |
+ (mthd sends:aSelector) ifTrue:[^ true].
+ ].
+ ].
+ ^ false
+!
+
+checkProtocolOf:aMethod
+ |mClass mSelector protocol superClass implClass superProtocol|
+
+ mClass := aMethod mclass.
+ mSelector := aMethod selector.
+
+ protocol := aMethod category.
+ protocol isNil ifTrue: [^true].
+
+ superClass := mClass superclass.
+ superClass isNil ifTrue: [^true].
+
+ implClass := superClass whichClassIncludesSelector:mSelector.
+ implClass isNil ifTrue: [^true].
+
+ superProtocol := (implClass compiledMethodAt:mSelector) category.
+ superProtocol = protocol ifTrue: [^true].
+ superProtocol isNil ifTrue: [^true].
+
+ self
+ rememberBadMethod:aMethod
+ key:#checkProtocols
+ info:('#' , mSelector allBold , ' is classified under "' , protocol allBold , '" in '
+ , mClass name , ' and under "' , superProtocol allBold , '" in ' , implClass name
+ , ' (#checkProtocols)')
+
+ "Modified: / 18.8.2000 / 23:13:53 / cg"
+!
+
+checkUnusedVariables:aMethod rememberReadInstVarsIn:readInstVars writtenInstVarsIn:writtenInstVars readClassVarsIn:readClassVars writtenClassVarsIn:writtenClassVars
+ |p mClass sourceString|
+
+ sourceString := aMethod source.
+
+ mClass := aMethod mclass.
+
+ p := Parser parseMethodSilent:sourceString in:mClass.
+ readInstVars addAll:(p readInstVars).
+ writtenInstVars addAll:(p modifiedInstVars).
+ readClassVars addAll:(p readClassVars).
+ writtenClassVars addAll:(p modifiedClassVars).
+!
+
+instanceVariablesNeverUsedIn:aClass
+ |notUsedHere notUsedAnyWhere anySubclass|
+
+ notUsedHere := aClass instVarNames asSet.
+ notUsedHere isEmpty ifTrue:[^ self].
+
+ self removeUsedInstanceVariablesIn:aClass from:notUsedHere.
+
+ notUsedHere notEmpty ifTrue:[
+ notUsedAnyWhere := notUsedHere copy.
+ anySubclass := false.
+ aClass allSubclassesDo:[:eachSubclass |
+ anySubclass := true.
+ notUsedAnyWhere notEmpty ifTrue:[
+ self removeUsedInstanceVariablesIn:eachSubclass from:notUsedAnyWhere.
+ ]
+ ].
+
+ notUsedHere do:[:eachVariable |
+ |className|
+
+ className := aClass name allBold.
+ self
+ rememberBadClass:aClass
+ info:('instVar ' , eachVariable allBold , ' is unused in ' , className , ' (#instanceVariablesNeverUsed)').
+
+ anySubclass ifTrue:[
+ (notUsedAnyWhere includes:eachVariable) ifTrue:[
+ self
+ rememberBadClass:aClass
+ info:('instVar ' , eachVariable allBold , ' is not even used in subclasses of ' , className , ' (#instanceVariablesNeverUsed)')
+ ]
+ ]
+ ].
+ ]
+!
+
+instanceVariablesNeverWrittenIn:aClass
+ |notWrittenHere notWrittenAnyWhere anySubclass|
+
+ notWrittenHere := aClass instVarNames asSet.
+ notWrittenHere isEmpty ifTrue:[^ self].
+
+ self removeWrittenInstanceVariablesIn:aClass from:notWrittenHere.
+
+ notWrittenHere notEmpty ifTrue:[
+ notWrittenAnyWhere := notWrittenHere copy.
+ anySubclass := false.
+ aClass allSubclassesDo:[:eachSubclass |
+ anySubclass := true.
+ notWrittenAnyWhere notEmpty ifTrue:[
+ self removeWrittenInstanceVariablesIn:eachSubclass from:notWrittenAnyWhere.
+ ]
+ ].
+
+ notWrittenHere do:[:eachVariable |
+ |className|
+
+ className := aClass name allBold.
+ self
+ rememberBadClass:aClass
+ info:('instVar ' , eachVariable allBold , ' is nowhere set in ' , className , ' (#instanceVariablesNeverWritten)').
+ anySubclass ifTrue:[
+ (notWrittenAnyWhere includes:eachVariable) ifTrue:[
+ self
+ rememberBadClass:aClass
+ info:('instVar ' , eachVariable allBold , ' is not even set in subclasses of ' , className , ' (#instanceVariablesNeverWritten)')
+ ]
+ ]
+ ].
+ ]
+!
+
+messagesNeverSentAndNotUsedAsSymbolIn:selectorsOfInterest
+ |remaining toRemove checkBlock|
+
+ remaining := selectorsOfInterest copy asIdentitySet.
+ toRemove := IdentitySet new.
+
+ checkBlock := [:eachClass |
+ eachClass instAndClassSelectorsAndMethodsDo:[:mSel :mthd | |lits|
+ lits := mthd literals.
+ lits notNil ifTrue:[
+ lits traverse:[:eachLiteral |
+ eachLiteral isSymbol ifTrue:[
+ remaining remove:eachLiteral ifAbsent:nil.
+ ]
+ ].
+ remaining isEmpty ifTrue:[^ remaining].
+ ]
+ ].
+ ].
+
+ "/ start searching in the checkedClass - chances are high, we find some here
+ checkBlock value:checkedClass.
+ checkedClass superclass notNil ifTrue:[checkBlock value:checkedClass superclass].
+ Smalltalk allClassesDo:checkBlock.
+
+ ^ remaining
+
+ "Modified: / 18.8.2000 / 23:05:53 / cg"
+ "Created: / 18.8.2000 / 23:06:55 / cg"
+!
+
+messagesNeverSentIn:selectorsOfInterest
+ |remaining|
+
+ remaining := selectorsOfInterest copy.
+ Smalltalk allClassesDo:[:eachClass |
+ eachClass instAndClassSelectorsAndMethodsDo:[:mSelector :mthd | |lits|
+ lits := mthd literals.
+ lits notNil ifTrue:[
+ (lits includesAny:remaining) ifTrue:[
+ remaining removeAllFoundIn:(mthd messagesSent).
+ remaining isEmpty ifTrue:[^ remaining].
+ ]
+ ]
+ ].
+ ].
+ ^ remaining
+
+ "Created: / 18.8.2000 / 22:53:38 / cg"
+ "Modified: / 18.8.2000 / 22:56:59 / cg"
+!
+
+methodShouldBeIgnoredInSubclassResponsibilityNotDefined:aMethod
+ "a kludge for now - would like to have a pragma, resource or other
+ way to mark such a method"
+
+ aMethod == (Object compiledMethodAt:#implementedBySubclass) ifTrue:[^ true].
+ aMethod == (Object compiledMethodAt:#readBinaryContentsFromData:manager:) ifTrue:[^ true].
+ ^ false.
+!
+
+rememberBadClass:class info:whatIsWrong
+ |entry|
+
+ badClasses isNil ifTrue:[
+ badClasses := IdentitySet new.
+ ].
+ badClasses add:class.
+
+ badClassInfo isNil ifTrue:[
+ badClassInfo := IdentityDictionary new.
+ ].
+ entry := badClassInfo at:class ifAbsentPut:[ OrderedCollection new ].
+ entry add:whatIsWrong.
+!
+
+rememberBadMethod:method key:key info:whatIsWrong
+ |entry|
+
+ badMethods isNil ifTrue:[
+ badMethods := Set new.
+ ].
+ (badMethods includes:(method -> key)) ifTrue:[^ self].
+
+ badMethods add:(method -> key).
+
+ badMethodInfo isNil ifTrue:[
+ badMethodInfo := IdentityDictionary new.
+ ].
+ entry := badMethodInfo at:method ifAbsentPut:[ OrderedCollection new ].
+ entry add:whatIsWrong.
+!
+
+rememberBadMethods:methods key:key info:whatIsWrong
+ methods do:[:eachMethod |
+ self rememberBadMethod:eachMethod key:key info:whatIsWrong
+ ].
+!
+
+removeUsedClassVariablesIn:aClass from:aCollectionOfVariablenames
+ aClass selectorsAndMethodsDo:[:mSelector :method |
+ |src usedVars parser|
+
+ src := method source.
+ src notNil ifTrue:[
+ parser := Parser
+ parseMethod:src
+ in:aClass
+ ignoreErrors:true
+ ignoreWarnings:true.
+
+ (parser notNil and:[parser ~~ #Error]) ifTrue:[
+ aCollectionOfVariablenames removeAllFoundIn:(parser usedClassVars).
+ aCollectionOfVariablenames isEmpty ifTrue:[^ self].
+ ]
+ ].
+ ].
+!
+
+removeUsedInstanceVariablesIn:aClass from:aCollectionOfVariablenames
+ aClass selectorsAndMethodsDo:[:mSelector :method |
+ |src usedVars parser|
+
+ src := method source.
+ src notNil ifTrue:[
+ parser := Parser
+ parseMethod:src
+ in:aClass
+ ignoreErrors:true
+ ignoreWarnings:true.
+
+ (parser notNil and:[parser ~~ #Error]) ifTrue:[
+ aCollectionOfVariablenames removeAllFoundIn:(parser usedInstVars).
+ aCollectionOfVariablenames isEmpty ifTrue:[^ self].
+ ]
+ ].
+ ].
+!
+
+removeWrittenClassVariablesIn:aClass from:aCollectionOfVariablenames
+ aClass selectorsAndMethodsDo:[:mSelector :method |
+ |src usedVars parser|
+
+ src := method source.
+ src notNil ifTrue:[
+ parser := Parser
+ parseMethod:src
+ in:aClass
+ ignoreErrors:true
+ ignoreWarnings:true.
+
+ (parser notNil and:[parser ~~ #Error]) ifTrue:[
+ aCollectionOfVariablenames removeAllFoundIn:(parser modifiedClassVars).
+ aCollectionOfVariablenames isEmpty ifTrue:[^ self].
+ ]
+ ].
+ ].
+!
+
+removeWrittenInstanceVariablesIn:aClass from:aCollectionOfVariablenames
+ aClass selectorsAndMethodsDo:[:mSelector :method |
+ |src usedVars parser|
+
+ src := method source.
+ src notNil ifTrue:[
+ parser := Parser
+ parseMethod:src
+ in:aClass
+ ignoreErrors:true
+ ignoreWarnings:true.
+
+ (parser notNil and:[parser ~~ #Error]) ifTrue:[
+ aCollectionOfVariablenames removeAllFoundIn:(parser modifiedInstVars).
+ aCollectionOfVariablenames isEmpty ifTrue:[^ self].
+ ]
+ ].
+ ].
+! !
+
+!ClassChecker class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_ClassChecker.st,v 1.1 2004-02-26 18:56:10 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_ClassGeneratorList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,521 @@
+"{ Package: 'stx:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+BrowserList subclass:#ClassGeneratorList
+ instanceVariableNames:'organizerList categoryList namespaceList namespaceNameList
+ projectList selectedCategories selectedNamespaces
+ selectedProjects selectedClasses'
+ classVariableNames:'AdditionalEmptyCategories AdditionalEmptyProjects'
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!ClassGeneratorList class methodsFor:'documentation'!
+
+documentation
+"
+ embeddable application displaying the class-categories.
+ Provides an outputGenerator, which enumerates the classes in
+ the selected categories.
+
+ [author:]
+ Claus Gittinger (cg@exept.de)
+"
+! !
+
+!ClassGeneratorList class methodsFor:'interface specs'!
+
+windowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:ClassGeneratorList andSelector:#windowSpec
+ ClassGeneratorList new openInterface:#windowSpec
+ ClassGeneratorList open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'OrganizerList'
+ #name: 'OrganizerList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 12 22 312 322)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SequenceViewSpec
+ #name: 'List'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #tabable: true
+ #model: #organizerSelection
+ #menu: #menuHolder
+ #hasHorizontalScrollBar: true
+ #hasVerticalScrollBar: true
+ #miniScrollerHorizontal: true
+ #isMultiSelect: true
+ #valueChangeSelector: #selectionChangedByClick
+ #useIndex: true
+ #sequenceList: #organizerList
+ #doubleClickChannel: #doubleClickChannel
+ )
+ )
+
+ )
+ )
+
+ "Modified: / 18.8.2000 / 20:12:20 / cg"
+! !
+
+!ClassGeneratorList methodsFor:'aspects'!
+
+categoryList
+ categoryList isNil ifTrue:[
+ categoryList := ValueHolder new.
+ ].
+ ^ categoryList
+
+
+!
+
+nameSpaceList
+ namespaceList isNil ifTrue:[
+ namespaceList := ValueHolder new
+ ].
+ ^ namespaceList
+
+ "Created: / 18.2.2000 / 00:59:01 / cg"
+!
+
+projectList
+ projectList isNil ifTrue:[
+ projectList := ValueHolder new
+ ].
+ ^ projectList
+
+ "Created: / 17.2.2000 / 23:39:32 / cg"
+
+!
+
+selectedCategories
+ selectedCategories isNil ifTrue:[
+ selectedCategories := ValueHolder new.
+ selectedCategories addDependent:self
+ ].
+ ^ selectedCategories.
+
+!
+
+selectedCategories:aValueHolder
+ |prevSelection|
+
+ prevSelection := selectedCategories value ? #().
+
+ selectedCategories notNil ifTrue:[
+ selectedCategories removeDependent:self
+ ].
+ selectedCategories := aValueHolder.
+ selectedCategories notNil ifTrue:[
+ selectedCategories addDependent:self
+ ].
+ (selectedCategories value ? #()) ~= prevSelection ifTrue:[
+ "/ update
+ self update:#value with:nil from:selectedCategories
+ ].
+
+
+
+!
+
+selectedClasses
+ selectedClasses isNil ifTrue:[
+ selectedClasses := ValueHolder new.
+ ].
+ ^ selectedClasses.
+!
+
+selectedClasses:aValueHolder
+"/ selectedClasses notNil ifTrue:[
+"/ selectedClasses removeDependent:self
+"/ ].
+ selectedClasses := aValueHolder.
+"/ selectedClasses notNil ifTrue:[
+"/ selectedClasses addDependent:self
+"/ ].
+!
+
+selectedNamespaces
+ selectedNamespaces isNil ifTrue:[
+ selectedNamespaces := ValueHolder new.
+ selectedNamespaces addDependent:self
+ ].
+ ^ selectedNamespaces.
+
+!
+
+selectedNamespaces:aValueHolder
+ |prevSelection|
+
+ prevSelection := selectedNamespaces value ? #().
+
+ selectedNamespaces notNil ifTrue:[
+ selectedNamespaces removeDependent:self
+ ].
+ selectedNamespaces := aValueHolder.
+ selectedNamespaces notNil ifTrue:[
+ selectedNamespaces addDependent:self
+ ].
+ (selectedNamespaces value ? #()) ~= prevSelection ifTrue:[
+ "/ update
+ self update:#value with:nil from:selectedNamespaces
+ ].
+
+
+
+!
+
+selectedProjects
+ selectedProjects isNil ifTrue:[
+ selectedProjects := ValueHolder new.
+ selectedProjects addDependent:self
+ ].
+ ^ selectedProjects.
+
+!
+
+selectedProjects:aValueHolder
+ |prevSelection|
+
+ prevSelection := selectedProjects value ? #().
+
+ selectedProjects notNil ifTrue:[
+ selectedProjects removeDependent:self
+ ].
+ selectedProjects := aValueHolder.
+ selectedProjects notNil ifTrue:[
+ selectedProjects addDependent:self
+ ].
+ (selectedProjects value ? #()) ~= prevSelection ifTrue:[
+ "/ update
+ self update:#value with:nil from:selectedProjects
+ ].
+
+
+
+! !
+
+!ClassGeneratorList methodsFor:'aspects-private'!
+
+organizerList
+ organizerList isNil ifTrue:[
+ organizerList := ValueHolder new.
+ ].
+ ^ organizerList
+
+
+! !
+
+!ClassGeneratorList methodsFor:'change & update'!
+
+delayedUpdate:something with:aParameter from:changedObject
+ |cls sel pkg mthd|
+
+ changedObject == Smalltalk ifTrue:[
+ organizerMode value == #category ifTrue:[
+ something == #organization ifTrue:[
+ self updateList.
+ ^ self
+ ].
+ something == #newClass ifTrue:[
+ self updateList.
+ ^ self
+ ].
+ something == #methodInClass ifTrue:[ ^ self ].
+"/ self halt:'debug halt'.
+ ^ self.
+ ].
+ organizerMode value == #namespace ifTrue:[
+ something == #newClass ifTrue:[
+ aParameter isNameSpace ifTrue:[
+ self updateList
+ ].
+ ^ self
+ ].
+ something == #classRemove ifTrue:[
+ aParameter isNameSpace ifTrue:[
+ self updateList
+ ].
+ ^ self
+ ].
+"/ self halt:'debug halt'.
+ ^ self
+ ].
+ organizerMode value == #project ifTrue:[
+ something == #projectOrganization ifTrue:[
+ self updateList.
+ ^ self
+ ].
+ something == #methodInClass ifTrue:[
+ cls := aParameter at:1.
+ sel := aParameter at:2.
+ mthd := cls compiledMethodAt:sel.
+ pkg := mthd package.
+ (projectList value includes:pkg) ifFalse:[
+ self halt:'debug-halt. remove when known to work'.
+ self updateList.
+ ^ self
+ ].
+ ^ self
+ ].
+ (something == #classDefinition
+ or:[something == #newClass]) ifTrue:[
+ cls := aParameter.
+ pkg := cls package.
+ (projectList value includes:pkg) ifFalse:[
+ self halt:'debug-halt. remove when known to work'.
+ self updateList.
+ ^ self
+ ].
+ ^ self
+ ].
+"/ self halt.
+ ^ self
+ ].
+ ^ self
+ ].
+ super delayedUpdate:something with:aParameter from:changedObject
+
+ "Created: / 25.2.2000 / 21:32:03 / cg"
+ "Modified: / 25.2.2000 / 21:35:23 / cg"
+! !
+
+!ClassGeneratorList methodsFor:'private'!
+
+listFromInGenerator
+ |generator theList|
+
+ theList := Set new.
+ generator := inGeneratorHolder value.
+ generator isNil ifTrue:[^ #() ].
+ generator do:[:prj | theList add:prj].
+ theList := theList asOrderedCollection sort.
+ theList addFirst:(self class nameListEntryForALL).
+ ^ theList
+
+ "Created: / 25.2.2000 / 21:24:26 / cg"
+!
+
+listOfCategories
+ |categories hideUnloadedClasses|
+
+ inGeneratorHolder notNil ifTrue:[
+ ^ self listFromInGenerator
+ ].
+
+ hideUnloadedClasses := self hideUnloadedClasses value.
+
+ categories := Set new.
+ Smalltalk allClassesDo:[:cls |
+ (hideUnloadedClasses not or:[cls isLoaded])
+ ifTrue:[
+ categories add:cls category.
+ ]
+ ].
+
+ "/ those are simulated - in ST/X, empty categories do not
+ "/ really exist; however, during browsing, it makes sense.
+ AdditionalEmptyCategories size > 0 ifTrue:[
+ "/ remove those that are present ...
+ AdditionalEmptyCategories := AdditionalEmptyCategories select:[:cat | (categories includes:cat) not].
+ categories addAll:AdditionalEmptyCategories.
+ ].
+ categories := categories asOrderedCollection.
+ categories sort.
+ categories addFirst:(self class nameListEntryForALL).
+ ^ categories
+
+ "Created: / 5.2.2000 / 13:42:12 / cg"
+ "Modified: / 25.2.2000 / 21:26:04 / cg"
+!
+
+listOfNamespaces
+ |allNamespaces showAllNamespaces|
+
+ inGeneratorHolder notNil ifTrue:[
+ ^ self listFromInGenerator
+ ].
+
+showAllNamespaces := true.
+
+ allNamespaces := IdentitySet new.
+
+ (self hideUnloadedClasses value) ifTrue:[
+ Smalltalk allClassesDo:[:eachClass |
+ eachClass isLoaded ifTrue:[
+ allNamespaces add:(eachClass theNonMetaclass topNameSpace)
+ ].
+ ]
+ ] ifFalse:[
+ allNamespaces := NameSpace allNamespaces.
+ ].
+
+ showAllNamespaces ifFalse:[
+ "/ only topLevel namespaces are shown
+ "/ i.e. ignore subspaces
+
+ allNamespaces := allNamespaces select:[:ns | ns isTopLevelNameSpace].
+ ].
+ allNamespaces := allNamespaces collect:[:ns | ns name].
+ allNamespaces := allNamespaces asOrderedCollection.
+ allNamespaces sort.
+ allNamespaces addFirst:(self class nameListEntryForALL).
+ ^ allNamespaces
+
+ "Created: / 25.2.2000 / 21:21:14 / cg"
+ "Modified: / 25.2.2000 / 21:26:41 / cg"
+!
+
+listOfProjects
+ |allProjects|
+
+ inGeneratorHolder notNil ifTrue:[
+ ^ self listFromInGenerator
+ ].
+
+ allProjects := IdentitySet new.
+
+ (self hideUnloadedClasses value) ifTrue:[
+ Smalltalk allClassesDo:[:eachClass |
+ |cls pkg|
+
+ eachClass isLoaded ifTrue:[
+ cls := eachClass theNonMetaclass.
+ cls isPrivate ifTrue:[
+ cls := cls topOwningClass
+ ].
+ pkg := cls package.
+ pkg withoutSeparators size > 0 ifTrue:[
+ allProjects add:pkg asSymbol.
+ ] ifFalse:[
+ "/ for now, nameSpaces are not in any package;
+ "/ this might change. Then, 0-sized packages are
+ "/ illegal, abd the following should be enabled.
+ "/ self halt
+ ].
+ cls methodDictionary do:[:mthd |
+ allProjects add:mthd package asSymbol.
+ ].
+ ].
+ ].
+ allProjects := allProjects asOrderedCollection.
+ ] ifFalse:[
+ allProjects := NewSystemBrowser allProjectsIDs.
+ ].
+
+ "/ those are simulated - in ST/X, empty projects do not
+ "/ really exist; however, during browsing, it makes sense.
+ AdditionalEmptyProjects size > 0 ifTrue:[
+ "/ remove those that are present ...
+ AdditionalEmptyProjects := AdditionalEmptyProjects select:[:pkg | (allProjects includes:pkg) not].
+ allProjects addAll:AdditionalEmptyProjects.
+ ].
+ allProjects sort.
+ allProjects addFirst:(self class nameListEntryForALL).
+ ^ allProjects
+
+ "Created: / 25.2.2000 / 21:22:06 / cg"
+ "Modified: / 25.2.2000 / 21:27:27 / cg"
+!
+
+makeDependent
+ Smalltalk addDependent:self
+
+!
+
+makeIndependent
+ Smalltalk removeDependent:self.
+
+!
+
+release
+ super release.
+
+ selectedCategories removeDependent:self.
+ selectedNamespaces removeDependent:self.
+ selectedProjects removeDependent:self.
+!
+
+updateCategoryList
+ |newList|
+
+ newList := self listOfCategories.
+ newList ~= self categoryList value ifTrue:[
+ categoryList value:newList.
+ self organizerList value:newList.
+ ].
+
+ "Created: / 25.2.2000 / 21:12:32 / cg"
+!
+
+updateList
+ |orgMode|
+
+ orgMode := self organizerMode value.
+ orgMode == #category ifTrue:[
+ self updateCategoryList.
+ ^ self
+ ].
+ orgMode == #project ifTrue:[
+ self updateProjectList.
+ ^ self
+ ].
+ orgMode == #namespace ifTrue:[
+ self updateNamespaceList.
+ ^ self
+ ].
+ self halt:'unexpected value'.
+
+ "Created: / 5.2.2000 / 13:42:13 / cg"
+ "Modified: / 25.2.2000 / 21:14:19 / cg"
+!
+
+updateNamespaceList
+ |newList|
+
+ newList := self listOfNamespaces.
+ newList ~= self nameSpaceList value ifTrue:[
+ namespaceList value:newList.
+ self organizerList value:newList.
+ ].
+
+ "Created: / 25.2.2000 / 21:13:16 / cg"
+!
+
+updateProjectList
+ |newList|
+
+ newList := self listOfProjects.
+ newList ~= self projectList value ifTrue:[
+ projectList value:newList.
+ self organizerList value:newList.
+ ].
+
+ "Created: / 25.2.2000 / 21:12:57 / cg"
+! !
+
+!ClassGeneratorList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_ClassGeneratorList.st,v 1.1 2004-02-26 18:56:38 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_ClassList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,1572 @@
+"{ Package: 'stx:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+BrowserList subclass:#ClassList
+ instanceVariableNames:'classList classNameList meta lastSelectedClasses
+ selectedClassNameIndices currentNamespace hidePrivateClasses
+ unloadedClassesColor markApplicationsHolder'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!ClassList class methodsFor:'documentation'!
+
+documentation
+"
+ embeddable application displaying the classes as listed by
+ the inputGenerator.
+ Provides an outputGenerator, which enumerates the classes and
+ their protocols (method-categories) in the selected classes.
+
+ [author:]
+ Claus Gittinger (cg@exept.de)
+"
+
+
+! !
+
+!ClassList class methodsFor:'interface specs'!
+
+singleClassWindowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:ClassList andSelector:#singleClassWindowSpec
+ ClassList new openInterface:#singleClassWindowSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ClassList'
+ #name: 'ClassList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 12 22 312 322)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#LabelSpec
+ #label: 'ClassName'
+ #name: 'ClassLabel'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #translateLabel: true
+ #labelChannel: #classLabelHolder
+ #menu: #menuHolder
+ )
+"/ #(#UISubSpecification
+"/ #name: 'MetaToggleSpec'
+"/ #layout: #(#LayoutFrame 0 0.0 -25 1.0 0 1.0 0 1.0)
+"/ #minorKey: #metaSpec
+"/ )
+ )
+
+ )
+ )
+!
+
+windowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:ClassList andSelector:#windowSpec
+ ClassList new openInterface:#windowSpec
+ ClassList open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ClassList'
+ #name: 'ClassList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 16 46 316 346)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SequenceViewSpec
+ #name: 'List'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #tabable: true
+ #model: #selectedClassNameIndices
+ #menu: #menuHolder
+ #hasHorizontalScrollBar: true
+ #hasVerticalScrollBar: true
+ #miniScrollerHorizontal: true
+ #isMultiSelect: true
+ #valueChangeSelector: #selectionChangedByClick
+ #useIndex: true
+ #sequenceList: #classNameList
+ #doubleClickChannel: #doubleClickChannel
+ #properties:
+ #(#PropertyListDictionary
+ #dragArgument: nil
+ #dropArgument: nil
+ #canDropSelector: #canDrop:
+ #dropSelector: #doDrop:
+ )
+ )
+ )
+
+ )
+ )
+! !
+
+!ClassList class methodsFor:'plugIn spec'!
+
+aspectSelectors
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this. If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "Return a description of exported aspects;
+ these can be connected to aspects of an embedding application
+ (if this app is embedded in a subCanvas)."
+
+ ^ #(
+ #currentNamespace
+ #(#doubleClickChannel #action )
+ #forceGeneratorTrigger
+ #hidePrivateClasses
+ #hideUnloadedClasses
+ #immediateUpdate
+ #inGeneratorHolder
+ #menuHolder
+ #meta
+ #organizerMode
+ #outGeneratorHolder
+ #packageFilter
+ #nameSpaceFilter
+ #selectedClasses
+ #selectionChangeCondition
+ #showClassPackages
+ #slaveMode
+ #updateTrigger
+ #markApplicationsHolder
+ ).
+
+ "Modified: / 18.8.2000 / 18:49:08 / cg"
+! !
+
+!ClassList methodsFor:'accessing'!
+
+markApplications
+ "return the value of the instance variable 'markApplications' (automatically generated)"
+
+ ^ self markApplicationsHolder value
+
+ "Created: / 3.11.2001 / 14:06:19 / cg"
+!
+
+markApplications:something
+ "set the value of the instance variable 'markApplications' (automatically generated)"
+
+ self markApplicationsHolder value:something.
+
+ "Created: / 3.11.2001 / 14:06:25 / cg"
+!
+
+unloadedClassesColor
+ "return the value of the instance variable 'unloadedClassesColor' (automatically generated)"
+
+ ^ unloadedClassesColor
+!
+
+unloadedClassesColor:something
+ "set the value of the instance variable 'unloadedClassesColor' (automatically generated)"
+
+ unloadedClassesColor := something.
+! !
+
+!ClassList methodsFor:'aspects'!
+
+classLabelHolder
+ ^ self pseudoListLabelHolder
+!
+
+classList
+ classList isNil ifTrue:[
+ classList := ValueHolder new.
+ ].
+ ^ classList
+
+ "Created: / 5.2.2000 / 13:42:16 / cg"
+ "Modified: / 25.2.2000 / 02:21:07 / cg"
+!
+
+classNameList
+ classNameList isNil ifTrue:[
+ classNameList := ValueHolder new
+ ].
+ ^ classNameList
+!
+
+currentNamespace:aValueHolder
+ currentNamespace notNil ifTrue:[
+ currentNamespace removeDependent:self
+ ].
+ currentNamespace := aValueHolder.
+ currentNamespace notNil ifTrue:[
+ currentNamespace isBehavior ifTrue:[self halt:'should not happen'].
+ currentNamespace addDependent:self
+ ].
+
+ "Modified: / 4.2.2000 / 23:34:28 / cg"
+ "Created: / 5.2.2000 / 21:37:57 / cg"
+!
+
+doubleClick
+ self halt:'should not happen'.
+!
+
+hidePrivateClasses
+ hidePrivateClasses isNil ifTrue:[
+ hidePrivateClasses := false asValue.
+ hidePrivateClasses addDependent:self.
+ ].
+ ^ hidePrivateClasses.
+
+ "Created: / 24.2.2000 / 15:06:44 / cg"
+!
+
+hidePrivateClasses:aValueHolder
+ hidePrivateClasses notNil ifTrue:[
+ hidePrivateClasses removeDependent:self
+ ].
+ hidePrivateClasses := aValueHolder.
+ hidePrivateClasses notNil ifTrue:[
+ hidePrivateClasses addDependent:self
+ ].
+
+ "Created: / 24.2.2000 / 15:06:46 / cg"
+!
+
+markApplicationsHolder
+ markApplicationsHolder isNil ifTrue:[
+ markApplicationsHolder := true asValue.
+ markApplicationsHolder addDependent:self.
+ ].
+ ^ markApplicationsHolder.
+!
+
+markApplicationsHolder:aValueHolder
+ markApplicationsHolder notNil ifTrue:[
+ markApplicationsHolder removeDependent:self
+ ].
+ markApplicationsHolder := aValueHolder.
+ markApplicationsHolder notNil ifTrue:[
+ markApplicationsHolder addDependent:self
+ ].
+
+ "Created: / 24.2.2000 / 15:06:46 / cg"
+!
+
+meta
+ meta isNil ifTrue:[
+ meta := false asValue.
+ meta addDependent:self
+ ].
+ ^ meta
+
+ "Modified: / 31.1.2000 / 01:19:59 / cg"
+ "Created: / 5.2.2000 / 13:42:16 / cg"
+!
+
+meta:aValueHolder
+"/ (aValueHolder == true or:[aValueHolder == false]) ifTrue:[self halt].
+
+ meta notNil ifTrue:[
+ meta removeDependent:self
+ ].
+ meta := aValueHolder.
+ meta notNil ifTrue:[
+ meta addDependent:self
+ ].
+!
+
+selectedClassNameIndices
+ selectedClassNameIndices isNil ifTrue:[
+ selectedClassNameIndices := #() asValue.
+ selectedClassNameIndices addDependent:self
+ ].
+ ^ selectedClassNameIndices.
+
+ "Created: / 5.2.2000 / 21:31:48 / cg"
+ "Modified: / 5.2.2000 / 21:43:02 / cg"
+!
+
+selectedClasses
+ ^ self selectionHolder
+
+!
+
+selectedClasses:aValueHolder
+ ^ self selectionHolder:aValueHolder
+
+!
+
+showClassPackages
+ showClassPackages isNil ifTrue:[
+ showClassPackages := false asValue.
+ showClassPackages addDependent:self.
+ ].
+ ^ showClassPackages.
+
+ "Created: / 24.2.2000 / 15:06:44 / cg"
+!
+
+showClassPackages:aValueHolder
+ showClassPackages notNil ifTrue:[
+ showClassPackages removeDependent:self
+ ].
+ showClassPackages := aValueHolder.
+ showClassPackages notNil ifTrue:[
+ showClassPackages addDependent:self
+ ].
+! !
+
+!ClassList methodsFor:'change & update'!
+
+classDefinitionChanged:aClassOrNil
+
+ listValid ifFalse:[^ self].
+
+ slaveMode value == true ifTrue:[
+ self invalidateList.
+ ^ self.
+ ].
+ self slaveMode value isNil ifTrue:[
+ self window shown ifFalse:[
+ self invalidateList.
+ ^ self
+ ].
+ ].
+
+ aClassOrNil isNil ifTrue:[
+ self halt:'should not happen'.
+ ].
+
+ "/ if that class is in my list ...
+ ((self classList value ? #()) contains:[:cls | cls notNil and:[cls theNonMetaclass name = aClassOrNil theNonMetaclass name]])
+ ifTrue:[
+ self updateListsFor:aClassOrNil.
+ "/ force update
+ self selectedClassNameIndices value:(self selectedClassNameIndices value).
+
+ ((self selectedClasses value ? #()) contains:[:cls | cls notNil ifTrue:[cls theNonMetaclass name = aClassOrNil theNonMetaclass name] ifFalse:[false]])
+ ifTrue:[
+ self updateOutputGenerator
+ ].
+ ] ifFalse:[
+ self invalidateList
+ ]
+
+
+ "Modified: / 29.2.2000 / 00:15:23 / cg"
+!
+
+classRemoved:aClass
+ |list|
+
+ list := self classList value.
+ list notNil ifTrue:[
+ (list includesIdentical:aClass) ifTrue:[
+ self invalidateList.
+ ]
+ ]
+
+ "Modified: / 25.2.2000 / 23:53:51 / cg"
+!
+
+delayedUpdate:something with:aParameter from:changedObject
+ |cls classes chgClass wg|
+
+ classes := self classList value ? #().
+
+ self inSlaveModeOrInvisible ifTrue:[
+ self invalidateList.
+ ^ self.
+ ].
+
+"/ (self slaveMode value == true) ifTrue:[^ self].
+"/ self slaveMode value isNil ifTrue:[
+"/ self window shown ifFalse:[
+"/ self invalidateList.
+"/ ^ self
+"/ ].
+"/ ].
+
+ changedObject == slaveMode ifTrue:[
+ listValid ~~ true ifTrue:[
+ self enqueueDelayedUpdateList.
+ ].
+ self enqueueDelayedClassSelectionChanged.
+ ^ self
+ ].
+
+ changedObject == Smalltalk ifTrue:[
+ something == #methodInClass ifTrue:[
+ ^ self "no interest"
+ ].
+ something == #methodInClassRemoved ifTrue:[
+ "/ must update the list, if the methods package is different from
+ "/ the classes package (to undo any has-exension highlighting)
+ cls := aParameter first.
+ self updateListsFor:cls.
+ ^ self
+ ].
+ something == #organization ifTrue:[^ self "no interest" ].
+
+ (something == #classDefinition
+ or:[something == #classVariables
+ or:[something == #newClass]]) ifTrue:[
+ "/ update that class in my classList and the selection
+ listValid ifTrue:[
+ self classDefinitionChanged:aParameter.
+ ].
+ ^ self.
+ ].
+ (something == #lastTestRunResult) ifTrue:[
+ "/ update that class in my classList and the selection
+ listValid ifTrue:[
+ self updateListsFor:aParameter.
+ "/ self classDefinitionChanged:aParameter.
+ ].
+ ^ self.
+ ].
+ something == #classRemove ifTrue:[
+ "/ update my classList and the selection
+ self classRemoved:aParameter.
+ ^ self.
+ ].
+ something == #classRename ifTrue:[
+ "/ update that class in my classList and the selection
+ listValid ifTrue:[
+ aParameter isArray ifTrue:[
+ cls := aParameter at:1.
+ self classDefinitionChanged:cls.
+ ]
+ ].
+ ^ self.
+ ].
+
+ something == #projectOrganization ifTrue:[
+ aParameter isNil ifTrue:[
+ self invalidateList.
+ organizerMode value == #project ifTrue:[
+ self enqueueDelayedUpdateOutputGenerator.
+ ].
+ ^ self
+ ].
+
+ cls := aParameter at:1.
+ cls notNil ifTrue:[ "/ should not happen (but does occasionally)
+ ((classes includes:cls theMetaclass)
+ or:[(classes includes:cls theNonMetaclass)]) ifTrue:[
+ self invalidateList.
+ organizerMode value == #project ifTrue:[
+ self enqueueDelayedUpdateOutputGenerator.
+ ]
+ ].
+ ].
+ ^ self
+ ].
+ ^ self.
+ ].
+
+ (something == #lastTestRunResult) ifTrue:[
+ ^ self
+ ].
+
+ changedObject == ChangeSet ifTrue:[
+ wg := self windowGroup.
+ wg isNil ifTrue:[
+ changedObject removeDependent:self.
+ ] ifFalse:[
+ "/ react on changes of the changeSet to recolorize items
+ something == #addChange: ifTrue:[
+ chgClass := aParameter changeClass.
+ chgClass notNil ifTrue:[
+ ((classes includes:chgClass theNonMetaclass)
+ or:[classes includes:chgClass theMetaclass]) ifTrue:[
+ "/ remove all other addChange notifications ...
+ wg sensor
+ flushEventsFor:self
+ where:[:ev | ev isMessageSendEvent
+ and:[ev selector == #delayedUpdate:with:from:
+ and:[(ev arguments at:3) == ChangeSet]]].
+ self reconstructNameList.
+ ]
+ ]
+ ] ifFalse:[
+ "/ remove all other ChangeSet notifications ...
+ wg sensor
+ flushEventsFor:self
+ where:[:ev | ev isMessageSendEvent
+ and:[ev selector == #delayedUpdate:with:from:
+ and:[(ev arguments at:3) == ChangeSet]]].
+ self reconstructNameList.
+ ].
+ ].
+ ^ self
+ ].
+
+ changedObject == self selectedClasses ifTrue:[
+ slaveMode value ~~ true ifTrue:[
+ listValid == true ifFalse:[
+ self updateList
+ ].
+ self selectedClassesChanged.
+ self updateOutputGenerator.
+ ] ifFalse:[
+ listValid := false.
+ ].
+ ^ self
+ ].
+
+ (changedObject == meta
+ or:[changedObject == selectedClassNameIndices]) ifTrue:[
+ self selectionChanged.
+ ^ self
+ ].
+ changedObject == showClassPackages ifTrue:[
+ self classNameList value:nil.
+ self invalidateList.
+ ^ self
+ ].
+
+ (changedObject == hideUnloadedClasses
+ or:[changedObject == hidePrivateClasses
+ or:[changedObject == nameSpaceFilter
+ or:[changedObject == packageFilter]]]) ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+
+ super delayedUpdate:something with:aParameter from:changedObject
+
+ "Modified: / 13.11.2001 / 11:32:10 / cg"
+!
+
+enqueueDelayedClassSelectionChanged
+ (NewSystemBrowser synchronousUpdate == true
+ or:[ immediateUpdate value == true ])
+ ifTrue:[
+ self selectedClassesChanged.
+ ^ self.
+ ].
+
+ self enqueueMessage:#selectedClassesChanged for:self arguments:#()
+!
+
+getSelectedClassIndicesFromClasses
+ "the class selection has changed;
+ return a collection of selection-indices"
+
+ |classes selectedClasses numSelected|
+
+ classes := self classList value.
+ selectedClasses := self selectedClasses value.
+
+ numSelected := selectedClasses size.
+ numSelected == 0 ifTrue:[
+ ^ #()
+ ].
+
+ numSelected == classes size ifTrue:[
+ "/ all selected - easy
+ ^ (1 to:numSelected) asOrderedCollection
+ ].
+ meta value ifTrue:[
+ classes := classes collect:[:eachClass | eachClass theMetaclass].
+ ].
+
+ classes := selectedClasses collect:[:aSelectedClass | classes identityIndexOf:aSelectedClass.].
+ classes := classes select:[:idx | idx ~= 0].
+ ^ classes
+
+ "Created: / 24.2.2000 / 19:47:52 / cg"
+!
+
+getSelectedClassesFromIndices
+ "the selection-index collection has changed;
+ return a collection of corresponding classes"
+
+ |selected classes allEntrySelected isMeta anyLost selectedClassNameIndices|
+
+ allEntrySelected := false.
+
+ classes := classList value.
+ isMeta := meta value.
+ anyLost := false.
+
+ selectedClassNameIndices := self selectedClassNameIndices value.
+ selectedClassNameIndices size == classes size ifTrue:[
+ selectedClassNameIndices size == 0 ifTrue:[^ #()].
+ isMeta ifTrue:[
+ ^ classes collect:[:eachClass | eachClass theMetaclass].
+ ].
+ ^ classes collect:[:eachClass | eachClass theNonMetaclass].
+ ].
+
+ selected := selectedClassNameIndices
+ collect:[:idx |
+ |cls|
+
+ cls := classes at:idx.
+ cls == (self class nameListEntryForALL) ifTrue:[
+ allEntrySelected := true.
+ ] ifFalse:[
+ cls notNil ifTrue:[
+ isMeta ifTrue:[
+ cls := cls theMetaclass
+ ] ifFalse:[
+ cls := cls theNonMetaclass
+ ].
+ ] ifFalse:[
+ anyLost := true
+ ].
+ ].
+ cls
+ ].
+ anyLost ifTrue:[
+ selected := selected select:[:each | each notNil].
+ ].
+
+"/ allEntrySelected ifTrue:[
+"/ selected := classList value select:[:cls | cls ~~ AllEntry].
+"/ meta value ifTrue:[
+"/ selected := selected collect:[:cls | cls theMetaclass].
+"/ ] ifFalse:[
+"/ selected := selected collect:[:cls | cls theNonMetaclass].
+"/ ].
+"/ ].
+
+ ^ selected.
+
+ "Created: / 24.2.2000 / 19:43:37 / cg"
+!
+
+selectedClassesChanged
+ |indices selectedClassNameIndicesHolder|
+
+ self classList value size == 0 ifTrue:[
+ "/ this may happen during early startup,
+ "/ when invoked with a preset classSelection,
+ "/ and the classGenerator has not yet been setup
+ "/ to not clobber the selection, defer the update
+ "/ until the classList arrives ...
+ ^ self
+ ].
+ "/ lastSelectedClasses := self selectedClasses value copy.
+
+ indices := self getSelectedClassIndicesFromClasses.
+ selectedClassNameIndicesHolder := self selectedClassNameIndices.
+ selectedClassNameIndicesHolder value ~= indices ifTrue:[
+ "/ in slaveMode, do not update selectedClasses from indices
+ true "slaveMode value" ifTrue:[
+ selectedClassNameIndicesHolder value:indices withoutNotifying:self
+ ] ifFalse:[
+ selectedClassNameIndicesHolder value:indices.
+ ]
+ ]
+
+ "Created: / 13.2.2000 / 22:18:10 / cg"
+ "Modified: / 24.2.2000 / 19:48:56 / cg"
+!
+
+selectionChanged
+ "the lists selection has changed. Since the list uses indices,
+ update the corresponding selectedClasses collection"
+
+ |selected prevSelection selectedClassesHolder|
+
+ selectedClassesHolder := self selectedClasses.
+"/ lastSelectedClasses := selectedClassesHolder value copy.
+
+ selected := self getSelectedClassesFromIndices.
+
+ prevSelection := selectedClassesHolder value ? #().
+
+ "/ to allow reselect, change my valueHolder, even if the same collection
+
+ prevSelection ~= selected ifTrue:[
+ selectedClassesHolder value:selected.
+"/ ] ifFalse:[
+"/ selectedClassesHolder value:selected withoutNotifying:self
+ ].
+
+"/ (selectedClassesHolder value = lastSelectedClasses
+"/ and:[lastSelectedClasses size == 1]) ifTrue:[
+"/ "/ thats a kludge - we want to turn off the protocol selection,
+"/ "/ when a class is reselected.
+"/
+"/ (masterApplication notNil
+"/ and:[(mm := masterApplication masterApplication) notNil
+"/ and:[mm respondsTo:#selectedProtocols]]) ifTrue:[
+"/ mm selectedProtocols value:#()
+"/ ].
+"/ ].
+!
+
+selectionChangedByClick
+ "we are not interested in that - get another notification
+ via the changed valueHolder"
+
+ |selected master|
+
+ selected := self getSelectedClassesFromIndices.
+ (selected = lastSelectedClasses and:[selected size == 1])
+ ifTrue:[
+ "/ thats a kludge - we want to turn off the protocol selection,
+ "/ when a class is reselected.
+
+ masterApplication notNil ifTrue:[
+ master := masterApplication.
+ masterApplication masterApplication notNil ifTrue:[
+ master := masterApplication masterApplication.
+ ].
+ (master respondsTo:#classReselected) ifTrue:[
+ master classReselected.
+ ].
+ ]
+ ] ifFalse:[
+ lastSelectedClasses := selected copy.
+ ]
+!
+
+update:something with:aParameter from:changedObject
+ |cls newMethod oldMethod idx classListValue|
+
+ self slaveMode value == true ifTrue:[
+ something == #methodInClass ifTrue:[ ^ self ].
+ something == #addChange: ifTrue:[ self invalidateList. ^ self ].
+ ].
+"/ self window sensor isNil ifTrue:[
+"/ "/ not visible ...
+"/ self invalidateList.
+"/ ^ self
+"/ ].
+
+ classListValue := classList value.
+
+ changedObject == Smalltalk ifTrue:[
+ something == #classComment ifTrue:[
+ ^ self.
+ ].
+ something == #methodDictionary ifTrue:[
+ ^ self
+ ].
+ something == #methodTrap ifTrue:[
+ ^ self
+ ].
+ something == #methodInClassRemoved ifTrue:[
+ cls := aParameter at:1.
+ cls notNil ifTrue:[
+ classListValue size > 0 ifTrue:[
+ ((classListValue includesIdentical:cls theNonMetaclass)
+ or:[(classListValue includesIdentical:cls theMetaclass)]) ifTrue:[
+ self enqueueDelayedUpdateList
+ ]
+ ]
+ ].
+ ^ self
+ ].
+
+ something == #methodInClass ifTrue:[
+ cls := aParameter at:1.
+ cls notNil ifTrue:[
+ classListValue size > 0 ifTrue:[
+ ((classListValue includesIdentical:cls theNonMetaclass)
+ or:[(classListValue includesIdentical:cls theMetaclass)]) ifTrue:[
+ newMethod := cls compiledMethodAt:(aParameter at:2).
+ oldMethod := aParameter at:3.
+ ((oldMethod isNil
+ and:[newMethod package ~= cls package])
+ or:[oldMethod notNil
+ and:[newMethod package ~= oldMethod package]])
+ ifTrue:[
+ "/ must update the list (for the package-info)
+ self enqueueDelayedUpdateList
+ ]
+ ]
+ ]
+ ].
+ ^ self
+ ].
+
+ "/ kludge: must be careful if my inGenerator is a constant list.
+ "/ in that case, I have to update it
+ "/ (sigh - all a consequence of not #becoming the new class)
+ ((something == #classDefinition) or:[something == #newClass]) ifTrue:[
+ inGeneratorHolder value isOrderedCollection ifTrue:[
+ idx := inGeneratorHolder value findFirst:[:eachClass | eachClass name = aParameter theNonMetaclass name].
+ idx ~~ 0 ifTrue:[
+ inGeneratorHolder value at:idx put:aParameter.
+ self updateListsFor:aParameter.
+ "/ self enqueueDelayedUpdateList.
+ ]
+ ] ifFalse:[
+ classListValue size > 0 ifTrue:[
+ idx := classListValue findFirst:[:eachClass | eachClass name = aParameter theNonMetaclass name].
+ idx ~~ 0 ifTrue:[
+ listValid ifTrue:[
+ self classDefinitionChanged:aParameter.
+ ^ self.
+ ]
+ ]
+ ].
+ ].
+ ].
+ ].
+
+ super update:something with:aParameter from:changedObject
+
+ "Modified: / 20.11.2001 / 21:54:56 / cg"
+! !
+
+!ClassList methodsFor:'drag & drop'!
+
+canDrop:aDropContext
+ |methods cls|
+
+ methods := aDropContext dropObjects collect:[:obj | obj theObject].
+
+ (methods contains:[:aMethod | aMethod isMethod not]) ifTrue:[^ false].
+
+ cls := self classAtTargetPointOf:aDropContext.
+
+ (methods contains:[:aMethod | aMethod mclass ~= cls]) ifFalse:[^ false].
+
+ ^ true
+!
+
+classAtTargetPointOf:aDropContext
+ |p classListView lineNr cls|
+
+ p := aDropContext targetPoint.
+
+ classListView := aDropContext targetWidget.
+
+ lineNr := classListView lineAtY:p y.
+ lineNr isNil ifTrue:[^ nil].
+
+ cls := classList value at:lineNr.
+ ^ cls
+!
+
+doDrop:aDropContext
+ |cls methods|
+
+ methods := aDropContext dropObjects collect:[:aDropObject | aDropObject theObject].
+ (methods contains:[:something | something isMethod not]) ifTrue:[^ self].
+
+ cls := self classAtTargetPointOf:aDropContext.
+ methods first mclass isMeta ifTrue:[
+ cls := cls theMetaclass
+ ].
+
+ cls notNil ifTrue:[
+ self masterApplication moveMethods:methods toClass:cls.
+ ].
+! !
+
+!ClassList methodsFor:'generators'!
+
+makeGenerator
+ "return a generator which enumerates the method categories from the selected class;
+ that generator generates 2-element elements (includes the class), in order
+ to make the consumers only depend on one input (i.e. no need for another
+ classHolder in the methodList)."
+
+ ^ Iterator on:[:whatToDo |
+ |allEntry classes cls already anyMethod packages classIsInPackage|
+
+ allEntry := self class nameListEntryForALL.
+
+ classes := self selectedClasses value ? #().
+ packages := packageFilter value value.
+ (packages notNil and:[packages includes:allEntry]) ifTrue:[packages := nil].
+
+ classes do:[:cls |
+ (cls notNil and:[cls ~~ allEntry]) ifTrue:[
+ anyMethod := false.
+ classIsInPackage := packages isNil or:[packages includes:cls package].
+
+ cls theNonMetaclass isJavaClass ifTrue:[
+ cls isMeta ifTrue:[
+ whatToDo value:cls theNonMetaclass value:(self class nameListEntryForStatic).
+ ] ifFalse:[
+ whatToDo value:cls value:(self class nameListEntryForNonStatic).
+ ]
+ ] ifFalse:[
+ cls supportsMethodCategories ifTrue:[
+ already := Set new.
+ cls methodDictionary keysAndValuesDo:[:sel :mthd |
+ |cat|
+
+ cat := mthd category.
+ (already includes:cat) ifFalse:[
+ (classIsInPackage
+ or:[packages isNil
+ or:[packages includes:mthd package]])
+ ifTrue:[
+ already add:cat.
+ whatToDo value:cls value:cat.
+ ]
+ ]
+ ].
+ ] ifFalse:[
+ whatToDo value:cls value:(self class nameListEntryForNILCategory).
+ ].
+ ].
+
+ anyMethod ifFalse:[
+ "/ tell the one below, which classes are seen here,
+ "/ (even if no method is present)
+ "/ to allow him to decide if the className is to be shown in the list
+ whatToDo value:cls value:nil.
+ ].
+ ].
+ ].
+ ]
+
+ "Modified: / 24.2.2000 / 23:18:26 / cg"
+! !
+
+!ClassList methodsFor:'private'!
+
+listOfClasses
+ |classesAlready classesOrdered generator nameSpaceFilter packageFilter allName hidePrivate
+ privateClassesPerClass|
+
+ allName := self class nameListEntryForALL.
+ nameSpaceFilter := self nameSpaceFilter value.
+ nameSpaceFilter notNil ifTrue:[
+ (nameSpaceFilter includes:allName) ifTrue:[nameSpaceFilter := nil].
+ ].
+ packageFilter := self packageFilter value.
+ packageFilter notNil ifTrue:[
+ (packageFilter includes:allName) ifTrue:[packageFilter := nil].
+ ].
+
+ inGeneratorHolder isNil ifTrue:[
+ "/ for standAlone testing
+ generator := Smalltalk allClasses.
+ (self hideUnloadedClasses value) ifTrue:[
+ generator := generator select:[:cls | cls isLoaded]
+ ].
+ ] ifFalse:[
+ generator := inGeneratorHolder value.
+ generator isNil ifTrue:[^ #() ].
+ ].
+
+ classesAlready := IdentitySet new.
+ classesOrdered := OrderedCollection new.
+ hidePrivate := self hidePrivateClasses value.
+
+ privateClassesPerClass := IdentityDictionary new.
+
+ generator do:[:cls |
+ |owner bucket|
+
+ (hidePrivate not or:[cls isPrivate not])
+ ifTrue:[
+ (nameSpaceFilter isNil
+ or:[self isClass:cls shownWithNameSpaceFilter:nameSpaceFilter]) ifTrue:[
+ (packageFilter isNil
+ or:[self isClass:cls shownWithPackageFilter:packageFilter]) ifTrue:[
+ (classesAlready includes:cls) ifFalse:[
+ classesAlready add:cls.
+ (owner := cls owningClass) notNil ifTrue:[
+ bucket := privateClassesPerClass at:owner ifAbsentPut:[SortedCollection new sortBlock:[:a :b | a name < b name] ].
+ bucket add:cls.
+ ] ifFalse:[
+ classesOrdered add:cls.
+ ]
+ ]
+ ]
+ ]
+ ]
+ ].
+
+ classesOrdered size == 1 ifTrue:[
+ self classLabelHolder value:(classesOrdered first name)
+ ] ifFalse:[
+"/ self classLabelHolder value:(classes size printString , ' classes').
+ sortBy value ~~ #doNotSort ifTrue:[
+ classesOrdered sort:[:a :b | a name < b name].
+ ]
+ ].
+
+ privateClassesPerClass notEmpty ifTrue:[
+ |stream action|
+
+ stream := WriteStream on:(Array new).
+
+ action := [:eachClass |
+ |bucket|
+
+ stream nextPut:eachClass.
+ bucket := privateClassesPerClass at:eachClass ifAbsent:nil.
+ bucket notNil ifTrue:[
+ bucket do:action.
+ ]
+ ].
+
+ classesOrdered do:action.
+ classesOrdered := stream contents.
+ ].
+
+"/
+"/ does not work (yet)
+"/ classes addFirst:AllEntry.
+ ^ classesOrdered
+
+ "Modified: / 18.8.2000 / 20:34:10 / cg"
+!
+
+makeDependent
+ Smalltalk addDependent:self.
+ ChangeSet addDependent:self.
+
+ "Created: / 5.2.2000 / 13:42:17 / cg"
+!
+
+makeIndependent
+ Smalltalk removeDependent:self.
+ ChangeSet removeDependent:self.
+!
+
+nameListEntryFor:aClass withNameSpace:useFullName
+ |nm indent index owner orgMode indentString javaPackage|
+
+ aClass == (self class nameListEntryForALL) ifTrue:[ ^ aClass ].
+
+ nm := aClass nameInBrowser.
+ aClass isLoaded ifFalse:[
+ unloadedClassesColor notNil ifTrue:[
+ nm := nm asText emphasizeAllWith:(#color->unloadedClassesColor)
+ ]
+ ].
+
+ orgMode := organizerMode value.
+ orgMode == #hierarchy ifTrue:[
+ "/ always show the full name
+ ^ nm
+ ].
+ orgMode == #classHierarchy ifTrue:[
+ "/ always show the full name
+ ^ nm
+ ].
+
+ aClass isJavaClass ifTrue:[
+ "/ only show the last name, unless multiple packages are shown in the list
+ javaPackage := aClass package.
+ (self classList value contains:[:cls | cls package ~= javaPackage]) ifTrue:[
+ ^ nm
+ ].
+ ^ aClass lastName
+ ].
+
+ useFullName ifFalse:[
+ aClass isPrivate ifFalse:[
+ ^ aClass nameWithoutNameSpacePrefix
+ ]
+ ].
+
+ "/ full name required if owner is not in the list
+ owner := aClass owningClass.
+ (owner isNil
+ or:[(self classList value includesIdentical:owner) not]) ifTrue:[
+ ^ nm
+ ].
+
+ "/ namespace
+ indent := 0.
+ index := 1.
+ [(index := nm indexOf:$: startingAt:index) ~~ 0] whileTrue:[
+ indent := indent + 1.
+ index := index + 2.
+ ].
+ indent == 0 ifFalse:[
+ indent <= 5 ifTrue:[
+ indentString := #(
+ ''
+ ' '
+ ' '
+ ' '
+ ' '
+ ' '
+ ) at:indent+1.
+ ] ifFalse:[
+ indentString := String new:indent*2 withAll:Character space.
+ ].
+ nm := indentString , '::' , aClass nameWithoutPrefix
+ ].
+ ^ nm
+
+ "Modified: / 24.2.2000 / 17:52:28 / cg"
+!
+
+nameListForClasses:aClassList
+ "only reconstruct the names - class list & selection remains
+ unschanged. Invoked when the organizerMode mode changes"
+
+ |orgMode namespaces showNamespaces fullNameList nameList
+ filteredPackages filteredNameSpaces classesInCangeSet|
+
+ showNamespaces := false.
+
+ filteredNameSpaces := nameSpaceFilter value.
+ (filteredNameSpaces isNil
+ and:[self organizerMode value ~~ #namespace]) ifTrue:[
+ showNamespaces := true. "/ if no filter, always show the namespace.
+ ] ifFalse:[
+ (filteredNameSpaces size > 1
+ or:[(filteredNameSpaces size > 0)
+ and:[filteredNameSpaces includes:(self class nameListEntryForALL)]]) ifTrue:[
+ showNamespaces := true
+ ] ifFalse:[
+ "/ if there are classes from multiple namespaces,
+ "/ show the full name
+
+ namespaces := IdentitySet new.
+ fullNameList := OrderedCollection new.
+
+ aClassList
+ do:[:cls | |nm|
+ nm := cls nameInBrowser.
+ fullNameList add:nm.
+ namespaces add:cls topNameSpace.
+ ].
+ showNamespaces := namespaces size > 1
+ ].
+ ].
+
+ orgMode := organizerMode value.
+ filteredPackages := packageFilter value value.
+
+ classesInCangeSet := ChangeSet current changedClasses.
+ classesInCangeSet := classesInCangeSet collect:[:each | each theNonMetaclass].
+
+ nameList := aClassList
+ collect:[:cls |
+
+ |nm pkg emPkg hasExtensions isInChangeSet icon|
+
+ isInChangeSet := classesInCangeSet includes:cls theNonMetaclass.
+
+ nm := self nameListEntryFor:cls withNameSpace:showNamespaces.
+ isInChangeSet ifTrue:[
+ nm := self emphasizeForChangedCode:nm
+ ].
+
+ pkg := cls package.
+ hasExtensions := cls hasExtensions.
+ hasExtensions ifTrue:[
+ emPkg := self emphasizeForDifferentPackage:'+'. "/ self emphasizeForDifferentPackage:pkg.
+ ].
+
+ orgMode == #project ifTrue:[
+ (filteredPackages notNil
+ and:[(filteredPackages includes:cls package) not]) ifTrue:[
+ "/ class is in another packae;
+ "/ however, class is listed due to methods
+ "/ in the filtered package
+ hasExtensions ifTrue:[
+ nm := nm , emPkg.
+ ] ifFalse:[
+ nm := nm , ' [ ' , pkg, ' ]'.
+ ].
+ ] ifFalse:[
+ "/ any methods from other packages in this class ?
+ hasExtensions ifTrue:[
+ nm := nm , (self emphasizeForDifferentPackage:'+').
+ ].
+ ].
+ ] ifFalse:[
+ showClassPackages value == true ifTrue:[
+ "/ add the package;
+ hasExtensions ifTrue:[
+ nm := nm , (self emphasizeForDifferentPackage:pkg , '+').
+ isInChangeSet ifFalse:[
+ nm := self colorizeForDifferentPackage:nm
+ ].
+ ] ifFalse:[
+ nm := nm , (self colorizeGrey:(' [ ' , pkg, ' ]')).
+ ].
+ ] ifFalse:[
+ hasExtensions ifTrue:[
+ nm := nm , emPkg.
+ isInChangeSet ifFalse:[
+ nm := self colorizeForDifferentPackage:nm
+ ]
+ ].
+ ]
+ ].
+"/ cls isVisualStartable ifTrue:[
+"/ nm := LabelAndIcon icon:((SystemBrowser visualStartableClassIcon)
+"/ onDevice:self window device)
+"/ string:nm
+"/ ].
+ markApplicationsHolder value== true ifTrue:[
+ icon := self nameListIconForClass:cls.
+ icon isNil ifTrue:[
+ icon := SystemBrowser emptyIcon
+ ].
+ nm := LabelAndIcon icon:icon string:nm
+
+ ].
+ nm
+ ].
+
+ ^ nameList
+
+ "Modified: / 5.11.2001 / 09:50:27 / cg"
+!
+
+nameListIconForClass:cls
+ |c|
+
+ cls isVisualStartable ifTrue:[
+ ^ SystemBrowser startableVisualAppIcon
+ ].
+ cls isStartableWithMain ifTrue:[
+ ^ SystemBrowser startableClassIcon
+ ].
+ cls isLoaded ifFalse:[
+ ^ SystemBrowser autoloadedClassIcon
+ ].
+ c := cls.
+ [c notNil] whileTrue:[
+ c == Warning ifTrue:[
+ ^ SystemBrowser warningClassIcon
+ ].
+ c == Query ifTrue:[
+ ^ SystemBrowser queryClassIcon
+ ].
+ c == Notification ifTrue:[
+ ^ SystemBrowser notificationClassIcon
+ ].
+ c == Error ifTrue:[
+ ^ SystemBrowser errorClassIcon
+ ].
+ c == GenericException ifTrue:[
+ ^ SystemBrowser exceptionClassIcon
+ ].
+ c == SimpleView ifTrue:[
+ ^ SystemBrowser windowClassIcon
+ ].
+ c == Collection ifTrue:[
+ ^ SystemBrowser containerClassIcon
+ ].
+ (c == TestCase and:[cls isAbstract not "cls ~~ TestCase"]) ifTrue:[
+ ^ SystemBrowser testCaseClassIconFor:cls
+ ].
+ c := c superclass
+ ].
+ ^ nil
+!
+
+reconstructNameList
+ "only reconstruct the names - class list & selection remains
+ unschanged. Invoked when the organizerMode mode changes"
+
+ |prevMode listView oldNameList newNameList sav|
+
+ self classList value isNil ifTrue:[
+ self updateList
+ ].
+
+ newNameList := self nameListForClasses:(classList value ? #()).
+ oldNameList := self classNameList value ? #().
+ (newNameList
+ sameContentsAs: oldNameList
+ whenComparedWith:[:a :b | (a sameStringAndEmphasisAs: b)
+ and:[ a hasImage == b hasImage
+ and:[ a hasIcon == b hasIcon ]]]
+ )
+ ifTrue:[
+ "/ no need to update
+ ] ifFalse:[
+ listView := builder componentAt:#List.
+ (listView isNil or:[listView scrolledView isNil]) ifTrue:[
+ "/ invoked very early during setup
+ self classNameList value:newNameList
+ ] ifFalse:[
+ "/ avoid flicker and useless redraws
+
+ prevMode := listView scrollWhenUpdating.
+ listView scrollWhenUpdating:nil.
+
+ "/ this will lead to a selectionIndex change (done by the selListView);
+ "/ however, we dont want this here, since it recurses into
+ "/ a selectionChange. Therefore, temporarily disconnect the selectionIndexHolder...
+ [
+ self selectedClassNameIndices removeDependent:self.
+ "/ also, dont want a callback (selectionChangedByClick)
+ sav := listView action.
+ listView action:nil.
+ self classNameList value:newNameList.
+ ] ensure:[
+ listView action:sav.
+ self selectedClassNameIndices addDependent:self.
+ listView scrollWhenUpdating:prevMode.
+ ].
+ ]
+ ].
+
+ "Modified: / 31.10.2001 / 11:33:21 / cg"
+!
+
+release
+ super release.
+
+ currentNamespace removeDependent:self.
+ hidePrivateClasses removeDependent:self.
+ markApplicationsHolder removeDependent:self.
+ meta removeDependent:self.
+ selectedClassNameIndices removeDependent:self.
+ showClassPackages removeDependent:self.
+
+ "Created: / 5.2.2000 / 13:42:18 / cg"
+!
+
+updateClassesIn:aCollection
+ "replace any obsolete class in aCollection;
+ return true, if any was found"
+
+ |found meta classes|
+
+ found := false.
+
+ aCollection isSequenceable ifFalse:[
+ classes := aCollection copy.
+ aCollection removeAll.
+ classes do:[:cls |
+ |newClass|
+
+ meta := cls isMeta.
+ newClass := Smalltalk at:(cls theNonMetaclass name).
+ newClass isNil ifTrue:[
+ newClass := cls
+ ] ifFalse:[
+ meta ifTrue:[
+ newClass := newClass class
+ ]
+ ].
+ found := cls ~~ newClass.
+ aCollection add:newClass.
+ ].
+ ] ifTrue:[
+ aCollection keysAndValuesDo:[:idx :cls |
+ |newClass|
+
+ cls notNil ifTrue:[
+ meta := cls isMeta.
+ newClass := Smalltalk at:(cls theNonMetaclass name).
+ newClass isNil ifTrue:[
+ newClass := cls
+ ] ifFalse:[
+ meta ifTrue:[
+ newClass := newClass class
+ ]
+ ].
+ found := cls ~~ newClass.
+ aCollection at:idx put:newClass.
+ ]
+ ].
+ ].
+ ^ found
+!
+
+updateList
+ |prevSelection oldList newList newSelectionIndices
+ forceSelectionChange selectedClassNameIndicesHolder classList|
+
+ newList := self listOfClasses.
+ classList := self classList.
+ oldList := classList value ? #().
+
+ (newList ~= oldList
+ or:[self classNameList value isNil and:[newList size > 0]]) ifTrue:[
+ prevSelection := lastSelectedClasses ? #().
+ prevSelection := prevSelection select:[:each | each notNil].
+
+ (newList collect:[:each | each name]) = (oldList collect:[:each | each name]) ifTrue:[
+ "/ no need to tell anybody
+ classList setValue:newList.
+ ] ifFalse:[
+ classList value:newList.
+ ].
+ self reconstructNameList.
+
+ (prevSelection size == 0
+ and:[self selectedClasses value size ~~ 0]) ifTrue:[
+ "/ this happens during early startup time,
+ "/ when the selection is already (pre-)set,
+ "/ and the classList is generated the first time
+ "/ (i.e. when opened with preset selection)
+
+ "/ do not clobber the selection in this case.
+ prevSelection := self selectedClasses value.
+ "/ simulate a change, to force selection update in listView
+ forceSelectionChange := true.
+ ].
+
+ newSelectionIndices := prevSelection
+ collect:[:item | |cls|
+ cls := Smalltalk at:item theNonMetaclass name.
+ newList identityIndexOf:cls]
+ thenSelect:[:index | index ~~ 0].
+
+ selectedClassNameIndicesHolder := self selectedClassNameIndices.
+ ((selectedClassNameIndicesHolder value size ~~ self selectedClasses value size)
+ or:[newSelectionIndices ~= selectedClassNameIndicesHolder value])
+ ifTrue:[
+ newSelectionIndices notEmpty ifTrue:[
+ "/ force change (for dependents)
+ "/ selectedClassNameIndicesHolder value:newSelectionIndices.
+ ] ifFalse:[
+ prevSelection := self selectedClasses value.
+ newSelectionIndices := #().
+ ].
+ selectedClassNameIndicesHolder value:newSelectionIndices.
+
+ prevSelection notNil ifTrue:[
+ lastSelectedClasses := prevSelection.
+ ].
+ self updateOutputGenerator.
+ ].
+
+ ] ifFalse:[
+ "/ same classes - but name(s) could be differnet
+ newList size > 0 ifTrue:[
+ self reconstructNameList
+ ]
+ ].
+ listValid := true.
+
+ "Created: / 5.2.2000 / 13:42:18 / cg"
+ "Modified: / 31.10.2001 / 11:35:39 / cg"
+!
+
+updateListsFor:aClass
+ |classes found foundInSelection|
+
+ found := foundInSelection := false.
+
+ "/ update for a changed class in the classList
+ (classes := classList value) size > 0 ifTrue:[
+ (self updateClassesIn:classes) ifTrue:[
+ found := true
+ ].
+ (classes includes:nil) ifTrue:[
+self halt:'should not happen'.
+ classList value:(classes := classes select:[:each | each notNil]).
+ ].
+ ].
+ "/ possibly in the generator
+ ((classes := inGeneratorHolder value) isOrderedCollection
+ and:[classes size > 0]) ifTrue:[
+ (self updateClassesIn:classes) ifTrue:[
+ found := true
+ ].
+ (classes includes:nil) ifTrue:[
+self halt:'should not happen'.
+ inGeneratorHolder value:(classes select:[:each | each notNil]).
+ ]
+ ].
+ "/ and in the selection
+ (classes := self selectedClasses value) size > 0 ifTrue:[
+ (self updateClassesIn:classes) ifTrue:[
+ found := true.
+ foundInSelection := true.
+ ].
+ (classes includes:nil) ifTrue:[
+self halt:'should not happen'.
+ self selectedClasses value:(classes select:[:each | each notNil]).
+ ]
+ ].
+ "/ and in the last selection
+ (classes := lastSelectedClasses) size > 0 ifTrue:[
+ (self updateClassesIn:classes) ifTrue:[
+ found := true
+ ].
+ (classes includes:nil) ifTrue:[
+self halt:'should not happen'.
+ lastSelectedClasses := (classes select:[:each | each notNil]).
+ ]
+ ].
+
+ found ifFalse:[
+ "/ could be a new class (or no-longer autolaoded one).
+ listValid ifTrue:[
+ self enqueueDelayedUpdateList.
+ ].
+ listValid := false.
+ ].
+ foundInSelection ifTrue:[
+ "/ force update of output generator
+ self selectedClasses
+ removeDependent:self;
+ changed;
+ addDependent:self.
+ ].
+
+ "Modified: / 25.2.2000 / 23:54:19 / cg"
+! !
+
+!ClassList methodsFor:'setup'!
+
+postBuildWith:aBuilder
+ |classListView|
+
+ super postBuildWith:aBuilder.
+
+ classListView := aBuilder componentAt:'List'.
+ classListView notNil ifTrue:[
+ classListView allowDrag:true.
+ classListView dragObjectConverter:[:obj |
+ |nm class idx|
+
+ nm := obj theObject asString.
+ idx := classNameList value indexOf:nm.
+ idx == 0 ifTrue:[
+ idx := classNameList value indexOf:nm string.
+ ].
+ class := classList value at:idx.
+ DropObject newClass:class.
+ ].
+ ]
+! !
+
+!ClassList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_ClassList.st,v 1.1 2004-02-26 18:56:34 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_FullMethodCategoryList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,106 @@
+"{ Package: 'stx:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+MethodCategoryList subclass:#FullMethodCategoryList
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!FullMethodCategoryList class methodsFor:'documentation'!
+
+documentation
+"
+ embeddable application displaying the classes as listed by
+ the inputGenerator.
+ Provides an outputGenerator, which enumerates the classes and
+ their protocols (method-categories) in the selected classes.
+
+ [author:]
+ Claus Gittinger (cg@exept.de)
+"
+
+
+! !
+
+!FullMethodCategoryList methodsFor:'generators'!
+
+makeGenerator
+ "return a generator which enumerates the methods from the selected protocol;
+ that generator generates 4-element elements (includes the class and protocol),
+ in order to make the consumers only depend on one input
+ (i.e. to pass multiple-class and multiple-protocol info
+ without a need for another classHolder/protocolHolder in the methodList)."
+
+ ^ Iterator on:[:whatToDo |
+ |protocols all packages theProtocol|
+
+ protocols := self selectedProtocols value ? #().
+
+ all := protocols includes:(self class nameListEntryForALL).
+ packages := packageFilter value value.
+
+ protocols size > 0 ifTrue:[
+ protocols size == 1 ifTrue:[
+ theProtocol := protocols first.
+ Smalltalk allClassesDo:[:eachClass |
+ eachClass instAndClassSelectorsAndMethodsDo:[:sel :eachMethod |
+ |cat|
+
+ cat := eachMethod category.
+ (all
+ or:[theProtocol = cat]) ifTrue:[
+ (packages isNil
+ or:[packages includes:eachMethod package])
+ ifTrue:[
+ whatToDo value:eachMethod mclass value:cat value:sel value:eachMethod.
+ ].
+ ].
+ ].
+ ]
+ ] ifFalse:[
+ Smalltalk allClassesDo:[:eachClass |
+ eachClass instAndClassSelectorsAndMethodsDo:[:sel :eachMethod |
+ |cat|
+
+ cat := eachMethod category.
+ (all
+ or:[protocols includes:cat]) ifTrue:[
+ (packages isNil
+ or:[packages includes:eachMethod package])
+ ifTrue:[
+ whatToDo value:eachMethod mclass value:cat value:sel value:eachMethod.
+ ].
+ ].
+ ].
+ ]
+ ]
+ ]
+ ]
+! !
+
+!FullMethodCategoryList methodsFor:'private'!
+
+listOfMethodCategories
+ |categories|
+
+ categories := Set new.
+
+ "return all existing categories"
+ Method allInstancesDo:[:eachMethod |
+ categories add:eachMethod category
+ ].
+ categories := categories asOrderedCollection sort.
+ categories addFirst:(self class nameListEntryForALL).
+ ^ categories
+
+
+! !
+
+!FullMethodCategoryList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_FullMethodCategoryList.st,v 1.1 2004-02-26 18:56:25 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_HierarchicalClassCategoryList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,359 @@
+"{ Package: 'stx:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+ClassCategoryList subclass:#HierarchicalClassCategoryList
+ instanceVariableNames:'hierarchicalCategoryTree hierarchicalCategoryList
+ hierarchicalCategorySelection categoryToItemDictionary'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!HierarchicalClassCategoryList class methodsFor:'documentation'!
+
+documentation
+"
+ embeddable application displaying the classes as listed by
+ the inputGenerator.
+ Provides an outputGenerator, which enumerates the classes and
+ their protocols (method-categories) in the selected classes.
+
+ [author:]
+ Claus Gittinger (cg@exept.de)
+"
+
+
+! !
+
+!HierarchicalClassCategoryList class methodsFor:'interface specs'!
+
+windowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:HierarchicalClassCategoryList andSelector:#windowSpec
+ HierarchicalClassCategoryList new openInterface:#windowSpec
+ HierarchicalClassCategoryList open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ClassCategoryList'
+ #name: 'ClassCategoryList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 16 46 316 346)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#HierarchicalListViewSpec
+ #name: 'List'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #tabable: true
+ #model: #hierarchicalCategorySelection
+ #menu: #menuHolder
+ #hasHorizontalScrollBar: true
+ #hasVerticalScrollBar: true
+ #miniScrollerHorizontal: true
+ #listModel: #hierarchicalCategoryList
+ #multipleSelectOk: true
+ #highlightMode: #line
+ #doubleClickSelector: #doubleClicked:
+ #showLines: false
+ #indicatorSelector: #indicatorPressed:
+ #useDefaultIcons: false
+ #properties:
+ #(#PropertyListDictionary
+ #dragArgument: nil
+ #dropArgument: nil
+ #canDropSelector: #canDrop:
+ #dropSelector: #doDrop:
+ )
+ )
+ )
+
+ )
+ )
+! !
+
+!HierarchicalClassCategoryList class methodsFor:'plugIn spec'!
+
+aspectSelectors
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this. If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "Return a description of exported aspects;
+ these can be connected to aspects of an embedding application
+ (if this app is embedded in a subCanvas)."
+
+ ^ #(
+ #(#doubleClickChannel #action )
+ #forceGeneratorTrigger
+ #hideUnloadedClasses
+ #immediateUpdate
+ #inGeneratorHolder
+ #menuHolder
+ #nameSpaceFilter
+ #organizerMode
+ #outGeneratorHolder
+ #packageFilter
+ #selectedCategories
+ #selectionChangeCondition
+ #slaveMode
+ #updateTrigger
+ ).
+
+! !
+
+!HierarchicalClassCategoryList methodsFor:'aspects'!
+
+addCategory:category
+ |item path parentPath parentCategory parentItem|
+
+ item:= categoryToItemDictionary at:category ifAbsent:nil.
+ item isNil ifTrue:[
+ path := category asCollectionOfSubstringsSeparatedBy:$-.
+
+ item := ClassCategoryItem new.
+ item category:category.
+ item label:(path last).
+ categoryToItemDictionary at:category put:item.
+
+ category size > 0 ifTrue:[
+ "/ find the parent ...
+ parentPath := path copyWithoutLast:1.
+ parentCategory := parentPath asStringWith:$-.
+
+ parentItem := self addCategory:parentCategory .
+
+ parentItem add:item sortBlock:[:i1 :i2 | i1 category asLowercase < i2 category asLowercase].
+ ]
+ ].
+ ^ item
+!
+
+generateHierarchicalCategoryTree
+ |anchor|
+
+ self categoryList value isNil ifTrue:[
+ self updateList.
+ self categoryList value isNil ifTrue:[
+ ^ nil.
+ ]
+ ].
+
+ anchor := ClassCategoryItem new.
+ anchor category:nil.
+ anchor label:nil.
+
+ categoryToItemDictionary := Dictionary new.
+ categoryToItemDictionary at:'' asSymbol put:anchor.
+
+ self categoryList value do:[:eachCategory |
+ (categoryToItemDictionary includesKey:eachCategory) ifFalse:[
+ self addCategory:eachCategory
+ ].
+ ].
+
+ anchor recursiveSortChildren:[:i1 :i2 | i1 category asLowercase < i2 category asLowercase].
+ anchor expand.
+
+ ^ anchor
+!
+
+hierarchicalCategoryList
+ |anchor |
+
+ hierarchicalCategoryList isNil ifTrue:[
+ hierarchicalCategoryList := HierarchicalList new.
+ hierarchicalCategoryList showRoot:false.
+
+ (self slaveMode value ~~ true) ifTrue:[
+ anchor := self generateHierarchicalCategoryTree.
+ hierarchicalCategoryList root:anchor.
+ listValid := true
+ ] ifFalse:[
+ listValid := false
+ ]
+ ].
+ ^ hierarchicalCategoryList
+!
+
+hierarchicalCategorySelection
+ hierarchicalCategorySelection isNil ifTrue:[
+ hierarchicalCategorySelection := #() asValue.
+ hierarchicalCategorySelection addDependent:self.
+ ].
+ ^ hierarchicalCategorySelection.
+! !
+
+!HierarchicalClassCategoryList methodsFor:'change & update'!
+
+delayedUpdate:something with:aParameter from:changedObject
+ |cls sel oldMethod newMethod newPackage|
+
+ self inSlaveModeOrInvisible ifTrue:[
+ super delayedUpdate:something with:aParameter from:changedObject.
+ ^ self.
+ ].
+
+ changedObject == updateTrigger ifTrue:[
+ hierarchicalCategoryTree := nil.
+ self hierarchicalCategoryList.
+ self updateTreeSelectionFromList.
+ ^ self
+ ].
+
+ changedObject == slaveMode ifTrue:[
+ listValid ~~ true ifTrue:[
+ self enqueueDelayedUpdateList
+ ].
+ "/ self invalidateList.
+ ^ self
+ ].
+
+ changedObject == hierarchicalCategorySelection ifTrue:[
+ self updateSelectionFromTree.
+ ^ self
+ ].
+ changedObject == self selectedCategories ifTrue:[
+ "/ update the trees selection as appropriate
+"/ self updateTreeSelection.
+ self updateTreeSelectionFromList.
+ ].
+ changedObject == categoryList ifTrue:[
+ "/ update the tree
+ self hierarchicalCategoryList root:(self generateHierarchicalCategoryTree).
+ ^ self.
+ ].
+
+ super delayedUpdate:something with:aParameter from:changedObject
+
+ "Created: / 17.2.2000 / 23:41:02 / cg"
+ "Modified: / 26.2.2000 / 01:21:49 / cg"
+!
+
+updateSelectionFromTree
+ |treeSelection|
+
+ treeSelection := hierarchicalCategorySelection value
+ collect:[:eachIndex | |item|
+ item := hierarchicalCategoryList at:eachIndex ifAbsent:nil.
+ item category
+ ].
+
+ treeSelection asSet ~= (self selectedCategories value ? #()) asSet ifTrue:[
+ self selectedCategories value:treeSelection.
+ ]
+!
+
+updateTreeSelectionFromList
+ |listSelection selectedTreeItems treeSelection|
+
+ listSelection := self selectedCategories value.
+ selectedTreeItems := listSelection collect:[:itemString | self treeItemForString:itemString string].
+ treeSelection := selectedTreeItems collect:[:eachItem | hierarchicalCategoryList identityIndexOf:eachItem].
+ treeSelection := treeSelection asOrderedCollection.
+"/hierarchicalCategorySelection value
+"/ collect:[:eachIndex | |item|
+"/ item := hierarchicalCategoryList at:eachIndex ifAbsent:nil.
+"/ item category
+"/ ].
+"/
+"/ treeSelection asSet ~= (self selectedCategories value ? #()) asSet ifTrue:[
+"/ self selectedCategories value:treeSelection.
+"/ ]
+ self hierarchicalCategorySelection value:treeSelection
+! !
+
+!HierarchicalClassCategoryList methodsFor:'private'!
+
+makeItemVisible:itemString
+ |treeItem idx listView|
+
+ treeItem := self treeItemForString:itemString.
+ idx := hierarchicalCategoryList identityIndexOf:treeItem.
+ idx ~~ 0 ifTrue:[
+ (listView := self listView) notNil ifTrue:[
+ listView makeLineVisible:idx.
+ ]
+ ]
+!
+
+release
+ super release.
+
+ hierarchicalCategorySelection removeDependent:self.
+!
+
+treeItemForString:itemString
+ |itemPath treeItem|
+
+ itemPath := itemString string asCollectionOfSubstringsSeparatedBy:$-.
+ treeItem := hierarchicalCategoryList root.
+ [itemPath notEmpty] whileTrue:[
+ treeItem expand.
+ treeItem := treeItem detect:[:childItem | childItem label string = itemPath first] ifNone:nil.
+ itemPath := itemPath copyFrom:2.
+ ].
+ ^ treeItem
+! !
+
+!HierarchicalClassCategoryList methodsFor:'user actions'!
+
+doubleClicked:anIndex
+ |item|
+
+ item := hierarchicalCategoryList at:anIndex ifAbsent:nil.
+ item isNil ifTrue:[
+ ^ self
+ ].
+
+ (item canExpand not or:[item isExpanded]) ifTrue:[
+ doubleClickChannel notNil ifTrue:[
+ doubleClickChannel value:anIndex.
+ ] ifFalse:[
+ item collapse.
+ ].
+ ^ self
+ ].
+
+ item expand.
+!
+
+indicatorPressed:anIndex
+ |item sensor|
+
+ item := hierarchicalCategoryList at:anIndex ifAbsent:nil.
+
+ item isNil ifTrue:[
+ ^ self
+ ].
+
+ sensor := self window sensor.
+ (sensor ctrlDown or:[sensor shiftDown]) ifTrue:[
+ item recursiveToggleExpand
+ ] ifFalse:[
+ item toggleExpand
+ ].
+! !
+
+!HierarchicalClassCategoryList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_HierarchicalClassCategoryList.st,v 1.1 2004-02-26 18:57:02 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_HierarchicalClassList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,250 @@
+"{ Package: 'stx:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+ClassList subclass:#HierarchicalClassList
+ instanceVariableNames:'topClassHolder'
+ classVariableNames:'InheritedEntry'
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!HierarchicalClassList class methodsFor:'documentation'!
+
+documentation
+"
+ Like a ClassList, but shows classes hierarchical.
+
+ If topClassHolders value is non-nil, only that classes hierarchy
+ is shown.
+
+ embeddable application displaying the classes as listed by
+ the inputGenerator.
+ Provides an outputGenerator, which enumerates the classes and
+ their protocols (method-categories) in the selected classes.
+
+ [author:]
+ Claus Gittinger (cg@exept.de)
+"
+
+
+! !
+
+!HierarchicalClassList class methodsFor:'initialization'!
+
+initialize
+ InheritedEntry := '* inheritance *'
+
+ "Created: / 24.2.2000 / 20:19:19 / cg"
+! !
+
+!HierarchicalClassList class methodsFor:'queries-plugin'!
+
+aspectSelectors
+ ^ super aspectSelectors ,
+ #(
+ topClassHolder
+ )
+
+
+
+! !
+
+!HierarchicalClassList methodsFor:'aspects'!
+
+topClassHolder
+ topClassHolder isNil ifTrue:[
+ topClassHolder := ValueHolder new.
+ topClassHolder addDependent:self
+ ].
+ ^ topClassHolder
+
+!
+
+topClassHolder:aTriggerValue
+ topClassHolder notNil ifTrue:[
+ topClassHolder removeDependent:self
+ ].
+ topClassHolder := aTriggerValue.
+ topClassHolder notNil ifTrue:[
+ topClassHolder isBehavior ifTrue:[self halt:'should not happen'].
+ topClassHolder addDependent:self
+ ].
+! !
+
+!HierarchicalClassList methodsFor:'change & update'!
+
+classDefinitionChanged:aClass
+ |prevTop prevSelection newSelection selectedClassesHolder|
+
+ listValid ifFalse:[^ self].
+ slaveMode value == true ifTrue:[
+ self invalidateList.
+ ^ self.
+ ].
+
+ selectedClassesHolder := self selectedClasses.
+ prevSelection := selectedClassesHolder value copy.
+
+ prevTop := self topClassHolder value.
+ prevTop notNil ifTrue:[
+ (prevTop name = aClass name) ifTrue:[
+ "/ forced update
+ topClassHolder value:aClass.
+ ] ifFalse:[
+ (prevTop name = aClass class name) ifTrue:[
+ "/ forced update
+ topClassHolder value:aClass class.
+ ]
+ ]
+ ].
+
+ "/ must update the list (notice, that the hierarchy might have changed..)
+
+ self updateList.
+
+ selectedClassesHolder value ~= prevSelection ifTrue:[
+ newSelection := prevSelection collect:[:eachOldClass | Smalltalk classNamed:(eachOldClass name)].
+ selectedClassesHolder value:newSelection.
+ ]
+
+ "Modified: / 26.2.2000 / 01:17:01 / cg"
+!
+
+classRemoved:aClass
+ |prevTop newTop prevSel nPrevSelected selectedClassesHolder newSelection wasMeta|
+
+ prevTop := self topClassHolder value.
+
+ prevTop notNil ifTrue:[
+ wasMeta := prevTop isMeta.
+ newTop := prevTop theNonMetaclass.
+ [newTop notNil and:[(Smalltalk at:newTop name) ~= newTop]] whileTrue:[
+ newTop := newTop superclass.
+ ].
+ wasMeta ifTrue:[
+ newTop := newTop theMetaclass
+ ].
+ newTop ~~ prevTop ifTrue:[
+ self topClassHolder value:newTop.
+ ].
+ ].
+
+ selectedClassesHolder := self selectedClasses.
+
+ "/ if there is a single selection,
+ "/ which is the old top, replace it.
+ prevSel := selectedClassesHolder value.
+ nPrevSelected := prevSel size.
+ nPrevSelected > 0 ifTrue:[
+ nPrevSelected == 1 ifTrue:[
+ prevSel first == aClass ifTrue:[
+ newTop notNil ifTrue:[
+ newSelection := Array with:newTop.
+ ] ifFalse:[
+ newSelection := #().
+ ]
+ ].
+ ] ifFalse:[
+ nPrevSelected ~~ 0 ifTrue:[
+ "/ clear the selection
+ newSelection := #().
+ ]
+ ].
+ newSelection notNil ifTrue:[
+ selectedClassesHolder value:newSelection
+ ].
+ ].
+
+ super classRemoved:aClass.
+! !
+
+!HierarchicalClassList methodsFor:'private'!
+
+addTo:aList whereSuperclassIs:aSuperclass
+ |theClasses|
+
+ aSuperclass isNil ifTrue:[
+ theClasses := Smalltalk allClasses select:[:cls | cls superclass isNil]
+ ] ifFalse:[
+ theClasses := aSuperclass subclasses.
+ ].
+ (self hideUnloadedClasses value) ifTrue:[
+ theClasses := theClasses select:[:cls | cls isLoaded].
+ ].
+
+ theClasses := theClasses asOrderedCollection sort:[:a :b | (a name ? '??') < (b name ? '??')].
+ theClasses do:[:aClass |
+ aList add:aClass.
+ self addTo:aList whereSuperclassIs:aClass
+ ].
+!
+
+defaultSlaveModeValue
+ self organizerMode value == #category ifTrue:[^ true].
+ ^ false
+!
+
+listOfClasses
+ |classes top|
+
+ classes := OrderedCollection new.
+ (top := self topClassHolder value) notNil ifTrue:[
+ top := top theNonMetaclass.
+ classes addAll:(top withAllSuperclasses copy reverse).
+ ].
+ self addTo:classes whereSuperclassIs:top.
+ ^ classes
+
+ "Modified: / 24.2.2000 / 13:27:43 / cg"
+!
+
+nameListEntryFor:aClass withNameSpace:useFullName
+ |indent superClass nm|
+
+ aClass == (self class nameListEntryForALL) ifTrue:[ ^ aClass ].
+ aClass == InheritedEntry ifTrue:[ ^ aClass ].
+
+ nm := aClass name.
+ indent := 0.
+
+ superClass := aClass superclass.
+ [superClass notNil] whileTrue:[
+ indent := indent + 1.
+ superClass := superClass superclass.
+ ].
+
+ indent == 0 ifTrue:[
+ ^ nm
+ ].
+
+ indent <= 5 ifTrue:[
+ indent := #(
+ ''
+ ' '
+ ' '
+ ' '
+ ' '
+ ' '
+ ) at:indent+1.
+ ] ifFalse:[
+ indent := String new:indent*4 withAll:Character space.
+ ].
+ ^ indent , nm
+
+ "Modified: / 24.2.2000 / 20:19:47 / cg"
+!
+
+release
+ super release.
+
+ topClassHolder removeDependent:self.
+! !
+
+!HierarchicalClassList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_HierarchicalClassList.st,v 1.1 2004-02-26 18:56:06 cg Exp $'
+! !
+
+HierarchicalClassList initialize!
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_HierarchicalProjectList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,456 @@
+"{ Package: 'stx:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+ProjectList subclass:#HierarchicalProjectList
+ instanceVariableNames:'hierarchicalProjectTree selectedProjectItems packageIcon
+ hierarchicalProjectList hierarchicalProjectSelection
+ packageToItemDictionary'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!HierarchicalProjectList class methodsFor:'documentation'!
+
+documentation
+"
+ Like a ClassList, but shows classes hierarchical.
+
+ If topClassHolders value is non-nil, only that classes hierarchy
+ is shown.
+
+ embeddable application displaying the classes as listed by
+ the inputGenerator.
+ Provides an outputGenerator, which enumerates the classes and
+ their protocols (method-categories) in the selected classes.
+
+ [author:]
+ Claus Gittinger (cg@exept.de)
+"
+
+
+! !
+
+!HierarchicalProjectList class methodsFor:'interface specs'!
+
+windowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:HierarchicalProjectList andSelector:#windowSpec
+ HierarchicalProjectList new openInterface:#windowSpec
+ HierarchicalProjectList open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ProjectList'
+ #name: 'ProjectList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 16 46 316 346)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#HierarchicalListViewSpec
+ #name: 'HierarchicalListView1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #tabable: true
+ #model: #hierarchicalProjectSelection
+ #menu: #menuHolder
+ #hasHorizontalScrollBar: true
+ #hasVerticalScrollBar: true
+ #miniScrollerHorizontal: true
+ #listModel: #hierarchicalProjectList
+ #multipleSelectOk: true
+ #highlightMode: #line
+ #doubleClickSelector: #doubleClicked:
+ #indicatorSelector: #indicatorPressed:
+ #properties:
+ #(#PropertyListDictionary
+ #dragArgument: nil
+ #dropArgument: nil
+ #canDropSelector: #canDrop:
+ #dropSelector: #doDrop:
+ )
+ )
+ )
+
+ )
+ )
+!
+
+xxwindowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:HierarchicalProjectList andSelector:#windowSpec
+ HierarchicalProjectList new openInterface:#windowSpec
+ HierarchicalProjectList open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ProjectList'
+ #name: 'ProjectList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 12 22 312 322)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SelectionInTreeViewSpec
+ #name: 'List'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #model: #selectedProjectItems
+ #menu: #menuHolder
+ #hasHorizontalScrollBar: true
+ #hasVerticalScrollBar: true
+ #miniScrollerHorizontal: true
+ #showRoot: false
+ #showDirectoryIndicator: true
+ #isMultiSelect: true
+ #valueChangeSelector: #selectionChangedByClick
+ #hierarchicalList: #hierarchicalProjectTree
+ #childrenSelector: #actionToRetrieveChildren
+ #highlightMode: #line
+ #doubleClickChannel: #doubleClickChannel
+ )
+ #(#HierarchicalListViewSpec
+ #name: 'HierarchicalListView1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #tabable: true
+ #hasHorizontalScrollBar: true
+ #hasVerticalScrollBar: true
+ #miniScrollerHorizontal: true
+ #listModel: #hierarchicalProjectList
+ #multipleSelectOk: true
+ #highlightMode: #line
+ #doubleClickSelector: #doubleClicked:
+ #indicatorSelector: #indicatorPressed:
+ "/ #showLeftIndicators: false
+ )
+ )
+
+ )
+ )
+! !
+
+!HierarchicalProjectList class methodsFor:'plugIn spec'!
+
+aspectSelectors
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this. If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "Return a description of exported aspects;
+ these can be connected to aspects of an embedding application
+ (if this app is embedded in a subCanvas)."
+
+ ^ #(
+ #(#doubleClickChannel #action )
+ #forceGeneratorTrigger
+ #hideUnloadedClasses
+ #immediateUpdate
+ #inGeneratorHolder
+ #menuHolder
+ #organizerMode
+ #outGeneratorHolder
+ #selectedProjects
+ #selectionChangeCondition
+ #slaveMode
+ #updateTrigger
+ ).
+
+! !
+
+!HierarchicalProjectList methodsFor:'aspects'!
+
+generateHierarchicalProjectTree
+ |anchor|
+
+ self projectList value isNil ifTrue:[
+ self updateList.
+ self projectList value isNil ifTrue:[
+ ^ nil.
+ ]
+ ].
+
+ anchor := ProjectItem new.
+ anchor package:''.
+ anchor label:nil.
+
+ packageToItemDictionary := IdentityDictionary new.
+ packageToItemDictionary at:'' asSymbol put:anchor.
+
+ self projectList value do:[:eachPackageString |
+ |package|
+
+ package := eachPackageString asSymbol.
+ (packageToItemDictionary includesKey:package) ifFalse:[
+ self addPackage:package
+ ].
+ ].
+
+"/ Smalltalk allClassesDo:[:eachClass |
+"/ |package|
+"/
+"/ package := eachClass package asSymbol.
+"/ (packageToItemDictionary includesKey:package) ifFalse:[
+"/ self addPackage:package
+"/ ].
+"/ ].
+ anchor recursiveSortChildren:[:i1 :i2 | i1 label asLowercase < i2 label asLowercase].
+ anchor expand.
+
+ ^ anchor
+!
+
+hierarchicalProjectList
+ |anchor |
+
+ hierarchicalProjectList isNil ifTrue:[
+ hierarchicalProjectList := HierarchicalList new.
+ hierarchicalProjectList showRoot:false.
+
+ (self slaveMode value ~~ true) ifTrue:[
+ anchor := self generateHierarchicalProjectTree.
+ hierarchicalProjectList root:anchor.
+ listValid := true
+ ] ifFalse:[
+ listValid := false
+ ]
+ ].
+ ^ hierarchicalProjectList
+!
+
+hierarchicalProjectSelection
+ hierarchicalProjectSelection isNil ifTrue:[
+ hierarchicalProjectSelection := #() asValue.
+ hierarchicalProjectSelection addDependent:self.
+ ].
+ ^ hierarchicalProjectSelection.
+!
+
+updateTreeSelection
+ "/ must expand items as required
+ |itemsToSelect oldSelection newSelection|
+
+ itemsToSelect := OrderedCollection new.
+
+ (self selectedProjects value ? #()) do:[:eachSelectedProject |
+ |item child|
+
+ item := hierarchicalProjectList root.
+
+ (eachSelectedProject asCollectionOfSubstringsSeparatedByAny:':/') do:[:part |
+ item expand.
+ child := item detect:[:child | child label = part] ifNone:nil.
+ child notNil ifTrue:[
+ item := child.
+ ].
+ ].
+ itemsToSelect add:child.
+ ].
+ oldSelection := hierarchicalProjectSelection value.
+ newSelection := itemsToSelect collect:[:eachItem | hierarchicalProjectList identityIndexOf:eachItem].
+ oldSelection ~= newSelection ifTrue:[
+ hierarchicalProjectSelection value:newSelection.
+ ].
+! !
+
+!HierarchicalProjectList methodsFor:'change & update'!
+
+delayedUpdate:something with:aParameter from:changedObject
+ |cls sel oldMethod newMethod newPackage|
+
+ self inSlaveModeOrInvisible ifTrue:[
+ super delayedUpdate:something with:aParameter from:changedObject.
+ ^ self.
+ ].
+
+"/ (self slaveMode value == true) ifTrue:[
+"/ super delayedUpdate:something with:aParameter from:changedObject.
+"/ ^ self
+"/ ].
+
+ changedObject == updateTrigger ifTrue:[
+ hierarchicalProjectList := nil.
+ self hierarchicalProjectList.
+ self updateTreeSelection.
+ ^ self
+ ].
+
+ changedObject == slaveMode ifTrue:[
+ listValid ~~ true ifTrue:[
+ self enqueueDelayedUpdateList
+ ].
+ "/ self invalidateList.
+ self updateTreeSelection.
+ ^ self
+ ].
+
+ changedObject == hierarchicalProjectSelection ifTrue:[
+ self updateSelectionFromTree.
+ ^ self
+ ].
+"/ changedObject == self selectedProjects ifTrue:[
+"/ "/ update the trees selection as appropriate
+"/ self updateTreeSelection.
+"/ ].
+ changedObject == projectList ifTrue:[
+ "/ update the tree
+ self hierarchicalProjectList root:(self generateHierarchicalProjectTree).
+ ^ self.
+ ].
+
+ super delayedUpdate:something with:aParameter from:changedObject
+
+ "Created: / 17.2.2000 / 23:41:02 / cg"
+ "Modified: / 26.2.2000 / 01:21:49 / cg"
+!
+
+enqueueDelayedAddPackage:package
+ NewSystemBrowser synchronousUpdate == true ifTrue:[
+ self addPackage:package.
+ ^ self
+ ].
+ ^ self
+ enqueueMessage:#addPackage:
+ for:self
+ arguments:(Array with:package)
+!
+
+update:something with:aParameter from:changedObject
+ something == #methodTrap ifTrue:[
+ "/ dont care for that.
+ ^ self.
+ ].
+ changedObject == organizerMode ifTrue:[
+ "/ dont care for that.
+ ^ self.
+ ].
+ super update:something with:aParameter from:changedObject
+!
+
+updateSelectionFromTree
+ |treeSelection|
+
+ treeSelection := hierarchicalProjectSelection value
+ collect:[:eachIndex | |item|
+ item := hierarchicalProjectList at:eachIndex ifAbsent:nil.
+ item package
+ ].
+
+ treeSelection asSet ~= (self selectedProjects value ? #()) asSet ifTrue:[
+ self selectedProjects value:treeSelection.
+ ]
+! !
+
+!HierarchicalProjectList methodsFor:'private'!
+
+addPackage:package
+ |i p pp l parentPackage parentItem idx|
+
+ i:= packageToItemDictionary at:package asSymbol ifAbsent:nil.
+ i isNil ifTrue:[
+ i := ProjectItem new.
+ i package:package.
+ packageToItemDictionary at:package asSymbol put:i.
+
+ package size > 0 ifTrue:[
+ "/ find the parent ...
+ p := package asCollectionOfSubstringsSeparatedByAny:':/.'.
+ pp := p copyWithoutLast:1.
+ l := (pp asStringWith:$/) size.
+ parentPackage := package copyTo:l.
+
+ parentItem := self addPackage:parentPackage asSymbol .
+
+ parentPackage size == 0 ifTrue:[
+ idx := 1.
+ ] ifFalse:[
+ idx := parentPackage size + 2
+ ].
+ i label:(package copyFrom:idx).
+
+ parentItem add:i sortBlock:[:i1 :i2 | i1 label asLowercase < i2 label asLowercase].
+
+ "/ TODO: special items for classes, resources etc.
+
+ ]
+ ].
+ ^ i
+!
+
+release
+ super release.
+
+ hierarchicalProjectSelection removeDependent:self.
+! !
+
+!HierarchicalProjectList methodsFor:'user actions'!
+
+doubleClicked:anIndex
+ |item|
+
+ item := hierarchicalProjectList at:anIndex ifAbsent:nil.
+ item isNil ifTrue:[
+ ^ self
+ ].
+
+ (item canExpand not or:[item isExpanded]) ifTrue:[
+ doubleClickChannel notNil ifTrue:[
+ doubleClickChannel value:anIndex.
+ ].
+ ^ self
+ ].
+
+ item expand.
+!
+
+indicatorPressed:anIndex
+ |item sensor|
+
+ item := hierarchicalProjectList at:anIndex ifAbsent:nil.
+
+ item isNil ifTrue:[
+ ^ self
+ ].
+
+ sensor := self window sensor.
+ (sensor ctrlDown or:[sensor shiftDown]) ifTrue:[
+ item recursiveToggleExpand
+ ] ifFalse:[
+ item toggleExpand
+ ].
+! !
+
+!HierarchicalProjectList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_HierarchicalProjectList.st,v 1.1 2004-02-26 18:56:30 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_ImplementingClassList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,96 @@
+"{ Package: 'stx:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+MethodList subclass:#ImplementingClassList
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!ImplementingClassList class methodsFor:'documentation'!
+
+documentation
+"
+ Like a ClassList, but shows classes hierarchical.
+
+ If topClassHolders value is non-nil, only that classes hierarchy
+ is shown.
+
+ embeddable application displaying the classes as listed by
+ the inputGenerator.
+ Provides an outputGenerator, which enumerates the classes and
+ their protocols (method-categories) in the selected classes.
+
+ [author:]
+ Claus Gittinger (cg@exept.de)
+"
+
+
+! !
+
+!ImplementingClassList methodsFor:'private'!
+
+listOfMethodNames
+ |methods entries newNameList
+ allCategories classUses allSelectors generator
+ "theMethod"|
+
+ generator := inGeneratorHolder value.
+ generator isNil ifTrue:[^ #() ].
+
+ classUses := Bag identityNew.
+ allSelectors := IdentitySet new.
+ allCategories := Set new.
+ entries := OrderedCollection new.
+
+ "/ generator generates nil-selector entries
+ "/ to pass multiple-class and multiple-protocol info
+ generator do:[:cls :cat :sel :mthd |
+ sel notNil ifTrue:[
+ entries add:(Array with:cls with:sel with:mthd).
+ classUses add:cls.
+ allSelectors add:sel.
+ allCategories add:mthd category.
+ ]
+ ].
+
+ entries sort:[:a :b | |clsNmA clsNmB|
+ clsNmA := (a at:1) name.
+ clsNmB := (b at:1) name.
+ clsNmA < clsNmB
+ ].
+
+ newNameList := entries collect:[:entry |
+ |class nm|
+
+ class := (entry at:1).
+ nm := class name.
+ ((allSelectors size > 1)
+ or:[(classUses occurrencesOf:class) > 1]) ifTrue:[
+ nm := nm , ' ' , (entry at:2)
+ ].
+ allCategories size > 1 ifTrue:[
+ nm := nm , ' {' , (entry at:3) category , '}'
+ ].
+"/ class name , ' ' , (entry at:2)
+ nm
+ ].
+ methods := entries collect:[:entry | (entry at:3)].
+ methodList := methods.
+"/ methods size == 1 ifTrue:[
+"/ theMethod := methods first.
+"/ self methodLabelHolder value:(theMethod mclass name , ' ' , theMethod selector).
+"/ ].
+ ^ newNameList.
+
+ "Created: / 5.2.2000 / 22:43:40 / cg"
+ "Modified: / 1.3.2000 / 21:00:26 / cg"
+! !
+
+!ImplementingClassList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_ImplementingClassList.st,v 1.1 2004-02-26 18:56:02 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_ImplementingMethodList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,266 @@
+"{ Package: 'stx:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+MethodList subclass:#ImplementingMethodList
+ instanceVariableNames:'selectorList selectedSelectors'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!ImplementingMethodList class methodsFor:'documentation'!
+
+documentation
+"
+ Like a ClassList, but shows classes hierarchical.
+
+ If topClassHolders value is non-nil, only that classes hierarchy
+ is shown.
+
+ embeddable application displaying the classes as listed by
+ the inputGenerator.
+ Provides an outputGenerator, which enumerates the classes and
+ their protocols (method-categories) in the selected classes.
+
+ [author:]
+ Claus Gittinger (cg@exept.de)
+"
+
+
+! !
+
+!ImplementingMethodList class methodsFor:'plugIn spec'!
+
+aspectSelectors
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this. If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "Return a description of exported aspects;
+ these can be connected to aspects of an embedding application
+ (if this app is embedded in a subCanvas)."
+
+ ^ #(
+ #classHolder
+ #(#doubleClickChannel #action )
+ #forceGeneratorTrigger
+ #immediateUpdate
+ #inGeneratorHolder
+ #outGeneratorHolder
+ #menuHolder
+ #methodCategoryHolder
+ #packageFilter
+ #selectedMethods
+ #selectionChangeCondition
+ #updateTrigger
+ ).
+
+
+
+! !
+
+!ImplementingMethodList methodsFor:'aspects'!
+
+selectedSelectors
+ selectedSelectors isNil ifTrue:[
+ selectedSelectors := ValueHolder new.
+ selectedSelectors addDependent:self
+ ].
+ ^ selectedSelectors.
+
+
+! !
+
+!ImplementingMethodList methodsFor:'change & update'!
+
+delayedUpdate:something with:aParameter from:changedObject
+ changedObject == selectedMethodNameIndices ifTrue:[
+"/ self selectedMethods value:(self selectedMethodNameIndices value collect:[:idx | methodList at:idx]).
+"/ lastSelectedMethods := self selectedMethods value.
+
+ self selectedSelectors value:(self selectedMethodNameIndices value collect:[:idx | selectorList at:idx]).
+ "/ lastSelectedSelectors := self selectedSelectors value.
+ ^ self
+ ].
+ changedObject == selectedSelectors ifTrue:[
+ self updateOutputGenerator.
+ ^ self
+ ].
+ super delayedUpdate:something with:aParameter from:changedObject
+
+ "Created: / 5.2.2000 / 13:42:14 / cg"
+ "Modified: / 6.2.2000 / 00:05:26 / cg"
+!
+
+selectedMethodsChanged
+ self updateOutputGenerator
+!
+
+selectionChanged
+ self halt:'should not happen'
+! !
+
+!ImplementingMethodList methodsFor:'generators'!
+
+makeGenerator
+ "return a generator which enumerates the methods from the selected protocol;
+ that generator generates 4-element elements (includes the class and protocol),
+ in order to make the consumers only depend on one input
+ (i.e. to pass multiple-class and multiple-protocol info
+ without a need for another classHolder/protocolHolder in the methodList)."
+
+ ^ Iterator on:[:whatToDo |
+ |selectors items packages|
+
+ items := OrderedCollection new.
+
+ selectors := self selectedSelectors value ? #().
+ selectors size > 0 ifTrue:[
+ packages := packageFilter value value.
+ selectors do:[:eachSelector |
+ classes do:[:eachClass | |mthd|
+ mthd := eachClass compiledMethodAt:eachSelector.
+ mthd notNil ifTrue:[
+ (packages isNil
+ or:[packages includes:mthd package]) ifTrue:[
+ items add:(Array with:eachClass with:mthd category with:eachSelector with:mthd)
+ ]
+ ]
+ ]
+ ]
+ ].
+ items sort:[:a :b |
+ |nm1 nm2 sel1 sel2|
+
+ nm1 := (a at:1) name.
+ nm2 := (b at:1) name.
+ nm1 < nm2 ifTrue:[ true ]
+ ifFalse:[
+ nm1 = nm2 ifFalse:[ false ]
+ ifTrue:[
+ sel1 := a at:3.
+ sel2 := b at:3.
+ sel1 < sel2
+ ]
+ ]
+ ].
+ items do:[:eachItem | whatToDo valueWithArguments:eachItem].
+ ]
+
+
+
+! !
+
+!ImplementingMethodList methodsFor:'private'!
+
+listOfMethodNames
+ |entries selectorsAlready newNameList
+ newClasses allCategories allSelectors generator
+ "showCategory" categoryOrCountPerSelector|
+
+ generator := inGeneratorHolder value.
+ generator isNil ifTrue:[^ #() ].
+
+ newClasses := IdentitySet new.
+ selectorsAlready := IdentitySet new.
+ entries := OrderedCollection new.
+ allCategories := Set new.
+ allSelectors := Bag identityNew.
+ categoryOrCountPerSelector := IdentityDictionary new.
+
+ "/ generator generates nil-selector entries
+ "/ to pass multiple-class and multiple-protocol info
+ generator do:[:cls :cat :sel :mthd |
+ |catsAlready|
+
+ sel notNil ifTrue:[
+ (selectorsAlready includes:sel) ifFalse:[
+ entries add:(Array with:cls with:sel with:mthd).
+ selectorsAlready add:sel
+ ].
+ newClasses add:cls.
+ allCategories add:cat.
+ allSelectors add:sel.
+
+ catsAlready := categoryOrCountPerSelector at:sel ifAbsent:nil.
+ catsAlready isNil ifTrue:[
+ categoryOrCountPerSelector at:sel put:cat.
+ ] ifFalse:[
+ catsAlready isInteger ifTrue:[
+ categoryOrCountPerSelector at:sel put:(catsAlready + 1).
+ ] ifFalse:[
+ catsAlready ~= cat ifTrue:[
+ categoryOrCountPerSelector at:sel put:2.
+ ]
+ ]
+ ]
+ ]
+ ].
+
+ entries sort:[:a :b | |nmA nmB clsNmA clsNmB|
+ nmA := (a at:2).
+ nmB := (b at:2).
+ nmA = nmB ifTrue:[
+ clsNmA := (a at:1) name.
+ clsNmB := (b at:1) name.
+ clsNmA < clsNmB
+ ] ifFalse:[
+ nmA < nmB
+ ]
+ ].
+
+ newNameList := OrderedCollection new.
+ selectorList := OrderedCollection new.
+
+ "/ showCategory := allCategories size > 1.
+
+ entries do:[:entry |
+ |cls sel mthd s catOrCounts|
+
+ cls := entry at:1.
+ sel := entry at:2.
+ mthd := entry at:3.
+"/ s := self
+"/ listEntryForMethod:mthd
+"/ selector:sel
+"/ class:cls
+"/ showClass:false
+"/ showCategory:showCategory
+"/ classFirst:false.
+"/ newNameList add:s.
+
+ selectorList add:sel.
+ s := sel.
+
+ catOrCounts := categoryOrCountPerSelector at:sel.
+ catOrCounts isInteger ifTrue:[
+ s := s , ' { ... }' "/ in multiple categories
+ ] ifFalse:[
+ allCategories size > 1 ifTrue:[
+ s := s , ' {' , catOrCounts , '}'
+ ]
+ ].
+ newNameList add:s.
+ ].
+
+ classes := newClasses.
+ ^ newNameList.
+
+ "Created: / 5.2.2000 / 22:43:40 / cg"
+ "Modified: / 1.3.2000 / 21:00:26 / cg"
+!
+
+release
+ super release.
+
+ selectedSelectors removeDependent:self.
+! !
+
+!ImplementingMethodList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_ImplementingMethodList.st,v 1.1 2004-02-26 18:55:41 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_InheritanceClassList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,160 @@
+"{ Package: 'stx:libtool' }"
+
+"{ NameSpace: Tools }"
+
+HierarchicalClassList subclass:#InheritanceClassList
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!InheritanceClassList class methodsFor:'documentation'!
+
+documentation
+"
+ Like a HierarchicalClassList, but shows class inheritance.
+ For non-meta classes, this is the same as would be shown in
+ the hierarchy list;
+ For metaclasses, the tree is extented through the class-behavior
+ hierarchy.
+
+ embeddable application displaying the classes as listed by
+ the inputGenerator.
+ Provides an outputGenerator, which enumerates the classes and
+ their protocols (method-categories) in the selected classes.
+
+ [author:]
+ Claus Gittinger (cg@exept.de)
+"
+
+
+! !
+
+!InheritanceClassList methodsFor:'change & update'!
+
+delayedUpdate:something with:aParameter from:changedObject
+ |top oldSelection newSelection showMeta|
+
+ self inSlaveModeOrInvisible ifTrue:[^ self].
+"/ (self slaveMode value == true) ifTrue:[^ self].
+
+ changedObject == slaveMode ifTrue:[
+ listValid ~~ true ifTrue:[
+ self enqueueDelayedUpdateList
+ ].
+ "/ self invalidateList.
+ ^ self
+ ].
+
+ changedObject == meta ifTrue:[
+ oldSelection := self selectedClasses value ? #().
+ showMeta := meta value.
+
+ newSelection := oldSelection collect:[:cls | showMeta ifTrue:[cls theMetaclass] ifFalse:[cls theNonMetaclass]].
+ newSelection := newSelection asOrderedCollection.
+
+ top := self topClassHolder value.
+ top notNil ifTrue:[
+ top := showMeta ifTrue:[top theMetaclass] ifFalse:[top theNonMetaclass].
+ self topClassHolder value:top.
+ ].
+ self invalidateList.
+
+(newSelection includes:nil) ifTrue:[self halt:'should not happen'].
+
+ self selectedClasses value:newSelection.
+ ^ self.
+ ].
+ super delayedUpdate:something with:aParameter from:changedObject
+
+ "Modified: / 24.2.2000 / 15:29:21 / cg"
+!
+
+getSelectedClassIndicesFromClasses
+ |classes selectedClasses selectedIndices|
+
+ selectedClasses := self selectedClasses value.
+ selectedClasses size == 0 ifTrue:[^ #() ].
+
+ classes := self classList value.
+ selectedIndices := selectedClasses
+ collect:[:aSelectedClass |
+ classes identityIndexOf:aSelectedClass.
+ ].
+ selectedIndices := selectedIndices select:[:idx | idx ~~ 0].
+ selectedIndices size == 0 ifTrue:[
+"/ meta value == true ifTrue:[
+"/self halt.
+"/ ] ifFalse:[
+"/self halt.
+"/ ]
+ ].
+
+ ^ selectedIndices
+
+ "Created: / 24.2.2000 / 19:48:05 / cg"
+ "Modified: / 24.2.2000 / 23:30:22 / cg"
+!
+
+getSelectedClassesFromIndices
+ |selected classes allSelected|
+
+ allSelected := false.
+
+ classes := classList value.
+ selected := self selectedClassNameIndices value collect:[:idx |
+ |cls|
+
+ cls := classes at:idx.
+"/ cls == AllEntry ifTrue:[
+"/ allSelected := true.
+"/ cls.
+"/ ] ifFalse:[
+"/ cls notNil ifTrue:[
+"/ meta value ifTrue:[
+"/ cls := cls theMetaclass
+"/ ] ifFalse:[
+"/ cls := cls theNonMetaclass
+"/ ].
+"/ ].
+"/ cls
+"/ ]
+ ].
+
+"/ allSelected ifTrue:[
+"/ selected := classList value select:[:cls | cls ~~ AllEntry].
+"/ ].
+
+ selected := selected select:[:cls | cls notNil].
+ ^selected.
+
+ "Created: / 24.2.2000 / 19:45:04 / cg"
+! !
+
+!InheritanceClassList methodsFor:'private'!
+
+defaultSlaveModeValue
+ self organizerMode value == #category ifTrue:[^ true].
+ ^ false
+!
+
+listOfClasses
+ |top classes|
+
+ (top := self topClassHolder value) isNil ifTrue:[
+ ^ super listOfClasses
+ ].
+
+ classes := top withAllSuperclasses copy reverse.
+"/ classes addFirst:InheritedEntry.
+ ^ classes
+
+ "Modified: / 26.2.2000 / 00:38:48 / cg"
+! !
+
+!InheritanceClassList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_InheritanceClassList.st,v 1.1 2004-02-26 18:55:29 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_MethodCategoryList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,1254 @@
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+BrowserList subclass:#MethodCategoryList
+ instanceVariableNames:'variableFilter filterClassVars lastSelectedProtocols classes
+ leafClasses protocolList rawProtocolList selectedProtocolIndices
+ lastGeneratedProtocols noAllItem packageFilterOnInput
+ methodVisibilityHolder'
+ classVariableNames:'AdditionalEmptyCategoriesPerClassName'
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!MethodCategoryList class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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.
+"
+! !
+
+!MethodCategoryList class methodsFor:'interface specs'!
+
+singleProtocolWindowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:MethodCategoryList andSelector:#singleProtocolWindowSpec
+ MethodCategoryList new openInterface:#singleProtocolWindowSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #singleProtocolWindowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ProtocolList'
+ #name: 'ProtocolList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 12 22 312 322)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#LabelSpec
+ #label: 'ProtocolName'
+ #name: 'ProtocolLabel'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #translateLabel: true
+ #labelChannel: #protocolLabelHolder
+ #menu: #menuHolder
+ )
+ )
+
+ )
+ )
+!
+
+windowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:MethodCategoryList andSelector:#windowSpec
+ MethodCategoryList new openInterface:#windowSpec
+ MethodCategoryList open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ProtocolList'
+ #name: 'ProtocolList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 16 46 316 346)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SequenceViewSpec
+ #name: 'List'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #tabable: true
+ #model: #selectedProtocolIndices
+ #menu: #menuHolder
+ #hasHorizontalScrollBar: true
+ #hasVerticalScrollBar: true
+ #miniScrollerHorizontal: true
+ #isMultiSelect: true
+ #valueChangeSelector: #selectionChangedByClick
+ #useIndex: true
+ #sequenceList: #protocolList
+ #doubleClickChannel: #doubleClickChannel
+ #properties:
+ #(#PropertyListDictionary
+ #dragArgument: nil
+ #dropArgument: nil
+ #canDropSelector: #canDrop:
+ #dropSelector: #doDrop:
+ )
+ )
+ )
+
+ )
+ )
+! !
+
+!MethodCategoryList class methodsFor:'plugIn spec'!
+
+aspectSelectors
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this. If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "Return a description of exported aspects;
+ these can be connected to aspects of an embedding application
+ (if this app is embedded in a subCanvas)."
+
+ ^ #(
+ #(#doubleClickChannel #action )
+ #filterClassVars
+ #forceGeneratorTrigger
+ #immediateUpdate
+ #inGeneratorHolder
+ #menuHolder
+ #noAllItem
+ #outGeneratorHolder
+ #packageFilter
+ #packageFilterOnInput
+ #selectedProtocols
+ #selectionChangeCondition
+ #updateTrigger
+ #variableFilter
+ #methodVisibilityHolder
+ ).
+! !
+
+!MethodCategoryList methodsFor:'aspects'!
+
+browserNameList
+ ^ self protocolList
+!
+
+defaultSlaveModeValue
+ ^ false.
+!
+
+filterClassVars
+ filterClassVars isNil ifTrue:[
+ filterClassVars := false asValue.
+ filterClassVars addDependent:self
+ ].
+ ^ filterClassVars
+
+ "Modified: / 31.1.2000 / 00:56:31 / cg"
+ "Created: / 5.2.2000 / 13:42:10 / cg"
+!
+
+filterClassVars:aValueHolder
+ filterClassVars notNil ifTrue:[
+ filterClassVars removeDependent:self
+ ].
+ filterClassVars := aValueHolder.
+ filterClassVars notNil ifTrue:[
+ filterClassVars addDependent:self
+ ].
+
+ "Modified: / 31.1.2000 / 00:56:31 / cg"
+ "Created: / 5.2.2000 / 13:42:10 / cg"
+!
+
+methodVisibilityHolder
+ methodVisibilityHolder isNil ifTrue:[
+ methodVisibilityHolder := false asValue.
+ methodVisibilityHolder addDependent:self
+ ].
+ ^ methodVisibilityHolder
+!
+
+methodVisibilityHolder:aValueHolder
+ methodVisibilityHolder notNil ifTrue:[
+ methodVisibilityHolder removeDependent:self
+ ].
+ methodVisibilityHolder := aValueHolder.
+ methodVisibilityHolder notNil ifTrue:[
+ methodVisibilityHolder addDependent:self
+ ].
+
+ "Modified: / 31.1.2000 / 00:56:31 / cg"
+ "Created: / 5.2.2000 / 13:42:10 / cg"
+!
+
+noAllItem
+ noAllItem isNil ifTrue:[
+ noAllItem := false asValue.
+ noAllItem addDependent:self
+ ].
+ ^ noAllItem
+!
+
+noAllItem:aValueHolder
+ noAllItem notNil ifTrue:[
+ noAllItem removeDependent:self
+ ].
+ noAllItem := aValueHolder.
+ noAllItem notNil ifTrue:[
+ noAllItem addDependent:self
+ ].
+!
+
+packageFilterOnInput
+ packageFilterOnInput isNil ifTrue:[
+ packageFilterOnInput := nil asValue.
+ packageFilterOnInput addDependent:self
+ ].
+ ^ packageFilterOnInput
+!
+
+packageFilterOnInput:aValueHolder
+ |prevFilter|
+
+ prevFilter := packageFilterOnInput value.
+ packageFilterOnInput notNil ifTrue:[
+ packageFilterOnInput removeDependent:self
+ ].
+ packageFilterOnInput := aValueHolder.
+ packageFilterOnInput notNil ifTrue:[
+ packageFilterOnInput addDependent:self
+ ].
+ prevFilter ~= packageFilterOnInput value ifTrue:[
+ self enqueueDelayedUpdateList
+ ].
+!
+
+protocolLabelHolder
+ ^ self pseudoListLabelHolder
+!
+
+protocolList
+ protocolList isNil ifTrue:[
+ protocolList := List new. "/ ValueHolder new
+ ].
+ ^ protocolList
+
+ "Modified: / 31.1.2000 / 00:56:31 / cg"
+ "Created: / 5.2.2000 / 13:42:10 / cg"
+!
+
+rawProtocolList
+ rawProtocolList isNil ifTrue:[
+ rawProtocolList := List new.
+ ].
+ ^ rawProtocolList
+!
+
+selectedProtocolIndices
+ selectedProtocolIndices isNil ifTrue:[
+ selectedProtocolIndices := ValueHolder new.
+ selectedProtocolIndices addDependent:self
+ ].
+ ^ selectedProtocolIndices.
+!
+
+selectedProtocols
+ ^ self selectionHolder
+!
+
+selectedProtocols:aValueHolder
+ ^ self selectionHolder:aValueHolder
+!
+
+variableFilter
+ variableFilter isNil ifTrue:[
+ variableFilter := false asValue.
+ variableFilter addDependent:self
+ ].
+ ^ variableFilter
+
+ "Modified: / 31.1.2000 / 00:56:31 / cg"
+ "Created: / 5.2.2000 / 13:42:10 / cg"
+!
+
+variableFilter:aValueHolder
+ variableFilter notNil ifTrue:[
+ variableFilter removeDependent:self
+ ].
+ variableFilter := aValueHolder.
+ variableFilter notNil ifTrue:[
+ variableFilter addDependent:self
+ ].
+
+ "Modified: / 31.1.2000 / 00:56:31 / cg"
+ "Created: / 5.2.2000 / 13:42:10 / cg"
+! !
+
+!MethodCategoryList methodsFor:'change & update'!
+
+classDefinitionChanged:aClass
+ |refetch anyChange|
+
+ anyChange := false.
+ refetch := [:oldClass |
+ |nm cls newClass|
+
+ nm := oldClass theNonMetaclass name.
+ oldClass isMeta ifTrue:[
+ newClass := Smalltalk at:nm.
+ newClass isNil ifTrue:[
+ Transcript showCR:'oops - browser lost class ' , nm.
+ newClass := oldClass
+ ] ifFalse:[
+ newClass := newClass theMetaclass
+ ]
+ ] ifFalse:[
+ newClass := Smalltalk at:nm
+ ].
+ newClass ~~ oldClass ifTrue:[
+ anyChange := true.
+ ].
+ newClass
+ ].
+
+ classes := classes collect:refetch.
+ leafClasses := leafClasses collect:refetch.
+ anyChange ifTrue:[
+ self updateOutputGenerator
+ ].
+!
+
+delayedUpdate:something with:aParameter from:changedObject
+ |sel oldMethod newMethod mthd selectedCategories selectedProtocolsHolder oldProtocol newProtocol
+ rawProtocolListHolder rawProtocolList oldSelectedProtocols newSelectedProtocols newIndices idx cls listView|
+
+ selectedProtocolsHolder := self selectedProtocols.
+ rawProtocolListHolder := self rawProtocolList.
+
+ changedObject == Smalltalk ifTrue:[
+ classes notNil ifTrue:[
+ something == #methodCategory ifTrue:[
+ cls := aParameter at:1.
+ (cls notNil and:[classes includesIdentical:cls]) ifTrue:[
+ mthd := aParameter at:2.
+ newProtocol := mthd category.
+ oldProtocol := aParameter at:3.
+
+ self invalidateList.
+
+ selectedCategories := selectedProtocolsHolder value.
+ selectedCategories size > 0 ifTrue:[
+ selectedCategories := selectedCategories collect:[:each | each ifNil:[self class nameListEntryForNILCategory]].
+ selectedCategories := selectedCategories collect:[:each | each string].
+
+ ((selectedCategories includes:oldProtocol)
+ or:[ (selectedCategories includes:newProtocol)
+ or:[ selectedCategories includes:(self class nameListEntryForALL) ]])
+ ifTrue:[
+ self updateOutputGenerator.
+ ].
+ ].
+
+ ].
+ ^ self
+ ].
+
+ something == #methodInClass ifTrue:[
+ "/ a method has been added/removed/changed
+ cls := aParameter at:1.
+ (classes includesIdentical:cls) ifTrue:[
+ sel := aParameter at:2.
+ oldMethod := aParameter at:3.
+ newMethod := cls compiledMethodAt:sel.
+ oldMethod notNil ifTrue:[
+ variableFilter value size > 0 ifTrue:[
+ "/ sigh - must invalidate
+ self invalidateList.
+ ].
+ ^ self.
+ ].
+ "/ method was added - update the methodList
+ "/ Q: is this needed (methodCategoryList should send me a new inGenerator)
+ self invalidateList.
+
+ "/ if its category is selected, updateOutputGenerator
+ selectedCategories := selectedProtocolsHolder value.
+ selectedCategories size > 0 ifTrue:[
+ selectedCategories := selectedCategories collect:[:each | each ifNil:[self class nameListEntryForNILCategory]].
+ selectedCategories := selectedCategories collect:[:each | each string].
+
+ ((oldMethod notNil and:[selectedCategories includes:(oldMethod category)])
+ or:[ (newMethod notNil and:[selectedCategories includes:(newMethod category)])])
+ ifTrue:[
+ self updateOutputGenerator.
+ ].
+ ].
+ ].
+ ^ self.
+ ].
+
+ something == #methodInClassRemoved ifTrue:[
+ cls := aParameter at:1.
+ (classes includesIdentical:cls) ifTrue:[
+ sel := aParameter at:2.
+ "/ method was removed - update the list and output generator
+ self invalidateList.
+ "/ self updateOutputGenerator.
+ self slaveMode value == true ifFalse:[
+ self enqueueDelayedUpdateOutputGenerator.
+ ]
+ ].
+ ^ self.
+ ].
+
+ something == #classOrganization ifTrue:[
+ cls := aParameter.
+ (classes includesIdentical:cls) ifTrue:[
+ self invalidateList.
+ ] ifFalse:[
+ (classes contains:[:aClass | aClass name = cls name]) ifTrue:[
+ self error:'obsolete class: should not happen'.
+ ]
+ ].
+ ^ self.
+ ].
+
+ something == #projectOrganization ifTrue:[
+ aParameter notNil ifTrue:[
+ cls := aParameter at:1.
+ cls notNil ifTrue:[
+ ((classes includes:cls theMetaclass)
+ or:[(classes includes:cls theNonMetaclass)]) ifTrue:[
+ self invalidateList.
+ self slaveMode value == true ifFalse:[
+ self enqueueDelayedUpdateOutputGenerator.
+ ]
+ ].
+ ].
+ ] ifFalse:[
+ self invalidateList.
+ ].
+ ^ self
+ ].
+
+ (something == #classDefinition or:[something == #classVariables])
+ ifTrue:[
+ self classDefinitionChanged:aParameter.
+ ^ self
+ ].
+
+ "/ everything else is ignored
+ "/ self halt.
+ ].
+ ^ self
+ ].
+
+ changedObject == self selectedProtocolIndices ifTrue:[
+ oldSelectedProtocols := selectedProtocolsHolder value ? #().
+ oldSelectedProtocols := oldSelectedProtocols collect:[:each | each ifNil:[self class nameListEntryForNILCategory]].
+ oldSelectedProtocols := oldSelectedProtocols collect:[:each | each string].
+ newSelectedProtocols := self getSelectedProtocolsFromIndices.
+ oldSelectedProtocols ~= newSelectedProtocols ifTrue:[
+ selectedProtocolsHolder value:newSelectedProtocols.
+ ].
+ newSelectedProtocols size > 1 ifTrue:[
+ (newSelectedProtocols includes:(self class nameListEntryForALL)) ifTrue:[
+ rawProtocolList := rawProtocolListHolder value.
+ idx := rawProtocolList indexOf: (newSelectedProtocols copy remove:(self class nameListEntryForALL); yourself) first.
+ idx ~~ 0 ifTrue:[
+ (listView := self builder componentAt:#List) notNil ifTrue:[
+ listView makeLineVisible:idx.
+ ]
+ ]
+ ]
+ ].
+
+ ^ self
+ ].
+
+ changedObject == selectedProtocolsHolder ifTrue:[
+ rawProtocolList := rawProtocolListHolder value.
+ rawProtocolList size == 0 ifTrue:[
+ self updateList.
+ rawProtocolList := rawProtocolListHolder value.
+ ].
+ rawProtocolList notNil ifTrue:[
+ selectedCategories := selectedProtocolsHolder value ? #().
+ selectedCategories := selectedCategories collect:[:each | each ifNil:[self class nameListEntryForNILCategory]].
+ newIndices := selectedCategories
+ collect:[:each | rawProtocolList findFirst:[:p | p string = each string]].
+ newIndices := newIndices select:[:each | each ~~ 0].
+ newIndices ~= self selectedProtocolIndices value ifTrue:[
+ self selectedProtocolIndices setValue:nil. "/ to force update
+ self selectedProtocolIndices value:newIndices
+ ].
+ (lastGeneratedProtocols notNil
+ and:[(lastGeneratedProtocols includes:self class nameListEntryForALL)
+ and:[(selectedProtocolsHolder value ? #()) includes:self class nameListEntryForALL]])
+ ifTrue:[
+ "/ no need to update generator
+ ] ifFalse:[
+ self updateOutputGenerator.
+ ]
+ ].
+ ^ self
+ ].
+
+ (changedObject == variableFilter
+ or:[changedObject == filterClassVars
+ or:[changedObject == packageFilterOnInput]]) ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+
+ changedObject == methodVisibilityHolder ifTrue:[
+ self invalidateList.
+ self updateOutputGenerator.
+ ^ self
+ ].
+
+ lastGeneratedProtocols := nil.
+
+ changedObject == inGeneratorHolder ifTrue:[
+ selectedCategories := selectedProtocolsHolder value.
+
+ selectedCategories size > 0 ifTrue:[
+ oldSelectedProtocols := selectedCategories ? #().
+ oldSelectedProtocols := oldSelectedProtocols collect:[:each | each ifNil:[self class nameListEntryForNILCategory]].
+ oldSelectedProtocols := oldSelectedProtocols collect:[:each | each string].
+ self updateList.
+ rawProtocolList := rawProtocolListHolder value.
+ newSelectedProtocols := oldSelectedProtocols select:[:each | rawProtocolList includes:each].
+"/ selectedProtocolsHolder setValue:nil. "/ to force update
+ selectedProtocolsHolder value:newSelectedProtocols.
+ ^ self
+ ].
+ ].
+
+ super delayedUpdate:something with:aParameter from:changedObject
+
+ "Created: / 5.2.2000 / 13:42:10 / cg"
+ "Modified: / 29.2.2000 / 11:11:39 / cg"
+!
+
+getSelectedProtocolsFromIndices
+ |l|
+
+ l := self rawProtocolList value.
+ ^ self selectedProtocolIndices value collect:[:idx | l at:idx].
+!
+
+selectionChanged
+ |newSelectedCategories allEntry|
+
+ newSelectedCategories := self selectedProtocols value.
+
+ "/ the outputGenerator is only to be updated, if the output would really
+ "/ change ...
+ allEntry := self class nameListEntryForALL.
+
+ (lastSelectedProtocols notNil
+ and:[newSelectedCategories notNil
+ and:[(lastSelectedProtocols includes:(allEntry))
+ and:[newSelectedCategories includes:(allEntry)]]]) ifTrue:[
+ "/ no change ...
+ ^ self
+ ].
+
+ super selectionChanged.
+
+ "Created: / 5.2.2000 / 13:42:10 / cg"
+ "Modified: / 24.2.2000 / 14:12:12 / cg"
+!
+
+selectionChangedByClick
+ "we are not interested in that - get another notification
+ via the changed valueHolder"
+
+ lastSelectedProtocols := self getSelectedProtocolsFromIndices
+!
+
+update:something with:aParameter from:changedObject
+
+ "/ some can be ignored immediately
+ changedObject == Smalltalk ifTrue:[
+ something isNil ifTrue:[
+ "/ self halt "/ huh - Smalltalk changed - so what ?
+ ^ self.
+ ].
+"/ something == #classDefinition ifTrue:[
+"/ ^ self.
+"/ ].
+ something == #newClass ifTrue:[
+ ^ self.
+ ].
+ something == #classRemove ifTrue:[
+ ^ self.
+ ].
+ something == #classRename ifTrue:[
+ ^ self.
+ ].
+"/ something == #classVariables ifTrue:[
+"/ ^ self.
+"/ ].
+ something == #classComment ifTrue:[
+ ^ self.
+ ].
+ something == #organization ifTrue:[
+ ^ self.
+ ].
+ something == #methodTrap ifTrue:[
+ ^ self
+ ].
+ ].
+
+ super update:something with:aParameter from:changedObject.
+! !
+
+!MethodCategoryList methodsFor:'drag & drop'!
+
+canDrop:aDropContext
+ |cat methods|
+
+ methods := aDropContext dropObjects collect:[:obj | obj theObject].
+
+ (methods contains:[:aMethod | aMethod isMethod not]) ifTrue:[^ false].
+
+ cat := self categoryAtTargetPointOf:aDropContext.
+
+ (methods contains:[:aMethod | aMethod category ~= cat]) ifFalse:[^ false].
+ ^ cat notNil
+!
+
+categoryAtTargetPointOf:aDropContext
+ |p methodListView lineNr cat|
+
+ p := aDropContext targetPoint.
+
+ methodListView := aDropContext targetWidget.
+
+ lineNr := methodListView lineAtY:p y.
+ lineNr isNil ifTrue:[^ nil].
+
+ cat := rawProtocolList at:lineNr.
+ cat := cat string.
+ cat = self class nameListEntryForALL ifTrue:[^ nil].
+
+ ^ cat
+!
+
+doDrop:aDropContext
+ |cat methods|
+
+ methods := aDropContext dropObjects collect:[:aDropObject | aDropObject theObject].
+ (methods contains:[:something | something isMethod not]) ifTrue:[^ self].
+
+ cat := self categoryAtTargetPointOf:aDropContext.
+ cat notNil ifTrue:[
+ self masterApplication moveMethods:methods toProtocol:cat.
+ ].
+! !
+
+!MethodCategoryList methodsFor:'generators'!
+
+makeGenerator
+ "return a generator which enumerates the methods from the selected protocol;
+ that generator generates 4-element elements (includes the class and protocol),
+ in order to make the consumers only depend on one input
+ (i.e. to pass multiple-class and multiple-protocol info
+ without a need for another classHolder/protocolHolder in the methodList)."
+
+ ^ Iterator on:[:whatToDo |
+ |protocols allProtocols noCat static notStatic classSelectorPairsAlreadyDone
+ packages remainingClasses remainingCategories classesAlreadyDone|
+
+ noCat := (self class nameListEntryForNILCategory).
+ static := (self class nameListEntryForStatic).
+ notStatic := (self class nameListEntryForNonStatic).
+
+ protocols := self selectedProtocols value ? #().
+ protocols := protocols collect:[:each | (each ifNil:[noCat]) string].
+ lastGeneratedProtocols := protocols.
+ protocols := protocols asSet.
+
+ (leafClasses size > 0
+ and:[protocols size > 0]) ifTrue:[
+ allProtocols := protocols includes:(self class nameListEntryForALL).
+
+ packages := packageFilter value value.
+ (packages notNil and:[packages includes:(self class nameListEntryForALL)]) ifTrue:[
+ packages := nil.
+ ].
+
+ remainingClasses := leafClasses copy asIdentitySet.
+ remainingCategories := protocols copy asSet.
+
+ classesAlreadyDone := IdentitySet new.
+ classSelectorPairsAlreadyDone := Set new.
+
+ leafClasses do:[:aLeafClass |
+ (self classesToProcessForClasses:(Array with:aLeafClass)) do:[:aClass |
+ |supportsMethodCategories isJavaClass anyInThisClass|
+
+ (classesAlreadyDone includes:aClass) ifFalse:[
+ classesAlreadyDone add:aClass.
+
+ supportsMethodCategories := aClass supportsMethodCategories.
+ isJavaClass := aClass isJavaClass.
+ anyInThisClass := false.
+
+ aClass methodDictionary keysAndValuesDo:[:sel :mthd |
+ |cat|
+
+ supportsMethodCategories ifTrue:[
+ cat := mthd category.
+ ] ifFalse:[
+ isJavaClass ifTrue:[
+ cat := mthd isStatic ifTrue:[static] ifFalse:[notStatic]
+ ] ifFalse:[
+ cat := noCat.
+ ]
+ ].
+ (allProtocols or:[protocols includes:cat]) ifTrue:[
+ (packages isNil or:[packages includes:mthd package])
+ ifTrue:[
+
+ (methodVisibilityHolder value == #class) ifTrue:[
+ whatToDo value:aClass value:cat value:sel value:mthd.
+ ] ifFalse:[
+ (classSelectorPairsAlreadyDone includes:(aLeafClass->sel)) ifFalse:[
+ classSelectorPairsAlreadyDone add:(aLeafClass->sel).
+ whatToDo value:aClass value:cat value:sel value:mthd.
+ ].
+ ].
+
+ anyInThisClass := true.
+ remainingCategories remove:cat ifAbsent:nil.
+ ]
+ ]
+ ].
+ anyInThisClass ifTrue:[ remainingClasses remove:aClass ifAbsent:nil. ].
+ ].
+ ].
+ ].
+ remainingClasses do:[:aClass |
+ whatToDo value:aClass value:nil value:nil value:nil.
+ ].
+ remainingCategories do:[:cat |
+ whatToDo value:nil value:cat value:nil value:nil.
+ ]
+ ]
+ ]
+
+ "Created: / 5.2.2000 / 13:42:10 / cg"
+ "Modified: / 25.2.2000 / 22:21:52 / cg"
+! !
+
+!MethodCategoryList methodsFor:'private'!
+
+class:cls protocol:cat includesMethodsInAnyPackage:packageFilter
+ cls methodDictionary keysAndValuesDo:[:sel :mthd |
+ mthd category == cat ifTrue:[
+ (packageFilter includes:mthd package) ifTrue:[
+ ^ true
+ ]
+ ]
+ ].
+ ^ false
+!
+
+class:cls protocol:cat includesModsOfClassVariable:variablesToHighLight
+ ^ self class:cls protocol:cat includesRefsToVariable:variablesToHighLight askParserWith:#modifiedClassVars
+!
+
+class:cls protocol:cat includesModsOfInstanceVariable:variablesToHighLight
+ ^ self class:cls protocol:cat includesRefsToVariable:variablesToHighLight askParserWith:#modifiedInstVars
+!
+
+class:cls protocol:cat includesRefsToClassVariable:variablesToHighLight
+ ^ self class:cls protocol:cat includesRefsToVariable:variablesToHighLight askParserWith:#usedClassVars
+!
+
+class:cls protocol:cat includesRefsToInstanceVariable:variablesToHighLight
+ ^ self class:cls protocol:cat includesRefsToVariable:variablesToHighLight askParserWith:#usedInstVars
+!
+
+class:cls protocol:cat includesRefsToVariable:variablesToHighLight askParserWith:querySelector
+ |anyVarNameAccessable|
+
+ anyVarNameAccessable := cls allInstVarNames includesAny:variablesToHighLight.
+ anyVarNameAccessable ifFalse:[
+ anyVarNameAccessable := cls theNonMetaclass allClassVarNames includesAny:variablesToHighLight.
+ ].
+ anyVarNameAccessable ifFalse:[
+ "/ no need to parse
+ ^ false
+ ].
+
+ cls selectorsAndMethodsDo:[:sel :mthd |
+ |src parser usedVars|
+
+ mthd category = cat ifTrue:[
+ src := mthd source.
+ src notNil ifTrue:[
+ "
+ before doing a slow parse, quickly scan the
+ methods source for the variables name ...
+ "
+ (variablesToHighLight contains:[:varName | (src findString:varName) ~~ 0]) ifTrue:[
+ parser := Parser
+ parseMethod:src
+ in:cls
+ ignoreErrors:true
+ ignoreWarnings:true.
+ (parser notNil and:[parser ~~ #Error]) ifTrue:[
+ usedVars := parser perform:querySelector.
+ (usedVars includesAny:variablesToHighLight)
+ ifTrue:[
+ ^ true
+ ]
+ ]
+ ]
+ ] ifFalse:[
+ Transcript showCR:'Oops - cannot access methods source'.
+ ]
+ ]
+ ].
+ ^ false
+!
+
+classesToProcessForClasses:classes
+ ^ self classesToProcessForClasses:classes withVisibility:methodVisibilityHolder value.
+!
+
+listOfMethodCategories
+ |categoryList plainCategories classesProcessed leafClassesProcessed
+ generator nm variablesToHighlight classVarsToHighLight
+ itemsWithVarRefs itemsWithVarMods itemsWithExtensions itemsWithSuppressedExtensions
+ itemsInChangeSet
+ item packageFilterOnInput packageFilter nameListEntryForALL emp|
+
+ generator := inGeneratorHolder value.
+ generator isNil ifTrue:[ ^ #() ].
+
+ nameListEntryForALL := self class nameListEntryForALL.
+
+ packageFilterOnInput := self packageFilterOnInput value.
+ (packageFilterOnInput notNil and:[packageFilterOnInput includes:nameListEntryForALL]) ifTrue:[
+ packageFilterOnInput := nil
+ ].
+ packageFilter := self packageFilter value.
+ (packageFilter notNil and:[packageFilter includes:nameListEntryForALL]) ifTrue:[
+ packageFilter := nil
+ ].
+
+ categoryList := Set new.
+ itemsWithVarRefs := Set new.
+ itemsWithVarMods := Set new.
+ itemsWithExtensions := Set new.
+ itemsWithSuppressedExtensions := Set new.
+ itemsInChangeSet := Set new.
+ plainCategories := Set new.
+ classesProcessed := IdentitySet new.
+ leafClassesProcessed := IdentitySet new.
+ variablesToHighlight := variableFilter value.
+ classVarsToHighLight := filterClassVars value.
+
+ generator do:[:clsIn :catIn |
+ |emptyProtocols clsName doHighLight doHighLightRed suppress|
+
+ leafClassesProcessed add:clsIn.
+ (self classesToProcessForClasses:(Array with:clsIn)) do:[:cls |
+ |cats|
+
+ classesProcessed add:cls.
+
+ cls ~~ clsIn ifTrue:[
+ cats := cls categories
+ ] ifFalse:[
+ cats := Array with:catIn.
+ ].
+ cats do:[:cat |
+ cat notNil ifTrue:[
+ suppress := packageFilterOnInput notNil
+ and:[ (self class:cls protocol:cat includesMethodsInAnyPackage:packageFilterOnInput) not ].
+
+ suppress ifFalse:[
+ variablesToHighlight size > 0 ifTrue:[
+ (itemsWithVarRefs includes:cat) ifFalse:[
+ classVarsToHighLight ifTrue:[
+ doHighLight := self class:cls protocol:cat includesRefsToClassVariable:variablesToHighlight.
+ doHighLight ifTrue:[
+ doHighLightRed := self class:cls protocol:cat includesModsOfClassVariable:variablesToHighlight.
+ ].
+ ] ifFalse:[
+ doHighLight := self class:cls protocol:cat includesRefsToInstanceVariable:variablesToHighlight.
+ doHighLight ifTrue:[
+ doHighLightRed := self class:cls protocol:cat includesModsOfInstanceVariable:variablesToHighlight.
+ ].
+ ].
+ doHighLight ifTrue:[
+ itemsWithVarRefs add:cat.
+ doHighLightRed ifTrue:[
+ itemsWithVarMods add:cat.
+ ].
+ ]
+ ]
+ ].
+ categoryList add:cat.
+
+ AdditionalEmptyCategoriesPerClassName size > 0 ifTrue:[
+ clsName := cls name.
+ emptyProtocols := AdditionalEmptyCategoriesPerClassName at:clsName ifAbsent:nil.
+ emptyProtocols size > 0 ifTrue:[
+ emptyProtocols remove:cat ifAbsent:nil.
+ ].
+ emptyProtocols size == 0 ifTrue:[
+ AdditionalEmptyCategoriesPerClassName removeKey:clsName ifAbsent:nil
+ ].
+ ].
+ ]
+ ]
+ ]
+ ]
+ ].
+
+ classesProcessed do:[:eachClass |
+ |classPackage|
+
+ classPackage := eachClass package.
+ eachClass methodDictionary keysAndValuesDo:[:sel :mthd |
+ |mPackage mCategory|
+
+ mPackage := mthd package.
+ mCategory := mthd category.
+
+ #fixme.
+ mPackage = classPackage ifTrue:[
+ mPackage ~~ classPackage ifTrue:[
+ mthd setPackage:(mPackage := mPackage string asSymbol).
+ ]
+ ].
+ mPackage ~~ classPackage ifTrue:[
+ itemsWithExtensions add:mCategory.
+
+ (packageFilter notNil
+ and:[ (packageFilter includes:mPackage) not])
+ ifTrue:[
+ itemsWithSuppressedExtensions add:mCategory.
+ ].
+ ].
+ (ChangeSet current changedClasses includes:eachClass) ifTrue:[
+ (ChangeSet current includesChangeForClass:eachClass selector:mthd selector) ifTrue:[
+ itemsInChangeSet add:mCategory.
+ ]
+ ]
+ ]
+ ].
+
+ categoryList := categoryList asOrderedCollection.
+ self rawProtocolList removeAll.
+ rawProtocolList addAll:categoryList.
+
+ itemsWithExtensions do:[:cat |
+ (categoryList includes:cat) ifTrue:[
+ (itemsWithVarRefs includes:cat) ifFalse:[
+ categoryList remove:cat.
+ rawProtocolList remove:cat.
+ (itemsWithSuppressedExtensions includes:cat) ifTrue:[
+ item := cat , (self colorizeForDifferentPackage:' [ + ]').
+ ] ifFalse:[
+ item := self colorizeForDifferentPackage:cat.
+ ].
+ categoryList add:item.
+ rawProtocolList add:cat.
+ ]
+ ]
+ ].
+
+ itemsInChangeSet do:[:cat |
+ (categoryList includes:cat) ifTrue:[
+ categoryList remove:cat.
+ rawProtocolList remove:cat.
+ item := self colorizeForChangedCode:cat.
+ categoryList add:item.
+ rawProtocolList add:cat.
+ ]
+ ].
+
+ categoryList removeAll:itemsWithVarRefs.
+ rawProtocolList removeAll:itemsWithVarRefs.
+
+ itemsWithVarRefs do:[:cat |
+ item := cat allBold.
+ (itemsWithVarMods includes:cat) ifTrue:[
+ emp := (UserPreferences current emphasisForWrittenVariable).
+ ] ifFalse:[
+ emp := (UserPreferences current emphasisForReadVariable).
+ ].
+ item emphasisAllAdd:emp.
+ categoryList add:item.
+ rawProtocolList add:cat.
+ ].
+
+ classesProcessed size > 0 ifTrue:[
+ "/ those are simulated - in ST/X, empty categories do not
+ "/ really exist; however, during browsing, it makes sense.
+ AdditionalEmptyCategoriesPerClassName size > 0 ifTrue:[
+ AdditionalEmptyCategoriesPerClassName keysAndValuesDo:[:clsName :protocols |
+ (classesProcessed contains:[:cls | cls name = clsName]) ifTrue:[
+ categoryList addAll:protocols.
+ rawProtocolList addAll:protocols.
+ ]
+ ]
+ ].
+ ].
+
+ self makeIndependent.
+ classes := classesProcessed.
+ leafClasses := leafClassesProcessed.
+ self makeDependent.
+
+"/ itemsWithExtensions size > 0 ifTrue:[
+"/ categoryList := categoryList collect:[:eachCat | (itemsWithExtensions includes:eachCat)
+"/ ifTrue:[
+"/ eachCat , ' [ + ]'
+"/ ] ifFalse:[
+"/ eachCat
+"/ ]
+"/ ].
+"/ ].
+"/
+ rawProtocolList sortWith:categoryList.
+ categoryList size == 1 ifTrue:[
+ nm := categoryList first string.
+ classes size == 1 ifTrue:[
+ nm := classes first name , '-' , nm
+ ].
+ self protocolLabelHolder value:nm
+ ].
+ categoryList notEmpty ifTrue:[
+ noAllItem value ~~ true ifTrue:[
+ categoryList addFirst:nameListEntryForALL.
+ rawProtocolList addFirst:nameListEntryForALL.
+ ]
+ ].
+ ^ categoryList
+
+ "Created: / 5.2.2000 / 13:42:11 / cg"
+ "Modified: / 5.11.2001 / 13:59:19 / cg"
+!
+
+makeDependent
+ Smalltalk addDependent:self
+!
+
+makeIndependent
+ Smalltalk removeDependent:self.
+!
+
+release
+ super release.
+
+ filterClassVars removeDependent:self.
+ methodVisibilityHolder removeDependent:self.
+ noAllItem removeDependent:self.
+ packageFilterOnInput removeDependent:self.
+ selectedProtocolIndices removeDependent:self.
+ variableFilter removeDependent:self.
+!
+
+updateList
+ |prevClasses prevSelection newSelection newList oldList sameContents selectedProtocolsHolder rawList|
+
+ selectedProtocolsHolder := self selectedProtocols.
+
+ prevClasses := classes ifNil:[ #() ] ifNotNil:[ classes copy ].
+ oldList := self protocolList value copy.
+ newList := self listOfMethodCategories.
+
+ "/ oldListSize := self browserNameList size.
+ "/ newListSize := newList size.
+ self selectedProtocolIndices removeDependent:self.
+ sameContents := self updateListFor:newList.
+ self selectedProtocolIndices addDependent:self.
+ sameContents ifFalse:[
+ prevSelection := lastSelectedProtocols ? (selectedProtocolsHolder value) ? #().
+ "/ prevSelection := selectedProtocolsHolder value ? lastSelectedProtocols ? #().
+
+ rawList := self rawProtocolList value.
+ newSelection := prevSelection select:[:item | rawList includes:item string].
+
+ newSelection size > 0 ifTrue:[
+ "/ force change (for dependents)
+"/ selectedProtocolsHolder value:nil.
+"/ selectedProtocolsHolder value:newSelection.
+ selectedProtocolsHolder setValue:newSelection.
+ selectedProtocolsHolder changed:#value.
+ ] ifFalse:[
+ prevSelection := selectedProtocolsHolder value.
+ selectedProtocolsHolder value:nil.
+ ].
+ (prevSelection size > 0 or:[newSelection size > 0]) ifTrue:[
+ self enqueueDelayedUpdateOutputGenerator.
+ "/ self updateOutputGenerator.
+ ].
+
+"/ prevSelection notNil ifTrue:[
+"/ lastSelectedProtocols := prevSelection.
+"/ ].
+ ] ifTrue:[
+ "/ same list - but classes might have changed
+ "/ that is the case, if the class selection has been changed,
+ "/ to another class which has the same categories.
+ (prevClasses size ~= classes size
+ or:[prevClasses asOrderedCollection ~= (classes ? #()) asOrderedCollection ]) ifTrue:[
+ (newList size > 0 or:[oldList size > 0]) ifTrue:[
+ self updateOutputGenerator
+ ]
+ ] ifFalse:[
+"/ self protocolList value:newList.
+ ]
+ ].
+ listValid := true.
+
+ "Created: / 5.2.2000 / 13:42:11 / cg"
+ "Modified: / 29.2.2000 / 11:08:55 / cg"
+! !
+
+!MethodCategoryList methodsFor:'special'!
+
+addAdditionalProtocol:aProtocol forClass:aClass
+ |categories|
+
+ "/ those are simulated - in ST/X, empty categories do not
+ "/ really exist; however, during browsing, it makes sense.
+ AdditionalEmptyCategoriesPerClassName isNil ifTrue:[
+ AdditionalEmptyCategoriesPerClassName := Dictionary new.
+ ].
+ categories := AdditionalEmptyCategoriesPerClassName at:aClass name ifAbsent:nil.
+ categories isNil ifTrue:[
+ categories := Set new.
+ AdditionalEmptyCategoriesPerClassName at:aClass name put:categories.
+ ].
+ categories add:aProtocol.
+ aClass changed:#organization. "/ not really ... to force update
+ Smalltalk changed:#classOrganization with:aClass. "/ not really ... to force update
+!
+
+additionalProtocolForClass:aClass
+ "/ those are simulated - in ST/X, empty categories do not
+ "/ really exist; however, during browsing, it makes sense.
+ AdditionalEmptyCategoriesPerClassName isNil ifTrue:[ ^ #() ].
+ ^ AdditionalEmptyCategoriesPerClassName at:aClass name ifAbsent:[ #() ].
+!
+
+clearLastSelectedProtocol
+ lastSelectedProtocols := nil
+!
+
+removeAdditionalProtocol:aListOfProtocols forClass:aClass
+ |categories|
+
+ "/ those are simulated - in ST/X, empty categories do not
+ "/ really exist; however, during browsing, it makes sense.
+
+ AdditionalEmptyCategoriesPerClassName isNil ifTrue:[^ self].
+
+ categories := AdditionalEmptyCategoriesPerClassName at:aClass name ifAbsent:nil.
+ categories isNil ifTrue:[^ self].
+ categories removeAllFoundIn:aListOfProtocols.
+ categories isEmpty ifTrue:[
+ AdditionalEmptyCategoriesPerClassName removeKey:aClass name.
+ ].
+
+ aClass changed:#organization. "/ not really ... to force update
+ Smalltalk changed:#classOrganization with:aClass. "/ not really ... to force update
+!
+
+removeAllAdditionalProtocol
+ "/ those are simulated - in ST/X, empty categories do not
+ "/ really exist; however, during browsing, it makes sense.
+ AdditionalEmptyCategoriesPerClassName := nil
+
+
+!
+
+removeAllAdditionalProtocolForClass:aClass
+ "/ those are simulated - in ST/X, empty categories do not
+ "/ really exist; however, during browsing, it makes sense.
+ AdditionalEmptyCategoriesPerClassName notNil ifTrue:[
+ AdditionalEmptyCategoriesPerClassName removeKey:aClass name ifAbsent:nil
+ ].
+
+
+!
+
+renameAdditionalProtocol:oldName to:newName forClass:aClass
+ |categories|
+
+ "/ those are simulated - in ST/X, empty categories do not
+ "/ really exist; however, during browsing, it makes sense.
+
+ AdditionalEmptyCategoriesPerClassName isNil ifTrue:[^ self].
+ categories := AdditionalEmptyCategoriesPerClassName at:aClass name ifAbsent:nil.
+ categories isNil ifTrue:[^ self].
+ categories remove:oldName ifAbsent:nil.
+ categories add:newName.
+
+ aClass changed:#organization. "/ not really ... to force update
+ Smalltalk changed:#classOrganization with:aClass. "/ not really ... to force update
+! !
+
+!MethodCategoryList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_MethodCategoryList.st,v 1.1 2004-02-26 18:56:43 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_MethodList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,1403 @@
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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' }"
+
+"{ NameSpace: Tools }"
+
+BrowserList subclass:#MethodList
+ instanceVariableNames:'classes selectedMethodNameIndices methodList lastSelectedMethods
+ browserNameList variableFilter filterClassVars updateProcess
+ lastShowClass lastShowCategory lastShowClassFirst
+ showMethodInheritance lastMethodClass lastMethodClassesSubclasses
+ classAndSelectorsRedefinedBySubclassesOfClass showClass'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!MethodList class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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.
+"
+! !
+
+!MethodList class methodsFor:'interface specs'!
+
+singleMethodWindowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:MethodList andSelector:#singleMethodWindowSpec
+ MethodList new openInterface:#singleMethodWindowSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #singleMethodWindowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'SingleSelectorList'
+ #name: 'SingleSelectorList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 12 22 312 322)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#LabelSpec
+ #label: 'MethodName'
+ #name: 'MethodLabel'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #translateLabel: true
+ #labelChannel: #methodLabelHolder
+ #menu: #menuHolder
+ )
+ )
+
+ )
+ )
+
+ "Modified: / 1.3.2000 / 20:50:15 / cg"
+!
+
+windowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:MethodList andSelector:#windowSpec
+ MethodList new openInterface:#windowSpec
+ MethodList open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'SelectorList'
+ #name: 'SelectorList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 12 22 312 322)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SequenceViewSpec
+ #name: 'List'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #tabable: true
+ #model: #selectedMethodNameIndices
+ #menu: #menuHolder
+ #hasHorizontalScrollBar: true
+ #hasVerticalScrollBar: true
+ #miniScrollerHorizontal: true
+ #isMultiSelect: true
+ #valueChangeSelector: #selectionChangedByClick
+ #useIndex: true
+ #sequenceList: #browserNameList
+ #doubleClickChannel: #doubleClickChannel
+ )
+ )
+
+ )
+ )
+! !
+
+!MethodList class methodsFor:'plugIn spec'!
+
+aspectSelectors
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this. If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "Return a description of exported aspects;
+ these can be connected to aspects of an embedding application
+ (if this app is embedded in a subCanvas)."
+
+ ^ #(
+ #classHolder
+ #(#doubleClickChannel #action )
+ #forceGeneratorTrigger
+ #immediateUpdate
+ #inGeneratorHolder
+ #menuHolder
+ #methodCategoryHolder
+ #packageFilter
+ #selectedMethods
+ #selectionChangeCondition
+ #updateTrigger
+ #variableFilter
+ #filterClassVars
+ #showMethodInheritance
+ #sortBy
+ ).
+! !
+
+!MethodList methodsFor:'aspects'!
+
+browserNameList
+ browserNameList isNil ifTrue:[
+ browserNameList := List new.
+ ].
+ ^ browserNameList.
+
+ "Modified: / 31.1.2000 / 00:42:44 / cg"
+ "Created: / 5.2.2000 / 22:38:32 / cg"
+!
+
+defaultSlaveModeValue
+ ^ false.
+!
+
+filterClassVars
+ filterClassVars isNil ifTrue:[
+ filterClassVars := false asValue.
+ filterClassVars addDependent:self
+ ].
+ ^ filterClassVars
+!
+
+filterClassVars:aValueHolder
+ filterClassVars notNil ifTrue:[
+ filterClassVars removeDependent:self
+ ].
+ filterClassVars := aValueHolder.
+ filterClassVars notNil ifTrue:[
+ filterClassVars addDependent:self
+ ].
+!
+
+methodLabelHolder
+ ^ self pseudoListLabelHolder
+
+ "Created: / 1.3.2000 / 20:50:07 / cg"
+!
+
+methodList
+ ^ methodList
+!
+
+selectedMethodNameIndices
+ selectedMethodNameIndices isNil ifTrue:[
+ selectedMethodNameIndices := ValueHolder new.
+ selectedMethodNameIndices addDependent:self
+ ].
+ ^ selectedMethodNameIndices.
+
+ "Modified: / 5.2.2000 / 00:31:48 / cg"
+ "Created: / 5.2.2000 / 22:59:31 / cg"
+!
+
+selectedMethods
+ ^ self selectionHolder
+!
+
+selectedMethods:aValueHolder
+ ^ self selectionHolder:aValueHolder
+!
+
+showMethodInheritance
+ showMethodInheritance isNil ifTrue:[
+ showMethodInheritance := false asValue.
+ showMethodInheritance addDependent:self
+ ].
+ ^ showMethodInheritance
+!
+
+showMethodInheritance:aValueHolder
+ showMethodInheritance notNil ifTrue:[
+ showMethodInheritance removeDependent:self
+ ].
+ showMethodInheritance := aValueHolder.
+ showMethodInheritance notNil ifTrue:[
+ showMethodInheritance addDependent:self
+ ].
+!
+
+variableFilter
+ variableFilter isNil ifTrue:[
+ variableFilter := nil asValue.
+ variableFilter addDependent:self
+ ].
+ ^ variableFilter
+!
+
+variableFilter:aValueHolder
+ variableFilter notNil ifTrue:[
+ variableFilter removeDependent:self
+ ].
+ variableFilter := aValueHolder.
+ variableFilter notNil ifTrue:[
+ variableFilter addDependent:self
+ ].
+! !
+
+!MethodList methodsFor:'change & update'!
+
+delayedUpdate:something with:aParameter from:changedObject
+ |cls sel oldMethod newMethod methods newSelection
+ selectionHolder selection needSelectionChange|
+
+ selectionHolder := self selectedMethods.
+ selection := selectionHolder value.
+
+ changedObject == Smalltalk ifTrue:[
+ classes notNil ifTrue:[
+ something == #methodCategory ifTrue:[
+ "/ ignore here - methodCategoryList will tell me if required
+ ^ self
+ ].
+ something == #classOrganization ifTrue:[
+ "/ ignore here - methodCategoryList will tell me if required
+ ^ self
+ ].
+
+ something == #methodInClass ifTrue:[
+ "/ a method has been added/changed
+ cls := aParameter at:1.
+ (classes includesIdentical:cls) ifTrue:[
+ sel := aParameter at:2.
+ oldMethod := aParameter at:3.
+ newMethod := cls compiledMethodAt:sel.
+ (oldMethod notNil and:[newMethod notNil]) ifTrue:[
+ "a method was changed & acccepted;
+ No need for a rescan of the methodDictionary;
+ however, ensure that the refs to the old method are updated
+ "
+ methods := selection.
+ methods size > 0 ifTrue:[
+ (methods includesIdentical:oldMethod) ifTrue:[
+ needSelectionChange := true.
+ ]
+ ].
+ methodList replaceAllIdentical:oldMethod with:newMethod.
+ lastSelectedMethods notNil ifTrue:[
+ lastSelectedMethods replaceAllIdentical:oldMethod with:newMethod
+ ].
+ methods size > 0 ifTrue:[
+ methods := methods asOrderedCollection.
+ methods replaceAllIdentical:oldMethod with:newMethod.
+ ].
+
+ needSelectionChange == true ifTrue:[
+ selectionHolder setValue:methods.
+ selectionHolder changed.
+ ].
+ (variableFilter value size > 0
+ or:[oldMethod package ~= newMethod package
+ or:[oldMethod resources ~= newMethod resources]]) ifTrue:[
+ "/ only update that methods entry
+ self updateListEntryFor:newMethod.
+ "/ sigh - must invalidate
+ "/ self invalidateList.
+ ].
+ ^ self.
+ ].
+ "/ method was added - update the methodList
+ "/ Q: is this needed (methodCategoryList should send me a new inGenerator)
+ self invalidateList.
+ ].
+ ^ self.
+ ].
+
+ something == #methodInClassRemoved ifTrue:[
+ cls := aParameter at:1.
+ (classes includesIdentical:cls) ifTrue:[
+ sel := aParameter at:2.
+ "/ method was removed - update the methodList
+ "/ Q: is this needed (methodCategoryList should send me a new inGenerator)
+ self invalidateList.
+ ].
+ ^ self.
+ ].
+
+ something == #methodTrap ifTrue:[
+ cls := aParameter at:1.
+ sel := aParameter at:2.
+ (classes includesIdentical:cls) ifTrue:[
+ newMethod := cls compiledMethodAt:sel.
+ newMethod isNil ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+ newMethod isWrapped ifTrue:[
+ oldMethod := newMethod originalMethod
+ ] ifFalse:[
+ selection size > 0 ifTrue:[
+ oldMethod := selection detect:[:each | each isWrapped and:[each originalMethod == newMethod]] ifNone:nil.
+ ]
+ ].
+
+ selection size > 0 ifTrue:[
+ (selection includesIdentical:oldMethod) ifTrue:[
+ needSelectionChange := true.
+ ]
+ ].
+ methodList replaceAllIdentical:oldMethod with:newMethod.
+ lastSelectedMethods notNil ifTrue:[
+ lastSelectedMethods replaceAllIdentical:oldMethod with:newMethod
+ ].
+ selection size > 0 ifTrue:[
+ selection := selection asOrderedCollection.
+ selection replaceAllIdentical:oldMethod with:newMethod.
+ ].
+ needSelectionChange == true ifTrue:[
+ selectionHolder changed.
+ ].
+
+ "/ actually, could just change that single item ...
+ "/ ... might be cheaper, if list is huge.
+ "/ only update that methods entry
+ self updateListEntryFor:newMethod.
+ "/ self invalidateList.
+ ].
+ ^ self
+ ].
+
+ something == #projectOrganization ifTrue:[
+ aParameter notNil ifTrue:[
+ cls := aParameter at:1.
+ cls notNil ifTrue:[
+ ((classes includesIdentical:cls theNonMetaclass)
+ or:[(classes includesIdentical:cls theMetaclass)]) ifTrue:[
+ self invalidateList.
+ ].
+ ].
+ ] ifFalse:[
+ self invalidateList.
+ ].
+ ^ self
+ ].
+ "/ everything else is ignored
+ "/ self halt.
+ ].
+ ^ self
+ ].
+
+"/ something == #organization ifTrue:[
+"/self halt:'no longer'.
+"/^ self.
+"/ "/ a methods cateory has changed
+"/ (classes includesIdentical:changedObject) ifTrue:[
+"/ aParameter isSymbol ifTrue:[
+"/ "/ a method with a new category
+"/ (self methodList includesIdentical:(changedObject compiledMethodAt:aParameter)) ifTrue:[
+"/ self invalidateList.
+"/ ].
+"/ ^ self.
+"/ ].
+"/ "/ a new category (no method yet)
+"/ self invalidateList
+"/ ].
+"/ ^ self
+"/ ].
+
+"/ something == #methodDictionary ifTrue:[
+"/self halt:'no longer'.
+"/^ self.
+"/ "/ a method has been added/removed
+"/ (classes includesIdentical:changedObject) ifTrue:[
+"/ aParameter isArray ifTrue:[
+"/ sel := aParameter at:1.
+"/ oldMethod := aParameter at:2.
+"/ newMethod := changedObject compiledMethodAt:sel.
+"/ oldMethod notNil ifTrue:[
+"/ "a method was changed & acccepted;
+"/ No need for a rescan of the methodDictionary;
+"/ however, ensure that the refs to the old method are updated
+"/ "
+"/ methods := selection.
+"/ methods size > 0 ifTrue:[
+"/ (methods includesIdentical:oldMethod) ifTrue:[
+"/ needSelectionChange := true.
+"/ ]
+"/ ].
+"/ methodList replaceAllIdentical:oldMethod with:newMethod.
+"/ lastSelectedMethods notNil ifTrue:[
+"/ lastSelectedMethods replaceAllIdentical:oldMethod with:newMethod
+"/ ].
+"/ methods size > 0 ifTrue:[
+"/ methods := methods asOrderedCollection.
+"/ methods replaceAllIdentical:oldMethod with:newMethod.
+"/ ].
+"/ needSelectionChange == true ifTrue:[
+"/ selectionHolder setValue:methods.
+"/ selectionHolder changed.
+"/ ].
+"/ ^ self.
+"/ ]
+"/ ].
+"/ "/ class has changed must update the methodList
+"/ self invalidateList.
+"/ ].
+"/ ^ self.
+"/ ].
+
+"/ something == #projectOrganization ifTrue:[
+"/ ((classes includesIdentical:changedObject theNonMetaclass)
+"/ or:[(classes includesIdentical:changedObject theMetaclass)]) ifTrue:[
+"/ self invalidateList.
+"/ ].
+"/ ^ self
+"/ ].
+
+ changedObject == sortBy ifTrue:[
+ listValid ~~ true ifTrue:[ "/ could be nil
+ inGeneratorHolder value isNil ifTrue:[
+ "/ ok, no need to react on that one
+ "/ (will invalidate anyway, once I have more info at hand)
+ ^ self
+ ].
+ ].
+ self invalidateList.
+ ^ self
+ ].
+
+ (changedObject == variableFilter
+ or:[changedObject == filterClassVars
+ or:[changedObject == showMethodInheritance]]) ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+
+ changedObject == selectedMethodNameIndices ifTrue:[
+ newSelection := self selectedMethodNameIndices value collect:[:idx | methodList at:idx].
+ newSelection ~= selection ifTrue:[
+ selectionHolder value:newSelection.
+ lastSelectedMethods := newSelection.
+ lastSelectedMethods notNil ifTrue:[
+ lastSelectedMethods := lastSelectedMethods asOrderedCollection
+ ].
+ ] ifFalse:[
+ "/ a reselect - force update
+"/ selection size == 1 ifTrue:[
+ selectionHolder setValue:newSelection.
+ selectionHolder changed:#value.
+"/ ].
+ ].
+ ^ self
+ ].
+ changedObject == selectionHolder ifTrue:[
+ self selectedMethodsChanged.
+ lastSelectedMethods := selectionHolder value.
+ lastSelectedMethods notNil ifTrue:[
+ lastSelectedMethods := lastSelectedMethods asOrderedCollection
+ ].
+ ^ self
+ ].
+"/ something == #methodTrap ifTrue:[
+"/self halt:'no longer'.
+"/^ self.
+"/ (classes includesIdentical:changedObject) ifTrue:[
+"/ newMethod := changedObject compiledMethodAt:aParameter.
+"/ newMethod isNil ifTrue:[
+"/ self invalidateList.
+"/ ^ self
+"/ ].
+"/ newMethod isWrapped ifTrue:[
+"/ oldMethod := newMethod originalMethod
+"/ ] ifFalse:[
+"/ selection size > 0 ifTrue:[
+"/ oldMethod := selection detect:[:each | each isWrapped and:[each originalMethod == newMethod]] ifNone:nil.
+"/ ]
+"/ ].
+"/
+"/ selection size > 0 ifTrue:[
+"/ (selection includesIdentical:oldMethod) ifTrue:[
+"/ needSelectionChange := true.
+"/ ]
+"/ ].
+"/"/ methodList replaceAllIdentical:oldMethod with:newMethod.
+"/ lastSelectedMethods notNil ifTrue:[
+"/ lastSelectedMethods replaceAllIdentical:oldMethod with:newMethod
+"/ ].
+"/ selection size > 0 ifTrue:[
+"/ selection := selection asOrderedCollection.
+"/ selection replaceAllIdentical:oldMethod with:newMethod.
+"/ ].
+"/ needSelectionChange == true ifTrue:[
+"/ selectionHolder changed.
+"/ ].
+"/ self invalidateList.
+"/ ^ self
+"/ ].
+"/ ^ self
+"/ ].
+ super delayedUpdate:something with:aParameter from:changedObject
+
+ "Created: / 5.2.2000 / 13:42:14 / cg"
+ "Modified: / 6.2.2000 / 00:05:26 / cg"
+!
+
+selectedMethodsChanged
+ "the set of selected methods has changed;
+ update the selection-index collection (for the selectionInListView)"
+
+ |indices methods reverseMap
+ selectedMethodsHolder selectedMethods selectedMethodNameIndicesHolder|
+
+ methods := methodList ? #().
+ methods size == 0 ifTrue:[
+ "/ this may happen during early startup,
+ "/ when invoked with a preset methodSelection,
+ "/ and the methodGenerator has not yet been setup
+ "/ to not clobber the selection, defer the update
+ "/ until the methodList arrives ...
+ ^ self
+ ].
+
+ selectedMethodsHolder := self selectedMethods.
+ selectedMethods := selectedMethodsHolder value.
+
+ "/ check if all is selected (likely)
+ ((selectedMethods size == methodList size)
+ and:[selectedMethods = methodList]) ifTrue:[
+ indices := (1 to:selectedMethods size)
+ ] ifFalse:[
+ selectedMethods size > 100 ifTrue:[
+ "/ check if all is selected (likely)
+ ((selectedMethods size == methodList size)
+ and:[selectedMethods = methodList]) ifTrue:[
+ indices := (1 to:selectedMethods size)
+ ] ifFalse:[
+ "/ for big collections, generate a reverse map
+ reverseMap := IdentityDictionary new.
+ methods keysAndValuesDo:[:idx :mthd | reverseMap at:mthd put:idx].
+ indices := selectedMethods collect:[:eachSelectedMethod |
+ reverseMap at:eachSelectedMethod ifAbsent:0
+ ]
+ ]
+ ] ifFalse:[
+ indices := (selectedMethods ? #()) collect:[:eachSelectedMethod |
+ methods identityIndexOf:eachSelectedMethod.
+ ]
+ ].
+ indices := indices select:[:idx | idx ~= 0].
+ ].
+
+ selectedMethodNameIndicesHolder := self selectedMethodNameIndices.
+ selectedMethodNameIndicesHolder value ~= indices ifTrue:[
+ selectedMethodNameIndicesHolder value:indices.
+ ]
+!
+
+selectionChanged
+ |methods|
+
+ methods := ((self selectedMethodNameIndices value) ? #()) collect:[:idx | methodList at:idx].
+ methods notEmpty ifTrue:[
+ lastSelectedMethods := methods asOrderedCollection.
+ ].
+ "/ to allow reselect, change my valueHolder, even if the same collection
+"/ self selectedMethods value ~= methods ifTrue:[
+ self selectedMethods value:methods
+"/ ]
+
+ "Created: / 5.2.2000 / 13:42:14 / cg"
+ "Modified: / 5.2.2000 / 23:32:20 / cg"
+!
+
+selectionChangedByClick
+ "we are not interested in that - get another notification
+ via the changed valueHolder"
+
+!
+
+update:something with:aParameter from:changedObject
+ |cls|
+
+ "/ some can be ignored immediately
+ changedObject == Smalltalk ifTrue:[
+ classes isNil ifTrue:[
+ ^ self.
+ ].
+ something isNil ifTrue:[
+ "/ self halt "/ huh - Smalltalk changed - so what ?
+ ^ self.
+ ].
+ something == #classComment ifTrue:[
+ ^ self.
+ ].
+ something == #classVariables ifTrue:[
+ ^ self.
+ ].
+ something == #organization ifTrue:[
+ ^ self.
+ ].
+ something == #methodCategory ifTrue:[
+ "/ ignore here - methodCategoryList will tell me if required
+ ^ self
+ ].
+ something == #classOrganization ifTrue:[
+ "/ ignore here - methodCategoryList will tell me if required
+ ^ self
+ ].
+ something == #methodTrap ifTrue:[
+ cls := aParameter at:1.
+ (classes includesIdentical:cls) ifFalse:[
+ ^ self
+ ].
+ ].
+
+ classAndSelectorsRedefinedBySubclassesOfClass := nil.
+
+ something == #classDefinition ifTrue:[
+ cls := aParameter.
+ (classes contains:[:aClass | aClass name == cls name]) ifFalse:[
+ ^ self "/ I dont care for that class
+ ].
+ classes := classes collect:[:eachClass | eachClass isMeta ifTrue:[
+ (Smalltalk at:eachClass theNonMetaclass name) class
+ ] ifFalse:[
+ Smalltalk at:eachClass name
+ ]
+ ].
+ self updateList.
+ ^ self.
+ ].
+ something == #newClass ifTrue:[
+ ^ self.
+ ].
+ something == #classRemove ifTrue:[
+ ^ self.
+ ].
+ something == #classRename ifTrue:[
+ ^ self.
+ ].
+ ].
+
+ "/ these must lead to immediate update of the selectedMethods collection
+ "/ (otherwise, that collection might be updated too late, leading to
+ "/ an obsolete methods code being shown by the codeView.
+ something == #methodInClass ifTrue:[
+ classAndSelectorsRedefinedBySubclassesOfClass := nil.
+ cls := aParameter at:1.
+ (classes includesIdentical:cls) ifFalse:[
+ ^ self "/ I dont care for that class
+ ].
+ self enqueueDelayedUpdate:something with:aParameter from:changedObject.
+ ^ self
+ ].
+
+ something == #methodInClassRemoved ifTrue:[
+ cls := aParameter at:1.
+ (classes includesIdentical:cls) ifFalse:[
+ ^ self "/ I dont care for that class
+ ].
+ ].
+
+ something == #methodTrap ifTrue:[
+ self window shown ifFalse:[
+ changedObject removeDependent:self. "/ ?????
+ ^ self
+ ].
+ cls := aParameter at:1.
+ (classes includesIdentical:cls) ifFalse:[
+ ^ self "/ I dont care for that class
+ ].
+ ].
+
+ super update:something with:aParameter from:changedObject
+! !
+
+!MethodList methodsFor:'private'!
+
+listEntryForMethod:aMethod selector:selector class:cls showClass:showClass showCategory:showCategory classFirst:showClassFirst
+ "answer a method list entry
+ gimmics:
+ adding a little image to breakPointed methods,
+ inheritance indicators,
+ highlight accessors of variable"
+
+ |clsName s icn variablesToHighlight classVarsToHighLight
+ doHighLight doHighLightRed emp cat l redefIcon|
+
+ aMethod isAssociation ifTrue:[
+ self halt:'should not happen'.
+ ].
+
+ s := aMethod printStringForBrowserWithSelector:selector inClass:cls.
+ showClassFirst ifTrue:[
+ clsName := cls nameInBrowser.
+ s := clsName , ' ' , s allBold
+ ].
+
+ "/
+ "/ wrap icons (i.e. break- or trace points)
+ "/ have higher prio ...
+ "/
+ aMethod isWrapped ifTrue:[
+ (s endsWith:' !!') ifTrue:[
+ s := s copyWithoutLast:2
+ ].
+ aMethod isBreakpointed ifTrue:[
+ icn := self stopIcon
+ ] ifFalse:[
+ aMethod isTimed ifTrue:[
+ icn := self timeIcon
+ ] ifFalse:[
+ icn := self traceIcon
+ ]
+ ].
+ ].
+
+ icn isNil ifTrue:[
+ icn := self resourceIconForMethod:aMethod.
+ icn isNil ifTrue:[
+ aMethod isProtected ifTrue:[
+ icn := self protectedMethodIcon
+ ] ifFalse:[
+ aMethod isPrivate ifTrue:[
+ icn := self privateMethodIcon
+ ] ifFalse:[
+ (aMethod isJavaMethod and:[aMethod isAbstract]) ifTrue:[
+ icn := self abstractMethodIcon
+ ]
+ ]
+ ].
+ ].
+ ].
+ icn isNil ifTrue:[
+ (selector startsWith:'test') ifTrue:[
+ ((cls isSubclassOf:TestCase)
+ and:[cls isAbstract not]) ifTrue:[
+ cls lastTestRunResultOrNil == false ifTrue:[
+ (cls testSelectorFailed:selector) ifTrue:[
+ icn := SystemBrowser testCaseFailedIcon
+ ] ifFalse:[
+ "/ icn := SystemBrowser testCasePassedIcon
+ ].
+ ]
+ ].
+ ]
+ ].
+
+ showClass ifTrue:[
+ showClassFirst ifFalse:[
+ s := s , ' [' , cls name allBold , ']'.
+ ]
+ ].
+ showCategory ifTrue:[
+ cat := aMethod category.
+ cat notNil ifTrue:[
+ s := s , ' {' , cat "asText allItalic" , '}'
+ ]
+ ].
+
+ variablesToHighlight := variableFilter value.
+ variablesToHighlight size > 0 ifTrue:[
+ classVarsToHighLight := filterClassVars value.
+ classVarsToHighLight ifTrue:[
+ doHighLight := self method:aMethod includesRefsToClassVariable:variablesToHighlight.
+ doHighLight ifTrue:[
+ doHighLightRed := self method:aMethod includesModsOfClassVariable:variablesToHighlight.
+ ].
+ ] ifFalse:[
+ doHighLight := self method:aMethod includesRefsToInstanceVariable:variablesToHighlight.
+ doHighLight ifTrue:[
+ doHighLightRed := self method:aMethod includesModsOfInstanceVariable:variablesToHighlight
+ ]
+ ].
+ doHighLight ifTrue:[
+ s := s allBold.
+ doHighLightRed ifTrue:[
+ emp := (UserPreferences current emphasisForWrittenVariable)
+ ] ifFalse:[
+ emp := (UserPreferences current emphasisForReadVariable)
+ ].
+ s := s emphasisAllAdd:emp
+ ]
+ ].
+
+ showMethodInheritance value ~~ false ifTrue:[
+ redefIcon := self redefinedOrInheritedIconFor:aMethod.
+ ].
+
+ (icn notNil or:[redefIcon notNil]) ifTrue:[
+ l := LabelAndIcon icon:redefIcon string:s.
+ l image:icn.
+ l gap:2.
+ ^ l
+ ].
+ ^ s
+
+ "Created: / 22.10.1996 / 19:51:00 / cg"
+ "Modified: / 31.10.2001 / 10:46:50 / cg"
+!
+
+listOfMethodNames
+ |methods entries selectorBag newNameList
+ allClasses newClasses allCategories "allSelectors" generator
+ doShowClass doShowClassFirst doShowCategory
+ enforceClassAndProtocolInList theMethod sortByClass anyMethodToWatch mclass|
+
+ generator := inGeneratorHolder value.
+ generator isNil ifTrue:[^ #() ].
+
+ allClasses := IdentitySet new.
+ allCategories := IdentitySet new. "/ not needed - all I need to know is if there is more than 1 category
+ "/ allSelectors := Set new.
+ newClasses := IdentitySet new.
+ selectorBag := Bag new.
+ entries := OrderedCollection new.
+ enforceClassAndProtocolInList := false.
+ anyMethodToWatch := false.
+
+ "/ generator generates nil-selector entries
+ "/ to pass multiple-class and multiple-protocol info
+ generator do:[:cls :cat :sel :mthd |
+ (cls isNil and:[cat isNil and:[sel isNil]])
+ ifTrue:[
+ enforceClassAndProtocolInList := true
+ ] ifFalse:[
+ cls notNil ifTrue:[
+ allClasses add:cls.
+ ].
+ cat notNil ifTrue:[
+ allCategories add:cat.
+ ].
+ sel notNil ifTrue:[
+ entries add:(Array with:cls with:sel with:mthd).
+ selectorBag add:sel.
+ newClasses add:cls.
+ "/ allSelectors add:sel.
+ ]
+ ].
+ (mthd notNil and:[mthd isWrapped]) ifTrue:[
+ (mthd isTiming
+ or:[mthd isCounting
+ or:[mthd isCountingMemoryUsage]])
+ ifTrue:[
+ anyMethodToWatch := true
+ ]
+ ].
+ ].
+
+ showMethodInheritance value ~~ false ifTrue:[
+ "/ collect redefinition information once (big speedup for #methodIsRedefinedbelow)
+ classAndSelectorsRedefinedBySubclassesOfClass isNil ifTrue:[
+ classAndSelectorsRedefinedBySubclassesOfClass := IdentityDictionary new.
+ ].
+ allClasses do:[:cls | |d|
+ d := classAndSelectorsRedefinedBySubclassesOfClass.
+ (d notNil and:[ (d includesKey:cls) not ]) ifTrue:[
+ d at:cls put:(self setOfAllSelectorsImplementedBelow:cls)
+ ]
+ ].
+ ].
+
+ "/ multiple classes must: add the className for some
+ doShowClass := enforceClassAndProtocolInList or:[allClasses size > 1].
+ "/ multiple categories: must add the categorie for some
+ doShowCategory := enforceClassAndProtocolInList or:[allCategories size > 1].
+
+ doShowClassFirst := doShowClass. "/ (doShowClass and:[allSelectors size == 1]).
+ doShowClassFirst := doShowClass and:[ sortBy value == #class ].
+
+ sortBy value == false ifTrue:[
+ "/ do not sort
+ ] ifFalse:[
+ (doShowClass not and:[ sortBy value == #class ]) ifTrue:[
+ "/ multiple classes must add the className for some
+ "/ check, if doShowClass must be enforced
+ entries do:[:entry |
+ |cls sel mthd s needClass|
+
+ cls := entry at:1.
+ sel := entry at:2.
+ mthd := entry at:3.
+ doShowClass ifFalse:[
+ doShowClass := (selectorBag occurrencesOf:sel) > 1
+ ].
+ ].
+ ].
+
+ sortByClass := doShowClass and:[ sortBy value == #class ].
+
+ sortByClass ifTrue:[
+ entries sort:[:a :b | |nmA nmB clsNmA clsNmB|
+ clsNmA := (a at:1) name.
+ clsNmB := (b at:1) name.
+ clsNmA = clsNmB ifTrue:[
+ nmA := (a at:2).
+ nmB := (b at:2).
+ nmA < nmB
+ ] ifFalse:[
+ clsNmA < clsNmB
+ ]
+ ].
+ ] ifFalse:[
+ entries sort:[:a :b | |nmA nmB clsNmA clsNmB|
+ nmA := (a at:2).
+ nmB := (b at:2).
+ nmA = nmB ifTrue:[
+ clsNmA := (a at:1) name.
+ clsNmB := (b at:1) name.
+ clsNmA < clsNmB
+ ] ifFalse:[
+ nmA < nmB
+ ]
+ ].
+ ].
+ ].
+
+ methods := OrderedCollection new:(entries size).
+
+ "/ first generate the new methodList, and see if it is different ...
+ entries do:[:entry |
+ |sel mthd|
+
+ mthd := entry at:3.
+ methods add:mthd.
+ ].
+
+ false "methodList = methods" "does not care for changed icons" ifTrue:[
+ "/ same list
+ newNameList := self browserNameList.
+ ] ifFalse:[
+ newNameList := OrderedCollection new:(entries size).
+
+ "/ multiple classes must add the className for some
+ entries do:[:entry |
+ |cls sel mthd s needClass|
+
+ cls := entry at:1.
+ sel := entry at:2.
+ mthd := entry at:3.
+ needClass := doShowClass.
+"/ needClass ifFalse:[
+"/ needClass := (selectorBag occurrencesOf:sel) > 1
+"/ ].
+ s := self
+ listEntryForMethod:mthd
+ selector:sel
+ class:cls
+ showClass:needClass
+ showCategory:doShowCategory
+ classFirst:doShowClassFirst.
+
+"/ s := mthd printStringForBrowserWithSelector:sel inClass:cls.
+"/ needClass ifTrue:[
+"/ s := s , ' [' , cls name , ']'.
+"/ ].
+"/ doShowCategory ifTrue:[
+"/ s := s , ' {' , mthd category "asText allItalic" , '}'
+"/ ].
+ newNameList add:s.
+ ].
+ ].
+
+ self makeIndependent.
+ classes := newClasses.
+ self makeDependent.
+
+ methodList := methods.
+ methods size == 1 ifTrue:[
+ theMethod := methods first.
+ mclass := theMethod mclass.
+ mclass isNil ifTrue:[
+ theMethod isWrapped ifTrue:[
+ theMethod := theMethod originalMethod.
+ mclass := theMethod mclass.
+ ].
+ ].
+ mclass isNil ifTrue:[
+ self methodLabelHolder value:('???' , ' ' , '???').
+ ] ifFalse:[
+ self methodLabelHolder value:(mclass name , ' ' , theMethod selector).
+ ]
+ ].
+
+ anyMethodToWatch ifTrue:[
+ self startWatchProcess.
+ ] ifFalse:[
+ self stopWatchProcess.
+ ].
+
+ "/ remember these, in case of an incremental (single method only)
+ "/ update in the future.
+ lastShowClass := doShowClass.
+ lastShowClassFirst := doShowClassFirst.
+ lastShowCategory := doShowCategory.
+
+ ^ newNameList.
+
+ "Created: / 5.2.2000 / 22:43:40 / cg"
+ "Modified: / 1.3.2000 / 21:00:26 / cg"
+!
+
+makeDependent
+ Smalltalk addDependent:self.
+!
+
+makeIndependent
+ Smalltalk removeDependent:self.
+!
+
+method:mthd includesModsOfClassVariable:variablesToHighLight
+ ^ self method:mthd includesRefsToVariable:variablesToHighLight askParserWith:#modifiedClassVars
+!
+
+method:mthd includesModsOfInstanceVariable:variablesToHighLight
+ ^ self method:mthd includesRefsToVariable:variablesToHighLight askParserWith:#modifiedInstVars
+!
+
+method:mthd includesRefsToClassVariable:variablesToHighLight
+ ^ self method:mthd includesRefsToVariable:variablesToHighLight askParserWith:#usedClassVars
+!
+
+method:mthd includesRefsToInstanceVariable:variablesToHighLight
+ ^ self method:mthd includesRefsToVariable:variablesToHighLight askParserWith:#usedInstVars
+!
+
+method:mthd includesRefsToVariable:variablesToHighLight askParserWith:querySelector
+ |cls src parser usedVars anyVarNameAccessable|
+
+ cls := mthd mclass.
+ anyVarNameAccessable := cls allInstVarNames includesAny:variablesToHighLight.
+ anyVarNameAccessable ifFalse:[
+ anyVarNameAccessable := cls theNonMetaclass allClassVarNames includesAny:variablesToHighLight.
+ ].
+ anyVarNameAccessable ifFalse:[
+ "/ no need to parse
+ ^ false
+ ].
+
+ src := mthd source.
+ src notNil ifTrue:[
+ "
+ before doing a slow parse, quickly scan the
+ methods source for the variables name ...
+ "
+ (variablesToHighLight contains:[:varName | (src findString:varName) ~~ 0]) ifTrue:[
+ parser := Parser
+ parseMethod:src
+ in:cls
+ ignoreErrors:true
+ ignoreWarnings:true.
+ (parser notNil and:[parser ~~ #Error]) ifTrue:[
+ usedVars := parser perform:querySelector.
+ (usedVars includesAny:variablesToHighLight)
+ ifTrue:[
+ ^ true
+ ]
+ ]
+ ]
+ ].
+ ^ false
+!
+
+methodIsInheritedFromAbove:aMethod
+ |mClass|
+
+ mClass := aMethod mclass.
+ (mClass notNil and:[mClass superclass notNil]) ifTrue:[
+ ^ (mClass superclass whichClassImplements:aMethod selector) notNil.
+ ].
+ ^ false
+!
+
+methodIsRedefinedBelow:aMethod
+ |mclass subClasses setOfRedefinedSelectors|
+
+ mclass := aMethod mclass.
+ mclass isNil ifTrue:[^ false].
+
+ "/ if possible, make use of info prepared by listOfMethodNames
+ classAndSelectorsRedefinedBySubclassesOfClass notNil
+ ifTrue:[
+ setOfRedefinedSelectors := classAndSelectorsRedefinedBySubclassesOfClass at:mclass ifAbsent:nil.
+ setOfRedefinedSelectors notNil ifTrue:[
+ ^ setOfRedefinedSelectors includes:aMethod selector
+ ]
+ ].
+
+ lastMethodClass == mclass ifTrue:[
+ subClasses := lastMethodClassesSubclasses
+ ] ifFalse:[
+ subClasses := aMethod mclass allSubclasses.
+ lastMethodClassesSubclasses := subClasses.
+ lastMethodClass := mclass.
+ ].
+ ^ subClasses contains:[:cls | cls implements:aMethod selector].
+!
+
+redefinedOrInheritedIconFor:aMethod
+ |inherited redefined|
+
+ inherited := self methodIsInheritedFromAbove:aMethod.
+ redefined := self methodIsRedefinedBelow:aMethod.
+
+ inherited ifTrue:[
+ redefined ifTrue:[
+ ^ self methodInheritedFromAboveAndRedefinedBelowIcon.
+ ].
+ ^ self methodInheritedFromAboveIcon.
+ ].
+ redefined ifTrue:[
+ ^ self methodRedefinedBelowIcon.
+ ].
+
+ ^ self methodEmptyInheritedIcon
+!
+
+release
+ super release.
+
+ filterClassVars removeDependent:self.
+ selectedMethodNameIndices removeDependent:self.
+ showMethodInheritance removeDependent:self.
+ variableFilter removeDependent:self.
+!
+
+resourceIconForMethod:aMethod
+ |resources|
+
+ (resources := aMethod resources) notNil ifTrue:[
+ (resources includesKey:#canvas) ifTrue:[
+ ^ self canvasIcon
+ ].
+ (resources includesKey:#menu) ifTrue:[
+ ^ self menuIcon
+ ].
+ (resources includesKey:#image) ifTrue:[
+ ^ self imageIcon
+ ].
+ (resources includesKey:#fileImage) ifTrue:[
+ ^ self fileImageIcon
+ ].
+ (resources includesKey:#programImage) ifTrue:[
+ ^ self programImageIcon
+ ].
+ (resources includesKey:#help) ifTrue:[
+ ^ self helpIcon
+ ].
+ (resources includesKey:#programMenu) ifTrue:[
+ ^ self programMenuIcon
+ ].
+ (resources includesKey:#tableColumns) ifTrue:[
+ ^ self tableColumnsIcon
+ ].
+ (resources includesKey:#tabList) ifTrue:[
+ ^ self tabListIcon
+ ].
+ (resources includesKey:#hierarchicalList) ifTrue:[
+ ^ self hierarchicalListIcon
+ ].
+ (resources includesKey:#programImage) ifTrue:[
+ ^ self programImageIcon
+ ]
+ ].
+ ^ nil
+!
+
+setOfAllSelectorsImplementedBelow:aClass
+ |set|
+
+ set := IdentitySet new.
+ aClass allSubclassesDo:[:eachSubclass |
+ set addAll:(eachSubclass methodDictionary keys).
+ ].
+ ^ set
+!
+
+updateList
+ |prevSelection newList newSelection newSelIdx reverseMap sameContents newListSize oldListSize
+ prevClasses methodSet selectedMethodsHolder|
+
+ selectedMethodsHolder := self selectedMethods.
+ prevSelection := selectedMethodsHolder value ? #().
+
+ prevClasses := classes ifNil:[ #() ] ifNotNil:[ classes copy ].
+
+ oldListSize := self browserNameList size.
+
+ "/ self topApplication withWaitCursorDo:[
+ newList := self listOfMethodNames.
+ newListSize := newList size.
+ sameContents := self updateListFor:newList.
+
+ sameContents ifFalse:[
+ "/ self browserNameList value:newList.
+
+ (prevSelection size == 0
+ and:[selectedMethodsHolder value size ~~ 0]) ifTrue:[
+ "/ this happens during early startup time,
+ "/ when the selection is already (pre-)set,
+ "/ and the methodList is generated the first time
+ "/ (i.e. when opened with preset selection
+
+ "/ do not clobber the selection in this case.
+ prevSelection := selectedMethodsHolder value.
+ ].
+
+ (methodList size == 0 or:[prevSelection size == 0]) ifTrue:[
+ newSelection := #()
+ ] ifFalse:[
+ methodSet := methodList.
+
+ "/ inclusion test is much faster with sets, if the number of items is large
+ methodList size > 30 ifTrue:[
+ "/ however, only if its worth building the set ...
+ prevSelection size > 5 ifTrue:[
+ methodSet := methodSet asIdentitySet.
+ ]
+ ].
+ newSelection := prevSelection select:[:item | methodSet includesIdentical:item].
+ ].
+ newSelection size > 0 ifTrue:[
+ newSelection size > 100 ifTrue:[
+ "/ need selection indices - might be expensive if done straight forward...
+ reverseMap := IdentityDictionary new.
+ methodList keysAndValuesDo:[:idx :mthd | reverseMap at:mthd put:idx].
+ newSelIdx := newSelection collect:[:mthd | reverseMap at:mthd].
+ ] ifFalse:[
+ newSelIdx := newSelection collect:[:mthd | methodList identityIndexOf:mthd]
+ ].
+"/ self halt.
+ "/ force change (for dependents)
+ selectedMethodNameIndices value:newSelIdx.
+ ] ifFalse:[
+ lastSelectedMethods := selectedMethodsHolder value.
+ lastSelectedMethods notNil ifTrue:[
+ lastSelectedMethods := lastSelectedMethods asOrderedCollection
+ ].
+ selectedMethodNameIndices value size > 0 ifTrue:[
+ selectedMethodNameIndices value:#().
+ ]
+ ].
+
+ newSelection ~= prevSelection ifTrue:[
+ self selectionChanged.
+ ]
+ ] ifTrue:[
+ "/ same list - but classes might have changed
+ "/ that is the case, if the class selection has been changed,
+ "/ to another class which has the same categories.
+
+ (prevClasses size ~= classes size
+ or:[prevClasses asOrderedCollection ~= (classes ? #()) asOrderedCollection ]) ifTrue:[
+ (newListSize > 0 or:[oldListSize > 0]) ifTrue:[
+ self selectionChanged.
+ ]
+ ]
+ ]
+ "/ ].
+
+ "Modified: / 18.8.2000 / 19:47:22 / cg"
+!
+
+updateListEntryFor:aMethod
+ "update my list for a single method.
+ (used when a single methods package, code or whatever changes, and a full udpate
+ would be too slow)"
+
+ |s idx|
+
+ s := self
+ listEntryForMethod:aMethod
+ selector:aMethod selector
+ class:aMethod mclass
+ showClass:lastShowClass
+ showCategory:lastShowCategory
+ classFirst:lastShowClassFirst.
+
+ idx := methodList identityIndexOf:aMethod.
+ idx == 0 ifTrue:[
+ aMethod isWrapped ifTrue:[
+ idx := methodList identityIndexOf:aMethod originalMethod.
+ ] ifFalse:[
+ ]
+ ].
+ idx == 0 ifTrue:[
+ self invalidateList
+ ] ifFalse:[
+ self browserNameList at:idx put:s.
+ ]
+! !
+
+!MethodList methodsFor:'private-watching'!
+
+startWatchProcess
+ updateProcess notNil ifTrue:[
+ ^ self
+ ].
+ updateProcess := [
+ [true] whileTrue:[
+ Delay waitForSeconds:1.
+ self enqueueDelayedUpdateList
+ ]
+ ] fork.
+!
+
+stopWatchProcess
+ |p|
+
+ (p := updateProcess) notNil ifTrue:[
+ updateProcess := nil.
+ p terminate
+ ].
+! !
+
+!MethodList methodsFor:'setup'!
+
+postBuildWith:aBuilder
+ |methodListView|
+
+ super postBuildWith:aBuilder.
+
+ methodListView := aBuilder componentAt:'List'.
+ methodListView notNil ifTrue:[
+ methodListView allowDrag:true.
+ methodListView dragObjectConverter:[:obj |
+ |nm method idx|
+
+ nm := obj theObject asString.
+ idx := browserNameList value indexOf:nm string.
+ method := methodList value at:idx.
+ DropObject newMethod:method.
+ ].
+ ]
+! !
+
+!MethodList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_MethodList.st,v 1.1 2004-02-26 18:55:13 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_NamespaceList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,488 @@
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+BrowserList subclass:#NamespaceList
+ instanceVariableNames:'namespaceNameList namespaceList'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!NamespaceList class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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.
+"
+! !
+
+!NamespaceList class methodsFor:'interface specs'!
+
+singleNameSpaceWindowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:ClassCategoryList andSelector:#singleCategoryWindowSpec
+ ClassCategoryList new openInterface:#singleCategoryWindowSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #singleNameSpaceWindowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'NameSpaceList'
+ #name: 'NameSpaceList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 218 175 518 475)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#LabelSpec
+ #label: 'NameSpaceName'
+ #name: 'NameSpaceLabel'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #translateLabel: true
+ #labelChannel: #nameSpaceLabelHolder
+ #menu: #menuHolder
+ )
+ )
+
+ )
+ )
+!
+
+singleNamespaceWindowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:ClassCategoryList andSelector:#singleCategoryWindowSpec
+ ClassCategoryList new openInterface:#singleCategoryWindowSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #singleNamespaceWindowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'NamespaceList'
+ #name: 'NamespaceList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 218 175 518 475)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#LabelSpec
+ #label: 'NamespaceName'
+ #name: 'NamespaceLabel'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #translateLabel: true
+ #labelChannel: #nameSpaceLabelHolder
+ #menu: #menuHolder
+ )
+ )
+
+ )
+ )
+!
+
+windowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:ProjectList andSelector:#windowSpec
+ ProjectList new openInterface:#windowSpec
+ ProjectList open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'NamespaceList'
+ #name: 'NamespaceList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 13 23 313 323)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SequenceViewSpec
+ #name: 'List'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #tabable: true
+ #model: #selectedNamespaces
+ #menu: #menuHolder
+ #hasHorizontalScrollBar: true
+ #hasVerticalScrollBar: true
+ #miniScrollerHorizontal: true
+ #isMultiSelect: true
+ #valueChangeSelector: #selectionChangedByClick
+ #useIndex: false
+ #sequenceList: #nameSpaceList
+ #doubleClickChannel: #doubleClickChannel
+ )
+ )
+
+ )
+ )
+
+ "Created: / 18.2.2000 / 01:06:05 / cg"
+ "Modified: / 18.2.2000 / 01:24:50 / cg"
+! !
+
+!NamespaceList class methodsFor:'queries-plugin'!
+
+aspectSelectors
+ ^ #(
+ #(#doubleClickChannel #action )
+ immediateUpdate
+ selectedNamespaces
+ menuHolder
+ inGeneratorHolder
+ outGeneratorHolder
+ selectionChangeCondition
+ updateTrigger
+ forceGeneratorTrigger
+ hideUnloadedClasses
+ organizerMode
+ slaveMode
+ )
+
+ "Created: / 18.2.2000 / 01:06:27 / cg"
+ "Modified: / 25.2.2000 / 22:32:20 / cg"
+! !
+
+!NamespaceList methodsFor:'aspects'!
+
+nameSpaceLabelHolder
+ ^ self pseudoListLabelHolder
+!
+
+nameSpaceList
+ namespaceList isNil ifTrue:[
+ namespaceList := ValueHolder new
+ ].
+ ^ namespaceList
+
+ "Created: / 18.2.2000 / 00:59:01 / cg"
+!
+
+selectedNamespaces
+ ^ self selectionHolder
+
+!
+
+selectedNamespaces:aValueHolder
+ ^ self selectionHolder:aValueHolder
+
+! !
+
+!NamespaceList methodsFor:'change & update'!
+
+delayedUpdate:something with:aParameter from:changedObject
+
+ self inSlaveModeOrInvisible
+ ifTrue:[
+ changedObject == Smalltalk ifTrue:[
+ something == #classComment ifTrue:[^ self].
+ ].
+ self invalidateList.
+ ^ self
+ ].
+
+ changedObject == slaveMode ifTrue:[
+ listValid ~~ true ifTrue:[
+ self enqueueDelayedUpdateList
+ ].
+ "/ self invalidateList.
+ ^ self
+ ].
+
+ changedObject == Smalltalk ifTrue:[
+ something == #newClass ifTrue:[
+ listValid == true ifTrue:[
+ aParameter isNameSpace ifTrue:[
+ (namespaceList value includes:aParameter name) ifFalse:[
+ self invalidateList.
+ ]
+ ].
+ ].
+ ^ self
+ ].
+ something == #classRemove ifTrue:[
+ listValid == true ifTrue:[
+ aParameter isNameSpace ifTrue:[
+ self invalidateList.
+ ].
+ ].
+ ^ self
+ ].
+ ^ self
+ ].
+
+ super delayedUpdate:something with:aParameter from:changedObject
+
+ "Created: / 18.2.2000 / 01:00:07 / cg"
+ "Modified: / 26.2.2000 / 01:10:46 / cg"
+!
+
+selectionChangedByClick
+ "we are not interested in that - get another notification
+ via the changed valueHolder"
+
+ "Created: / 18.2.2000 / 01:00:14 / cg"
+!
+
+update:something with:aParameter from:changedObject
+ changedObject == Smalltalk ifTrue:[
+ something == #methodDictionary ifTrue:[
+ ^ self
+ ].
+ something == #methodTrap ifTrue:[
+ ^ self
+ ].
+ something == #methodInClass ifTrue:[
+ ^ self
+ ].
+ something == #classVariables ifTrue:[
+ ^ self
+ ].
+ something == #classComment ifTrue:[
+ ^ self.
+ ].
+ something == #methodInClassRemoved ifTrue:[
+ ^ self.
+ ].
+ ].
+ super update:something with:aParameter from:changedObject
+! !
+
+!NamespaceList methodsFor:'generators'!
+
+makeGenerator
+ "return a generator which enumerates the classes from the selected namespace(s)."
+
+ |spaceNames hideUnloadedClasses|
+
+ spaceNames := self selectedNamespaces value.
+ spaceNames size == 0 ifTrue:[
+ ^ #()
+ ].
+
+ hideUnloadedClasses := self hideUnloadedClasses value.
+
+ (spaceNames includes:(self class nameListEntryForALL)) ifTrue:[
+ hideUnloadedClasses ifTrue:[
+ ^ Iterator on:[:whatToDo |
+ Smalltalk allClassesDo:[:cls |
+ cls isLoaded ifTrue:[
+ cls isNameSpace ifFalse:[
+ whatToDo value:cls
+ ]
+ ]
+ ]
+ ]
+ ].
+ ^ Iterator on:[:whatToDo |
+ Smalltalk allClassesDo:whatToDo
+ ]
+ ].
+
+ (spaceNames size == 1
+ and:[spaceNames first = 'Smalltalk']) ifTrue:[
+ "/ somewhat tuned - quick look if classes name
+ "/ includes colons ...
+ ^ Iterator on:[:whatToDo |
+ Smalltalk allClassesDo:[:cls |
+ |includeIt|
+
+ includeIt := (cls name includes:$:) not.
+ includeIt := includeIt
+ or:[(cls isPrivate not
+ and:[(cls nameSpace == Smalltalk)])].
+ includeIt := includeIt
+ or:[(cls isPrivate
+ and:[(cls topOwningClass nameSpace == Smalltalk)])].
+
+ includeIt := includeIt
+ and:[hideUnloadedClasses not
+ or:[cls isLoaded]].
+ includeIt ifTrue:[
+ cls isNameSpace ifFalse:[
+ whatToDo value:cls
+ ]
+ ]
+ ]
+ ]
+ ].
+
+ ^ Iterator on:[:whatToDo |
+ Smalltalk allClassesDo:[:cls |
+ |spaceOfClass spaceNameOfClass includeIt|
+
+ spaceOfClass := cls isPrivate ifTrue:[cls topOwningClass nameSpace] ifFalse:[cls nameSpace].
+ spaceNameOfClass := spaceOfClass name.
+
+ includeIt := spaceNames contains:[:nm | nm = spaceNameOfClass
+ or:[spaceNameOfClass startsWith:(nm , '::')]].
+
+ hideUnloadedClasses ifTrue:[
+ includeIt := includeIt and:[cls isLoaded].
+ ].
+ includeIt ifTrue:[
+ cls isNameSpace ifFalse:[
+ whatToDo value:cls
+ ]
+ ]
+ ]
+ ]
+
+ "Created: / 18.2.2000 / 01:01:58 / cg"
+ "Modified: / 24.2.2000 / 13:42:58 / cg"
+! !
+
+!NamespaceList methodsFor:'private'!
+
+defaultSlaveModeValue
+ self topApplication initialOrganizerMode == #namespace ifTrue:[^ false].
+"/ self organizerMode value == #category ifTrue:[^ true].
+"/ ^ false
+ ^ true
+!
+
+initialOrganizerMode
+ ^ #namespace
+!
+
+listOfNamespaces
+ |allNamespaces showAllNamespaces generator|
+
+showAllNamespaces := false.
+ allNamespaces := IdentitySet new.
+
+ inGeneratorHolder isNil ifTrue:[
+ (self hideUnloadedClasses value) ifTrue:[
+ Smalltalk allClassesDo:[:eachClass |
+ eachClass isLoaded ifTrue:[
+ allNamespaces add:(eachClass theNonMetaclass topNameSpace)
+ ].
+ ]
+ ] ifFalse:[
+ allNamespaces := NameSpace allNamespaces.
+ ].
+
+ showAllNamespaces ifFalse:[
+ "/ only topLevel namespaces are shown
+ "/ i.e. ignore subspaces
+
+ allNamespaces := allNamespaces select:[:ns | ns isTopLevelNameSpace].
+ ].
+ allNamespaces := allNamespaces collect:[:ns | ns name].
+ ] ifFalse:[
+ generator := inGeneratorHolder value.
+ generator isNil ifTrue:[^ #() ].
+ generator do:[:ns | allNamespaces add:ns].
+ ].
+
+ allNamespaces := allNamespaces asOrderedCollection.
+ allNamespaces sort.
+ allNamespaces size == 1 ifTrue:[
+ self nameSpaceLabelHolder value:(LabelAndIcon icon:(self class nameSpaceIcon) string:allNamespaces first).
+ ].
+ allNamespaces addFirst:(self class nameListEntryForALL).
+ ^ allNamespaces
+
+ "Created: / 18.2.2000 / 01:04:27 / cg"
+ "Modified: / 25.2.2000 / 22:11:29 / cg"
+!
+
+makeDependent
+ Smalltalk addDependent:self
+
+ "Created: / 18.2.2000 / 01:04:36 / cg"
+!
+
+makeIndependent
+ Smalltalk removeDependent:self.
+
+ "Created: / 18.2.2000 / 01:04:42 / cg"
+!
+
+updateList
+ |newList oldSelection newSelection selectedNamespacesHolder|
+
+ selectedNamespacesHolder := self selectedNamespaces.
+ oldSelection := selectedNamespacesHolder value.
+ newList := self listOfNamespaces.
+ newList ~= namespaceList value ifTrue:[
+"/ oldSelection size > 0 ifTrue:[
+"/ selectedNamespacesHolder removeDependent:self.
+"/ selectedNamespacesHolder value:#().
+"/ selectedNamespacesHolder addDependent:self.
+"/ ].
+ self nameSpaceList value:newList.
+
+ oldSelection size > 0 ifTrue:[
+ newSelection := oldSelection select:[:nm |
+ (nm = self class nameListEntryForALL)
+ or:[ (Smalltalk at:nm asSymbol) isNameSpace]
+ ].
+ newSelection ~= oldSelection ifTrue:[
+ selectedNamespacesHolder value:newSelection.
+ ]
+ ]
+ ].
+ listValid := true.
+! !
+
+!NamespaceList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_NamespaceList.st,v 1.1 2004-02-26 18:55:46 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_NavigationState.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,1127 @@
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+Object subclass:#NavigationState
+ instanceVariableNames:'browserLabel codeModifiedHolder categoryList classList
+ packageFilter nameSpaceFilter hidePrivateClasses canvasType
+ notMetaToggle metaToggle metaToggleLabel organizerMode codeAspect
+ codeHolder classDocumentationHolder canvas selectorListGenerator
+ protocolListGenerator classListPerNameSpaceGenerator
+ classListGenerator categoryListGenerator nameSpaceListGenerator
+ projectListGenerator classHierarchyTopClass meta selectedMethods
+ selectedProtocols selectedClasses selectedCategories
+ selectedProjects selectedNamespaces variableFilter
+ filterClassVars sortBy noAllItem autoSearchPattern
+ autoSearchIgnoreCase autoSearchAction realModifiedState
+ methodInfo versionDiffApplication selectorListGeneratorArray
+ selectedMethodsArray infoLabelHolder packageLabelHolder
+ cursorLineLabelHolder cursorColLabelHolder modeLabelHolder
+ sortVariablesBy'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!NavigationState class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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.
+"
+! !
+
+!NavigationState methodsFor:'accessing'!
+
+autoSearchAction
+ ^ autoSearchAction
+!
+
+autoSearchAction:something
+ autoSearchAction := something.
+!
+
+autoSearchIgnoreCase
+ "return true if the autSearch is to be case-insensitive"
+
+ ^ autoSearchIgnoreCase
+!
+
+autoSearchIgnoreCase:aBoolean
+ "change the autSearches case-insensitivenes"
+
+ autoSearchIgnoreCase := aBoolean
+!
+
+autoSearchPattern
+ "return the automatic search pattern"
+
+ ^ autoSearchPattern
+!
+
+autoSearchPattern:aPattern
+ "change the automatic search pattern"
+
+ autoSearchPattern := aPattern.
+!
+
+browserLabel
+ "return the assigned state-label (to be shown in the tab)."
+
+ ^ browserLabel
+!
+
+browserLabel:aString
+ "set the assigned state-label (to be shown in the tab)."
+
+ browserLabel := aString
+!
+
+canvas
+ "return the value of the instance variable 'canvas' (automatically generated)"
+
+ ^ canvas
+!
+
+canvas:something
+ "set the value of the instance variable 'canvas' (automatically generated)"
+
+ canvas := something.
+ canvasType isNil ifTrue:[
+ canvasType := something spec
+ ].
+!
+
+canvasType
+ "return the type of canvas"
+
+ ^ canvasType
+!
+
+canvasType:aSpecSymbol
+ "set the type of canvas"
+
+ canvasType notNil ifTrue:[
+ canvasType ~~ aSpecSymbol ifTrue:[
+ self halt:'cannot be changed, once set'.
+ ]
+ ].
+ canvasType := aSpecSymbol
+!
+
+codeAspect
+ "return the codeAspect; a symbol describing what is shown in the codeView"
+
+ ^ codeAspect
+
+ "Created: / 11.2.2000 / 12:43:29 / cg"
+!
+
+codeAspect:aSymbolOrNil
+ "set the codeAspect; a symbol describing what is shown in the codeView"
+
+ codeAspect := aSymbolOrNil
+
+ "Created: / 11.2.2000 / 12:43:45 / cg"
+!
+
+codeView
+ |builder v|
+
+ canvas notNil ifTrue:[
+ builder := canvas builder.
+ builder notNil ifTrue:[
+ v := builder componentAt:#CodeView.
+ v notNil ifTrue:[
+ ^ v scrolledView
+ ].
+ ]
+ ].
+ ^ nil
+
+ "Created: / 11.2.2000 / 13:28:25 / cg"
+!
+
+environment
+ ^ Smalltalk
+!
+
+modified
+ "check for modified code by asking the editTextView;
+ this one returns true if ever modified - even if
+ the modifiecations where undone in the editor
+ (i.e. not really modified).
+ Use #reallyModified if the contents should be compared
+ against the original contents"
+
+ |codeView|
+
+ realModifiedState == true ifTrue:[^ true].
+ ^ (codeView := self codeView) notNil
+ and:[codeView modified]
+!
+
+modified:aBoolean
+ |codeView|
+
+ (codeView := self codeView) notNil ifTrue:[
+ codeView modified:aBoolean
+ ].
+!
+
+realModifiedState
+ ^ realModifiedState
+!
+
+realModifiedState:aBoolean
+ realModifiedState := aBoolean
+! !
+
+!NavigationState methodsFor:'accessing-selection'!
+
+theSingleSelectedClass
+ "if only one class is selected, return it.
+ Otherwise, return nil"
+
+ |classes|
+
+ classes := self selectedClasses value.
+ classes size == 1 ifTrue:[
+ ^ classes first
+ ].
+ ^ nil
+!
+
+theSingleSelectedMethod
+ "if only one method is selected, return it.
+ Otherwise, return nil"
+
+ |methods|
+
+ methods := self selectedMethods value.
+ methods size == 1 ifTrue:[
+ ^ methods first
+ ].
+ ^ nil
+! !
+
+!NavigationState methodsFor:'accessing-subApps'!
+
+applicationOfComponent:aComponentName
+ ^ self applicationOfComponent:aComponentName or:nil
+
+!
+
+applicationOfComponent:aComponentName or:anotherComponentName
+ |builder view|
+
+ builder := canvas builder.
+ view := builder findComponentAt:aComponentName.
+ (view isNil and:[anotherComponentName notNil]) ifTrue:[
+ view := builder findComponentAt:anotherComponentName.
+ ].
+ view notNil ifTrue:[
+ ^ view application
+ ].
+ ^ nil
+!
+
+classCategoryListApplication
+ ^ self applicationOfComponent:#ClassCategoryList
+
+!
+
+classListApplication
+ ^ self applicationOfComponent:#ClassList
+
+!
+
+metaToggleComponent
+ ^ canvas builder findComponentAt:#ClassToggle.
+!
+
+methodCategoryListApplication
+ ^ self applicationOfComponent:#MethodCategoryList
+!
+
+methodListApplication
+ ^ self applicationOfComponent:#MethodList
+!
+
+nameSpaceListApplication
+ ^ self applicationOfComponent:#NamespaceList or:#PseudoNamespaceList
+!
+
+projectListApplication
+ ^ self applicationOfComponent:#ProjectList or:#PseudoProjectList
+!
+
+variableListApplication
+ ^ self applicationOfComponent:#VariableList
+!
+
+versionDiffApplication
+ ^ versionDiffApplication
+
+!
+
+versionDiffApplication:anApplication
+ versionDiffApplication := anApplication
+
+! !
+
+!NavigationState methodsFor:'aspects'!
+
+categoryList
+ categoryList isNil ifTrue:[
+ categoryList := nil asValue.
+ ].
+ ^ categoryList
+
+ "Modified: / 25.2.2000 / 01:35:42 / cg"
+ "Created: / 25.2.2000 / 01:57:45 / cg"
+!
+
+categoryListGenerator
+ categoryListGenerator isNil ifTrue:[
+ categoryListGenerator := nil asValue.
+ ].
+ ^ categoryListGenerator
+
+ "Created: / 25.2.2000 / 01:34:30 / cg"
+ "Modified: / 25.2.2000 / 01:35:42 / cg"
+!
+
+classDocumentationHolder
+ classDocumentationHolder isNil ifTrue:[
+ classDocumentationHolder := nil asValue.
+ ].
+ ^ classDocumentationHolder
+!
+
+classHierarchyTopClass
+ classHierarchyTopClass isNil ifTrue:[
+ classHierarchyTopClass := nil asValue.
+ ].
+ ^ classHierarchyTopClass
+
+!
+
+classList
+ classList isNil ifTrue:[
+ classList := nil asValue.
+ ].
+ ^ classList
+
+ "Created: / 25.2.2000 / 01:57:28 / cg"
+!
+
+classListGenerator
+ classListGenerator isNil ifTrue:[
+ classListGenerator := nil asValue.
+ ].
+ ^ classListGenerator
+
+
+!
+
+classListPerNameSpaceGenerator
+ classListPerNameSpaceGenerator isNil ifTrue:[
+ classListPerNameSpaceGenerator := nil asValue.
+ ].
+ ^ classListPerNameSpaceGenerator
+
+ "Created: / 18.8.2000 / 14:15:34 / cg"
+!
+
+codeHolder
+ codeHolder isNil ifTrue:[
+ codeHolder := nil asValue.
+ ].
+ ^ codeHolder
+
+!
+
+codeModifiedHolder
+ codeModifiedHolder isNil ifTrue:[
+ codeModifiedHolder := false asValue.
+ ].
+ ^ codeModifiedHolder
+!
+
+cursorColLabelHolder
+ cursorColLabelHolder isNil ifTrue:[
+ cursorColLabelHolder := BlockValue
+ with:[:v | v printString]
+ argument:self codeView cursorColHolder.
+ ].
+ ^ cursorColLabelHolder
+!
+
+cursorLineLabelHolder
+ cursorLineLabelHolder isNil ifTrue:[
+ cursorLineLabelHolder := BlockValue
+ with:[:v | v printString]
+ argument:self codeView cursorLineHolder.
+ ].
+ ^ cursorLineLabelHolder
+!
+
+filterClassVars
+ filterClassVars isNil ifTrue:[
+ filterClassVars := false asValue.
+ ].
+ ^ filterClassVars
+
+ "Created: / 24.2.2000 / 23:45:28 / cg"
+!
+
+hidePrivateClasses
+ hidePrivateClasses isNil ifTrue:[
+ hidePrivateClasses := false asValue.
+ ].
+ ^ hidePrivateClasses
+
+ "Created: / 24.2.2000 / 16:17:02 / cg"
+!
+
+infoLabelHolder
+ infoLabelHolder isNil ifTrue:[
+ infoLabelHolder := '' asValue.
+ ].
+ ^ infoLabelHolder
+!
+
+meta
+ meta isNil ifTrue:[
+ meta := false asValue.
+ ].
+ ^ meta
+
+
+!
+
+metaToggleLabelHolder
+ metaToggleLabel isNil ifTrue:[
+ metaToggleLabel := 'Class' asValue.
+ ].
+ ^ metaToggleLabel
+!
+
+methodInfo
+ methodInfo isNil ifTrue:[
+ methodInfo := nil asValue.
+ ].
+ ^ methodInfo
+
+!
+
+methodList
+ |methodListApplication|
+
+ methodListApplication := self methodListApplication.
+ methodListApplication isNil ifTrue:[^ nil].
+
+ ^ methodListApplication methodList
+!
+
+modeLabelHolder
+ modeLabelHolder isNil ifTrue:[
+ modeLabelHolder := self codeView modeLabelHolder.
+ ].
+ ^ modeLabelHolder
+!
+
+nameSpaceFilter
+ nameSpaceFilter isNil ifTrue:[
+ nameSpaceFilter := nil asValue.
+ ].
+ ^ nameSpaceFilter
+
+ "Created: / 18.8.2000 / 14:25:24 / cg"
+!
+
+nameSpaceListGenerator
+ nameSpaceListGenerator isNil ifTrue:[
+ nameSpaceListGenerator := nil asValue.
+ ].
+ ^ nameSpaceListGenerator
+
+ "Created: / 18.8.2000 / 14:26:19 / cg"
+ "Modified: / 18.8.2000 / 14:27:59 / cg"
+!
+
+noAllItem
+ noAllItem isNil ifTrue:[
+ noAllItem := nil asValue.
+ ].
+ ^ noAllItem
+!
+
+organizerMode
+ "return the organizerMode holder;
+ holding a symbol describing how things are organized
+ (#category, #hierarchy, #project or #namespace)"
+
+ organizerMode isNil ifTrue:[
+ organizerMode := #category asValue.
+ ].
+ ^ organizerMode
+
+ "Created: / 18.2.2000 / 13:33:55 / cg"
+ "Modified: / 18.8.2000 / 18:37:22 / cg"
+!
+
+packageFilter
+ packageFilter isNil ifTrue:[
+ packageFilter := nil asValue.
+ ].
+ ^ packageFilter
+
+ "Created: / 24.2.2000 / 23:45:28 / cg"
+!
+
+packageLabelHolder
+ packageLabelHolder isNil ifTrue:[
+ packageLabelHolder := '' asValue.
+ ].
+ ^ packageLabelHolder
+!
+
+projectListGenerator
+ projectListGenerator isNil ifTrue:[
+ projectListGenerator := nil asValue.
+ ].
+ ^ projectListGenerator
+
+ "Modified: / 25.2.2000 / 01:35:42 / cg"
+ "Created: / 25.2.2000 / 02:43:26 / cg"
+!
+
+protocolListGenerator
+ protocolListGenerator isNil ifTrue:[
+ protocolListGenerator := nil asValue.
+ ].
+ ^ protocolListGenerator
+
+!
+
+selectedCategories
+ selectedCategories isNil ifTrue:[
+ selectedCategories := nil asValue.
+ ].
+ ^ selectedCategories
+
+!
+
+selectedClasses
+ selectedClasses isNil ifTrue:[
+ selectedClasses := "SpecialValueHolder with:nil." nil asValue.
+ ].
+ ^ selectedClasses
+!
+
+selectedMethods
+ selectedMethods isNil ifTrue:[
+ selectedMethods := nil asValue.
+ ].
+ ^ selectedMethods
+
+!
+
+selectedMethodsArrayAt:index
+ |holder|
+
+ selectedMethodsArray isNil ifTrue:[
+ selectedMethodsArray := OrderedCollection new
+ ].
+ index > selectedMethodsArray size ifTrue:[
+ selectedMethodsArray grow:index
+ ].
+ holder := selectedMethodsArray at:index.
+ holder isNil ifTrue:[
+ selectedMethodsArray at:index put:(holder := ValueHolder new)
+ ].
+ ^ holder.
+!
+
+selectedNamespaces
+ selectedNamespaces isNil ifTrue:[
+ selectedNamespaces := nil asValue.
+ ].
+ ^ selectedNamespaces
+
+!
+
+selectedProjects
+ selectedProjects isNil ifTrue:[
+ selectedProjects := nil asValue.
+ ].
+ ^ selectedProjects
+
+!
+
+selectedProtocols
+ selectedProtocols isNil ifTrue:[
+ selectedProtocols := nil asValue.
+ ].
+ ^ selectedProtocols
+
+!
+
+selectorListGenerator
+ selectorListGenerator isNil ifTrue:[
+ selectorListGenerator := nil asValue.
+ ].
+ ^ selectorListGenerator
+
+!
+
+selectorListGeneratorArray
+ self halt:'should not be invoked'.
+!
+
+selectorListGeneratorArrayAt:index
+ |holder|
+
+ selectorListGeneratorArray isNil ifTrue:[
+ selectorListGeneratorArray := OrderedCollection new
+ ].
+ index > selectorListGeneratorArray size ifTrue:[
+ selectorListGeneratorArray grow:index
+ ].
+ holder := selectorListGeneratorArray at:index.
+ holder isNil ifTrue:[
+ selectorListGeneratorArray at:index put:(holder := ValueHolder new)
+ ].
+ ^ holder.
+!
+
+sortBy
+ sortBy isNil ifTrue:[
+ sortBy := nil asValue.
+ ].
+ ^ sortBy
+!
+
+variableFilter
+ variableFilter isNil ifTrue:[
+ variableFilter := nil asValue.
+ ].
+ ^ variableFilter
+
+ "Created: / 24.2.2000 / 23:45:28 / cg"
+! !
+
+!NavigationState methodsFor:'aspects-kludges'!
+
+metaToggle
+ metaToggle isNil ifTrue:[
+ metaToggle := PluggableAdaptor on:(self meta).
+ metaToggle
+ getBlock:[:m | m value == true]
+ putBlock:[:m :newValue | m value:(newValue ? false)]
+ updateBlock:[:m :aspect :param | true].
+ ].
+ ^ metaToggle
+!
+
+notMetaToggle
+ notMetaToggle isNil ifTrue:[
+ notMetaToggle := PluggableAdaptor on:(self meta).
+ notMetaToggle
+ getBlock:[:m | m value == false]
+ putBlock:[:m :newValue | m value:(newValue ? false) not]
+ updateBlock:[:m :aspect :param | true].
+ ].
+ ^ notMetaToggle
+! !
+
+!NavigationState methodsFor:'printing & storing'!
+
+colorizeForModifiedBuffer:someString
+ ^ someString asText emphasisAllAdd:(UserPreferences current emphasisForModifiedBuffer)
+!
+
+nameString
+ "a descriptive string of what this state shows"
+
+ |s|
+
+ s := self rawNameStringOrNil ? 'nothing selected'.
+
+ (realModifiedState == true) ifTrue:[
+ ^ self colorizeForModifiedBuffer:s string
+ ].
+ ^ s
+!
+
+nameStringOrNil
+ "a descriptive string of what this state shows"
+
+ |s "codeView"|
+
+ s := self rawNameStringOrNil.
+ s notNil ifTrue:[
+ realModifiedState == true
+"/ ((codeView := self codeView) notNil
+"/ and:[codeView modified])
+ ifTrue:[
+ ^ self colorizeForModifiedBuffer:s string
+ ].
+ ].
+ ^ s
+!
+
+rawNameStringForCategory
+ |categories theCategory|
+
+ categories := self selectedCategories value.
+ categories size == 1 ifTrue:[
+ theCategory := categories first.
+ theCategory notNil ifTrue:[
+ ^ theCategory string, ' [Category]'
+ ].
+ ].
+ ^ nil
+
+ "Created: / 18.8.2000 / 19:42:42 / cg"
+!
+
+rawNameStringForNameSpace
+ |namespaces theNamespace nsName s|
+
+ namespaces := self selectedNamespaces value.
+ namespaces size == 1 ifTrue:[
+ theNamespace := namespaces first
+ ].
+ theNamespace notNil ifTrue:[
+ theNamespace isNameSpace ifTrue:[
+ nsName := theNamespace name
+ ] ifFalse:[
+ nsName := theNamespace
+ ].
+ s := nsName , ' [NameSpace]'.
+ (self isNameSpaceBrowser or:[self isNameSpaceFullBrowser]) ifTrue:[
+ ^ LabelAndIcon icon:(NewSystemBrowser nameSpaceIcon) string:s.
+ ].
+ ^ s
+ ].
+ ^ nil
+
+ "Created: / 18.8.2000 / 20:15:02 / cg"
+!
+
+rawNameStringForProject
+ |projects theProject s|
+
+ projects := self selectedProjects value.
+ projects size == 1 ifTrue:[
+ theProject := projects first
+ ].
+ theProject notNil ifTrue:[
+ s := theProject , ' [Project]'.
+ (self isProjectBrowser or:[self isProjectFullBrowser]) ifTrue:[
+ ^ LabelAndIcon icon:(NewSystemBrowser packageIcon) string:s.
+ ].
+ ^ s
+ ].
+ ^ nil
+
+ "Created: / 18.8.2000 / 20:18:34 / cg"
+!
+
+rawNameStringOrNil
+ "a descriptive string of what this state shows; nil, if nothing is selected"
+
+ ^ self rawNameStringOrNilWantShort:false
+!
+
+rawNameStringOrNilWantShort:shortName
+ "a descriptive string of what this state shows; nil, if nothing is selected"
+
+ |lbl nr numClasses numMethods numCategories cats classes theClass
+ "protocols theProtocol"
+ methods theSingleMethod projects theProject longName nm methodName suffix cls|
+
+ browserLabel notNil ifTrue:[
+ "/ add the number of selected methods
+ ((canvasType == #singleFullProtocolBrowserSpec)
+ or:[canvasType == #methodListBrowserSpec]) ifTrue:[
+ nr := self selectedMethods value size.
+ nr > 5 ifTrue:[
+ ^ browserLabel string , ' - ' , nr printString , ' methods'
+ ].
+ ].
+ ^ browserLabel
+ ].
+
+ suffix := ''.
+
+ self isProtocolOrFullProtocolBrowser ifTrue:[
+ lbl := self rawNameStringForProject.
+ lbl notNil ifTrue:[^ lbl].
+ suffix := ' [Protocol]'.
+ ].
+
+ self isCategoryBrowser ifTrue:[
+ lbl := self rawNameStringForCategory.
+ lbl notNil ifTrue:[^ lbl].
+ suffix := ' [Category]'.
+ ].
+
+ self isNameSpaceBrowser ifTrue:[
+ lbl := self rawNameStringForNameSpace.
+ lbl notNil ifTrue:[^ lbl].
+ suffix := ' [NameSpace]'.
+ ].
+
+ self isProjectBrowser ifTrue:[
+ projects := self selectedProjects value.
+ projects size == 1 ifTrue:[
+ theProject := projects first
+ ].
+ suffix := ' [Project]'.
+ theProject notNil ifTrue:[
+ ^ theProject , suffix
+ ]
+ ].
+
+ classes := self selectedClasses value.
+ classes size == 1 ifTrue:[
+ theClass := classes first.
+ theClass notNil ifTrue:[
+ theClass := theClass theNonMetaclass
+ ]
+ ].
+
+ self isClassBrowser ifTrue:[
+ suffix := ' [Class]'.
+ theClass notNil ifTrue:[
+ ^ theClass name , suffix
+ ]
+ ].
+
+"/ protocols := self selectedProtocols value.
+"/ protocols size == 1 ifTrue:[
+"/ theProtocol := protocols first
+"/ ].
+
+ methods := self selectedMethods value.
+ methods size == 1 ifTrue:[
+ theSingleMethod := methods first
+ ].
+
+ theSingleMethod notNil ifTrue:[
+ methodName := theSingleMethod selector.
+ theSingleMethod isJavaMethod ifTrue:[
+ methodName := theSingleMethod printStringForBrowserWithSelector:methodName.
+ ].
+ ].
+
+ self isMethodBrowser ifTrue:[
+ suffix := ' [Selector]'.
+
+ theSingleMethod notNil ifTrue:[
+ theSingleMethod mclass isNil ifTrue:[
+ ^ '???'
+ ].
+ ^ theSingleMethod mclass name , ' ' , methodName , suffix
+ ]
+ ].
+
+ self isCategoryBrowser ifTrue:[
+ suffix := ' [Category]'.
+ ] ifFalse:[
+ self isFullClassSourceBrowser ifTrue:[
+ suffix := ' [Full]'.
+ ] ifFalse:[
+ self isClassDocumentationBrowser ifTrue:[
+ suffix := ' [Doc]'.
+ ] ifFalse:[
+ self isProjectBrowser ifTrue:[
+ suffix := ' [Project]'.
+ ]
+ ]
+ ]
+ ].
+
+ nm := nil.
+ (numClasses := classes size) > 0 ifTrue:[
+ numClasses > 1 ifTrue:[
+ methods size > 0 ifTrue:[
+ theSingleMethod notNil ifTrue:[
+ cls := theSingleMethod mclass.
+ cls isNil ifTrue:[
+ "/ oops - unbound
+ nm := '???'
+ ] ifFalse:[
+ longName := nm := cls nameInBrowser.
+ shortName ifTrue:[
+ nm := cls nameWithoutPrefix.
+ cls isPrivate ifTrue:[
+ nm := ':' , nm
+ ]
+ ].
+ ].
+ nm := nm , ' ', (methodName ? '???')
+ ] ifFalse:[
+ nm := methods size printString , ' methods'.
+ numClasses := (methods collect:[:each | each mclass]) asIdentitySet size.
+ numClasses > 1 ifTrue:[
+ nm := nm , ' in ' , numClasses printString , ' classes'.
+ ].
+ ].
+ ^ nm , suffix.
+ ].
+
+ nm := numClasses printString , ' classes in '.
+ "/ cats := self selectedCategories value
+ cats := (classes collect:[:each | each category]) asSet.
+ (numCategories := cats size) == 1 ifTrue:[
+ nm := nm , cats first
+ ] ifFalse:[
+ nm := nm , numCategories printString , ' categories'
+ ]
+ ] ifFalse:[
+ cls := theClass theNonMetaclass.
+ longName := nm := cls nameInBrowser.
+ shortName ifTrue:[
+ nm := cls nameWithoutPrefix.
+ cls isPrivate ifTrue:[
+ nm := ':' , nm
+ ]
+ ].
+ methods := self selectedMethods value.
+ (numMethods := methods size) > 0 ifTrue:[
+ numMethods == 1 ifTrue:[
+ theSingleMethod := methods first.
+ nm := nm , ' ', (methodName ? '???')
+ ] ifFalse:[
+ nm := numMethods printString , ' methods in ' , nm
+ ]
+ ]
+ ]
+ ] ifFalse:[
+ (self isNameSpaceBrowser
+ or:[self isNameSpaceFullBrowser
+ or:[organizerMode value == #namespace]]) ifTrue:[
+ lbl := self rawNameStringForNameSpace.
+ lbl notNil ifTrue:[^ lbl].
+ suffix := ' [NameSpace]'.
+ ] ifFalse:[
+ (self isProjectBrowser
+ or:[self isProjectFullBrowser
+ or:[organizerMode value == #project]]) ifTrue:[
+ lbl := self rawNameStringForProject.
+ lbl notNil ifTrue:[^ lbl].
+ suffix := ' [Project]'.
+ ] ifFalse:[
+ cats := self selectedCategories value.
+ cats size == 1 ifTrue:[
+ nm := cats first string
+ ]
+ ]
+ ].
+ ].
+ nm isNil ifTrue:[ ^ nil ].
+ ^ nm , suffix.
+
+ "Created: / 11.2.2000 / 13:32:16 / cg"
+ "Modified: / 18.8.2000 / 21:06:35 / cg"
+!
+
+shortNameString
+ "a descriptive string of what this state shows"
+
+ |s|
+
+ s := (self rawNameStringOrNilWantShort:true) ? 'nothing selected'.
+
+ (realModifiedState == true) ifTrue:[
+ ^ self colorizeForModifiedBuffer:s string
+ ].
+ ^ s
+! !
+
+!NavigationState methodsFor:'queries'!
+
+isCategoryBrowser
+ ^ canvasType == #categoryBrowserSpec
+ or:[ canvasType == #singleCategoryBrowserSpec
+ or:[ canvasType == #multipleCategoryBrowserSpec ]]
+
+ "Modified: / 25.2.2000 / 01:17:02 / cg"
+!
+
+isChainBrowser
+ ^ canvasType == #chainBrowserSpec
+!
+
+isCheckOutputBrowser
+ ^ canvasType == #multipleClassWithInfoAndMethodWithInfoBrowserSpec
+ or:[canvasType == #multipleMethodWithInfoBrowserSpec
+ or:[canvasType == #multipleClassWithInfoBrowserSpec]]
+!
+
+isClassBrowser
+ ^ canvasType == #classBrowserSpec
+ or:[ canvasType == #singleClassBrowserSpec
+ or:[ canvasType == #multipleClassBrowserSpec ]]
+
+ "Modified: / 25.2.2000 / 00:38:07 / cg"
+!
+
+isClassDocumentationBrowser
+ ^ canvasType == #classDocumentationBrowserSpec
+
+ "Created: / 24.2.2000 / 14:54:40 / cg"
+!
+
+isFullBrowser
+ ^ canvasType == #fullBrowserSpec
+!
+
+isFullClassSourceBrowser
+ ^ canvasType == #fullClassSourceBrowserSpec
+
+ "Created: / 24.2.2000 / 14:54:40 / cg"
+!
+
+isFullProtocolBrowser
+ ^ canvasType == #singleFullProtocolBrowserSpec
+ or:[ canvasType == #multipleFullProtocolBrowserSpec ]
+
+ "Created: / 24.2.2000 / 21:32:09 / cg"
+ "Modified: / 25.2.2000 / 03:11:00 / cg"
+!
+
+isMethodBrowser
+ ^ canvasType == #methodListBrowserSpec
+ or:[ canvasType == #singleMethodBrowserSpec
+ or:[ canvasType == #multipleMethodBrowserSpec
+ or:[ canvasType == #multipleMethodWithInfoBrowserSpec ]]]
+
+ "Modified: / 1.3.2000 / 13:35:12 / cg"
+!
+
+isMethodListBrowser
+ ^ canvasType == #methodListBrowserSpec
+ or:[canvasType == #multipleMethodBrowserSpec]
+!
+
+isNameSpaceBrowser
+ ^ canvasType == #singleNameSpaceBrowserSpec
+ or:[ canvasType == #multipleNameSpaceBrowserSpec]
+
+ "Modified: / 18.8.2000 / 16:12:34 / cg"
+!
+
+isNameSpaceFullBrowser
+ ^ canvasType == #singleNameSpaceFullBrowserSpec
+ or:[ canvasType == #multipleNameSpaceFullBrowserSpec ]
+
+ "Created: / 18.8.2000 / 14:58:36 / cg"
+!
+
+isProjectBrowser
+ ^ canvasType == #singleProjectBrowserSpec
+ or:[ canvasType == #multipleProjectBrowserSpec ]
+
+ "Created: / 24.2.2000 / 21:32:09 / cg"
+ "Modified: / 25.2.2000 / 03:11:00 / cg"
+!
+
+isProjectFullBrowser
+ ^ canvasType == #singleProjectFullBrowserSpec
+ or:[ canvasType == #multipleProjectFullBrowserSpec ]
+
+ "Created: / 18.8.2000 / 19:02:49 / cg"
+!
+
+isProtocolBrowser
+ ^ canvasType == #singleProtocolBrowserSpec
+ or:[ canvasType == #multipleProtocolBrowserSpec ]
+
+ "Created: / 24.2.2000 / 21:32:09 / cg"
+ "Modified: / 25.2.2000 / 03:11:00 / cg"
+!
+
+isProtocolOrFullProtocolBrowser
+ ^ self isProtocolBrowser
+ or:[ self isFullProtocolBrowser ]
+!
+
+isSingleCategoryBrowser
+ ^ canvasType == #singleCategoryBrowserSpec
+!
+
+isSingleClassBrowser
+ ^ canvasType == #singleClassBrowserSpec
+!
+
+isSingleFullProtocolBrowser
+ ^ canvasType == #singleFullProtocolBrowserSpec
+!
+
+isSingleMethodBrowser
+ ^ canvasType == #singleMethodBrowserSpec
+
+ "Created: / 1.3.2000 / 13:35:52 / cg"
+!
+
+isSingleNamespaceBrowser
+ ^ canvasType == #singleNameSpaceBrowserSpec
+!
+
+isSingleNamespaceFullBrowser
+ ^ canvasType == #singleNameSpaceFullBrowserSpec
+!
+
+isSingleProjectBrowser
+ ^ canvasType == #singleProjectBrowserSpec
+
+ "Created: / 24.2.2000 / 21:32:09 / cg"
+ "Modified: / 25.2.2000 / 03:11:00 / cg"
+!
+
+isSingleProjectFullBrowser
+ ^ canvasType == #singleProjectFullBrowserSpec
+
+ "Created: / 24.2.2000 / 21:32:09 / cg"
+ "Modified: / 25.2.2000 / 03:11:00 / cg"
+!
+
+isSingleProtocolBrowser
+ ^ canvasType == #singleProtocolBrowserSpec
+!
+
+isVersionDiffBrowser
+ ^ canvasType == #multipleClassRepositoryDiffBrowserSpec
+! !
+
+!NavigationState class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_NavigationState.st,v 1.1 2004-02-26 18:56:57 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_NavigatorCanvas.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,6028 @@
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+NavigatorModel subclass:#NavigatorCanvas
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!NavigatorCanvas class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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.
+"
+! !
+
+!NavigatorCanvas class methodsFor:'interface specs'!
+
+categoryAndClassOnlySpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#categoryAndClassOnlySpec
+ NavigatorCanvas new openInterface:#categoryAndClassOnlySpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #fullClassSourceBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'Full Class Browser'
+ #name: 'Full Class Browser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 18 51 480 351)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'Organizer'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #majorKey: #'OrganizerCanvas'
+ #minorKey: #windowSpecWithoutMetaToggles
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #classCategoryListMenuHolder
+ #aspect: #categoryPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classCategoryDoubleClickChannel
+ #callBack: #classCategoryDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classDoubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceDoubleClickChannel
+ #callBack: #nameSpaceDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #projectDoubleClickChannel
+ #callBack: #projectDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableDoubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #classHierarchyListMenuHolder
+ #aspect: #hierarchyPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHierarchyTopClass
+ #aspect: #classHierarchyTopClass
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #classListMenuHolder
+ #aspect: #classPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hidePrivateClasses
+ #aspect: #hidePrivateClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #metaToggleLabelHolder
+ #aspect: #metaToggleLabelHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceListMenuHolder
+ #aspect: #nameSpacePopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #projectListMenuHolder
+ #aspect: #projectPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedCategories
+ #aspect: #selectedCategories
+ #callBack: #categorySelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedNamespaces
+ #aspect: #selectedNamespaces
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProjects
+ #aspect: #selectedProjects
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ )
+
+ "Modified: / 18.8.2000 / 20:00:27 / cg"
+!
+
+categoryAndSingleClassOnlySpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#categoryAndSingleClassOnlySpec
+ NavigatorCanvas new openInterface:#categoryAndSingleClassOnlySpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #categoryAndSingleClassOnlySpec
+ #window:
+ #(#WindowSpec
+ #label: 'Full Class Browser'
+ #name: 'Full Class Browser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 12 22 474 322)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'Organizer'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #majorKey: #'OrganizerCanvas'
+ #minorKey: #windowSpecWithoutMetaToggles
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #classCategoryListMenuHolder
+ #aspect: #categoryPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classCategoryDoubleClickChannel
+ #callBack: #classCategoryDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classDoubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceDoubleClickChannel
+ #callBack: #nameSpaceDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #projectDoubleClickChannel
+ #callBack: #projectDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableDoubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #classHierarchyListMenuHolder
+ #aspect: #hierarchyPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHierarchyTopClass
+ #aspect: #classHierarchyTopClass
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #classListMenuHolder
+ #aspect: #classPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hidePrivateClasses
+ #aspect: #hidePrivateClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceListMenuHolder
+ #aspect: #nameSpacePopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #projectListMenuHolder
+ #aspect: #projectPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedCategories
+ #aspect: #selectedCategories
+ #callBack: #categorySelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedNamespaces
+ #aspect: #selectedNamespaces
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProjects
+ #aspect: #selectedProjects
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ )
+
+ "Modified: / 18.8.2000 / 20:00:34 / cg"
+!
+
+fullBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#fullBrowserSpec
+ NavigatorCanvas new openInterface:#fullBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #fullBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'SystemBrowser'
+ #name: 'SystemBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 18 51 480 351)
+ #icon: #defaultIcon
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'Organizer'
+ #majorKey: #'OrganizerCanvas'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #classCategoryListMenuHolder
+ #aspect: #categoryPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classCategoryDoubleClickChannel
+ #callBack: #classCategoryDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classDoubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceDoubleClickChannel
+ #callBack: #nameSpaceDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #projectDoubleClickChannel
+ #callBack: #projectDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableDoubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #classHierarchyListMenuHolder
+ #aspect: #hierarchyPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHierarchyTopClass
+ #aspect: #classHierarchyTopClass
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #classListMenuHolder
+ #aspect: #classPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #metaToggleLabelHolder
+ #aspect: #metaToggleLabelHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceListMenuHolder
+ #aspect: #nameSpacePopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #projectListMenuHolder
+ #aspect: #projectPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedCategories
+ #aspect: #selectedCategories
+ #callBack: #categorySelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedNamespaces
+ #aspect: #selectedNamespaces
+ #callBack: #nameSpaceSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProjects
+ #aspect: #selectedProjects
+ #callBack: #projectSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #nameSpaceFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ #callBack: #variableSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #variablesMenuHolder
+ #aspect: #variablesPopUpMenu
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ #callBack: #variableSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ #callBack: #variableSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 0.75 1.0)
+ )
+ )
+
+ )
+ )
+
+ "Modified: / 18.8.2000 / 20:00:47 / cg"
+!
+
+multipleCategoryBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#multipleCategoryBrowserSpec
+ NavigatorCanvas new openInterface:#multipleCategoryBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #multipleCategoryBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'CategoryBrowser'
+ #name: 'CategoryBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 18 51 480 351)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'CategoryList'
+ #majorKey: #'ClassCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classCategoryDoubleClicked
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #categoryListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #categoryPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedCategories
+ #aspect: #selectedCategories
+ #callBack: #categorySelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#ViewSpec
+ #name: 'Box1'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel2'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -25 1.0)
+ #showHandle: false
+ #handlePosition: #left
+ #snapMode: #both
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #majorKey: #'ClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'MetaToggles'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #majorKey: #'NavigatorModel'
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.25 0.5 0.75 1.0)
+ )
+ )
+
+ )
+ #handles: #(#Any 1.0)
+ )
+ )
+
+ )
+ )
+!
+
+multipleClassBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#multipleClassBrowserSpec
+ NavigatorCanvas new openInterface:#multipleClassBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #multipleClassBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ClassBrowser'
+ #name: 'ClassBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 18 51 480 351)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'Box1'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -25 1.0)
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #majorKey: #'ClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortBy
+ #aspect: #sortBy
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #showHandle: false
+ #handlePosition: #left
+ #snapMode: #both
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'MetaToggles'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #majorKey: #'NavigatorModel'
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.333333 0.666667 1.0)
+ )
+ )
+
+ )
+ )
+!
+
+multipleClassDiffBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#multipleClassDiffBrowserSpec
+ NavigatorCanvas new openInterface:#multipleClassDiffBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #multipleClassDiffBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ClassBrowser'
+ #name: 'ClassBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 12 22 474 322)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -30 1.0)
+ #majorKey: #'ClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #sortBy
+ #aspect: #sortBy
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#LabelSpec
+ #label: 'projectInfo'
+ #name: 'Label1'
+ #layout: #(#LayoutFrame 0 0 -30 1 0 1 0 1)
+ #level: -1
+ #labelChannel: #classesProjectInfoHolder
+ #adjust: #left
+ )
+ )
+
+ )
+ )
+!
+
+multipleClassExtensionBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#multipleClassExtensionBrowserSpec
+ NavigatorCanvas new openInterface:#multipleClassExtensionBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #multipleClassExtensionBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ClassBrowser'
+ #name: 'ClassBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 16 46 478 346)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'Box1'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -25 1.0)
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #majorKey: #'ClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #sortBy
+ #aspect: #sortBy
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'ProjectList'
+ #majorKey: #'ProjectList'
+ #subAspectHolders:
+ #(#Array
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #projectListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProjects
+ #aspect: #selectedProjects
+ #callBack: #projectSelectionChangedForFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #projectPopUpMenu
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars "/variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ "/ #handles: #(#Any 0.333333 0.666667 1.0)
+ #handles: #(#Any 0.7 1.0 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'MetaToggles'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #majorKey: #'NavigatorModel'
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ #callBack: #variableSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilterOnInput
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ #callBack: #variableSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.333333 0.666667 1.0)
+ )
+ )
+
+ )
+ )
+!
+
+multipleFullProtocolBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#multipleFullProtocolBrowserSpec
+ NavigatorCanvas new openInterface:#multipleFullProtocolBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #multipleFullProtocolBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ProtocolBrowser'
+ #name: 'ProtocolBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 12 22 474 322)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #noAllItem
+ #aspect: #noAllItem
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortBy
+ #aspect: #sortBy
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ )
+
+ )
+ )
+!
+
+multipleNameSpaceBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#multipleNameSpaceBrowserSpec
+ NavigatorCanvas new openInterface:#multipleNameSpaceBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #multipleNameSpaceBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'NameSpaceBrowser'
+ #name: 'NameSpaceBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 18 51 480 351)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'NameSpaceList'
+ #majorKey: #'NameSpaceList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #nameSpacePopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #nameSpaceDoubleClicked
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #nameSpaceListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedNamespaces
+ #aspect: #selectedNamespaces
+ #callBack: #nameSpaceSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#ViewSpec
+ #name: 'Box1'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -25 1.0)
+ #showHandle: false
+ #handlePosition: #left
+ #snapMode: #both
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #majorKey: #'ClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #selectedNamespaces
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'MetaToggles'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #majorKey: #'NavigatorModel'
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.25 0.5 0.75 1.0)
+ )
+ )
+
+ )
+ )
+
+ "Modified: / 18.8.2000 / 14:50:21 / cg"
+!
+
+multipleNameSpaceFullBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#multipleNameSpaceFullBrowserSpec
+ NavigatorCanvas new openInterface:#multipleNameSpaceFullBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #multipleNameSpaceFullBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'NameSpaceBrowser'
+ #name: 'NameSpaceBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 127 62 589 362)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel2'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'NameSpaceList'
+ #majorKey: #'NamespaceList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #nameSpacePopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #nameSpaceDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #nameSpaceListGenerator
+ )
+"/ #(#SubChannelInfoSpec
+"/ #subAspect: #outGeneratorHolder
+"/ #aspect: #classListGenerator
+"/ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedNamespaces
+ #aspect: #selectedNamespaces
+ #callBack: #nameSpaceSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'ClassCategoryList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #majorKey: #'ClassCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #selectedNamespaces
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classCategoryDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceClassCategoryGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #categoryPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedCategories
+ #aspect: #selectedCategories
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #categoryListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classCategoryListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#ViewSpec
+ #name: 'Box1'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -25 1.0)
+ #showHandle: false
+ #handlePosition: #left
+ #snapMode: #both
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #majorKey: #'ClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #selectedNamespaces
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'MetaToggles'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #majorKey: #'NavigatorModel'
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.25 0.5 0.75 1.0)
+ )
+ )
+
+ )
+ )
+
+ "Modified: / 18.8.2000 / 20:01:39 / cg"
+!
+
+multipleProjectBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#multipleProjectBrowserSpec
+ NavigatorCanvas new openInterface:#multipleProjectBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #multipleProjectBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ProjectBrowser'
+ #name: 'ProjectBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 18 51 480 351)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ProjectList'
+ #majorKey: #'ProjectList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #projectPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #projectDoubleClicked
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #projectListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProjects
+ #aspect: #selectedProjects
+ #callBack: #projectSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#ViewSpec
+ #name: 'Box1'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -25 1.0)
+ #showHandle: false
+ #handlePosition: #left
+ #snapMode: #both
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #majorKey: #'ClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'MetaToggles'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #majorKey: #'NavigatorModel'
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ #callBack: #variableSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ #callBack: #variableSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.25 0.5 0.75 1.0)
+ )
+ )
+
+ )
+ )
+!
+
+multipleProjectFullBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#multipleProjectFullBrowserSpec
+ NavigatorCanvas new openInterface:#multipleProjectFullBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #multipleProjectFullBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ProjectBrowser'
+ #name: 'ProjectBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 23 111 485 411)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel2'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ProjectList'
+ #majorKey: #'ProjectList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #projectPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #projectDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #projectListGenerator
+ )
+
+"/ #(#SubChannelInfoSpec
+"/ #subAspect: #outGeneratorHolder
+"/ #aspect: #classListGenerator
+"/ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProjects
+ #aspect: #selectedProjects
+ #callBack: #projectSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'ClassCategoryList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #majorKey: #'ClassCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #selectedProjects
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classCategoryDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceClassCategoryGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #categoryPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedCategories
+ #aspect: #selectedCategories
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #categoryListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classCategoryListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#ViewSpec
+ #name: 'Box1'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -25 1.0)
+ #showHandle: false
+ #handlePosition: #left
+ #snapMode: #both
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #majorKey: #'ClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #selectedProjects
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'MetaToggles'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #majorKey: #'NavigatorModel'
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ #callBack: #variableSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ #callBack: #variableSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.25 0.5 0.75 1.0)
+ )
+ )
+
+ )
+ )
+
+ "Modified: / 18.8.2000 / 20:01:55 / cg"
+!
+
+multipleProtocolBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#multipleProtocolBrowserSpec
+ NavigatorCanvas new openInterface:#multipleProtocolBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #multipleProtocolBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ProtocolBrowser'
+ #name: 'ProtocolBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 12 22 474 322)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #noAllItem
+ #aspect: #noAllItem
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortBy
+ #aspect: #sortBy
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ )
+
+ )
+ )
+!
+
+selectorBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#selectorBrowserSpec
+ NavigatorCanvas new openInterface:#selectorBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #selectorBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'SelectorBrowser'
+ #name: 'SelectorBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 12 22 474 322)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'AllMethodCategoryList'
+ #majorKey: #'FullMethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'ImplementedMethodList'
+ #majorKey: #'ImplementingMethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #xxxDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #implementingClassListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'ImplementingClassList'
+ #majorKey: #'ImplementingClassList'
+ #minorKey: #windowSpec
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #implementingClassListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.333333 0.666667 1.0)
+ )
+ )
+
+ )
+ )
+!
+
+singleCategoryBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#singleCategoryBrowserSpec
+ NavigatorCanvas new openInterface:#singleCategoryBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #singleCategoryBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'CategoryBrowser'
+ #name: 'CategoryBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 18 51 480 351)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'Box1'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'PseudoCategoryList'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #majorKey: #'ClassCategoryList'
+ #minorKey: #singleCategoryWindowSpec
+ #subAspectHolders:
+ #(#Array
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #categoryPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #categoryListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedCategories
+ #aspect: #selectedCategories
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 25 0.0 0 1.0 -25 1.0)
+ #showHandle: false
+ #handlePosition: #left
+ #snapMode: #both
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #majorKey: #'ClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'MetaToggles'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #majorKey: #'NavigatorModel'
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.333333 0.666667 1.0)
+ )
+ )
+
+ )
+ )
+!
+
+singleClassBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#singleClassBrowserSpec
+ NavigatorCanvas new openInterface:#singleClassBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #singleClassBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ClassBrowser'
+ #name: 'ClassBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 16 46 478 346)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'Box1'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'PseudoClassList'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #majorKey: #'ClassList'
+ #minorKey: #singleClassWindowSpec
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classPopUpMenu
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 25 0.0 0 1.0 -25 1.0)
+ #showHandle: false
+ #snapMode: #both
+ #handlePosition: #left
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'MetaToggles'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #majorKey: #'NavigatorModel'
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ )
+
+ )
+ )
+!
+
+singleFullProtocolBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#singleFullProtocolBrowserSpec
+ NavigatorCanvas new openInterface:#singleFullProtocolBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #singleFullProtocolBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ProtocolBrowser'
+ #name: 'ProtocolBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 12 22 474 322)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'Box1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'PseudoProtocolList'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #majorKey: #'MethodCategoryList'
+ #minorKey: #singleProtocolWindowSpec
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #layout: #(#LayoutFrame 0 0.0 25 0.0 0 1.0 0 1.0)
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortBy
+ #aspect: #sortBy
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ )
+ )
+
+ )
+ )
+!
+
+singleNameSpaceBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#singleNameSpaceBrowserSpec
+ NavigatorCanvas new openInterface:#singleNameSpaceBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #singleNameSpaceBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'NameSpaceBrowser'
+ #name: 'NameSpaceBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 18 51 480 351)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'Box1'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'PseudoNameSpaceList'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #majorKey: #'NamespaceList'
+ #minorKey: #singleNameSpaceWindowSpec
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #nameSpaceListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedNamespaces
+ #aspect: #selectedNamespaces
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 25 0.0 0 1.0 -25 1.0)
+ #showHandle: false
+ #handlePosition: #left
+ #snapMode: #both
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #majorKey: #'ClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #callBack: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'MetaToggles'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #majorKey: #'NavigatorModel'
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.333333 0.666667 1.0)
+ )
+ )
+
+ )
+ )
+
+ "Modified: / 18.8.2000 / 14:50:53 / cg"
+!
+
+singleNameSpaceFullBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#singleNameSpaceFullBrowserSpec
+ NavigatorCanvas new openInterface:#singleNameSpaceFullBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #singleNameSpaceFullBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'NameSpaceBrowser'
+ #name: 'NameSpaceBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 102 220 564 520)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'Box1'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'PseudoNameSpaceList'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #majorKey: #'NamespaceList'
+ #minorKey: #singleNameSpaceWindowSpec
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #nameSpaceListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classListPerNameSpaceGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedNamespaces
+ #aspect: #selectedNamespaces
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'ClassCategoryList'
+ #layout: #(#LayoutFrame 0 0.0 25 0.0 0 1.0 0 1.0)
+ #majorKey: #'ClassCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classCategoryDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceClassCategoryGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #selectedNamespaces
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #categoryPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedCategories
+ #aspect: #selectedCategories
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #categoryListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classCategoryListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ )
+ #(#ViewSpec
+ #name: 'Box2'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel2'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -25 1.0)
+ #showHandle: false
+ #handlePosition: #left
+ #snapMode: #both
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #majorKey: #'ClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #selectedNamespaces
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #callBack: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'MetaToggles'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #majorKey: #'NavigatorModel'
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.25 0.5 0.75 1.0)
+ )
+ )
+
+ )
+ )
+
+ "Modified: / 18.8.2000 / 20:02:28 / cg"
+!
+
+singleProjectBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#singleProjectBrowserSpec
+ NavigatorCanvas new openInterface:#singleProjectBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #singleProjectBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ProjectBrowser'
+ #name: 'ProjectBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 18 51 480 351)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'Box1'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'PseudoProjectList'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #majorKey: #'ProjectList'
+ #minorKey: #singleProjectWindowSpec
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #projectPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #projectListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProjects
+ #aspect: #selectedProjects
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 25 0.0 0 1.0 -25 1.0)
+ #showHandle: false
+ #handlePosition: #left
+ #snapMode: #both
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #majorKey: #'ClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'MetaToggles'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #majorKey: #'NavigatorModel'
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.333333 0.666667 1.0)
+ )
+ )
+
+ )
+ )
+!
+
+singleProjectFullBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#singleProjectFullBrowserSpec
+ NavigatorCanvas new openInterface:#singleProjectFullBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #singleProjectFullBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ProjectBrowser'
+ #name: 'ProjectBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 30 74 492 374)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'Box1'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'PseudoProjectList'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #majorKey: #'ProjectList'
+ #minorKey: #singleProjectWindowSpec
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #projectPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #projectListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProjects
+ #aspect: #selectedProjects
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'ClassCategoryList'
+ #layout: #(#LayoutFrame 0 0.0 25 0.0 0 1.0 0 1.0)
+ #majorKey: #'ClassCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classCategoryDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceClassCategoryGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #selectedProjects
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #categoryPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedCategories
+ #aspect: #selectedCategories
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #categoryListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classCategoryListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ )
+ #(#ViewSpec
+ #name: 'Box2'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel2'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -25 1.0)
+ #showHandle: false
+ #handlePosition: #left
+ #snapMode: #both
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'SubCanvas2'
+ #majorKey: #'ClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #classDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #selectedProjects
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ #callBack: #classSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'SubCanvas3'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #variableDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesPopUpMenu
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'SubSpecification1'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #majorKey: #'NavigatorModel'
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodCategoryList'
+ #majorKey: #'MethodCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #protocolDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ #callBack: #protocolSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #variableFilter
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #filterClassVars
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.25 0.5 0.75 1.0)
+ )
+ )
+
+ )
+ )
+
+ "Modified: / 18.8.2000 / 20:02:36 / cg"
+!
+
+singleProtocolBrowserSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorCanvas andSelector:#singleProtocolBrowserSpec
+ NavigatorCanvas new openInterface:#singleProtocolBrowserSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #singleProtocolBrowserSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ProtocolBrowser'
+ #name: 'ProtocolBrowser'
+ #min: #(#Point 0 0)
+ #bounds: #(#Rectangle 12 22 474 322)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'Box1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'PseudoProtocolList'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #majorKey: #'MethodCategoryList'
+ #minorKey: #singleProtocolWindowSpec
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #protocolListGenerator
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProtocols
+ #aspect: #selectedProtocols
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #protocolMenu
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'MethodList'
+ #layout: #(#LayoutFrame 0 0.0 25 0.0 0 1.0 0 1.0)
+ #majorKey: #'MethodList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #callBack: #methodDoubleClicked
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #selectorListGenerator
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #selectorPopUpMenu
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortBy
+ #aspect: #sortBy
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedMethods
+ #aspect: #selectedMethods
+ #callBack: #methodsSelectionChanged
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeConditionHolder
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ )
+ )
+
+ )
+ )
+!
+
+windowSpec
+ ^ self fullBrowserSpec
+! !
+
+!NavigatorCanvas class methodsFor:'misc'!
+
+classResources
+ ^ NewSystemBrowser classResources
+! !
+
+!NavigatorCanvas methodsFor:'misc'!
+
+resources
+ |m|
+
+ (m := self masterApplication) notNil ifTrue:[
+ ^ m resources
+ ].
+ ^ super resources
+! !
+
+!NavigatorCanvas class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_NavigatorCanvas.st,v 1.1 2004-02-26 18:56:52 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_NavigatorModel.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,151 @@
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+ApplicationModel subclass:#NavigatorModel
+ instanceVariableNames:''
+ classVariableNames:'AllEntry'
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!NavigatorModel class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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.
+"
+! !
+
+!NavigatorModel class methodsFor:'initialization'!
+
+initialize
+ AllEntry := '* all *'
+
+ "Created: / 24.2.2000 / 13:41:29 / cg"
+! !
+
+!NavigatorModel class methodsFor:'defaults'!
+
+nameListEntryForALL
+ ^ AllEntry ? '* all *'
+
+ "Created: / 24.2.2000 / 13:39:10 / cg"
+ "Modified: / 25.2.2000 / 21:18:30 / cg"
+!
+
+nameListEntryForNILCategory
+ ^ '* no category *'
+!
+
+nameListEntryForNonStatic
+ ^ '* instance *'
+!
+
+nameListEntryForStatic
+ ^ '* static *'
+! !
+
+!NavigatorModel class methodsFor:'interface specs'!
+
+metaSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:NavigatorModel andSelector:#metaSpec
+ NavigatorModel new openInterface:#metaSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #metaSpec
+ #window:
+ #(#WindowSpec
+ #label: 'MetaToggles'
+ #name: 'MetaToggles'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 16 46 316 74)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#RadioButtonSpec
+ #label: 'Instance'
+ #name: 'InstanceToggle'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 0.5 25 0)
+ #translateLabel: true
+ #tabable: true
+ #model: #notMetaToggle
+ #isTriggerOnDown: true
+ #select: true
+ #isToggle: true
+ )
+ #(#RadioButtonSpec
+ #label: 'Class'
+ #name: 'ClassToggle'
+ #layout: #(#LayoutFrame 0 0.5 0 0 0 1.0 25 0)
+ #translateLabel: true
+ #labelChannel: #metaToggleLabelHolder
+ #tabable: true
+ #model: #metaToggle
+ #isTriggerOnDown: true
+ #select: true
+ #isToggle: true
+ )
+ )
+
+ )
+ )
+! !
+
+!NavigatorModel class methodsFor:'misc'!
+
+classResources
+ ^ NewSystemBrowser classResources
+! !
+
+!NavigatorModel methodsFor:'misc'!
+
+resources
+ |m|
+
+ (m := self masterApplication) notNil ifTrue:[
+ ^ m resources
+ ].
+ ^ super resources
+! !
+
+!NavigatorModel class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_NavigatorModel.st,v 1.1 2004-02-26 18:55:51 cg Exp $'
+! !
+
+NavigatorModel initialize!
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_OrganizerCanvas.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,3904 @@
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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' }"
+
+"{ NameSpace: Tools }"
+
+NavigatorModel subclass:#OrganizerCanvas
+ instanceVariableNames:'projectListSlaveMode namespaceListSlaveMode categoryListSlaveMode
+ classInheritanceListSlaveMode classListSlaveMode
+ classHierarchyListSlaveMode organizerMode metaToggle
+ notMetaToggle meta classList classCategoryDoubleClickChannel
+ classDoubleClickChannel classGeneratorHolder
+ classGeneratorHolderFromClassCategory
+ classGeneratorHolderFromClassHierarchy
+ classGeneratorHolderFromProject classGeneratorHolderFromNamespace
+ classCategoryListMenuHolder categoryListShown
+ classCategoryListUpdateTrigger classListUpdateTrigger
+ classListMenuHolder classHierarchyListMenuHolder
+ projectListMenuHolder variablesMenuHolder filterClassVars
+ variableFilter packageFilter nameSpaceFilter hidePrivateClasses
+ hideUnloadedClasses showClassPackages immediateUpdate
+ metaToggleLabelHolder selectedCategories selectedClasses
+ selectedNamespaces selectedProjects selectionChangeCondition
+ nameSpaceFilterSelection markApplicationsHolder'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!OrganizerCanvas class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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.
+"
+! !
+
+!OrganizerCanvas class methodsFor:'interface specs'!
+
+embeddedNameSpaceListSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:OrganizerCanvas andSelector:#embeddedNameSpaceListSpec
+ OrganizerCanvas new openInterface:#embeddedNameSpaceListSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #embeddedNameSpaceListSpec
+ #window:
+ #(#WindowSpec
+ #label: 'Organizer'
+ #name: 'Organizer'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 218 175 518 475)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'NamespaceList2'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #level: 1
+ #majorKey: #'NamespaceList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #nameSpaceFilterDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceNamespaceGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #nameSpaceListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedNamespaces
+ #aspect: #nameSpaceFilterSelection
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #popUpNameSpaceListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #nameSpaceListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ #postBuildCallback: #nameSpaceListWidgetWasBuilt:
+ )
+ )
+
+ )
+ )
+!
+
+windowSpec
+ ^ self windowSpecNonHierarchical
+ "/ ^ self windowSpecHierarchical
+!
+
+windowSpecHierarchical
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:OrganizerCanvas andSelector:#windowSpec
+ OrganizerCanvas new openInterface:#windowSpec
+ OrganizerCanvas open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'Organizer'
+ #name: 'Organizer'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 16 46 316 346)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'CategoryNameSpaceAndProjectPanel'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #visibilityChannel: #classHierarchyOrInheritanceNotShown
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'LeftBox'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'ClassCategoryAndNamespaceFilterBox'
+ #layout: #(#LayoutFrame 0 0 0 0 0 1 0 1)
+ #visibilityChannel: #categoryListShown
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassCategoryList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -25 1.0)
+"/ #majorKey: #'ClassCategoryList'
+ #majorKey: #'HierarchicalClassCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #classCategoryDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceClassCategoryGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classCategoryListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedCategories
+ #aspect: #selectedCategories
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #categoryListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classCategoryListUpdateTrigger
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #nameSpaceFilterSelection
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#ExtendedComboBoxSpec
+ #name: 'NameSpaceFilterComboBox'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #tabable: true
+ #model: #nameSpaceFilterSelectedNameSpace
+ #menuWidgetHolder: #nameSpaceListWidgetHolder
+ #miniScrollerHorizontal: true
+ #menuSelector: #nameSpaceFilterPopUpMenu
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'NamespaceList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #initiallyInvisible: true
+ #visibilityChannel: #nameSpaceListShown
+ #majorKey: #'NamespaceList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #nameSpaceDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceNamespaceGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #nameSpaceListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedNamespaces
+ #aspect: #selectedNamespaces
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #nameSpaceListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #nameSpaceListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'ProjectList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #initiallyInvisible: true
+ #visibilityChannel: #projectListShown
+ #majorKey: #'HierarchicalProjectList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #projectDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceProjectGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #projectListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProjects
+ #aspect: #selectedProjects
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #projectListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #projectListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ )
+ #(#ViewSpec
+ #name: 'RightBox'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'ClassAndVariablesPanel'
+ #layout: #(#LayoutFrame 0 0 0 0 0 1 -25 1)
+ #showHandle: false
+ #snapMode: #both
+ #handlePosition: #left
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #majorKey: #'ClassList'
+ #minorKey: #windowSpec
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #classDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classGeneratorHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #outGeneratorHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #nameSpaceFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #classListSlaveMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #variableDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'MetaToggleSpec2'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#ViewSpec
+ #name: 'ClassHierarchyOrInheritanceBox'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #initiallyInvisible: true
+ #visibilityChannel: #classHierarchyOrInheritanceShown
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel2'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -25 1.0)
+ #showHandle: false
+ #snapMode: #both
+ #handlePosition: #left
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'HierarchyOrInheritanceBox'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassHierarchyList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #visibilityChannel: #classHierarchyShown
+ #majorKey: #'HierarchicalClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #classDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceClassInheritanceGeneratorTrigger
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classInheritanceListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #outGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #nameSpaceFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #classHierarchyListSlaveMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #topClassHolder
+ #aspect: #classHierarchyTopClass
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classHierarchyUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'ClassInheritanceList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #visibilityChannel: #classInheritanceShown
+ #majorKey: #'InheritanceClassList'
+ #subAspectHolders:
+ #(#Array
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #classDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceClassInheritanceGeneratorTrigger
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classInheritanceListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #outGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #nameSpaceFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #classInheritanceListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #topClassHolder
+ #aspect: #classHierarchyTopClass
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classHierarchyUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList2'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #variableDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #classHierarchyListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#SubCanvasSpec
+ #name: 'MetaToggles1'
+ #layout: #(#LayoutFrame 0 0.0 -25 1 0 1.0 0 1)
+ #hasHorizontalScrollBar: false
+ #hasVerticalScrollBar: false
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ )
+
+ )
+ )
+!
+
+windowSpecNonHierarchical
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:OrganizerCanvas andSelector:#windowSpec
+ OrganizerCanvas new openInterface:#windowSpec
+ OrganizerCanvas open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'Organizer'
+ #name: 'Organizer'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 16 46 316 346)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableHorizontalPanelSpec
+ #name: 'CategoryNameSpaceAndProjectPanel'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #visibilityChannel: #classHierarchyOrInheritanceNotShown
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'LeftBox'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'ClassCategoryAndNamespaceFilterBox'
+ #layout: #(#LayoutFrame 0 0 0 0 0 1 0 1)
+ #visibilityChannel: #categoryListShown
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassCategoryList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -25 1.0)
+ #majorKey: #'ClassCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #classCategoryDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceClassCategoryGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classCategoryListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedCategories
+ #aspect: #selectedCategories
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #categoryListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classCategoryListUpdateTrigger
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #nameSpaceFilterSelection
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#ExtendedComboBoxSpec
+ #name: 'NameSpaceFilterComboBox'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #tabable: true
+ #model: #nameSpaceFilterSelectedNameSpace
+ #menuWidgetHolder: #nameSpaceListWidgetHolder
+ #miniScrollerHorizontal: true
+ #menuSelector: #nameSpaceFilterPopUpMenu
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'NamespaceList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #initiallyInvisible: true
+ #visibilityChannel: #nameSpaceListShown
+ #majorKey: #'NamespaceList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #nameSpaceDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceNamespaceGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #nameSpaceListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedNamespaces
+ #aspect: #selectedNamespaces
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #nameSpaceListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #nameSpaceListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'ProjectList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #initiallyInvisible: true
+ #visibilityChannel: #projectListShown
+ #majorKey: #'HierarchicalProjectList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #projectDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceProjectGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #projectListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProjects
+ #aspect: #selectedProjects
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #projectListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #projectListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ )
+ #(#ViewSpec
+ #name: 'RightBox'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'ClassAndVariablesPanel'
+ #layout: #(#LayoutFrame 0 0 0 0 0 1 -25 1)
+ #showHandle: false
+ #snapMode: #both
+ #handlePosition: #left
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #majorKey: #'ClassList'
+ #minorKey: #windowSpec
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #classDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classGeneratorHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #outGeneratorHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #nameSpaceFilter
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #classListSlaveMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #variableDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #sortVariablesByName
+ #aspect: #variableListSortByName
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#UISubSpecification
+ #name: 'MetaToggleSpec2'
+ #layout: #(#LayoutFrame 0 0 -25 1 0 1 0 1)
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#ViewSpec
+ #name: 'ClassHierarchyOrInheritanceBox'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #initiallyInvisible: true
+ #visibilityChannel: #classHierarchyOrInheritanceShown
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#VariableVerticalPanelSpec
+ #name: 'VariableVerticalPanel2'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -25 1.0)
+ #showHandle: false
+ #snapMode: #both
+ #handlePosition: #left
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'HierarchyOrInheritanceBox'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassHierarchyList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #visibilityChannel: #classHierarchyShown
+ #majorKey: #'HierarchicalClassList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #classDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceClassInheritanceGeneratorTrigger
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classInheritanceListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #outGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #nameSpaceFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #classHierarchyListSlaveMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #topClassHolder
+ #aspect: #classHierarchyTopClass
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classHierarchyUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'ClassInheritanceList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #visibilityChannel: #classInheritanceShown
+ #majorKey: #'InheritanceClassList'
+ #subAspectHolders:
+ #(#Array
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #classDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceClassInheritanceGeneratorTrigger
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classInheritanceListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #outGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #nameSpaceFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #classInheritanceListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #topClassHolder
+ #aspect: #classHierarchyTopClass
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classHierarchyUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'VariableList2'
+ #majorKey: #'VariableList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #variableDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #classHolder
+ #aspect: #selectedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #variablesMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #classHierarchyListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedVariables
+ #aspect: #variableFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassVarsInVariableList
+ #aspect: #filterClassVars
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ #(#SubCanvasSpec
+ #name: 'MetaToggles1'
+ #layout: #(#LayoutFrame 0 0.0 -25 1 0 1.0 0 1)
+ #hasHorizontalScrollBar: false
+ #hasVerticalScrollBar: false
+ #minorKey: #metaSpec
+ )
+ )
+
+ )
+ )
+ )
+
+ )
+ )
+!
+
+windowSpecWithoutMetaToggles
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:OrganizerCanvas andSelector:#windowSpecWithoutMetaToggles
+ OrganizerCanvas new openInterface:#windowSpecWithoutMetaToggles
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpecWithoutMetaToggles
+ #window:
+ #(#WindowSpec
+ #label: 'Organizer'
+ #name: 'Organizer'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 13 23 313 323)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassHierarchyList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #visibilityChannel: #classHierarchyShown
+ #majorKey: #'HierarchicalClassList'
+ #minorKey: #windowSpec
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #classDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceClassInheritanceGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showClassPackages
+ #aspect: #showClassPackages
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #showMethodInheritance
+ #aspect: #showMethodInheritance
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #methodVisibilityHolder
+ #aspect: #methodVisibilityHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classInheritanceListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #outGeneratorHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #nameSpaceFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #classInheritanceListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #topClassHolder
+ #aspect: #classHierarchyTopClass
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classHierarchyUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'ClassInheritanceList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #visibilityChannel: #classInheritanceShown
+ #majorKey: #'InheritanceClassList'
+ #minorKey: #windowSpec
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #classDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceClassInheritanceGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classInheritanceListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #outGeneratorHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #packageFilter
+ #aspect: #packageFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #nameSpaceFilter
+ #aspect: #nameSpaceFilter
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #classInheritanceListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #topClassHolder
+ #aspect: #classHierarchyTopClass
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classHierarchyUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#VariableHorizontalPanelSpec
+ #name: 'VariableHorizontalPanel1'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #visibilityChannel: #classHierarchyNotShown
+ #barWidth: 2
+ #showHandle: false
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#ViewSpec
+ #name: 'Box1'
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SubCanvasSpec
+ #name: 'ClassCategoryList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #visibilityChannel: #categoryListShown
+ #majorKey: #'ClassCategoryList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #classCategoryDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceClassCategoryGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classCategoryListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedCategories
+ #aspect: #selectedCategories
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classCategoryListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'NamespaceList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #visibilityChannel: #nameSpaceListShown
+ #majorKey: #'NamespaceList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #nameSpaceDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceNamespaceGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #nameSpaceListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedNamespaces
+ #aspect: #selectedNamespaces
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #nameSpaceListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ #(#SubCanvasSpec
+ #name: 'ProjectList'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #visibilityChannel: #projectListShown
+ #majorKey: #'ProjectList'
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #projectDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #forceGeneratorTrigger
+ #aspect: #forceProjectGeneratorTrigger
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #projectListMenuHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #classGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedProjects
+ #aspect: #selectedProjects
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #projectListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ )
+ #(#SubCanvasSpec
+ #name: 'ClassList'
+ #majorKey: #'ClassList'
+ #minorKey: #windowSpec
+ #subAspectHolders:
+ #(#Array
+
+ #(#SubChannelInfoSpec
+ #subAspect: #doubleClickChannel
+ #aspect: #classDoubleClickChannel
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hidePrivateClasses
+ #aspect: #hidePrivateClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #hideUnloadedClasses
+ #aspect: #hideUnloadedClasses
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #markApplicationsHolder
+ #aspect: #markApplicationsHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #immediateUpdate
+ #aspect: #immediateUpdate
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #inGeneratorHolder
+ #aspect: #classGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #menuHolder
+ #aspect: #classListMenuHolder
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #meta
+ #aspect: #meta
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #organizerMode
+ #aspect: #organizerMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #outGeneratorHolder
+ #aspect: #outGeneratorHolder
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #selectedClasses
+ #aspect: #selectedClasses
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #selectionChangeCondition
+ #aspect: #selectionChangeCondition
+ )
+ #(#SubChannelInfoSpec
+ #subAspect: #slaveMode
+ #aspect: #classListSlaveMode
+ )
+
+ #(#SubChannelInfoSpec
+ #subAspect: #updateTrigger
+ #aspect: #classListUpdateTrigger
+ )
+ )
+ #createNewApplication: true
+ #createNewBuilder: true
+ )
+ )
+
+ )
+ #handles: #(#Any 0.5 1.0)
+ )
+ )
+
+ )
+ )
+
+ "Modified: / 25.2.2000 / 22:39:54 / cg"
+! !
+
+!OrganizerCanvas class methodsFor:'plugIn spec'!
+
+aspectSelectors
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this. If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "Return a description of exported aspects;
+ these can be connected to aspects of an embedding application
+ (if this app is embedded in a subCanvas)."
+
+ ^ #(
+ #(#classCategoryDoubleClickChannel #action )
+ #classCategoryListMenuHolder
+ #(#classDoubleClickChannel #action )
+ #classHierarchyListMenuHolder
+ #classHierarchyTopClass
+ #classListMenuHolder
+ #filterClassVars
+ #hidePrivateClasses
+ #hideUnloadedClasses
+ #immediateUpdate
+ #meta
+ #metaToggleLabelHolder
+ #(#nameSpaceDoubleClickChannel #action )
+ #nameSpaceFilter
+ #nameSpaceListMenuHolder
+ #organizerMode
+ #outGeneratorHolder
+ #packageFilter
+ #(#projectDoubleClickChannel #action )
+ #projectListMenuHolder
+ #selectedCategories
+ #selectedClasses
+ #selectedNamespaces
+ #selectedProjects
+ #selectedProtocols
+ #selectionChangeCondition
+ #showClassPackages
+ #(#variableDoubleClickChannel #action )
+ #variableFilter
+ #variablesMenuHolder
+ #markApplicationsHolder
+ ).
+! !
+
+!OrganizerCanvas methodsFor:'aspects'!
+
+classCategoryDoubleClickChannel
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ classCategoryDoubleClickChannel isNil ifTrue:[
+ classCategoryDoubleClickChannel := TriggerValue new.
+"/ classCategoryDoubleClickChannel addDependent:self.
+ ].
+ ^ classCategoryDoubleClickChannel.
+!
+
+classCategoryListMenuHolder
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ classCategoryListMenuHolder isNil ifTrue:[
+ classCategoryListMenuHolder := ValueHolder new.
+"/ classCategoryListMenuHolder addDependent:self.
+ ].
+ ^ classCategoryListMenuHolder.
+
+ "Created: / 18.2.2000 / 11:52:55 / cg"
+!
+
+classDoubleClickChannel
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ classDoubleClickChannel isNil ifTrue:[
+ classDoubleClickChannel := TriggerValue new.
+"/ classDoubleClickChannel addDependent:self.
+ ].
+ ^ classDoubleClickChannel.
+!
+
+classGeneratorHolder
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ classGeneratorHolder isNil ifTrue:[
+ classGeneratorHolder := ValueHolder new.
+"/ classGeneratorHolder addDependent:self.
+ ].
+ ^ classGeneratorHolder.
+
+ "Created: / 18.2.2000 / 00:56:50 / cg"
+!
+
+classGeneratorHolderFromClassCategory
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ classGeneratorHolderFromClassCategory isNil ifTrue:[
+ classGeneratorHolderFromClassCategory := ValueHolder new.
+"/ classGeneratorHolderFromClassCategory addDependent:self.
+ ].
+ ^ classGeneratorHolderFromClassCategory.
+
+ "Created: / 18.2.2000 / 02:21:55 / cg"
+!
+
+classGeneratorHolderFromClassHierarchy
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ classGeneratorHolderFromClassHierarchy isNil ifTrue:[
+ classGeneratorHolderFromClassHierarchy := ValueHolder new.
+"/ classGeneratorHolderFromClassHierarchy addDependent:self.
+ ].
+ ^ classGeneratorHolderFromClassHierarchy.
+
+ "Created: / 18.2.2000 / 02:21:55 / cg"
+!
+
+classGeneratorHolderFromNamespace
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ classGeneratorHolderFromNamespace isNil ifTrue:[
+ classGeneratorHolderFromNamespace := ValueHolder new.
+"/ classGeneratorHolderFromNamespace addDependent:self.
+ ].
+ ^ classGeneratorHolderFromNamespace.
+
+ "Created: / 18.2.2000 / 02:21:55 / cg"
+!
+
+classGeneratorHolderFromProject
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ classGeneratorHolderFromProject isNil ifTrue:[
+ classGeneratorHolderFromProject := ValueHolder new.
+"/ classGeneratorHolderFromProject addDependent:self.
+ ].
+ ^ classGeneratorHolderFromProject.
+
+ "Created: / 18.2.2000 / 02:21:55 / cg"
+!
+
+classHierarchyListMenuHolder
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ classHierarchyListMenuHolder isNil ifTrue:[
+ classHierarchyListMenuHolder := ValueHolder new.
+"/ classHierarchyListMenuHolder addDependent:self.
+ ].
+ ^ classHierarchyListMenuHolder.
+
+ "Created: / 18.2.2000 / 11:52:55 / cg"
+!
+
+classHierarchyTopClass
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#classHierarchyTopClass) isNil ifTrue:[
+ holder := ValueHolder new.
+ builder aspectAt:#classHierarchyTopClass put:holder.
+"/ holder addDependent:self.
+ ].
+ ^ holder.
+!
+
+classInheritanceListMenuHolder
+ ^ self classHierarchyListMenuHolder
+!
+
+classList
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ classList isNil ifTrue:[
+ classList := ValueHolder new.
+"/ classList addDependent:self.
+ ].
+ ^ classList.
+
+ "Created: / 18.2.2000 / 00:23:43 / cg"
+!
+
+classListMenuHolder
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ classListMenuHolder isNil ifTrue:[
+ classListMenuHolder := ValueHolder new.
+"/ classListMenuHolder addDependent:self.
+ ].
+ ^ classListMenuHolder.
+
+ "Created: / 18.2.2000 / 11:57:22 / cg"
+!
+
+filterClassVars
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ filterClassVars isNil ifTrue:[
+ filterClassVars := ValueHolder new.
+"/ filterClassVars addDependent:self.
+ ].
+ ^ filterClassVars.
+
+ "Created: / 24.2.2000 / 23:29:52 / cg"
+!
+
+hidePrivateClasses
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ hidePrivateClasses isNil ifTrue:[
+ hidePrivateClasses := false asValue.
+"/ hidePrivateClasses addDependent:self.
+ ].
+ ^ hidePrivateClasses.
+
+ "Created: / 24.2.2000 / 16:18:45 / cg"
+!
+
+hideUnloadedClasses
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ hideUnloadedClasses isNil ifTrue:[
+ hideUnloadedClasses := false asValue.
+"/ hideUnloadedClasses addDependent:self.
+ ].
+ ^ hideUnloadedClasses.
+
+ "Created: / 18.2.2000 / 17:54:57 / cg"
+!
+
+immediateUpdate
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ immediateUpdate isNil ifTrue:[
+ immediateUpdate := false asValue.
+"/ immediateUpdate addDependent:self.
+ ].
+ ^ immediateUpdate.
+
+ "Created: / 18.2.2000 / 00:23:43 / cg"
+!
+
+markApplicationsHolder
+ markApplicationsHolder isNil ifTrue:[
+ markApplicationsHolder := false asValue.
+ ].
+ ^ markApplicationsHolder.
+!
+
+meta
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ meta isNil ifTrue:[
+ meta := false asValue.
+"/ meta addDependent:self.
+ ].
+ ^ meta.
+
+ "Created: / 18.2.2000 / 00:23:43 / cg"
+ "Modified: / 18.2.2000 / 00:42:23 / cg"
+!
+
+metaToggle
+ metaToggle isNil ifTrue:[
+ metaToggle := PluggableAdaptor on:(self meta).
+ metaToggle
+ getBlock:[:m | m value == true]
+ putBlock:[:m :newValue | m value:(newValue ? false)]
+ updateBlock:[:m :aspect :param | true].
+ ].
+ ^ metaToggle
+!
+
+metaToggleLabelHolder
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ metaToggleLabelHolder isNil ifTrue:[
+ metaToggleLabelHolder := (resources string:'Class') asValue.
+"/ metaToggleLabelHolder addDependent:self.
+ ].
+ ^ metaToggleLabelHolder.
+
+ "Created: / 18.2.2000 / 11:52:55 / cg"
+!
+
+nameSpaceDoubleClickChannel
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#nameSpaceDoubleClickChannel) isNil ifTrue:[
+ holder := TriggerValue new.
+ builder aspectAt:#nameSpaceDoubleClickChannel put:holder.
+"/ holder addDependent:self.
+ ].
+ ^ holder.
+!
+
+nameSpaceFilter
+ "automatically generated by UIPainter ..."
+
+ nameSpaceFilter isNil ifTrue:[
+ nameSpaceFilter := ValueHolder new.
+self halt.
+ nameSpaceFilter onChangeEvaluate:[
+self halt.
+ nameSpaceFilter value ~= nameSpaceFilterSelection value ifTrue:[
+ self halt
+ ].
+"/ self nameSpaceFilter value: nameSpaceFilterSelection value.
+ ]
+ ].
+ ^ nameSpaceFilter.
+
+ "Created: / 24.2.2000 / 23:29:52 / cg"
+!
+
+nameSpaceFilterDoubleClickChannel
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#nameSpaceFilterDoubleClickChannel) isNil ifTrue:[
+ holder := TriggerValue new.
+ builder aspectAt:#nameSpaceFilterDoubleClickChannel put:holder.
+ holder onChangeEvaluate:[
+ (builder componentAt:#NameSpaceFilterComboBox) closeMenu.
+"/ self nameSpaceDoubleClickChannel value:true.
+ ]
+ ].
+ ^ holder.
+!
+
+nameSpaceFilterPopUpMenu
+ ^ self nameSpaceListMenuHolder.
+!
+
+nameSpaceFilterSelectedNameSpace
+ |holder|
+
+ (holder := builder bindingAt:#nameSpaceFilterSelectedNameSpace) isNil ifTrue:[
+ holder := self class nameListEntryForALL "'* all *'" asValue.
+ builder aspectAt:#nameSpaceFilterSelectedNameSpace put:holder.
+ holder onChangeEvaluate:[ self updateNameSpaceLabel. ].
+ ].
+ ^ holder.
+
+ "Created: / 18.2.2000 / 11:52:55 / cg"
+!
+
+nameSpaceFilterSelection
+ "automatically generated by UIPainter ..."
+
+ nameSpaceFilterSelection isNil ifTrue:[
+ nameSpaceFilterSelection := (OrderedCollection with:self class nameListEntryForALL) asValue.
+ nameSpaceFilterSelection addDependent:self.
+ ].
+ ^ nameSpaceFilterSelection.
+!
+
+nameSpaceListMenuHolder
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#nameSpaceListMenuHolder) isNil ifTrue:[
+ holder := ValueHolder new.
+ builder aspectAt:#nameSpaceListMenuHolder put:holder.
+"/ holder addDependent:self.
+ ].
+ ^ holder.
+
+ "Created: / 18.2.2000 / 11:52:55 / cg"
+!
+
+nameSpaceListWidget
+ |view|
+
+ view := SubCanvas new.
+ view client:self spec:#embeddedNameSpaceListSpec builder:nil. "/ (self builder).
+ (view builder findComponentAt:#List) autoHideHorizontalScrollBar:true.
+ ^ view.
+!
+
+nameSpaceListWidgetHolder
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#nameSpaceListWidgetHolder) isNil ifTrue:[
+ holder := ValueHolder new.
+ builder aspectAt:#nameSpaceListWidgetHolder put:holder.
+ holder value:(self nameSpaceListWidget).
+ ].
+ ^ holder.
+!
+
+notMetaToggle
+ notMetaToggle isNil ifTrue:[
+ notMetaToggle := PluggableAdaptor on:(self meta).
+ notMetaToggle
+ getBlock:[:m | m value == false]
+ putBlock:[:m :newValue | m value:(newValue ? false) not]
+ updateBlock:[:m :aspect :param | true].
+ ].
+ ^ notMetaToggle
+!
+
+organizerMode
+ organizerMode isNil ifTrue:[
+ organizerMode := #category asValue.
+ organizerMode addDependent:self.
+ ].
+ ^ organizerMode
+
+ "Created: / 18.2.2000 / 00:30:44 / cg"
+ "Modified: / 18.2.2000 / 02:56:21 / cg"
+!
+
+outGeneratorHolder
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#outGeneratorHolder) isNil ifTrue:[
+ holder := ValueHolder new.
+ builder aspectAt:#outGeneratorHolder put:holder.
+"/ holder addDependent:self.
+ ].
+ ^ holder.
+
+ "Created: / 18.2.2000 / 00:23:43 / cg"
+!
+
+packageFilter
+ "automatically generated by UIPainter ..."
+
+ packageFilter isNil ifTrue:[
+ packageFilter := ValueHolder new.
+"/ packageFilter addDependent:self.
+ ].
+ ^ packageFilter.
+
+ "Created: / 24.2.2000 / 23:29:52 / cg"
+!
+
+popUpNameSpaceListSlaveMode
+ ^ false
+!
+
+projectDoubleClickChannel
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#projectDoubleClickChannel) isNil ifTrue:[
+ holder := TriggerValue new.
+ builder aspectAt:#projectDoubleClickChannel put:holder.
+"/ holder addDependent:self.
+ ].
+ ^ holder.
+!
+
+projectListMenuHolder
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ projectListMenuHolder isNil ifTrue:[
+ projectListMenuHolder := ValueHolder new.
+"/ projectListMenuHolder addDependent:self.
+ ].
+ ^ projectListMenuHolder.
+
+ "Created: / 18.2.2000 / 11:52:55 / cg"
+!
+
+selectedCategories
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ selectedCategories isNil ifTrue:[
+ selectedCategories := ValueHolder new.
+"/ selectedCategories addDependent:self.
+ ].
+ ^ selectedCategories.
+
+ "Created: / 18.2.2000 / 12:27:58 / cg"
+!
+
+selectedClasses
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ selectedClasses isNil ifTrue:[
+ selectedClasses := ValueHolder new.
+ selectedClasses addDependent:self.
+ ].
+ ^ selectedClasses.
+
+ "Created: / 18.2.2000 / 00:23:43 / cg"
+!
+
+selectedNamespaces
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ selectedNamespaces isNil ifTrue:[
+ selectedNamespaces := (OrderedCollection with:self class nameListEntryForALL) asValue.
+ ].
+ ^ selectedNamespaces.
+
+ "Created: / 18.2.2000 / 12:27:58 / cg"
+!
+
+selectedProjects
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ selectedProjects isNil ifTrue:[
+ selectedProjects := ValueHolder new.
+"/ selectedProjects addDependent:self.
+ ].
+ ^ selectedProjects.
+
+ "Created: / 18.2.2000 / 12:16:01 / cg"
+!
+
+selectionChangeCondition
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ selectionChangeCondition isNil ifTrue:[
+ selectionChangeCondition := ValueHolder new.
+"/ selectionChangeCondition addDependent:self.
+ ].
+ ^ selectionChangeCondition.
+
+ "Created: / 18.2.2000 / 00:23:43 / cg"
+!
+
+showClassPackages
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ showClassPackages isNil ifTrue:[
+ showClassPackages := false asValue.
+"/ showClassPackages addDependent:self.
+ ].
+ ^ showClassPackages.
+
+ "Created: / 18.2.2000 / 17:54:57 / cg"
+!
+
+updateNameSpaceLabel
+ |box|
+
+ box := self builder componentAt:#NameSpaceFilterComboBox.
+ box notNil ifTrue:[
+ "/ new code: ExtComboBox uses always an EditField
+ box editor contents:nameSpaceFilterSelection value first.
+
+ "/ old code: readOnly ExtComboBox used a Label
+ "/ box menuField label:nameSpaceFilterSelection value first
+ ]
+!
+
+variableDoubleClickChannel
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#variableDoubleClickChannel) isNil ifTrue:[
+ holder := TriggerValue new.
+ builder aspectAt:#variableDoubleClickChannel put:holder.
+"/ holder addDependent:self.
+ ].
+ ^ holder.
+!
+
+variableFilter
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ variableFilter isNil ifTrue:[
+ variableFilter := ValueHolder new.
+"/ variableFilter addDependent:self.
+ ].
+ ^ variableFilter.
+
+ "Created: / 24.2.2000 / 23:29:52 / cg"
+!
+
+variablesMenuHolder
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ variablesMenuHolder isNil ifTrue:[
+ variablesMenuHolder := ValueHolder new.
+"/ variablesMenuHolder addDependent:self.
+ ].
+ ^ variablesMenuHolder.
+
+ "Created: / 24.2.2000 / 23:29:52 / cg"
+! !
+
+!OrganizerCanvas methodsFor:'aspects-exported'!
+
+classCategoryDoubleClickChannel:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ classCategoryDoubleClickChannel removeDependent:self.
+
+ classCategoryDoubleClickChannel := something.
+
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.8.2000 / 20:04:48 / cg"
+!
+
+classCategoryListMenuHolder:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ classCategoryListMenuHolder removeDependent:self.
+
+ classCategoryListMenuHolder := something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 11:53:31 / cg"
+!
+
+classCategoryListUpdateTrigger:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ classCategoryListUpdateTrigger removeDependent:self.
+
+ classCategoryListUpdateTrigger := something.
+
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 02:08:01 / cg"
+!
+
+classDoubleClickChannel:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ classDoubleClickChannel removeDependent:self.
+
+ classDoubleClickChannel := something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+!
+
+classHierarchyListMenuHolder:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ classHierarchyListMenuHolder removeDependent:self.
+
+ classHierarchyListMenuHolder := something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 11:53:31 / cg"
+!
+
+classHierarchyShown:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ |holder|
+
+ "/ (holder := builder bindingAt:#classHierarchyShown) notNil ifTrue:[
+ "/ holder removeDependent:self.
+ "/ ].
+ builder aspectAt:#classHierarchyShown put:something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 00:24:28 / cg"
+!
+
+classHierarchyTopClass:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ |holder|
+
+ "/ (holder := builder bindingAt:#classHierarchyTopClass) notNil ifTrue:[
+ "/ holder removeDependent:self.
+ "/ ].
+ builder aspectAt:#classHierarchyTopClass put:something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+!
+
+classHierarchyUpdateTrigger:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ |holder|
+
+ "/ (holder := builder bindingAt:#classHierarchyUpdateTrigger) notNil ifTrue:[
+ "/ holder removeDependent:self.
+ "/ ].
+ builder aspectAt:#classHierarchyUpdateTrigger put:something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 02:08:01 / cg"
+!
+
+classList:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ classList notNil ifTrue:[
+ "/ classList removeDependent:self.
+ "/ ].
+ classList := something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 00:24:28 / cg"
+!
+
+classListMenuHolder:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ classListMenuHolder removeDependent:self.
+
+ classListMenuHolder := something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 11:57:22 / cg"
+!
+
+classListUpdateTrigger:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ classListUpdateTrigger removeDependent:self.
+
+ classListUpdateTrigger := something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 02:08:01 / cg"
+!
+
+filterClassVars:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ filterClassVars removeDependent:self.
+
+ filterClassVars := something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 24.2.2000 / 23:46:16 / cg"
+!
+
+hidePrivateClasses:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ hidePrivateClasses removeDependent:self.
+
+ hidePrivateClasses := something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 24.2.2000 / 16:18:32 / cg"
+!
+
+hideUnloadedClasses:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ hideUnloadedClasses removeDependent:self.
+
+ hideUnloadedClasses := something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 17:54:57 / cg"
+!
+
+immediateUpdate:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ immediateUpdate removeDependent:self.
+
+ immediateUpdate := something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 00:24:29 / cg"
+!
+
+markApplicationsHolder:something
+ markApplicationsHolder := something.
+!
+
+meta:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ meta notNil ifTrue:[
+ "/ meta removeDependent:self.
+ "/ ].
+"/ (something == true or:[something == false]) ifTrue:[self halt].
+ meta := something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ metaToggle notNil ifTrue:[
+ metaToggle model:something
+ ].
+ notMetaToggle notNil ifTrue:[
+ notMetaToggle model:something
+ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 00:24:29 / cg"
+!
+
+metaToggleLabelHolder:something
+ |v|
+
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ metaToggleLabelHolder removeDependent:self.
+
+ metaToggleLabelHolder := something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ (v := builder componentAt:#ClassToggle) notNil ifTrue:[
+ v labelChannel:metaToggleLabelHolder.
+ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 11:53:31 / cg"
+!
+
+nameSpaceFilter:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ packageFilter notNil ifTrue:[
+ "/ packageFilter removeDependent:self.
+ "/ ].
+ nameSpaceFilter := something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ self nameSpaceFilterSelection value:something value.
+ ^ self.
+
+ "Created: / 24.2.2000 / 23:46:16 / cg"
+!
+
+nameSpaceListMenuHolder:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ |holder|
+
+ "/ (holder := builder bindingAt:#namespaceListMenuHolder) notNil ifTrue:[
+ "/ holder removeDependent:self.
+ "/ ].
+ builder aspectAt:#nameSpaceListMenuHolder put:something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 11:53:31 / cg"
+!
+
+nameSpaceListUpdateTrigger:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ |holder|
+
+ "/ (holder := builder bindingAt:#namespaceListUpdateTrigger) notNil ifTrue:[
+ "/ holder removeDependent:self.
+ "/ ].
+ builder aspectAt:#nameSpaceListUpdateTrigger put:something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 02:08:01 / cg"
+!
+
+organizerMode:aValueHolder
+ organizerMode notNil ifTrue:[
+ organizerMode removeDependent:self.
+ ].
+ organizerMode := aValueHolder.
+ organizerMode notNil ifTrue:[
+ organizerMode addDependent:self.
+ ].
+
+ "Created: / 18.2.2000 / 10:21:41 / cg"
+!
+
+outGeneratorHolder:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ |holder|
+
+ "/ (holder := builder bindingAt:#outGeneratorHolder) notNil ifTrue:[
+ "/ holder removeDependent:self.
+ "/ ].
+ builder aspectAt:#outGeneratorHolder put:something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 00:24:29 / cg"
+!
+
+packageFilter:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ packageFilter notNil ifTrue:[
+ "/ packageFilter removeDependent:self.
+ "/ ].
+ packageFilter := something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 24.2.2000 / 23:46:16 / cg"
+!
+
+projectDoubleClickChannel:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ |holder|
+
+ "/ (holder := builder bindingAt:#projectDoubleClickChannel) notNil ifTrue:[
+ "/ holder removeDependent:self.
+ "/ ].
+ builder aspectAt:#projectDoubleClickChannel put:something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+!
+
+projectListMenuHolder:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ projectListMenuHolder := something.
+
+ "Created: / 18.2.2000 / 11:53:31 / cg"
+!
+
+projectListUpdateTrigger:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ |holder|
+
+ "/ (holder := builder bindingAt:#projectListUpdateTrigger) notNil ifTrue:[
+ "/ holder removeDependent:self.
+ "/ ].
+ builder aspectAt:#projectListUpdateTrigger put:something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 02:08:01 / cg"
+!
+
+selectedCategories:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ selectedCategories := something.
+ ^ self.
+
+ "Created: / 18.2.2000 / 14:04:36 / cg"
+!
+
+selectedClasses:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ selectedClasses removeDependent:self.
+
+ selectedClasses := something.
+ something notNil ifTrue:[
+ something addDependent:self.
+ ].
+ ^ self.
+
+ "Created: / 18.2.2000 / 00:24:29 / cg"
+!
+
+selectedNamespaces:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ selectedNamespaces := something.
+ selectedNamespaces onChangeEvaluate:[
+ nameSpaceFilterSelection value:selectedNamespaces value.
+ ].
+!
+
+selectedProjects:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ selectedProjects := something.
+!
+
+selectionChangeCondition:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ selectionChangeCondition := something.
+!
+
+showClassPackages:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ showClassPackages := something.
+!
+
+variableDoubleClickChannel:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ "/ |holder|
+
+ "/ (holder := builder bindingAt:#variableDoubleClickChannel) notNil ifTrue:[
+ "/ holder removeDependent:self.
+ "/ ].
+ builder aspectAt:#variableDoubleClickChannel put:something.
+ "/ something notNil ifTrue:[
+ "/ something addDependent:self.
+ "/ ].
+ ^ self.
+!
+
+variableFilter:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ variableFilter := something.
+!
+
+variablesMenuHolder:something
+ "automatically generated by UIPainter ..."
+
+ "This method is used when I am embedded as subApplication,"
+ "and the mainApp wants to connect its aspects to mine."
+
+ variablesMenuHolder := something.
+! !
+
+!OrganizerCanvas methodsFor:'aspects-private'!
+
+categoryListSlaveMode
+ categoryListSlaveMode isNil ifTrue:[
+ categoryListSlaveMode := false asValue.
+ ].
+ ^ categoryListSlaveMode
+
+ "Created: / 18.2.2000 / 00:30:44 / cg"
+ "Modified: / 18.2.2000 / 02:56:21 / cg"
+!
+
+classHierarchyListSlaveMode
+ classHierarchyListSlaveMode isNil ifTrue:[
+ classHierarchyListSlaveMode := true asValue.
+ ].
+ ^ classHierarchyListSlaveMode
+
+ "Created: / 18.2.2000 / 00:30:44 / cg"
+ "Modified: / 18.2.2000 / 02:56:21 / cg"
+!
+
+classInheritanceListSlaveMode
+ classInheritanceListSlaveMode isNil ifTrue:[
+ classInheritanceListSlaveMode := true asValue.
+ ].
+ ^ classInheritanceListSlaveMode
+
+ "Modified: / 18.2.2000 / 02:56:21 / cg"
+ "Created: / 26.2.2000 / 00:09:18 / cg"
+!
+
+classListSlaveMode
+ classListSlaveMode isNil ifTrue:[
+ classListSlaveMode := false asValue.
+ ].
+ ^ classListSlaveMode
+
+ "Created: / 18.2.2000 / 00:30:44 / cg"
+ "Modified: / 18.2.2000 / 02:56:21 / cg"
+!
+
+nameSpaceListSlaveMode
+ namespaceListSlaveMode isNil ifTrue:[
+ namespaceListSlaveMode := true asValue.
+ ].
+ ^ namespaceListSlaveMode
+
+ "Created: / 18.2.2000 / 00:30:44 / cg"
+ "Modified: / 18.2.2000 / 02:56:21 / cg"
+!
+
+projectListSlaveMode
+ projectListSlaveMode isNil ifTrue:[
+ projectListSlaveMode := true asValue.
+ ].
+ ^ projectListSlaveMode
+
+ "Created: / 18.2.2000 / 00:30:44 / cg"
+ "Modified: / 18.2.2000 / 02:56:21 / cg"
+! !
+
+!OrganizerCanvas methodsFor:'aspects-trigger'!
+
+classCategoryListUpdateTrigger
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ classCategoryListUpdateTrigger isNil ifTrue:[
+ classCategoryListUpdateTrigger := TriggerValue new.
+"/ classCategoryListUpdateTrigger addDependent:self.
+ ].
+ ^ classCategoryListUpdateTrigger.
+
+ "Created: / 18.2.2000 / 02:05:14 / cg"
+ "Modified: / 18.2.2000 / 02:14:04 / cg"
+!
+
+classHierarchyUpdateTrigger
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#classHierarchyUpdateTrigger) isNil ifTrue:[
+ holder := TriggerValue new.
+ builder aspectAt:#classHierarchyUpdateTrigger put:holder.
+"/ holder addDependent:self.
+ ].
+ ^ holder.
+
+ "Created: / 18.2.2000 / 02:05:14 / cg"
+ "Modified: / 18.2.2000 / 02:13:57 / cg"
+!
+
+classListUpdateTrigger
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ classListUpdateTrigger isNil ifTrue:[
+ classListUpdateTrigger := TriggerValue new.
+"/ classListUpdateTrigger addDependent:self.
+ ].
+ ^ classListUpdateTrigger.
+
+ "Created: / 18.2.2000 / 02:05:14 / cg"
+ "Modified: / 18.2.2000 / 02:14:08 / cg"
+!
+
+forceClassCategoryGeneratorTrigger
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#forceClassCategoryGeneratorTrigger) isNil ifTrue:[
+ holder := TriggerValue new.
+ builder aspectAt:#forceClassCategoryGeneratorTrigger put:holder.
+"/ holder addDependent:self.
+ ].
+ ^ holder.
+
+ "Created: / 18.2.2000 / 02:49:43 / cg"
+ "Modified: / 18.2.2000 / 02:52:30 / cg"
+!
+
+forceClassHierarchyGeneratorTrigger
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#forceClassHierarchyGeneratorTrigger) isNil ifTrue:[
+ holder := TriggerValue new.
+ builder aspectAt:#forceClassHierarchyGeneratorTrigger put:holder.
+"/ holder addDependent:self.
+ ].
+ ^ holder.
+
+ "Created: / 18.2.2000 / 02:49:43 / cg"
+ "Modified: / 18.2.2000 / 02:52:32 / cg"
+!
+
+forceNamespaceGeneratorTrigger
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#forceNamespaceGeneratorTrigger) isNil ifTrue:[
+ holder := TriggerValue new.
+ builder aspectAt:#forceNamespaceGeneratorTrigger put:holder.
+"/ holder addDependent:self.
+ ].
+ ^ holder.
+
+ "Created: / 18.2.2000 / 02:49:43 / cg"
+ "Modified: / 18.2.2000 / 02:52:35 / cg"
+!
+
+forceProjectGeneratorTrigger
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#forceProjectGeneratorTrigger) isNil ifTrue:[
+ holder := TriggerValue new.
+ builder aspectAt:#forceProjectGeneratorTrigger put:holder.
+"/ holder addDependent:self.
+ ].
+ ^ holder.
+
+ "Created: / 18.2.2000 / 02:49:43 / cg"
+ "Modified: / 18.2.2000 / 02:52:38 / cg"
+!
+
+nameSpaceListUpdateTrigger
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#nameSpaceListUpdateTrigger) isNil ifTrue:[
+ holder := TriggerValue new.
+ builder aspectAt:#nameSpaceListUpdateTrigger put:holder.
+"/ holder addDependent:self.
+ ].
+ ^ holder.
+
+ "Created: / 18.2.2000 / 02:05:14 / cg"
+ "Modified: / 18.2.2000 / 02:14:12 / cg"
+!
+
+projectListUpdateTrigger
+ "automatically generated by UIPainter ..."
+
+ "*** the code below creates a default model when invoked."
+ "*** (which may not be the one you wanted)"
+ "*** Please change as required and accept it in the browser."
+
+ |holder|
+
+ (holder := builder bindingAt:#projectListUpdateTrigger) isNil ifTrue:[
+ holder := TriggerValue new.
+ builder aspectAt:#projectListUpdateTrigger put:holder.
+"/ holder addDependent:self.
+ ].
+ ^ holder.
+
+ "Created: / 18.2.2000 / 02:05:14 / cg"
+ "Modified: / 18.2.2000 / 02:14:15 / cg"
+! !
+
+!OrganizerCanvas methodsFor:'aspects-visibility'!
+
+categoryListShown
+ categoryListShown isNil ifTrue:[
+ categoryListShown := BlockValue
+ with:[:v | v value == #category]
+ argument:(self organizerMode).
+ ].
+ ^ categoryListShown
+
+ "Modified: / 18.2.2000 / 02:11:00 / cg"
+!
+
+classHierarchyNotShown
+ |holder|
+
+ (holder := builder bindingAt:#classHierarchyNotShown) isNil ifTrue:[
+ holder := BlockValue
+ with:[:v | |org|
+ org := v value.
+ org ~~ #hierarchy
+ and:[org ~~ #classHierarchy
+ and:[org ~~ #classInheritance]]]
+ argument:(self organizerMode).
+ builder aspectAt:#classHierarchyNotShown put: holder
+ ].
+ ^ holder
+
+ "Created: / 18.2.2000 / 00:36:38 / cg"
+ "Modified: / 24.2.2000 / 13:22:43 / cg"
+!
+
+classHierarchyOrInheritanceNotShown
+ |holder|
+
+ (holder := builder bindingAt:#classHierarchyOrInheritanceNotShown) isNil ifTrue:[
+ holder := BlockValue
+ with:[:v1 :v2 | (v1 value or:[v2 value]) not]
+ argument:(self classHierarchyShown)
+ argument:(self classInheritanceShown).
+ builder aspectAt:#classHierarchyOrInheritanceNotShown put: holder
+ ].
+ ^ holder
+!
+
+classHierarchyOrInheritanceShown
+ |holder|
+
+ (holder := builder bindingAt:#classHierarchyOrInheritanceShown) isNil ifTrue:[
+ holder := BlockValue
+ with:[:v1 :v2 | v1 value or:[v2 value] ]
+ argument:(self classHierarchyShown)
+ argument:(self classInheritanceShown).
+ builder aspectAt:#classHierarchyOrInheritanceShown put: holder
+ ].
+ ^ holder
+!
+
+classHierarchyShown
+ |holder|
+
+ (holder := builder bindingAt:#classHierarchyShown) isNil ifTrue:[
+ holder := BlockValue
+ with:[:v | |org|
+ org := v value.
+ org == #hierarchy
+ or:[org == #classHierarchy]]
+ argument:(self organizerMode).
+ builder aspectAt:#classHierarchyShown put: holder
+ ].
+ ^ holder
+
+ "Modified: / 24.2.2000 / 13:23:33 / cg"
+!
+
+classInheritanceShown
+ |holder|
+
+ (holder := builder bindingAt:#classInheritanceShown) isNil ifTrue:[
+ holder := BlockValue
+ with:[:v | v value == #classInheritance]
+ argument:(self organizerMode).
+ builder aspectAt:#classInheritanceShown put: holder
+ ].
+ ^ holder
+
+ "Created: / 24.2.2000 / 13:23:01 / cg"
+!
+
+classListShown
+ |holder|
+
+ (holder := builder bindingAt:#classListShown) isNil ifTrue:[
+ holder := BlockValue
+ with:[:v | v value ~~ #hierarchy]
+ argument:(self organizerMode).
+ builder aspectAt:#classListShown put: holder
+ ].
+ ^ holder
+
+ "Modified: / 18.2.2000 / 00:32:48 / cg"
+!
+
+nameSpaceListShown
+ |holder|
+
+ (holder := builder bindingAt:#nameSpaceListShown) isNil ifTrue:[
+ holder := BlockValue
+ with:[:v | v value == #namespace]
+ argument:(self organizerMode).
+ builder aspectAt:#nameSpaceListShown put: holder
+ ].
+ ^ holder
+
+ "Created: / 18.2.2000 / 00:32:09 / cg"
+ "Modified: / 18.2.2000 / 01:48:35 / cg"
+!
+
+projectListShown
+ |holder|
+
+ (holder := builder bindingAt:#projectListShown) isNil ifTrue:[
+ holder := BlockValue
+ with:[:v | v value == #project]
+ argument:(self organizerMode).
+ builder aspectAt:#projectListShown put: holder
+ ].
+ ^ holder
+
+ "Modified: / 18.2.2000 / 00:31:19 / cg"
+ "Created: / 18.2.2000 / 00:32:09 / cg"
+! !
+
+!OrganizerCanvas methodsFor:'change & update'!
+
+update:something with:aParameter from:changedObject
+ |orgMode trigger classes selectedClassesHolder selectionValue|
+
+ orgMode := organizerMode value.
+ selectedClassesHolder := self selectedClasses.
+ classes := selectedClassesHolder value copy.
+
+ changedObject == organizerMode ifTrue:[
+ self classHierarchyListSlaveMode value:true.
+ self classInheritanceListSlaveMode value:true.
+ self classListSlaveMode value:true.
+ self categoryListSlaveMode value:true.
+ self nameSpaceListSlaveMode value:true.
+ self projectListSlaveMode value:true.
+
+ self updateOrganizationFromChangedClass.
+
+ orgMode == #category ifTrue:[
+"/ trigger := self forceClassCategoryGeneratorTrigger.
+ ] ifFalse:[ orgMode == #hierarchy ifTrue:[
+"/ trigger := self forceClassHierarchyGeneratorTrigger.
+ ] ifFalse:[ orgMode == #namespace ifTrue:[
+"/ trigger := self forceNamespaceGeneratorTrigger
+ ] ifFalse:[ orgMode == #project ifTrue:[
+ trigger := self forceProjectGeneratorTrigger.
+ ] ifFalse:[ ((orgMode == #classHierarchy) or:[orgMode == #classInheritance]) ifTrue:[
+"/ trigger := self forceClassHierarchyGeneratorTrigger.
+ ]]]]].
+
+ "/ must update the packageFilter
+ orgMode == #project ifTrue:[
+ packageFilter setValue:(self selectedProjects value)
+ ] ifFalse:[
+ packageFilter value:nil
+ ].
+
+ trigger notNil ifTrue:[
+ trigger value:true
+ ].
+ "/ selectedClassesHolder value:classes.
+
+
+ (orgMode == #classHierarchy or:[orgMode == #hierarchy]) ifTrue:[
+ classHierarchyListSlaveMode value:false.
+ ].
+ (orgMode == #classInheritance) ifTrue:[
+ classInheritanceListSlaveMode value:false.
+ ].
+ (orgMode == #classInheritance
+ or:[orgMode == #classHierarchy
+ or:[orgMode == #hierarchy]])
+ ifFalse:[
+ classListSlaveMode value:false.
+ ].
+ (orgMode == #category) ifTrue:[
+ categoryListSlaveMode value:false.
+ ].
+ (orgMode == #namespace) ifTrue:[
+ namespaceListSlaveMode value:false.
+ ].
+ (orgMode == #project) ifTrue:[
+ projectListSlaveMode value:false.
+ ].
+
+ ^ self
+ ].
+
+ changedObject == selectedClasses ifTrue:[
+ selectedClasses value size ~~ 0 ifTrue:[
+ (orgMode ~~ #classHierarchy) ifTrue:[
+ self updateOrganizationFromChangedClass.
+ ].
+ ]
+ ].
+"/ changedObject == selectedNamespaces ifTrue:[
+"/ self halt.
+"/ ].
+ changedObject == nameSpaceFilterSelection ifTrue:[
+ selectionValue := nameSpaceFilterSelection value.
+ selectionValue size > 1 ifTrue:[
+ nameSpaceFilterSelection value:(OrderedCollection with:selectionValue first).
+ selectionValue := nameSpaceFilterSelection value.
+ ].
+ self selectedNamespaces value:selectionValue.
+ selectionValue size > 0 ifTrue:[
+ self nameSpaceFilterSelectedNameSpace setValue:selectionValue first.
+ self updateNameSpaceLabel.
+ ].
+ self nameSpaceFilter value: selectionValue.
+ ].
+
+ super update:something with:aParameter from:changedObject
+
+ "Modified: / 26.2.2000 / 18:02:02 / cg"
+!
+
+updateCategorySelectionFromClasses
+ |allEntry oldSelectedCategories categories|
+
+ allEntry := self class nameListEntryForALL.
+
+ categories := Set new.
+ oldSelectedCategories := self selectedCategories value.
+
+ "/ category-selection feedBack;
+ "/ if '* all *' was in its selection, keep it (to avoid updating the classList)
+ (oldSelectedCategories size > 0
+ and:[oldSelectedCategories includes:allEntry]) ifTrue:[
+ categories add:allEntry
+ ].
+
+ (self selectedClasses value ? #()) do:[:eachSelectedClass |
+ |cat cls|
+
+ cls := eachSelectedClass theNonMetaclass.
+ cls isPrivate ifTrue:[
+ cls := cls topOwningClass.
+ ].
+ cat := cls category.
+ categories add:cat.
+ ].
+ (categories conform:[:each | (self selectedCategories value ? #()) includes:each]) ifFalse:[
+ self selectedCategories value:categories.
+ ].
+
+ "Modified: / 18.2.2000 / 13:17:36 / cg"
+!
+
+updateNamespaceSelectionFromClasses
+ "invoked when switching to the namespace-organization;
+ update selected namespaces from the set of selected classes"
+
+ |allEntry classes selectedNamespaces oldSelectedNamespaces|
+
+ allEntry := self class nameListEntryForALL.
+
+ classes := self selectedClasses value.
+ classes size > 0 ifTrue:[
+ selectedNamespaces := self selectedNamespaces value.
+ oldSelectedNamespaces := (selectedNamespaces ? #()) asSet.
+ selectedNamespaces := Set new.
+
+ "/ namespace-selection feedBack;
+ "/ if '* all *' was in its selection, keep it (to avoid updating the classList)
+ (oldSelectedNamespaces size > 0
+ and:[oldSelectedNamespaces includes:allEntry])
+ ifTrue:[
+ selectedNamespaces add:allEntry.
+ ].
+ selectedNamespaces
+ addAll:(classes
+ collect:[:eachClass | eachClass theNonMetaclass topNameSpace name.]).
+
+ classes := classes copy.
+ "/ selectedNamespaces ~= oldSelectedNamespaces ifTrue:[
+ self selectedNamespaces value:selectedNamespaces.
+ "/ ].
+
+ classes ~= self selectedClasses value ifTrue:[self halt:'oops'].
+ ].
+!
+
+updateOrganizationFromChangedClass
+ |orgMode selectedClassesHolder selectedClasses classHierarchyTopClassHolder commonSuperClass|
+
+ orgMode := organizerMode value.
+ selectedClassesHolder := self selectedClasses.
+ selectedClasses := selectedClassesHolder value.
+ classHierarchyTopClassHolder := self classHierarchyTopClass.
+
+ orgMode == #category ifTrue:[
+ self updateCategorySelectionFromClasses.
+ ^ self.
+ ].
+ orgMode == #namespace ifTrue:[
+ self updateNamespaceSelectionFromClasses.
+ ^ self.
+ ].
+ orgMode == #project ifTrue:[
+ self updateProjectSelectionFromClasses.
+ ^ self.
+ ].
+ orgMode == #hierarchy ifTrue:[
+ classHierarchyTopClassHolder value:nil.
+ ^ self.
+ ].
+ (orgMode == #classHierarchy) ifTrue:[
+"/ (selectedClasses size == 1) ifTrue:[
+"/ self classHierarchyTopClass value:selectedClasses first
+"/ ].
+ "/ classHierarchyTopClassHolder value isNil ifTrue:[
+ selectedClasses size > 0 ifTrue:[
+ commonSuperClass := selectedClasses
+ inject:selectedClasses first
+ into:[:commonSuperClass :thisClass | commonSuperClass commonSuperclass:thisClass ].
+ classHierarchyTopClassHolder value:commonSuperClass "selectedClasses first".
+ ].
+ "/ ].
+ ^ self.
+ ].
+ (orgMode == #classInheritance) ifTrue:[
+ classHierarchyTopClassHolder value:
+ ((selectedClasses size == 1) ifTrue:[selectedClasses first] ifFalse:nil).
+ ^ self.
+ ].
+!
+
+updateProjectSelectionFromClasses
+ "invoked when switching to the projects-organization;
+ update selected projects from the set of selected classes"
+
+ |allEntry classes selectedProjects oldSelectedProjects|
+
+^ self.
+ allEntry := self class nameListEntryForALL.
+
+ classes := self selectedClasses value.
+ classes size > 0 ifTrue:[
+ selectedProjects := self selectedProjects value.
+ oldSelectedProjects := (selectedProjects ? #()) asSet.
+ selectedProjects := Set new.
+
+ "/ project-selection feedBack;
+ "/ if '* all *' was in its selection, keep it (to avoid updating the classList)
+ (oldSelectedProjects size > 0
+ and:[oldSelectedProjects includes:allEntry])
+ ifTrue:[
+ selectedProjects add:allEntry.
+ ].
+
+ classes do:[:eachClass |
+ selectedProjects add:(eachClass theNonMetaclass package).
+ eachClass allSelectorsAndMethodsDo:[:sel :mthd |
+ selectedProjects add:(mthd package).
+ ]
+ ].
+ selectedProjects ~= oldSelectedProjects ifTrue:[
+ self selectedProjects value:selectedProjects.
+ ].
+ ].
+
+ "Created: / 26.2.2000 / 01:09:13 / cg"
+ "Modified: / 26.2.2000 / 01:20:59 / cg"
+! !
+
+!OrganizerCanvas methodsFor:'forwarder operations'!
+
+moveClasses:classes toCategory:cat
+ self masterApplication moveClasses:classes toCategory:cat
+!
+
+moveClasses:classes toProject:cat
+ self masterApplication moveClasses:classes toProject:cat
+!
+
+moveMethods:methods toClass:cls
+ self masterApplication moveMethods:methods toClass:cls.
+!
+
+moveMethods:methods toProject:package
+ self masterApplication moveMethods:methods toProject:package.
+! !
+
+!OrganizerCanvas methodsFor:'private'!
+
+nameSpaceListWidgetWasBuilt:widget
+ |list|
+
+ "/ sigh - cannot do this in the nameSpaceListWidget method,
+ "/ because the GUI is build late (when the menu is popped up the first time)
+ widget application immediateUpdate:true.
+ list := widget builder componentAt:#List.
+ list autoHideHorizontalScrollBar:true.
+!
+
+postBuildWith:aBuilder
+"/ |toggle|
+"/
+"/ (toggle := aBuilder componentAt:#InstanceToggle) notNil ifTrue:[
+"/ toggle controller beToggle.
+"/ ].
+"/ (toggle := aBuilder componentAt:#ClassToggle) notNil ifTrue:[
+"/ toggle controller beToggle.
+"/ ].
+ super postBuildWith:aBuilder
+!
+
+release
+ super release.
+
+ nameSpaceFilterSelection removeDependent:self.
+ organizerMode removeDependent:self.
+ selectedClasses removeDependent:self.
+! !
+
+!OrganizerCanvas class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_OrganizerCanvas.st,v 1.1 2004-02-26 18:54:44 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_ProjectList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,623 @@
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+BrowserList subclass:#ProjectList
+ instanceVariableNames:'projectList'
+ classVariableNames:'AdditionalEmptyProjects'
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!ProjectList class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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.
+"
+! !
+
+!ProjectList class methodsFor:'interface specs'!
+
+singleProjectWindowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:ClassCategoryList andSelector:#singleCategoryWindowSpec
+ ClassCategoryList new openInterface:#singleCategoryWindowSpec
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #singleProjectWindowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ProjectList'
+ #name: 'ProjectList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 218 175 518 475)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#LabelSpec
+ #label: 'ProjectName'
+ #name: 'ProjectLabel'
+ #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 25 0)
+ #translateLabel: true
+ #labelChannel: #projectLabelHolder
+ #menu: #menuHolder
+ )
+ )
+
+ )
+ )
+!
+
+windowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:ProjectList andSelector:#windowSpec
+ ProjectList new openInterface:#windowSpec
+ ProjectList open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'ProjectList'
+ #name: 'ProjectList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 13 23 313 323)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SequenceViewSpec
+ #name: 'List'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #tabable: true
+ #model: #selectedProjects
+ #menu: #menuHolder
+ #hasHorizontalScrollBar: true
+ #hasVerticalScrollBar: true
+ #miniScrollerHorizontal: true
+ #isMultiSelect: true
+ #valueChangeSelector: #selectionChangedByClick
+ #useIndex: false
+ #sequenceList: #projectList
+ #doubleClickChannel: #doubleClickChannel
+ #properties:
+ #(#PropertyListDictionary
+ #dragArgument: nil
+ #dropArgument: nil
+ #canDropSelector: #canDrop:
+ #dropSelector: #doDrop:
+ )
+ )
+ )
+
+ )
+ )
+
+ "Created: / 17.2.2000 / 23:45:47 / cg"
+ "Modified: / 17.2.2000 / 23:47:53 / cg"
+! !
+
+!ProjectList class methodsFor:'queries-plugin'!
+
+aspectSelectors
+ ^ #(
+ #(#doubleClickChannel #action )
+ immediateUpdate
+ selectedProjects
+ menuHolder
+ outGeneratorHolder
+ inGeneratorHolder
+ selectionChangeCondition
+ updateTrigger
+ forceGeneratorTrigger
+ hideUnloadedClasses
+ organizerMode
+ slaveMode
+ )
+
+ "Created: / 17.2.2000 / 23:46:18 / cg"
+ "Modified: / 25.2.2000 / 22:32:10 / cg"
+! !
+
+!ProjectList methodsFor:'aspects'!
+
+projectLabelHolder
+ ^ self pseudoListLabelHolder
+!
+
+projectList
+ projectList isNil ifTrue:[
+ projectList := ValueHolder new.
+ projectList addDependent:self.
+ ].
+ ^ projectList
+
+ "Created: / 17.2.2000 / 23:39:32 / cg"
+!
+
+selectedProjects
+ ^ self selectionHolder
+
+ "Created: / 17.2.2000 / 23:39:57 / cg"
+!
+
+selectedProjects:aValueHolder
+ ^ self selectionHolder:aValueHolder
+! !
+
+!ProjectList methodsFor:'change & update'!
+
+delayedUpdate:something with:aParameter from:changedObject
+ |cls sel pkg mthd|
+
+ self inSlaveModeOrInvisible
+ "/ (self slaveMode value == true)
+ ifTrue:[
+ changedObject == Smalltalk ifTrue:[ listValid := false].
+ something == #projectOrganization ifTrue:[ listValid := false].
+ ^ self
+ ].
+
+ changedObject == slaveMode ifTrue:[
+ listValid ~~ true ifTrue:[
+ self enqueueDelayedUpdateList
+ ].
+ "/ self invalidateList.
+ ^ self
+ ].
+
+
+ changedObject == Smalltalk ifTrue:[
+ something == #projectOrganization ifTrue:[
+ self invalidateList.
+ self enqueueDelayedUpdateOutputGenerator.
+ ^ self.
+ ].
+ something == #methodInClass ifTrue:[
+ listValid == true ifTrue:[
+ cls := aParameter at:1.
+ sel := aParameter at:2.
+ mthd := cls compiledMethodAt:sel.
+ mthd notNil ifTrue:[
+ pkg := mthd package.
+ (projectList value includes:pkg) ifFalse:[
+ self invalidateList.
+ ]
+ ].
+ ].
+ ^ self
+ ].
+
+ (something == #classDefinition
+ or:[something == #newClass]) ifTrue:[
+ listValid == true ifTrue:[
+ cls := aParameter.
+ pkg := cls package.
+ (projectList value includes:pkg) ifFalse:[
+ self invalidateList.
+ ] ifTrue:[
+ self enqueueDelayedUpdateOutputGenerator
+ ].
+ ] ifFalse:[
+ self invalidateList
+ ].
+ ^ self
+ ].
+ (something == #classRemove) ifTrue:[
+ listValid == true ifTrue:[
+ cls := aParameter.
+ pkg := cls package.
+ ].
+ ].
+ ^ self
+ ].
+
+"/ something == #projectOrganization ifTrue:[
+"/ aParameter isSymbol ifTrue:[
+"/ "/ a single method has changed
+"/"/ sel := aParameter.
+"/"/ mthd := changedObject compiledMethodAt:sel.
+"/ self enqueueDelayedUpdateOutputGenerator.
+"/ ].
+"/ ^ self
+"/ ].
+
+ (organizerMode notNil
+ and:[organizerMode value ~~ #project]) ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+ super delayedUpdate:something with:aParameter from:changedObject
+
+ "Created: / 17.2.2000 / 23:41:02 / cg"
+ "Modified: / 26.2.2000 / 01:21:49 / cg"
+!
+
+selectionChangedByClick
+ "we are not interested in that - get another notification
+ via the changed valueHolder"
+
+ "Created: / 17.2.2000 / 23:41:17 / cg"
+!
+
+update:something with:aParameter from:changedObject
+ changedObject == Smalltalk ifTrue:[
+ something == #methodDictionary ifTrue:[
+ ^ self
+ ].
+ something == #methodTrap ifTrue:[
+ ^ self
+ ].
+ something == #methodInClass ifTrue:[
+ ^ self
+ ].
+ something == #classVariables ifTrue:[
+ ^ self
+ ].
+ something == #classComment ifTrue:[
+ ^ self.
+ ].
+ something == #methodInClassRemoved ifTrue:[
+ ^ self.
+ ].
+ ].
+ super update:something with:aParameter from:changedObject
+! !
+
+!ProjectList methodsFor:'drag & drop'!
+
+canDrop:aDropContext
+ |methodsOrClasses package|
+
+ methodsOrClasses := aDropContext dropObjects collect:[:obj | obj theObject].
+
+ (methodsOrClasses contains:[:aMethodOrClass | (aMethodOrClass isMethod or:[aMethodOrClass isClass]) not]) ifTrue:[^ false].
+
+ package := self packageAtTargetPointOf:aDropContext.
+ package isNil ifTrue:[^ false].
+
+ (methodsOrClasses contains:[:aMethodOrClass | aMethodOrClass package ~= package]) ifFalse:[^ false].
+
+ ^ true
+!
+
+doDrop:aDropContext
+ |package methodsOrClasses methods classes|
+
+ methodsOrClasses := aDropContext dropObjects collect:[:aDropObject | aDropObject theObject].
+ (methodsOrClasses contains:[:something | (something isMethod or:[something isClass]) not]) ifTrue:[^ self].
+ methods := methodsOrClasses select:[:something | something isMethod].
+ classes := methodsOrClasses select:[:something | something isClass].
+
+ package := self packageAtTargetPointOf:aDropContext.
+ package notNil ifTrue:[
+ methods notEmpty ifTrue:[
+ self masterApplication moveMethods:methods toProject:package.
+ ].
+ classes notEmpty ifTrue:[
+ self masterApplication moveClasses:classes toProject:package.
+ ]
+ ].
+!
+
+packageAtTargetPointOf:aDropContext
+ |p packageListView lineNr item package dropInfo now
+ overItem timeOverItem|
+
+ p := aDropContext targetPoint.
+
+ packageListView := aDropContext targetWidget.
+
+ dropInfo := aDropContext dropInfo.
+
+ lineNr := packageListView yVisibleToLineNr:p y.
+ lineNr isNil ifTrue:[^ nil].
+
+ item := packageListView list value at:lineNr.
+ item isNil ifTrue:[^ nil].
+
+ item canExpand ifTrue:[
+ now := AbsoluteTime now.
+ overItem := dropInfo at:#overItem ifAbsentPut:[item].
+ timeOverItem := dropInfo at:#timeOverItem ifAbsentPut:[now].
+
+ overItem ~~ item ifTrue:[
+ dropInfo at:#timeOverItem put:now.
+ dropInfo at:#overItem put:item.
+ aDropContext passiveAction:[ self packageAtTargetPointOf:aDropContext ].
+ ] ifFalse:[
+ (now millisecondDeltaFrom:timeOverItem) >= (UserPreferences current timeToAutoExpandItemsWhenDraggingOver) ifTrue:[
+ aDropContext saveDraw:[ item expand. packageListView repairDamage ].
+ dropInfo removeKey:#timeOverItem.
+ dropInfo removeKey:#overItem.
+ ] ifFalse:[
+ aDropContext passiveAction:[ self packageAtTargetPointOf:aDropContext ].
+ ]
+ ].
+ ].
+
+ package := item package.
+ package = self class nameListEntryForALL ifTrue:[^ nil].
+ ^ package.
+! !
+
+!ProjectList methodsFor:'generators'!
+
+makeGenerator
+ "return a generator which enumerates the classes from the selected project(s)."
+
+ |selectedPackages thePackage hideUnloadedClasses|
+
+ selectedPackages := self selectedProjects value.
+ selectedPackages size == 0 ifTrue:[
+ ^ #()
+ ].
+
+ hideUnloadedClasses := self hideUnloadedClasses value.
+
+ (selectedPackages includes:(self class nameListEntryForALL)) ifTrue:[
+ hideUnloadedClasses ifTrue:[
+ ^ Iterator on:[:whatToDo |
+ Smalltalk allClassesDo:[:cls |
+ cls isLoaded ifTrue:[
+ (cls isNameSpace not or:[cls == Smalltalk]) ifTrue:[
+ whatToDo value:cls
+ ]
+ ]
+ ]
+ ]
+ ].
+ ^ Iterator on:[:whatToDo |
+ Smalltalk allClassesDo:[:cls |
+ (cls isNameSpace not or:[cls == Smalltalk]) ifTrue:[
+ whatToDo value:cls
+ ]
+ ]
+ ]
+ ].
+
+ selectedPackages size == 1 ifTrue:[
+ "/ faster common case
+ thePackage := selectedPackages first.
+
+ ^ Iterator on:[:whatToDo | |doInclude|
+ Smalltalk allClassesDo:[:cls |
+ (hideUnloadedClasses not or:[cls isLoaded])
+ ifTrue:[
+ (cls isNameSpace not or:[cls == Smalltalk]) ifTrue:[
+ doInclude := (thePackage = cls package).
+ doInclude ifFalse:[
+ cls isJavaClass ifFalse:[
+ doInclude := (cls methodDictionary contains:[:mthd | thePackage = mthd package])
+ or:[ cls class methodDictionary contains:[:mthd | thePackage = mthd package]].
+ ]
+ ].
+ doInclude ifTrue:[
+ whatToDo value:cls
+ ]
+ ]
+ ]
+ ]
+ ]
+ ].
+
+ ^ Iterator on:[:whatToDo | |doInclude|
+ Smalltalk allClassesDo:[:cls |
+ (hideUnloadedClasses not or:[cls isLoaded])
+ ifTrue:[
+ (cls isNameSpace not or:[cls == Smalltalk]) ifTrue:[
+ doInclude := (selectedPackages includes:cls package).
+ doInclude ifFalse:[
+ cls isJavaClass ifFalse:[
+ doInclude := (cls methodDictionary contains:[:mthd | thePackage = mthd package])
+ or:[ cls class methodDictionary contains:[:mthd | thePackage = mthd package]].
+ ]
+ ].
+ doInclude ifTrue:[
+ whatToDo value:cls
+ ]
+ ]
+ ]
+ ]
+ ]
+
+ "Created: / 17.2.2000 / 23:49:37 / cg"
+ "Modified: / 24.2.2000 / 22:53:46 / cg"
+! !
+
+!ProjectList methodsFor:'private'!
+
+defaultSlaveModeValue
+ |org|
+
+ (org := self topApplication initialOrganizerMode) == #project ifTrue:[^ false].
+ org isNil ifTrue:[^ false].
+ ^ true
+!
+
+initialOrganizerMode
+ ^ #project
+!
+
+listOfProjects
+ |allProjects generator|
+
+ allProjects := IdentitySet new.
+
+ inGeneratorHolder isNil ifTrue:[
+ (self hideUnloadedClasses value) ifTrue:[
+ Smalltalk allClassesDo:[:eachClass |
+ |cls pkg|
+
+ eachClass isLoaded ifTrue:[
+ cls := eachClass theNonMetaclass.
+ cls isPrivate ifTrue:[
+ cls := cls topOwningClass
+ ].
+ pkg := cls package.
+ pkg withoutSeparators size > 0 ifTrue:[
+ allProjects add:pkg asSymbol.
+ ] ifFalse:[
+ "/ for now, nameSpaces are not in any package;
+ "/ this might change. Then, 0-sized packages are
+ "/ illegal, and the following should be enabled.
+ "/ self halt
+ ].
+ cls isJavaClass ifFalse:[
+ cls instAndClassSelectorsAndMethodsDo:[:sel :mthd |
+ allProjects add:mthd package asSymbol.
+ ].
+ ].
+ ].
+ ].
+ allProjects := allProjects asOrderedCollection.
+ ] ifFalse:[
+ allProjects := NewSystemBrowser allProjectsIDs.
+ ].
+
+ "/ those are simulated - in ST/X, empty projects do not
+ "/ really exist; however, during browsing, it makes sense.
+ AdditionalEmptyProjects size > 0 ifTrue:[
+ "/ remove those that are present ...
+ AdditionalEmptyProjects := AdditionalEmptyProjects select:[:pkg | (allProjects includes:pkg) not].
+ allProjects addAll:AdditionalEmptyProjects.
+ ].
+ ] ifFalse:[
+ generator := inGeneratorHolder value.
+ generator isNil ifTrue:[^ #() ].
+ generator do:[:prj | allProjects add:prj].
+ allProjects := allProjects asOrderedCollection.
+ ].
+
+ allProjects sort.
+ allProjects size == 1 ifTrue:[
+ "/ self projectLabelHolder value:(allProjects first , ' [Project]').
+ self projectLabelHolder value:(LabelAndIcon icon:(self class packageIcon) string:allProjects first).
+ ].
+ allProjects size > 1 ifTrue:[
+ allProjects addFirst:(self class nameListEntryForALL).
+ ].
+ ^ allProjects
+
+ "Created: / 17.2.2000 / 23:43:05 / cg"
+ "Modified: / 18.8.2000 / 20:26:04 / cg"
+!
+
+makeDependent
+ Smalltalk addDependent:self
+
+ "Created: / 17.2.2000 / 23:43:13 / cg"
+!
+
+makeIndependent
+ Smalltalk removeDependent:self.
+!
+
+release
+ super release.
+
+ projectList removeDependent:self.
+!
+
+updateList
+ |newList oldSelection newSelection selectedProjectsHolder|
+
+ selectedProjectsHolder := self selectedProjects.
+ oldSelection := selectedProjectsHolder value.
+ newList := self listOfProjects.
+ newList ~= projectList value ifTrue:[
+"/ oldSelection size > 0 ifTrue:[
+"/ selectedProjectsHolder removeDependent:self.
+"/ selectedProjectsHolder value:#().
+"/ selectedProjectsHolder addDependent:self.
+"/ ].
+
+ self projectList value:newList.
+
+ oldSelection size > 0 ifTrue:[
+ newSelection := oldSelection select:[:prj | newList includes:prj].
+ selectedProjectsHolder value:newSelection.
+ ]
+ ].
+ listValid := true.
+
+ "Modified: / 25.2.2000 / 23:10:01 / cg"
+! !
+
+!ProjectList methodsFor:'special'!
+
+addAdditionalProject:aProject
+ "/ those are simulated - in ST/X, empty categories do not
+ "/ really exist; however, during browsing, it makes sense.
+ AdditionalEmptyProjects isNil ifTrue:[
+ AdditionalEmptyProjects := Set new.
+ ].
+ AdditionalEmptyProjects add:aProject.
+
+ Smalltalk changed:#projectOrganization "/ not really ... to force update
+
+ "Created: / 17.2.2000 / 23:44:27 / cg"
+!
+
+removeAdditionalProjects:aListOfProjects
+ "/ those are simulated - in ST/X, empty categories do not
+ "/ really exist; however, during browsing, it makes sense.
+ AdditionalEmptyProjects notNil ifTrue:[
+ aListOfProjects do:[:eachProject |
+ AdditionalEmptyProjects remove:eachProject ifAbsent:nil.
+ ].
+ ].
+ Smalltalk changed:#projectOrganization "/ not really ... to force update
+
+ "Created: / 17.2.2000 / 23:45:24 / cg"
+! !
+
+!ProjectList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_ProjectList.st,v 1.1 2004-02-26 18:56:15 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_SearchDialog.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,756 @@
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+DialogBox subclass:#SearchDialog
+ instanceVariableNames:'openHow classes methods selectedClasses selectedCategories
+ selectedMethods currentClass currentNamespace
+ currentClassCategory browser whereRadioGroup verticalPanel
+ searchAreas caseHolder matchHolder isMethodHolder codeField
+ selectorHolder defaultOpenHow withTextEntry allowFind allowBuffer
+ allowBrowser isSelector'
+ classVariableNames:'LastCodeSearched LastCodeSearchWasMethod LastGlobalSearched'
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!SearchDialog class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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.
+"
+! !
+
+!SearchDialog methodsFor:'private'!
+
+showHelpOnCodePatterns
+ HTMLDocumentView openFullOnHelpFile:'Browser/RBSearchPatterns.html'
+! !
+
+!SearchDialog methodsFor:'public'!
+
+askThenDo:aBlock
+ |where code sel|
+
+ self open.
+ self accepted ifFalse:[
+ ^ self.
+ ].
+
+ openHow isNil ifTrue:[
+ openHow := defaultOpenHow.
+ ].
+ where := whereRadioGroup value.
+ withTextEntry ifTrue:[
+ isSelector == #code ifTrue:[
+ code := codeField contentsAsString.
+ LastCodeSearched := code.
+ ] ifFalse:[
+ sel := selectorHolder value.
+ sel isEmpty ifTrue:[
+ browser warn:(isSelector
+ ifTrue:[ 'No selector entered for search'. ]
+ ifFalse:[ 'Nothing entered for search'. ]).
+ ^ self.
+ ].
+ sel := sel string.
+ browser rememberSearchPattern:sel.
+ isSelector == #globalName ifTrue:[
+ LastGlobalSearched := sel.
+ ].
+ ].
+ ].
+ where isNil ifTrue:[
+ browser warn:'No class(es) for search'.
+ ^ self.
+ ].
+
+ self getClassesAndMethodsFor:where.
+ (#(#classesWithPrivateClasses #classHierarchiesWithPrivateClasses #ownersWithPrivateClasses #ownersHierarchiesWithPrivateClasses)
+ includes:where)
+ ifTrue:[
+ |toSearch|
+
+ toSearch := IdentitySet withAll:classes.
+ classes := IdentitySet withAll:toSearch.
+ [ toSearch notEmpty. ] whileTrue:[
+ |cls|
+
+ cls := toSearch removeFirst.
+ classes addAll:cls allPrivateClasses.
+ ].
+ ].
+
+ classes size == 0 ifTrue:[
+ classes := nil.
+ methods size == 0 ifTrue:[
+ browser warn:'No class(es) given for search.'.
+ ^ self.
+ ].
+ ] ifFalse:[
+ classes := classes asOrderedCollection.
+ methods size ~~ 0 ifTrue:[
+ browser warn:'oops'.
+ methods := nil.
+ ].
+ ].
+
+ aBlock
+ value:classes
+ value:(sel ? code)
+ value:(caseHolder value ? false)
+ value:openHow
+ value:(matchHolder value ? false)
+ value:methods
+ value:(isMethodHolder value ? false).
+!
+
+setupToAskForMethodSearchTitle:title forBrowser:brwsrArg isSelector:isSelectorArg searchArea:whereDefault withCaseIgnore:withCaseIgnore withMatch:withMatch
+ withMethodList:withMethodList allowFind:allowFindArg allowBuffer:allowBufferArg allowBrowser:allowBrowserArg withTextEntry:withTextEntryArg
+ | where ns methodNameSpaces|
+
+ allowFind := allowFindArg.
+ allowBuffer := allowBufferArg.
+ allowBrowser := allowBrowserArg.
+ isSelector := isSelectorArg.
+ withTextEntry := withTextEntryArg.
+ browser := brwsrArg.
+ resources := browser resources.
+
+ (self addTextLabel:(resources string:title) withCRs) adjust:#left.
+
+ selectedClasses := browser selectedClasses value.
+ selectedCategories := browser selectedCategoriesValue.
+ selectedMethods := browser selectedMethods value.
+ currentClass := browser theSingleSelectedClass.
+ currentClassCategory := browser theSingleSelectedCategory.
+ currentClass isNil ifTrue:[
+ browser hasMethodSelected ifTrue:[
+ currentClass := selectedMethods first mclass.
+ selectedClasses := (selectedMethods collect:[ :each | each mclass ])
+ asIdentitySet.
+ selectedClasses := selectedClasses select:[ :each | each notNil ].
+ ].
+ ].
+ currentClass notNil ifTrue:[
+ currentClass := currentClass theNonMetaclass.
+ ].
+
+ withTextEntry ifTrue:[
+ isSelector == #code ifTrue:[
+ self addTextEntryFieldForCode.
+ ] ifFalse:[
+ self addInputFieldForSelectorOrNameOrString.
+
+ withCaseIgnore ifTrue:[
+ self addCheckBox:(resources string:'Ignore case')
+ on:(caseHolder := false asValue).
+ ].
+ withMatch ifTrue:[
+ self addCheckBox:(resources string:'Match')
+ on:(matchHolder := true asValue).
+
+"/ (isSelector and:[ sel notNil. ]) ifTrue:[
+"/ sel includesMatchCharacters ifTrue:[
+"/ matchHolder value:false.
+"/ ].
+"/ ].
+ ].
+ ].
+ ].
+ searchAreas := OrderedCollection new.
+ verticalPanel := VerticalPanelView new.
+ verticalPanel horizontalLayout:#fitSpace.
+ self addHorizontalLine.
+ self addVerticalSpace.
+ (self addTextLabel:(resources string:'Search in:')) adjust:#left.
+ whereRadioGroup := RadioButtonGroup new.
+ (selectedCategories size > 0 or:[ selectedClasses size > 0 ]) ifTrue:[
+ self addCheckBoxForEverywhere.
+
+ "/ classMethodListView notNil ifTrue:[
+ "/ b := CheckBox label:(resources string:'Shown Methods').
+ "/ panel add:b. whereChannel add:b value:#currentMethodList.
+ "/ areas add:#currentMethodList.
+ "/ self makeTabable:b.
+ "/ ].
+ browser isMethodListBrowser ifTrue:[
+ methodNameSpaces := (browser selectedMethods value ? #())
+ collect:[ :eachMethod | eachMethod mclass topNameSpace ].
+ ].
+ methodNameSpaces size == 1 ifTrue:[
+ currentNamespace := methodNameSpaces first.
+ ] ifFalse:[
+ currentNamespace := browser currentNamespace.
+ ].
+ (currentNamespace notNil
+ and:[ currentNamespace ~= (browser nameListEntryForALL) ])
+ ifTrue:[ self addCheckBoxForCurrentNamespace ]
+ ifFalse:[
+ (currentClass notNil
+ and:[ (ns := currentClass nameSpace) notNil and:[ ns ~~ Smalltalk ] ])
+ ifTrue:[ self addCheckBoxForClassesNamespace:ns ].
+ ].
+ selectedCategories size > 0 ifTrue:[
+ self addCheckBoxForSelectedClassCategory.
+ ].
+ (selectedClasses size > 0 or:[ selectedMethods size > 0 ]) ifTrue:[
+ self addCheckBoxForSelectedClass.
+ self addCheckBoxForSelectedClassAndSuperclasses.
+ self addCheckBoxForSelectedClassAndSubclasses.
+ self addCheckBoxForSelectedClassAndPrivateClasses.
+ self addCheckBoxForSelectedClassAndSubclassesAndPrivateClasses.
+ self addCheckBoxForOwnerAndItsPrivateClasses.
+ self addCheckBoxForOwnerAndItsSubclassesAndItsPrivateClasses.
+ ].
+ ] ifFalse:[
+ browser currentNamespace ~~ Smalltalk ifTrue:[
+ self addCheckBoxForEverywhere.
+ currentNamespace := browser currentNamespace.
+ currentNamespace ~= (browser nameListEntryForALL) ifTrue:[
+ self addCheckBoxForCurrentNamespace.
+ ] ifFalse:[
+ (currentClass notNil
+ and:[ (ns := currentClass nameSpace) notNil and:[ ns ~~ Smalltalk ] ])
+ ifTrue:[ self addCheckBoxForClassesNamespace:ns ].
+ ].
+ ].
+ ].
+ (withMethodList and:[ browser isMethodListBrowser ]) ifTrue:[
+ searchAreas size == 0 ifTrue:[
+ self addCheckBoxForEverywhere.
+ ].
+ self addCheckBoxForMethodList.
+ browser selectedMethods value size > 1 ifTrue:[
+ self addCheckBoxForSelectedMethods.
+ ].
+ ].
+ searchAreas size == 0 ifTrue:[
+ whereRadioGroup := #everywhere asValue.
+ self addDummyCheckBoxForEverywhere.
+ ] ifFalse:[
+ whereDefault notNil ifTrue:[
+ (searchAreas includes:whereDefault) ifTrue:[
+ where := whereDefault asSymbol.
+ ] ifFalse:[
+ where := searchAreas first.
+ ].
+ ] ifFalse:[
+ where := #everywhere.
+ ].
+ whereRadioGroup value:where.
+ ].
+ self addComponent:verticalPanel indent:0.
+
+ "/ panel has its own idea of indenting
+ self addVerticalSpace.
+ self addHorizontalLine.
+
+ self addButtons.
+ self label:(resources string:'Search').
+! !
+
+!SearchDialog methodsFor:'setup'!
+
+addCheckBox:b forSearchArea:area
+ verticalPanel add:b.
+ whereRadioGroup add:b value:area.
+ searchAreas add:area.
+ self makeTabable:b.
+!
+
+addCheckBoxForClassesNamespace:ns
+ |b|
+
+ b := CheckBox
+ label:(resources string:'Classes nameSpace (''%1'')' with:ns name).
+ self addCheckBox:b forSearchArea:#currentClassesNameSpace.
+ ^ b.
+!
+
+addCheckBoxForCurrentNamespace
+ |b|
+
+ b := CheckBox label:(resources string:'Current nameSpace (''%1'')'
+ with:currentNamespace name).
+ self addCheckBox:b forSearchArea:#currentNameSpace.
+ ^ b.
+!
+
+addCheckBoxForEverywhere
+ |b|
+
+ b := CheckBox label:(resources string:'Everywhere').
+ self addCheckBox:b forSearchArea:#everywhere.
+ ^ b.
+!
+
+addCheckBoxForMethodList
+ |b|
+
+ b := CheckBox label:(resources string:'Methodlist').
+ self addCheckBox:b forSearchArea:#listOfMethods.
+ ^ b.
+!
+
+addCheckBoxForOwnerAndItsPrivateClasses
+ |b lbl|
+
+ (currentClass notNil and:[ currentClass isPrivate. ]) ifTrue:[
+ lbl := resources string:'Owner (%1) & all its private classes'
+ with:currentClass owningClass name.
+ ] ifFalse:[
+ lbl := resources string:'Owners & all their private classes'.
+ ].
+ b := CheckBox label:lbl.
+ self addCheckBox:b forSearchArea:#ownersWithPrivateClasses.
+ (selectedClasses contains:[ :cls | cls isPrivate. ]) ifFalse:[
+ b disable.
+ ].
+ ^ b.
+!
+
+addCheckBoxForOwnerAndItsSubclassesAndItsPrivateClasses
+ |b lbl|
+
+ (currentClass notNil and:[ currentClass isPrivate. ]) ifTrue:[
+ lbl := resources
+ string:'Owner (%1) & its subclasses & all its private classes'
+ with:currentClass owningClass name.
+ ] ifFalse:[
+ lbl := resources
+ string:'Owners & their subclasses & all their private classes'.
+ ].
+ b := CheckBox label:lbl.
+ self addCheckBox:b forSearchArea:#ownersHierarchiesWithPrivateClasses.
+ (selectedClasses contains:[ :cls | cls isPrivate. ]) ifFalse:[
+ b disable.
+ ].
+ ^ b.
+!
+
+addCheckBoxForSelectedClass
+ |b lbl|
+
+ (browser isMethodListBrowser or:[ currentClass isNil. ]) ifTrue:[
+ selectedClasses size == 1 ifTrue:[
+ lbl := resources string:'Selected class (''%1'')'
+ with:selectedClasses first theNonMetaclass name.
+ ] ifFalse:[
+ lbl := resources string:'Selected classes (%1)' with:selectedClasses size.
+ ].
+ ] ifFalse:[
+ lbl := resources string:'Class (''%1'')' with:currentClass name.
+ ].
+ b := CheckBox label:lbl.
+ self addCheckBox:b forSearchArea:#classes.
+ ^ b.
+!
+
+addCheckBoxForSelectedClassAndPrivateClasses
+ |b lbl|
+
+ (browser isMethodListBrowser or:[ currentClass isNil. ]) ifTrue:[
+ lbl := 'Selected classes & all private classes'.
+ ] ifFalse:[
+ lbl := 'Class & private classes'.
+ ].
+ b := CheckBox label:(resources string:lbl).
+ self addCheckBox:b forSearchArea:#classesWithPrivateClasses.
+ (selectedClasses
+ contains:[ :cls | cls theNonMetaclass privateClasses size > 0. ])
+ ifFalse:[ b disable. ].
+ ^ b.
+!
+
+addCheckBoxForSelectedClassAndSubclasses
+ |b lbl|
+
+ (browser isMethodListBrowser or:[ currentClass isNil. ]) ifTrue:[
+ lbl := 'Selected classes & all subclasses'.
+ ] ifFalse:[
+ lbl := 'Class & subclasses'.
+ ].
+ b := CheckBox label:(resources string:lbl).
+ self addCheckBox:b forSearchArea:#classHierarchies.
+ (selectedClasses
+ contains:[ :cls | cls theNonMetaclass subclasses size > 0. ])
+ ifFalse:[ b disable. ].
+ ^ b.
+!
+
+addCheckBoxForSelectedClassAndSubclassesAndPrivateClasses
+ |b lbl|
+
+ (browser isMethodListBrowser or:[ currentClass isNil. ]) ifTrue:[
+ lbl := 'Selected classes & all subclasses & all private classes'.
+ ] ifFalse:[
+ lbl := 'Class & subclasses & all private classes'.
+ ].
+ b := CheckBox label:(resources string:lbl).
+ self addCheckBox:b forSearchArea:#classHierarchiesWithPrivateClasses.
+ (selectedClasses
+ contains:[ :cls | cls theNonMetaclass privateClasses size > 0. ])
+ ifFalse:[ b disable. ].
+ ^ b.
+!
+
+addCheckBoxForSelectedClassAndSuperclasses
+ |b lbl|
+
+ (browser isMethodListBrowser or:[ currentClass isNil. ]) ifTrue:[
+ lbl := 'Selected classes & all superclasses'.
+ ] ifFalse:[
+ lbl := 'Class & superclasses'.
+ ].
+ b := CheckBox label:(resources string:lbl).
+ self addCheckBox:b forSearchArea:#classesAndSuperclasses.
+ (selectedClasses
+ contains:[ :cls | cls theNonMetaclass superclass notNil. ])
+ ifFalse:[ b disable. ].
+ ^ b.
+!
+
+addCheckBoxForSelectedClassCategory
+ |b lbl|
+
+ currentClassCategory notNil ifTrue:[
+ lbl := resources string:'Class category (''%1'')'
+ with:currentClassCategory.
+ ] ifFalse:[
+ lbl := resources string:'Selected classes categories (%1)'
+ with:selectedCategories size.
+ ].
+ b := CheckBox label:lbl.
+ self addCheckBox:b forSearchArea:#classCategories.
+ ^ b.
+!
+
+addCheckBoxForSelectedMethods
+ |b|
+
+ b := CheckBox label:(resources string:'Selected methods (%1)'
+ with:browser selectedMethods value size).
+ self addCheckBox:b forSearchArea:#listOfSelectedMethods.
+ ^ b.
+!
+
+addDummyCheckBoxForEverywhere
+ |b|
+
+ b := CheckBox label:(resources string:'Everywhere').
+ b turnOn.
+ b disable.
+ verticalPanel add:b.
+!
+
+addInputFieldForSelectorOrNameOrString
+ |sel inputField lastSearchPatterns|
+
+ isSelector == true ifTrue:[
+ sel := browser selectorToSearchFor.
+ ] ifFalse:[
+ isSelector == #globalName ifTrue:[
+ sel := browser globalNameToSearchFor ? LastGlobalSearched.
+ ] ifFalse:[
+ sel := browser stringToSearchFor.
+ ].
+ ].
+ sel size == 0 ifTrue:[
+ "/ use last searchString
+ lastSearchPatterns := browser lastSearchPatterns.
+ lastSearchPatterns size > 0 ifTrue:[
+ sel := lastSearchPatterns first.
+ ].
+ ].
+ selectorHolder := sel asValue.
+
+ inputField := self addComboBoxOn:selectorHolder tabable:true.
+ inputField list:lastSearchPatterns .
+ inputField selectAll.
+ inputField
+ entryCompletionBlock:[ :contents |
+ |s what|
+
+ s := contents withoutSpaces.
+ self topView
+ withWaitCursorDo:[
+ isSelector == #globalName ifFalse:[
+ what := Smalltalk selectorCompletion:s.
+ ] ifTrue:[
+ what := Smalltalk globalNameCompletion:s.
+ ].
+ inputField contents:what first.
+ (what at:2) size ~~ 1 ifTrue:[
+ browser window beep.
+ ].
+ ].
+ ].
+!
+
+addTextEntryFieldForCode
+ |initial box infoLabel helpButton errMessageField checkCodeAction|
+
+ box := View new.
+ box extent:(500 @ 200).
+
+ codeField := CodeView in:box.
+ codeField origin:0.0@0.0 corner:(0.75@1.0).
+
+ infoLabel := Label in:box.
+ infoLabel origin:0.75@0.0 corner:(1.0@1.0).
+ infoLabel font:(codeField font).
+ infoLabel label:'MetaPatterns:
+
+' , '`' allBold , ' = meta
+
+' , '@' allBold , ' = list/any
+' , '.' allBold , ' = statement
+' , '`' allBold , ' = recurse
+
+' , '`#n' allBold , ' any lit
+' , '`v' allBold , ' any var
+' , '`@e' allBold , ' any expr
+'.
+
+ helpButton := Button label:'Pattern Help' in:box.
+ helpButton layout:((LayoutOrigin fractionalFromPoint:0.75@1.0)
+ leftOffset:2
+ topOffset:helpButton preferredExtent y negated).
+ helpButton topInset:0.75@1.0.
+ helpButton action:[self showHelpOnCodePatterns].
+
+ self addComponent:box tabable:true.
+ errMessageField := (self addTextLabel:'') adjust:#left.
+ errMessageField level:-1.
+ self addCheckBox:(resources string:'Method') on:self isMethodHolder.
+
+ checkCodeAction := [ self checkCodeIn:codeField notifying:errMessageField. ].
+
+ codeField modifiedChannel onChangeEvaluate:checkCodeAction.
+
+ initial := browser selectionInCodeView.
+ initial isEmptyOrNil ifTrue:[
+ initial := LastCodeSearched ? ''
+ ].
+ codeField contents:initial.
+ checkCodeAction value.
+!
+
+checkCodeIn:codeField notifying:errMessageField
+ |codeString tree errAction|
+
+ codeString := codeField contents asString string.
+ errAction := [:str :pos |
+ |line col badLine|
+
+ line := codeField lineOfCharacterPosition:pos.
+ col := (codeField colOfCharacterPosition:pos) max:1.
+
+ badLine := (codeField listAt:line) ? ''
+. col <= badLine size size ifTrue:[
+ codeField
+ listAt:line
+ put:(badLine asText
+ emphasisAt:col
+ put:(UserPreferences current unknownIdentifierEmphasis)).
+ "/ codeField selectFromCharacterPosition:pos to:pos.
+ ].
+ errMessageField label:('[',line printString,'] ',str).
+ codeField requestFocus.
+ nil.
+ ].
+
+ isMethodHolder value ifTrue:[
+ tree := RBParser parseRewriteMethod:codeString onError: errAction.
+ ] ifFalse:[
+ tree := RBParser parseRewriteExpression:codeString onError: errAction.
+ ].
+ tree notNil ifTrue:[ errMessageField label:nil ].
+ codeField modifiedChannel setValue:false.
+!
+
+getClassesAndMethodsFor:where
+ where == #everywhere ifTrue:[
+ classes := Smalltalk allClasses.
+ ^ self.
+ ].
+ where == #currentNameSpace ifTrue:[
+ classes := currentNamespace allClassesWithAllPrivateClasses.
+ ^ self.
+ ].
+ where == #currentClassesNameSpace ifTrue:[
+ currentClass isPrivate ifTrue:[
+ classes := currentClass topOwningClass nameSpace
+ allClassesWithAllPrivateClasses.
+ ] ifFalse:[
+ classes := currentClass nameSpace allClassesWithAllPrivateClasses.
+ ].
+ ^ self.
+ ].
+ where == #classCategories ifTrue:[
+ classes := Smalltalk allClasses
+ select:[ :cls | selectedCategories includes:cls category. ].
+ classes := classes collect:[ :each | each theNonMetaclass. ].
+ ^ self.
+ ].
+ (where == #classes or:[ where == #classesWithPrivateClasses. ]) ifTrue:[
+ classes := selectedClasses collect:[ :each | each theNonMetaclass. ].
+ ^ self.
+ ].
+ (where == #classHierarchies
+ or:[ where == #classHierarchiesWithPrivateClasses. ])
+ ifTrue:[
+ classes := IdentitySet new.
+ selectedClasses do:[ :cls |
+ classes addAll:cls theNonMetaclass withAllSubclasses.
+ ].
+ ^ self.
+ ].
+ where == #ownersWithPrivateClasses ifTrue:[
+ classes := IdentitySet new.
+ selectedClasses do:[ :cls |
+ |c|
+
+ c := cls theNonMetaclass.
+ classes add:(c owningClass ? c).
+ ].
+ ^ self.
+ ].
+ where == #ownersHierarchiesWithPrivateClasses ifTrue:[
+ classes := IdentitySet new.
+ selectedClasses do:[ :cls |
+ |c|
+
+ c := cls theNonMetaclass.
+ classes addAll:(c owningClass ? c) withAllSubclasses.
+ ].
+ ^ self.
+ ].
+ (where == #classesAndSuperclasses) ifTrue:[
+ classes := IdentitySet new.
+ selectedClasses do:[ :cls |
+ classes addAll:cls theNonMetaclass withAllSuperclasses.
+ ].
+ ^ self.
+ ].
+ (where == #listOfMethods) ifTrue:[
+ classes := nil.
+ methods := browser methodListApp methodList value.
+ ^ self.
+ ].
+ (where == #listOfSelectedMethods) ifTrue:[
+ classes := nil.
+ methods := browser selectedMethods value.
+ ^ self.
+ ].
+!
+
+isMethodHolder
+ isMethodHolder isNil ifTrue:[isMethodHolder := (LastCodeSearchWasMethod ? false) asValue].
+ ^ isMethodHolder
+! !
+
+!SearchDialog methodsFor:'setup-buttons'!
+
+addBrowseButton
+ |b|
+
+ b := Button label:(resources string:'Browse').
+ (DialogBox defaultOKButtonAtLeft) ifTrue:[
+ self addButton:b before:nil.
+ ] ifFalse:[
+ self addButton:b after:nil.
+ ].
+ b
+ action:[
+ openHow := #newBrowser.
+ self doAccept.
+ self okPressed.
+ ].
+ ^ b.
+!
+
+addBufferButton
+ |b|
+
+ b := Button label:(resources string:'Add Buffer').
+ (DialogBox defaultOKButtonAtLeft) ifTrue:[
+ self addButton:b before:nil.
+ ] ifFalse:[
+ self addButton:b after:nil.
+ ].
+ b
+ action:[
+ openHow := #newBuffer.
+ self doAccept.
+ self okPressed.
+ ].
+ ^ b.
+!
+
+addButtons
+ |prevButton|
+
+ allowFind ifTrue:[
+ defaultOpenHow := #showHere.
+ prevButton := self addFindButton.
+ ].
+ allowBrowser ifTrue:[
+ defaultOpenHow := #newBrowser.
+ prevButton := self addBrowseButton.
+ ].
+ allowBuffer ifTrue:[
+ defaultOpenHow := #newBuffer.
+ prevButton := self addBufferButton.
+ ].
+ prevButton notNil ifTrue:[
+ prevButton isReturnButton:true.
+ ].
+ self addAbortButton.
+!
+
+addFindButton
+ |b|
+
+ b := Button label:(resources string:'Find').
+ (DialogBox defaultOKButtonAtLeft) ifTrue:[
+ self addButton:b before:nil.
+ ] ifFalse:[
+ self addButton:b after:nil.
+ ].
+ b
+ action:[
+ openHow := #showHere.
+ self doAccept.
+ self okPressed.
+ ].
+ ^ b.
+! !
+
+!SearchDialog class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_SearchDialog.st,v 1.1 2004-02-26 18:56:48 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_SpecialCodeView.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,79 @@
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+ApplicationModel subclass:#SpecialCodeView
+ instanceVariableNames:'displayMode'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!SpecialCodeView class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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.
+"
+! !
+
+!SpecialCodeView class methodsFor:'interface specs'!
+
+windowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:SpecialCodeView andSelector:#windowSpec
+ SpecialCodeView new openInterface:#windowSpec
+ SpecialCodeView open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'SpecialCodeView'
+ #name: 'SpecialCodeView'
+ #min: #(#Point 10 10)
+ #max: #(#Point 1280 1024)
+ #bounds: #(#Rectangle 12 22 312 322)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #()
+ )
+ )
+! !
+
+!SpecialCodeView class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools_SpecialCodeView.st,v 1.1 2004-02-26 18:55:37 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools_VariableList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,541 @@
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+BrowserList subclass:#VariableList
+ instanceVariableNames:'variableList classHolder showClassVars sortVariablesByName'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!VariableList class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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.
+"
+! !
+
+!VariableList class methodsFor:'interface specs'!
+
+windowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:VariableList andSelector:#windowSpec
+ VariableList new openInterface:#windowSpec
+ VariableList open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'VariableList'
+ #name: 'VariableList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 16 46 316 346)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SequenceViewSpec
+ #name: 'List'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #tabable: true
+ #model: #selectedVariables
+ #menu: #menuHolder
+ #hasHorizontalScrollBar: true
+ #hasVerticalScrollBar: true
+ #miniScrollerHorizontal: true
+ #isMultiSelect: true
+ #valueChangeSelector: #selectionChangedByClick
+ #useIndex: false
+ #sequenceList: #variableList
+ #doubleClickChannel: #doubleClickChannel
+ )
+ )
+
+ )
+ )
+! !
+
+!VariableList class methodsFor:'plugIn spec'!
+
+aspectSelectors
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this. If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "Return a description of exported aspects;
+ these can be connected to aspects of an embedding application
+ (if this app is embedded in a subCanvas)."
+
+ ^ #(
+ #(#doubleClickChannel #action )
+ #classHolder
+ #forceGeneratorTrigger
+ #immediateUpdate
+ #inGeneratorHolder
+ #menuHolder
+ #outGeneratorHolder
+ #packageFilter
+ #selectedVariables
+ #selectionChangeCondition
+ #updateTrigger
+ #showClassVarsInVariableList
+ #slaveMode
+ #sortVariablesBy
+ ).
+! !
+
+!VariableList methodsFor:'aspects'!
+
+classHolder
+ classHolder isNil ifTrue:[
+ classHolder := #() asValue.
+ classHolder addDependent:self
+ ].
+ ^ classHolder
+!
+
+classHolder:aValueHolder
+ classHolder notNil ifTrue:[
+ classHolder removeDependent:self
+ ].
+ classHolder := aValueHolder.
+ classHolder notNil ifTrue:[
+ classHolder isBehavior ifTrue:[self halt:'should not happen'].
+ classHolder addDependent:self
+ ].
+!
+
+defaultSlaveModeValue
+ ^ false.
+!
+
+selectedVariables
+ ^ self selectionHolder
+
+!
+
+selectedVariables:aValueHolder
+ ^ self selectionHolder:aValueHolder
+
+!
+
+showClassVarsInVariableList
+ showClassVars isNil ifTrue:[
+ showClassVars := false asValue.
+ showClassVars addDependent:self
+ ].
+ ^ showClassVars
+!
+
+showClassVarsInVariableList:aValueHolder
+ showClassVars notNil ifTrue:[
+ showClassVars removeDependent:self
+ ].
+ showClassVars := aValueHolder.
+ showClassVars notNil ifTrue:[
+ showClassVars addDependent:self
+ ].
+!
+
+showingInheritedClassVars
+ ^ false
+ "/ ^ true
+!
+
+sortVariablesByName
+ sortVariablesByName isNil ifTrue:[
+ sortVariablesByName := false asValue.
+ sortVariablesByName addDependent:self
+ ].
+ ^ sortVariablesByName
+!
+
+sortVariablesByName:aValueHolder
+ sortVariablesByName notNil ifTrue:[
+ sortVariablesByName removeDependent:self
+ ].
+ sortVariablesByName := aValueHolder.
+ sortVariablesByName notNil ifTrue:[
+ sortVariablesByName addDependent:self
+ ].
+!
+
+variableList
+ variableList isNil ifTrue:[
+ variableList := ValueHolder new
+ ].
+ ^ variableList
+
+
+! !
+
+!VariableList methodsFor:'change & update'!
+
+delayedUpdate:something with:aParameter from:changedObject
+ |selectedClasses changedClass anyChange|
+
+ self inSlaveModeOrInvisible ifTrue:[self invalidateList. ^ self].
+ "/ slaveMode value == true ifTrue:[^ self].
+
+ changedObject == slaveMode ifTrue:[
+ listValid ~~ true ifTrue:[
+ self enqueueDelayedUpdateList
+ ].
+ "/ self invalidateList.
+ ^ self
+ ].
+
+ changedObject == classHolder ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+ changedObject == showClassVars ifTrue:[
+ self invalidateList.
+ ^ self.
+ ].
+ changedObject == sortVariablesByName ifTrue:[
+ self invalidateList.
+ ^ self.
+ ].
+ changedObject == Smalltalk ifTrue:[
+ (something == #classDefinition
+ or:[something == #classVariables and:[showClassVars value == true]])
+ ifTrue:[
+ changedClass := aParameter.
+ selectedClasses := classHolder value.
+ selectedClasses notNil ifTrue:[
+ selectedClasses isSequenceable ifFalse:[
+ selectedClasses := selectedClasses asOrderedCollection
+ ].
+ selectedClasses keysAndValuesDo:[:idx :cls | |nm|
+ cls notNil ifTrue:[
+ cls isObsolete ifTrue:[
+ cls isMeta ifTrue:[
+ nm := cls theNonMetaclass name.
+ selectedClasses at:idx put:(Smalltalk at:nm) class.
+ ] ifFalse:[
+ nm := cls name.
+ selectedClasses at:idx put:(Smalltalk at:nm).
+ ].
+ anyChange := true.
+ ] ifFalse:[
+ (cls == aParameter
+ or:[something == #classVariables
+ and:[showClassVars value == true
+ and:[cls theNonMetaclass == aParameter theNonMetaclass]]]) ifTrue:[
+ anyChange := true.
+ ]
+ ]
+ ]
+ ].
+ (selectedClasses includes:nil) ifTrue:[
+ "/ can happen, if a selected class is removed...
+ "/ self halt:'should this happen ?'.
+ "/ fix it ...
+ selectedClasses := selectedClasses select:[:each | each notNil].
+ classHolder value:selectedClasses.
+ anyChange := true.
+ ].
+ anyChange == true ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+ ].
+ ^ self
+ ].
+ ] ifFalse:[
+ changedObject isBehavior ifTrue:[
+ anyChange := false.
+ selectedClasses := classHolder value.
+ selectedClasses notNil ifTrue:[
+ selectedClasses keysAndValuesDo:[:idx :cls | |nm|
+ cls isObsolete ifTrue:[
+ nm := cls name.
+ selectedClasses at:idx put:(Smalltalk at:nm).
+ anyChange := true.
+ ]
+ ].
+ anyChange == true ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+
+ (selectedClasses includesIdentical:something) ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+ ].
+ ^ self
+ ].
+ ].
+ super delayedUpdate:something with:aParameter from:changedObject
+!
+
+makeDependent
+ Smalltalk addDependent:self
+
+!
+
+makeIndependent
+ Smalltalk removeDependent:self
+
+!
+
+selectionChangedByClick
+ "we are not interested in that - get another notification
+ via the changed valueHolder"
+
+
+!
+
+update:something with:aParameter from:changedObject
+ "/ ^ self delayedUpdate:something with:aParameter from:changedObject.
+
+ changedObject == Smalltalk ifTrue:[
+ something == #methodDictionary ifTrue:[
+ ^ self
+ ].
+ something == #methodTrap ifTrue:[
+ ^ self
+ ].
+ something == #methodInClass ifTrue:[
+ ^ self
+ ].
+ something == #methodInClassRemoved ifTrue:[
+ ^ self
+ ].
+ something == #classComment ifTrue:[
+ ^ self.
+ ].
+ ].
+"/ self window sensor isNil ifTrue:[
+"/ "/ I am not visible ...
+"/ self invalidateList.
+"/ ^ self
+"/ ].
+ super update:something with:aParameter from:changedObject
+
+ "Modified: / 20.11.2001 / 21:55:22 / cg"
+! !
+
+!VariableList methodsFor:'generators'!
+
+makeGenerator
+
+
+
+! !
+
+!VariableList methodsFor:'private'!
+
+commonPostBuildWith:aBuilder
+ |list|
+
+ super commonPostBuildWith:aBuilder.
+
+ list := aBuilder componentAt:#List.
+ list notNil ifTrue:[
+ list selectConditionBlock:[:item | self selectionChangeAllowed:item].
+ list ignoreReselect:false.
+ ].
+!
+
+commonSubClassIn:classes
+ "return true if there is a common subclass"
+
+ |theCommonSubClass "classesByInheritance"|
+
+ theCommonSubClass := nil.
+ classes do:[:eachClass |
+ theCommonSubClass isNil ifTrue:[
+ theCommonSubClass := eachClass
+ ] ifFalse:[
+ (eachClass isSubclassOf:theCommonSubClass) ifTrue:[
+ theCommonSubClass := eachClass
+ ] ifFalse:[
+ (theCommonSubClass isSubclassOf:eachClass) ifFalse:[
+ ^ nil
+ ]
+ ]
+ ]
+ ].
+ ^ theCommonSubClass.
+
+"/ classesByInheritance := classes topologicalSort:[:a :b | a isSubclassOf:b].
+"/ classesByInheritance keysAndValuesDo:[:index :eachClass |
+"/ "/ all classes after that one must be superclasses ...
+"/ classesByInheritance from:index+1 to:classesByInheritance size do:[:otherClass |
+"/ (eachClass isSubclassOf:otherClass) ifFalse:[
+"/ ^ nil.
+"/ ]
+"/ ].
+"/ ].
+"/ ^ classesByInheritance first
+!
+
+listOfVariables
+ |nameList numClasses classes class commonSubclass showingClassVars
+ sortByName|
+
+ classHolder isNil ifTrue:[
+ "/ testing
+ ^ #()
+ ].
+
+ showingClassVars := showClassVars value == true.
+ sortByName := sortVariablesByName value.
+
+ classes := classHolder value.
+ (numClasses := classes size) == 0 ifTrue:[^ #() ].
+ numClasses > 1 ifTrue:[
+ "/ multiple classes - see if there is a common subclass ...
+ commonSubclass := self commonSubClassIn:classes.
+ commonSubclass notNil ifTrue:[
+ "/ yes - treat like a single class
+ classes := Array with:(commonSubclass).
+ numClasses := 1.
+ ].
+ ].
+
+ numClasses > 1 ifTrue:[
+ "/ multiple classes - sort alphabetically ...
+ "/ unless there is a common subclass ...
+ nameList := Set new.
+ classes do:[:class |
+ showingClassVars ifTrue:[
+ self showingInheritedClassVars ifTrue:[
+ class theNonMetaclass withAllSuperclassesDo:[:cls|
+ nameList addAll:(cls classVarNames)
+ ]
+ ] ifFalse:[
+ nameList addAll:(class classVarNames)
+ ]
+ ] ifFalse:[
+ class withAllSuperclassesDo:[:cls|
+ nameList addAll:(cls instVarNames)
+ ]
+ ]
+ ].
+ nameList := nameList asOrderedCollection.
+ ] ifFalse:[
+ "/ only a single class - sort by inheritance
+ class := classes first.
+
+ nameList := OrderedCollection new.
+ class notNil ifTrue:[
+ showingClassVars ifTrue:[
+ class := class theNonMetaclass
+ ].
+ class withAllSuperclassesDo:[:cls|
+ |varNames|
+
+ varNames := showingClassVars ifTrue:[ cls classVarNames ] ifFalse:[ cls instVarNames ].
+ varNames copy reverse do:[:varName|
+ nameList addFirst:varName.
+ ].
+ sortByName ifFalse:[
+ nameList addFirst:'----- ' , cls nameInBrowser , ' -----'.
+ ]
+ ].
+ ].
+ ].
+
+ (numClasses > 1 or:[sortByName]) ifTrue:[
+ nameList sort.
+ ].
+ ^ nameList
+
+ "Created: / 5.2.2000 / 13:42:11 / cg"
+ "Modified: / 26.2.2000 / 01:05:36 / cg"
+!
+
+postBuildWith:aBuilder
+ |listView|
+
+ (listView := aBuilder componentAt:#List) notNil ifTrue:[
+ listView scrollWhenUpdating:#end
+ ].
+ super postBuildWith:aBuilder
+
+!
+
+release
+ super release.
+
+ classHolder removeDependent:self.
+ showClassVars removeDependent:self.
+!
+
+selectionChangeAllowed:index
+ ^ ((variableList value at:index) startsWith:'---') not.
+!
+
+updateList
+ | prevSelection newSelection newList oldList selectedVariablesHolder|
+
+ oldList := self variableList value copy.
+ newList := self listOfVariables.
+
+ newList ~= variableList value ifTrue:[
+ selectedVariablesHolder := self selectedVariables.
+ prevSelection := (selectedVariablesHolder value copy) ? #().
+ variableList value:newList.
+
+ newSelection := prevSelection select:[:item | newList includes:item].
+
+ newSelection size > 0 ifTrue:[
+ "/ force change (for dependents)
+ selectedVariablesHolder value:nil.
+ selectedVariablesHolder value:newSelection.
+ ] ifFalse:[
+ prevSelection := selectedVariablesHolder value.
+ selectedVariablesHolder value:nil.
+ ].
+ (prevSelection size > 0 or:[newSelection size > 0]) ifTrue:[
+ self updateOutputGenerator.
+ ].
+ ].
+ listValid := true.
+! !
+
+!VariableList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Attic/Tools_VariableList.st,v 1.1 2004-02-26 18:56:20 cg Exp $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools__VariableList.st Thu Feb 26 19:57:02 2004 +0100
@@ -0,0 +1,541 @@
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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:__NoProject__' }"
+
+"{ NameSpace: Tools }"
+
+BrowserList subclass:#VariableList
+ instanceVariableNames:'variableList classHolder showClassVars sortVariablesByName'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Browsers-New'
+!
+
+!VariableList class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+ 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.
+"
+! !
+
+!VariableList class methodsFor:'interface specs'!
+
+windowSpec
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this!! If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "
+ UIPainter new openOnClass:VariableList andSelector:#windowSpec
+ VariableList new openInterface:#windowSpec
+ VariableList open
+ "
+
+ <resource: #canvas>
+
+ ^
+ #(#FullSpec
+ #name: #windowSpec
+ #window:
+ #(#WindowSpec
+ #label: 'VariableList'
+ #name: 'VariableList'
+ #min: #(#Point 0 0)
+ #max: #(#Point 1024 721)
+ #bounds: #(#Rectangle 16 46 316 346)
+ )
+ #component:
+ #(#SpecCollection
+ #collection: #(
+ #(#SequenceViewSpec
+ #name: 'List'
+ #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+ #tabable: true
+ #model: #selectedVariables
+ #menu: #menuHolder
+ #hasHorizontalScrollBar: true
+ #hasVerticalScrollBar: true
+ #miniScrollerHorizontal: true
+ #isMultiSelect: true
+ #valueChangeSelector: #selectionChangedByClick
+ #useIndex: false
+ #sequenceList: #variableList
+ #doubleClickChannel: #doubleClickChannel
+ )
+ )
+
+ )
+ )
+! !
+
+!VariableList class methodsFor:'plugIn spec'!
+
+aspectSelectors
+ "This resource specification was automatically generated
+ by the UIPainter of ST/X."
+
+ "Do not manually edit this. If it is corrupted,
+ the UIPainter may not be able to read the specification."
+
+ "Return a description of exported aspects;
+ these can be connected to aspects of an embedding application
+ (if this app is embedded in a subCanvas)."
+
+ ^ #(
+ #(#doubleClickChannel #action )
+ #classHolder
+ #forceGeneratorTrigger
+ #immediateUpdate
+ #inGeneratorHolder
+ #menuHolder
+ #outGeneratorHolder
+ #packageFilter
+ #selectedVariables
+ #selectionChangeCondition
+ #updateTrigger
+ #showClassVarsInVariableList
+ #slaveMode
+ #sortVariablesBy
+ ).
+! !
+
+!VariableList methodsFor:'aspects'!
+
+classHolder
+ classHolder isNil ifTrue:[
+ classHolder := #() asValue.
+ classHolder addDependent:self
+ ].
+ ^ classHolder
+!
+
+classHolder:aValueHolder
+ classHolder notNil ifTrue:[
+ classHolder removeDependent:self
+ ].
+ classHolder := aValueHolder.
+ classHolder notNil ifTrue:[
+ classHolder isBehavior ifTrue:[self halt:'should not happen'].
+ classHolder addDependent:self
+ ].
+!
+
+defaultSlaveModeValue
+ ^ false.
+!
+
+selectedVariables
+ ^ self selectionHolder
+
+!
+
+selectedVariables:aValueHolder
+ ^ self selectionHolder:aValueHolder
+
+!
+
+showClassVarsInVariableList
+ showClassVars isNil ifTrue:[
+ showClassVars := false asValue.
+ showClassVars addDependent:self
+ ].
+ ^ showClassVars
+!
+
+showClassVarsInVariableList:aValueHolder
+ showClassVars notNil ifTrue:[
+ showClassVars removeDependent:self
+ ].
+ showClassVars := aValueHolder.
+ showClassVars notNil ifTrue:[
+ showClassVars addDependent:self
+ ].
+!
+
+showingInheritedClassVars
+ ^ false
+ "/ ^ true
+!
+
+sortVariablesByName
+ sortVariablesByName isNil ifTrue:[
+ sortVariablesByName := false asValue.
+ sortVariablesByName addDependent:self
+ ].
+ ^ sortVariablesByName
+!
+
+sortVariablesByName:aValueHolder
+ sortVariablesByName notNil ifTrue:[
+ sortVariablesByName removeDependent:self
+ ].
+ sortVariablesByName := aValueHolder.
+ sortVariablesByName notNil ifTrue:[
+ sortVariablesByName addDependent:self
+ ].
+!
+
+variableList
+ variableList isNil ifTrue:[
+ variableList := ValueHolder new
+ ].
+ ^ variableList
+
+
+! !
+
+!VariableList methodsFor:'change & update'!
+
+delayedUpdate:something with:aParameter from:changedObject
+ |selectedClasses changedClass anyChange|
+
+ self inSlaveModeOrInvisible ifTrue:[self invalidateList. ^ self].
+ "/ slaveMode value == true ifTrue:[^ self].
+
+ changedObject == slaveMode ifTrue:[
+ listValid ~~ true ifTrue:[
+ self enqueueDelayedUpdateList
+ ].
+ "/ self invalidateList.
+ ^ self
+ ].
+
+ changedObject == classHolder ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+ changedObject == showClassVars ifTrue:[
+ self invalidateList.
+ ^ self.
+ ].
+ changedObject == sortVariablesByName ifTrue:[
+ self invalidateList.
+ ^ self.
+ ].
+ changedObject == Smalltalk ifTrue:[
+ (something == #classDefinition
+ or:[something == #classVariables and:[showClassVars value == true]])
+ ifTrue:[
+ changedClass := aParameter.
+ selectedClasses := classHolder value.
+ selectedClasses notNil ifTrue:[
+ selectedClasses isSequenceable ifFalse:[
+ selectedClasses := selectedClasses asOrderedCollection
+ ].
+ selectedClasses keysAndValuesDo:[:idx :cls | |nm|
+ cls notNil ifTrue:[
+ cls isObsolete ifTrue:[
+ cls isMeta ifTrue:[
+ nm := cls theNonMetaclass name.
+ selectedClasses at:idx put:(Smalltalk at:nm) class.
+ ] ifFalse:[
+ nm := cls name.
+ selectedClasses at:idx put:(Smalltalk at:nm).
+ ].
+ anyChange := true.
+ ] ifFalse:[
+ (cls == aParameter
+ or:[something == #classVariables
+ and:[showClassVars value == true
+ and:[cls theNonMetaclass == aParameter theNonMetaclass]]]) ifTrue:[
+ anyChange := true.
+ ]
+ ]
+ ]
+ ].
+ (selectedClasses includes:nil) ifTrue:[
+ "/ can happen, if a selected class is removed...
+ "/ self halt:'should this happen ?'.
+ "/ fix it ...
+ selectedClasses := selectedClasses select:[:each | each notNil].
+ classHolder value:selectedClasses.
+ anyChange := true.
+ ].
+ anyChange == true ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+ ].
+ ^ self
+ ].
+ ] ifFalse:[
+ changedObject isBehavior ifTrue:[
+ anyChange := false.
+ selectedClasses := classHolder value.
+ selectedClasses notNil ifTrue:[
+ selectedClasses keysAndValuesDo:[:idx :cls | |nm|
+ cls isObsolete ifTrue:[
+ nm := cls name.
+ selectedClasses at:idx put:(Smalltalk at:nm).
+ anyChange := true.
+ ]
+ ].
+ anyChange == true ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+
+ (selectedClasses includesIdentical:something) ifTrue:[
+ self invalidateList.
+ ^ self
+ ].
+ ].
+ ^ self
+ ].
+ ].
+ super delayedUpdate:something with:aParameter from:changedObject
+!
+
+makeDependent
+ Smalltalk addDependent:self
+
+!
+
+makeIndependent
+ Smalltalk removeDependent:self
+
+!
+
+selectionChangedByClick
+ "we are not interested in that - get another notification
+ via the changed valueHolder"
+
+
+!
+
+update:something with:aParameter from:changedObject
+ "/ ^ self delayedUpdate:something with:aParameter from:changedObject.
+
+ changedObject == Smalltalk ifTrue:[
+ something == #methodDictionary ifTrue:[
+ ^ self
+ ].
+ something == #methodTrap ifTrue:[
+ ^ self
+ ].
+ something == #methodInClass ifTrue:[
+ ^ self
+ ].
+ something == #methodInClassRemoved ifTrue:[
+ ^ self
+ ].
+ something == #classComment ifTrue:[
+ ^ self.
+ ].
+ ].
+"/ self window sensor isNil ifTrue:[
+"/ "/ I am not visible ...
+"/ self invalidateList.
+"/ ^ self
+"/ ].
+ super update:something with:aParameter from:changedObject
+
+ "Modified: / 20.11.2001 / 21:55:22 / cg"
+! !
+
+!VariableList methodsFor:'generators'!
+
+makeGenerator
+
+
+
+! !
+
+!VariableList methodsFor:'private'!
+
+commonPostBuildWith:aBuilder
+ |list|
+
+ super commonPostBuildWith:aBuilder.
+
+ list := aBuilder componentAt:#List.
+ list notNil ifTrue:[
+ list selectConditionBlock:[:item | self selectionChangeAllowed:item].
+ list ignoreReselect:false.
+ ].
+!
+
+commonSubClassIn:classes
+ "return true if there is a common subclass"
+
+ |theCommonSubClass "classesByInheritance"|
+
+ theCommonSubClass := nil.
+ classes do:[:eachClass |
+ theCommonSubClass isNil ifTrue:[
+ theCommonSubClass := eachClass
+ ] ifFalse:[
+ (eachClass isSubclassOf:theCommonSubClass) ifTrue:[
+ theCommonSubClass := eachClass
+ ] ifFalse:[
+ (theCommonSubClass isSubclassOf:eachClass) ifFalse:[
+ ^ nil
+ ]
+ ]
+ ]
+ ].
+ ^ theCommonSubClass.
+
+"/ classesByInheritance := classes topologicalSort:[:a :b | a isSubclassOf:b].
+"/ classesByInheritance keysAndValuesDo:[:index :eachClass |
+"/ "/ all classes after that one must be superclasses ...
+"/ classesByInheritance from:index+1 to:classesByInheritance size do:[:otherClass |
+"/ (eachClass isSubclassOf:otherClass) ifFalse:[
+"/ ^ nil.
+"/ ]
+"/ ].
+"/ ].
+"/ ^ classesByInheritance first
+!
+
+listOfVariables
+ |nameList numClasses classes class commonSubclass showingClassVars
+ sortByName|
+
+ classHolder isNil ifTrue:[
+ "/ testing
+ ^ #()
+ ].
+
+ showingClassVars := showClassVars value == true.
+ sortByName := sortVariablesByName value.
+
+ classes := classHolder value.
+ (numClasses := classes size) == 0 ifTrue:[^ #() ].
+ numClasses > 1 ifTrue:[
+ "/ multiple classes - see if there is a common subclass ...
+ commonSubclass := self commonSubClassIn:classes.
+ commonSubclass notNil ifTrue:[
+ "/ yes - treat like a single class
+ classes := Array with:(commonSubclass).
+ numClasses := 1.
+ ].
+ ].
+
+ numClasses > 1 ifTrue:[
+ "/ multiple classes - sort alphabetically ...
+ "/ unless there is a common subclass ...
+ nameList := Set new.
+ classes do:[:class |
+ showingClassVars ifTrue:[
+ self showingInheritedClassVars ifTrue:[
+ class theNonMetaclass withAllSuperclassesDo:[:cls|
+ nameList addAll:(cls classVarNames)
+ ]
+ ] ifFalse:[
+ nameList addAll:(class classVarNames)
+ ]
+ ] ifFalse:[
+ class withAllSuperclassesDo:[:cls|
+ nameList addAll:(cls instVarNames)
+ ]
+ ]
+ ].
+ nameList := nameList asOrderedCollection.
+ ] ifFalse:[
+ "/ only a single class - sort by inheritance
+ class := classes first.
+
+ nameList := OrderedCollection new.
+ class notNil ifTrue:[
+ showingClassVars ifTrue:[
+ class := class theNonMetaclass
+ ].
+ class withAllSuperclassesDo:[:cls|
+ |varNames|
+
+ varNames := showingClassVars ifTrue:[ cls classVarNames ] ifFalse:[ cls instVarNames ].
+ varNames copy reverse do:[:varName|
+ nameList addFirst:varName.
+ ].
+ sortByName ifFalse:[
+ nameList addFirst:'----- ' , cls nameInBrowser , ' -----'.
+ ]
+ ].
+ ].
+ ].
+
+ (numClasses > 1 or:[sortByName]) ifTrue:[
+ nameList sort.
+ ].
+ ^ nameList
+
+ "Created: / 5.2.2000 / 13:42:11 / cg"
+ "Modified: / 26.2.2000 / 01:05:36 / cg"
+!
+
+postBuildWith:aBuilder
+ |listView|
+
+ (listView := aBuilder componentAt:#List) notNil ifTrue:[
+ listView scrollWhenUpdating:#end
+ ].
+ super postBuildWith:aBuilder
+
+!
+
+release
+ super release.
+
+ classHolder removeDependent:self.
+ showClassVars removeDependent:self.
+!
+
+selectionChangeAllowed:index
+ ^ ((variableList value at:index) startsWith:'---') not.
+!
+
+updateList
+ | prevSelection newSelection newList oldList selectedVariablesHolder|
+
+ oldList := self variableList value copy.
+ newList := self listOfVariables.
+
+ newList ~= variableList value ifTrue:[
+ selectedVariablesHolder := self selectedVariables.
+ prevSelection := (selectedVariablesHolder value copy) ? #().
+ variableList value:newList.
+
+ newSelection := prevSelection select:[:item | newList includes:item].
+
+ newSelection size > 0 ifTrue:[
+ "/ force change (for dependents)
+ selectedVariablesHolder value:nil.
+ selectedVariablesHolder value:newSelection.
+ ] ifFalse:[
+ prevSelection := selectedVariablesHolder value.
+ selectedVariablesHolder value:nil.
+ ].
+ (prevSelection size > 0 or:[newSelection size > 0]) ifTrue:[
+ self updateOutputGenerator.
+ ].
+ ].
+ listValid := true.
+! !
+
+!VariableList class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libtool/Tools__VariableList.st,v 1.1 2004-02-26 18:56:20 cg Exp $'
+! !