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.