kicad/eeschema/libedpart.cpp

1129 lines
33 KiB
C++

/**************************************************************/
/* librairy editor: edition of component general properties */
/**************************************************************/
#include "fctsys.h"
#include "gr_basic.h"
#include "common.h"
#include "program.h"
#include "libcmp.h"
#include "general.h"
#include "protos.h"
#include "wx/spinctrl.h"
/* Routines locales */
/* Variables locales */
extern int CurrentUnit;
/* Classe de la frame des propriétés d'un composant en librairie */
enum id_libedit {
ID_LIBEDIT_NOTEBOOK = 3200,
ID_PANEL_BASIC,
ID_PANEL_ALIAS,
ID_PANEL_REFERENCE,
ID_PANEL_VALUE,
ID_PANEL_FOOTPRINT,
ID_PANEL_SUBSCHEMATIC,
ID_PANEL_FIELD1,
ID_PANEL_FIELD2,
ID_PANEL_FIELD3,
ID_PANEL_FIELD4,
ID_PANEL_FIELD5,
ID_PANEL_FIELD6,
ID_PANEL_FIELD7,
ID_PANEL_FIELD8,
ID_CLOSE_PART_PROPERTIES,
ID_ACCEPT_PART_PROPERTIES,
ID_COPY_DOC_TO_ALIAS,
ID_BROWSE_DOC_FILES,
ID_ADD_ALIAS,
ID_DELETE_ONE_ALIAS,
ID_DELETE_ALL_ALIAS
};
/************************************************/
class WinEDA_PartPropertiesFrame: public wxDialog
/************************************************/
/* Cette classe genere une fenetre type NoteBook, pour l'edition des propriétés
d'un composant le librairie.
On peut éditer:
Texte dimensions et justification de tous les champs (Ref, Val, et autres champs)
Documentation et mots clefs
Nombre de part par boitier
et autres propriérés générales
*/
{
private:
WinEDA_LibeditFrame * m_Parent;
wxNotebook* m_NoteBook;
wxListBox * m_PartAliasList;
wxPanel * m_PanelBasic;
wxPanel * m_PanelAlias;
wxPanel * m_PanelDoc;
wxPanel * PanelField[NUMBER_OF_FIELDS];
wxCheckBox * AsConvertButt;
wxCheckBox * ShowFieldText[NUMBER_OF_FIELDS];
wxCheckBox * VorientFieldText[NUMBER_OF_FIELDS];
wxCheckBox * ShowPinNumButt;
wxCheckBox * ShowPinNameButt;
wxCheckBox * m_PinsNameInsideButt;
wxSpinCtrl * SelNumberOfUnits;
wxSpinCtrl * m_SetSkew;
wxCheckBox * m_OptionPower;
wxCheckBox * m_OptionPartsLocked;
WinEDA_GraphicTextCtrl * FieldTextCtrl[NUMBER_OF_FIELDS];
WinEDA_PositionCtrl * FieldPosition[NUMBER_OF_FIELDS];
int FieldFlags[NUMBER_OF_FIELDS];
int FieldOrient[NUMBER_OF_FIELDS];
wxRadioBox * FieldHJustify[NUMBER_OF_FIELDS];
wxRadioBox * FieldVJustify[NUMBER_OF_FIELDS];
WinEDA_EnterText * m_Doc;
WinEDA_EnterText * m_Docfile;
WinEDA_EnterText * m_Keywords;
bool m_RecreateToolbar;
int m_AliasLocation;
public:
// Constructor and destructor
WinEDA_PartPropertiesFrame(WinEDA_LibeditFrame *parent, wxPoint& pos);
~WinEDA_PartPropertiesFrame()
{
};
private:
void BuildPanelBasic();
void BuildPanelDoc();
void BuildPanelAlias();
void BuildPanelEditField(int fieldId);
void PartPropertiesAccept(wxCommandEvent& event);
void OnQuit(wxCommandEvent& event);
void DeleteAllAliasOfPart(wxCommandEvent& event);
void DeleteAliasOfPart(wxCommandEvent& event);
void AddAliasOfPart(wxCommandEvent& event);
bool ChangeNbUnitsPerPackage(int newUnit);
bool SetUnsetConvert();
void CopyDocToAlias(wxCommandEvent& event);
void BrowseAndSelectDocFile(wxCommandEvent& event);
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(WinEDA_PartPropertiesFrame, wxDialog)
EVT_BUTTON(ID_ACCEPT_PART_PROPERTIES, WinEDA_PartPropertiesFrame::PartPropertiesAccept)
EVT_BUTTON(ID_CLOSE_PART_PROPERTIES, WinEDA_PartPropertiesFrame::OnQuit)
EVT_BUTTON(ID_ADD_ALIAS, WinEDA_PartPropertiesFrame::AddAliasOfPart)
EVT_BUTTON(ID_DELETE_ONE_ALIAS, WinEDA_PartPropertiesFrame::DeleteAliasOfPart)
EVT_BUTTON(ID_DELETE_ALL_ALIAS, WinEDA_PartPropertiesFrame::DeleteAllAliasOfPart)
EVT_BUTTON(ID_COPY_DOC_TO_ALIAS, WinEDA_PartPropertiesFrame::CopyDocToAlias)
EVT_BUTTON(ID_BROWSE_DOC_FILES, WinEDA_PartPropertiesFrame::BrowseAndSelectDocFile)
END_EVENT_TABLE()
/*****************************************************************/
void WinEDA_LibeditFrame::InstallLibeditFrame(const wxPoint & pos)
/*****************************************************************/
{
wxPoint fpos = pos;
WinEDA_PartPropertiesFrame * frame =
new WinEDA_PartPropertiesFrame(this, fpos);
frame->ShowModal(); frame->Destroy();
}
#define XSIZE 370
#define YSIZE 385
/**********************************************************************************/
WinEDA_PartPropertiesFrame::WinEDA_PartPropertiesFrame(WinEDA_LibeditFrame *parent,
wxPoint& framepos):
wxDialog(parent, -1, wxEmptyString, framepos, wxSize(XSIZE, YSIZE),
DIALOG_STYLE)
/**********************************************************************************/
{
wxPoint pos;
wxLayoutConstraints* c;
wxString msg_text;
wxButton * Button;
int ii;
m_Parent = parent;
m_RecreateToolbar = FALSE;
SetFont(*g_DialogFont);
SetAutoLayout(TRUE);
for ( ii = 0; ii < NUMBER_OF_FIELDS; ii++ )
FieldFlags[ii] = 0;
m_AliasLocation = -1;
if ( CurrentLibEntry )
{
msg_text = _("Properties for ");
if ( ! CurrentAliasName.IsEmpty() )
{
m_AliasLocation = LocateAlias( CurrentLibEntry->m_AliasList, CurrentAliasName);
SetTitle( msg_text + CurrentAliasName +
_("(alias of ") +
wxString(CurrentLibEntry->m_Name.m_Text)
+ wxT(")") );
}
else
{
SetTitle( msg_text + CurrentLibEntry->m_Name.m_Text );
CurrentAliasName.Empty();
}
FieldFlags[REFERENCE] = CurrentLibEntry->m_Prefix.m_Attributs;
FieldOrient[REFERENCE] = CurrentLibEntry->m_Prefix.m_Orient;
FieldFlags[VALUE] = CurrentLibEntry->m_Name.m_Attributs;
FieldOrient[VALUE] = CurrentLibEntry->m_Name.m_Orient;
LibDrawField * Field = CurrentLibEntry->Fields;
while ( Field )
{
FieldFlags[Field->m_FieldId] = Field->m_Attributs;
FieldOrient[Field->m_FieldId] = Field->m_Orient;
Field = (LibDrawField*)Field->Pnext;
}
}
else SetTitle(_("Lib Component Properties"));
m_NoteBook = new wxNotebook(this, ID_LIBEDIT_NOTEBOOK,
wxDefaultPosition,wxSize(XSIZE-6, YSIZE - 70) );
SetFont(*g_DialogFont);
m_NoteBook->SetAutoLayout(TRUE);
c = new wxLayoutConstraints;
c->left.SameAs(this, wxLeft, 4);
c->right.SameAs(this, wxRight, 4);
c->top.SameAs(this, wxTop, 4);
c->bottom.SameAs(this, wxBottom, 40);
m_NoteBook->SetConstraints(c);
/* Creation des boutons de commande */
pos.x = 50; pos.y = YSIZE - 60;
Button = new wxButton(this, ID_CLOSE_PART_PROPERTIES,
_("Cancel"), pos);
Button->SetForegroundColour(*wxBLUE);
c = new wxLayoutConstraints;
c->left.SameAs(this, wxLeft, 20);
c->height.AsIs();
c->width.AsIs();
c->bottom.SameAs(this, wxBottom, 5);
Button->SetConstraints(c);
pos.x += Button->GetDefaultSize().x + 70;
Button = new wxButton(this, ID_ACCEPT_PART_PROPERTIES,
_("Ok"), pos);
Button->SetForegroundColour(*wxRED);
c = new wxLayoutConstraints;
c->right.SameAs(this, wxRight, 20);
c->height.AsIs();
c->width.AsIs();
c->bottom.SameAs(this, wxBottom, 5);
Button->SetConstraints(c);
// Add panel Basic
BuildPanelBasic();
m_NoteBook->AddPage(m_PanelBasic, _("Options"), TRUE);
// Add Panel Documentation
BuildPanelDoc();
m_NoteBook->AddPage(m_PanelDoc, _("Doc"), FALSE);
// Add Panel Alias List
BuildPanelAlias();
m_NoteBook->AddPage(m_PanelAlias, _("Alias"), FALSE);
// Add panel Fields
for ( ii = 0; ii < NUMBER_OF_FIELDS; ii++) BuildPanelEditField(ii);
}
/*****************************************************/
void WinEDA_PartPropertiesFrame::BuildPanelAlias()
/*****************************************************/
/* create the panel for component alias list editing
*/
{
wxPoint pos;
wxButton * Button;
m_PanelAlias = new wxPanel(m_NoteBook, -1);
m_PanelAlias->SetFont(*g_DialogFont);
wxLayoutConstraints * c = new wxLayoutConstraints;
c->left.SameAs(m_NoteBook, wxLeft);
c->right.SameAs(m_NoteBook, wxRight);
c->bottom.SameAs(m_NoteBook, wxBottom);
m_PanelAlias->SetConstraints(c);
pos.x = 200; pos.y = 70;
Button = new wxButton(m_PanelAlias, ID_ADD_ALIAS, _("Add"), pos);
Button->SetForegroundColour(*wxBLUE);
pos.y += Button->GetSize().y + 10;
Button = new wxButton(m_PanelAlias, ID_DELETE_ONE_ALIAS,
_("Delete"), pos);
Button->SetForegroundColour(*wxRED);
pos.y += Button->GetSize().y + 10;
Button = new wxButton(m_PanelAlias, ID_DELETE_ALL_ALIAS,
_("Delete All"), pos);
Button->SetForegroundColour(*wxRED);
if ( ! CurrentAliasName.IsEmpty() ) Button->Enable(FALSE);
pos.x = 5; pos.y = 30;
m_PartAliasList = new wxListBox(m_PanelAlias,
-1,
pos, wxSize(160,170),
0,NULL,
wxLB_ALWAYS_SB|wxLB_SINGLE);
wxStaticText * Msg = new wxStaticText(m_PanelAlias, -1, _("Alias"),
wxPoint(pos.x,pos.y - 20) );
Msg->SetForegroundColour(wxColour(200,0,0) );
/* lecture des noms des alias */
if ( CurrentLibEntry )
{
for ( unsigned ii = 0; ii < CurrentLibEntry->m_AliasList.GetCount(); ii += ALIAS_NEXT)
m_PartAliasList->Append(CurrentLibEntry->m_AliasList[ii+ALIAS_NAME]);
}
}
/*****************************************************/
void WinEDA_PartPropertiesFrame::BuildPanelDoc()
/*****************************************************/
/* create the panel for component doc editing
*/
{
wxPoint pos;
wxButton * Button;
wxString msg_text;
m_PanelDoc = new wxPanel(m_NoteBook, -1);
m_PanelDoc->SetFont(*g_DialogFont);
wxLayoutConstraints * c = new wxLayoutConstraints;
c->left.SameAs(m_NoteBook, wxLeft);
c->right.SameAs(m_NoteBook, wxRight);
c->bottom.SameAs(m_NoteBook, wxBottom);
m_PanelDoc->SetConstraints(c);
pos.x = 5; pos.y = 15;
if ( CurrentLibEntry )
{
msg_text = _("Properties for ");
if ( ! CurrentAliasName.IsEmpty() )
{
msg_text += _("alias ");
msg_text += CurrentAliasName;
}
else
{
msg_text += CurrentLibEntry->m_Name.m_Text;
}
wxStaticText * text = new wxStaticText(m_PanelDoc, -1, msg_text, pos);
text->SetForegroundColour(*wxBLUE);
}
pos.y += 30;
if ( m_AliasLocation >= 0 )
msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_DOC];
else
{
if (CurrentLibEntry && CurrentLibEntry->m_Doc)
msg_text = CurrentLibEntry->m_Doc;
}
m_Doc = new WinEDA_EnterText(m_PanelDoc,
_("Doc:"), msg_text,
pos, wxSize(285,-1) );
pos.y += 40;
msg_text.Empty();
if ( m_AliasLocation >= 0 )
msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_KEYWORD];
else
{
if (CurrentLibEntry ) msg_text = CurrentLibEntry->m_KeyWord;
}
m_Keywords = new WinEDA_EnterText(m_PanelDoc,
_("Keywords:"), msg_text,
pos, wxSize(285,-1) );
pos.y += 40;
msg_text.Empty();
if ( m_AliasLocation >= 0 )
msg_text = CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_DOC_FILENAME];
else
{
if (CurrentLibEntry) msg_text = CurrentLibEntry->m_DocFile;
}
m_Docfile = new WinEDA_EnterText(m_PanelDoc,
_("DocFileName:"), msg_text,
pos, wxSize(285,-1) );
pos.y += 40;
Button = new wxButton(m_PanelDoc, ID_COPY_DOC_TO_ALIAS,
_("Copy Doc"), pos);
Button->SetForegroundColour(*wxRED);
if ( m_AliasLocation < 0 ) Button->Enable(FALSE);
Button = new wxButton(m_PanelDoc, ID_BROWSE_DOC_FILES,
_("Browse DocFiles"), wxPoint(pos.x + 140, pos.y) );
Button->SetForegroundColour(*wxBLUE);
}
/*****************************************************/
void WinEDA_PartPropertiesFrame::BuildPanelBasic()
/*****************************************************/
/* create the basic panel for component properties editing
*/
{
wxPoint pos;
m_PanelBasic = new wxPanel(m_NoteBook, ID_PANEL_BASIC);
m_PanelBasic->SetFont(*g_DialogFont);
wxLayoutConstraints * c = new wxLayoutConstraints;
c->left.SameAs(m_NoteBook, wxLeft);
c->right.SameAs(m_NoteBook, wxRight);
c->bottom.SameAs(m_NoteBook, wxBottom);
m_PanelBasic->SetConstraints(c);
pos.x = 5; pos.y = 25;
new wxStaticBox(m_PanelBasic, -1,_("General :"), pos, wxSize(250, 120));
pos.x = 10; pos.y += 22;
AsConvertButt = new wxCheckBox(m_PanelBasic,-1, _("As Convert"), pos);
if ( g_AsDeMorgan ) AsConvertButt->SetValue(TRUE);
pos.y += 20;
ShowPinNumButt = new wxCheckBox(m_PanelBasic,-1, _("Show Pin Num"), pos);
if ( CurrentLibEntry )
{
if ( CurrentLibEntry->m_DrawPinNum ) ShowPinNumButt->SetValue(TRUE);
}
else ShowPinNumButt->SetValue(TRUE);
pos.y += 20;
ShowPinNameButt = new wxCheckBox(m_PanelBasic,-1, _("Show Pin Name"), pos);
if ( CurrentLibEntry )
{
if( CurrentLibEntry->m_DrawPinName ) ShowPinNameButt->SetValue(TRUE);
}
else ShowPinNameButt->SetValue(TRUE);
pos.y += 20;
m_PinsNameInsideButt = new wxCheckBox(m_PanelBasic,-1, _("Pin Name Inside"), pos);
if ( CurrentLibEntry )
{
if ( CurrentLibEntry->m_TextInside ) m_PinsNameInsideButt->SetValue(TRUE);
}
else m_PinsNameInsideButt->SetValue(TRUE);
pos.y += 40;
new wxStaticText(m_PanelBasic,-1,_("Number of Units:"), pos);
pos.y += 15;
wxString number;
if ( CurrentLibEntry ) number.Printf( wxT("%d"), CurrentLibEntry->m_UnitCount);
else number = wxT("1");
SelNumberOfUnits = new wxSpinCtrl(m_PanelBasic,-1,number, pos,
wxDefaultSize, wxSP_ARROW_KEYS | wxSP_WRAP,
1, 16);
pos.y -= 15; pos.x += 180;
new wxStaticText(m_PanelBasic,-1,_("Skew:"), pos);
pos.y += 15;
if ( CurrentLibEntry && CurrentLibEntry->m_TextInside)
number.Printf( wxT("%d"), CurrentLibEntry->m_TextInside);
else number = wxT("40");
m_SetSkew = new wxSpinCtrl(m_PanelBasic,-1,number, pos,
wxDefaultSize, wxSP_ARROW_KEYS | wxSP_WRAP,
1, 100);
pos.x = 5; pos.y += 40;
m_OptionPower = new wxCheckBox(m_PanelBasic,-1, _("Power Symbol"), pos);
if ( CurrentLibEntry )
{
if( CurrentLibEntry->m_Options == ENTRY_POWER )
m_OptionPower->SetValue(TRUE);
}
pos.y = m_OptionPower->GetRect().GetBottom() + 10;
m_OptionPartsLocked = new wxCheckBox(m_PanelBasic,-1, _("Parts are locked"), pos);
if ( CurrentLibEntry )
{
if( CurrentLibEntry->m_UnitSelectionLocked )
m_OptionPartsLocked->SetValue(TRUE);
}
if ( number == wxT("1") ) m_OptionPartsLocked->Enable(FALSE);
}
/****************************************************************/
void WinEDA_PartPropertiesFrame::BuildPanelEditField(int fieldId)
/****************************************************************/
{
wxPoint pos;
int xx, yy;
LibDrawField * Field;
wxString Hjustify_list[] =
{ _("Left justify"),_("Center"),_("Right justify")};
wxString Vjustify_list[] =
{ _("Bottom justify"),_("Center"),_("Top justify")};
int ii = fieldId;
PanelField[ii] = new wxPanel(m_NoteBook, ID_PANEL_REFERENCE + ii);
PanelField[ii]->SetFont(*g_DialogFont);
wxLayoutConstraints * c = new wxLayoutConstraints;
c->left.SameAs(m_NoteBook, wxLeft);
c->right.SameAs(m_NoteBook, wxRight);
c->bottom.SameAs(m_NoteBook, wxBottom);
PanelField[ii]->SetConstraints(c);
m_NoteBook->AddPage(PanelField[ii], DrawPartStruct::ReturnFieldName(ii), FALSE);
pos.x = 10; pos.y = 10;
ShowFieldText[ii] = new wxCheckBox(PanelField[ii],-1,
_("Show Text"), pos);
if ( (FieldFlags[ii] & TEXT_NO_VISIBLE ) == 0 )
ShowFieldText[ii]->SetValue(TRUE);
ShowFieldText[ii]->GetSize(&xx, &yy);
pos.y += yy + 5;
VorientFieldText[ii] = new wxCheckBox(PanelField[ii],-1,
_("Vertical"), pos);
if ( FieldOrient[ii] ) VorientFieldText[ii]->SetValue(TRUE);
pos.x = 150; pos.y = 5;
FieldHJustify[ii] = new wxRadioBox(PanelField[ii],-1,
_("Hor Justify"), pos, wxDefaultSize,
3,Hjustify_list, 1 , wxRA_SPECIFY_COLS);
FieldHJustify[ii]->GetSize(&xx, &yy);
FieldHJustify[ii]->SetSelection(1);
pos.y += yy + 5;
FieldVJustify[ii] = new wxRadioBox(PanelField[ii],-1,
_("Vert Justify"), pos, wxDefaultSize,
3,Vjustify_list, 1 , wxRA_SPECIFY_COLS);
FieldVJustify[ii]->SetSelection(1);
wxPoint txtpos;
pos.x = 10; pos.y = 70;
#define POSY_OFFSET 70
switch ( ii )
{
case REFERENCE:
if ( CurrentLibEntry )
{
Field = &CurrentLibEntry->m_Prefix;
txtpos = Field->m_Pos;
if ( Field->m_HJustify == GR_TEXT_HJUSTIFY_LEFT)
FieldHJustify[ii]->SetSelection(0);
else if ( Field->m_HJustify == GR_TEXT_HJUSTIFY_RIGHT)
FieldHJustify[ii]->SetSelection(2);
if ( Field->m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM)
FieldVJustify[ii]->SetSelection(0);
else if ( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP)
FieldVJustify[ii]->SetSelection(2);
}
else txtpos = wxPoint(0,0);
FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii],
_("Pos"), txtpos,
g_UnitMetric , pos );
FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( PanelField[ii],
DrawPartStruct::ReturnFieldName(ii),
CurrentLibEntry ?
CurrentLibEntry->m_Prefix.m_Text.GetData() : wxT("U"),
CurrentLibEntry ? CurrentLibEntry->m_Prefix.m_Size.x : DEFAULT_TEXT_SIZE,
g_UnitMetric ,
wxPoint(pos.x, pos.y +FieldPosition[ii]->GetDimension().y + POSY_OFFSET),
200, TRUE);
break;
case VALUE:
if ( CurrentLibEntry )
{
Field = &CurrentLibEntry->m_Name;
txtpos = Field->m_Pos;
if ( Field->m_HJustify == GR_TEXT_HJUSTIFY_LEFT)
FieldHJustify[ii]->SetSelection(0);
else if ( Field->m_HJustify == GR_TEXT_HJUSTIFY_RIGHT)
FieldHJustify[ii]->SetSelection(2);
if ( Field->m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM)
FieldVJustify[ii]->SetSelection(0);
else if ( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP)
FieldVJustify[ii]->SetSelection(2);
}
else txtpos = wxPoint(0,0);
FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii],
_("Pos"), txtpos,
g_UnitMetric , pos);
FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( PanelField[ii],
DrawPartStruct::ReturnFieldName(ii),
CurrentLibEntry ? CurrentLibEntry->m_Name.m_Text.GetData() : NULL,
CurrentLibEntry ? CurrentLibEntry->m_Name.m_Size.x : DEFAULT_TEXT_SIZE,
g_UnitMetric ,
wxPoint(pos.x, pos.y +FieldPosition[ii]->GetDimension().y + POSY_OFFSET),
200, TRUE);
break;
default:
int fsize;
wxString ftext;
wxPoint fpos;
fsize = DEFAULT_TEXT_SIZE;;
Field = NULL;
fpos = wxPoint(0,0);
//recherche du Field de FieldId correspondant, s'il existe
if ( CurrentLibEntry )
{
Field = CurrentLibEntry->Fields;
while ( Field )
{
if( Field->m_FieldId == ii )
{
fsize = Field->m_Size.x;
ftext = Field->m_Text;
fpos = Field->m_Pos;
if ( Field->m_HJustify == GR_TEXT_HJUSTIFY_LEFT)
FieldHJustify[ii]->SetSelection(0);
else if ( Field->m_HJustify == GR_TEXT_HJUSTIFY_RIGHT)
FieldHJustify[ii]->SetSelection(2);
if ( Field->m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM)
FieldVJustify[ii]->SetSelection(0);
else if ( Field->m_VJustify == GR_TEXT_VJUSTIFY_TOP)
FieldVJustify[ii]->SetSelection(2);
break;
}
Field = (LibDrawField*)Field->Pnext;
}
}
FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii],
_("Pos"), fpos,
g_UnitMetric , pos);
FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( PanelField[ii],
DrawPartStruct::ReturnFieldName(ii),
ftext, fsize,
g_UnitMetric ,
wxPoint(pos.x, pos.y +FieldPosition[ii]->GetDimension().y + POSY_OFFSET),
200, TRUE);
break;
}
}
/************************************************************************/
void WinEDA_PartPropertiesFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
/************************************************************************/
{
// true is to force the frame to close
Close(true);
}
/**************************************************************************/
void WinEDA_PartPropertiesFrame::PartPropertiesAccept(wxCommandEvent& event)
/**************************************************************************/
/* Met a jour les differents parametres pour le composant en cours d'édition
*/
{
int ii, jj;
int hjustify[3] = { GR_TEXT_HJUSTIFY_LEFT , GR_TEXT_HJUSTIFY_CENTER,
GR_TEXT_HJUSTIFY_RIGHT };
int vjustify[3] = { GR_TEXT_VJUSTIFY_BOTTOM , GR_TEXT_VJUSTIFY_CENTER,
GR_TEXT_VJUSTIFY_TOP };
if( CurrentLibEntry == NULL )
{
Close(); return;
}
m_Parent->m_CurrentScreen->SetModify();
m_Parent->m_CurrentScreen->SetRefreshReq();
m_Parent->SaveCopyInUndoList();
/* A new name could be entered in VALUE field.
Must not be an existing alias name in alias list box */
jj = m_PartAliasList->GetCount();
wxString newvalue = FieldTextCtrl[VALUE]->GetText();
for ( ii = 0; ii < jj; ii++ )
{
if( newvalue.CmpNoCase(m_PartAliasList->GetString(ii).GetData()) == 0 )
{
wxString msg;
msg.Printf( wxT("Alias %s exists!"), newvalue.GetData());
DisplayError(this, msg);
return;
}
}
/* Update the doc, keyword and doc filename strings */
if ( m_AliasLocation < 0 )
{
CurrentLibEntry->m_Doc = m_Doc->GetValue();
CurrentLibEntry->m_KeyWord = m_Keywords->GetValue();
CurrentLibEntry->m_DocFile = m_Docfile->GetValue();
}
else
{
CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_DOC] = m_Doc->GetValue();
CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_KEYWORD] = m_Keywords->GetValue();
CurrentLibEntry->m_AliasList[m_AliasLocation+ALIAS_DOC_FILENAME] = m_Docfile->GetValue();
}
/* Update the alias list */
/* 1 - Add names: test for a not existing name in old alias list: */
jj = m_PartAliasList->GetCount();
for ( ii = 0; ii < jj; ii++ )
{
if ( LocateAlias( CurrentLibEntry->m_AliasList, m_PartAliasList->GetString(ii)) < 0 )
{ // new alias must be created
CurrentLibEntry->m_AliasList.Add(m_PartAliasList->GetString(ii));
CurrentLibEntry->m_AliasList.Add(wxEmptyString); // Add a void doc string
CurrentLibEntry->m_AliasList.Add(wxEmptyString); // Add a void keyword list string
CurrentLibEntry->m_AliasList.Add(wxEmptyString); // Add a void doc filename string
}
}
/* 2 - Remove delete names: test for an non existing name in new alias list: */
int kk, kkmax = CurrentLibEntry->m_AliasList.GetCount();
for ( kk = 0; kk < kkmax; )
{
jj = m_PartAliasList->GetCount();
wxString aliasname = CurrentLibEntry->m_AliasList[kk];
for ( ii = 0; ii < jj; ii++ )
{
if( aliasname.CmpNoCase(m_PartAliasList->GetString(ii).GetData()) == 0 )
{
kk += ALIAS_NEXT; // Alias exist in new list. keep it and test next old name
break;
}
}
if ( ii == jj ) // Alias not found in new list, remove it (4 strings in kk position)
{
for( ii = 0; ii < ALIAS_NEXT; ii++ ) CurrentLibEntry->m_AliasList.RemoveAt(kk);
kkmax = CurrentLibEntry->m_AliasList.GetCount();
}
}
if ( ! FieldTextCtrl[REFERENCE]->GetText().IsEmpty() )
{
CurrentLibEntry->m_Prefix.m_Text = FieldTextCtrl[REFERENCE]->GetText();
}
if ( ! FieldTextCtrl[VALUE]->GetText().IsEmpty() )
{
if ( CurrentLibEntry->m_Name.m_Text != FieldTextCtrl[VALUE]->GetText() )
{
m_RecreateToolbar = TRUE;
CurrentLibEntry->m_Name.m_Text = FieldTextCtrl[VALUE]->GetText();
}
}
CurrentLibEntry->m_Prefix.m_Size.x =
CurrentLibEntry->m_Prefix.m_Size.y = FieldTextCtrl[REFERENCE]->GetTextSize();
CurrentLibEntry->m_Name.m_Size.x =
CurrentLibEntry->m_Name.m_Size.y = FieldTextCtrl[VALUE]->GetTextSize();
CurrentLibEntry->m_Prefix.m_Pos = FieldPosition[REFERENCE]->GetValue();
CurrentLibEntry->m_Name.m_Pos = FieldPosition[VALUE]->GetValue();
CurrentLibEntry->m_Prefix.m_Orient = VorientFieldText[REFERENCE]->GetValue() ? 1 : 0;
CurrentLibEntry->m_Name.m_Orient = VorientFieldText[VALUE]->GetValue() ? 1 : 0;
CurrentLibEntry->m_Prefix.m_HJustify =
hjustify[FieldHJustify[REFERENCE]->GetSelection()];
CurrentLibEntry->m_Prefix.m_VJustify =
vjustify[FieldVJustify[REFERENCE]->GetSelection()];
CurrentLibEntry->m_Name.m_HJustify =
hjustify[FieldHJustify[VALUE]->GetSelection()];
CurrentLibEntry->m_Name.m_VJustify =
vjustify[FieldVJustify[VALUE]->GetSelection()];
if ( ShowFieldText[REFERENCE]->GetValue() )
CurrentLibEntry->m_Prefix.m_Attributs &= ~TEXT_NO_VISIBLE;
else
CurrentLibEntry->m_Prefix.m_Attributs |= TEXT_NO_VISIBLE;
if ( ShowFieldText[VALUE]->GetValue() )
CurrentLibEntry->m_Name.m_Attributs &= ~TEXT_NO_VISIBLE;
else
CurrentLibEntry->m_Name.m_Attributs |= TEXT_NO_VISIBLE;
for ( ii = FOOTPRINT; ii < NUMBER_OF_FIELDS; ii++ )
{
LibDrawField * Field = CurrentLibEntry->Fields;
LibDrawField * NextField, * previousField = NULL;
while ( Field )
{
NextField = (LibDrawField*)Field->Pnext;
if( Field->m_FieldId == ii )
{
Field->m_Text = FieldTextCtrl[ii]->GetText();
Field->m_Size.x = Field->m_Size.y = FieldTextCtrl[ii]->GetTextSize();
Field->m_HJustify = FieldHJustify[ii]->GetSelection();
Field->m_VJustify = FieldVJustify[ii]->GetSelection();
if ( ShowFieldText[ii]->GetValue() )
Field->m_Attributs &= ~TEXT_NO_VISIBLE;
else
Field->m_Attributs |= TEXT_NO_VISIBLE;
Field->m_Orient = VorientFieldText[ii]->GetValue() ? 1 : 0;
Field->m_Pos = FieldPosition[ii]->GetValue();
if( Field->m_Text.IsEmpty() ) // An old field exists; new is void, delete it
{
delete Field;
if ( previousField ) previousField->Pnext = NextField;
else CurrentLibEntry->Fields = NextField;
}
break;
}
previousField = Field;
Field = NextField;
}
if ( (Field == NULL) && ( ! FieldTextCtrl[ii]->GetText().IsEmpty() ) )
{ // Do not exists: must be created
Field = new LibDrawField(ii);
Field->m_Text = FieldTextCtrl[ii]->GetText();
Field->m_Size.x = Field->m_Size.y = FieldTextCtrl[ii]->GetTextSize();
if ( ShowFieldText[Field->m_FieldId]->GetValue() )
Field->m_Attributs &= ~TEXT_NO_VISIBLE;
else
Field->m_Attributs |= TEXT_NO_VISIBLE;
Field->m_Orient = VorientFieldText[Field->m_FieldId]->GetValue() ?1 : 0;
Field->m_Pos = FieldPosition[Field->m_FieldId]->GetValue();
Field->m_HJustify = hjustify[FieldHJustify[Field->m_FieldId]->GetSelection()];
Field->m_VJustify = vjustify[FieldVJustify[Field->m_FieldId]->GetSelection()];
Field->Pnext = CurrentLibEntry->Fields;
CurrentLibEntry->Fields = Field;
}
}
ii = SelNumberOfUnits->GetValue();
if ( ChangeNbUnitsPerPackage(ii) )
m_RecreateToolbar = TRUE;
if ( AsConvertButt->GetValue() )
{
if ( ! g_AsDeMorgan )
{
g_AsDeMorgan = 1;
if ( SetUnsetConvert() ) m_RecreateToolbar = TRUE;
}
}
else
{
if ( g_AsDeMorgan )
{
g_AsDeMorgan = 0;
if ( SetUnsetConvert() ) m_RecreateToolbar = TRUE;
}
}
CurrentLibEntry->m_DrawPinNum = ShowPinNumButt->GetValue() ? 1 : 0;
CurrentLibEntry->m_DrawPinName = ShowPinNameButt->GetValue() ? 1 : 0;
if ( m_PinsNameInsideButt->GetValue() == FALSE)
CurrentLibEntry->m_TextInside = 0;
else
CurrentLibEntry->m_TextInside = m_SetSkew->GetValue();
if ( m_OptionPower->GetValue() == TRUE)
CurrentLibEntry->m_Options = ENTRY_POWER;
else
CurrentLibEntry->m_Options = ENTRY_NORMAL;
/* Set the option "Units locked".
Obviously, cannot be TRUE if there is only one part */
CurrentLibEntry->m_UnitSelectionLocked = m_OptionPartsLocked->GetValue();
if ( CurrentLibEntry->m_UnitCount <= 1 )
CurrentLibEntry->m_UnitSelectionLocked = FALSE;
if ( m_RecreateToolbar ) m_Parent->ReCreateHToolbar();
m_Parent->DisplayLibInfos();
Close();
}
/*******************************************************************************/
void WinEDA_PartPropertiesFrame::CopyDocToAlias(wxCommandEvent& WXUNUSED(event))
/******************************************************************************/
{
if( CurrentLibEntry == NULL ) return;
if ( CurrentAliasName.IsEmpty() ) return;
m_Doc->SetValue(CurrentLibEntry->m_Doc);
m_Docfile->SetValue(CurrentLibEntry->m_DocFile);
m_Keywords->SetValue(CurrentLibEntry->m_KeyWord);
}
/**********************************************************/
void WinEDA_PartPropertiesFrame::DeleteAllAliasOfPart(
wxCommandEvent& WXUNUSED(event))
/**********************************************************/
{
CurrentAliasName.Empty();
if( CurrentLibEntry )
{
if( IsOK(this, _("Ok to Delete Alias LIST") ) )
{
m_PartAliasList->Clear();
m_RecreateToolbar = TRUE;
}
}
}
/*******************************************************************************/
void WinEDA_PartPropertiesFrame::AddAliasOfPart( wxCommandEvent& WXUNUSED(event))
/*******************************************************************************/
/* Add a new name to the alias list box
New name cannot be the root name, and must not exists
*/
{
wxString Line;
wxString aliasname;
if(CurrentLibEntry == NULL) return;
if( Get_Message(_("New alias:"),Line, this) != 0 ) return;
Line.Replace( wxT(" "), wxT("_") );
aliasname = Line;
if ( CurrentLibEntry->m_Name.m_Text.CmpNoCase(Line) == 0 )
{
DisplayError(this, _("This is the Root Part"), 10); return;
}
/* test for an existing name: */
int ii, jj = m_PartAliasList->GetCount();
for ( ii = 0; ii < jj; ii++ )
{
if( aliasname.CmpNoCase(m_PartAliasList->GetString(ii)) == 0 )
{
DisplayError(this, _("Already in use"), 10);
return;
}
}
m_PartAliasList->Append(aliasname);
m_RecreateToolbar = TRUE;
}
/********************************************************/
void WinEDA_PartPropertiesFrame::DeleteAliasOfPart(
wxCommandEvent& WXUNUSED(event))
/********************************************************/
{
wxString aliasname = m_PartAliasList->GetStringSelection();
if ( aliasname.IsEmpty() ) return;
if ( aliasname == CurrentAliasName )
{
wxString msg = CurrentAliasName + _(" is Current Selected Alias!");
DisplayError(this, msg );
return;
}
int ii = m_PartAliasList->GetSelection();
m_PartAliasList->Delete(ii);
m_RecreateToolbar = TRUE;
}
/********************************************************************/
bool WinEDA_PartPropertiesFrame::ChangeNbUnitsPerPackage(int MaxUnit)
/********************************************************************/
/* Routine de modification du nombre d'unites par package pour le
composant courant;
*/
{
int OldNumUnits, ii, FlagDel = -1;
LibEDA_BaseStruct* DrawItem, * NextDrawItem;
if( CurrentLibEntry == NULL ) return FALSE;
/* Si pas de changement: termine */
if ( CurrentLibEntry->m_UnitCount == MaxUnit ) return FALSE;
OldNumUnits = CurrentLibEntry->m_UnitCount;
if ( OldNumUnits < 1 ) OldNumUnits = 1;
CurrentLibEntry->m_UnitCount = MaxUnit;
/* Traitement des unites enlevees ou rajoutees */
if(OldNumUnits > CurrentLibEntry->m_UnitCount )
{
DrawItem = CurrentLibEntry->m_Drawings;
for ( ; DrawItem != NULL; DrawItem = NextDrawItem)
{
NextDrawItem = DrawItem->Next();
if( DrawItem->m_Unit > MaxUnit ) /* Item a effacer */
{
if( FlagDel < 0 )
{
if( IsOK(this, _("Delete units") ) )
{
/* Si part selectee n'existe plus: selection 1ere unit */
if( CurrentUnit > MaxUnit ) CurrentUnit = 1;
FlagDel = 1;
}
else
{
FlagDel = 0;
MaxUnit = OldNumUnits;
CurrentLibEntry->m_UnitCount = MaxUnit;
return FALSE;
}
}
DeleteOneLibraryDrawStruct(m_Parent->DrawPanel, NULL, CurrentLibEntry,
DrawItem, 0);
}
}
return TRUE;
}
if(OldNumUnits < CurrentLibEntry->m_UnitCount )
{
DrawItem = CurrentLibEntry->m_Drawings;
for ( ; DrawItem != NULL; DrawItem = DrawItem->Next() )
{
/* Duplication des items pour autres elements */
if( DrawItem->m_Unit == 1 )
{
for ( ii = OldNumUnits +1; ii <= MaxUnit; ii ++ )
{
NextDrawItem = CopyDrawEntryStruct(this, DrawItem);
NextDrawItem->Pnext = CurrentLibEntry->m_Drawings;
CurrentLibEntry->m_Drawings = NextDrawItem;
NextDrawItem->m_Unit = ii;
}
}
}
}
return TRUE;
}
/*****************************************************/
bool WinEDA_PartPropertiesFrame::SetUnsetConvert()
/*****************************************************/
/* crée ou efface (selon option AsConvert) les éléments
de la représentation convertie d'un composant
*/
{
int FlagDel = 0;
LibEDA_BaseStruct* DrawItem = NULL, * NextDrawItem;
if( g_AsDeMorgan ) /* Representation convertie a creer */
{
/* Traitement des elements a ajouter ( pins seulement ) */
if( CurrentLibEntry ) DrawItem = CurrentLibEntry->m_Drawings;
for ( ; DrawItem != NULL; DrawItem = DrawItem->Next() )
{
/* Duplication des items pour autres elements */
if( DrawItem->Type() != COMPONENT_PIN_DRAW_TYPE ) continue;
if( DrawItem->m_Convert == 1 )
{
if( FlagDel == 0 )
{
if( IsOK(this, _("Create pins for Convert items")) )
FlagDel = 1;
else
{
if( IsOK(this, _("Part as \"De Morgan\" anymore")) )
return TRUE;
g_AsDeMorgan = 0; return FALSE;
}
}
NextDrawItem = CopyDrawEntryStruct(this, DrawItem);
NextDrawItem->Pnext = CurrentLibEntry->m_Drawings;
CurrentLibEntry->m_Drawings = NextDrawItem;
NextDrawItem->m_Convert = 2;
}
}
}
else /* Representation convertie a supprimer */
{
/* Traitement des elements à supprimer */
if( CurrentLibEntry ) DrawItem = CurrentLibEntry->m_Drawings;
for ( ; DrawItem != NULL; DrawItem = NextDrawItem)
{
NextDrawItem = DrawItem->Next();
if( DrawItem->m_Convert > 1 ) /* Item a effacer */
{
if( FlagDel == 0 )
{
if( IsOK(this, _("Delete Convert items") ) )
{
CurrentConvert = 1;
FlagDel = 1;
}
else
{
g_AsDeMorgan = 1;
return FALSE;
}
}
m_Parent->GetScreen()->SetModify();
DeleteOneLibraryDrawStruct(m_Parent->DrawPanel, NULL, CurrentLibEntry, DrawItem, 0);
}
}
}
return TRUE;
}
/****************************************************************************/
void WinEDA_PartPropertiesFrame::BrowseAndSelectDocFile(wxCommandEvent& event)
/****************************************************************************/
{
wxString FullFileName;
wxString docpath(g_RealLibDirBuffer), filename;
docpath += wxT("doc");
docpath += STRING_DIR_SEP;
FullFileName = EDA_FileSelector(_("Doc Files"),
docpath, /* Chemin par defaut */
wxEmptyString, /* nom fichier par defaut */
wxEmptyString, /* extension par defaut */
wxEmptyString, /* Masque d'affichage */
this,
wxFD_OPEN,
TRUE
);
if ( FullFileName.IsEmpty() ) return;
// Suppression du chemin par defaut pour le fichier de doc:
filename = MakeReducedFileName(FullFileName,docpath, wxEmptyString);
m_Docfile->SetValue(filename);
}