From 73890d6dda067c819f71e2ac4b4b63963c88cda6 Mon Sep 17 00:00:00 2001 From: Dick Hollenbeck Date: Mon, 7 Jul 2014 14:49:14 -0500 Subject: [PATCH] switch back to original sexpr usage of PTREE, add new DSNLEXER constructor, enforce accessors in kicad.exe --- common/dsnlexer.cpp | 18 +++- common/ptree.cpp | 6 +- eeschema/backanno.cpp | 76 +++++++------- include/dsnlexer.h | 12 ++- include/ptree.h | 6 +- kicad/class_treeproject_item.cpp | 48 ++++----- kicad/class_treeproject_item.h | 67 ++++++------ kicad/class_treeprojectfiles.cpp | 15 +-- kicad/files-io.cpp | 19 ++-- kicad/kicad.cpp | 19 ++-- kicad/kicad.h | 49 +++++---- kicad/mainframe.cpp | 60 ++++++----- kicad/prjconfig.cpp | 78 +++++++------- kicad/tree_project_frame.cpp | 173 +++++++++---------------------- kicad/tree_project_frame.h | 9 +- tools/CMakeLists.txt | 1 + tools/property_tree.cpp | 2 +- 17 files changed, 315 insertions(+), 343 deletions(-) diff --git a/common/dsnlexer.cpp b/common/dsnlexer.cpp index 11d8b0452e..47a6d7c4bc 100644 --- a/common/dsnlexer.cpp +++ b/common/dsnlexer.cpp @@ -36,6 +36,8 @@ //#define STANDALONE 1 // enable this for stand alone testing. +#define FMT_CLIPBOARD _( "clipboard" ) + //------------------------------------------------------------------ @@ -89,7 +91,7 @@ DSNLEXER::DSNLEXER( const KEYWORD* aKeywordTable, unsigned aKeywordCount, keywordCount( aKeywordCount ) { STRING_LINE_READER* stringReader = new STRING_LINE_READER( aClipboardTxt, aSource.IsEmpty() ? - wxString( _( "clipboard" ) ) : aSource ); + wxString( FMT_CLIPBOARD ) : aSource ); PushReader( stringReader ); init(); } @@ -107,6 +109,20 @@ DSNLEXER::DSNLEXER( const KEYWORD* aKeywordTable, unsigned aKeywordCount, } +static const KEYWORD empty_keywords[1] = {}; + +DSNLEXER::DSNLEXER( const std::string& aSExpression, const wxString& aSource ) : + iOwnReaders( true ), + keywords( empty_keywords ), + keywordCount( 0 ) +{ + STRING_LINE_READER* stringReader = new STRING_LINE_READER( aSExpression, aSource.IsEmpty() ? + wxString( FMT_CLIPBOARD ) : aSource ); + PushReader( stringReader ); + init(); +} + + DSNLEXER::~DSNLEXER() { if( iOwnReaders ) diff --git a/common/ptree.cpp b/common/ptree.cpp index 010d4b3f26..1d2e958e02 100644 --- a/common/ptree.cpp +++ b/common/ptree.cpp @@ -83,11 +83,7 @@ inline void scanAtom( PTREE* aTree, DSNLEXER* aLexer ) //D(printf( "%s: '%s'\n", __func__, key );) -#if 0 aTree->push_back( PTREE::value_type( key, PTREE() ) ); -#else - aTree->put_value( key ); -#endif } @@ -194,7 +190,7 @@ static void formatNode( OUTPUTFORMATTER* out, int aNestLevel, int aCtl, out->Print( aNestLevel, "(%s%s", out->Quotes( aKey ).c_str(), ctl & CTL_OMIT_NL ? "" : "\n" ); - if( aTree.data().size() ) + if( aTree.data().size() ) // sexpr format does not use data() { out->Print( 0, " %s%s", out->Quotes( aTree.data() ).c_str(), diff --git a/eeschema/backanno.cpp b/eeschema/backanno.cpp index f2fdcb3e27..ea7628a86f 100644 --- a/eeschema/backanno.cpp +++ b/eeschema/backanno.cpp @@ -56,55 +56,61 @@ void SCH_EDIT_FRAME::backAnnotateFootprints( const std::string& aChangedSetOfRef sheets.GetComponents( refs, false ); - static const KEYWORD empty_keywords[1] = {}; - - DSNLEXER lexer( empty_keywords, 0, aChangedSetOfReferences, FROM_UTF8( __func__ ) ); + DSNLEXER lexer( aChangedSetOfReferences, FROM_UTF8( __func__ ) ); PTREE doc; - Scan( &doc, &lexer ); + try + { + Scan( &doc, &lexer ); #if defined(DEBUG) && 0 - STRING_FORMATTER sf; - Format( &sf, 0, 0, doc ); - printf( "%s: '%s'\n", __func__, sf.GetString().c_str() ); + STRING_FORMATTER sf; + Format( &sf, 0, 0, doc ); + printf( "%s: '%s'\n", __func__, sf.GetString().c_str() ); #endif - CPTREE& back_anno = doc.get_child( "back_annotation" ); + CPTREE& back_anno = doc.get_child( "back_annotation" ); - for( PTREE::const_iterator ref = back_anno.begin(); ref != back_anno.end(); ++ref ) - { - wxASSERT( ref->first == "ref" ); - - wxString reference = (UTF8&) ref->second.data(); - wxString footprint = (UTF8) ref->second.get( "fpid" ); - - // DBG( printf( "%s: ref:%s fpid:%s\n", __func__, TO_UTF8( reference ), TO_UTF8( footprint ) ); ) - - // Search the component in the flat list - for( unsigned ii = 0; ii < refs.GetCount(); ++ii ) + for( PTREE::const_iterator ref = back_anno.begin(); ref != back_anno.end(); ++ref ) { - if( Cmp_KEEPCASE( reference, refs[ii].GetRef() ) == 0 ) + wxASSERT( ref->first == "ref" ); + + wxString reference = (UTF8&) ref->second.front().first; + wxString footprint = (UTF8&) ref->second.get_child( "fpid" ).front().first; + + DBG( printf( "%s: ref:%s fpid:%s\n", __func__, TO_UTF8( reference ), TO_UTF8( footprint ) ); ) + + // Search the component in the flat list + for( unsigned ii = 0; ii < refs.GetCount(); ++ii ) { - // We have found a candidate. - // Note: it can be not unique (multiple parts per package) - // So we *do not* stop the search here - SCH_COMPONENT* component = refs[ii].GetComponent(); - SCH_FIELD* fpfield = component->GetField( FOOTPRINT ); - const wxString& oldfp = fpfield->GetText(); - - if( !oldfp && fpfield->IsVisible() ) + if( Cmp_KEEPCASE( reference, refs[ii].GetRef() ) == 0 ) { - fpfield->SetVisible( false ); + // We have found a candidate. + // Note: it can be not unique (multiple parts per package) + // So we *do not* stop the search here + SCH_COMPONENT* component = refs[ii].GetComponent(); + SCH_FIELD* fpfield = component->GetField( FOOTPRINT ); + const wxString& oldfp = fpfield->GetText(); + + if( !oldfp && fpfield->IsVisible() ) + { + fpfield->SetVisible( false ); + } + + // DBG( printf("%s: ref:%s fpid:%s\n", __func__, TO_UTF8( refs[ii].GetRef() ), TO_UTF8( footprint ) );) + if( oldfp != footprint ) + isChanged = true; + + fpfield->SetText( footprint ); } - - // DBG( printf("%s: ref:%s fpid:%s\n", __func__, TO_UTF8( refs[ii].GetRef() ), TO_UTF8( footprint ) );) - if( oldfp != footprint ) - isChanged = true; - - fpfield->SetText( footprint ); } } } + catch( const PTREE_ERROR& ex ) + { + // remap the exception to something the caller is likely to understand. + THROW_IO_ERROR( ex.what() ); + } if( isChanged ) OnModify(); diff --git a/include/dsnlexer.h b/include/dsnlexer.h index 24674fd665..b6f3a87516 100644 --- a/include/dsnlexer.h +++ b/include/dsnlexer.h @@ -174,7 +174,7 @@ public: FILE* aFile, const wxString& aFileName ); /** - * Constructor ( std::string&*, const wxString& ) + * Constructor ( const KEYWORD*, unsigned, const std::string&, const wxString& ) * intializes a DSN lexer and prepares to read from @a aSExpression. * * @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This @@ -186,6 +186,16 @@ public: DSNLEXER( const KEYWORD* aKeywordTable, unsigned aKeywordCount, const std::string& aSExpression, const wxString& aSource = wxEmptyString ); + /** + * Constructor ( const std::string&, const wxString& ) + * intializes a DSN lexer and prepares to read from @a aSExpression. Use this + * one without a keyword table with the DOM parser in ptree.h. + * + * @param aSExpression is text to feed through a STRING_LINE_READER + * @param aSource is a description of aSExpression, used for error reporting. + */ + DSNLEXER( const std::string& aSExpression, const wxString& aSource = wxEmptyString ); + /** * Constructor ( LINE_READER* ) * intializes a DSN lexer and prepares to read from @a aLineReader which diff --git a/include/ptree.h b/include/ptree.h index 0ffad8c8ed..a117462b49 100644 --- a/include/ptree.h +++ b/include/ptree.h @@ -52,9 +52,9 @@ makes it easy to extract a subset of a ptree. #include #include -typedef boost::property_tree::ptree PTREE; -typedef const PTREE CPTREE; - +typedef boost::property_tree::ptree PTREE; +typedef const PTREE CPTREE; +typedef boost::property_tree::ptree_error PTREE_ERROR; /** * Function Scan diff --git a/kicad/class_treeproject_item.cpp b/kicad/class_treeproject_item.cpp index b43c93bc18..1c28d5701d 100644 --- a/kicad/class_treeproject_item.cpp +++ b/kicad/class_treeproject_item.cpp @@ -51,12 +51,11 @@ TREEPROJECT_ITEM::TREEPROJECT_ITEM( enum TreeFileType type, const wxString& data m_Type = type; m_parent = parent; m_FileName = data; - m_IsRootFile = false; // true only for the root item of the tree (the project name) - m_WasPopulated = false; + m_IsRootFile = false; // true only for the root item of the tree (the project name) + m_IsPopulated = false; } -// Set the state used in the icon list void TREEPROJECT_ITEM::SetState( int state ) { wxImageList* imglist = m_parent->GetImageList(); @@ -71,8 +70,7 @@ void TREEPROJECT_ITEM::SetState( int state ) } -/* Get the directory containing the file */ -wxString TREEPROJECT_ITEM::GetDir() const +const wxString TREEPROJECT_ITEM::GetDir() const { if( TREE_DIRECTORY == m_Type ) return m_FileName; @@ -84,7 +82,6 @@ wxString TREEPROJECT_ITEM::GetDir() const } -/* rename the file checking if extension change occurs */ bool TREEPROJECT_ITEM::Rename( const wxString& name, bool check ) { // this is broken & unsafe to use on linux. @@ -145,14 +142,13 @@ type.\n Do you want to continue ?" } -/*******************************************/ bool TREEPROJECT_ITEM::Delete( bool check ) -/*******************************************/ -/* delete a file */ { - wxString msg; + wxString msg = wxString::Format( _( + "Do you really want to delete '%s'" ), + GetChars( GetFileName() ) + ); - msg.Printf( _( "Do you really want to delete <%s>" ), GetChars( GetFileName() ) ); wxMessageDialog dialog( m_parent, msg, _( "Delete File" ), wxYES_NO | wxICON_QUESTION ); @@ -184,16 +180,15 @@ bool TREEPROJECT_ITEM::Delete( bool check ) } -// Called under item activation void TREEPROJECT_ITEM::Activate( TREE_PROJECT_FRAME* prjframe ) { wxString sep = wxFileName().GetPathSeparator(); - wxString FullFileName = GetFileName(); + wxString fullFileName = GetFileName(); wxTreeItemId id = GetId(); KICAD_MANAGER_FRAME* mainFrame = (KICAD_MANAGER_FRAME*) Pgm().App().GetTopWindow(); - AddDelimiterString( FullFileName ); + AddDelimiterString( fullFileName ); switch( GetType() ) { @@ -205,24 +200,29 @@ void TREEPROJECT_ITEM::Activate( TREE_PROJECT_FRAME* prjframe ) break; case TREE_SCHEMA: - mainFrame->Execute( m_parent, EESCHEMA_EXE, FullFileName ); + mainFrame->Execute( m_parent, EESCHEMA_EXE, fullFileName ); break; case TREE_LEGACY_PCB: case TREE_SEXP_PCB: - mainFrame->Execute( m_parent, PCBNEW_EXE, FullFileName ); + { + DBG( printf( "%s: %s\n", __func__, TO_UTF8( fullFileName ) ); ) + + + mainFrame->Execute( m_parent, PCBNEW_EXE, fullFileName ); + } break; case TREE_GERBER: - mainFrame->Execute( m_parent, GERBVIEW_EXE, FullFileName ); + mainFrame->Execute( m_parent, GERBVIEW_EXE, fullFileName ); break; case TREE_PDF: - OpenPDF( FullFileName ); + OpenPDF( fullFileName ); break; case TREE_NET: - mainFrame->Execute( m_parent, CVPCB_EXE, FullFileName ); + mainFrame->Execute( m_parent, CVPCB_EXE, fullFileName ); break; case TREE_TXT: @@ -230,18 +230,16 @@ void TREEPROJECT_ITEM::Activate( TREE_PROJECT_FRAME* prjframe ) wxString editorname = Pgm().GetEditorName(); if( !editorname.IsEmpty() ) - mainFrame->Execute( m_parent, editorname, FullFileName ); - - break; + mainFrame->Execute( m_parent, editorname, fullFileName ); } + break; case TREE_PAGE_LAYOUT_DESCR: - mainFrame->Execute( m_parent, PL_EDITOR_EXE, FullFileName ); + mainFrame->Execute( m_parent, PL_EDITOR_EXE, fullFileName ); break; default: - OpenFile( FullFileName ); + OpenFile( fullFileName ); break; } - } diff --git a/kicad/class_treeproject_item.h b/kicad/class_treeproject_item.h index fd70212228..9319410981 100644 --- a/kicad/class_treeproject_item.h +++ b/kicad/class_treeproject_item.h @@ -1,63 +1,60 @@ -/* - * class_treeproject_item.h - */ +#ifndef TREEPROJECT_ITEM_H_ +#define TREEPROJECT_ITEM_H_ - -/** class TREEPROJECT_ITEM - * Handle one item (a file or a directory name) for the tree file +/** + * Class TREEPROJECT_ITEM + * handles one item (a file or a directory name) for the tree file */ class TREEPROJECT_ITEM : public wxTreeItemData { -public: - TreeFileType m_Type; // = TREE_PROJECT, TREE_DIRECTORY ... - wxString m_FileName; // Filename for a file, or directory name - bool m_IsRootFile; // True if m_Filename is a root schematic (same name as project) - bool m_WasPopulated; // True the name is a directory, and its content was read -private: - wxTreeCtrl* m_parent; - int m_state; + friend class KICAD_MANAGER_FRAME; + public: TREEPROJECT_ITEM( TreeFileType type, const wxString& data, wxTreeCtrl* parent ); + TREEPROJECT_ITEM() : m_parent( NULL ) { } TREEPROJECT_ITEM( const TREEPROJECT_ITEM& src ) : m_Type( src.m_Type ), m_FileName( src.m_FileName ), m_parent( src.m_parent ) { SetState( src.m_state ); - m_WasPopulated = false; + m_IsPopulated = false; } - TreeFileType GetType() const - { - return m_Type; - } + TreeFileType GetType() const { return m_Type; } + void SetType( TreeFileType aType ) { m_Type = aType; } - void SetType( TreeFileType aType ) - { - m_Type = aType; - } + const wxString& GetFileName() const { return m_FileName; } + void SetFileName( const wxString& name ) { m_FileName = name; } - wxString GetFileName() const - { - return m_FileName; - } + bool IsRootFile() const { return m_IsRootFile; } + void SetRootFile( bool aValue ) { m_IsRootFile = aValue; } - void SetFileName( const wxString& name ) - { - m_FileName = name; - } + bool IsPopulated() const { return m_IsPopulated; } + void SetPopulated( bool aValue ) { m_IsPopulated = aValue; } /** * @return the path of an item. * if this item is a directory, returns the stored filename * if this is a file, returns its path */ - wxString GetDir() const; + const wxString GetDir() const; - bool Rename( const wxString& name, bool check = true ); - bool Delete( bool check = true ); - void Activate( TREE_PROJECT_FRAME* prjframe ); + bool Rename( const wxString& name, bool check = true ); + bool Delete( bool check = true ); + void Activate( TREE_PROJECT_FRAME* prjframe ); void SetState( int state ); + + +private: + TreeFileType m_Type; // = TREE_PROJECT, TREE_DIRECTORY ... + wxString m_FileName; // Filename for a file, or directory name + bool m_IsRootFile; // True if m_Filename is a root schematic (same name as project) + bool m_IsPopulated; // True if the name is a directory, and its content was read + wxTreeCtrl* m_parent; + int m_state; }; + +#endif // TREEPROJECT_ITEM_H_ diff --git a/kicad/class_treeprojectfiles.cpp b/kicad/class_treeprojectfiles.cpp index 2641cd18c3..2889a09848 100644 --- a/kicad/class_treeprojectfiles.cpp +++ b/kicad/class_treeprojectfiles.cpp @@ -83,8 +83,7 @@ TREEPROJECTFILES::TREEPROJECTFILES( TREE_PROJECT_FRAME* parent ) : TREEPROJECTFILES::~TREEPROJECTFILES() { - if( m_ImageList ) - delete m_ImageList; + delete m_ImageList; } @@ -93,16 +92,18 @@ int TREEPROJECTFILES::OnCompareItems( const wxTreeItemId& item1, const wxTreeIte TREEPROJECT_ITEM* myitem1 = (TREEPROJECT_ITEM*) GetItemData( item1 ); TREEPROJECT_ITEM* myitem2 = (TREEPROJECT_ITEM*) GetItemData( item2 ); - if( (myitem1->m_Type == TREE_DIRECTORY) && ( myitem2->m_Type != TREE_DIRECTORY ) ) + if( myitem1->GetType() == TREE_DIRECTORY && myitem2->GetType() != TREE_DIRECTORY ) return -1; - if( (myitem2->m_Type == TREE_DIRECTORY) && ( myitem1->m_Type != TREE_DIRECTORY ) ) + + if( myitem2->GetType() == TREE_DIRECTORY && myitem1->GetType() != TREE_DIRECTORY ) return 1; - if( myitem1->m_IsRootFile && !myitem2->m_IsRootFile ) + if( myitem1->IsRootFile() && !myitem2->IsRootFile() ) return -1; - if( myitem2->m_IsRootFile && !myitem1->m_IsRootFile ) + + if( myitem2->IsRootFile() && !myitem1->IsRootFile() ) return 1; - return myitem1->m_FileName.CmpNoCase( myitem2->m_FileName ); + return myitem1->GetFileName().CmpNoCase( myitem2->GetFileName() ); } diff --git a/kicad/files-io.cpp b/kicad/files-io.cpp index 018726654b..d7c724698f 100644 --- a/kicad/files-io.cpp +++ b/kicad/files-io.cpp @@ -41,8 +41,8 @@ #include -static const wxString ZipFileExtension( wxT( "zip" ) ); -static const wxString ZipFileWildcard( wxT( "Zip file (*.zip) | *.zip" ) ); +#define ZipFileExtension wxT( "zip" ) +#define ZipFileWildcard wxT( "Zip file (*.zip) | *.zip" ) void KICAD_MANAGER_FRAME::OnFileHistory( wxCommandEvent& event ) @@ -53,14 +53,17 @@ void KICAD_MANAGER_FRAME::OnFileHistory( wxCommandEvent& event ) if( fn != wxEmptyString ) { wxCommandEvent cmd( 0, wxID_ANY ); - m_ProjectFileName = fn; + + SetProjectFileName( fn ); OnLoadProject( cmd ); } } + void KICAD_MANAGER_FRAME::OnUnarchiveFiles( wxCommandEvent& event ) { - wxFileName fn = m_ProjectFileName; + wxFileName fn = GetProjectFileName(); + fn.SetExt( ZipFileExtension ); wxFileDialog dlg( this, _( "Unzip Project" ), fn.GetPath(), @@ -70,8 +73,7 @@ void KICAD_MANAGER_FRAME::OnUnarchiveFiles( wxCommandEvent& event ) if( dlg.ShowModal() == wxID_CANCEL ) return; - wxString msg; - msg.Printf( _("\nOpen <%s>\n" ), GetChars( dlg.GetPath() ) ); + wxString msg = wxString::Format( _("\nOpen <%s>\n" ), GetChars( dlg.GetPath() ) ); PrintMsg( msg ); wxDirDialog dirDlg( this, _( "Target Directory" ), fn.GetPath(), @@ -85,6 +87,7 @@ void KICAD_MANAGER_FRAME::OnUnarchiveFiles( wxCommandEvent& event ) PrintMsg( msg ); wxFileSystem zipfilesys; + zipfilesys.AddHandler( new wxZipFSHandler ); zipfilesys.ChangePathTo( dlg.GetPath() + wxT( "#zip:" ) ); @@ -94,7 +97,7 @@ void KICAD_MANAGER_FRAME::OnUnarchiveFiles( wxCommandEvent& event ) while( !localfilename.IsEmpty() ) { zipfile = zipfilesys.OpenFile( localfilename ); - if( zipfile == NULL ) + if( !zipfile ) { DisplayError( this, wxT( "Zip file read error" ) ); break; @@ -139,7 +142,7 @@ void KICAD_MANAGER_FRAME::OnArchiveFiles( wxCommandEvent& event ) }; wxString msg; - wxFileName fileName = m_ProjectFileName; + wxFileName fileName = GetProjectFileName(); wxString oldPath = wxGetCwd(); fileName.SetExt( wxT( "zip" ) ); diff --git a/kicad/kicad.cpp b/kicad/kicad.cpp index 693c0cfa8f..caea06763f 100644 --- a/kicad/kicad.cpp +++ b/kicad/kicad.cpp @@ -158,15 +158,15 @@ bool PGM_KICAD::OnPgmInit( wxApp* aWxApp ) bool prjloaded = false; // true when the project is loaded if( App().argc > 1 ) - frame->m_ProjectFileName = App().argv[1]; + frame->SetProjectFileName( App().argv[1] ); else if( GetFileHistory().GetCount() ) { // Try to open the last opened project, // if a project name is not given when starting Kicad - frame->m_ProjectFileName = GetFileHistory().GetHistoryFile( 0 ); + frame->SetProjectFileName( GetFileHistory().GetHistoryFile( 0 ) ); - if( !frame->m_ProjectFileName.FileExists() ) + if( !wxFileExists( frame->GetProjectFileName() ) ) GetFileHistory().RemoveFileFromHistory( 0 ); else { @@ -177,12 +177,12 @@ bool PGM_KICAD::OnPgmInit( wxApp* aWxApp ) } } - if( !frame->m_ProjectFileName.FileExists() ) + if( !wxFileExists( frame->GetProjectFileName() ) ) { wxFileName namelessProject( wxGetCwd(), NAMELESS_PROJECT, ProjectFileExtension ); - frame->m_ProjectFileName = namelessProject; + frame->SetProjectFileName( namelessProject.GetFullPath() ); } if( !prjloaded ) @@ -218,23 +218,24 @@ void PGM_KICAD::MacOpenFile( const wxString& aFileName ) KICAD_MANAGER_FRAME* frame = (KICAD_MANAGER_FRAME*) GetTopWindow(); + frame->SetProjectFile( aFileName ); + wxFileName fn = aFileName; - frame->m_ProjectFileName = fn; - - if( !frame->m_ProjectFileName.FileExists() && m_fileHistory.GetCount() ) + if( !fn.FileExists() && m_fileHistory.GetCount() ) { m_fileHistory.RemoveFileFromHistory( 0 ); return; } wxCommandEvent loadEvent; + loadEvent.SetId( wxID_ANY ); frame->OnLoadProject( loadEvent ); wxString title = GetTitle() + wxT( " " ) + GetBuildVersion() + - wxT( " " ) + frame->m_ProjectFileName.GetFullPath(); + wxT( " " ) + frame->GetProjectFileName(); if( !fn.IsDirWritable() ) title += _( " [Read Only]" ); diff --git a/kicad/kicad.h b/kicad/kicad.h index ab76ac5cbc..598aff73ee 100644 --- a/kicad/kicad.h +++ b/kicad/kicad.h @@ -120,28 +120,6 @@ enum id_kicad_frm { */ class KICAD_MANAGER_FRAME : public EDA_BASE_FRAME { -protected: - wxConfigBase* config(); // override EDA_BASE_FRAME virtual - - const SEARCH_STACK& sys_search(); // override EDA_BASE_FRAME virtual - - wxString help_name(); // override EDA_BASE_FRAME virtual - - -public: - TREE_PROJECT_FRAME* m_LeftWin; - LAUNCHER_PANEL* m_Launcher; - wxTextCtrl* m_MessagesBox; - wxAuiToolBar* m_VToolBar; // Vertical toolbar (not used) - wxString m_BoardFileName; - wxString m_SchematicRootFileName; - wxFileName m_ProjectFileName; - -private: - int m_leftWinWidth; - - void language_change( wxCommandEvent& event ); - public: KICAD_MANAGER_FRAME( wxWindow* parent, const wxString& title, const wxPoint& pos, const wxSize& size ); @@ -211,7 +189,7 @@ public: void OnUpdateDefaultPdfBrowser( wxUpdateUIEvent& event ); void OnUpdatePreferredPdfBrowser( wxUpdateUIEvent& event ); - void CreateNewProject( const wxString aPrjFullFileName, bool aTemplateSelector ); + void CreateNewProject( const wxString& aPrjFullFileName, bool aTemplateSelector ); void LoadSettings( wxConfigBase* aCfg ); @@ -249,7 +227,32 @@ public: void OnChangeWatchedPaths(wxCommandEvent& aEvent ); #endif + void SetProjectFileName( const wxString& aFullProjectProFileName ); + const wxString GetProjectFileName(); + + // read only accessors + const wxString SchFileName(); + const wxString PcbFileName(); + DECLARE_EVENT_TABLE() + +private: + + wxConfigBase* config(); // override EDA_BASE_FRAME virtual + + const SEARCH_STACK& sys_search(); // override EDA_BASE_FRAME virtual + + wxString help_name(); // override EDA_BASE_FRAME virtual + + TREE_PROJECT_FRAME* m_LeftWin; + LAUNCHER_PANEL* m_Launcher; + wxTextCtrl* m_MessagesBox; + wxAuiToolBar* m_VToolBar; // Vertical toolbar (not used) + wxFileName m_project_file_name; + + int m_leftWinWidth; + + void language_change( wxCommandEvent& event ); }; diff --git a/kicad/mainframe.cpp b/kicad/mainframe.cpp index 942f0fe975..921e140080 100644 --- a/kicad/mainframe.cpp +++ b/kicad/mainframe.cpp @@ -41,7 +41,6 @@ #include #include -#define USE_KIFACE 1 #define TreeFrameWidthEntry wxT( "LeftWinWidth" ) @@ -125,6 +124,35 @@ wxConfigBase* KICAD_MANAGER_FRAME::config() return ret; } +void KICAD_MANAGER_FRAME::SetProjectFileName( const wxString& aFullProjectProFileName ) +{ + m_project_file_name = aFullProjectProFileName; + + wxASSERT( m_project_file_name.IsAbsolute() ); +} + + +const wxString KICAD_MANAGER_FRAME::GetProjectFileName() +{ + return m_project_file_name.GetFullPath(); +} + + +const wxString KICAD_MANAGER_FRAME::SchFileName() +{ + wxFileName fn( GetProjectFileName(), SchematicFileExtension ); + + return fn.GetFullName(); +} + + +const wxString KICAD_MANAGER_FRAME::PcbFileName() +{ + wxFileName fn( GetProjectFileName(), PcbFileExtension ); + + return fn.GetFullName(); +} + const SEARCH_STACK& KICAD_MANAGER_FRAME::sys_search() { @@ -159,7 +187,7 @@ void KICAD_MANAGER_FRAME::OnCloseWindow( wxCloseEvent& Event ) { int px, py; - UpdateFileHistory( m_ProjectFileName.GetFullPath(), &Pgm().GetFileHistory() ); + UpdateFileHistory( GetProjectFileName(), &Pgm().GetFileHistory() ); if( !IsIconized() ) // save main frame position and size { @@ -238,16 +266,14 @@ void KICAD_MANAGER_FRAME::OnRunPageLayoutEditor( wxCommandEvent& event ) void KICAD_MANAGER_FRAME::OnRunPcbNew( wxCommandEvent& event ) { - wxFileName legacy_board( m_ProjectFileName ); - wxFileName kicad_board( m_ProjectFileName ); + wxFileName kicad_board( PcbFileName() ); + wxFileName legacy_board( GetProjectFileName() ); legacy_board.SetExt( LegacyPcbFileExtension ); - kicad_board.SetExt( KiCadPcbFileExtension ); wxFileName& board = ( !legacy_board.FileExists() || kicad_board.FileExists() ) ? kicad_board : legacy_board; -#if USE_KIFACE KIWAY_PLAYER* frame = Kiway.Player( FRAME_PCB, false ); if( !frame ) { @@ -256,19 +282,15 @@ void KICAD_MANAGER_FRAME::OnRunPcbNew( wxCommandEvent& event ) frame->Show( true ); } frame->Raise(); -#else - Execute( this, PCBNEW_EXE, QuoteFullPath( board ) ); -#endif } void KICAD_MANAGER_FRAME::OnRunCvpcb( wxCommandEvent& event ) { - wxFileName fn( m_ProjectFileName ); + wxFileName fn( m_project_file_name ); fn.SetExt( NetlistFileExtension ); -#if USE_KIFACE KIWAY_PLAYER* frame = Kiway.Player( FRAME_CVPCB, false ); if( !frame ) { @@ -277,19 +299,15 @@ void KICAD_MANAGER_FRAME::OnRunCvpcb( wxCommandEvent& event ) frame->Show( true ); } frame->Raise(); -#else - Execute( this, CVPCB_EXE, QuoteFullPath( fn ) ); -#endif } void KICAD_MANAGER_FRAME::OnRunEeschema( wxCommandEvent& event ) { - wxFileName fn( m_ProjectFileName ); + wxFileName fn( m_project_file_name ); fn.SetExt( SchematicFileExtension ); -#if USE_KIFACE KIWAY_PLAYER* frame = Kiway.Player( FRAME_SCH, false ); if( !frame ) { @@ -298,20 +316,14 @@ void KICAD_MANAGER_FRAME::OnRunEeschema( wxCommandEvent& event ) frame->Show( true ); } frame->Raise(); -#else - Execute( this, EESCHEMA_EXE, QuoteFullPath( fn ) ); -#endif } + void KICAD_MANAGER_FRAME::OnRunGerbview( wxCommandEvent& event ) { // Gerbview is called without any file to open, because we do not know // the list and the name of files to open (if any...). -#if USE_KIFACE && 0 - -#else Execute( this, GERBVIEW_EXE, wxEmptyString ); -#endif } @@ -392,7 +404,7 @@ void KICAD_MANAGER_FRAME::PrintPrjInfo() wxString msg = wxString::Format( _( "Working dir: %s\nProject: %s\n" ), GetChars( wxGetCwd() ), - GetChars( m_ProjectFileName.GetFullPath() ) + GetChars( GetProjectFileName() ) ); PrintMsg( msg ); } diff --git a/kicad/prjconfig.cpp b/kicad/prjconfig.cpp index 978f5eec8b..501ecd6dcf 100644 --- a/kicad/prjconfig.cpp +++ b/kicad/prjconfig.cpp @@ -57,8 +57,8 @@ PARAM_CFG_ARRAY s_KicadManagerParams; -void KICAD_MANAGER_FRAME::CreateNewProject( const wxString aPrjFullFileName, - bool aTemplateSelector = false ) +void KICAD_MANAGER_FRAME::CreateNewProject( const wxString& aPrjFullFileName, + bool aTemplateSelector = false ) { wxString filename; wxFileName newProjectName = aPrjFullFileName; @@ -169,15 +169,8 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxString aPrjFullFileName, } } - // Init schematic filename - m_SchematicRootFileName = wxFileName( newProjectName.GetName(), - SchematicFileExtension ).GetFullName(); - - // Init pcb board filename - m_BoardFileName = wxFileName( newProjectName.GetName(), PcbFileExtension ).GetFullName(); - // Init project filename - m_ProjectFileName = newProjectName; + SetProjectFileName( newProjectName.GetFullPath() ); // Write settings to project file // was: wxGetApp().WriteProjectConfig( aPrjFullFileName, GeneralGroupName, s_KicadManagerParams ); @@ -187,15 +180,19 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxString aPrjFullFileName, void KICAD_MANAGER_FRAME::OnLoadProject( wxCommandEvent& event ) { - int style; - wxString title; - bool newProject = ( event.GetId() == ID_NEW_PROJECT ) || - ( event.GetId() == ID_NEW_PROJECT_FROM_TEMPLATE ); + wxString title; + + // this is still a mess, will work on it tomorrow. ClearMsg(); if( event.GetId() != wxID_ANY ) { + int style; + + bool newProject = ( event.GetId() == ID_NEW_PROJECT ) || + ( event.GetId() == ID_NEW_PROJECT_FROM_TEMPLATE ); + if( newProject ) { title = _( "Create New Project" ); @@ -207,21 +204,20 @@ void KICAD_MANAGER_FRAME::OnLoadProject( wxCommandEvent& event ) style = wxFD_OPEN | wxFD_FILE_MUST_EXIST; } - wxString default_dir = wxGetCwd(); - wxFileDialog dlg( this, title, default_dir, wxEmptyString, - ProjectFileWildcard, style ); + wxString default_dir = wxGetCwd(); + wxFileDialog dlg( this, title, default_dir, wxEmptyString, + ProjectFileWildcard, style ); if( dlg.ShowModal() == wxID_CANCEL ) return; - m_ProjectFileName = dlg.GetPath(); + wxFileName pro( dlg.GetPath() ); + pro.SetExt( ProjectFileExtension ); if( newProject ) { - m_ProjectFileName.SetExt( ProjectFileExtension ); - // Check if the project directory is empty - wxDir directory ( m_ProjectFileName.GetPath() ); + wxDir directory( pro.GetPath() ); if( directory.HasFiles() ) { @@ -233,57 +229,59 @@ void KICAD_MANAGER_FRAME::OnLoadProject( wxCommandEvent& event ) { // Append a new directory with the same name of the project file // and try to create it - m_ProjectFileName.AppendDir( m_ProjectFileName.GetName() ); + pro.AppendDir( pro.GetName() ); - if( !wxMkdir( m_ProjectFileName.GetPath() ) ) + if( !wxMkdir( pro.GetPath() ) ) // There was a problem, undo - m_ProjectFileName.RemoveLastDir(); + pro.RemoveLastDir(); } } if( event.GetId() == ID_NEW_PROJECT ) { - CreateNewProject( m_ProjectFileName.GetFullPath() ); + CreateNewProject( pro.GetFullPath() ); } else if( event.GetId() == ID_NEW_PROJECT_FROM_TEMPLATE ) { // Launch the template selector dialog - CreateNewProject( m_ProjectFileName.GetFullPath(), true ); + CreateNewProject( pro.GetFullPath(), true ); } } + + SetProjectFileName( pro.GetFullName() ); } - wxLogDebug( wxT( "Loading KiCad project file: " ) + m_ProjectFileName.GetFullPath() ); + wxLogDebug( wxT( "Loading KiCad project file: " ) + GetProjectFileName() ); - /* Check if project file exists and if it is not noname.pro */ - wxString filename = m_ProjectFileName.GetFullName(); + // Check if project file exists and if it is not noname.pro + wxString filename = GetProjectFileName(); wxString nameless_prj = NAMELESS_PROJECT wxT( ".pro" ); - if( !m_ProjectFileName.FileExists() && !filename.IsSameAs( nameless_prj ) ) + if( !wxFileExists( GetProjectFileName() ) && !filename.IsSameAs( nameless_prj ) ) { wxString msg = wxString::Format( _( "KiCad project file '%s' not found" ), - GetChars( m_ProjectFileName.GetFullPath() ) ); + GetChars( GetProjectFileName() ) ); DisplayError( this, msg ); return; } - wxSetWorkingDirectory( m_ProjectFileName.GetPath() ); + wxSetWorkingDirectory( wxFileName( GetProjectFileName() ).GetPath() ); // was wxGetApp().ReadProjectConfig( m_ProjectFileName.GetFullPath(), // GeneralGroupName, s_KicadManagerParams, false ); - Prj().ConfigLoad( Pgm().SysSearch(), m_ProjectFileName.GetFullPath(), + Prj().ConfigLoad( Pgm().SysSearch(), GetProjectFileName(), GeneralGroupName, s_KicadManagerParams, false ); - title = wxT( "KiCad " ) + GetBuildVersion() + wxT( ' ' ) + m_ProjectFileName.GetFullPath(); + title = wxT( "KiCad " ) + GetBuildVersion() + wxT( ' ' ) + GetProjectFileName(); - if( !m_ProjectFileName.IsDirWritable() ) + if( !wxIsWritable( GetProjectFileName() ) ) title += _( " [Read Only]" ); SetTitle( title ); - UpdateFileHistory( m_ProjectFileName.GetFullPath(), &Pgm().GetFileHistory() ); + UpdateFileHistory( GetProjectFileName(), &Pgm().GetFileHistory() ); m_LeftWin->ReCreateTreePrj(); @@ -292,7 +290,8 @@ void KICAD_MANAGER_FRAME::OnLoadProject( wxCommandEvent& event ) // however this is possible only when the main loop event handler is running, // so we use it to run the rebuild function. wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED, ID_INIT_WATCHED_PATHS ); - wxPostEvent( this, cmd); + + wxPostEvent( this, cmd ); #endif PrintPrjInfo(); @@ -301,12 +300,11 @@ void KICAD_MANAGER_FRAME::OnLoadProject( wxCommandEvent& event ) void KICAD_MANAGER_FRAME::OnSaveProject( wxCommandEvent& event ) { - if( !IsWritable( m_ProjectFileName ) ) + if( !wxIsWritable( GetProjectFileName() ) ) return; // was: wxGetApp().WriteProjectConfig( m_ProjectFileName.GetFullPath(), // GeneralGroupName, s_KicadManagerParams ); - Prj().ConfigSave( Pgm().SysSearch(), m_ProjectFileName.GetFullPath(), + Prj().ConfigSave( Pgm().SysSearch(), GetProjectFileName(), GeneralGroupName, s_KicadManagerParams ); } - diff --git a/kicad/tree_project_frame.cpp b/kicad/tree_project_frame.cpp index e4e6d362af..383dd06b34 100644 --- a/kicad/tree_project_frame.cpp +++ b/kicad/tree_project_frame.cpp @@ -93,10 +93,10 @@ static const wxChar* s_allowedExtensionsToList[] = * library as required. */ -/* File extension definitions. */ +// File extension definitions. const wxChar TextFileExtension[] = wxT( "txt" ); -/* File wildcard definitions. */ +// File wildcard definitions. const wxChar TextFileWildcard[] = wxT( "Text files (*.txt)|*.txt" ); @@ -132,11 +132,13 @@ TREE_PROJECT_FRAME::TREE_PROJECT_FRAME( KICAD_MANAGER_FRAME* parent ) : { m_Parent = parent; m_TreeProject = NULL; + #ifdef KICAD_USE_FILES_WATCHER m_watcher = NULL; Connect( wxEVT_FSWATCHER, wxFileSystemWatcherEventHandler( TREE_PROJECT_FRAME::OnFileSystemEvent ) ); #endif + /* * Filtering is now inverted: the filters are actually used to _enable_ support * for a given file type. @@ -162,9 +164,7 @@ TREE_PROJECT_FRAME::~TREE_PROJECT_FRAME() } -/*****************************************************************************/ void TREE_PROJECT_FRAME::RemoveFilter( const wxString& filter ) -/*****************************************************************************/ { for( unsigned int i = 0; i < m_filters.size(); i++ ) { @@ -177,11 +177,6 @@ void TREE_PROJECT_FRAME::RemoveFilter( const wxString& filter ) } -/** - * Called by the popup menu in the tree frame - * Creates a new subdirectory inside the current kicad project directory - * the user is prompted to enter a directory name - */ void TREE_PROJECT_FRAME::OnCreateNewDirectory( wxCommandEvent& event ) { // Get the root directory name: @@ -374,16 +369,6 @@ wxString TREE_PROJECT_FRAME::GetFileWildcard( TreeFileType type ) } -/** - * Function AddItemToTreeProject - * @brief Add filename "name" to the tree \n - * if name is a directory, add the sub directory file names - * @param aName = the filename or the dirctory name to add - * @param aRoot = the wxTreeItemId item where to add sub tree items - * @param aRecurse = true to add file or subdir names to the current tree item - * false to stop file add. - * @return true if the file (or directory) is added. - */ bool TREE_PROJECT_FRAME::AddItemToTreeProject( const wxString& aName, wxTreeItemId& aRoot, bool aRecurse ) { @@ -450,7 +435,7 @@ bool TREE_PROJECT_FRAME::AddItemToTreeProject( const wxString& aName, wxString rootName; TREEPROJECT_ITEM* itemData = GetItemIdData( m_root ); if( itemData ) - rootName = itemData->m_FileName.BeforeLast( '.' ); + rootName = itemData->GetFileName().BeforeLast( '.' ); if( fullFileName != rootName ) { @@ -513,7 +498,7 @@ bool TREE_PROJECT_FRAME::AddItemToTreeProject( const wxString& aName, if( itemData ) { - if( itemData->m_FileName == aName ) + if( itemData->GetFileName() == aName ) { return true; // well, we would have added it, but it is already here! } @@ -531,13 +516,13 @@ bool TREE_PROJECT_FRAME::AddItemToTreeProject( const wxString& aName, data->SetState( 0 ); /* Mark root files (files which have the same aName as the project) */ - wxFileName project( m_Parent->m_ProjectFileName ); + wxFileName project( m_Parent->GetProjectFileName() ); wxFileName currfile( file ); if( currfile.GetName().CmpNoCase( project.GetName() ) == 0 ) - data->m_IsRootFile = true; + data->SetRootFile( true ); else - data->m_IsRootFile = false; + data->SetRootFile( false ); // This section adds dirs and files found in the subdirs // in this case AddFile is recursive, but for the first level only. @@ -546,7 +531,8 @@ bool TREE_PROJECT_FRAME::AddItemToTreeProject( const wxString& aName, const wxString sep = wxFileName().GetPathSeparator(); wxDir dir( aName ); wxString dir_filename; - data->m_WasPopulated = true; // set state to populated + + data->SetPopulated( true ); if( dir.GetFirst( &dir_filename ) ) { @@ -564,13 +550,9 @@ bool TREE_PROJECT_FRAME::AddItemToTreeProject( const wxString& aName, } -/** - * @brief Create or modify the tree showing project file names - */ void TREE_PROJECT_FRAME::ReCreateTreePrj() { wxTreeItemId rootcellule; - wxFileName fn; bool prjOpened = false; if( !m_TreeProject ) @@ -578,15 +560,15 @@ void TREE_PROJECT_FRAME::ReCreateTreePrj() else m_TreeProject->DeleteAllItems(); - if( !m_Parent->m_ProjectFileName.IsOk() ) + wxFileName fn = m_Parent->GetProjectFileName(); + + if( !fn.IsOk() ) { fn.Clear(); fn.SetPath( ::wxGetCwd() ); fn.SetName( NAMELESS_PROJECT ); fn.SetExt( ProjectFileExtension ); } - else - fn = m_Parent->m_ProjectFileName; prjOpened = fn.FileExists(); @@ -625,26 +607,21 @@ void TREE_PROJECT_FRAME::ReCreateTreePrj() m_TreeProject->Expand( rootcellule ); - /* Sort filenames by alphabetic order */ + // Sort filenames by alphabetic order m_TreeProject->SortChildren( m_root ); - m_Parent->m_ProjectFileName = fn; + m_Parent->SetProjectFileName( fn.GetFullPath() ); } -/** - * @brief Opens *popup* the context menu - */ -/*****************************************************************************/ void TREE_PROJECT_FRAME::OnRight( wxTreeEvent& Event ) -/*****************************************************************************/ { int tree_id; TREEPROJECT_ITEM* tree_data; wxString FullFileName; wxTreeItemId curr_item = Event.GetItem(); - /* Ensure item is selected (Under Windows right click does not select the item) */ + // Ensure item is selected (Under Windows right click does not select the item) m_TreeProject->SelectItem( curr_item ); tree_data = GetSelectedData(); @@ -696,10 +673,7 @@ void TREE_PROJECT_FRAME::OnRight( wxTreeEvent& Event ) PopupMenu( &popupMenu ); } -/* - * Called by the popup menu, when right clicking on a file name - * Launch the text editor to open the selected file - */ + void TREE_PROJECT_FRAME::OnOpenSelectedFileWithTextEditor( wxCommandEvent& event ) { TREEPROJECT_ITEM* tree_data = GetSelectedData(); @@ -719,10 +693,6 @@ void TREE_PROJECT_FRAME::OnOpenSelectedFileWithTextEditor( wxCommandEvent& event } -/* Called via the popup menu, when right clicking on a file name - * or a directory name to delete the selected file or directory - * in the tree project - */ void TREE_PROJECT_FRAME::OnDeleteFile( wxCommandEvent& ) { TREEPROJECT_ITEM* tree_data = GetSelectedData(); @@ -734,10 +704,6 @@ void TREE_PROJECT_FRAME::OnDeleteFile( wxCommandEvent& ) } -/* Called via the popup menu, when right clicking on a file name - * or a directory name to rename the selected file or directory - * in the tree project - */ void TREE_PROJECT_FRAME::OnRenameFile( wxCommandEvent& ) { wxTreeItemId curr_item = m_TreeProject->GetSelection(); @@ -746,9 +712,10 @@ void TREE_PROJECT_FRAME::OnRenameFile( wxCommandEvent& ) if( !tree_data ) return; - wxString buffer = m_TreeProject->GetItemText( curr_item ); - wxString msg; - msg.Printf( _( "Change filename: <%s>" ), GetChars( tree_data->m_FileName ) ); + wxString buffer = m_TreeProject->GetItemText( curr_item ); + wxString msg = wxString::Format( + _( "Change filename: <%s>" ), + GetChars( tree_data->GetFileName() ) ); wxTextEntryDialog dlg( this, msg, _( "Change filename" ), buffer ); @@ -767,12 +734,7 @@ void TREE_PROJECT_FRAME::OnRenameFile( wxCommandEvent& ) } -/* - * called on a double click on an item - */ -/*****************************************************************************/ void TREE_PROJECT_FRAME::OnSelect( wxTreeEvent& Event ) -/*****************************************************************************/ { wxString FullFileName; @@ -785,13 +747,7 @@ void TREE_PROJECT_FRAME::OnSelect( wxTreeEvent& Event ) } -/** - * @brief Called when expanding an item of the tree - * populate tree items corresponding to subdirectories not already populated - */ -/*****************************************************************************/ void TREE_PROJECT_FRAME::OnExpand( wxTreeEvent& Event ) -/*****************************************************************************/ { wxString FullFileName; @@ -816,7 +772,7 @@ void TREE_PROJECT_FRAME::OnExpand( wxTreeEvent& Event ) if( !itemData || itemData->GetType() != TREE_DIRECTORY ) continue; - if( itemData->m_WasPopulated ) + if( itemData->IsPopulated() ) continue; wxString fileName = itemData->GetFileName(); @@ -832,10 +788,10 @@ void TREE_PROJECT_FRAME::OnExpand( wxTreeEvent& Event ) } while( dir.GetNext( &dir_filename ) ); } - itemData->m_WasPopulated = true; // set state to populated + itemData->SetPopulated( true ); // set state to populated subdir_populated = true; - /* Sort filenames by alphabetic order */ + // Sort filenames by alphabetic order m_TreeProject->SortChildren( kid ); } @@ -850,12 +806,6 @@ void TREE_PROJECT_FRAME::OnExpand( wxTreeEvent& Event ) } -/** - * Function GetSelectedData - * return the item data from item currently selected (highlighted) - * Note this is not necessary the "clicked" item, - * because when expanding, collapsing an item this item is not selected - */ TREEPROJECT_ITEM* TREE_PROJECT_FRAME::GetSelectedData() { return dynamic_cast( m_TreeProject->GetItemData @@ -863,25 +813,12 @@ TREEPROJECT_ITEM* TREE_PROJECT_FRAME::GetSelectedData() } -/** - * Function GetItemIdData - * return the item data corresponding to a wxTreeItemId identifier - * @param aId = the wxTreeItemId identifier. - * @return a TREEPROJECT_ITEM pointer correspondinfg to item id aId - */ TREEPROJECT_ITEM* TREE_PROJECT_FRAME::GetItemIdData( wxTreeItemId aId ) { return dynamic_cast( m_TreeProject->GetItemData( aId ) ); } -/* Search for the item in tree project which is the - * node of the subdirectory aSubDir - * param aSubDir = the directory to find in tree - * return the opaque reference to the tree item. - * if not found, return an invalid tree item. - * therefore wxTreeItemId::IsOk should be used to test - * the returned value - */ + wxTreeItemId TREE_PROJECT_FRAME::findSubdirTreeItem( const wxString& aSubDir ) { // If the subdir is the current working directory, return m_root @@ -918,14 +855,14 @@ wxTreeItemId TREE_PROJECT_FRAME::findSubdirTreeItem( const wxString& aSubDir ) if( itemData && ( itemData->GetType() == TREE_DIRECTORY ) ) { - if( itemData->m_FileName == aSubDir ) // Found! + if( itemData->GetFileName() == aSubDir ) // Found! { root_id = kid; break; } // kid is a subdir, push in list to explore it later - if( itemData->m_WasPopulated ) + if( itemData->IsPopulated() ) subdirs_id.push( kid ); } kid = m_TreeProject->GetNextChild( root_id, cookie ); @@ -934,12 +871,9 @@ wxTreeItemId TREE_PROJECT_FRAME::findSubdirTreeItem( const wxString& aSubDir ) return root_id; } + #ifdef KICAD_USE_FILES_WATCHER -/* called when a file or directory is modified/created/deleted - * The tree project is modified when a file or directory - * is created/deleted/renamed to reflect the file change - */ - void TREE_PROJECT_FRAME::OnFileSystemEvent( wxFileSystemWatcherEvent& event ) +void TREE_PROJECT_FRAME::OnFileSystemEvent( wxFileSystemWatcherEvent& event ) { wxFileName pathModified = event.GetPath(); wxString subdir = pathModified.GetPath(); @@ -981,7 +915,7 @@ wxTreeItemId TREE_PROJECT_FRAME::findSubdirTreeItem( const wxString& aSubDir ) { TREEPROJECT_ITEM* itemData = GetItemIdData( kid ); - if( itemData && ( itemData->m_FileName == fn ) ) + if( itemData && itemData->GetFileName() == fn ) { m_TreeProject->Delete( kid ); return; @@ -991,35 +925,33 @@ wxTreeItemId TREE_PROJECT_FRAME::findSubdirTreeItem( const wxString& aSubDir ) break; case wxFSW_EVENT_RENAME : - { - wxFileName newpath = event.GetNewPath(); - wxString newfn = newpath.GetFullPath(); - while( kid.IsOk() ) { - TREEPROJECT_ITEM* itemData = GetItemIdData( kid ); + wxFileName newpath = event.GetNewPath(); + wxString newfn = newpath.GetFullPath(); - if( itemData && ( itemData->m_FileName == fn ) ) + while( kid.IsOk() ) { - m_TreeProject->Delete( kid ); - break; + TREEPROJECT_ITEM* itemData = GetItemIdData( kid ); + + if( itemData && itemData->GetFileName() == fn ) + { + m_TreeProject->Delete( kid ); + break; + } + + kid = m_TreeProject->GetNextChild( root_id, cookie ); } - kid = m_TreeProject->GetNextChild( root_id, cookie ); + AddItemToTreeProject( newfn, root_id, false ); } - AddItemToTreeProject( newfn, root_id, false ); - } break; } - /* Sort filenames by alphabetic order */ + // Sort filenames by alphabetic order m_TreeProject->SortChildren( root_id ); } -/* Reinit the watched paths - * Should be called after opening a new project to - * rebuild the list of watched paths. - * Should be called after the main loop event handler is started - */ + void TREE_PROJECT_FRAME::FileWatcherReset() { // Prepare file watcher: @@ -1065,13 +997,14 @@ void TREE_PROJECT_FRAME::FileWatcherReset() if( itemData && ( itemData->GetType() == TREE_DIRECTORY ) ) { - watched_path = wxFileName::DirName( itemData->m_FileName ); + watched_path = wxFileName::DirName( itemData->GetFileName() ); m_watcher->Add( watched_path ); // if kid is a subdir, push in list to explore it later - if( itemData->m_WasPopulated && m_TreeProject->GetChildrenCount( kid ) ) + if( itemData->IsPopulated() && m_TreeProject->GetChildrenCount( kid ) ) subdirs_id.push( kid ); } + kid = m_TreeProject->GetNextChild( root_id, cookie ); } #endif @@ -1084,14 +1017,6 @@ void TREE_PROJECT_FRAME::FileWatcherReset() #endif } -/* Called by sending a event with id = ID_INIT_WATCHED_PATHS - * rebuild the list of whatched paths - * We are using an event called function to install or reinit a file system watcher - * because a file watcher *needs* a running loop event handler. - * this is noticeable under Linux. - * therefore the safe way to do that is to use the main event loop - * to call m_LeftWin->FileWatcherReset() - */ void KICAD_MANAGER_FRAME::OnChangeWatchedPaths(wxCommandEvent& aEvent ) { m_LeftWin->FileWatcherReset(); diff --git a/kicad/tree_project_frame.h b/kicad/tree_project_frame.h index 4317b25178..5cb98742c3 100644 --- a/kicad/tree_project_frame.h +++ b/kicad/tree_project_frame.h @@ -58,7 +58,12 @@ private: public: TREE_PROJECT_FRAME( KICAD_MANAGER_FRAME* parent ); ~TREE_PROJECT_FRAME(); + + /** + * Create or modify the tree showing project file names + */ void ReCreateTreePrj(); + #ifdef KICAD_USE_FILES_WATCHER /** * Reinit the watched paths @@ -162,8 +167,8 @@ private: bool aRecurse = true ); /** - * function findSubdirTreeItem - * Search for the item in tree project which is the + * Function findSubdirTreeItem + * searches for the item in tree project which is the * node of the subdirectory aSubDir * @param aSubDir = the directory to find in tree * @return the opaque reference to the tree item. diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 67c4cc363f..ade13d4726 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -45,6 +45,7 @@ endif() include_directories( ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/pcbnew + ${BOOST_INCLUDE} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_BINARY_DIR} ) diff --git a/tools/property_tree.cpp b/tools/property_tree.cpp index dfe898b898..0386d2120e 100644 --- a/tools/property_tree.cpp +++ b/tools/property_tree.cpp @@ -58,7 +58,7 @@ int main( int argc, char** argv ) static const KEYWORD empty_keywords[1] = {}; - DSNLEXER lexer( empty_keywords, 0, fp, wxString( FROM_UTF8( argv[1] ) ) ); + DSNLEXER lexer( empty_keywords, 0, fp, FROM_UTF8( argv[1] ) ); try {