//////////
//
//	File:		TestFunctions.c
//
//	Contains:	Test functions for changing QuickTime VR cursors.
//
//	Written by:	Tim Monroe
//
//	Copyright:	© 1997 by Apple Computer, Inc., all rights reserved.
//
//	Change History (most recent first):
//
//	   <1>	 	06/27/97	rtm		first file: added code to change some hot spot cursors
//	   
//////////

// header files
#include "TestFunctions.h"
#include "QTVRUtilities.h"


//////////
//
// A word (or two) on cursors.
//
// Each hot spot type is associated with 3 cursors:
// (1) a cursor that is displayed when it is within the hot spot (the "mouse over" cursor);
// (2) a cursor that is displayed when the mouse button is down in the hot spot (the "mouse down on" cursor);
// (3) a cursor that is displayed when the mouse button is released in the hot spot (the "mouse up on" cursor).
// 
// QuickTime VR defines cursors for several types of hot spots ('link', 'navg', 'stil', 'url ', 'misc', and 'undf').
// To my knowledge, QTVR 2.0 uses only the 'link', 'url ', and 'undf' types. You are free, I think, to create
// hots spots having those other types ('navg', 'stil', and 'misc'). To be safe, however, if you want to attach
// custom cursors to particular types of hot spots, you should probably use some other hot spot type.
// 
// You can use several techniques to attach custom cursors to specific hot spots or to specific types of hot spots.
// The easiest way is to attach the custom cursors at authoring time. This is a two-step process: first, create
// a hot spot information atom for the hot spot. One of the items of data in that atom is an array of three cursor IDs
// for cursors that are to be used instead of the default cursors supplied by QTVR. Then, create resources of type
// 'CURS' having the appropriate IDs and include those resources in the movie file. You can use this technique
// for both format 1.0 and 2.0 QuickTime VR movies. (And, of course, to change the cursors for an entire hot spot
// type, just use the same cursor IDs for all hot spots of that type in the movie.)
//
// To change cursors using the API, you can use the QTVRReplaceCursor function. You can use this function to
// change any of the cursors used by QTVR, not just the hot spot cursors. Here, however, we'll suppose that you want
// to use custom cursors for your own hot spot types. (The same ideas should apply for changing any other cursors.)
// In all likelihood, you'll want to have several types of custom hot spots. By default, QTVR uses a single triplet
// of cursors for *all* undefined hot spot types. So you'll need to replace the undefined cursors dynamically,
// based on the type of custom hot spot. The source file QTVRUtilities.c includes a function QTVRUtils_GetHotSpotType
// that returns the type of a hot spot specified by its ID. We'll use that function to get the type of a hot spot
// whenever an appropriate hot spot action occurs, and change the cursor at that time. (You could probably speed things
// up slightly by building a table of IDs and types, so you don't have to keep looking types up.)
//
//////////


//////////
//
// MyMouseOverHotSpotProc
// Change cursor when over certain types of hot spots.
//
//////////

PASCAL_RTN OSErr MyMouseOverHotSpotProc (QTVRInstance theInstance, UInt32 theHotSpotID, UInt32 theFlags, long theRefCon)
{
#pragma unused(theRefCon)

	OSType				myType;
	QTVRCursorRecord	myCursorRec;
	OSErr				myErr = noErr;

	// when we first move into a hot spot, set its cursors according to the hot spot type
	if (theFlags == kQTVRHotSpotEnter) {

		// get the type of the hot spot, given its ID
		QTVRGetHotSpotType(theInstance, theHotSpotID, &myType);

		if (myType == kQTVRHotSpotUndefinedType) {

			myCursorRec.theType = kQTVRStdCursorType;
				
			// change the mouse-over-undefined-hot-spot cursor
			myCursorRec.rsrcID = kCursID_MouseOverUndefHS;
			myCursorRec.handle = (Handle)MacGetCursor(kCursID_MouseOverUndefHS);
			QTVRReplaceCursor(theInstance, &myCursorRec);
			if (myCursorRec.handle != NULL)
				ReleaseResource(myCursorRec.handle);
			
			// change the mouse-down-on-undefined-hot-spot cursor
			myCursorRec.rsrcID = kCursID_MouseDownOnUndefHS;
			myCursorRec.handle = (Handle)MacGetCursor(kCursID_MouseDownOnUndefHS);
			QTVRReplaceCursor(theInstance, &myCursorRec);
			if (myCursorRec.handle != NULL)
				ReleaseResource(myCursorRec.handle);
			
			// change the mouse-up-on-undefined-hot-spot cursor
			myCursorRec.rsrcID = kCursID_MouseUpOnUndefHS;
			myCursorRec.handle = (Handle)MacGetCursor(kCursID_MouseUpOnUndefHS);
			QTVRReplaceCursor(theInstance, &myCursorRec);
			if (myCursorRec.handle != NULL)
				ReleaseResource(myCursorRec.handle);
		}
		
	}
	
	if (theFlags == kQTVRHotSpotLeave) {
			
			myCursorRec.theType = kQTVRUseDefaultCursor;
				
			// change the mouse-over-undefined-hot-spot cursor
			myCursorRec.rsrcID = kCursID_MouseOverUndefHS;
			myCursorRec.handle = NULL;
			QTVRReplaceCursor(theInstance, &myCursorRec);
			
			// change the mouse-down-on-undefined-hot-spot cursor
			myCursorRec.rsrcID = kCursID_MouseDownOnUndefHS;
			myCursorRec.handle = NULL;
			QTVRReplaceCursor(theInstance, &myCursorRec);
			
			// change the mouse-up-on-undefined-hot-spot cursor
			myCursorRec.rsrcID = kCursID_MouseUpOnUndefHS;
			myCursorRec.handle = NULL;
			QTVRReplaceCursor(theInstance, &myCursorRec);
	}

	return(myErr);
}

