diff --git a/eeschema/sch_field.cpp b/eeschema/sch_field.cpp index aa3039baaf..cdc1d4732b 100644 --- a/eeschema/sch_field.cpp +++ b/eeschema/sch_field.cpp @@ -328,19 +328,23 @@ bool SCH_FIELD::Matches( wxFindReplaceData& aSearchData, void* aAuxData ) if( !IsVisible() && !searchHiddenFields ) return false; - if( m_Parent && m_Parent->Type() == SCH_COMPONENT_T ) + if( m_Parent && m_Parent->Type() == SCH_COMPONENT_T && m_id == REFERENCE ) { - SCH_COMPONENT* parentComponent = static_cast( m_Parent ); - - if( searchAndReplace && m_id == REFERENCE && !replaceReferences ) + if( searchAndReplace && !replaceReferences ) return false; + SCH_COMPONENT* parentComponent = static_cast( m_Parent ); + wxASSERT( aAuxData ); + // Take sheet path into account which effects the reference field and the unit for // components with multiple parts. - if( m_id == REFERENCE && aAuxData != NULL ) + if( aAuxData ) { text = parentComponent->GetRef( (SCH_SHEET_PATH*) aAuxData ); + if( SCH_ITEM::Matches( text, aSearchData ) ) + return true; + if( parentComponent->GetUnitCount() > 1 ) text << LIB_PART::SubReference( parentComponent->GetUnit() ); } diff --git a/eeschema/tools/sch_editor_control.cpp b/eeschema/tools/sch_editor_control.cpp index 5d44ead325..974b7b875a 100644 --- a/eeschema/tools/sch_editor_control.cpp +++ b/eeschema/tools/sch_editor_control.cpp @@ -246,9 +246,9 @@ int SCH_EDITOR_CONTROL::UpdateFind( const TOOL_EVENT& aEvent ) { wxFindReplaceData* data = m_frame->GetFindReplaceData(); - auto visit = [&] ( EDA_ITEM* aItem ) + auto visit = [&]( EDA_ITEM* aItem, SCH_SHEET_PATH* aSheet ) { - if( data && aItem->Matches( *data, nullptr ) ) + if( data && aItem->Matches( *data, aSheet ) ) { aItem->SetForceVisible( true ); m_selectionTool->BrightenItem( aItem ); @@ -267,27 +267,27 @@ int SCH_EDITOR_CONTROL::UpdateFind( const TOOL_EVENT& aEvent ) for( SCH_ITEM* item : m_frame->GetScreen()->Items() ) { - visit( item ); + visit( item, &m_frame->GetCurrentSheet() ); if( item->Type() == SCH_COMPONENT_T ) { SCH_COMPONENT* cmp = static_cast( item ); for( SCH_FIELD& field : cmp->GetFields() ) - visit( &field ); + visit( &field, &m_frame->GetCurrentSheet() ); for( SCH_PIN* pin : cmp->GetPins() ) - visit( pin ); + visit( pin, &m_frame->GetCurrentSheet() ); } else if( item->Type() == SCH_SHEET_T ) { SCH_SHEET* sheet = static_cast( item ); for( SCH_FIELD& field : sheet->GetFields() ) - visit( &field ); + visit( &field, &m_frame->GetCurrentSheet() ); for( SCH_SHEET_PIN* pin : sheet->GetPins() ) - visit( pin ); + visit( pin, &m_frame->GetCurrentSheet() ); } } @@ -295,7 +295,7 @@ int SCH_EDITOR_CONTROL::UpdateFind( const TOOL_EVENT& aEvent ) else if( aEvent.Matches( EVENTS::SelectedItemsModified ) ) { for( EDA_ITEM* item : m_selectionTool->GetSelection() ) - visit( item ); + visit( item, &m_frame->GetCurrentSheet() ); } getView()->UpdateItems(); @@ -306,8 +306,8 @@ int SCH_EDITOR_CONTROL::UpdateFind( const TOOL_EVENT& aEvent ) } -SCH_ITEM* SCH_EDITOR_CONTROL::nextMatch( SCH_SCREEN* aScreen, SCH_ITEM* aAfter, - wxFindReplaceData* aData ) +SCH_ITEM* SCH_EDITOR_CONTROL::nextMatch( SCH_SCREEN* aScreen, SCH_SHEET_PATH* aSheet, + SCH_ITEM* aAfter, wxFindReplaceData* aData ) { bool past_item = true; @@ -331,7 +331,7 @@ SCH_ITEM* SCH_EDITOR_CONTROL::nextMatch( SCH_SCREEN* aScreen, SCH_ITEM* aAfter, if( aData == &g_markersOnly && item->Type() == SCH_MARKER_T ) return item; - if( item->Matches( *aData, nullptr ) ) + if( item->Matches( *aData, aSheet ) ) return item; if( item->Type() == SCH_COMPONENT_T ) @@ -340,13 +340,13 @@ SCH_ITEM* SCH_EDITOR_CONTROL::nextMatch( SCH_SCREEN* aScreen, SCH_ITEM* aAfter, for( SCH_FIELD& field : cmp->GetFields() ) { - if( field.Matches( *aData, nullptr ) ) + if( field.Matches( *aData, aSheet ) ) return &field; } for( SCH_PIN* pin : cmp->GetPins() ) { - if( pin->Matches( *aData, nullptr ) ) + if( pin->Matches( *aData, aSheet ) ) return pin; } } @@ -357,13 +357,13 @@ SCH_ITEM* SCH_EDITOR_CONTROL::nextMatch( SCH_SCREEN* aScreen, SCH_ITEM* aAfter, for( SCH_FIELD& field : sheet->GetFields() ) { - if( field.Matches( *aData, nullptr ) ) + if( field.Matches( *aData, aSheet ) ) return &field; } for( SCH_SHEET_PIN* pin : sheet->GetPins() ) { - if( pin->Matches( *aData, nullptr ) ) + if( pin->Matches( *aData, aSheet ) ) return pin; } } @@ -410,7 +410,7 @@ int SCH_EDITOR_CONTROL::FindNext( const TOOL_EVENT& aEvent ) m_selectionTool->ClearSelection(); if( afterScreen || !searchAllSheets ) - item = nextMatch( m_frame->GetScreen(), afterItem, data ); + item = nextMatch( m_frame->GetScreen(), &m_frame->GetCurrentSheet(), afterItem, data ); if( !item && searchAllSheets ) { @@ -427,11 +427,12 @@ int SCH_EDITOR_CONTROL::FindNext( const TOOL_EVENT& aEvent ) continue; } - item = nextMatch( screen, nullptr, data ); + SCH_SHEET_PATH* sheet = schematic.FindSheetForScreen( screen ); + + item = nextMatch( screen, sheet, nullptr, data ); if( item ) { - SCH_SHEET_PATH* sheet = schematic.FindSheetForScreen( screen ); wxCHECK_MSG( sheet, 0, "Sheet not found for " + screen->GetFileName() ); m_frame->Schematic().SetCurrentSheet( *sheet ); @@ -473,7 +474,7 @@ bool SCH_EDITOR_CONTROL::HasMatch() wxFindReplaceData* data = m_frame->GetFindReplaceData(); EDA_ITEM* item = m_selectionTool->GetSelection().Front(); - return data && item && item->Matches( *data, nullptr ); + return data && item && item->Matches( *data, &m_frame->GetCurrentSheet() ); } @@ -481,13 +482,14 @@ int SCH_EDITOR_CONTROL::ReplaceAndFindNext( const TOOL_EVENT& aEvent ) { wxFindReplaceData* data = m_frame->GetFindReplaceData(); EDA_ITEM* item = m_selectionTool->GetSelection().Front(); + SCH_SHEET_PATH* sheet = &m_frame->GetCurrentSheet(); if( !data ) return FindAndReplace( ACTIONS::find.MakeEvent() ); - if( item && item->Matches( *data, nullptr ) ) + if( item && item->Matches( *data, sheet ) ) { - if( item->Replace( *data, &m_frame->GetCurrentSheet() ) ) + if( item->Replace( *data, sheet ) ) { m_frame->UpdateItem( item ); m_frame->OnModify(); @@ -512,15 +514,17 @@ int SCH_EDITOR_CONTROL::ReplaceAll( const TOOL_EVENT& aEvent ) for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() ) { - for( EDA_ITEM* item = nextMatch( screen, nullptr, data ); item; ) + SCH_SHEET_PATH* sheet = schematic.FindSheetForScreen( screen ); + + for( EDA_ITEM* item = nextMatch( screen, sheet, nullptr, data ); item; ) { - if( item->Replace( *data, schematic.FindSheetForScreen( screen ) ) ) + if( item->Replace( *data, sheet ) ) { m_frame->UpdateItem( item ); m_frame->OnModify(); } - item = nextMatch( screen, dynamic_cast( item ), data ); + item = nextMatch( screen, sheet, dynamic_cast( item ), data ); } } diff --git a/eeschema/tools/sch_editor_control.h b/eeschema/tools/sch_editor_control.h index 29b96ba60b..d4db9a2668 100644 --- a/eeschema/tools/sch_editor_control.h +++ b/eeschema/tools/sch_editor_control.h @@ -200,7 +200,8 @@ private: * @param aData Search data to compare against or NULL to match the first item found * @return pointer to the next search item found or NULL if nothing found */ - SCH_ITEM* nextMatch( SCH_SCREEN* aScreen, SCH_ITEM* aAfter, wxFindReplaceData* aData ); + SCH_ITEM* nextMatch( SCH_SCREEN* aScreen, SCH_SHEET_PATH* aSheet, SCH_ITEM* aAfter, + wxFindReplaceData* aData ); private: bool m_probingPcbToSch; // Recursion guard when cross-probing to PCBNew