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 <gestfich.h>
33 #include <kiway.h>
34 #include <kiway_express.h>
35 #include <kiway_player.h>
36 #include <panel_hotkeys_editor.h>
37 #include <tool/action_toolbar.h>
38 #include <tool/common_control.h>
39 #include <tool/tool_manager.h>
43 
44 #ifdef __WXMAC__
45 #include <MacTypes.h>
46 #include <ApplicationServices/ApplicationServices.h>
47 #endif
48 
49 #include "kicad_manager_frame.h"
50 
51 
52 #define TREE_FRAME_WIDTH_ENTRY wxT( "LeftWinWidth" )
53 
54 #define SEP() wxFileName::GetPathSeparator()
55 
56 // Not really useful, provided to save/restore params in project config file,
57 // (Add them in s_KicadManagerParams if any)
58 // Used also to create new .pro files from the kicad.pro template file
59 // for new projects
60 #define GeneralGroupName wxT( "/general" )
61 
63 
64 
65 // Menubar and toolbar event table
66 BEGIN_EVENT_TABLE( KICAD_MANAGER_FRAME, EDA_BASE_FRAME )
67  // Window events
68  EVT_SIZE( KICAD_MANAGER_FRAME::OnSize )
70 
71  // Menu events
72  EVT_MENU( wxID_EXIT, KICAD_MANAGER_FRAME::OnExit )
78 
79  // Range menu events
81  KICAD_MANAGER_FRAME::language_change )
82 
84 
85  // Special functions
86  EVT_MENU( ID_INIT_WATCHED_PATHS, KICAD_MANAGER_FRAME::OnChangeWatchedPaths )
87 END_EVENT_TABLE()
88 
89 
90 KICAD_MANAGER_FRAME::KICAD_MANAGER_FRAME( wxWindow* parent, const wxString& title,
91  const wxPoint& pos, const wxSize& size ) :
92  EDA_BASE_FRAME( parent, KICAD_MAIN_FRAME_T, title, pos, size,
94  m_leftWin( nullptr ),
95  m_launcher( nullptr ),
96  m_messagesBox( nullptr ),
97  m_mainToolBar( nullptr )
98 {
99  m_active_project = false;
100  m_leftWinWidth = 250; // Default value
101  m_AboutTitle = "KiCad";
102 
103  // Create the status line (bottom of the frame)
104  static const int dims[3] = { -1, -1, 100 };
105 
106  CreateStatusBar( 3 );
107  SetStatusWidths( 3, dims );
108 
109  // Give an icon
110  wxIcon icon;
111  icon.CopyFromBitmap( KiBitmap( icon_kicad_xpm ) );
112  SetIcon( icon );
113 
114  // Give the last size and pos to main window
115  LoadSettings( config() );
116  SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y );
117 
118  // Left window: is the box which display tree project
119  m_leftWin = new TREE_PROJECT_FRAME( this );
120 
121  // Add the wxTextCtrl showing all messages from KiCad:
122  m_messagesBox = new wxTextCtrl( this, wxID_ANY, wxEmptyString,
123  wxDefaultPosition, wxDefaultSize,
124  wxTE_MULTILINE | wxTE_READONLY | wxBORDER_NONE );
125 
126  // Create the manager
127  m_toolManager = new TOOL_MANAGER;
128  m_toolManager->SetEnvironment( nullptr, nullptr, nullptr, this );
129  m_actions = new KICAD_MANAGER_ACTIONS();
130 
131  // Register tools
132  m_toolManager->RegisterTool( new COMMON_CONTROL );
133  m_toolManager->RegisterTool( new KICAD_MANAGER_CONTROL );
134  m_toolManager->InitTools();
135 
136  RecreateBaseHToolbar();
137  RecreateLauncher();
138  ReCreateMenuBar();
139 
140  m_auimgr.SetManagedWindow( this );
141 
142  m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ).Top().Layer(6) );
143 
144  // BestSize() does not always set the actual pane size of m_leftWin to the required value.
145  // It happens when m_leftWin is too large (roughly > 1/3 of the kicad manager frame width.
146  // (Well, BestSize() sets the best size... not the window size)
147  // A trick is to use MinSize() to set the required pane width,
148  // and after give a reasonable MinSize value
149  m_auimgr.AddPane( m_leftWin, EDA_PANE().Palette().Name( "ProjectTree" ).Left().Layer(3)
150  .CaptionVisible( false ).PaneBorder( false )
151  .MinSize( m_leftWinWidth, -1 ).BestSize( m_leftWinWidth, -1 ) );
152 
153  m_auimgr.AddPane( m_launcher, EDA_PANE().HToolbar().Name( "Launcher" ).Top().Layer(1) );
154 
155  m_auimgr.AddPane( m_messagesBox, EDA_PANE().Messages().Name( "MsgPanel" ).Center() );
156 
157  m_auimgr.Update();
158 
159  // Now the actual m_leftWin size is set, give it a reasonable min width
160  m_auimgr.GetPane( m_leftWin ).MinSize( 200, -1 );
161 
162  SetTitle( wxString( "KiCad " ) + GetBuildVersion() );
163 }
164 
165 
167 {
168  // Ensure there are no active tools
169  if( m_toolManager )
171 
172  delete m_actions;
173  delete m_toolManager;
174 
175  m_auimgr.UnInit();
176 }
177 
178 
180 {
181  wxConfigBase* ret = PgmTop().PgmSettings();
182  wxASSERT( ret );
183  return ret;
184 }
185 
186 
187 void KICAD_MANAGER_FRAME::SetProjectFileName( const wxString& aFullProjectProFileName )
188 {
189  // ensure file name is absolute:
190  wxFileName fn( aFullProjectProFileName );
191 
192  if( !fn.IsAbsolute() )
193  fn.MakeAbsolute();
194 
195  Prj().SetProjectFullName( fn.GetFullPath() );
196 
197  SetTitle( wxString( "KiCad " ) + GetBuildVersion() );
198  wxString title = GetTitle() + " " + fn.GetFullPath();
199 
200  if( !fn.IsDirWritable() )
201  title += _( " [Read Only]" );
202 
203  SetTitle( title );
204 }
205 
206 
208 {
209  return Prj().GetProjectFullName();
210 }
211 
212 
214 {
215  wxFileName fn( GetProjectFileName() );
216 
217  fn.SetExt( SchematicFileExtension );
218  return fn.GetFullPath();
219 }
220 
221 
223 {
224  wxFileName fn( GetProjectFileName() );
225 
226  fn.SetExt( PcbFileExtension );
227  return fn.GetFullPath();
228 }
229 
230 
232 {
233  wxFileName fn( GetProjectFileName() );
234 
235  fn.SetExt( LegacyPcbFileExtension );
236  return fn.GetFullPath();
237 }
238 
239 
241 {
243 }
244 
245 
247 {
248  return PgmTop().SysSearch();
249 }
250 
251 
253 {
254  return PgmTop().GetHelpFileName();
255 }
256 
257 
258 void KICAD_MANAGER_FRAME::PrintMsg( const wxString& aText )
259 {
260  m_messagesBox->AppendText( aText );
261 }
262 
263 
264 void KICAD_MANAGER_FRAME::OnSize( wxSizeEvent& event )
265 {
266  if( m_auimgr.GetManagedWindow() )
267  m_auimgr.Update();
268 
269  event.Skip();
270 }
271 
272 
273 void KICAD_MANAGER_FRAME::OnCloseWindow( wxCloseEvent& Event )
274 {
275  if( Kiway().PlayersClose( false ) )
276  {
277  int px, py;
278 
279  if( !GetProjectFileName().empty() )
280  UpdateFileHistory( GetProjectFileName(), &PgmTop().GetFileHistory() );
281 
282  if( !IsIconized() ) // save main frame position and size
283  {
284  GetPosition( &px, &py );
285  m_FramePos.x = px;
286  m_FramePos.y = py;
287 
288  GetSize( &px, &py );
289  m_FrameSize.x = px;
290  m_FrameSize.y = py;
291  }
292 
293  Event.SetCanVeto( true );
294 
295  m_leftWin->Show( false );
296 
297  Destroy();
298  }
299 }
300 
301 
302 void KICAD_MANAGER_FRAME::OnExit( wxCommandEvent& event )
303 {
304  Close( true );
305 }
306 
307 
308 void KICAD_MANAGER_FRAME::LoadProject( const wxFileName& aProjectFileName )
309 {
310  // The project file should be valid by the time we get here or something has gone wrong.
311  if( !aProjectFileName.Exists() )
312  return;
313 
314  // Any open KIFACE's must be closed if they are not part of the new project.
315  // (We never want a KIWAY_PLAYER open on a KIWAY that isn't in the same project.)
316  // User is prompted here to close those KIWAY_PLAYERs:
317  if( !Kiway().PlayersClose( false ) )
318  return;
319 
320  // Save the project file for the currently loaded project.
321  if( m_active_project )
323 
324  m_active_project = true;
325  ClearMsg();
326  SetProjectFileName( aProjectFileName.GetFullPath() );
328 
329  if( aProjectFileName.IsDirWritable() )
330  SetMruPath( Prj().GetProjectPath() ); // Only set MRU path if we have write access. Why?
331 
332  UpdateFileHistory( aProjectFileName.GetFullPath(), &PgmTop().GetFileHistory() );
333 
335 
336  SyncToolbars();
337 
338  // Rebuild the list of watched paths.
339  // however this is possible only when the main loop event handler is running,
340  // so we use it to run the rebuild function.
341  wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED, ID_INIT_WATCHED_PATHS );
342 
343  wxPostEvent( this, cmd );
344 
345  PrintPrjInfo();
346 }
347 
348 
349 void KICAD_MANAGER_FRAME::CreateNewProject( const wxFileName& aProjectFileName )
350 {
351  wxCHECK_RET( aProjectFileName.DirExists() && aProjectFileName.IsDirWritable(),
352  "Project folder must exist and be writable to create a new project." );
353 
354  // Init project filename. This clears all elements from the project object.
355  SetProjectFileName( aProjectFileName.GetFullPath() );
356 
357  // Copy kicad.pro file from template folder.
358  if( !aProjectFileName.FileExists() )
359  {
360  wxString srcFileName = sys_search().FindValidPath( "kicad.pro" );
361 
362  // Create a minimal project (.pro) file if the template project file could not be copied.
363  if( !wxFileName::FileExists( srcFileName )
364  || !wxCopyFile( srcFileName, aProjectFileName.GetFullPath() ) )
365  {
367  }
368  }
369 
370  // Ensure a "stub" for a schematic root sheet and a board exist.
371  // It will avoid messages from the schematic editor or the board editor to create a new file
372  // And forces the user to create main files under the right name for the project manager
373  wxFileName fn( aProjectFileName.GetFullPath() );
374  fn.SetExt( SchematicFileExtension );
375 
376  // If a <project>.sch file does not exist, create a "stub" file ( minimal schematic file )
377  if( !fn.FileExists() )
378  {
379  wxFile file( fn.GetFullPath(), wxFile::write );
380 
381  if( file.IsOpened() )
382  file.Write( wxT( "EESchema Schematic File Version 2\n"
383  "EELAYER 25 0\nEELAYER END\n$EndSCHEMATC\n" ) );
384 
385  // wxFile dtor will close the file
386  }
387 
388  // If a <project>.kicad_pcb or <project>.brd file does not exist,
389  // create a .kicad_pcb "stub" file
390  fn.SetExt( KiCadPcbFileExtension );
391  wxFileName leg_fn( fn );
392  leg_fn.SetExt( LegacyPcbFileExtension );
393 
394  if( !fn.FileExists() && !leg_fn.FileExists() )
395  {
396  wxFile file( fn.GetFullPath(), wxFile::write );
397 
398  if( file.IsOpened() )
399  file.Write( wxT( "(kicad_pcb (version 4) (host kicad \"dummy file\") )\n" ) );
400 
401  // wxFile dtor will close the file
402  }
403 }
404 
405 
406 void KICAD_MANAGER_FRAME::OnOpenFileInTextEditor( wxCommandEvent& event )
407 {
408  // show all files in file dialog (in Kicad all files are editable texts):
409  wxString wildcard = AllFilesWildcard();
410 
411  wxString default_dir = Prj().GetProjectPath();
412 
413  wxFileDialog dlg( this, _( "Load File to Edit" ), default_dir,
414  wxEmptyString, wildcard, wxFD_OPEN );
415 
416  if( dlg.ShowModal() == wxID_CANCEL )
417  return;
418 
419  wxString filename = wxT( "\"" );
420  filename += dlg.GetPath() + wxT( "\"" );
421 
422  if( !dlg.GetPath().IsEmpty() && !Pgm().GetEditorName().IsEmpty() )
424 }
425 
426 
427 void KICAD_MANAGER_FRAME::OnBrowseInFileExplorer( wxCommandEvent& event )
428 {
429  // open project directory in host OS's file explorer
430  wxString project_dir = Prj().GetProjectPath();
431 
432 #ifdef __WXMAC__
433  wxString msg;
434 
435  // Quote in case there are spaces in the path.
436  msg.Printf( "open \"%s\"", project_dir );
437 
438  system( msg.c_str() );
439 #else
440  // Quote in case there are spaces in the path.
441  AddDelimiterString( project_dir );
442 
443  wxLaunchDefaultApplication( project_dir );
444 #endif
445 }
446 
447 
449 {
451 }
452 
453 
454 void KICAD_MANAGER_FRAME::language_change( wxCommandEvent& event )
455 {
456  int id = event.GetId();
457  Kiway().SetLanguage( id );
458 }
459 
460 
462 {
463  // call my base class
465 
466  // tooltips in toolbars
469 
470  PrintPrjInfo();
471 }
472 
473 
474 void KICAD_MANAGER_FRAME::CommonSettingsChanged( bool aEnvVarsChanged )
475 {
476  int historySize;
478  PgmTop().GetFileHistory().SetMaxFiles( (unsigned) std::max( 0, historySize ) );
479 }
480 
481 
483 {
484  m_messagesBox->Clear();
485 }
486 
487 
488 void KICAD_MANAGER_FRAME::LoadSettings( wxConfigBase* aCfg )
489 {
491  aCfg->Read( TREE_FRAME_WIDTH_ENTRY, &m_leftWinWidth );
492 }
493 
494 
495 void KICAD_MANAGER_FRAME::SaveSettings( wxConfigBase* aCfg )
496 {
498  aCfg->Write( TREE_FRAME_WIDTH_ENTRY, m_leftWin->GetSize().x );
499 }
500 
501 
503  PANEL_HOTKEYS_EDITOR* aHotkeysPanel )
504 {
505  aHotkeysPanel->AddHotKeys( GetToolManager() );
506 }
507 
508 
509 
510 
511 
513 {
514  wxString msg = wxString::Format( _( "Project name:\n%s\n" ),
516  PrintMsg( msg );
517 }
518 
519 
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:394
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:65
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:415
VTBL_ENTRY const wxString GetProjectPath() const
Function GetProjectPath returns the full path of the project.
Definition: project.cpp:102
wxString AllFilesWildcard()
void UpdateFileHistory(const wxString &FullFileName, wxFileHistory *aFileHistory=NULL)
Update the list of recently opened files.
void DeactivateTool()
Function DeactivateTool() Deactivates the currently active tool.
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:54
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:204
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:71
const wxString GetProjectFileName()
void SetProjectFileName(const wxString &aFullProjectProFileName)
void OnCloseWindow(wxCloseEvent &Event)
void SetMaxFiles(size_t aMaxFiles)
Definition: pgm_base.cpp:120
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:179
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