More Fun With AppleScript
Volume Number: 20 (2004)
Issue Number: 2
Column Tag: Programming
Getting Started
by Dave Mark
More Fun With AppleScript
In last month's column, we installed Script Menu to help us organize our scripts, and then started digging into the Finder's AppleScript dictionary. Fantastic stuff! Hopefully, you've had a chance to play. If not, launch Script Editor, select Library from the Window menu, then double-click on the Finder entry in the Library list. A Finder dictionary window should appear.
Click on the line in the left pane labeled Finder Basics. The classes and commands associated with the Finder Basics AppleScript suite will appear (see Figure 1). Notice that the Finder Basics are divided into Properties and Elements. Think of properties as class data and the elements as objects within the class.
Figure 1. The Finder Basics dictionary entries.
For example, go into the Script Editor and type this script:
tell application "Finder"
get name
end tell
When you run this script, here's what appears in the results field:
"Finder"
This is the value of the name property of the Finder. If you are running Panther, here's the result of the command get version:
"10.3"
Here's an interesting one. First, do a get startup disk:
startup disk of application "Finder"
Now do a get name of startup disk:
"Macintosh HD"
See the difference? Startup disk is a reference to the startup disk, whereas name of startup disk is a string containing the name of the startup disk. If you look in Figure 1, you'll see that startup disk is of type disk. The disk class is defined in the Containers and folders suite. The class is shown in Figure 2. Notice that the dictionary shows the plural form of disk as disks. The dictionary also shows the elements and properties of the disk class.
Figure 2. The disk class entries of the Containers and folders suite.
Try the command get format of startup disk. Remember, format is a property of the disk class and startup disk is defined as being of class disk. Here's the result on my Mac:
Mac OS Extended format
Now try get journaling enabled of startup disk. Here's the result:
true
As you might expect, Boolean properties return either true or false. The command get ignore privileges of startup disk returns:
false
Finder Basics - Elements
Go back to Figure 1 and take a look at the elements in the Finder Basics suite. These are the objects that you might expect the Finder to encounter. What do you think the result will be of running this script:
tell application "Finder"
get items
end tell
It helps to have a sense of the item class. An item is basically a generic object - pretty much anything that could exist in a Finder window or on the desktop. Here's the result I got when I ran the script on my Mac:
{startup disk of application "Finder", disk "Macintosh HD" of application
"Finder", folder "AE Monitor 1.0" of desktop of application "Finder", document file
"DSC_0751.JPG" of desktop of application "Finder", folder "InDesign CS Example Scripts"
of desktop of application "Finder", folder "UI Element Inspector" of desktop of application
"Finder", alias file "Warcraft III" of desktop of application "Finder", folder "wedding_pics"
of desktop of application "Finder", document file "Xcode notes" of desktop of application "Finder"}
Look through this list of items. Note the curly braces, necessary to making this a proper list. Take a look at the nomenclature, especially the use of the word "of" all over the place. Think containers/enclosures, items within items within items.
Figure 2 shows the listing of the Finder items suite in a dictionary window. Check out the list of properties. Note that an item has an index. Look in the list of items in the previous list, returned by the get items command. What do you think will happen when I run the command get item 2. Here's my result:
disk "Macintosh HD" of application "Finder"
Figure 3. The item class in the Finder items suite.
As you might expect, get item 2 returns the second item in the list returned by get items. Now, what do you suppose you'd get from this command:
get container of item 2
In my case, I got:
folder "Dave Mark's Computer" of application "Finder"
Brave New Make
So far, all we've done is suck information out of the Finder. Let's try making something.
In the Finder's dictionary window, click on the Commands line in the Standard Suite. The commands supported by all subsequent suites are listed. One of these is the make command. The details are shown in Figure 4.
Figure 4. Details on the make command.
Here's a script to create a new folder at the current insertion location (the desktop).
tell application "Finder"
make new folder with properties {name:"blap"}
end tell
This tells the Finder to create a new folder at the current insertion location (since I didn't specify a new location) with the specified properties. Since I only specified a single property, this will be pretty simple. I ran this script and a new folder named "blap" appeared on my desktop. Here's the result returned by my script:
folder "blap" of folder "Desktop" of folder "davemark" of folder "Users"
of startup disk of application "Finder"
Does this make sense? You can see the containment hierarchy as it walks its way out from the new folder to the top of my hard drive and Finder itself.
Now that "blap" exists, let's try running the script again. Hrm. As you can see in Figure 5, we got an error, telling us that the folder already exists.
Figure 5. An error is reported when I try creating a folder that already exists. Hrm.
Having Script Editor report the error is very useful if you are testing your script or just playing. But if you deliver this script as a compiled entity to a user, you'll want the program to handle the errors itself. Here's a new version of the script:
tell application "Finder"
try
make new folder with properties {name:"blap"}
on error error_message
display dialog error_message
end try
end tell
Running this script produces the dialog shown in Figure 6. Much better. Now the script uses a try block and a corresponding on error block to pass the incoming error message to the display dialog command.
Figure 6. A simple error dialog.
Here's the result of running this script (I clicked the OK button):
{button returned:"OK"}
Till Next Month...
Hopefully, you are getting a bit more familiar with the AppleScript Finder dictionary and the way you can take advantage of properties, elements, and commands. Now that you have a sense of the Finder, open up some other dictionaries. A great one to play with is the TextEdit dictionary. A lovely place to create text elements and copy them to the clipboard for use in other applications. Try your hand at manipulating TextEdit. See what you can do with it.
We will return to AppleScript at some point (I love it too much not to) but next month's column is going back to Cocoa. I am heading down to Atlanta to Aaron Hillegass' Big Nerd Ranch for a week of intensive Cocoa training. I am very excited about this. Model View Controller, Model View Controller. See you next month! J
Dave Mark is a long-time Mac developer and author and has written a number of books on Macintosh development, including Learn C on the Macintosh, Learn C++ on the Macintosh, and The Macintosh Programming Primer series. Be sure to check out Dave's web site at http://www.spiderworks.com.