How to Study a Menu
Last updated at 4:55 pm UTC on 24 March 2008
From ye juan January 18, 2004 How to study a menu
I want to do something about "save a project on local file". In the world menu, the selector is #saveOnFile, however, I can not get anything useful from it.
How to Study a Menu
Open the World menu, and bring up the halo for the save project on file... menu item (meta-click once to get the menu's halo, and again to get the menu item's halo). You can now inspect the menu item by clicking the light grey debug symbol. The inspect window tells you that:
Locate doMenuItem:with: using the Method Finder tool (you'll find it in the Tools flap). This helps you discover that doMenuItem:with: is a method for TheWorldMenu, and that its definition is:
- it is a MenuItemMorph
- its target is TheWorldMenu
- its selector is #doMenuItem:with:
- its arguments are #(#(#myWorld #saveOnFile))
TheWorldMenu>>doMenuItem: aCollection with: event
| realTarget selector nArgs |
selector _ aCollection second.
nArgs _ selector numArgs.
realTarget _ aCollection first.
realTarget == #myWorld ifTrue: [realTarget _ myWorld].
realTarget == #myHand ifTrue: [realTarget _ myHand].
realTarget == #myProject ifTrue: [realTarget _ self projectForMyWorld].
^nArgs = 0
ifTrue:[realTarget perform: selector]
ifFalse:[realTarget perform: selector with: event].
So, when this menu item is selected, this is effectively what happens:
- selector := #saveOnFile
- nArgs := 0
- realTarget := #myWorld
- realTarget := myWorld (this object is a PasteUpMorph, and represents your current world view, which comprises all windows that you have open, etc.)
- myWorld perform: #saveOnFile (this is Object>>perform, and is equivalent to...)
- myWorld saveOnFile (see PasteUpMorph>>saveOnFile)
So, myWorld>>saveOnFile can be called from a program.
Going a bit further, we see that PasteUpMorph>>saveOnFile (for a WorldMorph) executes self project saveAs:
"Forget where stored before, and store. Will ask user where."
So you could get the same effect for the current Project by just doing this:
Project current saveAs
By following the definitions of Project>>storeOnServer further, you will see how it works.