void KICAD_MANAGER_FRAME::OnCloseWindow( wxCloseEvent& Event ) { if( Kiway().PlayersClose( false ) ) { int px, py; if( !GetProjectFileName().empty() ) UpdateFileHistory( GetProjectFileName(), &PgmTop().GetFileHistory() ); if( !IsIconized() ) // save main frame position and size { GetPosition( &px, &py ); m_FramePos.x = px; m_FramePos.y = py; GetSize( &px, &py ); m_FrameSize.x = px; m_FrameSize.y = py; } Event.SetCanVeto( true ); m_LeftWin->Show( false ); Destroy(); } }
void KICAD_MANAGER_FRAME::OnSaveProject( wxCommandEvent& event ) { if( !wxIsWritable( GetProjectFileName() ) ) return; Prj().ConfigSave( PgmTop().SysSearch(), GeneralGroupName, s_KicadManagerParams ); }
void KICAD_MANAGER_FRAME::LoadProject( const wxFileName& aProjectFileName ) { // The project file should be valid by the time we get here or something has gone wrong. if( !aProjectFileName.Exists() ) return; // Any open KIFACE's must be closed if they are not part of the new project. // (We never want a KIWAY_PLAYER open on a KIWAY that isn't in the same project.) // User is prompted here to close those KIWAY_PLAYERs: if( !Kiway().PlayersClose( false ) ) return; SetTitle( wxString( "KiCad " ) + GetBuildVersion() ); // Save the project file for the currently loaded project. if( m_active_project ) Prj().ConfigLoad( PgmTop().SysSearch(), GeneralGroupName, s_KicadManagerParams ); m_active_project = true; ClearMsg(); SetProjectFileName( aProjectFileName.GetFullPath() ); Prj().ConfigLoad( PgmTop().SysSearch(), GeneralGroupName, s_KicadManagerParams ); wxString title = GetTitle() + " " + aProjectFileName.GetFullPath(); if( !aProjectFileName.IsDirWritable() ) title += _( " [Read Only]" ); else SetMruPath( Prj().GetProjectPath() ); // Only set MRU path if we have write access. Why? SetTitle( title ); UpdateFileHistory( aProjectFileName.GetFullPath(), &PgmTop().GetFileHistory() ); m_LeftWin->ReCreateTreePrj(); // Rebuild the list of watched paths. // 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 ); PrintPrjInfo(); }
void KICAD_MANAGER_FRAME::OnFileHistory( wxCommandEvent& event ) { wxFileName projFileName = GetFileFromHistory( event.GetId(), _( "KiCad project file" ), &PgmTop().GetFileHistory() ); if( !projFileName.FileExists() ) return; LoadProject( projFileName ); }
void KICAD_MANAGER_FRAME::OnSaveProject( wxCommandEvent& event ) { if( !wxIsWritable( GetProjectFileName() ) ) return; // was: wxGetApp().WriteProjectConfig( m_ProjectFileName.GetFullPath(), // GeneralGroupName, s_KicadManagerParams ); Prj().ConfigSave( PgmTop().SysSearch(), GeneralGroupName, s_KicadManagerParams ); }
void KICAD_MANAGER_FRAME::CreateNewProject( const wxFileName& aProjectFileName ) { wxCHECK_RET( aProjectFileName.DirExists() && aProjectFileName.IsDirWritable(), "Project folder must exist and be writable to create a new project." ); // Init project filename. This clears all elements from the project object. SetProjectFileName( aProjectFileName.GetFullPath() ); // Copy kicad.pro file from template folder. if( !aProjectFileName.FileExists() ) { wxString srcFileName = sys_search().FindValidPath( "kicad.pro" ); // Create a minimal project (.pro) file if the template project file could not be copied. if( !wxFileName::FileExists( srcFileName ) || !wxCopyFile( srcFileName, aProjectFileName.GetFullPath() ) ) { Prj().ConfigSave( PgmTop().SysSearch(), GeneralGroupName, s_KicadManagerParams ); } } // Ensure a "stub" for a schematic root sheet and a board exist. // It will avoid messages from the schematic editor or the board editor to create a new file // And forces the user to create main files under the right name for the project manager wxFileName fn( aProjectFileName.GetFullPath() ); fn.SetExt( SchematicFileExtension ); // If a <project>.sch file does not exist, create a "stub" file ( minimal schematic file ) if( !fn.FileExists() ) { wxFile file( fn.GetFullPath(), wxFile::write ); if( file.IsOpened() ) file.Write( wxT( "EESchema Schematic File Version 2\n" "EELAYER 25 0\nEELAYER END\n$EndSCHEMATC\n" ) ); // wxFile dtor will close the file } // If a <project>.kicad_pcb or <project>.brd file does not exist, // create a .kicad_pcb "stub" file fn.SetExt( KiCadPcbFileExtension ); wxFileName leg_fn( fn ); leg_fn.SetExt( LegacyPcbFileExtension ); if( !fn.FileExists() && !leg_fn.FileExists() ) { wxFile file( fn.GetFullPath(), wxFile::write ); if( file.IsOpened() ) file.Write( wxT( "(kicad_pcb (version 4) (host kicad \"dummy file\") )\n" ) ); // wxFile dtor will close the file } }
/** * @brief (Re)Create the menubar */ void KICAD_MANAGER_FRAME::ReCreateMenuBar() { wxString msg; static wxMenu* openRecentMenu; // Open Recent submenu, // static to remember this menu m_manager_Hokeys_Descr = kicad_Manager_Hokeys_Descr; // wxWidgets handles the Mac Application menu behind the scenes, but that means // we always have to start from scratch with a new wxMenuBar. wxMenuBar* oldMenuBar = GetMenuBar(); wxMenuBar* menuBar = new wxMenuBar(); // Before deleting, remove the menus managed by m_fileHistory // (the file history will be updated when adding/removing files in history) if( openRecentMenu ) PgmTop().GetFileHistory().RemoveMenu( openRecentMenu ); // Recreate all menus: // Menu File: wxMenu* fileMenu = new wxMenu; // New project creation wxMenu* newprjSubMenu = new wxMenu(); msg = AddHotkeyName( _( "&Project..." ), kicad_Manager_Hokeys_Descr, HK_NEW ); AddMenuItem( newprjSubMenu, ID_NEW_PROJECT, msg, _( "Create new blank project" ), KiBitmap( new_project_xpm ) ); msg = AddHotkeyName( _( "Project from &Template..." ), kicad_Manager_Hokeys_Descr, HK_NEW_PRJ_TEMPLATE ); AddMenuItem( newprjSubMenu, ID_NEW_PROJECT_FROM_TEMPLATE, msg, _( "Create new project from template" ), KiBitmap( new_project_with_template_xpm ) ); AddMenuItem( fileMenu, newprjSubMenu, wxID_ANY, _( "&New" ), _( "Create new project" ), KiBitmap( new_project_xpm ) ); // Open msg = AddHotkeyName( _( "&Open Project..." ), kicad_Manager_Hokeys_Descr, HK_OPEN ); AddMenuItem( fileMenu, ID_LOAD_PROJECT, msg, _( "Open an existing project" ), KiBitmap( open_project_xpm ) ); // File history openRecentMenu = new wxMenu(); PgmTop().GetFileHistory().UseMenu( openRecentMenu ); PgmTop().GetFileHistory().AddFilesToMenu( ); AddMenuItem( fileMenu, openRecentMenu, wxID_ANY, _( "Open &Recent" ), _( "Open a recent project" ), KiBitmap( recent_xpm ) ); // Currently there is nothing to save // (Kicad manager does not save any info in .pro file) #if 0 // Save msg = AddHotkeyName( _( "&Save" ), kicad_Manager_Hokeys_Descr, HK_SAVE ); AddMenuItem( fileMenu, ID_SAVE_PROJECT, msg, _( "Save current project" ), KiBitmap( save_project_xpm ) ); #endif fileMenu->AppendSeparator(); wxMenu* importprjSubMenu = new wxMenu(); AddMenuItem( importprjSubMenu, ID_IMPORT_EAGLE_PROJECT, _( "EAGLE CAD..." ), _( "Import EAGLE CAD XML schematic and board" ), KiBitmap( import_project_xpm ) ); AddMenuItem( fileMenu, importprjSubMenu, wxID_ANY, _( "Import Project" ), _( "Import project files from other software" ), KiBitmap( import_project_xpm ) ); fileMenu->AppendSeparator(); // Archive AddMenuItem( fileMenu, ID_SAVE_AND_ZIP_FILES, _( "&Archive Project..." ), _( "Archive all needed project files into zip archive" ), KiBitmap( zip_xpm ) ); // Unarchive AddMenuItem( fileMenu, ID_READ_ZIP_ARCHIVE, _( "&Unarchive Project..." ), _( "Unarchive project files from zip archive" ), KiBitmap( unzip_xpm ) ); // Separator fileMenu->AppendSeparator(); // Quit AddMenuItem( fileMenu, wxID_EXIT, _( "&Exit" ), _( "Close KiCad" ), KiBitmap( exit_xpm ) ); // View Menu: wxMenu* viewMenu = new wxMenu(); // Refresh project tree msg = AddHotkeyName( _( "&Refresh" ), kicad_Manager_Hokeys_Descr, HK_REFRESH ); AddMenuItem( viewMenu, ID_PROJECT_TREE_REFRESH, msg, _( "Refresh project tree" ), KiBitmap( reload_xpm ) ); #ifdef __APPLE__ viewMenu->AppendSeparator(); #endif // Menu Browse: wxMenu* browseMenu = new wxMenu(); // Text editor AddMenuItem( browseMenu, ID_TO_TEXT_EDITOR, _( "Open Text E&ditor" ), _( "Launch preferred text editor" ), KiBitmap( editor_xpm ) ); // View file AddMenuItem( browseMenu, ID_BROWSE_AN_SELECT_FILE, _( "&Open Local File..." ), _( "Edit local file" ), KiBitmap( browse_files_xpm ) ); // Browse in file explorer browseMenu->AppendSeparator(); AddMenuItem( browseMenu, ID_BROWSE_IN_FILE_EXPLORER, _( "&Browse Project Files" ), _( "Open project directory in file explorer" ), KiBitmap( directory_browser_xpm ) ); // Menu Preferences: wxMenu* preferencesMenu = new wxMenu; // Path configuration edit dialog. AddMenuItem( preferencesMenu, ID_PREFERENCES_CONFIGURE_PATHS, _( "&Configure Paths..." ), _( "Edit path configuration environment variables" ), KiBitmap( path_xpm ) ); AddMenuItem( preferencesMenu, ID_EDIT_SYMBOL_LIBRARY_TABLE, _( "Manage &Symbol Libraries..." ), _( "Edit the global and project symbol library tables" ), KiBitmap( library_table_xpm ) ); AddMenuItem( preferencesMenu, ID_EDIT_FOOTPRINT_LIBRARY_TABLE, _( "Manage &Footprint Libraries..." ), _( "Configure footprint library table" ), KiBitmap( library_table_xpm ) ); AddMenuItem( preferencesMenu, wxID_PREFERENCES, _( "&Preferences..." ), _( "Show preferences for all open tools" ), KiBitmap( preference_xpm ) ); preferencesMenu->AppendSeparator(); // Language submenu Pgm().AddMenuLanguageList( preferencesMenu ); // Menu Tools: wxMenu* toolsMenu = new wxMenu; msg = AddHotkeyName( _( "Edit Schematic" ), kicad_Manager_Hokeys_Descr, HK_RUN_EESCHEMA ); AddMenuItem( toolsMenu, ID_TO_SCH, msg, KiBitmap( eeschema_xpm ) ); msg = AddHotkeyName( _( "Edit Schematic Symbols" ), kicad_Manager_Hokeys_Descr, HK_RUN_LIBEDIT ); AddMenuItem( toolsMenu, ID_TO_SCH_LIB_EDITOR, msg, KiBitmap( libedit_xpm ) ); msg = AddHotkeyName( _( "Edit PCB" ), kicad_Manager_Hokeys_Descr, HK_RUN_PCBNEW ); AddMenuItem( toolsMenu, ID_TO_PCB, msg, KiBitmap( pcbnew_xpm ) ); msg = AddHotkeyName( _( "Edit PCB Footprints" ), kicad_Manager_Hokeys_Descr, HK_RUN_FPEDITOR ); AddMenuItem( toolsMenu, ID_TO_PCB_FP_EDITOR, msg, KiBitmap( module_editor_xpm ) ); msg = AddHotkeyName( _( "View Gerber Files" ), kicad_Manager_Hokeys_Descr, HK_RUN_GERBVIEW ); AddMenuItem( toolsMenu, ID_TO_GERBVIEW, msg, KiBitmap( icon_gerbview_small_xpm ) ); msg = AddHotkeyName( _( "Convert Image" ), kicad_Manager_Hokeys_Descr, HK_RUN_BM2COMPONENT ); AddMenuItem( toolsMenu, ID_TO_BITMAP_CONVERTER, msg, _( "Convert bitmap images to schematic or PCB components." ), KiBitmap( bitmap2component_xpm ) ); msg = AddHotkeyName( _( "Calculator Tools" ), kicad_Manager_Hokeys_Descr, HK_RUN_PCBCALCULATOR ); AddMenuItem( toolsMenu, ID_TO_PCB_CALCULATOR, msg, _( "Run component calculations, track width calculations, etc." ), KiBitmap( calculator_xpm ) ); msg = AddHotkeyName( _( "Edit Worksheet" ), kicad_Manager_Hokeys_Descr, HK_RUN_PLEDITOR ); AddMenuItem( toolsMenu, ID_TO_PL_EDITOR, msg, _( "Edit worksheet graphics and text" ), KiBitmap( pagelayout_load_xpm ) ); // Menu Help: wxMenu* helpMenu = new wxMenu; // Contents AddMenuItem( helpMenu, wxID_HELP, _( "KiCad &Manual" ), _( "Open KiCad user manual" ), KiBitmap( online_help_xpm ) ); AddMenuItem( helpMenu, wxID_INDEX, _( "&Getting Started in KiCad" ), _( "Open \"Getting Started in KiCad\" guide for beginners" ), KiBitmap( help_xpm ) ); AddMenuItem( helpMenu, ID_PREFERENCES_HOTKEY_SHOW_CURRENT_LIST, _( "&List Hotkeys" ), _( "Displays the current hotkeys list and corresponding commands" ), KiBitmap( hotkeys_xpm ) ); // Separator helpMenu->AppendSeparator(); // Get involved with KiCad AddMenuItem( helpMenu, ID_HELP_GET_INVOLVED, _( "Get &Involved" ), _( "Contribute to KiCad (opens a web browser)" ), KiBitmap( info_xpm ) ); helpMenu->AppendSeparator(); // About AddMenuItem( helpMenu, wxID_ABOUT, _( "&About KiCad" ), KiBitmap( about_xpm ) ); // Create the menubar and append all submenus menuBar->Append( fileMenu, _( "&File" ) ); menuBar->Append( viewMenu, _( "&View" ) ); menuBar->Append( toolsMenu, _( "&Tools" ) ); menuBar->Append( browseMenu, _( "&Browse" ) ); menuBar->Append( preferencesMenu, _( "&Preferences" ) ); menuBar->Append( helpMenu, _( "&Help" ) ); SetMenuBar( menuBar ); delete oldMenuBar; // Add the hotkey to the "show hotkey list" menu, because we do not have // a management of the keyboard keys in Kicad. // So all hotheys should be added to the menubar // Note Use wxMenuBar::SetLabel only after the menubar // has been associated with a frame. (see wxWidgets doc) msg = AddHotkeyName( menuBar->GetLabel( ID_PREFERENCES_HOTKEY_SHOW_CURRENT_LIST ), kicad_Manager_Hokeys_Descr, HK_HELP ); menuBar->SetLabel( ID_PREFERENCES_HOTKEY_SHOW_CURRENT_LIST, msg ); }
void KICAD_MANAGER_FRAME::CommonSettingsChanged() { int historySize; Pgm().CommonSettings()->Read( FILE_HISTORY_SIZE_KEY, &historySize, DEFAULT_FILE_HISTORY_SIZE ); PgmTop().GetFileHistory().SetMaxFiles( (unsigned) std::max( 0, historySize ) ); }
wxString KICAD_MANAGER_FRAME::help_name() { return PgmTop().GetHelpFileName(); }
const SEARCH_STACK& KICAD_MANAGER_FRAME::sys_search() { return PgmTop().SysSearch(); }
wxConfigBase* KICAD_MANAGER_FRAME::config() { wxConfigBase* ret = PgmTop().PgmSettings(); wxASSERT( ret ); return ret; }
void KICAD_MANAGER_FRAME::CreateNewProject( const wxString& aPrjFullFileName, bool aTemplateSelector = false ) { wxFileName newProjectName = aPrjFullFileName; wxChar sep[2] = { SEP(), 0 }; // nul terminated separator wxChar string. ClearMsg(); // If we are creating a project from a template, make sure the template directory is sane if( aTemplateSelector ) { DIALOG_TEMPLATE_SELECTOR* ps = new DIALOG_TEMPLATE_SELECTOR( this ); wxFileName templatePath; wxString envStr; #ifndef __WXMAC__ wxGetEnv( wxT( "KICAD" ), &envStr ); // Add a new tab for system templates if( !envStr.empty() ) { // user may or may not have including terminating separator. if( !envStr.EndsWith( sep ) ) envStr += sep; templatePath = envStr + wxT( "template" ) + sep; } else { // The standard path should be in the share directory for kicad. As // it is normal on Windows to only have the share directory and not // the kicad sub-directory we fall back to that if the directory // doesn't exist templatePath = wxPathOnly( wxStandardPaths::Get().GetExecutablePath() ) + sep + wxT( ".." ) + sep + wxT( "share" ) + sep + wxT( "kicad" ) + sep + wxT( "template" ) + sep; if( !wxDirExists( templatePath.GetFullPath() ) ) { templatePath = wxPathOnly( wxStandardPaths::Get().GetExecutablePath() ) + sep + wxT( ".." ) + sep + wxT( "share" ) + sep + wxT( "template" ) + sep; } } #else // Use what is provided in the bundle data dir templatePath = GetOSXKicadDataDir() + sep + wxT( "template" ); #endif ps->AddTemplatesPage( _( "System Templates" ), templatePath ); // Add a new tab for user templates wxFileName userPath = wxStandardPaths::Get().GetDocumentsDir() + sep + wxT( "kicad" ) + sep + wxT( "template" ) + sep; ps->AddTemplatesPage( _( "User Templates" ), userPath ); // Check to see if a custom template location is available and setup a // new selection tab if there is. envStr.clear(); wxGetEnv( wxT( "KICAD_PTEMPLATES" ), &envStr ); if( !envStr.empty() ) { if( !envStr.EndsWith( sep ) ) envStr += sep; wxFileName envPath = envStr; ps->AddTemplatesPage( _( "Portable Templates" ), envPath ); } // Show the project template selector dialog int result = ps->ShowModal(); if( ( result != wxID_OK ) || ( ps->GetSelectedTemplate() == NULL ) ) { if( ps->GetSelectedTemplate() == NULL ) { wxMessageBox( _( "No project template was selected. Cannot generate new " "project." ), _( "Error" ), wxOK | wxICON_ERROR, this ); } } else { // The selected template widget contains the template we're attempting to use to // create a project if( !ps->GetSelectedTemplate()->CreateProject( newProjectName ) ) { wxMessageBox( _( "Problem whilst creating new project from template!" ), _( "Template Error" ), wxOK | wxICON_ERROR, this ); } } } // Init project filename SetProjectFileName( newProjectName.GetFullPath() ); // Write settings to project file // was: wxGetApp().WriteProjectConfig( aPrjFullFileName, GeneralGroupName, s_KicadManagerParams ); Prj().ConfigSave( PgmTop().SysSearch(), GeneralGroupName, s_KicadManagerParams ); // Ensure a "stub" for a schematic root sheet and a board exist. // It will avoid messages from the schematic editor or the board editor to create a new file // And forces the user to create main files under the right name for the project manager wxFileName fn( newProjectName.GetFullPath() ); fn.SetExt( SchematicFileExtension ); // If a <project>.sch file does not exist, create a "stub" file // ( minimal schematic file ) if( !fn.FileExists() ) { wxFile file( fn.GetFullPath(), wxFile::write ); if( file.IsOpened() ) file.Write( wxT( "EESchema Schematic File Version 2\n" "EELAYER 25 0\nEELAYER END\n$EndSCHEMATC\n" ) ); // wxFile dtor will close the file } // If a <project>.kicad_pcb or <project>.brd file does not exist, // create a .kicad_pcb "stub" file fn.SetExt( KiCadPcbFileExtension ); wxFileName leg_fn( fn ); leg_fn.SetExt( LegacyPcbFileExtension ); if( !fn.FileExists() && !leg_fn.FileExists() ) { wxFile file( fn.GetFullPath(), wxFile::write ); if( file.IsOpened() ) file.Write( wxT( "(kicad_pcb (version 4) (host kicad \"dummy file\") )\n" ) ); // wxFile dtor will close the file } // Enable the toolbar and menubar buttons and clear the help text. m_active_project = true; m_MessagesBox->Clear(); }
void KICAD_MANAGER_FRAME::OnLoadProject( wxCommandEvent& event ) { // Any open KIFACE's must be closed if they are not part of the new project. // (We never want a KIWAY_PLAYER open on a KIWAY that isn't in the same project.) // User is prompted here to close those KIWAY_PLAYERs: if( !Kiway.PlayersClose( false ) ) return; // evt_id can be one of: // ID_NEW_PROJECT, ID_NEW_PROJECT_FROM_TEMPLATE, ID_LOAD_PROJECT, and // wxID_ANY from 3 different places. int evt_id = event.GetId(); wxString title; ClearMsg(); bool newProject = ( evt_id == ID_NEW_PROJECT ) || ( evt_id == ID_NEW_PROJECT_FROM_TEMPLATE ); if( evt_id != wxID_ANY ) { int style; if( newProject ) { title = _( "Create New Project" ); style = wxFD_SAVE | wxFD_OVERWRITE_PROMPT; } else { title = _( "Open Existing Project" ); style = wxFD_OPEN | wxFD_FILE_MUST_EXIST; } wxString default_dir = GetMruPath(); wxFileDialog dlg( this, title, default_dir, wxEmptyString, ProjectFileWildcard, style ); if( dlg.ShowModal() == wxID_CANCEL ) return; //DBG( printf( "%s: wxFileDialog::GetPath=%s\n", __func__, TO_UTF8( dlg.GetPath() ) );) wxFileName pro( dlg.GetPath() ); pro.SetExt( ProjectFileExtension ); // enforce extension if( !pro.IsAbsolute() ) pro.MakeAbsolute(); if( newProject ) { // Check if the project directory is empty wxDir directory( pro.GetPath() ); if( directory.HasFiles() ) { wxString msg = _( "The selected directory is not empty. We recommend you " "create projects in their own clean directory.\n\nDo you " "want to create a new empty directory for the project?" ); if( IsOK( this, msg ) ) { // Append a new directory with the same name of the project file // and try to create it pro.AppendDir( pro.GetName() ); if( !wxMkdir( pro.GetPath() ) ) // There was a problem, undo pro.RemoveLastDir(); } } if( evt_id == ID_NEW_PROJECT ) { CreateNewProject( pro.GetFullPath() ); } else if( evt_id == ID_NEW_PROJECT_FROM_TEMPLATE ) { // Launch the template selector dialog CreateNewProject( pro.GetFullPath(), true ); } } SetProjectFileName( pro.GetFullPath() ); } wxString prj_filename = GetProjectFileName(); wxString nameless_prj = NAMELESS_PROJECT wxT( ".pro" ); wxLogDebug( wxT( "%s: %s" ), GetChars( wxFileName( prj_filename ).GetFullName() ), GetChars( nameless_prj ) ); // Check if project file exists and if it is not noname.pro if( !wxFileExists( prj_filename ) && !wxFileName( prj_filename ).GetFullName().IsSameAs( nameless_prj ) ) { wxString msg = wxString::Format( _( "KiCad project file '%s' not found" ), GetChars( prj_filename ) ); DisplayError( this, msg ); return; } // Either this is the first time kicad has been run or one of the projects in the // history list is no longer valid. This prevents kicad from automatically creating // a noname.pro file in the same folder as the kicad binary. if( wxFileName( prj_filename ).GetFullName().IsSameAs( nameless_prj ) && !newProject ) { m_active_project = false; m_MessagesBox->SetValue( _( "To proceed, you can use the File menu to start a new project." ) ); return; } else { m_active_project = true; m_MessagesBox->Clear(); } Prj().ConfigLoad( PgmTop().SysSearch(), GeneralGroupName, s_KicadManagerParams ); title = L"KiCad \u2014 " + prj_filename; if( !wxFileName( prj_filename ).IsDirWritable() ) title += _( " [Read Only]" ); else SetMruPath( Prj().GetProjectPath() ); // Only set MRU path if we have write access. SetTitle( title ); if( !prj_filename.IsSameAs( nameless_prj ) ) UpdateFileHistory( prj_filename, &PgmTop().GetFileHistory() ); m_LeftWin->ReCreateTreePrj(); // Rebuild the list of watched paths. // 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 ); PrintPrjInfo(); }