Commit 5fd409f8 authored by Wayne Stambaugh's avatar Wayne Stambaugh

Add user write permission tests to CVPcb and other minor fixes.

* Check user write permissions before saving project and net list files.
* Append read only to file name and path in title bar when the user
  does not have write privileges.
* Don't display file dialog every time the net list or project file is
  saved.
* Add save as and save project file as commands.
* Make capitalization of CVPcb consistent in all user strings.
* Doxygen comment and coding style policy fixes.
parent 8f1b5697
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "fctsys.h" #include "fctsys.h"
#include "appl_wxstruct.h" #include "appl_wxstruct.h"
#include "id.h"
#include "common.h" #include "common.h"
#include "gestfich.h" #include "gestfich.h"
#include "param_config.h" #include "param_config.h"
...@@ -16,15 +17,6 @@ ...@@ -16,15 +17,6 @@
#define GROUPEQU wxT("/cvpcb/libraries") #define GROUPEQU wxT("/cvpcb/libraries")
/**
* Return project file parameter list for CVPcb.
*
* Populate the project file parameter array specific to CVPcb if it hasn't
* already been populated and return a reference to the array to the caller.
* Creating the parameter list at run time has the advantage of being able
* to define local variables. The old method of statically building the array
* at compile time requiring global variable definitions.
*/
PARAM_CFG_ARRAY& CVPCB_MAINFRAME::GetProjectFileParameters( void ) PARAM_CFG_ARRAY& CVPCB_MAINFRAME::GetProjectFileParameters( void )
{ {
if( !m_projectFileParams.empty() ) if( !m_projectFileParams.empty() )
...@@ -48,19 +40,9 @@ PARAM_CFG_ARRAY& CVPCB_MAINFRAME::GetProjectFileParameters( void ) ...@@ -48,19 +40,9 @@ PARAM_CFG_ARRAY& CVPCB_MAINFRAME::GetProjectFileParameters( void )
} }
/** void CVPCB_MAINFRAME::LoadProjectFile( const wxString& aFileName )
* Reads the configuration
* 1 - bed cvpcb.cnf
* 2 - if not in path of <cvpcb.exe> / cvpcb.cnf
* 3 - If not found: init variables to default values
*
* Note:
* The path of the executable must be in cvpcb.exe.
*
*/
void CVPCB_MAINFRAME::LoadProjectFile( const wxString& FileName )
{ {
wxFileName fn = FileName; wxFileName fn = aFileName;
m_ModuleLibNames.Clear(); m_ModuleLibNames.Clear();
m_AliasLibNames.Clear(); m_AliasLibNames.Clear();
...@@ -70,8 +52,7 @@ void CVPCB_MAINFRAME::LoadProjectFile( const wxString& FileName ) ...@@ -70,8 +52,7 @@ void CVPCB_MAINFRAME::LoadProjectFile( const wxString& FileName )
wxGetApp().RemoveLibraryPath( m_UserLibraryPath ); wxGetApp().RemoveLibraryPath( m_UserLibraryPath );
wxGetApp().ReadProjectConfig( fn.GetFullPath(), GROUP, wxGetApp().ReadProjectConfig( fn.GetFullPath(), GROUP, GetProjectFileParameters(), false );
GetProjectFileParameters(), FALSE );
if( m_NetlistFileExtension.IsEmpty() ) if( m_NetlistFileExtension.IsEmpty() )
m_NetlistFileExtension = wxT( "net" ); m_NetlistFileExtension = wxT( "net" );
...@@ -81,24 +62,28 @@ void CVPCB_MAINFRAME::LoadProjectFile( const wxString& FileName ) ...@@ -81,24 +62,28 @@ void CVPCB_MAINFRAME::LoadProjectFile( const wxString& FileName )
} }
void CVPCB_MAINFRAME::Update_Config( wxCommandEvent& event ) void CVPCB_MAINFRAME::SaveProjectFile( wxCommandEvent& aEvent )
{ {
SaveProjectFile( m_NetlistFileName.GetFullPath() ); wxFileName fn = m_NetlistFileName;
}
fn.SetExt( ProjectFileExtension );
void CVPCB_MAINFRAME::SaveProjectFile( const wxString& fileName ) if( aEvent.GetId() == ID_SAVE_PROJECT_AS || !m_NetlistFileName.IsOk() )
{ {
wxFileName fn = fileName; wxFileDialog dlg( this, _( "Save Project File" ), fn.GetPath(),
wxEmptyString, ProjectFileWildcard, wxFD_SAVE );
fn.SetExt( ProjectFileExtension ); if( dlg.ShowModal() == wxID_CANCEL )
return;
fn = dlg.GetPath();
wxFileDialog dlg( this, _( "Save Project File" ), fn.GetPath(), if( !fn.HasExt() )
fn.GetFullName(), ProjectFileWildcard, wxFD_SAVE ); fn.SetExt( ProjectFileExtension );
}
if( dlg.ShowModal() == wxID_CANCEL ) if( !IsWritable( fn ) )
return; return;
wxGetApp().WriteProjectConfig( dlg.GetPath(), GROUP, wxGetApp().WriteProjectConfig( fn.GetFullPath(), GROUP, GetProjectFileParameters() );
GetProjectFileParameters() );
} }
...@@ -32,60 +32,53 @@ static const wxString FootprintDocFileEntry( wxT( "footprints_doc_file" ) ); ...@@ -32,60 +32,53 @@ static const wxString FootprintDocFileEntry( wxT( "footprints_doc_file" ) );
BEGIN_EVENT_TABLE( CVPCB_MAINFRAME, EDA_BASE_FRAME ) BEGIN_EVENT_TABLE( CVPCB_MAINFRAME, EDA_BASE_FRAME )
EVT_MENU_RANGE( wxID_FILE1, wxID_FILE9, CVPCB_MAINFRAME::LoadNetList ) EVT_MENU_RANGE( wxID_FILE1, wxID_FILE9, CVPCB_MAINFRAME::LoadNetList )
// Menu events // Menu events
EVT_MENU( ID_LOAD_PROJECT, EVT_MENU( ID_LOAD_PROJECT, CVPCB_MAINFRAME::LoadNetList )
CVPCB_MAINFRAME::LoadNetList ) EVT_MENU( wxID_SAVE, CVPCB_MAINFRAME::SaveQuitCvpcb )
EVT_MENU( ID_SAVE_PROJECT, EVT_MENU( wxID_SAVEAS, CVPCB_MAINFRAME::SaveQuitCvpcb )
CVPCB_MAINFRAME::SaveQuitCvpcb ) EVT_MENU( wxID_EXIT, CVPCB_MAINFRAME::OnQuit )
EVT_MENU( wxID_EXIT, EVT_MENU( wxID_HELP, CVPCB_MAINFRAME::GetKicadHelp )
CVPCB_MAINFRAME::OnQuit ) EVT_MENU( wxID_ABOUT, CVPCB_MAINFRAME::GetKicadAbout )
EVT_MENU( wxID_HELP, EVT_MENU( wxID_PREFERENCES, CVPCB_MAINFRAME::ConfigCvpcb )
CVPCB_MAINFRAME::GetKicadHelp ) EVT_MENU( ID_SAVE_PROJECT, CVPCB_MAINFRAME::SaveProjectFile )
EVT_MENU( wxID_ABOUT, EVT_MENU( ID_SAVE_PROJECT_AS, CVPCB_MAINFRAME::SaveProjectFile )
CVPCB_MAINFRAME::GetKicadAbout ) EVT_MENU( ID_CVPCB_CONFIG_KEEP_OPEN_ON_SAVE, CVPCB_MAINFRAME::OnKeepOpenOnSave )
EVT_MENU( wxID_PREFERENCES,
CVPCB_MAINFRAME::ConfigCvpcb ) EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, CVPCB_MAINFRAME::SetLanguage )
EVT_MENU( ID_CONFIG_SAVE,
CVPCB_MAINFRAME::Update_Config ) // Toolbar events
EVT_MENU( ID_CVPCB_CONFIG_KEEP_OPEN_ON_SAVE, EVT_TOOL( ID_CVPCB_QUIT, CVPCB_MAINFRAME::OnQuit )
CVPCB_MAINFRAME::OnKeepOpenOnSave ) EVT_TOOL( ID_CVPCB_READ_INPUT_NETLIST, CVPCB_MAINFRAME::LoadNetList )
EVT_TOOL( ID_CVPCB_CREATE_CONFIGWINDOW, CVPCB_MAINFRAME::ConfigCvpcb )
EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, EVT_TOOL( ID_CVPCB_CREATE_SCREENCMP, CVPCB_MAINFRAME::DisplayModule )
ID_LANGUAGE_CHOICE_END, EVT_TOOL( ID_CVPCB_GOTO_FIRSTNA, CVPCB_MAINFRAME::ToFirstNA )
CVPCB_MAINFRAME::SetLanguage ) EVT_TOOL( ID_CVPCB_GOTO_PREVIOUSNA, CVPCB_MAINFRAME::ToPreviousNA )
EVT_TOOL( ID_CVPCB_DEL_ASSOCIATIONS, CVPCB_MAINFRAME::DelAssociations )
// Toolbar events EVT_TOOL( ID_CVPCB_AUTO_ASSOCIE, CVPCB_MAINFRAME::AssocieModule )
EVT_TOOL( ID_CVPCB_QUIT, CVPCB_MAINFRAME::OnQuit ) EVT_TOOL( ID_CVPCB_CREATE_STUFF_FILE, CVPCB_MAINFRAME::WriteStuffList )
EVT_TOOL( ID_CVPCB_READ_INPUT_NETLIST, CVPCB_MAINFRAME::LoadNetList ) EVT_TOOL( ID_PCB_DISPLAY_FOOTPRINT_DOC, CVPCB_MAINFRAME::DisplayDocFile )
EVT_TOOL( ID_CVPCB_SAVEQUITCVPCB, CVPCB_MAINFRAME::SaveQuitCvpcb ) EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST,
EVT_TOOL( ID_CVPCB_CREATE_CONFIGWINDOW, CVPCB_MAINFRAME::ConfigCvpcb ) CVPCB_MAINFRAME::OnSelectFilteringFootprint )
EVT_TOOL( ID_CVPCB_CREATE_SCREENCMP, CVPCB_MAINFRAME::DisplayModule ) EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST,
EVT_TOOL( ID_CVPCB_GOTO_FIRSTNA, CVPCB_MAINFRAME::ToFirstNA ) CVPCB_MAINFRAME::OnSelectFilteringFootprint )
EVT_TOOL( ID_CVPCB_GOTO_PREVIOUSNA, CVPCB_MAINFRAME::ToPreviousNA )
EVT_TOOL( ID_CVPCB_DEL_ASSOCIATIONS, CVPCB_MAINFRAME::DelAssociations ) // Frame events
EVT_TOOL( ID_CVPCB_AUTO_ASSOCIE, CVPCB_MAINFRAME::AssocieModule ) EVT_CHAR( CVPCB_MAINFRAME::OnChar )
EVT_TOOL( ID_CVPCB_CREATE_STUFF_FILE, CVPCB_MAINFRAME::WriteStuffList ) EVT_CLOSE( CVPCB_MAINFRAME::OnCloseWindow )
EVT_TOOL( ID_PCB_DISPLAY_FOOTPRINT_DOC, CVPCB_MAINFRAME::DisplayDocFile ) EVT_SIZE( CVPCB_MAINFRAME::OnSize )
EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST,
CVPCB_MAINFRAME::OnSelectFilteringFootprint ) // List item events
EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST, EVT_LIST_ITEM_SELECTED( ID_CVPCB_FOOTPRINT_LIST, CVPCB_MAINFRAME::OnLeftClick )
CVPCB_MAINFRAME::OnSelectFilteringFootprint ) EVT_LIST_ITEM_ACTIVATED( ID_CVPCB_FOOTPRINT_LIST, CVPCB_MAINFRAME::OnLeftDClick )
EVT_LIST_ITEM_SELECTED( ID_CVPCB_COMPONENT_LIST, CVPCB_MAINFRAME::OnSelectComponent )
// Frame events
EVT_CHAR( CVPCB_MAINFRAME::OnChar ) EVT_UPDATE_UI( ID_CVPCB_CONFIG_KEEP_OPEN_ON_SAVE, CVPCB_MAINFRAME::OnUpdateKeepOpenOnSave )
EVT_CLOSE( CVPCB_MAINFRAME::OnCloseWindow ) END_EVENT_TABLE()
EVT_SIZE( CVPCB_MAINFRAME::OnSize )
// List item events CVPCB_MAINFRAME::CVPCB_MAINFRAME( const wxString& title, long style ) :
EVT_LIST_ITEM_SELECTED( ID_CVPCB_FOOTPRINT_LIST, CVPCB_MAINFRAME::OnLeftClick )
EVT_LIST_ITEM_ACTIVATED( ID_CVPCB_FOOTPRINT_LIST, CVPCB_MAINFRAME::OnLeftDClick )
EVT_LIST_ITEM_SELECTED( ID_CVPCB_COMPONENT_LIST, CVPCB_MAINFRAME::OnSelectComponent )
EVT_UPDATE_UI( ID_CVPCB_CONFIG_KEEP_OPEN_ON_SAVE,
CVPCB_MAINFRAME::OnUpdateKeepOpenOnSave )
END_EVENT_TABLE() CVPCB_MAINFRAME::CVPCB_MAINFRAME( const wxString& title, long style ) :
EDA_BASE_FRAME( NULL, CVPCB_FRAME, title, wxDefaultPosition, wxDefaultSize, style ) EDA_BASE_FRAME( NULL, CVPCB_FRAME, title, wxDefaultPosition, wxDefaultSize, style )
{ {
m_FrameName = wxT( "CvpcbFrame" ); m_FrameName = wxT( "CvpcbFrame" );
...@@ -116,8 +109,10 @@ END_EVENT_TABLE() CVPCB_MAINFRAME::CVPCB_MAINFRAME( const wxString& title, long ...@@ -116,8 +109,10 @@ END_EVENT_TABLE() CVPCB_MAINFRAME::CVPCB_MAINFRAME( const wxString& title, long
SetAutoLayout( true ); SetAutoLayout( true );
LoadSettings(); LoadSettings();
if( m_FrameSize.x < FRAME_MIN_SIZE_X ) if( m_FrameSize.x < FRAME_MIN_SIZE_X )
m_FrameSize.x = FRAME_MIN_SIZE_X; m_FrameSize.x = FRAME_MIN_SIZE_X;
if( m_FrameSize.y < FRAME_MIN_SIZE_Y ) if( m_FrameSize.y < FRAME_MIN_SIZE_Y )
m_FrameSize.y = FRAME_MIN_SIZE_Y; m_FrameSize.y = FRAME_MIN_SIZE_Y;
...@@ -154,16 +149,16 @@ END_EVENT_TABLE() CVPCB_MAINFRAME::CVPCB_MAINFRAME( const wxString& title, long ...@@ -154,16 +149,16 @@ END_EVENT_TABLE() CVPCB_MAINFRAME::CVPCB_MAINFRAME( const wxString& title, long
if( m_HToolBar ) if( m_HToolBar )
m_auimgr.AddPane( m_HToolBar, m_auimgr.AddPane( m_HToolBar,
wxAuiPaneInfo( horiz ).Name( wxT( "m_HToolBar" ) ).Top() ); wxAuiPaneInfo( horiz ).Name( wxT( "m_HToolBar" ) ).Top() );
if( m_ListCmp ) if( m_ListCmp )
m_auimgr.AddPane( m_ListCmp, m_auimgr.AddPane( m_ListCmp,
wxAuiPaneInfo( horiz ).Name( wxT( "m_ListCmp" ) ).CentrePane() ); wxAuiPaneInfo( horiz ).Name( wxT( "m_ListCmp" ) ).CentrePane() );
if( m_FootprintList ) if( m_FootprintList )
m_auimgr.AddPane( m_FootprintList, m_auimgr.AddPane( m_FootprintList,
wxAuiPaneInfo( horiz ).Name( wxT( "m_FootprintList" ) ). wxAuiPaneInfo( horiz ).Name( wxT( "m_FootprintList" ) ).
Right().BestSize( (int) ( m_FrameSize.x * 0.36 ), m_FrameSize.y ) ); Right().BestSize( (int) ( m_FrameSize.x * 0.36 ), m_FrameSize.y ) );
m_auimgr.Update(); m_auimgr.Update();
} }
...@@ -175,8 +170,7 @@ CVPCB_MAINFRAME::~CVPCB_MAINFRAME() ...@@ -175,8 +170,7 @@ CVPCB_MAINFRAME::~CVPCB_MAINFRAME()
if( config ) if( config )
{ {
int state = m_HToolBar->GetToolState( int state = m_HToolBar->GetToolState( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST );
ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST );
config->Write( wxT( FILTERFOOTPRINTKEY ), state ); config->Write( wxT( FILTERFOOTPRINTKEY ), state );
} }
...@@ -184,12 +178,6 @@ CVPCB_MAINFRAME::~CVPCB_MAINFRAME() ...@@ -184,12 +178,6 @@ CVPCB_MAINFRAME::~CVPCB_MAINFRAME()
} }
/**
* Load Cvpcb main frame specific configuration settings.
*
* Don't forget to call this base method from any derived classes or the
* settings will not get loaded.
*/
void CVPCB_MAINFRAME::LoadSettings() void CVPCB_MAINFRAME::LoadSettings()
{ {
wxASSERT( wxGetApp().m_EDA_Config != NULL ); wxASSERT( wxGetApp().m_EDA_Config != NULL );
...@@ -203,12 +191,6 @@ void CVPCB_MAINFRAME::LoadSettings() ...@@ -203,12 +191,6 @@ void CVPCB_MAINFRAME::LoadSettings()
} }
/**
* Save Cvpcb frame specific configuration settings.
*
* Don't forget to call this base method from any derived classes or the
* settings will not get saved.
*/
void CVPCB_MAINFRAME::SaveSettings() void CVPCB_MAINFRAME::SaveSettings()
{ {
wxASSERT( wxGetApp().m_EDA_Config != NULL ); wxASSERT( wxGetApp().m_EDA_Config != NULL );
...@@ -243,8 +225,7 @@ void CVPCB_MAINFRAME::OnCloseWindow( wxCloseEvent& Event ) ...@@ -243,8 +225,7 @@ void CVPCB_MAINFRAME::OnCloseWindow( wxCloseEvent& Event )
wxMessageDialog dialog( this, wxMessageDialog dialog( this,
_( "Net and component list modified.\nSave before exit ?" ), _( "Net and component list modified.\nSave before exit ?" ),
_( "Confirmation" ), _( "Confirmation" ),
wxYES_NO | wxCANCEL | wxICON_EXCLAMATION | wxYES_NO | wxCANCEL | wxICON_EXCLAMATION | wxYES_DEFAULT );
wxYES_DEFAULT );
ii = dialog.ShowModal(); ii = dialog.ShowModal();
...@@ -259,9 +240,12 @@ void CVPCB_MAINFRAME::OnCloseWindow( wxCloseEvent& Event ) ...@@ -259,9 +240,12 @@ void CVPCB_MAINFRAME::OnCloseWindow( wxCloseEvent& Event )
case wxID_OK: case wxID_OK:
case wxID_YES: case wxID_YES:
diag = SaveNetList( wxEmptyString ); diag = SaveNetList( m_NetlistFileName.GetFullPath() );
if( diag > 0 ) if( diag > 0 )
{
m_modified = false; m_modified = false;
}
else if( diag == 0 ) else if( diag == 0 )
{ {
if( !IsOK( this, _( "Problem when saving files, exit anyway ?" ) ) ) if( !IsOK( this, _( "Problem when saving files, exit anyway ?" ) ) )
...@@ -277,8 +261,7 @@ void CVPCB_MAINFRAME::OnCloseWindow( wxCloseEvent& Event ) ...@@ -277,8 +261,7 @@ void CVPCB_MAINFRAME::OnCloseWindow( wxCloseEvent& Event )
// Close the help frame // Close the help frame
if( wxGetApp().m_HtmlCtrl ) if( wxGetApp().m_HtmlCtrl )
{ {
if( wxGetApp().m_HtmlCtrl->GetFrame() ) // returns NULL if no help if( wxGetApp().m_HtmlCtrl->GetFrame() ) // returns NULL if no help frame active
// frame active
wxGetApp().m_HtmlCtrl->GetFrame()->Close( true ); wxGetApp().m_HtmlCtrl->GetFrame()->Close( true );
} }
...@@ -290,6 +273,7 @@ void CVPCB_MAINFRAME::OnCloseWindow( wxCloseEvent& Event ) ...@@ -290,6 +273,7 @@ void CVPCB_MAINFRAME::OnCloseWindow( wxCloseEvent& Event )
// Close module display frame // Close module display frame
if( m_DisplayFootprintFrame ) if( m_DisplayFootprintFrame )
m_DisplayFootprintFrame->Close( true ); m_DisplayFootprintFrame->Close( true );
m_modified = false; m_modified = false;
SaveSettings(); SaveSettings();
Destroy(); Destroy();
...@@ -331,7 +315,8 @@ void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event ) ...@@ -331,7 +315,8 @@ void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event )
if( selection < 0 ) if( selection < 0 )
selection = 0; selection = 0;
BOOST_FOREACH( COMPONENT & component, m_components ) { BOOST_FOREACH( COMPONENT & component, m_components )
{
if( component.m_Module.IsEmpty() && ii > selection ) if( component.m_Module.IsEmpty() && ii > selection )
{ {
m_ListCmp->SetSelection( ii ); m_ListCmp->SetSelection( ii );
...@@ -340,6 +325,7 @@ void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event ) ...@@ -340,6 +325,7 @@ void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event )
ii++; ii++;
} }
m_ListCmp->SetSelection( selection ); m_ListCmp->SetSelection( selection );
} }
...@@ -358,32 +344,36 @@ void CVPCB_MAINFRAME::ToPreviousNA( wxCommandEvent& event ) ...@@ -358,32 +344,36 @@ void CVPCB_MAINFRAME::ToPreviousNA( wxCommandEvent& event )
if( selection < 0 ) if( selection < 0 )
selection = m_ListCmp->GetCount() - 1; selection = m_ListCmp->GetCount() - 1;
BOOST_REVERSE_FOREACH( COMPONENT & component, m_components ) { BOOST_REVERSE_FOREACH( COMPONENT & component, m_components )
{
if( component.m_Module.IsEmpty() && ii < selection ) if( component.m_Module.IsEmpty() && ii < selection )
{ {
m_ListCmp->SetSelection( ii ); m_ListCmp->SetSelection( ii );
return; return;
} }
ii--; ii--;
} }
m_ListCmp->SetSelection( selection ); m_ListCmp->SetSelection( selection );
} }
void CVPCB_MAINFRAME::SaveQuitCvpcb( wxCommandEvent& event ) void CVPCB_MAINFRAME::SaveQuitCvpcb( wxCommandEvent& aEvent )
{ {
if( SaveNetList( wxEmptyString ) > 0 ) if( aEvent.GetId() == wxID_SAVEAS )
m_NetlistFileName.Clear();
if( SaveNetList( m_NetlistFileName.GetFullPath() ) > 0 )
{ {
m_modified = false; m_modified = false;
if( !m_KeepCvpcbOpen ) if( !m_KeepCvpcbOpen )
Close( true ); Close( true );
} }
} }
/* Removes all associations already made
*/
void CVPCB_MAINFRAME::DelAssociations( wxCommandEvent& event ) void CVPCB_MAINFRAME::DelAssociations( wxCommandEvent& event )
{ {
wxString Line; wxString Line;
...@@ -392,7 +382,8 @@ void CVPCB_MAINFRAME::DelAssociations( wxCommandEvent& event ) ...@@ -392,7 +382,8 @@ void CVPCB_MAINFRAME::DelAssociations( wxCommandEvent& event )
{ {
m_ListCmp->SetSelection( 0 ); m_ListCmp->SetSelection( 0 );
BOOST_FOREACH( COMPONENT & component, m_components ) { BOOST_FOREACH( COMPONENT & component, m_components )
{
component.m_Module.Empty(); component.m_Module.Empty();
SetNewPkg( wxEmptyString ); SetNewPkg( wxEmptyString );
} }
...@@ -405,10 +396,6 @@ void CVPCB_MAINFRAME::DelAssociations( wxCommandEvent& event ) ...@@ -405,10 +396,6 @@ void CVPCB_MAINFRAME::DelAssociations( wxCommandEvent& event )
} }
/*
* Called when click on Load Netlist button or by file history menu entries
* Read a netlist selected by user
*/
void CVPCB_MAINFRAME::LoadNetList( wxCommandEvent& event ) void CVPCB_MAINFRAME::LoadNetList( wxCommandEvent& event )
{ {
wxString oldPath; wxString oldPath;
...@@ -440,18 +427,10 @@ void CVPCB_MAINFRAME::LoadNetList( wxCommandEvent& event ) ...@@ -440,18 +427,10 @@ void CVPCB_MAINFRAME::LoadNetList( wxCommandEvent& event )
/* Update the library search path list. */ /* Update the library search path list. */
if( wxGetApp().GetLibraryPathList().Index( oldPath ) != wxNOT_FOUND ) if( wxGetApp().GetLibraryPathList().Index( oldPath ) != wxNOT_FOUND )
wxGetApp().GetLibraryPathList().Remove( oldPath ); wxGetApp().GetLibraryPathList().Remove( oldPath );
wxGetApp().GetLibraryPathList().Insert( newFileName.GetPath(), 0 ); wxGetApp().GetLibraryPathList().Insert( newFileName.GetPath(), 0 );
m_NetlistFileName = newFileName; m_NetlistFileName = newFileName;
ReadNetList();
if( ReadNetList() )
{
SetTitle( wxGetApp().GetTitle() + wxT( " " ) + GetBuildVersion() +
wxT( " " ) + m_NetlistFileName.GetFullPath() );
}
else
{
SetTitle( wxGetApp().GetTitle() + wxT( " " ) + GetBuildVersion() );
}
} }
...@@ -476,9 +455,6 @@ void CVPCB_MAINFRAME::DisplayModule( wxCommandEvent& event ) ...@@ -476,9 +455,6 @@ void CVPCB_MAINFRAME::DisplayModule( wxCommandEvent& event )
} }
/** Vitual function SetLanguage
* called on a language menu selection
*/
void CVPCB_MAINFRAME::SetLanguage( wxCommandEvent& event ) void CVPCB_MAINFRAME::SetLanguage( wxCommandEvent& event )
{ {
EDA_BASE_FRAME::SetLanguage( event ); EDA_BASE_FRAME::SetLanguage( event );
...@@ -487,8 +463,7 @@ void CVPCB_MAINFRAME::SetLanguage( wxCommandEvent& event ) ...@@ -487,8 +463,7 @@ void CVPCB_MAINFRAME::SetLanguage( wxCommandEvent& event )
void CVPCB_MAINFRAME::DisplayDocFile( wxCommandEvent& event ) void CVPCB_MAINFRAME::DisplayDocFile( wxCommandEvent& event )
{ {
GetAssociatedDocument( this, m_DocModulesFileName, GetAssociatedDocument( this, m_DocModulesFileName, &wxGetApp().GetLibraryPathList() );
&wxGetApp().GetLibraryPathList() );
} }
...@@ -515,6 +490,7 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event ) ...@@ -515,6 +490,7 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
} }
selection = m_ListCmp->GetSelection(); selection = m_ListCmp->GetSelection();
if( selection < 0 ) if( selection < 0 )
{ {
m_FootprintList->SetActiveFootprintList( true, true ); m_FootprintList->SetActiveFootprintList( true, true );
...@@ -527,14 +503,11 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event ) ...@@ -527,14 +503,11 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
return; return;
} }
m_FootprintList->SetFootprintFilteredList( &m_components[ selection ], m_FootprintList->SetFootprintFilteredList( &m_components[ selection ], m_footprints );
m_footprints );
DisplayStatus(); DisplayStatus();
} }
/* Select full/filtered footprint display on tool click
*/
void CVPCB_MAINFRAME::OnSelectFilteringFootprint( wxCommandEvent& event ) void CVPCB_MAINFRAME::OnSelectFilteringFootprint( wxCommandEvent& event )
{ {
switch( event.GetId() ) switch( event.GetId() )
...@@ -563,15 +536,11 @@ void CVPCB_MAINFRAME::OnUpdateKeepOpenOnSave( wxUpdateUIEvent& event ) ...@@ -563,15 +536,11 @@ void CVPCB_MAINFRAME::OnUpdateKeepOpenOnSave( wxUpdateUIEvent& event )
} }
/** DisplayStatus()
* Displays info to the status line at bottom of the main frame
*/
void CVPCB_MAINFRAME::DisplayStatus() void CVPCB_MAINFRAME::DisplayStatus()
{ {
wxString msg; wxString msg;
msg.Printf( _( "Components: %d (free: %d)" ), msg.Printf( _( "Components: %d (free: %d)" ), m_components.size(), m_undefinedComponentCnt );
m_components.size(), m_undefinedComponentCnt );
SetStatusText( msg, 0 ); SetStatusText( msg, 0 );
SetStatusText( wxEmptyString, 1 ); SetStatusText( wxEmptyString, 1 );
...@@ -580,25 +549,20 @@ void CVPCB_MAINFRAME::DisplayStatus() ...@@ -580,25 +549,20 @@ void CVPCB_MAINFRAME::DisplayStatus()
{ {
if( m_FootprintList->m_UseFootprintFullList ) if( m_FootprintList->m_UseFootprintFullList )
msg.Printf( _( "Footprints (All): %d" ), msg.Printf( _( "Footprints (All): %d" ),
m_FootprintList->m_ActiveFootprintList->GetCount() ); m_FootprintList->m_ActiveFootprintList->GetCount() );
else else
msg.Printf( _( "Footprints (filtered): %d" ), msg.Printf( _( "Footprints (filtered): %d" ),
m_FootprintList->m_ActiveFootprintList->GetCount() ); m_FootprintList->m_ActiveFootprintList->GetCount() );
} }
else else
{
msg.Empty(); msg.Empty();
}
SetStatusText( msg, 2 ); SetStatusText( msg, 2 );
} }
/*
* Read the list of libraries (*.mod files) and populates m_footprints
* ( list of availaible modules in libs ).
* for each module are stored
* the module name
* documentation string
* associated keywords
*/
bool CVPCB_MAINFRAME::LoadFootprintFiles() bool CVPCB_MAINFRAME::LoadFootprintFiles()
{ {
/* Check if there are footprint libraries in project file */ /* Check if there are footprint libraries in project file */
...@@ -615,6 +579,7 @@ bool CVPCB_MAINFRAME::LoadFootprintFiles() ...@@ -615,6 +579,7 @@ bool CVPCB_MAINFRAME::LoadFootprintFiles()
if( !m_footprints.m_filesNotFound.IsEmpty() || !m_footprints.m_filesInvalid.IsEmpty() ) if( !m_footprints.m_filesNotFound.IsEmpty() || !m_footprints.m_filesInvalid.IsEmpty() )
{ {
DIALOG_LOAD_ERROR dialog( NULL ); DIALOG_LOAD_ERROR dialog( NULL );
if( !m_footprints.m_filesNotFound.IsEmpty() ) if( !m_footprints.m_filesNotFound.IsEmpty() )
{ {
wxString message = _( "Some files could not be found!" ); wxString message = _( "Some files could not be found!" );
...@@ -628,8 +593,31 @@ bool CVPCB_MAINFRAME::LoadFootprintFiles() ...@@ -628,8 +593,31 @@ bool CVPCB_MAINFRAME::LoadFootprintFiles()
dialog.MessageSet( _( "Some files are invalid!" ) ); dialog.MessageSet( _( "Some files are invalid!" ) );
dialog.ListSet( m_footprints.m_filesInvalid ); dialog.ListSet( m_footprints.m_filesInvalid );
} }
dialog.ShowModal(); dialog.ShowModal();
} }
return true; return true;
} }
void CVPCB_MAINFRAME::UpdateTitle()
{
wxString title;
if( m_NetlistFileName.IsOk() && m_NetlistFileName.FileExists() )
{
title = wxGetApp().GetTitle() + wxT( " " ) + GetBuildVersion() +
wxT( " " ) + m_NetlistFileName.GetFullPath();
if( !m_NetlistFileName.IsFileWritable() )
title += _( " [Read Only]" );
}
else
{
title = wxGetApp().GetTitle() + wxT( " " ) + GetBuildVersion() +
wxT( " " ) + _( " [no file]" );
}
SetTitle( title );
}
...@@ -41,12 +41,12 @@ const wxString titleLibLoadError( _( "Library Load Error" ) ); ...@@ -41,12 +41,12 @@ const wxString titleLibLoadError( _( "Library Load Error" ) );
*/ */
void WinEDA_App::MacOpenFile(const wxString &fileName) void WinEDA_App::MacOpenFile(const wxString &fileName)
{ {
wxFileName filename = fileName; wxFileName filename = fileName;
wxString oldPath; wxString oldPath;
CVPCB_MAINFRAME * frame = ((CVPCB_MAINFRAME*)GetTopWindow()); CVPCB_MAINFRAME* frame = (CVPCB_MAINFRAME*) GetTopWindow();
if(!filename.FileExists()) if( !filename.FileExists() )
return; return;
if( frame->m_NetlistFileName.DirExists() ) if( frame->m_NetlistFileName.DirExists() )
oldPath = frame->m_NetlistFileName.GetPath(); oldPath = frame->m_NetlistFileName.GetPath();
...@@ -54,39 +54,32 @@ void WinEDA_App::MacOpenFile(const wxString &fileName) ...@@ -54,39 +54,32 @@ void WinEDA_App::MacOpenFile(const wxString &fileName)
/* Update the library search path list. */ /* Update the library search path list. */
if( wxGetApp().GetLibraryPathList().Index( oldPath ) != wxNOT_FOUND ) if( wxGetApp().GetLibraryPathList().Index( oldPath ) != wxNOT_FOUND )
wxGetApp().GetLibraryPathList().Remove( oldPath ); wxGetApp().GetLibraryPathList().Remove( oldPath );
wxGetApp().GetLibraryPathList().Insert( filename.GetPath(), 0 ); wxGetApp().GetLibraryPathList().Insert( filename.GetPath(), 0 );
frame->m_NetlistFileName = filename; frame->m_NetlistFileName = filename;
frame->ReadNetList();
if( frame->ReadNetList() )
{
frame->SetTitle( wxGetApp().GetTitle() + wxT( " " ) + GetBuildVersion() +
wxT( " " ) + filename.GetFullPath() );
}
else
{
frame->SetTitle( wxGetApp().GetTitle() + wxT( " " ) + GetBuildVersion() );
}
} }
// Create a new application object // Create a new application object
IMPLEMENT_APP( WinEDA_App ) IMPLEMENT_APP( WinEDA_App )
/************************************/ /************************************/
/* Called to initialize the program */ /* Called to initialize the program */
/************************************/ /************************************/
bool WinEDA_App::OnInit() bool WinEDA_App::OnInit()
{ {
wxFileName filename; wxFileName filename;
wxString message; wxString message;
CVPCB_MAINFRAME* frame = NULL; CVPCB_MAINFRAME* frame = NULL;
InitEDA_Appl( wxT( "CvPCB" ), APP_TYPE_CVPCB ); InitEDA_Appl( wxT( "CVPcb" ), APP_TYPE_CVPCB );
if( m_Checker && m_Checker->IsAnotherRunning() ) if( m_Checker && m_Checker->IsAnotherRunning() )
{ {
if( !IsOK( NULL, _( "Cvpcb is already running, Continue?" ) ) ) if( !IsOK( NULL, _( "CVPcb is already running, Continue?" ) ) )
return false; return false;
} }
...@@ -126,9 +119,7 @@ bool WinEDA_App::OnInit() ...@@ -126,9 +119,7 @@ bool WinEDA_App::OnInit()
frame->LoadFootprintFiles(); frame->LoadFootprintFiles();
frame->m_NetlistFileExtension = wxT( "net" ); frame->m_NetlistFileExtension = wxT( "net" );
frame->m_NetlistFileName.Clear(); frame->m_NetlistFileName.Clear();
frame->SetTitle( GetTitle() + wxT( " " ) + GetBuildVersion() + frame->UpdateTitle();
wxGetCwd() + wxFileName::GetPathSeparator() +
_( " [no file]" ) );
return true; return true;
} }
...@@ -44,60 +44,130 @@ protected: ...@@ -44,60 +44,130 @@ protected:
bool m_isEESchemaNetlist; bool m_isEESchemaNetlist;
PARAM_CFG_ARRAY m_projectFileParams; PARAM_CFG_ARRAY m_projectFileParams;
public: CVPCB_MAINFRAME( const wxString& title, public:
long style = KICAD_DEFAULT_DRAWFRAME_STYLE ); CVPCB_MAINFRAME( const wxString& title, long style = KICAD_DEFAULT_DRAWFRAME_STYLE );
~CVPCB_MAINFRAME(); ~CVPCB_MAINFRAME();
void OnLeftClick( wxListEvent& event ); void OnLeftClick( wxListEvent& event );
void OnLeftDClick( wxListEvent& event ); void OnLeftDClick( wxListEvent& event );
void OnSelectComponent( wxListEvent& event ); void OnSelectComponent( wxListEvent& event );
void Update_Config( wxCommandEvent& event );
void OnQuit( wxCommandEvent& event ); void OnQuit( wxCommandEvent& event );
void OnCloseWindow( wxCloseEvent& Event ); void OnCloseWindow( wxCloseEvent& Event );
void OnSize( wxSizeEvent& SizeEvent ); void OnSize( wxSizeEvent& SizeEvent );
void OnChar( wxKeyEvent& event ); void OnChar( wxKeyEvent& event );
void ReCreateHToolbar(); void ReCreateHToolbar();
virtual void ReCreateMenuBar(); virtual void ReCreateMenuBar();
/**
* Function SetLanguage
* is called on a language menu selection.
*/
void SetLanguage( wxCommandEvent& event ); void SetLanguage( wxCommandEvent& event );
void ToFirstNA( wxCommandEvent& event ); void ToFirstNA( wxCommandEvent& event );
void ToPreviousNA( wxCommandEvent& event ); void ToPreviousNA( wxCommandEvent& event );
/**
* Function DelAssociations
* removes all component footprint associations already made
*/
void DelAssociations( wxCommandEvent& event ); void DelAssociations( wxCommandEvent& event );
void SaveProjectFile( wxCommandEvent& aEvent );
void SaveQuitCvpcb( wxCommandEvent& event ); void SaveQuitCvpcb( wxCommandEvent& event );
/**
* Function LoadNetList
* reads a netlist selected by user when clicking on load netlist button or any entry
* in the file history menu.
*/
void LoadNetList( wxCommandEvent& event ); void LoadNetList( wxCommandEvent& event );
void ConfigCvpcb( wxCommandEvent& event ); void ConfigCvpcb( wxCommandEvent& event );
void OnKeepOpenOnSave( wxCommandEvent& event ); void OnKeepOpenOnSave( wxCommandEvent& event );
void DisplayModule( wxCommandEvent& event ); void DisplayModule( wxCommandEvent& event );
void AssocieModule( wxCommandEvent& event ); void AssocieModule( wxCommandEvent& event );
void WriteStuffList( wxCommandEvent& event ); void WriteStuffList( wxCommandEvent& event );
void DisplayDocFile( wxCommandEvent& event ); void DisplayDocFile( wxCommandEvent& event );
/**
* Function OnSelectFilteringFootprint
* is the command event handler for enabling and disabling footprint filtering.
*/
void OnSelectFilteringFootprint( wxCommandEvent& event ); void OnSelectFilteringFootprint( wxCommandEvent& event );
void OnUpdateKeepOpenOnSave( wxUpdateUIEvent& event ); void OnUpdateKeepOpenOnSave( wxUpdateUIEvent& event );
/**
* Function SetNewPkg
* set the module to the selected component and selects the next component.
*/
void SetNewPkg( const wxString& package ); void SetNewPkg( const wxString& package );
void BuildCmpListBox(); void BuildCmpListBox();
void BuildFOOTPRINTS_LISTBOX(); void BuildFOOTPRINTS_LISTBOX();
void CreateScreenCmp(); void CreateScreenCmp();
int SaveNetList( const wxString& FullFileName );
int SaveComponentList( const wxString& FullFileName ); /**
* Function SaveNetList
* backup and save netlist (.net) file to \a aFullFileName.
*
* @param aFullFileName A reference wxString object containing the full path and
* file name of the netlist to save.
* @return 0 if an error occurred saving the netlist to \a aFullFileName.
*/
int SaveNetList( const wxString& aFullFileName );
/**
* Function SaveComponentList
* backup modules to file \a aFullFileName.
*
* @param aFullFileName Name of net list file to save.
* @returns 1 if OK, 0 if error.
*/
int SaveComponentList( const wxString& aFullFileName );
/**
* Function ReadNetList
* reads the netlist (.net) file defined by #m_NetlistFileName.
*/
bool ReadNetList(); bool ReadNetList();
int ReadSchematicNetlist(); int ReadSchematicNetlist();
void LoadProjectFile( const wxString& FileName );
void SaveProjectFile( const wxString& fileName ); /**
* Function LoadProjectFile
* reads the configuration parameter from the project (.pro) file \a aFileName
*/
void LoadProjectFile( const wxString& aFileName );
/**
* Function LoadSettings
* loads the CVPcb main frame specific configuration settings.
*
* Don't forget to call this base method from any derived classes or the
* settings will not get loaded.
*/
virtual void LoadSettings(); virtual void LoadSettings();
/**
* Function SaveSettings
* save the CVPcb frame specific configuration settings.
*
* Don't forget to call this base method from any derived classes or the
* settings will not get saved.
*/
virtual void SaveSettings(); virtual void SaveSettings();
/** /**
* Function DisplayStatus() * Function DisplayStatus
* Displays info to the status line at bottom of the main frame * displays info to the status line at bottom of the main frame.
*/ */
void DisplayStatus(); void DisplayStatus();
/** /**
* Function LoadFootprintFiles * Function LoadFootprintFiles
* Read the list of libraries (*.mod files) and generate the list of modules. * reads the list of footprint (*.mod files) and generate the list of footprints.
* for each module are stored * for each module are stored
* the module name * the module name
* documentation string * documentation string
...@@ -117,13 +187,38 @@ public: CVPCB_MAINFRAME( const wxString& title, ...@@ -117,13 +187,38 @@ public: CVPCB_MAINFRAME( const wxString& title,
/** /**
* Function LoadComponentFile * Function LoadComponentFile
* Loads the .cmp file that stores the component/footprint association. * loads the .cmp file \a aCmpFileName that stores the component/footprint association.
* @param aCmpFileName = the full filename of .cmp file to load *
* @param aFileName The full filename of .cmp file to load
*/ */
bool LoadComponentFile( const wxString& aCmpFileName ); bool LoadComponentFile( const wxString& aFileName );
/**
* Function GetProjectFileParameters
* return project file parameter list for CVPcb.
* <p>
* Populate the project file parameter array specific to CVPcb if it hasn't
* already been populated and return a reference to the array to the caller.
* Creating the parameter list at run time has the advantage of being able
* to define local variables. The old method of statically building the array
* at compile time requiring global variable definitions.
* </p>
*
* @return A reference to a PARAM_CFG_ARRAY contain the project settings for CVPcb.
*/
PARAM_CFG_ARRAY& GetProjectFileParameters( void ); PARAM_CFG_ARRAY& GetProjectFileParameters( void );
/**
* Function UpdateTitle
* sets the main window title bar text.
* <p>
* If file name defined by CVPCB_MAINFRAME::m_NetlistFileName is not set, the title is
* set to the application name appended with no file. Otherwise, the title is set to
* the full path and file name and read only is appended to the title if the user does
* not have write access to the file.
*/
void UpdateTitle();
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "common.h" #include "common.h"
#include "confirm.h" #include "confirm.h"
#include "gestfich.h" #include "gestfich.h"
#include "id.h"
#include "cvpcb.h" #include "cvpcb.h"
#include "cvpcb_mainframe.h" #include "cvpcb_mainframe.h"
...@@ -59,15 +60,18 @@ void DIALOG_CVPCB_CONFIG::Init() ...@@ -59,15 +60,18 @@ void DIALOG_CVPCB_CONFIG::Init()
// Load user libs paths: // Load user libs paths:
wxStringTokenizer Token( m_UserLibDirBufferImg, wxT( ";\n\r" ) ); wxStringTokenizer Token( m_UserLibDirBufferImg, wxT( ";\n\r" ) );
while( Token.HasMoreTokens() ) while( Token.HasMoreTokens() )
{ {
wxString path = Token.GetNextToken(); wxString path = Token.GetNextToken();
if( wxFileName::DirExists( path ) ) if( wxFileName::DirExists( path ) )
m_listUserPaths->Append( path ); m_listUserPaths->Append( path );
} }
// Display actual libraries paths: // Display actual libraries paths:
wxPathList libpaths = wxGetApp().GetLibraryPathList(); wxPathList libpaths = wxGetApp().GetLibraryPathList();
for( unsigned ii = 0; ii < libpaths.GetCount(); ii++ ) for( unsigned ii = 0; ii < libpaths.GetCount(); ii++ )
{ {
m_DefaultLibraryPathslistBox->Append( libpaths[ii] ); m_DefaultLibraryPathslistBox->Append( libpaths[ii] );
...@@ -102,25 +106,28 @@ void DIALOG_CVPCB_CONFIG::OnOkClick( wxCommandEvent& event ) ...@@ -102,25 +106,28 @@ void DIALOG_CVPCB_CONFIG::OnOkClick( wxCommandEvent& event )
if( m_LibPathChanged ) if( m_LibPathChanged )
{ {
m_Parent->m_UserLibraryPath.Empty(); m_Parent->m_UserLibraryPath.Empty();
for( unsigned ii = 0; ii < m_listUserPaths->GetCount(); ii++ ) for( unsigned ii = 0; ii < m_listUserPaths->GetCount(); ii++ )
{ {
if( ii > 0 ) if( ii > 0 )
m_Parent->m_UserLibraryPath << wxT( ";" ); m_Parent->m_UserLibraryPath << wxT( ";" );
m_Parent->m_UserLibraryPath << m_listUserPaths->GetString( ii ); m_Parent->m_UserLibraryPath << m_listUserPaths->GetString( ii );
} }
} }
// Set new active library list if the lib list of if default path list // Set new active library list if the lib list of if default path list was modified
// was modified
if( m_LibListChanged || m_LibPathChanged ) if( m_LibListChanged || m_LibPathChanged )
{ {
// Recreate lib list // Recreate lib list
m_Parent->m_ModuleLibNames.Clear(); m_Parent->m_ModuleLibNames.Clear();
for( unsigned ii = 0; ii < m_ListLibr->GetCount(); ii++ ) for( unsigned ii = 0; ii < m_ListLibr->GetCount(); ii++ )
m_Parent->m_ModuleLibNames.Add( m_ListLibr->GetString( ii ) ); m_Parent->m_ModuleLibNames.Add( m_ListLibr->GetString( ii ) );
// Recreate equ list // Recreate equ list
m_Parent->m_AliasLibNames.Clear(); m_Parent->m_AliasLibNames.Clear();
for( unsigned ii = 0; ii < m_ListEquiv->GetCount(); ii++ ) for( unsigned ii = 0; ii < m_ListEquiv->GetCount(); ii++ )
m_Parent->m_AliasLibNames.Add( m_ListEquiv->GetString( ii ) ); m_Parent->m_AliasLibNames.Add( m_ListEquiv->GetString( ii ) );
...@@ -128,7 +135,8 @@ void DIALOG_CVPCB_CONFIG::OnOkClick( wxCommandEvent& event ) ...@@ -128,7 +135,8 @@ void DIALOG_CVPCB_CONFIG::OnOkClick( wxCommandEvent& event )
m_Parent->BuildFOOTPRINTS_LISTBOX(); m_Parent->BuildFOOTPRINTS_LISTBOX();
} }
m_Parent->SaveProjectFile( m_Parent->m_NetlistFileName.GetFullPath() ); wxCommandEvent evt( ID_SAVE_PROJECT );
m_Parent->SaveProjectFile( evt );
EndModal( wxID_OK ); EndModal( wxID_OK );
} }
...@@ -144,6 +152,7 @@ void DIALOG_CVPCB_CONFIG::OnButtonUpClick( wxCommandEvent& event ) ...@@ -144,6 +152,7 @@ void DIALOG_CVPCB_CONFIG::OnButtonUpClick( wxCommandEvent& event )
/********************************************************************/ /********************************************************************/
{ {
wxListBox * list = m_ListLibr; wxListBox * list = m_ListLibr;
if( (event.GetId() == ID_EQU_UP) || (event.GetId() == ID_EQU_DOWN) ) if( (event.GetId() == ID_EQU_UP) || (event.GetId() == ID_EQU_DOWN) )
{ {
list = m_ListEquiv; list = m_ListEquiv;
...@@ -151,7 +160,8 @@ void DIALOG_CVPCB_CONFIG::OnButtonUpClick( wxCommandEvent& event ) ...@@ -151,7 +160,8 @@ void DIALOG_CVPCB_CONFIG::OnButtonUpClick( wxCommandEvent& event )
wxArrayInt selections; wxArrayInt selections;
list->GetSelections(selections); list->GetSelections( selections );
if ( selections.GetCount() <= 0 ) // No selection. if ( selections.GetCount() <= 0 ) // No selection.
return; return;
...@@ -163,15 +173,16 @@ void DIALOG_CVPCB_CONFIG::OnButtonUpClick( wxCommandEvent& event ) ...@@ -163,15 +173,16 @@ void DIALOG_CVPCB_CONFIG::OnButtonUpClick( wxCommandEvent& event )
for( size_t ii = 0; ii < selections.GetCount(); ii++ ) for( size_t ii = 0; ii < selections.GetCount(); ii++ )
{ {
int jj = selections[ii]; int jj = selections[ii];
EXCHG( libnames[jj], libnames[jj-1]); EXCHG( libnames[jj], libnames[jj-1] );
} }
list->Set(libnames);
list->Set( libnames );
// Reselect previously selected names // Reselect previously selected names
for( size_t ii = 0; ii < selections.GetCount(); ii++ ) for( size_t ii = 0; ii < selections.GetCount(); ii++ )
{ {
int jj = selections[ii]; int jj = selections[ii];
list->SetSelection(jj-1); list->SetSelection( jj-1 );
} }
m_LibListChanged = TRUE; m_LibListChanged = TRUE;
...@@ -183,6 +194,7 @@ void DIALOG_CVPCB_CONFIG::OnButtonDownClick( wxCommandEvent& event ) ...@@ -183,6 +194,7 @@ void DIALOG_CVPCB_CONFIG::OnButtonDownClick( wxCommandEvent& event )
/*********************************************************************/ /*********************************************************************/
{ {
wxListBox * list = m_ListLibr; wxListBox * list = m_ListLibr;
if( (event.GetId() == ID_EQU_UP) || (event.GetId() == ID_EQU_DOWN) ) if( (event.GetId() == ID_EQU_UP) || (event.GetId() == ID_EQU_DOWN) )
{ {
list = m_ListEquiv; list = m_ListEquiv;
...@@ -190,7 +202,8 @@ void DIALOG_CVPCB_CONFIG::OnButtonDownClick( wxCommandEvent& event ) ...@@ -190,7 +202,8 @@ void DIALOG_CVPCB_CONFIG::OnButtonDownClick( wxCommandEvent& event )
wxArrayInt selections; wxArrayInt selections;
list->GetSelections(selections); list->GetSelections( selections );
if ( selections.GetCount() <= 0 ) // No selection. if ( selections.GetCount() <= 0 ) // No selection.
return; return;
...@@ -205,7 +218,8 @@ void DIALOG_CVPCB_CONFIG::OnButtonDownClick( wxCommandEvent& event ) ...@@ -205,7 +218,8 @@ void DIALOG_CVPCB_CONFIG::OnButtonDownClick( wxCommandEvent& event )
int jj = selections[ii]; int jj = selections[ii];
EXCHG( libnames[jj], libnames[jj+1]); EXCHG( libnames[jj], libnames[jj+1]);
} }
list->Set(libnames);
list->Set( libnames );
// Reselect previously selected names // Reselect previously selected names
for( size_t ii = 0; ii < selections.GetCount(); ii++ ) for( size_t ii = 0; ii < selections.GetCount(); ii++ )
...@@ -213,6 +227,7 @@ void DIALOG_CVPCB_CONFIG::OnButtonDownClick( wxCommandEvent& event ) ...@@ -213,6 +227,7 @@ void DIALOG_CVPCB_CONFIG::OnButtonDownClick( wxCommandEvent& event )
int jj = selections[ii]; int jj = selections[ii];
list->SetSelection(jj+1); list->SetSelection(jj+1);
} }
m_LibListChanged = TRUE; m_LibListChanged = TRUE;
} }
...@@ -229,7 +244,8 @@ void DIALOG_CVPCB_CONFIG::OnRemoveLibClick( wxCommandEvent& event ) ...@@ -229,7 +244,8 @@ void DIALOG_CVPCB_CONFIG::OnRemoveLibClick( wxCommandEvent& event )
wxArrayInt selections; wxArrayInt selections;
list->GetSelections(selections); list->GetSelections( selections );
for( int ii = selections.GetCount()-1; ii >= 0; ii-- ) for( int ii = selections.GetCount()-1; ii >= 0; ii-- )
{ {
list->Delete(selections[ii] ); list->Delete(selections[ii] );
...@@ -256,6 +272,7 @@ void DIALOG_CVPCB_CONFIG::OnAddOrInsertLibClick( wxCommandEvent& event ) ...@@ -256,6 +272,7 @@ void DIALOG_CVPCB_CONFIG::OnAddOrInsertLibClick( wxCommandEvent& event )
wildcard = FootprintAliasFileWildcard; wildcard = FootprintAliasFileWildcard;
wxListBox * list = m_ListEquiv; wxListBox * list = m_ListEquiv;
if( (event.GetId() == ID_ADD_LIB) || (event.GetId() == ID_INSERT_LIB) ) if( (event.GetId() == ID_ADD_LIB) || (event.GetId() == ID_INSERT_LIB) )
{ {
list = m_ListLibr; list = m_ListLibr;
...@@ -266,6 +283,7 @@ void DIALOG_CVPCB_CONFIG::OnAddOrInsertLibClick( wxCommandEvent& event ) ...@@ -266,6 +283,7 @@ void DIALOG_CVPCB_CONFIG::OnAddOrInsertLibClick( wxCommandEvent& event )
list->GetSelections(selections); list->GetSelections(selections);
ii = selections.GetCount(); ii = selections.GetCount();
if( ii > 0 ) if( ii > 0 )
ii = selections[0]; ii = selections[0];
else else
...@@ -273,6 +291,7 @@ void DIALOG_CVPCB_CONFIG::OnAddOrInsertLibClick( wxCommandEvent& event ) ...@@ -273,6 +291,7 @@ void DIALOG_CVPCB_CONFIG::OnAddOrInsertLibClick( wxCommandEvent& event )
wxString libpath; wxString libpath;
libpath = m_DefaultLibraryPathslistBox->GetStringSelection(); libpath = m_DefaultLibraryPathslistBox->GetStringSelection();
if( libpath.IsEmpty() ) if( libpath.IsEmpty() )
libpath = wxGetApp().ReturnLastVisitedLibraryPath(); libpath = wxGetApp().ReturnLastVisitedLibraryPath();
...@@ -289,6 +308,7 @@ void DIALOG_CVPCB_CONFIG::OnAddOrInsertLibClick( wxCommandEvent& event ) ...@@ -289,6 +308,7 @@ void DIALOG_CVPCB_CONFIG::OnAddOrInsertLibClick( wxCommandEvent& event )
for( unsigned jj = 0; jj < Filenames.GetCount(); jj++ ) for( unsigned jj = 0; jj < Filenames.GetCount(); jj++ )
{ {
fn = Filenames[jj]; fn = Filenames[jj];
if( jj == 0 ) if( jj == 0 )
wxGetApp().SaveLastVisitedLibraryPath( fn.GetPath() ); wxGetApp().SaveLastVisitedLibraryPath( fn.GetPath() );
...@@ -300,15 +320,17 @@ void DIALOG_CVPCB_CONFIG::OnAddOrInsertLibClick( wxCommandEvent& event ) ...@@ -300,15 +320,17 @@ void DIALOG_CVPCB_CONFIG::OnAddOrInsertLibClick( wxCommandEvent& event )
* is a sub path of these default paths * is a sub path of these default paths
*/ */
libfilename = wxGetApp().ReturnFilenameWithRelativePathInLibPath( fn.GetFullPath() ); libfilename = wxGetApp().ReturnFilenameWithRelativePathInLibPath( fn.GetFullPath() );
// Remove extension: // Remove extension:
fn = libfilename; fn = libfilename;
fn.SetExt(wxEmptyString); fn.SetExt( wxEmptyString );
libfilename = fn.GetFullPath(); libfilename = fn.GetFullPath();
// Add or insert new library name, if not already in list // Add or insert new library name, if not already in list
if( list->FindString( libfilename, fn.IsCaseSensitive() ) == wxNOT_FOUND ) if( list->FindString( libfilename, fn.IsCaseSensitive() ) == wxNOT_FOUND )
{ {
m_LibListChanged = TRUE; m_LibListChanged = TRUE;
if( ! insert ) if( ! insert )
list->Append( libfilename ); list->Append( libfilename );
else else
...@@ -344,25 +366,27 @@ void DIALOG_CVPCB_CONFIG::OnAddOrInsertPath( wxCommandEvent& event ) ...@@ -344,25 +366,27 @@ void DIALOG_CVPCB_CONFIG::OnAddOrInsertPath( wxCommandEvent& event )
if( m_listUserPaths->FindString( path ) == wxNOT_FOUND ) if( m_listUserPaths->FindString( path ) == wxNOT_FOUND )
{ {
int ipos = m_listUserPaths->GetCount(); int ipos = m_listUserPaths->GetCount();
if( event.GetId() == ID_INSERT_PATH ) if( event.GetId() == ID_INSERT_PATH )
{ {
if( ipos ) if( ipos )
ipos--; ipos--;
int jj = m_listUserPaths->GetSelection(); int jj = m_listUserPaths->GetSelection();
if( jj >= 0 ) if( jj >= 0 )
ipos = jj; ipos = jj;
} }
// Ask the user if this is a relative path // Ask the user if this is a relative path
int diag = wxMessageBox( int diag = wxMessageBox( _( "Use a relative path?" ),
_( "Use a relative path?" ), _( "Path type" ),
_( "Path type" ), wxYES_NO | wxICON_QUESTION, this );
wxYES_NO | wxICON_QUESTION, this );
if( diag == wxYES ) if( diag == wxYES )
{ // Make it relative { // Make it relative
wxFileName fn = path; wxFileName fn = path;
fn.MakeRelativeTo( wxT(".") ); fn.MakeRelativeTo( wxT( "." ) );
path = fn.GetPathWithSep() + fn.GetFullName(); path = fn.GetPathWithSep() + fn.GetFullName();
} }
...@@ -373,13 +397,16 @@ void DIALOG_CVPCB_CONFIG::OnAddOrInsertPath( wxCommandEvent& event ) ...@@ -373,13 +397,16 @@ void DIALOG_CVPCB_CONFIG::OnAddOrInsertPath( wxCommandEvent& event )
// Display actual libraries paths: // Display actual libraries paths:
wxPathList libpaths = wxGetApp().GetLibraryPathList(); wxPathList libpaths = wxGetApp().GetLibraryPathList();
m_DefaultLibraryPathslistBox->Clear(); m_DefaultLibraryPathslistBox->Clear();
for( unsigned ii = 0; ii < libpaths.GetCount(); ii++ ) for( unsigned ii = 0; ii < libpaths.GetCount(); ii++ )
{ {
m_DefaultLibraryPathslistBox->Append( libpaths[ii] ); m_DefaultLibraryPathslistBox->Append( libpaths[ii] );
} }
} }
else else
{
DisplayError( this, _( "Path already in use" ) ); DisplayError( this, _( "Path already in use" ) );
}
wxGetApp().SaveLastVisitedLibraryPath( path ); wxGetApp().SaveLastVisitedLibraryPath( path );
} }
...@@ -391,6 +418,7 @@ void DIALOG_CVPCB_CONFIG::OnRemoveUserPath( wxCommandEvent& event ) ...@@ -391,6 +418,7 @@ void DIALOG_CVPCB_CONFIG::OnRemoveUserPath( wxCommandEvent& event )
if( ii < 0 ) if( ii < 0 )
ii = m_listUserPaths->GetCount() - 1; ii = m_listUserPaths->GetCount() - 1;
if( ii >= 0 ) if( ii >= 0 )
{ {
wxGetApp().RemoveLibraryPath( m_listUserPaths->GetStringSelection() ); wxGetApp().RemoveLibraryPath( m_listUserPaths->GetStringSelection() );
...@@ -401,6 +429,7 @@ void DIALOG_CVPCB_CONFIG::OnRemoveUserPath( wxCommandEvent& event ) ...@@ -401,6 +429,7 @@ void DIALOG_CVPCB_CONFIG::OnRemoveUserPath( wxCommandEvent& event )
// Display actual libraries paths: // Display actual libraries paths:
wxPathList libpaths = wxGetApp().GetLibraryPathList(); wxPathList libpaths = wxGetApp().GetLibraryPathList();
m_DefaultLibraryPathslistBox->Clear(); m_DefaultLibraryPathslistBox->Clear();
for( unsigned ii = 0; ii < libpaths.GetCount(); ii++ ) for( unsigned ii = 0; ii < libpaths.GetCount(); ii++ )
{ {
m_DefaultLibraryPathslistBox->Append( libpaths[ii] ); m_DefaultLibraryPathslistBox->Append( libpaths[ii] );
......
...@@ -15,10 +15,7 @@ ...@@ -15,10 +15,7 @@
#include "build_version.h" #include "build_version.h"
/*
* Set the module to the selected component
* Selects the next component
*/
void CVPCB_MAINFRAME::SetNewPkg( const wxString& package ) void CVPCB_MAINFRAME::SetNewPkg( const wxString& package )
{ {
COMPONENT* Component; COMPONENT* Component;
...@@ -30,6 +27,7 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& package ) ...@@ -30,6 +27,7 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& package )
return; return;
NumCmp = m_ListCmp->GetSelection(); NumCmp = m_ListCmp->GetSelection();
if( NumCmp < 0 ) if( NumCmp < 0 )
{ {
NumCmp = 0; NumCmp = 0;
...@@ -46,9 +44,9 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& package ) ...@@ -46,9 +44,9 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& package )
Component->m_Module = package; Component->m_Module = package;
msg.Printf( CMP_FORMAT, NumCmp + 1, msg.Printf( CMP_FORMAT, NumCmp + 1,
GetChars( Component->m_Reference ), GetChars( Component->m_Reference ),
GetChars( Component->m_Value ), GetChars( Component->m_Value ),
GetChars( Component->m_Module ) ); GetChars( Component->m_Module ) );
m_modified = true; m_modified = true;
if( isUndefined ) if( isUndefined )
...@@ -60,15 +58,13 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& package ) ...@@ -60,15 +58,13 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& package )
// We activate next component: // We activate next component:
if( NumCmp < (m_ListCmp->GetCount() - 1) ) if( NumCmp < (m_ListCmp->GetCount() - 1) )
NumCmp++; NumCmp++;
m_ListCmp->SetSelection( NumCmp, TRUE ); m_ListCmp->SetSelection( NumCmp, TRUE );
DisplayStatus(); DisplayStatus();
} }
/*
* Read the netlist format and file components.
*/
bool CVPCB_MAINFRAME::ReadNetList() bool CVPCB_MAINFRAME::ReadNetList()
{ {
wxString msg; wxString msg;
...@@ -81,6 +77,8 @@ bool CVPCB_MAINFRAME::ReadNetList() ...@@ -81,6 +77,8 @@ bool CVPCB_MAINFRAME::ReadNetList()
msg.Printf( _( "File <%s> does not appear to be a valid Kicad net list file." ), msg.Printf( _( "File <%s> does not appear to be a valid Kicad net list file." ),
GetChars( m_NetlistFileName.GetFullPath() ) ); GetChars( m_NetlistFileName.GetFullPath() ) );
::wxMessageBox( msg, _( "File Error" ), wxOK | wxICON_ERROR, this ); ::wxMessageBox( msg, _( "File Error" ), wxOK | wxICON_ERROR, this );
m_NetlistFileName.Clear();
UpdateTitle();
return false; return false;
} }
...@@ -90,7 +88,7 @@ bool CVPCB_MAINFRAME::ReadNetList() ...@@ -90,7 +88,7 @@ bool CVPCB_MAINFRAME::ReadNetList()
return false; return false;
LoadProjectFile( m_NetlistFileName.GetFullPath() ); LoadProjectFile( m_NetlistFileName.GetFullPath() );
LoadFootprintFiles( ); LoadFootprintFiles();
BuildFOOTPRINTS_LISTBOX(); BuildFOOTPRINTS_LISTBOX();
m_ListCmp->Clear(); m_ListCmp->Clear();
...@@ -103,6 +101,7 @@ bool CVPCB_MAINFRAME::ReadNetList() ...@@ -103,6 +101,7 @@ bool CVPCB_MAINFRAME::ReadNetList()
GetChars( component.m_Value ), GetChars( component.m_Value ),
GetChars( component.m_Module ) ); GetChars( component.m_Module ) );
m_ListCmp->AppendLine( msg ); m_ListCmp->AppendLine( msg );
if( component.m_Module.IsEmpty() ) if( component.m_Module.IsEmpty() )
m_undefinedComponentCnt += 1; m_undefinedComponentCnt += 1;
} }
...@@ -112,9 +111,7 @@ bool CVPCB_MAINFRAME::ReadNetList() ...@@ -112,9 +111,7 @@ bool CVPCB_MAINFRAME::ReadNetList()
DisplayStatus(); DisplayStatus();
/* Update the title of the main window. */ UpdateTitle();
SetTitle( wxGetApp().GetTitle() + wxT( " " ) + GetBuildVersion() +
wxT( " " ) + m_NetlistFileName.GetFullPath() );
UpdateFileHistory( m_NetlistFileName.GetFullPath() ); UpdateFileHistory( m_NetlistFileName.GetFullPath() );
...@@ -122,34 +119,40 @@ bool CVPCB_MAINFRAME::ReadNetList() ...@@ -122,34 +119,40 @@ bool CVPCB_MAINFRAME::ReadNetList()
} }
/* int CVPCB_MAINFRAME::SaveNetList( const wxString& aFullFileName )
* Backup and NetList cmp
* The full name of the netlist file must be in FFileName.
* The file name is deducted in cmp
*/
int CVPCB_MAINFRAME::SaveNetList( const wxString& fileName )
{ {
wxFileName fn; wxFileName fn;
if( !fileName && m_NetlistFileName.IsOk() ) if( !aFullFileName.IsEmpty() && m_NetlistFileName.IsOk() )
{
fn = m_NetlistFileName; fn = m_NetlistFileName;
}
else else
fn = wxFileName( wxGetCwd(), _( "unamed" ), NetExtBuffer ); {
wxFileDialog dlg( this, _( "Save Net and Component List" ), wxGetCwd(),
wxEmptyString, NetlistFileWildcard, wxFD_SAVE );
if( dlg.ShowModal() == wxID_CANCEL )
return -1;
fn = dlg.GetPath();
wxFileDialog dlg( this, _( "Save Net and Component List" ), fn.GetPath(), if( !fn.HasExt() )
fn.GetFullName(), NetlistFileWildcard, fn.SetExt( NetlistFileExtension );
wxFD_SAVE/*| wxFD_OVERWRITE_PROMPT*/ );
if( dlg.ShowModal() == wxID_CANCEL ) m_NetlistFileName = fn;
return -1; }
if( !IsWritable( fn.GetFullPath() ) )
return 0;
if( SaveComponentList( dlg.GetPath() ) == 0 ) if( SaveComponentList( fn.GetFullPath() ) == 0 )
{ {
DisplayError( this, _( "Unable to create component file (.cmp)" ) ); DisplayError( this, _( "Unable to create component file (.cmp)" ) );
return 0; return 0;
} }
FILE* netlist = wxFopen( dlg.GetPath(), wxT( "wt" ) ); FILE* netlist = wxFopen( fn.GetFullPath(), wxT( "wt" ) );
if( netlist == 0 ) if( netlist == 0 )
{ {
......
...@@ -29,8 +29,9 @@ void CVPCB_MAINFRAME::ReCreateMenuBar() ...@@ -29,8 +29,9 @@ void CVPCB_MAINFRAME::ReCreateMenuBar()
// Delete all existing menus so they can be rebuilt. // Delete all existing menus so they can be rebuilt.
// This allows language changes of the menu text on the fly. // This allows language changes of the menu text on the fly.
menuBar->Freeze(); menuBar->Freeze();
while( menuBar->GetMenuCount() ) while( menuBar->GetMenuCount() )
delete menuBar->Remove(0); delete menuBar->Remove( 0 );
// Recreate all menus: // Recreate all menus:
...@@ -46,25 +47,34 @@ void CVPCB_MAINFRAME::ReCreateMenuBar() ...@@ -46,25 +47,34 @@ void CVPCB_MAINFRAME::ReCreateMenuBar()
// Open Recent submenu // Open Recent submenu
static wxMenu* openRecentMenu; static wxMenu* openRecentMenu;
// Add this menu to list menu managed by m_fileHistory // Add this menu to list menu managed by m_fileHistory
// (the file history will be updated when adding/removing files in history // (the file history will be updated when adding/removing files in history
if( openRecentMenu ) if( openRecentMenu )
wxGetApp().m_fileHistory.RemoveMenu( openRecentMenu ); wxGetApp().m_fileHistory.RemoveMenu( openRecentMenu );
openRecentMenu = new wxMenu(); openRecentMenu = new wxMenu();
wxGetApp().m_fileHistory.UseMenu( openRecentMenu ); wxGetApp().m_fileHistory.UseMenu( openRecentMenu );
wxGetApp().m_fileHistory.AddFilesToMenu( ); wxGetApp().m_fileHistory.AddFilesToMenu();
ADD_MENUITEM_WITH_HELP_AND_SUBMENU( filesMenu, openRecentMenu, -1, ADD_MENUITEM_WITH_HELP_AND_SUBMENU( filesMenu, openRecentMenu, -1,
_( "Open &Recent" ), _( "Open &Recent" ),
_("Open a recent opened netlist document" ), _( "Open a recent opened netlist document" ),
open_project_xpm ); open_project_xpm );
// Separator // Separator
filesMenu->AppendSeparator(); filesMenu->AppendSeparator();
// Save
ADD_MENUITEM_WITH_HELP( filesMenu,
wxID_SAVE,
_( "&Save\tCtrl+S" ),
_( "Save net list and footprint list files" ),
save_xpm );
// Save as // Save as
ADD_MENUITEM_WITH_HELP( filesMenu, ADD_MENUITEM_WITH_HELP( filesMenu,
ID_SAVE_PROJECT, wxID_SAVEAS,
_( "&Save As..." ), _( "Save &As..." ),
_( "Save new net list and footprint list files" ), _( "Save new net list and footprint list files" ),
save_xpm ); save_xpm );
...@@ -75,7 +85,7 @@ void CVPCB_MAINFRAME::ReCreateMenuBar() ...@@ -75,7 +85,7 @@ void CVPCB_MAINFRAME::ReCreateMenuBar()
ADD_MENUITEM_WITH_HELP( filesMenu, ADD_MENUITEM_WITH_HELP( filesMenu,
wxID_EXIT, wxID_EXIT,
_( "&Quit" ), _( "&Quit" ),
_( "Quit CvPCB" ), _( "Quit CVPcb" ),
exit_xpm ); exit_xpm );
// Menu Preferences: // Menu Preferences:
...@@ -105,10 +115,14 @@ void CVPCB_MAINFRAME::ReCreateMenuBar() ...@@ -105,10 +115,14 @@ void CVPCB_MAINFRAME::ReCreateMenuBar()
// Separator // Separator
preferencesMenu->AppendSeparator(); preferencesMenu->AppendSeparator();
ADD_MENUITEM_WITH_HELP( preferencesMenu, ID_CONFIG_SAVE, ADD_MENUITEM_WITH_HELP( preferencesMenu, ID_SAVE_PROJECT,
_( "&Save Project File" ), _( "&Save Project File" ),
_( "Save changes to the project file" ), _( "Save changes to the project configuration file" ),
save_setup_xpm ); save_setup_xpm );
ADD_MENUITEM_WITH_HELP( preferencesMenu, ID_SAVE_PROJECT_AS,
_( "&Save Project File As" ),
_( "Save changes to the project configuration to a new file" ),
save_setup_xpm );
// Menu Help: // Menu Help:
wxMenu* helpMenu = new wxMenu; wxMenu* helpMenu = new wxMenu;
...@@ -118,13 +132,13 @@ void CVPCB_MAINFRAME::ReCreateMenuBar() ...@@ -118,13 +132,13 @@ void CVPCB_MAINFRAME::ReCreateMenuBar()
// Contents // Contents
ADD_MENUITEM_WITH_HELP( helpMenu, wxID_HELP, _( "&Contents" ), ADD_MENUITEM_WITH_HELP( helpMenu, wxID_HELP, _( "&Contents" ),
_( "Open the Cvpcb handbook" ), _( "Open the CVPcb handbook" ),
online_help_xpm ); online_help_xpm );
// About // About
ADD_MENUITEM_WITH_HELP( helpMenu, wxID_ABOUT, ADD_MENUITEM_WITH_HELP( helpMenu, wxID_ABOUT,
_( "&About CvPCB" ), _( "&About CVPcb" ),
_( "About CvPCB schematic to pcb converter" ), _( "About CVPcb schematic to pcb converter" ),
info_xpm ); info_xpm );
// Create the menubar and append all submenus // Create the menubar and append all submenus
......
...@@ -23,22 +23,17 @@ char EnteteCmpMod[] = { "Cmp-Mod V01" }; ...@@ -23,22 +23,17 @@ char EnteteCmpMod[] = { "Cmp-Mod V01" };
#define titleComponentLibErr _( "Component Library Error" ) #define titleComponentLibErr _( "Component Library Error" )
/* int CVPCB_MAINFRAME::SaveComponentList( const wxString& aFullFileName )
* Backup modules file.
*
* @param NetlistFullFileName - Name of net list file to save.
* @returns - 1 if OK, 0 if error.
*/
int CVPCB_MAINFRAME::SaveComponentList( const wxString& NetlistFullFileName )
{ {
FILE* dest; FILE* dest;
wxFileName fn( NetlistFullFileName ); wxFileName fn( aFullFileName );
char Line[1024]; char Line[1024];
wxString Title = wxGetApp().GetTitle() + wxT( " " ) + GetBuildVersion(); wxString Title = wxGetApp().GetTitle() + wxT( " " ) + GetBuildVersion();
fn.SetExt( ComponentFileExtension ); fn.SetExt( ComponentFileExtension );
dest = wxFopen( fn.GetFullPath(), wxT( "wt" ) ); dest = wxFopen( fn.GetFullPath(), wxT( "wt" ) );
if( dest == NULL ) if( dest == NULL )
return 0; return 0;
...@@ -49,14 +44,10 @@ int CVPCB_MAINFRAME::SaveComponentList( const wxString& NetlistFullFileName ) ...@@ -49,14 +44,10 @@ int CVPCB_MAINFRAME::SaveComponentList( const wxString& NetlistFullFileName )
BOOST_FOREACH( COMPONENT& component, m_components ) BOOST_FOREACH( COMPONENT& component, m_components )
{ {
fprintf( dest, "\nBeginCmp\n" ); fprintf( dest, "\nBeginCmp\n" );
fprintf( dest, "TimeStamp = %s;\n", fprintf( dest, "TimeStamp = %s;\n", TO_UTF8( component.m_TimeStamp ) );
TO_UTF8( component.m_TimeStamp ) ); fprintf( dest, "Reference = %s;\n", TO_UTF8( component.m_Reference ) );
fprintf( dest, "Reference = %s;\n", fprintf( dest, "ValeurCmp = %s;\n", TO_UTF8( component.m_Value ) );
TO_UTF8( component.m_Reference ) ); fprintf( dest, "IdModule = %s;\n", TO_UTF8( component.m_Module ) );
fprintf( dest, "ValeurCmp = %s;\n",
TO_UTF8( component.m_Value ) );
fprintf( dest, "IdModule = %s;\n",
TO_UTF8( component.m_Module ) );
fprintf( dest, "EndCmp\n" ); fprintf( dest, "EndCmp\n" );
} }
...@@ -66,25 +57,22 @@ int CVPCB_MAINFRAME::SaveComponentList( const wxString& NetlistFullFileName ) ...@@ -66,25 +57,22 @@ int CVPCB_MAINFRAME::SaveComponentList( const wxString& NetlistFullFileName )
} }
/* bool CVPCB_MAINFRAME::LoadComponentFile( const wxString& aFileName )
* Load list of associated components and footprints.
*/
bool CVPCB_MAINFRAME::LoadComponentFile( const wxString& fileName )
{ {
wxString timestamp, valeur, ilib, namecmp, msg; wxString timestamp, valeur, ilib, namecmp, msg;
bool read_cmp_data = FALSE, eof = FALSE; bool read_cmp_data = false, eof = false;
char Line[1024], * ident, * data; char Line[1024], * ident, * data;
FILE* source; FILE* source;
wxFileName fn = fileName; wxFileName fn = aFileName;
fn.SetExt( ComponentFileExtension ); fn.SetExt( ComponentFileExtension );
source = wxFopen( fn.GetFullPath(), wxT( "rt" ) ); source = wxFopen( fn.GetFullPath(), wxT( "rt" ) );
if( source == NULL ) if( source == NULL )
{ {
msg.Printf( _( "Cannot open CvPcb component file <%s>." ), msg.Printf( _( "Cannot open CVPcb component file <%s>." ),
GetChars( fn.GetFullPath() ) ); GetChars( fn.GetFullPath() ) );
msg << wxT("\n") << _("This is normal if you are opening a new netlist file"); msg << wxT( "\n" ) << _( "This is normal if you are opening a new netlist file" );
wxMessageBox( msg, titleComponentLibErr, wxOK | wxICON_ERROR ); wxMessageBox( msg, titleComponentLibErr, wxOK | wxICON_ERROR );
return false; return false;
} }
...@@ -115,23 +103,24 @@ bool CVPCB_MAINFRAME::LoadComponentFile( const wxString& fileName ) ...@@ -115,23 +103,24 @@ bool CVPCB_MAINFRAME::LoadComponentFile( const wxString& fileName )
/* Search the beginning of the component description. */ /* Search the beginning of the component description. */
if( strnicmp( Line, "BeginCmp", 8 ) != 0 ) if( strnicmp( Line, "BeginCmp", 8 ) != 0 )
continue; continue;
timestamp.Empty(); timestamp.Empty();
valeur.Empty(); valeur.Empty();
ilib.Empty(); ilib.Empty();
namecmp.Empty(); namecmp.Empty();
read_cmp_data = TRUE; read_cmp_data = true;
while( !eof && read_cmp_data ) while( !eof && read_cmp_data )
{ {
if( fgets( Line, 1024, source ) == 0 ) if( fgets( Line, 1024, source ) == 0 )
{ {
eof = TRUE; eof = true;
break; break;
} }
if( strnicmp( Line, "EndCmp", 6 ) == 0 ) if( strnicmp( Line, "EndCmp", 6 ) == 0 )
{ {
read_cmp_data = TRUE; read_cmp_data = true;
break; break;
} }
...@@ -141,38 +130,37 @@ bool CVPCB_MAINFRAME::LoadComponentFile( const wxString& fileName ) ...@@ -141,38 +130,37 @@ bool CVPCB_MAINFRAME::LoadComponentFile( const wxString& fileName )
if( strnicmp( ident, "TimeStamp", 9 ) == 0 ) if( strnicmp( ident, "TimeStamp", 9 ) == 0 )
{ {
timestamp = FROM_UTF8( data ); timestamp = FROM_UTF8( data );
timestamp.Trim( TRUE ); timestamp.Trim( true );
timestamp.Trim( FALSE ); timestamp.Trim( false );
continue; continue;
} }
if( strnicmp( ident, "Reference", 9 ) == 0 ) if( strnicmp( ident, "Reference", 9 ) == 0 )
{ {
namecmp = FROM_UTF8( data ); namecmp = FROM_UTF8( data );
namecmp.Trim( TRUE ); namecmp.Trim( true );
namecmp.Trim( FALSE ); namecmp.Trim( false );
continue; continue;
} }
if( strnicmp( ident, "ValeurCmp", 9 ) == 0 ) if( strnicmp( ident, "ValeurCmp", 9 ) == 0 )
{ {
valeur = FROM_UTF8( data ); valeur = FROM_UTF8( data );
valeur.Trim( TRUE ); valeur.Trim( true );
valeur.Trim( FALSE ); valeur.Trim( false );
continue; continue;
} }
if( strnicmp( ident, "IdModule", 8 ) == 0 ) if( strnicmp( ident, "IdModule", 8 ) == 0 )
{ {
ilib = FROM_UTF8( data ); ilib = FROM_UTF8( data );
ilib.Trim( TRUE ); ilib.Trim( true );
ilib.Trim( FALSE ); ilib.Trim( false );
continue; continue;
} }
} /* End reading component description. */ } /* End reading component description. */
/* Search corresponding component and NetList /* Search corresponding component and NetList Update its parameters. */
* Update its parameters. */
BOOST_FOREACH( COMPONENT& component, m_components ) BOOST_FOREACH( COMPONENT& component, m_components )
{ {
if( namecmp != component.m_Reference ) if( namecmp != component.m_Reference )
......
...@@ -22,64 +22,63 @@ void CVPCB_MAINFRAME::ReCreateHToolbar() ...@@ -22,64 +22,63 @@ void CVPCB_MAINFRAME::ReCreateHToolbar()
m_HToolBar = new EDA_TOOLBAR( TOOLBAR_MAIN, this, ID_H_TOOLBAR, TRUE ); m_HToolBar = new EDA_TOOLBAR( TOOLBAR_MAIN, this, ID_H_TOOLBAR, TRUE );
m_HToolBar->AddTool( ID_CVPCB_READ_INPUT_NETLIST, wxEmptyString, m_HToolBar->AddTool( ID_CVPCB_READ_INPUT_NETLIST, wxEmptyString,
wxBitmap( open_document_xpm ), wxBitmap( open_document_xpm ),
_( "Open a net list file" ) ); _( "Open a net list file" ) );
m_HToolBar->AddTool( ID_CVPCB_SAVEQUITCVPCB, wxEmptyString, m_HToolBar->AddTool( wxID_SAVE, wxEmptyString, wxBitmap( save_xpm ),
wxBitmap( save_xpm ), _( "Save net list and footprint files" ) );
_( "Save net list and footprint files" ) );
m_HToolBar->AddSeparator(); m_HToolBar->AddSeparator();
m_HToolBar->AddTool( ID_CVPCB_CREATE_CONFIGWINDOW, wxEmptyString, m_HToolBar->AddTool( ID_CVPCB_CREATE_CONFIGWINDOW, wxEmptyString,
wxBitmap( config_xpm ), wxBitmap( config_xpm ),
_( "Configuration" ) ); _( "Configuration" ) );
m_HToolBar->AddSeparator(); m_HToolBar->AddSeparator();
m_HToolBar->AddTool( ID_CVPCB_CREATE_SCREENCMP, wxEmptyString, m_HToolBar->AddTool( ID_CVPCB_CREATE_SCREENCMP, wxEmptyString,
wxBitmap( show_footprint_xpm ), wxBitmap( show_footprint_xpm ),
_( "View selected footprint" ) ); _( "View selected footprint" ) );
m_HToolBar->AddTool( ID_CVPCB_AUTO_ASSOCIE, wxEmptyString, m_HToolBar->AddTool( ID_CVPCB_AUTO_ASSOCIE, wxEmptyString,
wxBitmap( auto_associe_xpm ), wxBitmap( auto_associe_xpm ),
_( "Perform automatic footprint association" ) ); _( "Perform automatic footprint association" ) );
m_HToolBar->AddSeparator(); m_HToolBar->AddSeparator();
m_HToolBar->AddTool( ID_CVPCB_GOTO_PREVIOUSNA, wxEmptyString, m_HToolBar->AddTool( ID_CVPCB_GOTO_PREVIOUSNA, wxEmptyString,
wxBitmap( left_xpm ), wxBitmap( left_xpm ),
_( "Select previous free component" ) ); _( "Select previous free component" ) );
m_HToolBar->AddTool( ID_CVPCB_GOTO_FIRSTNA, wxEmptyString, m_HToolBar->AddTool( ID_CVPCB_GOTO_FIRSTNA, wxEmptyString,
wxBitmap( right_xpm ), wxBitmap( right_xpm ),
_( "Select next free component" ) ); _( "Select next free component" ) );
m_HToolBar->AddSeparator(); m_HToolBar->AddSeparator();
m_HToolBar->AddTool( ID_CVPCB_DEL_ASSOCIATIONS, wxEmptyString, m_HToolBar->AddTool( ID_CVPCB_DEL_ASSOCIATIONS, wxEmptyString,
wxBitmap( delete_association_xpm ), wxBitmap( delete_association_xpm ),
_( "Delete all associations" ) ); _( "Delete all associations" ) );
m_HToolBar->AddSeparator(); m_HToolBar->AddSeparator();
m_HToolBar->AddTool( ID_CVPCB_CREATE_STUFF_FILE, wxEmptyString, m_HToolBar->AddTool( ID_CVPCB_CREATE_STUFF_FILE, wxEmptyString,
wxBitmap( export_footprint_names_xpm ), wxBitmap( export_footprint_names_xpm ),
_( _( "Create export file (component/footprint list, \
"Create export file (component/footprint list, \ used by eeschema to fill the footprint field of components)" ) );
used by eeschema to fill the footprint field of components)" ) );
m_HToolBar->AddSeparator(); m_HToolBar->AddSeparator();
m_HToolBar->AddTool( ID_PCB_DISPLAY_FOOTPRINT_DOC, wxEmptyString, m_HToolBar->AddTool( ID_PCB_DISPLAY_FOOTPRINT_DOC, wxEmptyString,
wxBitmap( datasheet_xpm ), wxBitmap( datasheet_xpm ),
_( "Display footprints list documentation" ) ); _( "Display footprints list documentation" ) );
m_HToolBar->AddSeparator(); m_HToolBar->AddSeparator();
m_HToolBar->AddSeparator(); m_HToolBar->AddSeparator();
m_HToolBar->AddRadioTool( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST, m_HToolBar->AddRadioTool( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST,
wxEmptyString, wxEmptyString,
wxBitmap( module_filtered_list_xpm ), wxBitmap( module_filtered_list_xpm ),
wxNullBitmap, wxNullBitmap,
_( "Display the filtered footprint list for the current component" ) ); _( "Display the filtered footprint list for the current component" ) );
m_HToolBar->AddRadioTool( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST, m_HToolBar->AddRadioTool( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST,
wxEmptyString, wxBitmap( module_full_list_xpm ), wxEmptyString, wxBitmap( module_full_list_xpm ),
wxNullBitmap, wxNullBitmap,
_( "Display the full footprint list (without filtering)" ) ); _( "Display the full footprint list (without filtering)" ) );
if( config ) if( config )
{ {
...@@ -89,7 +88,6 @@ used by eeschema to fill the footprint field of components)" ...@@ -89,7 +88,6 @@ used by eeschema to fill the footprint field of components)"
m_HToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST, !opt ); m_HToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST, !opt );
} }
// after adding the buttons to the toolbar, must call Realize() to reflect // after adding the buttons to the toolbar, must call Realize() to reflect the changes
// the changes
m_HToolBar->Realize(); m_HToolBar->Realize();
} }
...@@ -21,6 +21,7 @@ enum main_id ...@@ -21,6 +21,7 @@ enum main_id
ID_LOAD_ONE_SHEET, ID_LOAD_ONE_SHEET,
ID_NEW_PROJECT, ID_NEW_PROJECT,
ID_SAVE_PROJECT, ID_SAVE_PROJECT,
ID_SAVE_PROJECT_AS,
ID_SAVE_ONE_SHEET, ID_SAVE_ONE_SHEET,
ID_SAVE_ONE_SHEET_AS, ID_SAVE_ONE_SHEET_AS,
ID_LOAD_FILE, ID_LOAD_FILE,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment