A new version of TraitEditor was added to project SystemEditor: http://www.squeaksource.com/SystemEditor/TraitEditor-mtf.14.mcz
==================== Summary ====================
Name: TraitEditor-mtf.14 Author: mtf Time: 6 November 2008, 10:46:13 pm UUID: 3467b3e4-f8d4-49fb-b5f7-5d6f4366bf93 Ancestors: TraitEditor-mtf.13
implement building the users list of a trait. Based on the refactoring of the subclasses list building refactor
=============== Diff against TraitEditor-mtf.13 ===============
Item was added: + ----- Method: TraitCompositionEditor>>system (in category 'accessing') ----- + system + ^ parent system!
Item was added: + ----- Method: UserListDecorator>>for: (in category 'initialize-release') ----- + for: aClassEditor + parent := aClassEditor. + additions := IdentitySet new. + removals := IdentitySet new.!
Item was added: + ----- Method: UserListDecorator>>subject (in category 'accessing') ----- + subject + ^ subject ifNil: [subject := self parent subject ifNotNil: [self parent subject users]]!
Item was added: + ----- Method: UserListDecorator>>edBuild (in category 'building') ----- + edBuild + | result | + result := self subject + ifNil: [IdentityDictionary new] + ifNotNil: [self subject users copy]. + removals do: [:ea | result remove: ea product]. + additions do: [:ea | result add: ea product]. + ^ result!
Item was added: + ----- Method: UserListDecorator>>addUser: (in category 'accessing') ----- + addUser: aClassEditor + additions add: aClassEditor. + removals remove: aClassEditor ifAbsent: [].!
Item was added: + ----- Method: TraitCompositionEditor>>edDependentsDo: (in category 'building') ----- + edDependentsDo: aBlock + "Updates and enumerates the TraitEditors whose users list needs to be updated" + + | oldTraits editor | + oldTraits := self subject + ifNil: [IdentitySet new] + ifNotNil: [self subject traits asIdentitySet]. + self traitsOrEditorsDo: [:ea | ea edIsEditor + ifTrue: [ea addUser: self. aBlock value: ea] + ifFalse: [oldTraits remove: ea + ifAbsent: [editor := self system edEditorFor: ea. + editor addUser: self. aBlock value: editor]]]. + oldTraits do: [:ea | editor := self system edEditorFor: ea. + editor removeUser: self. aBlock value: editor]!
Item was added: + ----- Method: TraitDescriptionEditor>>addUser: (in category 'reflecting') ----- + addUser: anEditor + (self decorateWith: UserListDecorator) addUser: anEditor!
Item was changed: ----- Method: TraitCompositionEditor>>allTraitsOrEditorsDo: (in category 'accessing') ----- allTraitsOrEditorsDo: aBlock + self traitsOrEditorsDo: [:trait | - transformations do: [:transformation | | trait | - trait := self system classOrEditorFor: transformation trait. aBlock value: trait. trait hasTraitComposition ifTrue: [trait traitComposition allTraitsOrEditorsDo: aBlock]]!
Item was changed: AbstractEditor subclass: #TraitCompositionEditor + instanceVariableNames: 'subject transformations parent' - instanceVariableNames: 'subject transformations' classVariableNames: '' poolDictionaries: '' category: 'TraitEditor'!
!TraitCompositionEditor commentStamp: 'mtf 10/20/2008 11:22' prior: 0! I store the new version of a TraitComposition. I don't use any kind of diff between the subject and product. For now at least, I don't use a TraitTransformationEditor, but use plain TraitTransforms which include TraitEditors
Unlike most editors, I am not persistent. Transient instances of myself are usually built, and only then is my subject and environment set. This is how TraitDescriptions work, so, that is how I work!
Item was added: + ----- Method: UserListDecorator>>removeUser: (in category 'accessing') ----- + removeUser: aClassEditor + removals add: aClassEditor. + additions remove: aClassEditor ifAbsent: [].!
Item was added: + ----- Method: UserListDecorator>>edBuildInto: (in category 'building') ----- + edBuildInto: aProduct + aProduct instVarNamed: #users put: self edBuild!
Item was added: + ----- Method: TraitCompositionEditor>>traitsOrEditorsDo: (in category 'accessing') ----- + traitsOrEditorsDo: aBlock + self transformations do: [:transformation | + aBlock value: (self system classOrEditorFor: transformation trait)]!
Item was added: + ClassDecorator subclass: #UserListDecorator + instanceVariableNames: 'parent additions removals subject' + classVariableNames: '' + poolDictionaries: '' + category: 'TraitEditor'! + + !UserListDecorator commentStamp: 'mtf 11/5/2008 13:45' prior: 0! + I edit the users list of a Trait!
Item was added: + ----- Method: TraitCompositionEditor>>setSubject:parent: (in category 'accessing') ----- + setSubject: aTraitComposition parent: aClassEditor + subject := aTraitComposition. + parent := aClassEditor.!
Item was added: + ----- Method: UserListDecorator>>edPrepareMigration: (in category 'building') ----- + edPrepareMigration: txn + self subject ifNil: [^ self]. + txn addMigrator: (ObjectMigrator + origin: self subject + destination: self edBuild)!
Item was changed: ----- Method: PureBehaviorEditor>>setTraitComposition: (in category '*TraitEditor') ----- setTraitComposition: aTraitComposition - | oldComposition | (self hasTraitComposition not and: [aTraitComposition isEmpty]) ifTrue: [^self].
aTraitComposition setSubject: (self subject ifNotNil: [self subject traitComposition]) parent: self. + self traitComposition: aTraitComposition! - self traitComposition: aTraitComposition. - - oldComposition traits do: [:each | each removeUser: self]. - aTraitComposition traits do: [:each | each addUser: self]!
Item was added: + ----- Method: TraitCompositionDecorator>>edDependentsDo: (in category 'building') ----- + edDependentsDo: aBlock + self traitComposition edDependentsDo: aBlock!
Item was added: + ----- Method: TraitDescriptionEditor>>removeUser: (in category 'reflecting') ----- + removeUser: anEditor + (self decorateWith: UserListDecorator) removeUser: anEditor!
packages@lists.squeakfoundation.org