Smalltalk createPackage: 'MiniMVP'! Object subclass: #MiniPresenter slots: {#frame. #dataBlock. #currentData} package: 'MiniMVP'! !MiniPresenter methodsFor: 'accessing'! currentData ^ currentData ! currentData: anObject currentData := anObject ! dataBlock ^ dataBlock ! dataBlock: anObject dataBlock := anObject ! frame ^ frame ! frame: anObject frame := anObject ! ! !MiniPresenter methodsFor: 'actions'! currentData: anObject ifChangedToNil: aBlock ifChangedToNotNil: anotherBlock | oldData newData | oldData := self currentData. self currentData: anObject. newData := self currentData. oldData = newData ifFalse: [ newData ifNil: [ aBlock value ] ifNotNil: [ anotherBlock value: newData ] ] ! present: anObject self subclassResponsibility ! refresh self currentData: self dataBlock value ifChangedToNil: [ self hide ] ifChangedToNotNil: [ :data | self show; present: data ] ! ! !MiniPresenter methodsFor: 'private'! hide self frame asDomNode style setProperty: #display to: 'none' ! show self frame asDomNode style removeProperty: 'display' ! ! !MiniPresenter class methodsFor: 'instance creation'! shows: aBlock in: aDommable ^ super new dataBlock: aBlock; frame: aDommable; hide; yourself ! ! MiniPresenter subclass: #MiniLeafPresenter slots: {#factory} package: 'MiniMVP'! !MiniLeafPresenter methodsFor: 'accessing'! factory ^ factory ! factory: anObject factory := anObject ! ! !MiniLeafPresenter methodsFor: 'rendering'! frameContents: anObject self subclassResponsibility ! present: anObject (self factory value: anObject) ifNotNil: [ :payload | self frameContents: payload ] ! ! !MiniLeafPresenter class methodsFor: 'instance creation'! shows: aDataBlock in: aDommable do: aFactoryBlock ^ (super shows: aDataBlock in: aDommable) factory: aFactoryBlock; yourself ! ! MiniLeafPresenter subclass: #AmberWebLeafPresenter slots: {} package: 'MiniMVP'! !AmberWebLeafPresenter methodsFor: 'rendering'! frameContents: anObject self frame contents: anObject ! ! MiniLeafPresenter subclass: #SilkLeafPresenter slots: {} package: 'MiniMVP'! !SilkLeafPresenter methodsFor: 'rendering'! frameContents: anObject self frame resetContents; << anObject ! ! MiniPresenter subclass: #MiniParentPresenter slots: {} package: 'MiniMVP'! !MiniParentPresenter methodsFor: 'accessing'! childPresenters self subclassResponsibility ! ! !MiniParentPresenter methodsFor: 'actions'! present: anObject self childPresenters do: [ :each | each refresh ] ! ! !MiniParentPresenter class methodsFor: 'instance creation'! in: aDommable ^ super shows: [ Object new ] in: aDommable ! !