/************************************************************************
	filename: 	CEGUIStaticImage.h
	created:	4/6/2004
	author:		Paul D Turner
	
	purpose:	Interface for the static image widget.
*************************************************************************/
/*************************************************************************
    Crazy Eddie's GUI System (http://www.cegui.org.uk)
    Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk)

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*************************************************************************/
#ifndef _CEGUIStaticImage_h_
#define _CEGUIStaticImage_h_

#include "elements/CEGUIStatic.h"
#include "CEGUIRenderableImage.h"
#include "elements/CEGUIStaticImageProperties.h"


#if defined(_MSC_VER)
#	pragma warning(push)
#	pragma warning(disable : 4251)
#endif


// Start of CEGUI namespace section
namespace CEGUI
{
/*!
\brief
	Static image widget class.

	This base class performs it's own rendering.  There is no need to override this widget to perform rendering
	of static images.
*/
class CEGUIEXPORT StaticImage : public Static
{
public:
	static const String EventNamespace;				//!< Namespace for global events


	/*************************************************************************
		Formatting Enumerations
	*************************************************************************/
	/*!
	\brief
		Enumeration of horizontal formatting options for static image widgets
	*/
	enum HorzFormatting
	{
		LeftAligned,	//!< Image will be rendered at it's natural width, with it's left edge aligned with the left edge of the widget.
		RightAligned,	//!< Image will be rendered at it's natural width, with it's right edge aligned with the right edge of the widget.
		HorzCentred,	//!< Image will be rendered at it's natural width, horizontally centred within the widget.
		HorzStretched,	//!< Image will be horizontally stretched to cover the entire width of the widget.
		HorzTiled		//!< Image will be tiled horizontally across the width of the widget.  The rightmost tile may be clipped.
	};


	/*!
	\brief
		Enumeration of vertical formatting options for a static image widgets
	*/
	enum VertFormatting
	{
		TopAligned,		//!< Image will be rendered at it's natural height, with it's top edge aligned with the top edge of the widget.
		BottomAligned,	//!< Image will be rendered at it's natural height, with it's bottom edge aligned with the bottom edge of the widget.
		VertCentred,	//!< Image will be rendered at it's natural height, vertically centred within the widget.
		VertStretched,	//!< Image will be vertically stretched to cover the entire height of the widget.
		VertTiled		//!< Image will be tiled vertically down the height of the widget.  The bottommost tile may be clipped.
	};


	/*************************************************************************
		Construction and Destruction
	*************************************************************************/
	/*!
	\brief
		Constructor for StaticImage widgets.
	*/
	StaticImage(const String& type, const String& name);


	/*!
	\brief
		Destructor for StaticImage widgets.
	*/
	virtual ~StaticImage(void);


	/*************************************************************************
		Accessors
	*************************************************************************/
	/*!
	\brief
		Return a pointer to the current image displayed by this static image widget.

	\return
		Pointer to the Image object that is used to render this widget, or NULL for none.
	*/
	const Image*	getImage(void) const		{return d_image.getImage();}


	/*!
	\brief
		Return a ColourRect object containing the colours used when rendering this widget.

	\return
		ColourRect object initialised with the colours used when rendering the image for this widget.
	*/
	ColourRect	getImageColours(void) const		{return d_imageCols;}

	
	/*!
	\brief
		Return the current horizontal formatting option set for this widget.

	\return
		One of the StaticImage::HorzFormatting enumerated values specifying the horizontal formatting currently set.
	*/
	HorzFormatting	getHorizontalFormatting(void) const		{return	(HorzFormatting)d_image.getHorzFormatting();}


	/*!
	\brief
		Return the current vertical formatting option set for this widget.

	\return
		One of the StaticImage::VertFormatting enumerated values specifying the vertical formatting currently set.
	*/
	VertFormatting	getVerticalFormatting(void) const		{return	(VertFormatting)d_image.getVertFormatting();}


	/*************************************************************************
		Manipulators
	*************************************************************************/
	/*!
	\brief
		Set the Image object to be drawn by this widget.

	\param image
		Pointer to the Image object to be rendered.  Can be NULL to specify no image is to be rendered.
	
	\return
		Nothing.
	*/
	void	setImage(const Image* image);


	/*!
	\brief
		Set the Image object to be drawn by this widget.

	\param imageset
		String object specifying the name of the Imageset that holds the required image.

	\param image
		Name of the Image on the specified Imageset that is to be used.
	
	\return
		Nothing.

	\exception UnknownObjectException	thrown if Imageset \a imageset does not exist in the system or if \a imageset contains no Image named \a image.
	*/
	void	setImage(const String& imageset, const String& image);


	/*!
	\brief
		Sets the colours to be applied when rendering the image.

	\param colours
		ColourRect object describing the colours to be used.

	\return 
		Nothing.
	*/
	void	setImageColours(const ColourRect& colours);


	/*!
	\brief
		Sets the colours to be applied when rendering the image.

	\param top_left_colour
		Colour to be applied to the top-left corner of each Image used in the image.

	\param top_right_colour
		Colour to be applied to the top-right corner of each Image used in the image.

	\param bottom_left_colour
		Colour to be applied to the bottom-left corner of each Image used in the image.

	\param bottom_right_colour
		Colour to be applied to the bottom-right corner of each Image used in the image.

	\return 
		Nothing.
	*/
	void	setImageColours(const colour& top_left_colour, const colour& top_right_colour, const colour& bottom_left_colour, const colour& bottom_right_colour);


	/*!
	\brief
		Sets the colour to be applied when rendering the image.

	\param col
		colour value to be used when rendering.

	\return
		Nothing.
	*/
	void	setImageColours(const colour& col)		{setImageColours(col, col, col, col);}


	/*!
	\brief
		Set the formatting required for the image.

	\param h_fmt
		One of the HorzFormatting enumerated values specifying the formatting required.

	\param v_fmt
		One of the VertFormatting enumerated values specifying the formatting required.

	\return
		Nothing
	*/
	void	setFormatting(HorzFormatting h_fmt, VertFormatting v_fmt);


	/*!
	\brief
		Set the formatting required for the image.

	\param v_fmt
		One of the VertFormatting enumerated values specifying the formatting required.

	\return
		Nothing
	*/
	void	setVerticalFormatting(VertFormatting v_fmt);


	/*!
	\brief
		Set the formatting required for the image.

	\param h_fmt
		One of the HorzFormatting enumerated values specifying the formatting required.

	\return
		Nothing
	*/
	void	setHorizontalFormatting(HorzFormatting h_fmt);


protected:
	/*************************************************************************
		Overridden from base class
	*************************************************************************/
	virtual	void populateRenderCache();

	
	/*************************************************************************
		Event handling
	*************************************************************************/
	virtual void	onSized(WindowEventArgs& e);
	virtual void	onAlphaChanged(WindowEventArgs& e);
	virtual void	onStaticFrameChanged(WindowEventArgs& e);


	/*************************************************************************
		Implementation Methods
	*************************************************************************/
	/*!
	\brief
		update the internal RenderableImage with currently set colours and
		alpha settings.
	*/
	void	updateRenderableImageColours(void);


	/*!
	\brief
		Return whether this window was inherited from the given class name at some point in the inheritance heirarchy.

	\param class_name
		The class name that is to be checked.

	\return
		true if this window was inherited from \a class_name. false if not.
	*/
	virtual bool	testClassName_impl(const String& class_name) const
	{
		if (class_name==(const utf8*)"StaticImage")	return true;
		return Static::testClassName_impl(class_name);
	}


	/*************************************************************************
		Implementation Data
	*************************************************************************/
	RenderableImage	d_image;		//!< RenderableImage that does most of the work for us.
	ColourRect		d_imageCols;	//!< Colours to use for the image.


private:
	/*************************************************************************
		Static Properties for this class
	*************************************************************************/
	static StaticImageProperties::Image				d_imageProperty;
	static StaticImageProperties::ImageColours		d_imageColoursProperty;
	static StaticImageProperties::VertFormatting	d_vertFormattingProperty;
	static StaticImageProperties::HorzFormatting	d_horzFormattingProperty;


	/*************************************************************************
		Private methods
	*************************************************************************/
	void	addStaticImageProperties(void);
};

} // End of  CEGUI namespace section

#if defined(_MSC_VER)
#	pragma warning(pop)
#endif

#endif	// end of guard _CEGUIStaticImage_h_
