home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / QuickDraw3D 1.6 SDK / Mac SampleCode New for 1.6 / ViewerCallbackSample / Source / Viewer_Callbacks.c next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  7.0 KB  |  332 lines  |  [TEXT/CWIE]

  1. /* 
  2.  *    Viewer_Callbacks.c
  3.  *
  4.  *    QuickDraw 3D 1.6 Sample
  5.  *    Robert Dierkes
  6.  *
  7.  *     12/22/98    RDD        Created.
  8.  */
  9.  
  10. /*------------------*/
  11. /*    Include Files    */
  12. /*------------------*/
  13. #include "QD3D.h"
  14. #include "QD3DDrawContext.h"
  15. #include "QD3DView.h"
  16. #include "QD3DViewer.h"
  17.  
  18. #if defined(OS_MACINTOSH) && OS_MACINTOSH
  19. #include <MacWindows.h>
  20. #include <ToolUtils.h>
  21. #endif
  22.  
  23. #include "Viewer_Error.h"
  24. #include "Viewer_Events.h"
  25. #include "Viewer_Callbacks.h"
  26.  
  27.  
  28. //    #define    TEST_CustomWindowResizeCallback                /**/
  29. //    #define    TEST_CustomPaneResizeCallback                /**/
  30. //    #define    RESIZE_WINDOW_IN_CustomPaneResizedCallback    /**/
  31. //--√    #define    TEST_CustomDrawingCallback
  32.  
  33.  
  34. /*----------------------*/
  35. /*    Global Declarations    */
  36. /*----------------------*/
  37. static Rect        gLastBounds1 = { 0, 0, 0, 0 };
  38. static Rect        gLastBounds2 = { 0, 0, 0, 0 };
  39.  
  40.  
  41. /*----------------------*/
  42. /*    Local Prototypes    */
  43. /*----------------------*/
  44. static
  45. TQ3Status    Sample_WindowResizeCallback(
  46.     TQ3ViewerObject        viewer,
  47.     const void            *data);
  48.  
  49. static
  50. TQ3Status    Sample_PaneResizeNotifyCallback(
  51.     TQ3ViewerObject        viewer,
  52.     const void            *data);
  53.  
  54. static
  55. OSErr    Sample_DrawingCallback(
  56.     TQ3ViewerObject        viewer,
  57.     const void            *data);
  58.  
  59.  
  60.  
  61. /*
  62.  * Callbacks_InitWindowResizeCallback
  63.  */
  64. TQ3Status Callbacks_InitWindowResizeCallback(
  65.     TQ3ViewerObject    viewer,
  66.     WindowPtr        window)
  67. {
  68.     OSErr            theErr = noErr;
  69.  
  70.     theErr = Q3ViewerSetWindowResizeCallback(
  71.                 viewer,
  72.                 Sample_WindowResizeCallback,
  73.                 window);    /* Test the user parameter */
  74.  
  75.     return (theErr == noErr) ? kQ3Success : kQ3Failure;    
  76. }
  77.  
  78.  
  79. /*
  80.  * Callbacks_InitPaneResizeCallback
  81.  */
  82. TQ3Status Callbacks_InitPaneResizeCallback(
  83.     TQ3ViewerObject    viewer,
  84.     WindowPtr        window,
  85.     unsigned long    example)
  86. {
  87.     TQ3ViewObject    view        = NULL;
  88.     TQ3Status        status        = kQ3Failure;
  89.     OSErr            theErr        = noErr;
  90.     Rect            *pRect;
  91.  
  92.     #pragma unused(window)
  93.  
  94.     /* Save Viewer's previous bounds in global */
  95.     if ((view = Q3ViewerGetView(viewer)) == NULL) {
  96.         ERROR_DEBUG_STR("Callbacks_InitPaneResizeCallback: Q3ViewerGetView failed.");
  97.         return kQ3Failure;    
  98.     }
  99.  
  100.     pRect = (example == 0) ? &gLastBounds1 : &gLastBounds2;
  101.  
  102.     /* Pass in global to Viewer's previous bounds */
  103.     if ((theErr = Q3ViewerGetBounds(viewer, pRect)) != noErr) {
  104.         ERROR_DEBUG_STR("Callbacks_InitPaneResizeCallback: Q3ViewerGetBounds failed.");
  105.         return kQ3Failure;    
  106.     }
  107.  
  108.     theErr = Q3ViewerSetPaneResizeNotifyCallback(
  109.                 viewer,
  110.                 Sample_PaneResizeNotifyCallback,
  111.                 pRect);    /* Test the user parameter */
  112.  
  113.     return (theErr == noErr) ? kQ3Success : kQ3Failure;    
  114. }
  115.  
  116.  
  117. /*
  118.  * Callbacks_InitDrawingCallback
  119.  */
  120. TQ3Status Callbacks_InitDrawingCallback(
  121.     TQ3ViewerObject    viewer,
  122.     WindowPtr        window)
  123. {
  124.     OSErr            theErr    = noErr;
  125.  
  126.     theErr = Q3ViewerSetDrawingCallbackMethod(
  127.                 viewer,
  128.                 Sample_DrawingCallback,
  129.                 window);    /* Test the user parameter */
  130.  
  131.     return (theErr == noErr) ? kQ3Success : kQ3Failure;    
  132. }
  133.  
  134.  
  135. #pragma mark -
  136.  
  137. /*
  138.  * Sample_WindowResizeCallback
  139.  *
  140.  * Called after user clicks in the Viewer's window grow box.
  141.  * This only works if the kQ3ViewerDrawGrowBox flag is enabled
  142.  * and does _not_ work if the kQ3ViewerPaneGrowBox flag is enabled.
  143.  */
  144. static
  145. TQ3Status    Sample_WindowResizeCallback(
  146.     TQ3ViewerObject viewer,
  147.     const void        *data)
  148. {
  149.     #define    kMinH    50
  150.     #define kMaxH    1024
  151.     #define kMinW    200
  152.     #define kMaxW    1024
  153.  
  154.     WindowRef    viewerPort;
  155.     GrafPtr        savedPort;
  156.     long        newSize;
  157.     short        newHeight,
  158.                 newWidth;
  159.     Rect        growLimitSizes;
  160.     Point        mouse;
  161.  
  162.     #pragma unused(viewer)
  163.  
  164.     /* Get Viewer's port from data parameter */
  165.     viewerPort = (WindowRef) data;
  166.  
  167.     if (viewerPort == NULL) {
  168.         ERROR_DEBUG_STR("Sample_WindowResizeCallback: viewerPort is NULL.");
  169.         return kQ3Failure;
  170.     }
  171.  
  172.     /* Get window port from Viewer */
  173.     GetPort(&savedPort);
  174.  
  175.     /* Set for Viewer's port */
  176.     if (viewerPort != savedPort) {
  177.         SetPort(viewerPort);
  178.     }
  179.  
  180.     growLimitSizes.top    =  kMinH;        /* min height */
  181.     growLimitSizes.bottom =  kMaxH;        /* max height */
  182.     growLimitSizes.left   =  kMinW;     /* min width */
  183.     growLimitSizes.right  =  kMaxW;        /* max width */
  184.  
  185.     GetMouse(&mouse);
  186.     LocalToGlobal(&mouse);
  187.  
  188.     newSize = GrowWindow(viewerPort, mouse, &growLimitSizes);
  189.  
  190.     if (newSize != 0) {
  191.         newHeight = HiWord(newSize);
  192.         newWidth  = LoWord(newSize);
  193.  
  194.         if (newHeight > kMaxH)    newHeight = kMaxH;
  195.         if (newHeight < kMinH)    newHeight = kMinH;
  196.         if (newWidth  > kMaxW)    newWidth  = kMaxW;
  197.         if (newWidth  < kMinW)    newWidth  = kMinW;
  198.  
  199.         SizeWindow(viewerPort, newWidth, newHeight, true);
  200.         InvalRect(&viewerPort->portRect);
  201.     }
  202.  
  203.     /* Restore port */
  204.     if (viewerPort != savedPort) {
  205.         SetPort(savedPort);
  206.     }
  207.  
  208.     return kQ3Success;
  209. }
  210.  
  211.  
  212. /*
  213.  * Sample_PaneResizeNotifyCallback
  214.  *
  215.  * This callback is called if the kQ3ViewerPaneGrowBox flag is set
  216.  * and after the user clicks in the Viewer's pane grow box.
  217.  */
  218. static
  219. TQ3Status    Sample_PaneResizeNotifyCallback(
  220.     TQ3ViewerObject viewer,
  221.     const void        *data)
  222. {
  223.     OSErr                    theErr        = noErr;
  224.     TQ3Status                status        = kQ3Failure;
  225.     Rect                    newBounds,
  226.                             *pPrevBounds = ((Rect *) data);
  227.     RgnHandle                newRegion    = NULL,
  228.                             exposedRegion= NULL;
  229.  
  230.     if ((theErr = Q3ViewerGetBounds(viewer, &newBounds)) != noErr) {
  231.         ERROR_DEBUG_STR("Sample_PaneResizeNotifyCallback: Q3ViewerGetBounds failed.");
  232.         return kQ3Failure;    
  233.     }
  234.  
  235.  
  236.     /* Erase the area exposed between old and new Viewer bounds */
  237.     if ((newRegion = NewRgn()) != NULL) {
  238.         RectRgn(newRegion, &newBounds);
  239.  
  240.         if ((exposedRegion = NewRgn()) != NULL) {
  241.             RectRgn(exposedRegion, pPrevBounds);
  242.  
  243.             DiffRgn(exposedRegion, newRegion, exposedRegion);
  244.             EraseRgn(exposedRegion);
  245.  
  246.             DisposeRgn(exposedRegion);
  247.         }
  248.  
  249.         DisposeRgn(newRegion);
  250.  
  251.         /* Draw the Viewer again with after it's been sized */
  252.         if (Q3ViewerDraw(viewer) == noErr) {
  253.             status = kQ3Success;
  254.         }
  255.     }
  256.  
  257.     /* Save new bounds as last bounds */
  258.     *pPrevBounds = newBounds;
  259.  
  260.     return status;
  261. }
  262.  
  263.  
  264. /*
  265.  * Sample_DrawingCallback
  266.  *
  267.  * This callback is called after the Viewer completes drawing in
  268.  * in Q3ViewerDraw().
  269.  *
  270.  * This example draws several lines across the Viewer.
  271.  */
  272. OSErr Sample_DrawingCallback(
  273.     TQ3ViewerObject    viewer,
  274.     const void        *data)
  275. {
  276.     OSErr            osErr = noErr;
  277.     WindowRef        viewerPort;
  278.     GrafPtr            savedPort;
  279.     Rect            bounds;
  280.     short            y, yIncr, yMax;
  281.     unsigned long    width,
  282.                     height;
  283.  
  284.     /* Get Viewer's port from data parameter */
  285.     viewerPort = (WindowRef) data;
  286.  
  287.     if (viewerPort == NULL) {
  288.         ERROR_DEBUG_STR("Sample_DrawingCallback: viewerPort is NULL.");
  289.         return paramErr;
  290.     }
  291.  
  292.     GetPort(&savedPort);
  293.  
  294.     /* Set for Viewer's port */
  295.     if ((GrafPtr) viewerPort != savedPort) {
  296.         SetPort((GrafPtr) viewerPort);
  297.     }
  298.  
  299.  
  300.     /* Compute where to draw lines */
  301.     if ((osErr = Q3ViewerGetBounds(viewer, &bounds)) != noErr) {
  302.         ERROR_DEBUG_STR("Sample_DrawingCallback: Q3ViewerGetBounds failed.");
  303.         return osErr;
  304.     }
  305.  
  306.     if ((osErr = Q3ViewerGetDimension(viewer, &width, &height)) != noErr) {
  307.         ERROR_DEBUG_STR("Sample_DrawingCallback: Q3ViewerGetDimension failed.");
  308.         return osErr;
  309.     }
  310.  
  311.     /* Draw horizontal lines across the model */
  312.     yIncr = height / 5;
  313.     y     = bounds.top + yIncr;
  314.     yMax  = bounds.top + height - yIncr;
  315.  
  316.     while (y <= yMax) {
  317.  
  318.         MoveTo(bounds.left  + 4, y);
  319.         LineTo(bounds.right - 6, y);
  320.  
  321.         y += yIncr;
  322.     }
  323.  
  324.     /* Restore port */
  325.     if ((GrafPtr) viewerPort != savedPort) {
  326.         SetPort(savedPort);
  327.     }
  328.  
  329.     return osErr;
  330. }
  331.  
  332.