initial checkin
authorClaus Gittinger <cg@exept.de>
Thu, 26 Feb 2004 19:57:02 +0100
changeset 5591 273637686948
parent 5590 be5ae6091a00
child 5592 d9730a8d7c52
initial checkin
Tools_BrowserList.st
Tools_ClassCategoryList.st
Tools_ClassChecker.st
Tools_ClassGeneratorList.st
Tools_ClassList.st
Tools_FullMethodCategoryList.st
Tools_HierarchicalClassCategoryList.st
Tools_HierarchicalClassList.st
Tools_HierarchicalProjectList.st
Tools_ImplementingClassList.st
Tools_ImplementingMethodList.st
Tools_InheritanceClassList.st
Tools_MethodCategoryList.st
Tools_MethodList.st
Tools_NamespaceList.st
Tools_NavigationState.st
Tools_NavigatorCanvas.st
Tools_NavigatorModel.st
Tools_OrganizerCanvas.st
Tools_ProjectList.st
Tools_SearchDialog.st
Tools_SpecialCodeView.st
Tools_VariableList.st
Tools__VariableList.st
--- /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 $'
+! !