MiniMVP.st 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. Smalltalk createPackage: 'MiniMVP'!
  2. Object subclass: #MiniPresenter
  3. slots: {#frame. #dataBlock. #currentData}
  4. package: 'MiniMVP'!
  5. !MiniPresenter methodsFor: 'accessing'!
  6. currentData
  7. ^ currentData
  8. !
  9. currentData: anObject
  10. currentData := anObject
  11. !
  12. dataBlock
  13. ^ dataBlock
  14. !
  15. dataBlock: anObject
  16. dataBlock := anObject
  17. !
  18. frame
  19. ^ frame
  20. !
  21. frame: anObject
  22. frame := anObject
  23. ! !
  24. !MiniPresenter methodsFor: 'actions'!
  25. currentData: anObject ifChangedToNil: aBlock ifChangedToNotNil: anotherBlock
  26. | oldData newData |
  27. oldData := self currentData.
  28. self currentData: anObject.
  29. newData := self currentData.
  30. oldData = newData ifFalse: [
  31. newData ifNil: [ aBlock value ] ifNotNil: [ anotherBlock value: newData ] ]
  32. !
  33. present: anObject
  34. self subclassResponsibility
  35. !
  36. refresh
  37. self
  38. currentData: self dataBlock value
  39. ifChangedToNil: [ self hide ]
  40. ifChangedToNotNil: [ :data | self show; present: data ]
  41. ! !
  42. !MiniPresenter methodsFor: 'private'!
  43. hide
  44. self frame asDomNode style setProperty: #display to: 'none'
  45. !
  46. show
  47. self frame asDomNode style removeProperty: 'display'
  48. ! !
  49. !MiniPresenter class methodsFor: 'instance creation'!
  50. shows: aBlock in: aDommable
  51. ^ super new
  52. dataBlock: aBlock;
  53. frame: aDommable;
  54. hide;
  55. yourself
  56. ! !
  57. MiniPresenter subclass: #MiniLeafPresenter
  58. slots: {#factory}
  59. package: 'MiniMVP'!
  60. !MiniLeafPresenter methodsFor: 'accessing'!
  61. factory
  62. ^ factory
  63. !
  64. factory: anObject
  65. factory := anObject
  66. ! !
  67. !MiniLeafPresenter methodsFor: 'rendering'!
  68. frameContents: anObject
  69. self subclassResponsibility
  70. !
  71. present: anObject
  72. (self factory value: anObject)
  73. ifNotNil: [ :payload | self frameContents: payload ]
  74. ! !
  75. !MiniLeafPresenter class methodsFor: 'instance creation'!
  76. shows: aDataBlock in: aDommable do: aFactoryBlock
  77. ^ (super shows: aDataBlock in: aDommable)
  78. factory: aFactoryBlock;
  79. yourself
  80. ! !
  81. MiniLeafPresenter subclass: #AmberWebLeafPresenter
  82. slots: {}
  83. package: 'MiniMVP'!
  84. !AmberWebLeafPresenter methodsFor: 'rendering'!
  85. frameContents: anObject
  86. self frame contents: anObject
  87. ! !
  88. MiniLeafPresenter subclass: #SilkLeafPresenter
  89. slots: {}
  90. package: 'MiniMVP'!
  91. !SilkLeafPresenter methodsFor: 'rendering'!
  92. frameContents: anObject
  93. self frame resetContents; << anObject
  94. ! !
  95. MiniPresenter subclass: #MiniParentPresenter
  96. slots: {}
  97. package: 'MiniMVP'!
  98. !MiniParentPresenter methodsFor: 'accessing'!
  99. childPresenters
  100. self subclassResponsibility
  101. ! !
  102. !MiniParentPresenter methodsFor: 'actions'!
  103. present: anObject
  104. self childPresenters do: [ :each | each refresh ]
  105. ! !
  106. !MiniParentPresenter class methodsFor: 'instance creation'!
  107. in: aDommable
  108. ^ super shows: [ Object new ] in: aDommable
  109. ! !