 /* Set up color Layers */

#include "fctsys.h"
#include "gr_basic.h"

#include "common.h"
#include "program.h"
#include "libcmp.h"
#include "general.h"

#include "id.h"

#include "protos.h"


/* Variables locales */

/* Fonctions locales: */

/* Macro utile : */
#define ADR(numlayer) &(g_LayerDescr.LayerColor[numlayer])

#define BUTT_SIZE_X 30
#define BUTT_SIZE_Y 20


enum col_sel_id {
	ID_COLOR_SETUP = 1800
};

	/**********************************/
	/* Liste des menus de Menu_Layers */
	/**********************************/
struct ColorButton
	{
	wxString m_Name;
	int * m_Color;
	int m_Id;
	wxBitmapButton * m_Button;
	int m_State;
};

static ColorButton Msg_General=
{
	_("General"),					/* Title */
	NULL
};

static ColorButton Msg_Sheets=
{
	_("Sheets"),					/* Title */
	NULL
};

static ColorButton Layer_Wire_Item=
{
	_("Wire"),					/* Title */
	ADR(LAYER_WIRE)			/* adr du parametre optionnel */
};

static ColorButton Layer_Bus_Item=
{
	_("Bus"),					/* Title */
	ADR(LAYER_BUS)			/* adr du parametre optionnel */
};

static ColorButton Layer_Jonction_Item=
{
	_("Junction"),				/* Title */
	ADR(LAYER_JUNCTION)		/* adr du parametre optionnel */
};

static ColorButton Layer_LocalLabel_Item=
{
	_("Label"),				/* Title */
	ADR(LAYER_LOCLABEL)		/* adr du parametre optionnel */
};

static ColorButton Layer_GlobLabel_Item=
{
	_("GlobLabel"),			/* Title */
	ADR(LAYER_GLOBLABEL)	/* adr du parametre optionnel */
};

static ColorButton Layer_PinNum_Item=
{
	_("PinNum"),				/* Title */
	ADR(LAYER_PINNUM)		/* adr du parametre optionnel */
};

static ColorButton Layer_PinNam_Item=
{
	_("PinNam"),				/* Title */
	ADR(LAYER_PINNAM)		/* adr du parametre optionnel */
};

static ColorButton Layer_Reference_Item=
{
	_("Reference"),			/* Title */
	ADR(LAYER_REFERENCEPART)	/* adr du parametre optionnel */
};

static ColorButton Layer_Value_Item=
{
	_("Value"),				/* Title */
	ADR(LAYER_VALUEPART)	/* adr du parametre optionnel */
};

static ColorButton Layer_Fields_Item=
{
	_("Fields"),				/* Title */
	ADR(LAYER_FIELDS)		 /* adr du parametre optionnel */
};

static ColorButton Layer_BodyDevice_Item=
{
	_("Body"),					/* Title */
	ADR(LAYER_DEVICE)		/* adr du parametre optionnel */
};

static ColorButton Layer_BodyBackgroundDevice_Item=
{
	_("Body Bg"),					/* Title */
	ADR(LAYER_DEVICE_BACKGROUND)		/* adr du parametre optionnel */
};

static ColorButton MsgDevice_Item=
{
	_("Device"),					/* Title */
	NULL
};

static ColorButton Layer_Notes_Item=
{
	_("Notes"),				/* Title */
	ADR(LAYER_NOTES)		/* adr du parametre optionnel */
};

static ColorButton Layer_NetNam_Item=
{
	_("Netname"),				/* Title */
	ADR(LAYER_NETNAM)		/* adr du parametre optionnel */
};

static ColorButton Layer_Pin_Item=
{
	_("Pin"),					/* Title */
	ADR(LAYER_PIN)			/* adr du parametre optionnel */
};

static ColorButton Layer_Sheet_Item=
{
	_("Sheet"),				/* Title */
	ADR(LAYER_SHEET)		/* adr du parametre optionnel */
};

static ColorButton Layer_SheetName_Item=
{
	_("SheetName"),			/* Title */
	ADR(LAYER_SHEETNAME)	/* adr du parametre optionnel */
};

static ColorButton Layer_SheetFileName_Item=
{
	_("Sheetfile"),			/* Title */
	ADR(LAYER_SHEETFILENAME) /* adr du parametre optionnel */
};

static ColorButton Layer_SheetLabel_Item=
{
	_("SheetLabel"),			/* Title */
	ADR(LAYER_SHEETLABEL)	/* adr du parametre optionnel */
};

static ColorButton Layer_NoConnect_Item=
{
	_("NoConn"),				/* Title */
	ADR(LAYER_NOCONNECT)	/* adr du parametre optionnel */
};


static ColorButton Msg_ErcMarck=
{
	_("Erc Mark"),					/* Title */
	NULL
};

static ColorButton Layer_Erc_Warning_Item=
{
	_("Erc Warning"),			/* Title */
	ADR(LAYER_ERC_WARN)	/* adr du parametre optionnel */
};

static ColorButton Layer_Erc_Error_Item=
{
	_("Erc Error"),				/* Title */
	ADR(LAYER_ERC_ERR)		/* adr du parametre optionnel */
};

#define NB_BUTT 26
static ColorButton * laytool_list[NB_BUTT+1] = {
	&Msg_General,
	&Layer_Wire_Item,
	&Layer_Bus_Item,
	&Layer_Jonction_Item,
	&Layer_LocalLabel_Item,
	&Layer_GlobLabel_Item,
	&Layer_NetNam_Item,
	&Layer_Notes_Item,
	&Layer_NoConnect_Item,

	&MsgDevice_Item,
	&Layer_BodyDevice_Item,
	&Layer_BodyBackgroundDevice_Item,
	&Layer_Pin_Item,
	&Layer_PinNum_Item,
	&Layer_PinNam_Item,
	&Layer_Reference_Item,
	&Layer_Value_Item,
	&Layer_Fields_Item,

	&Msg_Sheets,
	&Layer_Sheet_Item,
	&Layer_SheetFileName_Item,
	&Layer_SheetName_Item,
	&Layer_SheetLabel_Item,

	&Msg_ErcMarck,
	&Layer_Erc_Warning_Item,
	&Layer_Erc_Error_Item,

	NULL
};

/*************************************************************/
/* classe derivee pour la frame de Configuration des couleurs*/
/*************************************************************/

class WinEDA_SetColorsFrame: public wxDialog
{
private:
	WinEDA_DrawFrame *m_Parent;
	wxRadioBox * m_SelBgColor;

public:

	// Constructor and destructor
	WinEDA_SetColorsFrame(WinEDA_DrawFrame *parent, const wxPoint& framepos);
	~WinEDA_SetColorsFrame(void) {};

private:
	void SetColor(wxCommandEvent& event);
	void BgColorChoice(wxCommandEvent& event);

	DECLARE_EVENT_TABLE()

};
/* Table des evenements pour WinEDA_SetColorsFrame */
BEGIN_EVENT_TABLE(WinEDA_SetColorsFrame, wxDialog)
	EVT_RADIOBOX(ID_SEL_BG_COLOR, WinEDA_SetColorsFrame::BgColorChoice)
	EVT_COMMAND_RANGE(ID_COLOR_SETUP, ID_COLOR_SETUP+26,
			wxEVT_COMMAND_BUTTON_CLICKED,
			WinEDA_SetColorsFrame::SetColor)

END_EVENT_TABLE()



/**************************************************************/
void DisplayColorSetupFrame(WinEDA_DrawFrame * parent,
							const wxPoint & framepos)
/**************************************************************/
{
	WinEDA_SetColorsFrame * frame =
			new WinEDA_SetColorsFrame(parent, framepos);
	frame->ShowModal(); frame->Destroy();
}

/**********************************************************************/
WinEDA_SetColorsFrame::WinEDA_SetColorsFrame(WinEDA_DrawFrame *parent,
							const wxPoint& framepos):
		wxDialog(parent, -1, _("EESchema Preferences"), framepos,
			wxSize(500, 270), DIALOG_STYLE)
/**********************************************************************/
{
#define START_Y 15
wxBitmapButton * Button;
int ii, yy, butt_ID, buttcolor;
wxPoint pos;
int w = BUTT_SIZE_X, h = BUTT_SIZE_Y;
wxStaticText * text;
int right, bottom, line_height;
wxPoint bg_color_pos;
	
	m_Parent = parent;
	SetFont(*g_DialogFont);

	pos.x = 10; pos.y = START_Y;
	right = pos.x; bottom = 0;
	line_height = h;
	for ( ii = 0; laytool_list[ii] != NULL; ii++ )
		{
		if( laytool_list[ii]->m_Color == NULL)
			{
			if( pos.y != START_Y )
			{
				pos.x = right + 10;
				pos.y = START_Y;
				bg_color_pos = pos;
			}
			wxString msg = wxGetTranslation(laytool_list[ii]->m_Name);
			text = new wxStaticText(this,-1,
					msg,
					wxPoint(pos.x, pos.y ),
					wxSize(-1,-1), 0 );
			line_height = MAX(line_height, text->GetRect().GetHeight());
			pos.y += line_height;
			continue;
			}
		butt_ID = ID_COLOR_SETUP + ii;
		laytool_list[ii]->m_Id = butt_ID;
		wxMemoryDC iconDC;
		wxBitmap ButtBitmap(w,h);
		iconDC.SelectObject( ButtBitmap );
		buttcolor = *laytool_list[ii]->m_Color;
		wxBrush Brush;
		iconDC.SelectObject( ButtBitmap );
		iconDC.SetPen(*wxBLACK_PEN);
		Brush.SetColour(
						ColorRefs[buttcolor].m_Red,
						ColorRefs[buttcolor].m_Green,
						ColorRefs[buttcolor].m_Blue
						);
		Brush.SetStyle(wxSOLID);

		iconDC.SetBrush(Brush);
		iconDC.DrawRectangle(0,0, w, h);

		Button = new wxBitmapButton(this, butt_ID,
						ButtBitmap,
						wxPoint(pos.x, pos.y - ((h -line_height)/2) ),
						wxSize(w,h) );
		laytool_list[ii]->m_Button = Button;

		wxString msg = wxGetTranslation(laytool_list[ii]->m_Name);
		text = new wxStaticText(this,-1,
					msg,
					wxPoint(pos.x + 5 + w , pos.y ),
					wxSize(-1,-1), 0 );
		wxPoint lowpos;
		lowpos.x = text->GetRect().GetRight();
		lowpos.y = text->GetRect().GetBottom();
		right = MAX(right, lowpos.x);
		bottom = MAX(bottom, lowpos.y);
		bg_color_pos.y = lowpos.y;

		yy = line_height + 5;
		pos.y += yy;
		}

	bg_color_pos.x += 5; bg_color_pos.y += 25;
wxString bg_choice[2] = { _("White Background"), _("Black Background")};
	m_SelBgColor = new wxRadioBox(this, ID_SEL_BG_COLOR,
			_("Background Colour"), bg_color_pos,
			wxDefaultSize, 2, bg_choice, 1, wxRA_SPECIFY_COLS);
	m_SelBgColor->SetSelection( (g_DrawBgColor == BLACK) ? 1 : 0);
	bottom = MAX(bottom, m_SelBgColor->GetRect().GetBottom());;
	right = MAX(right, m_SelBgColor->GetRect().GetRight());;

	SetClientSize(wxSize(right+10, bottom+10));
}


/***************************************************************/
void WinEDA_SetColorsFrame::SetColor(wxCommandEvent& event)
/***************************************************************/
{
int id = event.GetId();
int color = DisplayColorFrame(this);
int w = BUTT_SIZE_X, h = BUTT_SIZE_Y;

	if ( color < 0) return;

	for ( int ii = 0; laytool_list[ii] != NULL; ii++ )
	{
		if( laytool_list[ii]->m_Id != id) continue;

		if( *laytool_list[ii]->m_Color == color) break;

		*laytool_list[ii]->m_Color = color;
		wxMemoryDC iconDC;

		wxBitmapButton * Button = laytool_list[ii]->m_Button;

		wxBitmap ButtBitmap = Button->GetBitmapLabel();
		iconDC.SelectObject( ButtBitmap );
		int buttcolor = *laytool_list[ii]->m_Color;
		wxBrush Brush;
		iconDC.SelectObject( ButtBitmap );
		iconDC.SetPen(*wxBLACK_PEN);
		Brush.SetColour(
						ColorRefs[buttcolor].m_Red,
						ColorRefs[buttcolor].m_Green,
						ColorRefs[buttcolor].m_Blue
						);
		Brush.SetStyle(wxSOLID);

		iconDC.SetBrush(Brush);
		iconDC.DrawRectangle(0,0, w, h);
		if ( m_Parent->GetScreen() )
			m_Parent->GetScreen()->SetRefreshReq();
	}
	Refresh(FALSE);
}


/***************************************************************/
void WinEDA_SetColorsFrame::BgColorChoice(wxCommandEvent& event)
/***************************************************************/
{
int color;

	if ( m_SelBgColor->GetSelection() == 0 ) color = WHITE;
	else  color = BLACK;

	if ( color != g_DrawBgColor )
		{
		g_DrawBgColor = color;
		m_Parent->SetDrawBgColor(g_DrawBgColor);
		m_Parent->ReDrawPanel();
		}


}



/*************************/
void SeedLayers(void)
/*************************/
{
LayerStruct * LayerPointer = &g_LayerDescr;
int pt;

	LayerPointer->CommonColor = WHITE;
	LayerPointer->Flags = 0;
	pt=0;
	LayerPointer->CurrentWidth = 1;

	/* seed Up the Layer colours, set all user layers off */
	for( pt = 0; pt < MAX_LAYERS; pt++ )
		{
		LayerPointer->LayerStatus[pt]= 0;
		LayerPointer->LayerColor[pt] = DARKGRAY;
		}
	 
	LayerPointer->NumberOfLayers = pt - 1;
	/* Couleurs specifiques: Mise a jour par la lecture de la config*/
}


/*******************************/
int ReturnLayerColor(int Layer)
/*******************************/
{
	if(g_LayerDescr.Flags==0)
		return(g_LayerDescr.LayerColor[Layer]);
	else
		return(g_LayerDescr.CommonColor);
}


