42#include <wx/tokenzr.h>
43#include <wx/choicdlg.h>
44#include <wx/dcclient.h>
54#define COL_CURR_LIBID 1
55#define COL_NEW_LIBID 2
61 int GetHeight( wxDC& aDC, wxGrid* aGrid,
int aRow,
int aCol );
63 wxGridCellRenderer *
Clone()
const override
71 wxArrayString
GetTextLines( wxGrid&
grid, wxDC& dc,
const wxGridCellAttr& attr,
72 const wxRect& rect,
int row,
int col );
79 void BreakLine( wxDC& dc,
const wxString& logicalLine, wxCoord maxWidth, wxArrayString& lines );
86 wxCoord
BreakWord( wxDC& dc,
const wxString& word, wxCoord maxWidth, wxArrayString& lines,
93 const wxGridCellAttr& attr,
94 const wxRect& rect,
int row,
int col )
96 dc.SetFont( attr.GetFont() );
97 const wxCoord maxWidth = rect.GetWidth();
100 const wxArrayString logicalLines = wxSplit(
grid.GetCellValue( row, col ),
'\n',
'\0' );
107 wxArrayString physicalLines;
109 for(
const wxString& line : logicalLines )
111 if( dc.GetTextExtent( line ).x > maxWidth )
114 BreakLine( dc, line, maxWidth, physicalLines );
118 physicalLines.push_back( line );
122 return physicalLines;
128 wxCoord maxWidth, wxArrayString& lines )
130 wxCoord lineWidth = 0;
134 wxStringTokenizer wordTokenizer( logicalLine,
" \t", wxTOKEN_RET_DELIMS );
136 while( wordTokenizer.HasMoreTokens() )
138 const wxString word = wordTokenizer.GetNextToken();
139 const wxCoord wordWidth = dc.GetTextExtent( word ).x;
141 if( lineWidth + wordWidth < maxWidth )
145 lineWidth += wordWidth;
151 if( wordWidth < maxWidth )
155 lines.push_back( line );
157 lineWidth = wordWidth;
163 lines.push_back( line );
169 lineWidth =
BreakWord( dc, word, maxWidth, lines, line );
175 lines.push_back( line );
181 wxCoord maxWidth, wxArrayString& lines,
185 dc.GetPartialTextExtents( word, widths );
188 const unsigned count = widths.size();
191 for( n = 0; n < count; n++ )
193 if( widths[n] > maxWidth )
205 lines.push_back( word.substr( 0, n ) );
213 const wxString rest = word.substr( n );
214 const wxCoord restWidth = dc.GetTextExtent( rest ).x;
216 if( restWidth <= maxWidth )
226 return BreakWord( dc, rest, maxWidth, lines, line );
230#define GRID_CELL_MARGIN 4
234 wxGridCellAttr* attr = aGrid->GetOrCreateCellAttr( aRow, aCol );
237 aDC.SetFont( attr->GetFont() );
240 const size_t numLines =
GetTextLines( *aGrid, aDC, *attr, rect, aRow, aCol ).size();
241 const int textHeight = numLines * aDC.GetCharHeight();
267 return m_Symbol->GetLibId().GetUniStringLibId();
307 void AddRowToGrid(
bool aMarkRow,
const wxString& aReferences,
const wxString& aStrLibId );
343 void OnSizeGrid( wxSizeEvent& event )
override;
370 m_grid->PopEventHandler(
true );
405 for(
unsigned ii = 0; ii < references.
GetCount(); ii++ )
424 wxString last_str_libid =
m_symbols.front().GetStringLibId();
428 bool mark_cell =
m_symbols.front().m_IsOrphan;
432 wxString str_libid = symbol.GetStringLibId();
434 if( last_str_libid != str_libid )
440 mark_cell = symbol.m_IsOrphan;
441 last_str_libid = str_libid;
445 else if( symbol.m_Reference == last_ref )
451 last_ref = symbol.m_Reference;
453 if( !refs.IsEmpty() )
456 refs += symbol.m_Reference;
464 m_grid->SetSelectionMode( wxGrid::wxGridSelectRows );
478 const wxString& aStrLibId )
480 int row =
m_grid->GetNumberRows();
495 wxFont font =
m_grid->GetDefaultCellFont();
505 wxClientDC dc(
this );
509 wxGridCellAttr* attr =
new wxGridCellAttr;
517 wxString rawValue = aGrid->GetCellValue( aRow, aCol );
519 if( rawValue.IsEmpty() )
523 wxString libName = rawValue.BeforeFirst(
':', &itemName );
531 if( !
m_grid->CommitPendingChanges() )
534 int row_max =
m_grid->GetNumberRows() - 1;
536 for(
int row = 0; row <= row_max; row++ )
540 if( new_libid.IsEmpty() )
545 id.
Parse( new_libid );
550 msg.Printf(
_(
"Symbol library identifier %s is not valid." ), new_libid );
557 m_grid->EnableCellEditControl(
true );
558 m_grid->ShowCellEditControl();
570 int row =
event.GetRow();
581 std::vector<wxString> aliasNames;
582 wxArrayString candidateSymbNames;
584 unsigned fixesCount = 0;
590 int grid_row_idx = orphanRow;
593 curr_libid.
Parse( orphanLibid,
true );
599 int libIdCandidateCount = 0;
600 candidateSymbNames.Clear();
603 for(
const wxString &lib : libs )
613 if( aliasNames.empty() )
617 if(
auto it = std::ranges::find( aliasNames, symbolName ); it != aliasNames.end() )
620 libIdCandidateCount++;
621 wxString newLibid = lib +
':' + symbolName;
625 if( libIdCandidateCount <= 1 )
639 if( libIdCandidateCount > 1 )
642 m_grid->SelectRow( grid_row_idx );
645 msg.Printf(
_(
"Available Candidates for %s " ),
648 wxSingleChoiceDialog dlg (
this, msg,
649 wxString::Format(
_(
"Candidates count %d " ),
650 libIdCandidateCount ),
651 candidateSymbNames );
653 if( dlg.ShowModal() == wxID_OK )
660 wxMessageBox( wxString::Format(
_(
"%u link(s) mapped, %u not found" ),
666 wxMessageBox( wxString::Format(
_(
"All %u link(s) resolved" ), fixesCount ) );
674 std::vector<PICKED_SYMBOL> dummyHistory;
675 std::vector<PICKED_SYMBOL> dummyAlreadyPlaced;
679 if( current.IsEmpty() )
682 if( !current.IsEmpty() )
683 preselected.
Parse( current,
true );
686 nullptr, dummyHistory, dummyAlreadyPlaced,
false, &preselected,
false );
693 wxMessageBox(
_(
"Invalid symbol library identifier" ) );
713 auto getName = [](
const LIB_ID& aLibId )
718 int row_max =
m_grid->GetNumberRows() - 1;
720 for(
int row = 0; row <= row_max; row++ )
729 id.
Parse( new_libid,
true );
733 if( candidate.m_Row != row )
746 msg.Printf(
_(
"Error loading symbol %s from library %s.\n\n%s" ),
747 id.GetLibItemName().wx_str(),
748 id.GetLibNickname().wx_str(),
754 if( symbol ==
nullptr )
757 commit.
Modify( candidate.m_Symbol, candidate.m_Screen );
760 candidate.m_Screen->Remove( candidate.m_Symbol );
764 if( getName( candidate.m_Symbol->GetLibId() ) == value->
GetText() )
765 candidate.m_Symbol->SetValueFieldText( getName(
id ) );
767 candidate.m_Symbol->SetLibId(
id );
768 candidate.m_Symbol->SetLibSymbol( symbol->
Flatten().release() );
769 candidate.m_Screen->Append( candidate.m_Symbol );
770 candidate.m_Screen->SetContentModified();
774 candidate.m_Symbol->UpdateFields(
nullptr,
785 commit.
Push( wxS(
"Change Symbol Library Indentifier" ) );
796 int colWidth = width / 3;
803 for(
int row = 0; row <
m_grid->GetNumberRows(); ++row )
815 for(
int row = 0; row <
m_grid->GetNumberRows(); ++row )
830 wxClientDC dc(
this );
833 for(
int row = 0; row <
m_grid->GetNumberRows(); ++row )
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
wxCheckBox * m_checkBoxUpdateFields
DIALOG_EDIT_SYMBOLS_LIBID_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxString &title=_("Symbol Library References"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
wxButton * m_buttonOrphanItems
Dialog to globally edit the LIB_ID of groups if symbols having the same initial LIB_ID.
void OnSizeGrid(wxSizeEvent &event) override
std::vector< SYMBOL_CANDIDATE > m_symbols
void onClickOrphansButton(wxCommandEvent &event) override
DIALOG_EDIT_SYMBOLS_LIBID(SCH_EDIT_FRAME *aParent)
bool setLibIdByBrowser(int aRow)
Run the lib browser and set the selected LIB_ID for aRow.
~DIALOG_EDIT_SYMBOLS_LIBID() override
void onCancel(wxCommandEvent &event) override
void onCellBrowseLib(wxGridEvent &event) override
bool validateLibIds()
returns true if all new lib id are valid
SCH_EDIT_FRAME * GetParent()
GRIDCELL_AUTOWRAP_STRINGRENDERER * m_autoWrapRenderer
bool TransferDataFromWindow() override
bool IsSchematicModified()
void AddRowToGrid(bool aMarkRow, const wxString &aReferences, const wxString &aStrLibId)
Add a new row (new entry) in m_grid.
std::vector< int > m_OrphansRowIndexes
bool IsQuasiModal() const
void EndQuasiModal(int retCode)
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
virtual const wxString & GetText() const
Return the string associated with the text object.
wxArrayString GetTextLines(wxGrid &grid, wxDC &dc, const wxGridCellAttr &attr, const wxRect &rect, int row, int col)
int GetHeight(wxDC &aDC, wxGrid *aGrid, int aRow, int aCol)
wxCoord BreakWord(wxDC &dc, const wxString &word, wxCoord maxWidth, wxArrayString &lines, wxString &line)
void BreakLine(wxDC &dc, const wxString &logicalLine, wxCoord maxWidth, wxArrayString &lines)
wxGridCellRenderer * Clone() const override
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
std::vector< wxString > GetLibraryNames() const
Returns a list of library nicknames that are available (skips any that failed to load)
A logical library item identifier and consists of various portions much like a URI.
int Parse(const UTF8 &aId, bool aFix=false)
Parse LIB_ID with the information from aId.
bool IsValid() const
Check if this LID_ID is valid.
const UTF8 & GetLibItemName() const
Define a library symbol object.
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
PICKED_SYMBOL PickSymbolFromLibrary(const SYMBOL_LIBRARY_FILTER *aFilter, std::vector< PICKED_SYMBOL > &aHistoryList, std::vector< PICKED_SYMBOL > &aAlreadyPlaced, bool aShowFootprints, const LIB_ID *aHighlight=nullptr, bool aAllowFields=true)
Call the library viewer to select symbol to import into schematic.
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Execute the changes.
Schematic editor (Eeschema) main window.
SCHEMATIC & Schematic() const
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
A helper to define a symbol's reference designator in a schematic.
const SCH_SHEET_PATH & GetSheetPath() const
SCH_SYMBOL * GetSymbol() const
void GetSymbols(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Add a SCH_REFERENCE object to aReferences for each symbol in the list of sheets.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_SCREEN * LastScreen()
const LIB_ID & GetLibId() const override
int GetUnitCount() const override
Return the number of units per package of the symbol.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
A helper to handle symbols to edit.
SYMBOL_CANDIDATE(SCH_SYMBOL *aSymbol)
wxString GetStringLibId()
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
std::vector< wxString > GetSymbolNames(const wxString &aNickname, SYMBOL_TYPE aType=SYMBOL_TYPE::ALL_SYMBOLS)
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
static bool sort_by_libid(const SYMBOL_CANDIDATE &candidate1, const SYMBOL_CANDIDATE &candidate2)
wxString getLibIdValue(const WX_GRID *aGrid, int aRow, int aCol)
bool InvokeDialogEditSymbolsLibId(SCH_EDIT_FRAME *aCaller)
Run a dialog to modify the LIB_ID of symbols for instance when a symbol has moved from a symbol libra...
KICOMMON_API wxSize GetTextSize(const wxString &aSingleLine, wxWindow *aWindow)
Return the size of aSingleLine of text when it is rendered in aWindow using whatever font is currentl...
wxString UnescapeString(const wxString &aSource)
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
@ VALUE
Field Value of part, i.e. "3.3K".
wxLogTrace helper definitions.