#include "tk_button.h"
#include "image/tk_photo.h"

const Ptr<TkOptionDef> TkButton::OPT_ACTIVEBACKGROUND=new TkOptionDef("activebackground",TkColorOption::type);
const Ptr<TkOptionDef> TkButton::OPT_ACTIVEFOREGROUND=new TkOptionDef("activeforeground",TkColorOption::type);
const Ptr<TkOptionDef> TkButton::OPT_ANCHOR=new TkOptionDef("anchor",TkAnchorOption::type);
const Ptr<TkOptionDef> TkButton::OPT_BACKGROUND=new TkOptionDef("background",TkColorOption::type);
const Ptr<TkOptionDef> TkButton::OPT_BITMAP=0;
const Ptr<TkOptionDef> TkButton::OPT_BORDERWIDTH=new TkOptionDef("borderwidth",TkIntOption::type);
const Ptr<TkOptionDef> TkButton::OPT_COMMAND=0;
const Ptr<TkOptionDef> TkButton::OPT_COMPOUND=new TkOptionDef("compound",TkCompoundOption::type);
const Ptr<TkOptionDef> TkButton::OPT_CURSOR=0;
const Ptr<TkOptionDef> TkButton::OPT_DEFAULT=0;
const Ptr<TkOptionDef> TkButton::OPT_DISABLEDFOREGROUND=new TkOptionDef("disabledforeground",TkColorOption::type);
const Ptr<TkOptionDef> TkButton::OPT_FONT=0;
const Ptr<TkOptionDef> TkButton::OPT_FOREGROUND=new TkOptionDef("foreground",TkColorOption::type);
const Ptr<TkOptionDef> TkButton::OPT_HEIGHT=new TkOptionDef("height",TkIntOption::type);
const Ptr<TkOptionDef> TkButton::OPT_HIGHLIGHTBACKGROUND=new TkOptionDef("highlightbackground",TkColorOption::type);
const Ptr<TkOptionDef> TkButton::OPT_HIGHLIGHTCOLOR=new TkOptionDef("highlightcolor",TkColorOption::type);
const Ptr<TkOptionDef> TkButton::OPT_HIGHLIGHTTHICKNESS=new TkOptionDef("highlightthickness",TkIntOption::type);
const Ptr<TkOptionDef> TkButton::OPT_IMAGE=new TkOptionDef("image",TkPhoto::type);
const Ptr<TkOptionDef> TkButton::OPT_JUSTIFY=new TkOptionDef("justify",TkJustifyOption::type);
const Ptr<TkOptionDef> TkButton::OPT_PADX=new TkOptionDef("padx",TkIntOption::type);
const Ptr<TkOptionDef> TkButton::OPT_PADY=new TkOptionDef("pady",TkIntOption::type);
const Ptr<TkOptionDef> TkButton::OPT_RELIEF=new TkOptionDef("relief",TkReliefOption::type);
const Ptr<TkOptionDef> TkButton::OPT_REPEATDELAY=new TkOptionDef("repeatdelay",TkIntOption::type);
const Ptr<TkOptionDef> TkButton::OPT_REPEATINTERVAL=new TkOptionDef("repeatinterval",TkIntOption::type);
const Ptr<TkOptionDef> TkButton::OPT_STATE=new TkOptionDef("state",TkStateOption::type);
const Ptr<TkOptionDef> TkButton::OPT_TAKEFOCUS=0;
const Ptr<TkOptionDef> TkButton::OPT_TEXT=new TkOptionDef("text",TkStringOption::type);
const Ptr<TkOptionDef> TkButton::OPT_UNDERLINE=0;
const Ptr<TkOptionDef> TkButton::OPT_WIDTH=new TkOptionDef("width",TkIntOption::type);
const Ptr<TkOptionDef> TkButton::OPT_WRAPLENGTH=0;

const Ptr<TkOptionDef> TkButton::optAll[]=
{
	TkButton::OPT_ACTIVEBACKGROUND,
	TkButton::OPT_ACTIVEFOREGROUND,
	TkButton::OPT_ANCHOR,
	TkButton::OPT_BACKGROUND,
	TkButton::OPT_BITMAP,
	TkButton::OPT_BORDERWIDTH,
	TkButton::OPT_COMMAND,
	TkButton::OPT_COMPOUND,
	TkButton::OPT_CURSOR,
	TkButton::OPT_DEFAULT,
	TkButton::OPT_DISABLEDFOREGROUND,
	TkButton::OPT_FONT,
	TkButton::OPT_FOREGROUND,
	TkButton::OPT_HEIGHT,
	TkButton::OPT_HIGHLIGHTBACKGROUND,
	TkButton::OPT_HIGHLIGHTCOLOR,
	TkButton::OPT_HIGHLIGHTTHICKNESS,
	TkButton::OPT_IMAGE,
	TkButton::OPT_JUSTIFY,
	TkButton::OPT_PADX,
	TkButton::OPT_PADY,
	TkButton::OPT_RELIEF,
	TkButton::OPT_REPEATDELAY,
	TkButton::OPT_REPEATINTERVAL,
	TkButton::OPT_STATE,
	TkButton::OPT_TAKEFOCUS,
	TkButton::OPT_TEXT,
	TkButton::OPT_UNDERLINE,
	TkButton::OPT_WIDTH,
	TkButton::OPT_WRAPLENGTH
};

const char* TkButton::type="TkButton";
const char* TkButton::tkClass="button";

const Ptr<TkOptionDef>* TkButton::getOptionAll() const
{
	return TkButton::optAll;
}

const char* TkButton::getType() const
{
	return TkButton::type;
}

const char* TkButton::getTkClass() const
{
	return TkButton::tkClass;
}

void TkButton::doSerialize(TiXmlElement& element) const
{
	TkBase::doSerialize(element);
	
	element.SetAttribute("text",getText().c_str());
}

void TkButton::doDeserialize(const TiXmlElement& element)
{
	TkBase::doDeserialize(element);

	setText(element.Attribute("text"));
}


TObject* TkButton::clone()
{
	TkBase* obj=new TkButton(interp);

	baseClone(obj);

	return obj;
}

TkButton::TkButton(Ptr<TclInterp>& interp):TkBase(interp)
{
}

TkButton::TkButton(Ptr<TclInterp>& interp,const string& text):TkBase(interp)
{
	setText(text);
}

void TkButton::setEnabled(bool value)
{
	if (value)
		setOption(TkButton::OPT_STATE,new TkStateOption(TkStateOption::normal));
	else
		setOption(TkButton::OPT_STATE,new TkStateOption(TkStateOption::disabled));	
}

bool TkButton::isEnabled() const
{
	const string enabled=getStrOption(TkButton::OPT_STATE);
	if (enabled=="disabled") return false;
	return true;
}

void TkButton::setText(const string& text)
{
	setOption(TkButton::OPT_TEXT,new TkStringOption(text));
}
	
const string& TkButton::getText() const
{
	return TkBase::getStrOption(TkButton::OPT_TEXT);
}

void TkButton::setBackgroundColor(TkColorOption* color)
{
	setOption(OPT_BACKGROUND,color);
}

Ptr<TkColorOption>& TkButton::getBackgroundColor() const
{
	TkColorOption* colorOption=new TkColorOption();
	
	colorOption->fromObject(getOption(OPT_BACKGROUND));
	return *(new Ptr<TkColorOption>(colorOption));
}

