Great! I asked Ben and Igor to think about an announcement chapter for pharo by example vol 2. So this help will be a excellent start. Stef
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.