/*  $Id: menu_item_silver.cpp,v 1.4 2004/01/03 23:03:22 sphair Exp $
**
**  ClanLib Game SDK
**  Copyright (C) 2003  The ClanLib Team
**  For a total list of contributers see the file CREDITS.
**
**  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
**
*/

#include "API/Display/font.h"
#include "API/Display/display.h"
#include "API/Display/surface.h"
#include "API/Core/Resources/resource_manager.h"
#include "API/GUI/component_style.h"
#include "API/GUI/menu_item.h"
#include "API/GUIStyleSilver/menu_item_silver.h"
#include "API/GUIStyleSilver/stylemanager_silver.h"

/////////////////////////////////////////////////////////////////////////////
// Construction:

CL_MenuItem_Silver::CL_MenuItem_Silver(
	CL_MenuItem *menu_item,
	CL_StyleManager_Silver *style)
:
	CL_ComponentStyle(menu_item),
	menu_item(menu_item),
	sur_icon(0),
	sur_checked(0),
	sur_unchecked(0),
	delete_sur_icon(false)
{
	resources = style->get_resources();
	
	font = new CL_Font("MenuItem/font", resources);
	font_disabled = new CL_Font("MenuItem/font_disabled", resources);

	slot_paint = menu_item->sig_paint().connect(
		this, &CL_MenuItem_Silver::on_paint);
	slot_get_preferred_size = menu_item->sig_get_preferred_size().connect(
		this, &CL_MenuItem_Silver::on_get_preferred_size);
}

CL_MenuItem_Silver::~CL_MenuItem_Silver()
{
	delete font;
	delete font_disabled;
	delete sur_checked;
	delete sur_unchecked;

	if( delete_sur_icon )
		delete sur_icon;
}

/////////////////////////////////////////////////////////////////////////////
// Callbacks:

void CL_MenuItem_Silver::on_get_preferred_size(CL_Size &size)
{
	int icon_width = 0;
	int height = 16;

	if( menu_item->use_icon() )
		icon_width = 16;
	
	if( font->get_height(menu_item->get_text()) > height )
		height = font->get_height(menu_item->get_text())+1;

	size.width = icon_width + 4 + font->get_width(menu_item->get_text());
	size.height = height;
}

void CL_MenuItem_Silver::on_paint()
{
	if( menu_item->is_toggling() )
	{
		if( sur_checked == 0 && sur_unchecked == 0 )
		{
			if (resources->exists("MenuItem/checked"))
				sur_checked = new CL_Surface("MenuItem/checked", resources);
			if (resources->exists("MenuItem/unchecked"))
				sur_unchecked = new CL_Surface("MenuItem/unchecked", resources);
		}

		if( menu_item->is_selected() )
		{
			if( sur_checked )
				sur_checked->draw(0,0);
		}
		else	
		{
			if( sur_unchecked )
				sur_unchecked->draw(0,0);
		}
	}
	else if( sur_icon )
		sur_icon->draw(0,0);

	const char *text = menu_item->get_text().c_str();

	// check if menu node is enabled
	bool is_enabled = menu_item->get_parent()->is_enabled();

	// check if parent menu is enabled
	if( menu_item->get_parent()->get_parent()->is_enabled() == false )
		is_enabled = false;

	if( menu_item->use_icon() )
	{
		if( is_enabled )
			font->draw(20, 2, text);
		else
			font_disabled->draw(18, 2, text);
	}
	else
	{
		if( is_enabled )
			font->draw(2, 2, text);
		else
			font_disabled->draw(2, 2, text);
	}
}

/////////////////////////////////////////////////////////////////////////////
// Operations:

void CL_MenuItem_Silver::set_icon(CL_Surface *sur, bool del_surface)
{
	if( sur_icon && delete_sur_icon )
		delete sur_icon;
	
	sur_icon = sur;
	delete_sur_icon = del_surface;
}

