	/********************************************/
	/* GERBVIEW - Gestion des Options et Reglages */
	/********************************************/

	/*	 File options.cpp 	*/

/*
 * Set the display options for Gerbview
 */


#include "fctsys.h"

#include "common.h"
#include "gerbview.h"
#include "pcbplot.h"

#include "id.h"

#include "protos.h"
#include <wx/spinctrl.h>


/*****************************************************************/
void WinEDA_GerberFrame::OnSelectOptionToolbar(wxCommandEvent& event)
/*****************************************************************/
/** Function OnSelectOptionToolbar
 *  called to validate current choices
 */
{
int id = event.GetId();

	switch ( id )
	{
		case ID_TB_OPTIONS_SHOW_GRID:
			m_Draw_Grid = g_ShowGrid = m_OptionsToolBar->GetToolState(id);
			DrawPanel->Refresh(TRUE);
			break;

		case ID_TB_OPTIONS_SELECT_UNIT_MM:
			g_UnitMetric = MILLIMETRE;
			Affiche_Status_Box();
			break;

		case ID_TB_OPTIONS_SELECT_UNIT_INCH:
			g_UnitMetric = INCHES;
			Affiche_Status_Box();
			break;

		case ID_TB_OPTIONS_SHOW_POLAR_COORD:
			Affiche_Message(wxEmptyString);
			DisplayOpt.DisplayPolarCood = m_OptionsToolBar->GetToolState(id);
			Affiche_Status_Box();
			break;

		case ID_TB_OPTIONS_SELECT_CURSOR:
			g_CursorShape = m_OptionsToolBar->GetToolState(id);
			DrawPanel->Refresh(TRUE);
			break;

		case ID_TB_OPTIONS_SHOW_PADS_SKETCH:
			if ( m_OptionsToolBar->GetToolState(id) )
			{
				m_DisplayPadFill = FALSE;
				DisplayOpt.DisplayPadFill = FALSE;
			}
			else
			{
				m_DisplayPadFill = TRUE;
				DisplayOpt.DisplayPadFill = TRUE;
			}
			DrawPanel->Refresh(TRUE);
			break;

		case ID_TB_OPTIONS_SHOW_TRACKS_SKETCH:
			if( m_OptionsToolBar->GetToolState(id) )
			{
				m_DisplayPcbTrackFill = FALSE;
				DisplayOpt.DisplayPcbTrackFill = FALSE;
			}
			else
			{
				m_DisplayPcbTrackFill = TRUE;
				DisplayOpt.DisplayPcbTrackFill = TRUE;
			}
			DrawPanel->Refresh(TRUE);
			break;

		case ID_TB_OPTIONS_SHOW_POLYGONS_SKETCH:
			if ( m_OptionsToolBar->GetToolState(id) )	// Polygons filled asked
				 g_DisplayPolygonsModeSketch = 1;
			else g_DisplayPolygonsModeSketch = 0;
			DrawPanel->Refresh(TRUE);
			break;

		case ID_TB_OPTIONS_SHOW_DCODES:
			DisplayOpt.DisplayPadNum = m_OptionsToolBar->GetToolState(id);
			DrawPanel->Refresh(TRUE);
			break;

		default:
			DisplayError(this, wxT("WinEDA_PcbFrame::OnSelectOptionToolbar error"));
			break;
	}

	SetToolbars();
}


/******************************************************/
class WinEDA_GerberGeneralOptionsFrame: public wxDialog
/******************************************************/
{
private:

	WinEDA_BasePcbFrame * m_Parent;
	wxRadioBox * m_PolarDisplay;
	wxRadioBox * m_BoxUnits;
	wxRadioBox * m_CursorShape;
	wxRadioBox * m_GerberDefaultScale;

	// Constructor and destructor
public:
	WinEDA_GerberGeneralOptionsFrame(WinEDA_BasePcbFrame *parent,const wxPoint& pos);
	~WinEDA_GerberGeneralOptionsFrame() {};

private:
	void OnOkClick(wxCommandEvent& event);
	void OnCancelClick(wxCommandEvent & event);

	DECLARE_EVENT_TABLE()

};
/* Events table for WinEDA_GerberGeneralOptionsFrame */
BEGIN_EVENT_TABLE(WinEDA_GerberGeneralOptionsFrame, wxDialog)
	EVT_BUTTON(wxID_OK, WinEDA_GerberGeneralOptionsFrame::OnOkClick)
	EVT_BUTTON(wxID_CANCEL, WinEDA_GerberGeneralOptionsFrame::OnCancelClick)
END_EVENT_TABLE()




/**********************************************************************************************/
WinEDA_GerberGeneralOptionsFrame::WinEDA_GerberGeneralOptionsFrame(WinEDA_BasePcbFrame *parent,
		const wxPoint& framepos):
		wxDialog(parent, -1, _("Gerbview Options"),
				 framepos, wxSize(300, 240),
				wxDEFAULT_DIALOG_STYLE|wxFRAME_FLOAT_ON_PARENT )
/**********************************************************************************************/
/** WinEDA_GerberGeneralOptionsFrame Constructor
*/
{
	m_Parent = parent;
	SetFont(*g_DialogFont);

	wxBoxSizer * MainBoxSizer = new wxBoxSizer(wxHORIZONTAL);
	SetSizer(MainBoxSizer);
	wxBoxSizer * RightBoxSizer = new wxBoxSizer(wxVERTICAL);
	wxBoxSizer * MiddleBoxSizer = new wxBoxSizer(wxVERTICAL);
	wxBoxSizer * LeftBoxSizer = new wxBoxSizer(wxVERTICAL);
	MainBoxSizer->Add(LeftBoxSizer, 0, wxGROW|wxALL, 5);
	MainBoxSizer->Add(MiddleBoxSizer, 0, wxGROW|wxALL, 5);
	MainBoxSizer->Add(RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);

	wxButton * Button = new wxButton(this, wxID_OK, _("OK"));
	Button->SetForegroundColour(*wxRED);
	RightBoxSizer->Add(Button, 0, wxGROW|wxALL, 5);

	Button = new wxButton(this, wxID_CANCEL, _("Cancel"));
	Button->SetForegroundColour(*wxBLUE);
	RightBoxSizer->Add(Button, 0, wxGROW|wxALL, 5);

	/* Display / not display polar coordinates: */
wxString list_coord[2] =
	{ _("No Display"),
	_("Display") };
	m_PolarDisplay = new wxRadioBox(this, -1, _("Display Polar Coord"),
					wxDefaultPosition, wxDefaultSize,
					2, list_coord, 1);
	m_PolarDisplay->SetSelection(DisplayOpt.DisplayPolarCood ? 1 : 0);
	LeftBoxSizer->Add(m_PolarDisplay, 0, wxGROW|wxALL, 5);

	/* Selection of units */
wxString list_units[2] = {
	_("Inches"),
	_("millimeters") };
	m_BoxUnits = new wxRadioBox(this, -1, _("Units"), wxDefaultPosition, wxDefaultSize,
					2, list_units, 1);
	m_BoxUnits->SetSelection( g_UnitMetric ? 1 : 0);
	LeftBoxSizer->Add(m_BoxUnits, 0, wxGROW|wxALL, 5);

	/* Selection of cursor shape */
wxString list_cursors[2] = { _("Small"), _("Big") };
	m_CursorShape = new wxRadioBox(this, -1, _("Cursor"), wxDefaultPosition, wxDefaultSize,
					2, list_cursors, 1);
	m_CursorShape->SetSelection( g_CursorShape ? 1 : 0);
	MiddleBoxSizer->Add(m_CursorShape, 0, wxGROW|wxALL, 5);

	/* Selection Default Scale (i.e. format 2.3 ou 3.4) */
wxString list_scales[2] = { _("format: 2.3"), _("format 3.4") };
	m_GerberDefaultScale = new wxRadioBox(this, -1, _("Default format"),
						wxDefaultPosition, wxDefaultSize,
					2, list_scales, 1);
	m_GerberDefaultScale->SetSelection( (g_Default_GERBER_Format == 23) ? 0 : 1);
	MiddleBoxSizer->Add(m_GerberDefaultScale, 0, wxGROW|wxALL, 5);

	GetSizer()->Fit(this);
    GetSizer()->SetSizeHints(this);
}


/************************************************************************/
void  WinEDA_GerberGeneralOptionsFrame::OnCancelClick(wxCommandEvent& WXUNUSED(event))
/************************************************************************/
{
    EndModal( -1 );
}



/*****************************************************************************/
void WinEDA_GerberGeneralOptionsFrame::OnOkClick(wxCommandEvent& event)
/*****************************************************************************/
{
	DisplayOpt.DisplayPolarCood =
		(m_PolarDisplay->GetSelection() == 0) ? FALSE : TRUE;
	g_UnitMetric = (m_BoxUnits->GetSelection() == 0) ? 0 : 1;
	g_CursorShape = m_CursorShape->GetSelection();
	g_Default_GERBER_Format =
		(m_GerberDefaultScale->GetSelection() == 0) ? 23 : 34;

	EndModal( 1 );
}



/*******************************************/
/* Dialog frame to select deisplay options */
/*******************************************/
class WinEDA_LookFrame: public wxDialog
{
private:
	WinEDA_BasePcbFrame * m_Parent;
	wxRadioBox * m_OptDisplayLines;
	wxRadioBox * m_OptDisplayFlashes;
	wxRadioBox * m_OptDisplayPolygons;
	wxCheckBox * m_OptDisplayDCodes;
	wxRadioBox * m_OptDisplayDrawings;

public:
	// Constructor and destructor
	WinEDA_LookFrame(WinEDA_BasePcbFrame *parent,const wxPoint& pos);
	~WinEDA_LookFrame() {};

private:
	void OnOkClick(wxCommandEvent& event);
	void OnCancelClick(wxCommandEvent & event);

	DECLARE_EVENT_TABLE()

};
/* Construction de la table des evenements pour WinEDA_LookFrame */
BEGIN_EVENT_TABLE(WinEDA_LookFrame, wxDialog)
	EVT_BUTTON(wxID_OK, WinEDA_LookFrame::OnOkClick)
	EVT_BUTTON(wxID_CANCEL, WinEDA_LookFrame::OnCancelClick)
END_EVENT_TABLE()



/*******************************************************************************/
WinEDA_LookFrame::WinEDA_LookFrame(WinEDA_BasePcbFrame *parent,
		const wxPoint& framepos):
		wxDialog(parent, -1, _("Gerbview Draw Options"), framepos, wxSize(350, 200),
		wxDEFAULT_DIALOG_STYLE|wxFRAME_FLOAT_ON_PARENT )
/*******************************************************************************/
{
	m_Parent = parent;
	SetFont(*g_DialogFont);

	wxBoxSizer * MainBoxSizer = new wxBoxSizer(wxHORIZONTAL);
	SetSizer(MainBoxSizer);
	wxBoxSizer * RightBoxSizer = new wxBoxSizer(wxVERTICAL);
	wxBoxSizer * MiddleBoxSizer = new wxBoxSizer(wxVERTICAL);
	wxBoxSizer * LeftBoxSizer = new wxBoxSizer(wxVERTICAL);
	MainBoxSizer->Add(LeftBoxSizer, 0, wxGROW|wxALL, 5);
	MainBoxSizer->Add(MiddleBoxSizer, 0, wxGROW|wxALL, 5);
	MainBoxSizer->Add(RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);

	wxButton * Button = new wxButton(this, wxID_OK, _("OK"));
	Button->SetForegroundColour(*wxRED);
	RightBoxSizer->Add(Button, 0, wxGROW|wxALL, 5);

	Button = new wxButton(this, wxID_CANCEL, _("Cancel"));
	Button->SetForegroundColour(*wxBLUE);
	RightBoxSizer->Add(Button, 0, wxGROW|wxALL, 5);

	// Show Option Draw Tracks
wxString list_opt2[2] = { _("Sketch"), _("Filled") };
	m_OptDisplayLines = new wxRadioBox(this, -1, _("Lines:"),
				wxDefaultPosition, wxDefaultSize,
				2, list_opt2, 1);
	if ( DisplayOpt.DisplayPcbTrackFill )
		m_OptDisplayLines->SetSelection(1);
	LeftBoxSizer->Add(m_OptDisplayLines, 0, wxGROW|wxALL, 5);

	m_OptDisplayFlashes = new wxRadioBox(this, -1, _("Spots:"),
				wxDefaultPosition, wxDefaultSize,
				2, list_opt2, 1);
	if ( DisplayOpt.DisplayPadFill )
		m_OptDisplayFlashes->SetSelection(1);
	LeftBoxSizer->Add(m_OptDisplayFlashes, 0, wxGROW|wxALL, 5);

		// Show Option Draw polygons
	m_OptDisplayPolygons = new wxRadioBox(this, -1, _("Polygons:"),
				wxDefaultPosition, wxDefaultSize,
				2, list_opt2, 1);
	if ( g_DisplayPolygonsModeSketch == 0)
		m_OptDisplayPolygons->SetSelection(1);
	LeftBoxSizer->Add(m_OptDisplayPolygons, 0, wxGROW|wxALL, 5);

wxString list_opt3[3] = { _("Sketch"), _("Filled"), _("Line") };
	m_OptDisplayDrawings = new wxRadioBox(this, -1, _("Display other items:"),
				wxDefaultPosition, wxDefaultSize,
				3, list_opt3, 1);
	m_OptDisplayDrawings->SetSelection(DisplayOpt.DisplayDrawItems);
	MiddleBoxSizer->Add(m_OptDisplayDrawings, 0, wxGROW|wxALL, 5);

	m_OptDisplayDCodes = new wxCheckBox(this, -1, _("Show D codes"));
	if ( DisplayOpt.DisplayPadNum )
		m_OptDisplayDCodes->SetValue(TRUE);
	MiddleBoxSizer->Add(m_OptDisplayDCodes, 0, wxGROW|wxALL, 5);
 
	GetSizer()->Fit(this);
    GetSizer()->SetSizeHints(this);
}


/**************************************************************/
void  WinEDA_LookFrame::OnCancelClick(wxCommandEvent& WXUNUSED(event))
/**************************************************************/
{
    EndModal( -1 );
}


/*************************************************************/
void WinEDA_LookFrame::OnOkClick(wxCommandEvent& event)
/*************************************************************/
/* Met a jour les options
 */
{
	if ( m_OptDisplayLines->GetSelection() == 1 )
		DisplayOpt.DisplayPcbTrackFill = TRUE;
	else
		DisplayOpt.DisplayPcbTrackFill = FALSE;

	if ( m_OptDisplayFlashes->GetSelection() == 1 )
		 DisplayOpt.DisplayPadFill = TRUE;
	else
		DisplayOpt.DisplayPadFill = FALSE;

	if ( m_OptDisplayPolygons->GetSelection() == 0 )
		 g_DisplayPolygonsModeSketch = 1;
	else
		g_DisplayPolygonsModeSketch = 0;

	DisplayOpt.DisplayPadNum = m_OptDisplayDCodes->GetValue();

	DisplayOpt.DisplayDrawItems = m_OptDisplayDrawings->GetSelection();

	m_Parent->m_DisplayPadFill = DisplayOpt.DisplayPadFill;
	m_Parent->m_DisplayPcbTrackFill = DisplayOpt.DisplayPcbTrackFill;

	m_Parent->GetScreen()->SetRefreshReq();

	EndModal( 1 );
}





/***************************************************************************/
void WinEDA_GerberFrame::InstallPcbOptionsFrame(const wxPoint & pos, int id)
/***************************************************************************/
{
	switch ( id )
	{
		case ID_PCB_LOOK_SETUP:
		{
			WinEDA_LookFrame * OptionsFrame =
				new WinEDA_LookFrame(this, pos);
			OptionsFrame->ShowModal();
			OptionsFrame->Destroy();
		}
			break;

		case ID_OPTIONS_SETUP:
		{
			WinEDA_GerberGeneralOptionsFrame * OptionsFrame =
				new WinEDA_GerberGeneralOptionsFrame(this, pos);
			OptionsFrame->ShowModal();
			OptionsFrame->Destroy();
		}
			break;
	}
}
