home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Environments / Frontier 4.0.1 / Frontier SDK 4.0b2 / Sample Code / Apple Events 101 / Server / server.c next >
Encoding:
C/C++ Source or Header  |  1994-07-27  |  7.9 KB  |  460 lines  |  [TEXT/CWIE]

  1.  
  2. /*© copyright 1991-96 UserLand Software, Inc. All Rights Reserved.*/
  3.  
  4.  
  5. #include <AppleEvents.h>
  6.  
  7.  
  8. #define applemenu 128 
  9. #define aboutitem 1 
  10.  
  11. #define filemenu 129
  12. #define quititem 1
  13.  
  14. MenuHandle happlemenu, hfilemenu; 
  15.  
  16. WindowPtr mainwindow = nil;
  17.  
  18. Str255 windowmessage; 
  19.  
  20. Boolean flexitmainloop = false; 
  21.  
  22. Boolean flcurrentlyactive = true;
  23.  
  24.  
  25. /*
  26. 7/19/94 dmb: Updated for Univeral Headers / PowerPC
  27. */
  28.  
  29.  
  30.  
  31. static void initMacintosh (void) {
  32.  
  33.     /*
  34.     the magic stuff that every Macintosh application needs to do 
  35.     before doing anything else.
  36.     */
  37.  
  38.     short i;
  39.         
  40.     MaxApplZone ();
  41.     
  42.     for (i = 0; i < 10; i++) 
  43.         MoreMasters ();
  44.     
  45.     InitGraf (&qd.thePort);
  46.     
  47.     InitFonts ();
  48.     
  49.     FlushEvents (everyEvent, 0);
  50.     
  51.     InitWindows ();
  52.     
  53.     InitMenus ();
  54.     
  55.     TEInit ();
  56.     
  57.     InitDialogs (0L);
  58.     
  59.     InitCursor ();
  60.     
  61.     for (i = 0; i < 5; i++) { /*register with Multifinder*/
  62.         
  63.         EventRecord ev;
  64.         
  65.         EventAvail (everyEvent, &ev); /*see TN180 -- splash screen*/
  66.         } /*for*/
  67.     } /*initMacintosh*/
  68.  
  69.  
  70. static void initAppMenus (void) {
  71.     
  72.     happlemenu = GetMenu (applemenu); 
  73.     
  74.     AddResMenu (happlemenu, 'DRVR'); 
  75.     
  76.     InsertMenu (happlemenu, 0); 
  77.     
  78.     hfilemenu = GetMenu (filemenu); 
  79.     
  80.     InsertMenu (hfilemenu, 0);
  81.     
  82.     DrawMenuBar ();
  83.     } /*initAppMenus*/
  84.  
  85.  
  86. static Boolean initMainWindow (void) {
  87.     
  88.     mainwindow = GetNewWindow (128, nil, (WindowPtr) -1);
  89.     
  90.     if (mainwindow == nil)
  91.         return (false);
  92.     
  93.     ShowWindow (mainwindow);
  94.     
  95.     return (true);
  96.     } /*initMainWindow*/
  97.  
  98.  
  99. static void ellipsize (Str255 s, short width) {
  100.  
  101.     /*
  102.     if the string fits inside the given number of pixels, fine -- do nothing
  103.     and return.
  104.     
  105.     if not, return a string that does fit, with ellipses representing the 
  106.     deleted characters.  ellipses are generated by pressing option-semicolon.
  107.     */
  108.     
  109.     char len;
  110.     short newwidth;
  111.     
  112.     if ((newwidth = StringWidth (s)) <= width) /*nothing to do, the string fits*/
  113.         return;
  114.     
  115.     len = s [0]; /* current length in characters*/
  116.     
  117.     width -= CharWidth ('…'); /* subtract width of ellipses*/
  118.         
  119.     do { /*until it fits (or we run out of characters)*/
  120.     
  121.         newwidth -= CharWidth (s [len]);
  122.         
  123.         --len;
  124.     } while ((newwidth > width) && (len != 0));
  125.     
  126.     ++len; /*make room for the ellipses*/
  127.     
  128.     s [len] = '…'; 
  129.     
  130.     s [0] = (char) len;
  131.     } /*ellipsize*/
  132.  
  133.  
  134. static void centerString (Rect r, Str255 s) {
  135.     
  136.     /*
  137.     draw the string in the current font, size and style, centered inside
  138.     the indicated rectangle.
  139.     */
  140.     
  141.     short rh = r.bottom - r.top;
  142.     short rw = r.right - r.left;
  143.     short h, v;
  144.     FontInfo fi;
  145.     
  146.     GetFontInfo (&fi);
  147.     
  148.     ellipsize (s, rw); /*make sure it fits inside the rectangle, width-wise*/
  149.     
  150.     h = r.left + ((rw - StringWidth (s)) / 2);
  151.     
  152.     v = r.top + ((rh - (fi.ascent + fi.descent)) / 2) + fi.ascent;
  153.     
  154.     MoveTo (h, v);
  155.     
  156.     ClipRect (&r);
  157.     
  158.     DrawString (s);
  159.     } /*centerString*/
  160.  
  161.  
  162. static void setFontSizeStyle (short fontnum, short fontsize, short fontstyle) {
  163.  
  164.     TextFont (fontnum);
  165.     
  166.     TextSize (fontsize);
  167.     
  168.     TextFace (fontstyle);
  169.     } /*setFontSizeStyle*/
  170.     
  171.     
  172. static void updateMainWindow (void) {
  173.     
  174.     Rect r;
  175.     Str255 s;
  176.     
  177.     r = (*mainwindow).portRect;
  178.     
  179.     EraseRect (&r);
  180.     
  181.     setFontSizeStyle (helvetica, 18, bold);
  182.     
  183.     centerString (r, windowmessage);
  184.     
  185.     NumToString (FreeMem () / 1024, s);
  186.     
  187.     MoveTo (r.left + 3, r.bottom - 3);
  188.     
  189.     setFontSizeStyle (geneva, 9, 0);
  190.     
  191.     DrawString (s);
  192.     
  193.     DrawString ("\pK");
  194.     } /*updateMainWindow*/
  195.     
  196.     
  197. static void handleUpdate (EventRecord *ev) {
  198.     
  199.     WindowPtr w;
  200.     
  201.     w = (WindowPtr) (*ev).message;
  202.     
  203.     BeginUpdate (w);
  204.     
  205.     SetPort (w);
  206.     
  207.     updateMainWindow ();
  208.     
  209.     EndUpdate (w);
  210.     } /*handleUpdate*/
  211.  
  212.  
  213. static void handleDrag (EventRecord *ev, WindowPtr w) {
  214.     
  215.     Rect r;
  216.  
  217.     r = qd.screenBits.bounds; 
  218.     
  219.     r.top = r.top + GetMBarHeight (); 
  220.     
  221.     InsetRect (&r, 4, 4);
  222.     
  223.     DragWindow (w, (*ev).where, &r);
  224.     } /*handleDrag*/
  225.  
  226.  
  227. static void handleMenu (long codeword) {
  228.     
  229.     short idmenu, iditem;
  230.     
  231.     iditem = LoWord (codeword);
  232.     
  233.     idmenu = HiWord (codeword);
  234.     
  235.     switch (idmenu) {
  236.     
  237.         case applemenu: 
  238.             switch (iditem) {
  239.                 
  240.                 case aboutitem:
  241.                     Alert (262, nil);
  242.                     
  243.                     break;
  244.             
  245.                 default: {
  246.                     Str255 s;
  247.                     
  248.                     GetItem (happlemenu, iditem, s);
  249.                     
  250.                     OpenDeskAcc (s);
  251.                     
  252.                     break;
  253.                     }
  254.                 } /*switch*/
  255.             
  256.             break; /*apple menu*/
  257.  
  258.         case filemenu: 
  259.             switch (iditem) {
  260.                 
  261.                 case quititem:
  262.                     flexitmainloop = true;
  263.                     
  264.                     break;
  265.                 } /*switch*/
  266.             
  267.             break; /*file menu*/
  268.             
  269.         } /*switch*/
  270.         
  271.     exit:
  272.     
  273.     HiliteMenu (0);
  274.     } /*handleMenu*/
  275.  
  276.  
  277. static void handleMouse (EventRecord *ev) {
  278.  
  279.     WindowPtr w;
  280.     
  281.     switch (FindWindow ((*ev).where, &w)) {
  282.     
  283.         case inMenuBar: 
  284.             handleMenu (MenuSelect ((*ev).where)); 
  285.             
  286.             break;
  287.         
  288.         case inSysWindow:
  289.             SystemClick (ev, w); 
  290.             
  291.             break;
  292.         
  293.         case inDrag:
  294.             handleDrag (ev, w);
  295.             
  296.             break;
  297.         } /*switch*/
  298.     } /*handleMouse*/
  299.  
  300.  
  301. static void handleEvent (EventRecord *ev) { 
  302.     
  303.     switch ((*ev).what) {
  304.     
  305.         case keyDown: case autoKey: 
  306.             if ((*ev).modifiers & cmdKey)
  307.                 handleMenu (MenuKey ((*ev).message & charCodeMask)); 
  308.             
  309.             break;
  310.             
  311.         case mouseDown:
  312.             handleMouse (ev);
  313.             
  314.             break;
  315.         
  316.         case updateEvt:
  317.             handleUpdate (ev);
  318.             
  319.             break;
  320.         
  321.         case osEvt:
  322.             flcurrentlyactive = ((*ev).message & resumeFlag) != 0;
  323.             
  324.             break;
  325.         
  326.         case kHighLevelEvent:
  327.             AEProcessAppleEvent (ev);
  328.             
  329.             break;
  330.         } /*switch*/
  331.     } /*handleEvent*/
  332.  
  333.  
  334. static void AEReturnError (AppleEvent *reply, OSErr errornum, Str255 errorstring) {
  335.     
  336.     AEPutParamPtr (reply, keyErrorNumber, typeShortInteger, (Ptr) &errornum, sizeof (errornum));
  337.         
  338.     AEPutParamPtr (reply, keyErrorString, typeChar, (Ptr) &errorstring [1], errorstring [0]);
  339.     } /*AEReturnError*/
  340.     
  341.         
  342. static pascal OSErr openAppEvent (const AppleEvent *event, AppleEvent *reply, long refcon) {
  343.     
  344.     return (noErr);
  345.     } /*openAppEvent*/
  346.  
  347.  
  348. static pascal OSErr openDocEvent (const AppleEvent *event, AppleEvent *reply, long refcon) {
  349.     
  350.     return (noErr);
  351.     } /*openDocEvent*/
  352.     
  353.         
  354. static pascal OSErr printEvent (const AppleEvent *event, AppleEvent *reply, long refcon) {
  355.     
  356.     return (noErr);
  357.     } /*printEvent*/
  358.     
  359.     
  360. static pascal OSErr setMessageEvent (const AppleEvent *event, AppleEvent *reply, long refcon) {
  361.  
  362.     AEDesc result;
  363.     OSErr ec;
  364.     long len;
  365.     
  366.     ec = AEGetParamDesc (event, keyDirectObject, typeChar, &result);
  367.     
  368.     if (ec != noErr) {
  369.         
  370.         AEReturnError (reply, ec, "\pThe setmessage event requires a text parameter.");
  371.         
  372.         return (false);
  373.         }
  374.         
  375.     len = GetHandleSize (result.dataHandle);
  376.     
  377.     if (len > 255) /*it must fit in a Str255*/
  378.         len = 255;
  379.         
  380.     windowmessage [0] = len; /*set the length of the string*/
  381.     
  382.     BlockMove (*result.dataHandle, &windowmessage [1], len);
  383.     
  384.     AEDisposeDesc (&result);
  385.     
  386.     SetPort (mainwindow);
  387.     
  388.     InvalRect (&(*mainwindow).portRect);
  389.     
  390.     /*convert the string to a number, return it to the client*/ {
  391.         
  392.         long num;
  393.         
  394.         StringToNum (windowmessage, &num);
  395.         
  396.         AEPutParamPtr (reply, keyDirectObject, typeLongInteger, (Ptr) &num, sizeof (num));
  397.         }
  398.     
  399.     return (noErr);
  400.     } /*setMessageEvent*/
  401.     
  402.     
  403. static pascal OSErr quitEvent (const AppleEvent *event, AppleEvent *reply, long refcon) {
  404.     
  405.     flexitmainloop = true;
  406.     
  407.     return (noErr);
  408.     } /*quitEvent*/
  409.     
  410.     
  411. static Boolean installhandlers (void) {
  412.  
  413.     if (AEInstallEventHandler ('SERV', 'DISP', NewAEEventHandlerProc (setMessageEvent), 0, false) != noErr)
  414.         return (false);
  415.     
  416.     if (AEInstallEventHandler (kCoreEventClass, kAEOpenApplication, NewAEEventHandlerProc (openAppEvent), 0, false) != noErr)
  417.         return (false);
  418.     
  419.     if (AEInstallEventHandler (kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerProc (openDocEvent), 0, false) != noErr)
  420.         return (false);
  421.     
  422.     if (AEInstallEventHandler (kCoreEventClass, kAEPrintDocuments, NewAEEventHandlerProc (printEvent), 0, false) != noErr)
  423.         return (false);
  424.     
  425.     if (AEInstallEventHandler (kCoreEventClass, kAEQuitApplication, NewAEEventHandlerProc (quitEvent), 0, false) != noErr)
  426.         return (false);
  427.     
  428.     return (true);
  429.     } /*installhandlers*/
  430.     
  431.  
  432. void main (void) {
  433.     
  434.     EventRecord ev;
  435.     
  436.     initMacintosh ();
  437.     
  438.     if (!installhandlers ()) {
  439.     
  440.         Alert (261, nil); /*couldn't install Apple Event handlers*/
  441.         
  442.         return;
  443.         }
  444.     
  445.     initAppMenus ();
  446.     
  447.     initMainWindow ();
  448.     
  449.     while (!flexitmainloop) {
  450.         
  451.         WaitNextEvent (everyEvent, &ev, 1, nil);
  452.         
  453.         handleEvent (&ev);
  454.         } /*while*/
  455.     } /*main*/
  456.  
  457.  
  458.  
  459.  
  460.