KiCad PCB EDA Suite
kicad_manager_frame.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
5  * Copyright (C) 2013 CERN (www.cern.ch)
6  * Copyright (C) 2004-2020 KiCad Developers, see change_log.txt for contributors.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, you may find one here:
20  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21  * or you may search the http://www.gnu.org website for the version 2 license,
22  * or you may write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24  */
25 
26 #include "kicad_id.h"
27 #include "pgm_kicad.h"
28 #include "tree_project_frame.h"
29 #include <bitmaps.h>
30 #include <build_version.h>
31 #include <executable_names.h>
32 #include <filehistory.h>
33 #include <gestfich.h>
34 #include <kiway.h>
35 #include <kiway_express.h>
36 #include <kiway_player.h>
37 #include <launch_ext.h>
38 #include <panel_hotkeys_editor.h>
41 #include <tool/action_toolbar.h>
42 #include <tool/common_control.h>
43 #include <tool/tool_manager.h>
47 
48 #ifdef __WXMAC__
49 #include <MacTypes.h>
50 #include <ApplicationServices/ApplicationServices.h>
51 #endif
52 
53 #include "kicad_manager_frame.h"
54 #include "kicad_settings.h"
55 
56 
57 #define SEP() wxFileName::GetPathSeparator()
58 
59 
60 // Menubar and toolbar event table
61 BEGIN_EVENT_TABLE( KICAD_MANAGER_FRAME, EDA_BASE_FRAME )
62  // Window events
63  EVT_SIZE( KICAD_MANAGER_FRAME::OnSize )
65 
66  // Menu events
67  EVT_MENU( wxID_EXIT, KICAD_MANAGER_FRAME::OnExit )
73 
74  // Range menu events
76  KICAD_MANAGER_FRAME::language_change )
77 
79  EVT_MENU( ID_FILE_LIST_CLEAR, KICAD_MANAGER_FRAME::OnClearFileHistory )
80 
81  // Special functions
82  EVT_MENU( ID_INIT_WATCHED_PATHS, KICAD_MANAGER_FRAME::OnChangeWatchedPaths )
83 END_EVENT_TABLE()
84 
85 
86 KICAD_MANAGER_FRAME::KICAD_MANAGER_FRAME( wxWindow* parent, const wxString& title,
87  const wxPoint& pos, const wxSize& size ) :
88  EDA_BASE_FRAME( parent, KICAD_MAIN_FRAME_T, title, pos, size,
90  m_leftWin( nullptr ),
91  m_launcher( nullptr ),
92  m_messagesBox( nullptr ),
93  m_mainToolBar( nullptr )
94 {
95  m_active_project = false;
96  m_leftWinWidth = 250; // Default value
97  m_AboutTitle = "KiCad";
98 
99  // Create the status line (bottom of the frame)
100  static const int dims[3] = { -1, -1, 100 };
101 
102  CreateStatusBar( 3 );
103  SetStatusWidths( 3, dims );
104 
105  // Give an icon
106  wxIcon icon;
107  icon.CopyFromBitmap( KiBitmap( icon_kicad_xpm ) );
108  SetIcon( icon );
109 
110  // Load the settings
111  LoadSettings( config() );
112 
113  // Left window: is the box which display tree project
114  m_leftWin = new TREE_PROJECT_FRAME( this );
115 
116  // Add the wxTextCtrl showing all messages from KiCad:
117  m_messagesBox = new wxTextCtrl( this, wxID_ANY, wxEmptyString,
118  wxDefaultPosition, wxDefaultSize,
119  wxTE_MULTILINE | wxTE_READONLY | wxBORDER_NONE );
120 
121  // Create the manager
122  m_toolManager = new TOOL_MANAGER;
123  m_toolManager->SetEnvironment( nullptr, nullptr, nullptr, config(), this );
124  m_actions = new KICAD_MANAGER_ACTIONS();
125 
126  // Register tools
127  m_toolManager->RegisterTool( new COMMON_CONTROL );
128  m_toolManager->RegisterTool( new KICAD_MANAGER_CONTROL );
129  m_toolManager->InitTools();
130 
131  RecreateBaseHToolbar();
132  RecreateLauncher();
133  ReCreateMenuBar();
134 
135  m_auimgr.SetManagedWindow( this );
136 
137  m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ).Top().Layer(6) );
138 
139  // BestSize() does not always set the actual pane size of m_leftWin to the required value.
140  // It happens when m_leftWin is too large (roughly > 1/3 of the kicad manager frame width.
141  // (Well, BestSize() sets the best size... not the window size)
142  // A trick is to use MinSize() to set the required pane width,
143  // and after give a reasonable MinSize value
144  m_auimgr.AddPane( m_leftWin, EDA_PANE().Palette().Name( "ProjectTree" ).Left().Layer(3)
145  .CaptionVisible( false ).PaneBorder( false )
146  .MinSize( m_leftWinWidth, -1 ).BestSize( m_leftWinWidth, -1 ) );
147 
148  m_auimgr.AddPane( m_launcher, EDA_PANE().HToolbar().Name( "Launcher" ).Top().Layer(1) );
149 
150  m_auimgr.AddPane( m_messagesBox, EDA_PANE().Messages().Name( "MsgPanel" ).Center() );
151 
152  m_auimgr.Update();
153 
154  // Now the actual m_leftWin size is set, give it a reasonable min width
155  m_auimgr.GetPane( m_leftWin ).MinSize( 200, -1 );
156 
157  SetTitle( wxString( "KiCad " ) + GetBuildVersion() );
158 
159  // Ensure the window is on top
160  Raise();
161 }
162 
163 
165 {
166  // Shutdown all running tools
167  if( m_toolManager )
169 
170  delete m_actions;
171  delete m_toolManager;
172 
173  m_auimgr.UnInit();
174 }
175 
176 
178 {
179  return m_leftWin;
180 }
181 
182 
184 {
186  wxASSERT( ret );
187  return ret;
188 }
189 
190 
191 void KICAD_MANAGER_FRAME::SetProjectFileName( const wxString& aFullProjectProFileName )
192 {
193  // ensure file name is absolute:
194  wxFileName fn( aFullProjectProFileName );
195 
196  if( !fn.IsAbsolute() )
197  fn.MakeAbsolute();
198 
199  SetTitle( wxString( "KiCad " ) + GetBuildVersion() );
200  wxString title = GetTitle() + " " + fn.GetFullPath();
201 
202  if( !fn.IsDirWritable() )
203  title += _( " [Read Only]" );
204 
205  SetTitle( title );
206 }
207 
208 
210 {
211  return Prj().GetProjectFullName();
212 }
213 
214 
216 {
217  wxFileName fn( GetProjectFileName() );
218 
219  fn.SetExt( KiCadSchematicFileExtension );
220  return fn.GetFullPath();
221 }
222 
223 
225 {
226  wxFileName fn( GetProjectFileName() );
227 
228  fn.SetExt( LegacySchematicFileExtension );
229  return fn.GetFullPath();
230 }
231 
232 
234 {
235  wxFileName fn( GetProjectFileName() );
236 
237  fn.SetExt( PcbFileExtension );
238  return fn.GetFullPath();
239 }
240 
241 
243 {
244  wxFileName fn( GetProjectFileName() );
245 
246  fn.SetExt( LegacyPcbFileExtension );
247  return fn.GetFullPath();
248 }
249 
250 
252 {
254 }
255 
256 
258 {
259  return PgmTop().SysSearch();
260 }
261 
262 
264 {
265  return PgmTop().GetHelpFileName();
266 }
267 
268 
269 void KICAD_MANAGER_FRAME::PrintMsg( const wxString& aText )
270 {
271  m_messagesBox->AppendText( aText );
272 }
273 
274 
275 void KICAD_MANAGER_FRAME::OnSize( wxSizeEvent& event )
276 {
277  if( m_auimgr.GetManagedWindow() )
278  m_auimgr.Update();
279 
280  event.Skip();
281 }
282 
283 
284 void KICAD_MANAGER_FRAME::OnCloseWindow( wxCloseEvent& Event )
285 {
286 #ifdef _WINDOWS_
287  // For some obscure reason, on Windows, when killing Kicad from the Windows task manager
288  // if a editor frame (schematic, library, board editor or fp editor) is open and has
289  // some edition to save, OnCloseWindow is run twice *at the same time*, creating race
290  // conditions between OnCloseWindow() code.
291  // Therefore I added (JPC) a ugly hack to discard the second call (unwanted) during
292  // execution of the first call (only one call is right).
293  // Note also if there is no change made in editors, this behavior does not happen.
294  static std::atomic<unsigned int> lock_close_event( 0 );
295 
296  if( ++lock_close_event > 1 ) // Skip extra calls
297  {
298  return;
299  }
300 #endif
301 
302  if( Kiway().PlayersClose( false ) )
303  {
304  Event.SetCanVeto( true );
305 
306  m_leftWin->Show( false );
307 
308  Destroy();
309  }
310 
311 #ifdef _WINDOWS_
312  lock_close_event = 0; // Reenable event management
313 #endif
314 }
315 
316 
317 void KICAD_MANAGER_FRAME::OnExit( wxCommandEvent& event )
318 {
319  Close( true );
320 }
321 
322 
323 void KICAD_MANAGER_FRAME::LoadProject( const wxFileName& aProjectFileName )
324 {
325  // The project file should be valid by the time we get here or something has gone wrong.
326  if( !aProjectFileName.Exists() )
327  return;
328 
329  // Any open KIFACE's must be closed if they are not part of the new project.
330  // (We never want a KIWAY_PLAYER open on a KIWAY that isn't in the same project.)
331  // User is prompted here to close those KIWAY_PLAYERs:
332  if( !Kiway().PlayersClose( false ) )
333  return;
334 
335  // Save the project file for the currently loaded project.
336  if( m_active_project )
337  {
338  Pgm().GetSettingsManager().SaveProject();
339  Pgm().GetSettingsManager().UnloadProject( &Prj() );
340  }
341 
342  m_active_project = true;
343  ClearMsg();
344 
345  Pgm().GetSettingsManager().LoadProject( aProjectFileName.GetFullPath() );
346  SetProjectFileName( Prj().GetProjectFullName() );
347 
348  if( aProjectFileName.IsDirWritable() )
349  SetMruPath( Prj().GetProjectPath() ); // Only set MRU path if we have write access. Why?
350 
351  UpdateFileHistory( Prj().GetProjectFullName() );
352 
354 
355  SyncToolbars();
356 
357  // Rebuild the list of watched paths.
358  // however this is possible only when the main loop event handler is running,
359  // so we use it to run the rebuild function.
360  wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED, ID_INIT_WATCHED_PATHS );
361 
362  wxPostEvent( this, cmd );
363 
364  PrintPrjInfo();
365 }
366 
367 
368 void KICAD_MANAGER_FRAME::CreateNewProject( const wxFileName& aProjectFileName )
369 {
370  wxCHECK_RET( aProjectFileName.DirExists() && aProjectFileName.IsDirWritable(),
371  "Project folder must exist and be writable to create a new project." );
372 
373  // Init project filename. This clears all elements from the project object.
374  SetProjectFileName( aProjectFileName.GetFullPath() );
375 
376  // If the project is legacy, convert it
377  if( !aProjectFileName.FileExists() )
378  {
379  wxFileName legacyPro( aProjectFileName );
380  legacyPro.SetExt( LegacyProjectFileExtension );
381 
382  if( legacyPro.FileExists() )
383  {
384  GetSettingsManager()->LoadProject( legacyPro.GetFullPath() );
386 
387  wxRemoveFile( legacyPro.GetFullPath() );
388  }
389  else
390  {
391  // Copy template project file from template folder.
392  wxString srcFileName = sys_search().FindValidPath( "kicad.kicad_pro" );
393 
394  wxFileName destFileName( aProjectFileName );
395  destFileName.SetExt( ProjectFileExtension );
396 
397  // Create a minimal project file if the template project file could not be copied
398  if( !wxFileName::FileExists( srcFileName )
399  || !wxCopyFile( srcFileName, destFileName.GetFullPath() ) )
400  {
401  Pgm().GetSettingsManager().SaveProject();
402  }
403  }
404  }
405 
406  // Ensure a "stub" for a schematic root sheet and a board exist.
407  // It will avoid messages from the schematic editor or the board editor to create a new file
408  // And forces the user to create main files under the right name for the project manager
409  wxFileName fn( aProjectFileName.GetFullPath() );
410  fn.SetExt( KiCadSchematicFileExtension );
411 
412  // If a <project>.kicad_sch file does not exist, create a "stub" file ( minimal schematic file )
413  if( !fn.FileExists() )
414  {
415  wxFile file( fn.GetFullPath(), wxFile::write );
416 
417  if( file.IsOpened() )
418  file.Write( wxT( "(kicad_sch (version 20200310) (host eeschema \"unknown\")\n"
419  "( page \"A4\")\n (lib_symbols)\n"
420  " (symbol_instances)\n)\n" ) );
421 
422 
423  // wxFile dtor will close the file
424  }
425 
426  // If a <project>.kicad_pcb or <project>.brd file does not exist,
427  // create a .kicad_pcb "stub" file
428  fn.SetExt( KiCadPcbFileExtension );
429  wxFileName leg_fn( fn );
430  leg_fn.SetExt( LegacyPcbFileExtension );
431 
432  if( !fn.FileExists() && !leg_fn.FileExists() )
433  {
434  wxFile file( fn.GetFullPath(), wxFile::write );
435 
436  if( file.IsOpened() )
437  file.Write( wxT( "(kicad_pcb (version 4) (host kicad \"dummy file\") )\n" ) );
438 
439  // wxFile dtor will close the file
440  }
441 
442  UpdateFileHistory( aProjectFileName.GetFullPath() );
443 }
444 
445 
446 void KICAD_MANAGER_FRAME::OnOpenFileInTextEditor( wxCommandEvent& event )
447 {
448  // show all files in file dialog (in Kicad all files are editable texts):
449  wxString wildcard = AllFilesWildcard();
450 
451  wxString default_dir = Prj().GetProjectPath();
452 
453  wxFileDialog dlg( this, _( "Load File to Edit" ), default_dir,
454  wxEmptyString, wildcard, wxFD_OPEN );
455 
456  if( dlg.ShowModal() == wxID_CANCEL )
457  return;
458 
459  wxString filename = wxT( "\"" );
460  filename += dlg.GetPath() + wxT( "\"" );
461 
462  if( !dlg.GetPath().IsEmpty() && !Pgm().GetEditorName().IsEmpty() )
464 }
465 
466 
467 void KICAD_MANAGER_FRAME::OnBrowseInFileExplorer( wxCommandEvent& event )
468 {
469  // open project directory in host OS's file explorer
470  LaunchExternal( Prj().GetProjectPath() );
471 }
472 
473 
475 {
477 }
478 
479 
480 void KICAD_MANAGER_FRAME::language_change( wxCommandEvent& event )
481 {
482  int id = event.GetId();
483  Kiway().SetLanguage( id );
484 }
485 
486 
488 {
489  // call my base class
491 
492  // tooltips in toolbars
495 
496  PrintPrjInfo();
497 }
498 
499 
500 void KICAD_MANAGER_FRAME::CommonSettingsChanged( bool aEnvVarsChanged )
501 {
502  int historySize = Pgm().GetCommonSettings()->m_System.file_history_size;
503  GetFileHistory().SetMaxFiles( (unsigned) std::max( 0, historySize ) );
504 }
505 
506 
508 {
509  m_messagesBox->Clear();
510 }
511 
512 
514 {
516 
517  auto settings = dynamic_cast<KICAD_SETTINGS*>( aCfg );
518 
519  wxCHECK( settings, /*void*/);
520 
521  m_leftWinWidth = settings->m_LeftWinWidth;
522 }
523 
524 
526 {
528 
529  auto settings = dynamic_cast<KICAD_SETTINGS*>( aCfg );
530 
531  wxCHECK( settings, /*void*/);
532 
533  settings->m_LeftWinWidth = m_leftWin->GetSize().x;
534 }
535 
536 
538  PANEL_HOTKEYS_EDITOR* aHotkeysPanel )
539 {
540  aHotkeysPanel->AddHotKeys( GetToolManager() );
541 }
542 
543 
544 
545 
546 
548 {
549  wxString msg = wxString::Format( _( "Project name:\n%s\n" ),
551  PrintMsg( msg );
552 }
553 
554 
void ShutdownAllTools()
Shutdown all tools with a currently registered event loop in this tool manager by waking them up with...
void OnBrowseInFileExplorer(wxCommandEvent &event)
IDs used in KiCad main frame foe menuitems and tools.
VTBL_ENTRY bool PlayersClose(bool doForce)
Function PlayersClose calls the KIWAY_PLAYER::Close( bool force ) function on all the windows and if ...
Definition: kiway.cpp:415
KiCad executable names.
wxString FindValidPath(const wxString &aFileName) const
Definition: search_stack.h:73
KIWAY & Kiway() const
Function Kiway returns a reference to the KIWAY that this object has an opportunity to participate in...
Definition: kiway_holder.h:56
void language_change(wxCommandEvent &event)
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:104
const wxString GetProjectFileName() const
void InstallPreferences(PAGED_DIALOG *aParent, PANEL_HOTKEYS_EDITOR *aHotkeysPanel) override
Function InstallPreferences Allow a frame to load its preference panels (if any) into the preferences...
void SetMruPath(const wxString &aPath)
SEARCH_STACK & SysSearch()
Definition: pgm_kicad.h:58
This file is part of the common library TODO brief description.
SETTINGS_MANAGER * GetSettingsManager() const
virtual void SaveSettings(APP_SETTINGS_BASE *aCfg)
Saves common frame parameters to a configuration data file.
const std::string ProjectFileExtension
Definition: id.h:88
const std::string LegacyPcbFileExtension
const BITMAP_OPAQUE icon_kicad_xpm[1]
Definition: icon_kicad.cpp:153
wxWindow * GetToolCanvas() const override
Canvas access.
void OnImportEagleFiles(wxCommandEvent &event)
Open dialog to import Eagle schematic and board files.
void OnOpenFileInTextEditor(wxCommandEvent &event)
const wxString SchLegacyFileName()
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:140
void CommonSettingsChanged(bool aEnvVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
void AddHotKeys(TOOL_MANAGER *aToolMgr)
KICAD_MANAGER_CONTROL.
SEARCH_STACK looks for files in a number of places.
Definition: search_stack.h:41
wxAuiManager m_auimgr
const std::string KiCadPcbFileExtension
VTBL_ENTRY void SetLanguage(int aLanguage)
Function SetLanguage changes the language and then calls ShowChangedLanguage() on all KIWAY_PLAYERs.
Definition: kiway.cpp:436
VTBL_ENTRY const wxString GetProjectPath() const
Function GetProjectPath returns the full path of the project.
Definition: project.cpp:122
wxString AllFilesWildcard()
void UpdateFileHistory(const wxString &FullFileName, FILE_HISTORY *aFileHistory=nullptr)
Update the list of recently opened files.
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Saves common frame parameters to a configuration data file.
TOOL_MANAGER.
Definition: tool_manager.h:51
wxBitmap KiBitmap(BITMAP_DEF aBitmap)
Construct a wxBitmap from a memory record, held in a BITMAP_DEF.
Definition: bitmap.cpp:80
const wxString SchFileName()
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:91
void PrintMsg(const wxString &aText)
Displays aText in the text panel.
wxString GetBuildVersion()
Get the full KiCad version string.
TREE_PROJECT_FRAME Window to display the tree files.
PROJECT & Prj() const
Function Prj returns a reference to the PROJECT "associated with" this KIWAY.
wxString help_name() override
ACTIONS * m_actions
Definition: tools_holder.h:49
Definition of file extensions used in Kicad.
void ReCreateTreePrj()
Create or modify the tree showing project file names.
#define KICAD_DEFAULT_DRAWFRAME_STYLE
#define PcbFileExtension
void RecreateBaseHToolbar()
(Re)Create the horizontal toolbar
VTBL_ENTRY const wxString GetProjectFullName() const
Function GetProjectFullName returns the full path and name of the project.
Definition: project.cpp:116
const std::string LegacyProjectFileExtension
COMMON_CONTROL.
Specialization of the wxAuiPaneInfo class for KiCad panels.
const std::string LegacySchematicFileExtension
void OnArchiveFiles(wxCommandEvent &event)
void SyncToolbars() override
Update the toolbars (mostly settings/check buttons/checkboxes) with the current controller state.
EVT_MENU_RANGE(ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, KICAD_MANAGER_FRAME::language_change) KICAD_MANAGER_FRAME
PGM_KICAD & PgmTop()
Definition: kicad.cpp:72
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
void SetProjectFileName(const wxString &aFullProjectProFileName)
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Loads a project or sets up a new project with a specified path.
void OnCloseWindow(wxCloseEvent &Event)
void SetMaxFiles(size_t aMaxFiles)
Update the number of files that will be contained inside the file history.
Definition: filehistory.cpp:83
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:48
static const wxChar * GetChars(const wxString &s)
Function GetChars returns a wxChar* to the actual wxChar* data within a wxString, and is helpful for ...
Definition: macros.h:153
FILE_HISTORY & GetFileHistory()
Get the frame's main file history.
const wxString PcbLegacyFileName()
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
void SetEnvironment(EDA_ITEM *aModel, KIGFX::VIEW *aView, KIGFX::VIEW_CONTROLS *aViewControls, APP_SETTINGS_BASE *aSettings, TOOLS_HOLDER *aFrame)
Sets the work environment (model, view, view controls and the parent window).
#define KICAD_MANAGER_FRAME_NAME
#define _(s)
Definition: 3d_actions.cpp:33
void OnSize(wxSizeEvent &event)
The base frame for deriving all KiCad main window classes.
const wxString PcbFileName()
bool SaveProject(const wxString &aFullPath=wxEmptyString)
Saves a loaded project.
APP_SETTINGS_BASE * PgmSettings()
Definition: pgm_kicad.h:56
const std::string KiCadSchematicFileExtension
wxString GetHelpFileName()
Definition: pgm_kicad.h:60
Definition: id.h:87
KICAD_MANAGER_ACTIONS.
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:74
void LoadProject(const wxFileName &aProjectFileName)
void OnUnarchiveFiles(wxCommandEvent &event)
void CreateNewProject(const wxFileName &aProjectFileName)
Creates a new project by setting up and initial project, schematic, and board files.
APP_SETTINGS_BASE * config() const override
Returns the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
void OnExit(wxCommandEvent &event)
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
void LaunchExternal(const wxString &aPath)
Launches the given file or folder in the host OS.
Definition: launch_ext.cpp:26
const SEARCH_STACK & sys_search() override
Return a SEARCH_STACK pertaining to entire program.
void ClearMsg()
Erase the text panel.
virtual void ShowChangedLanguage()
Redraw the menus and what not in current language.
void PrintPrjInfo()
Prints the current working directory name and the project name on the text panel.
TREE_PROJECT_FRAME * m_leftWin
The main KiCad project manager frame.
static TOOL_ACTION openTextEditor
virtual void LoadSettings(APP_SETTINGS_BASE *aCfg)
Load common frame parameters from a configuration file.
KIWAY Kiway