1 //**************************************************************************************************
2 // PnlAnaBase.cpp *
3 // ---------------- *
4 // Started : 2004-04-26 *
5 // Last Update : 2015-03-29 *
6 // Copyright : (C) 2004 by MSWaters *
7 //**************************************************************************************************
8
9 //**************************************************************************************************
10 // *
11 // This program is free software; you can redistribute it and/or modify it under the *
12 // terms of the GNU General Public License as published by the Free Software Foundation; *
13 // either version 3 of the License, or (at your option) any later version. *
14 // *
15 //**************************************************************************************************
16
17 #include "PnlAnaBase.hpp"
18
19 //**************************************************************************************************
20 // Allocate storage for static data members.
21
22 Component PnlAnaBase::m_oCpntSwpSrc;
23
24 //**************************************************************************************************
25 // Implement an event table.
26
wxBEGIN_EVENT_TABLE(PnlAnaBase,wxPanel)27 wxBEGIN_EVENT_TABLE( PnlAnaBase, wxPanel )
28
29 EVT_CHOICE( PnlAnaBase::ID_CHO_SRCNAME, PnlAnaBase::OnSrcName )
30
31 wxEND_EVENT_TABLE( )
32
33 //**************************************************************************************************
34 // Constructor.
35 //
36 // Argument List :
37 // poWin - A pointer to the parent window
38
39 PnlAnaBase::PnlAnaBase( wxWindow * poWin ) : wxPanel( poWin )
40 {
41 m_eAnaType = eCMD_NONE;
42
43 bClear( );
44 }
45
46 //**************************************************************************************************
47 // Destructor.
48
~PnlAnaBase()49 PnlAnaBase::~PnlAnaBase( )
50 {
51 }
52
53 //**************************************************************************************************
54 // Clear the object attributes back to it's initial state.
55 //
56 // Return Values :
57 // true - Success
58 // false - Failure
59
bClear(void)60 bool PnlAnaBase::bClear( void )
61 {
62 m_osErrMsg.Empty( ); // Clear the error string
63
64 return( true );
65 }
66
67 //**************************************************************************************************
68 // Create the basic display objects.
69
CreateBase(void)70 void PnlAnaBase::CreateBase( void )
71 {
72 wxPanel * poPnl;
73
74 // Create the sweep panel and controls
75 #ifdef LAYOUT_MNGR
76 poPnl = new wxPanel( this );
77 #else
78 poPnl = this;
79 #endif // LAYOUT_MNGR
80
81 // Create and add sweep parameter labels
82 #ifdef LAYOUT_MNGR
83 m_oPnlStart.bCreate( poPnl, ID_PNL_START, 120 );
84 m_oPnlStop .bCreate( poPnl, ID_PNL_STOP, 120 );
85 m_oPnlStep .bCreate( poPnl, ID_PNL_STEP, 120 );
86 #else
87 m_oSbxSwpPars.Create( poPnl, ID_UNUSED, wxT(" Sweep Parameters "), wxPoint( 6, 5 ),
88 wxSize( 330, 167 ) );
89 m_oPnlStart.bCreate( poPnl, ID_PNL_START, 123, 95, 82, wxPoint( 22, 26 ) );
90 m_oPnlStop .bCreate( poPnl, ID_PNL_STOP, 123, 95, 82, wxPoint( 22, 56 ) );
91 m_oPnlStep .bCreate( poPnl, ID_PNL_STEP, 123, 95, 82, wxPoint( 22, 86 ) );
92 #endif // LAYOUT_MNGR
93
94 m_oPnlStart.bSetName( wxT("Start Value") );
95 m_oPnlStop .bSetName( wxT("Stop Value") );
96 m_oPnlStep .bSetName( wxT("Step Increment") );
97 m_oSbxSwpPars.SetOwnFont( FONT_SLANT );
98
99 // Create the parameter (probe) panel and controls
100 #ifdef LAYOUT_MNGR
101 poPnl = new wxPanel( this );
102 #else
103 poPnl = this;
104 #endif // LAYOUT_MNGR
105
106 // Create and add simulation parameter check boxes
107 #ifdef LAYOUT_MNGR
108 m_oCbxVoltage .Create( poPnl, ID_CBX_VOLT, wxT("Voltage") );
109 m_oCbxCurrent .Create( poPnl, ID_CBX_CURR, wxT("Current") );
110 m_oCbxPower .Create( poPnl, ID_CBX_PWR, wxT("Power") );
111 m_oCbxResist .Create( poPnl, ID_CBX_RES, wxT("Resistance") );
112 #else
113 m_oSbxCalcPars.Create( poPnl, ID_UNUSED , wxT(" Parameters "), wxPoint( 343, 5 ),
114 wxSize( 105, 122 ) );
115 m_oCbxVoltage .Create( poPnl, ID_CBX_VOLT, wxT("Voltage"), wxPoint( 349, 25 ) );
116 m_oCbxCurrent .Create( poPnl, ID_CBX_CURR, wxT("Current"), wxPoint( 349, 50 ) );
117 m_oCbxPower .Create( poPnl, ID_CBX_PWR, wxT("Power"), wxPoint( 349, 75 ) );
118 m_oCbxResist .Create( poPnl, ID_CBX_RES, wxT("Resistance"), wxPoint( 349, 100 ) );
119 #endif // LAYOUT_MNGR
120 m_oSbxCalcPars.SetOwnFont( FONT_SLANT );
121
122 // Create and add .OPTIONS configuration dialog button
123 #ifdef LAYOUT_MNGR
124 m_oBtnOPTIONS.Create( this, ID_BTN_OPTIONS, wxT(".OPTIONS ...") );
125 #else
126 m_oBtnOPTIONS.Create( this, ID_BTN_OPTIONS, wxT(".OPTIONS ..."), wxPoint( 343, 135 ),
127 wxSize( 105, -1 ) );
128 #endif // LAYOUT_MNGR
129 }
130
131 //**************************************************************************************************
132 // Create the scale display objects.
133
CreateScale(void)134 void PnlAnaBase::CreateScale( void )
135 {
136 wxPanel * poPnl;
137 wxString osScale[]={ wxT("Lin "), wxT("Log "), wxT("Dec "), wxT("Oct ") };
138
139 // Create and add the scale radio buttons
140 poPnl = (wxPanel *) m_oPnlStart.GetParent( );
141 m_oRbxSweep.Create( poPnl, ID_RBX_SCALE, wxT(" Step Scale "), wxPoint( 13, 123 ),
142 wxSize( -1, 41 ), 4, osScale, 4 );
143 m_oRbxSweep.SetSelection( eSCALE_LIN );
144 }
145
146 //**************************************************************************************************
147 // Create the initial conditions display objects.
148
CreateInitC(void)149 void PnlAnaBase::CreateInitC( void )
150 {
151 wxPanel * poPnl;
152 wxString osInitC[]={ wxT("Warm "), wxT("Use ICs"), wxT("Cold ") };
153
154 // Create and add the initial conditions radio buttons
155 poPnl = (wxPanel *) m_oPnlStart.GetParent( );
156 m_oRbxSweep.Create( poPnl, ID_UNUSED, wxT(" Initial Conditions "), wxPoint( 13, 123 ),
157 wxSize( -1, 41 ), 3, osInitC, 3 );
158 m_oRbxSweep.SetSelection( eINITC_WARM );
159 }
160
161 //**************************************************************************************************
162 // Create the source component display objects.
163
CreateSigSrc(void)164 void PnlAnaBase::CreateSigSrc( void )
165 {
166 wxPanel * poPnl;
167
168 // Create the input source panel and controls
169 #ifdef LAYOUT_MNGR
170 poPnl = new wxPanel( this );
171 #else
172 poPnl = this;
173 #endif // LAYOUT_MNGR
174
175 // Create and add input source
176 #ifdef LAYOUT_MNGR
177 m_oChoSrcName.Create( poPnl, ID_CHO_SRCNAME );
178 m_oPnlSrcLvl.bCreate( poPnl, ID_PNL_SRCLVL );
179 #else
180 m_oSbxSigSrc .Create( poPnl, ID_UNUSED, wxT(" Signal Source "), wxPoint( 6, 178 ),
181 wxSize( 330, 60 ) );
182 m_oChoSrcName.Create( poPnl, ID_CHO_SRCNAME, wxPoint( 18, 200 ),
183 wxSize( 121, GUI_CTRL_HT ) );
184 m_oPnlSrcLvl.bCreate( poPnl, ID_PNL_SRCLVL, -1, 95, 82, wxPoint( 142, 200 ) );
185 #endif // LAYOUT_MNGR
186
187 // Set static box font
188 m_oSbxSigSrc.SetOwnFont( FONT_SLANT );
189 }
190
191 //**************************************************************************************************
192 // Create the simulation parameter complex part display objects.
193
CreateCpxPrt(void)194 void PnlAnaBase::CreateCpxPrt( void )
195 {
196 wxPanel * poPnl;
197
198 // Create the parameter (probe) complex part panel and controls
199 #ifdef LAYOUT_MNGR
200 poPnl = new wxPanel( this );
201 #else
202 poPnl = this;
203 #endif // LAYOUT_MNGR
204
205 // Create and add simulation parameter complex part check boxes
206 #ifdef LAYOUT_MNGR
207 m_oCbxMag .Create( poPnl, ID_CBX_MAG , wxT("Magnitude") );
208 m_oCbxPhase .Create( poPnl, ID_CBX_PHASE, wxT("Phase") );
209 m_oCbxReal .Create( poPnl, ID_CBX_REAL , wxT("Real Part") );
210 m_oCbxImag .Create( poPnl, ID_CBX_IMAG , wxT("Imag. Part") );
211 m_oCbxMagDb .Create( poPnl, ID_CBX_MAGDB, wxT("Mag. in dB") );
212 #else
213 m_oSbxCpxPrt.Create( poPnl, ID_UNUSED, wxT(" Complex Parts "), wxPoint( 455, 5 ),
214 wxSize( 110, 146 ) );
215 m_oCbxMag .Create( poPnl, ID_CBX_MAG, wxT("Magnitude"), wxPoint( 461, 24 ) );
216 m_oCbxPhase .Create( poPnl, ID_CBX_PHASE, wxT("Phase"), wxPoint( 461, 49 ) );
217 m_oCbxReal .Create( poPnl, ID_CBX_REAL, wxT("Real Part"), wxPoint( 461, 74 ) );
218 m_oCbxImag .Create( poPnl, ID_CBX_IMAG, wxT("Imag. Part"), wxPoint( 461, 99 ) );
219 m_oCbxMagDb .Create( poPnl, ID_CBX_MAGDB, wxT("Mag. in dB"), wxPoint( 461, 124 ) );
220 #endif // LAYOUT_MNGR
221
222 // Set static box font
223 m_oSbxCpxPrt.SetOwnFont( FONT_SLANT );
224 }
225
226 //**************************************************************************************************
227 // Create the analysis temperature display objects.
228
CreateTemp(void)229 void PnlAnaBase::CreateTemp( void )
230 {
231 wxPanel * poPnl;
232
233 // Create the temperature panel and controls
234 #ifdef LAYOUT_MNGR
235 poPnl = new wxPanel( this );
236 #else
237 poPnl = this;
238 #endif // LAYOUT_MNGR
239
240 // Create and add analysis temperature
241 #ifdef LAYOUT_MNGR
242 m_oPnlTemp.bCreate( poPnl, ID_PNL_TEMP );
243 #else
244 m_oSbxTemp. Create( poPnl, ID_UNUSED, wxT(" Temperature "), wxPoint( 343, 178 ),
245 wxSize( 156, 60 ) );
246 m_oPnlTemp.bCreate( poPnl, ID_PNL_TEMP, 0, 95, 40, wxPoint( 353, 200 ) );
247 #endif // LAYOUT_MNGR
248
249 // Set static box font
250 m_oSbxTemp.SetOwnFont( FONT_SLANT );
251
252 // Set PnlValue parameters
253 m_oPnlTemp.bShowUnits( PnlValue::eSHOW_LBL );
254 m_oPnlTemp.bSetUnitsType( eUNITS_TMPC );
255 m_oPnlTemp.Layout( );
256 }
257
258 //**************************************************************************************************
259 // Layout the panel display objects.
260
DoLayout(void)261 void PnlAnaBase::DoLayout( void )
262 {
263 #ifndef LAYOUT_MNGR
264 return;
265 #endif
266
267 wxWindow * poWin;
268 wxSizer * poSzr;
269 wxGridBagSizer * poSzrGB;
270 wxSizerFlags oFlags;
271 wxGBPosition oGBPosn;
272 wxGBSpan oGBSpan;
273 int iFlags;
274 int iBorder;
275
276 //---------------------------------------------------------------------------
277 // Create and set the sizer for the sweep panel
278 poWin = m_oPnlStart.GetParent( );
279 poSzr = new wxStaticBoxSizer( wxVERTICAL, poWin, wxT(" Sweep Parameters ") );
280 poWin->SetSizer( poSzr );
281
282 // Layout the sweep panel
283 oFlags.Align( wxALIGN_LEFT );
284 oFlags.Border( wxALL & ~wxBOTTOM, 3 );
285 poSzr->Add( &m_oPnlStart, oFlags );
286 poSzr->Add( &m_oPnlStop , oFlags );
287 poSzr->Add( &m_oPnlStep , oFlags );
288 poSzr->AddSpacer( 3 );
289 poSzr->Add( &m_oRbxSweep, oFlags );
290
291 //---------------------------------------------------------------------------
292 // If required create the signal source panel
293 poWin = m_oChoSrcName.GetParent( );
294 if( poWin != NULL )
295 {
296 // Create and set the sizer for the signal source panel
297 poSzr = new wxStaticBoxSizer( wxHORIZONTAL, poWin, wxT(" Signal Source ") );
298 poWin->SetSizer( poSzr );
299
300 // Layout the signal source panel
301 oFlags.Align( wxALIGN_LEFT );
302 oFlags.Border( wxALL, 3 );
303 poSzr->Add( &m_oChoSrcName, oFlags );
304 poSzr->Add( &m_oPnlSrcLvl , oFlags );
305 }
306
307 //---------------------------------------------------------------------------
308 // Create and set the sizer for the parameter (probe) panel
309 poWin = m_oCbxVoltage.GetParent( );
310 poSzr = new wxStaticBoxSizer( wxVERTICAL, poWin, wxT(" Parameters ") );
311 poWin->SetSizer( poSzr );
312
313 // Layout the parameter (probe) panel
314 oFlags.Align( wxALIGN_LEFT );
315 oFlags.Border( wxALL & ~wxBOTTOM, 3 );
316 poSzr->Add( &m_oCbxVoltage, oFlags );
317 poSzr->Add( &m_oCbxCurrent, oFlags );
318 poSzr->Add( &m_oCbxPower , oFlags );
319 poSzr->Add( &m_oCbxResist , oFlags );
320 poSzr->AddSpacer( 3 );
321
322 //---------------------------------------------------------------------------
323 // If required create the complex parts panel
324 poWin = m_oCbxMag.GetParent( );
325 if( poWin != NULL )
326 {
327 // Create and set the sizer for the complex part panel
328 poSzr = new wxStaticBoxSizer( wxVERTICAL, poWin, wxT(" Complex Parts ") );
329 poWin->SetSizer( poSzr );
330
331 // Layout the complex part panel
332 oFlags.Align( wxALIGN_LEFT );
333 oFlags.Border( wxALL & ~wxBOTTOM, 3 );
334 poSzr->Add( &m_oCbxMag , oFlags );
335 poSzr->Add( &m_oCbxPhase, oFlags );
336 poSzr->Add( &m_oCbxReal , oFlags );
337 poSzr->Add( &m_oCbxImag , oFlags );
338 poSzr->Add( &m_oCbxMagDb, oFlags );
339 poSzr->AddSpacer( 3 );
340 }
341
342 //---------------------------------------------------------------------------
343 // If required create the analysis temperature panel
344 poWin = m_oPnlTemp.GetParent( );
345 if( poWin != NULL )
346 {
347 // Create and set the sizer for the analysis temperature panel
348 poSzr = new wxStaticBoxSizer( wxVERTICAL, poWin, wxT(" Temperature ") );
349 poWin->SetSizer( poSzr );
350
351 // Layout the complex part panel
352 oFlags.Align( wxALIGN_LEFT );
353 oFlags.Border( wxALL, 3 );
354 poSzr->Add( &m_oPnlTemp, oFlags );
355 }
356
357 //---------------------------------------------------------------------------
358 // Create and set the underlying panel's sizer
359 poSzrGB = new wxGridBagSizer( 1, 1 );
360 SetSizer( poSzrGB );
361
362 // Add the sweep panel
363 poWin = m_oPnlStart.GetParent( );
364 oGBPosn.SetCol( 0 ); oGBPosn.SetRow( 0 );
365 oGBSpan.SetColspan( 3 ); oGBSpan.SetRowspan( 4 );
366 iFlags = wxALL | wxALIGN_CENTER;
367 iBorder = 5;
368 poSzrGB->Add( poWin, oGBPosn, oGBSpan, iFlags, iBorder );
369
370 poWin = m_oChoSrcName.GetParent( );
371 if( poWin != NULL )
372 {
373 // Add the signal source panel
374 oGBPosn.SetCol( 0 ); oGBPosn.SetRow( 4 );
375 oGBSpan.SetColspan( 3 ); oGBSpan.SetRowspan( 1 );
376 iFlags = wxALL | wxALIGN_LEFT;
377 poSzrGB->Add( poWin, oGBPosn, oGBSpan, iFlags, iBorder );
378 }
379
380 // Add the parameter (probe) panel
381 poWin = m_oCbxVoltage.GetParent( );
382 oGBPosn.SetCol( 3 ); oGBPosn.SetRow( 0 );
383 oGBSpan.SetColspan( 1 ); oGBSpan.SetRowspan( 3 );
384 poSzrGB->Add( poWin, oGBPosn, oGBSpan, iFlags, iBorder );
385
386 // Add the options button
387 oGBPosn.SetCol( 3 ); oGBPosn.SetRow( 3 );
388 oGBSpan.SetColspan( 1 ); oGBSpan.SetRowspan( 1 );
389 iFlags = wxALL | wxALIGN_CENTER;
390 poSzrGB->Add( &m_oBtnOPTIONS, oGBPosn, oGBSpan, iFlags, iBorder );
391
392 poWin = m_oCbxMag.GetParent( );
393 if( poWin != NULL )
394 {
395 // Add the complex parts panel
396 oGBPosn.SetCol( 4 ); oGBPosn.SetRow( 0 );
397 oGBSpan.SetColspan( 1 ); oGBSpan.SetRowspan( 4 );
398 poSzrGB->Add( poWin, oGBPosn, oGBSpan, iFlags, iBorder );
399 }
400
401 poWin = m_oPnlTemp.GetParent( );
402 if( poWin != NULL )
403 {
404 // Add the temperature panel
405 oGBPosn.SetCol( 3 ); oGBPosn.SetRow( 4 );
406 oGBSpan.SetColspan( 2 ); oGBSpan.SetRowspan( 1 );
407 poSzrGB->Add( poWin, oGBPosn, oGBSpan, iFlags, iBorder );
408 }
409 }
410
411 //**************************************************************************************************
412 // Set the state of the step scale radio box.
413 //
414 // Argument List :
415 // eScale - The enumerated scale specifier
416 //
417 // Return Values :
418 // Success - true
419 // Failure - false
420
bSetScale(eTypeScale eScale)421 bool PnlAnaBase::bSetScale( eTypeScale eScale )
422 {
423 if( eScale<eSCALE_FST || eScale>eSCALE_LST ) return( false );
424 #if wxCHECK_VERSION( 2,8,0 )
425 if( m_oRbxSweep.GetCount( ) < (uint) eScale + 1 ) return( false );
426 #else
427 if( m_oRbxSweep.GetCount( ) < (int) eScale + 1 ) return( false );
428 #endif
429
430 m_oRbxSweep.SetSelection( (int) eScale );
431
432 InitScale( );
433
434 return( true );
435 }
436
437 //**************************************************************************************************
438 // Set the state of the initial conditions radio box.
439 //
440 // Argument List :
441 // eInitC - The enumerated initial conditions specifier
442 //
443 // Return Values :
444 // Success - true
445 // Failure - false
446
bSetInitC(eTypeInitC eInitC)447 bool PnlAnaBase::bSetInitC( eTypeInitC eInitC )
448 {
449 if( eInitC<eINITC_FST || eInitC>eINITC_LST ) return( false );
450 #if wxCHECK_VERSION( 2,8,0 )
451 if( m_oRbxSweep.GetCount( ) < (uint) eInitC + 1 ) return( false );
452 #else
453 if( m_oRbxSweep.GetCount( ) < (int) eInitC + 1 ) return( false );
454 #endif
455
456 m_oRbxSweep.SetSelection( (int) eInitC );
457
458 return( true );
459 }
460
461 //**************************************************************************************************
462 // Load the source choice box with the components names which may be chosen as
463 // a source.
464 //
465 // Argument List :
466 // roSimn - A reference to an array on Component objects
467 // osPrefix - A string containing the first letter of the desired components
468
LoadSrcNames(ArrayComponent & roaCpnts,wxString osPrefixes)469 void PnlAnaBase::LoadSrcNames( ArrayComponent & roaCpnts, wxString osPrefixes )
470 {
471 wxArrayString oasSrcs;
472 wxString osTmpSrc;
473 wxString os1;
474 wxChar oc1;
475 uint ui1;
476
477 // Temporarily record the current selection
478 osTmpSrc = m_oChoSrcName.GetStringSelection( );
479
480 // Clear the signal source choice box
481 m_oChoSrcName.Clear( );
482 m_oChoSrcName.Append( wxT("None") );
483
484 // Load selected components into string array, sort and put them in the signal source choice box
485 for( ui1=0; ui1<roaCpnts.GetCount( ); ui1++ )
486 {
487 os1 = roaCpnts.Item( ui1 ).rosGetName( );
488 if( os1.IsEmpty( ) ) continue;
489
490 oc1 = os1.GetChar( 0 );
491 if( osPrefixes.Find( oc1 ) == wxNOT_FOUND ) continue;
492
493 oasSrcs.Add( os1 ); // Add the component label to the the string array
494 m_oaCpntSrcs.Add( roaCpnts.Item( ui1 ) ); // Add the component to the source component array
495 }
496 oasSrcs.Sort( iStrCmpSrc );
497 m_oChoSrcName.Append( oasSrcs );
498
499 // Restore the original selection if possible
500 if( ! m_oChoSrcName.SetStringSelection( osTmpSrc ) )
501 m_oChoSrcName.SetStringSelection( wxT("None") );
502 }
503
504 //**************************************************************************************************
505 // Set the source component.
506 //
507 // Argument List :
508 // roCpnt - A component object
509 //
510 // Return Values :
511 // true - Success
512 // false - Failure
513
bSetSrcCpnt(Component & roCpnt)514 bool PnlAnaBase::bSetSrcCpnt( Component & roCpnt )
515 {
516 // If the components isn't valid set default values
517 if( ! roCpnt.bIsValid( ) )
518 {
519 m_oChoSrcName.SetStringSelection( wxT("None") );
520 if( m_oPnlSrcLvl.GetParent( ) != NULL )
521 {
522 m_oPnlSrcLvl.bSetUnitsType( eUNITS_NONE );
523 m_oPnlSrcLvl.bSetValue( (float) 0.0 );
524 }
525 return( false );
526 }
527
528 // Set the source component label, value and units
529 if( ! m_oChoSrcName.SetStringSelection( roCpnt.rosGetName( ) ) ) return( false );
530 if( m_oPnlSrcLvl.GetParent( ) != NULL )
531 {
532 if( ! m_oPnlSrcLvl.bSetUnitsType( roCpnt.eGetUnitsType( ) ) ) return( false );
533 if( ! m_oPnlSrcLvl.bSetValue( roCpnt.rosGetNumValue( ) ) ) return( false );
534 }
535
536 return( true );
537 }
538
539 //**************************************************************************************************
540 // Select the analysis to be performed.
541 //
542 // Argument List :
543 // eAnalysis - The analysis type
544 //
545 // Return Values :
546 // true - Success
547 // false - Failure
548
bSetAnalysType(eTypeCmd eAnaType)549 bool PnlAnaBase::bSetAnalysType( eTypeCmd eAnaType )
550 {
551 if( eAnaType<eCMD_ANA_FST || eAnaType>eCMD_ANA_LST ) return( false );
552
553 m_eAnaType = eAnaType;
554
555 return( true );
556 }
557
558 //**************************************************************************************************
559 // Event Handlers *
560 //**************************************************************************************************
561 // Source component choice box event handler.
562 //
563 // Argument List :
564 // roEvtCmd - An object holding information about the event
565
OnSrcName(wxCommandEvent & WXUNUSED (roEvtCmd))566 void PnlAnaBase::OnSrcName( wxCommandEvent & WXUNUSED( roEvtCmd ) )
567 {
568 // Set the sweep source component
569 if( m_oChoSrcName.GetSelection( ) > 0 )
570 m_oCpntSwpSrc.bSetName( m_oChoSrcName.GetStringSelection( ) );
571 else m_oCpntSwpSrc.bClear( );
572 }
573
574 //**************************************************************************************************
575