KiCad PCB EDA Suite
Loading...
Searching...
No Matches
symbol_viewer_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) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2008 Wayne Stambaugh <[email protected]>
6 * Copyright The KiCad Developers, see AUTHORS.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 <bitmaps.h>
28#include <confirm.h>
30#include <eeschema_id.h>
31#include <eeschema_settings.h>
33#include <kiface_base.h>
34#include <kiway.h>
35#include <kiway_express.h>
36#include <locale_io.h>
37#include <symbol_viewer_frame.h>
38#include <widgets/msgpanel.h>
39#include <widgets/wx_listbox.h>
42#include <sch_view.h>
43#include <sch_painter.h>
45#include <pgm_base.h>
47#include <project_sch.h>
49#include <tool/action_toolbar.h>
50#include <tool/common_control.h>
51#include <tool/common_tools.h>
53#include <tool/selection.h>
55#include <tool/tool_manager.h>
56#include <tool/zoom_tool.h>
57#include <tools/sch_actions.h>
60#include <view/view_controls.h>
61#include <wx/srchctrl.h>
62#include <wx/log.h>
63#include <wx/choice.h>
65#include <trace_helpers.h>
66
67#include <default_values.h>
68#include <string_utils.h>
70
71#include "eda_pattern_match.h"
72
73// Save previous symbol library viewer state.
75
78
79
80BEGIN_EVENT_TABLE( SYMBOL_VIEWER_FRAME, SCH_BASE_FRAME )
81 // Window events
84
85 // Toolbar events
92
93 // listbox events
99
100 // Menu (and/or hotkey) events
101 EVT_MENU( wxID_CLOSE, SYMBOL_VIEWER_FRAME::CloseLibraryViewer )
102
103END_EVENT_TABLE()
104
105
106SYMBOL_VIEWER_FRAME::SYMBOL_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
107 SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH_VIEWER, _( "Symbol Library Browser" ),
108 wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE,
110 m_unitChoice( nullptr ),
111 m_bodyStyleChoice( nullptr ),
112 m_libList( nullptr ),
113 m_symbolList( nullptr )
114{
115 m_aboutTitle = _HKI( "KiCad Symbol Library Browser" );
116
117 // Force the frame name used in config. the lib viewer frame has a name
118 // depending on aFrameType (needed to identify the frame by wxWidgets),
119 // but only one configuration is preferable.
121
122 // Give an icon
123 wxIcon icon;
124 icon.CopyFromBitmap( KiBitmap( BITMAPS::library_browser ) );
125 SetIcon( icon );
126
127 m_libListWidth = 200;
128 m_symbolListWidth = 300;
129 m_listPowerOnly = false;
130
131 SetScreen( new SCH_SCREEN );
132 GetScreen()->m_Center = true; // Axis origin centered on screen.
133 LoadSettings( config() );
134
135 // Ensure axis are always drawn (initial default display was not drawn)
137 gal_opts.m_axesEnabled = true;
138 gal_opts.m_gridMinSpacing = 10.0;
139 gal_opts.NotifyChanged();
140
141 GetRenderSettings()->LoadColors( GetColorSettings() );
142 GetCanvas()->GetGAL()->SetAxesColor( m_colorSettings->GetColor( LAYER_SCHEMATIC_GRID_AXES ) );
143
144 GetRenderSettings()->SetDefaultPenWidth( DEFAULT_LINE_WIDTH_MILS * schIUScale.IU_PER_MILS );
145
146 setupTools();
148
152
154
155 wxPanel* libPanel = new wxPanel( this );
156 wxSizer* libSizer = new wxBoxSizer( wxVERTICAL );
157
158 m_libFilter = new wxSearchCtrl( libPanel, ID_LIBVIEW_LIB_FILTER, wxEmptyString,
159 wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
160 m_libFilter->SetDescriptiveText( _( "Filter" ) );
161 libSizer->Add( m_libFilter, 0, wxEXPAND, 5 );
162
163 m_libList = new WX_LISTBOX( libPanel, ID_LIBVIEW_LIB_LIST, wxDefaultPosition, wxDefaultSize,
164 0, nullptr, wxLB_HSCROLL | wxNO_BORDER );
165 libSizer->Add( m_libList, 1, wxEXPAND, 5 );
166
167 libPanel->SetSizer( libSizer );
168 libPanel->Fit();
169
170 wxPanel* symbolPanel = new wxPanel( this );
171 wxSizer* symbolSizer = new wxBoxSizer( wxVERTICAL );
172
173 m_symbolFilter = new wxSearchCtrl( symbolPanel, ID_LIBVIEW_SYM_FILTER, wxEmptyString,
174 wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER );
175 m_symbolFilter->SetDescriptiveText( _( "Filter" ) );
176 m_symbolFilter->SetToolTip(
177 _( "Filter on symbol name, keywords, description and pin count.\n"
178 "Search terms are separated by spaces. All search terms must match.\n"
179 "A term which is a number will also match against the pin count." ) );
180 symbolSizer->Add( m_symbolFilter, 0, wxEXPAND, 5 );
181
182#ifdef __WXGTK__
183 // wxSearchCtrl vertical height is not calculated correctly on some GTK setups
184 // See https://gitlab.com/kicad/code/kicad/-/issues/9019
185 m_libFilter->SetMinSize( wxSize( -1, GetTextExtent( wxT( "qb" ) ).y + 10 ) );
186 m_symbolFilter->SetMinSize( wxSize( -1, GetTextExtent( wxT( "qb" ) ).y + 10 ) );
187#endif
188
189 m_symbolList = new WX_LISTBOX( symbolPanel, ID_LIBVIEW_SYM_LIST, wxDefaultPosition,
190 wxDefaultSize, 0, nullptr, wxLB_HSCROLL | wxNO_BORDER );
191 symbolSizer->Add( m_symbolList, 1, wxEXPAND, 5 );
192
193 symbolPanel->SetSizer( symbolSizer );
194 symbolPanel->Fit();
195
196 // Preload libraries
198
199 m_selection_changed = false;
200
202
203 m_auimgr.SetManagedWindow( this );
204
206
207 // Manage main toolbar
208 m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" ).Top().Layer(6) );
209 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" ) .Bottom().Layer(6) );
210
211 m_auimgr.AddPane( libPanel, EDA_PANE().Palette().Name( "Libraries" ).Left().Layer(2)
212 .CaptionVisible( false ).MinSize( 100, -1 ).BestSize( 200, -1 ) );
213 m_auimgr.AddPane( symbolPanel, EDA_PANE().Palette().Name( "Symbols" ).Left().Layer(1)
214 .CaptionVisible( false ).MinSize( 100, -1 ).BestSize( 300, -1 ) );
215
216 m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" ).Center() );
217
219 m_auimgr.Update();
220
221 if( m_libListWidth > 0 )
222 SetAuiPaneSize( m_auimgr, m_auimgr.GetPane( "Libraries" ), m_libListWidth, -1 );
223
224 if( m_symbolListWidth > 0 )
225 SetAuiPaneSize( m_auimgr, m_auimgr.GetPane( "Symbols" ), m_symbolListWidth, -1 );
226
228
229 Raise();
230 Show( true );
231
232 SyncView();
233 GetCanvas()->SetCanFocus( false );
234
235 setupUnits( config() );
236
237 // Set the working/draw area size to display a symbol to a reasonable value:
238 // A 450mm x 450mm with a origin at the area center looks like a large working area
239 double max_size_x = schIUScale.mmToIU( 450 );
240 double max_size_y = schIUScale.mmToIU( 450 );
241 BOX2D bbox;
242 bbox.SetOrigin( -max_size_x / 2, -max_size_y / 2 );
243 bbox.SetSize( max_size_x, max_size_y );
244 GetCanvas()->GetView()->SetBoundary( bbox );
246
247 // If a symbol was previously selected in m_symbolList from a previous run, show it
248 wxString symbName = m_symbolList->GetStringSelection();
249
250 if( !symbName.IsEmpty() )
251 {
252 SetSelectedSymbol( symbName );
254 }
255}
256
257
259{
260 // Shutdown all running tools
261 if( m_toolManager )
262 m_toolManager->ShutdownAllTools();
263
264 if( m_previewItem )
265 {
266 GetCanvas()->GetView()->Remove( m_previewItem.get() );
267 m_previewItem = nullptr;
268 }
269}
270
271
273{
274 // Create the manager and dispatcher & route draw panel events to the dispatcher
276 m_toolManager->SetEnvironment( GetScreen(), GetCanvas()->GetView(),
277 GetCanvas()->GetViewControls(), config(), this );
278 m_actions = new SCH_ACTIONS();
280
281 // Register tools
282 m_toolManager->RegisterTool( new COMMON_TOOLS );
283 m_toolManager->RegisterTool( new COMMON_CONTROL );
284 m_toolManager->RegisterTool( new ZOOM_TOOL );
285 m_toolManager->RegisterTool( new SCH_INSPECTION_TOOL ); // manage show datasheet
286 m_toolManager->RegisterTool( new SCH_SELECTION_TOOL ); // manage context menu
287 m_toolManager->RegisterTool( new SYMBOL_EDITOR_CONTROL ); // manage render settings
288
289 m_toolManager->InitTools();
290
291 // Run the selection tool, it is supposed to be always active
292 // It also manages the mouse right click to show the context menu
293 m_toolManager->InvokeTool( "common.InteractiveSelection" );
294
296}
297
298
300{
302
303 ACTION_MANAGER* mgr = m_toolManager->GetActionManager();
304 EDITOR_CONDITIONS cond( this );
305
306 wxASSERT( mgr );
307
308#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
309#define CHECK( x ) ACTION_CONDITIONS().Check( x )
310
312
313 auto electricalTypesShownCondition =
314 [this]( const SELECTION& aSel )
315 {
317 };
318
319 auto pinNumbersShownCondition =
320 [this]( const SELECTION& )
321 {
323 };
324
325 auto haveDatasheetCond =
326 [this]( const SELECTION& )
327 {
328 LIB_SYMBOL* symbol = GetSelectedSymbol();
329 return symbol && !symbol->GetDatasheetField().GetText().IsEmpty();
330 };
331
332 mgr->SetConditions( ACTIONS::showDatasheet, ENABLE( haveDatasheetCond ) );
333 mgr->SetConditions( SCH_ACTIONS::showElectricalTypes, CHECK( electricalTypesShownCondition ) );
334 mgr->SetConditions( SCH_ACTIONS::showPinNumbers, CHECK( pinNumbersShownCondition ) );
335
336#undef CHECK
337#undef ENABLE
338}
339
340
341void SYMBOL_VIEWER_FRAME::SetUnitAndBodyStyle( int aUnit, int aBodyStyle )
342{
343 m_unit = aUnit > 0 ? aUnit : 1;
344 m_bodyStyle = aBodyStyle > 0 ? aBodyStyle : BODY_STYLE::BASE;
345 m_selection_changed = false;
346
348}
349
350
352{
353 LIB_SYMBOL* symbol = nullptr;
354
355 if( m_currentSymbol.IsValid() )
357
358 return symbol;
359}
360
361
363{
364 LIB_SYMBOL* symbol = GetSelectedSymbol();
365 KIGFX::SCH_VIEW* view = GetCanvas()->GetView();
366
367 if( m_previewItem )
368 {
369 view->Remove( m_previewItem.get() );
370 m_previewItem = nullptr;
371 }
372
374
375 if( symbol )
376 {
379
380 m_previewItem = symbol->Flatten();
381 view->Add( m_previewItem.get() );
382
383 wxString parentName;
384
385 if( std::shared_ptr<LIB_SYMBOL> parent = symbol->GetParent().lock() )
386 parentName = parent->GetName();
387
388 AppendMsgPanel( _( "Name" ), UnescapeString( m_previewItem->GetName() ) );
389 AppendMsgPanel( _( "Parent" ), UnescapeString( parentName ) );
390 AppendMsgPanel( _( "Description" ), m_previewItem->GetDescription() );
391 AppendMsgPanel( _( "Keywords" ), m_previewItem->GetKeyWords() );
392 }
393
395 GetCanvas()->Refresh();
396
399}
400
401
403{
405
406 delete m_toolManager;
407 m_toolManager = nullptr;
408
409 Destroy();
410}
411
412
413void SYMBOL_VIEWER_FRAME::OnSize( wxSizeEvent& SizeEv )
414{
415 if( m_auimgr.GetManagedWindow() )
416 m_auimgr.Update();
417
418 SizeEv.Skip();
419}
420
421
423{
424 LIB_SYMBOL* symbol = GetSelectedSymbol();
425
426 int unit_count = 1;
427
428 if( symbol )
429 unit_count = std::max( symbol->GetUnitCount(), 1 );
430
431 m_unitChoice->Enable( unit_count > 1 );
432 m_unitChoice->Clear();
433
434 if( unit_count > 1 )
435 {
436 // rebuild the unit list if it is not suitable (after a new selection for instance)
437 if( unit_count != (int) m_unitChoice->GetCount() )
438 {
439 for( int ii = 0; ii < unit_count; ii++ )
440 m_unitChoice->Append( symbol->GetUnitDisplayName( ii + 1, true ) );
441 }
442
443 if( m_unitChoice->GetSelection() != std::max( 0, m_unit - 1 ) )
444 m_unitChoice->SetSelection( std::max( 0, m_unit - 1 ) );
445 }
446}
447
448
450{
451 LIB_SYMBOL* symbol = GetSelectedSymbol();
452
453 int bodyStyle_count = 1;
454
455 if( symbol )
456 bodyStyle_count = std::max( symbol->GetBodyStyleCount(), 1 );
457
458 m_bodyStyleChoice->Enable( bodyStyle_count > 1 );
459 m_bodyStyleChoice->Clear();
460
461 if( bodyStyle_count > 1 )
462 {
463 if( symbol && symbol->HasDeMorganBodyStyles() )
464 {
465 m_bodyStyleChoice->Append( wxGetTranslation( DEMORGAN_STD ) );
466 m_bodyStyleChoice->Append( wxGetTranslation( DEMORGAN_ALT ) );
467 }
468 else if( symbol )
469 {
470 for( int i = 0; i < symbol->GetBodyStyleCount(); i++ )
471 m_bodyStyleChoice->Append( symbol->GetBodyStyleNames()[i] );
472 }
473
474 if( m_bodyStyleChoice->GetSelection() != std::max( 0, m_bodyStyle - 1 ) )
475 m_bodyStyleChoice->SetSelection( std::max( 0, m_bodyStyle - 1 ) );
476 }
477}
478
479
481{
482 if( !m_libList )
483 return false;
484
485 m_libList->Clear();
486
490 std::vector<wxString> libNicknames = adapter->GetLibraryNames();
491 std::vector<wxString> pinnedMatches;
492 std::vector<wxString> otherMatches;
493
494 auto doAddLib =
495 [&]( const wxString& aLib )
496 {
497 if( alg::contains( project.m_PinnedSymbolLibs, aLib )
499 {
500 pinnedMatches.push_back( aLib );
501 }
502 else
503 {
504 otherMatches.push_back( aLib );
505 }
506 };
507
508 auto process =
509 [&]( const wxString& aLib )
510 {
511 // Remove not allowed libs, if the allowed lib list is not empty
512 if( m_allowedLibs.GetCount() )
513 {
514 if( m_allowedLibs.Index( aLib ) == wxNOT_FOUND )
515 return;
516 }
517
518 // Remove libs which have no power symbols, if this filter is activated
519 if( m_listPowerOnly )
520 {
521 std::vector<wxString> symbolNames = adapter->GetSymbolNames(
523
524 if( symbolNames.empty() )
525 return;
526 }
527
528 LIBRARY_TABLE_ROW* row = adapter->GetRow( aLib ).value_or( nullptr );
529 wxCHECK( row, /* void */ );
530
531 if( row->Hidden() )
532 return;
533
534 if( adapter->SupportsSubLibraries( aLib ) )
535 {
536 for( const auto& [nickname, description] : adapter->GetSubLibraries( aLib ) )
537 {
538 wxString suffix = nickname.IsEmpty()
539 ? wxString( wxT( "" ) )
540 : wxString::Format( wxT( " - %s" ), nickname );
541 wxString name = wxString::Format( wxT( "%s%s" ), aLib, suffix );
542
543 doAddLib( name );
544 }
545 }
546 else
547 {
548 doAddLib( aLib );
549 }
550 };
551
552 if( m_libFilter->GetValue().IsEmpty() )
553 {
554 for( const wxString& lib : libNicknames )
555 process( lib );
556 }
557 else
558 {
559 wxStringTokenizer tokenizer( m_libFilter->GetValue(), " \t\r\n", wxTOKEN_STRTOK );
560
561 while( tokenizer.HasMoreTokens() )
562 {
563 const wxString term = tokenizer.GetNextToken().Lower();
564 EDA_COMBINED_MATCHER matcher( term, CTX_LIBITEM );
565
566 for( const wxString& lib : libNicknames )
567 {
568 if( matcher.Find( lib.Lower() ) )
569 process( lib );
570 }
571 }
572 }
573
574 if( libNicknames.empty() )
575 return true;
576
577 for( const wxString& name : pinnedMatches )
579
580 for( const wxString& name : otherMatches )
581 m_libList->Append( UnescapeString( name ) );
582
583 // Search for a previous selection:
584 int index =
585 m_libList->FindString( UnescapeString( m_currentSymbol.GetUniStringLibNickname() ) );
586
587 if( index != wxNOT_FOUND )
588 {
589 m_libList->SetSelection( index, true );
590 }
591 else
592 {
593 // If not found, clear current library selection because it can be deleted after a
594 // config change.
595 m_currentSymbol.SetLibNickname( m_libList->GetCount() > 0 ? m_libList->GetBaseString( 0 )
596 : wxString( wxEmptyString ) );
597 m_currentSymbol.SetLibItemName( wxEmptyString );
598 m_unit = 1;
600 }
601
602 bool cmp_changed = ReCreateSymbolList();
604 GetCanvas()->Refresh();
605
606 return cmp_changed;
607}
608
609
611{
612 if( m_symbolList == nullptr )
613 return false;
614
615 m_symbolList->Clear();
616
617 wxString libName = m_currentSymbol.GetUniStringLibNickname();
618
619 if( libName.IsEmpty() )
620 return false;
621
623 std::vector<LIB_SYMBOL*> symbols = adapter->GetSymbols( libName );
624
625 std::set<wxString> excludes;
626
627 if( !m_symbolFilter->GetValue().IsEmpty() )
628 {
629 wxStringTokenizer tokenizer( m_symbolFilter->GetValue(), " \t\r\n", wxTOKEN_STRTOK );
630
631 while( tokenizer.HasMoreTokens() )
632 {
633 const wxString filterTerm = tokenizer.GetNextToken().Lower();
634 EDA_COMBINED_MATCHER matcher( filterTerm, CTX_LIBITEM );
635
636 for( LIB_SYMBOL* symbol : symbols )
637 {
638 std::vector<SEARCH_TERM> searchTerms = symbol->GetSearchTerms();
639 int matched = matcher.ScoreTerms( searchTerms );
640
641 if( filterTerm.IsNumber() && wxAtoi( filterTerm ) == (int)symbol->GetPinCount() )
642 matched++;
643
644 if( !matched )
645 excludes.insert( symbol->GetName() );
646 }
647 }
648 }
649
650 wxString subLib = m_currentSymbol.GetSubLibraryName();
651
652 for( const LIB_SYMBOL* symbol : symbols )
653 {
654 if( adapter->SupportsSubLibraries( libName )
655 && !subLib.IsSameAs( symbol->GetLibId().GetSubLibraryName() ) )
656 {
657 continue;
658 }
659
660 if( !excludes.count( symbol->GetName() ) )
661 m_symbolList->Append( UnescapeString( symbol->GetName() ) );
662 }
663
664 if( m_symbolList->IsEmpty() )
665 {
666 SetSelectedSymbol( wxEmptyString );
668 m_unit = 1;
669 return true;
670 }
671
672 int index =
673 m_symbolList->FindString( UnescapeString( m_currentSymbol.GetUniStringLibItemName() ) );
674 bool changed = false;
675
676 if( index == wxNOT_FOUND )
677 {
678 // Select the first library entry when the previous entry name does not exist in
679 // the current library.
681 m_unit = 1;
682 index = -1;
683 changed = true;
684 SetSelectedSymbol( wxEmptyString );
685 }
686
687 m_symbolList->SetSelection( index, true );
688
689 return changed;
690}
691
692
693void SYMBOL_VIEWER_FRAME::ClickOnLibList( wxCommandEvent& event )
694{
695 int ii = m_libList->GetSelection();
696
697 if( ii < 0 )
698 return;
699
700 m_selection_changed = true;
701
702 wxString selection = EscapeString( m_libList->GetBaseString( ii ), CTX_LIBID );
703
705
706 if( !adapter->HasLibrary( selection ) && selection.Find( '-' ) != wxNOT_FOUND )
707 {
708 // Probably a sub-library
709 wxString sublib;
710 selection = selection.BeforeLast( '-', &sublib ).Trim();
711 sublib.Trim( false );
712 SetSelectedLibrary( selection, sublib );
713 }
714 else
715 {
716 SetSelectedLibrary( selection );
717 }
718}
719
720
721void SYMBOL_VIEWER_FRAME::SetSelectedLibrary( const wxString& aLibraryName,
722 const wxString& aSubLibName )
723{
724 if( m_currentSymbol.GetUniStringLibNickname() == aLibraryName
725 && wxString( m_currentSymbol.GetSubLibraryName().wx_str() ) == aSubLibName )
726 return;
727
728 m_currentSymbol.SetLibNickname( aLibraryName );
729 m_currentSymbol.SetSubLibraryName( aSubLibName );
731 GetCanvas()->Refresh();
733
734 // Ensure the corresponding line in m_libList is selected
735 // (which is not necessary the case if SetSelectedLibrary is called
736 // by another caller than ClickOnLibList.
737 m_libList->SetStringSelection( UnescapeString( m_currentSymbol.GetFullLibraryName() ), true );
738
739 // The m_libList has now the focus, in order to be able to use arrow keys
740 // to navigate inside the list.
741 // the gal canvas must not steal the focus to allow navigation
742 GetCanvas()->SetStealsFocus( false );
743 m_libList->SetFocus();
744}
745
746
747void SYMBOL_VIEWER_FRAME::ClickOnSymbolList( wxCommandEvent& event )
748{
749 int ii = m_symbolList->GetSelection();
750
751 if( ii < 0 )
752 return;
753
754 m_selection_changed = true;
755
756 SetSelectedSymbol( EscapeString( m_symbolList->GetBaseString( ii ), CTX_LIBID ) );
757
758 // The m_symbolList has now the focus, in order to be able to use arrow keys
759 // to navigate inside the list.
760 // the gal canvas must not steal the focus to allow navigation
761 GetCanvas()->SetStealsFocus( false );
762 m_symbolList->SetFocus();
763}
764
765
766void SYMBOL_VIEWER_FRAME::SetSelectedSymbol( const wxString& aSymbolName )
767{
768 if( m_currentSymbol.GetUniStringLibItemName() != aSymbolName )
769 {
770 m_currentSymbol.SetLibItemName( aSymbolName );
771
772 // Ensure the corresponding line in m_symbolList is selected
773 // (which is not necessarily the case if SetSelectedSymbol is called
774 // by another caller than ClickOnSymbolList.
775 m_symbolList->SetStringSelection( UnescapeString( aSymbolName ), true );
777
779 {
780 m_unit = 1;
782 m_selection_changed = false;
783 }
784
786 }
787}
788
789
790void SYMBOL_VIEWER_FRAME::DClickOnSymbolList( wxCommandEvent& event )
791{
793}
794
795
797{
799
801 {
802 // Grid shape, etc.
803 GetGalDisplayOptions().ReadWindowSettings( cfg->m_LibViewPanel.window );
804
805 m_libListWidth = cfg->m_LibViewPanel.lib_list_width;
806 m_symbolListWidth = cfg->m_LibViewPanel.cmp_list_width;
807
808 GetRenderSettings()->m_ShowPinsElectricalType = cfg->m_LibViewPanel.show_pin_electrical_type;
809 GetRenderSettings()->m_ShowPinNumbers = cfg->m_LibViewPanel.show_pin_numbers;
810
811 // Set parameters to a reasonable value.
812 int maxWidth = cfg->m_LibViewPanel.window.state.size_x - 80;
813
814 if( m_libListWidth + m_symbolListWidth > maxWidth )
815 {
818 }
819 }
820}
821
822
824{
826
828 m_libListWidth = m_libList->GetSize().x;
829
830 m_symbolListWidth = m_symbolList->GetSize().x;
831
833 {
834 cfg->m_LibViewPanel.lib_list_width = m_libListWidth;
835 cfg->m_LibViewPanel.cmp_list_width = m_symbolListWidth;
836
837 if( SCH_RENDER_SETTINGS* renderSettings = GetRenderSettings() )
838 {
839 cfg->m_LibViewPanel.show_pin_electrical_type = renderSettings->m_ShowPinsElectricalType;
840 cfg->m_LibViewPanel.show_pin_numbers = renderSettings->m_ShowPinNumbers;
841 }
842 }
843}
844
845
847{
848 if( EESCHEMA_SETTINGS* cfg = dynamic_cast<EESCHEMA_SETTINGS*>( aCfg ) )
849 return &cfg->m_LibViewPanel.window;
850
851 wxFAIL_MSG( wxT( "SYMBOL_VIEWER not running with EESCHEMA_SETTINGS" ) );
852 return &aCfg->m_Window; // non-null fail-safe
853}
854
855
857{
859
861 GetGalDisplayOptions().ReadWindowSettings( cfg->m_LibViewPanel.window );
862
864 GetCanvas()->GetGAL()->DrawGrid();
866
867 if( aFlags && ENVVARS_CHANGED )
869}
870
871
872void SYMBOL_VIEWER_FRAME::OnActivate( wxActivateEvent& event )
873{
874 if( event.GetActive() )
875 {
876 bool changed = m_libList ? ReCreateLibList() : false;
877
878 if (changed)
879 m_selection_changed = true;
880
882
884 }
885
886 event.Skip(); // required under wxMAC
887}
888
889
890void SYMBOL_VIEWER_FRAME::CloseLibraryViewer( wxCommandEvent& event )
891{
892 Close();
893}
894
895
896const BOX2I SYMBOL_VIEWER_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
897{
898 if( LIB_SYMBOL* symbol = GetSelectedSymbol() )
899 return symbol->GetUnitBoundingBox( m_unit, m_bodyStyle );
900
901 return BOX2I( VECTOR2I( -200, -200 ), VECTOR2I( 400, 400 ) );
902}
903
904
905void SYMBOL_VIEWER_FRAME::OnLibFilter( wxCommandEvent& aEvent )
906{
908
909 // Required to avoid interaction with SetHint()
910 // See documentation for wxTextEntry::SetHint
911 aEvent.Skip();
912}
913
914
915void SYMBOL_VIEWER_FRAME::OnSymFilter( wxCommandEvent& aEvent )
916{
918
919 // Required to avoid interaction with SetHint()
920 // See documentation for wxTextEntry::SetHint
921 aEvent.Skip();
922}
923
924
925void SYMBOL_VIEWER_FRAME::OnCharHook( wxKeyEvent& aEvent )
926{
927 if( aEvent.GetKeyCode() == WXK_UP )
928 {
929 if( m_libFilter->HasFocus() || m_libList->HasFocus() )
930 {
931 int prev = m_libList->GetSelection() - 1;
932
933 if( prev >= 0 )
934 {
935 m_libList->SetSelection( prev );
936 m_libList->EnsureVisible( prev );
937
938 wxCommandEvent dummy;
940 }
941 }
942 else
943 {
944 wxCommandEvent dummy;
946 }
947 }
948 else if( aEvent.GetKeyCode() == WXK_DOWN )
949 {
950 if( m_libFilter->HasFocus() || m_libList->HasFocus() )
951 {
952 int next = m_libList->GetSelection() + 1;
953
954 if( next < (int)m_libList->GetCount() )
955 {
956 m_libList->SetSelection( next );
957 m_libList->EnsureVisible( next );
958
959 wxCommandEvent dummy;
961 }
962 }
963 else
964 {
965 wxCommandEvent dummy;
967 }
968 }
969 else if( aEvent.GetKeyCode() == WXK_TAB && m_libFilter->HasFocus() )
970 {
971 if( !aEvent.ShiftDown() )
972 m_symbolFilter->SetFocus();
973 else
974 aEvent.Skip();
975 }
976 else if( aEvent.GetKeyCode() == WXK_TAB && m_symbolFilter->HasFocus() )
977 {
978 if( aEvent.ShiftDown() )
979 m_libFilter->SetFocus();
980 else
981 aEvent.Skip();
982 }
983 else if( ( aEvent.GetKeyCode() == WXK_RETURN || aEvent.GetKeyCode() == WXK_NUMPAD_ENTER )
984 && m_symbolList->GetSelection() >= 0 )
985 {
986 wxCommandEvent dummy;
988 }
989 else
990 {
991 aEvent.Skip();
992 }
993}
994
995
996void SYMBOL_VIEWER_FRAME::onSelectNextSymbol( wxCommandEvent& aEvent )
997{
998 wxCommandEvent evt( wxEVT_COMMAND_LISTBOX_SELECTED, ID_LIBVIEW_SYM_LIST );
999 int ii = m_symbolList->GetSelection();
1000
1001 // Select the next symbol or stop at the end of the list.
1002 if( ii != wxNOT_FOUND && ii < (int) ( m_symbolList->GetCount() - 1 ) )
1003 ii += 1;
1004
1005 m_symbolList->SetSelection( ii );
1006 ProcessEvent( evt );
1007}
1008
1009
1011{
1012 wxCommandEvent evt( wxEVT_COMMAND_LISTBOX_SELECTED, ID_LIBVIEW_SYM_LIST );
1013 int ii = m_symbolList->GetSelection();
1014
1015 // Select the previous symbol or stop at the beginning of list.
1016 if( ii != wxNOT_FOUND && ii != 0 )
1017 ii -= 1;
1018
1019 m_symbolList->SetSelection( ii );
1020 ProcessEvent( evt );
1021}
1022
1023
1024void SYMBOL_VIEWER_FRAME::onSelectSymbolUnit( wxCommandEvent& aEvent )
1025{
1026 int ii = m_unitChoice->GetSelection();
1027
1028 if( ii < 0 )
1029 return;
1030
1031 m_unit = ii + 1;
1032
1034}
1035
1036
1038{
1039 int ii = m_bodyStyleChoice->GetSelection();
1040
1041 if( ii < 0 )
1042 return;
1043
1044 m_bodyStyle = ii + 1;
1045
1047}
1048
1049
1051{
1052 wxString libName = m_currentSymbol.GetUniStringLibNickname();
1053
1054 if( m_libList && !m_libList->IsEmpty() && !libName.IsEmpty() )
1055 {
1057 LIBRARY_TABLE_ROW* row = adapter->GetRow( libName ).value_or( nullptr );
1058
1059 wxString title = row
1060 ? LIBRARY_MANAGER::GetFullURI( row, true )
1061 : _( "[no library selected]" );
1062
1063 title += wxT( " \u2014 " ) + _( "Symbol Library Browser" );
1064 SetTitle( title );
1065 }
1066}
1067
1068
1070{
1071 return m_toolManager->GetTool<SCH_SELECTION_TOOL>()->GetSelection();
1072}
1073
1074
1076{
1077
1078 switch( mail.Command() )
1079 {
1080 case MAIL_RELOAD_LIB:
1082 break;
1083
1085 {
1086 LIB_SYMBOL* symbol = GetSelectedSymbol();
1087 wxCHECK2( symbol, break );
1088
1090 LIBRARY_TABLE_ROW* row =
1091 adapter->GetRow( symbol->GetLibId().GetLibNickname() ).value_or( nullptr );
1092
1093 if( !row )
1094 return;
1095
1096 wxString libfullname = LIBRARY_MANAGER::GetFullURI( row, true );
1097
1098 wxString lib( mail.GetPayload() );
1099 wxLogTrace( traceLibWatch, "Received refresh symbol request for %s, current symbols is %s",
1100 lib, libfullname );
1101
1102 if( lib == libfullname )
1103 {
1104 wxLogTrace( traceLibWatch, "Refreshing symbol %s", symbol->GetName() );
1107 }
1108
1109 break;
1110 }
1111 default:;
1112 }
1113}
int index
const char * name
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:114
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition bitmap.cpp:104
@ library_browser
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
BOX2< VECTOR2D > BOX2D
Definition box2.h:923
static TOOL_ACTION toggleGrid
Definition actions.h:198
static TOOL_ACTION showDatasheet
Definition actions.h:267
static TOOL_ACTION zoomFitScreen
Definition actions.h:142
Manage TOOL_ACTION objects.
void SetConditions(const TOOL_ACTION &aAction, const ACTION_CONDITIONS &aConditions)
Set the conditions the UI elements for activating a specific tool action should use for determining t...
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
WINDOW_SETTINGS m_Window
constexpr void SetOrigin(const Vec &pos)
Definition box2.h:237
constexpr void SetSize(const SizeVec &size)
Definition box2.h:248
Handle actions that are shared between different applications.
Handles action that are shared between different applications.
virtual APP_SETTINGS_BASE * config() const
Return the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
virtual void setupUIConditions()
Setup the UI conditions for the various actions and their controls in this frame.
TOOLBAR_SETTINGS * m_toolbarSettings
wxString m_configName
wxAuiManager m_auimgr
virtual void RecreateToolbars()
bool ProcessEvent(wxEvent &aEvent) override
Override the default process event handler to implement the auto save feature.
ACTION_TOOLBAR * m_tbTopMain
wxString m_aboutTitle
void ReCreateMenuBar()
Recreate the menu bar.
int ScoreTerms(std::vector< SEARCH_TERM > &aWeightedTerms)
bool Find(const wxString &aTerm, int &aMatchersTriggered, int &aPosition)
Look in all existing matchers, return the earliest match of any of the existing.
virtual void ClearMsgPanel()
Clear all messages from the message panel.
COLOR_SETTINGS * m_colorSettings
void OnSelectGrid(wxCommandEvent &event)
Command event handler for selecting grid sizes.
void setupUnits(APP_SETTINGS_BASE *aCfg)
virtual void OnSelectZoom(wxCommandEvent &event)
Set the zoom factor when selected by the zoom list box in the main tool bar.
GAL_DISPLAY_OPTIONS_IMPL & GetGalDisplayOptions()
Return a reference to the gal rendering options used by GAL for rendering.
EDA_MSG_PANEL * m_messagePanel
virtual void SetScreen(BASE_SCREEN *aScreen)
void AppendMsgPanel(const wxString &aTextUpper, const wxString &aTextLower, int aPadding=6)
Append a message to the message panel.
void ForceRefresh()
Force a redraw.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
KIGFX::GAL * GetGAL() const
Return a pointer to the GAL instance used in the panel.
void SetEventDispatcher(TOOL_DISPATCHER *aEventDispatcher)
Set a dispatcher that processes events and forwards them to tools.
void SetStealsFocus(bool aStealsFocus)
Set whether focus is taken on certain events (mouseover, keys, etc).
Specialization of the wxAuiPaneInfo class for KiCad panels.
Class that groups generic conditions for editor states.
SELECTION_CONDITION GridVisible()
Create a functor testing if the grid is visible in a frame.
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
double m_gridMinSpacing
Whether or not to draw the coordinate system axes.
bool m_axesEnabled
Crosshair drawing mode.
void SetAxesColor(const COLOR4D &aAxesColor)
Set the axes color.
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
Definition view.cpp:298
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
Definition view.cpp:341
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition view.cpp:1561
Carry a payload from one KIWAY_PLAYER to another within a PROJECT.
std::string & GetPayload()
Return the payload, which can be any text but it typically self identifying s-expression.
MAIL_T Command()
Returns the MAIL_T associated with this mail.
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition kiway.h:294
virtual PROJECT & Prj() const
Return the PROJECT associated with this KIWAY.
Definition kiway.cpp:200
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library tables.
std::optional< LIBRARY_TABLE_ROW * > GetRow(const wxString &aNickname, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH) const
Like LIBRARY_MANAGER::GetRow but filtered to the LIBRARY_TABLE_TYPE of this adapter.
std::vector< wxString > GetLibraryNames() const
Returns a list of library nicknames that are available (skips any that failed to load)
std::optional< wxString > GetFullURI(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
bool Hidden() const
A logical library item identifier and consists of various portions much like a URI.
Definition lib_id.h:49
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition lib_id.h:87
Define a library symbol object.
Definition lib_symbol.h:83
const LIB_ID & GetLibId() const override
Definition lib_symbol.h:153
std::weak_ptr< LIB_SYMBOL > & GetParent()
Definition lib_symbol.h:115
SCH_FIELD & GetDatasheetField()
Return reference to the datasheet field.
Definition lib_symbol.h:345
wxString GetName() const override
Definition lib_symbol.h:146
const std::vector< wxString > & GetBodyStyleNames() const
Definition lib_symbol.h:774
bool HasDeMorganBodyStyles() const override
Definition lib_symbol.h:771
int GetBodyStyleCount() const override
Definition lib_symbol.h:763
int GetUnitCount() const override
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
wxString GetUnitDisplayName(int aUnit, bool aLabel) const override
Return the user-defined display name for aUnit for symbols with units.
static const wxString GetPinningSymbol()
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition pgm_base.cpp:547
The backing store for a PROJECT, in JSON format.
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
virtual PROJECT_FILE & GetProjectFile() const
Definition project.h:199
Gather all the actions that are shared by tools.
Definition sch_actions.h:40
static TOOL_ACTION showElectricalTypes
static TOOL_ACTION showPinNumbers
static TOOL_ACTION addSymbolToSchematic
A shim class between EDA_DRAW_FRAME and several derived classes: SYMBOL_EDIT_FRAME,...
SCH_BASE_FRAME(KIWAY *aKiway, wxWindow *aParent, FRAME_T aWindowType, const wxString &aTitle, const wxPoint &aPosition, const wxSize &aSize, long aStyle, const wxString &aFrameName)
SCH_RENDER_SETTINGS * GetRenderSettings()
void doCloseWindow() override
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
void SyncView()
Mark all items for refresh.
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
virtual const wxString & GetText() const override
Return the string associated with the text object.
Definition sch_field.h:118
Handle actions for the various symbol editor and viewers.
An interface to the global shared library manager that is schematic-specific and linked to one projec...
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
std::vector< wxString > GetSymbolNames(const wxString &aNickname, SYMBOL_TYPE aType=SYMBOL_TYPE::ALL_SYMBOLS)
bool SupportsSubLibraries(const wxString &aNickname) const
std::vector< SUB_LIBRARY > GetSubLibraries(const wxString &aNickname) const
std::vector< LIB_SYMBOL * > GetSymbols(const wxString &aNickname, SYMBOL_TYPE aType=SYMBOL_TYPE::ALL_SYMBOLS)
Symbol library viewer main window.
void OnLibFilter(wxCommandEvent &aEvent)
std::unique_ptr< LIB_SYMBOL > m_previewItem
void CloseLibraryViewer(wxCommandEvent &event)
void onSelectNextSymbol(wxCommandEvent &aEvent)
void SetSelectedLibrary(const wxString &aLibName, const wxString &aSubLibName=wxEmptyString)
Set the selected library in the library window.
void ClickOnLibList(wxCommandEvent &event)
SYMBOL_VIEWER_FRAME(KIWAY *aKiway, wxWindow *aParent)
void DClickOnSymbolList(wxCommandEvent &event)
void OnActivate(wxActivateEvent &event)
Called when the frame is activated to reload the libraries and symbol lists that can be changed by th...
void OnSymFilter(wxCommandEvent &aEvent)
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
void SetSelectedSymbol(const wxString &aSymbolName)
Set the selected symbol.
void KiwayMailIn(KIWAY_EXPRESS &mail) override
Receive KIWAY_EXPRESS messages from other players.
bool ReCreateLibList()
Create o recreates a sorted list of currently loaded libraries.
SELECTION & GetCurrentSelection() override
Get the current selection from the canvas area.
void ClickOnSymbolList(wxCommandEvent &event)
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Return bounding box of document with option to not include some items.
void SetUnitAndBodyStyle(int aUnit, int aBodyStyle)
Set unit and convert, and set flag preventing them from automatically resetting to 1.
wxSearchCtrl * m_symbolFilter
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
WINDOW_SETTINGS * GetWindowSettings(APP_SETTINGS_BASE *aCfg) override
Return a pointer to the window settings for this frame.
void OnCharHook(wxKeyEvent &aEvent) override
Capture the key event before it is sent to the GUI.
LIB_SYMBOL * GetSelectedSymbol() const
void onSelectSymbolUnit(wxCommandEvent &aEvent)
void OnSize(wxSizeEvent &event) override
Recalculate the size of toolbars and display panel when the frame size changes.
void onSelectPreviousSymbol(wxCommandEvent &aEvent)
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
void onSelectSymbolBodyStyle(wxCommandEvent &aEvent)
bool m_selection_changed
Updated to true if a list rewrite on GUI activation resulted in the symbol selection changing,...
bool ReCreateSymbolList()
Create or recreate the list of symbols in the currently selected library.
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
TOOL_MANAGER * m_toolManager
TOOL_DISPATCHER * m_toolDispatcher
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
ACTIONS * m_actions
Master controller class:
This file is part of the common library.
#define CHECK(x)
#define ENABLE(x)
#define DEFAULT_LINE_WIDTH_MILS
The default wire width in mils. (can be changed in preference menu)
#define _(s)
#define KICAD_DEFAULT_DRAWFRAME_STYLE
#define LIB_VIEW_FRAME_NAME
Abstract pattern-matching tool and implementations.
@ CTX_LIBITEM
@ ID_LIBVIEW_SELECT_UNIT_NUMBER
Definition eeschema_id.h:71
@ ID_LIBVIEW_SYM_LIST
Definition eeschema_id.h:76
@ ID_LIBVIEW_NEXT
Definition eeschema_id.h:69
@ ID_LIBVIEW_SELECT_BODY_STYLE
Definition eeschema_id.h:72
@ ID_LIBVIEW_LIB_FILTER
Definition eeschema_id.h:73
@ ID_LIBVIEW_LIB_LIST
Definition eeschema_id.h:74
@ ID_LIBVIEW_SYM_FILTER
Definition eeschema_id.h:75
@ ID_LIBVIEW_PREVIOUS
Definition eeschema_id.h:70
@ FRAME_SCH_VIEWER
Definition frame_type.h:36
const wxChar *const traceLibWatch
Flag to enable debug output for library file watch refreshes.
@ ID_ON_GRID_SELECT
Definition id.h:113
@ ID_ON_ZOOM_SELECT
Definition id.h:112
PROJECT & Prj()
Definition kicad.cpp:637
@ LAYER_SCHEMATIC_GRID_AXES
Definition layer_ids.h:487
@ MAIL_REFRESH_SYMBOL
Definition mail_type.h:59
@ MAIL_RELOAD_LIB
Definition mail_type.h:57
Message panel definition file.
@ ALL
All except INITIAL_ADD.
Definition view_item.h:59
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Definition kicad_algo.h:100
#define _HKI(x)
Definition page_info.cpp:44
static PGM_BASE * process
PGM_BASE & Pgm()
The global program "get" accessor.
see class PGM_BASE
CITER next(CITER it)
Definition ptree.cpp:124
@ BASE
Definition sch_item.h:59
COLOR_SETTINGS * GetColorSettings(const wxString &aName)
T * GetToolbarSettings(const wxString &aFilename)
T * GetAppSettings(const char *aFilename)
KIWAY Kiway(KFCTL_STANDALONE)
std::vector< FAB_LAYER_COLOR > dummy
wxString UnescapeString(const wxString &aSource)
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
@ CTX_LIBID
std::vector< wxString > pinned_symbol_libs
Store the common settings that are saved and loaded for each window / frame.
#define DEMORGAN_ALT
#define DEMORGAN_STD
#define ENVVARS_CHANGED
wxLogTrace helper definitions.
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695
void SetAuiPaneSize(wxAuiManager &aManager, wxAuiPaneInfo &aPane, int aWidth, int aHeight)
Sets the size of an AUI pane, working around http://trac.wxwidgets.org/ticket/13180.