home *** CD-ROM | disk | FTP | other *** search
-
- /*⌐ Copyright 1988 -- 1991 UserLand Software, Inc. All Rights Reserved.*/
-
-
- #include <iac.h>
- #include <menusharing.h>
-
- #include "appletinternal.h"
- #include "ops.h"
- #include "bitmaps.h"
- #include "quickdraw.h"
- #include "scrollbar.h"
- #include "font.h"
- #include "kb.h"
- #include "printing.h"
- #include "about.h"
- #include "appletmain.h"
-
-
- /*
- IAC messages implemented by the Applet Toolkit layer.
- */
- #define alertdialogtoken 'alrt'
- #define confirmdialogtoken 'cnfm'
- #define enabledialogtoken 'enbd'
- #define geterrorstringtoken 'gers'
-
- #define gettargettoken 'gtrg'
- #define settargettoken 'strg'
-
- #define newwindowtoken 'nwin'
- #define openwindowtoken 'owin'
- #define closewindowtoken 'cwin'
- #define savewindowtoken 'swin'
- #define revertwindowtoken 'rwin'
- #define movewindowtoken 'mwin'
- #define printwindowtoken 'pwin'
- #define selectwindowtoken 'xwin'
-
- #define getfilepathtoken 'gpth'
- #define getwindowpostoken 'gwps'
- #define madechangestoken 'chgs'
-
- #define getpicttoken 'gpic'
- #define gettexttoken 'gtex'
- #define putpicttoken 'ppic'
- #define puttexttoken 'ptex'
- #define selectalltoken 'sela'
- #define haveselectiontoken 'hsel'
-
- #define countwindowstoken 'twin'
- #define nthwindowtoken 'nthw'
- #define quittoken 'quit'
-
- #define perftesttoken 'perf'
-
- /*
- new undocumented verbs
- */
- #define getpagerecttoken 'gprc'
- #define askdialogtoken 'askd'
- #define getwindowrecttoken 'gwrc'
-
-
-
- /*
- for communication with the applet body code -- it has copies of all the globals,
- and pointers to the callback routines that define the applet.
- */
- tyappletrecord app;
-
- /*
- globals used by the window visiter.
- */
- bigstring bsvisit;
- short vnumvisit;
- short x1, x2; /*two short registers for visit routines*/
- hdlappwindow lastwindowvisited;
-
-
- /*
- flag to control whether the user is interacting, or we're responding to an
- interapplication message. the error string is saved -- to be accessed by the
- GetErrorString verb.
- */
- boolean fldialogsenabled = true;
- bigstring bserrorstring;
-
-
- typedef struct tyappwindowinfo { /*saved on disk after the applet's data handle*/
-
- short top, left, bottom, right; /*window position, cross-platform*/
-
- char waste [256]; /*room to grow*/
- } tyappwindowinfo;
-
- tymouserecord mousestatus;
-
- #define applemenu 128
- #define aboutitem 1
-
- #define filemenu 129
- #define newitem 1
- #define openitem 2
- #define closeitem 3
- #define saveitem 5
- #define saveasitem 6
- #define revertitem 7
- #define pagesetupitem 9
- #define printitem 10
- #define quititem 12
-
- #define firstsharedmenu filemenu+1
-
- MenuHandle hdlapplemenu, hdlfilemenu;
-
-
- boolean flexitmainloop = false;
-
- #define nowindowerror 7 /*index into the verb error STR# list*/
- #define windowopenerror 8
- #define nopictcallbackerror 9
- #define notextcallbackerror 10
- #define noputtextcallbackerror 11
- #define noputpictcallbackerror 12
-
-
- bigstring bstargetwindowname; /*title of window that IAC verbs apply to*/
-
-
- #define jugglerEvt 15 /*a suspend/resume event from the OS to us*/
-
- typedef struct tyjugglermessage {
-
- long eventtype: 8; /*bits 24 -- 31*/
-
- long reservedbits: 22; /*bits 2 -- 23*/
-
- long flconvertclipboard: 1; /*bit 1*/
-
- long flresume: 1; /*bit 0*/
- } tyjugglermessage;
-
-
-
- boolean appalert (bs) bigstring bs; {
-
- copystring (bs, bserrorstring);
-
- if (fldialogsenabled)
- return (alertdialog (bs));
- } /*appalert*/
-
-
- void drawappgrowicon (appwindow) hdlappwindow appwindow; {
-
- register WindowPtr w = (**appwindow).macwindow;
-
- if (app.vertscroll && app.horizscroll) {
-
- DrawGrowIcon (w);
- }
- else {
- register short width = 15;
- Rect r = (*w).portRect;
-
- r.left = r.right - width;
-
- r.top = r.bottom - width;
-
- pushclip (r);
-
- DrawGrowIcon (w);
-
- popclip ();
- }
- } /*drawappgrowicon*/
-
-
- void installmenu (idmenu, hmenu) short idmenu; MenuHandle *hmenu; {
-
- *hmenu = GetMenu (idmenu);
-
- InsertMenu (*hmenu, 0);
- } /*installmenu*/
-
-
- void initmenus (void) {
-
- hdlapplemenu = GetMenu (applemenu);
-
- AddResMenu (hdlapplemenu, 'DRVR');
-
- InsertMenu (hdlapplemenu, 0);
-
- installmenu (filemenu, &hdlfilemenu);
-
- DrawMenuBar ();
- } /*initmenus*/
-
-
- boolean apppushwindow (appwindow) hdlappwindow appwindow; {
-
- return (pushmacport ((**appwindow).macwindow));
- } /*apppushwindow*/
-
-
- boolean apppopwindow (void) {
-
- return (popmacport ());
- } /*apppopwindow*/
-
-
- boolean apppushorigin (void) {
-
- register hdlappwindow ha = app.appwindow;
- register WindowPtr w = (**ha).macwindow;
-
- SetOrigin ((**ha).scrollorigin.h, (**ha).scrollorigin.v);
-
- OffsetRgn ((*w).clipRgn, (**ha).scrollorigin.h, (**ha).scrollorigin.v);
- } /*apppushorigin*/
-
-
- boolean apppoporigin (void) {
-
- register hdlappwindow ha = app.appwindow;
- register WindowPtr w = (**ha).macwindow;
-
- OffsetRgn ((*w).clipRgn, -(**ha).scrollorigin.h, -(**ha).scrollorigin.v);
-
- SetOrigin (0, 0);
- } /*apppoporigin*/
-
-
- boolean appopenbitmap (r, appwindow) Rect r; hdlappwindow appwindow; {
-
- return (openbitmap (r, (**appwindow).macwindow));
- } /*appopenbitmap*/
-
-
- boolean appclosebitmap (appwindow) hdlappwindow appwindow; {
-
- closebitmap ((**appwindow).macwindow);
-
- return (true);
- } /*appclosebitmap*/
-
-
- void getappdata (w, appdata) WindowPtr w; Handle *appdata; {
-
- /*
- a window's refcon field points to the appwindow record, which in turn
- points to the applet's data in the appdata field.
- */
-
- register hdlappwindow ha = (hdlappwindow) (*(WindowPeek) w).refCon;
-
- if (ha == nil)
- *appdata = nil;
- else
- *appdata = (**ha).appdata;
- } /*getappdata*/
-
-
- void getwindowrefcon (w, refcon) WindowPtr w; long *refcon; {
-
- *refcon = (*(WindowPeek) w).refCon;
- } /*getwindowrefcon*/
-
-
- void getappwindowtitle (appwindow, bs) hdlappwindow appwindow; bigstring bs; {
-
- if (appwindow == nil)
- setstringlength (bs, 0);
- else
- GetWTitle ((**appwindow).macwindow, bs);
- } /*selectappwindow*/
-
-
- void setappwindowtitle (appwindow, bs) hdlappwindow appwindow; bigstring bs; {
-
- SetWTitle ((**appwindow).macwindow, bs);
- } /*setappwindowtitle*/
-
-
- void showappwindow (appwindow) hdlappwindow appwindow; {
-
- ShowWindow ((**appwindow).macwindow);
- } /*showappwindow*/
-
-
- void selectappwindow (appwindow) hdlappwindow appwindow; {
-
- SelectWindow ((**appwindow).macwindow);
- } /*selectappwindow*/
-
-
- void invalappwindow (appwindow, flerase) hdlappwindow appwindow; boolean flerase; {
-
- Rect r;
-
- pushmacport ((**appwindow).macwindow);
-
- r = (**appwindow).windowrect;
-
- invalrect (r);
-
- if (flerase) {
-
- pushclip (r);
-
- eraserect (r);
-
- popclip ();
- }
-
- popmacport ();
- } /*invalappwindow*/
-
-
- void setappwindow (appwindow) hdlappwindow appwindow; {
-
- register hdlappwindow ha = appwindow;
-
- app.appwindow = ha;
-
- if (ha == nil) {
-
- app.appdata = nil;
- }
- else {
- app.appdata = (**ha).appdata;
-
- SetPort ((**ha).macwindow);
- }
- } /*setappwindow*/
-
-
- void updateappwindow (appwindow) hdlappwindow appwindow; {
-
- register hdlappwindow ha = appwindow;
- register WindowPtr w = (**ha).macwindow;
- Rect rwindow = (*w).portRect;
- Rect rstatus = (**ha).statusrect;
-
- BeginUpdate (w);
-
- setappwindow (ha);
-
- /*update our stuff*/ {
-
- pushclip (rwindow);
-
- drawappgrowicon (ha);
-
- updateappscrollbars (ha);
-
- if (app.statuspixels > 0) { /*has a status area*/
-
- Rect r = rstatus;
-
- MoveTo (r.left, r.bottom);
-
- LineTo (r.right, r.bottom);
-
- r.bottom += 2;
-
- MoveTo (r.left, r.bottom);
-
- LineTo (r.right, r.bottom);
- }
-
- popclip ();
- }
-
- /*let the applet update his stuff*/ {
-
- pushclip ((**ha).contentrect);
-
- (*app.updatecallback) ();
-
- popclip ();
- }
-
- /*update the status portion of the window*/ {
-
- if (app.statuspixels > 0) { /*has a status area*/
-
- pushclip (rstatus);
-
- (*app.updatestatuscallback) ();
-
- popclip ();
- }
- }
-
- EndUpdate (w);
- } /*updateappwindow*/
-
-
- void computewindowinfo (macwindow, appwindow) WindowPtr macwindow; hdlappwindow appwindow; {
-
- register WindowPtr w = macwindow;
- register hdlappwindow ha = appwindow;
- Rect r, rcontent, rstatus;
-
- (**ha).windowrect = r = (*w).portRect;
-
- rcontent = r;
-
- /*take out for scrollbars*/ {
-
- register short scrollbarwidth = getscrollbarwidth ();
-
- if (app.vertscroll)
- rcontent.right -= scrollbarwidth;
-
- if (app.horizscroll)
- rcontent.bottom -= scrollbarwidth;
- }
-
- if (app.statuspixels > 0) /*has a status area*/
- rcontent.top += app.statuspixels + 3; /*a 3-pixel line separates status & content*/
-
- (**ha).contentrect = rcontent;
-
- rstatus = r; /*copy left, right, top*/
-
- rstatus.bottom = rstatus.top + app.statuspixels;
-
- (**ha).statusrect = rstatus;
-
- (**ha).windowvertpixels = r.bottom - r.top;
-
- (**ha).windowhorizpixels = r.right - r.left;
-
- (**ha).defaultfont = geneva;
-
- (**ha).defaultsize = 9;
-
- (**ha).defaultstyle = 0;
-
- pushmacport (w);
-
- pushstyle ((**ha).defaultfont, (**ha).defaultsize, (**ha).defaultstyle);
-
- (**ha).fontheight = globalfontinfo.ascent + globalfontinfo.descent;
-
- popstyle ();
-
- popmacport ();
-
- (**ha).macwindow = w;
- } /*computewindowinfo*/
-
-
- void getdesktoprect (appwindow, rwindow) hdlappwindow appwindow; Rect *rwindow; {
-
- register WindowPtr w = (**appwindow).macwindow;
-
- *rwindow = (*w).portRect;
-
- pushmacport (w);
-
- localtoglobalrect (rwindow);
-
- popmacport ();
- } /*getdesktoprect*/
-
-
- void disposeappwindow (appwindow) hdlappwindow appwindow; {
-
- register hdlappwindow ha = app.appwindow;
-
- (*app.disposerecordcallback) ();
-
- disposescrollbar ((**ha).vertbar);
-
- disposescrollbar ((**ha).horizbar);
-
- DisposeWindow ((**ha).macwindow);
-
- disposehandle ((Handle) ha);
- } /*disposeappwindow*/
-
-
- typedef boolean (*tyvisitapproutine) (hdlappwindow);
-
-
- boolean visitappwindows (visitproc) tyvisitapproutine visitproc; {
-
- /*
- visit all the windows from front to back. call the visitproc for each window,
- if it returns false we stop the traversal and return false.
-
- the visitproc takes one parameter -- a window pointer, indicating the window
- to be visited.
-
- return true if all the visits returned true.
-
- 9/4/91 DW: add lastwindowvisited -- returns nil if no match found, returns
- pointing to the appwindow record for the window that matched the visitproc's
- criteria.
- */
-
- register WindowPtr w = FrontWindow ();
- hdlappwindow appwindow;
-
- lastwindowvisited = nil;
-
- while (w != nil) {
-
- getwindowrefcon (w, (long *) &appwindow);
-
- if (appwindow == nil) /*defensive driving -- no linked data -- skip it*/
- goto next;
-
- if (!(*visitproc) (appwindow)) { /*stop the traversal*/
-
- lastwindowvisited = appwindow; /*set global*/
-
- return (false);
- }
-
- next:
-
- w = (WindowPtr) (*(WindowPeek) w).nextWindow;
- } /*while*/
-
- return (true); /*completed the traversal*/
- } /*visitappwindows*/
-
-
- boolean selectvisit (appwindow) hdlappwindow appwindow; {
-
- bigstring bs;
-
- getappwindowtitle (appwindow, bs);
-
- if (!equalstrings (bsvisit, bs)) /*no match -- keep traversing*/
- return (true);
-
- /*found a match, select the window, stop the traversal*/
-
- selectappwindow (appwindow);
-
- return (false); /*stop the traversal*/
- } /*selectvisit*/
-
-
- boolean selectwindowbytitle (bs) bigstring bs; {
-
- /*
- visit all the windows from front to back. when we encounter one of the
- app's windows check the window title. if it equals bs, then select the
- window and set the globals accordingly.
-
- return false if there is no app window with that name.
- */
-
- copystring (bs, bsvisit); /*copy into global so visit routine can access*/
-
- return (!visitappwindows (&selectvisit));
- } /*selectwindowbytitle*/
-
-
- boolean findbytitlevisit (appwindow) hdlappwindow appwindow; {
-
- bigstring bs;
-
- getappwindowtitle (appwindow, bs);
-
- if (!equalstrings (bsvisit, bs)) /*no match -- keep traversing*/
- return (true);
-
- return (false); /*stop the traversal*/
- } /*findbytitlevisit*/
-
-
- boolean findbywindowtitle (bstitle, appwindow) bigstring bstitle; hdlappwindow *appwindow; {
-
- copystring (bstitle, bsvisit); /*copy into global so visit routine can access*/
-
- visitappwindows (&findbytitlevisit);
-
- if (lastwindowvisited == nil)
- return (false);
-
- *appwindow = lastwindowvisited;
-
- return (true);
- } /*findbywindowtitle*/
-
-
- boolean findnthvisit (appwindow) hdlappwindow appwindow; {
-
- return (++x2 < x1); /*visit until they're equal*/
- } /*findnthvisit*/
-
-
- boolean findnthwindow (n, appwindow) short n; hdlappwindow *appwindow; {
-
- x1 = n; /*copy into a "register" for visit routine*/
-
- x2 = 0; /*another register*/
-
- visitappwindows (&findnthvisit);
-
- *appwindow = lastwindowvisited;
-
- return (lastwindowvisited != nil);
- } /*findbywindowtitle*/
-
-
- boolean countwindowsvisit (appwindow) hdlappwindow appwindow; {
-
- x1++;
-
- return (true); /*keep going*/
- } /*countwindowsvisit*/
-
-
- short countwindows (void) {
-
- x1 = 0; /*copy into a "register" for visit routine*/
-
- visitappwindows (&countwindowsvisit);
-
- return (x1);
- } /*countwindows*/
-
-
- boolean resetdirtyscrollbarsvisit (appwindow) hdlappwindow appwindow; {
-
- register hdlappwindow ha = appwindow;
-
- setappwindow (ha);
-
- if ((**ha).flresetscrollbars) {
-
- resetappscrollbars (ha);
-
- (**ha).flresetscrollbars = false; /*consume it*/
- }
-
- return (true); /*visit all open windows*/
- } /*resetdirtyscrollbarsvisit*/
-
-
- boolean resetdirtyscrollbars (void) {
-
- visitappwindows (&resetdirtyscrollbarsvisit);
- } /*resetdirtyscrollbars*/
-
-
- boolean getuntitledtitle (bs) bigstring bs; {
-
- register long ct = 1;
- hdlappwindow appwindow;
-
- while (true) {
-
- copystring ("\pUntitled ", bs);
-
- pushlong (ct++, bs);
-
- if (!findbywindowtitle (bs, &appwindow))
- return (true);
- } /*while*/
- } /*getuntitledtitle*/
-
-
- boolean findbyfilevisit (appwindow) hdlappwindow appwindow; {
-
- if ((**appwindow).vnum = vnumvisit) {
-
- if (equalstrings ((**appwindow).fname, bsvisit))
- return (false);
- }
-
- return (true); /*keep visiting*/
- } /*findbyfilevisit*/
-
-
- boolean findbyfile (fname, vnum, appwindow) bigstring fname; short vnum; hdlappwindow *appwindow; {
-
- copystring (fname, bsvisit); /*copy into global so visit routine can access*/
-
- vnumvisit = vnum; /*copy into global*/
-
- visitappwindows (&findbyfilevisit);
-
- if (lastwindowvisited == nil)
- return (false);
-
- *appwindow = lastwindowvisited;
-
- return (true);
- } /*findbyfile*/
-
-
- boolean settargetvisit (appwindow) hdlappwindow appwindow; {
-
- bigstring bs;
-
- getappwindowtitle (appwindow, bs);
-
- if (!equalstrings (bsvisit, bs)) /*no match -- keep traversing*/
- return (true);
-
- /*found a match, stop the traversal*/
-
- setappwindow (appwindow);
-
- return (false); /*stop the traversal*/
- } /*settargetvisit*/
-
-
- boolean setapptarget (bs) bigstring bs; {
-
- /*
- set the globals for the window with the indicated name without bringing
- the window to the front.
- */
-
- setappwindow (nil);
-
- copystring (bs, bsvisit); /*copy into global so visit routine can access*/
-
- visitappwindows (&settargetvisit);
-
- return (app.appwindow != nil);
- } /*setapptarget*/
-
-
- boolean setfrontglobalsvisit (appwindow) hdlappwindow appwindow; {
-
- setappwindow (appwindow);
-
- return (false); /*stop the traversal*/
- } /*setfrontglobalsvisit*/
-
-
- boolean setfrontglobals (void) {
-
- setappwindow (nil);
-
- visitappwindows (&setfrontglobalsvisit);
-
- return (app.appwindow != nil);
- } /*setfrontglobals*/
-
-
- static void saveappwindowinfo (hdlappwindow appwindow, tyappwindowinfo *appwindowinfo) {
-
- Rect r;
-
- getdesktoprect (appwindow, &r);
-
- (*appwindowinfo).top = r.top;
-
- (*appwindowinfo).left = r.left;
-
- (*appwindowinfo).bottom = r.bottom;
-
- (*appwindowinfo).right = r.right;
- } /*saveappwindowinfo*/
-
-
- void moveappwindow (appwindow, rnew) hdlappwindow appwindow; Rect rnew; {
-
- register WindowPtr w = (**appwindow).macwindow;
- register short t, l, b, r;
- Rect rdesktop;
-
- rdesktop = (**GrayRgn).rgnBBox;
-
- t = rnew.top;
-
- t = max (t, rdesktop.top);
-
- l = rnew.left;
-
- l = max (l, rdesktop.left);
-
- b = rnew.bottom;
-
- b = min (b, rdesktop.bottom);
-
- b = max (b, t);
-
- r = rnew.right;
-
- r = min (r, rdesktop.right);
-
- SizeWindow (w, r - l, b - t, true);
-
- MoveWindow (w, l, t, false);
-
- computewindowinfo (w, appwindow);
-
- resizeappscrollbars (appwindow);
-
- resetappscrollbars (appwindow);
- } /*moveappwindow*/
-
-
- static void loadappwindowinfo (hdlappwindow appwindow, tyappwindowinfo appwindowinfo) {
-
- Rect rnew;
-
- rnew.top = appwindowinfo.top;
-
- rnew.left = appwindowinfo.left;
-
- rnew.bottom = appwindowinfo.bottom;
-
- rnew.right = appwindowinfo.right;
-
- moveappwindow (appwindow, rnew);
- } /*loadappwindowinfo*/
-
-
- boolean savewindow (fname, vnum) bigstring fname; short vnum; {
-
- register hdlappwindow ha = app.appwindow;
- tyappwindowinfo appwindowinfo;
- short versionnumber;
- Handle h = nil;
- long ctbytes;
-
- setstringlength (bserrorstring, 0);
-
- if ((**ha).fnum == 0) { /*file isn't open*/
-
- short fnum;
-
- if (!fileopenorcreate (fname, vnum, app.creator, app.filetype, &fnum)) {
-
- appalert ("\pError saving the front window.");
-
- return (false);
- }
-
- (**ha).fnum = fnum;
- }
- else { /*file is already open*/
-
- if (!fileseteof ((**ha).fnum, (long) 0)) {
-
- appalert ("\pError truncating the file.");
-
- return (false);
- }
- }
-
- if (!(*app.packcallback) (&h)) {
-
- appalert ("\pOut of memory.");
-
- goto error;
- }
-
- ctbytes = GetHandleSize (h);
-
- if (!filewrite ((**ha).fnum, longsizeof (ctbytes), &ctbytes)) {
-
- appalert ("\pError writing to file.");
-
- goto error;
- }
-
- if (!filewritehandle ((**ha).fnum, h)) {
-
- appalert ("\pError writing to file.");
-
- goto error;
- }
-
- versionnumber = 1;
-
- if (!filewrite ((**ha).fnum, longsizeof (versionnumber), &versionnumber)) {
-
- appalert ("\pError writing to file.");
-
- goto error;
- }
-
- saveappwindowinfo (ha, &appwindowinfo);
-
- if (!filewrite ((**ha).fnum, longsizeof (appwindowinfo), &appwindowinfo)) {
-
- appalert ("\pError writing to file.");
-
- goto error;
- }
-
- disposehandle (h);
-
- (**ha).flmadechanges = false;
-
- return (true);
-
- error:
-
- disposehandle (h);
-
- fileclose ((**ha).fnum);
-
- (**ha).fnum = 0;
-
- filedelete (fname, vnum);
-
- return (false);
- } /*savewindow*/
-
-
- boolean newappwindow (bstitle, flshowwindow) bigstring bstitle; boolean flshowwindow; {
-
- register hdlappwindow ha = app.appwindow;
- register WindowPtr macwindow;
- register short i;
- register boolean flrelative = false;
- short hwindow, vwindow;
- Rect rwindow;
- bigstring bslastword;
- hdlscrollbar vertbar = nil, horizbar = nil;
-
- if (ha != nil) { /*seed window position from frontmost window*/
-
- getdesktoprect (ha, &rwindow);
-
- hwindow = rwindow.left + 17;
-
- vwindow = rwindow.top + 17;
-
- flrelative = true;
- }
-
- if (!newclearhandle (longsizeof (tyappwindow), (Handle *) &app.appwindow))
- goto error;
-
- ha = app.appwindow; /*copy into register*/
-
- macwindow = GetNewWindow (128, nil, (WindowPtr) -1);
-
- if (macwindow == nil)
- goto error;
-
- if (app.vertscroll) {
-
- if (!newscrollbar (macwindow, true, &vertbar))
- goto error;
- }
-
- if (app.horizscroll) {
-
- if (!newscrollbar (macwindow, false, &horizbar))
- goto error;
- }
-
- (**ha).vertbar = vertbar;
-
- (**ha).horizbar = horizbar;
-
- if (flrelative) /*position window relative to previous window*/
- MoveWindow (macwindow, hwindow, vwindow, false);
- else
- centerwindow (macwindow, quickdrawglobal (screenBits).bounds);
-
- copystring (bstitle, (**ha).fname);
-
- computewindowinfo (macwindow, ha);
-
- (**ha).macwindow = macwindow;
-
- if (!(*app.newrecordcallback) ())
- goto error;
-
- computewindowinfo (macwindow, ha); /*window might have been changed by callback*/
-
- (**ha).appdata = app.appdata; /*copy handle alloc'd by newrecord*/
-
- (*(WindowPeek) macwindow).refCon = (long) ha;
-
- lastword (bstitle, ':', bslastword); /*avoid displaying long paths*/
-
- setappwindowtitle (ha, bslastword);
-
- resizeappscrollbars (ha);
-
- resetappscrollbars (ha);
-
- if (flshowwindow) {
-
- showappwindow (ha);
-
- showappscrollbars (ha);
- }
-
- return (true);
-
- error:
-
- disposescrollbar (vertbar);
-
- disposescrollbar (horizbar);
-
- macwindow = (**ha).macwindow;
-
- if (macwindow != nil)
- DisposeWindow (macwindow);
-
- disposehandle ((Handle) ha);
-
- setappwindow (nil);
-
- return (false);
- } /*newappwindow*/
-
-
- boolean newuntitledappwindow (void) {
-
- bigstring bstitle;
-
- getuntitledtitle (bstitle);
-
- return (newappwindow (bstitle, true));
- } /*newuntitledappwindow*/
-
-
- boolean openwindow (fname, vnum) bigstring fname; short vnum; {
-
- hdlappwindow appwindow;
- register hdlappwindow ha;
- tyappwindowinfo appwindowinfo;
- short versionnumber;
- long ctbytes;
- short fnum;
- Handle h;
-
- setstringlength (bserrorstring, 0);
-
- if (findbyfile (fname, vnum, &appwindow)) {
-
- appalert ("\pThe file is already open.");
-
- selectappwindow (appwindow);
-
- return (true);
- }
-
- if (!fileopen (fname, vnum, &fnum)) {
-
- appalert ("\pError opening the file.");
-
- return (false);
- }
-
- if (!fileread (fnum, longsizeof (ctbytes), &ctbytes)) {
-
- appalert ("\pError reading from file.");
-
- goto error;
- }
-
- if (!filereadhandle (fnum, ctbytes, &h)) {
-
- appalert ("\pError reading from file.");
-
- goto error;
- }
-
- if (!fileread (fnum, longsizeof (versionnumber), &versionnumber)) {
-
- appalert ("\pError reading from file.");
-
- goto error;
- }
-
- if (versionnumber != 1) {
-
- appalert ("\pWrong file version number.");
-
- goto error;
- }
-
- if (!fileread (fnum, longsizeof (appwindowinfo), &appwindowinfo)) {
-
- appalert ("\pError reading from file.");
-
- goto error;
- }
-
- if (!newappwindow (fname, false)) {
-
- appalert ("\pError creating new window.");
-
- goto error;
- }
-
- ha = app.appwindow; /*copy into register*/
-
- loadappwindowinfo (ha, appwindowinfo); /*resize window, set fields of ha*/
-
- if (!(*app.unpackcallback) (h)) {
-
- appalert ("\pError reading from file.");
-
- goto error;
- }
-
- disposehandle (h);
-
- (**ha).appdata = app.appdata; /*copy from the app to our record*/
-
- (**ha).fnum = fnum;
-
- copystring (fname, (**ha).fname);
-
- showappwindow (ha);
-
- resetappscrollbars (ha);
-
- showappscrollbars (ha);
-
- invalappwindow (ha, false);
-
- (**ha).vnum = vnum;
-
- return (true);
-
- error:
-
- disposehandle (h);
-
- fileclose (fnum);
-
- return (false);
- } /*openwindow*/
-
-
- boolean closewindow (appwindow, fldialog) hdlappwindow appwindow; boolean fldialog; {
-
- register hdlappwindow ha = appwindow;
-
- if ((**ha).flmadechanges && fldialog && (!app.notsaveable)) {
-
- bigstring bs, bstitle;
-
- sysbeep; /*call attention to the user*/
-
- getappwindowtitle (ha, bstitle);
-
- copystring ("\pDiscard changes to ╥", bs);
-
- pushstring (bstitle, bs);
-
- pushstring ("\p╙?", bs);
-
- if (!msgdialog (bs))
- return (false);
- }
-
- setappwindow (ha);
-
- fileclose ((**ha).fnum);
-
- disposeappwindow (ha);
-
- return (true);
- } /*closewindow*/
-
-
- boolean closewindowvisit (appwindow) hdlappwindow appwindow; {
-
- return (closewindow (appwindow, true));
- } /*closewindowvisit*/
-
-
- boolean closeallwindows (void) {
-
- return (visitappwindows (&closewindowvisit));
- } /*closeallwindows*/
-
-
- boolean saveaswindow (fname, vnum) bigstring fname; short vnum; {
-
- register hdlappwindow ha = app.appwindow;
-
- fileclose ((**ha).fnum); /*close the file if it's open*/
-
- (**ha).fnum = 0;
-
- if (!savewindow (fname, vnum))
- return (false);
-
- copystring (fname, (**ha).fname);
-
- (**ha).vnum = vnum;
-
- setappwindowtitle (ha, fname);
-
- copystring (fname, bstargetwindowname);
-
- return (true);
- } /*saveaswindow*/
-
-
- boolean saveasfrontwindow (void) {
-
- register hdlappwindow ha = app.appwindow;
- bigstring fname;
- short vnum;
-
- copystring ((**ha).fname, fname);
-
- vnum = (**ha).vnum;
-
- if (!sfdialog (true, fname, &vnum, app.filetype))
- return (false);
-
- return (saveaswindow (fname, vnum));
- } /*saveasfrontwindow*/
-
-
- boolean savefrontwindow (void) {
-
- register hdlappwindow ha = app.appwindow;
-
- if (ha == nil) /*defensive driving*/
- return (false);
-
- if ((**ha).fnum == 0)
- return (saveasfrontwindow ());
-
- return (savewindow ((**ha).fname, (**ha).vnum));
- } /*savefrontwindow*/
-
-
- boolean closefrontwindow (void) {
-
- closewindow (app.appwindow, true);
- } /*closefrontwindow*/
-
-
- boolean openfrontwindow (void) {
-
- bigstring fname;
- short vnum;
-
- if (!sfdialog (false, fname, &vnum, app.filetype))
- return (false);
-
- return (openwindow (fname, vnum));
- } /*openfrontwindow*/
-
-
- boolean revertfrontwindow (void) {
-
- register hdlappwindow ha = app.appwindow;
- bigstring fname;
- short vnum;
-
- copystring ((**ha).fname, fname);
-
- vnum = (**ha).vnum;
-
- if (!closewindow (ha, fldialogsenabled)) /*user declined to discard changes*/
- return (false);
-
- /*
- 11/7/91 DW: prevent a crash in 32-bit mode -- make sure app globals accurately
- reflect the state of the Applet Toolkit before opening the window. openwindow
- looks at the window position of the frontmost window, if we don't fix the globals
- it'll crash when it tries to get the window position of the window we just
- closed.
- */
-
- setfrontglobals (); /*seed new window from frontmost window*/
-
- return (openwindow (fname, vnum));
- } /*revertfrontwindow*/
-
-
- boolean settargetglobals (void) {
-
- /*
- get ready to do an operation on the target window. if the name is empty,
- we do the operation on the frontmost window.
-
- the target window name is set using the 'sett' IAC call.
-
- return an error to the script if the target window doesn't exist.
- */
-
- if (stringlength (bstargetwindowname) == 0) { /*no target has been established*/
-
- if (!setfrontglobals ()) /*no windows are open*/
- goto error;
-
- return (true);
- }
-
- if (!setapptarget (bstargetwindowname))
- goto error;
-
- return (true);
-
- error:
-
- if (app.easywindowcreate) { /*no window open, try to create one automatically*/
-
- if (newuntitledappwindow ())
- return (true);
- }
-
- return (IACreturnerror (nowindowerror, "\pNo window is open."));
- } /*settargetglobals*/
-
-
- boolean exitmainloop (void) {
-
- flexitmainloop = closeallwindows ();
-
- return (true);
- } /*exitmainloop*/
-
-
- static boolean setwindowtitleverb (void) {
-
- /*
- verb that sets the window title of the target window.
- */
-
- bigstring bs;
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- if (!IACgetstringparam (keyDirectObject, bs))
- return (false);
-
- setappwindowtitle (app.appwindow, bs);
-
- copystring (bs, bstargetwindowname);
-
- return (IACreturnboolean (true));
- } /*setwindowtitleverb*/
-
-
- static boolean getwindowrectverb (void) {
-
- register hdlappwindow ha = app.appwindow;
- Rect r = (**app.appwindow).contentrect;
-
- OffsetRect (&r, (**ha).scrollorigin.h, (**ha).scrollorigin.v);
-
- return (IACreturnrect (&r));
- } /*getwindowrectverb*/
-
-
- static boolean closewindowverb (void) {
-
- /*
- verb that closes an existing window. it takes no parameters, the
- current target window is closed.
- */
-
- register boolean fl = false;
- register hdlappwindow ha;
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- ha = app.appwindow;
-
- if (ha != nil) { /*a window is open*/
-
- fl = closewindow (ha, fldialogsenabled);
- }
-
- return (IACreturnboolean (fl));
- } /*closewindowverb*/
-
-
- static boolean revertverb (void) {
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- return (IACreturnboolean (revertfrontwindow ()));
- } /*revertverb*/
-
-
- static boolean saveasverb (void) {
-
- register boolean fl = false;
- bigstring path;
- bigstring fname;
- short vnum;
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- if (!IACgetstringparam (keyDirectObject, path))
- return (false);
-
- if (stringlength (path) == 0) {
-
- fl = savefrontwindow ();
- }
- else {
- if (pathtofileinfo (path, fname, &vnum))
- fl = saveaswindow (fname, vnum);
- }
-
- return (IACreturnboolean (fl));
- } /*saveasverb*/
-
-
- static boolean openverb (void) {
-
- register boolean fl = false;
- bigstring path;
- bigstring fname;
- short vnum;
-
- setstringlength (bserrorstring, 0);
-
- if (!IACgetstringparam (keyDirectObject, path))
- return (false);
-
- if (!pathtofileinfo (path, fname, &vnum))
- appalert ("\pError opening the file.");
- else
- fl = openwindow (fname, vnum);
-
- return (IACreturnboolean (fl));
- } /*openverb*/
-
-
- static boolean nthwindowverb (void) {
-
- bigstring bs;
- short n;
- hdlappwindow appwindow;
-
- if (!IACgetshortparam (keyDirectObject, &n))
- return (false);
-
- findnthwindow (n, &appwindow);
-
- getappwindowtitle (appwindow, bs);
-
- return (IACreturnstring (bs));
- } /*nthwindowverb*/
-
-
- static boolean selectwindowverb (void) {
-
- /*
- verb that brings a window to the front, you provide the name of the window in
- a string parameter. side effect -- it also sets the target to that window.
- */
-
- register boolean fl = false;
- bigstring bs;
-
- if (!IACgetstringparam (keyDirectObject, bs))
- return (false);
-
- if (selectwindowbytitle (bs)) {
-
- fl = true;
-
- copystring (bs, bstargetwindowname);
- }
-
- return (IACreturnboolean (fl));
- } /*selectwindowverb*/
-
-
- static boolean perftestverb (void) {
-
- /*
- this verb supports a performance benchmark script written in Frontier.
-
- 6/28/91 DW: perform rectangle subtraction on two rectangle params,
- return the difference.
- */
-
- Rect r1, r2, r;
-
- if (!IACgetrectparam ('prm1', &r1))
- return (false);
-
- if (!IACgetrectparam ('prm2', &r2))
- return (false);
-
- r.top = r1.top - r2.top;
-
- r.left = r1.left - r2.left;
-
- r.bottom = r1.bottom - r2.bottom;
-
- r.right = r1.right - r2.right;
-
- return (IACreturnrect (&r));
- } /*perftestverb*/
-
-
- static boolean alertdialogverb (void) {
-
- /*
- opens up a modal dialog box with the string parameter displayed, wait for
- the user to click on OK before returning the value.
-
- to support runtime menus, you wire your dialog boxes to IAC events if you want
- script writers to be able to transparently talk to the user without Frontier
- coming to the front.
- */
-
- bigstring bs;
-
- if (!IACgetstringparam (keyDirectObject, bs))
- return (false);
-
- return (IACreturnboolean (alertdialog (bs)));
- } /*alertdialogverb*/
-
-
- static boolean confirmdialogverb (void) {
-
- /*
- opens up a modal dialog box with the string parameter displayed, wait for
- the user to click on OK before returning the value.
-
- to support runtime menus, you wire your dialog boxes to IAC events if you want
- script writers to be able to transparently talk to the user without Frontier
- coming to the front.
- */
-
- bigstring bs;
-
- if (!IACgetstringparam (keyDirectObject, bs))
- return (false);
-
- return (IACreturnboolean (msgdialog (bs)));
- } /*confirmdialogverb*/
-
-
- static boolean askdialogverb (void) {
-
- /*
- to support runtime menus, you wire your dialog boxes to IAC events if you want
- script writers to be able to transparently talk to the user without Frontier
- coming to the front.
- */
-
- bigstring prompt, answer;
- boolean fl;
-
- if (!IACgetstringparam (keyDirectObject, prompt))
- return (false);
-
- if (!IACgetstringparam ('dflt', answer))
- return (false);
-
- fl = askdialog (prompt, answer);
-
- IACglobals.event = IACglobals.reply; /*push the params onto the reply record*/
-
- if (!IACpushstringparam (answer, 'ansr'))
- return (false);
-
- return (IACpushbooleanparam (fl, 'ohky'));
- } /*askdialogverb*/
-
-
- static boolean settargetverb (void) {
-
- /*
- set the target of all subsequent verbs to the window named by the string
- parameter.
-
- special case: set the target string to the empty string if you want verbs
- to apply to the frontmost window.
-
- returns the title of the target window.
- */
-
- register boolean fl = true;
- bigstring bs;
-
- if (!IACgetstringparam (keyDirectObject, bs))
- return (false);
-
- if (stringlength (bs) == 0) { /*special case*/
-
- if (setfrontglobals ())
- getappwindowtitle (app.appwindow, bs);
- }
-
- else {
- if (!setapptarget (bs))
- setstringlength (bs, 0);
- }
-
- copystring (bs, bstargetwindowname);
-
- return (IACreturnstring (bs));
- } /*settargetverb*/
-
-
- static boolean gettargetverb (void) {
-
- /*
- returns the title of the target window.
- */
-
- bigstring bs;
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- getappwindowtitle (app.appwindow, bs);
-
- return (IACreturnstring (bs));
- } /*gettargetverb*/
-
-
- static boolean newwindowverb (void) {
-
- register boolean fl = false;
- hdlappwindow appwindow;
- bigstring bs;
- long ctbars;
-
- setstringlength (bserrorstring, 0);
-
- if (!IACgetstringparam (keyDirectObject, bs))
- return (false);
-
- if (stringlength (bs) == 0)
- getuntitledtitle (bs);
-
- if (findbywindowtitle (bs, &appwindow)) {
-
- appalert ("\pA window with that name is already open.");
-
- setstringlength (bs, 0); /*return the empty string to indicate error*/
- }
- else {
- if (newappwindow (bs, true)) {
-
- fl = true;
-
- copystring (bs, bstargetwindowname);
- }
- }
-
- return (IACreturnstring (bs));
- } /*newwindowverb*/
-
-
- static boolean madechangesverb (void) {
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- IACreturnboolean ((**app.appwindow).flmadechanges);
- } /*madechangesverb*/
-
-
- static boolean countwindowsverb (void) {
-
- return (IACreturnshort (countwindows ()));
- } /*countwindowsverb*/
-
-
- static boolean selectallverb (void) {
-
- register boolean fl;
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- fl = (*app.selectallcallback) ();
-
- return (IACreturnboolean (fl));
- } /*selectallverb*/
-
-
- static boolean haveselectionverb (void) {
-
- register boolean fl;
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- fl = (*app.haveselectioncallback) ();
-
- return (IACreturnboolean (fl));
- } /*haveselectionverb*/
-
-
- static boolean printwindowverb (void) {
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- return (IACreturnboolean (printappwindow (app.appwindow, false)));
- } /*printwindowverb*/
-
-
- static boolean enablealertverb (void) {
-
- register boolean fl;
- Boolean flenabled;
-
- if (!IACgetbooleanparam (keyDirectObject, &flenabled))
- return (false);
-
- fl = fldialogsenabled; /*return the original value, per spec*/
-
- fldialogsenabled = flenabled;
-
- return (IACreturnboolean (fl));
- } /*enablealertverb*/
-
-
- static boolean quitverb (void) {
-
- return (IACreturnboolean (exitmainloop ()));
- } /*quitverb*/
-
-
- static boolean geterrorstringverb (void) {
-
- return (IACreturnstring (bserrorstring));
- } /*geterrorstringverb*/
-
-
- static void adjustaftergrow (WindowPtr w) {
-
- hdlappwindow appwindow;
- register hdlappwindow ha;
-
- getwindowrefcon (w, (long *) &appwindow);
-
- ha = appwindow;
-
- setappwindow (ha);
-
- computewindowinfo (w, ha);
-
- (*app.windowresizecallback) ();
-
- resizeappscrollbars (ha);
-
- resetappscrollbars (ha);
-
- invalappwindow (ha, true);
-
- (**ha).flmadechanges = true; /*we save window size and position*/
- } /*adjustaftergrow*/
-
-
- static boolean movewindowverb (void) {
-
- Rect r;
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- if (!IACgetrectparam (keyDirectObject, &r))
- return (false);
-
- moveappwindow (app.appwindow, r);
-
- adjustaftergrow ((**app.appwindow).macwindow); /*inelegant*/
-
- return (IACreturnboolean (true));
- } /*movewindowverb*/
-
-
- static boolean getfilepathverb (void) {
-
- register hdlappwindow ha;
- bigstring path;
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- ha = app.appwindow;
-
- if ((**ha).fnum == 0) /*no file open*/
- setemptystring (path);
- else
- fileinfotopath ((**ha).fname, (**ha).vnum, path);
-
- return (IACreturnstring (path));
- } /*getfilepathverb*/
-
-
- static boolean getpictverb (void) {
-
- Handle hpict;
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- if (app.getpictcallback == nil) /*application doesn't support this feature*/
- return (IACreturnerror (nopictcallbackerror, "\pCan't export a picture."));
-
- (*app.getpictcallback) (&hpict); /*hpict is nil if it failed*/
-
- return (IACreturnbinary (hpict));
- } /*getpictverb*/
-
-
- static boolean gettextverb (void) {
-
- Handle htext;
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- if (app.gettextcallback == nil) /*application doesn't support this feature*/
- return (IACreturnerror (notextcallbackerror, "\pCan't export text."));
-
- (*app.gettextcallback) (&htext); /*htext is nil if it failed*/
-
- return (IACreturnbinary (htext));
- } /*gettextverb*/
-
-
- static boolean putpictverb (void) {
-
- Handle hpict;
- register boolean fl;
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- if (app.putpictcallback == nil) /*application doesn't support this feature*/
- return (IACreturnerror (noputpictcallbackerror, "\pCan't import the picture."));
-
- if (!IACgetbinaryparam (keyDirectObject, &hpict))
- return (false);
-
- fl = (*app.putpictcallback) (hpict); /*hpict is nil if it failed*/
-
- return (IACreturnboolean (fl));
- } /*putpictverb*/
-
-
- static boolean puttextverb (void) {
-
- Handle htext;
- register boolean fl;
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- if (app.puttextcallback == nil) /*application doesn't support this feature*/
- return (IACreturnerror (noputtextcallbackerror, "\pCan't import the text."));
-
- if (!IACgettextparam (keyDirectObject, &htext))
- return (false);
-
- fl = (*app.puttextcallback) (htext); /*htext is nil if it failed*/
-
- return (IACreturnboolean (fl));
- } /*puttextverb*/
-
-
- static boolean getpagerectverb (void) {
-
- return (IACreturnrect (&app.printinfo.paperrect));
- } /*getpagerectverb*/
-
-
- static boolean getwindowposverb (void) {
-
- Rect r;
-
- if (!settargetglobals ()) /*this verb requires an open window*/
- return (false);
-
- r = (**app.appwindow).windowrect;
-
- localtoglobalrect (&r);
-
- return (IACreturnrect (&r));
- } /*getwindowposverb*/
-
-
- static pascal OSErr handlecustomverb (AppleEvent *event, AppleEvent *reply, long refcon) {
-
- if (SharedScriptCancelled (event, reply))
- return (noErr);
-
- IACglobals.event = event;
-
- IACglobals.reply = reply;
-
- IACglobals.refcon = refcon;
-
- return ((*app.iacmessagecallback) ());
- } /*handlecustomverb*/
-
-
- static pascal OSErr handleapp1verb (AppleEvent *event, AppleEvent *reply, long refcon) {
-
- /*
- called by Apple Event Manager when an 'app1' verb arrives.
-
- we always return noErr to the Apple Event Manager -- each verb processor
- may set the error number and string in the reply record by calling
- IACreturnerror.
- */
-
- if (SharedScriptCancelled (event, reply))
- return (noErr);
-
- IACglobals.event = event;
-
- IACglobals.reply = reply;
-
- IACglobals.refcon = refcon;
-
- switch (IACgetverbtoken ()) {
-
- case newwindowtoken:
- newwindowverb (); break;
-
- case closewindowtoken:
- closewindowverb (); break;
-
- case savewindowtoken:
- saveasverb (); break;
-
- case revertwindowtoken:
- revertverb (); break;
-
- case openwindowtoken:
- openverb (); break;
-
- case gettargettoken:
- gettargetverb (); break;
-
- case selectwindowtoken:
- selectwindowverb (); break;
-
- case perftesttoken:
- perftestverb (); break;
-
- case alertdialogtoken:
- alertdialogverb (); break;
-
- case askdialogtoken:
- askdialogverb (); break;
-
- case confirmdialogtoken:
- confirmdialogverb (); break;
-
- case settargettoken:
- settargetverb (); break;
-
- case madechangestoken:
- madechangesverb (); break;
-
- case enabledialogtoken:
- enablealertverb (); break;
-
- case geterrorstringtoken:
- geterrorstringverb (); break;
-
- case nthwindowtoken:
- nthwindowverb (); break;
-
- case getfilepathtoken:
- getfilepathverb (); break;
-
- case movewindowtoken:
- movewindowverb (); break;
-
- case printwindowtoken:
- printwindowverb (); break;
-
- case getpagerecttoken:
- getpagerectverb (); break;
-
- case quittoken:
- quitverb (); break;
-
- case getwindowpostoken:
- getwindowposverb (); break;
-
- case countwindowstoken:
- countwindowsverb (); break;
-
- case getpicttoken:
- getpictverb (); break;
-
- case gettexttoken:
- gettextverb (); break;
-
- case putpicttoken:
- putpictverb (); break;
-
- case puttexttoken:
- puttextverb (); break;
-
- case selectalltoken:
- selectallverb (); break;
-
- case haveselectiontoken:
- haveselectionverb (); break;
-
- case getwindowrecttoken:
- getwindowrectverb (); break;
-
- default:
- IACnothandlederror (); break;
- } /*switch*/
-
- return (noErr);
- } /*handleapp1verb*/
-
-
- static void handleupdate (EventRecord ev) {
-
- register WindowPtr w = (WindowPtr) ev.message;
- hdlappwindow appwindow;
-
- getwindowrefcon (w, (long *) &appwindow);
-
- updateappwindow (appwindow);
- } /*handleupdate*/
-
-
- static void handleactivate (EventRecord ev) {
-
- register WindowPtr w = (WindowPtr) ev.message;
- register boolean flactivate = ev.modifiers & activeFlag;
- hdlappwindow appwindow;
-
- getwindowrefcon (w, (long *) &appwindow);
-
- setappwindow (appwindow);
-
- activateappscrollbars (appwindow, flactivate);
-
- (*app.activatecallback) (flactivate);
- } /*handleactivate*/
-
-
- static void handledrag (EventRecord ev, WindowPtr w) {
-
- Rect r;
-
- r = quickdrawglobal (screenBits).bounds;
-
- r.top = r.top + getmenubarheight ();
-
- r.left = r.left + dragscreenmargin;
-
- r.right = r.right - dragscreenmargin;
-
- r.bottom = r.bottom - dragscreenmargin;
-
- DragWindow (w, ev.where, &r);
- } /*handledrag*/
-
-
- static void handlegrow (Point pt, WindowPtr w) {
-
- register long x;
- Rect boundsrect;
- Rect r;
-
- boundsrect.left = 125; /*minimum window width*/
-
- boundsrect.top = 100; /*minimum window height*/
-
- r = quickdrawglobal (screenBits).bounds;
-
- boundsrect.right = r.right - r.left; /*maximum window width*/
-
- boundsrect.bottom = r.bottom - r.top; /*maximum window height*/
-
- x = GrowWindow (w, pt, &boundsrect);
-
- SizeWindow (w, LoWord (x), HiWord (x), false);
-
- adjustaftergrow (w);
- } /*handlegrow*/
-
-
- static void handlezoom (EventRecord ev, WindowPtr w, short part) {
-
- pushmacport (w);
-
- if (TrackBox (w, ev.where, part)) {
-
- eraserect ((*w).portRect);
-
- ZoomWindow (w, part, true);
-
- adjustaftergrow (w);
- }
-
- popmacport ();
- } /*handlezoom*/
-
-
- static void handlemenu (long codeword) {
-
- register short idmenu, iditem;
-
- iditem = LoWord (codeword);
-
- if (iditem <= 0)
- goto exit;
-
- idmenu = HiWord (codeword);
-
- if (SharedMenuHit (idmenu, iditem))
- goto exit;
-
- switch (idmenu) {
-
- case applemenu:
- switch (iditem) {
-
- case aboutitem:
- aboutcommand ();
-
- break;
-
- default: {
-
- bigstring bs;
-
- GetItem (hdlapplemenu, iditem, bs);
-
- OpenDeskAcc (bs);
-
- break;
- }
- } /*switch*/
-
- break; /*apple menu*/
-
- case filemenu:
- switch (iditem) {
-
- case newitem: {
-
- newuntitledappwindow ();
-
- break;
- }
-
- case openitem:
- openfrontwindow ();
-
- break;
-
- case closeitem:
- if (optionkeydown ())
- closeallwindows ();
- else
- closefrontwindow ();
-
- break;
-
- case saveitem:
- savefrontwindow ();
-
- break;
-
- case saveasitem:
- saveasfrontwindow ();
-
- break;
-
- case revertitem:
- if ((**app.appwindow).flmadechanges)
- if (msgdialog ("\pDiscard changes to the file?"))
- revertfrontwindow ();
-
- break;
-
- case pagesetupitem:
- pagesetup ();
-
- break;
-
- case printitem:
- printappwindow (app.appwindow, true);
-
- break;
-
- case quititem:
- exitmainloop ();
-
- break;
- } /*switch*/
-
- break; /*file menu*/
-
- } /*switching on which menu was invoked*/
-
- exit:
-
- HiliteMenu (0);
- } /*handlemenu*/
-
-
- static void handlekeystroke (EventRecord ev) {
-
- register char ch = ev.message & charCodeMask;
- register boolean flcmdkey = ev.modifiers & cmdKey;
-
- if (SharedScriptRunning ()) { /*cmd-period terminates the script*/
-
- if (flcmdkey && (ch == '.')) {
-
- CancelSharedScript (); /*cancel the shared menu script, if one is running*/
-
- return;
- }
- }
-
- if (flcmdkey) {
-
- handlemenu (MenuKey (ch));
-
- return;
- }
-
- setkeyboardstatus (ev);
-
- (*app.keystrokecallback) ();
- } /*handlekeystroke*/
-
-
- boolean mousetrack (Rect r, void (*displaycallback) (boolean)) {
-
- /*
- hang out in this routine until the mouse button comes up. return true if
- the mouse point is in the indicated rectangle when we return.
-
- 7/17/90 DW: if the mouse wasn't down when we enter, return true. this is
- a heuristic that may allow some mouse-dependent routines to be driven by
- a script. we figure that if the mouse isn't down now, it never was down,
- and whether it's inside any particular rectangle is irrelevent.
-
- 7/17/90 DW: add callback routine to display the object being tracked as
- the mouse moves in and out of the rectangle. set it to nil if you don't
- need this feature.
-
- 7/17/90 DW: only call the callback when the state of the object changes,
- assume display is correct when we're entered.
- */
-
- boolean flinrectnow;
- boolean flwasinrect;
-
- if (!StillDown ()) /*see comment above*/
- return (true);
-
- flwasinrect = true; /*at least for the first iteration of loop*/
-
- while (StillDown ()) { /*stay in holding pattern*/
-
- Point pt;
-
- GetMouse (&pt);
-
- flinrectnow = PtInRect (pt, &r);
-
- if (flinrectnow != flwasinrect) { /*state of object changed*/
-
- if (displaycallback != nil)
- (*displaycallback) (flinrectnow);
- }
-
- flwasinrect = flinrectnow;
- } /*while*/
-
- return (flwasinrect);
- } /*mousetrack*/
-
-
- static boolean mousedoubleclick (Point pt) {
-
- /*
- using the globals mouseuptime and mouseuppoint determine if a
- mouseclick at pt, right now, is a double click.
-
- dmb 9/6/90: pt parameter is no longer used. superceeded by new
- mousedown globals
- */
-
- register boolean fldoubleclick;
- register short diff;
-
- fldoubleclick = (mousestatus.mousedowntime - mousestatus.mouseuptime) < GetDblTime ();
-
- if (fldoubleclick) { /*qualifies so far*/
-
- diff = pointdist (mousestatus.mousedownpoint, mousestatus.mouseuppoint);
-
- fldoubleclick = diff < 5; /*keep it set if mouse hasn't wandered too far*/
- }
-
- if (fldoubleclick) { /*user must doubleclick again to get effect*/
-
- mousestatus.mouseuptime = 0L;
-
- mousestatus.mouseuppoint.h = mousestatus.mouseuppoint.v = 0;
- }
-
- mousestatus.fldoubleclickdisabled = fldoubleclick; /*copy into global*/
-
- return (fldoubleclick);
- } /*mousedoubleclick*/
-
-
- static void handlecontent (EventRecord ev, WindowPtr w) {
-
- register hdlappwindow ha = app.appwindow;
- Point pt = ev.where;
- hdlscrollbar scrollbar;
- short part;
-
- globaltolocalpoint (w, &pt);
-
- if (findscrollbar (pt, w, &scrollbar, &part)) {
-
- scrollappwindow (scrollbar == (**ha).vertbar, scrollbar, part, pt);
-
- return;
- }
-
- /*send mouse hit to the applet*/
-
- mousestatus.localpt = pt;
-
- mousestatus.fldoubleclick = mousedoubleclick (ev.where);
-
- if (PtInRect (pt, &(**ha).contentrect))
- (*app.mousecallback) ();
-
- if (PtInRect (pt, &(**ha).statusrect))
- (*app.mouseinstatuscallback) ();
- } /*handlecontent*/
-
-
- static void handlemouseup (EventRecord ev) {
-
- /*
- call this when you receive an mouse up event. if the last mouse down was
- a double click, we set things up so that the next single click will not
- be interpreted as a double click.
- */
-
- if (!mousestatus.fldoubleclickdisabled) {
-
- mousestatus.mouseuptime = ev.when;
-
- mousestatus.mouseuppoint = ev.where;
-
- mousestatus.mousedowntime = 0L; /*hasn't happened yet*/
- }
-
- mousestatus.fldoubleclickdisabled = false; /*next mouse up is important*/
- } /*handlemouseup*/
-
-
- static void handlemousedown (EventRecord ev) {
-
- short part;
- WindowPtr w;
-
- mousestatus.mousedowntime = ev.when; /*set globals so we can detect a 2click*/
-
- mousestatus.mousedownpoint = ev.where;
-
- part = FindWindow (ev.where, &w);
-
- if (w != nil)
-
- if (w != FrontWindow ()) { /*just like all other Mac programs*/
-
- SelectWindow (w);
-
- return; /*the mouse click is consumed by the bringtofront operation*/
- }
-
- switch (part) {
-
- case inMenuBar:
- handlemenu (MenuSelect (ev.where));
-
- break;
-
- case inContent:
- handlecontent (ev, w);
-
- break;
-
- case inSysWindow:
- SystemClick (&ev, w);
-
- break;
-
- case inDrag:
- handledrag (ev, w);
-
- break;
-
- case inGrow:
- handlegrow (ev.where, w);
-
- break;
-
- case inGoAway:
- if (TrackGoAway (w, ev.where)) {
-
- if (optionkeydown ())
- closeallwindows ();
- else
- closefrontwindow ();
- }
-
- break;
-
- case inZoomOut: case inZoomIn:
- handlezoom (ev, w, part);
-
- break;
-
- } /*switch*/
- } /*handlemousedown*/
-
-
- static boolean jugglervisit (hdlappwindow appwindow) {
-
- register hdlappwindow ha = appwindow;
- register boolean fl = x1 && ((**ha).macwindow == FrontWindow ());
-
- setappwindow (ha);
-
- activateappscrollbars (ha, fl);
-
- (*app.activatecallback) (fl);
-
- drawappgrowicon (ha);
- } /*jugglervisit*/
-
-
- static void handlejuggler (EventRecord ev) {
-
- register boolean flresume;
- tyjugglermessage jmsg;
-
- moveleft (&ev.message, &jmsg, longsizeof (jmsg));
-
- if (jmsg.eventtype == 1) { /*suspend or resume subevent*/
-
- flresume = jmsg.flresume; /*copy into register*/
-
- if (jmsg.flconvertclipboard) { /*11/3/91 DW: get to this later*/
- }
-
- x1 = flresume; /*set global for visit routine*/
-
- visitappwindows (&jugglervisit); /*send message to all open windows*/
- }
- } /*handlejuggler*/
-
-
- static void handleevent (EventRecord ev) {
-
- switch (ev.what) {
-
- case keyDown: case autoKey:
- handlekeystroke (ev);
-
- break;
-
- case mouseDown:
- handlemousedown (ev);
-
- break;
-
- case mouseUp:
- handlemouseup (ev);
-
- break;
-
- case activateEvt:
- handleactivate (ev);
-
- break;
-
- case jugglerEvt:
- handlejuggler (ev);
-
- break;
-
- case updateEvt:
- handleupdate (ev);
-
- break;
-
- case nullEvent:
- resetdirtyscrollbars ();
-
- break;
-
- case kHighLevelEvent:
- AEProcessAppleEvent (&ev);
-
- break;
- } /*switch*/
- } /*handleevent*/
-
-
- void adjustmenus (void) {
-
- register boolean flchanges = false;
- register hdlappwindow ha = app.appwindow;
- register boolean flwindow = ha != nil;
- register MenuHandle hmenu = hdlfilemenu;
- register boolean flsavable = !app.notsaveable;
-
- if (flwindow)
- flchanges = (**ha).flmadechanges;
-
- setmenuitemenable (hmenu, newitem, flsavable);
-
- setmenuitemenable (hmenu, openitem, flsavable);
-
- setmenuitemenable (hmenu, closeitem, flwindow);
-
- setmenuitemenable (hmenu, saveitem, flchanges && flsavable);
-
- setmenuitemenable (hmenu, saveasitem, flwindow && flsavable);
-
- setmenuitemenable (hmenu, revertitem, flchanges && flsavable && ((**ha).fnum != 0));
-
- enablemenuitem (hmenu, pagesetupitem);
-
- setmenuitemenable (hmenu, printitem, flwindow);
-
- enablemenuitem (hmenu, quititem);
- } /*adjustmenus*/
-
-
- boolean maineventhandler (ev) EventRecord ev; {
-
- /*
- if you have an event, and have determined that it's not for you, pass it
- thru this routine for processing.
-
- we check to see if our Frontier-supplied menus need to be re-installed.
- this can happen if a script-writer is making editing changes over in Frontier.
- by waiting for real events, we eliminate very annoying delays when editing
- in Frontier.
-
- returns false if you should break out of your loop, true if you should
- keep looping.
- */
-
- CheckSharedMenus (firstsharedmenu);
-
- setfrontglobals (); /*event applies to frontmost window*/
-
- (*app.adjustcursorcallback) ();
-
- adjustmenus ();
-
- handleevent (ev); /*might set flexitmainloop true*/
-
- return (!flexitmainloop);
- } /*maineventhandler*/
-
-
- void maineventloop (void) {
-
- EventRecord ev;
-
- while (!flexitmainloop) {
-
- WaitNextEvent (everyEvent, &ev, 1, nil);
-
- maineventhandler (ev);
- } /*while*/
- } /*maineventloop*/
-
-
- boolean serviceeventqueue (void) {
-
- /*
- pop and process all waiting events, return true when we get to a null
- event. return false if the user selected the quit command, or otherwise
- wants the program to terminate.
- */
-
- EventRecord ev;
-
- while (!flexitmainloop) {
-
- WaitNextEvent (everyEvent, &ev, 1, nil);
-
- if (ev.what == nullEvent) /*got all the meaningful events*/
- return (true);
-
- maineventhandler (ev);
- } /*while*/
-
- return (false); /*user must have selected the quit command*/
- } /*serviceeventqueue*/
-
-
- static pascal Boolean openfilespec (fs) FSSpec *fs; {
-
- bigstring bs;
-
- if (!directorytopath ((*fs).parID, (*fs).vRefNum, bs))
- return (false);
-
- pushstring ((*fs).name, bs);
-
- if (!openwindow (bs, 0)) {
-
- IACreturnerror (-1, bserrorstring);
-
- return (false);
- }
-
- return (true);
- } /*openfilespec*/
-
-
- static pascal OSErr handleopen (AppleEvent *event, AppleEvent *reply, long refcon) {
-
- IACglobals.event = event;
-
- IACglobals.reply = reply;
-
- IACglobals.refcon = refcon;
-
- return (IACdrivefilelist (&openfilespec));
- } /*handleopen*/
-
-
- static pascal Boolean printfilespec (fs) FSSpec *fs; {
-
- hdlappwindow appwindow;
- bigstring fullpath;
- bigstring fname;
- short vnum;
-
- if (!directorytopath ((*fs).parID, (*fs).vRefNum, fullpath))
- return (false);
-
- pushstring ((*fs).name, fullpath);
-
- if (!pathtofileinfo (fullpath, fname, &vnum))
- return (false);
-
- if (findbyfile (fname, vnum, &appwindow))
- selectappwindow (appwindow);
-
- else {
- if (!openwindow (fullpath, 0)) {
-
- IACreturnerror (-1, bserrorstring);
-
- return (false);
- }
- }
-
- setfrontglobals (); /*event applies to frontmost window*/
-
- return (printappwindow (app.appwindow, false));
- } /*printfilespec*/
-
-
- static pascal OSErr handleprint (event, reply, refcon) AEDescList *event, *reply; long refcon; {
-
- IACglobals.event = event;
-
- IACglobals.reply = reply;
-
- IACglobals.refcon = refcon;
-
- return (IACdrivefilelist (&printfilespec));
- } /*handleprint*/
-
-
- static pascal OSErr handlequit (event, reply, refcon) AEDescList *event, *reply; long refcon; {
-
- exitmainloop ();
-
- return (noErr);
- } /*handlequit*/
-
-
- static pascal OSErr handleopenapp (event, reply, refcon) AEDescList *event, *reply; long refcon; {
-
- return (noErr);
- } /*handleopenapp*/
-
-
- static pascal Boolean handlescriptcomplete (void) {
-
- resetdirtyscrollbars ();
-
- return (true);
- } /*handlescriptcomplete*/
-
-
- static boolean initIAC (void) {
-
- setstringlength (bstargetwindowname, 0); /*no target window initially*/
-
- if (!InitSharedMenus ()) /*initialize the menusharing routines*/
- return (false);
-
- MSglobals.scriptcompletedcallback = (tyMScallback) &handlescriptcomplete;
-
- if (!IACinstallhandler (app1class, typeWildCard, (ProcPtr) &handleapp1verb))
- return (false);
-
- if (!IACinstallhandler (app.creator, typeWildCard, (ProcPtr) &handlecustomverb))
- return (false);
-
- if (!IACinstallhandler (kCoreEventClass, kAEOpenApplication, (ProcPtr) &handleopenapp))
- return (false);
-
- if (!IACinstallhandler (kCoreEventClass, kAEOpenDocuments, (ProcPtr) &handleopen))
- return (false);
-
- if (!IACinstallhandler (kCoreEventClass, kAEPrintDocuments, (ProcPtr) &handleprint))
- return (false);
-
- if (!IACinstallhandler (kCoreEventClass, kAEQuitApplication, (ProcPtr) &handlequit))
- return (false);
-
- return (true);
- } /*initIAC*/
-
-
- static boolean managersinited = false;
-
-
- void appletinitmanagers (void) {
-
- initmacintosh ();
-
- initmenus ();
-
- initbitmaps (true);
-
- initprint ();
-
- initIAC ();
-
- clearbytes (&mousestatus, longsizeof (mousestatus));
-
- managersinited = true;
- } /*appletinitmanagers*/
-
-
- static boolean noopcallback (void) {
-
- /*sysbeep;*/
-
- return (false);
- } /*noopcallback*/
-
-
- static void checkcallback (tyappcallback *cb) {
-
- if (*cb == nil) /*the applet doesn't define this callback*/
- *cb = &noopcallback;
- } /*checkcallback*/
-
-
- static void checknilcallbacks (void) {
-
- installscroll (); /*install the default handler if appropriate*/
-
- checkcallback (&app.newrecordcallback);
-
- checkcallback (&app.disposerecordcallback);
-
- checkcallback (&app.adjustcursorcallback);
-
- checkcallback ((tyappcallback *) &app.activatecallback);
-
- checkcallback (&app.updatecallback);
-
- checkcallback (&app.windowresizecallback);
-
- checkcallback (&app.iacmessagecallback);
-
- checkcallback ((tyappcallback *) &app.packcallback);
-
- checkcallback ((tyappcallback *) &app.unpackcallback);
-
- checkcallback ((tyappcallback *) &app.gettextcallback);
-
- checkcallback ((tyappcallback *) &app.getpictcallback);
-
- checkcallback (&app.resetscrollbarscallback);
-
- checkcallback ((tyappcallback *) &app.scrollcallback);
-
- checkcallback (&app.pagesetupcallback);
-
- checkcallback (&app.openprintcallback);
-
- checkcallback ((tyappcallback *) &app.printpagecallback);
-
- checkcallback (&app.closeprintcallback);
-
- checkcallback ((tyappcallback *) &app.puttextcallback);
-
- checkcallback ((tyappcallback *) &app.putpictcallback);
-
- checkcallback (&app.haveselectioncallback);
-
- checkcallback (&app.selectallcallback);
-
- checkcallback (&app.keystrokecallback);
-
- checkcallback (&app.mousecallback);
-
- checkcallback (&app.mouseinstatuscallback);
-
- checkcallback (&app.updatestatuscallback);
- } /*checknilcallbacks*/
-
-
- void runapplet (void) {
-
- if (!managersinited)
- appletinitmanagers ();
-
- checknilcallbacks ();
-
- maineventloop ();
- } /*runapplet*/
-