TweetFollow Us on Twitter

An Introduction to Handlers

Volume Number: 21 (2005)
Issue Number: 2
Column Tag: Programming

AppleScript Essentials

by Benjamin S. Waldie

An Introduction to Handlers

In a previous article, you may remember that we discussed methods of writing AppleScripts to watch folders for incoming items to process. In each of the methods we discussed, we made use of handlers. This month, we are going to explore handlers in more depth. Since handlers are a fairly complex subject, the full scope of handlers will not be covered in this month's article. Rather, we will cover the basics of handlers. In future articles, we will discuss handlers in more detail.

What is a Handler?

A handler is a group of one or more AppleScript statements that are associated with a single command. As we will discuss, some handlers are user defined, and some are application, or system defined.

Once the command associated with a handler is invoked, the statements within that handler will execute. Handlers allow you to group your code into logical "chunks," which may be triggered, or called, over and over again within a script. By carefully constructing your handlers, you can make scripts very modular, giving you the ability to break the scripts apart and reuse the handlers again in future scripts. Many AppleScript developers store their handlers in code libraries. These libraries can then be loaded, and handlers within them can be triggered from other scripts.

Anatomy of a Handler

Let's take a look at a basic handler. The following handler may be used to display a basic dialog message.

on displayDialog()
   display dialog "This is code within a handler."
end displayDialog

Now, let's break handlers down into different parts, and examine how they are constructed.

Handler Definition

A handler definition refers to the handler itself. The following would be considered the handler definition from the previous example.

on displayDialog()
   display dialog "This is code within a handler."
end displayDialog

A handler definition always begins with the word on or to, which indicates to AppleScript that it is the beginning of a handler. In the example above, I chose to begin my handler with the word on. However, the method you choose to use is entirely at your discretion. You should use whichever word looks more acceptable to you.

The next part of the handler definition is the name of the handler, followed by any parameters to be passed to the handler by the script. For example:

displayDialog()

In many cases, you may need to pass information to a handler to be processed. To allow for this, handlers support input parameters. Handlers also have the ability to return data back to the script. For example, a handler may return a true/false value indicating whether or not it was successfully processed.

There are a couple different methods that you can use to specify input parameters, and we will discuss them shortly. In the previous example, the empty parentheses indicate that my handler does not require any parameters.

Following the first line of a handler definition are any AppleScript statements that should be executed by the handler. You may write as few or as many statements as you need, keeping in mind that they will not execute until the handler is called.

The final line of a handler definition always begins with the word end, followed by the name of the handler.

end displayDialog

To save time when writing a handler, you may write the word end, and when you compile your code, the handler name will automatically be inserted for you.

Handler Call

To call a handler from within a script, you must specify the name of the handler, followed by values for all of its parameters. The following is the call for the previous handler example:

displayDialog()

We'll look at calling handlers that use parameters shortly, as we explore parameters.

If you need to call a handler from within an application tell block, you must specify of me after the handler call, to indicate that the handler is to be addressed within the script, and not within the application. For example:

tell application "Finder"
   displayDialog() of me
end tell

Parameters

As previously mentioned, the first line of a handler contains the handler name, followed by any parameters to be passed into the handler. A parameter is a variable that is named in the handler definition, and is assigned a value when the handler is called. When calling a handler, all parameters are required, and must be specified. Handlers do not allow optional parameters.

There are two types of parameters that may follow a handler name - labeled parameters and positional parameters.

Labeled Parameters

Labeled parameters are parameters that are associated with labels in the handler definition. When the handler is called, these labels are used to determine which parameters are which. Therefore, when working with labeled parameters, you may pass the parameters through your handler call in any order you wish, so long as they correspond with the correct labels. The exception to this rule is that, in some cases, you may choose to assign a direct parameter, which is required to fall immediately after the handler name.

There are two ways that you can assign labeled parameters in a handler. The first is to assign the parameters using one of the following predefined labels: about, above, against, apart from, around, aside from, at, below, beneath, beside, between, by, for, from, instead of, into, on, onto, out of, over, since, through, thru, under. The label of may also be used, though only to define a direct parameter. If you add a direct parameter, using the label of, then you are required to have at least one or more additional parameters. The following is an example of a handler with labeled parameters:

to displayDialog of theText above theButtons aside from theIconNumber
   display dialog theText buttons theButtons with icon theIconNumber
end displayDialog

In the example above, the parameter theText is a direct parameter, as indicated by the label of. The parameter theButtons is associated with the label above, and the parameter theIconNumber is associated with the label aside from. The handler above would be called using the following line of code:

displayDialog of "Hello" above {"OK"} aside from 1

Again, since labeled parameters are associated with their labels, then you can rearrange the non-direct parameters, if desired. For example, the following handler call would function identically as the previous one:

displayDialog of "Hello" aside from 1 above {"OK"}

Another way to assign labeled parameters is to use custom labels. This is done by creating label definitions in the format labelName:parameterName, separating them by commas, and preceding them with the label given. Custom labeled parameters must follow any predefined label parameters. An example of a handler with custom labeled parameters is the following:

to displayDialog of theText given someButtons:theButtons, someIconNumber:theIconNumber
   display dialog theText buttons theButtons with icon theIconNumber
end displayDialog

In the example above, the parameter theText is a direct parameter, preceded by a predefined label. The remaining parameters are custom labeled parameters. The parameter theButtons is associated with the custom label someButtons, and the parameter theIconNumber is associated with the custom label someIconNumber. This handler can be called using the following line of code:

displayDialog of "Hello" given someButtons:{"OK"}, someIconNumber:1

Again, since this handler makes use of labeled parameters, the non-direct parameters may be rearranged, if desired:

displayDialog of "Hello" given someIconNumber:1, someButtons:{"OK"}

Positional Parameters

Another type of parameter that you can use when defining a handler is a positional parameter. Positional parameters are separated by commas, and do not contain any labels. Because they do not contain labels, they are identified by their position in the handler definition. Therefore, they must be listed in the same position when the handler is called. The following is an example of a handler that makes use of positional parameters:

on displayDialog(theText, theButtons, theIconNumber)
   display dialog theText buttons theButtons with icon theIconNumber
end displayDialog

The handler above may be called using the following line of code:

displayDialog("Hello", {"OK"}, 1)

Return Value

In some cases, a handler may return a value to the script that called it. This value may be placed into a variable for later usage. By default, a handler will return the result of the last AppleScript statement that executes within the handler, assuming that this statement produces a result. If desired, you may configure your handler to return a different value. For example, the following code returns the name of the button clicked in the dialog.

set theChoice to displayDialog()

on displayDialog()
   display dialog "Would you like to continue processing?" buttons {"Yes", "No"}
   return button returned of result
end displayDialog

Next, I could add additional code at the root level of my script to check the button that was clicked, now stored in a variable called theChoice, and take the appropriate course of action.

Within a handler, you may return a value at any time to cease further execution of that handler, or you may return no value to cease execution without returning a specific value. For example, the following handler will stop processing, returning no value, if the user clicks the "No" button.

displayDialog()

on displayDialog()
   display dialog "Would you like to continue processing?" buttons {"Yes", "No"}
   set theChoice to button returned of result
   if theChoice = "No" then return
   display dialog "Continuing..."
end displayDialog

Types of Handlers

There are two types of handlers in AppleScript - subroutine handlers and command handlers.

Subroutine Handlers

Subroutine handlers are groups of statements, which are defined by the developer, and called throughout a script, or from another script. Subroutines can be extremely useful if you need to perform the same exact task over and over throughout your script. For example, let's say that you need to display an informational dialog to the user 10 times throughout your script to let the user know what is occurring.

display dialog "Beginning next task..." buttons {"*"} 
   default button "*" with icon 1 giving up after 3

To display the above dialog 10 times, I could write out all of this code 10 times - or, I could write a handler 1 time.

on displayNextTaskMessage()
   display dialog "Beginning next task..." buttons {"*"} default 
      button "*" with icon 1 giving up after 3
end displayNextTaskMessage

Once written, this handler can be triggered from anywhere within my script. Rather than writing the entire lengthy line of display dialog code each time I need to display the dialog to the user, I can call my handler instead. The following code would call the displayNextTaskMessage handler.

displayNextTaskMessage()

In the example above, you may be wondering where the handler name "displayNewTaskMessage" came from. This is something that I defined myself when writing the handler. Remember, since subroutine handlers are defined by a developer, their names are user definable. So, I could have named this handler anything I wanted, as long as it was not the name of another existing handler in my script.

Command Handlers

A command handler is a group of statements that is triggered by a specific application or system related event.

Every AppleScript application contains an implied run handler. Any AppleScript statements at the top level of the script, excluding global variables, properties, other handlers, and script objects, fall within that run handler. If you prefer to make the run handler visible in your code, you may wrap these statements within an on run handler call. When the script is run, both methods will behave identically. For example, each of the examples below will perform the exact same function:

Example 1:

display dialog "Hello!"

Example 2:

on run
   display dialog "Hello!"
end run

As you can see, any code within the run handler of a script will be executed whenever the script is run. However, in some cases, you may want to execute code when other types of actions occur within your script.

The open handler may be used to initiate specific code when items are dragged and dropped onto a script in the Finder. For example:

on open theDroppedItems
   -- Process the items
end open

By adding an open handler into a script, and then saving that script as an application, the script will automatically accept dropped files and folders. It will also receive a new icon, indicating that it is now a drop script.

In the previous example code, the parameter theDroppedItems will contain a list of paths to any items dropped onto the script. If you want your script to only process folders, then you would need to add custom code within the open handler to determine which dropped items were folders, and process only these items.

Two other types of command handlers that may be added to an AppleScript application are the idle handler and the quit handler.

An idle handler is particularly useful when creating stay open AppleScript applications. In a stay open AppleScript application, by default, AppleScript will send the script an idle command every 30 seconds. At that time, any code within the idle handler will execute. For example, if I save the following code as a stay opened AppleScript application, and trigger it, the script will beep every 30 seconds:

on idle
   beep
end idle

Though the default time period between idle messages is 30 seconds, I can change this behavior if desired, by returning an integer value indicating how many seconds of a delay should occur before the next idle. In the following example, the script would beep every 10 seconds.

on idle
   beep
   return 10
end idle

The quit handler may be used in order to execute code when the script quits, whether manually quit by the user or not.

on quit
   display dialog "Task complete."
end quit

Example Handlers

Now that we have covered the basics of handlers, let's take a look at some example handlers, which may be useful to you as you write scripts in the future. Each of these handlers has been written generically, so that you can use it in virtually any script in the future.

The following handler will make a new folder in a specified output folder, using a specified name:

on makeNewFolder(theNewFolderName, theOutputFolder)
   tell application "Finder" to make new folder at folder theOutputFolder with properties 
      {name:theNewFolderName}
end makeNewFolder

The following handler will delete a folder of a file:

on moveItemToTrash(theItemPath)
   tell application "Finder" to delete item theItemPath
end moveItemToTrash

The following handler will mount an afp volume:

on mountVolume(theVolumeName, theServerIPAddress, theUserName, thePassword)
   mount volume "afp://" & theUserName & ":" & thePassword & "@" & theServerIPAddress 
      & "/" & theVolumeName as string
end mountVolume

In Closing

Again, handlers are a fairly complex aspect of AppleScript development for many users. Today, I use them regularly, and I try to make them as modular as possible. My theory is that if I write code to perform a specific task, such as opening a document in QuarkXPress, then I don't want to ever write that code again. Rather, I store the handler for later usage in future scripts, and the next time I need to perform the task, which could be a year down the line, I simply add the handler into my new script.

I encourage you to begin using handlers more in your scripting, as it will benefit you greatly. We'll discuss other aspects of handlers in more detail in future articles. In the meantime, for additional information about handlers, you may want to check out an AppleScript book, or browse the AppleScript Language Guide at <http://developer.apple.com/documentation/AppleScript/>.

Until next time, keep scripting!


Benjamin Waldie is president of Automated Workflows, LLC, a firm specializing in AppleScript and workflow automation consulting. In addition to his role as a consultant, Benjamin is an evangelist of AppleScript, and can frequently be seen presenting at Macintosh User Groups, Seybold Seminars, and MacWorld. For additional information about Benjamin, please visit http://www.automatedworkflows.com, or email Benjamin at applescriptguru@mac.com.

 
AAPL
$96.52
Apple Inc.
-0.67
MSFT
$44.60
Microsoft Corpora
-0.28
GOOG
$595.03
Google Inc.
-0.95

MacTech Search:
Community Search:

Software Updates via MacUpdate

Airfoil 4.8.7 - Send audio from any app...
Airfoil allows you to send any audio to AirPort Express units, Apple TVs, and even other Macs and PCs, all in sync! It's your audio - everywhere. With Airfoil you can take audio from any... Read more
Microsoft Remote Desktop 8.0.8 - Connect...
With Microsoft Remote Desktop, you can connect to a remote PC and your work resources from almost anywhere. Experience the power of Windows with RemoteFX in a Remote Desktop client designed to help... Read more
xACT 2.30 - Audio compression toolkit. (...
xACT stands for X Aaudio Compression Toolkit, an application that encodes and decodes FLAC, SHN, Monkey’s Audio, TTA, Wavpack, and Apple Lossless files. It also can encode these formats to MP3, AAC... Read more
Firefox 31.0 - Fast, safe Web browser. (...
Firefox for Mac offers a fast, safe Web browsing experience. Browse quickly, securely, and effortlessly. With its industry-leading features, Firefox is the choice of Web development professionals... Read more
Little Snitch 3.3.3 - Alerts you to outg...
Little Snitch gives you control over your private outgoing data. Track background activityAs soon as your computer connects to the Internet, applications often have permission to send any... Read more
Thunderbird 31.0 - Email client from Moz...
As of July 2012, Thunderbird has transitioned to a new governance model, with new features being developed by the broader free software and open source community, and security fixes and improvements... Read more
Together 3.2 - Store and organize all of...
Together helps you organize your Mac, giving you the ability to store, edit and preview your files in a single clean, uncluttered interface. Smart storage. With simple drag-and-drop functionality,... Read more
Cyberduck 4.5 - FTP and SFTP browser. (F...
Cyberduck is a robust FTP/FTP-TLS/SFTP browser for the Mac whose lack of visual clutter and cleverly intuitive features make it easy to use. Support for external editors and system technologies such... Read more
iExplorer 3.4 - View and transfer all th...
iExplorer is an iPhone browser for Mac lets you view the files on your iOS device. By using a drag and drop interface, you can quickly copy files and folders between your Mac and your iPhone or... Read more
Airmail 1.4 - Powerful, minimal email cl...
Airmail is a powerful, minimal mail client.It was designed to retain the same experience with a single or multiple accounts and provide a quick, modern and easy-to-use user experience. Airmail... Read more

Latest Forum Discussions

See All

Revolution 60 Review
Revolution 60 Review By Jordan Minor on July 24th, 2014 Our Rating: :: LASS EFFECTUniversal App - Designed for iPhone and iPad Revolution 60 is a bold, cinematic action game with ambition to spare.   | Read more »
Matter (Photography)
Matter 1.0.1 Device: iOS Universal Category: Photography Price: $1.99, Version: 1.0.1 (iTunes) Description: Add stunning 3D effects to your photos with real-time shadows and reflections. Export your creations as photos or video loops... | Read more »
Fanatic Earth Review
Fanatic Earth Review By Brittany Vincent on July 24th, 2014 Our Rating: :: BY-THE-NUMBERSUniversal App - Designed for iPhone and iPad Kemco’s stable of mobile RPGs grows, but in Fanatic Earth’s situation it’s a case of quantity... | Read more »
Together for iOS (Productivity)
Together for iOS 1.0 Device: iOS Universal Category: Productivity Price: $9.99, Version: 1.0 (iTunes) Description: Together is an app for keeping things in one place. Notes, documents, images, movies, sounds, web pages and bookmarks... | Read more »
The Phantom PI Mission Apparition (Game...
The Phantom PI Mission Apparition 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: ** Release sale! 50% off for a limited time! ** The Phantom PI Mission Apparition is a spooky, puzzly, rock’... | Read more »
The Great Prank War (Games)
The Great Prank War 1.0.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0.0 (iTunes) Description: Help Mordecai, Rigby, Muscle Man and Skips take the park back from Gene and his goons with a plethora of prank-related... | Read more »
Teenage Mutant Ninja Turtles (Games)
Teenage Mutant Ninja Turtles 1.0.0 Device: iOS Universal Category: Games Price: $3.99, Version: 1.0.0 (iTunes) Description: Download the all new Teenage Mutant Ninja Turtles Official Movie Game! | Read more »
Dream Revenant (Games)
Dream Revenant 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: EXCLUSIVE LAUNCH PRICE ! Dream Revenant is at $1.99 for a limited time ! | Read more »
Traps n' Gemstones (Games)
Traps n' Gemstones 1.00 Device: iOS Universal Category: Games Price: $2.99, Version: 1.00 (iTunes) Description: LAUNCH SALE! 40% off, JULY ONLY! TRAPS N' GEMSTONES is an adventurous platform game, among gamers typically known as the... | Read more »
Soccer Physics (Games)
Soccer Physics 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: One-button soccer game! So dumb it's fun. "Soccer Physics is probably the funniest football game you'll play on iOS" —... | Read more »

Price Scanner via MacPrices.net

What Should Apple’s Next MacBook Priority Be;...
Stabley Times’ Phil Moore says that after expanding its iMac lineup with a new low end model, Apple’s next Mac hardware decision will be how it wants to approach expanding its MacBook lineup as well... Read more
ArtRage For iPhone Painting App Free During C...
ArtRage for iPhone is currently being offered for free (regularly $1.99) during Comic-Con San Diego #SDCC, July 24-27, in celebration of the upcoming ArtRage 4.5 and other 64-bit versions of the... Read more
With The Apple/IBM Alliance, Is The iPad Now...
Almost since the iPad was rolled out in 2010, and especially after Apple made a 128 GB storage configuration available in 2012, there’s been debate over whether the iPad is a serious tool for... Read more
MacBook Airs on sale starting at $799, free s...
B&H Photo has the new 2014 MacBook Airs on sale for up to $100 off MSRP for a limited time. Shipping is free, and B&H charges NY sales tax only. They also include free copies of Parallels... Read more
Apple 27″ Thunderbolt Display (refurbished) a...
The Apple Store has Apple Certified Refurbished 27″ Thunderbolt Displays available for $799 including free shipping. That’s $200 off the cost of new models. Read more
WaterField Designs Unveils Cycling Ride Pouch...
High end computer case and bag maker WaterField Designs of San Francisco now enters the cycling market with the introduction of the Cycling Ride Pouch – an upscale toolkit with a scratch-free iPhone... Read more
Kingston Digital Ships Large Capacity Near 1T...
Kingston Digital, Inc., the Flash memory affiliate of Kingston Technology Company, Inc.,has announced its latest addition to the SSDNow V300 series, the V310. The Kingston SSDNow V310 solid-state... Read more
Apple’s Fiscal Third Quarter Results; Record...
Apple has announced financial results for its fiscal 2014 third quarter ended June 28, 2014, racking up quarterly revenue of $37.4 billion and quarterly net profit of $7.7 billion, or $1.28 per... Read more
15-inch 2.0GHz MacBook Pro Retina on sale for...
B&H Photo has the 15″ 2.0GHz Retina MacBook Pro on sale for $1829 including free shipping plus NY sales tax only. Their price is $170 off MSRP. B&H will also include free copies of Parallels... Read more
Apple restocks refurbished Mac minis for up t...
The Apple Store has restocked Apple Certified Refurbished Mac minis for up to $150 off the cost of new models. Apple’s one-year warranty is included with each mini, and shipping is free: - 2.5GHz Mac... Read more

Jobs Board

Sr Software Lead Engineer, *Apple* Online S...
Sr Software Lead Engineer, Apple Online Store Publishing Systems Keywords: Company: Apple Job Code: E3PCAK8MgYYkw Location (City or ZIP): Santa Clara Status: Full Read more
Senior Interaction Designer, *Apple* Online...
**Job Summary** Apple is looking for a hands on Senior…will be a key player in designing for the Apple Online Store. The ideal designer will have a Read more
*Apple* Sales Chat Rep - Apple (United State...
…is looking for motivated, outgoing, and tech savvy individuals who want to offer Apple Customers an unparalleled customer experience over chat. At Apple , we believe Read more
Mac Expert - *Apple* Online Store Mexico -...
…MUST be fluent in English and Spanish to be considered for this position At Apple , we believe that hard work, a fun environment, creativity and innovation fuel the Read more
*Apple* Industrial Design CAD Sculptor - App...
**Job Summary** The Apple Industrial Design team is looking for a CAD sculptor/Digital 3D modeler to create high quality CAD models used in the industrial design process Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.