'From Squeakland 3.8.5976 of 25 August 2004 [latest update: #348] on 1 November 2004 at 11:29:36 am'! "Change Set: triggeringObject-nk Date: 1 November 2004 Author: Ned Konz Adds a new slot to the 'scripting' vocabulary category that will report the object that is triggering a given script, either by triggering an event (user custom or predefined), or directly via triggerScript: or doScript:. Derived Squeakland update 0366triggeringObject-nk, but this version omits all Connectors-specific code"! Notification subclass: #GetTriggeringObjectNotification instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'CustomEvents'! !GetTriggeringObjectNotification commentStamp: '' prior: 0! This is used to report on the sender of #triggerScript:! !Morph methodsFor: '*customevents-scripting' stamp: 'nk 11/1/2004 11:00'! triggerCustomEvent: aSymbol "Trigger whatever scripts may be connected to the custom event named aSymbol" self currentWorld triggerEtoyEvent: aSymbol from: self! ! !Morph methodsFor: '*customevents-scripting' stamp: 'nk 11/1/2004 10:54'! triggerEtoyEvent: aSymbol "Trigger whatever scripts may be connected to the event named aSymbol. If anyone comes back to ask who sent it, return our player." [ self triggerEvent: aSymbol ] on: GetTriggeringObjectNotification do: [ :ex | ex isNested ifTrue: [ ex pass ] ifFalse: [ ex resume: self assuredPlayer ]] ! ! !Morph methodsFor: '*customevents-scripting' stamp: 'nk 11/1/2004 10:58'! triggerEtoyEvent: aSymbol from: aMorph "Trigger whatever scripts may be connected to the event named aSymbol. If anyone comes back to ask who sent it, return aMorph's player." [ self triggerEvent: aSymbol ] on: GetTriggeringObjectNotification do: [ :ex | ex isNested ifTrue: [ ex pass ] ifFalse: [ ex resume: aMorph assuredPlayer ]] ! ! !Morph class methodsFor: '*customevents-user events' stamp: 'nk 11/1/2004 10:14'! additionsToViewerCategoryUserEvents "Answer viewer additions relating to user-defined events for the 'scripting' category" ^(Preferences allowEtoyUserCustomEvents) ifTrue: [ #(scripting ( (command triggerCustomEvent: 'trigger a user-defined (global) event' CustomEvents) (slot triggeringObject 'the object that is triggering an event, either user-defined or pre-defined' Player readOnly Player getTriggeringObject unused unused) )) ] ifFalse: [ #(scripting ( (slot triggeringObject 'the object that is triggering an event, either user-defined or pre-defined' Player readOnly Player getTriggeringObject unused unused))) ] ! ! !PhraseTileMorph methodsFor: '*customevents-scripting' stamp: 'nk 11/1/2004 11:14'! setAsActionInButtonProperties: buttonProperties userScriptSelector ifNil: [ buttonProperties target: self associatedPlayer; actionSelector: #evaluateUnloggedForSelf:; arguments: {self codeString}. ^true ]. buttonProperties target: self objectViewed player; actionSelector: #triggerScript: ; arguments: {userScriptSelector}. ^true "==== or buttonProperties target: (self morphToDropInPasteUp: nil); actionSelector: #tryMe; arguments: #(). ^true ==="! ! !PhraseTileMorph methodsFor: '*customevents-scripting' stamp: 'nk 11/1/2004 11:08'! try "Evaluate the given phrase once" | aPlayer | (userScriptSelector notNil and: [userScriptSelector numArgs = 0]) ifTrue: [aPlayer _ self objectViewed player. aPlayer triggerScript: userScriptSelector] ifFalse: [Compiler evaluate: self codeString for: self associatedPlayer logged: false]! ! !Player methodsFor: '*customevents-custom events' stamp: 'nk 11/1/2004 11:26'! getTriggeringObject "Answer the Player that is triggering the current script, or the default UnscriptedPlayer if none." | rcvr | rcvr := GetTriggeringObjectNotification signal. ^rcvr ifNil: [ self costume presenter standardPlayer ] ifNotNil: [ rcvr isMorph ifTrue: [ rcvr assuredPlayer ] ifFalse: [ rcvr ]]! ! !Player methodsFor: '*customevents-custom events' stamp: 'nk 11/1/2004 10:48'! triggerScript: aSymbol "Perform the script of the given name, which is guaranteed to exist. However, it's possible that the script may still result in a DNU, which will be swallowed and reported to the Transcript." ^ [[self perform: aSymbol] on: GetTriggeringObjectNotification do: [ :ex | ex isNested ifTrue: [ ex pass ] ifFalse: [ ex resume: self ]]] on: MessageNotUnderstood do: [:ex | ScriptingSystem reportToUser: (String streamContents: [:s | s nextPutAll: self externalName; nextPutAll: ': exception in script '; print: aSymbol; nextPutAll: ' : '; print: ex]). ex return: self "ex pass"]! ! !Player methodsFor: '*customevents-scripts-kernel' stamp: 'nk 11/1/2004 11:14'! runScript: aSelector "Called from script-activation buttons. Provides a safe way to run a script that may have changed its name" (self respondsTo: aSelector) ifTrue: [^ self triggerScript: aSelector]. self inform: 'Oops, object "', self externalName, '" no longer has a script named "', aSelector, '". It must have been deleted or renamed.'! !