	/*************************/
	/* Edition des Pastilles */
	/*************************/

#include "fctsys.h"
#include "gr_basic.h"
#include "common.h"
#include "pcbnew.h"
#include "autorout.h"
#include "trigo.h"

#include "drag.h"

#include "protos.h"

/* Variables Locales */
static bool Pad_Shape_Filter = TRUE;
static bool Pad_Layer_Filter = TRUE;
static bool Pad_Orient_Filter = TRUE;
static bool Pad_Size_Change = TRUE;
static bool Pad_Shape_Change = FALSE;
static bool Pad_Orient_Change = FALSE;
static bool Pad_Drill_Change = TRUE;

enum id_pad_global_edit
{
	ID_CHANGE_CURRENT_MODULE = 1900,
	ID_CHANGE_ID_MODULES,
	ID_CHANGE_GET_PAD_SETTINGS
};


	/************************************/
	/* class WinEDA_PadGlobalEditFrame */
	/************************************/

class WinEDA_PadGlobalEditFrame: public wxDialog
{
private:

	WinEDA_BasePcbFrame * m_Parent;
	wxDC * m_DC;
	D_PAD * CurrentPad;
	wxCheckBox * m_Pad_Shape_Filter;
	wxCheckBox * m_Pad_Layer_Filter;
	wxCheckBox * m_Pad_Orient_Filter;
	wxCheckBox * m_Pad_Size_Change;
	wxCheckBox * m_Pad_Shape_Change;
	wxCheckBox * m_Pad_Drill_Change;
	wxCheckBox * m_Pad_Orient_Change;

public:
	// Constructor and destructor
	WinEDA_PadGlobalEditFrame(WinEDA_BasePcbFrame *parent,
							D_PAD * Pad, wxDC * DC, const wxPoint & pos);
	~WinEDA_PadGlobalEditFrame() { }

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

	DECLARE_EVENT_TABLE()
};

BEGIN_EVENT_TABLE(WinEDA_PadGlobalEditFrame, wxDialog)
	EVT_BUTTON(ID_CHANGE_CURRENT_MODULE, WinEDA_PadGlobalEditFrame::PadPropertiesAccept)
	EVT_BUTTON(ID_CHANGE_ID_MODULES, WinEDA_PadGlobalEditFrame::PadPropertiesAccept)
	EVT_BUTTON(ID_CHANGE_GET_PAD_SETTINGS, WinEDA_PadGlobalEditFrame::PadPropertiesAccept)
	EVT_BUTTON(wxID_CANCEL, WinEDA_PadGlobalEditFrame::OnCancelClick)
END_EVENT_TABLE()


/********************************************************************************/
WinEDA_PadGlobalEditFrame::WinEDA_PadGlobalEditFrame(WinEDA_BasePcbFrame *parent,
				D_PAD * Pad,wxDC * DC, const wxPoint & framepos):
		wxDialog(parent, -1, _("Pads Global Edit"), framepos, wxSize(310, 235),
				DIALOG_STYLE)
/********************************************************************************/
{
wxPoint pos;
wxButton * Button;

	m_Parent = parent;
	SetFont(*g_DialogFont);
	m_DC = DC;
	Centre();

	CurrentPad = Pad;

	/* Creation des boutons de commande */
	pos.x = 150;
	pos.y = 10;
	Button = new wxButton(this, ID_CHANGE_GET_PAD_SETTINGS,
						_("Pad Settings..."), pos);
	Button->SetForegroundColour( wxColor(0, 80, 0) );

	pos.y += Button->GetDefaultSize().y + 50;
	Button = new wxButton(this, ID_CHANGE_CURRENT_MODULE,
						_("Change Module"), pos);
	Button->SetForegroundColour( *wxRED );

	pos.y += Button->GetDefaultSize().y + 10;
	Button = new wxButton(this, ID_CHANGE_ID_MODULES,
						_("Change Id Modules"), pos);
	Button->SetForegroundColour( *wxRED );

	pos.y += Button->GetDefaultSize().y + 10;
	Button = new wxButton(this, wxID_CANCEL, _("Cancel"), pos);
	Button->SetForegroundColour( *wxBLUE );

	// Selection des filtres de selection des pads :
	pos.x = 5;
	pos.y = 5;
	new wxStaticBox(this, -1, _("Pad Filter :"), pos, wxSize(130, 75) );

	pos.x += 5;
	pos.y += 18;
	m_Pad_Shape_Filter = new wxCheckBox(this, -1, _("Shape Filter"), pos);
	m_Pad_Shape_Filter->SetValue(Pad_Shape_Filter);

	pos.y += 18;
	m_Pad_Layer_Filter = new wxCheckBox(this, -1, _("Layer Filter"), pos);
	m_Pad_Layer_Filter->SetValue(Pad_Layer_Filter);

	pos.y += 18;
	m_Pad_Orient_Filter = new wxCheckBox(this, -1, _("Orient Filter"), pos);
	m_Pad_Orient_Filter->SetValue(Pad_Orient_Filter);

	// Items a editer
	pos.x -= 5;
	pos.y += 25;
	new wxStaticBox(this, -1, _("Change Items :"), pos, wxSize(130, 95) );

	pos.x += 5;
	pos.y += 18;
	m_Pad_Size_Change = new wxCheckBox(this, -1, _("Change Size"), pos);
	m_Pad_Size_Change->SetValue(Pad_Size_Change);

	pos.y += 18;
	m_Pad_Shape_Change = new wxCheckBox(this, -1, _("Change Shape"), pos);
	m_Pad_Shape_Change->SetValue(Pad_Shape_Change);

	pos.y += 18;
	m_Pad_Drill_Change = new wxCheckBox(this, -1, _("Change Drill"), pos);
	m_Pad_Drill_Change->SetValue(Pad_Drill_Change);

	pos.y += 18;
	m_Pad_Orient_Change = new wxCheckBox(this, -1, _("Change Orient"), pos);
	m_Pad_Orient_Change->SetValue(Pad_Orient_Change);
}


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


/*************************************************************************/
void WinEDA_PadGlobalEditFrame::PadPropertiesAccept(wxCommandEvent& event)
/*************************************************************************/
/* Met a jour les differents parametres pour le composant en cours d'édition
 */
{
int returncode = 0;

	switch( event.GetId() )
	{
	case ID_CHANGE_GET_PAD_SETTINGS:
		m_Parent->InstallPadOptionsFrame( NULL, NULL, wxPoint(-1, -1) );
		break;

	case ID_CHANGE_ID_MODULES:
		returncode = 1;
		// Fall through

	case ID_CHANGE_CURRENT_MODULE:
		Pad_Shape_Filter = m_Pad_Shape_Filter->GetValue();
		Pad_Layer_Filter = m_Pad_Layer_Filter->GetValue();
		Pad_Orient_Filter = m_Pad_Orient_Filter->GetValue();
		Pad_Size_Change = m_Pad_Size_Change->GetValue();
		Pad_Shape_Change = m_Pad_Shape_Change->GetValue();
		Pad_Drill_Change = m_Pad_Drill_Change->GetValue();
		Pad_Orient_Change = m_Pad_Orient_Change->GetValue();
		EndModal( returncode );
		break;
	}
}


/***************************************************************************/
void WinEDA_BasePcbFrame::Global_Import_Pad_Settings( D_PAD * Pad, wxDC * DC)
/***************************************************************************/
/*
 * Routine de selection et de correction des dimensions des pastilles
 * de tous les modules
 * - semblables a l'module de reference selectionnee,
 *       c.a.d de meme nom de librairie
 * - ou sur l'module localisee, selon le menu d'appel
 */
{
D_PAD* pt_pad ;
MODULE * Module_Ref , * Module;
int diag;
bool Edit_Same_Modules = FALSE;

	if( Pad == NULL )
		return;

	Module = (MODULE *) Pad->m_Parent;

	if( Module == NULL )
	{
		DisplayError(this, wxT("Global_Import_Pad_Settings() Error: NULL module"));
		return;
	}

wxString ref_name_module = Module->m_LibRef;

	Module->Display_Infos(this);

WinEDA_PadGlobalEditFrame * frame = new WinEDA_PadGlobalEditFrame(this, Pad,DC,
				wxPoint(-1,-1));
	diag = frame->ShowModal();
	frame->Destroy();

	if( diag == -1 )
		return;
	if( diag == 1 )
		Edit_Same_Modules = TRUE;

	/* Recherche et copie du nom librairie de reference: */
	Module_Ref = Module;

	/* Mise a jour des modules ou du module */

	Module = (MODULE*) m_Pcb->m_Modules;
	for( ; Module != NULL; Module = (MODULE*) Module->Pnext )
	{
		if( ! Edit_Same_Modules )
			if( Module != Module_Ref )
				continue;

		if( ref_name_module != Module->m_LibRef )
			continue ;

		Module->Display_Infos(this);

		/* Effacement du module */
		Module->Draw(DrawPanel, DC, wxPoint(0, 0), GR_XOR);

		pt_pad = (D_PAD*) Module->m_Pads;
		for( ; pt_pad != NULL; pt_pad = (D_PAD*) pt_pad->Pnext )
		{
			/* Filtrage des modifications interdites */
			if( Pad_Shape_Filter )
			{
				if( pt_pad->m_PadShape != g_Pad_Master.m_PadShape )
					continue;
			}

			if( Pad_Orient_Filter )
			{
				if( (pt_pad->m_Orient - Module->m_Orient) != g_Pad_Master.m_Orient )
					continue;
			}

			if( Pad_Layer_Filter )
			{
				if( pt_pad->m_Masque_Layer != g_Pad_Master.m_Masque_Layer )
					continue;
				else
					m_Pcb->m_Status_Pcb &= ~( LISTE_CHEVELU_OK | CONNEXION_OK);
			}

			/* Modif des caracteristiques: */
			if( Pad_Shape_Change )
			{
				pt_pad->m_Attribut = g_Pad_Master.m_Attribut;
				pt_pad->m_PadShape = g_Pad_Master.m_PadShape;
			}

			pt_pad->m_Masque_Layer = g_Pad_Master.m_Masque_Layer;

			if( Pad_Size_Change )
			{
				pt_pad->m_Size = g_Pad_Master.m_Size;
				pt_pad->m_DeltaSize = g_Pad_Master.m_DeltaSize;
				pt_pad->m_Offset = g_Pad_Master.m_Offset;
			}

			if( Pad_Drill_Change )
			{
				pt_pad->m_Drill = g_Pad_Master.m_Drill;
				pt_pad->m_DrillShape = g_Pad_Master.m_DrillShape;
			}

			if( Pad_Orient_Change )
			{
				pt_pad->m_Orient = g_Pad_Master.m_Orient + Module->m_Orient;
			}

			/* Traitement des cas particuliers : */
			if( g_Pad_Master.m_PadShape != PAD_TRAPEZOID )
			{
				pt_pad->m_DeltaSize.x = 0;
				pt_pad->m_DeltaSize.y = 0;
			}
			if( g_Pad_Master.m_PadShape == PAD_CIRCLE )
				pt_pad->m_Size.y = pt_pad->m_Size.x;

			switch( g_Pad_Master.m_Attribut & 0x7F )
			{
			case PAD_SMD:
			case PAD_CONN:
				pt_pad->m_Drill = wxSize(0, 0);
				pt_pad->m_Offset.x = 0;
				pt_pad->m_Offset.y = 0;
				break;

			default:
				break;
			}
			pt_pad->ComputeRayon();
		}
		Module->Set_Rectangle_Encadrement();
		Module->Draw(DrawPanel, DC, wxPoint(0, 0), GR_OR);
	}
	GetScreen()->SetModify();
}
