/*********************************************************************/ /* 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; }