MPW Menus
Volume Number: 9
Issue Number: 10
Column Tag: MPW Workshop
Dynamically Customizable Menu in MPW
Launching applications from an MPW Script
By Lee D. Rimar, Absoft Corporation
Note: Source code files accompanying article are located on MacTech CD-ROM or
source code disks.
When I first started programming on the Macintosh, the text editor I used had a
“Transfer” menu for launching other applications. When I switched to MPW a few
years ago, I missed this feature. This was before the advent of System 7 with its
“Apple Menu Items” folder, so I had to create my own solution.
Because it is easy to add custom menus to MPW, I created a special “Run” menu.
This menu initially had only 2 items: “Add Application...” and “Add Document...”.
These let you add commonly used applications and documents to the Run menu.
Each of the “Add...” items also updates a UserStartup•RunMenu file, which
reloads the menu each time you launch MPW. Apart from its general usefulness, there
is a technically interesting side to this script. To keep the Run menu in alphabetical
order, the UserStartup•RunMenu file is automatically sorted, rewritten, and executed
every time you add an item to Run menu. You don’t often see “self-modifying”
gymnastics like this in a scripting language.
I usually use the Run menu to launch my word processor or communications
software with a specific setting file, from inside of MPW. I could do the same thing
from the System 7 Apple menu, but I find the Run menu easier to maintain. Also, I
sometimes intentionally kill the Finder under System 7 to get extra memory for MPW
and other programs. Without Finder running, custom items on the Apple Menu are
unavailable.
To create your own Run menu and UserStartup•RunMenu file, the MPW script
below should be copied to your MPW folder as “NewRunMenu,” and executed just once.
# Script: NewRunMenu
# A dynamically customizable menu for sublaunching commonly used
files.
# To install, type NewRunMenu in the Worksheet window and hit Enter.
# This adds a "Run" menu to the MPW menu bar. It also creates a file
called
# UserStartup•RunMenu in the MPW folder (or the MPW PrefsFolder, if
using MPW
# 3.3 or newer), to re-create the menu each time you load MPW.
# UserStartup•RunMenu is updated every time you add an item to the
menu
# When you select Add Application, you can choose any application and
specify
# how it should appear on the menu. When you select Add Document,
you can
# select a document, an application to open it with, and how it
should
# appear on the menu.
# The Run menu does not provide for DELETING an item. To do that,
open the
# UserStartup•RunMenu file and delete the unwanted Addmenu lines.
# Important typographic notes:
# 1) The Add Application and Add Document menu item names start with
one space,
# so they sort alphabetically to the top of the menu.
# 2) The script for each AddMenu item is one long, continued command,
so
# most of the lines end with semi-colon ; and option-d ∂ characters.
# 3) Some of the prompt strings that appear in this script contain
underscores.
# I did this so they would be visible on a printed page. However, in
my
# working copy of the script, the underscores are replaced with
non-breaking
# spaces (typed in MPW as option-space). Strings containing
non-breaking
# spaces don't have to be placed in quotes.
# 4) Any place you see ... in this script, it really is 3 periods,
not the
# option-colon ellipsis character.
# 5) Quote " apostrophe ' and grave accent ` are not interchangeable!
Set Exit 0
DeleteMenu Run ∑ Dev:Null
# "Add Application..." presents a Standard GetFile dialog, filtered
for
# applications only. After you choose an application, it prompts you
for
# how the item should appear in the menu. The default is the full
path
# and filename, which I usually edit to just the filename.
AddMenu Run ' Add Application...' ∂
'Begin ; ∂
Set Exit 0 ; ∂
Set menuChanged 0 ; ∂
Set theAppl "`getfilename -b Add -m Select_ application... -t APPL`
; ∂
Exit If {theAppl} == "" ; ∂
Set menuItem "`request -d {theAppl}
How_should_the_menu_item_read...`" ; ∂
Exit If {menuItem} == "" ; AddMenu Run "{menuItem}" "{theAppl}" ; ∂
Set menuChanged 1 ; ∂
Unset theAppl ; ∂
Unset menuItem ; ∂
If ({menuChanged}) ; ∂
Set savedDir `Directory` ; ∂
Directory "{MPW}" ; ∂
Echo Set Exit 0 >"{PrefsFolder}"UserStartup•RunMenu ; ∂
Echo DeleteMenu Run ∂∑ Dev:Null >>
"{PrefsFolder}"UserStartup•RunMenu ; ∂
AddMenu Run | Sort -u -quote >>
"{PrefsFolder}"UserStartup•RunMenu ; ∂
Echo Set Exit 1 >> "{PrefsFolder}"UserStartup•RunMenu ; ∂
Execute "{PrefsFolder}"UserStartup•RunMenu ; ∂
Directory "{savedDir}" ; ∂
Unset savedDir ; ∂
End ; ∂
Unset menuChanged ; ∂
Set Exit 1 ; ∂
End ∑ Dev:Null'
# Add Document... works a lot like Add Application..., except that
you are
# prompted to select TWO files. The first can be any document, the
second
# must be an application which can open that document.
AddMenu Run ' Add Document...' ∂
'Begin ; ∂
Set Exit 0 ; ∂
Set menuChanged 0 ; ∂
Set theDoc "`getfilename -m Select_document_to_open...`" ; ∂
Exit If {theDoc} == "" ; ∂
Set theAppl "`getfilename -b With -m To_open_with... -t APPL`" ; ∂
Exit If {theAppl} == "" ; ∂
Set menuItem "`request -d {theDoc}
How_should_the_menu_item_read...`" ; ∂
Exit If {menuItem} == "" ; ∂
AddMenu Run "{menuItem}" "{theAppl} {theDoc}" ; ∂
Set menuChanged 1 ; ∂
Export menuChanged ; ∂
Unset theAppl ; ∂
Unset menuItem ; ∂
If ({menuChanged}) ; ∂
Set savedDir `Directory` ; ∂
Directory "{MPW}" ; ∂
Echo Set Exit 0 >"{PrefsFolder}"UserStartup•RunMenu ; ∂
Echo DeleteMenu Run ∂∑ Dev:Null >>
"{PrefsFolder}"UserStartup•RunMenu ; ∂
AddMenu Run | Sort -u -quote >>
"{PrefsFolder}"UserStartup•RunMenu ; ∂
Echo Set Exit 1 >> "{PrefsFolder}"UserStartup•RunMenu ; ∂
Execute "{PrefsFolder}"UserStartup•RunMenu ; ∂
Directory "{savedDir}" ; ∂
Unset savedDir ; ∂
End ; ∂
Unset menuChanged ; ∂
Set Exit 1 ; ∂
End ∑ Dev:Null'
# Add a separator line, which will appear between the default and
# configured menu items.
AddMenu Run '-' ''
# Create the UserStartup•RunMenu file. This will be placed in either
the
# MPW folder, or MPW's PrefsFolder if using MPW 3.3 or newer.
# The UserStartup•RunMenu contains all of the commands needed to
initialize
# the Run menu, without any formatting or script comments.
Set savedDir `Directory`
Directory "{MPW}
Echo Set Exit 0 > "{PrefsFolder}"UserStartup•RunMenu
Echo DeleteMenu Run ∂∑ Dev:Null >> "{PrefsFolder}"UserStartup•RunMenu
AddMenu Run >> "{PrefsFolder}"UserStartup•RunMenu
Echo Set Exit 1 >> "{PrefsFolder}"UserStartup•RunMenu
Directory "{savedDir}
Unset savedDir
# Announce completion
Alert -s Run Menu successfully installed.
# End of NewRunMenu script
A word of warning: If you plan to type this in from the magazine pages, you may
be in for a rough time. The MPW scripting language is powerful, but it can be a
typographic nightmare. A single character error can give bizarre results, and may be
very hard to track down.
This is an excellent reason to buy MacTech magazine source code on disk, or to
power up the modem and download this file. If you don’t have an account any place
where MacTech source code is available, you can also find this script on the Absoft
Technical Support BBS, at 313-853-0000.