// Copyright (C) 2004 Id Software, Inc.
//

#ifndef __USERINTERFACE_H__
#define __USERINTERFACE_H__

struct wrapInfo_t {
	int lastWhitespace;
	int maxIndex;
	wrapInfo_t ( void ) {
		lastWhitespace = -1;
		maxIndex = -1;
	}
};

/*
===============================================================================

	Draws an interactive 2D surface.
	Used for all user interaction with the game.

===============================================================================
*/

class idFile;
class idDemoFile;


class idUserInterface {
public:
	virtual						~idUserInterface( void ) {}

								// Returns the name of the gui.
	virtual const char *		Name( void ) const = 0;

								// Returns a comment on the gui.
	virtual const char *		Comment( void ) const = 0;

								// Returns true if the gui is interactive.
	virtual bool				IsInteractive() const = 0;

// RAVEN BEGIN
// bdube: added
								// Changes the interactive of the gui
	virtual void				SetInteractive ( bool interactive ) = 0 ;
// RAVEN END

	virtual bool				IsUniqued() const = 0;

	virtual void				SetUniqued( bool b ) = 0;
								// returns false if it failed to load
	virtual bool				InitFromFile( const char *qpath, bool rebuild = true, bool cache = true ) = 0;

								// handles an event, can return an action string, the caller interprets
								// any return and acts accordingly
	virtual const char *		HandleEvent( const sysEvent_t *event, int time, bool *updateVisuals = NULL ) = 0;

								// handles a named event
	virtual void				HandleNamedEvent( const char *eventName ) = 0;

								// repaints the ui
	virtual void				Redraw( int time, bool useAspectCorrection = true ) = 0;

								// repaints the cursor
	virtual void				DrawCursor( void ) = 0;

								// Provides read access to the idDict that holds this gui's state.
	virtual const idDict &		State( void ) const = 0;

								// Removes a gui state variable
	virtual void				DeleteStateVar( const char *varName ) = 0;

								// Sets a gui state variable.
	virtual void				SetStateString( const char *varName, const char *value ) = 0;
	virtual void				SetStateBool( const char *varName, const bool value ) = 0;
	virtual void				SetStateInt( const char *varName, const int value ) = 0;
	virtual void				SetStateFloat( const char *varName, const float value ) = 0;
	//virtual void				SetStateVector( const char *varName, const idVec3& vector ) = 0;
	virtual void				SetStateVec4( const char *varName, const idVec4& vector ) { }

//	virtual void				DeleteState( const char *varName ) = 0;

	virtual idVec4				GetLightColor(void) { idVec4 zero; zero.Zero(); return zero; }

								// Gets a gui state variable
	virtual const char*			GetStateString( const char *varName, const char* defaultString = "" ) const = 0;
	virtual bool				GetStateBool( const char *varName, const char* defaultString = "0" ) const  = 0;
	virtual int					GetStateInt( const char *varName, const char* defaultString = "0" ) const = 0;
	virtual float				GetStateFloat( const char *varName, const char* defaultString = "0" ) const = 0;
//	virtual idVec3				GetStateVector( const char *varName, const char* defaultString = "0 0 0" ) const = 0;
//	virtual idVec4				GetStateVec4( const char *varName, const char* defaultString = "0 0 0 0" ) const = 0;

// jscott: added
	virtual class idWindow *	GetDesktop( void ) const = 0;
// RAVEN END

								// The state has changed and the gui needs to update from the state idDict.
	virtual void				StateChanged( int time, bool redraw = false ) = 0;

								// Activated the gui.
	virtual const char *		Activate( bool activate, int time ) = 0;

								// Triggers the gui and runs the onTrigger scripts.
	virtual void				Trigger( int time ) = 0;

//	virtual	void				ReadFromDemo( class idDemoFile *f ) = 0;
//	virtual	void				WriteToDemo( class idDemoFile *f ) = 0;

	virtual bool				WriteToSaveGame( idFile *savefile ) const = 0;
	virtual bool				ReadFromSaveGame( idFile *savefile ) = 0;
	virtual void				SetKeyBindingNames( void ) = 0;

	virtual void				SetCursor( float x, float y ) = 0;
	virtual float				CursorX( void ) = 0;
	virtual float				CursorY( void ) = 0;
	virtual bool				GetMaxTextIndex( const char *windowName, const char *text, wrapInfo_t& wrapInfo ) const = 0;

};


class idUserInterfaceManager {
public:
	virtual						~idUserInterfaceManager( void ) {}

	virtual void				Init( void ) = 0;
	virtual void				Shutdown( void ) = 0;
	virtual void				Touch( const char *name ) = 0;
	virtual void				WritePrecacheCommands( idFile *f ) = 0;

								// Sets the size for 640x480 adjustment.
	virtual void				SetSize( float width, float height ) = 0;

	virtual void				BeginLevelLoad( void ) = 0;
	virtual void				EndLevelLoad( void ) = 0;


								// Reloads changed guis, or all guis.
	virtual void				Reload( bool all ) = 0;

								// lists all guis
	virtual void				ListGuis( void ) const = 0;

								// Returns true if gui exists.
	virtual bool				CheckGui( const char *qpath ) const = 0;

								// Allocates a new gui.
	virtual idUserInterface *	Alloc( void ) const = 0;

								// De-allocates a gui.. ONLY USE FOR PRECACHING
	virtual void				DeAlloc( idUserInterface *gui ) = 0;

								// Returns NULL if gui by that name does not exist.
	virtual idUserInterface *	FindGui( const char *qpath, bool autoLoad = false, bool needUnique = false, bool forceUnique = false ) = 0;

								// Returns the index into the global gui list
//	virtual int					GuiIndex( idUserInterface *gui ) = 0;

								// Returns the gui at location index, or allocates a new one at location index
//	virtual idUserInterface *	FindGuiByIndex( int index ) = 0;

								// Clears out the in game guis before loading a renderdemo
//	virtual void				ClearGameGuis( void ) = 0;

								// Allocates a new GUI list handler
	virtual	idListGUI *			AllocListGUI( void ) const = 0;

								// De-allocates a list gui
	virtual void				FreeListGUI( idListGUI *listgui ) = 0;
	
// RAVEN BEGIN
// rjohnson: added option for guis to always think
	virtual void				RunAlwaysThinkGUIs ( int time ) = 0;
//// bdube: embedded icons
	virtual void				RegisterIcon ( const char* code, const char* shader, int x = -1, int y = -1, int w = -1, int h = -1 ) { }
// RAVEN END
};

extern idUserInterfaceManager *	uiManager;

#endif /* !__USERINTERFACE_H__ */
