[Newbies] Re: Modifying tooltips in Squeak
David Corking
lists at dcorking.com
Fri Jan 27 14:04:38 UTC 2012
I think it is neat how succinctly the code creates the triangular
callout pointing to the target.
I found that it was particularly hard to figure out how BalloonMorph
works, because when I put a breakpoint in it, Squeak would usually
freeze and wouldn't respond to the user interrupt.
I am not sure why: I think that by hovering over a morph with a
balloonText, I created a flood of breaks. My alternate hypothesis is
that it somehow blocked the process that gave me control of the hand
pointer.
I just updated my image from 4.3 to trunk, and while the freeze still
occurs, the new image saved a useful SqueakDebug.log file at the
breakpoint.
Have fun!
David
BreakPoint:
27 January 2012 1:57:07.022 pm
VM: Mac OS - Smalltalk
Image: Squeak4.3 [latest update: #11860]
SecurityManager state:
Restricted: false
FileAccess: true
SocketAccess: true
Working Dir /Users/dcorking/Applications/squeak/Squeak4.3
Trusted Dir /foobar/tooBar/forSqueak/bogus
Untrusted Dir /Users/dcorking/Library/Preferences/Squeak/Internet/My Squeak
BalloonMorph class(Object)>>break
Receiver: BalloonMorph
Arguments and temporary variables:
Receiver's instance variables:
superclass: PolygonMorph
methodDict: a
MethodDictionary(#adjustedCenter->(BalloonMorph>>#adjustedCenter
...etc...
format: 172
instanceVariables: #('target' 'offsetFromTarget' 'balloonOwner')
organization: ('accessing' balloonOwner)
('initialization' defaultBorderColor d...etc...
subclasses: nil
name: #BalloonMorph
classPool: a Dictionary(#BalloonColor->(TranslucentColor r: 0.91 g:
0.94 b: 1.0...etc...
sharedPools: nil
environment: Smalltalk globals "a SystemDictionary with lots of globals"
category: #'Morphic-Widgets'
BalloonMorph class>>getVertices:
Receiver: BalloonMorph
Arguments and temporary variables:
t1: 0 at 0 corner: 104 at 14
t2: nil
Receiver's instance variables:
superclass: PolygonMorph
methodDict: a
MethodDictionary(#adjustedCenter->(BalloonMorph>>#adjustedCenter
...etc...
format: 172
instanceVariables: #('target' 'offsetFromTarget' 'balloonOwner')
organization: ('accessing' balloonOwner)
('initialization' defaultBorderColor d...etc...
subclasses: nil
name: #BalloonMorph
classPool: a Dictionary(#BalloonColor->(TranslucentColor r: 0.91 g:
0.94 b: 1.0...etc...
sharedPools: nil
environment: Smalltalk globals "a SystemDictionary with lots of globals"
category: #'Morphic-Widgets'
BalloonMorph class>>string:for:corner:
Receiver: BalloonMorph
Arguments and temporary variables:
str: 'browse class hierarchy'
morph: a PluggableButtonMorphPlus(3898)
cornerName: #bottomLeft
tm: a TextMorph(3026)
vertices: nil
Receiver's instance variables:
superclass: PolygonMorph
methodDict: a
MethodDictionary(#adjustedCenter->(BalloonMorph>>#adjustedCenter
...etc...
format: 172
instanceVariables: #('target' 'offsetFromTarget' 'balloonOwner')
organization: ('accessing' balloonOwner)
('initialization' defaultBorderColor d...etc...
subclasses: nil
name: #BalloonMorph
classPool: a Dictionary(#BalloonColor->(TranslucentColor r: 0.91 g:
0.94 b: 1.0...etc...
sharedPools: nil
environment: Smalltalk globals "a SystemDictionary with lots of globals"
category: #'Morphic-Widgets'
BalloonMorph class>>string:for:
Receiver: BalloonMorph
Arguments and temporary variables:
str: 'browse class hierarchy'
morph: a PluggableButtonMorphPlus(3898)
Receiver's instance variables:
superclass: PolygonMorph
methodDict: a
MethodDictionary(#adjustedCenter->(BalloonMorph>>#adjustedCenter
...etc...
format: 172
instanceVariables: #('target' 'offsetFromTarget' 'balloonOwner')
organization: ('accessing' balloonOwner)
('initialization' defaultBorderColor d...etc...
subclasses: nil
name: #BalloonMorph
classPool: a Dictionary(#BalloonColor->(TranslucentColor r: 0.91 g:
0.94 b: 1.0...etc...
sharedPools: nil
environment: Smalltalk globals "a SystemDictionary with lots of globals"
category: #'Morphic-Widgets'
PluggableButtonMorphPlus(Morph)>>showBalloon:hand:
Receiver: a PluggableButtonMorphPlus(3898)
Arguments and temporary variables:
msgString: 'browse class hierarchy'
aHand: a HandMorph(3216)
w: a PasteUpMorph(1622) [world]
balloon: nil
h: a HandMorph(3216)
Receiver's instance variables:
bounds: 505 at 221 corner: 581 at 243
owner: a PluggablePanelMorph(3222)
submorphs: {an AlignmentMorph(1790)}
fullBounds: 505 at 221 corner: 581 at 243
color: (Color r: 0.906 g: 0.906 b: 0.906)
extension: a MorphExtension (3108) [balloonText] [other:
(layoutPolicy -> a T...etc...
borderWidth: 1
borderColor: Color gray
model: a Browser
label: 'hierarchy'
getStateSelector: nil
actionSelector: #classHierarchy
getLabelSelector: nil
getMenuSelector: nil
shortcutCharacter: nil
askBeforeChanging: false
triggerOnMouseDown: false
offColor: Color white
onColor: Color veryLightGray
feedbackColor: Color red
showSelectionFeedback: false
allButtons: nil
arguments: nil
argumentsProvider: nil
argumentsSelector: nil
style: nil
enabled: true
action: nil
getColorSelector: nil
getEnabledSelector: nil
updateMap: nil
HandMorph>>spawnBalloonFor:
Receiver: a HandMorph(3216)
Arguments and temporary variables:
aMorph: a PluggableButtonMorphPlus(3898)
Receiver's instance variables:
bounds: 549 at 233 corner: 565 at 249
owner: a PasteUpMorph(1622) [world]
submorphs: #()
fullBounds: 549 at 233 corner: 565 at 249
color: Color blue
extension: a MorphExtension (539) [eventHandler = an EventHandler]
mouseFocus: nil
keyboardFocus: nil
eventListeners: nil
mouseListeners: nil
keyboardListeners: a WeakArray(a DockingBarMorph(3368))
mouseClickState: nil
mouseOverHandler: a MouseOverHandler
lastMouseEvent: [549 at 232 549 at 233 mouseMove 177917]
targetOffset: 8 at 4
damageRecorder: a DamageRecorder
cacheCanvas: nil
cachedCanvasHasHoles: true
temporaryCursor: nil
temporaryCursorOffset: nil
hardwareCursor: nil
hasChanged: true
savedPatch: nil
userInitials: ''
lastEventBuffer: #(1 177917 549 233 0 0 0 1)
genieGestureProcessor: nil
keyboardInterpreter: a MacUnicodeInputInterpreter
MorphicAlarm(MessageSend)>>value
Receiver: MorphicAlarm(#spawnBalloonFor: -> a HandMorph(3216))
Arguments and temporary variables:
Receiver's instance variables:
receiver: a HandMorph(3216)
selector: #spawnBalloonFor:
arguments: {a PluggableButtonMorphPlus(3898)}
scheduledTime: 178460
sequenceNumber: 1951
numArgs: 1
MorphicAlarm>>value:
Receiver: MorphicAlarm(#spawnBalloonFor: -> a HandMorph(3216))
Arguments and temporary variables:
anArgument: 178466
nArgs: 1
Receiver's instance variables:
receiver: a HandMorph(3216)
selector: #spawnBalloonFor:
arguments: {a PluggableButtonMorphPlus(3898)}
scheduledTime: 178460
sequenceNumber: 1951
numArgs: 1
[] in WorldState>>triggerAlarmsBefore:
Receiver: a WorldState
Arguments and temporary variables:
nowTime: a MorphicAlarmQueue()
pending: 178466
Receiver's instance variables:
hands: {a HandMorph(3216)}
activeHand: a HandMorph(3216)
viewBox: 0 at 0 corner: 800 at 600
canvas: a FormCanvas on: DisplayScreen(800x600x32)
damageRecorder: a DamageRecorder
stepList: a Heap(StepMessage(#stepAt: -> a ClockMorph(3002)'1:57:06
pm')(a Cloc...etc...
lastStepTime: 178446
lastStepMessage: nil
lastCycleTime: 178511
commandHistory: a CommandHistory
alarms: a MorphicAlarmQueue()
lastAlarmTime: 178446
remoteServer: nil
multiCanvas: nil
[] in WorldState>>lockAlarmsDuring:
Receiver: a WorldState
Arguments and temporary variables:
actionBlock: [closure] in WorldState>>triggerAlarmsBefore:
Receiver's instance variables:
hands: {a HandMorph(3216)}
activeHand: a HandMorph(3216)
viewBox: 0 at 0 corner: 800 at 600
canvas: a FormCanvas on: DisplayScreen(800x600x32)
damageRecorder: a DamageRecorder
stepList: a Heap(StepMessage(#stepAt: -> a ClockMorph(3002)'1:57:06
pm')(a Cloc...etc...
lastStepTime: 178446
lastStepMessage: nil
lastCycleTime: 178511
commandHistory: a CommandHistory
alarms: a MorphicAlarmQueue()
lastAlarmTime: 178446
remoteServer: nil
multiCanvas: nil
BlockClosure>>ensure:
Receiver: [closure] in WorldState>>lockAlarmsDuring:
Arguments and temporary variables:
aBlock: [closure] in [] in Mutex>>critical:
complete: nil
returnValue: nil
Receiver's instance variables:
outerContext: WorldState>>lockAlarmsDuring:
startpc: 40
numArgs: 0
[] in Mutex>>critical:
Receiver: a Mutex
Arguments and temporary variables:
aBlock: [closure] in WorldState>>lockAlarmsDuring:
activeProcess: a Process in nil
Receiver's instance variables:
semaphore: a Semaphore(a Process in [] in Semaphore>>critical:)
owner: a Process in nil
[] in Semaphore>>critical:
Receiver: a Semaphore(a Process in [] in Semaphore>>critical:)
Arguments and temporary variables:
mutuallyExcludedBlock: [closure] in Mutex>>critical:
caught: #(true)
Receiver's instance variables:
firstLink: a Process in [] in Semaphore>>critical:
lastLink: a Process in [] in Semaphore>>critical:
excessSignals: 0
BlockClosure>>ensure:
Receiver: [closure] in Semaphore>>critical:
Arguments and temporary variables:
aBlock: [closure] in Semaphore>>critical:
complete: nil
returnValue: nil
Receiver's instance variables:
outerContext: Semaphore>>critical:
startpc: 38
numArgs: 0
Semaphore>>critical:
Receiver: a Semaphore(a Process in [] in Semaphore>>critical:)
Arguments and temporary variables:
mutuallyExcludedBlock: [closure] in Mutex>>critical:
caught: #(true)
Receiver's instance variables:
firstLink: a Process in [] in Semaphore>>critical:
lastLink: a Process in [] in Semaphore>>critical:
excessSignals: 0
Mutex>>critical:
Receiver: a Mutex
Arguments and temporary variables:
aBlock: [closure] in WorldState>>lockAlarmsDuring:
activeProcess: a Process in nil
Receiver's instance variables:
semaphore: a Semaphore(a Process in [] in Semaphore>>critical:)
owner: a Process in nil
WorldState>>lockAlarmsDuring:
Receiver: a WorldState
Arguments and temporary variables:
actionBlock: [closure] in WorldState>>triggerAlarmsBefore:
Receiver's instance variables:
hands: {a HandMorph(3216)}
activeHand: a HandMorph(3216)
viewBox: 0 at 0 corner: 800 at 600
canvas: a FormCanvas on: DisplayScreen(800x600x32)
damageRecorder: a DamageRecorder
stepList: a Heap(StepMessage(#stepAt: -> a ClockMorph(3002)'1:57:06
pm')(a Cloc...etc...
lastStepTime: 178446
lastStepMessage: nil
lastCycleTime: 178511
commandHistory: a CommandHistory
alarms: a MorphicAlarmQueue()
lastAlarmTime: 178446
remoteServer: nil
multiCanvas: nil
WorldState>>triggerAlarmsBefore:
Receiver: a WorldState
Arguments and temporary variables:
nowTime: 178466
Receiver's instance variables:
hands: {a HandMorph(3216)}
activeHand: a HandMorph(3216)
viewBox: 0 at 0 corner: 800 at 600
canvas: a FormCanvas on: DisplayScreen(800x600x32)
damageRecorder: a DamageRecorder
stepList: a Heap(StepMessage(#stepAt: -> a ClockMorph(3002)'1:57:06
pm')(a Cloc...etc...
lastStepTime: 178446
lastStepMessage: nil
lastCycleTime: 178511
commandHistory: a CommandHistory
alarms: a MorphicAlarmQueue()
lastAlarmTime: 178446
remoteServer: nil
multiCanvas: nil
WorldState>>runLocalStepMethodsIn:
Receiver: a WorldState
Arguments and temporary variables:
aWorld: a PasteUpMorph(1622) [world]
now: 178466
morphToStep: nil
stepTime: nil
priorWorld: a PasteUpMorph(1622) [world]
Receiver's instance variables:
hands: {a HandMorph(3216)}
activeHand: a HandMorph(3216)
viewBox: 0 at 0 corner: 800 at 600
canvas: a FormCanvas on: DisplayScreen(800x600x32)
damageRecorder: a DamageRecorder
stepList: a Heap(StepMessage(#stepAt: -> a ClockMorph(3002)'1:57:06
pm')(a Cloc...etc...
lastStepTime: 178446
lastStepMessage: nil
lastCycleTime: 178511
commandHistory: a CommandHistory
alarms: a MorphicAlarmQueue()
lastAlarmTime: 178446
remoteServer: nil
multiCanvas: nil
--- The full stack ---
BalloonMorph class(Object)>>break
BalloonMorph class>>getVertices:
BalloonMorph class>>string:for:corner:
BalloonMorph class>>string:for:
PluggableButtonMorphPlus(Morph)>>showBalloon:hand:
HandMorph>>spawnBalloonFor:
MorphicAlarm(MessageSend)>>value
MorphicAlarm>>value:
[] in WorldState>>triggerAlarmsBefore:
[] in WorldState>>lockAlarmsDuring:
BlockClosure>>ensure:
[] in Mutex>>critical:
[] in Semaphore>>critical:
BlockClosure>>ensure:
Semaphore>>critical:
Mutex>>critical:
WorldState>>lockAlarmsDuring:
WorldState>>triggerAlarmsBefore:
WorldState>>runLocalStepMethodsIn:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
WorldState>>runStepMethodsIn:
PasteUpMorph>>runStepMethods
WorldState>>doOneCycleNowFor:
WorldState>>doOneCycleFor:
PasteUpMorph>>doOneCycle
[] in Project class>>spawnNewProcess
[] in BlockClosure>>newProcess
More information about the Beginners
mailing list