Monday, November 08, 2010 at 12:02 AM.
system.verbs.builtins.app.startWithDocument
on startWithDocument (appTable, docPath) { <<start talking with the application, might launch it
<<adr is the address of an application's glue table, usually in system.verbs.apps
<<if the application isn't running, try to launch it
<<if the path isn't the program, use file.getFileDialog
<<keep the path updated
<<returns true if the application is launched and ready to talk
<<v2.0 dmb: added document support
<<v3.0 dmb: handle difference between nil and the empty string for docPath
<<zero means normal launch w/out a specific document
<<"" means inhibit default document or open file dialog
<<Changes:
<<1/7/02; 11:44:10 PM by PBS
<<On OS X apps may be folders. If so, then the path to the app is okay, don't prompt for it again.
appTable = address (appTable);
bundle { <<body of app.start
local (infoTable); <<the application's appInfo table
local (name, id, path, app1Supported, sharedMenus);
on copyFromInfoTable () { <<copy infoTable values into this script's locals
name = infoTable^.name;
id = infoTable^.id;
path = infoTable^.path;
app1Supported = infoTable^.app1Supported;
sharedMenus = infoTable^.sharedMenus};
on appRunning () { <<return true if the application is running
if defined (app.idnetworkapp) { <<registration already taken care of
id = app.idnetworkapp;
return (true)};
if sys.appIsRunning (id) {
if string.length (infoTable^.path) == 0 { <<hasn't been set yet
infoTable^.path = sys.getAppPath (id)};
return (true)};
return (false)};
on fileIsApp () { <<return true if the path points to our application
if sizeof (path) == 0 {
return (false)};
if not file.exists (path) {
return (false)};
if file.type (path) != 'APPL' {
if not (system.environment.isCarbon and file.isFolder (path)) { //PBS 01/07/02: OS X apps may be folders
return (false)}};
if file.creator (path) != id {
return (false)};
return (true)};
on searchForApp () { <<returns empty string if we failed, full path if we won
local (folder);
folder = file.folderFromPath (Frontier.getFilePath ()) + "UserLand Utilities:";
if file.exists (folder) {
local (f);
fileloop (f in folder, infinity) {
if (file.type (f) == 'APPL') and (file.creator (f) == id) {
return (f)}}};
return ("")};
on promptForPath () { <<get the application's path from the user
local (newpath);
newpath = searchForApp ();
if newpath == "" { <<our very limited search strategy failed
Frontier.bringToFront (); <<be sure Frontier is the frontmost app
newpath = file.findApplication (infoTable^.id);
if not file.getFileDialog ("Where is " + name + "?", @newpath, 'APPL') {
return (false)}};
infoTable^.path = newpath;
infoTable^.id = file.creator (newpath);
if sizeof (infoTable^.name) == 0 { <<hasn't been set yet
infoTable^.name = file.fileFromPath (path)};
copyFromInfoTable ();
return (true)};
on launchApp () { <<return true if we're able to launch the application
msg ("Launching " + name + "...");
if typeof (docPath) == unknowntype {
if not launch.application (path) {
return (false)}}
else {
if not launch.appWithDocument (path, docPath) {
return (false)}};
docPath = ""; <<clear path so we'll know not to open it again
return (true)};
bundle { <<be sure the app's appInfo table is set up properly
if not defined (appTable^) { <<passing in a bogus address
scriptError ("The application doesn't have a Frontier \"glue\" table.")};
infoTable = @appTable^.appInfo;
if not defined (infoTable^) { <<no appInfo table, create one with initial values
new (tableType, infoTable);
infoTable^.name = nameOf (appTable^);
infoTable^.id = '????';
infoTable^.path = "";
infoTable^.app1Supported = false;
infoTable^.sharedMenus = false};
copyFromInfoTable ();
appTable^.id = id}; <<side-effect -- makes life easier for glue scripts
while (not appRunning ()) {
if not fileIsApp () {
if not promptForPath () { <<user clicked on Cancel
return (false)}};
if launchApp () {
break};
path = ""}; <<next time try for a different file
bundle { <<set up the app table in the object database for this application
app.id = id; <<all app verbs are sent to this application
appTable^.id = id; <<make life easy for the app's glue scripts
app.adrAppTable = appTable}; <<the app verbs can refer to current app's info table
<<bundle <<fuss with the paths table
<<local (adr = @system.misc.paths.app1path)
<<if app1Supported <<app verbs are global
<<adr^ = @system.verbs.builtins.app
<<else <<app verbs are undefined, or require a full path
<<if defined (adr^)
<<delete (adr)
if docPath != "" { <<tell app to open the document
required.openDocument (id, docPath)};
msg (""); <<release message area
return (true)}}
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.