30#include <wx/tooltip.h> 
   49#include "wx/dcclient.h" 
   53                                                  bool* aIsUndoable, 
bool* aClearAnnotationNewItems,
 
   54                                                  bool* aUpdateHierarchyNavigator,
 
   55                                                  wxString* aSourceSheetFilename ) :
 
   73                                                      [&]( wxCommandEvent& aEvent )
 
   77    m_grid->SetSelectionMode( wxGrid::wxGridSelectRows );
 
   82        m_grid->ShowHideColumns( cfg->m_Appearance.edit_sheet_visible_columns );
 
   86    if( 
m_frame->GetColorSettings()->GetOverrideSchItemColors() )
 
   87        m_infoBar->ShowMessage( 
_( 
"Note: individual item colors overridden in Preferences." ) );
 
   94    wxToolTip::Enable( 
true );
 
 
  118        cfg->m_Appearance.edit_sheet_visible_columns = 
m_grid->GetShownColumnsAsString();
 
  127    m_grid->PopEventHandler( 
true );
 
 
  133    if( !wxDialog::TransferDataToWindow() )
 
  145            wxString filename = field_copy.
GetText();
 
  146            filename.Replace( wxT( 
"/" ), wxT( 
"\\" ) );
 
  147            field_copy.
SetText( filename );
 
  158    wxGridTableMessage msg( 
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 
m_fields->size() );
 
  159    m_grid->ProcessTableMessage( msg );
 
 
  194    if( !
m_grid->CommitPendingChanges() || !
m_grid->Validate() )
 
  198    for( 
size_t i = 0;  i < 
m_fields->size(); ++i )
 
 
  254    if( !wxDialog::TransferDataFromWindow() )  
 
  265    if( sheetFileName.IsEmpty() )
 
  267        DisplayError( 
this, 
_( 
"A sheet must have a valid file name." ) );
 
  278        DisplayError( 
this, 
_( 
"A sheet must have a valid file name." ) );
 
  282    wxFileName fn( sheetFileName );
 
  284    wxString newRelativeFilename = fn.GetFullPath();
 
  287    newRelativeFilename.Replace( wxT( 
"\\" ), wxT( 
"/" ) );
 
  290    oldFilename.Replace( wxT( 
"\\" ), wxT( 
"/" ) );
 
  292    bool filename_changed = oldFilename != newRelativeFilename;
 
  294    if( filename_changed || 
m_sheet->IsNew() )
 
  298        wxCHECK( currentScreen, 
false );
 
  300        bool clearFileName = 
false;
 
  305            clearFileName = 
true;
 
  306            currentScreen->
SetFileName( 
m_frame->Prj().AbsolutePath( wxT( 
"noname.kicad_sch" ) ) );
 
  309        wxFileName tmp( fn );
 
  310        wxFileName screenFileName = currentScreen->
GetFileName();
 
  312        if( fn.IsAbsolute() && fn.MakeRelativeTo( screenFileName.GetPath() ) )
 
  314            wxMessageDialog makeRelDlg( 
this, 
_( 
"Use relative path for sheet file?" ), 
_( 
"Sheet File Path" ),
 
  315                                        wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION | wxCENTER );
 
  317            makeRelDlg.SetExtendedMessage( 
_( 
"Using relative hierarchical sheet file name paths improves " 
  318                                              "schematic portability across systems and platforms.  Using " 
  319                                              "absolute paths can result in portability issues." ) );
 
  320            makeRelDlg.SetYesNoLabels( wxMessageDialog::ButtonLabel( 
_( 
"Use Relative Path" ) ),
 
  321                                       wxMessageDialog::ButtonLabel( 
_( 
"Use Absolute Path" ) ) );
 
  323            if( makeRelDlg.ShowModal() == wxID_YES )
 
  326                                                "\n    to relative path: '%s'",
 
  330                newRelativeFilename = fn.GetFullPath();
 
  361    if( newSheetname.IsEmpty() )
 
  362        newSheetname = 
_( 
"Untitled Sheet" );
 
  368        m_field.Offset( 
m_sheet->GetPosition() );
 
  373    for( 
int ii = 
m_fields->GetNumberRows() - 1; ii >= 0; ii-- )
 
  384        else if( fieldName.IsEmpty() )
 
  398        wxPanel temp( 
this );
 
  403        KIDIALOG dlg( 
this, 
_( 
"Note: item colors are overridden in the current color theme." ),
 
  405        dlg.ShowDetailedText( wxString::Format( 
_( 
"To see individual item colors uncheck '%s'\n" 
  406                                                   "in Preferences > Schematic Editor > Colors." ),
 
 
  445    wxFileName     screenFileName( sheetFileName );
 
  446    wxFileName     tmp( sheetFileName );
 
  449    wxCHECK( currentScreen, 
false );
 
  452    wxFileName currentScreenFileName = currentScreen->
GetFileName();
 
  454    if( !screenFileName.Normalize( 
FN_NORMALIZE_FLAGS | wxPATH_NORM_ENV_VARS, currentScreenFileName.GetPath() ) )
 
  456        msg = wxString::Format( 
_( 
"Cannot normalize new sheet schematic file path:\n" 
  458                                   "against parent sheet schematic file path:\n" 
  460                                sheetFileName.GetPath(),
 
  461                                currentScreenFileName.GetPath() );
 
  466    wxString newAbsoluteFilename = screenFileName.GetFullPath();
 
  469    newAbsoluteFilename.Replace( wxT( 
"\\" ), wxT( 
"/" ) );
 
  471    bool renameFile = 
false;
 
  472    bool loadFromFile = 
false;
 
  473    bool clearAnnotation = 
false;
 
  474    bool isExistingSheet = 
false;
 
  482        loadFromFile = wxFileExists( newAbsoluteFilename );
 
  486                                        loadFromFile ? 
"found" : 
"not found" );
 
  489    if( 
m_sheet->GetScreen() == 
nullptr )      
 
  491        if( !
m_frame->AllowCaseSensitiveFileNameClashes( 
m_sheet->GetFileName(), newAbsoluteFilename ) )
 
  494        if( useScreen || loadFromFile )     
 
  496            clearAnnotation = 
true;
 
  498            if( !
IsOK( 
this, wxString::Format( 
_( 
"'%s' already exists." ), sheetFileName.GetFullName() )
 
  500                             + wxString::Format( 
_( 
"Link '%s' to this file?" ), newAbsoluteFilename ) ) )
 
  513                msg.Printf( 
_( 
"Failed to copy schematic file '%s' to destination '%s'." ),
 
  514                            currentScreenFileName.GetFullPath(),
 
  515                            newAbsoluteFilename );
 
  529        isExistingSheet = 
true;
 
  531        if( !
m_frame->AllowCaseSensitiveFileNameClashes( 
m_sheet->GetFileName(), newAbsoluteFilename ) )
 
  543        wxString oldAbsoluteFilename = 
m_sheet->GetScreen()->GetFileName();
 
  544        oldAbsoluteFilename.Replace( wxT( 
"\\" ), wxT( 
"/" ) );
 
  546        if( newAbsoluteFilename.Cmp( oldAbsoluteFilename ) != 0 )
 
  552            if( useScreen || loadFromFile )           
 
  554                clearAnnotation = 
true;
 
  555                oldScreen = 
m_sheet->GetScreen();
 
  557                if( !
IsOK( 
this, wxString::Format( 
_( 
"Change '%s' link from '%s' to '%s'?" ),
 
  560                                                   sheetFileName.GetFullName() )
 
  562                                 + 
_( 
"This action cannot be undone." ) ) )
 
  572                if( 
m_sheet->GetScreenCount() > 1 )
 
  574                    if( !
IsOK( 
this, wxString::Format( 
_( 
"Create new file '%s' with contents of '%s'?" ),
 
  575                                                       sheetFileName.GetFullName(),
 
  578                                     + 
_( 
"This action cannot be undone." ) ) )
 
  596            if( 
m_sheet->GetScreenCount() <= 1 )
 
  597                m_sheet->GetScreen()->SetFileName( newAbsoluteFilename );
 
  601                pi->SaveSchematicFile( newAbsoluteFilename, 
m_sheet, &schematic );
 
  605                msg = wxString::Format( 
_( 
"Error occurred saving schematic file '%s'." ), newAbsoluteFilename );
 
  608                msg = wxString::Format( 
_( 
"Failed to save schematic '%s'" ), newAbsoluteFilename );
 
  609                m_frame->SetMsgPanel( wxEmptyString, msg );
 
  616            if( 
m_sheet->GetScreenCount() > 1 )
 
  618                oldScreen = 
m_sheet->GetScreen();
 
  630        std::unique_ptr< SCH_SHEET> tmpSheet = std::make_unique<SCH_SHEET>( &schematic );
 
  633        tmpSheet->SetScreen( useScreen );
 
  636        if( 
m_frame->CheckSheetForRecursion( tmpSheet.get(), ¤tSheet ) )
 
  640        m_sheet->SetScreen( useScreen );
 
  647    else if( loadFromFile )
 
  649        bool restoreSheet = 
false;
 
  651        if( isExistingSheet )
 
  659        if( !
m_frame->LoadSheetFromFile( 
m_sheet, ¤tSheet, newAbsoluteFilename, 
false, 
true )
 
  666                    m_sheet->SetScreen( oldScreen );
 
 
  691    wxGridCellEditor* 
editor = 
m_grid->GetCellEditor( event.GetRow(), event.GetCol() );
 
  692    wxControl*        control = 
editor->GetControl();
 
  694    if( control && control->GetValidator() )
 
  695        success = control->GetValidator()->Validate( control );
 
 
  711            [&]() -> std::pair<int, int>
 
  720                wxGridTableMessage msg( 
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
 
  721                m_grid->ProcessTableMessage( msg );
 
 
  732                if( row < m_fields->GetMandatoryRowCount() )
 
  734                    DisplayError( 
this, wxString::Format( 
_( 
"The first %d fields are mandatory." ),
 
  735                                                          m_fields->GetMandatoryRowCount() ) );
 
  746                wxGridTableMessage msg( 
m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, row, 1 );
 
  747                m_grid->ProcessTableMessage( msg );
 
 
  757                return row > 
m_fields->GetMandatoryRowCount();
 
  761                std::swap( *( 
m_fields->begin() + row ), *( 
m_fields->begin() + row - 1 ) );
 
 
  772                return row >= 
m_fields->GetMandatoryRowCount();
 
  776                std::swap( *( 
m_fields->begin() + row ), *( 
m_fields->begin() + row + 1 ) );
 
 
  784    std::bitset<64> shownColumns = 
m_grid->GetShownColumns();
 
  790        if( !
m_grid->IsCellEditControlShown() )
 
  791            m_grid->SetGridWidthsDirty();
 
  796    wxString  
path = 
m_frame->GetCurrentSheet().PathHumanReadable( 
false );
 
  798    if( 
path.Last() != 
'/' )
 
  802    wxControl*        control = 
editor->GetControl();
 
  803    wxTextEntry*      textControl = 
dynamic_cast<wxTextEntry*
>( control );
 
  807        sheetName = textControl->GetValue();
 
  822    path = wxControl::Ellipsize( 
path, dc, wxELLIPSIZE_START, width, wxELLIPSIZE_FLAGS_NONE );
 
  834        m_grid->EnableCellEditControl( 
true );
 
  835        m_grid->ShowCellEditControl();
 
 
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
 
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
 
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
 
Color settings are a bit different than most of the settings objects in that there can be more than o...
 
bool GetOverrideSchItemColors() const
 
wxCheckBox * m_cbExcludeFromSim
 
wxStaticText * m_borderWidthLabel
 
STD_BITMAP_BUTTON * m_bpMoveUp
 
wxTextCtrl * m_pageNumberTextCtrl
 
wxTextCtrl * m_borderWidthCtrl
 
wxCheckBox * m_cbExcludeFromBom
 
wxStaticText * m_borderWidthUnits
 
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
 
DIALOG_SHEET_PROPERTIES_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxString &title=_("Sheet Properties"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxCAPTION|wxCLOSE_BOX|wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER|wxSYSTEM_MENU)
 
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
 
bool * m_updateHierarchyNavigator
 
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...
 
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)
 
SCH_FIELD * GetField(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.
 
A color representation with 4 components: red, green, blue, alpha.
 
wxCheckBox * m_optOverrideColors
 
Holds all the data relating to one schematic.
 
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
 
Schematic editor (Eeschema) main window.
 
SCHEMATIC & Schematic() const
 
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)
 
void SetText(const wxString &aText) override
 
Base class for any item which can be embedded within the SCHEMATIC container class,...
 
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
 
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...
 
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.
 
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.
 
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.
 
@ 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().