diff options
Diffstat (limited to 'eeschema/dialogs/dialog_edit_component_in_lib.cpp')
-rw-r--r-- | eeschema/dialogs/dialog_edit_component_in_lib.cpp | 579 |
1 files changed, 579 insertions, 0 deletions
diff --git a/eeschema/dialogs/dialog_edit_component_in_lib.cpp b/eeschema/dialogs/dialog_edit_component_in_lib.cpp new file mode 100644 index 0000000..d7c58a2 --- /dev/null +++ b/eeschema/dialogs/dialog_edit_component_in_lib.cpp @@ -0,0 +1,579 @@ +/** + * @file dialog_edit_component_in_lib.cpp + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <fctsys.h> +#include <kiway.h> +#include <common.h> +#include <confirm.h> +#include <gestfich.h> +#include <pgm_base.h> + +#include <general.h> +#include <libeditframe.h> +#include <class_library.h> +#include <eeschema_id.h> // for ID_POPUP_SCH_SELECT_UNIT_CMP_MAX and ID_POPUP_SCH_SELECT_UNIT1 + +#include <dialog_edit_component_in_lib.h> + +int DIALOG_EDIT_COMPONENT_IN_LIBRARY::m_lastOpenedPage = 0; + +DIALOG_EDIT_COMPONENT_IN_LIBRARY::DIALOG_EDIT_COMPONENT_IN_LIBRARY( LIB_EDIT_FRAME* aParent ): + DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( aParent ) +{ + m_Parent = aParent; + m_RecreateToolbar = false; + + initDlg(); + + FixOSXCancelButtonIssue(); + + // Now all widgets have the size fixed, call FinishDialogSettings + FinishDialogSettings(); +} + + +DIALOG_EDIT_COMPONENT_IN_LIBRARY::~DIALOG_EDIT_COMPONENT_IN_LIBRARY() +{ + m_lastOpenedPage = m_NoteBook->GetSelection( ); +} + +/* Initialize state of check boxes and texts +*/ +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::initDlg() +{ + m_AliasLocation = -1; + + LIB_PART* component = m_Parent->GetCurPart(); + + if( component == NULL ) + { + SetTitle( _( "Library Component Properties" ) ); + return; + } + + wxString title; + bool isRoot = m_Parent->GetAliasName().CmpNoCase( component->GetName() ) == 0; + + if( !isRoot ) + { + title.Printf( _( "Properties for %s (alias of %s)" ), + GetChars( m_Parent->GetAliasName() ), + GetChars( component->GetName() ) ); + } + else + title.Printf( _( "Properties for %s" ), GetChars( component->GetName() ) ); + + SetTitle( title ); + InitPanelDoc(); + InitBasicPanel(); + + if( isRoot && component->GetAliasCount() == 1 ) + m_ButtonDeleteAllAlias->Enable( false ); + + /* Place list of alias names in listbox */ + m_PartAliasListCtrl->Append( component->GetAliasNames( false ) ); + + if( component->GetAliasCount() <= 1 ) + { + m_ButtonDeleteAllAlias->Enable( false ); + m_ButtonDeleteOneAlias->Enable( false ); + } + + /* Read the Footprint Filter list */ + m_FootprintFilterListBox->Append( component->GetFootPrints() ); + + if( component->GetFootPrints().GetCount() == 0 ) + { + m_ButtonDeleteAllFootprintFilter->Enable( false ); + m_ButtonDeleteOneFootprintFilter->Enable( false ); + m_buttonEditOneFootprintFilter->Enable( false ); + } + + m_NoteBook->SetSelection( m_lastOpenedPage ); + + m_stdSizerButtonOK->SetDefault(); +} + + +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnCancelClick( wxCommandEvent& event ) +{ + EndModal( wxID_CANCEL ); +} + + + +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::InitPanelDoc() +{ + LIB_ALIAS* alias; + LIB_PART* component = m_Parent->GetCurPart(); + + if( component == NULL ) + return; + + wxString aliasname = m_Parent->GetAliasName(); + + if( aliasname.IsEmpty() ) + return; + + alias = component->GetAlias( aliasname ); + + if( alias != NULL ) + { + m_DocCtrl->SetValue( alias->GetDescription() ); + m_KeywordsCtrl->SetValue( alias->GetKeyWords() ); + m_DocfileCtrl->SetValue( alias->GetDocFileName() ); + } +} + + +/* + * create the basic panel for component properties editing + */ +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::InitBasicPanel() +{ + LIB_PART* component = m_Parent->GetCurPart(); + + if( m_Parent->GetShowDeMorgan() ) + m_AsConvertButt->SetValue( true ); + + int maxUnits = ID_POPUP_SCH_SELECT_UNIT_CMP_MAX - ID_POPUP_SCH_SELECT_UNIT1; + m_SelNumberOfUnits->SetRange (1, maxUnits ); + + m_staticTextNbUnits->SetLabel( wxString::Format( + _( "Number of Units (max allowed %d)" ), maxUnits ) ); + + + /* Default values for a new component. */ + if( component == NULL ) + { + m_ShowPinNumButt->SetValue( true ); + m_ShowPinNameButt->SetValue( true ); + m_PinsNameInsideButt->SetValue( true ); + m_SelNumberOfUnits->SetValue( 1 ); + m_SetSkew->SetValue( 40 ); + m_OptionPower->SetValue( false ); + m_OptionPartsLocked->SetValue( false ); + return; + } + + m_ShowPinNumButt->SetValue( component->ShowPinNumbers() ); + m_ShowPinNameButt->SetValue( component->ShowPinNames() ); + m_PinsNameInsideButt->SetValue( component->GetPinNameOffset() != 0 ); + m_SelNumberOfUnits->SetValue( component->GetUnitCount() ); + m_SetSkew->SetValue( component->GetPinNameOffset() ); + m_OptionPower->SetValue( component->IsPower() ); + m_OptionPartsLocked->SetValue( component->UnitsLocked() && component->GetUnitCount() > 1 ); +} + + +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnOkClick( wxCommandEvent& event ) +{ + /* Update the doc, keyword and doc filename strings */ + LIB_ALIAS* alias; + LIB_PART* component = m_Parent->GetCurPart(); + + if( component == NULL ) + { + EndModal( wxID_CANCEL ); + return; + } + + m_Parent->SaveCopyInUndoList( component ); + + alias = component->GetAlias( m_Parent->GetAliasName() ); + + wxCHECK_RET( alias != NULL, + wxT( "Alias \"" ) + m_Parent->GetAliasName() + wxT( "\" of component \"" ) + + component->GetName() + wxT( "\" does not exist." ) ); + + alias->SetDescription( m_DocCtrl->GetValue() ); + alias->SetKeyWords( m_KeywordsCtrl->GetValue() ); + alias->SetDocFileName( m_DocfileCtrl->GetValue() ); + + component->SetAliases( m_PartAliasListCtrl->GetStrings() ); + + int unitCount = m_SelNumberOfUnits->GetValue(); + ChangeNbUnitsPerPackage( unitCount ); + + if( m_AsConvertButt->GetValue() ) + { + if( !m_Parent->GetShowDeMorgan() ) + { + m_Parent->SetShowDeMorgan( true ); + SetUnsetConvert(); + } + } + else + { + if( m_Parent->GetShowDeMorgan() ) + { + m_Parent->SetShowDeMorgan( false ); + SetUnsetConvert(); + } + } + + component->SetShowPinNumbers( m_ShowPinNumButt->GetValue() ); + component->SetShowPinNames( m_ShowPinNameButt->GetValue() ); + + if( m_PinsNameInsideButt->GetValue() == false ) + component->SetPinNameOffset( 0 ); // pin text outside the body (name is on the pin) + else + { + component->SetPinNameOffset( m_SetSkew->GetValue() ); + // Ensure component->m_TextInside != 0, because the meaning is "text outside". + if( component->GetPinNameOffset() == 0 ) + component->SetPinNameOffset( 20 ); // give a reasonnable value + } + + if( m_OptionPower->GetValue() == true ) + component->SetPower(); + else + component->SetNormal(); + + /* Set the option "Units locked". + * Obviously, cannot be true if there is only one part */ + component->LockUnits( m_OptionPartsLocked->GetValue() ); + + if( component->GetUnitCount() <= 1 ) + component->LockUnits( false ); + + /* Update the footprint filter list */ + component->GetFootPrints().Clear(); + component->GetFootPrints() = m_FootprintFilterListBox->GetStrings(); + + EndModal( wxID_OK ); +} + + +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::CopyDocFromRootToAlias( wxCommandEvent& event ) +{ + if( m_Parent == NULL ) + return; + + LIB_ALIAS* parent_alias; + LIB_PART* component = m_Parent->GetCurPart(); + + if( component == NULL ) + return; + + // search for the main alias: this is the first alias in alias list + // something like the main component + parent_alias = component->GetAlias( 0 ); + + if( parent_alias == NULL ) // Should never occur (bug) + return; + + m_DocCtrl->SetValue( parent_alias->GetDescription() ); + m_DocfileCtrl->SetValue( parent_alias->GetDocFileName() ); + m_KeywordsCtrl->SetValue( parent_alias->GetKeyWords() ); +} + + +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAllAliasOfPart( wxCommandEvent& event ) +{ + if( m_PartAliasListCtrl->FindString( m_Parent->GetAliasName() ) != wxNOT_FOUND ) + { + wxString msg; + msg.Printf( _( "Alias <%s> cannot be removed while it is being edited!" ), + GetChars( m_Parent->GetAliasName() ) ); + DisplayError( this, msg ); + return; + } + + if( IsOK( this, _( "Remove all aliases from list?" ) ) ) + { + m_PartAliasListCtrl->Clear(); + m_ButtonDeleteAllAlias->Enable( false ); + m_ButtonDeleteOneAlias->Enable( false ); + } +} + + +/* Add a new name to the alias list box + * New name cannot be the root name, and must not exists + */ +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddAliasOfPart( wxCommandEvent& event ) +{ + wxString aliasname; + LIB_PART* component = m_Parent->GetCurPart(); + PART_LIB* library = m_Parent->GetCurLib(); + + if( component == NULL ) + return; + + wxTextEntryDialog dlg( this, _( "New alias:" ), _( "Component Alias" ), aliasname ); + + if( dlg.ShowModal() != wxID_OK ) + return; // cancelled by user + + aliasname = dlg.GetValue( ); + + aliasname.Replace( wxT( " " ), wxT( "_" ) ); + if( aliasname.IsEmpty() ) + return; + + if( m_PartAliasListCtrl->FindString( aliasname ) != wxNOT_FOUND ) + { + wxString msg; + msg.Printf( _( "Alias or component name <%s> already in use." ), + GetChars( aliasname ) ); + DisplayError( this, msg ); + return; + } + + if( library && library->FindEntry( aliasname ) != NULL ) + { + wxString msg; + msg.Printf( _( "Alias or component name <%s> already exists in library <%s>." ), + GetChars( aliasname ), + GetChars( library->GetName() ) ); + DisplayError( this, msg ); + return; + } + + m_PartAliasListCtrl->Append( aliasname ); + + if( m_Parent->GetAliasName().CmpNoCase( component->GetName() ) == 0 ) + m_ButtonDeleteAllAlias->Enable( true ); + + m_ButtonDeleteOneAlias->Enable( true ); +} + + +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAliasOfPart( wxCommandEvent& event ) +{ + wxString aliasname = m_PartAliasListCtrl->GetStringSelection(); + + if( aliasname.IsEmpty() ) + return; + + if( aliasname.CmpNoCase( m_Parent->GetAliasName() ) == 0 ) + { + wxString msg; + msg.Printf( _( "Alias <%s> cannot be removed while it is being edited!" ), + GetChars( aliasname ) ); + DisplayError( this, msg ); + return; + } + + m_PartAliasListCtrl->Delete( m_PartAliasListCtrl->GetSelection() ); + LIB_PART* component = m_Parent->GetCurPart(); + + if( component ) + component->RemoveAlias( aliasname ); + + if( m_PartAliasListCtrl->IsEmpty() ) + { + m_ButtonDeleteAllAlias->Enable( false ); + m_ButtonDeleteOneAlias->Enable( false ); + } +} + + +/* + * Change the number of parts per package. + */ +bool DIALOG_EDIT_COMPONENT_IN_LIBRARY::ChangeNbUnitsPerPackage( int MaxUnit ) +{ + LIB_PART* part = m_Parent->GetCurPart(); + + if( !part || part->GetUnitCount() == MaxUnit || MaxUnit < 1 ) + return false; + + if( MaxUnit < part->GetUnitCount() + && !IsOK( this, _( "Delete extra parts from component?" ) ) ) + return false; + + part->SetUnitCount( MaxUnit ); + return true; +} + + +/* + * Set or clear the component alternate body style ( DeMorgan ). + */ +bool DIALOG_EDIT_COMPONENT_IN_LIBRARY::SetUnsetConvert() +{ + LIB_PART* component = m_Parent->GetCurPart(); + + if( component == NULL || ( m_Parent->GetShowDeMorgan() == component->HasConversion() ) ) + return false; + + if( m_Parent->GetShowDeMorgan() ) + { + if( !IsOK( this, _( "Add new pins for alternate body style ( DeMorgan ) to component?" ) ) ) + return false; + } + else if( component->HasConversion() ) + { + if( !IsOK( this, _( "Delete alternate body style (DeMorgan) draw items from component?" ) ) ) + { + m_Parent->SetShowDeMorgan( true ); + return false; + } + } + + component->SetConversion( m_Parent->GetShowDeMorgan() ); + m_Parent->OnModify(); + + return true; +} + + +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::BrowseAndSelectDocFile( wxCommandEvent& event ) +{ + PROJECT& prj = Prj(); + SEARCH_STACK* search = prj.SchSearchS(); + + wxString mask = wxT( "*" ); + wxString docpath = prj.GetRString( PROJECT::DOC_PATH ); + + if( !docpath ) + docpath = search->LastVisitedPath( wxT( "doc" ) ); + + wxString fullFileName = EDA_FILE_SELECTOR( _( "Doc Files" ), + docpath, + wxEmptyString, + wxEmptyString, + mask, + this, + wxFD_OPEN, + true ); + if( fullFileName.IsEmpty() ) + return; + + /* If the path is already in the library search paths + * list, just add the library name to the list. Otherwise, add + * the library name with the full or relative path. + * the relative path, when possible is preferable, + * because it preserve use of default libraries paths, when the path is a sub path of + * these default paths + */ + wxFileName fn = fullFileName; + + prj.SetRString( PROJECT::DOC_PATH, fn.GetPath() ); + + wxString filename = search->FilenameWithRelativePathInSearchList( + fullFileName, wxPathOnly( Prj().GetProjectFullName() ) ); + + // Filenames are always stored in unix like mode, ie separator "\" is stored as "/" + // to ensure files are identical under unices and windows +#ifdef __WINDOWS__ + filename.Replace( wxT( "\\" ), wxT( "/" ) ); +#endif + m_DocfileCtrl->SetValue( filename ); +} + + +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteAllFootprintFilter( wxCommandEvent& event ) +{ + if( IsOK( this, _( "OK to delete the footprint filter list ?" ) ) ) + { + m_FootprintFilterListBox->Clear(); + m_ButtonDeleteAllFootprintFilter->Enable( false ); + m_ButtonDeleteOneFootprintFilter->Enable( false ); + m_buttonEditOneFootprintFilter->Enable( false ); + } +} + + +/* Add a new name to the footprint filter list box + * Obvioulsy, cannot be void + */ +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::AddFootprintFilter( wxCommandEvent& event ) +{ + wxString Line; + LIB_PART* component = m_Parent->GetCurPart(); + + if( component == NULL ) + return; + + wxTextEntryDialog dlg( this, _( "Add Footprint Filter" ), _( "Footprint Filter" ), Line ); + if( dlg.ShowModal() != wxID_OK ) + return; // cancelled by user + + Line = dlg.GetValue(); + Line.Replace( wxT( " " ), wxT( "_" ) ); + + if( Line.IsEmpty() ) + return; + + /* test for an existing name: */ + int index = m_FootprintFilterListBox->FindString( Line ); + + if( index != wxNOT_FOUND ) + { + wxString msg; + + msg.Printf( _( "Foot print filter <%s> is already defined." ), GetChars( Line ) ); + DisplayError( this, msg ); + return; + } + + m_FootprintFilterListBox->Append( Line ); + m_ButtonDeleteAllFootprintFilter->Enable( true ); + m_ButtonDeleteOneFootprintFilter->Enable( true ); + m_buttonEditOneFootprintFilter->Enable( true ); +} + + +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::DeleteOneFootprintFilter( wxCommandEvent& event ) +{ + LIB_PART* component = m_Parent->GetCurPart(); + int ii = m_FootprintFilterListBox->GetSelection(); + + m_FootprintFilterListBox->Delete( ii ); + + if( !component || ( m_FootprintFilterListBox->GetCount() == 0 ) ) + { + m_ButtonDeleteAllFootprintFilter->Enable( false ); + m_ButtonDeleteOneFootprintFilter->Enable( false ); + m_buttonEditOneFootprintFilter->Enable( false ); + } +} + +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::EditOneFootprintFilter( wxCommandEvent& event ) +{ + int idx = m_FootprintFilterListBox->GetSelection(); + + if( idx < 0 ) + return; + + wxString filter = m_FootprintFilterListBox->GetStringSelection(); + + wxTextEntryDialog dlg( this, wxEmptyString, _( "Edit footprint filter" ), filter ); + + if( dlg.ShowModal() != wxID_OK ) + return; // Aborted by user + + filter = dlg.GetValue(); + + if( filter.IsEmpty() ) + return; // do not accept blank filter. + + m_FootprintFilterListBox->SetString( idx, filter ); +} |