home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 April: Mac OS SDK / Dev.CD Apr 98 SDK1.toast / Development Kits (Disc 1) / QuickDraw 3D / Samples / SampleCode / VCDemo / Source / EventLoop.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-14  |  8.5 KB  |  355 lines  |  [TEXT/MPS ]

  1. /*
  2.     EventLoop.c
  3.  
  4.     Handle events.
  5.  
  6.     © 1995 Apple Computer, Inc.
  7. */
  8.  
  9. #include <QuickDraw.h>
  10. #include <Events.h>
  11. #include <Windows.h>
  12. #include <Menus.h>
  13. #include <Devices.h>
  14. #include <Events.h>
  15. #include <Controls.h>
  16. #include <Menus.h>
  17. #include <ToolUtils.h>
  18. #include <SegLoad.h>
  19.  
  20. #include "EventLoop.h"
  21. #include "MenuDispatch.h"
  22. #include "QD3DViewer.h"
  23.  
  24. Boolean        Done = false;                /* true when Quit is selected */
  25. Boolean        KeyPressed = false;            /* true most recent event is a keyDown event */
  26. char        KeyValue = 0;                /* the ascii code of the most recent key down */
  27.  
  28. Boolean        WNE_available = false;        /* Does WNE exist on this mac?? */
  29. Boolean        BackgroundFlag = false;        /* true if we are in the background */
  30.  
  31. void DoCloseWindow(register EventRecord *evt, register WindowPtr theWindow);
  32. void DoClickInContent(register EventRecord *evt, register WindowPtr theWindow);
  33. void DoDragWindow(register EventRecord *evt, register WindowPtr theWindow);
  34. void DoGrowWindow(register EventRecord *evt, register WindowPtr theWindow);
  35. void DoZoom(register EventRecord *evt, register WindowPtr theWindow, int part);
  36. void DoMenu(register long msel);
  37. void DoKey(register EventRecord *evt);
  38. void DrawClippedGrowIcon(WindowPtr theWindow);
  39. void DoUpdate(register EventRecord *evt);
  40. void ActivateWindow(register WindowRecord    *newFrontWindow);
  41. void DeactivateWindow(register WindowRecord    *newBehindWindow);
  42. void DoActivate(register EventRecord *evt);
  43. void DoMFinder(register EventRecord *evt);
  44. void DoClick(register EventRecord *evt);
  45. void MainEvent(void);
  46.  
  47. extern void MenuDispatch(short menuNumber,short itemNumber);
  48. extern void DrawImage(GrafPtr graf);
  49. extern void AdjustMenuItems(void);
  50. extern void ChooseFile(short item);
  51.  
  52. extern WindowPtr        MainView;
  53.  
  54. void DoCloseWindow(register EventRecord *evt, register WindowPtr theWindow)
  55. {
  56.     if(TrackGoAway(theWindow,evt->where)) {
  57.         ChooseFile(cmdClose);
  58.     }
  59. }
  60.  
  61. void DoClickInContent(register EventRecord *evt, register WindowPtr theWindow)
  62. {
  63.     int                part;
  64.     ControlHandle    ctlh;
  65.     Point            pt;
  66.     GrafPtr            saveport;
  67.     Rect            frame;
  68.     
  69.     if(theWindow != FrontWindow())
  70.     {
  71.         SelectWindow(theWindow);
  72.         MainView = theWindow;
  73.     }
  74.     else
  75.     {
  76.         GetPort(&saveport);
  77.         SetPort(theWindow);
  78.         pt = evt->where;
  79.         GlobalToLocal(&pt);
  80.         if ((part = FindControl(pt, theWindow, &ctlh)) != kControlNoPart) {
  81.             /* TrackControl Goes Here */
  82.         }
  83.         SetPort(saveport);
  84.     }
  85. }
  86.  
  87.  
  88. void DoDragWindow(register EventRecord *evt, register WindowPtr theWindow)
  89. {
  90.     DragWindow(theWindow,evt->where,&qd.screenBits.bounds);
  91. }
  92.  
  93.  
  94. void DoGrowWindow(register EventRecord *evt, register WindowPtr theWindow)
  95. {
  96.     long    newSize;
  97.     int        newHeight,newWidth;
  98.     Rect    growLimitSizes;
  99.     OSErr    anErr;
  100.  
  101.     SetPort(theWindow);
  102.  
  103.     growLimitSizes.top = 20;        /* min height */
  104.     growLimitSizes.bottom = 400;    /* max height */
  105.     growLimitSizes.left = 20;         /* min width */
  106.     growLimitSizes.right = 600;        /* max width */
  107.  
  108.     newSize = GrowWindow(theWindow,evt->where, &growLimitSizes);
  109.     if (newSize)
  110.     {
  111.         newHeight = HiWord(newSize);
  112.         newWidth = LoWord(newSize);
  113.         SizeWindow(theWindow, newWidth, newHeight, true);
  114.         InvalRect(&theWindow->portRect);
  115.         if (theWindow == MainView)
  116.         {
  117.             TVCDemoDataHdl    demoData;
  118.             TQ3ViewerObject    aViewer;
  119.  
  120.             demoData = (TVCDemoDataHdl)GetWRefCon(MainView);
  121.             aViewer = (*demoData)->viewer1;
  122.             anErr = Q3ViewerSetBounds(aViewer, &theWindow->portRect);
  123.         }
  124.     }
  125. }
  126.  
  127. void DoZoom(register EventRecord *evt, register WindowPtr theWindow, int part)
  128. {
  129.     GrafPtr savePort;
  130.     OSErr    anErr;
  131.     
  132.     GetPort(&savePort);
  133.     SetPort(theWindow);
  134.     
  135.     if(TrackBox(theWindow,evt->where,part)) {
  136.         ZoomWindow(theWindow,part,true);
  137.         if (theWindow == MainView)
  138.         {
  139.             Rect            newRect;
  140.             TQ3ViewerObject    aViewer;
  141.             TVCDemoDataHdl    demoData;
  142.     
  143.             demoData = (TVCDemoDataHdl)GetWRefCon(MainView);
  144.             aViewer = (*demoData)->viewer1;
  145.  
  146.             newRect = theWindow->portRect;
  147.             anErr = Q3ViewerSetBounds(aViewer, &newRect);
  148.         }
  149.     }
  150.     SetPort(savePort);
  151. }
  152.  
  153. void DoMenu(register long msel)
  154. {
  155.     int item,menu;
  156.  
  157.     item = LoWord(msel);
  158.     menu = HiWord(msel);
  159.     MenuDispatch(menu, item);
  160.     HiliteMenu(0);
  161. }
  162.  
  163. void DoKey(register EventRecord *evt)
  164. {
  165.     char        c;
  166.     
  167.     c = (char)evt->message & charCodeMask;
  168.     
  169.     if((evt->modifiers & cmdKey) == false) {
  170.         KeyPressed = true;
  171.         KeyValue = c;
  172.     } else {
  173.         AdjustMenuItems();
  174.         DoMenu(MenuKey(evt->message & charCodeMask));    
  175.     }
  176. }
  177.  
  178. void DrawClippedGrowIcon(WindowPtr theWindow)
  179. /*
  180.     Clip out the lines that appear
  181.     on the sides of a window with a grow icon.
  182. */
  183. {
  184.     Rect        clip;
  185.     RgnHandle    oldClip;
  186.     
  187.     oldClip = NewRgn();
  188.     GetClip(oldClip);
  189.     clip = theWindow->portRect;
  190.     clip.left = clip.right - 15;
  191.     clip.top = clip.bottom - 15;
  192.  
  193.     ClipRect(&clip);
  194.     
  195.     DrawGrowIcon(theWindow);
  196.     SetClip(oldClip);
  197. }
  198.  
  199. void DoUpdate(register EventRecord *evt)
  200. {
  201.     WindowPtr        updateWindow;
  202.     GrafPtr            savePort;
  203.     TQ3ViewerObject    aViewer;
  204.     TVCDemoDataHdl    demoData;
  205.  
  206.     GetPort(&savePort);                        /* save current port */
  207.     
  208.     updateWindow=(WindowPtr)evt->message;    /* get windowPtr from event msg */
  209.     SetPort(updateWindow);
  210.     BeginUpdate(updateWindow);                        
  211.     EraseRect(&updateWindow->portRect);        /* erase content region */
  212.  
  213.     demoData = (TVCDemoDataHdl)GetWRefCon(updateWindow);
  214.     aViewer = (*demoData)->viewer1;
  215.     if (Q3ViewerDraw(aViewer) != 0)            /* Draw the view controller contents */
  216.         ExitToShell();
  217.         
  218.     if ((*demoData)->containerStyle == kContainerFourView)
  219.     {
  220.         aViewer = (*demoData)->viewer2;
  221.         Q3ViewerDraw(aViewer);                /* Draw the view controller contents */
  222.         aViewer = (*demoData)->viewer3;
  223.         Q3ViewerDraw(aViewer);                /* Draw the view controller contents */
  224.         aViewer = (*demoData)->viewer4;
  225.         Q3ViewerDraw(aViewer);                /* Draw the view controller contents */
  226.     }
  227.     
  228.     DrawControls(updateWindow);                /* draw any controls in the window */
  229.     DrawClippedGrowIcon(updateWindow);
  230.     EndUpdate(updateWindow);
  231.         
  232.     SetPort(savePort);
  233. }
  234.  
  235.  
  236. void ActivateWindow(register WindowRecord    *newFrontWindow)
  237. {
  238.     /* This window is now active.  Controls should be enabled, etc. */
  239. }
  240.  
  241. void DeactivateWindow(register WindowRecord    *newBehindWindow)
  242. {
  243.     /* 
  244.         do anyting necessary to deactivate your windows here.
  245.         controls should be dimmed, etc.
  246.     */
  247. }
  248.  
  249. void DoActivate(register EventRecord *evt)
  250. {
  251.     if(evt->modifiers & activeFlag)
  252.         ActivateWindow((WindowRecord *)evt->message);
  253.     else
  254.         DeactivateWindow((WindowRecord *)evt->message);
  255. }
  256.  
  257. void DoMFinder(register EventRecord *evt)
  258. {
  259.     if( (evt->message >> 24) == suspendResumeMessage)
  260.         BackgroundFlag = !(evt->message & resumeFlag);
  261. }
  262.  
  263. void DoClick(register EventRecord *evt)
  264. {
  265.     WindowPtr    theWindow;
  266.     
  267.     switch(FindWindow(evt->where, &theWindow)) {
  268.         case inDesk:        break;
  269.         case inMenuBar:        AdjustMenuItems();
  270.                             DoMenu(MenuSelect(evt->where));
  271.                             break;
  272.         case inSysWindow:    SystemClick(evt,theWindow);
  273.                             break;
  274.         case inContent:        DoClickInContent(evt,theWindow);
  275.                             break;
  276.         case inDrag:        DoDragWindow(evt,theWindow);
  277.                             break;
  278.         case inGrow:        DoGrowWindow(evt,theWindow);
  279.                             break;
  280.         case inGoAway:        DoCloseWindow(evt,theWindow);
  281.                             break;
  282.         case inZoomIn:        DoZoom(evt,theWindow,inZoomIn);
  283.                             break;
  284.         case inZoomOut:        DoZoom(evt,theWindow,inZoomOut);
  285.                             break;
  286.         default:            break;
  287.     }
  288. }
  289.  
  290.  
  291. void MainEvent(void)
  292. {
  293.     EventRecord    event;
  294.     Boolean        eventOccured, wasQ3Event;
  295.     Point        localPt;
  296.     TQ3ViewerObject    aViewer = NULL;
  297.     
  298.     KeyPressed = false;                /* set to false every time through    */
  299.     if (WNE_available)
  300.         eventOccured = WaitNextEvent(everyEvent,&event,10,nil);
  301.     else {
  302.         SystemTask();
  303.         eventOccured = GetNextEvent(everyEvent, &event);
  304.     }
  305.     if (eventOccured)
  306.     {
  307.         wasQ3Event = false;
  308.         if (MainView && (event.what != updateEvt))
  309.         {
  310.             TVCDemoDataHdl    demoData;
  311.     
  312.             demoData = (TVCDemoDataHdl)GetWRefCon(MainView);
  313.             aViewer = (*demoData)->viewer1;
  314.             SetPort(MainView);                /* just to make sure */
  315.             GetMouse(&localPt);
  316.             if (!Q3ViewerAdjustCursor(aViewer, &localPt))
  317.                 InitCursor();
  318.             wasQ3Event = Q3ViewerEvent(aViewer, &event);
  319.             if (((*demoData)->containerStyle == kContainerFourView) && !wasQ3Event)
  320.             {
  321.                 aViewer = (*demoData)->viewer2;
  322.                 wasQ3Event = Q3ViewerEvent(aViewer, &event);
  323.  
  324.                 if (!wasQ3Event)
  325.                 {
  326.                     aViewer = (*demoData)->viewer3;
  327.                     wasQ3Event = Q3ViewerEvent(aViewer, &event);
  328.                     if (!wasQ3Event)
  329.                     {
  330.                         aViewer = (*demoData)->viewer4;
  331.                         wasQ3Event = Q3ViewerEvent(aViewer, &event);
  332.                     }
  333.                 }
  334.             }
  335.         }
  336.         if (!wasQ3Event)
  337.             switch(event.what)
  338.             {
  339.                 case nullEvent:                                break;
  340.                 case mouseDown:        DoClick(&event);        break;
  341.                 case mouseUp:                                 break;
  342.                 case keyDown:        DoKey(&event);            break;
  343.                 case keyUp:                                     break;
  344.                 case autoKey:        DoKey(&event);            break;
  345.                 case updateEvt:        DoUpdate(&event);        break;
  346.                 case diskEvt:                                 break;
  347.                 case activateEvt:    DoActivate(&event);        break;
  348.                 case osEvt:            DoMFinder(&event);        break;
  349.                 default:                                    break;
  350.             }
  351.     }
  352. }
  353.  
  354. /* EOF */
  355.