Common Files/MacFramework.c

//////////
//
//  File:       MacFramework.c
//
//  Contains:   Code for the QuickTime sample code framework that is specific to the Macintosh. 
//              This code handles windows, menus, events, and other low-level things. Put your
//              application-specific code into the file ComApplication.c. 
//
//  Written by: Tim Monroe
//              Based on the QTShell code written by Tim Monroe, which in turn was based on the MovieShell
//              code written by Apple DTS (Kent Sandvik). This current version is now very far removed from
//              MovieShell.
//
//  Copyright:  © 1999 by Apple Computer, Inc., all rights reserved.
//
//  Change History (most recent first):
//
//     <13>     02/01/01    rtm     fixed *Proc names to *UPP, to conform to Universal Headers 3.4b4
//     <12>     08/11/00    rtm     revised event-handling so that QTFrame_HandleEvent passes event to
//                                  the movie controller
//     <11>     07/06/00    rtm     made changes to support new parameter to QTFrame_AdjustMenus
//     <10>     03/02/00    rtm     made changes to get things running under CarbonLib
//     <9>      01/14/00    rtm     reworked window-dragging and -updating code to support graphics files
//     <8>      12/23/99    rtm     tweaked mouseDown handling in QTFrame_StandardModalDialogEventFilter
//     <7>      12/16/99    rtm     added gMouseClickTime global variable and code to set it in mouseUp
//                                  case in QTFrame_HandleEvent
//     <6>      12/12/99    rtm     tweaked inDrag handling in QTFrame_HandleEvent
//     <5>      11/30/99    rtm     option-click in close box now closes all open movie windows (per HIG)
//     <4>      11/29/99    rtm     reworked QTFrame_DestroyMovieWindow to use NavAskSaveChanges
//     <3>      11/16/99    rtm     factored QTFrame_HandleEvent out of QTFrame_MainEventLoop, so we can
//                                  handle events from other code, if necessary
//     <2>      11/11/99    rtm     made some preliminary changes for Carbon; still some work to be done
//     <1>      11/05/99    rtm     first file; based on earlier sample code
//     
//////////
 
//////////
//
// header files
//
//////////
 
#include "MacFramework.h"
 
 
//////////
//
// global variables
//
//////////
 
Boolean             gShuttingDown = false;              // are we shutting down?
Boolean             gAppInForeground;                   // is our application in the foreground?    
Boolean             gHasNewDialogCalls;                 // are the new Dialog Manager functions available?
 
Str255              gWindowTitle = kDefaultWindowTitle; // default name for created windows
Rect                gWindowRect = kDefaultWindowRect;   // default rectangle for created windows
GrowZoneUPP         gAppGrowZoneUPP;                    // UPP to our grow zone callback
ModalFilterUPP      gModalFilterUPP;                    // UPP to our custom dialog event filter
UserItemUPP         gUserItemProcUPP;                   // UPP to our custom dialog user item procedure
Handle              gEmergencyMemory;                   // handle to our emergency memory reserve
 
short               gAppResFile = kInvalidFileRefNum;   // file reference number for this application's resource file
FSSpec              gAppFSSpec;                         // file specification for the application itself
Str255              gAppName;                           // the name of this application
 
long                gMouseClickTime;                    // for double-click calculation
extern Handle       gValidFileTypes;                    // the list of file types that our application can open
 
 
//////////
//
// main
// The main function for this application.
//
// Set up the application's execution environment; make sure QuickTime (etc.) is installed,
// then start handling events.
//
//////////
 
int main (void)
{
    OSErr       myErr = noErr;
    
    QTFrame_InitMacEnvironment(10L);
    
    // make sure that QuickTime is available and that we can initialize it
    if (!QTUtils_IsQuickTimeInstalled()) {
        QTFrame_ShowWarning("\pQuickTime is not installed on this computer. Exiting.", 0);
        ExitToShell();
    }
 
    myErr = EnterMovies();
    if (myErr != noErr) {
        QTFrame_ShowWarning("\pCould not initialize QuickTime. Exiting.", myErr);
        ExitToShell();
    }
 
    // do any application-specific initialization
    QTApp_Init(kInitAppPhase_BothPhases);
 
    // get and process events until the user quits
    QTFrame_MainEventLoop();
    
    ExitMovies();
    ExitToShell();
    
    return(0);
}
 
 
//////////
//
// QTFrame_InitMacEnvironment
// Initialize the Macintosh runtime environment.
//
//////////
 
static void QTFrame_InitMacEnvironment (long theNumMoreMasters)
{
#if TARGET_API_MAC_CARBON
#pragma unused(theNumMoreMasters)
#endif
 
    short           myVRefNum;
    long            myDirID;
 
#if !TARGET_API_MAC_CARBON  
    long            myIndex;
 
    // add more space to the stack
    SetApplLimit((Ptr)(GetApplLimit() - kExtraStackSpaceSize));
            
    // expand heap zone to its limit
    MaxApplZone();
    
    // allocate some additional master pointer blocks
    for (myIndex = 0; myIndex < theNumMoreMasters; myIndex++)
        MoreMasters();
 
    InitGraf(&qd.thePort);
    InitFonts();
    InitWindows();
    InitMenus();
    TEInit();
    InitDialogs(NULL);
#endif
    InitCursor();
 
    // initialize and install the menu bar
    QTFrame_InitMenuBar();
 
#if !TARGET_API_MAC_CARBON
    // install a grow zone procedure to handle low memory situations
    gEmergencyMemory = NewHandle(kEmergencyMemorySize);
    if (gEmergencyMemory != NULL) {
        gAppGrowZoneUPP = NewGrowZoneUPP(QTFrame_GrowZoneProcedure);
        SetGrowZone(gAppGrowZoneUPP);
    }
#endif
    
    // initialize foreground/background state
    gAppInForeground = true;
 
    // see whether the new Dialog Manager functions are available
#if TARGET_API_MAC_CARBON
    gHasNewDialogCalls = true;
#else
    gHasNewDialogCalls = QTUtils_TrapAvailable(_DialogDispatch);
#endif
        
    // create modal dialog filter and user item UPPs
    gModalFilterUPP = NewModalFilterUPP(QTFrame_StandardModalDialogEventFilter);
    gUserItemProcUPP = NewUserItemUPP(QTFrame_StandardUserItemProcedure);
 
    // get the application's resource file
    gAppResFile = CurResFile();
    
    // get the application's name from the resource file
    GetIndString(gAppName, kAppNameResID, kAppNameResIndex);
    
    // get the application's location and save it in gAppFSSpec
    HGetVol(NULL, &myVRefNum, &myDirID);
    FSMakeFSSpec(myVRefNum, myDirID, gAppName, &gAppFSSpec);
}
 
 
//////////
//
// QTFrame_GrowZoneProcedure
// A grow zone procedure. This is straight out of IM: Memory (pp. 1-46ff)
//
//////////
 
PASCAL_RTN long QTFrame_GrowZoneProcedure (Size theBytesNeeded)
{
#pragma unused(theBytesNeeded)
 
    long        myA5;
    Size        myBytesFreed;
    
    // get current A5; we might get called at a time that A5 isn't valid
    myA5 = SetCurrentA5();
    
    if ((*gEmergencyMemory != NULL) && (gEmergencyMemory != GZSaveHnd())) {
        EmptyHandle(gEmergencyMemory);
        myBytesFreed = kEmergencyMemorySize;
    } else {
        myBytesFreed = 0;                       // no more memory to release    
    }   
        
    myA5 = SetA5(myA5);
    
    return(myBytesFreed);
}
 
 
//////////
//
// QTFrame_InitMenuBar
// Set up the menu bar. This is straight out of IM: Macintosh Toolbox Essentials (pp. 3-50ff)
//
//////////
 
static Boolean QTFrame_InitMenuBar (void)
{
    Handle      myMenuBar = NULL;
    long        myResponse;
    OSErr       myErr = noErr;
 
    myMenuBar = GetNewMBar(kMenuBarResID);
 
#if TARGET_API_MAC_CARBON   
    // to get the theme-savvy menu bar, we need to call RegisterAppearanceClient.
    RegisterAppearanceClient();
#endif
 
    if (myMenuBar == NULL)
        return(false);
    
    SetMenuBar(myMenuBar);                                  // install the menus
    DisposeHandle(myMenuBar);
    
    // see whether we are running under MacOS X;
    // if so, remove the Quit menu item and its preceding separator line
    myErr = Gestalt(gestaltSystemVersion, &myResponse);
    if (myErr == noErr)
        if (myResponse >= 0x00000A00) {
            DeleteMenuItem(GetMenuHandle(kFileMenuResID), MENU_ITEM(IDM_EXIT));
            DeleteMenuItem(GetMenuHandle(kFileMenuResID), MENU_ITEM(IDM_EXIT) - 1); // the separator line
        }
        
#if !TARGET_API_MAC_CARBON  
    AppendResMenu(GetMenuHandle(kAppleMenuResID), 'DRVR');  // add desk accessory names to Apple menu
#endif
    QTFrame_AdjustMenus(NULL, NULL, 0L);
    DrawMenuBar();
    
    return(true);
}
 
 
//////////
//
// QTFrame_MainEventLoop
// Retrieve and process events.
//
//////////
 
static void QTFrame_MainEventLoop (void)
{
    EventRecord             myEvent;
    
    while (!gShuttingDown) {
#if !TARGET_API_MAC_CARBON  
        // make sure we've still got our memory reserve; reallocate it if it's been used
        if ((gEmergencyMemory == NULL) || (*gEmergencyMemory == NULL))
            ReallocateHandle(gEmergencyMemory, kEmergencyMemorySize);
#endif
    
        // get the next event in the queue
        WaitNextEvent(everyEvent, &myEvent, kWNEDefaultSleep, NULL);
        
        // handle the event
        QTFrame_HandleEvent(&myEvent);
        
    } // while (!gShuttingDown)
}
 
 
//////////
//
// QTFrame_MainEventLoop
// Retrieve and process events.
//
//////////
 
void QTFrame_HandleEvent (EventRecord *theEvent)
{
    WindowPtr               myWindow = NULL;
    WindowObject            myWindowObject = NULL;
    short                   myWindowPart;
    Rect                    myScreenRect;
    Boolean                 isEventHandled = false;
 
    // first, perform any application-specific event handling
    isEventHandled = QTApp_HandleEvent(theEvent);
        
    // then, if this event hasn't been handled, let all movie controllers have access to the event
    if (!isEventHandled)
        isEventHandled = QTFrame_CheckMovieControllers(theEvent);
 
    // then, if this event has been handled, return; otherwise, handle it here
    if (isEventHandled)
        return;
        
    myWindow = FrontWindow();
 
    switch (theEvent->what) {
        case mouseUp:
            gMouseClickTime = TickCount();      // for double-click calculation
            break;
 
        case mouseDown:
        
            myWindowPart = FindWindow(theEvent->where, &myWindow);
 
            // menu bar and window-related events:          
            switch (myWindowPart) {
                case inSysWindow:
#if !TARGET_API_MAC_CARBON
                    // a mouse click in a window belonging to a desk accessory
                    SystemClick(theEvent, myWindow);
#endif
                    break;
                    
                case inMenuBar:
                    // a mouse click in the menu bar
                    QTFrame_AdjustMenus(FrontWindow(), NULL, (long)theEvent->modifiers);
                    QTFrame_HandleMenuCommand(MenuSelect(theEvent->where));
                    break;
                    
                case inDrag: {
                    Rect                myRect;
                    
                    myWindowObject = QTFrame_GetWindowObjectFromWindow(myWindow);
                    if (myWindowObject != NULL) {
                        
                        if ((**myWindowObject).fMovie != NULL)
                            GetMovieBox((**myWindowObject).fMovie, &myRect);
                        
                        if ((**myWindowObject).fGraphicsImporter != NULL)
                            GraphicsImportGetNaturalBounds((**myWindowObject).fGraphicsImporter, &myRect);
                        
                        GetRegionBounds(GetGrayRgn(), &myScreenRect);
                        DragAlignedWindow(myWindow, theEvent->where, &myScreenRect, &myRect, NULL);
 
                    } else {
                        GetRegionBounds(GetGrayRgn(), &myScreenRect);
                        DragWindow(myWindow, theEvent->where, &myScreenRect);
                    }
                    
                    break;                          
                }
                    
                case inContent:
                    if (myWindow != FrontWindow()) {
                        SelectWindow(myWindow);
                        MacSetPort((GrafPtr)GetWindowPort(myWindow));
                    } else {
                        QTApp_HandleContentClick(myWindow, theEvent);
                    }
                    
                    break;
                
                case inGoAway:
                    if (TrackGoAway(myWindow, theEvent->where)) {
                        // if the option key is down, close all open movie windows; otherwise, close just the frontmost
                        if (theEvent->modifiers & optionKey)
                            QTFrame_CloseMovieWindows();
                        else
                            QTFrame_DestroyMovieWindow(myWindow);
                    }
                    break;
            } // end switch(myWindowPart)
            break;
 
        // system-level events:
        case updateEvt:
            myWindow = (WindowPtr)theEvent->message;
            if (myWindow != NULL) {
                // if the window contains an image, draw it using GraphicsImportDraw
                myWindowObject = QTFrame_GetWindowObjectFromWindow(myWindow);
                if (myWindowObject != NULL)
                    if ((**myWindowObject).fGraphicsImporter != NULL)
                        GraphicsImportDraw((**myWindowObject).fGraphicsImporter);
                
                // now do any application-specific drawing
                QTApp_Draw(myWindow);
            }
            break;
            
        case keyDown:
        case autoKey:
            QTFrame_HandleKeyPress(theEvent);
            break;
        
        case diskEvt: {
#if !TARGET_API_MAC_CARBON
            Point           myPoint = {100, 100};
        
            if (HiWord(theEvent->message) != noErr)
                (void)DIBadMount(myPoint, theEvent->message);
#endif
            break;
        }
        
        case activateEvt:
            myWindow = (WindowReference)theEvent->message;
            
            if (QTFrame_IsMovieWindow(myWindow))
                QTFrame_ActivateController(myWindow, ((theEvent->modifiers & activeFlag) != 0 ));
            break;
            
        case osEvt:
            switch ((theEvent->message >> 24) & 0x00ff) {       // get high byte of message
                case suspendResumeMessage:
                
                    // set the foreground/background state
                    gAppInForeground = (theEvent->message & resumeFlag) != 0;
                    
                    // activate the front window, if there is one   
                    if (myWindow != NULL)
                        QTFrame_ActivateController(myWindow, gAppInForeground);
                    break;
                
                case mouseMovedMessage:
                    break;
            }
            break;
        
        case kHighLevelEvent:
            AEProcessAppleEvent(theEvent);
            break;
            
        case nullEvent:
            // do idle-time processing for all open movie windows
            myWindow = QTFrame_GetFrontMovieWindow();
            while (myWindow != NULL) {
                if (gAppInForeground)
                    QTApp_Idle(myWindow);
                    
                myWindow = QTFrame_GetNextMovieWindow(myWindow);
            }
            break;
    } // switch (theEvent->what)
}
        
 
//////////
//
// QTFrame_HandleMenuCommand
// Handle a menu selection.
//
//////////
 
void QTFrame_HandleMenuCommand (long theMenuResult)
{
    short       myMenuID, myMenuItem;
    Cursor      myArrow;
    
    MacSetCursor(GetQDGlobalsArrow(&myArrow));
 
    myMenuID = HiWord(theMenuResult);
    myMenuItem = LoWord(theMenuResult);
    
    switch (myMenuID) {
    
        case kAppleMenuResID:
            switch (myMenuItem) {
                case kAboutMenuItem:        // About box
                    QTFrame_ShowAboutBox();  
                    break;
                
                default:                    // Apple menu handling
#if !TARGET_API_MAC_CARBON
                    {
                        Str255      myDAName;
                        
                        GetMenuItemText(GetMenuHandle(kAppleMenuResID), myMenuItem, myDAName);
                        (void)OpenDeskAcc(myDAName);
                    }
#endif
                    break;
            }
            break;
 
        case kFileMenuResID:
            QTFrame_HandleFileMenuItem(QTFrame_GetFrontMovieWindow(), MENU_IDENTIFIER(myMenuID, myMenuItem));
            break;
    
        case kEditMenuResID:
            QTFrame_HandleEditMenuItem(QTFrame_GetFrontMovieWindow(), MENU_IDENTIFIER(myMenuID, myMenuItem));
            break;
 
        default:
            // do any application-specific menu handling
            QTApp_HandleMenu(MENU_IDENTIFIER(myMenuID, myMenuItem));
            break;
        
    } // switch (myMenuID)
    
    HiliteMenu(0);
}
 
 
//////////
//
// QTFrame_HandleKeyPress
// Handle key presses. This is modelled on Inside Macintosh: Macintosh Toolbox Essentials, p. 3-78.
//
//////////
 
void QTFrame_HandleKeyPress (EventRecord *theEvent)
{
    char        myKey;
    
    myKey = theEvent->message & charCodeMask;
    
    if (theEvent->modifiers & cmdKey) {
        // if the command key is down, it must be a keyboard shortcut for a menu selection;
        // adjust the menus and find the menu command that the shortcut picks out
        QTFrame_AdjustMenus(FrontWindow(), NULL, (long)theEvent->modifiers);
        QTFrame_HandleMenuCommand(MenuKey(myKey));
    } else {
        // otherwise, we'll assume it's meant for our application
        QTApp_HandleKeyPress(myKey);
    }
}
 
 
//////////
//
// QTFrame_QuitFramework
// Do any framework-specific shut-down.
//
//////////
 
void QTFrame_QuitFramework (void)
{
    // set our global flag to indicate we're shutting down
    gShuttingDown = true;
    
    // do application-specific processing that must occur before movie windows are closed
    QTApp_Stop(kStopAppPhase_BeforeDestroyWindows);
    
    // close all open movie windows; note that the user can cancel the shutting down
    QTFrame_CloseMovieWindows();
        
    // test the quit flag; a call to QTFrame_DestroyMovieWindow may have reset it
    if (!gShuttingDown)
        return;
    
    // do application-specific processing that must occur after movie windows are closed
    QTApp_Stop(kStopAppPhase_AfterDestroyWindows);
 
    // release our list of valid file types
    if (gValidFileTypes != NULL)
        DisposeHandle(gValidFileTypes);
 
#if !TARGET_API_MAC_CARBON  
    // release the grow zone memory
    DisposeHandle(gEmergencyMemory);
#endif
    
    // release any routine descriptors
    DisposeGrowZoneUPP(gAppGrowZoneUPP);
    DisposeModalFilterUPP(gModalFilterUPP);
    DisposeUserItemUPP(gUserItemProcUPP);   
}
 
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Framework utilities.
//
// The framework uses the following functions to create movies and handle dialog boxes. You probably won't
// need to use them directly.
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////
 
//////////
//
// QTFrame_CreateMovieWindow
// Create a new window to display the movie in.
//
//////////
 
WindowReference QTFrame_CreateMovieWindow (void)
{
    WindowReference         myWindow = NULL;
    
    // create a new window to display the movie in
    myWindow = NewCWindow(NULL,
                            &gWindowRect,
                            gWindowTitle,
                            false,
                            noGrowDocProc,
                            (WindowPtr)-1L,
                            true,
                            0);
 
    // create a new window object associated with the new window
    QTFrame_CreateWindowObject(myWindow);
 
    return(myWindow);
}
 
 
//////////
//
// QTFrame_DestroyMovieWindow
// Close the specified movie window.
//
//////////
 
void QTFrame_DestroyMovieWindow (WindowReference theWindow)
{
    WindowObject        myWindowObject = NULL;
    OSErr               myErr = noErr;
    
    // get the window object associated with the specified window
    myWindowObject = QTFrame_GetWindowObjectFromWindow(theWindow);
    if (myWindowObject == NULL) {
        // if the window passed in isn't a movie window, just dispose of it and return
        if (theWindow != NULL) {
            DisposeWindow(theWindow);
            theWindow = NULL;
        }
        return;
    }
    
    // if the window's data is "dirty", give the user a chance to save it
    if ((**myWindowObject).fIsDirty) {
        Str255                      myString;
        NavAskSaveChangesAction     myAction;
        NavAskSaveChangesResult     myResult;
        NavDialogOptions            myDialogOptions;
        NavEventUPP                 myEventUPP = NewNavEventUPP(QTFrame_HandleNavEvent);
 
        // get the title of the window
        GetWTitle(theWindow, myString);
        
        // install the application and document names
        NavGetDefaultDialogOptions(&myDialogOptions);
        BlockMoveData(gAppName, myDialogOptions.clientName, gAppName[0] + 1);
        BlockMoveData(myString, myDialogOptions.savedFileName, myString[0] + 1);
        
        // specify the action
        myAction = gShuttingDown ? kNavSaveChangesQuittingApplication : kNavSaveChangesClosingDocument;
        
        // display the "Save changes" dialog box
        myErr = NavAskSaveChanges(&myDialogOptions, myAction, &myResult, myEventUPP, NULL);
        if (myErr != noErr)
            myResult = kNavAskSaveChangesCancel;
            
        switch (myResult) {
            case kNavAskSaveChangesSave:
                // save the data in the window
                QTFrame_UpdateMovieFile(theWindow);
                break;
                
            case kNavAskSaveChangesCancel:
                // do not close the window, and do not quit the application
                gShuttingDown = false;
                return;
                
            case kNavAskSaveChangesDontSave:
                // discard any unsaved changes (that is, don't do anything)
                break;
        }
 
        DisposeNavEventUPP(myEventUPP);
    }
 
    // if we got to this point, it's okay to close and destroy the window
    QTFrame_CloseWindowObject(myWindowObject);
 
    DisposeWindow(theWindow);
}
 
 
//////////
//
// QTFrame_StandardUserItemProcedure
// A standard user-item procedure to outline the OK button in a modal dialog.
//
//////////
 
PASCAL_RTN void QTFrame_StandardUserItemProcedure (DialogPtr theDialog, short theItem)
{
#pragma unused(theItem)
 
    short               myItemKind;         // for GetDialogItem
    Handle              myItemHandle;       // for GetDialogItem
    Rect                myItemRect;         // for GetDialogItem
 
    if (!gHasNewDialogCalls) {      // no need to do any of this if the new Dialog Manager calls are available
        GetDialogItem(theDialog, kStdOkItemIndex, &myItemKind, &myItemHandle, &myItemRect);     
        MacInsetRect(&myItemRect, -4, -4);
        PenSize(3, 3);
        FrameRoundRect(&myItemRect, 16, 16);
        PenSize(1, 1);
    }
}
 
 
//////////
//
// QTFrame_StandardModalDialogEventFilter
// A standard modal dialog event filter. 
//
//////////
 
PASCAL_RTN Boolean QTFrame_StandardModalDialogEventFilter (DialogPtr theDialog, EventRecord *theEvent, short *theItemHit)
{
    Boolean             myEventHandled = false;
    short               myItemKind;         // for GetDialogItem
    Handle              myItemHandle;       // for GetDialogItem
    Rect                myItemRect;         // for GetDialogItem
    unsigned long       myTicks;            // for Delay
    char                myKey;      
    WindowReference     myWindow = NULL;
    short               myPart; 
        
    switch (theEvent->what) {
        case updateEvt:
            // update the specified window, if it's behind the modal dialog box
            myWindow = (WindowReference)theEvent->message;
            if ((myWindow != NULL) && (myWindow != GetDialogWindow(theDialog))) {
                QTFrame_HandleEvent(theEvent);
                myEventHandled = false;     // so sayeth IM
            }
            break;
 
        case nullEvent:
            // do idle-time processing for all open windows in our window list
            if (gAppInForeground) 
                QTFrame_IdleMovieWindows();
 
            myEventHandled = false;
            break;
            
        case keyDown:
        case autoKey:
            // if new Dialog Manager calls are NOT available, handle certain key presses
            if (!gHasNewDialogCalls) {
                // first, map Command-period to Escape key...
                myKey = theEvent->message & charCodeMask;
                if (theEvent->modifiers & cmdKey)
                    if (myKey == kPeriod)
                        myKey = kEscapeKey;
                        
                // ...then, handle the standard keyboard equivalents of OK and Cancel buttons
                switch (myKey) {
                    case kReturnKey:
                    case kEnterKey:
                        *theItemHit = kStdOkItemIndex;
                        GetDialogItem(theDialog, kStdOkItemIndex, &myItemKind, &myItemHandle, &myItemRect);
                        HiliteControl((ControlHandle)myItemHandle, kControlButtonPart);
                        Delay(kMyButtonDelay, &myTicks);
                        HiliteControl((ControlHandle)myItemHandle, kControlNoPart);
                        myEventHandled = true;
                        break;
                    case kEscapeKey:
                        *theItemHit = kStdCancelItemIndex;
                        GetDialogItem(theDialog, kStdCancelItemIndex, &myItemKind, &myItemHandle, &myItemRect);
                        HiliteControl((ControlHandle)myItemHandle, kControlButtonPart);
                        Delay(kMyButtonDelay, &myTicks);
                        HiliteControl((ControlHandle)myItemHandle, kControlNoPart);
                        myEventHandled = true;
                        break;
                    default:
                        break;
                }
            }
            break;
            
        case mouseDown:
            myPart = FindWindow(theEvent->where, &myWindow);
            if ((myPart == inDrag) && (myWindow == GetDialogWindow(theDialog))) {
                Rect        myScreenRect;
                
                GetRegionBounds(GetGrayRgn(), &myScreenRect);
                DragWindow(myWindow, theEvent->where, &myScreenRect);
                myEventHandled = true;
            }
            break;
            
        default:
            myEventHandled = false;
            break;
    }   
    
    // let the OS's standard filter proc handle the event, if it hasn't already been handled
    if (gHasNewDialogCalls && (myEventHandled == false))
        myEventHandled = StdFilterProc(theDialog, theEvent, theItemHit);
    
    return(myEventHandled);
}
 
 
//////////
//
// QTFrame_CheckMovieControllers
// Let all movie controllers have a chance to process the event.
//
// Returns true if the event was handled by some movie controller, false otherwise
//
//////////
 
static Boolean QTFrame_CheckMovieControllers (EventRecord *theEvent)
{   
    WindowPtr               myWindow = NULL;
    MovieController         myMC = NULL;
    
    myWindow = QTFrame_GetFrontMovieWindow();
    while (myWindow != NULL) {
        myMC = QTFrame_GetMCFromWindow(myWindow);
        if (myMC != NULL)
            if (MCIsPlayerEvent(myMC, theEvent))
                return(true);
        
        myWindow = QTFrame_GetNextMovieWindow(myWindow);
    }
    
    return(false);
}
 
 
//////////
//
// QTFrame_ShowAboutBox
// Display and manage the About dialog box.
//
//////////
 
void QTFrame_ShowAboutBox (void)
{
    DialogPtr           myDialog = NULL;
    short               myItem;
    short               mySavedResFile;
    GrafPtr             mySavedPort;
    short               myItemKind;
    Handle              myItemHandle;
    Rect                myItemRect;
    
    // get the current resource file and port
    mySavedResFile = CurResFile();
    GetPort(&mySavedPort);
    
    // set the application's resource file;
    // otherwise, we'd get the dialog's resources from the current resource file,
    // which might not be the correct one....
    UseResFile(gAppResFile);
    
    // deactivate any frontmost movie window
    QTFrame_ActivateController(QTFrame_GetFrontMovieWindow(), false);
    
    myDialog = GetNewDialog(kAboutBoxID, NULL, (WindowPtr)-1L);
    if (myDialog == NULL)
        goto bail;
        
    SetPortDialogPort(myDialog);
        
    if (gHasNewDialogCalls)
        SetDialogDefaultItem(myDialog, kStdOkItemIndex);
    
    // make sure that the OK button is outlined in bold, even if new Dialog Manager calls not available
    GetDialogItem(myDialog, kOKButtonUserItem, &myItemKind, &myItemHandle, &myItemRect);
    SetDialogItem(myDialog, kOKButtonUserItem, myItemKind, (Handle)gUserItemProcUPP, &myItemRect);
 
    // display and handle events in the dialog box until the user clicks OK
    do {
        ModalDialog(gModalFilterUPP, &myItem);
    } while (myItem != kStdOkItemIndex);
    
bail:
    // restore the previous resource file and port
    MacSetPort(mySavedPort);
    UseResFile(mySavedResFile);
    
    if (myDialog != NULL)
        DisposeDialog(myDialog);
}
 
 
//////////
//
// QTFrame_ShowWarning
// Display a warning box.
//
//////////
 
void QTFrame_ShowWarning (Str255 theMessage, OSErr theErr)
{
    Str255              myString;
    short               mySavedResFile;
    
    // get the current resource file and set the application's resource file
    mySavedResFile = CurResFile();
    UseResFile(gAppResFile);
 
    // insert argument into the message text template, to get the message text
    NumToString(theErr, myString);
    ParamText("\pWarning!", theMessage, theErr ? myString: NULL, NULL);
 
    // display the dialog box
    Alert(kAlertErrorID, gModalFilterUPP);
    
    // restore the original resource file
    UseResFile(mySavedResFile);
}