Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.1073.mcz
==================== Summary ====================
Name: Tools-mt.1073 Author: mt Time: 23 November 2021, 3:07:02.043922 pm UUID: f873ae33-8582-ed41-a89e-5cdc18ebfa26 Ancestors: Tools-mt.1072
Adds support for traits in HierarchyBrowser.
Thanks to Christoph (ct) for the idea! See: http://lists.squeakfoundation.org/pipermail/squeak-dev/2021-October/216835.h...
=============== Diff against Tools-mt.1072 ===============
Item was changed: ----- Method: Browser>>browseClassHierarchy (in category 'multi-window support') ----- browseClassHierarchy "Overridden to consider multi-window state and hierarchy browser."
| behavior newBrowser | (behavior := self selectedClassOrMetaClass) isNil ifTrue: [^self].
(self isPackage "PackageBrowser panes can't support a hierarchy browser; not sure why." or: [self multiWindowState isNil]) ifTrue: [^super browseClassHierarchy].
+ newBrowser := HierarchyBrowser new + setClass: behavior; - (newBrowser := HierarchyBrowser new initHierarchyForClass: behavior) selectMessageCategoryNamed: self selectedMessageCategoryName; selectMessageNamed: self selectedMessageName; + editSelection: editSelection; + yourself. - editSelection: editSelection.
self multiWindowState addWindow: newBrowser!
Item was changed: ----- Method: Browser>>setClass: (in category 'initialize-release') ----- setClass: aBehavior "Set the state of a new, uninitialized Browser."
| isMeta aClass | aBehavior ifNil: [^ self]. + aBehavior isMeta - (aBehavior isKindOf: Metaclass) ifTrue: [ isMeta := true. aClass := aBehavior soleInstance] ifFalse: [ isMeta := false. aClass := aBehavior]. self selectEnvironment: aClass environment; selectCategoryForClass: aClass; classListIndex: (self classListIndexOf: aClass name); metaClassIndicated: isMeta.!
Item was changed: + ----- Method: Browser>>traitsMenu: (in category 'traits') ----- - ----- Method: Browser>>traitsMenu: (in category '*Tools-traits') ----- traitsMenu: aMenu <classListMenuShifted: false> <menuPriority: 140>
self selectedClass isTrait ifTrue: [ aMenu add: 'browse trait users' action: #browseTraitUsers]. ^ aMenu!
Item was added: + ----- Method: HierarchyBrowser>>allAncestorsOfTrait:withLevelDo: (in category 'traits') ----- + allAncestorsOfTrait: trait withLevelDo: traitAndLevelBlock + + self + allAncestorsOfTrait: trait + withLevelDo: traitAndLevelBlock + startingLevel: 1.!
Item was added: + ----- Method: HierarchyBrowser>>allAncestorsOfTrait:withLevelDo:startingLevel: (in category 'traits') ----- + allAncestorsOfTrait: trait withLevelDo: traitAndLevelBlock startingLevel: level + + trait traitComposition asTraitComposition traits + do: [:ancestor | + self + allAncestorsOfTrait: ancestor + withLevelDo: traitAndLevelBlock + startingLevel: level + 1. + traitAndLevelBlock value: ancestor value: level].!
Item was added: + ----- Method: HierarchyBrowser>>allSuccessorsOfTrait:withLevelDo:startingLevel: (in category 'traits') ----- + allSuccessorsOfTrait: trait withLevelDo: traitAndLevelBlock startingLevel: level + + traitAndLevelBlock value: trait value: level. + (trait users sorted: #name ascending) + do: [:user | + self + allSuccessorsOfTrait: user + withLevelDo: traitAndLevelBlock + startingLevel: level + 1].!
Item was added: + ----- Method: HierarchyBrowser>>initHierarchyFor: (in category 'initialization') ----- + initHierarchyFor: classOrTrait + + classOrTrait isTrait + ifTrue: [self initHierarchyForTrait: classOrTrait] + ifFalse: [self initHierarchyForClass: classOrTrait].!
Item was added: + ----- Method: HierarchyBrowser>>initHierarchyForTrait: (in category 'traits') ----- + initHierarchyForTrait: baseTraitOrClassTrait + + | baseTrait baseLevel | + centralClass := baseTraitOrClassTrait. + baseTrait := baseTraitOrClassTrait baseTrait. + self selectEnvironment: baseTraitOrClassTrait environment. + metaClassIndicated := baseTraitOrClassTrait isClassTrait. + classDisplayList := OrderedCollection new. + baseLevel := 0. + self + allAncestorsOfTrait: baseTrait + withLevelDo: [:each :level | baseLevel := baseLevel max: level]. + self + allAncestorsOfTrait: baseTrait + withLevelDo: + [:each :level | classDisplayList add: + (String streamContents: + [ : stream | baseLevel - level timesRepeat: [ stream nextPutAll: ' ' ]. + stream nextPutAll: each name ]) ]. + self + allSuccessorsOfTrait: baseTrait + withLevelDo: + [:each :level | classDisplayList add: + (String streamContents: + [ : stream | level timesRepeat: [ stream nextPutAll: ' ' ]. + stream nextPutAll: each name ]) ] + startingLevel: baseLevel. + + self changed: #classList. + self selectClass: baseTrait.!
Item was changed: ----- Method: HierarchyBrowser>>setClass: (in category 'initialization') ----- + setClass: aClassOrTrait + self initHierarchyFor: (centralClass ifNil: [ aClassOrTrait ]). + super setClass: aClassOrTrait! - setClass: aClass - self initHierarchyForClass: (centralClass ifNil: [ aClass ]). - super setClass: aClass!
Item was changed: ----- Method: HierarchyBrowser>>updateAfterClassChange (in category 'initialization') ----- updateAfterClassChange "It is possible that some the classes comprising the hierarchy have changed, so reinitialize the entire browser."
| priorSelection | priorSelection := self selectedClassName. (centralClass notNil and: [centralClass isObsolete not]) + ifTrue: [self initHierarchyFor: centralClass]. - ifTrue: [self initHierarchyForClass: centralClass]. (self classListIndexOf: priorSelection) > 0 ifTrue: [self selectClassNamed: priorSelection].!
packages@lists.squeakfoundation.org