KiCad PCB EDA Suite
KIWAY Class Reference

Class KIWAY is a minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad process. More...

#include <kiway.h>

Inheritance diagram for KIWAY:

Public Types

enum  FACE_T {
  FACE_SCH, FACE_PCB, FACE_CVPCB, FACE_GERBVIEW,
  FACE_PL_EDITOR, FACE_PCB_CALCULATOR, FACE_BMP2CMP, KIWAY_FACE_COUNT
}
 Known KIFACE implementations. More...
 

Public Member Functions

 ~KIWAY () throw ()
 
VTBL_ENTRY KIFACEKiFACE (FACE_T aFaceId, bool doLoad=true)
 Function KiFACE returns the KIFACE* given a FACE_T. More...
 
VTBL_ENTRY KIWAY_PLAYERPlayer (FRAME_T aFrameType, bool doCreate=true, KIWAY_PLAYER *aParent=NULL)
 Function Player returns the KIWAY_PLAYER* given a FRAME_T. More...
 
VTBL_ENTRY bool PlayerClose (FRAME_T aFrameType, bool doForce)
 Function PlayerClose calls the KIWAY_PLAYER::Close( bool force ) function on the window and if not vetoed, returns true, else false. More...
 
VTBL_ENTRY bool PlayersClose (bool doForce)
 Function PlayersClose calls the KIWAY_PLAYER::Close( bool force ) function on all the windows and if none are vetoed, returns true, else false. More...
 
VTBL_ENTRY void ExpressMail (FRAME_T aDestination, MAIL_T aCommand, const std::string &aPayload, wxWindow *aSource=NULL)
 Function ExpressMail send aPayload to aDestination from aSource. More...
 
VTBL_ENTRY PROJECTPrj () const
 Function Prj returns the PROJECT associated with this KIWAY. More...
 
VTBL_ENTRY void SetLanguage (int aLanguage)
 Function SetLanguage changes the language and then calls ShowChangedLanguage() on all KIWAY_PLAYERs. More...
 
VTBL_ENTRY void ShowChangedIcons ()
 Function ShowChangedIcons Calls ShowChangedIcons() on all KIWAY_PLAYERs. More...
 
 KIWAY (PGM_BASE *aProgram, int aCtlBits, wxFrame *aTop=NULL)
 
void SetTop (wxFrame *aTop)
 Function SetTop tells this KIWAY about the top most frame in the program and optionally allows it to play the role of one of the KIWAY_PLAYERs if launched from single_top.cpp. More...
 
void OnKiwayEnd ()
 
bool ProcessEvent (wxEvent &aEvent) override
 

Static Public Member Functions

static FACE_T KifaceType (FRAME_T aFrameType)
 Function KifaceType is a simple mapping function which returns the FACE_T which is known to implement aFrameType. More...
 

Private Member Functions

const wxString dso_search_path (FACE_T aFaceId)
 Get the [path &] name of the DSO holding the requested FACE_T. More...
 
bool set_kiface (FACE_T aFaceType, KIFACE *aKiface)
 
KIWAY_PLAYERGetPlayerFrame (FRAME_T aFrameType)
 

Private Attributes

PGM_BASEm_program
 
int m_ctl
 
wxFrame * m_top
 
wxArrayString m_playerFrameName
 
PROJECT m_project
 

Static Private Attributes

static KIFACEm_kiface [KIWAY_FACE_COUNT]
 
static int m_kiface_version [KIWAY_FACE_COUNT]
 

Friends

struct PGM_SINGLE_TOP
 

Detailed Description

Class KIWAY is a minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad process.

It makes it possible to call between DSOs without having to link them together, and without having to link to the top process module which houses the KIWAY(s). More importantly it makes it possible to send custom wxEvents between DSOs and from the top process module down into the DSOs. The latter capability is thought useful for driving the lower DSOs from a python test rig or for demo (automation) purposes.

Most all calls are via virtual functions, which means C++ vtables are used to hold function pointers and eliminate the need to link to specific object code libraries, speeding development and encouraging clearly defined interface design. Unlike Microsoft COM, which is a multi-vendor design supporting DLL's built at various points in time, the KIWAY alchemy is single project, with all components being built at the same time. So one should expect solid compatibility between all KiCad components, as long at they are compiled at the same time.

There is one KIWAY in the launching portion of the process for each open KiCad project. Each project has its own KIWAY. Available to each KIWAY is an actual PROJECT data structure. If you have a KIWAY, you can get to the PROJECT using KIWAY::Prj().

In summary, a KIWAY facilitates communicating between DSOs, where the topic of the communication is project specific. Here a "project" means a BOARD and a SCHEMATIC and a NETLIST, (anything relating to production of a single BOARD and added to class PROJECT.)

Definition at line 257 of file kiway.h.

Member Enumeration Documentation

Known KIFACE implementations.

Enumerator
FACE_SCH 

eeschema DSO

FACE_PCB 

pcbnew DSO

FACE_CVPCB 
FACE_GERBVIEW 
FACE_PL_EDITOR 
FACE_PCB_CALCULATOR 
FACE_BMP2CMP 
KIWAY_FACE_COUNT 

Definition at line 263 of file kiway.h.

Constructor & Destructor Documentation

KIWAY::~KIWAY ( )
throw (
)
inline

Definition at line 276 of file kiway.h.

276 {}
KIWAY::KIWAY ( PGM_BASE aProgram,
int  aCtlBits,
wxFrame *  aTop = NULL 
)

Definition at line 44 of file kiway.cpp.

References KIWAY_PLAYER_COUNT, m_playerFrameName, and SetTop().

44  :
45  m_program( aProgram ),
46  m_ctl( aCtlBits ),
47  m_top( 0 )
48 {
49  SetTop( aTop ); // hook player_destroy_handler() into aTop.
50 
51 
52  // Prepare the room to store the frame names, once they will be created
53  // with FRAME_T type as index in this table.
54  // (note this is a list of frame names, but a non empty entry
55  // does not mean the frame still exists. It means only the frame was created
56  // at least once. It can be destroyed after. These entries are not cleared.
57  // the purpose is just to allow a call to wxWindow::FindWindowByName(), from
58  // a FRAME_T frame type
59  m_playerFrameName.Add( wxEmptyString, KIWAY_PLAYER_COUNT );
60 }
PGM_BASE * m_program
Definition: kiway.h:413
int m_ctl
Definition: kiway.h:414
void SetTop(wxFrame *aTop)
Function SetTop tells this KIWAY about the top most frame in the program and optionally allows it to ...
Definition: kiway.cpp:78
wxArrayString m_playerFrameName
Definition: kiway.h:424
wxFrame * m_top
Definition: kiway.h:416

Member Function Documentation

const wxString KIWAY::dso_search_path ( FACE_T  aFaceId)
private

Get the [path &] name of the DSO holding the requested FACE_T.

Definition at line 96 of file kiway.cpp.

References FACE_BMP2CMP, FACE_CVPCB, FACE_GERBVIEW, FACE_PCB, FACE_PCB_CALCULATOR, FACE_PL_EDITOR, FACE_SCH, PGM_BASE::GetExecutablePath(), KFCTL_CPP_PROJECT_SUITE, KFCTL_STANDALONE, m_ctl, name, and Pgm().

Referenced by KiFACE().

97 {
98  const char* name;
99 
100  switch( aFaceId )
101  {
102  case FACE_SCH: name = KIFACE_PREFIX "eeschema"; break;
103  case FACE_PCB: name = KIFACE_PREFIX "pcbnew"; break;
104  case FACE_CVPCB: name = KIFACE_PREFIX "cvpcb"; break;
105  case FACE_GERBVIEW: name = KIFACE_PREFIX "gerbview"; break;
106  case FACE_PL_EDITOR: name = KIFACE_PREFIX "pl_editor"; break;
107  case FACE_PCB_CALCULATOR: name = KIFACE_PREFIX "pcb_calculator"; break;
108  case FACE_BMP2CMP: name = KIFACE_PREFIX "bitmap2component"; break;
109 
110  default:
111  wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFaceId" ) );
112  return wxEmptyString;
113  }
114 
115 #ifndef __WXMAC__
116  wxString path;
117 
119  {
120  // The 2 *.cpp program launchers: single_top.cpp and kicad.cpp expect
121  // the *.kiface's to reside in same diretory as their binaries do.
122  // Not so for python launcher, identified by KFCTL_PY_PROJECT_SUITE
123  path = wxStandardPaths::Get().GetExecutablePath();
124  }
125 
126  wxFileName fn = path;
127 #else
128  // we have the dso's in main OSX bundle kicad.app/Contents/PlugIns
129  wxFileName fn = Pgm().GetExecutablePath();
130  fn.AppendDir( wxT( "Contents" ) );
131  fn.AppendDir( wxT( "PlugIns" ) );
132 #endif
133 
134  fn.SetName( name );
135 
136  // Here a "suffix" == an extension with a preceding '.',
137  // so skip the preceding '.' to get an extension
138  fn.SetExt( KIFACE_SUFFIX + 1 ); // + 1 => &KIFACE_SUFFIX[1]
139 
140  return fn.GetFullPath();
141 }
#define KFCTL_CPP_PROJECT_SUITE
Am running under C++ project mgr, possibly with others.
Definition: kiway.h:159
VTBL_ENTRY const wxString & GetExecutablePath() const
Definition: pgm_base.h:173
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: kicad.cpp:65
int m_ctl
Definition: kiway.h:414
pcbnew DSO
Definition: kiway.h:266
eeschema DSO
Definition: kiway.h:265
const char * name
#define KFCTL_STANDALONE
Am running as a standalone Top.
Definition: kiway.h:158
void KIWAY::ExpressMail ( FRAME_T  aDestination,
MAIL_T  aCommand,
const std::string &  aPayload,
wxWindow *  aSource = NULL 
)

Function ExpressMail send aPayload to aDestination from aSource.

Recipient receives this in its KIWAY_PLAYER::KiwayMailIn() function and can efficiently switch() based on aCommand in there.

Definition at line 387 of file kiway.cpp.

References ProcessEvent().

Referenced by LIB_EDIT_FRAME::InstallConfigFrame(), SCH_EDIT_FRAME::OnUpdatePCB(), PCB_EDIT_FRAME::OnUpdatePCBFromSch(), LIB_EDIT_FRAME::refreshSchematic(), CVPCB_MAINFRAME::SaveFootprintAssociation(), CVPCB_MAINFRAME::SendMessageToEESCHEMA(), PCB_EDIT_FRAME::SendMessageToEESCHEMA(), SCH_EDIT_FRAME::SendMessageToPCBNEW(), and SCH_EDIT_FRAME::sendNetlist().

389 {
390  KIWAY_EXPRESS mail( aDestination, aCommand, aPayload, aSource );
391 
392  ProcessEvent( mail );
393 }
Class KIWAY_EXPRESS carries a payload from one KIWAY_PLAYER to another within a PROJECT.
Definition: kiway_express.h:39
bool ProcessEvent(wxEvent &aEvent) override
Definition: kiway.cpp:459
KIWAY_PLAYER * KIWAY::GetPlayerFrame ( FRAME_T  aFrameType)
private
Returns
the reference of the KIWAY_PLAYER having the type aFrameType if exists, or NULL if this KIWAY_PLAYER was not yet created, or was closed

Definition at line 293 of file kiway.cpp.

References m_playerFrameName.

Referenced by Player(), PlayerClose(), SetLanguage(), and ShowChangedIcons().

294 {
295  if( m_playerFrameName[aFrameType].IsEmpty() )
296  return NULL;
297 
298  return static_cast<KIWAY_PLAYER*>( wxWindow::FindWindowByName( m_playerFrameName[aFrameType] ) );
299 }
Class KIWAY_PLAYER is a wxFrame capable of the OpenProjectFiles function, meaning it can load a porti...
Definition: kiway_player.h:111
wxArrayString m_playerFrameName
Definition: kiway.h:424
KIFACE * KIWAY::KiFACE ( FACE_T  aFaceId,
bool  doLoad = true 
)

Function KiFACE returns the KIFACE* given a FACE_T.

If it is not already loaded, the KIFACE is loaded and initialized with a call to KIFACE::OnKifaceStart()

Definition at line 150 of file kiway.cpp.

References DIM, dso_search_path(), Format(), GetChars(), kiface, KIFACE_INSTANCE_NAME_AND_VERSION, KIFACE_VERSION, m_ctl, m_kiface, m_kiface_version, m_program, KIFACE::OnKifaceStart(), and THROW_IO_ERROR.

Referenced by FOOTPRINT_PREVIEW_PANEL_BASE::Create(), get_instance_from_id(), and Player().

151 {
152  // Since this will be called from python, cannot assume that code will
153  // not pass a bad aFaceId.
154  if( unsigned( aFaceId ) >= DIM( m_kiface ) )
155  {
156  // @todo : throw an exception here for python's benefit, at least that
157  // way it gets some explanatory text.
158 
159  wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFaceId" ) );
160  return NULL;
161  }
162 
163  // return the previously loaded KIFACE, if it was.
164  if( m_kiface[aFaceId] )
165  return m_kiface[aFaceId];
166 
167  wxString msg;
168 
169  // DSO with KIFACE has not been loaded yet, does caller want to load it?
170  if( doLoad )
171  {
172  wxString dname = dso_search_path( aFaceId );
173 
174  wxDynamicLibrary dso;
175 
176  void* addr = NULL;
177 
178  if( !dso.Load( dname, wxDL_VERBATIM | wxDL_NOW | wxDL_GLOBAL ) )
179  {
180  // Failure: error reporting UI was done via wxLogSysError().
181  // No further reporting required here. Apparently this is not true on all
182  // platforms and/or wxWidgets builds and KiCad will crash. Throwing the exception
183  // here and catching it in the KiCad launcher resolves the crash issue. See bug
184  // report https://bugs.launchpad.net/kicad/+bug/1577786.
185 
186  msg.Printf( _( "Failed to load kiface library '%s'." ), GetChars( dname ) );
187  THROW_IO_ERROR( msg );
188  }
189  else if( ( addr = dso.GetSymbol( wxT( KIFACE_INSTANCE_NAME_AND_VERSION ) ) ) == NULL )
190  {
191  // Failure: error reporting UI was done via wxLogSysError().
192  // No further reporting required here. Assume the same thing applies here as
193  // above with the Load() call. This has not been tested.
194  msg.Printf(
195  _( "Could not read instance name and version symbol form kiface library '%s'." ),
196  GetChars( dname ) );
197  THROW_IO_ERROR( msg );
198  }
199  else
200  {
201  KIFACE_GETTER_FUNC* getter = (KIFACE_GETTER_FUNC*) addr;
202 
203  KIFACE* kiface = getter( &m_kiface_version[aFaceId], KIFACE_VERSION, m_program );
204 
205  // KIFACE_GETTER_FUNC function comment (API) says the non-NULL is unconditional.
206  wxASSERT_MSG( kiface,
207  wxT( "attempted DSO has a bug, failed to return a KIFACE*" ) );
208 
209  // Give the DSO a single chance to do its "process level" initialization.
210  // "Process level" specifically means stay away from any projects in there.
211  if( kiface->OnKifaceStart( m_program, m_ctl ) )
212  {
213  // Tell dso's wxDynamicLibrary destructor not to Unload() the program image.
214  (void) dso.Detach();
215 
216  return m_kiface[aFaceId] = kiface;
217  }
218  }
219 
220  // In any of the failure cases above, dso.Unload() should be called here
221  // by dso destructor.
222  // However:
223 
224  // There is a file installation bug. We only look for KIFACE_I's which we know
225  // to exist, and we did not find one. If we do not find one, this is an
226  // installation bug.
227 
228  msg = wxString::Format( _(
229  "Fatal Installation Bug. File:\n"
230  "'%s'\ncould not be loaded\n" ), GetChars( dname ) );
231 
232  if( ! wxFileExists( dname ) )
233  msg << _( "It is missing.\n" );
234  else
235  msg << _( "Perhaps a shared library (.dll or .so) file is missing.\n" );
236 
237  msg << _( "From command line: argv[0]:\n'" );
238  msg << wxStandardPaths::Get().GetExecutablePath() << wxT( "'\n" );
239 
240  // This is a fatal error, one from which we cannot recover, nor do we want
241  // to protect against in client code which would require numerous noisy
242  // tests in numerous places. So we inform the user that the installation
243  // is bad. This exception will likely not get caught until way up in the
244  // wxApp derivative, at which point the process will exit gracefully.
245  THROW_IO_ERROR( msg );
246  }
247 
248  return NULL;
249 }
#define DIM(x)
of elements in an array
Definition: macros.h:98
#define KIFACE_VERSION
Definition: kiway.h:111
PGM_BASE * m_program
Definition: kiway.h:413
#define KIFACE_INSTANCE_NAME_AND_VERSION
Definition: kiway.h:116
KIFACE * KIFACE_GETTER_FUNC(int *aKIFACEversion, int aKIWAYversion, PGM_BASE *aProgram)
Function Pointer KIFACE_GETTER_FUNC points to the one and only KIFACE export.
Definition: kiway.h:450
int m_ctl
Definition: kiway.h:414
const wxString dso_search_path(FACE_T aFaceId)
Get the [path &] name of the DSO holding the requested FACE_T.
Definition: kiway.cpp:96
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:92
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
Class KIFACE is used by a participant in the KIWAY alchemy.
Definition: kiway.h:150
static int m_kiface_version[KIWAY_FACE_COUNT]
Definition: kiway.h:411
VTBL_ENTRY bool OnKifaceStart(PGM_BASE *aProgram, int aCtlBits)=0
Function OnKifaceStart is called just once shortly after the DSO is loaded.
return & kiface
Definition: pcbnew.cpp:197
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
static KIFACE * m_kiface[KIWAY_FACE_COUNT]
Definition: kiway.h:410
KIWAY::FACE_T KIWAY::KifaceType ( FRAME_T  aFrameType)
static

Function KifaceType is a simple mapping function which returns the FACE_T which is known to implement aFrameType.

Returns
KIWAY::FACE_T - a valid value or FACE_T(-1) if given a bad aFrameType.

Definition at line 252 of file kiway.cpp.

References FACE_BMP2CMP, FACE_CVPCB, FACE_GERBVIEW, FACE_PCB, FACE_PCB_CALCULATOR, FACE_PL_EDITOR, FACE_SCH, FRAME_BM2CMP, FRAME_CALC, FRAME_CVPCB, FRAME_CVPCB_DISPLAY, FRAME_GERBER, FRAME_PCB, FRAME_PCB_DISPLAY3D, FRAME_PCB_FOOTPRINT_WIZARD_MODAL, FRAME_PCB_MODULE_EDITOR, FRAME_PCB_MODULE_VIEWER, FRAME_PCB_MODULE_VIEWER_MODAL, FRAME_PL_EDITOR, FRAME_SCH, FRAME_SCH_LIB_EDITOR, FRAME_SCH_VIEWER, FRAME_SCH_VIEWER_MODAL, and FRAME_SIMULATOR.

Referenced by PGM_SINGLE_TOP::OnPgmInit(), and Player().

253 {
254  switch( aFrameType )
255  {
256  case FRAME_SCH:
258  case FRAME_SCH_VIEWER:
260  case FRAME_SIMULATOR:
261  return FACE_SCH;
262 
263  case FRAME_PCB:
268  case FRAME_PCB_DISPLAY3D:
269  return FACE_PCB;
270 
271  case FRAME_CVPCB:
272  case FRAME_CVPCB_DISPLAY:
273  return FACE_CVPCB;
274 
275  case FRAME_GERBER:
276  return FACE_GERBVIEW;
277 
278  case FRAME_PL_EDITOR:
279  return FACE_PL_EDITOR;
280 
281  case FRAME_CALC:
282  return FACE_PCB_CALCULATOR;
283 
284  case FRAME_BM2CMP:
285  return FACE_BMP2CMP;
286 
287  default:
288  return FACE_T( -1 );
289  }
290 }
pcbnew DSO
Definition: kiway.h:266
FACE_T
Known KIFACE implementations.
Definition: kiway.h:263
eeschema DSO
Definition: kiway.h:265
void KIWAY::OnKiwayEnd ( )

Definition at line 485 of file kiway.cpp.

References DIM, m_kiface, and KIFACE::OnKifaceEnd().

Referenced by PGM_KICAD::OnPgmExit(), and PGM_SINGLE_TOP::OnPgmExit().

486 {
487  for( unsigned i=0; i < DIM( m_kiface ); ++i )
488  {
489  if( m_kiface[i] )
490  m_kiface[i]->OnKifaceEnd();
491  }
492 }
#define DIM(x)
of elements in an array
Definition: macros.h:98
VTBL_ENTRY void OnKifaceEnd()=0
Function OnKifaceEnd is called just once just before the DSO is to be unloaded.
static KIFACE * m_kiface[KIWAY_FACE_COUNT]
Definition: kiway.h:410
KIWAY_PLAYER * KIWAY::Player ( FRAME_T  aFrameType,
bool  doCreate = true,
KIWAY_PLAYER aParent = NULL 
)

Function Player returns the KIWAY_PLAYER* given a FRAME_T.

If it is not already created, the required KIFACE is found and loaded and initialized if necessary, then the KIWAY_PLAYER window is created but not shown. Caller must Show() it. If it is already created, then the existing KIWAY_PLAYER* pointer is returned.

Parameters
aFrameTypeis from enum FRAME_T.
doCreatewhen true asks that the player be created if it is not already created, false means do not create and maybe return NULL.
aParentis a parent for modal KIWAY_PLAYER frames, otherwise NULL used only when doCreate = true
Returns
KIWAY_PLAYER* - a valid opened KIWAY_PLAYER or NULL if there is something wrong or doCreate was false and the player has yet to be created.
Exceptions
IO_ERRORif the *.kiface file could not be found, filled with text saying what.

Definition at line 302 of file kiway.cpp.

References KIFACE::CreateWindow(), GetPlayerFrame(), kiface, KiFACE(), KifaceType(), KIWAY_PLAYER_COUNT, m_ctl, and m_playerFrameName.

Referenced by EDIT_TOOL::editFootprintInFpEditor(), EVT_TOOL(), EVT_UPDATE_UI(), FOOTPRINT_EDIT_FRAME::GetPlotSettings(), DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::initBuffers(), PCB_EDIT_FRAME::InstallModuleOptionsFrame(), FOOTPRINT_EDIT_FRAME::Load_Module_From_BOARD(), SCH_EDIT_FRAME::OnCloseWindow(), SCH_BASE_FRAME::OnEditSymbolLibTable(), SCH_EDIT_FRAME::OnLeftClick(), SCH_EDIT_FRAME::OnOpenCvpcb(), SCH_EDIT_FRAME::OnOpenLibraryEditor(), SCH_BASE_FRAME::OnOpenLibraryViewer(), SCH_EDIT_FRAME::OnOpenPcbModuleEditor(), SCH_EDIT_FRAME::OnOpenPcbnew(), PGM_SINGLE_TOP::OnPgmInit(), KICAD_MANAGER_FRAME::OnRunPcbFpEditor(), KICAD_MANAGER_FRAME::OnRunSchLibEditor(), SCH_EDIT_FRAME::OnSimulate(), DIALOG_EDIT_ONE_FIELD::OnTextValueSelectButtonClick(), FOOTPRINT_EDIT_FRAME::OnUpdateInsertModuleInBoard(), FOOTPRINT_EDIT_FRAME::OnUpdateLoadModuleFromBoard(), SCH_EDIT_FRAME::OnUpdatePCB(), PCB_EDIT_FRAME::OnUpdatePCBFromSch(), FOOTPRINT_EDIT_FRAME::OnUpdateReplaceModuleInBoard(), FOOTPRINT_EDIT_FRAME::Process_Special_Functions(), PCB_EDIT_FRAME::Process_Special_Functions(), ProcessEvent(), FOOTPRINT_EDIT_FRAME::ProcessPreferences(), KICAD_MANAGER_FRAME::RunEeschema(), KICAD_MANAGER_FRAME::RunPcbNew(), SCH_BASE_FRAME::SelectComponentFromLibBrowser(), PCB_BASE_FRAME::SelectFootprintFromLibBrowser(), FOOTPRINT_EDIT_FRAME::SetPlotSettings(), DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::showButtonHandler(), DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::showButtonHandler(), FOOTPRINT_SELECT_WIDGET::ShowPicker(), SIM_PLOT_FRAME::SIM_PLOT_FRAME(), and DIALOG_EXCHANGE_MODULE::ViewAndSelectFootprint().

303 {
304  // Since this will be called from python, cannot assume that code will
305  // not pass a bad aFrameType.
306  if( unsigned( aFrameType ) >= KIWAY_PLAYER_COUNT )
307  {
308  // @todo : throw an exception here for python's benefit, at least that
309  // way it gets some explanatory text.
310 
311  wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFrameType" ) );
312  return NULL;
313  }
314 
315  // return the previously opened window
316  KIWAY_PLAYER* frame = GetPlayerFrame( aFrameType );
317 
318  if( frame )
319  return frame;
320 
321  if( doCreate )
322  {
323  FACE_T face_type = KifaceType( aFrameType );
324  wxASSERT( face_type != FACE_T(-1) );
325 
326  KIFACE* kiface = KiFACE( face_type );
327  wxASSERT( kiface );
328 
329  if( kiface )
330  {
331  frame = (KIWAY_PLAYER*) kiface->CreateWindow(
332  aParent, // Parent window of frame, NULL in non modal mode
333  aFrameType,
334  this,
335  m_ctl // questionable need, these same flags where passed to the KIFACE::OnKifaceStart()
336  );
337  wxASSERT( frame );
338 
339  m_playerFrameName[aFrameType] = frame->GetName();
340 
341  return frame;
342  }
343  }
344 
345  return NULL;
346 }
Class KIWAY_PLAYER is a wxFrame capable of the OpenProjectFiles function, meaning it can load a porti...
Definition: kiway_player.h:111
static FACE_T KifaceType(FRAME_T aFrameType)
Function KifaceType is a simple mapping function which returns the FACE_T which is known to implement...
Definition: kiway.cpp:252
KIWAY_PLAYER * GetPlayerFrame(FRAME_T aFrameType)
Definition: kiway.cpp:293
VTBL_ENTRY wxWindow * CreateWindow(wxWindow *aParent, int aClassId, KIWAY *aKIWAY, int aCtlBits=0)=0
Function CreateWindow creates a wxWindow for the current project.
int m_ctl
Definition: kiway.h:414
VTBL_ENTRY KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Function KiFACE returns the KIFACE* given a FACE_T.
Definition: kiway.cpp:150
FACE_T
Known KIFACE implementations.
Definition: kiway.h:263
Class KIFACE is used by a participant in the KIWAY alchemy.
Definition: kiway.h:150
wxArrayString m_playerFrameName
Definition: kiway.h:424
return & kiface
Definition: pcbnew.cpp:197
bool KIWAY::PlayerClose ( FRAME_T  aFrameType,
bool  doForce 
)

Function PlayerClose calls the KIWAY_PLAYER::Close( bool force ) function on the window and if not vetoed, returns true, else false.

If window actually closes, then this KIWAY marks it as not opened internally.

Returns
bool - true the window is closed and not vetoed, else false.

Definition at line 349 of file kiway.cpp.

References GetPlayerFrame(), and KIWAY_PLAYER_COUNT.

Referenced by PlayersClose().

350 {
351  // Since this will be called from python, cannot assume that code will
352  // not pass a bad aFrameType.
353  if( unsigned( aFrameType ) >= KIWAY_PLAYER_COUNT )
354  {
355  // @todo : throw an exception here for python's benefit, at least that
356  // way it gets some explanatory text.
357 
358  wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFrameType" ) );
359  return false;
360  }
361 
362  KIWAY_PLAYER* frame = GetPlayerFrame( aFrameType );
363 
364  if( frame == NULL ) // Already closed
365  return true;
366 
367  if( frame->Close( doForce ) )
368  return true;
369 
370  return false;
371 }
Class KIWAY_PLAYER is a wxFrame capable of the OpenProjectFiles function, meaning it can load a porti...
Definition: kiway_player.h:111
KIWAY_PLAYER * GetPlayerFrame(FRAME_T aFrameType)
Definition: kiway.cpp:293
bool KIWAY::PlayersClose ( bool  doForce)

Function PlayersClose calls the KIWAY_PLAYER::Close( bool force ) function on all the windows and if none are vetoed, returns true, else false.

If any window actually closes, then this KIWAY marks it as not opened internally.

Returns
bool - true indicates that all windows closed because none were vetoed, false means at least one cast a veto. Any that cast a veto are still open.

Definition at line 374 of file kiway.cpp.

References KIWAY_PLAYER_COUNT, and PlayerClose().

Referenced by KICAD_MANAGER_FRAME::LoadProject(), and KICAD_MANAGER_FRAME::OnCloseWindow().

375 {
376  bool ret = true;
377 
378  for( unsigned i=0; i < KIWAY_PLAYER_COUNT; ++i )
379  {
380  ret = ret && PlayerClose( FRAME_T( i ), doForce );
381  }
382 
383  return ret;
384 }
FRAME_T
Enum FRAME_T is the set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:34
VTBL_ENTRY bool PlayerClose(FRAME_T aFrameType, bool doForce)
Function PlayerClose calls the KIWAY_PLAYER::Close( bool force ) function on the window and if not ve...
Definition: kiway.cpp:349
PROJECT & KIWAY::Prj ( ) const

Function Prj returns the PROJECT associated with this KIWAY.

This is here as an accessor, so that there is freedom to put the actual PROJECT storage in a place decided by the implementation, and not known to the caller.

Definition at line 144 of file kiway.cpp.

References m_project.

Referenced by SCH_LEGACY_PLUGIN::Format(), KIWAY_HOLDER::Prj(), and Prj().

145 {
146  return *(PROJECT*) &m_project; // strip const-ness, function really is const.
147 }
Class PROJECT holds project specific data.
Definition: project.h:56
PROJECT m_project
Definition: kiway.h:426
bool KIWAY::ProcessEvent ( wxEvent &  aEvent)
override

Definition at line 459 of file kiway.cpp.

References KIWAY_EXPRESS::Dest(), KIWAY_PLAYER::KiwayMailIn(), Player(), and EDA_BASE_FRAME::ProcessEvent().

Referenced by ExpressMail().

460 {
461  KIWAY_EXPRESS* mail = dynamic_cast<KIWAY_EXPRESS*>( &aEvent );
462 
463  if( mail )
464  {
465  FRAME_T dest = mail->Dest();
466 
467  // see if recipient is alive
468  KIWAY_PLAYER* alive = Player( dest, false );
469 
470  if( alive )
471  {
472 #if 1
473  return alive->ProcessEvent( aEvent );
474 #else
475  alive->KiwayMailIn( *mail );
476  return true;
477 #endif
478  }
479  }
480 
481  return false;
482 }
Class KIWAY_PLAYER is a wxFrame capable of the OpenProjectFiles function, meaning it can load a porti...
Definition: kiway_player.h:111
Class KIWAY_EXPRESS carries a payload from one KIWAY_PLAYER to another within a PROJECT.
Definition: kiway_express.h:39
FRAME_T
Enum FRAME_T is the set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:34
VTBL_ENTRY KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, KIWAY_PLAYER *aParent=NULL)
Function Player returns the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:302
virtual void KiwayMailIn(KIWAY_EXPRESS &aEvent)
Function KiwayMailIn receives KIWAY_EXPRESS messages from other players.
FRAME_T Dest()
Function Dest returns the destination player id of the message.
Definition: kiway_express.h:46
bool ProcessEvent(wxEvent &aEvent) override
Function ProcessEvent overrides the default process event handler to implement the auto save feature...
Definition: basicframe.cpp:166
bool KIWAY::set_kiface ( FACE_T  aFaceType,
KIFACE aKiface 
)
inlineprivate

Definition at line 394 of file kiway.h.

References KIWAY_FACE_COUNT, and m_kiface.

Referenced by PGM_SINGLE_TOP::OnPgmInit().

395  {
396  if( unsigned( aFaceType ) < unsigned( KIWAY_FACE_COUNT ) )
397  {
398  m_kiface[aFaceType] = aKiface;
399  return true;
400  }
401  return false;
402  }
static KIFACE * m_kiface[KIWAY_FACE_COUNT]
Definition: kiway.h:410
void KIWAY::SetLanguage ( int  aLanguage)

Function SetLanguage changes the language and then calls ShowChangedLanguage() on all KIWAY_PLAYERs.

Definition at line 396 of file kiway.cpp.

References GetPlayerFrame(), KFCTL_CPP_PROJECT_SUITE, KIWAY_PLAYER_COUNT, m_ctl, m_top, Pgm(), PGM_BASE::SetLanguage(), PGM_BASE::SetLanguageIdentifier(), and EDA_BASE_FRAME::ShowChangedLanguage().

Referenced by KIWAY_PLAYER::language_change(), and KICAD_MANAGER_FRAME::language_change().

397 {
398  Pgm().SetLanguageIdentifier( aLanguage );
399  Pgm().SetLanguage();
400 
401 #if 1
402  // This is a risky hack that goes away if we allow the language to be
403  // set only from the top most frame if !Kiface.IsSingle()
404 
405  // Only for the C++ project manager, and not for the python one and not for
406  // single_top do we look for the EDA_BASE_FRAME as the top level window.
407  // For single_top this is not needed because that window is registered in
408  // the array below.
410  {
411  // A dynamic_cast could be better, but creates link issues
412  // (some basic_frame functions not found) on some platforms,
413  // so a static_cast is used.
414  EDA_BASE_FRAME* top = static_cast<EDA_BASE_FRAME*>( m_top );
415 
416  if( top )
417  top->ShowChangedLanguage();
418  }
419 #endif
420 
421  for( unsigned i=0; i < KIWAY_PLAYER_COUNT; ++i )
422  {
423  KIWAY_PLAYER* frame = GetPlayerFrame( ( FRAME_T )i );
424 
425  if( frame )
426  {
427  frame->ShowChangedLanguage();
428  }
429  }
430 }
#define KFCTL_CPP_PROJECT_SUITE
Am running under C++ project mgr, possibly with others.
Definition: kiway.h:159
Class KIWAY_PLAYER is a wxFrame capable of the OpenProjectFiles function, meaning it can load a porti...
Definition: kiway_player.h:111
KIWAY_PLAYER * GetPlayerFrame(FRAME_T aFrameType)
Definition: kiway.cpp:293
FRAME_T
Enum FRAME_T is the set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:34
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: kicad.cpp:65
VTBL_ENTRY void SetLanguageIdentifier(int menu_id)
Function SetLanguageIdentifier sets in .m_language_id member the wxWidgets language identifier Id fro...
Definition: pgm_base.cpp:773
int m_ctl
Definition: kiway.h:414
VTBL_ENTRY bool SetLanguage(bool first_time=false)
Function SetLanguage sets the dictionary file name for internationalization.
Definition: pgm_base.cpp:681
Class EDA_BASE_FRAME is the base frame for deriving all KiCad main window classes.
Definition: wxstruct.h:117
wxFrame * m_top
Definition: kiway.h:416
virtual void ShowChangedLanguage()
Function ShowChangedLanguage redraws the menus and what not in current language.
Definition: basicframe.cpp:242
void KIWAY::SetTop ( wxFrame *  aTop)

Function SetTop tells this KIWAY about the top most frame in the program and optionally allows it to play the role of one of the KIWAY_PLAYERs if launched from single_top.cpp.

Parameters
aTopis the top most wxFrame in the entire program.

Definition at line 78 of file kiway.cpp.

References m_top.

Referenced by KIWAY(), PGM_KICAD::OnPgmInit(), and PGM_SINGLE_TOP::OnPgmInit().

79 {
80 #if 0
81  if( m_top )
82  {
83  m_top->Disconnect( wxEVT_DESTROY, wxWindowDestroyEventHandler( KIWAY::player_destroy_handler ), NULL, this );
84  }
85 
86  if( aTop )
87  {
88  aTop->Connect( wxEVT_DESTROY, wxWindowDestroyEventHandler( KIWAY::player_destroy_handler ), NULL, this );
89  }
90 #endif
91 
92  m_top = aTop;
93 }
wxFrame * m_top
Definition: kiway.h:416
void KIWAY::ShowChangedIcons ( )

Function ShowChangedIcons Calls ShowChangedIcons() on all KIWAY_PLAYERs.

Used after changing options related to icons in menus and toolbars (like enable/disable icons in menus)

Definition at line 432 of file kiway.cpp.

References GetPlayerFrame(), KFCTL_CPP_PROJECT_SUITE, KIWAY_PLAYER_COUNT, m_ctl, m_top, and EDA_BASE_FRAME::ShowChangedIcons().

Referenced by KICAD_MANAGER_FRAME::OnChangeIconsOptions(), and KIWAY_PLAYER::OnChangeIconsOptions().

433 {
434 #if 1
436  {
437  // A dynamic_cast could be better, but creates link issues
438  // (some basic_frame functions not found) on some platforms,
439  // so a static_cast is used.
440  EDA_BASE_FRAME* top = static_cast<EDA_BASE_FRAME*>( m_top );
441 
442  if( top )
443  top->ShowChangedIcons();
444  }
445 #endif
446 
447  for( unsigned i=0; i < KIWAY_PLAYER_COUNT; ++i )
448  {
449  KIWAY_PLAYER* frame = GetPlayerFrame( ( FRAME_T )i );
450 
451  if( frame )
452  {
453  frame->ShowChangedIcons();
454  }
455  }
456 }
#define KFCTL_CPP_PROJECT_SUITE
Am running under C++ project mgr, possibly with others.
Definition: kiway.h:159
Class KIWAY_PLAYER is a wxFrame capable of the OpenProjectFiles function, meaning it can load a porti...
Definition: kiway_player.h:111
KIWAY_PLAYER * GetPlayerFrame(FRAME_T aFrameType)
Definition: kiway.cpp:293
virtual void ShowChangedIcons()
Function ShowChangedIcons redraws items menus after a icon was changed option.
Definition: basicframe.cpp:249
FRAME_T
Enum FRAME_T is the set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:34
int m_ctl
Definition: kiway.h:414
Class EDA_BASE_FRAME is the base frame for deriving all KiCad main window classes.
Definition: wxstruct.h:117
wxFrame * m_top
Definition: kiway.h:416

Friends And Related Function Documentation

friend struct PGM_SINGLE_TOP
friend

Definition at line 259 of file kiway.h.

Member Data Documentation

int KIWAY::m_ctl
private

Definition at line 414 of file kiway.h.

Referenced by dso_search_path(), KiFACE(), Player(), SetLanguage(), and ShowChangedIcons().

KIFACE * KIWAY::m_kiface
staticprivate

Definition at line 410 of file kiway.h.

Referenced by KiFACE(), OnKiwayEnd(), and set_kiface().

int KIWAY::m_kiface_version
staticprivate

Definition at line 411 of file kiway.h.

Referenced by KiFACE().

wxArrayString KIWAY::m_playerFrameName
private

Definition at line 424 of file kiway.h.

Referenced by GetPlayerFrame(), KIWAY(), and Player().

PGM_BASE* KIWAY::m_program
private

Definition at line 413 of file kiway.h.

Referenced by KiFACE().

PROJECT KIWAY::m_project
private

Definition at line 426 of file kiway.h.

Referenced by Prj().

wxFrame* KIWAY::m_top
private

Definition at line 416 of file kiway.h.

Referenced by SetLanguage(), SetTop(), and ShowChangedIcons().


The documentation for this class was generated from the following files: