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-2019 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 <panel_hotkeys_editor.h>
38 #include <tool/action_toolbar.h>
39 #include <tool/common_control.h>
40 #include <tool/tool_manager.h>
44 
45 #ifdef __WXMAC__
46 #include <MacTypes.h>
47 #include <ApplicationServices/ApplicationServices.h>
48 #endif
49 
50 #include "kicad_manager_frame.h"
51 
52 
53 #define TREE_FRAME_WIDTH_ENTRY wxT( "LeftWinWidth" )
54 
55 #define SEP() wxFileName::GetPathSeparator()
56 
57 // Not really useful, provided to save/restore params in project config file,
58 // (Add them in s_KicadManagerParams if any)
59 // Used also to create new .pro files from the kicad.pro template file
60 // for new projects
61 #define GeneralGroupName wxT( "/general" )
62 
64 
65 
66 // Menubar and toolbar event table
67 BEGIN_EVENT_TABLE( KICAD_MANAGER_FRAME, EDA_BASE_FRAME )
68  // Window events
69  EVT_SIZE( KICAD_MANAGER_FRAME::OnSize )
71 
72  // Menu events
73  EVT_MENU( wxID_EXIT, KICAD_MANAGER_FRAME::OnExit )
79 
80  // Range menu events
82  KICAD_MANAGER_FRAME::language_change )
83 
85 
86  // Special functions
87  EVT_MENU( ID_INIT_WATCHED_PATHS, KICAD_MANAGER_FRAME::OnChangeWatchedPaths )
88 END_EVENT_TABLE()
89 
90 
91 KICAD_MANAGER_FRAME::KICAD_MANAGER_FRAME( wxWindow* parent, const wxString& title,
92  const wxPoint& pos, const wxSize& size ) :
93  EDA_BASE_FRAME( parent, KICAD_MAIN_FRAME_T, title, pos, size,
95  m_leftWin( nullptr ),
96  m_launcher( nullptr ),
97  m_messagesBox( nullptr ),
98  m_mainToolBar( nullptr )
99 {
100  m_active_project = false;
101  m_leftWinWidth = 250; // Default value
102  m_AboutTitle = "KiCad";
103 
104  // Create the status line (bottom of the frame)
105  static const int dims[3] = { -1, -1, 100 };
106 
107  CreateStatusBar( 3 );
108  SetStatusWidths( 3, dims );
109 
110  // Give an icon
111  wxIcon icon;
112  icon.CopyFromBitmap( KiBitmap( icon_kicad_xpm ) );
113  SetIcon( icon );
114 
115  // Give the last size and pos to main window
116  LoadSettings( config() );
117  SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y );
118 
119  // Left window: is the box which display tree project
120  m_leftWin = new TREE_PROJECT_FRAME( this );
121 
122  // Add the wxTextCtrl showing all messages from KiCad:
123  m_messagesBox = new wxTextCtrl( this, wxID_ANY, wxEmptyString,
124  wxDefaultPosition, wxDefaultSize,
125  wxTE_MULTILINE | wxTE_READONLY | wxBORDER_NONE );
126 
127  // Create the manager
128  m_toolManager = new TOOL_MANAGER;
129  m_toolManager->SetEnvironment( nullptr, nullptr, nullptr, this );
130  m_actions = new KICAD_MANAGER_ACTIONS();
131 
132  // Register tools
133  m_toolManager->RegisterTool( new COMMON_CONTROL );
134  m_toolManager->RegisterTool( new KICAD_MANAGER_CONTROL );
135  m_toolManager->InitTools();
136 
137  RecreateBaseHToolbar();
138  RecreateLauncher();
139  ReCreateMenuBar();
140 
141  m_auimgr.SetManagedWindow( this );
142 
143  m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ).Top().Layer(6) );
144 
145  // BestSize() does not always set the actual pane size of m_leftWin to the required value.
146  // It happens when m_leftWin is too large (roughly > 1/3 of the kicad manager frame width.
147  // (Well, BestSize() sets the best size... not the window size)
148  // A trick is to use MinSize() to set the required pane width,
149  // and after give a reasonable MinSize value
150  m_auimgr.AddPane( m_leftWin, EDA_PANE().Palette().Name( "ProjectTree" ).Left().Layer(3)
151  .CaptionVisible( false ).PaneBorder( false )
152  .MinSize( m_leftWinWidth, -1 ).BestSize( m_leftWinWidth, -1 ) );
153 
154  m_auimgr.AddPane( m_launcher, EDA_PANE().HToolbar().Name( "Launcher" ).Top().Layer(1) );
155 
156  m_auimgr.AddPane( m_messagesBox, EDA_PANE().Messages().Name( "MsgPanel" ).Center() );
157 
158  m_auimgr.Update();
159 
160  // Now the actual m_leftWin size is set, give it a reasonable min width
161  m_auimgr.GetPane( m_leftWin ).MinSize( 200, -1 );
162 
163  SetTitle( wxString( "KiCad " ) + GetBuildVersion() );
164 }
165 
166 
168 {
169  // Ensure there are no active tools
170  if( m_toolManager )
172 
173  delete m_actions;
174  delete m_toolManager;
175 
176  m_auimgr.UnInit();
177 
178  // Since the file menu contains file history menus, we must ensure that the menu
179  // destructor is called before the file history objects are deleted since their destructor
180  // unregisters the menu from the history.
181  wxMenu* fileMenu = GetMenuBar()->Remove( 0 );
182  delete fileMenu;
183 }
184 
185 
187 {
188  wxConfigBase* ret = PgmTop().PgmSettings();
189  wxASSERT( ret );
190  return ret;
191 }
192 
193 
194 void KICAD_MANAGER_FRAME::SetProjectFileName( const wxString& aFullProjectProFileName )
195 {
196  // ensure file name is absolute:
197  wxFileName fn( aFullProjectProFileName );
198 
199  if( !fn.IsAbsolute() )
200  fn.MakeAbsolute();
201 
202  Prj().SetProjectFullName( fn.GetFullPath() );
203 
204  SetTitle( wxString( "KiCad " ) + GetBuildVersion() );
205  wxString title = GetTitle() + " " + fn.GetFullPath();
206 
207  if( !fn.IsDirWritable() )
208  title += _( " [Read Only]" );
209 
210  SetTitle( title );
211 }
212 
213 
215 {
216  return Prj().GetProjectFullName();
217 }
218 
219 
221 {
222  wxFileName fn( GetProjectFileName() );
223 
224  fn.SetExt( SchematicFileExtension );
225  return fn.GetFullPath();
226 }
227 
228 
230 {
231  wxFileName fn( GetProjectFileName() );
232 
233  fn.SetExt( PcbFileExtension );
234  return fn.GetFullPath();
235 }
236 
237 
239 {
240  wxFileName fn( GetProjectFileName() );
241 
242  fn.SetExt( LegacyPcbFileExtension );
243  return fn.GetFullPath();
244 }
245 
246 
248 {
250 }
251 
252 
254 {
255  return PgmTop().SysSearch();
256 }
257 
258 
260 {
261  return PgmTop().GetHelpFileName();
262 }
263 
264 
265 void KICAD_MANAGER_FRAME::PrintMsg( const wxString& aText )
266 {
267  m_messagesBox->AppendText( aText );
268 }
269 
270 
271 void KICAD_MANAGER_FRAME::OnSize( wxSizeEvent& event )
272 {
273  if( m_auimgr.GetManagedWindow() )
274  m_auimgr.Update();
275 
276  event.Skip();
277 }
278 
279 
280 void KICAD_MANAGER_FRAME::OnCloseWindow( wxCloseEvent& Event )
281 {
282  if( Kiway().PlayersClose( false ) )
283  {
284  int px, py;
285 
286  if( !GetProjectFileName().empty() )
287  UpdateFileHistory( GetProjectFileName(), &PgmTop().GetFileHistory() );
288 
289  if( !IsIconized() ) // save main frame position and size
290  {
291  GetPosition( &px, &py );
292  m_FramePos.x = px;
293  m_FramePos.y = py;
294 
295  GetSize( &px, &py );
296  m_FrameSize.x = px;
297  m_FrameSize.y = py;
298  }
299 
300  Event.SetCanVeto( true );
301 
302  m_leftWin->Show( false );
303 
304  Destroy();
305  }
306 }
307 
308 
309 void KICAD_MANAGER_FRAME::OnExit( wxCommandEvent& event )
310 {
311  Close( true );
312 }
313 
314 
315 void KICAD_MANAGER_FRAME::LoadProject( const wxFileName& aProjectFileName )
316 {
317  // The project file should be valid by the time we get here or something has gone wrong.
318  if( !aProjectFileName.Exists() )
319  return;
320 
321  // Any open KIFACE's must be closed if they are not part of the new project.
322  // (We never want a KIWAY_PLAYER open on a KIWAY that isn't in the same project.)
323  // User is prompted here to close those KIWAY_PLAYERs:
324  if( !Kiway().PlayersClose( false ) )
325  return;
326 
327  // Save the project file for the currently loaded project.
328  if( m_active_project )
330 
331  m_active_project = true;
332  ClearMsg();
333  SetProjectFileName( aProjectFileName.GetFullPath() );
335 
336  if( aProjectFileName.IsDirWritable() )
337  SetMruPath( Prj().GetProjectPath() ); // Only set MRU path if we have write access. Why?
338 
339  UpdateFileHistory( aProjectFileName.GetFullPath(), &PgmTop().GetFileHistory() );
340 
342 
343  SyncToolbars();
344 
345  // Rebuild the list of watched paths.
346  // however this is possible only when the main loop event handler is running,
347  // so we use it to run the rebuild function.
348  wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED, ID_INIT_WATCHED_PATHS );
349 
350  wxPostEvent( this, cmd );
351 
352  PrintPrjInfo();
353 }
354 
355 
356 void KICAD_MANAGER_FRAME::CreateNewProject( const wxFileName& aProjectFileName )
357 {
358  wxCHECK_RET( aProjectFileName.DirExists() && aProjectFileName.IsDirWritable(),
359  "Project folder must exist and be writable to create a new project." );
360 
361  // Init project filename. This clears all elements from the project object.
362  SetProjectFileName( aProjectFileName.GetFullPath() );
363 
364  // Copy kicad.pro file from template folder.
365  if( !aProjectFileName.FileExists() )
366  {
367  wxString srcFileName = sys_search().FindValidPath( "kicad.pro" );
368 
369  // Create a minimal project (.pro) file if the template project file could not be copied.
370  if( !wxFileName::FileExists( srcFileName )
371  || !wxCopyFile( srcFileName, aProjectFileName.GetFullPath() ) )
372  {
374  }
375  }
376 
377  // Ensure a "stub" for a schematic root sheet and a board exist.
378  // It will avoid messages from the schematic editor or the board editor to create a new file
379  // And forces the user to create main files under the right name for the project manager
380  wxFileName fn( aProjectFileName.GetFullPath() );
381  fn.SetExt( SchematicFileExtension );
382 
383  // If a <project>.sch file does not exist, create a "stub" file ( minimal schematic file )
384  if( !fn.FileExists() )
385  {
386  wxFile file( fn.GetFullPath(), wxFile::write );
387 
388  if( file.IsOpened() )
389  file.Write( wxT( "EESchema Schematic File Version 2\n"
390  "EELAYER 25 0\nEELAYER END\n$EndSCHEMATC\n" ) );
391 
392  // wxFile dtor will close the file
393  }
394 
395  // If a <project>.kicad_pcb or <project>.brd file does not exist,
396  // create a .kicad_pcb "stub" file
397  fn.SetExt( KiCadPcbFileExtension );
398  wxFileName leg_fn( fn );
399  leg_fn.SetExt( LegacyPcbFileExtension );
400 
401  if( !fn.FileExists() && !leg_fn.FileExists() )
402  {
403  wxFile file( fn.GetFullPath(), wxFile::write );
404 
405  if( file.IsOpened() )
406  file.Write( wxT( "(kicad_pcb (version 4) (host kicad \"dummy file\") )\n" ) );
407 
408  // wxFile dtor will close the file
409  }
410 }
411 
412 
413 void KICAD_MANAGER_FRAME::OnOpenFileInTextEditor( wxCommandEvent& event )
414 {
415  // show all files in file dialog (in Kicad all files are editable texts):
416  wxString wildcard = AllFilesWildcard();
417 
418  wxString default_dir = Prj().GetProjectPath();
419 
420  wxFileDialog dlg( this, _( "Load File to Edit" ), default_dir,
421  wxEmptyString, wildcard, wxFD_OPEN );
422 
423  if( dlg.ShowModal() == wxID_CANCEL )
424  return;
425 
426  wxString filename = wxT( "\"" );
427  filename += dlg.GetPath() + wxT( "\"" );
428 
429  if( !dlg.GetPath().IsEmpty() && !Pgm().GetEditorName().IsEmpty() )
431 }
432 
433 
434 void KICAD_MANAGER_FRAME::OnBrowseInFileExplorer( wxCommandEvent& event )
435 {
436  // open project directory in host OS's file explorer
437  wxString project_dir = Prj().GetProjectPath();
438 
439 #ifdef __WXMAC__
440  wxString msg;
441 
442  // Quote in case there are spaces in the path.
443  msg.Printf( "open \"%s\"", project_dir );
444 
445  system( msg.c_str() );
446 #else
447  // Quote in case there are spaces in the path.
448  AddDelimiterString( project_dir );
449 
450  wxLaunchDefaultApplication( project_dir );
451 #endif
452 }
453 
454 
456 {
458 }
459 
460 
461 void KICAD_MANAGER_FRAME::language_change( wxCommandEvent& event )
462 {
463  int id = event.GetId();
464  Kiway().SetLanguage( id );
465 }
466 
467 
469 {
470  // call my base class
472 
473  // tooltips in toolbars
476 
477  PrintPrjInfo();
478 }
479 
480 
481 void KICAD_MANAGER_FRAME::CommonSettingsChanged( bool aEnvVarsChanged )
482 {
483  int historySize;
485  PgmTop().GetFileHistory().SetMaxFiles( (unsigned) std::max( 0, historySize ) );
486 }
487 
488 
490 {
491  m_messagesBox->Clear();
492 }
493 
494 
495 void KICAD_MANAGER_FRAME::LoadSettings( wxConfigBase* aCfg )
496 {
498  aCfg->Read( TREE_FRAME_WIDTH_ENTRY, &m_leftWinWidth );
499 }
500 
501 
502 void KICAD_MANAGER_FRAME::SaveSettings( wxConfigBase* aCfg )
503 {
505  aCfg->Write( TREE_FRAME_WIDTH_ENTRY, m_leftWin->GetSize().x );
506 }
507 
508 
510  PANEL_HOTKEYS_EDITOR* aHotkeysPanel )
511 {
512  aHotkeysPanel->AddHotKeys( GetToolManager() );
513 }
514 
515 
516 
517 
518 
520 {
521  wxString msg = wxString::Format( _( "Project name:\n%s\n" ),
523  PrintMsg( msg );
524 }
525 
526 
void OnBrowseInFileExplorer(wxCommandEvent &event)
A list of parameters type.
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:414
VTBL_ENTRY void ConfigSave(const SEARCH_STACK &aSList, const wxString &aGroupName, const PARAM_CFG_ARRAY &aParams, const wxString &aFileName=wxEmptyString)
Function ConfigSave saves the current "project" parameters into the wxConfigBase* derivative.
Definition: project.cpp:323
KiCad executable names.
wxString FindValidPath(const wxString &aFileName) const
Definition: search_stack.h:73
FILE_HISTORY & GetFileHistory()
Definition: pgm_kicad.h:57
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
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
void language_change(wxCommandEvent &event)
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:61
void LoadSettings(wxConfigBase *aCfg) override
Load common frame parameters from a configuration file.
This file is part of the common library TODO brief description.
Definition: id.h:90
const std::string LegacyPcbFileExtension
virtual void SaveSettings(wxConfigBase *aCfg)
Saves common frame parameters to a configuration data file.
void OnImportEagleFiles(wxCommandEvent &event)
Open dialog to import Eagle schematic and board files.
ACTIONS * m_actions
void OnOpenFileInTextEditor(wxCommandEvent &event)
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:109
void CommonSettingsChanged(bool aEnvVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: kicad.cpp:66
void AddHotKeys(TOOL_MANAGER *aToolMgr)
Class KICAD_MANAGER_CONTROL.
Class 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:435
VTBL_ENTRY const wxString GetProjectPath() const
Function GetProjectPath returns the full path of the project.
Definition: project.cpp:102
wxString AllFilesWildcard()
void DeactivateTool()
Function DeactivateTool() Deactivates the currently active tool.
void UpdateFileHistory(const wxString &FullFileName, FILE_HISTORY *aFileHistory=NULL)
Update the list of recently opened files.
wxConfigBase * PgmSettings()
Definition: pgm_kicad.h:59
Class TOOL_MANAGER.
Definition: tool_manager.h:50
wxBitmap KiBitmap(BITMAP_DEF aBitmap)
Construct a wxBitmap from a memory record, held in a BITMAP_DEF.
Definition: bitmap.cpp:79
const wxString SchFileName()
void PrintMsg(const wxString &aText)
Displays aText in the text panel.
wxString GetBuildVersion()
Function GetBuildVersion Return the build version string.
class TREE_PROJECT_FRAME Window to display the tree files
PROJECT & Prj() const
Function Prj returns a reference to the PROJECT "associated with" this KIWAY.
const std::string SchematicFileExtension
virtual void LoadSettings(wxConfigBase *aCfg)
Load common frame parameters from a configuration file.
wxString help_name() override
Definition of file extensions used in Kicad.
#define FILE_HISTORY_SIZE_KEY
Definition: pgm_base.h:53
void ReCreateTreePrj()
Create or modify the tree showing project file names.
void AddDelimiterString(wxString &string)
Function AddDelimiterString Add un " to the start and the end of string (if not already done).
Definition: gestfich.cpp:42
#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:96
Class COMMON_CONTROL.
VTBL_ENTRY void SetProjectFullName(const wxString &aFullPathAndName)
Function SetProjectFullName sets the: 1) full directory, 2) basename, and 3) extension of the project...
Definition: project.cpp:64
#define _(s)
VTBL_ENTRY wxConfigBase * CommonSettings() const
Definition: pgm_base.h:194
Specialization of the wxAuiPaneInfo class for KiCad panels.
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
const wxString GetProjectFileName()
void SetProjectFileName(const wxString &aFullProjectProFileName)
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:42
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:101
const wxString PcbLegacyFileName()
PARAM_CFG_ARRAY s_KicadManagerParams
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
#define max(a, b)
Definition: auxiliary.h:86
#define KICAD_MANAGER_FRAME_NAME
void OnSize(wxSizeEvent &event)
void SaveSettings(wxConfigBase *aCfg) override
Saves common frame parameters to a configuration data file.
#define DEFAULT_FILE_HISTORY_SIZE
IDs range for menuitems file history: The default range file history size is 9 (compatible with defau...
Definition: id.h:69
The base frame for deriving all KiCad main window classes.
const wxString PcbFileName()
#define TREE_FRAME_WIDTH_ENTRY
static bool empty(const wxTextEntryBase *aCtrl)
void SetEnvironment(EDA_ITEM *aModel, KIGFX::VIEW *aView, KIGFX::VIEW_CONTROLS *aViewControls, EDA_BASE_FRAME *aFrame)
Sets the work environment (model, view, view controls and the parent window).
wxString GetHelpFileName()
Definition: pgm_kicad.h:63
VTBL_ENTRY const wxString & GetEditorName(bool aCanShowFileChooser=true)
Return the preferred editor name.
Definition: pgm_base.cpp:161
Definition: id.h:89
Class KICAD_MANAGER_ACTIONS.
VTBL_ENTRY bool ConfigLoad(const SEARCH_STACK &aSearchS, const wxString &aGroupName, const PARAM_CFG_ARRAY &aParams, const wxString &aForeignConfigFileName=wxEmptyString)
Function ConfigLoad reads a subset of parameters from the "project" file.
Definition: project.cpp:358
TOOL_MANAGER * m_toolManager
void LoadProject(const wxFileName &aProjectFileName)
wxConfigBase * config() override
Returns the wxConfigBase used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
void OnUnarchiveFiles(wxCommandEvent &event)
void CreateNewProject(const wxFileName &aProjectFileName)
Creates a new project by setting up and initial project, schematic, and board files.
void OnExit(wxCommandEvent &event)
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
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 projet name on the text panel.
TREE_PROJECT_FRAME * m_leftWin
The main KiCad project manager frame.
static TOOL_ACTION openTextEditor
#define GeneralGroupName
KIWAY Kiway