30#include <wx/tooltip.h>
49#include "wx/dcclient.h"
53 bool* aIsUndoable,
bool* aClearAnnotationNewItems,
54 bool* aUpdateHierarchyNavigator,
55 wxString* aSourceSheetFilename ) :
58 m_isUndoable( aIsUndoable ),
59 m_clearAnnotationNewItems( aClearAnnotationNewItems ),
60 m_updateHierarchyNavigator( aUpdateHierarchyNavigator ),
61 m_sourceSheetFilename( aSourceSheetFilename ),
62 m_borderWidth( aParent, m_borderWidthLabel, m_borderWidthCtrl, m_borderWidthUnits ),
63 m_dummySheet( *aSheet ),
73 [&]( wxCommandEvent& aEvent )
77 m_grid->SetSelectionMode( wxGrid::wxGridSelectRows );
94 wxToolTip::Enable(
true );
108 m_grid->Connect( wxEVT_GRID_CELL_CHANGING,
119 cfg->m_Appearance.edit_sheet_width = GetSize().x;
120 cfg->m_Appearance.edit_sheet_height = GetSize().y;
126 m_grid->Disconnect( wxEVT_GRID_CELL_CHANGING,
131 m_grid->PopEventHandler(
true );
137 if( !wxDialog::TransferDataToWindow() )
147 if( field_copy.
GetId() == FIELD_T::SHEET_FILENAME )
149 wxString filename = field_copy.
GetText();
150 filename.Replace( wxT(
"/" ), wxT(
"\\" ) );
151 field_copy.
SetText( filename );
162 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED,
m_fields->size() );
163 m_grid->ProcessTableMessage( msg );
205 for(
size_t i = 0; i <
m_fields->size(); ++i )
267 if( !wxDialog::TransferDataFromWindow() )
278 if( sheetFileName.IsEmpty() )
280 DisplayError(
this,
_(
"A sheet must have a valid file name." ) );
291 DisplayError(
this,
_(
"A sheet must have a valid file name." ) );
295 wxFileName fn( sheetFileName );
297 wxString newRelativeFilename = fn.GetFullPath();
300 newRelativeFilename.Replace( wxT(
"\\" ), wxT(
"/" ) );
303 oldFilename.Replace( wxT(
"\\" ), wxT(
"/" ) );
305 bool filename_changed = oldFilename != newRelativeFilename;
311 wxCHECK( currentScreen,
false );
313 bool clearFileName =
false;
318 clearFileName =
true;
322 wxFileName tmp( fn );
323 wxFileName screenFileName = currentScreen->
GetFileName();
325 if( fn.IsAbsolute() && fn.MakeRelativeTo( screenFileName.GetPath() ) )
327 wxMessageDialog makeRelDlg(
this,
_(
"Use relative path for sheet file?" ),
328 _(
"Sheet File Path" ),
329 wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION | wxCENTER );
331 makeRelDlg.SetExtendedMessage(
_(
"Using relative hierarchical sheet file name paths "
332 "improves schematic portability across systems and "
333 "platforms. Using absolute paths can result in "
334 "portability issues." ) );
335 makeRelDlg.SetYesNoLabels( wxMessageDialog::ButtonLabel(
_(
"Use Relative Path" ) ),
336 wxMessageDialog::ButtonLabel(
_(
"Use Absolute Path" ) ) );
338 if( makeRelDlg.ShowModal() == wxID_YES )
341 "\n to relative path: '%s'",
345 newRelativeFilename = fn.GetFullPath();
376 if( newSheetname.IsEmpty() )
377 newSheetname =
_(
"Untitled Sheet" );
399 else if( fieldName.IsEmpty() )
413 wxPanel temp(
this );
418 KIDIALOG dlg(
this,
_(
"Note: item colors are overridden in the current color theme." ),
420 dlg.ShowDetailedText( wxString::Format(
_(
"To see individual item colors uncheck '%s'\n"
421 "in Preferences > Schematic Editor > Colors." ),
461 wxFileName screenFileName( sheetFileName );
462 wxFileName tmp( sheetFileName );
465 wxCHECK( currentScreen,
false );
468 wxFileName currentScreenFileName = currentScreen->
GetFileName();
471 currentScreenFileName.GetPath() ) )
473 msg = wxString::Format(
_(
"Cannot normalize new sheet schematic file path:\n"
475 "against parent sheet schematic file path:\n"
477 sheetFileName.GetPath(),
478 currentScreenFileName.GetPath() );
483 wxString newAbsoluteFilename = screenFileName.GetFullPath();
486 newAbsoluteFilename.Replace( wxT(
"\\" ), wxT(
"/" ) );
488 bool renameFile =
false;
489 bool loadFromFile =
false;
490 bool clearAnnotation =
false;
491 bool isExistingSheet =
false;
499 loadFromFile = wxFileExists( newAbsoluteFilename );
503 loadFromFile ?
"found" :
"not found" );
509 newAbsoluteFilename ) )
512 if( useScreen || loadFromFile )
514 clearAnnotation =
true;
516 if( !
IsOK(
this, wxString::Format(
_(
"'%s' already exists." ),
517 sheetFileName.GetFullName() )
519 + wxString::Format(
_(
"Link '%s' to this file?" ),
520 newAbsoluteFilename ) ) )
533 msg.Printf(
_(
"Failed to copy schematic file '%s' to destination '%s'." ),
534 currentScreenFileName.GetFullPath(), newAbsoluteFilename );
548 isExistingSheet =
true;
551 newAbsoluteFilename ) )
564 oldAbsoluteFilename.Replace( wxT(
"\\" ), wxT(
"/" ) );
566 if( newAbsoluteFilename.Cmp( oldAbsoluteFilename ) != 0 )
572 if( useScreen || loadFromFile )
574 clearAnnotation =
true;
577 if( !
IsOK(
this, wxString::Format(
_(
"Change '%s' link from '%s' to '%s'?" ),
580 sheetFileName.GetFullName() )
582 +
_(
"This action cannot be undone." ) ) )
594 if( !
IsOK(
this, wxString::Format(
_(
"Create new file '%s' with contents "
596 sheetFileName.GetFullName(),
599 +
_(
"This action cannot be undone." ) ) )
622 pi->SaveSchematicFile( newAbsoluteFilename,
m_sheet, &schematic );
626 msg = wxString::Format(
_(
"Error occurred saving schematic file '%s'." ),
627 newAbsoluteFilename );
630 msg = wxString::Format(
_(
"Failed to save schematic '%s'" ),
631 newAbsoluteFilename );
653 std::unique_ptr< SCH_SHEET> tmpSheet = std::make_unique<SCH_SHEET>( &schematic );
654 *tmpSheet->GetField( FIELD_T::SHEET_NAME ) =
m_fields->
GetField( FIELD_T::SHEET_NAME );
655 tmpSheet->GetField( FIELD_T::SHEET_FILENAME )->
SetText( sheetFileName.GetFullPath() );
656 tmpSheet->SetScreen( useScreen );
671 else if( loadFromFile )
673 bool restoreSheet =
false;
675 if( isExistingSheet )
715 wxGridCellEditor*
editor =
m_grid->GetCellEditor( event.GetRow(), event.GetCol() );
716 wxControl* control =
editor->GetControl();
718 if( control && control->GetValidator() )
719 success = control->GetValidator()->Validate( control );
744 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
745 m_grid->ProcessTableMessage( msg );
750 m_grid->EnableCellEditControl();
751 m_grid->ShowCellEditControl();
757 wxArrayInt selectedRows =
m_grid->GetSelectedRows();
759 if( selectedRows.empty() &&
m_grid->GetGridCursorRow() >= 0 )
760 selectedRows.push_back(
m_grid->GetGridCursorRow() );
762 if( selectedRows.empty() )
765 for(
int row : selectedRows )
767 if( row < m_fields->GetMandatoryRowCount() )
769 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory." ),
778 selectedRows.Sort( [](
int* first,
int* second ) {
return *second - *first; } );
780 for(
int row : selectedRows )
786 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, row, 1 );
787 m_grid->ProcessTableMessage( msg );
789 if(
m_grid->GetNumberRows() > 0 )
791 m_grid->MakeCellVisible( std::max( 0, row-1 ),
m_grid->GetGridCursorCol() );
792 m_grid->SetGridCursor( std::max( 0, row-1 ),
m_grid->GetGridCursorCol() );
803 int i =
m_grid->GetGridCursorRow();
812 m_grid->SetGridCursor( i - 1,
m_grid->GetGridCursorCol() );
827 int i =
m_grid->GetGridCursorRow();
836 m_grid->SetGridCursor( i + 1,
m_grid->GetGridCursorCol() );
851 m_grid->AutoSizeColumn( 0 );
852 m_grid->SetColSize( 0, std::max( 72,
m_grid->GetColSize( 0 ) ) );
854 int fixedColsWidth =
m_grid->GetColSize( 0 );
856 for(
int i = 2; i <
m_grid->GetNumberCols(); i++ )
857 fixedColsWidth +=
m_grid->GetColSize( i );
859 m_grid->SetColSize( 1, std::max( 120, width - fixedColsWidth ) );
871 if( !
m_grid->IsCellEditControlShown() )
879 if(
path.Last() !=
'/' )
883 wxControl* control =
editor->GetControl();
884 wxTextEntry* textControl =
dynamic_cast<wxTextEntry*
>( control );
888 sheetName = textControl->GetValue();
903 path = wxControl::Ellipsize(
path, dc, wxELLIPSIZE_START, width, wxELLIPSIZE_FLAGS_NONE );
915 m_grid->EnableCellEditControl(
true );
916 m_grid->ShowCellEditControl();
926 auto new_size =
event.GetSize();
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Color settings are a bit different than most of the settings objects in that there can be more than o...
bool GetOverrideSchItemColors() const
COLOR4D GetColor(int aLayer) const
void SetSwatchColor(const KIGFX::COLOR4D &aColor, bool aSendEvent)
Set the current swatch color directly.
KIGFX::COLOR4D GetSwatchColor() const
void SetDefaultColor(const KIGFX::COLOR4D &aColor)
Sets the color that will be chosen with the "Reset to Default" button in the chooser.
void SetSwatchBackground(const KIGFX::COLOR4D &aBackground)
Set the swatch background color.
Class DIALOG_SHEET_PROPERTIES_BASE.
wxCheckBox * m_cbExcludeFromSim
STD_BITMAP_BUTTON * m_bpMoveUp
wxTextCtrl * m_pageNumberTextCtrl
wxCheckBox * m_cbExcludeFromBom
COLOR_SWATCH * m_backgroundSwatch
wxStaticText * m_hierarchicalPath
wxCheckBox * m_cbExcludeFromBoard
STD_BITMAP_BUTTON * m_bpAdd
wxStdDialogButtonSizer * m_stdDialogButtonSizer
wxBoxSizer * m_sizerBottom
STD_BITMAP_BUTTON * m_bpDelete
COLOR_SWATCH * m_borderSwatch
wxStaticText * m_hierarchicalPathLabel
STD_BITMAP_BUTTON * m_bpMoveDown
bool TransferDataToWindow() override
void OnAddField(wxCommandEvent &event) override
void OnMoveDown(wxCommandEvent &event) override
UNIT_BINDER m_borderWidth
std::bitset< 64 > m_shownColumns
SCH_FIELD m_dummySheetNameField
bool TransferDataFromWindow() override
void OnGridCellChanging(wxGridEvent &event)
void OnDeleteField(wxCommandEvent &event) override
bool onSheetFilenameChanged(const wxString &aNewFilename)
wxString * m_sourceSheetFilename
void OnSizeGrid(wxSizeEvent &event) override
bool * m_updateHierarchyNavigator
void OnInitDlg(wxInitDialogEvent &event) override
void OnUpdateUI(wxUpdateUIEvent &event) override
bool * m_clearAnnotationNewItems
FIELDS_GRID_TABLE * m_fields
void OnMoveUp(wxCommandEvent &event) override
DIALOG_SHEET_PROPERTIES(SCH_EDIT_FRAME *aParent, SCH_SHEET *aSheet, bool *aIsUndoable, bool *aClearAnnotationNewItems, bool *aUpdateHierarchyNavigator, wxString *aSourceSheetFilename)
~DIALOG_SHEET_PROPERTIES() override
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Clear the message panel and populates it with the contents of aList.
const EDA_ANGLE & GetTextAngle() const
virtual const wxString & GetText() const
Return the string associated with the text object.
void Offset(const VECTOR2I &aOffset)
GR_TEXT_H_ALIGN_T GetHorizJustify() const
virtual void SetVisible(bool aVisible)
GR_TEXT_V_ALIGN_T GetVertJustify() const
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
EE_TYPE OfType(KICAD_T aType) const
SCH_FIELD * GetField(FIELD_T aFieldId)
int GetNumberRows() override
int GetMandatoryRowCount() const
int GetFieldRow(FIELD_T aFieldId)
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()
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
void DoNotShowCheckbox(wxString file, int line)
Shows the 'do not show again' checkbox.
APP_SETTINGS_BASE * KifaceSettings() const
A color representation with 4 components: red, green, blue, alpha.
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.
wxCheckBox * m_optOverrideColors
virtual const wxString GetProjectName() const
Return the short name of the project.
virtual const wxString AbsolutePath(const wxString &aFileName) const
Fix up aFileName if it is relative to the project's directory to be an absolute path and filename.
Holds all the data relating to one schematic.
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Returns a pointer to the active color theme settings.
Schematic editor (Eeschema) main window.
bool AllowCaseSensitiveFileNameClashes(const wxString &aOldName, const wxString &aSchematicFileName)
Check aSchematicFileName for a potential file name case sensitivity clashes.
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
void InitSheet(SCH_SHEET *aSheet, const wxString &aNewFilename)
bool LoadSheetFromFile(SCH_SHEET *aSheet, SCH_SHEET_PATH *aCurrentSheet, const wxString &aFileName, bool aSkipRecursionCheck=false, bool aSkipLibCheck=false)
Load a the KiCad schematic file aFileName into the sheet aSheet.
SCH_SHEET_PATH & GetCurrentSheet() const
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags, PROGRESS_REPORTER *aProgressReporter=nullptr)
Generate the connection data for the entire schematic hierarchy.
SCHEMATIC & Schematic() const
bool CheckSheetForRecursion(SCH_SHEET *aSheet, SCH_SHEET_PATH *aCurrentSheet)
Verify that aSheet will not cause a recursion error in aCurrentSheet.
void UpdateItem(EDA_ITEM *aItem, bool isAddOrDelete=false, bool aUpdateRtree=false) override
Mark an item for refresh.
void TestDanglingEnds()
Test all of the connectable objects in the schematic for unused connection points.
VECTOR2I GetPosition() const override
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
bool IsEmpty()
Return true if both the name and value of the field are empty.
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetName(const wxString &aName)
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
void SetText(const wxString &aText) override
Base class for any item which can be embedded within the SCHEMATIC container class,...
void SetFieldsAutoplaced(AUTOPLACE_ALGO aAlgo)
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
EE_RTREE & Items()
Get the full RTree, usually for iterating.
const wxString & GetFileName() const
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
bool Remove(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Remove aItem from the schematic associated with this screen.
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
void AddNewSymbolInstances(const SCH_SHEET_PATH &aPrefixSheetPath, const wxString &aProjectName)
Attempt to add new symbol instances for all symbols in this list of sheet paths prefixed with aPrefix...
int GetLastVirtualPageNumber() const
void AddNewSheetInstances(const SCH_SHEET_PATH &aPrefixSheetPath, int aLastVirtualPageNumber)
void BuildSheetList(SCH_SHEET *aSheet, bool aCheckIntegrity)
Build the list of sheets and their sheet path from aSheet.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
wxString PathHumanReadable(bool aUseShortRootName=true, bool aStripTrailingSeparator=false) const
Return the sheet path in a human readable form made from the sheet names.
SCH_SCREEN * LastScreen()
wxString GetPageNumber() const
void SetPageNumber(const wxString &aPageNumber)
Set the sheet instance user definable page number.
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
bool GetExcludedFromBoard() const override
void SetBorderColor(KIGFX::COLOR4D aColor)
void SetExcludedFromBoard(bool aExcludeFromBoard) override
Set or clear exclude from board netlist flag.
wxString GetFileName() const
Return the filename corresponding to this sheet.
std::vector< SCH_FIELD > & GetFields()
Return a reference to the vector holding the sheet's fields.
bool GetExcludedFromBOM() const override
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this sheet.
bool SearchHierarchy(const wxString &aFilename, SCH_SCREEN **aScreen)
Search the existing hierarchy for an instance of screen loaded from aFileName.
void SetBackgroundColor(KIGFX::COLOR4D aColor)
SCH_SCREEN * GetScreen() const
VECTOR2I GetPosition() const override
void SetExcludedFromBOM(bool aExcludeFromBOM) override
Set or clear the exclude from schematic bill of materials flag.
void SetFields(const std::vector< SCH_FIELD > &aFields)
Set multiple schematic fields.
int GetScreenCount() const
Return the number of times the associated screen for the sheet is being used.
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
KIGFX::COLOR4D GetBorderColor() const
void SetBorderWidth(int aWidth)
bool GetExcludedFromSim() const override
int GetBorderWidth() const
void SetDNP(bool aDNP) override
bool GetDNP() const override
Set or clear the 'Do Not Populate' flags.
void SetExcludedFromSim(bool aExcludeFromSim) override
Set or clear the exclude from simulation flag.
KIGFX::COLOR4D GetBackgroundColor() const
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
void ShowHideColumns(const wxString &shownColumns)
Show/hide the grid columns based on a tokenized string of shown column indexes.
void SetTable(wxGridTableBase *table, bool aTakeOwnership=false)
Hide wxGrid's SetTable() method with one which doesn't mess up the grid column widths when setting th...
void DestroyTable(wxGridTableBase *aTable)
Work-around for a bug in wxGrid which crashes when deleting the table if the cell edit control was no...
wxString GetShownColumnsAsString()
Get a tokenized string containing the shown column indexes.
std::bitset< 64 > GetShownColumns()
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
wxString EnsureFileExtension(const wxString &aFilename, const wxString &aExtension)
It's annoying to throw up nag dialogs when the extension isn't right.
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
This file is part of the common library.
static bool positioningChanged(const SCH_FIELD &a, const SCH_FIELD &b)
static bool positioningChanged(const SCH_FIELD &a, const SCH_FIELD &b)
const int minSize
Push and Shove router track width and via size dialog.
static const std::string KiCadSchematicFileExtension
const wxChar *const tracePathsAndFiles
Flag to enable path and file name debug output.
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
This file is part of the common library.
@ LAYER_SCHEMATIC_BACKGROUND
KICOMMON_API wxFont GetSmallInfoFont(wxWindow *aWindow)
const SCH_FIELD * FindField(const std::vector< SCH_FIELD > &aFields, FIELD_T aFieldId)
bool IsFullFileNameValid(const wxString &aFullFilename)
Checks if a full filename is valid, i.e.
wxString GetUserFieldName(int aFieldNdx, bool aTranslateForHI)
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
wxLogTrace helper definitions.
Custom text control validator definitions.
Definition of file extensions used in Kicad.
#define FN_NORMALIZE_FLAGS
Default flags to pass to wxFileName::Normalize().