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_Menu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  5.4 KB  |  353 lines  |  [TEXT/CWIE]

  1. /* 
  2.  *    Viewer_Menu.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 "QD3DViewer.h"
  15.  
  16. #if defined(OS_MACINTOSH) && OS_MACINTOSH
  17. #include <Devices.h>
  18. #include <Menus.h>
  19. #include <Dialogs.h>
  20. #include <Resources.h>
  21. #include <ToolUtils.h>
  22. #endif
  23.  
  24. #include "Viewer_Error.h"
  25. #include "Viewer_Main.h"
  26. #include "Viewer_Window.h"
  27. #include "Viewer_System.h"
  28. #include "Viewer_Menu.h"
  29.  
  30.  
  31. /*------------------*/
  32. /*      Constants        */
  33. /*------------------*/
  34. #define    kMenuBarRsrcID        128
  35. #define    kAboutDialogRsrcID    128
  36.  
  37.  
  38. /*----------------------*/
  39. /*    Extern Declarations    */
  40. /*----------------------*/
  41. extern    TQ3Boolean    gTimeToQuit;
  42.  
  43.  
  44. /*----------------------*/
  45. /*    Global Declarations    */
  46. /*----------------------*/
  47. Handle        ghMenuBar = NULL;
  48.  
  49.  
  50. /*----------------------*/
  51. /*   Local Prototypes   */
  52. /*----------------------*/
  53. static
  54. TQ3Boolean Menu_Apple(
  55.             short            menuID,
  56.             short            itemNumber);
  57. static
  58. TQ3Boolean Menu_File(
  59.             short            itemNumber);
  60. static
  61. TQ3Boolean Menu_Edit(
  62.             short            itemNumber);
  63. static
  64. TQ3Boolean    Menu_AboutBox (
  65.             void);
  66.  
  67.  
  68.  
  69. /*
  70.  *    Menu_Initialize
  71.  */
  72. TQ3Boolean Menu_Initialize(
  73.             void)
  74. {
  75.     TQ3Boolean        goodMenus;
  76.  
  77.     goodMenus = kQ3True;
  78.  
  79.     /* Initialize MenuBar */
  80.     ghMenuBar = GetNewMBar (kMenuBarRsrcID);
  81.     if (ghMenuBar != NULL) {
  82.         SetMenuBar(ghMenuBar);
  83.         AppendResMenu(GetMenuHandle(mApple), (ResType) 'DRVR');
  84.         DrawMenuBar();
  85.     }
  86.     else {
  87.         ERROR_DEBUG_STR ("Menu_Initialize: Menu_Initialize: Couldn't find menu bar.");
  88.         ghMenuBar = NULL;
  89.         goodMenus = kQ3False;
  90.     }
  91.  
  92.      return (goodMenus);
  93. }
  94.  
  95.  
  96. /*
  97.  *    Menu_Command
  98.  */
  99. OSErr Menu_Command(
  100.         long            menuResult)
  101. {
  102.     TQ3Boolean    isOK = kQ3True;
  103.     short        menuID,
  104.                 itemNumber;
  105.  
  106.     if (menuResult == 0) {
  107.         return kQ3False;
  108.     }
  109.  
  110.     menuID       = HiWord (menuResult);
  111.     itemNumber = LoWord (menuResult);
  112.  
  113.     switch (menuID) {
  114.         case mApple:
  115.             isOK = Menu_Apple(menuID, itemNumber);
  116.             break;
  117.  
  118.         case mFile:
  119.             isOK = Menu_File(itemNumber);
  120.             break;
  121.  
  122.         case mEdit:
  123.             isOK = Menu_Edit(itemNumber);
  124.         break;
  125.  
  126.         default:
  127.             System_Beep();
  128.             isOK = kQ3False;
  129.             break;
  130.  
  131.     }  /*  switch (menuID)  */
  132.  
  133.     HiliteMenu (0);
  134.  
  135.     return (isOK == kQ3True) ? noErr : paramErr;/* TODO */
  136. }
  137.  
  138.  
  139. #pragma mark -
  140.  
  141. /*
  142.  *    Menu_Apple
  143.  */
  144. static
  145. TQ3Boolean Menu_Apple(
  146.         short            menuID,
  147.         short            itemNumber)
  148. {
  149.     TQ3Boolean    isOK = kQ3True;
  150.  
  151.     switch (itemNumber)
  152.     {
  153.     case iAbout:
  154.         isOK = Menu_AboutBox();
  155.         break;
  156.  
  157.     default:
  158.         {
  159.             MenuHandle    hMenu;
  160.             Str255        deskAccName;
  161.             GrafPtr        oldPort;
  162.  
  163.             hMenu = GetMenuHandle(menuID);
  164.             if (hMenu != NULL) {
  165.                 GetPort (&oldPort);
  166.  
  167.                 GetMenuItemText (hMenu, itemNumber, deskAccName);
  168.                 (void) OpenDeskAcc (deskAccName);
  169.                 SetPort (oldPort);
  170.             }
  171.             else {
  172.                 isOK = kQ3False;
  173.             }
  174.         }
  175.         break;
  176.     }
  177.  
  178.     return isOK;
  179. }
  180.  
  181.  
  182. /*
  183.  *    Menu_File
  184.  */
  185. static
  186. TQ3Boolean Menu_File(
  187.         short            itemNumber)
  188. {
  189.     TQ3Boolean    isOK = kQ3True;
  190.  
  191.     switch (itemNumber) {
  192.     case iNew:
  193.     case iOpen:
  194.         break;
  195.  
  196.     case iClose:
  197.         {
  198.             WindowPtr    pWindow    = NULL;
  199.  
  200.             if ((pWindow = FrontWindow()) != NULL) {
  201.                 isOK = (Window_CloseViewer(&pWindow) == noErr)
  202.                             ? kQ3True
  203.                             : kQ3False;
  204.             } else {
  205.                 System_Beep();
  206.             }
  207.         }
  208.         break;
  209.  
  210.     case iSave:
  211.     case iSaveAs:
  212.         isOK = kQ3False;
  213.         break;
  214.  
  215.     case iQuit:
  216.         gTimeToQuit = kQ3True;
  217.         break;
  218.  
  219.     default:
  220.         System_Beep();
  221.         isOK = kQ3False;
  222.         break;
  223.     }
  224.  
  225.     return isOK;
  226. }
  227.  
  228.  
  229. /*
  230.  *    Menu_Edit
  231.  */
  232. static
  233. TQ3Boolean Menu_Edit(
  234.         short            itemNumber)
  235. {
  236.     TQ3Boolean        isOK    = kQ3True;
  237.     OSErr            theErr    = noErr;
  238.     WindowPtr        pWindow = NULL;
  239.     TQ3ViewerObject    viewer    = NULL;
  240.     MenuHandle        hMenu;
  241.  
  242.     if (SystemEdit ((short)(itemNumber - 1)) == true) {
  243.         return kQ3True;
  244.     }
  245.  
  246.     if ((pWindow = FrontWindow()) == NULL) {
  247.         return kQ3True;
  248.     }
  249.  
  250.     if ((viewer = Window_GetViewer(pWindow)) == NULL) {
  251.         return kQ3False;
  252.     }
  253.  
  254.     switch (itemNumber) {
  255.     case iUndo:
  256.         theErr = Q3ViewerUndo(viewer);
  257.         if (theErr != noErr) {
  258.             ERROR_DEBUG_STR("Menu_Edit: Q3ViewerUndo failed");
  259.         }
  260.         break;
  261.  
  262.     case iCut:
  263.         theErr = Q3ViewerCut(viewer);
  264.         if (theErr != noErr) {
  265.             ERROR_DEBUG_STR("Menu_Edit: Q3ViewerCut failed");
  266.         }
  267.         break;
  268.  
  269.     case iCopy:
  270.         theErr = Q3ViewerCopy(viewer);
  271.         if (theErr != noErr) {
  272.             ERROR_DEBUG_STR("Menu_Edit: Q3ViewerCopy failed");
  273.         }
  274.         break;
  275.  
  276.     case iPaste:
  277.         theErr = Q3ViewerPaste(viewer);
  278.         if (theErr != noErr) {
  279.             ERROR_DEBUG_STR("Menu_Edit: Q3ViewerPaste failed");
  280.         }
  281.         break;
  282.  
  283.     case iClear:
  284.         theErr = Q3ViewerClear(viewer);
  285.         if (theErr != noErr) {
  286.             ERROR_DEBUG_STR("Menu_Edit: Q3ViewerClear failed");
  287.         }
  288.         break;
  289.  
  290.     default:
  291.         System_Beep();
  292.         break;
  293.     }
  294.  
  295.  
  296.     hMenu = GetMenuHandle(mEdit);
  297.  
  298.     if (theErr == noErr) {
  299.         /* Change Undo menu item */
  300.         #define    kMaxStrLen        (sizeof(Str255) - 1)
  301.         unsigned long    length = kMaxStrLen;/* Pass in maxiumum size of undoStr[] */
  302.         Str255            undoStr;
  303.  
  304.         if (Q3ViewerGetUndoString(viewer, (char *) &undoStr[1], &length)) {
  305.  
  306.             if ((length > 0)  &&
  307.                 (length <= kMaxStrLen-1)) {
  308.  
  309.                 /* Enable Undo item and set it's text */
  310.                 if (hMenu != NULL) {
  311.                     undoStr[0] = length;
  312.                     SetMenuItemText(hMenu, iUndo, undoStr);
  313.                     EnableItem(hMenu, iUndo);
  314.                 }
  315.             }
  316.         }
  317.     }
  318.     else {
  319.         DisableItem(hMenu, iUndo);
  320.     }
  321.  
  322.     return isOK;
  323. }
  324.  
  325.  
  326. #pragma mark -
  327.  
  328. /*
  329.  *    Menu_AboutBox
  330.  */
  331. static
  332. TQ3Boolean Menu_AboutBox(
  333.         void)
  334. {
  335.     TQ3Boolean    isOK = kQ3True;
  336.     DialogPtr    theDialog;
  337.     short        itemHit;
  338.  
  339.     theDialog = GetNewDialog(kAboutDialogRsrcID, NULL, kWindowOnTop);
  340.     if (theDialog == NULL)
  341.         return kQ3False;
  342.  
  343.     do {
  344.         ModalDialog (NULL, &itemHit);
  345.     }
  346.     while (itemHit != ok);
  347.  
  348.     DisposeDialog (theDialog);
  349.  
  350.     return isOK;
  351. }
  352.  
  353.