/*  $Id: default_component_types.h,v 1.44 2003/10/28 23:15:44 mbn Exp $
	
	ClanGUI, copyrights by various people. Have a look in the CREDITS file.
	
	This sourcecode is distributed using the Library GNU Public Licence,
	version 2 or (at your option) any later version. Please read LICENSE
	for details.
*/

#include "../API/GUI/component_type.h"

#include "API/GUI/button.h"
#include "API/GUI/checkbox.h"
#include "API/GUI/filedialog.h"
#include "API/GUI/frame.h"
#include "API/GUI/image.h"
#include "API/GUI/inputbox.h"
#include "API/GUI/label.h"
#include "API/GUI/listbox.h"
#include "API/GUI/progressbar.h"
#include "API/GUI/radiobutton.h"
#include "API/GUI/scrollbar.h"
#include "API/GUI/window.h"

class CL_ComponentType_Component : public CL_ComponentType
{
public:
	CL_ComponentType_Component() : CL_ComponentType()
	{
		set_class_name("CL_Component");
		set_option("x", NUMBER, "0");
		set_option("y", NUMBER, "0");
		set_option("width", NUMBER, "100");
		set_option("height", NUMBER, "20");
		set_option("visible", BOOL, "1");
		set_option("enabled", BOOL, "1");
		set_option("tab_id", NUMBER, "0");
	}
};

class CL_ComponentType_Button : public CL_ComponentType_Component
{
public:
	CL_ComponentType_Button() : CL_ComponentType_Component()
	{
		set_class_name("CL_Button");
		set_option("text", STRING, "");
		set_option("togglemode", NUMBER, "0");
		set_option("toggled", BOOL, "0");
	}

	virtual CL_Component *create_component(
		CL_Component *parent,
		CL_StyleManager *style)
	{
		return new CL_Button(parent, style);
	}
};

class CL_ComponentType_CheckBox : public CL_ComponentType_Button
{
public:
	CL_ComponentType_CheckBox() : CL_ComponentType_Button()
	{
		set_class_name("CL_CheckBox");
	}

	virtual CL_Component *create_component(
		CL_Component *parent,
		CL_StyleManager *style)
	{
		return new CL_CheckBox(parent, style);
	}
};

class CL_ComponentType_FileDialog : public CL_ComponentType_Component
{
public:
	CL_ComponentType_FileDialog() : CL_ComponentType_Component()
	{
		set_class_name("CL_FileDialog");
		set_option("file", STRING, "");
		set_option("filter", STRING, "*.*");
		set_option("show_hidden", BOOL, "0");
	}

	virtual CL_Component *create_component(
		CL_Component *parent,
		CL_StyleManager *style)
	{
		return new CL_FileDialog(parent, style);
	}
};

class CL_ComponentType_Frame : public CL_ComponentType_Component
{
public:
	CL_ComponentType_Frame() : CL_ComponentType_Component()
	{
		set_class_name("CL_Frame");
		set_option("filled", BOOL, "1");
	}

	virtual CL_Component *create_component(
		CL_Component *parent,
		CL_StyleManager *style)
	{
		return new CL_Frame(parent, style);
	}
};

class CL_ComponentType_Image : public CL_ComponentType_Component
{
public:
	CL_ComponentType_Image() : CL_ComponentType_Component()
	{
		set_class_name("CL_Image");
		// TODO: add options
	}

	virtual CL_Component *create_component(
		CL_Component *parent,
		CL_StyleManager *style)
	{
		return new CL_Image(parent, style);
	}
};

class CL_ComponentType_InputBox : public CL_ComponentType_Component
{
public:
	CL_ComponentType_InputBox() : CL_ComponentType_Component()
	{
		set_class_name("CL_InputBox");
		set_option("text", STRING, "");
		set_option("passwordmode", NUMBER, "0");
		set_option("read_only", BOOL, "0");
		set_option("max_length", NUMBER, "0");
	}

	virtual CL_Component *create_component(
		CL_Component *parent,
		CL_StyleManager *style)
	{
		return new CL_InputBox(parent, style);
	}
};

class CL_ComponentType_Label : public CL_ComponentType_Component
{
public:
	CL_ComponentType_Label() : CL_ComponentType_Component()
	{
		set_class_name("CL_Label");
		set_option("text", STRING, "");
	}

	virtual CL_Component *create_component(
		CL_Component *parent,
		CL_StyleManager *style)
	{
		return new CL_Label(parent, style);
	}
};

class CL_ComponentType_ListBox : public CL_ComponentType_Component
{
public:
	CL_ComponentType_ListBox() : CL_ComponentType_Component()
	{
		set_class_name("CL_ListBox");
		set_option("item", NUMBER, "0");
		set_option("max_visible_items", NUMBER, "-1");
	}

	virtual CL_Component *create_component(
		CL_Component *parent,
		CL_StyleManager *style)
	{
		return new CL_ListBox(parent, style);
	}
};

class CL_ComponentType_ProgressBar : public CL_ComponentType_Component
{
public:
	CL_ComponentType_ProgressBar() : CL_ComponentType_Component()
	{
		set_class_name("CL_ProgressBar");
		set_option("steps", NUMBER, "100");
	}

	virtual CL_Component *create_component(
		CL_Component *parent,
		CL_StyleManager *style)
	{
		return new CL_ProgressBar(parent, style);
	}
};

class CL_ComponentType_RadioButton : public CL_ComponentType_Component
{
public:
	CL_ComponentType_RadioButton() : CL_ComponentType_Component()
	{
		set_class_name("CL_RadioButton");
		// TODO: add options
	}

	virtual CL_Component *create_component(
		CL_Component *parent,
		CL_StyleManager *style)
	{
		return new CL_RadioButton(parent, style);
	}
};

class CL_ComponentType_ScrollBar : public CL_ComponentType_Component
{
public:
	CL_ComponentType_ScrollBar() : CL_ComponentType_Component()
	{
		set_class_name("CL_ScrollBar");
		set_option("min", NUMBER, "0");
		set_option("max", NUMBER, "100");
		set_option("value", NUMBER, "0");
		set_option("orientation", NUMBER, "0");
		set_option("tracking", BOOL, "0");
	}

	virtual CL_Component *create_component(
		CL_Component *parent,
		CL_StyleManager *style)
	{
		return new CL_ScrollBar(parent, style);
	}
};

class CL_ComponentType_Window : public CL_ComponentType_Component
{
public:
	CL_ComponentType_Window() : CL_ComponentType_Component()
	{
		set_class_name("CL_Window");
		set_option("title", STRING, "");
	}

	virtual CL_Component *create_component(
		CL_Component *parent,
		CL_StyleManager *style)
	{
		return new CL_Window(parent, style);
	}
};

// TODO:

// Add missing component-types:
// - Image
// - RadioButton

// Add missing components:
// - TreeView
// - (Menu)
// - (PopupMenu)
