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...
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
virtual const wxString & GetText() const override
Return the string associated with the text object.
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.