Trapped-Common.st 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. Smalltalk current createPackage: 'Trapped-Common' properties: #{}!
  2. Object subclass: #TrappedDispatcher
  3. instanceVariableNames: ''
  4. package: 'Trapped-Common'!
  5. !TrappedDispatcher commentStamp!
  6. I am base class for change event dispatchers.
  7. I manage changed path - action block subscriptions.
  8. These subscription must be three-element arrays
  9. { dirty. path. block }
  10. My subclasses need to provide implementation for:
  11. add:
  12. do:
  13. (optionally) run!
  14. !TrappedDispatcher methodsFor: 'action'!
  15. changed: path
  16. | needsToRun |
  17. needsToRun := false.
  18. self do: [ :each |
  19. | aPath lesser |
  20. aPath := each second.
  21. lesser := aPath size min: path size.
  22. (path copyFrom: 1 to: lesser) = (aPath copyFrom: 1 to: lesser) ifTrue: [
  23. each at: 1 put: true.
  24. needsToRun := true.
  25. ]
  26. ].
  27. ^needsToRun
  28. !
  29. run
  30. self do: [ :each |
  31. each first ifTrue: [[ each third value ] ensure: [ each at: 1 put: false ]]
  32. ]
  33. ! !
  34. Object subclass: #TrappedModelWrapper
  35. instanceVariableNames: 'dispatcher payload'
  36. package: 'Trapped-Common'!
  37. !TrappedModelWrapper commentStamp!
  38. I am base class for model wrappers.
  39. I wrap a model which can be any object.
  40. My subclasses need to provide implementation for:
  41. read:do:
  42. (optionally) name
  43. and must initialize:
  44. payload
  45. dispatcher!
  46. !TrappedModelWrapper methodsFor: 'accessing'!
  47. dispatcher
  48. ^dispatcher
  49. !
  50. dispatcher: aDispatcher
  51. dispatcher := aDispatcher
  52. !
  53. name
  54. ^ self class name
  55. !
  56. payload
  57. ^payload
  58. !
  59. payload: anObject
  60. payload := anObject
  61. ! !
  62. !TrappedModelWrapper methodsFor: 'action'!
  63. start
  64. Trapped current register: self name: self name
  65. !
  66. watch: path do: aBlock
  67. self dispatcher add: { true. path. [ self read: path do: aBlock ] }.
  68. [ self dispatcher run ] fork
  69. ! !
  70. !TrappedModelWrapper class methodsFor: 'action'!
  71. start
  72. self new start
  73. ! !