/** * Function RedrawActiveWindow * Display the current selected component. * If the component is an alias, the ROOT component is displayed */ void LIB_VIEW_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg ) { LIB_COMPONENT* component; LIB_ALIAS* entry; CMP_LIBRARY* lib; wxString msg; wxString tmp; lib = CMP_LIBRARY::FindLibrary( m_libraryName ); if( lib == NULL ) return; entry = lib->FindEntry( m_entryName ); if( entry == NULL ) return; component = entry->GetComponent(); m_canvas->DrawBackGround( DC ); if( !entry->IsRoot() ) { if( component == NULL ) // Should not occur return; // Temporarily change the name field text to reflect the alias name. msg = entry->GetName(); tmp = component->GetName(); component->SetName( msg ); if( m_unit < 1 ) m_unit = 1; if( m_convert < 1 ) m_convert = 1; } else { msg = _( "None" ); } component->Draw( m_canvas, DC, wxPoint( 0, 0 ), m_unit, m_convert, GR_DEFAULT_DRAWMODE ); /* Redraw the cursor */ m_canvas->DrawCrossHair( DC ); if( !tmp.IsEmpty() ) component->SetName( tmp ); ClearMsgPanel(); AppendMsgPanel( _( "Part" ), component->GetName(), BLUE, 6 ); AppendMsgPanel( _( "Alias" ), msg, RED, 6 ); AppendMsgPanel( _( "Description" ), entry->GetDescription(), CYAN, 6 ); AppendMsgPanel( _( "Key words" ), entry->GetKeyWords(), DARKDARKGRAY ); }
LIB_COMPONENT* CMP_LIBRARY::FindComponent( const wxChar* aName ) { LIB_COMPONENT* component = NULL; LIB_ALIAS* entry = FindEntry( aName ); if( entry != NULL ) component = entry->GetComponent(); return component; }
CMP_LIBRARY::~CMP_LIBRARY() { for( LIB_ALIAS_MAP::iterator it=aliases.begin(); it!=aliases.end(); it++ ) { LIB_ALIAS* alias = (*it).second; LIB_COMPONENT* component = alias->GetComponent(); alias = component->RemoveAlias( alias ); if( alias == NULL ) delete component; } }
LIB_COMPONENT* CMP_LIBRARY::FindComponent( const wxString& aName ) { #if 0 && defined(DEBUG) if( !aName.Cmp( wxT( "TI_STELLARIS_BOOSTERPACK" ) ) ) { int breakhere = 1; (void) breakhere; } #endif LIB_COMPONENT* component = NULL; LIB_ALIAS* entry = FindEntry( aName ); if( entry ) component = entry->GetComponent(); return component; }
LIB_ALIAS* CMP_LIBRARY::RemoveEntry( LIB_ALIAS* aEntry ) { wxCHECK_MSG( aEntry != NULL, NULL, wxT( "NULL pointer cannot be removed from library." ) ); LIB_ALIAS_MAP::iterator it = aliases.find( aEntry->GetName() ); if( it == aliases.end() ) return NULL; // If the entry pointer doesn't match the name it is mapped to in the library, we // have done something terribly wrong. wxCHECK_MSG( (*it).second == aEntry, NULL, wxT( "Pointer mismatch while attempting to remove entry <" ) + aEntry->GetName() + wxT( "> from library <" ) + GetName() + wxT( ">." ) ); LIB_ALIAS* alias = (LIB_ALIAS*) aEntry; LIB_COMPONENT* component = alias->GetComponent(); alias = component->RemoveAlias( alias ); if( alias == NULL ) { delete component; if( aliases.size() > 1 ) { LIB_ALIAS_MAP::iterator next = it; next++; if( next == aliases.end() ) next = aliases.begin(); alias = (*next).second; } } aliases.erase( it ); isModified = true; return alias; }
void AddMenusForEditComponent( wxMenu* PopMenu, SCH_COMPONENT* Component ) { if( Component->Type() != SCH_COMPONENT_T ) { wxASSERT( 0 ); return; } wxString msg; LIB_ALIAS* libEntry; LIB_COMPONENT* libComponent = NULL; libEntry = CMP_LIBRARY::FindLibraryEntry( Component->GetLibName() ); if( libEntry ) libComponent = libEntry->GetComponent(); wxMenu* editmenu = new wxMenu; msg = AddHotkeyName( _( "Edit" ), s_Schematic_Hokeys_Descr, HK_EDIT ); AddMenuItem( editmenu, ID_SCH_EDIT_ITEM, msg, KiBitmap( edit_component_xpm ) ); if( libComponent && libComponent->IsNormal() ) { msg = AddHotkeyName( _( "Value" ), s_Schematic_Hokeys_Descr, HK_EDIT_COMPONENT_VALUE ); AddMenuItem( editmenu, ID_SCH_EDIT_COMPONENT_VALUE, msg, KiBitmap( edit_comp_value_xpm ) ); msg = AddHotkeyName( _( "Reference" ), s_Schematic_Hokeys_Descr, HK_EDIT_COMPONENT_REFERENCE ); AddMenuItem( editmenu, ID_SCH_EDIT_COMPONENT_REFERENCE, msg, KiBitmap( edit_comp_ref_xpm ) ); msg = AddHotkeyName( _( "Footprint" ), s_Schematic_Hokeys_Descr, HK_EDIT_COMPONENT_FOOTPRINT ); AddMenuItem( editmenu, ID_SCH_EDIT_COMPONENT_FOOTPRINT, msg, KiBitmap( edit_comp_footprint_xpm ) ); } if( libComponent && libComponent->HasConversion() ) AddMenuItem( editmenu, ID_POPUP_SCH_EDIT_CONVERT_CMP, _( "Convert" ), KiBitmap( component_select_alternate_shape_xpm ) ); if( libComponent && ( libComponent->GetPartCount() >= 2 ) ) { wxMenu* sel_unit_menu = new wxMenu; int ii; for( ii = 0; ii < libComponent->GetPartCount(); ii++ ) { wxString num_unit; int unit = Component->GetUnit(); num_unit.Printf( _( "Unit %d %c" ), ii + 1, "?ABCDEFGHIJKLMNOPQRSTUVWXYZ"[ ii + 1 ] ); wxMenuItem * item = sel_unit_menu->Append( ID_POPUP_SCH_SELECT_UNIT1 + ii, num_unit, wxEmptyString, wxITEM_CHECK ); if( unit == ii + 1 ) item->Check(true); } AddMenuItem( editmenu, sel_unit_menu, ID_POPUP_SCH_SELECT_UNIT_CMP, _( "Unit" ), KiBitmap( component_select_unit_xpm ) ); } if( !Component->GetFlags() ) { AddMenuItem( editmenu, ID_POPUP_SCH_CALL_LIBEDIT_AND_LOAD_CMP, _( "Edit with Library Editor" ), KiBitmap( libedit_xpm ) ); } AddMenuItem( PopMenu, editmenu, ID_SCH_EDIT_ITEM, _( "Edit Component" ), KiBitmap( edit_component_xpm ) ); }
void COMPONENT_TREE_SEARCH_CONTAINER::AddAliasList( const wxString& aNodeName, const wxArrayString& aAliasNameList, CMP_LIBRARY* aOptionalLib ) { TREE_NODE* const lib_node = new TREE_NODE( TREE_NODE::TYPE_LIB, NULL, NULL, aNodeName, wxEmptyString, wxEmptyString ); nodes.push_back( lib_node ); BOOST_FOREACH( const wxString& aName, aAliasNameList ) { LIB_ALIAS* a; if( aOptionalLib ) a = aOptionalLib->FindAlias( aName ); else a = CMP_LIBRARY::FindLibraryEntry( aName, wxEmptyString ); if( a == NULL ) continue; wxString search_text; search_text = ( a->GetKeyWords().empty() ) ? wxT(" ") : a->GetKeyWords(); search_text += a->GetDescription(); wxString display_info; if( !a->GetDescription().empty() ) { // Preformatting. Unfortunately, the tree widget doesn't have columns // and using tabs does not work very well or does not work at all // (depending on OS versions). So indent with spaces in fixed-font width. // The 98%-ile of length of strings found in the standard library is 15 // characters. Use this as a reasonable cut-off point for aligned indentation. // For the few component names longer than that, the description is indented a // bit more. // The max found in the default lib would be 20 characters, but that creates too // much visible whitespace for the less extreme component names. const int COLUMN_DESCR_POS = 15; const int indent_len = COLUMN_DESCR_POS - a->GetName().length(); display_info = wxString::Format( wxT( " %*s [ %s ]" ), indent_len > 0 ? indent_len : 0, wxT( "" ), GetChars( a->GetDescription() ) ); } TREE_NODE* alias_node = new TREE_NODE( TREE_NODE::TYPE_ALIAS, lib_node, a, a->GetName(), display_info, search_text ); nodes.push_back( alias_node ); if( a->GetComponent()->IsMulti() ) // Add all units as sub-nodes. { for( int u = 1; u <= a->GetComponent()->GetPartCount(); ++u ) { wxString unitName = _("Unit"); unitName += wxT( " " ) + LIB_COMPONENT::SubReference( u, false ); TREE_NODE* unit_node = new TREE_NODE( TREE_NODE::TYPE_UNIT, alias_node, a, unitName, wxEmptyString, wxEmptyString ); unit_node->Unit = u; nodes.push_back( unit_node ); } } }