kicad/eeschema/fieldedi.cpp

1119 lines
30 KiB
C++

/*********************************************************************/
/* EESchema - edition des librairies: Edition des champs ( Fields ) */
/*********************************************************************/
/* Fichier fieldedi.cpp */
#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"
static char *PanelText[] =
{
"Ref", /* Champ Reference of part, i.e. "IC21" */
"Name", /* Champ Value of part, i.e. "3.3K" */
"Fld1",
"Fld2",
"Fld3",
"Fld4",
"Fld5",
"Fld6",
"Fld7",
"Fld8",
"Pcb", /* Champ Name Module PCB, i.e. "16DIP300" */
"Sheet" /* Champ Name Schema component, i.e. "cnt16.sch" */
};
/* Routines locales */
static void MoveField(wxDC *DC, int flag);
static char * PrefixText(LibraryEntryStruct * LibEntry, int Unit);
/* Variables locales */
extern int CurrentUnit;
static wxPoint StartCursor;
/* 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_FIELD1,
ID_PANEL_FIELD2,
ID_PANEL_FIELD3,
ID_PANEL_FIELD4,
ID_PANEL_FIELD5,
ID_PANEL_FIELD6,
ID_PANEL_FIELD7,
ID_PANEL_FIELD8,
ID_PANEL_MODULEPCB,
ID_PANEL_SUBSCHEMATIC,
ID_CLOSE_PART_PROPERTIES,
ID_ACCEPT_PART_PROPERTIES,
ID_ADD_ALIAS,
ID_DELETE_ONE_ALIAS,
ID_DELETE_ALL_ALIAS
};
/************************************/
/* class WinEDA_PartPropertiesFrame */
/************************************/
class WinEDA_PartPropertiesFrame: public wxDialog
{
private:
WinEDA_LibeditFrame * m_Parent;
wxNotebook* m_NoteBook;
wxListBox * PartAliasList;
wxPanel * PanelBasic;
wxPanel * PanelAlias;
wxPanel * PanelDoc;
wxPanel * PanelField[NUMBER_OF_FIELDS];
wxCheckBox * AsConvertButt;
wxCheckBox * ShowFieldText[NUMBER_OF_FIELDS];
wxCheckBox * VorientFieldText[NUMBER_OF_FIELDS];
wxCheckBox * ShowPinNumButt;
wxCheckBox * ShowPinNameButt;
wxCheckBox * PinsNameInsideButt;
wxSpinCtrl * SelNumberOfUnits;
wxSpinCtrl * m_SetSkew;
WinEDA_GraphicTextCtrl * FieldTextCtrl[NUMBER_OF_FIELDS];
WinEDA_PositionCtrl * FieldPosition[NUMBER_OF_FIELDS];
int FieldFlags[NUMBER_OF_FIELDS];
int FieldOrient[NUMBER_OF_FIELDS];
WinEDA_EnterText * NewDoc;
WinEDA_EnterText * NewDocfile;
WinEDA_EnterText * NewKeywords;
ListOfAliasStruct * AliasListCopy;
public:
// Constructor and destructor
WinEDA_PartPropertiesFrame(WinEDA_LibeditFrame *parent, wxPoint& pos);
~WinEDA_PartPropertiesFrame()
{
if( AliasListCopy ) AliasListCopy->FreeList();
};
private:
void PartPropertiesAccept(wxCommandEvent& event);
void DeleteAllAliasOfPart();
void DeleteAliasOfPart();
void AddAliasOfPart();
bool ChangeNbUnitsPerPackage(int newUnit);
bool SetUnsetConvert();
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::Close)
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)
END_EVENT_TABLE()
void InstallLibeditFrame(WinEDA_LibeditFrame * parent, wxPoint & pos)
{
WinEDA_PartPropertiesFrame * frame = new WinEDA_PartPropertiesFrame(parent, pos);
frame->ShowModal(); frame->Destroy();
}
WinEDA_PartPropertiesFrame::WinEDA_PartPropertiesFrame(WinEDA_LibeditFrame *parent, wxPoint& framepos):
wxDialog(parent, -1, _("Componant properties"), framepos, wxSize(320, 300),
wxDEFAULT_DIALOG_STYLE | FLOAT_ON_PARENT )
{
wxPoint pos;
wxLayoutConstraints* c;
m_Parent = parent;
SetAutoLayout(TRUE);
Doc[0] = 0; Docfile[0] = 0; Keywords[0] = 0;
AliasListCopy = NULL;
for ( int ii = 0; ii < NUMBER_OF_FIELDS; ii++ )
{
FieldFlags[ii] = 0;
}
if ( CurrentLibEntry )
{
if ( ListAlias ) AliasListCopy = ListAlias->DupList();
if( CurrentLibEntry->Doc )
strncpy(Doc,CurrentLibEntry->Doc, 256);
if( CurrentLibEntry->KeyWord )
strncpy(Keywords,CurrentLibEntry->KeyWord, 256);
if( CurrentLibEntry->DocFile )
strncpy(Docfile,CurrentLibEntry->DocFile, 256);
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;
}
}
m_NoteBook = new wxNotebook(this, ID_LIBEDIT_NOTEBOOK);
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);
m_NoteBook->SetAutoLayout(TRUE);
/* Creation des boutons de commande */
pos.x = 80; pos.y = 240;
wxButton * Button = new wxButton(this, ID_CLOSE_PART_PROPERTIES,
_("Close"), pos);
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 + 10;
Button = new wxButton(this, ID_ACCEPT_PART_PROPERTIES,
_("Ok"), pos);
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
PanelBasic = new wxPanel(m_NoteBook, ID_PANEL_BASIC);
c = new wxLayoutConstraints;
c->left.SameAs(m_NoteBook, wxLeft);
c->right.SameAs(m_NoteBook, wxRight);
c->bottom.SameAs(m_NoteBook, wxBottom);
PanelBasic->SetConstraints(c);
m_NoteBook->AddPage(PanelBasic, _("Options"), TRUE);
pos.x = 5; pos.y = 25;
new wxStaticBox(PanelBasic, -1,_(" General : "), pos, wxSize(150, 120));
pos.x = 10; pos.y += 22;
AsConvertButt = new wxCheckBox(PanelBasic,-1, _("As Convert"), pos);
if ( g_AsDeMorgan ) AsConvertButt->SetValue(TRUE);
pos.y += 20;
ShowPinNumButt = new wxCheckBox(PanelBasic,-1, _("Show Pin Num"), pos);
if ( CurrentLibEntry )
{
if ( CurrentLibEntry->DrawPinNum ) ShowPinNumButt->SetValue(TRUE);
}
else ShowPinNumButt->SetValue(TRUE);
pos.y += 20;
ShowPinNameButt = new wxCheckBox(PanelBasic,-1, _("Show Pin Name"), pos);
if ( CurrentLibEntry )
{
if( CurrentLibEntry->DrawPinName ) ShowPinNameButt->SetValue(TRUE);
}
else ShowPinNameButt->SetValue(TRUE);
pos.y += 20;
PinsNameInsideButt = new wxCheckBox(PanelBasic,-1, _("Pin Name Inside"), pos);
if ( CurrentLibEntry )
{
if ( CurrentLibEntry->TextInside ) PinsNameInsideButt->SetValue(TRUE);
}
else PinsNameInsideButt->SetValue(TRUE);
pos.y += 40;
new wxStaticText(PanelBasic,-1,_("Number of Units:"), pos);
pos.y += 15;
wxString number;
if ( CurrentLibEntry ) number.Printf("%d", CurrentLibEntry->NumOfUnits);
else number = "1";
SelNumberOfUnits = new wxSpinCtrl(PanelBasic,-1,number, pos,
wxDefaultSize, wxSP_ARROW_KEYS | wxSP_WRAP,
1, 16);
pos.y -= 15; pos.x += 140;
new wxStaticText(PanelBasic,-1,_("Skew:"), pos);
pos.y += 15;
if ( CurrentLibEntry && CurrentLibEntry->TextInside)
number.Printf("%d", CurrentLibEntry->TextInside);
else number = "40";
m_SetSkew = new wxSpinCtrl(PanelBasic,-1,number, pos,
wxDefaultSize, wxSP_ARROW_KEYS | wxSP_WRAP,
1, 100);
// Add Panel Documentation
PanelDoc = new wxPanel(m_NoteBook, -1);
c = new wxLayoutConstraints;
c->left.SameAs(m_NoteBook, wxLeft);
c->right.SameAs(m_NoteBook, wxRight);
c->bottom.SameAs(m_NoteBook, wxBottom);
PanelDoc->SetConstraints(c);
m_NoteBook->AddPage(PanelDoc, _("Doc"), FALSE);
pos.x = 5; pos.y = 40;
NewDoc = new WinEDA_EnterText(PanelDoc,
_("Doc:"), Doc,
pos, wxSize(285,-1) );
pos.y += 50;
NewKeywoed = new WinEDA_EnterText(PanelDoc,
_("Keywords:"), Keywords,
pos, wxSize(285,-1) );
pos.y += 50;
NewDocFile = new WinEDA_EnterText(PanelDoc,
_("DocFileName:"), Docfile,
pos, wxSize(285,-1) );
// Add Panel Alias List
PanelAlias = new wxPanel(m_NoteBook, -1);
c = new wxLayoutConstraints;
c->left.SameAs(m_NoteBook, wxLeft);
c->right.SameAs(m_NoteBook, wxRight);
c->bottom.SameAs(m_NoteBook, wxBottom);
PanelAlias->SetConstraints(c);
m_NoteBook->AddPage(PanelAlias, _("Alias"), FALSE);
pos.x = 200; pos.y = 70;
new wxButton(PanelAlias, ID_ADD_ALIAS,
_("Add"), pos);
pos.y += Button->GetDefaultSize().y + 10;
new wxButton(PanelAlias, ID_DELETE_ONE_ALIAS,
_("Delete"), pos);
pos.y += Button->GetDefaultSize().y + 10;
new wxButton(PanelAlias, ID_DELETE_ALL_ALIAS,
_("Delete All"), pos);
pos.x = 5; pos.y = 30;
PartAliasList = new wxListBox(PanelAlias,
-1,
pos, wxSize(160,170),
0,NULL,
wxLB_ALWAYS_SB|wxLB_SINGLE);
wxStaticText * Msg = new wxStaticText(PanelAlias, -1, _("Alias"),
wxPoint(pos.x,pos.y - 20) );
Msg->SetForegroundColour(wxColour(200,0,0) );
/* lecture des alias */
ListOfAliasStruct * Alias = AliasListCopy;
while( Alias )
{
PartAliasList->Append(Alias->m_Name.m_Text);
Alias = Alias->Next;
}
// Add panel Fields
for ( int ii = 0; ii < NUMBER_OF_FIELDS; ii++)
{
PanelField[ii] = new wxPanel(m_NoteBook, ID_PANEL_REFERENCE + ii);
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], PanelText[ii], FALSE);
pos.x = 10; pos.y = 20;
ShowFieldText[ii] = new wxCheckBox(PanelField[ii],-1,
_("Show Text"), pos);
if ( (FieldFlags[ii] & TEXT_NO_VISIBLE ) == 0 )
ShowFieldText[ii]->SetValue(TRUE);
pos.x += 150;
VorientFieldText[ii] = new wxCheckBox(PanelField[ii],-1,
_("Vertical"), pos);
if ( FieldOrient[ii] ) VorientFieldText[ii]->SetValue(TRUE);
pos.x = 10; pos.y += 50;
wxPoint txtpos;
switch ( ii )
{
case REFERENCE:
if ( CurrentLibEntry )
txtpos = CurrentLibEntry->m_Prefix.m_Pos;
else txtpos = wxPoint(0,0);
FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( PanelField[ii],
PanelText[ii],
CurrentLibEntry ? CurrentLibEntry->m_Prefix.m_Text : (char*) "U",
CurrentLibEntry ? CurrentLibEntry->m_Prefix.m_Size : 50,
UnitMetric ,
pos, 200, TRUE);
FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii],
txtpos,
UnitMetric , wxPoint (pos.x + 150, pos.y + 32) );
break;
case VALUE:
if ( CurrentLibEntry )
txtpos = CurrentLibEntry->m_Name.m_Pos;
else txtpos = wxPoint(0,0);
FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( PanelField[ii],
PanelText[ii],
CurrentLibEntry ? CurrentLibEntry->m_Name.m_Text : NULL,
CurrentLibEntry ? CurrentLibEntry->m_Name.m_Size : 50,
UnitMetric ,
pos, 200, TRUE);
FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii],
txtpos,
UnitMetric , wxPoint (pos.x + 150, pos.y + 32) );
break;
default:
int fsize; char * ftext; wxPoint fpos;
fsize = 50; ftext = NULL;
LibDrawField * 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; ftext = Field->m_Text;
fpos = Field->m_Pos;
break;
}
Field = (LibDrawField*)Field->Pnext;
}
}
FieldTextCtrl[ii] = new WinEDA_GraphicTextCtrl( PanelField[ii],
PanelText[ii],
ftext, fsize,
UnitMetric ,
pos, 200, TRUE);
FieldPosition[ii] = new WinEDA_PositionCtrl( PanelField[ii],
fpos,
UnitMetric , wxPoint (pos.x + 150, pos.y + 32) );
break;
}
}
SetModal(TRUE);
}
/***************************************************************************/
/* WinEDA_PartPropertiesFrame::PartPropertiesAccept(wxCommandEvent& event) */
/***************************************************************************/
/* Met a jour les differents parametres pour le composant en cours d'édition
*/
void WinEDA_PartPropertiesFrame::PartPropertiesAccept(wxCommandEvent& event)
{
bool recreateTB = FALSE;
if( CurrentLibEntry == NULL )
{
Close(); return;
}
m_Parent->CurrentScreen->SetModify();
m_Parent->CurrentScreen->SetRefreshReq();
if( ListAlias ) ListAlias->FreeList();
if( AliasListCopy ) ListAlias = AliasListCopy->DupList();
if( CurrentLibEntry->Doc && strcmp(Doc,CurrentLibEntry->Doc) )
{
free(CurrentLibEntry->Doc); CurrentLibEntry->Doc = NULL;
}
if( strlen(Doc) )CurrentLibEntry->Doc = strdup(Doc);
if( CurrentLibEntry->KeyWord && strcmp(Keywords,CurrentLibEntry->KeyWord) )
{
free(CurrentLibEntry->KeyWord); CurrentLibEntry->KeyWord = NULL;
}
if( strlen(Keywords) ) CurrentLibEntry->KeyWord = strdup(Keywords);
if( CurrentLibEntry->DocFile && strcmp(Docfile,CurrentLibEntry->DocFile) )
{
free(CurrentLibEntry->DocFile); CurrentLibEntry->DocFile = NULL;
}
if( strlen(Docfile) ) CurrentLibEntry->DocFile = strdup(Docfile);
CurrentLibEntry->m_Prefix.SetText( (char*)FieldTextCtrl[REFERENCE]->GetText() );
CurrentLibEntry->m_Name.SetText( (char*)FieldTextCtrl[VALUE]->GetText() );
CurrentLibEntry->m_Prefix.m_Size = FieldTextCtrl[REFERENCE]->GetTextSize();
CurrentLibEntry->m_Name.m_Size = FieldTextCtrl[VALUE]->GetTextSize();
CurrentLibEntry->m_Prefix.m_Pos = FieldPosition[REFERENCE]->GetCoord();
CurrentLibEntry->m_Name.m_Pos = FieldPosition[VALUE]->GetCoord();
CurrentLibEntry->m_Prefix.m_Orient = VorientFieldText[REFERENCE]->GetValue() ? 1 : 0;
CurrentLibEntry->m_Name.m_Orient = VorientFieldText[VALUE]->GetValue() ? 1 : 0;
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 ( int ii = FIELD1; 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->SetText((char*) FieldTextCtrl[ii]->GetText());
Field->m_Size = FieldTextCtrl[ii]->GetTextSize();
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[Field->m_FieldId]->GetCoord();
if( Field->m_Text == NULL )
{
delete Field;
if ( previousField ) previousField->Pnext = NextField;
else CurrentLibEntry->Fields = NextField;
}
break;
}
previousField = Field;
Field = NextField;
}
if ( (Field == NULL) && strlen(FieldTextCtrl[ii]->GetText()) )
{ // N'existe pas: a creer
Field = new LibDrawField(ii);
Field->SetText((char*) FieldTextCtrl[ii]->GetText());
Field->m_Size = FieldTextCtrl[ii]->GetTextSize();
Field->Pnext = CurrentLibEntry->Fields;
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]->GetCoord();
CurrentLibEntry->Fields = Field;
}
}
int ii = SelNumberOfUnits->GetValue();
if ( ChangeNbUnitsPerPackage(ii) ) recreateTB = TRUE;
if ( AsConvertButt->GetValue() )
{
if ( ! g_AsDeMorgan )
{
g_AsDeMorgan = 1;
if ( SetUnsetConvert() ) recreateTB = TRUE;
}
}
else
{
if ( g_AsDeMorgan )
{
g_AsDeMorgan = 0;
if ( SetUnsetConvert() ) recreateTB = TRUE;
}
}
CurrentLibEntry->DrawPinNum = ShowPinNumButt->GetValue() ? 1 : 0;
CurrentLibEntry->DrawPinName = ShowPinNameButt->GetValue() ? 1 : 0;
if ( PinsNameInsideButt->GetValue() == FALSE)
CurrentLibEntry->TextInside = 0;
else
CurrentLibEntry->TextInside = m_SetSkew->GetValue();
if ( recreateTB) m_Parent->ReCreateHToolbar();
Close();
}
/***************************************************************/
/* void WinEDA_PartPropertiesFrame::DeleteAllAliasOfPart() */
/***************************************************************/
void WinEDA_PartPropertiesFrame::DeleteAllAliasOfPart()
{
if(CurrentLibEntry && AliasListCopy )
{
if( confirmation(_("Ok to Delete Alias LIST")) == YES)
{
if( AliasListCopy ) AliasListCopy->FreeList();
AliasListCopy = NULL;
PartAliasList->Clear();
}
}
}
/*********************************************************/
/* void WinEDA_PartPropertiesFrame::AddAliasOfPart() */
/*********************************************************/
void WinEDA_PartPropertiesFrame::AddAliasOfPart()
{
char Line[LINE_LEN];
int llen;
ListOfAliasStruct * NewAlias;
if(CurrentLibEntry == NULL) return;
*Line = 0;
if( Get_Message(_("Alias:"),Line, this) != 0 ) return;
ChangeSpaces(Line, '_');
llen = strlen(Line) + 1;
NewAlias = LocateAlias(AliasListCopy, Line);
if ( NewAlias )
{
DisplayError(_("Already in use"), 10); return;
}
NewAlias = new ListOfAliasStruct(Line);
NewAlias->Next = AliasListCopy;
AliasListCopy = NewAlias;
/* affichage des alias */
PartAliasList->Clear();
ListOfAliasStruct * Alias = AliasListCopy;
while( Alias )
{
PartAliasList->Append(Alias->m_Name.m_Text);
Alias = Alias->Next;
}
}
/********************************/
/* void DeleteAliasOfPart() */
/********************************/
void WinEDA_PartPropertiesFrame::DeleteAliasOfPart()
{
ListOfAliasStruct * Alias;
wxString aliasname;
if(CurrentLibEntry == NULL) return;
if ( AliasListCopy == NULL ) return;
aliasname = PartAliasList->GetStringSelection();
if ( aliasname == "" ) return;
Alias = AliasListCopy;
ListOfAliasStruct * Previous = NULL;
while ( Alias )
{
if ( stricmp(aliasname.GetData(), Alias->m_Name.m_Text) == 0 )
{
if ( Previous ) Previous->Next = Alias->Next;
else AliasListCopy = Alias->Next;
delete Alias;
break;
}
Previous = Alias;
Alias = Alias->Next;
}
/* affichage des alias */
PartAliasList->Clear();
Alias = AliasListCopy;
while( Alias )
{
PartAliasList->Append(Alias->m_Name.m_Text);
Alias = Alias->Next;
}
}
/************************************************************/
static void ExitMoveField(WinEDA_DrawFrame * frame, wxDC * DC)
/************************************************************/
{
frame->CurrentScreen->ManageCurseur = NULL;
frame->CurrentScreen->ForceCloseManageCurseur = NULL;
if(CurrentDrawItem == NULL) return;
wxPoint curpos;
curpos = frame->CurrentScreen->Curseur;
frame->CurrentScreen->Curseur = StartCursor;
MoveField(DC, 1);
frame->CurrentScreen->Curseur = curpos;
CurrentDrawItem->m_Flags = 0;
CurrentDrawItem = NULL;
}
/*********************************************/
/* static void StartMoveField(COMMAND * Cmd) */
/*********************************************/
/* Initialise le deplacement d'un champ ( ref ou Name) */
void WinEDA_LibeditFrame::StartMoveField(wxDC * DC, LibDrawField *field)
{
if( (CurrentLibEntry == NULL) || ( field == NULL ) ) return;
CurrentDrawItem = field;
CurrentDrawItem->m_Flags |= IS_MOVED;
CurrentScreen->ManageCurseur = MoveField;
CurrentScreen->ForceCloseManageCurseur = ExitMoveField;
CurrentScreen->ManageCurseur(DC, 1);
StartCursor = CurrentScreen->Curseur;
}
/*****************************************************************/
/* Routine d'affichage du texte 'Field' en cours de deplacement. */
/* Routine normalement attachee au curseur */
/*****************************************************************/
static void MoveField(wxDC *DC, int flag)
{
int color;
LibDrawField *Field = (LibDrawField *)CurrentDrawItem;
if( (CurrentLibEntry == NULL) || (Field == NULL) ) return;
GRSetDrawMode(DC, XOR_MODE);
switch (Field->m_FieldId)
{
case VALUE:
color = ReturnLayerColor(LAYER_VALUEPART);
break;
case REFERENCE:
color = ReturnLayerColor(LAYER_REFERENCEPART);
break;
default:
color = ReturnLayerColor(LAYER_FIELDS);
break;
}
if( Field->m_Attributs & TEXT_NO_VISIBLE ) color = DARKGRAY;
if( flag >= 0 )
Gr_E_texte(DC, Field->m_Pos.x, - Field->m_Pos.y,
color, Field->m_Text,
Field->m_Orient, Field->m_Size,
GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER);
Field->m_Pos.x = ActiveScreen->Curseur.x;
Field->m_Pos.y = - ActiveScreen->Curseur.y;
Gr_E_texte(DC, Field->m_Pos.x, - Field->m_Pos.y,
color, Field->m_Text,
Field->m_Orient, Field->m_Size,
GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER);
}
/********************************/
/* static void PlaceField() */
/********************************/
void WinEDA_LibeditFrame::PlaceField(wxDC * DC, LibDrawField *Field)
{
int color;
if(Field == NULL ) return;
GRSetDrawMode(DC, GR_DEFAULT_DRAWMODE);
switch (Field->m_FieldId)
{
case REFERENCE:
color = ReturnLayerColor(LAYER_REFERENCEPART);
break;
case VALUE:
color = ReturnLayerColor(LAYER_VALUEPART);
break;
default:
color = ReturnLayerColor(LAYER_FIELDS);
break;
}
if( Field->m_Attributs & TEXT_NO_VISIBLE ) color = DARKGRAY;
Gr_E_texte(DC, Field->m_Pos.x, - Field->m_Pos.y,
color, Field->m_Text,
Field->m_Orient, Field->m_Size,
GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER);
Field->m_Flags = 0;
CurrentScreen->SetModify();
CurrentScreen->ManageCurseur = NULL;
CurrentScreen->ForceCloseManageCurseur = NULL;
CurrentDrawItem = NULL;
}
/****************************************/
/* static void EditField(COMMAND * Cmd) */
/****************************************/
void WinEDA_LibeditFrame::EditField(wxDC * DC, LibDrawField *Field)
{
char Text[LINE_LEN];
int color;
wxClientDC dc(DrawPanel);
if( Field== NULL) return;
switch (Field->m_FieldId)
{
case REFERENCE:
color = ReturnLayerColor(LAYER_REFERENCEPART);
break;
case VALUE:
color = ReturnLayerColor(LAYER_VALUEPART);
break;
default:
color = ReturnLayerColor(LAYER_FIELDS);
break;
}
*Text = 0;
if( Field->m_Attributs & TEXT_NO_VISIBLE ) color = DARKGRAY;
if (Field->m_Text) strcpy(Text,Field->m_Text);
Get_Message(_("Text: "),Text, this);
ChangeSpaces(Text, '_');
GRSetDrawMode(&dc, XOR_MODE);
Gr_E_texte(DC, Field->m_Pos.x, - Field->m_Pos.y,
color, Field->m_Text,
Field->m_Orient, Field->m_Size,
GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER);
Field->SetText(Text);
if( Field->m_Flags == 0 ) GRSetDrawMode(&dc, GR_DEFAULT_DRAWMODE);
Gr_E_texte(DC, Field->m_Pos.x, - Field->m_Pos.y,
color, Field->m_Text,
Field->m_Orient, Field->m_Size,
GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER);
CurrentScreen->SetModify();
}
/*******************************************************************/
void WinEDA_LibeditFrame::RotateField(wxDC * DC, LibDrawField *Field)
/*******************************************************************/
/*
Routine de modification de l'orientation ( Horiz ou Vert. ) du champ.
si un champ est en cours d'edition, modif de celui ci.
sinon Modif du champ pointe par la souris
*/
{
int color;
if( Field == NULL) return;
CurrentScreen->SetModify();
switch (Field->m_FieldId)
{
case REFERENCE:
color = ReturnLayerColor(LAYER_REFERENCEPART);
break;
case VALUE:
color = ReturnLayerColor(LAYER_VALUEPART);
break;
default:
color = ReturnLayerColor(LAYER_FIELDS);
break;
}
if( Field->m_Attributs & TEXT_NO_VISIBLE ) color = DARKGRAY;
GRSetDrawMode(DC, XOR_MODE);
Gr_E_texte(DC, Field->m_Pos.x, - Field->m_Pos.y,
color, Field->m_Text,
Field->m_Orient, Field->m_Size,
GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER);
if( Field->m_Orient) Field->m_Orient = 0;
else Field->m_Orient = 1;
if( Field->m_Flags == 0 ) GRSetDrawMode(DC, GR_DEFAULT_DRAWMODE);
Gr_E_texte(DC, Field->m_Pos.x, - Field->m_Pos.y,
color, Field->m_Text,
Field->m_Orient, Field->m_Size,
GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER);
}
/********************************************************/
/* static int LocateField(LibraryEntryStruct *LibEntry) */
/********************************************************/
/* Localise le champ (ref ou name) pointe par la souris
retourne:
< 0: Pas de champ
0: Ref
1: Name(s)
> 2 = Num Field
*/
LibDrawField * WinEDA_LibeditFrame::LocateField(LibraryEntryStruct *LibEntry)
{
int x0, y0, x1, y1; /* Rectangle d'encadrement des textes a localiser */
int dx, dy; /* Dimensions du texte */
LibDrawField *Field;
/* Localisation du Nom */
x0 = LibEntry->m_Name.m_Pos.x;
y0 = - LibEntry->m_Name.m_Pos.y;
dx = LibEntry->m_Name.m_Size * strlen(LibEntry->m_Name.m_Text),
dy = LibEntry->m_Name.m_Size;
if (LibEntry->m_Name.m_Orient) EXCHG(dx, dy);
x0 -= dx/2; y0 -= dy/2;
x1 = x0 + dx; y1 = y0 + dy;
if( (CurrentScreen->Curseur.x >= x0) && ( CurrentScreen->Curseur.x <= x1) &&
(CurrentScreen->Curseur.y >= y0) && ( CurrentScreen->Curseur.y <= y1) )
return &LibEntry->m_Name;
/* Localisation du Prefix */
x0 = LibEntry->m_Prefix.m_Pos.x;
y0 = - LibEntry->m_Prefix.m_Pos.y;
dx = LibEntry->m_Prefix.m_Size * strlen(LibEntry->m_Prefix.m_Text),
dy = LibEntry->m_Prefix.m_Size;
if (LibEntry->m_Prefix.m_Orient) EXCHG(dx, dy);
x0 -= dx/2; y0 -= dy/2;
x1 = x0 + dx; y1 = y0 + dy;
if( (CurrentScreen->Curseur.x >= x0) && ( CurrentScreen->Curseur.x <= x1) &&
(CurrentScreen->Curseur.y >= y0) && ( CurrentScreen->Curseur.y <= y1) )
return &LibEntry->m_Prefix;
/* Localisation des autres fields */
for (Field = LibEntry->Fields; Field != NULL;
Field = (LibDrawField*)Field->Pnext)
{
if ( Field->m_Text == NULL) continue;
x0 = Field->m_Pos.x; y0 = - Field->m_Pos.y;
dx = Field->m_Size * strlen(Field->m_Text),
dy = Field->m_Size;
if (Field->m_Orient) EXCHG(dx, dy);
x0 -= dx/2; y0 -= dy/2;
x1 = x0 + dx; y1 = y0 + dy;
if( (CurrentScreen->Curseur.x >= x0) && ( CurrentScreen->Curseur.x <= x1) &&
(CurrentScreen->Curseur.y >= y0) && ( CurrentScreen->Curseur.y <= y1) )
return(Field);
}
return NULL;
}
/*********************************************************************/
/* static char * PrefixText(LibraryEntryStruct * LibEntry, int Unit) */
/*********************************************************************/
/* Calcule l'affichage complet du prefixe ( texte + '?' + ident unit )
Retourne un pointeur sur le nouveau texte (allocation statique)
*/
static char * PrefixText(LibraryEntryStruct * LibEntry, int Unit)
{
static char Text[LINE_LEN];
if (LibEntry->NumOfUnits > 1)
sprintf(Text,"%s?%c",LibEntry->m_Prefix.m_Text,Unit + 'A' - 1);
else sprintf(Text,"%s?",LibEntry->m_Prefix.m_Text);
return( Text );
}
/*****************************************************************/
/* void WinEDA_PartPropertiesFrame::ChangeNbUnitsPerPackagevoid) */
/*****************************************************************/
/* Routine de modification du nombre d'unites par package pour le
composant courant;
*/
bool WinEDA_PartPropertiesFrame::ChangeNbUnitsPerPackage(int MaxUnit)
{
int OldNumUnits, ii, FlagDel = -1;
LibEDA_BaseStruct* DrawItem, * NextDrawItem;
if( CurrentLibEntry == NULL ) return FALSE;
/* Si pas de changement: termine */
if ( CurrentLibEntry->NumOfUnits == MaxUnit ) return FALSE;
OldNumUnits = CurrentLibEntry->NumOfUnits;
if ( OldNumUnits < 1 ) OldNumUnits = 1;
CurrentLibEntry->NumOfUnits = MaxUnit;
/* Traitement des unites enlevees ou rajoutees */
if(OldNumUnits > CurrentLibEntry->NumOfUnits )
{
DrawItem = CurrentLibEntry->Drawings;
for ( ; DrawItem != NULL; DrawItem = NextDrawItem)
{
NextDrawItem = DrawItem->Pnext;
if( DrawItem->m_Unit > MaxUnit ) /* Item a effacer */
{
if( FlagDel < 0 )
{
if( confirmation(_("Delete units")) == YES )
{
/* Si part selectee n'existe plus: selection 1ere unit */
if( CurrentUnit > MaxUnit ) CurrentUnit = 1;
FlagDel = 1;
}
else
{
FlagDel = 0;
MaxUnit = OldNumUnits;
CurrentLibEntry->NumOfUnits = MaxUnit;
return FALSE;
}
}
DeleteOneLibraryDrawStruct(NULL, CurrentLibEntry,
DrawItem, 0);
}
}
return TRUE;
}
if(OldNumUnits < CurrentLibEntry->NumOfUnits )
{
DrawItem = CurrentLibEntry->Drawings;
for ( ; DrawItem != NULL; DrawItem = DrawItem->Pnext )
{
/* Duplication des items pour autres elements */
if( DrawItem->m_Unit == 1 )
{
for ( ii = OldNumUnits +1; ii <= MaxUnit; ii ++ )
{
NextDrawItem = CopyDrawEntryStruct(DrawItem);
NextDrawItem->Pnext = CurrentLibEntry->Drawings;
CurrentLibEntry->Drawings = NextDrawItem;
NextDrawItem->m_Unit = ii;
}
}
}
}
return TRUE;
}
/**********************************************************/
/* void WinEDA_PartPropertiesFrame::SetUnsetConvert() */
/**********************************************************/
/* crée ou efface (selon option AsConvert) les éléments
de la représentation convertie d'un composant
*/
bool WinEDA_PartPropertiesFrame::SetUnsetConvert()
{
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->Drawings;
for ( ; DrawItem != NULL; DrawItem = DrawItem->Pnext )
{
/* Duplication des items pour autres elements */
if( DrawItem->Type() != PIN_DRAW_TYPE ) continue;
if( DrawItem->m_Convert == 1 )
{
if( FlagDel == 0 )
{
if( confirmation(_("Create pins for Convert items")) == YES )
FlagDel = 1;
else
{
if( confirmation(_("Part as \"De Morgan\" anymore")) == YES )
return TRUE;
g_AsDeMorgan = 0; return FALSE;
}
}
NextDrawItem = CopyDrawEntryStruct(DrawItem);
NextDrawItem->Pnext = CurrentLibEntry->Drawings;
CurrentLibEntry->Drawings = NextDrawItem;
NextDrawItem->m_Convert = 2;
}
}
}
else /* Representation convertie a supprimer */
{
/* Traitement des elements à supprimer */
if( CurrentLibEntry ) DrawItem = CurrentLibEntry->Drawings;
for ( ; DrawItem != NULL; DrawItem = NextDrawItem)
{
NextDrawItem = DrawItem->Pnext;
if( DrawItem->m_Convert > 1 ) /* Item a effacer */
{
if( FlagDel == 0 )
{
if( confirmation(_("Delete Convert items")) == YES )
{
CurrentConvert = 1;
FlagDel = 1;
}
else
{
g_AsDeMorgan = 1;
return FALSE;
}
}
ActiveScreen->SetModify();
DeleteOneLibraryDrawStruct(NULL, CurrentLibEntry, DrawItem, 0);
}
}
}
return TRUE;
}