/*********************/ /* File: cvframe.cpp */ /*********************/ #include "fctsys.h" #include "common.h" #include #include "cvpcb.h" #include "gr_basic.h" #include "pcbnew.h" #include "bitmaps.h" #include "protos.h" #include "id.h" #define FRAME_MIN_SIZE_X 450 #define FRAME_MIN_SIZE_Y 300 /*******************************************************/ /* Constructeur de WinEDA_CvpcbFrame: la fenetre generale */ /*******************************************************/ WinEDA_CvpcbFrame::WinEDA_CvpcbFrame(WinEDA_App *parent, const wxString & title, long style ): WinEDA_BasicFrame(NULL, CVPCB_FRAME, parent, title, wxDefaultPosition, wxDefaultSize, style ) { m_FrameName = wxT("CvpcbFrame"); m_ListCmp = NULL; m_FootprintList = NULL; DrawFrame = NULL; m_FilesMenu = NULL; m_HToolBar = NULL; // Give an icon #ifdef __WINDOWS__ SetIcon( wxICON(a_icon_cvpcb)); #else SetIcon( wxICON(icon_cvpcb)); #endif SetFont(*g_StdFont); SetAutoLayout(TRUE); GetSettings(); if ( m_FrameSize.x < FRAME_MIN_SIZE_X ) m_FrameSize.x = FRAME_MIN_SIZE_X; if ( m_FrameSize.y < FRAME_MIN_SIZE_Y ) m_FrameSize.y = FRAME_MIN_SIZE_Y; // create the status bar int dims[3] = { -1, -1, 250}; CreateStatusBar(3); SetStatusWidths(3,dims); ReCreateMenuBar(); ReCreateHToolbar(); // Creation des listes de modules disponibles et des composants du schema // Create child subwindows. BuildCmpListBox(); BuildFootprintListBox(); /* Creation des contraintes de dimension de la fenetre d'affichage des composants du schema */ wxLayoutConstraints * linkpos = new wxLayoutConstraints; linkpos->top.SameAs(this,wxTop); linkpos->bottom.SameAs(this,wxBottom); linkpos->left.SameAs(this,wxLeft); linkpos->width.PercentOf(this,wxWidth,66); if ( m_ListCmp ) m_ListCmp->SetConstraints(linkpos); /* Creation des contraintes de dimension de la fenetre d'affichage des modules de la librairie */ linkpos = new wxLayoutConstraints; linkpos->top.SameAs(m_ListCmp,wxTop); linkpos->bottom.SameAs(m_ListCmp,wxBottom); linkpos->right.SameAs(this,wxRight); linkpos->left.SameAs(m_ListCmp,wxRight); if ( m_FootprintList ) m_FootprintList->SetConstraints(linkpos); SetSizeHints(FRAME_MIN_SIZE_X,FRAME_MIN_SIZE_Y, -1,-1, -1,-1); // Set minimal size to w,h SetSize(m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y); } /******************************************/ WinEDA_CvpcbFrame::~WinEDA_CvpcbFrame() /******************************************/ { if( m_Parent->m_EDA_Config ) { int state = m_HToolBar->GetToolState(ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST); m_Parent->m_EDA_Config->Write(wxT(FILTERFOOTPRINTKEY), state); } } /************************************************/ void WinEDA_CvpcbFrame::OnSize(wxSizeEvent& event) /************************************************/ { event.Skip(); } /***************************************************************/ /* Construction de la table des evenements pour WinEDA_CvpcbFrame */ /***************************************************************/ BEGIN_EVENT_TABLE(WinEDA_CvpcbFrame, wxFrame) EVT_MENU_RANGE(ID_LOAD_PROJECT,ID_LOAD_FILE_10, WinEDA_CvpcbFrame::LoadNetList) EVT_MENU(ID_SAVE_PROJECT, WinEDA_CvpcbFrame::SaveQuitCvpcb) EVT_MENU(ID_CVPCB_QUIT, WinEDA_CvpcbFrame::OnQuit) EVT_MENU(ID_CVPCB_DISPLAY_HELP, WinEDA_CvpcbFrame::GetKicadHelp) EVT_MENU(ID_CVPCB_DISPLAY_LICENCE, WinEDA_CvpcbFrame::GetKicadAbout) EVT_MENU(ID_CONFIG_REQ,WinEDA_CvpcbFrame::ConfigCvpcb) EVT_MENU(ID_CONFIG_SAVE,WinEDA_CvpcbFrame::Update_Config) EVT_MENU_RANGE(ID_PREFERENCES_FONT_INFOSCREEN, ID_PREFERENCES_FONT_END, WinEDA_CvpcbFrame::ProcessFontPreferences) EVT_MENU_RANGE(ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, WinEDA_CvpcbFrame::SetLanguage) EVT_TOOL(ID_CVPCB_QUIT, WinEDA_CvpcbFrame::OnQuit) EVT_TOOL(ID_CVPCB_READ_INPUT_NETLIST, WinEDA_CvpcbFrame::LoadNetList) EVT_TOOL(ID_CVPCB_SAVEQUITCVPCB, WinEDA_CvpcbFrame::SaveQuitCvpcb) EVT_TOOL(ID_CVPCB_CREATE_CONFIGWINDOW,WinEDA_CvpcbFrame::ConfigCvpcb) EVT_TOOL(ID_CVPCB_CREATE_SCREENCMP, WinEDA_CvpcbFrame::DisplayModule) EVT_TOOL(ID_CVPCB_GOTO_FIRSTNA, WinEDA_CvpcbFrame::ToFirstNA) EVT_TOOL(ID_CVPCB_GOTO_PREVIOUSNA, WinEDA_CvpcbFrame::ToPreviousNA) EVT_TOOL(ID_CVPCB_DEL_ASSOCIATIONS, WinEDA_CvpcbFrame::DelAssociations) EVT_TOOL(ID_CVPCB_AUTO_ASSOCIE, WinEDA_CvpcbFrame::AssocieModule) EVT_TOOL(ID_CVPCB_CREATE_STUFF_FILE, WinEDA_CvpcbFrame::WriteStuffList) EVT_TOOL(ID_PCB_DISPLAY_FOOTPRINT_DOC, WinEDA_CvpcbFrame::DisplayDocFile) EVT_TOOL(ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST, WinEDA_CvpcbFrame::OnSelectFilteringFootprint) EVT_TOOL(ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST, WinEDA_CvpcbFrame::OnSelectFilteringFootprint) EVT_CHAR_HOOK(WinEDA_CvpcbFrame::OnChar) EVT_CLOSE(WinEDA_CvpcbFrame::OnCloseWindow) EVT_SIZE( WinEDA_CvpcbFrame::OnSize) EVT_LIST_ITEM_SELECTED (ID_CVPCB_FOOTPRINT_LIST, WinEDA_CvpcbFrame::OnLeftClick) EVT_LIST_ITEM_ACTIVATED (ID_CVPCB_FOOTPRINT_LIST, WinEDA_CvpcbFrame::OnLeftDClick) EVT_LIST_ITEM_SELECTED(ID_CVPCB_COMPONENT_LIST, WinEDA_CvpcbFrame::OnSelectComponent) END_EVENT_TABLE() /************************************************************/ /* Fonctions de base de WinEDA_CvpcbFrame: la fenetre generale */ /************************************************************/ /* Sortie de CVPCB */ void WinEDA_CvpcbFrame::OnQuit(wxCommandEvent& event) { Close(TRUE); } /**********************************************************/ void WinEDA_CvpcbFrame::OnCloseWindow(wxCloseEvent & Event) /**********************************************************/ { int diag; if( modified ) { unsigned ii; wxMessageDialog dialog(this, _("Netlist and Cmp list modified, Save before exit ?"), _("Confirmation"), wxYES_NO | wxCANCEL | wxICON_EXCLAMATION | wxYES_DEFAULT); ii = dialog.ShowModal(); switch ( ii ) { case wxID_CANCEL: Event.Veto(); return; case wxID_NO: break; case wxID_OK: case wxID_YES: diag = SaveNetList(wxEmptyString); if( diag > 0 ) modified = 0; else if ( diag == 0 ) { if( ! IsOK(this, _("Problem when saving files, Exit anyway") ) ) { Event.Veto(); return; } } break; } } // Close the help frame if ( m_Parent->m_HtmlCtrl ) { if ( m_Parent->m_HtmlCtrl->GetFrame() ) // returns NULL if no help frame active m_Parent->m_HtmlCtrl->GetFrame()->Close(TRUE); } if ( ! NetInNameBuffer.IsEmpty() ) { SetLastProject(NetInNameBuffer); } FreeMemoryModules(); FreeMemoryComponants(); modified = 0; SaveSettings(); Destroy(); return; } /************************************************/ void WinEDA_CvpcbFrame::OnChar(wxKeyEvent& event) /************************************************/ { event.Skip(); } /*******************************************************/ void WinEDA_CvpcbFrame::ToFirstNA(wxCommandEvent& event) /*******************************************************/ { STORECMP * Composant; int ii, selection;; Composant = g_BaseListeCmp; selection= m_ListCmp->GetSelection(); if(selection < 0) selection = 0; for (ii = 0 ; Composant != NULL; Composant = Composant->Pnext) { if( Composant->m_Module.IsEmpty() && (ii > selection) ) break; ii++; } if ( Composant == NULL ) { wxBell(); ii = selection; } if ( g_BaseListeCmp ) m_ListCmp->SetSelection(ii); } /**********************************************************/ void WinEDA_CvpcbFrame::ToPreviousNA(wxCommandEvent& event) /**********************************************************/ { STORECMP * Composant; int ii, selection; Composant = g_BaseListeCmp; selection = m_ListCmp->GetSelection(); if(selection < 0) selection = 0; for (ii = 0 ; Composant != NULL; Composant = Composant->Pnext) { if( ii == selection ) break; ii ++; } for ( ; Composant != NULL ; Composant = Composant->Pback) { if( Composant->m_Module.IsEmpty() && (ii != selection) ) break; ii--; } if ( Composant == NULL ) { wxBell(); ii = selection; } if ( g_BaseListeCmp ) m_ListCmp->SetSelection(ii); } /**********************************************************/ void WinEDA_CvpcbFrame::SaveQuitCvpcb(wxCommandEvent& event) /**********************************************************/ { if( SaveNetList(wxEmptyString) > 0) { modified = 0; Close(TRUE); } } /*************************************************************/ void WinEDA_CvpcbFrame::DelAssociations(wxCommandEvent& event) /*************************************************************/ /* Supprime toutes les associations deja faites */ { int ii; STORECMP * Composant; wxString Line; if( IsOK(this, _("Delete selections")) ) { Composant = g_BaseListeCmp; for ( ii = 0; Composant != NULL; Composant = Composant->Pnext, ii++) { Composant->m_Module.Empty(); m_ListCmp->SetSelection(ii); SetNewPkg(wxEmptyString); } m_ListCmp->SetSelection(0); composants_non_affectes = nbcomp; } Line.Printf( _("Componants: %d (free: %d)"), nbcomp, composants_non_affectes); SetStatusText(Line,1); } /***********************************************************/ void WinEDA_CvpcbFrame::LoadNetList(wxCommandEvent& event) /***********************************************************/ /* Fonction liee au boutton "Load" Lit la netliste */ { int id = event.GetId(); wxString fullfilename; wxString oldfilename; bool newfile; if ( ! NetInNameBuffer.IsEmpty() ) { oldfilename = NetInNameBuffer; } switch ( id ) { case ID_LOAD_FILE_1: case ID_LOAD_FILE_2: case ID_LOAD_FILE_3: case ID_LOAD_FILE_4: case ID_LOAD_FILE_5: case ID_LOAD_FILE_6: case ID_LOAD_FILE_7: case ID_LOAD_FILE_8: case ID_LOAD_FILE_9: case ID_LOAD_FILE_10: id -= ID_LOAD_FILE_1; fullfilename = GetLastProject(id); break; } newfile = ReadInputNetList(fullfilename); if (newfile && ! oldfilename.IsEmpty() ) { SetLastProject(NetInNameBuffer); ReCreateMenuBar(); } } /***********************************************************/ void WinEDA_CvpcbFrame::ConfigCvpcb(wxCommandEvent& event) /***********************************************************/ /* Fonction liee au boutton "Config" Affiche le panneau de configuration */ { CreateConfigWindow(); } /************************************************************/ void WinEDA_CvpcbFrame::DisplayModule(wxCommandEvent& event) /************************************************************/ /* Fonction liee au boutton "Visu" Affiche l'ecran de visualisation des modules */ { CreateScreenCmp(); DrawFrame->AdjustScrollBars(); DrawFrame->Recadre_Trace(FALSE); } /****************************************************************/ void WinEDA_CvpcbFrame::AddFontSelectionMenu(wxMenu * main_menu) /*****************************************************************/ /* create the submenu for fonte selection and setup fonte size */ { wxMenu * fontmenu = new wxMenu(); ADD_MENUITEM(fontmenu, ID_PREFERENCES_FONT_DIALOG, _("font for dialog boxes"), fonts_xpm ); ADD_MENUITEM(fontmenu, ID_PREFERENCES_FONT_INFOSCREEN, _("font for Lists"), fonts_xpm ); ADD_MENUITEM(fontmenu, ID_PREFERENCES_FONT_STATUS, _("font for Status Line"), fonts_xpm ); ADD_MENUITEM_WITH_HELP_AND_SUBMENU(main_menu, fontmenu, ID_PREFERENCES_FONT, _("&Font selection"), _("Choose font type and size for dialogs, infos and status box"), fonts_xpm); } /********************************************************/ void WinEDA_CvpcbFrame::SetLanguage(wxCommandEvent& event) /********************************************************/ { int id = event.GetId(); m_Parent->SetLanguageIdentifier(id ); m_Parent->SetLanguage(); } /*************************************************************/ void WinEDA_CvpcbFrame::DisplayDocFile(wxCommandEvent & event) /*************************************************************/ { wxString msg = FindKicadHelpPath(); msg += wxT("pcbnew/footprints.pdf"); GetAssociatedDocument(this, wxEmptyString, msg); } /********************************************************************/ void WinEDA_CvpcbFrame::ProcessFontPreferences(wxCommandEvent& event) /********************************************************************/ { int id = event.GetId(); wxFont font; switch (id) { case ID_PREFERENCES_FONT: case ID_PREFERENCES_FONT_DIALOG: case ID_PREFERENCES_FONT_STATUS: WinEDA_BasicFrame::ProcessFontPreferences(id); break; case ID_PREFERENCES_FONT_INFOSCREEN: { font = wxGetFontFromUser(this, *g_FixedFont); if ( font.Ok() ) { int pointsize = font.GetPointSize(); *g_FixedFont = font; g_FixedFontPointSize = pointsize; m_FootprintList->SetFont(*g_FixedFont); m_ListCmp->SetFont(*g_FixedFont); } break; } default: DisplayError(this, wxT("WinEDA_DrawFrame::ProcessFontPreferences Internal Error") ); break; } } /******************************************************/ void WinEDA_CvpcbFrame::OnLeftClick(wxListEvent& event) /******************************************************/ { m_FootprintList->OnLeftClick(event); } /******************************************************/ void WinEDA_CvpcbFrame::OnLeftDClick(wxListEvent& event) /******************************************************/ { m_FootprintList->OnLeftDClick(event); } /*************************************************************/ void WinEDA_CvpcbFrame::OnSelectComponent(wxListEvent& event) /*************************************************************/ { STORECMP * Component; int selection; if ( ! m_HToolBar->GetToolState(ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST) ) { m_FootprintList->SetActiveFootprintList(TRUE, TRUE); return; } selection = m_ListCmp->GetSelection(); if(selection < 0) { m_FootprintList->SetActiveFootprintList(TRUE, TRUE); return; } Component = g_BaseListeCmp; for (int ii = 0 ; Component != NULL; Component = Component->Pnext) { if( ii == selection ) break; ii ++; } if ( Component == NULL ) { m_FootprintList->SetActiveFootprintList(TRUE, TRUE); return; } m_FootprintList->SetFootprintFilteredList(Component); } /************************************************************************/ void WinEDA_CvpcbFrame::OnSelectFilteringFootprint(wxCommandEvent & event) /************************************************************************/ /* Select full/filtered footprint display on tool click */ { wxListEvent l_event; OnSelectComponent(l_event); }