'From etoys2.3 of 3 December 2007 [latest update: #1816] on 3 December 2007 at 5:09:15 pm'! "Change Set: autoBadge-bf Date: 30 November 2007 Author: Bert Freudenberg Automatically pop up badges as buddies join and leave. Needs 3.9.12olpc4 VM to work properly"! !SugarLauncher methodsFor: 'running' stamp: 'bf 11/29/2007 18:05'! startUp self class allInstances do: [:ea | ea shutDown]. Current := self. parameters at: 'ACTIVITY_ID' ifPresent: [ :activityId | World windowEventHandler: self. process := [self runDBusService: 'org.laptop.Activity', activityId] forkAt: Processor userInterruptPriority named: 'Sugar DBus service'. Utilities authorName: self ownerBuddy nick. ServerDirectory addServer: (SugarDatastoreDirectory mimetype: 'application/x-squeak-project' extension: '.pr') named: SugarLauncher defaultDatastoreDirName. sharedActivity := self getSharedActivityById: activityId. sharedActivity ifNotNil: [self join]. self isShared ifFalse: [ parameters at: 'OBJECT_ID' ifPresent: [:id | ^self resumeJournalEntry: id]]. Project current projectParameterAt: #sugarAutoSave put: true. self createJournalEntryFor: Project current filename: '' mimetype: ''. self isShared ifTrue: [^self]. ^self welcome: (parameters at: 'URI' ifAbsent: [''])]. self welcome: '' ! ! !SugarLauncher methodsFor: 'commands' stamp: 'bf 11/30/2007 19:15'! join "join a shared activity on startup" Utilities informUser: 'Joining activity ...' translated during: [ self joinSharedActivity. sharedActivity ifNotNil: [ SugarNavigatorBar current ifNotNilDo: [:bar | bar joinSharedActivity]]. self makeBadges. self enableSharedActivitySignals. ]. ! ! !SugarLauncher methodsFor: 'commands' stamp: 'bf 11/30/2007 18:28'! share sharedActivity ifNotNil: [^self]. sharedActivity := self shareActivityId: (parameters at: 'ACTIVITY_ID') bundleId: (parameters at: 'BUNDLE_ID') name: (self titleFromProject: Project current) squeakToUtf8 properties: Dictionary new. "due to bug 4660 we can't pass properties directly" self enableSharedActivitySignals. self setSharedActivityProperties: ({'private' -> false} as: Dictionary).! ! !SugarLauncher methodsFor: 'dbus' stamp: 'bf 11/30/2007 18:37'! handleBuddyJoined: dbusSignal | buddyPath | buddyPath := dbusSignal arguments first fromDBusArgument. WorldState addDeferredUIMessage: [self buddyJoined: (self buddyFromPath: buddyPath)]. ! ! !SugarLauncher methodsFor: 'dbus' stamp: 'bf 11/30/2007 18:37'! handleBuddyLeft: dbusSignal | buddyPath | buddyPath := dbusSignal arguments first fromDBusArgument. WorldState addDeferredUIMessage: [self buddyLeft: (self buddyFromPath: buddyPath)]. ! ! !SugarLauncher methodsFor: 'presence' stamp: 'bf 11/30/2007 19:48'! badgeHolder "This should find or create a flap to hold badges, and answer it" | holder | holder := World submorphWithProperty: #sugarBuddyHolder. holder ifNotNil: [^holder]. holder := Morph new. holder name: 'Buddies' translated. holder setProperty: #sugarBuddyHolder toValue: true. holder layoutPolicy: TableLayout new. holder color: Color orange muchLighter; listDirection: #topToBottom; hResizing: #shrinkWrap; vResizing: #shrinkWrap; cellInset: 10; layoutInset: 10. holder center: ActiveWorld center. holder openInWorld. ^holder! ! !SugarLauncher methodsFor: 'presence' stamp: 'bf 11/30/2007 18:57'! buddyJoined: buddy self badgeHolder addMorph: buddy makeBadge! ! !SugarLauncher methodsFor: 'presence' stamp: 'bf 12/3/2007 16:53'! buddyLeft: buddy | holder badge | holder := self badgeHolder. badge := holder submorphs detect: [:m | (m isKindOf: EToySenderMorph) and: [m userName = buddy nick]] ifNone: [^self]. badge delete. holder hasSubmorphs ifFalse: [holder delete]! ! !SugarLauncher methodsFor: 'presence' stamp: 'bf 11/29/2007 17:59'! enableSharedActivitySignals sharedActivity ifNil: [^self]. self dbusSignalRegistry do: [:interfaceSpec | interfaceSpec first = 'org.laptop.Sugar.Presence.Activity' ifTrue: [ interfaceSpec second do: [:signalSpec | dbus addMatch: { #type. 'signal'. #path. sharedActivity. #interface. interfaceSpec first. #member. signalSpec first}]]]. ! ! !SugarLauncher methodsFor: 'presence' stamp: 'bf 11/30/2007 19:16'! makeBadges | holder | holder := self badgeHolder. (self buddies asSortedCollection: [:a :b | a nick < b nick]) do: [:buddy | buddy isOwner ifFalse: [holder addMorph: buddy makeBadge]]. ! !