diff options
Diffstat (limited to 'cvpcb/class_footprints_listbox.cpp')
-rw-r--r-- | cvpcb/class_footprints_listbox.cpp | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/cvpcb/class_footprints_listbox.cpp b/cvpcb/class_footprints_listbox.cpp new file mode 100644 index 0000000..78ce524 --- /dev/null +++ b/cvpcb/class_footprints_listbox.cpp @@ -0,0 +1,291 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com + * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file class_footprints_listbox.cpp + * class to display the list of available footprints + */ + +#include <fctsys.h> +#include <wxstruct.h> +#include <macros.h> +#include <pgm_base.h> +#include <wildcards_and_files_ext.h> + +#include <cvpcb.h> +#include <cvpcb_mainframe.h> +#include <cvstruct.h> +#include <cvpcb_id.h> + + +FOOTPRINTS_LISTBOX::FOOTPRINTS_LISTBOX( CVPCB_MAINFRAME* parent, + wxWindowID id, const wxPoint& loc, + const wxSize& size ) : + ITEMS_LISTBOX_BASE( parent, id, loc, size, wxLC_SINGLE_SEL ) +{ +} + + +FOOTPRINTS_LISTBOX::~FOOTPRINTS_LISTBOX() +{ +} + + +int FOOTPRINTS_LISTBOX::GetCount() +{ + return m_footprintList.Count(); +} + + +void FOOTPRINTS_LISTBOX::SetString( unsigned linecount, const wxString& text ) +{ + unsigned count = m_footprintList.Count(); + if( count > 0 ) + { + if( linecount >= count ) + linecount = count - 1; + m_footprintList[linecount] = text; + } + UpdateWidth( linecount ); +} + + +wxString FOOTPRINTS_LISTBOX::GetSelectedFootprint() +{ + wxString footprintName; + int ii = GetFirstSelected(); + + if( ii >= 0 ) + { + wxString msg = m_footprintList[ii]; + msg.Trim( true ); + msg.Trim( false ); + footprintName = msg.AfterFirst( wxChar( ' ' ) ); + } + + return footprintName; +} + + +void FOOTPRINTS_LISTBOX::AppendLine( const wxString& text ) +{ + m_footprintList.Add( text ); + int lines = m_footprintList.Count(); + SetItemCount( lines ); + UpdateWidth( lines - 1 ); +} + + +wxString FOOTPRINTS_LISTBOX::OnGetItemText( long item, long column ) const +{ + if( item < 0 || item >= (long)m_footprintList.GetCount() ) + return wxEmptyString; + + return m_footprintList.Item( item ); +} + + +void FOOTPRINTS_LISTBOX::SetSelection( int index, bool State ) +{ + if( index >= GetCount() ) + index = GetCount() - 1; + + if( (index >= 0) && (GetCount() > 0) ) + { +#ifndef __WXMAC__ + Select( index, State ); +#endif + + EnsureVisible( index ); + +#ifdef __WXMAC__ + Refresh(); +#endif + } +} + + +void FOOTPRINTS_LISTBOX::SetFootprints( FOOTPRINT_LIST& aList, const wxString& aLibName, + COMPONENT* aComponent, int aFilterType ) +{ + wxArrayString newList; + wxString msg; + wxString oldSelection; + + if( GetSelection() >= 0 && GetSelection() < (int)m_footprintList.GetCount() ) + oldSelection = m_footprintList[ GetSelection() ]; + + for( unsigned ii = 0; ii < aList.GetCount(); ii++ ) + { + if( aFilterType == UNFILTERED ) + { + msg.Printf( wxT( "%3d %s:%s" ), int( newList.GetCount() + 1 ), + GetChars( aList.GetItem( ii ).GetNickname() ), + GetChars( aList.GetItem( ii ).GetFootprintName() ) ); + newList.Add( msg ); + continue; + } + + if( (aFilterType & BY_LIBRARY) && !aLibName.IsEmpty() + && !aList.GetItem( ii ).InLibrary( aLibName ) ) + continue; + + if( (aFilterType & BY_COMPONENT) && aComponent + && !aComponent->MatchesFootprintFilters( aList.GetItem( ii ).GetFootprintName() ) ) + continue; + + if( (aFilterType & BY_PIN_COUNT) && aComponent + && aComponent->GetNetCount() != aList.GetItem( ii ).GetUniquePadCount() ) + continue; + + msg.Printf( wxT( "%3d %s:%s" ), int( newList.GetCount() + 1 ), + GetChars( aList.GetItem( ii ).GetNickname() ), + GetChars( aList.GetItem( ii ).GetFootprintName() ) ); + newList.Add( msg ); + } + + if( newList == m_footprintList ) + return; + + m_footprintList = newList; + + int selection = m_footprintList.Index( oldSelection ); + + if( selection == wxNOT_FOUND ) + selection = 0; + + DeleteAllItems(); + + if( m_footprintList.GetCount() ) + { + SetItemCount( m_footprintList.GetCount() ); + SetSelection( selection, true ); + RefreshItems( 0L, m_footprintList.GetCount()-1 ); + UpdateWidth(); + } +} + + +BEGIN_EVENT_TABLE( FOOTPRINTS_LISTBOX, ITEMS_LISTBOX_BASE ) + EVT_CHAR( FOOTPRINTS_LISTBOX::OnChar ) + EVT_LIST_ITEM_SELECTED( ID_CVPCB_FOOTPRINT_LIST, FOOTPRINTS_LISTBOX::OnLeftClick ) + EVT_LIST_ITEM_ACTIVATED( ID_CVPCB_FOOTPRINT_LIST, FOOTPRINTS_LISTBOX::OnLeftDClick ) +END_EVENT_TABLE() + + +void FOOTPRINTS_LISTBOX::OnLeftClick( wxListEvent& event ) +{ + if( m_footprintList.IsEmpty() ) + return; + + // On some plateforms (OSX) the focus is lost when the viewers (fp and 3D viewers) + // are opened and refreshed when a new footprint is selected. + // If the listbox has the focus before selecting a new footprint, it will be forced + // after selection. + bool hasFocus = HasFocus(); + + // If the footprint view window is displayed, update the footprint. + if( GetParent()->GetFpViewerFrame() ) + GetParent()->CreateScreenCmp(); + + GetParent()->DisplayStatus(); + + if( hasFocus ) + SetFocus(); +} + + +void FOOTPRINTS_LISTBOX::OnLeftDClick( wxListEvent& event ) +{ + wxString footprintName = GetSelectedFootprint(); + + GetParent()->SetNewPkg( footprintName ); +} + + +void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event ) +{ + int key = event.GetKeyCode(); + + switch( key ) + { + case WXK_TAB: + case WXK_RIGHT: + case WXK_NUMPAD_RIGHT: + GetParent()->ChangeFocus( true ); + return; + + case WXK_LEFT: + case WXK_NUMPAD_LEFT: + GetParent()->ChangeFocus( false ); + return; + + case WXK_HOME: + case WXK_END: + case WXK_UP: + case WXK_DOWN: + case WXK_PAGEUP: + case WXK_PAGEDOWN: + event.Skip(); + return; + + default: + break; + } + + // Search for an item name starting by the key code: + key = toupper( key ); + + for( unsigned ii = 0; ii < m_footprintList.GetCount(); ii++ ) + { + wxString text = m_footprintList.Item( ii ); + + // Search for the start char of the footprint name. Skip the line number. + text.Trim( false ); // Remove leading spaces in line + unsigned jj = 0; + + for( ; jj < text.Len(); jj++ ) + { + // skip line number + if( text[jj] == ' ' ) + break; + } + + for( ; jj < text.Len(); jj++ ) + { // skip blanks + if( text[jj] != ' ' ) + break; + } + + int start_char = toupper( text[jj] ); + + if( key == start_char ) + { + SetSelection( ii, true ); // Ensure visible + break; + } + } + + event.Skip(); +} |