41#include <wx/tokenzr.h>
42#include <wx/choicdlg.h>
43#include <wx/dcclient.h>
52#define COL_CURR_LIBID 1
53#define COL_NEW_LIBID 2
59 int GetHeight( wxDC& aDC, wxGrid* aGrid,
int aRow,
int aCol );
61 wxGridCellRenderer *
Clone()
const override
67 wxArrayString
GetTextLines( wxGrid&
grid, wxDC& dc,
const wxGridCellAttr& attr,
68 const wxRect& rect,
int row,
int col );
75 void BreakLine( wxDC& dc,
const wxString& logicalLine, wxCoord maxWidth, wxArrayString& lines );
82 wxCoord
BreakWord( wxDC& dc,
const wxString& word, wxCoord maxWidth, wxArrayString& lines,
89 const wxGridCellAttr& attr,
90 const wxRect& rect,
int row,
int col )
92 dc.SetFont( attr.GetFont() );
93 const wxCoord maxWidth = rect.GetWidth();
96 const wxArrayString logicalLines = wxSplit(
grid.GetCellValue( row, col ),
'\n',
'\0' );
103 wxArrayString physicalLines;
105 for(
const wxString& line : logicalLines )
107 if( dc.GetTextExtent( line ).x > maxWidth )
110 BreakLine( dc, line, maxWidth, physicalLines );
114 physicalLines.push_back( line );
118 return physicalLines;
124 wxCoord maxWidth, wxArrayString& lines )
126 wxCoord lineWidth = 0;
130 wxStringTokenizer wordTokenizer( logicalLine, wxS(
" \t" ), wxTOKEN_RET_DELIMS );
132 while( wordTokenizer.HasMoreTokens() )
134 const wxString word = wordTokenizer.GetNextToken();
135 const wxCoord wordWidth = dc.GetTextExtent( word ).x;
137 if( lineWidth + wordWidth < maxWidth )
141 lineWidth += wordWidth;
147 if( wordWidth < maxWidth )
151 lines.push_back( line );
153 lineWidth = wordWidth;
159 lines.push_back( line );
165 lineWidth =
BreakWord( dc, word, maxWidth, lines, line );
171 lines.push_back( line );
177 wxCoord maxWidth, wxArrayString& lines,
181 dc.GetPartialTextExtents( word, widths );
184 const unsigned count = widths.size();
187 for( n = 0; n < count; n++ )
189 if( widths[n] > maxWidth )
201 lines.push_back( word.substr( 0, n ) );
209 const wxString rest = word.substr( n );
210 const wxCoord restWidth = dc.GetTextExtent( rest ).x;
212 if( restWidth <= maxWidth )
222 return BreakWord( dc, rest, maxWidth, lines, line );
226#define GRID_CELL_MARGIN 4
230 wxGridCellAttr* attr = aGrid->GetOrCreateCellAttr( aRow, aCol );
233 aDC.SetFont( attr->GetFont() );
236 const size_t numLines =
GetTextLines( *aGrid, aDC, *attr, rect, aRow, aCol ).size();
237 const int textHeight = numLines * aDC.GetCharHeight();
303 void AddRowToGrid(
bool aMarkRow,
const wxString& aReferences,
const wxString& aStrLibId );
339 void OnSizeGrid( wxSizeEvent& event )
override;
366 m_grid->PopEventHandler(
true );
401 for(
unsigned ii = 0; ii < references.
GetCount(); ii++ )
420 wxString last_str_libid =
m_symbols.front().GetStringLibId();
424 bool mark_cell =
m_symbols.front().m_IsOrphan;
428 wxString str_libid = symbol.GetStringLibId();
430 if( last_str_libid != str_libid )
436 mark_cell = symbol.m_IsOrphan;
437 last_str_libid = str_libid;
441 else if( symbol.m_Reference == last_ref )
447 last_ref = symbol.m_Reference;
449 if( !refs.IsEmpty() )
452 refs += symbol.m_Reference;
460 m_grid->SetSelectionMode( wxGrid::wxGridSelectRows );
474 const wxString& aStrLibId )
476 int row =
m_grid->GetNumberRows();
491 wxFont font =
m_grid->GetDefaultCellFont();
501 wxClientDC dc(
this );
505 wxGridCellAttr* attr =
new wxGridCellAttr;
513 wxString rawValue = aGrid->GetCellValue( aRow, aCol );
515 if( rawValue.IsEmpty() )
519 wxString libName = rawValue.BeforeFirst(
':', &itemName );
530 int row_max =
m_grid->GetNumberRows() - 1;
532 for(
int row = 0; row <= row_max; row++ )
536 if( new_libid.IsEmpty() )
541 id.
Parse( new_libid );
546 msg.Printf(
_(
"Symbol library identifier %s is not valid." ), new_libid );
553 m_grid->EnableCellEditControl(
true );
554 m_grid->ShowCellEditControl();
566 int row =
event.GetRow();
577 wxArrayString aliasNames;
578 wxArrayString candidateSymbNames;
580 unsigned fixesCount = 0;
586 int grid_row_idx = orphanRow;
589 curr_libid.
Parse( orphanLibid,
true );
595 int libIdCandidateCount = 0;
596 candidateSymbNames.Clear();
599 for(
const wxString &lib : libs )
609 if( aliasNames.IsEmpty() )
613 int index = aliasNames.Index( symbolName );
615 if( index != wxNOT_FOUND )
618 libIdCandidateCount++;
619 wxString newLibid = lib +
':' + symbolName;
623 if( libIdCandidateCount <= 1 )
637 if( libIdCandidateCount > 1 )
640 m_grid->SelectRow( grid_row_idx );
643 msg.Printf(
_(
"Available Candidates for %s " ),
646 wxSingleChoiceDialog dlg (
this, msg,
647 wxString::Format(
_(
"Candidates count %d " ),
648 libIdCandidateCount ),
649 candidateSymbNames );
651 if( dlg.ShowModal() == wxID_OK )
658 wxMessageBox( wxString::Format(
_(
"%u link(s) mapped, %u not found" ),
664 wxMessageBox( wxString::Format(
_(
"All %u link(s) resolved" ), fixesCount ) );
672 std::vector<PICKED_SYMBOL> dummyHistory;
676 if( current.IsEmpty() )
679 if( !current.IsEmpty() )
680 preselected.
Parse( current,
true );
683 &preselected,
false );
690 wxMessageBox(
_(
"Invalid symbol library identifier" ) );
708 auto getName = [](
const LIB_ID& aLibId )
713 int row_max =
m_grid->GetNumberRows() - 1;
715 for(
int row = 0; row <= row_max; row++ )
724 id.
Parse( new_libid,
true );
728 if( candidate.m_Row != row )
741 msg.Printf(
_(
"Error loading symbol %s from library %s.\n\n%s" ),
742 id.GetLibItemName().wx_str(),
743 id.GetLibNickname().wx_str(),
749 if( symbol ==
nullptr )
756 candidate.m_Screen->Remove( candidate.m_Symbol );
760 if( getName( candidate.m_Symbol->GetLibId() ) == value->
GetText() )
761 candidate.m_Symbol->SetValueFieldText( getName(
id ) );
763 candidate.m_Symbol->SetLibId(
id );
764 candidate.m_Symbol->SetLibSymbol( symbol->
Flatten().release() );
765 candidate.m_Screen->Append( candidate.m_Symbol );
766 candidate.m_Screen->SetContentModified();
770 candidate.m_Symbol->UpdateFields(
nullptr,
789 int colWidth = width / 3;
796 for(
int row = 0; row <
m_grid->GetNumberRows(); ++row )
808 for(
int row = 0; row <
m_grid->GetNumberRows(); ++row )
823 wxClientDC dc(
this );
826 for(
int row = 0; row <
m_grid->GetNumberRows(); ++row )
Class DIALOG_EDIT_SYMBOLS_LIBID_BASE.
wxCheckBox * m_checkBoxUpdateFields
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.
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.
wxString GetUniStringLibId() const
const UTF8 & GetLibItemName() const
Define a library symbol object.
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
std::vector< wxString > GetLogicalLibs()
Return the logical library names, all of them that are pertinent to a look up done on this LIB_TABLE.
static SYMBOL_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
SCH_SHEET_LIST GetSheets() const override
Builds and returns an updated schematic hierarchy TODO: can this be cached?
PICKED_SYMBOL PickSymbolFromLibrary(const SYMBOL_LIBRARY_FILTER *aFilter, std::vector< PICKED_SYMBOL > &aHistoryList, bool aShowFootprints, const LIB_ID *aHighlight=nullptr, bool aAllowFields=true)
Call the library viewer to select symbol to import into schematic.
Schematic editor (Eeschema) main window.
void SaveCopyInUndoList(SCH_SCREEN *aScreen, SCH_ITEM *aItemToCopy, UNDO_REDO aTypeCommand, bool aAppend, bool aDirtyConnectivity=true)
Create a copy of the current schematic item, and put it in the undo list.
SCHEMATIC & Schematic() const
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
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
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
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()
int GetUnitCount() const
Return the number of units per package of the symbol.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const
Return the reference for the given sheet path.
const LIB_ID & GetLibId() const
A helper to handle symbols to edit.
SYMBOL_CANDIDATE(SCH_SYMBOL *aSymbol)
wxString GetStringLibId()
void EnumerateSymbolLib(const wxString &aNickname, wxArrayString &aAliasNames, bool aPowerSymbolsOnly=false)
Return a list of symbol alias names contained within the library given by aNickname.
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
void ClearRows()
wxWidgets recently added an ASSERT which fires if the position is greater than or equal to the number...
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box 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...
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
Field Value of part, i.e. "3.3K".
wxLogTrace helper definitions.