//------------------------------------------------------------------------------
// Revenge Of The Cats: Ethernet
// Copyright notices are in the file named COPYING.
//------------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// Torque Game Engine 
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------

//------------------------------------------------------------------------------
// Cursor Control
//------------------------------------------------------------------------------

$cursorControlled = true;

function cursorOff()
{
	if ( $cursorControlled )
		lockMouse(true);
	Canvas.cursorOff();
}

function cursorOn()
{
	if ( $cursorControlled )
		lockMouse(false);
	Canvas.cursorOn();
	Canvas.setCursor(DefaultCursor); 
}

// In the CanvasCursor package we add some additional functionality to the
// built-in GuiCanvas class, of which the global Canvas object is an instance.
// In this case, the behavior we want is for the cursor to automatically display,
// except when the only guis visible want no cursor - most notably,
// in the case of the example, the play gui.
// In order to override or extend an existing class, we use the script package
// feature.

package CanvasCursor
{

// The checkCursor method iterates through all the root controls on the canvas
// (basically the content control and any visible dialogs).  If all of them
// have the .noCursor attribute set, the cursor is turned off, otherwise it is
// turned on.

function GuiCanvas::checkCursor(%this)
{
	%cursorShouldBeOn = false;
	for(%i = 0; %i < %this.getCount(); %i++)
	{
		%control = %this.getObject(%i);
		if(%control.noCursor == 0)
		{
			%cursorShouldBeOn = true;
			break;
		}
	}
	if(%cursorShouldBeOn != %this.isCursorOn())
	{
		if(%cursorShouldBeOn)
			cursorOn();
		else
			cursorOff();
	}
}

// below, all functions which can alter which content controls are visible
// are extended to call the checkCursor function.  For package'd functions,
// the Parent:: call refers to the original implementation of that function,
// or a version that was declared in a previously activated package.
// In this case the parent calls should point to the built in versions
// of GuiCanvas functions.

function GuiCanvas::setContent(%this, %ctrl)
{
	Parent::setContent(%this, %ctrl);

	%oldContent = Canvas.getContent();
	if(%ctrl != %oldContent)
		onCanvasContentChanged(%oldContent, %ctrl);

	%this.checkCursor();
}

function GuiCanvas::pushDialog(%this, %ctrl, %layer)
{
	Parent::pushDialog(%this, %ctrl, %layer);
	%this.checkCursor();
}

function GuiCanvas::popDialog(%this, %ctrl)
{
	Parent::popDialog(%this, %ctrl);
	%this.checkCursor();
}

function GuiCanvas::popLayer(%this, %layer)
{
	Parent::popLayer(%this, %layer);
	%this.checkCursor();
}

};

// activate the package when the script loads.
activatePackage(CanvasCursor);
