Source/Viewer_Menu.c

/* 
 *  Viewer_Menu.c
 *
 *  QuickDraw 3D 1.6 Sample
 *  Robert Dierkes
 *
 *   12/22/98   RDD     Created.
 */
 
/*------------------*/
/*  Include Files   */
/*------------------*/
#include "QD3D.h"
#include "QD3DViewer.h"
 
#if defined(OS_MACINTOSH) && OS_MACINTOSH
#include <Devices.h>
#include <Menus.h>
#include <Dialogs.h>
#include <Resources.h>
#include <ToolUtils.h>
#endif
 
#include "Viewer_Error.h"
#include "Viewer_Main.h"
#include "Viewer_Window.h"
#include "Viewer_System.h"
#include "Viewer_Menu.h"
 
 
/*------------------*/
/*    Constants     */
/*------------------*/
#define kMenuBarRsrcID      128
#define kAboutDialogRsrcID  128
 
 
/*----------------------*/
/*  Extern Declarations */
/*----------------------*/
extern  TQ3Boolean  gTimeToQuit;
 
 
/*----------------------*/
/*  Global Declarations */
/*----------------------*/
Handle      ghMenuBar = NULL;
 
 
/*----------------------*/
/*   Local Prototypes   */
/*----------------------*/
static
TQ3Boolean Menu_Apple(
            short           menuID,
            short           itemNumber);
static
TQ3Boolean Menu_File(
            short           itemNumber);
static
TQ3Boolean Menu_Edit(
            short           itemNumber);
static
TQ3Boolean  Menu_AboutBox (
            void);
 
 
 
/*
 *  Menu_Initialize
 */
TQ3Boolean Menu_Initialize(
            void)
{
    TQ3Boolean      goodMenus;
 
    goodMenus = kQ3True;
 
    /* Initialize MenuBar */
    ghMenuBar = GetNewMBar (kMenuBarRsrcID);
    if (ghMenuBar != NULL) {
        SetMenuBar(ghMenuBar);
        AppendResMenu(GetMenuHandle(mApple), (ResType) 'DRVR');
        DrawMenuBar();
    }
    else {
        ERROR_DEBUG_STR ("Menu_Initialize: Menu_Initialize: Couldn't find menu bar.");
        ghMenuBar = NULL;
        goodMenus = kQ3False;
    }
 
     return (goodMenus);
}
 
 
/*
 *  Menu_Command
 */
OSErr Menu_Command(
        long            menuResult)
{
    TQ3Boolean  isOK = kQ3True;
    short       menuID,
                itemNumber;
 
    if (menuResult == 0) {
        return kQ3False;
    }
 
    menuID     = HiWord (menuResult);
    itemNumber = LoWord (menuResult);
 
    switch (menuID) {
        case mApple:
            isOK = Menu_Apple(menuID, itemNumber);
            break;
 
        case mFile:
            isOK = Menu_File(itemNumber);
            break;
 
        case mEdit:
            isOK = Menu_Edit(itemNumber);
        break;
 
        default:
            System_Beep();
            isOK = kQ3False;
            break;
 
    }  /*  switch (menuID)  */
 
    HiliteMenu (0);
 
    return (isOK == kQ3True) ? noErr : paramErr;/* TODO */
}
 
 
#pragma mark -
 
/*
 *  Menu_Apple
 */
static
TQ3Boolean Menu_Apple(
        short           menuID,
        short           itemNumber)
{
    TQ3Boolean  isOK = kQ3True;
 
    switch (itemNumber)
    {
    case iAbout:
        isOK = Menu_AboutBox();
        break;
 
    default:
        {
            MenuHandle  hMenu;
            Str255      deskAccName;
            GrafPtr     oldPort;
 
            hMenu = GetMenuHandle(menuID);
            if (hMenu != NULL) {
                GetPort (&oldPort);
 
                GetMenuItemText (hMenu, itemNumber, deskAccName);
                (void) OpenDeskAcc (deskAccName);
                SetPort (oldPort);
            }
            else {
                isOK = kQ3False;
            }
        }
        break;
    }
 
    return isOK;
}
 
 
/*
 *  Menu_File
 */
static
TQ3Boolean Menu_File(
        short           itemNumber)
{
    TQ3Boolean  isOK = kQ3True;
 
    switch (itemNumber) {
    case iNew:
    case iOpen:
        break;
 
    case iClose:
        {
            WindowPtr   pWindow = NULL;
 
            if ((pWindow = FrontWindow()) != NULL) {
                isOK = (Window_CloseViewer(&pWindow) == noErr)
                            ? kQ3True
                            : kQ3False;
            } else {
                System_Beep();
            }
        }
        break;
 
    case iSave:
    case iSaveAs:
        isOK = kQ3False;
        break;
 
    case iQuit:
        gTimeToQuit = kQ3True;
        break;
 
    default:
        System_Beep();
        isOK = kQ3False;
        break;
    }
 
    return isOK;
}
 
 
/*
 *  Menu_Edit
 */
static
TQ3Boolean Menu_Edit(
        short           itemNumber)
{
    TQ3Boolean      isOK    = kQ3True;
    OSErr           theErr  = noErr;
    WindowPtr       pWindow = NULL;
    TQ3ViewerObject viewer  = NULL;
    MenuHandle      hMenu;
 
    if (SystemEdit ((short)(itemNumber - 1)) == true) {
        return kQ3True;
    }
 
    if ((pWindow = FrontWindow()) == NULL) {
        return kQ3True;
    }
 
    if ((viewer = Window_GetViewer(pWindow)) == NULL) {
        return kQ3False;
    }
 
    switch (itemNumber) {
    case iUndo:
        theErr = Q3ViewerUndo(viewer);
        if (theErr != noErr) {
            ERROR_DEBUG_STR("Menu_Edit: Q3ViewerUndo failed");
        }
        break;
 
    case iCut:
        theErr = Q3ViewerCut(viewer);
        if (theErr != noErr) {
            ERROR_DEBUG_STR("Menu_Edit: Q3ViewerCut failed");
        }
        break;
 
    case iCopy:
        theErr = Q3ViewerCopy(viewer);
        if (theErr != noErr) {
            ERROR_DEBUG_STR("Menu_Edit: Q3ViewerCopy failed");
        }
        break;
 
    case iPaste:
        theErr = Q3ViewerPaste(viewer);
        if (theErr != noErr) {
            ERROR_DEBUG_STR("Menu_Edit: Q3ViewerPaste failed");
        }
        break;
 
    case iClear:
        theErr = Q3ViewerClear(viewer);
        if (theErr != noErr) {
            ERROR_DEBUG_STR("Menu_Edit: Q3ViewerClear failed");
        }
        break;
 
    default:
        System_Beep();
        break;
    }
 
 
    hMenu = GetMenuHandle(mEdit);
 
    if (theErr == noErr) {
        /* Change Undo menu item */
        #define kMaxStrLen      (sizeof(Str255) - 1)
        unsigned long   length = kMaxStrLen;/* Pass in maxiumum size of undoStr[] */
        Str255          undoStr;
 
        if (Q3ViewerGetUndoString(viewer, (char *) &undoStr[1], &length)) {
 
            if ((length > 0)  &&
                (length <= kMaxStrLen-1)) {
 
                /* Enable Undo item and set it's text */
                if (hMenu != NULL) {
                    undoStr[0] = length;
                    SetMenuItemText(hMenu, iUndo, undoStr);
                    EnableItem(hMenu, iUndo);
                }
            }
        }
    }
    else {
        DisableItem(hMenu, iUndo);
    }
 
    return isOK;
}
 
 
#pragma mark -
 
/*
 *  Menu_AboutBox
 */
static
TQ3Boolean Menu_AboutBox(
        void)
{
    TQ3Boolean  isOK = kQ3True;
    DialogPtr   theDialog;
    short       itemHit;
 
    theDialog = GetNewDialog(kAboutDialogRsrcID, NULL, kWindowOnTop);
    if (theDialog == NULL)
        return kQ3False;
 
    do {
        ModalDialog (NULL, &itemHit);
    }
    while (itemHit != ok);
 
    DisposeDialog (theDialog);
 
    return isOK;
}