	/************************************************/
	/* Module editor: Dialog box for editing module	*/
	/*  properties and carateristics				*/
	/* include in modedit.cpp						*/
	/************************************************/

#include "dialog_edit_module.h"

	/**************************************/
	/* class WinEDA_ModulePropertiesFrame */
	/**************************************/

BEGIN_EVENT_TABLE(WinEDA_ModulePropertiesFrame, wxDialog)
	EVT_BUTTON(ID_ACCEPT_MODULE_PROPERTIES,
			WinEDA_ModulePropertiesFrame::ModulePropertiesAccept)
	EVT_BUTTON(ID_CLOSE_MODULE_PROPERTIES, WinEDA_ModulePropertiesFrame::OnQuit)
	EVT_BUTTON(ID_MODULE_EDIT_ADD_TEXT, WinEDA_ModulePropertiesFrame::CreateTextModule)
	EVT_BUTTON(ID_MODULE_EDIT_EDIT_TEXT, WinEDA_ModulePropertiesFrame::EditOrDelTextModule)
	EVT_BUTTON(ID_MODULE_EDIT_DELETE_TEXT, WinEDA_ModulePropertiesFrame::EditOrDelTextModule)
	EVT_BUTTON(ID_MODULE_PROPERTIES_EXCHANGE, WinEDA_ModulePropertiesFrame::ExchangeModule)
	EVT_KICAD_CHOICEBOX(ID_MODULE_LISTBOX_SELECT, WinEDA_ModulePropertiesFrame::SelectTextListBox)
	EVT_RADIOBOX(ID_LISTBOX_ORIENT_SELECT, WinEDA_ModulePropertiesFrame::ModuleOrientEvent)
	EVT_BUTTON(ID_GOTO_MODULE_EDITOR, WinEDA_ModulePropertiesFrame::GotoModuleEditor)

END_EVENT_TABLE()

/**********************/
/* class Panel3D_Ctrl */
/**********************/
BEGIN_EVENT_TABLE(Panel3D_Ctrl, wxPanel)
	EVT_BUTTON(ID_BROWSE_3D_LIB, Panel3D_Ctrl::Browse3DLib)
	EVT_BUTTON(ID_ADD_3D_SHAPE, Panel3D_Ctrl::AddOrRemove3DShape)
	EVT_BUTTON(ID_REMOVE_3D_SHAPE, Panel3D_Ctrl::AddOrRemove3DShape)
END_EVENT_TABLE()


#define H_SIZE 430
#define V_SIZE 530
/**************************************************************************************/
WinEDA_ModulePropertiesFrame::WinEDA_ModulePropertiesFrame(WinEDA_BasePcbFrame *parent,
				MODULE * Module,wxDC * DC,
				const wxPoint & framepos):
		wxDialog(parent, -1, _("Module properties"), framepos,
					wxSize(H_SIZE, V_SIZE), DIALOG_STYLE)
/**************************************************************************************/
{
wxString number;
bool FullOptions = FALSE;

	SetIcon( wxICON(icon_modedit) );		// Give an icon

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

	if ( m_Parent->m_Ident == PCB_FRAME ) FullOptions = TRUE;

	m_LayerCtrl = NULL;
	m_OrientCtrl = NULL;
	m_OrientValue = NULL;
	m_Doc = m_Keyword = NULL;

	m_CurrentModule = Module;
	m_DeleteFieddButton = NULL;

	if ( m_CurrentModule )
		{
		}

	CreateControls();
	CreatePanelProperties(FullOptions);

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

/*****************************************************/
void WinEDA_ModulePropertiesFrame::CreateControls(void)
/*****************************************************/
{    
wxPoint pos;
wxButton * Button;
wxSize usize;
	usize = GetClientSize();

    m_GeneralBoxSizer = new wxBoxSizer(wxVERTICAL);
    SetSizer(m_GeneralBoxSizer);

	m_NoteBook = new wxNotebook(this, ID_NOTEBOOK,
   		wxDefaultPosition,wxSize(usize.x,usize.y - 34) );
	m_NoteBook->SetFont(*g_DialogFont);

    m_GeneralBoxSizer->Add(m_NoteBook, 0, wxGROW|wxALL, 5);

	// Add panels
	m_PanelProperties = new wxPanel(m_NoteBook, -1);
	m_PanelProperties->SetFont(*g_DialogFont);
    m_PanelPropertiesBoxSizer = new wxBoxSizer(wxHORIZONTAL);
    m_PanelProperties->SetSizer(m_PanelPropertiesBoxSizer);
	m_NoteBook->AddPage(m_PanelProperties, _("Properties"), TRUE);

	m_Panel3D = new Panel3D_Ctrl(this, m_NoteBook, -1,
				m_CurrentModule->m_3D_Drawings);
	m_NoteBook->AddPage(m_Panel3D, _("3D settings"), FALSE);

	/* creation des autres formes 3D */
	Panel3D_Ctrl * panel3D = m_Panel3D, * nextpanel3D;
	Struct3D_Master *draw3D = m_CurrentModule->m_3D_Drawings;
	draw3D = (Struct3D_Master *) draw3D->Pnext;
	for ( ; draw3D != NULL; draw3D = (Struct3D_Master *) draw3D->Pnext)
	{
		nextpanel3D = new Panel3D_Ctrl(this, m_NoteBook, -1, draw3D);
		m_NoteBook->AddPage(nextpanel3D, _("3D settings"), FALSE);
		panel3D->m_Pnext = nextpanel3D;
		nextpanel3D->m_Pback = panel3D;
		panel3D = nextpanel3D;
	}


	/* Creation des boutons de commande */
    wxBoxSizer* ButtonsBoxSizer = new wxBoxSizer(wxHORIZONTAL);
    m_GeneralBoxSizer->Add(ButtonsBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);

	Button = new wxButton(this, ID_ACCEPT_MODULE_PROPERTIES,
						_("Ok"));
	Button->SetForegroundColour(*wxRED);
    ButtonsBoxSizer->Add(Button, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);

	Button = new wxButton(this, ID_CLOSE_MODULE_PROPERTIES,
						_("Cancel"));
	Button->SetForegroundColour(*wxBLUE);
    ButtonsBoxSizer->Add(Button, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
}

/***********************************************************/
void Panel3D_Ctrl::AddOrRemove3DShape(wxCommandEvent& event)
/***********************************************************/
{
	if( event.GetId() == ID_ADD_3D_SHAPE)
	{
	Panel3D_Ctrl * panel3D = new Panel3D_Ctrl(m_ParentFrame, m_Parent,
						-1, NULL);
	m_Parent->InsertPage(m_Parent->GetSelection()+1,
						panel3D, _("3D settings"), TRUE);
	panel3D->m_Pback = this;
	panel3D->m_Pnext = m_Pnext;
	if ( m_Pnext ) m_Pnext->m_Pback = panel3D;
	m_Pnext = panel3D;
	}

	if( event.GetId() == ID_REMOVE_3D_SHAPE)
	{
		if ( m_Pback )
		{
			m_Pback->m_Pnext = m_Pnext;
			if ( m_Pnext ) m_Pnext->m_Pback = m_Pback;
			m_Parent->DeletePage(m_Parent->GetSelection());
			m_ParentFrame->Refresh(TRUE);
		}
	}
}

/***************************************************************************/
void WinEDA_ModulePropertiesFrame::CreatePanelProperties(bool FullOptions)
/***************************************************************************/
/* creation du panel d'edition des proprietes du module
*/
{
wxButton * Button;
wxStaticText* StaticText;
wxBoxSizer* PropLeftSizer;
wxBoxSizer* PropRightSizer;
wxString msg;
	
	/* Create a sizer for controls in the left column */
    PropLeftSizer = new wxBoxSizer(wxVERTICAL);
    m_PanelPropertiesBoxSizer->Add(PropLeftSizer, 0, wxGROW|wxALL, 5);
	/* Create a sizer for controls in the right column */
    PropRightSizer = new wxBoxSizer(wxVERTICAL);
    m_PanelPropertiesBoxSizer->Add(PropRightSizer, 0, wxGROW|wxALL, 5);

	if ( FullOptions )	// Edition du module su le C.I.
	{
		Button = new wxButton(m_PanelProperties, ID_MODULE_PROPERTIES_EXCHANGE,
						_("Change module(s)"));
		Button->SetForegroundColour(wxColor(80,40,0));
		PropRightSizer->Add(Button, 0, wxGROW|wxALL, 5);
		Button = new wxButton(m_PanelProperties, ID_GOTO_MODULE_EDITOR,
						_("Goto Module Editor"));
		Button->SetForegroundColour(wxColor(0,128,80) );
		PropRightSizer->Add(Button, 0, wxGROW|wxALL, 5);
	}
	else		// Edition du module en librairie
	{
		StaticText = new wxStaticText( m_PanelProperties, wxID_STATIC, _("Doc"), wxDefaultPosition, wxDefaultSize, 0 );
		PropLeftSizer->Add(StaticText, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
		m_Doc = new wxTextCtrl(m_PanelProperties, -1,
						m_CurrentModule->m_Doc);
		PropLeftSizer->Add(m_Doc, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);

		StaticText = new wxStaticText( m_PanelProperties, wxID_STATIC, _("Keywords"), wxDefaultPosition, wxDefaultSize, 0 );
		PropLeftSizer->Add(StaticText, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
		m_Keyword = new wxTextCtrl(m_PanelProperties, -1,
						m_CurrentModule->m_KeyWord );
		PropLeftSizer->Add(m_Keyword, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
	}

	wxStaticBox * box = new wxStaticBox(m_PanelProperties, -1, _("Fields:"));
	m_TextListBox = new WinEDAChoiceBox(m_PanelProperties, ID_MODULE_LISTBOX_SELECT );
	ReCreateFieldListBox();
	m_TextListBox->SetSelection(0);
		
    wxStaticBoxSizer* StaticBoxSizer = new wxStaticBoxSizer(box, wxVERTICAL);
    PropLeftSizer->Add(StaticBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
    StaticBoxSizer->Add(m_TextListBox, 0, wxGROW|wxALL, 5);

	Button = new wxButton(m_PanelProperties, ID_MODULE_EDIT_ADD_TEXT,
						_("Add Field"));
	Button->SetForegroundColour(*wxBLACK);
    StaticBoxSizer->Add(Button, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP, 5);

	Button = new wxButton(m_PanelProperties, ID_MODULE_EDIT_EDIT_TEXT,
						_("Edit Field"));
	Button->SetForegroundColour(*wxBLACK);
    StaticBoxSizer->Add(Button, 0, wxGROW|wxLEFT|wxRIGHT, 5);

	m_DeleteFieddButton = Button = new wxButton(m_PanelProperties, ID_MODULE_EDIT_DELETE_TEXT,
						_("Delete Field"));
	m_DeleteFieddButton->SetForegroundColour(*wxBLACK);
	m_DeleteFieddButton->Enable(FALSE);	// Enable pour fields autres que ref et valeur
    StaticBoxSizer->Add(Button, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);

	if ( FullOptions )
	{
		wxString layer_list[2] = { _("Componant"), _("Copper") };
		m_LayerCtrl = new wxRadioBox( m_PanelProperties, -1, _("Layer"), wxDefaultPosition,
				wxSize(-1,-1), 2, layer_list, 1);
		m_LayerCtrl->SetSelection( (m_CurrentModule->m_Layer == CUIVRE_N) ? 1 : 0);
		PropLeftSizer->Add(m_LayerCtrl, 0, wxGROW|wxALL, 5);

		bool select = FALSE;
		wxString orient_list[5] = {
		            _("Normal"), wxT("+ 90.0"), wxT("- 90.0"), wxT("180.0"), _("User") };
		m_OrientCtrl = new wxRadioBox( m_PanelProperties, ID_LISTBOX_ORIENT_SELECT, _("Orient"),
					wxDefaultPosition, wxSize(-1,-1), 5, orient_list, 1);
		PropLeftSizer->Add(m_OrientCtrl, 0, wxGROW|wxALL, 5);

		switch (m_CurrentModule->m_Orient)
		{
			case 0:
			m_OrientCtrl->SetSelection( 0 );
			break;

			case 900:
			case -2700:
				m_OrientCtrl->SetSelection( 1 );
				break;

			case -900:
			case 2700:
				m_OrientCtrl->SetSelection( 2 );
				break;

			case -1800:
			case 1800:
				m_OrientCtrl->SetSelection( 3 );
				break;

			default:
				m_OrientCtrl->SetSelection( 4 );
				select = TRUE;
				break;
		}

		StaticText = new wxStaticText( m_PanelProperties,
			wxID_STATIC, _("Orient (0.1 deg)"), wxDefaultPosition, wxDefaultSize, 0 );
		PropLeftSizer->Add(StaticText, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
		msg << m_CurrentModule->m_Orient;
		m_OrientValue = new wxTextCtrl(m_PanelProperties, -1, msg);
		m_OrientValue->Enable(select);
		PropLeftSizer->Add(m_OrientValue, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
	}

	/* Controls on right side of the dialog */
wxString attribut_list[3] = { _("Normal"), _("Normal+Insert"), _("Virtual") };
	m_AttributsCtrl = new wxRadioBox( m_PanelProperties, -1, _("Attributs"), wxDefaultPosition,
				wxSize(-1,-1), 3, attribut_list, 1);
	PropRightSizer->Add(m_AttributsCtrl, 0, wxGROW|wxALL, 5);

	switch (m_CurrentModule->m_Attributs & 255)
		{
		case 0:
			m_AttributsCtrl->SetSelection( 0 );
			break;

		case MOD_CMS:
			m_AttributsCtrl->SetSelection( 1 );
			break;

		case MOD_VIRTUAL:
			m_AttributsCtrl->SetSelection( 2 );
			break;

		default:
			m_AttributsCtrl->SetSelection( 0 );
			break;
		}


wxString autoplace_list[2] = { _("Free"), _("Locked")};
	m_AutoPlaceCtrl = new wxRadioBox( m_PanelProperties, -1, _("Auto Place"), wxDefaultPosition,
				wxSize(-1,-1), 2, autoplace_list, 1);
	m_AutoPlaceCtrl->SetSelection(
		(m_CurrentModule->m_ModuleStatus & MODULE_is_LOCKED) ? 1 : 0);
	PropRightSizer->Add(m_AutoPlaceCtrl, 0, wxGROW|wxALL, 5);

	StaticText = new wxStaticText(m_PanelProperties, -1, _("Rot 90"));
	PropRightSizer->Add(StaticText, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
	m_CostRot90Ctrl = new wxSlider(m_PanelProperties, -1,
				m_CurrentModule->m_CntRot90, 0, 10, wxDefaultPosition, wxSize(100, -1),
				wxSL_HORIZONTAL + wxSL_AUTOTICKS + wxSL_LABELS) ;
	PropRightSizer->Add(m_CostRot90Ctrl, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);

	StaticText = new wxStaticText(m_PanelProperties, -1, _("Rot 180"));
	PropRightSizer->Add(StaticText, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
	m_CostRot180Ctrl= new wxSlider(m_PanelProperties, -1,
				m_CurrentModule->m_CntRot180, 0, 10, wxDefaultPosition, wxSize(100, -1),
				wxSL_HORIZONTAL + wxSL_AUTOTICKS + wxSL_LABELS) ;
	PropRightSizer->Add(m_CostRot180Ctrl, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
}

/**************************************************************/
Panel3D_Ctrl::Panel3D_Ctrl(WinEDA_ModulePropertiesFrame * parentframe,
		wxNotebook * parent,
		int id, Struct3D_Master * struct3D):
		wxPanel(parent, id)
/**************************************************************/
/* create the dialog panel managing 3D shape infos
*/
{
wxButton * button;
S3D_Vertex dummy_vertex;
wxBoxSizer* PropLeftSizer;
wxBoxSizer* PropRightSizer;

	m_Pnext = m_Pback = NULL;

	m_Parent = parent;
	m_ParentFrame = parentframe;
	SetFont(*g_DialogFont);
    wxBoxSizer * Panel3DBoxSizer = new wxBoxSizer(wxVERTICAL);
    SetSizer(Panel3DBoxSizer);

    wxStaticText* StaticText = new wxStaticText( this, wxID_STATIC, _("3D Shape Name"),
			wxDefaultPosition, wxDefaultSize, 0 );
    Panel3DBoxSizer->Add(StaticText, 0, wxGROW|wxALL|wxADJUST_MINSIZE, 5);
	m_3D_ShapeName = new wxTextCtrl(this, -1, _T(""), wxDefaultPosition, wxDefaultSize, 0 );
	if ( struct3D ) m_3D_ShapeName->SetValue(struct3D->m_Shape3DName);
    Panel3DBoxSizer->Add(m_3D_ShapeName, 0, wxGROW|wxALL, 5);

    wxBoxSizer * LowerBoxSizer = new wxBoxSizer(wxHORIZONTAL);
    Panel3DBoxSizer->Add(LowerBoxSizer, 0, wxGROW|wxALL, 5);
	/* Create a sizer for controls in the left column */
    PropLeftSizer = new wxBoxSizer(wxVERTICAL);
    LowerBoxSizer->Add(PropLeftSizer, 0, wxGROW|wxALL, 5);
	/* Create a sizer for controls in the right column */
    PropRightSizer = new wxBoxSizer(wxVERTICAL);
    LowerBoxSizer->Add(PropRightSizer, 0, wxGROW|wxALL, 5);

	button = new wxButton(this, ID_BROWSE_3D_LIB, _("Browse"));
	button->SetForegroundColour(*wxBLUE);
    PropRightSizer->Add(button, 0, wxGROW|wxLEFT|wxRIGHT, 5);

	button = new wxButton(this, ID_ADD_3D_SHAPE, _("Add 3D Shape"));
	button->SetForegroundColour(*wxRED);
    PropRightSizer->Add(button, 0, wxGROW|wxLEFT|wxRIGHT, 5);

	if ( (struct3D == NULL) || (struct3D->Pback != NULL) )
	{
		button = new wxButton(this, ID_REMOVE_3D_SHAPE, _("Remove 3D Shape"));
		button->SetForegroundColour(*wxRED);
		PropRightSizer->Add(button, 0, wxGROW|wxLEFT|wxRIGHT, 5);
	}

    wxBoxSizer * BoxSizer = new wxBoxSizer(wxVERTICAL);
	m_3D_Scale = new WinEDA_VertexCtrl(this, _("Shape Scale:"), BoxSizer,
						2, 1);
	if ( struct3D ) m_3D_Scale->SetValue(struct3D->m_MatScale);
    PropLeftSizer->Add(BoxSizer, 0, wxGROW|wxALL, 5);

    BoxSizer = new wxBoxSizer(wxVERTICAL);
	m_3D_Offset = new WinEDA_VertexCtrl(this, _("Shape Offset:"), BoxSizer,
						2, 1);
	if ( struct3D ) m_3D_Offset->SetValue(struct3D->m_MatPosition);
	else m_3D_Offset->SetValue(dummy_vertex);
    PropLeftSizer->Add(BoxSizer, 0, wxGROW|wxALL, 5);

    BoxSizer = new wxBoxSizer(wxVERTICAL);
	m_3D_Rotation = new WinEDA_VertexCtrl(this, _("Shape Rotation:"), BoxSizer,
						2, 1);
	if ( struct3D ) m_3D_Rotation->SetValue(struct3D->m_MatRotation);
	else m_3D_Rotation->SetValue(dummy_vertex);
    PropLeftSizer->Add(BoxSizer, 0, wxGROW|wxALL, 5);

	if ( struct3D == NULL )
	{
		dummy_vertex.x = dummy_vertex.y = dummy_vertex.z = 1.0;
		m_3D_Scale->SetValue(dummy_vertex);
	}
}

/********************************/
Panel3D_Ctrl::~Panel3D_Ctrl(void)
/********************************/
{
	delete m_3D_ShapeName;
	delete m_3D_Scale;
	delete m_3D_Offset;
	delete m_3D_Rotation;
}


/***************************************************/
void Panel3D_Ctrl::Browse3DLib(wxCommandEvent& event)
/***************************************************/
{
wxString fullfilename, shortfilename;
wxString fullpath = g_RealLibDirBuffer;
wxString mask = wxT("*");

	fullpath += LIB3D_PATH;
	mask += g_Shapes3DExtBuffer;
#ifdef __WINDOWS__
	fullpath.Replace( wxT("/"), wxT("\\") );
#endif
	fullfilename = EDA_FileSelector( _("3D Shape:"),
					fullpath,			/* Chemin par defaut */
					wxEmptyString,					/* nom fichier par defaut */
					g_Shapes3DExtBuffer,	/* extension par defaut */
					mask,				/* Masque d'affichage */
					this,
					wxOPEN,
					TRUE
					);

	if ( fullfilename == wxEmptyString ) return;

	shortfilename = MakeReducedFileName( fullfilename,
						fullpath, wxEmptyString);
	m_3D_ShapeName->SetValue(shortfilename);
}


/**********************************************************************/
void  WinEDA_ModulePropertiesFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
/**********************************************************************/
{
    Close(true);    // true is to force the frame to close
}


/******************************************************************************/
void WinEDA_ModulePropertiesFrame::ModulePropertiesAccept(wxCommandEvent& event)
/******************************************************************************/
{
bool change_layer = FALSE;

	if ( m_DC ) m_Parent->GetScreen()->CursorOff(m_Parent->DrawPanel, m_DC);

	if ( m_DC )
		m_CurrentModule->Draw(m_Parent->DrawPanel, m_DC, wxPoint(0,0), GR_XOR);

	if ( m_OrientValue )
	{
		long orient = 0; wxString msg = m_OrientValue->GetValue();
		msg.ToLong(&orient);
		if( m_CurrentModule->m_Orient !=  orient)
			m_Parent->Rotate_Module(m_DC, m_CurrentModule,
				 orient, FALSE);
	}

	if ( m_LayerCtrl )
		{
		if ( m_LayerCtrl->GetSelection() == 0 )		// layer req = COMPONENT
			{
			if( m_CurrentModule->m_Layer == CUIVRE_N) change_layer = TRUE;
			}
		else if( m_CurrentModule->m_Layer == CMP_N ) change_layer = TRUE;
		}

	if ( change_layer )
	{
		m_Parent->Change_Side_Module(m_CurrentModule, m_DC);
	}

	if (m_AutoPlaceCtrl->GetSelection() == 1)
		m_CurrentModule->m_ModuleStatus |= MODULE_is_LOCKED;
	else m_CurrentModule->m_ModuleStatus &= ~MODULE_is_LOCKED;

	switch (m_AttributsCtrl->GetSelection())
		{
		case 0:
			m_CurrentModule->m_Attributs = 0;
			break;

		case 1:
			m_CurrentModule->m_Attributs = MOD_CMS;
			break;

		case 2:
			m_CurrentModule->m_Attributs = MOD_VIRTUAL;
			break;
		}

	m_CurrentModule->m_CntRot90 = m_CostRot90Ctrl->GetValue();
	m_CurrentModule->m_CntRot180 = m_CostRot180Ctrl->GetValue();
	if ( m_Doc ) m_CurrentModule->m_Doc = m_Doc->GetValue();
	if ( m_Keyword ) m_CurrentModule->m_KeyWord = m_Keyword->GetValue();

	/* Mise a jour des parametres 3D */
	Panel3D_Ctrl * panel3D =  m_Panel3D;
	Struct3D_Master *draw3D = m_CurrentModule->m_3D_Drawings,
		* nextdraw3D;
	for ( ; panel3D != NULL; panel3D = panel3D->m_Pnext )
	{
		draw3D->m_Shape3DName = panel3D->m_3D_ShapeName->GetValue();
		draw3D->m_MatScale = panel3D->m_3D_Scale->GetValue();
		draw3D->m_MatRotation = panel3D->m_3D_Rotation->GetValue();
		draw3D->m_MatPosition = panel3D->m_3D_Offset->GetValue();
		if ( (draw3D->m_Shape3DName.IsEmpty() ) &&
			 (draw3D != m_CurrentModule->m_3D_Drawings) )
			continue;
		if ( (draw3D->Pnext == NULL) && panel3D->m_Pnext )
		{
			nextdraw3D = new Struct3D_Master(draw3D);
			nextdraw3D->Pback = draw3D;
			draw3D->Pnext = nextdraw3D;
		}
		draw3D = (Struct3D_Master *) draw3D->Pnext;
	}

	for ( ; draw3D != NULL; draw3D = nextdraw3D )
	{
		nextdraw3D = (Struct3D_Master *)draw3D->Pnext;
		(draw3D->Pback)->Pnext = NULL;
		delete draw3D;
	}


	m_CurrentModule->Set_Rectangle_Encadrement();

	m_Parent->GetScreen()->SetModify();

	Close(TRUE);

	if ( m_DC )
		m_CurrentModule->Draw(m_Parent->DrawPanel, m_DC, wxPoint(0,0), GR_OR);
	if ( m_DC ) m_Parent->GetScreen()->CursorOn(m_Parent->DrawPanel, m_DC);
}


/************************************************************************/
void WinEDA_ModulePropertiesFrame::GotoModuleEditor(wxCommandEvent& event)
/************************************************************************/
{
	GoToEditor = TRUE;
	if ( m_CurrentModule->m_TimeStamp == 0 )	// Module Editor needs a non null timestamp
	{
		m_CurrentModule->m_TimeStamp = GetTimeStamp();
		m_Parent->GetScreen()->SetModify();
	}

	Close(TRUE);
}


/**********************************************************************/
void WinEDA_ModulePropertiesFrame::ExchangeModule(wxCommandEvent& event)
/**********************************************************************/
{
	m_Parent->InstallExchangeModuleFrame( m_CurrentModule,
					m_DC, wxPoint(-1,-1) );
	// Attention: si il y a eu echange, m_CurrentModule a été delete!
	m_Parent->GetScreen()->m_CurrentItem = NULL;
	Close(TRUE);
}


/*************************************************************************/
void WinEDA_ModulePropertiesFrame::ModuleOrientEvent(wxCommandEvent& event)
/*************************************************************************/
{
	switch ( m_OrientCtrl->GetSelection() )
		{
		case 0:
			m_OrientValue->Enable(FALSE);
			m_OrientValue->SetValue( wxT("0") );
			break;

		case 1:
			m_OrientValue->Enable(FALSE);
			m_OrientValue->SetValue( wxT("900") );
			break;

		case 2:
			m_OrientValue->Enable(FALSE);
			m_OrientValue->SetValue( wxT("2700") );
			break;

		case 3:
			m_OrientValue->Enable(FALSE);
			m_OrientValue->SetValue( wxT("1800") );
			break;

		default:
			m_OrientValue->Enable(FALSE);
			m_OrientValue->Enable(TRUE);
			break;
		}
}


/*************************************************************************/
void WinEDA_ModulePropertiesFrame::SelectTextListBox(wxCommandEvent& event)
/*************************************************************************/
{
	SetTextListButtons();
}

/*************************************************************************/
void WinEDA_ModulePropertiesFrame::SetTextListButtons(void)
/*************************************************************************/
{
int choice = m_TextListBox->GetChoice();

	if ( m_DeleteFieddButton == NULL ) return;

	if ( choice > 1 )	// Texte autre que ref ou valeur selectionne
	{
		m_DeleteFieddButton->Enable(TRUE);
	}
	else m_DeleteFieddButton->Enable(FALSE);
}


/***********************************************************/
void WinEDA_ModulePropertiesFrame::ReCreateFieldListBox(void)
/***********************************************************/
{
	m_TextListBox->Clear();

	m_TextListBox->Append(m_CurrentModule->m_Reference->m_Text);
	m_TextListBox->Append(m_CurrentModule->m_Value->m_Text);

	EDA_BaseStruct * item = m_CurrentModule->m_Drawings;
	while ( item )
	{
		if( item->m_StructType == TYPETEXTEMODULE )
			m_TextListBox->Append( ((TEXTE_MODULE*)item)->m_Text );
		item = item->Pnext;
	}
	
	SetTextListButtons();
}


/************************************************************************/
void WinEDA_ModulePropertiesFrame::CreateTextModule(wxCommandEvent& event)
/************************************************************************/
/* Cree un nouveau texte sur le module actif
	Le texte sera mis en fonction Move
*/
{
TEXTE_MODULE * Text;

	/* Creation de la place en memoire : */
	Text = m_Parent->CreateTextModule(m_CurrentModule, m_DC);

	ReCreateFieldListBox();
	m_TextListBox->SetSelection(2);
	SetTextListButtons();
}


/****************************************************************************/
void WinEDA_ModulePropertiesFrame::EditOrDelTextModule(wxCommandEvent& event)
/****************************************************************************/
{
int TextType = m_TextListBox->GetChoice();
TEXTE_MODULE * Text = NULL;

	if ( TextType < 0 ) return;	//No selection

	
	if ( m_DC ) m_Parent->GetScreen()->CursorOff(m_Parent->DrawPanel, m_DC);


	// Get a pointer on the field
	if ( TextType == 0 ) Text = m_CurrentModule->m_Reference;
	else if ( TextType == 1 ) Text = m_CurrentModule->m_Value;
	else // Search the field 2 or more, because field 0 and 1 are ref and value
	{
		EDA_BaseStruct * item = m_CurrentModule->m_Drawings;
		int jj = 2;
		while ( item )
		{
			if( item->m_StructType == TYPETEXTEMODULE )
			{
				if ( jj == TextType )	// Texte trouvé
				{
					Text = (TEXTE_MODULE*)item;
					break;
				}
			}
			item = item->Pnext; jj++;
		}
	}

	if ( Text )
	{
		if ( event.GetId() == ID_MODULE_EDIT_DELETE_TEXT )
		{
			if ( TextType < 2 )		// Ref or Value cannot be deleted
			{
				DisplayError(this, _("Reference or Value cannot be deleted") );
				goto out;
			}
			wxString Line;
			Line.Printf( _("Delete [%s]"), Text->m_Text.GetData() );
			if ( !IsOK(this, Line ) ) goto out;
			m_Parent->DeleteTextModule(Text, m_DC);
			ReCreateFieldListBox();
			m_TextListBox->SetSelection(0);
		}
		else	// Edition du champ
		{
			m_Parent->InstallTextModOptionsFrame(Text, m_DC, wxPoint(-1,-1) );
			ReCreateFieldListBox();
			m_TextListBox->SetSelection(TextType);
		}
	}
	
	else DisplayError(this,
		wxT("WinEDA_ModulePropertiesFrame::EditOrDelTextModule() error: Field not found"));

  out:
	if ( m_DC ) m_Parent->GetScreen()->CursorOn(m_Parent->DrawPanel, m_DC);
	SetTextListButtons();
}
