kicad/pcbnew/dialog_edit_module.cpp

755 lines
24 KiB
C++
Raw Blame History

/************************************************/
/* 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()
/**************************************************************************************/
WinEDA_ModulePropertiesFrame::WinEDA_ModulePropertiesFrame(WinEDA_BasePcbFrame *parent,
MODULE * Module,wxDC * DC,
const wxPoint & framepos):
wxDialog(parent, -1, _("Module properties"), framepos, wxDefaultSize, DIALOG_STYLE)
/**************************************************************************************/
{
wxString number;
SetIcon( wxICON(icon_modedit) ); // Give an icon
m_Parent = parent;
SetFont(*g_DialogFont);
m_DC = DC;
m_LayerCtrl = NULL;
m_OrientCtrl = NULL;
m_OrientValue = NULL;
m_Doc = m_Keyword = NULL;
m_CurrentModule = Module;
m_DeleteFieddButton = NULL;
if ( m_CurrentModule )
{
}
CreateControls();
GetSizer()->Fit(this);
GetSizer()->SetSizeHints(this);
Centre();
}
/*****************************************************/
void WinEDA_ModulePropertiesFrame::CreateControls(void)
/*****************************************************/
{
wxPoint pos;
wxButton * Button;
bool FullOptions = FALSE;
if ( m_Parent->m_Ident == PCB_FRAME ) FullOptions = TRUE;
m_GeneralBoxSizer = new wxBoxSizer(wxVERTICAL);
SetSizer(m_GeneralBoxSizer);
m_NoteBook = new wxNotebook(this, ID_NOTEBOOK);
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);
BuildPanelModuleProperties(FullOptions);
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::BuildPanelModuleProperties(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 ) // Module is on a board
{
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 // Module is edited in libedit
{
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] = { _("Component"), _("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);
#if wxCHECK_VERSION(2,8,0)
m_AttributsCtrl->SetItemToolTip(0, _("Use this attribute for most non smd components"));
m_AttributsCtrl->SetItemToolTip(1,
_("Use this attribute for smd components.\nOnly components with this option are put in the footprint position list file"));
m_AttributsCtrl->SetItemToolTip(2,
_("Use this attribute for \"virtual\" components drawn on board (like a old ISA PC bus connector)"));
#endif
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 properties_list[2] = { _("Free"), _("Locked")};
m_AutoPlaceCtrl = new wxRadioBox( m_PanelProperties, -1, _("Move and Auto Place"), wxDefaultPosition,
wxSize(-1,-1), 2, properties_list, 1);
m_AutoPlaceCtrl->SetSelection(
(m_CurrentModule->m_ModuleStatus & MODULE_is_LOCKED) ? 1 : 0);
#if wxCHECK_VERSION(2,8,0)
m_AutoPlaceCtrl->SetItemToolTip(0, _("Enable hotkey move commands and Auto Placement"));
m_AutoPlaceCtrl->SetItemToolTip(1, _("Disable hotkey move commands and Auto Placement"));
#endif
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,
wxFD_OPEN,
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->DrawPanel->CursorOff(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->DrawPanel->CursorOn(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 <20>t<EFBFBD> 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->DrawPanel->CursorOff(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<75>
{
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->DrawPanel->CursorOn(m_DC);
SetTextListButtons();
}