diff --git a/common/common.cpp b/common/common.cpp index 65a9be0c62..804e0ee5cb 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -410,39 +410,32 @@ int ReturnValueFromString( EDA_UNITS_T aUnit, const wxString& TextValue, int Int } -/** - * Function wxStringSplit - * Split a String to a String List when founding 'splitter' - * @return the list - * @param txt : wxString : a String text - * @param splitter : wxChar : the 'split' character - */ -wxArrayString* wxStringSplit( wxString txt, wxChar splitter ) +wxArrayString* wxStringSplit( wxString aString, wxChar aSplitter ) { wxArrayString* list = new wxArrayString(); while( 1 ) { - int index = txt.Find( splitter ); + int index = aString.Find( aSplitter ); + if( index == wxNOT_FOUND ) break; wxString tmp; - tmp = txt.Mid( 0, index ); - txt = txt.Mid( index + 1, txt.size() - index ); + tmp = aString.Mid( 0, index ); + aString = aString.Mid( index + 1, aString.size() - index ); list->Add( tmp ); } - if( !txt.IsEmpty() ) + if( !aString.IsEmpty() ) { - list->Add( txt ); + list->Add( aString ); } return list; } - /** * Function To_User_Unit * Convert in inch or mm the variable "val" (double)given in internal units diff --git a/common/sch_item_struct.cpp b/common/sch_item_struct.cpp index b1edf1d07d..9a1c2af65a 100644 --- a/common/sch_item_struct.cpp +++ b/common/sch_item_struct.cpp @@ -39,7 +39,8 @@ #include "general.h" #include "protos.h" -#include "../eeschema/dialogs/dialog_schematic_find.h" + +const wxString traceFindReplace( wxT( "KicadFindReplace" ) ); bool sort_schematic_items( const SCH_ITEM* aItem1, const SCH_ITEM* aItem2 ) diff --git a/eeschema/dialogs/dialog_sch_find.fbp b/eeschema/dialogs/dialog_sch_find.fbp index b12bf2a5b8..eedab154d4 100644 --- a/eeschema/dialogs/dialog_sch_find.fbp +++ b/eeschema/dialogs/dialog_sch_find.fbp @@ -1059,7 +1059,7 @@ 1 - wxID_ANY + wxID_REPLACE &Replace @@ -1077,7 +1077,7 @@ - + OnReplace @@ -1100,7 +1100,7 @@ - + OnUpdateReplaceUI @@ -1116,7 +1116,7 @@ 1 - wxID_ANY + wxID_REPLACE_ALL Replace &All @@ -1134,7 +1134,7 @@ - + OnReplace @@ -1157,7 +1157,7 @@ - + OnUpdateReplaceUI diff --git a/eeschema/dialogs/dialog_schematic_find.cpp b/eeschema/dialogs/dialog_schematic_find.cpp index 4df84ee76c..9f221664af 100644 --- a/eeschema/dialogs/dialog_schematic_find.cpp +++ b/eeschema/dialogs/dialog_schematic_find.cpp @@ -16,8 +16,10 @@ DIALOG_SCH_FIND::DIALOG_SCH_FIND( wxWindow* aParent, wxFindReplaceData* aData, if( aStyle & wxFR_REPLACEDIALOG ) { + SetTitle( _( "Find and Replace" ) ); m_staticReplace->Show( true ); m_comboReplace->Show( true ); + m_checkWildcardMatch->Show( false ); // Wildcard replace is not implemented. } int flags = m_findReplaceData->GetFlags(); @@ -55,6 +57,13 @@ void DIALOG_SCH_FIND::OnUpdateFindUI( wxUpdateUIEvent& aEvent ) } +void DIALOG_SCH_FIND::OnUpdateReplaceUI( wxUpdateUIEvent& aEvent ) +{ + aEvent.Enable( HasFlag( wxFR_REPLACEDIALOG ) && !m_comboFind->GetValue().empty() && + (m_findReplaceData->GetFlags() | FR_REPLACE_ITEM_FOUND) ); +} + + void DIALOG_SCH_FIND::OnUpdateWholeWordUI( wxUpdateUIEvent& aEvent ) { aEvent.Enable( !m_checkWildcardMatch->GetValue() ); @@ -88,6 +97,27 @@ void DIALOG_SCH_FIND::OnFind( wxCommandEvent& aEvent ) } +void DIALOG_SCH_FIND::OnReplace( wxCommandEvent& aEvent ) +{ + int index = m_comboReplace->FindString( m_comboReplace->GetValue(), true ); + + if( index == wxNOT_FOUND ) + { + m_comboReplace->Insert( m_comboReplace->GetValue(), 0 ); + } + else if( index != 0 ) + { + /* Move the search string to the top of the list if it isn't already there. */ + wxString tmp = m_comboReplace->GetValue(); + m_comboReplace->Delete( index ); + m_comboReplace->Insert( tmp, 0 ); + m_comboReplace->SetSelection( 0 ); + } + + SendEvent( wxEVT_COMMAND_FIND ); +} + + void DIALOG_SCH_FIND::OnCancel( wxCommandEvent& aEvent ) { SendEvent( wxEVT_COMMAND_FIND_CLOSE ); @@ -101,13 +131,14 @@ void DIALOG_SCH_FIND::SendEvent( const wxEventType& aEventType ) event.SetEventObject( this ); event.SetFindString( m_comboFind->GetValue() ); + int flags = 0; + if ( HasFlag( wxFR_REPLACEDIALOG ) ) { event.SetReplaceString( m_comboReplace->GetValue() ); + flags |= FR_SEARCH_REPLACE; } - int flags = 0; - if( m_radioForward->GetValue() ) flags |= wxFR_DOWN; @@ -117,7 +148,7 @@ void DIALOG_SCH_FIND::SendEvent( const wxEventType& aEventType ) if( m_checkWholeWord->GetValue() ) flags |= wxFR_WHOLEWORD; - if( m_checkWildcardMatch->GetValue() ) + if( m_checkWildcardMatch->IsShown() && m_checkWildcardMatch->GetValue() ) flags |= FR_MATCH_WILDCARD; if( m_checkAllFields->GetValue() ) @@ -152,6 +183,9 @@ void DIALOG_SCH_FIND::SendEvent( const wxEventType& aEventType ) { GetParent()->GetEventHandler()->ProcessEvent( event ); } + + if( event.GetFlags() != flags ) + m_findReplaceData->SetFlags( event.GetFlags() ); } diff --git a/eeschema/dialogs/dialog_schematic_find.h b/eeschema/dialogs/dialog_schematic_find.h index 3771946a1d..0c17a37453 100644 --- a/eeschema/dialogs/dialog_schematic_find.h +++ b/eeschema/dialogs/dialog_schematic_find.h @@ -20,7 +20,7 @@ /** * Define schematic specific find and replace dialog flags based on the enum entries * in wxFindReplaceFlags. These flags are intended to be used as bit masks in the - * wxFindReplaceData::m_Flags member variable. The varialble is defined as a wxUint32. + * wxFindReplaceData::m_Flags member variable. The variable is defined as a wxUint32. */ enum SchematicFindReplaceFlags { @@ -44,7 +44,7 @@ enum SchematicFindReplaceFlags /// Don't warp cursor to found item until the dialog is closed. FR_NO_WARP_CURSOR = wxFR_MATCHCASE << 6, - /// Perform a search for a item that has repaceable text. + /// Perform a search for a item that has replaceable text. FR_SEARCH_REPLACE = wxFR_MATCHCASE << 7, /// Used by the search event handler to let the dialog know that a replaceable @@ -53,6 +53,40 @@ enum SchematicFindReplaceFlags }; +/** + * Class SCH_FIND_REPLACE_DATA + * adds missing useful comparison and assignment operators to the wxFindReplaceData object. + */ +class SCH_FIND_REPLACE_DATA : public wxFindReplaceData +{ +public: + + SCH_FIND_REPLACE_DATA& operator =( SCH_FIND_REPLACE_DATA& aFindReplaceData ) + { + if( this == &aFindReplaceData ) + return *this; + + SetFlags( aFindReplaceData.GetFlags() ); + SetFindString( aFindReplaceData.GetFindString() ); + SetReplaceString( aFindReplaceData.GetReplaceString() ); + + return *this; + } + + bool operator ==( SCH_FIND_REPLACE_DATA& aFindReplaceData ) + { + return ( (GetFlags() == aFindReplaceData.GetFlags()) + && (GetFindString() == aFindReplaceData.GetFindString()) + && (GetReplaceString() == aFindReplaceData.GetReplaceString()) ); + } + + bool operator !=( SCH_FIND_REPLACE_DATA& aFindReplaceData ) + { + return !( *this == aFindReplaceData ); + } +}; + + /** Implementing DIALOG_SCH_FIND_BASE */ class DIALOG_SCH_FIND : public DIALOG_SCH_FIND_BASE { @@ -60,9 +94,12 @@ protected: // Handlers for DIALOG_SCH_FIND_BASE events. void OnClose( wxCloseEvent& aEvent ); void OnUpdateFindUI( wxUpdateUIEvent& aEvent ); + void OnUpdateReplaceUI( wxUpdateUIEvent& aEvent ); void OnUpdateWholeWordUI( wxUpdateUIEvent& aEvent ); void OnUpdateWildcardUI( wxUpdateUIEvent& aEvent ); + void OnFind( wxCommandEvent& aEvent ); + void OnReplace( wxCommandEvent& aEvent ); void OnCancel( wxCommandEvent& aEvent ); void SendEvent( const wxEventType& aEventType ); diff --git a/eeschema/dialogs/dialog_schematic_find_base.cpp b/eeschema/dialogs/dialog_schematic_find_base.cpp index deeb628051..c2c47caa98 100644 --- a/eeschema/dialogs/dialog_schematic_find_base.cpp +++ b/eeschema/dialogs/dialog_schematic_find_base.cpp @@ -101,12 +101,12 @@ DIALOG_SCH_FIND_BASE::DIALOG_SCH_FIND_BASE( wxWindow* parent, wxWindowID id, con m_buttonFind->SetDefault(); rightSizer->Add( m_buttonFind, 0, wxALL|wxEXPAND, 6 ); - m_buttonReplace = new wxButton( this, wxID_ANY, _("&Replace"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonReplace = new wxButton( this, wxID_REPLACE, _("&Replace"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonReplace->Hide(); rightSizer->Add( m_buttonReplace, 0, wxALL, 5 ); - m_buttonReplaceAll = new wxButton( this, wxID_ANY, _("Replace &All"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonReplaceAll = new wxButton( this, wxID_REPLACE_ALL, _("Replace &All"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonReplaceAll->Hide(); rightSizer->Add( m_buttonReplaceAll, 0, wxALL, 5 ); @@ -130,6 +130,10 @@ DIALOG_SCH_FIND_BASE::DIALOG_SCH_FIND_BASE( wxWindow* parent, wxWindowID id, con m_checkWildcardMatch->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_SCH_FIND_BASE::OnUpdateWildcardUI ), NULL, this ); m_buttonFind->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SCH_FIND_BASE::OnFind ), NULL, this ); m_buttonFind->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_SCH_FIND_BASE::OnUpdateFindUI ), NULL, this ); + m_buttonReplace->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SCH_FIND_BASE::OnReplace ), NULL, this ); + m_buttonReplace->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_SCH_FIND_BASE::OnUpdateReplaceUI ), NULL, this ); + m_buttonReplaceAll->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SCH_FIND_BASE::OnReplace ), NULL, this ); + m_buttonReplaceAll->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_SCH_FIND_BASE::OnUpdateReplaceUI ), NULL, this ); m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SCH_FIND_BASE::OnCancel ), NULL, this ); } @@ -143,6 +147,10 @@ DIALOG_SCH_FIND_BASE::~DIALOG_SCH_FIND_BASE() m_checkWildcardMatch->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_SCH_FIND_BASE::OnUpdateWildcardUI ), NULL, this ); m_buttonFind->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SCH_FIND_BASE::OnFind ), NULL, this ); m_buttonFind->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_SCH_FIND_BASE::OnUpdateFindUI ), NULL, this ); + m_buttonReplace->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SCH_FIND_BASE::OnReplace ), NULL, this ); + m_buttonReplace->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_SCH_FIND_BASE::OnUpdateReplaceUI ), NULL, this ); + m_buttonReplaceAll->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SCH_FIND_BASE::OnReplace ), NULL, this ); + m_buttonReplaceAll->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_SCH_FIND_BASE::OnUpdateReplaceUI ), NULL, this ); m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SCH_FIND_BASE::OnCancel ), NULL, this ); } diff --git a/eeschema/dialogs/dialog_schematic_find_base.h b/eeschema/dialogs/dialog_schematic_find_base.h index 18ef2e1e8e..f095ae5f12 100644 --- a/eeschema/dialogs/dialog_schematic_find_base.h +++ b/eeschema/dialogs/dialog_schematic_find_base.h @@ -61,6 +61,8 @@ class DIALOG_SCH_FIND_BASE : public wxDialog virtual void OnUpdateWildcardUI( wxUpdateUIEvent& event ) { event.Skip(); } virtual void OnFind( wxCommandEvent& event ) { event.Skip(); } virtual void OnUpdateFindUI( wxUpdateUIEvent& event ) { event.Skip(); } + virtual void OnReplace( wxCommandEvent& event ) { event.Skip(); } + virtual void OnUpdateReplaceUI( wxUpdateUIEvent& event ) { event.Skip(); } virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } diff --git a/eeschema/find.cpp b/eeschema/find.cpp index 9d2b53292f..dd885ba049 100644 --- a/eeschema/find.cpp +++ b/eeschema/find.cpp @@ -297,60 +297,88 @@ SCH_ITEM* SCH_EDIT_FRAME::FindComponentAndItem( const wxString& aReference, void SCH_EDIT_FRAME::OnFindSchematicItem( wxFindDialogEvent& aEvent ) { - static SCH_ITEM* lastItem = NULL; /* last item found when searching a match - * note: the actual matched item can be a - * part of lastItem (for instance a field in a component - */ - static wxString sheetFoundIn; - static wxPoint lastItemPosition; // the actual position of the matched sub item + static wxPoint itemPosition; // the actual position of the matched item. - SCH_SHEET_LIST schematic; - wxString msg; - wxFindReplaceData searchCriteria; - bool warpCursor = !( aEvent.GetFlags() & FR_NO_WARP_CURSOR ); + SCH_SHEET_LIST schematic; + wxString msg; + SCH_FIND_REPLACE_DATA searchCriteria; + bool warpCursor = !( aEvent.GetFlags() & FR_NO_WARP_CURSOR ); searchCriteria.SetFlags( aEvent.GetFlags() ); searchCriteria.SetFindString( aEvent.GetFindString() ); searchCriteria.SetReplaceString( aEvent.GetReplaceString() ); - if( aEvent.GetEventType() == wxEVT_COMMAND_FIND_CLOSE ) + if( searchCriteria != m_foundItems.GetFindReplaceData() ) { - sheetFoundIn = m_CurrentSheet->PathHumanReadable(); - warpCursor = true; - } - else if( aEvent.GetFlags() & FR_CURRENT_SHEET_ONLY && g_RootSheet->CountSheets() > 1 ) - { - sheetFoundIn = m_CurrentSheet->PathHumanReadable(); - lastItem = m_CurrentSheet->MatchNextItem( searchCriteria, lastItem, &lastItemPosition ); + if( aEvent.GetEventType() == wxEVT_COMMAND_FIND_CLOSE ) + { + warpCursor = true; + } + else if( aEvent.GetFlags() & FR_CURRENT_SHEET_ONLY && g_RootSheet->CountSheets() > 1 ) + { + m_foundItemIndex = 0; + m_foundItems.Collect( searchCriteria, m_CurrentSheet ); + } + else + { + m_foundItemIndex = 0; + m_foundItems.Collect( searchCriteria ); + } } else { - lastItem = schematic.MatchNextItem( searchCriteria, sheetFoundIn, lastItem, - &lastItemPosition ); + if( searchCriteria.GetFlags() & wxFR_DOWN ) + { + if( !(searchCriteria.GetFlags() & FR_SEARCH_WRAP) + && (m_foundItemIndex == (m_foundItems.GetCount() - 1)) ) + return; + + m_foundItemIndex += 1; + + if( (m_foundItemIndex >= m_foundItems.GetCount()) + && (searchCriteria.GetFlags() & FR_SEARCH_WRAP) ) + m_foundItemIndex = 0; + } + else + { + if( !(searchCriteria.GetFlags() & FR_SEARCH_WRAP) && (m_foundItemIndex == 0) ) + return; + + m_foundItemIndex -= 1; + + if( (m_foundItemIndex < 0) && (searchCriteria.GetFlags() & FR_SEARCH_WRAP) ) + m_foundItemIndex = m_foundItems.GetCount() - 1; + } } - if( lastItem != NULL ) + if( m_foundItems.GetCount() != 0 ) { - SCH_SHEET_PATH* sheet = schematic.GetSheet( sheetFoundIn ); + SCH_FIND_COLLECTOR_DATA data = m_foundItems.GetFindData( m_foundItemIndex ); - wxCHECK_RET( sheet != NULL, wxT( "Could not find sheet path " + sheetFoundIn ) ); + wxLogTrace( traceFindReplace, wxT( "Found " ) + m_foundItems.GetText( m_foundItemIndex ) ); - if( sheet != GetSheet() ) + SCH_SHEET_PATH* sheet = schematic.GetSheet( data.GetSheetPath() ); + + wxCHECK_RET( sheet != NULL, wxT( "Could not find sheet path " ) + + data.GetSheetPath() ); + + if( sheet->PathHumanReadable() != GetSheet()->PathHumanReadable() ) { sheet->LastScreen()->SetZoom( GetScreen()->GetZoom() ); *m_CurrentSheet = *sheet; m_CurrentSheet->UpdateAllScreenReferences(); } - sheet->LastScreen()->SetCrossHairPosition( lastItemPosition ); + sheet->LastScreen()->SetCrossHairPosition( data.GetPosition() ); - RedrawScreen( lastItemPosition, warpCursor ); + RedrawScreen( data.GetPosition(), warpCursor ); - msg = lastItem->GetSelectMenuText() + _( " found in sheet " ) + sheetFoundIn; + aEvent.SetFlags( aEvent.GetFlags() | FR_REPLACE_ITEM_FOUND ); + msg = m_foundItems.GetText( m_foundItemIndex ); } else { - sheetFoundIn = wxEmptyString; + aEvent.SetFlags( aEvent.GetFlags() & ~FR_REPLACE_ITEM_FOUND ); msg.Printf( _( "No item found matching %s." ), GetChars( aEvent.GetFindString() ) ); } @@ -360,4 +388,23 @@ void SCH_EDIT_FRAME::OnFindSchematicItem( wxFindDialogEvent& aEvent ) void SCH_EDIT_FRAME::OnFindReplace( wxFindDialogEvent& aEvent ) { + wxCHECK_RET( m_foundItems.IsValidIndex( m_foundItemIndex ), + wxT( "No last find item to replace text." ) ); + + SCH_FIND_COLLECTOR_DATA data = m_foundItems.GetFindData( m_foundItemIndex ); + + wxLogTrace( traceFindReplace, wxT( "Replacing %s with %s in item %s" ), + GetChars( aEvent.GetFindString() ), GetChars( aEvent.GetReplaceString() ), + GetChars( m_foundItems.GetText( m_foundItemIndex ) ) ); + + OnFindSchematicItem( aEvent ); + + if( aEvent.GetEventType() == wxEVT_COMMAND_FIND_REPLACE_ALL ) + { + wxLogTrace( traceFindReplace, wxT( "Replacing %s with %s in item %s" ), + GetChars( aEvent.GetFindString() ), GetChars( aEvent.GetReplaceString() ), + GetChars( m_foundItems.GetText( m_foundItemIndex ) ) ); + + OnFindSchematicItem( aEvent ); + } } diff --git a/eeschema/help_common_strings.h b/eeschema/help_common_strings.h index d6c03ea4e4..6ab4e28728 100644 --- a/eeschema/help_common_strings.h +++ b/eeschema/help_common_strings.h @@ -25,7 +25,7 @@ // Schematic editor: #define HELP_FIND _( "Find components and texts" ) - +#define HELP_REPLACE _( "Find and replace text in schematic items" ) #define HELP_PLACE_COMPONENTS _( "Place a component" ) #define HELP_PLACE_POWERPORT _( "Place a power port" ) #define HELP_PLACE_WIRE _( "Place a wire" ) diff --git a/eeschema/lib_pin.cpp b/eeschema/lib_pin.cpp index 57af8b39c6..3d15a9d1c6 100644 --- a/eeschema/lib_pin.cpp +++ b/eeschema/lib_pin.cpp @@ -2142,6 +2142,29 @@ wxString LIB_PIN::GetSelectMenuText() const } +bool LIB_PIN::Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint* aFindLocation ) +{ + wxLogTrace( traceFindReplace, wxT( " item " ) + GetSelectMenuText() ); + + if( !( aSearchData.GetFlags() & FR_SEARCH_ALL_PINS ) + && !( aSearchData.GetFlags() & FR_SEARCH_REPLACE ) ) + return false; + + wxLogTrace( traceFindReplace, wxT( " child item " ) + GetSelectMenuText() ); + + if( EDA_ITEM::Matches( GetName(), aSearchData ) + || EDA_ITEM::Matches( GetNumberString(), aSearchData ) ) + { + if( aFindLocation ) + *aFindLocation = GetBoundingBox().Centre(); + + return true; + } + + return false; +} + + #if defined(DEBUG) void LIB_PIN::Show( int nestLevel, std::ostream& os ) diff --git a/eeschema/lib_pin.h b/eeschema/lib_pin.h index a9e655af9e..4dcdaca4e8 100644 --- a/eeschema/lib_pin.h +++ b/eeschema/lib_pin.h @@ -134,7 +134,7 @@ public: char m_PinNamePositionOpt; public: - LIB_PIN( LIB_COMPONENT * aParent ); + LIB_PIN( LIB_COMPONENT* aParent ); LIB_PIN( const LIB_PIN& aPin ); ~LIB_PIN() { } @@ -185,6 +185,11 @@ public: */ virtual void DisplayInfo( EDA_DRAW_FRAME* aFrame ); + /** + * @copydoc EDA_ITEM::Matches() + */ + virtual bool Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint* aFindLocation ); + /** * Function GetBoundingBox * @return the boundary box for the pin in schematic coordinates. diff --git a/eeschema/menubar.cpp b/eeschema/menubar.cpp index a95a49c075..58e8d4ea8f 100644 --- a/eeschema/menubar.cpp +++ b/eeschema/menubar.cpp @@ -217,6 +217,10 @@ void SCH_EDIT_FRAME::ReCreateMenuBar() text = AddHotkeyName( _( "&Find" ), s_Schematic_Hokeys_Descr, HK_FIND_ITEM ); AddMenuItem( editMenu, ID_FIND_ITEMS, text, HELP_FIND, KiBitmap( find_xpm ) ); + // Find/Replace + // AddMenuItem( editMenu, wxID_REPLACE, _( "Find and Re&place\tCtrl+Shift+F" ), HELP_REPLACE, + // KiBitmap( find_replace_xpm ) ); + // Backannotate editMenu->AppendSeparator(); AddMenuItem( editMenu, diff --git a/eeschema/sch_collectors.cpp b/eeschema/sch_collectors.cpp index 2be6d553db..2cbded5d93 100644 --- a/eeschema/sch_collectors.cpp +++ b/eeschema/sch_collectors.cpp @@ -1,7 +1,3 @@ -/** - * @file sch_collectors.cpp - */ - /* * This program source code file is part of KiCad, a free EDA CAD application. * @@ -26,6 +22,10 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ +/** + * @file sch_collectors.cpp + */ + #include "general.h" #include "transform.h" #include "sch_collectors.h" @@ -314,3 +314,109 @@ bool SCH_COLLECTOR::IsDraggableJunction() const return (wireEndCount >= 3) || ((wireEndCount >= 1) && (wireMidPoint == 1)) || ((wireMidPoint >= 2) && (junctionCount == 1)); } + + +SCH_FIND_COLLECTOR_DATA SCH_FIND_COLLECTOR::GetFindData( int aIndex ) +{ + wxCHECK_MSG( (unsigned) aIndex < m_data.size(), SCH_FIND_COLLECTOR_DATA(), + wxT( "Attempt to get find data outside of list boundary." ) ); + + return m_data[ aIndex ]; +} + + +wxString SCH_FIND_COLLECTOR::GetText( int aIndex ) +{ + wxCHECK_MSG( IsValidIndex( aIndex ), wxEmptyString, + wxT( "Cannot get found item at invalid index." ) ); + + SCH_FIND_COLLECTOR_DATA data = m_data[ aIndex ]; + EDA_ITEM* foundItem = m_List[ aIndex ]; + + wxCHECK_MSG( foundItem != NULL, wxEmptyString, wxT( "Inavalid found item pointer." ) ); + + wxString msg; + + if( data.GetParent() ) + { + msg = _( "Child item " ) + foundItem->GetSelectMenuText() + + _( " of parent item " ) + data.GetParent()->GetSelectMenuText() + + _( " found in sheet " ) + data.GetSheetPath(); + } + else + { + msg = _( "Item " ) + foundItem->GetSelectMenuText() + _( " found in sheet " ) + + data.GetSheetPath(); + } + + return msg; +} + + +SEARCH_RESULT SCH_FIND_COLLECTOR::Inspect( EDA_ITEM* aItem, const void* aTestData ) +{ + wxPoint position; + + if( aItem->Matches( m_findReplaceData, m_sheetPath, &position ) ) + { + if( aItem->Type() == LIB_PIN_T ) + { + wxCHECK_MSG( aTestData && ( (EDA_ITEM*) aTestData )->Type() == SCH_COMPONENT_T, + SEARCH_CONTINUE, wxT( "Cannot inspect invalid data. Bad programmer!" ) ); + + // Pin hit testing is relative to the components position and orientation in the + // schematic. The hit test position must be converted to library coordinates. + SCH_COMPONENT* component = (SCH_COMPONENT*) aTestData; + TRANSFORM transform = component->GetTransform(); + position.y = -position.y; + position = transform.TransformCoordinate( position ) + component->GetPosition(); + } + + Append( aItem ); + m_data.push_back( SCH_FIND_COLLECTOR_DATA( position, m_sheetPath->PathHumanReadable(), + (SCH_ITEM*) aTestData ) ); + } + + return SEARCH_CONTINUE; +} + + +void SCH_FIND_COLLECTOR::Collect( SCH_FIND_REPLACE_DATA& aFindReplaceData, + SCH_SHEET_PATH* aSheetPath ) +{ + if( m_findReplaceData == aFindReplaceData ) + return; + + m_findReplaceData = aFindReplaceData; + Empty(); // empty the collection just in case + m_data.clear(); + + if( aSheetPath ) + { + m_sheetPath = aSheetPath; + EDA_ITEM::IterateForward( aSheetPath->LastDrawList(), this, NULL, m_ScanTypes ); + } + else + { + SCH_SHEET_LIST schematic; + m_sheetPath = schematic.GetFirst(); + + while( m_sheetPath != NULL ) + { + EDA_ITEM::IterateForward( m_sheetPath->LastDrawList(), this, NULL, m_ScanTypes ); + m_sheetPath = schematic.GetNext(); + } + } + + if( m_List.size() != m_data.size() ) + { + wxFAIL_MSG( wxT( "List size mismatch." ) ); + m_List.clear(); + m_data.clear(); + } + + for( unsigned i = 0; i < m_List.size(); i++ ) + { + wxLogTrace( traceFindReplace, GetText( i ) ); + } +} diff --git a/eeschema/sch_collectors.h b/eeschema/sch_collectors.h index 35ab99807d..4136561842 100644 --- a/eeschema/sch_collectors.h +++ b/eeschema/sch_collectors.h @@ -1,7 +1,3 @@ -/** - * @file sch_collectors.h - */ - /* * This program source code file is part of KiCad, a free EDA CAD application. * @@ -26,12 +22,17 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ +/** + * @file sch_collectors.h + */ + #ifndef _SCH_COLLECTORS_H_ #define _SCH_COLLECTORS_H_ #include "class_collector.h" #include "sch_item_struct.h" +#include "dialogs/dialog_schematic_find.h" /** @@ -120,14 +121,7 @@ public: } /** - * Function Inspect - * is the examining function within the INSPECTOR which is passed to the - * Iterate function. - * - * @param aItem An EDA_ITEM to examine. - * @param aTestData is not used in this class. - * @return SEARCH_RESULT #SEARCH_QUIT if the iterator is to stop the scan, - * else #SEARCH_CONTINUE; + * @copydoc INSPECTOR::Inspect() */ SEARCH_RESULT Inspect( EDA_ITEM* aItem, const void* aTestData = NULL ); @@ -162,7 +156,7 @@ public: * Function IsDraggableJunction * tests to see if the collected items form a draggable junction. * - * Daggable juntions are defined as: + * Daggable junctions are defined as: * * The intersection of three or more wire end points. * The intersection of one or more wire end point and one wire mid point. @@ -175,4 +169,101 @@ public: }; +/** + * Class SCH_FIND_COLLECTOR_DATA + * is used as a data container for the associated item found by the #SCH_FIND_COLLECTOR + * object. + */ +class SCH_FIND_COLLECTOR_DATA +{ + /// The position in drawing units of the found item. + wxPoint m_position; + + /// The human readable sheet path @see SCH_SHEET_PATH::PathHumanReadable() of the found item. + wxString m_sheetPath; + + /// The parent object if the item found is a child object. + SCH_ITEM* m_parent; + +public: + SCH_FIND_COLLECTOR_DATA( const wxPoint& aPosition = wxDefaultPosition, + const wxString& aSheetPath = wxEmptyString, + SCH_ITEM* aParent = NULL ) + : m_position( aPosition ) + , m_sheetPath( aSheetPath ) + , m_parent( aParent ) + { } + + wxPoint GetPosition() const { return m_position; } + + wxString GetSheetPath() const { return m_sheetPath; } + + SCH_ITEM* GetParent() { return m_parent; } +}; + + +/** + * Class SCH_FIND_COLLECTOR + * is used to iterate over all of the items in a schematic or sheet and collect all + * the items that match the given search criteria. + */ +class SCH_FIND_COLLECTOR : public COLLECTOR +{ + /// Data associated with each found item. + std::vector< SCH_FIND_COLLECTOR_DATA > m_data; + + /// The criteria used to test for matching items. + SCH_FIND_REPLACE_DATA m_findReplaceData; + + /// The path of the sheet currently being iterated over. + SCH_SHEET_PATH* m_sheetPath; + +public: + + /** + * Constructor SCH_FIND_COLLECTOR + */ + SCH_FIND_COLLECTOR( const KICAD_T* aScanTypes = SCH_COLLECTOR::AllItems ) + { + SetScanTypes( aScanTypes ); + } + + /** + * Function GetFindData + * returns the data associated with the item found at \a aIndex. + * + * @param aIndex The list index of the data to return. + * @return The associated found item data at \a aIndex if \a aIndex is within the + * list limits. Otherwise an empty data item will be returned. + */ + SCH_FIND_COLLECTOR_DATA GetFindData( int aIndex ); + + /** + * Function GetFindReplaceData + * + * @return A reference to a #SCH_FIND_REPLACE_DATA object containing the current + * search criteria. + */ + SCH_FIND_REPLACE_DATA& GetFindReplaceData() { return m_findReplaceData; } + + wxString GetText( int aIndex ); + + /** + * @copydoc INSPECTOR::Inspect() + */ + SEARCH_RESULT Inspect( EDA_ITEM* aItem, const void* aTestData = NULL ); + + /** + * Function Collect + * scans \a aSheetPath using this class's Inspector method for items matching + * \a aFindReplaceData. + * + * @param aFindReplaceData A #SCH_FIND_REPLACE_DATA object containing the search criteria. + * @param aSheetPath A pointer to a #SCH_SHEET_PATH object to test for matches. A NULL + * value searches the entire schematic hierarchy. + */ + void Collect( SCH_FIND_REPLACE_DATA& aFindReplaceData, SCH_SHEET_PATH* aSheetPath = NULL ); +}; + + #endif // _SCH_COLLECTORS_H_ diff --git a/eeschema/sch_component.cpp b/eeschema/sch_component.cpp index f05c00d407..ce86a51acc 100644 --- a/eeschema/sch_component.cpp +++ b/eeschema/sch_component.cpp @@ -382,6 +382,9 @@ void SCH_COMPONENT::AddHierarchicalReference( const wxString& aPath, wxString SCH_COMPONENT::GetPath( SCH_SHEET_PATH* sheet ) { + wxCHECK_MSG( sheet != NULL, wxEmptyString, + wxT( "Cannot get component path with invalid sheet object." ) ); + wxString str; str.Printf( wxT( "%8.8lX" ), m_TimeStamp ); @@ -1533,68 +1536,9 @@ void SCH_COMPONENT::Rotate( wxPoint rotationPoint ) bool SCH_COMPONENT::Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint* aFindLocation ) { - // Search reference. - // reference is a special field because a part identifier is added - // in multi parts per package - // the .m_AddExtraText of the field must be set to add this identifier: - LIB_COMPONENT* Entry = CMP_LIBRARY::FindLibraryComponent( m_ChipName ); - - if( GetField( REFERENCE )->Matches( aSearchData, aAuxData, aFindLocation ) ) - return true; - - if( GetField( VALUE )->Matches( aSearchData, aAuxData, aFindLocation ) ) - return true; - - if( aSearchData.GetFlags() & FR_SEARCH_ALL_FIELDS ) - { - for( size_t i = VALUE + 1; i < m_Fields.size(); i++ ) - { - if( GetField( i )->Matches( aSearchData, aAuxData, aFindLocation ) ) - return true; - } - } - - // Search for a match in pin name or pin number. - // @TODO: see if the Matches method must be made in LIB_PIN. - // when Matches method will be used in Libedit, this is the best - // Currently, Pins are tested here. - if( !( aSearchData.GetFlags() & FR_SEARCH_ALL_PINS ) ) - return false; - - if( Entry ) - { - LIB_PINS pinList; - - int unit = m_unit; - - if( aAuxData != NULL ) - unit = GetUnitSelection( (SCH_SHEET_PATH*) aAuxData ); - - Entry->GetPins( pinList, unit, m_convert ); - - // Search for a match in pinList - for( unsigned ii = 0; ii < pinList.size(); ii ++ ) - { - LIB_PIN* pin = pinList[ii]; - wxString pinNum; - pin->ReturnPinStringNum( pinNum ); - - if( SCH_ITEM::Matches( pin->GetName(), aSearchData ) - || SCH_ITEM::Matches( pinNum, aSearchData ) ) - { - if( aFindLocation ) - { - wxPoint pinpos = pin->GetPosition(); - pinpos = m_transform.TransformCoordinate( pinpos ); - *aFindLocation = pinpos + m_Pos; - } - - return true; - } - - } - } + wxLogTrace( traceFindReplace, wxT( " item " ) + GetSelectMenuText() ); + // Components are searchable via the child field and pin item text. return false; } @@ -1716,7 +1660,7 @@ SEARCH_RESULT SCH_COMPONENT::Visit( INSPECTOR* aInspector, const void* aTestData // Test the bounding boxes of fields if they are visible and not empty. for( int ii = 0; ii < GetFieldCount(); ii++ ) { - if( SEARCH_QUIT == aInspector->Inspect( GetField( ii ), aTestData ) ) + if( SEARCH_QUIT == aInspector->Inspect( GetField( ii ), (void*) this ) ) return SEARCH_QUIT; } } diff --git a/eeschema/sch_component.h b/eeschema/sch_component.h index 8552d84c38..8c98bef1ae 100644 --- a/eeschema/sch_component.h +++ b/eeschema/sch_component.h @@ -408,6 +408,11 @@ public: virtual bool operator <( const SCH_ITEM& aItem ) const; + /** + * @copydoc EDA_ITEM::IsReplaceable() + */ + virtual bool IsReplaceable() const { return true; } + #if defined(DEBUG) /** diff --git a/eeschema/sch_field.cpp b/eeschema/sch_field.cpp index 78731d9e60..523bb3cb82 100644 --- a/eeschema/sch_field.cpp +++ b/eeschema/sch_field.cpp @@ -358,6 +358,11 @@ bool SCH_FIELD::Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint bool match; wxString text = GetText(); + if( (m_FieldId > VALUE) && !(aSearchData.GetFlags() & FR_SEARCH_ALL_FIELDS) ) + return false; + + wxLogTrace( traceFindReplace, wxT( " child item " ) + GetSelectMenuText() ); + // Take sheet path into account which effects the reference field and the unit for // components with multiple parts. if( m_FieldId == REFERENCE && aAuxData != NULL ) diff --git a/eeschema/sch_field.h b/eeschema/sch_field.h index cf3a071adc..343a9407d0 100644 --- a/eeschema/sch_field.h +++ b/eeschema/sch_field.h @@ -209,6 +209,11 @@ public: virtual BITMAP_DEF GetMenuImage() const; + /** + * @copydoc EDA_ITEM::IsReplaceable() + */ + virtual bool IsReplaceable() const { return true; } + private: virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy ) const; virtual bool doHitTest( const EDA_RECT& aRect, bool aContained, int aAccuracy ) const; diff --git a/eeschema/sch_sheet.cpp b/eeschema/sch_sheet.cpp index 783a2da1c0..2169fa4458 100644 --- a/eeschema/sch_sheet.cpp +++ b/eeschema/sch_sheet.cpp @@ -927,6 +927,8 @@ void SCH_SHEET::Resize( const wxSize& aSize ) bool SCH_SHEET::Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint* aFindLocation ) { + wxLogTrace( traceFindReplace, wxT( " item " ) + GetSelectMenuText() ); + if( SCH_ITEM::Matches( m_FileName, aSearchData ) ) { if( aFindLocation ) @@ -1033,15 +1035,15 @@ SEARCH_RESULT SCH_SHEET::Visit( INSPECTOR* aInspector, const void* aTestData, // If caller wants to inspect my type if( stype == Type() ) { - if( SEARCH_QUIT == aInspector->Inspect( this, aTestData ) ) + if( SEARCH_QUIT == aInspector->Inspect( this, NULL ) ) return SEARCH_QUIT; } else if( stype == SCH_SHEET_PIN_T ) { - // Test the bounding boxes of sheet labels. + // Test the sheet labels. for( size_t i = 0; i < m_pins.size(); i++ ) { - if( SEARCH_QUIT == aInspector->Inspect( &m_pins[ i ], aTestData ) ) + if( SEARCH_QUIT == aInspector->Inspect( &m_pins[ i ], (void*) this ) ) return SEARCH_QUIT; } } diff --git a/eeschema/sch_sheet.h b/eeschema/sch_sheet.h index 98e7f2725c..4efa6c2083 100644 --- a/eeschema/sch_sheet.h +++ b/eeschema/sch_sheet.h @@ -599,6 +599,11 @@ public: virtual void GetNetListItem( vector& aNetListItems, SCH_SHEET_PATH* aSheetPath ); + /** + * @copydoc EDA_ITEM::IsReplaceable() + */ + virtual bool IsReplaceable() const { return true; } + #if defined(DEBUG) // comment inherited by Doxygen from Base_Struct diff --git a/eeschema/sch_sheet_path.cpp b/eeschema/sch_sheet_path.cpp index 5063149dc8..3603a596b7 100644 --- a/eeschema/sch_sheet_path.cpp +++ b/eeschema/sch_sheet_path.cpp @@ -45,9 +45,6 @@ #include "dialogs/dialog_schematic_find.h" -static const wxString traceFindReplace( wxT( "KicadFindReplace" ) ); - - SCH_SHEET_PATH::SCH_SHEET_PATH() { for( int i = 0; iNext(); } @@ -384,45 +382,6 @@ SCH_ITEM* SCH_SHEET_PATH::FindPreviousItem( KICAD_T aType, SCH_ITEM* aLastItem, } -SCH_ITEM* SCH_SHEET_PATH::MatchNextItem( wxFindReplaceData& aSearchData, - SCH_ITEM* aLastItem, - wxPoint* aFindLocation ) -{ - bool hasWrapped = false; - bool firstItemFound = false; - bool wrap = ( aSearchData.GetFlags() & FR_SEARCH_WRAP ) != 0; - SCH_ITEM* drawItem = LastDrawList(); - - while( drawItem != NULL ) - { - if( aLastItem && !firstItemFound ) - { - firstItemFound = ( drawItem == aLastItem ); - } - else - { - if( drawItem->Matches( aSearchData, this, aFindLocation ) ) - return drawItem; - } - - drawItem = drawItem->Next(); - - if( drawItem == NULL && aLastItem && firstItemFound && wrap && !hasWrapped ) - { - hasWrapped = true; - drawItem = LastDrawList(); - } - else if( hasWrapped && aLastItem && firstItemFound && (drawItem == aLastItem) ) - { - // Exit when wrapped around to the first item found. - drawItem = NULL; - } - } - - return NULL; -} - - bool SCH_SHEET_PATH::SetComponentFootprint( const wxString& aReference, const wxString& aFootPrint, bool aSetVisible ) { @@ -733,83 +692,6 @@ SCH_ITEM* SCH_SHEET_LIST::FindPreviousItem( KICAD_T aType, SCH_SHEET_PATH** aShe } -SCH_ITEM* SCH_SHEET_LIST::MatchNextItem( wxFindReplaceData& aSearchData, - wxString& aSheetFoundIn, - SCH_ITEM* aLastItem, - wxPoint* aFindLocation ) -{ - bool firstItemFound = false; - bool hasWrapped = false; - bool wrap = ( aSearchData.GetFlags() & FR_SEARCH_WRAP ) != 0; - SCH_ITEM* drawItem = NULL; - SCH_SHEET_PATH* sheet = GetFirst(); - SCH_SHEET_PATH* sheetFirstItemFoundIn = NULL; - - wxLogTrace( traceFindReplace, wxT( "Searching schematic for " ) + aSearchData.GetFindString() ); - - while( sheet != NULL ) - { - wxLogTrace( traceFindReplace, wxT( "Searching sheet " + sheet->PathHumanReadable() ) ); - - drawItem = sheet->LastDrawList(); - - while( drawItem != NULL ) - { - if( aLastItem && !firstItemFound ) - { - if( aSheetFoundIn.IsEmpty() ) - firstItemFound = (drawItem == aLastItem); - else - firstItemFound = ( (drawItem == aLastItem) && - (sheet->PathHumanReadable() == aSheetFoundIn) ); - - if( firstItemFound ) - { - sheetFirstItemFoundIn = sheet; - - wxLogTrace( traceFindReplace, wxT( "First item %p found in sheet %s" ), - sheetFirstItemFoundIn, - GetChars( sheetFirstItemFoundIn->PathHumanReadable() ) ); - } - } - else - { - // Search has wrapped all the way around to the first item found so stop. - if( hasWrapped && aLastItem && (aLastItem == drawItem) - && (sheet == sheetFirstItemFoundIn ) ) - { - wxLogTrace( traceFindReplace, - wxT( "Wrapped around to item %p in sheet %s" ), - sheetFirstItemFoundIn, - GetChars( sheetFirstItemFoundIn->PathHumanReadable() ) ); - - return NULL; - } - - if( drawItem->Matches( aSearchData, sheet, aFindLocation ) ) - { - aSheetFoundIn = sheet->PathHumanReadable(); - - return drawItem; - } - } - - drawItem = drawItem->Next(); - } - - sheet = GetNext(); - - if( sheet == NULL && aLastItem && firstItemFound && wrap && !hasWrapped ) - { - hasWrapped = true; - sheet = GetFirst(); - } - } - - return NULL; -} - - bool SCH_SHEET_LIST::SetComponentFootprint( const wxString& aReference, const wxString& aFootPrint, bool aSetVisible ) { diff --git a/eeschema/sch_sheet_path.h b/eeschema/sch_sheet_path.h index 593bf66f91..4cd3957eec 100644 --- a/eeschema/sch_sheet_path.h +++ b/eeschema/sch_sheet_path.h @@ -33,6 +33,7 @@ #include "base_struct.h" + /** Info about complex hierarchies handling: * A hierarchical schematic uses sheets (hierarchical sheets) included in a * given sheet. Each sheet corresponds to a schematic drawing handled by a @@ -261,17 +262,6 @@ public: */ SCH_ITEM* FindPreviousItem( KICAD_T aType, SCH_ITEM* aLastItem = NULL, bool aWrap = false ); - /** - * Search this sheet path for the next item that matches the search criteria. - * - * @param aSearchData - Criteria to search item against. - * @param aLastItem - Find next item after aLastItem if not NULL. - * @param aFindLocation - a wxPoint where to put the location of matched item. can be NULL. - * @return If found, Returns the next schematic item. Otherwise, returns NULL. - */ - SCH_ITEM* MatchNextItem( wxFindReplaceData& aSearchData, SCH_ITEM* aLastItem, - wxPoint * aFindLocation ); - SCH_SHEET_PATH& operator=( const SCH_SHEET_PATH& d1 ); bool operator==( const SCH_SHEET_PATH& d1 ) const; @@ -439,25 +429,6 @@ public: SCH_ITEM* FindPreviousItem( KICAD_T aType, SCH_SHEET_PATH** aSheetFound = NULL, SCH_ITEM* aLastItem = NULL, bool aWrap = true ); - /** - * Function MatchNextItem - * searches the entire schematic for the next item that matches the search criteria. - * - * @param aSearchData Criteria to search item against. - * @param aSheetFoundIn A reference to the sheet path the last item was found in. Use - * wxEmptyString to search from the beginning of the sheet list. - * This will be set to the human readable sheet path if an item - * is found. - * @param aLastItem Find next item after aLastItem if not NULL. - * @param aFindLocation A pointer to a wxPoint object to put the location of matched - * item into. It can be NULL. - * @return A SCH_ITEM pointer the next schematic item if found. Otherwise, returns NULL. - */ - SCH_ITEM* MatchNextItem( wxFindReplaceData& aSearchData, - wxString& aSheetFoundIn, - SCH_ITEM* aLastItem, - wxPoint* aFindLocation ); - /** * Function SetFootprintField * searches all the sheets for a component with \a aReference and set the footprint diff --git a/eeschema/sch_sheet_pin.cpp b/eeschema/sch_sheet_pin.cpp index 73f5d4b046..eefbf182d1 100644 --- a/eeschema/sch_sheet_pin.cpp +++ b/eeschema/sch_sheet_pin.cpp @@ -361,15 +361,19 @@ bool SCH_SHEET_PIN::Load( LINE_READER& aLine, wxString& aErrorMsg ) case 'I': m_Shape = NET_INPUT; break; + case 'O': m_Shape = NET_OUTPUT; break; + case 'B': m_Shape = NET_BIDI; break; + case 'T': m_Shape = NET_TRISTATE; break; + case 'U': m_Shape = NET_UNSPECIFIED; break; @@ -380,12 +384,15 @@ bool SCH_SHEET_PIN::Load( LINE_READER& aLine, wxString& aErrorMsg ) case 'R' : /* pin on right side */ SetEdge( 1 ); break; + case 'T' : /* pin on top side */ SetEdge( 2 ); break; + case 'B' : /* pin on bottom side */ SetEdge( 3 ); break; + case 'L' : /* pin on left side */ default : SetEdge( 0 ); @@ -397,12 +404,17 @@ bool SCH_SHEET_PIN::Load( LINE_READER& aLine, wxString& aErrorMsg ) bool SCH_SHEET_PIN::Matches( wxFindReplaceData& aSearchData, - void* aAuxData, wxPoint * aFindLocation ) + void* aAuxData, wxPoint* aFindLocation ) { + wxCHECK_MSG( GetParent() != NULL, false, + wxT( "Sheet pin " ) + m_Text + wxT( " does not have a parent sheet!" ) ); + + wxLogTrace( traceFindReplace, wxT( " child item " ) + GetSelectMenuText() ); + if( SCH_ITEM::Matches( m_Text, aSearchData ) ) { if( aFindLocation ) - *aFindLocation = m_Pos; + *aFindLocation = GetBoundingBox().Centre(); return true; } diff --git a/eeschema/sch_text.cpp b/eeschema/sch_text.cpp index 397cbc357c..d97d41f63b 100644 --- a/eeschema/sch_text.cpp +++ b/eeschema/sch_text.cpp @@ -167,6 +167,8 @@ wxPoint SCH_TEXT::GetSchematicTextOffset() const bool SCH_TEXT::Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint * aFindLocation ) { + wxLogTrace( traceFindReplace, wxT( " item " ) + GetSelectMenuText() ); + if( SCH_ITEM::Matches( m_Text, aSearchData ) ) { EDA_RECT BoundaryBox = GetBoundingBox(); diff --git a/eeschema/sch_text.h b/eeschema/sch_text.h index 331d679114..33508884ff 100644 --- a/eeschema/sch_text.h +++ b/eeschema/sch_text.h @@ -328,6 +328,11 @@ public: virtual BITMAP_DEF GetMenuImage() const { return add_line_label_xpm; } + /** + * @copydoc EDA_ITEM::IsReplaceable() + */ + virtual bool IsReplaceable() const { return true; } + private: virtual bool doHitTest( const wxPoint& aPoint, int aAccuracy ) const; virtual bool doIsConnected( const wxPoint& aPosition ) const { return m_Pos == aPosition; } diff --git a/eeschema/schframe.cpp b/eeschema/schframe.cpp index 9b86d62be4..098668d872 100644 --- a/eeschema/schframe.cpp +++ b/eeschema/schframe.cpp @@ -122,9 +122,9 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME ) EVT_TOOL( ID_GET_NETLIST, SCH_EDIT_FRAME::OnCreateNetlist ) EVT_TOOL( ID_GET_TOOLS, SCH_EDIT_FRAME::OnCreateBillOfMaterials ) EVT_TOOL( ID_FIND_ITEMS, SCH_EDIT_FRAME::OnFindItems ) + EVT_TOOL( wxID_REPLACE, SCH_EDIT_FRAME::OnFindItems ) EVT_TOOL( ID_BACKANNO_ITEMS, SCH_EDIT_FRAME::OnLoadStuffFile ) EVT_TOOL( ID_SCH_MOVE_ITEM, SCH_EDIT_FRAME::OnMoveItem ) - EVT_MENU( wxID_HELP, EDA_DRAW_FRAME::GetKicadHelp ) EVT_MENU( wxID_INDEX, EDA_DRAW_FRAME::GetKicadHelp ) EVT_MENU( wxID_ABOUT, EDA_BASE_FRAME::GetKicadAbout ) @@ -173,6 +173,7 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME ) EVT_FIND_DRC_MARKER( wxID_ANY, SCH_EDIT_FRAME::OnFindDrcMarker ) EVT_FIND( wxID_ANY, SCH_EDIT_FRAME::OnFindSchematicItem ) EVT_FIND_REPLACE( wxID_ANY, SCH_EDIT_FRAME::OnFindReplace ) + EVT_FIND_REPLACE_ALL( wxID_ANY, SCH_EDIT_FRAME::OnFindReplace ) END_EVENT_TABLE() @@ -185,12 +186,12 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( wxWindow* father, EDA_DRAW_FRAME( father, SCHEMATIC_FRAME, title, pos, size, style ) { m_FrameName = wxT( "SchematicFrame" ); - m_Draw_Axis = FALSE; // true to show axis + m_Draw_Axis = false; // true to show axis m_Draw_Sheet_Ref = true; // true to show sheet references - m_CurrentSheet = new SCH_SHEET_PATH(); + m_CurrentSheet = new SCH_SHEET_PATH(); m_TextFieldSize = DEFAULT_SIZE_TEXT; - m_LibeditFrame = NULL; // Component editor frame. - m_ViewlibFrame = NULL; // Frame for browsing component libraries + m_LibeditFrame = NULL; // Component editor frame. + m_ViewlibFrame = NULL; // Frame for browsing component libraries m_DefaultSchematicFileName = NAMELESS_PROJECT; m_DefaultSchematicFileName += wxT( ".sch" ); m_ShowAllPins = false; @@ -203,6 +204,7 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( wxWindow* father, m_findReplaceData = new wxFindReplaceData( wxFR_DOWN ); m_undoItem = NULL; m_hasAutoSave = true; + m_foundItemIndex = 0; CreateScreens(); @@ -635,10 +637,10 @@ void SCH_EDIT_FRAME::OnCreateBillOfMaterials( wxCommandEvent& ) } -void SCH_EDIT_FRAME::OnFindItems( wxCommandEvent& event ) +void SCH_EDIT_FRAME::OnFindItems( wxCommandEvent& aEvent ) { - wxASSERT_MSG( m_findReplaceData != NULL, - wxT( "Forgot to create find/replace data. Bad Programmer!" ) ); + wxCHECK_RET( m_findReplaceData != NULL, + wxT( "Forgot to create find/replace data. Bad Programmer!" ) ); this->DrawPanel->m_IgnoreMouseEvents = true; @@ -661,7 +663,13 @@ void SCH_EDIT_FRAME::OnFindItems( wxCommandEvent& event ) position = wxDefaultPosition; } - m_dlgFindReplace = new DIALOG_SCH_FIND( this, m_findReplaceData, position, m_findDialogSize ); + int style = 0; + + if( aEvent.GetId() == wxID_REPLACE ) + style = wxFR_REPLACEDIALOG; + + m_dlgFindReplace = new DIALOG_SCH_FIND( this, m_findReplaceData, position, m_findDialogSize, + style ); m_dlgFindReplace->SetFindEntries( m_findStringHistoryList ); m_dlgFindReplace->SetReplaceEntries( m_replaceStringHistoryList ); diff --git a/eeschema/tool_sch.cpp b/eeschema/tool_sch.cpp index 8738e84941..7f3d2b0017 100644 --- a/eeschema/tool_sch.cpp +++ b/eeschema/tool_sch.cpp @@ -77,6 +77,9 @@ void SCH_EDIT_FRAME::ReCreateHToolbar() msg = AddHotkeyName( HELP_FIND, s_Schematic_Hokeys_Descr, HK_FIND_ITEM, IS_COMMENT ); m_HToolBar->AddTool( ID_FIND_ITEMS, wxEmptyString, KiBitmap( find_xpm ), msg ); + // m_HToolBar->AddTool( wxID_REPLACE, wxEmptyString, KiBitmap( find_replace_xpm ), + // wxNullBitmap, wxITEM_NORMAL, _( "Find and replace text" ), + // HELP_REPLACE, NULL ); m_HToolBar->AddSeparator(); diff --git a/include/base_struct.h b/include/base_struct.h index c81d803424..28355053e0 100644 --- a/include/base_struct.h +++ b/include/base_struct.h @@ -1,3 +1,28 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com + * Copyright (C) 2008-2011 Wayne Stambaugh + * Copyright (C) 2004-2011 KiCad Developers, see change_log.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 + */ + /** * @file base_struct.h * @brief Basic classes for most KiCad items. @@ -37,7 +62,7 @@ enum KICAD_T { PCB_MODULE_TEXT_T, // a text in a footprint PCB_MODULE_EDGE_T, // a footprint edge PCB_TRACE_T, // a track segment (segment on a copper layer) - PCB_VIA_T, // a via (like atrack segment on a copper layer) + PCB_VIA_T, // a via (like a track segment on a copper layer) PCB_ZONE_T, // a segment used to fill a zone area (segment on a // copper layer) PCB_MARKER_T, // a marker used to show something @@ -48,7 +73,7 @@ enum KICAD_T { PCB_ITEM_LIST_T, // a list of board items // Schematic draw Items. The order of these items effects the sort order. - // It is currenlty ordered to mimic the old Eeschema locate behavior where + // It is currently ordered to mimic the old Eeschema locate behavior where // the smallest item is the selected item. SCH_MARKER_T, SCH_JUNCTION_T, @@ -143,8 +168,8 @@ public: * @param testItem An EDA_ITEM to examine. * @param testData is arbitrary data needed by the inspector to determine * if the EDA_ITEM under test meets its match criteria. - * @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan, - * else SCAN_CONTINUE; + * @return SEARCH_RESULT SEARCH_QUIT if the Iterator is to stop the scan, + * else SCAN_CONTINUE; */ SEARCH_RESULT virtual Inspect( EDA_ITEM* testItem, const void* testData ) = 0; }; @@ -187,7 +212,7 @@ public: /** * Function Normalize - * ensures thatthe height ant width are positive. + * ensures that the height ant width are positive. */ void Normalize(); @@ -351,8 +376,7 @@ public: int m_Flags; // flags for editing and other uses. unsigned long m_TimeStamp; // Time stamp used for logical links - int m_Selected; /* Used by block commands, and selective - * editing */ + int m_Selected; /* Used by block commands, and selective editing */ // member used in undo/redo function EDA_ITEM* m_Image; // Link to an image copy to save a copy of @@ -513,15 +537,15 @@ public: * * @param listStart The first in a list of EDA_ITEMs to iterate over. * @param inspector Is an INSPECTOR to call on each object that is one of - * the requested scanTypes. - * @param testData Is an aid to testFunc, and should be sufficient to - * allow it to fully determine if an item meets the match criteria, but it - * may also be used to collect output. - * @param scanTypes A KICAD_T array that is EOT - * terminated, and provides both the order and interest level of of - * the types of objects to be iterated over. - * @return SEARCH_RESULT - SEARCH_QUIT if the called INSPECTOR returned - * SEARCH_QUIT, else SCAN_CONTINUE; + * the requested scanTypes. + * @param testData Is an aid to testFunc, and should be sufficient to allow + * it to fully determine if an item meets the match criteria, + * but it may also be used to collect output. + * @param scanTypes A KICAD_T array that is EOT terminated, and provides both + * the order and interest level of of the types of objects to + * be iterated over. + * @return SEARCH_RESULT SEARCH_QUIT if the called INSPECTOR returned + * SEARCH_QUIT, else SCAN_CONTINUE; */ static SEARCH_RESULT IterateForward( EDA_ITEM* listStart, INSPECTOR* inspector, @@ -538,9 +562,9 @@ public: * @param inspector An INSPECTOR instance to use in the inspection. * @param testData Arbitrary data used by the inspector. * @param scanTypes Which KICAD_T types are of interest and the order - * is significant too, terminated by EOT. - * @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan, - * else SCAN_CONTINUE, and determined by the inspector. + * is significant too, terminated by EOT. + * @return SEARCH_RESULT SEARCH_QUIT if the Iterator is to stop the scan, + * else SCAN_CONTINUE, and determined by the inspector. */ virtual SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData, const KICAD_T scanTypes[] ); @@ -569,7 +593,7 @@ public: /** * Function GetMenuImage * returns a pointer to an image to be used in menus. The default version returns - * the right arrow image. Overide this function to provide object specific menu + * the right arrow image. Override this function to provide object specific menu * images. * @return The menu image associated with the item. */ @@ -582,7 +606,7 @@ public: * The base class returns false since many of the objects derived from EDA_ITEM * do not have any text to search. * - * @param aSearchData A reference to a wxFindReplaceData object containin the + * @param aSearchData A reference to a wxFindReplaceData object containing the * search criteria. * @param aAuxData A pointer to optional data required for the search or NULL * if not used. @@ -600,7 +624,7 @@ public: * Function Matches * compares \a aText against search criteria in \a aSearchData. * - * @param aText A referenc to a wxString object containing the string to test. + * @param aText A reference to a wxString object containing the string to test. * @param aSearchData The criteria to search against. * @return True if \a aText matches the search criteria in \a aSearchData. */ @@ -643,7 +667,7 @@ public: * Function Show * is used to output the object tree, currently for debugging only. * @param nestLevel An aid to prettier tree indenting, and is the level - * of nesting of this object within the overall tree. + * of nesting of this object within the overall tree. * @param os The ostream& to output to. */ virtual void Show( int nestLevel, std::ostream& os ) const; @@ -675,7 +699,7 @@ inline EDA_ITEM* new_clone( const EDA_ITEM& aItem ) { return aItem.Clone(); } /** * Define list of drawing items for screens. * - * The standard C++ containter was choosen so the pointer can be removed from a list without + * The standard C++ container was chosen so the pointer can be removed from a list without * it being destroyed. */ typedef std::vector< EDA_ITEM* > EDA_ITEMS; @@ -700,7 +724,7 @@ enum GRTextVertJustifyType { enum GRTraceMode { FILAIRE = 0, // segments are drawn as lines FILLED, // normal mode: segments have thickness - SKETCH // sketcg mode: segments have thickness, but are not + SKETCH // sketch mode: segments have thickness, but are not // filled }; @@ -796,14 +820,13 @@ public: /** * Function Draw - * @param aPanel = the current DrawPanel - * @param aDC = the current Device Context - * @param aOffset = draw offset (usually (0,0)) - * @param aColor = text color - * @param aDrawMode = GR_OR, GR_XOR.., -1 to use the current mode. - * @param aDisplay_mode = FILAIRE, FILLED or SKETCH - * @param aAnchor_color = anchor color ( UNSPECIFIED_COLOR = do - * not draw anchor ). + * @param aPanel = the current DrawPanel + * @param aDC = the current Device Context + * @param aOffset = draw offset (usually (0,0)) + * @param aColor = text color + * @param aDrawMode = GR_OR, GR_XOR.., -1 to use the current mode. + * @param aDisplay_mode = FILAIRE, FILLED or SKETCH + * @param aAnchor_color = anchor color ( UNSPECIFIED_COLOR = do not draw anchor ). */ void Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset, EDA_Colors aColor, @@ -816,16 +839,15 @@ private: * Function DrawOneLineOfText * Draw a single text line. * Used to draw each line of this EDA_TEXT, that can be multiline - * @param aPanel = the current DrawPanel - * @param aDC = the current Device Context - * @param aOffset = draw offset (usually (0,0)) - * @param aColor = text color - * @param aDrawMode = GR_OR, GR_XOR.., -1 to use the current mode. - * @param aFillMode = FILAIRE, FILLED or SKETCH - * @param aAnchor_color = anchor color ( UNSPECIFIED_COLOR = do - * not draw anchor ). - * @param aText = the single line of text to draw. - * @param aPos = the position of this line ). + * @param aPanel = the current DrawPanel + * @param aDC = the current Device Context + * @param aOffset = draw offset (usually (0,0)) + * @param aColor = text color + * @param aDrawMode = GR_OR, GR_XOR.., -1 to use the current mode. + * @param aFillMode = FILAIRE, FILLED or SKETCH + * @param aAnchor_color = anchor color ( UNSPECIFIED_COLOR = do not draw anchor ). + * @param aText = the single line of text to draw. + * @param aPos = the position of this line ). */ void DrawOneLineOfText( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset, EDA_Colors aColor, @@ -868,14 +890,14 @@ public: * useful in multiline texts to calculate the full text or a line area (for * zones filling, locate functions....) * @return the rect containing the line of text (i.e. the position and the - * size of one line) - * this rectangle is calculated for 0 orient text. if orient is not 0 the - * rect must be rotated to match the physical area - * @param aLine : the line of text to consider. + * size of one line) this rectangle is calculated for 0 orient text. + * If orientation is not 0 the rect must be rotated to match the + * physical area + * @param aLine The line of text to consider. * for single line text, aLine is unused * If aLine == -1, the full area (considering all lines) is returned - * @param aThickness - Overrides the current thickness when greater than 0. - * @param aInvertY - Invert the Y axis when calculating bounding box. + * @param aThickness Overrides the current thickness when greater than 0. + * @param aInvertY Invert the Y axis when calculating bounding box. */ EDA_RECT GetTextBox( int aLine = -1, int aThickness = -1, bool aInvertY = false ) const; diff --git a/include/class_collector.h b/include/class_collector.h index bffaf089c9..436745c4a6 100644 --- a/include/class_collector.h +++ b/include/class_collector.h @@ -22,6 +22,11 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ +/** + * @file class_collector.h + * @brief COLLECTOR class definition. + */ + #ifndef COLLECTOR_H #define COLLECTOR_H @@ -51,33 +56,48 @@ class COLLECTOR : public INSPECTOR { protected: /// Which object types to scan - const KICAD_T* m_ScanTypes; + const KICAD_T* m_ScanTypes; /// A place to hold collected objects without taking ownership of their memory. - std::vector m_List; + std::vector m_List; - /// A point to test against, andt that was used to make the collection. - wxPoint m_RefPos; + /// A point to test against, and that was used to make the collection. + wxPoint m_RefPos; /// A bounding box to test against, and that was used to make the collection. - EDA_RECT m_RefBox; + EDA_RECT m_RefBox; /// The time at which the collection was made. - int m_TimeAtCollection; + int m_TimeAtCollection; public: COLLECTOR() { - m_ScanTypes = 0; + m_ScanTypes = 0; } + virtual ~COLLECTOR() { } + /** + * Function IsValidIndex + * tests if \a aIndex is with the limits of the list of collected items. + * + * @param aIndex The index to test. + * @return True if \a aIndex is with the limits of the list of collected items, + * otherwise false. + */ + bool IsValidIndex( int aIndex ) + { + return ( (unsigned) aIndex < m_List.size() ); + } + + /** * Function GetCount * returns the number of objects in the list @@ -108,29 +128,33 @@ public: m_List.push_back( item ); } + /** * Function Remove - * removes the item at item_position (first position is 0); - * @param ndx The index into the list. + * removes the item at \a aIndex (first position is 0); + * @param aIndex The index into the list. */ - void Remove( int ndx ) + void Remove( int aIndex ) { - m_List.erase( m_List.begin() + ndx ); + m_List.erase( m_List.begin() + aIndex ); } + /** * Function operator[int] - * is used for read only access and returns the object at index ndx. - * @param ndx The index into the list. + * is used for read only access and returns the object at \a aIndex. + * @param aIndex The index into the list. * @return EDA_ITEM* - or something derived from it, or NULL. */ - EDA_ITEM* operator[]( int ndx ) const + EDA_ITEM* operator[]( int aIndex ) const { - if( (unsigned)ndx < (unsigned)GetCount() ) // (unsigned) excludes ndx<0 also - return m_List[ ndx ]; + if( (unsigned)aIndex < (unsigned)GetCount() ) // (unsigned) excludes aIndex<0 also + return m_List[ aIndex ]; + return NULL; } + /** * Function BasePtr * returns the address of the first element in the array. Only call this @@ -142,6 +166,7 @@ public: return &m_List[0]; } + /** * Function HasItem * tests if \a aItem has already been collected. @@ -160,23 +185,26 @@ public: return false; } + /** * Function SetScanTypes * records the list of KICAD_T types to consider for collection by * the Inspect() function. * @param scanTypes An array of KICAD_T, terminated by EOT. No copy is - * is made of this array (so cannot come from caller's stack). + * is made of this array (so cannot come from caller's stack). */ void SetScanTypes( const KICAD_T* scanTypes ) { m_ScanTypes = scanTypes; } + void SetTimeNow() { m_TimeAtCollection = GetTimeStamp(); } + int GetTime() { return m_TimeAtCollection; @@ -206,32 +234,13 @@ public: int dx = abs( aRefPos.x - m_RefPos.x ); int dy = abs( aRefPos.y - m_RefPos.y ); - if( dx <= distMax && dy <= distMax - && GetTimeStamp()-m_TimeAtCollection <= timeMax ) + if( dx <= distMax && dy <= distMax && GetTimeStamp()-m_TimeAtCollection <= timeMax ) return true; else return false; } - /** - * Function Inspect - * is the examining function within the INSPECTOR which is passed to the - * Iterate function. It is used primarily for searching, but not limited to - * that. It can also collect or modify the scanned objects. - * - * @param testItem An EDA_ITEM to examine. - * @param testData is arbitrary data needed by the inspector to determine - * if the EDA_ITEM under test meets its match criteria. - * @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan, - * else SCAN_CONTINUE; - * - * implement in derived class: - SEARCH_RESULT virtual Inspect( EDA_ITEM* testItem, - const void* testData ) = 0; - */ - - /** * Function Collect * scans an EDA_ITEM using this class's Inspector method, which does @@ -260,4 +269,3 @@ public: }; #endif // COLLECTOR_H - diff --git a/include/common.h b/include/common.h index 098315a1c8..75a170e24e 100644 --- a/include/common.h +++ b/include/common.h @@ -392,7 +392,7 @@ int ReturnValueFromTextCtrl( const wxTextCtrl& TextCtr, * @param aString is the text to split * @param aSplitter is the 'split' character */ -wxArrayString* wxStringSplit( wxString txt, wxChar aSplitter ); +wxArrayString* wxStringSplit( wxString aString, wxChar aSplitter ); /** * Function To_User_Unit diff --git a/include/sch_item_struct.h b/include/sch_item_struct.h index 0546d40c3e..a77984b51c 100644 --- a/include/sch_item_struct.h +++ b/include/sch_item_struct.h @@ -61,6 +61,10 @@ typedef vector< SCH_ITEMS_ITR > SCH_ITEMS_ITRS; #endif +/// Flag to enable find and replace tracing using the WXTRACE environment variable. +extern const wxString traceFindReplace; + + enum DANGLING_END_T { UNKNOWN = 0, WIRE_START_END, diff --git a/include/wxEeschemaStruct.h b/include/wxEeschemaStruct.h index 42f503291d..bbfd27d09a 100644 --- a/include/wxEeschemaStruct.h +++ b/include/wxEeschemaStruct.h @@ -146,12 +146,16 @@ private: SCH_ITEM* m_itemToRepeat; ///< Last item to insert by the repeat command. int m_repeatLabelDelta; ///< Repeat label number increment step. SCH_COLLECTOR m_collectedItems; ///< List of collected items. + SCH_FIND_COLLECTOR m_foundItems; ///< List of find/replace items. SCH_ITEM* m_undoItem; ///< Copy of the current item being edited. wxString m_simulatorCommand; ///< Command line used to call the circuit ///< simulator (gnucap, spice, ...) wxString m_netListerCommand; ///< Command line to call a custom net list ///< generator. + /// An index to the last find item in the found items list #m_foundItems. + int m_foundItemIndex; + static int m_lastSheetPinType; ///< Last sheet pin type. static wxSize m_lastSheetPinTextSize; ///< Last sheet pin text size. static wxPoint m_lastSheetPinPosition; ///< Last sheet pin position. diff --git a/pcbnew/block.cpp b/pcbnew/block.cpp index 780b44abd8..9b4ba99c70 100644 --- a/pcbnew/block.cpp +++ b/pcbnew/block.cpp @@ -24,7 +24,7 @@ */ /** - * @file block.cpp + * @file pcbnew/block.cpp */
- * Daggable juntions are defined as: + * Daggable junctions are defined as: *