/*************************************************************************/ /* viewlib_frame.cpp - fonctions des classes du type WinEDA_ViewlibFrame */ /*************************************************************************/ #include "fctsys.h" #include "appl_wxstruct.h" #include "common.h" #include "class_drawpanel.h" #include "program.h" #include "libcmp.h" #include "general.h" #include "bitmaps.h" #include "protos.h" #include "id.h" /*****************************/ /* class WinEDA_ViewlibFrame */ /*****************************/ BEGIN_EVENT_TABLE( WinEDA_ViewlibFrame, WinEDA_DrawFrame ) EVT_CLOSE( WinEDA_ViewlibFrame::OnCloseWindow ) EVT_SIZE( WinEDA_ViewlibFrame::OnSize ) EVT_ACTIVATE( WinEDA_DrawFrame::OnActivate ) EVT_TOOL_RANGE( ID_LIBVIEW_START_H_TOOL, ID_LIBVIEW_END_H_TOOL, WinEDA_ViewlibFrame::Process_Special_Functions ) EVT_TOOL_RANGE( ID_ZOOM_IN, ID_ZOOM_PAGE, WinEDA_ViewlibFrame::OnZoom ) EVT_TOOL( ID_LIBVIEW_CMP_EXPORT_TO_SCHEMATIC, WinEDA_ViewlibFrame::ExportToSchematicLibraryPart ) EVT_KICAD_CHOICEBOX( ID_LIBVIEW_SELECT_PART_NUMBER, WinEDA_ViewlibFrame::Process_Special_Functions ) EVT_LISTBOX( ID_LIBVIEW_LIB_LIST, WinEDA_ViewlibFrame::ClickOnLibList ) EVT_LISTBOX( ID_LIBVIEW_CMP_LIST, WinEDA_ViewlibFrame::ClickOnCmpList ) END_EVENT_TABLE() /* * This emulates the zoom menu entries found in the other Kicad applications. * The library viewer does not have any menus so add an accelerator table to * the main frame. */ static wxAcceleratorEntry accels[] = { wxAcceleratorEntry( wxACCEL_NORMAL, WXK_F1, ID_POPUP_ZOOM_IN ), wxAcceleratorEntry( wxACCEL_NORMAL, WXK_F2, ID_POPUP_ZOOM_OUT ), wxAcceleratorEntry( wxACCEL_NORMAL, WXK_F3, ID_ZOOM_REDRAW ), wxAcceleratorEntry( wxACCEL_NORMAL, WXK_F4, ID_POPUP_ZOOM_CENTER ) }; #define ACCEL_TABLE_CNT ( sizeof( accels ) / sizeof( wxAcceleratorEntry ) ) /******************************************************************************/ WinEDA_ViewlibFrame::WinEDA_ViewlibFrame( wxWindow* father, LibraryStruct* Library, wxSemaphore* semaphore ) : WinEDA_DrawFrame( father, VIEWER_FRAME, _( "Library browser" ), wxDefaultPosition, wxDefaultSize ) /******************************************************************************/ { wxAcceleratorTable table( ACCEL_TABLE_CNT, accels ); m_FrameName = wxT( "ViewlibFrame" ); m_Draw_Axis = TRUE; // TRUE to dispaly Axis m_Draw_Grid = TRUE; // TRUE to display grid // Give an icon SetIcon( wxIcon( library_browse_xpm ) ); m_CmpList = NULL; m_LibList = NULL; m_Semaphore = semaphore; if( m_Semaphore ) SetWindowStyle( GetWindowStyle() | wxSTAY_ON_TOP ); SetBaseScreen( new SCH_SCREEN() ); GetScreen()->m_Center = true; // set to true to have the coordinates origine -0,0) centered on screen if( Library == NULL ) { m_LibListSize.x = 150; // Width of library list m_LibListSize.y = -1; m_LibList = new wxListBox( this, ID_LIBVIEW_LIB_LIST, wxPoint( 0, 0 ), m_LibListSize, 0, NULL, wxLB_HSCROLL ); m_LibList->SetFont( *g_DialogFont ); m_LibList->SetBackgroundColour( wxColour( 255, 255, 255 ) ); // Library background listbox color (white) m_LibList->SetForegroundColour( wxColour( 0, 0, 0 ) ); // Library foreground listbox color (black) } else g_CurrentViewLibraryName = Library->m_Name; m_CmpListSize.x = 150; // Width of component list m_CmpListSize.y = -1; m_CmpList = new wxListBox( this, ID_LIBVIEW_CMP_LIST, wxPoint( m_LibListSize.x, 0 ), m_CmpListSize, 0, NULL, wxLB_HSCROLL ); m_CmpList->SetFont( *g_DialogFont ); m_CmpList->SetBackgroundColour( wxColour( 255, 255, 255 ) ); // Component background listbox color (white) m_CmpList->SetForegroundColour( wxColour( 0, 0, 0 ) ); // Component foreground listbox color (black) GetSettings(); SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y ); ReCreateHToolbar(); ReCreateVToolbar(); if( m_LibList ) ReCreateListLib(); DisplayLibInfos(); if( DrawPanel ) DrawPanel->SetAcceleratorTable( table ); BestZoom(); Show( TRUE ); } /*******************************************/ WinEDA_ViewlibFrame::~WinEDA_ViewlibFrame() /*******************************************/ { delete GetScreen(); SetBaseScreen( 0 ); WinEDA_SchematicFrame* frame = (WinEDA_SchematicFrame*) wxGetApp().GetTopWindow(); frame->m_ViewlibFrame = NULL; } /*****************************************************************/ void WinEDA_ViewlibFrame::OnCloseWindow( wxCloseEvent& Event ) /*****************************************************************/ { SaveSettings(); if( m_Semaphore ) m_Semaphore->Post(); Destroy(); } /*****************************************************/ void WinEDA_ViewlibFrame::OnSize( wxSizeEvent& SizeEv ) /*****************************************************/ { wxSize size; wxSize maintoolbar_size; wxSize Vtoolbar_size; GetClientSize( &size.x, &size.y ); m_FrameSize = size; size.y -= m_MsgFrameHeight; if( m_HToolBar ) { maintoolbar_size = m_HToolBar->GetSize(); } if( m_VToolBar ) { Vtoolbar_size = m_VToolBar->GetSize(); m_VToolBar->SetSize( size.x - maintoolbar_size.y, 0, -1, size.y ); } if( MsgPanel ) { MsgPanel->SetSize( 0, size.y, size.x, m_MsgFrameHeight ); } if( DrawPanel ) { DrawPanel->SetSize( m_LibListSize.x + m_CmpListSize.x, 0, size.x - Vtoolbar_size.x - m_LibListSize.x - m_CmpListSize.x, size.y ); } if( m_LibList ) { m_LibListSize.y = size.y; m_LibList->SetSize( 0, 0, m_LibListSize.x, m_LibListSize.y ); } if( m_CmpList ) { m_CmpListSize.y = size.y; m_CmpList->SetSize( m_LibListSize.x, 0, m_CmpListSize.x, m_CmpListSize.y ); } } /***********************************/ int WinEDA_ViewlibFrame::BestZoom() /***********************************/ { int bestzoom, ii, jj; wxSize size, itemsize; EDA_LibComponentStruct* CurrentLibEntry = NULL; CurrentLibEntry = FindLibPart( g_CurrentViewComponentName.GetData(), g_CurrentViewLibraryName.GetData(), FIND_ROOT ); if( CurrentLibEntry == NULL ) { bestzoom = 16; GetScreen()->m_Curseur.x = 0; GetScreen()->m_Curseur.y = 0; return bestzoom; } EDA_Rect BoundaryBox = CurrentLibEntry->GetBoundaryBox( g_ViewUnit, g_ViewConvert ); itemsize = BoundaryBox.GetSize(); size = DrawPanel->GetClientSize(); size -= wxSize( 100, 100 ); // reserve a 100 mils margin ii = itemsize.x / size.x; jj = itemsize.y / size.y; bestzoom = MAX( ii, jj ) + 1; GetScreen()->m_Curseur = BoundaryBox.Centre(); return bestzoom * GetScreen()->m_ZoomScalar; } /******************************************/ void WinEDA_ViewlibFrame::ReCreateListLib() /******************************************/ { const wxChar** ListNames, ** names; int ii; bool found = FALSE; if( m_LibList == NULL ) return; ListNames = GetLibNames(); m_LibList->Clear(); for( names = ListNames, ii = 0; *names != NULL; names++, ii++ ) { m_LibList->Append( *names ); if( g_CurrentViewLibraryName.Cmp( *names ) == 0 ) { m_LibList->SetSelection( ii, TRUE ); found = TRUE; } } free( ListNames ); /* Clear current library because it can be deleted after a config change */ if( !found ) { g_CurrentViewLibraryName.Empty(); g_CurrentViewComponentName.Empty(); } ReCreateListCmp(); ReCreateHToolbar(); DisplayLibInfos(); DrawPanel->Refresh(); } /***********************************************/ void WinEDA_ViewlibFrame::ReCreateListCmp() /***********************************************/ { int ii; EDA_LibComponentStruct* LibEntry = NULL; LibraryStruct* Library = FindLibrary( g_CurrentViewLibraryName.GetData() ); m_CmpList->Clear(); ii = 0; g_CurrentViewComponentName.Empty(); g_ViewConvert = 1; /* Select normal/"de morgan" shape */ g_ViewUnit = 1; /* Selec unit to display for multiple parts per package */ if( Library ) LibEntry = (EDA_LibComponentStruct*) PQFirst( &Library->m_Entries, FALSE ); while( LibEntry ) { m_CmpList->Append( LibEntry->m_Name.m_Text ); LibEntry = (EDA_LibComponentStruct*) PQNext( Library->m_Entries, LibEntry, NULL ); } } /********************************************************************/ void WinEDA_ViewlibFrame::ClickOnLibList( wxCommandEvent& event ) /********************************************************************/ { int ii = m_LibList->GetSelection(); if( ii < 0 ) return; wxString name = m_LibList->GetString( ii ); if( g_CurrentViewLibraryName == name ) return; g_CurrentViewLibraryName = name; ReCreateListCmp(); DrawPanel->Refresh(); DisplayLibInfos(); ReCreateHToolbar(); } /****************************************************************/ void WinEDA_ViewlibFrame::ClickOnCmpList( wxCommandEvent& event ) /****************************************************************/ { int ii = m_CmpList->GetSelection(); if( ii < 0 ) return; wxString name = m_CmpList->GetString( ii ); g_CurrentViewComponentName = name; DisplayLibInfos(); g_ViewUnit = 1; g_ViewConvert = 1; Zoom_Automatique( FALSE ); ReCreateHToolbar(); DrawPanel->Refresh(); } /****************************************************************************/ void WinEDA_ViewlibFrame::ExportToSchematicLibraryPart( wxCommandEvent& event ) /****************************************************************************/ /* Export the current component to schematic and close the library browser */ { int ii = m_CmpList->GetSelection(); if( ii >= 0 ) g_CurrentViewComponentName = m_CmpList->GetString( ii ); else g_CurrentViewComponentName.Empty(); Close( TRUE ); }