Source/MenuDispatch.c

/*
    MenuDispatch.c
 
    Handle menu commands. 
 
    © 1995 Apple Computer, Inc.
*/
#include <QuickDraw.h>
#include <Windows.h>
#include <Menus.h>
#include <Files.h>
#include <StandardFile.h>
#include <Menus.h>
#include <Devices.h>
#include <Events.h>
 
#include "EventLoop.h"
#include "MenuDispatch.h"
#include "QD3DViewer.h"
 
void BuildMenuBars(void);
void ChooseApple(short itemNumber);
void ChooseFile(short item);
void ChooseEdit(short item);
void MenuDispatch(short menuNumber,short itemNumber);
void RunDeskAccesory(short item);
void AdjustMenuItems(void);
 
extern void ChooseView(short item);
extern void ChooseTest(short item);
 
extern WindowPtr    MainView;
int                 gWindowCount;
 
void BuildMenuBars(void)
{   
    SetMenuBar(GetNewMBar(128));
    AppendResMenu(GetMenuHandle(APPLE_MENU),'DRVR');
    DrawMenuBar();
    gWindowCount = 0;
}
 
void RunDeskAccesory(short item)
{
    GrafPtr     savePort;
    short       daRefNum;
    Str255      daName;
    
    GetPort(&savePort);
    GetMenuItemText(GetMenuHandle(APPLE_MENU), item, daName);
    daRefNum = OpenDeskAcc(daName);
    SetPort(savePort);
}
 
void ChooseApple(short itemNumber)
{
    short item;
    
    if(itemNumber == cmdAbout) {
        item = Alert(ABOUT_BOX_ID,nil);
    } else {
        RunDeskAccesory(itemNumber);
    }
}
 
void ChooseFile(short item)
{
    switch(item)
    {
        case cmdNew:
        {
            Rect            defaultBounds = {50, 50, 300, 300};
            TQ3ViewerObject aViewer;
            TVCDemoDataHdl  demoData;
 
            MainView = GetNewCWindow(128, nil, (WindowPtr)-1L);
            MoveWindow(MainView, 10 + (gWindowCount * 18), 40 + (gWindowCount * 18), true);
            gWindowCount++;
            ShowWindow(MainView);
            aViewer = Q3ViewerNew((CGrafPtr)MainView, &MainView->portRect, kQ3ViewerDefault);
            demoData = (TVCDemoDataHdl)NewHandle(sizeof(TVCDemoData));
            (*demoData)->containerStyle = kContainerFull;
            (*demoData)->viewer1 = aViewer;
            SetWRefCon(MainView, (long)demoData);
            break;
        }
 
        case cmdOpen:
        {
            short               refNum;
            OSErr               anErr = noErr;
            short               numTypes;
            OSType              typeList[2];
            StandardFileReply   sfReply;
            TVCDemoDataHdl      demoData;
 
            numTypes = 2;
            typeList[0] = '3DMF';
            typeList[1] = 'TEXT';
            StandardGetFile(nil, numTypes, typeList, &sfReply);
            if (sfReply.sfGood)
            {
                anErr = FSpOpenDF(&sfReply.sfFile, fsCurPerm, &refNum);
                if (anErr == noErr)
                {
                    TQ3ViewerObject aViewer;
 
                    ChooseFile(cmdNew);
                    demoData = (TVCDemoDataHdl)GetWRefCon(MainView);
                    aViewer = (*demoData)->viewer1;
                    Q3ViewerUseFile(aViewer, refNum);
                    anErr = FSClose(refNum);
                }
            }
            break;
        }
 
        case cmdClose:
        {
            if (MainView == FrontWindow())
            {
                TQ3ViewerObject aViewer;
                TVCDemoDataHdl  demoData;
 
                demoData = (TVCDemoDataHdl)GetWRefCon(MainView);
                aViewer = (*demoData)->viewer1;
                Q3ViewerDispose(aViewer);
                if ((*demoData)->containerStyle == kContainerFourView)
                {
                    Q3ViewerDispose((*demoData)->viewer2);
                    Q3ViewerDispose((*demoData)->viewer3);
                    Q3ViewerDispose((*demoData)->viewer4);
                }
                DisposeHandle((Handle)demoData);
 
                DisposeWindow(MainView);
                MainView = FrontWindow();
            }
            break;
        }
 
        case cmdSave:
        case cmdSaveAs:
        {
            short               refNum;
            OSErr               anErr = noErr;
            StandardFileReply   sfReply;
 
            if (!MainView)
                break;
            StandardPutFile("\pSave model as:", "\pUntitled", &sfReply);
            if (sfReply.sfGood)
            {
                anErr = FSpOpenDF(&sfReply.sfFile, fsCurPerm, &refNum);
                if (anErr != noErr)
                {
                    anErr = FSpCreate(&sfReply.sfFile, 'QD3A', '3DMF', sfReply.sfScript);
                    if (anErr == noErr)
                        anErr = FSpOpenDF(&sfReply.sfFile, fsCurPerm, &refNum);
                }
                if (anErr == noErr)
                {
                    TVCDemoDataHdl  demoData;
                    TQ3ViewerObject aViewer;
    
                    demoData = (TVCDemoDataHdl)GetWRefCon(MainView);
                    aViewer = (*demoData)->viewer1;
 
                    Q3ViewerWriteFile(aViewer, refNum);
                    anErr = FSClose(refNum);
                }
            }
            break;
        }
 
        case cmdQuit:
            ChooseFile(cmdClose);
            Done = true;
            break;
 
        default:
            break;
    }
}
 
 
void ChooseEdit(short item)
{
    if (MainView == FrontWindow())
    {
        TQ3ViewerObject aViewer;
        TVCDemoDataHdl  demoData;
 
        demoData = (TVCDemoDataHdl)GetWRefCon(MainView);
        aViewer = (*demoData)->viewer1;
 
        switch(item)
        {
            case cmdCut:
                Q3ViewerCut(aViewer);
                break;
            case cmdCopy:
                Q3ViewerCopy(aViewer);
                break;
            case cmdPaste:
                Q3ViewerPaste(aViewer);
                break;
            case cmdClear:
                Q3ViewerClear(aViewer);
                break;
            default:
                break;
        }
    }
}
 
void MenuDispatch(short menuNumber,short itemNumber)
{
 
    if(menuNumber != 0)
        switch(menuNumber) {
            case APPLE_MENU :   ChooseApple(itemNumber);
                                break;
            case FILE_MENU :    ChooseFile(itemNumber);
                                break;
            case EDIT_MENU :    ChooseEdit(itemNumber);
                                break;
            case VIEW_MENU :    ChooseView(itemNumber);
                                break;
            case TEST_MENU :    ChooseTest(itemNumber);
                                break;
            default :           break;
        }
}
 
void AdjustMenuItems(void)
{
    MenuHandle      menu;
    unsigned long   viewerFlags;
    Boolean         checked;
 
    menu = GetMenuHandle(VIEW_MENU);
    if (MainView && MainView == FrontWindow())
    {
        TVCDemoDataHdl  demoData;
        TQ3ViewerObject aViewer;
 
        demoData = (TVCDemoDataHdl)GetWRefCon(MainView);
        aViewer = (*demoData)->viewer1;
 
        viewerFlags = Q3ViewerGetFlags(aViewer);
    
        checked = (viewerFlags & kQ3ViewerShowBadge);
        CheckItem(menu, cmdBadge, checked);
    
        checked = (viewerFlags & kQ3ViewerActive);
        CheckItem(menu, cmdViewer, checked);
    
        checked = (viewerFlags & kQ3ViewerControllerVisible);
        CheckItem(menu, cmdController, checked);
    
        checked = (viewerFlags & kQ3ViewerDraggingOff);
        CheckItem(menu, cmdDraggingOff, checked);
    
        checked = (viewerFlags & kQ3ViewerButtonCamera);
        CheckItem(menu, cmdBtnCamera, checked);
    
        checked = (viewerFlags & kQ3ViewerButtonTruck);
        CheckItem(menu, cmdBtnTruck, checked);
    
        checked = (viewerFlags & kQ3ViewerButtonOrbit);
        CheckItem(menu, cmdBtnOrbit, checked);
    
        checked = (viewerFlags & kQ3ViewerDrawFrame);
        CheckItem(menu, cmdFrame, checked);
    
        if ((viewerFlags & kQ3ViewerButtonZoom) > 0)
            CheckItem(menu, cmdBtnZoom, 1);
        else
            CheckItem(menu, cmdBtnZoom, 0);
 
        if ((viewerFlags & kQ3ViewerButtonDolly) > 0)
            CheckItem(menu, cmdBtnDolly, 1);
        else
            CheckItem(menu, cmdBtnDolly, 0);
            
        menu = GetMenuHandle(TEST_MENU);
        CheckItem(menu, cmdNormalMemory, true);
    }
}
 
/* EOF */