KiCad PCB EDA Suite
dialog_edit_component_in_schematic.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) 2004-2018 KiCad Developers, see AUTHORS.txt for contributors.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, you may find one here:
18  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19  * or you may search the http://www.gnu.org website for the version 2 license,
20  * or you may write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23 
24 
25 #include <wx/tooltip.h>
26 #include <pgm_base.h>
27 #include <kiface_i.h>
28 #include <sch_draw_panel.h>
29 #include <confirm.h>
30 #include <sch_edit_frame.h>
31 #include <grid_tricks.h>
32 #include <menus_helpers.h>
33 #include <widgets/wx_grid.h>
34 #include <sch_reference_list.h>
35 #include <class_library.h>
36 #include <symbol_lib_table.h>
37 #include <fields_grid_table.h>
38 
40 #include <invoke_sch_dialog.h>
41 
42 #ifdef KICAD_SPICE
43 #include <dialog_spice_model.h>
45 #endif /* KICAD_SPICE */
46 
47 
48 
49 #define SymbolFieldsShownColumnsKey wxT( "SymbolFieldsShownColumns" )
50 
51 
59 {
60 public:
63 
64  SCH_EDIT_FRAME* GetParent() { return dynamic_cast<SCH_EDIT_FRAME*>( wxDialog::GetParent() ); }
65 
66 private:
67  wxConfigBase* m_config;
68 
71 
74  wxString m_shownColumns;
75 
77 
78  bool TransferDataToWindow() override;
79  bool TransferDataFromWindow() override;
80 
81  bool Validate() override;
82 
83  // event handlers
84  void UpdateFieldsFromLibrary( wxCommandEvent& event ) override;
85  void OnAddField( wxCommandEvent& event ) override;
86  void OnDeleteField( wxCommandEvent& event ) override;
87  void OnMoveUp( wxCommandEvent& event ) override;
88  void OnMoveDown( wxCommandEvent& event ) override;
89  void OnBrowseLibrary( wxCommandEvent& event ) override;
90  void OnEditSpiceModel( wxCommandEvent& event ) override;
91  void OnSizeGrid( wxSizeEvent& event ) override;
92  void OnGridCellChanging( wxGridEvent& event );
93  void OnUpdateUI( wxUpdateUIEvent& event ) override;
94 
95  void OnInitDlg( wxInitDialogEvent& event ) override
96  {
98 
99  // Now all widgets have the size fixed, call FinishDialogSettings
101  }
102 
103  void AdjustGridColumns( int aWidth );
104 };
105 
106 
108 {
109  wxCHECK_RET( aComponent != nullptr && aComponent->Type() == SCH_COMPONENT_T,
110  wxT( "Invalid component object pointer. Bad Programmer!" ) );
111 
112  m_canvas->SetIgnoreMouseEvents( true );
113 
114  DIALOG_EDIT_COMPONENT_IN_SCHEMATIC dlg( this, aComponent );
115 
116  // This dialog itself subsequently can invoke a KIWAY_PLAYER as a quasimodal
117  // frame. Therefore this dialog as a modal frame parent, MUST be run under
118  // quasimodal mode for the quasimodal frame support to work. So don't use
119  // the QUASIMODAL macros here.
120  int ret = dlg.ShowQuasiModal();
121 
122  m_canvas->SetIgnoreMouseEvents( false );
123  m_canvas->MoveCursorToCrossHair();
124 
125  if( ret == wxID_OK )
126  {
127  if( m_autoplaceFields )
128  aComponent->AutoAutoplaceFields( GetScreen() );
129 
130  GetCanvas()->Refresh();
131  }
132 }
133 
134 
136  SCH_COMPONENT* aComponent ) :
138 {
140 
141  m_cmp = aComponent;
142  m_part = GetParent()->GetLibPart( m_cmp->GetLibId(), true );
143  m_fields = new FIELDS_GRID_TABLE<SCH_FIELD>( this, aParent, m_part );
144 
147 
148 #ifndef KICAD_SPICE
149  m_spiceFieldsButton->Hide();
150 #endif /* not KICAD_SPICE */
151 
152  // disable some options inside the edit dialog which can cause problems while dragging
153  if( m_cmp->IsDragging() )
154  {
155  m_rbOrientation->Disable();
156  m_rbMirror->Disable();
157  m_libraryNameTextCtrl->Disable();
158  }
159 
160  // Give a bit more room for combobox editors
161  m_grid->SetDefaultRowSize( m_grid->GetDefaultRowSize() + 4 );
162 
164  m_grid->PushEventHandler( new FIELDS_GRID_TRICKS( m_grid, this ) );
165 
166  // Show/hide columns according to user's preference
167  m_config->Read( SymbolFieldsShownColumnsKey, &m_shownColumns, wxT( "0 1 2 3 4 5 6 7" ) );
169 
170  wxToolTip::Enable( true );
171  m_stdDialogButtonSizerOK->SetDefault();
172 
173  // Configure button logos
174  m_buttonBrowseLibrary->SetBitmap( KiBitmap( small_library_xpm ) );
175  m_bpAdd->SetBitmap( KiBitmap( small_plus_xpm ) );
176  m_bpDelete->SetBitmap( KiBitmap( trash_xpm ) );
177  m_bpMoveUp->SetBitmap( KiBitmap( small_up_xpm ) );
178  m_bpMoveDown->SetBitmap( KiBitmap( small_down_xpm ) );
179 
180  // wxFormBuilder doesn't include this event...
181  m_grid->Connect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnGridCellChanging ), NULL, this );
182 
184 }
185 
186 
188 {
190 
191  // Prevents crash bug in wxGrid's d'tor
193 
194  m_grid->Disconnect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnGridCellChanging ), NULL, this );
195 
196  // Delete the GRID_TRICKS.
197  m_grid->PopEventHandler( true );
198 }
199 
200 
202 {
203  if( !wxDialog::TransferDataToWindow() )
204  return false;
205 
206  std::set<wxString> defined;
207 
208  // Push a copy of each field into m_fields
209  for( int i = 0; i < m_cmp->GetFieldCount(); ++i )
210  {
211  SCH_FIELD field( *m_cmp->GetField( i ) );
212 
213  // change offset to be symbol-relative
214  field.Offset( -m_cmp->GetPosition() );
215 
216  defined.insert( field.GetName() );
217  m_fields->push_back( field );
218  }
219 
220  // Add in any template fieldnames not yet defined:
221  for( TEMPLATE_FIELDNAME templateFieldname : GetParent()->GetTemplateFieldNames() )
222  {
223  if( defined.count( templateFieldname.m_Name ) <= 0 )
224  {
225  SCH_FIELD field( wxPoint( 0, 0 ), -1, m_cmp, templateFieldname.m_Name );
226  field.SetVisible( templateFieldname.m_Visible );
227  m_fields->push_back( field );
228  }
229  }
230 
231  // notify the grid
232  wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, m_fields->size() );
233  m_grid->ProcessTableMessage( msg );
234  AdjustGridColumns( m_grid->GetRect().GetWidth() );
235 
236  // If a multi-unit component, set up the unit selector and interchangeable checkbox.
237  if( m_cmp->GetUnitCount() > 1 )
238  {
239  for( int ii = 1; ii <= m_cmp->GetUnitCount(); ii++ )
240  m_unitChoice->Append( LIB_PART::SubReference( ii, false ) );
241 
242  if( m_cmp->GetUnit() <= ( int )m_unitChoice->GetCount() )
243  m_unitChoice->SetSelection( m_cmp->GetUnit() - 1 );
244  }
245  else
246  {
247  m_unitLabel->Enable( false );
248  m_unitChoice->Enable( false );
249  }
250 
251  if( m_part != nullptr && m_part->HasConversion() )
252  {
253  if( m_cmp->GetConvert() > 1 )
254  m_cbAlternateSymbol->SetValue( true );
255  }
256  else
257  m_cbAlternateSymbol->Enable( false );
258 
259  // Set the symbol orientation and mirroring.
260  int orientation = m_cmp->GetOrientation() & ~( CMP_MIRROR_X | CMP_MIRROR_Y );
261 
262  if( orientation == CMP_ORIENT_90 )
263  m_rbOrientation->SetSelection( 1 );
264  else if( orientation == CMP_ORIENT_180 )
265  m_rbOrientation->SetSelection( 2 );
266  else if( orientation == CMP_ORIENT_270 )
267  m_rbOrientation->SetSelection( 3 );
268  else
269  m_rbOrientation->SetSelection( 0 );
270 
271  int mirror = m_cmp->GetOrientation() & ( CMP_MIRROR_X | CMP_MIRROR_Y );
272 
273  if( mirror == CMP_MIRROR_X )
274  {
275  m_rbMirror->SetSelection( 1 );
276  DBG( printf( "mirror=X,1\n" ); )
277  }
278  else if( mirror == CMP_MIRROR_Y )
279  {
280  m_rbMirror->SetSelection( 2 );
281  DBG( printf( "mirror=Y,2\n" ); )
282  }
283  else
284  m_rbMirror->SetSelection( 0 );
285 
286  // Set the component's unique ID time stamp.
287  m_textCtrlTimeStamp->SetValue( wxString::Format( wxT( "%8.8lX" ),
288  (unsigned long) m_cmp->GetTimeStamp() ) );
289 
290  // Set the component's library name.
291  m_libraryNameTextCtrl->SetValue( m_cmp->GetLibId().Format() );
292 
293  Layout();
294 
295  return true;
296 }
297 
298 
300 {
302 
303  LIB_ID id;
304  id.Parse( m_libraryNameTextCtrl->GetValue(), LIB_ID::ID_SCH );
305 
306  auto sel = GetParent()->SelectComponentFromLibTree( nullptr, dummy, true, 0, 0, false, &id );
307 
308  if( !sel.LibId.IsValid() )
309  return;
310 
311  m_libraryNameTextCtrl->SetValue( sel.LibId.Format() );
312 
313  // Update the value field for Power symbols
314  LIB_PART* entry = GetParent()->GetLibPart( sel.LibId );
315 
316  if( entry && entry->IsPower() )
317  m_grid->SetCellValue( VALUE, FDC_VALUE, sel.LibId.GetLibItemName() );
318 }
319 
320 
322 {
323 #ifdef KICAD_SPICE
324  int diff = m_fields->size();
325 
326  DIALOG_SPICE_MODEL dialog( this, *m_cmp, *m_fields );
327 
328  if( dialog.ShowModal() != wxID_OK )
329  return;
330 
331  diff = m_fields->size() - diff;
332 
333  if( diff > 0 )
334  {
335  wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, diff );
336  m_grid->ProcessTableMessage( msg );
337  }
338  else if( diff < 0 )
339  {
340  wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, 0, diff );
341  m_grid->ProcessTableMessage( msg );
342  }
343 
344  m_grid->ForceRefresh();
345 #endif /* KICAD_SPICE */
346 }
347 
348 
350 {
351  wxString msg;
352  LIB_ID id;
353 
354  if( !m_grid->CommitPendingChanges() )
355  return false;
356 
357  if( !SCH_COMPONENT::IsReferenceStringValid( m_fields->at( REFERENCE ).GetText() ) )
358  {
359  DisplayErrorMessage( this, _( "References must start with a letter." ) );
360 
363 
364  return false;
365  }
366 
367  id.Parse( m_libraryNameTextCtrl->GetValue(), LIB_ID::ID_SCH );
368 
369  if( !id.IsValid() )
370  {
371  DisplayErrorMessage( this, _( "Library reference is not valid." ) );
372 
373  m_libraryNameTextCtrl->SetFocus();
374 
375  return false;
376  }
377  else if( id != m_cmp->GetLibId() )
378  {
379  LIB_ALIAS* alias = nullptr;
380 
381  try
382  {
383  alias = Prj().SchSymbolLibTable()->LoadSymbol( id );
384  }
385  catch( ... )
386  {
387  }
388 
389  if( !alias )
390  {
391  msg.Printf( _( "Symbol \"%s\" not found in library \"%s\"." ),
392  id.GetLibItemName().wx_str(),
393  id.GetLibNickname().wx_str() );
394  DisplayErrorMessage( this, msg );
395 
396  m_libraryNameTextCtrl->SetFocus();
397 
398  return false;
399  }
400  }
401  m_libraryNameTextCtrl->SetValue( id.Format() );
402 
403  // Check for missing field names.
404  for( size_t i = MANDATORY_FIELDS; i < m_fields->size(); ++i )
405  {
406  SCH_FIELD& field = m_fields->at( i );
407  wxString fieldName = field.GetName( false );
408 
409  if( fieldName.IsEmpty() )
410  {
411  DisplayErrorMessage( this, _( "Fields must have a name." ) );
412 
415 
416  return false;
417  }
418  }
419 
420  return true;
421 }
422 
423 
425 {
426  if( !Validate() )
427  return false;
428 
429  // save old cmp in undo list if not already in edit, or moving ...
430  // or the component to be edited is part of a block
433 
434  // Save current flags which could be modified by next change settings
435  STATUS_FLAGS flags = m_cmp->GetFlags();
436 
437  // Library symbol identifier
438  LIB_ID id;
439  id.Parse( m_libraryNameTextCtrl->GetValue(), LIB_ID::ID_SCH, true );
440  m_cmp->SetLibId( id, Prj().SchSymbolLibTable(), Prj().SchLibs()->GetCacheLibrary() );
441 
442  // For symbols with multiple shapes (De Morgan representation) Set the selected shape:
443  if( m_cbAlternateSymbol->IsEnabled() )
444  m_cmp->SetConvert( m_cbAlternateSymbol->GetValue() ? 2 : 1 );
445 
446  //Set the part selection in multiple part per package
447  if( m_cmp->GetUnitCount() > 1 )
448  {
449  int unit_selection = m_unitChoice->GetCurrentSelection() + 1;
450 
451  m_cmp->SetUnitSelection( &GetParent()->GetCurrentSheet(), unit_selection );
452  m_cmp->SetUnit( unit_selection );
453  }
454 
455  switch( m_rbOrientation->GetSelection() )
456  {
457  case 0: m_cmp->SetOrientation( CMP_ORIENT_0 ); break;
458  case 1: m_cmp->SetOrientation( CMP_ORIENT_90 ); break;
459  case 2: m_cmp->SetOrientation( CMP_ORIENT_180 ); break;
460  case 3: m_cmp->SetOrientation( CMP_ORIENT_270 ); break;
461  }
462 
463  switch( m_rbMirror->GetSelection() )
464  {
465  case 0: break;
466  case 1: m_cmp->SetOrientation( CMP_MIRROR_X ); break;
467  case 2: m_cmp->SetOrientation( CMP_MIRROR_Y ); break;
468  }
469 
470  // Restore m_Flag modified by SetUnit() and other change settings
471  m_cmp->ClearFlags();
472  m_cmp->SetFlags( flags );
473 
474  // change all field positions from relative to absolute
475  for( unsigned i = 0; i < m_fields->size(); ++i )
476  m_fields->at( i ).Offset( m_cmp->GetPosition() );
477 
478  LIB_PART* entry = GetParent()->GetLibPart( m_cmp->GetLibId() );
479 
480  if( entry && entry->IsPower() )
481  m_fields->at( VALUE ).SetText( m_cmp->GetLibId().GetLibItemName() );
482 
483  // Remove any TEMPLATE_FIELDNAMES which were not set (given values).
484  TEMPLATE_FIELDNAMES templateFieldnames = GetParent()->GetTemplateFieldNames();
485 
486  for( size_t i = MANDATORY_FIELDS; i < m_fields->size(); ++i )
487  {
488  SCH_FIELD& field = m_fields->at( i );
489 
490  for( auto fieldname : templateFieldnames )
491  {
492  if( field.GetName() == fieldname.m_Name && field.GetText().IsEmpty() )
493  {
494  m_fields->erase( m_fields->begin() + i );
495 
496  // grid needs to be notified about the size change,
497  // as it still accesses the data on close (size event)
498  wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, i, 1 );
499  m_grid->ProcessTableMessage( msg );
500  i--;
501  break;
502  }
503  }
504  }
505 
506  m_cmp->SetFields( *m_fields );
507 
508  // Reference has a specific initialization, depending on the current active sheet
509  // because for a given component, in a complex hierarchy, there are more than one
510  // reference.
511  m_cmp->SetRef( &GetParent()->GetCurrentSheet(), m_fields->at( REFERENCE ).GetText() );
512 
513  // The value, footprint and datasheet fields should be kept in sync in multi-unit
514  // parts.
515  if( m_cmp->GetUnitCount() > 1 )
516  {
517  const LIB_ID thisLibId = m_cmp->GetLibId();
518  const wxString thisRef = m_cmp->GetRef( &( GetParent()->GetCurrentSheet() ) );
519  int thisUnit = m_cmp->GetUnit();
520 
521  SCH_REFERENCE_LIST components;
522  GetParent()->GetCurrentSheet().GetComponents( components );
523  for( unsigned i = 0; i < components.GetCount(); i++ )
524  {
525  SCH_REFERENCE component = components[i];
526  if( component.GetLibPart()->GetLibId() == thisLibId
527  && component.GetRef() == thisRef
528  && component.GetUnit() != thisUnit )
529  {
530  SCH_COMPONENT* otherUnit = component.GetComp();
531  GetParent()->SaveCopyInUndoList( otherUnit, UR_CHANGED, true /* append */);
532  otherUnit->GetField( VALUE )->SetText( m_fields->at( VALUE ).GetText() );
533  otherUnit->GetField( FOOTPRINT )->SetText( m_fields->at( FOOTPRINT ).GetText() );
534  otherUnit->GetField( DATASHEET )->SetText( m_fields->at( DATASHEET ).GetText() );
535  }
536  }
537  }
538 
540 
543  GetParent()->OnModify();
544 
545  return true;
546 }
547 
548 
550 {
551  wxGridCellEditor* editor = m_grid->GetCellEditor( event.GetRow(), event.GetCol() );
552  wxControl* control = editor->GetControl();
553 
554  if( control && control->GetValidator() && !control->GetValidator()->Validate( control ) )
555  {
556  event.Veto();
557  m_delayedFocusRow = event.GetRow();
558  m_delayedFocusColumn = event.GetCol();
559  }
560 
561  editor->DecRef();
562 }
563 
564 
566 {
567  if( !m_grid->CommitPendingChanges() )
568  return;
569 
570  int fieldID = m_fields->size();
571  SCH_FIELD newField( wxPoint( 0, 0 ), fieldID, m_cmp );
572 
573  newField.SetName( TEMPLATE_FIELDNAME::GetDefaultFieldName( fieldID ) );
574  newField.SetTextAngle( m_fields->at( REFERENCE ).GetTextAngle() );
575 
576  m_fields->push_back( newField );
577 
578  // notify the grid
579  wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
580  m_grid->ProcessTableMessage( msg );
581 
582  m_grid->MakeCellVisible( m_fields->size() - 1, 0 );
583  m_grid->SetGridCursor( m_fields->size() - 1, 0 );
584 
585  m_grid->EnableCellEditControl();
586  m_grid->ShowCellEditControl();
587 }
588 
589 
591 {
592  int curRow = m_grid->GetGridCursorRow();
593 
594  if( curRow < 0 )
595  return;
596  else if( curRow < MANDATORY_FIELDS )
597  {
598  DisplayError( this, wxString::Format( _( "The first %d fields are mandatory." ),
599  MANDATORY_FIELDS ) );
600  return;
601  }
602 
603  m_grid->CommitPendingChanges( true /* quiet mode */ );
604 
605  m_fields->erase( m_fields->begin() + curRow );
606 
607  // notify the grid
608  wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, curRow, 1 );
609  m_grid->ProcessTableMessage( msg );
610 
611  if( m_grid->GetNumberRows() > 0 )
612  {
613  m_grid->MakeCellVisible( std::max( 0, curRow-1 ), m_grid->GetGridCursorCol() );
614  m_grid->SetGridCursor( std::max( 0, curRow-1 ), m_grid->GetGridCursorCol() );
615  }
616 }
617 
618 
619 void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnMoveUp( wxCommandEvent& event )
620 {
621  if( !m_grid->CommitPendingChanges() )
622  return;
623 
624  int i = m_grid->GetGridCursorRow();
625 
626  if( i > MANDATORY_FIELDS )
627  {
628  SCH_FIELD tmp = m_fields->at( (unsigned) i );
629  m_fields->erase( m_fields->begin() + i, m_fields->begin() + i + 1 );
630  m_fields->insert( m_fields->begin() + i - 1, tmp );
631  m_grid->ForceRefresh();
632 
633  m_grid->SetGridCursor( i - 1, m_grid->GetGridCursorCol() );
634  m_grid->MakeCellVisible( m_grid->GetGridCursorRow(), m_grid->GetGridCursorCol() );
635  }
636  else
637  wxBell();
638 }
639 
640 
642 {
643  if( !m_grid->CommitPendingChanges() )
644  return;
645 
646  int i = m_grid->GetGridCursorRow();
647 
648  if( i >= MANDATORY_FIELDS && i < m_grid->GetNumberRows() - 1 )
649  {
650  SCH_FIELD tmp = m_fields->at( (unsigned) i );
651  m_fields->erase( m_fields->begin() + i, m_fields->begin() + i + 1 );
652  m_fields->insert( m_fields->begin() + i + 1, tmp );
653  m_grid->ForceRefresh();
654 
655  m_grid->SetGridCursor( i + 1, m_grid->GetGridCursorCol() );
656  m_grid->MakeCellVisible( m_grid->GetGridCursorRow(), m_grid->GetGridCursorCol() );
657  }
658  else
659  wxBell();
660 }
661 
662 
664 {
665  if( !m_grid->CommitPendingChanges() )
666  return;
667 
668  SCH_COMPONENT copy( *m_cmp );
669  copy.SetFields( *m_fields );
670 
671  // Update the requested fields in the component copy
672  std::list<SCH_COMPONENT*> components;
673  components.push_back( &copy );
674  InvokeDialogUpdateFields( GetParent(), components, false );
675 
676  // Copy fields from the component copy to the dialog buffer
677  m_fields->clear();
678  std::set<wxString> defined;
679 
680  for( int i = 0; i < copy.GetFieldCount(); ++i )
681  {
682  copy.GetField( i )->SetParent( m_cmp );
683 
684  defined.insert( copy.GetField( i )->GetName() );
685  m_fields->push_back( *copy.GetField( i ) );
686  }
687 
688  // Add in any template fieldnames not yet defined:
689  for( TEMPLATE_FIELDNAME templateFieldname : GetParent()->GetTemplateFieldNames() )
690  {
691  if( defined.count( templateFieldname.m_Name ) <= 0 )
692  {
693  SCH_FIELD field( wxPoint( 0, 0 ), -1, m_cmp, templateFieldname.m_Name );
694  field.SetVisible( templateFieldname.m_Visible );
695  m_fields->push_back( field );
696  }
697  }
698 
699  m_grid->ForceRefresh();
700 }
701 
702 
704 {
705  // Account for scroll bars
706  aWidth -= ( m_grid->GetSize().x - m_grid->GetClientSize().x );
707 
708  m_grid->AutoSizeColumn( 0 );
709 
710  int fixedColsWidth = m_grid->GetColSize( 0 );
711 
712  for( int i = 2; i < m_grid->GetNumberCols(); i++ )
713  fixedColsWidth += m_grid->GetColSize( i );
714 
715  m_grid->SetColSize( 1, aWidth - fixedColsWidth );
716 }
717 
718 
720 {
721  wxString shownColumns = m_grid->GetShownColumns();
722 
723  if( shownColumns != m_shownColumns )
724  {
725  m_shownColumns = shownColumns;
726 
727  if( !m_grid->IsCellEditControlShown() )
728  AdjustGridColumns( m_grid->GetRect().GetWidth() );
729  }
730 
731  // Handle a delayed focus
732  if( m_delayedFocusRow >= 0 )
733  {
734  m_grid->SetFocus();
735  m_grid->MakeCellVisible( m_delayedFocusRow, m_delayedFocusColumn );
736  m_grid->SetGridCursor( m_delayedFocusRow, m_delayedFocusColumn );
737 
738 
739  m_grid->EnableCellEditControl( true );
740  m_grid->ShowCellEditControl();
741 
742  m_delayedFocusRow = -1;
744  }
745 }
746 
747 
749 {
750  AdjustGridColumns( event.GetSize().GetX() );
751 
752  event.Skip();
753 }
void GetComponents(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanComponents=false)
Function GetComponents adds a SCH_REFERENCE() object to aReferences for each component in the sheet...
void SetTextAngle(double aAngle)
Definition: eda_text.h:169
DIALOG_EDIT_COMPONENT_IN_SCHEMATIC(SCH_EDIT_FRAME *aParent, SCH_COMPONENT *aComponent)
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201
Class SCH_FIELD instances are attached to a component and provide a place for the component&#39;s value...
Definition: sch_field.h:56
void Offset(const wxPoint &aOffset)
Definition: eda_text.h:242
void EditComponent(SCH_COMPONENT *aComponent)
Display the edit component dialog to edit the parameters of aComponent.
void UpdateFieldsFromLibrary(wxCommandEvent &event) override
void AutoAutoplaceFields(SCH_SCREEN *aScreen)
Autoplace fields only if correct to do so automatically.
STATUS_FLAGS GetFlags() const
Definition: base_struct.h:258
Part library alias object definition.
wxString GetName(bool aUseDefaultName=true) const
Function GetName returns the field name.
Definition: sch_field.cpp:435
BLOCK_SELECTOR m_BlockLocate
Block description for block commands.
Definition: base_screen.h:214
name of datasheet
bool HasConversion() const
Test if part has more than one body conversion type (DeMorgan).
int GetOrientation()
Get the display symbol orientation.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Function DisplayErrorMessage displays an error message with aMessage.
Definition: confirm.cpp:259
void OnMoveDown(wxCommandEvent &event) override
bool IsPower() const
This file is part of the common library.
void OnModify()
Must be called after a schematic change in order to set the "modify" flag of the current screen* and ...
void ShowHideColumns(const wxString &shownColumns)
Show/hide the grid columns based on a tokenized string of shown column indexes.
Definition: wx_grid.cpp:108
void OnAddField(wxCommandEvent &event) override
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors...
void OnEditSpiceModel(wxCommandEvent &event) override
void OnInitDlg(wxInitDialogEvent &event) override
void FinishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
void SetVisible(bool aVisible)
Definition: eda_text.h:188
const LIB_ID & GetLibId() const
std::vector< COMPONENT_SELECTION > HISTORY_LIST
static const wxString GetDefaultFieldName(int aFieldNdx)
Function GetDefaultFieldName returns a default symbol field name for field aFieldNdx for all componen...
Schematic editor (Eeschema) main window.
LIB_PART * GetLibPart(const LIB_ID &aLibId, bool aUseCacheLib=false, bool aShowErrorMsg=false)
bool TestDanglingEnds()
Test all of the connectable objects in the schematic for unused connection points.
void SetUnitSelection(SCH_SHEET_PATH *aSheet, int aUnitSelection)
int GetUnitCount() const
Return the number of units per package of the symbol.
void SetTable(wxGridTableBase *table, bool aTakeOwnership=false)
Hide wxGrid&#39;s SetTable() method with one which doesn&#39;t mess up the grid column widths when setting th...
Definition: wx_grid.cpp:46
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:51
int GetUnit() const
Field Name Module PCB, i.e. "16DIP300".
Field Reference of part, i.e. "IC21".
KIFACE_I & Kiface()
Global KIFACE_I "get" accessor.
Definition: kicad.cpp:52
Class SCH_REFERENCE_LIST is used to create a flattened list of components because in a complex hierar...
void SetConvert(int aConvert)
void DestroyTable(wxGridTableBase *aTable)
Work-around for a bug in wxGrid which crashes when deleting the table if the cell edit control was no...
Definition: wx_grid.cpp:77
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
int GetConvert() const
PROJECT & Prj() const
Function Prj returns a reference to the PROJECT "associated with" this KIWAY.
wxBitmap KiBitmap(BITMAP_DEF aBitmap)
Construct a wxBitmap from a memory record, held in a BITMAP_DEF.
Definition: bitmap.cpp:79
#define VALUE
void SetLibId(const LIB_ID &aName, PART_LIBS *aLibs=NULL)
void OnBrowseLibrary(wxCommandEvent &event) override
void UpdatePinCache()
Updates the local cache of pin positions.
std::vector< TEMPLATE_FIELDNAME > TEMPLATE_FIELDNAMES
void SetFlags(STATUS_FLAGS aMask)
Definition: base_struct.h:256
void SetFields(const SCH_FIELDS &aFields)
Set multiple schematic fields.
SCH_FIELD * GetField(int aFieldNdx) const
Returns a field in this symbol.
void SetParent(EDA_ITEM *aParent)
Definition: base_struct.h:216
const UTF8 & GetLibItemName() const
Definition: lib_id.h:114
int ShowQuasiModal()
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:143
const TEMPLATE_FIELDNAMES & GetTemplateFieldNames() const
Return a template field names list for read only access.
SCH_SHEET_PATH & GetCurrentSheet()
#define SymbolFieldsShownColumnsKey
void SaveCopyInUndoList(SCH_ITEM *aItemToCopy, UNDO_REDO_T aTypeCommand, bool aAppend=false, const wxPoint &aTransformPoint=wxPoint(0, 0))
Create a copy of the current schematic item, and put it in the undo list.
Define a library symbol object.
void OnDeleteField(wxCommandEvent &event) override
unsigned STATUS_FLAGS
Definition: base_struct.h:147
wxConfigBase * KifaceSettings() const
Definition: kiface_i.h:103
void SetUnit(int aUnit)
Change the unit number to aUnit.
int GetUnit() const
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
Definition: wx_grid.cpp:156
const wxString GetRef(const SCH_SHEET_PATH *aSheet)
Return the reference for the given sheet path.
int InvokeDialogUpdateFields(SCH_EDIT_FRAME *aCaller, const list< SCH_COMPONENT * > aComponents, bool aCreateUndoEntry)
Class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_BASE.
wxString GetShownColumns()
Get a tokenized string containing the shown column indexes.
Definition: wx_grid.cpp:90
wxString GetRef() const
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
see class PGM_BASE
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
int GetFieldCount() const
Return the number of fields in this symbol.
BLOCK_STATE_T GetState() const
static LIB_PART * dummy()
Used when a LIB_PART is not found in library to draw a dummy shape This component is a 400 mils squar...
#define max(a, b)
Definition: auxiliary.h:86
void RefreshItem(SCH_ITEM *aItem, bool isAddOrDelete=false)
Mark an item for refresh.
Dialog used to edit SCH_COMPONENT objects in a schematic.
size_t i
Definition: json11.cpp:597
void SetName(const wxString &aName)
Definition: sch_field.h:85
static wxString SubReference(int aUnit, bool aAddSeparator=true)
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:69
wxPoint GetPosition() const override
Function GetPosition.
const LIB_ID & GetLibId() const
UTF8 Format() const
Definition: lib_id.cpp:237
Struct TEMPLATE_FIELDNAME holds a name of a component&#39;s field, field value, and default visibility...
void ClearFlags(STATUS_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: base_struct.h:257
#define DBG(x)
Definition: fctsys.h:33
LIB_PART * GetLibPart() const
Definition for part library class.
COMPONENT_SELECTION SelectComponentFromLibTree(const SCHLIB_FILTER *aFilter, std::vector< COMPONENT_SELECTION > &aHistoryList, bool aUseLibBrowser, int aUnit, int aConvert, bool aShowFootprints, const LIB_ID *aHighlight=nullptr, bool aAllowFields=true)
Function SelectComponentFromLib Calls the library viewer to select component to import into schematic...
Definition: getpart.cpp:101
static bool IsReferenceStringValid(const wxString &aReferenceString)
Tests for an acceptable reference string.
int Parse(const UTF8 &aId, LIB_ID_TYPE aType, bool aFix=false)
Parse LIB_ID with the information from aId.
Definition: lib_id.cpp:122
unsigned GetCount()
Function GetCount.
SCH_COMPONENT * GetComp() const
void DisplayError(wxWindow *parent, const wxString &text, int displaytime)
Function DisplayError displays an error or warning message box with aMessage.
Definition: confirm.cpp:245
void OnUpdateUI(wxUpdateUIEvent &event) override
Class SCH_REFERENCE is used as a helper to define a component&#39;s reference designator in a schematic...
timestamp_t GetTimeStamp() const
Definition: base_struct.h:207
virtual void SetText(const wxString &aText)
Definition: eda_text.h:154
void SetOrientation(int aOrientation)
Compute the new transform matrix based on aOrientation for the symbol which is applied to the current...
bool IsDragging() const
Definition: base_struct.h:222