This section should probably also explain the concept of the subscriber,
ie. the thing you need to unregister for the announcement to stop being
sent.
For message sends (on:send:to:) it is the receiver (to: argument), for
blocks (on: do:) it's the object where block is defined.
#on:do:for:/#when:do:for, which lets you specify another object as
subscriber for block actions, is currently not implemented.
It's also a difference from the VW implementation, where when:do: uses
the action block itself as subscriber, so you're much more likely to
need on:do:for:.
Cheers,
Henry
On 18.04.2011 11:13, Henrik Sperre Johansen wrote:
On 18.04.2011 10:47, Fernando Olivero wrote:
To remove the subscription you can evaluate: World announcer initialize.
Maybe the tutorial should add (pesudo code):
MyStuff>>initialize
World announcer
on: WindowOpened
send: #showOnTranscript
to: self
SystemAnnouncer on:#classremove send:#release: to: self.
MyStuff>>release: anAnn
World announcer unsuscribe: self.
MyStuff>>showOnTranscript
Transcript show: 'A new window was opened';cr
I can update the tutorial if people agrees on the pseudo code.
To open a transcript evaluate: TranscriptMorph openWindow
(decoupled Transcript from Morphic, so directly ask the view to open
itself)
Fernando
The old tutorial was weak mainly because it didn't tell you how to
unsubscribe.
Here's a few examples of that:
"Unsubscribe automatically with weak announcements."
World announcer weak
on: WindowOpened
send: #shownOnTranscript
to: self.
Then example in Workspace
obj := self new.
"Open a window, and see Transcript printing"
obj := nil.
"Open a window, you may see Transcript printing (depending on
finalization)"
"Now force finalization"
Smalltalk garbageCollect.
"Open a window, now see no transcript prints."
"Automatically unregister after handling one announcement"
initialize
World announcer
on: WindowOpened
do: [:ann: announcer | self shownOnTranscript.
announcer unsubscribe: self.]
"Unregister specifically after some time"
initialize
World announcer
on: WindowOpened
send: #shownOnTranscript
to: self.
release
World announcer unsubscribe: self.
"Using same action block registered for multiple announcers,
unregister specifially at a specific time"
initialize
handlesAnnoucements := true.
actionBlock:= [:ann :announcer |
handlesAnnouncement
ifTrue: [self shownOnTranscript]
ifFalse: [announcer unsubscribe: self]].
World announcer on: WindowOpened do: actionBlock.
AnnouncerTest announcer on: TestCaseEnded do: actionBlock.
release
handlesAnnouncements := false.