At 12:48 +0900 2001.10.24, Nobumi Iyanaga wrote:
>I would like to know how to write the AppleScript commands "activate" and
>"open document" in AppleEvent, within a MacPerl script.  More specifically,
>what I would like to do is the equivalent of:
>
>tell application "Nisus Writer"
>       activate
>       open document "document_path"
>end tell
>
>in AppleEvent (I would prefer to not use Mac::Glue, because of memory
>requirement...).

Awww.

First, have you looked into MacPerl::DoAppleScript()?  If not, it is worth
looking at is.  Slowest to execute, because of compilation time, but
easiest to do (isn't that always the case?  :).

        MacPerl::DoAppleScript('tell app "Nisus Writer" to activate');

Then, of course, there is Mac::OSA (and Mac::OSA::Simple), which functions
like MacPerl::DoAppleScript, in that it can compile and execute an
AppleScript, but you can take a single script and compile it once, and
execute it many times.

        use Mac::OSA::Simple;
        $script = compile_applescript('tell app "Nisus Writer" to activate');
        $script->execute;
        $script->save('HD:Desktop Folder:compile script');

And just for completeness, there's Mac::Glue.

        use Mac::Glue;
        $nisus = new Mac::Glue 'Nisus Writer';
        $nisus->activate;

But to Apple events: your first stop should be to macperlcat.pod, which
comes with MacPerl, and describes how to do Apple events.  It is not easy,
but it is doable.

I don't know the signature of Nisus Writer, so I am going to just assume it
is NISU.  You need to actually find out what it is.

Then you can do:

        #!perl -w
        use Mac::AppleEvents;
        my(%ae, $event, $reply);
        use strict;

        %ae = (
                target => 'NISY',
                class  => 'misc',
                id     => 'actv',
                params => [''],
        );

        $event = AEBuildAppleEvent($ae{class}, $ae{id}, typeApplSignature,
                $ae{target}, kAutoGenerateReturnID, kAnyTransactionID,
                @{$ae{params}}
        ) or die $^E;
        $reply = AESend($event, kAEWaitReply) or die $^E;

        AEDisposeDesc $event;
        AEDisposeDesc $reply;

        $ae{class}  = 'aevt';
        $ae{id}     = 'odoc';
        $ae{params} = [
                "'----':obj {want:type(file), from:null(), " .
                "form:name, seld:TEXT(\@)}",
                "HD:Desktop Folder:file"
        ];

        $event = AEBuildAppleEvent($ae{class}, $ae{id}, typeApplSignature,
                $ae{target}, kAutoGenerateReturnID, kAnyTransactionID,
                @{$ae{params}}
        ) or die $^E;
        $reply = AESend($event, kAEWaitReply) or die $^E;

        AEDisposeDesc $event;
        AEDisposeDesc $reply;


Yikes!  OK, so there is also a *fifth* way to do it, using
Mac::AppleEvents::Simple.

        use Mac::AppleEvents::Simple;

        do_event(qw/misc actv R*ch/);
        die $^E if $^E;

        do_event(qw/aevt odoc R*ch/,
                "'----':obj {want:type(file), from:null(), " .
                "form:name, seld:TEXT(\@)}",
                "HD:Desktop Folder:file"
        );
        die $^E if $^E;

As you can see, the essential portions of the event are the same as in the
previous method, but the rest is taken care of for you: do_event builds,
adds in the various parameters, sends, and disposes.

Hope that helps,

-- 
Chris Nandor                      [EMAIL PROTECTED]    http://pudge.net/
Open Source Development Network    [EMAIL PROTECTED]     http://osdn.com/

Reply via email to