From e560573c5e1530216bf71359b7a445332a68d59a Mon Sep 17 00:00:00 2001 From: Wayne Stambaugh Date: Thu, 20 Jan 2011 11:34:57 -0500 Subject: [PATCH] Schematic object encapsulation and other minor improvements. * Encapsulate file name member of base screen object. * Encapsulate associated screen member of schematic sheet object. * Create add screen method to schematic sheet object to simplify setting the associated screen. * Move the change file name code in the schematic sheet object to the edit sheet method in the schematic editor frame object to eliminate message dialogs. * Improve reference counting in schematic screen object. * Add helper type definitions for changing schematic object storage to C++ containers. --- 3d-viewer/3d_canvas.cpp | 4 +- common/common_plot_functions.cpp | 2 +- common/worksheet.cpp | 5 +- eeschema/delsheet.cpp | 10 +- eeschema/dialogs/dialog_SVG_print.cpp | 2 +- eeschema/dialogs/dialog_build_BOM.cpp | 2 +- eeschema/dialogs/dialog_erc.cpp | 2 +- eeschema/eeredraw.cpp | 8 +- eeschema/eeschema_config.cpp | 8 +- eeschema/files-io.cpp | 36 +++--- eeschema/load_one_schematic_file.cpp | 6 +- eeschema/netform.cpp | 2 +- eeschema/netlist_control.cpp | 4 +- eeschema/plot.cpp | 4 +- eeschema/sch_junction.h | 8 +- eeschema/sch_screen.cpp | 14 +- eeschema/sch_sheet.cpp | 177 ++++++++----------------- eeschema/sch_sheet.h | 64 ++++----- eeschema/sch_sheet_path.cpp | 12 +- eeschema/schframe.cpp | 24 ++-- eeschema/sheet.cpp | 179 ++++++++++++++++++-------- eeschema/sheetlab.cpp | 4 +- gerbview/export_to_pcbnew.cpp | 2 +- gerbview/files.cpp | 10 +- include/class_base_screen.h | 6 +- include/class_sch_screen.h | 2 +- include/sch_item_struct.h | 2 + pcbnew/build_BOM_from_board.cpp | 2 +- pcbnew/controle.cpp | 6 +- pcbnew/dialogs/dialog_SVG_print.cpp | 2 +- pcbnew/dialogs/dialog_drc.cpp | 4 +- pcbnew/dialogs/dialog_netlist.cpp | 2 +- pcbnew/export_gencad.cpp | 4 +- pcbnew/export_vrml.cpp | 3 +- pcbnew/files.cpp | 52 ++++---- pcbnew/gen_modules_placefile.cpp | 6 +- pcbnew/gendrill.cpp | 6 +- pcbnew/initpcb.cpp | 4 +- pcbnew/pcbframe.cpp | 10 +- pcbnew/pcbnew.cpp | 9 +- pcbnew/pcbnew_config.cpp | 4 +- pcbnew/pcbplot.cpp | 4 +- pcbnew/printout_controler.cpp | 2 +- pcbnew/specctra_export.cpp | 2 +- pcbnew/specctra_import.cpp | 2 +- pcbnew/xchgmod.cpp | 4 +- 46 files changed, 377 insertions(+), 350 deletions(-) diff --git a/3d-viewer/3d_canvas.cpp b/3d-viewer/3d_canvas.cpp index da73850758..5bf0def8e6 100644 --- a/3d-viewer/3d_canvas.cpp +++ b/3d-viewer/3d_canvas.cpp @@ -602,7 +602,7 @@ void Pcb3D_GLCanvas::SetLights() */ void Pcb3D_GLCanvas::TakeScreenshot( wxCommandEvent& event ) { - wxFileName fn( m_Parent->m_Parent->GetScreen()->m_FileName ); + wxFileName fn( m_Parent->m_Parent->GetScreen()->GetFileName() ); wxString FullFileName; wxString file_ext, mask; bool fmt_is_jpeg = FALSE; @@ -613,7 +613,7 @@ void Pcb3D_GLCanvas::TakeScreenshot( wxCommandEvent& event ) { file_ext = fmt_is_jpeg ? wxT( "jpg" ) : wxT( "png" ); mask = wxT( "*." ) + file_ext; - FullFileName = m_Parent->m_Parent->GetScreen()->m_FileName; + FullFileName = m_Parent->m_Parent->GetScreen()->GetFileName(); fn.SetExt( file_ext ); FullFileName = diff --git a/common/common_plot_functions.cpp b/common/common_plot_functions.cpp index 471f1ba702..9dfa23a599 100644 --- a/common/common_plot_functions.cpp +++ b/common/common_plot_functions.cpp @@ -487,7 +487,7 @@ void WinEDA_DrawFrame::PlotWorkSheet( PLOTTER* plotter, BASE_SCREEN* screen ) case WS_FILENAME: { wxString fname, fext; - wxFileName::SplitPath( screen->m_FileName, + wxFileName::SplitPath( screen->GetFileName(), (wxString*) NULL, &fname, &fext ); diff --git a/common/worksheet.cpp b/common/worksheet.cpp index 605d22ad4a..747e55ea43 100644 --- a/common/worksheet.cpp +++ b/common/worksheet.cpp @@ -1389,10 +1389,11 @@ void WinEDA_DrawFrame::TraceWorkSheet( wxDC* DC, BASE_SCREEN* screen, case WS_FILENAME: { wxString fname, fext; - wxFileName::SplitPath( screen->m_FileName, (wxString*) NULL, - &fname, &fext ); + wxFileName::SplitPath( screen->GetFileName(), (wxString*) NULL, &fname, &fext ); + if( WsItem->m_Legende ) msg = WsItem->m_Legende; + msg << fname << wxT( "." ) << fext; DrawGraphicText( DrawPanel, DC, pos, Color, msg, TEXT_ORIENT_HORIZ, size, diff --git a/eeschema/delsheet.cpp b/eeschema/delsheet.cpp index 210836b1d4..8f835b50f6 100644 --- a/eeschema/delsheet.cpp +++ b/eeschema/delsheet.cpp @@ -36,7 +36,7 @@ void DeleteSubHierarchy( SCH_SHEET* FirstSheet, bool confirm_deletion ) return; } - if( FirstSheet->m_AssociatedScreen->IsModify() && confirm_deletion ) + if( FirstSheet->GetScreen()->IsModify() && confirm_deletion ) { msg.Printf( _( "Sheet %s (file %s) modified. Save it?" ), FirstSheet->m_SheetName.GetData(), @@ -44,14 +44,14 @@ void DeleteSubHierarchy( SCH_SHEET* FirstSheet, bool confirm_deletion ) if( IsOK( NULL, msg ) ) { - frame->SaveEEFile( FirstSheet->m_AssociatedScreen, FILE_SAVE_AS ); + frame->SaveEEFile( FirstSheet->GetScreen(), FILE_SAVE_AS ); } } /* free the sub hierarchy */ - if( FirstSheet->m_AssociatedScreen ) + if( FirstSheet->GetScreen() ) { - EEDrawList = FirstSheet->m_AssociatedScreen->GetDrawItems(); + EEDrawList = FirstSheet->GetScreen()->GetDrawItems(); while( EEDrawList != NULL ) { @@ -64,7 +64,7 @@ void DeleteSubHierarchy( SCH_SHEET* FirstSheet, bool confirm_deletion ) } } - FirstSheet->m_AssociatedScreen->FreeDrawList(); + FirstSheet->GetScreen()->FreeDrawList(); } } diff --git a/eeschema/dialogs/dialog_SVG_print.cpp b/eeschema/dialogs/dialog_SVG_print.cpp index f72ec5daf2..1f6b3e4783 100644 --- a/eeschema/dialogs/dialog_SVG_print.cpp +++ b/eeschema/dialogs/dialog_SVG_print.cpp @@ -153,7 +153,7 @@ void DIALOG_SVG_PRINT::PrintSVGDoc( bool aPrintAll, bool aPrint_Sheet_Ref ) fn = m_FileNameCtrl->GetValue(); if( !fn.IsOk() ) - fn = screen->m_FileName; + fn = screen->GetFileName(); fn.SetExt( wxT( "svg" ) ); fn.MakeAbsolute(); diff --git a/eeschema/dialogs/dialog_build_BOM.cpp b/eeschema/dialogs/dialog_build_BOM.cpp index ea61124aa6..d414edaaf1 100644 --- a/eeschema/dialogs/dialog_build_BOM.cpp +++ b/eeschema/dialogs/dialog_build_BOM.cpp @@ -277,7 +277,7 @@ void DIALOG_BUILD_BOM::Create_BOM_Lists( int aTypeFile, static wxFileName fn; - wxFileName current = g_RootSheet->m_AssociatedScreen->m_FileName; + wxFileName current = g_RootSheet->GetScreen()->GetFileName(); s_ExportSeparatorSymbol = aExportSeparatorSymbol; diff --git a/eeschema/dialogs/dialog_erc.cpp b/eeschema/dialogs/dialog_erc.cpp index df2794e55f..49e176eff1 100644 --- a/eeschema/dialogs/dialog_erc.cpp +++ b/eeschema/dialogs/dialog_erc.cpp @@ -540,7 +540,7 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList ) if( m_writeErcFile ) { - fn = g_RootSheet->m_AssociatedScreen->m_FileName; + fn = g_RootSheet->GetScreen()->GetFileName(); fn.SetExt( wxT( "erc" ) ); wxFileDialog dlg( this, _( "ERC File" ), fn.GetPath(), fn.GetFullName(), diff --git a/eeschema/eeredraw.cpp b/eeschema/eeredraw.cpp index 285851f17a..0bfac270a9 100644 --- a/eeschema/eeredraw.cpp +++ b/eeschema/eeredraw.cpp @@ -66,17 +66,17 @@ void SCH_EDIT_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg ) DrawPanel->DrawCursor( DC ); // Display the sheet filename, and the sheet path, for non root sheets - if( GetScreen()->m_FileName == m_DefaultSchematicFileName ) + if( GetScreen()->GetFileName() == m_DefaultSchematicFileName ) { wxString msg = wxGetApp().GetAppName() + wxT( " " ) + GetBuildVersion(); - title.Printf( wxT( "%s [%s]" ), GetChars( msg), GetChars( GetScreen()->m_FileName ) ); + title.Printf( wxT( "%s [%s]" ), GetChars( msg), GetChars( GetScreen()->GetFileName() ) ); SetTitle( title ); } else { #if 0 title = wxT( "[" ); - title << GetScreen()->m_FileName << wxT( "] " ) << _( "Sheet" ); + title << GetScreen()->GetFileName() << wxT( "] " ) << _( "Sheet" ); title << wxT( " " ) << m_CurrentSheet->PathHumanReadable(); #else @@ -85,7 +85,7 @@ void SCH_EDIT_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg ) // Often the /path/to/filedir is blank because of the FullFileName argument // passed to LoadOneEEFile() which currently omits the path on non-root schematics. - wxFileName t( GetScreen()->m_FileName ); + wxFileName t( GetScreen()->GetFileName() ); title = wxChar( '[' ); title << t.GetName() << wxChar( ' ' ); diff --git a/eeschema/eeschema_config.cpp b/eeschema/eeschema_config.cpp index 46941e0993..3ba2f4ed48 100644 --- a/eeschema/eeschema_config.cpp +++ b/eeschema/eeschema_config.cpp @@ -64,7 +64,7 @@ void LIB_EDIT_FRAME::Process_Config( wxCommandEvent& event ) case ID_CONFIG_READ: { - fn = g_RootSheet->m_AssociatedScreen->m_FileName; + fn = g_RootSheet->GetScreen()->GetFileName(); fn.SetExt( ProjectFileExtension ); wxFileDialog dlg( this, _( "Read Project File" ), fn.GetPath(), @@ -132,7 +132,7 @@ void SCH_EDIT_FRAME::Process_Config( wxCommandEvent& event ) case ID_CONFIG_READ: { - fn = g_RootSheet->m_AssociatedScreen->m_FileName; + fn = g_RootSheet->GetScreen()->GetFileName(); fn.SetExt( ProjectFileExtension ); wxFileDialog dlg( this, _( "Read Project File" ), fn.GetPath(), @@ -354,7 +354,7 @@ bool SCH_EDIT_FRAME::LoadProjectFile( const wxString& CfgFileName, bool ForceRer wxArrayString liblist_tmp = m_ComponentLibFiles; if( CfgFileName.IsEmpty() ) - fn = g_RootSheet->m_AssociatedScreen->m_FileName; + fn = g_RootSheet->GetScreen()->GetFileName(); else fn = CfgFileName; @@ -397,7 +397,7 @@ void SCH_EDIT_FRAME::SaveProjectFile( wxWindow* displayframe, bool askoverwrite { wxFileName fn; - fn = g_RootSheet->m_AssociatedScreen->m_FileName /*ConfigFileName*/; + fn = g_RootSheet->GetScreen()->GetFileName(); /*ConfigFileName*/ fn.SetExt( ProjectFileExtension ); int options = wxFD_SAVE; diff --git a/eeschema/files-io.cpp b/eeschema/files-io.cpp index 5fc135c049..62c7117bab 100644 --- a/eeschema/files-io.cpp +++ b/eeschema/files-io.cpp @@ -33,13 +33,13 @@ bool SCH_EDIT_FRAME::SaveEEFile( SCH_SCREEN* screen, int FileSave ) screen = GetScreen(); /* If no name exists in the window yet - save as new. */ - if( screen->m_FileName.IsEmpty() ) + if( screen->GetFileName().IsEmpty() ) FileSave = FILE_SAVE_NEW; switch( FileSave ) { case FILE_SAVE_AS: - schematicFileName = screen->m_FileName; + schematicFileName = screen->GetFileName(); backupFileName = schematicFileName; /* Rename the old file to a '.bak' one: */ @@ -58,13 +58,13 @@ bool SCH_EDIT_FRAME::SaveEEFile( SCH_SCREEN* screen, int FileSave ) case FILE_SAVE_NEW: { wxFileDialog dlg( this, _( "Schematic Files" ), wxGetCwd(), - screen->m_FileName, SchematicFileWildcard, + screen->GetFileName(), SchematicFileWildcard, wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); if( dlg.ShowModal() == wxID_CANCEL ) return false; - screen->m_FileName = dlg.GetPath(); + screen->SetFileName( dlg.GetPath() ); schematicFileName = dlg.GetPath(); break; @@ -82,7 +82,7 @@ bool SCH_EDIT_FRAME::SaveEEFile( SCH_SCREEN* screen, int FileSave ) } if( FileSave == FILE_SAVE_NEW ) - screen->m_FileName = schematicFileName.GetFullPath(); + screen->SetFileName( schematicFileName.GetFullPath() ); bool success = screen->Save( f ); @@ -146,13 +146,15 @@ bool SCH_EDIT_FRAME::LoadOneEEProject( const wxString& FileName, bool IsNew ) if( screen ) { - if( !IsOK( this, _( "Clear schematic hierarchy?" ) ) ) + if( !IsOK( this, _( "Discard changes to the current schematic?" ) ) ) return false; - if( g_RootSheet->m_AssociatedScreen->m_FileName != m_DefaultSchematicFileName ) - SetLastProject( g_RootSheet->m_AssociatedScreen->m_FileName ); + + if( g_RootSheet->GetScreen()->GetFileName() != m_DefaultSchematicFileName ) + SetLastProject( g_RootSheet->GetScreen()->GetFileName() ); } FullFileName = FileName; + if( ( FullFileName.IsEmpty() ) && !IsNew ) { wxFileDialog dlg( this, _( "Open Schematic" ), wxGetCwd(), @@ -183,7 +185,7 @@ bool SCH_EDIT_FRAME::LoadOneEEProject( const wxString& FileName, bool IsNew ) wxLogDebug( wxT( "Loading schematic " ) + FullFileName ); wxSetWorkingDirectory( fn.GetPath() ); - screen->m_FileName = FullFileName; + screen->SetFileName( FullFileName ); g_RootSheet->SetFileName( FullFileName ); SetStatusText( wxEmptyString ); ClearMsgPanel(); @@ -199,7 +201,7 @@ bool SCH_EDIT_FRAME::LoadOneEEProject( const wxString& FileName, bool IsNew ) screen->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId ); screen->m_Title = NAMELESS_PROJECT; screen->m_Title += wxT( ".sch" ); - GetScreen()->m_FileName = screen->m_Title; + GetScreen()->SetFileName( screen->m_Title ); screen->m_Company.Empty(); screen->m_Commentaire1.Empty(); screen->m_Commentaire2.Empty(); @@ -230,16 +232,17 @@ bool SCH_EDIT_FRAME::LoadOneEEProject( const wxString& FileName, bool IsNew ) * and after (due to code change): -cache.lib * so if the -cache.lib is not found, the old way will be tried */ - fn = g_RootSheet->m_AssociatedScreen->m_FileName; + fn = g_RootSheet->GetScreen()->GetFileName(); bool use_oldcachename = false; wxString cachename = fn.GetName() + wxT( "-cache" ); fn.SetName( cachename ); fn.SetExt( CompLibFileExtension ); + if( ! fn.FileExists() ) { - fn = g_RootSheet->m_AssociatedScreen->m_FileName; + fn = g_RootSheet->GetScreen()->GetFileName(); fn.SetExt( wxT( "cache.lib" ) ); use_oldcachename = true; } @@ -282,18 +285,17 @@ bool SCH_EDIT_FRAME::LoadOneEEProject( const wxString& FileName, bool IsNew ) PrintMsg( msg ); } - if( !wxFileExists( g_RootSheet->m_AssociatedScreen->m_FileName ) - && !LibCacheExist ) + if( !wxFileExists( g_RootSheet->GetScreen()->GetFileName() ) && !LibCacheExist ) { Zoom_Automatique( FALSE ); msg.Printf( _( "File <%s> not found." ), - GetChars( g_RootSheet->m_AssociatedScreen->m_FileName ) ); + GetChars( g_RootSheet->GetScreen()->GetFileName() ) ); DisplayInfoMessage( this, msg, 0 ); return false; } // load the project. - SAFE_DELETE( g_RootSheet->m_AssociatedScreen ); + g_RootSheet->SetScreen( NULL ); bool diag = g_RootSheet->Load( this ); /* Redraw base screen (ROOT) if necessary. */ @@ -318,7 +320,7 @@ void SCH_EDIT_FRAME::SaveProject() for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) { - D( printf( "SaveEEFile, %s\n", CONV_TO_UTF8( screen->m_FileName ) ); ) + D( printf( "SaveEEFile, %s\n", CONV_TO_UTF8( screen->GetFileName() ) ); ) SaveEEFile( screen, FILE_SAVE_AS ); } diff --git a/eeschema/load_one_schematic_file.cpp b/eeschema/load_one_schematic_file.cpp index ca54cc2295..5aca1dd074 100644 --- a/eeschema/load_one_schematic_file.cpp +++ b/eeschema/load_one_schematic_file.cpp @@ -49,7 +49,7 @@ bool SCH_EDIT_FRAME::LoadOneEEFile( SCH_SCREEN* screen, const wxString& FullFile return FALSE; screen->SetCurItem( NULL ); - screen->m_FileName = FullFileName; + screen->SetFileName( FullFileName ); // D(printf("LoadOneEEFile:%s\n", CONV_TO_UTF8( FullFileName ) ); ) @@ -64,7 +64,7 @@ bool SCH_EDIT_FRAME::LoadOneEEFile( SCH_SCREEN* screen, const wxString& FullFile // reader now owns the open FILE. FILE_LINE_READER reader( f, FullFileName ); - MsgDiag = _( "Loading " ) + screen->m_FileName; + MsgDiag = _( "Loading " ) + screen->GetFileName(); PrintMsg( MsgDiag ); if( !reader.ReadLine() @@ -223,7 +223,7 @@ again." ); TestDanglingEnds( screen->GetDrawItems(), NULL ); - MsgDiag = _( "Done Loading " ) + screen->m_FileName; + MsgDiag = _( "Done Loading " ) + screen->GetFileName(); PrintMsg( MsgDiag ); return true; // Although it may be that file is only partially loaded. diff --git a/eeschema/netform.cpp b/eeschema/netform.cpp index baaddcffc6..3b14d4896a 100644 --- a/eeschema/netform.cpp +++ b/eeschema/netform.cpp @@ -646,7 +646,7 @@ XNODE* EXPORT_HELP::makeGenericDesignHeader() DateAndTime( date ); // the root sheet is a special sheet, call it source - xdesign->AddChild( node( wxT( "source" ), g_RootSheet->m_AssociatedScreen->m_FileName ) ); + xdesign->AddChild( node( wxT( "source" ), g_RootSheet->GetScreen()->GetFileName() ) ); xdesign->AddChild( node( wxT( "date" ), CONV_FROM_UTF8( date )) ); diff --git a/eeschema/netlist_control.cpp b/eeschema/netlist_control.cpp index a026bb2700..bba903507a 100644 --- a/eeschema/netlist_control.cpp +++ b/eeschema/netlist_control.cpp @@ -452,7 +452,7 @@ void WinEDA_NetlistFrame::GenNetlist( wxCommandEvent& event ) CurrPage = (EDA_NoteBookPage*) m_NoteBook->GetCurrentPage(); /* Calculate the netlist filename */ - fn = g_RootSheet->m_AssociatedScreen->m_FileName; + fn = g_RootSheet->GetScreen()->GetFileName(); switch( CurrPage->m_IdNetType ) { @@ -571,7 +571,7 @@ void WinEDA_NetlistFrame::RunSimulator( wxCommandEvent& event ) CommandLine = g_SimulatorCommandLine.AfterFirst( ' ' ); /* Calculate the netlist filename */ - fn = g_RootSheet->m_AssociatedScreen->m_FileName; + fn = g_RootSheet->GetScreen()->GetFileName(); fn.SetExt( wxT( "cir" ) ); CommandLine += wxT( " \"" ) + fn.GetFullPath() + wxT( "\"" ); diff --git a/eeschema/plot.cpp b/eeschema/plot.cpp index d3e228c5ef..031bba993d 100644 --- a/eeschema/plot.cpp +++ b/eeschema/plot.cpp @@ -311,7 +311,7 @@ static void PlotSheetStruct( PLOTTER* plotter, SCH_SHEET* Struct ) wxPoint pos_sheetname, pos_filename; wxPoint pos; - plotter->set_color( ReturnLayerColor( Struct->m_Layer ) ); + plotter->set_color( ReturnLayerColor( Struct->GetLayer() ) ); int thickness = Struct->GetPenSize(); plotter->set_current_line_width( thickness ); @@ -370,7 +370,7 @@ static void PlotSheetStruct( PLOTTER* plotter, SCH_SHEET* Struct ) GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_TOP, thickness, italic, false ); - plotter->set_color( ReturnLayerColor( Struct->m_Layer ) ); + plotter->set_color( ReturnLayerColor( Struct->GetLayer() ) ); /* Draw texts : SheetLabel */ BOOST_FOREACH( SCH_SHEET_PIN & pin_sheet, Struct->GetSheetPins() ) { diff --git a/eeschema/sch_junction.h b/eeschema/sch_junction.h index 018bd7a04e..6c743f0059 100644 --- a/eeschema/sch_junction.h +++ b/eeschema/sch_junction.h @@ -1,10 +1,10 @@ /** - * @file sch_items.h + * @file sch_junction.h * */ -#ifndef _SCH_ITEMS_H_ -#define _SCH_ITEMS_H_ +#ifndef _SCH_JUNCTION_H_ +#define _SCH_JUNCTION_H_ #include "sch_item_struct.h" @@ -103,4 +103,4 @@ private: }; -#endif // _SCH_ITEMS_H_ +#endif // _SCH_JUNCTION_H_ diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp index 74ad5d453e..8716a78b6c 100644 --- a/eeschema/sch_screen.cpp +++ b/eeschema/sch_screen.cpp @@ -88,11 +88,23 @@ SCH_SCREEN::~SCH_SCREEN() } +void SCH_SCREEN::IncRefCount() +{ + m_refCount++; + + wxLogDebug( wxT("Screen %s reference count after increment is %d." ), + GetChars( GetFileName() ), m_refCount ); +} + + void SCH_SCREEN::DecRefCount() { wxCHECK_RET( m_refCount != 0, wxT( "Screen reference count already zero. Bad programmer!" ) ); m_refCount--; + + wxLogDebug( wxT("Screen %s reference count after decrement is %d." ), + GetChars( GetFileName() ), m_refCount ); } @@ -736,7 +748,7 @@ void SCH_SCREENS::BuildScreenList( EDA_ITEM* aItem ) if( aItem && aItem->Type() == SCH_SHEET_T ) { SCH_SHEET* ds = (SCH_SHEET*) aItem; - aItem = ds->m_AssociatedScreen; + aItem = ds->GetScreen(); } if( aItem && aItem->Type() == SCH_SCREEN_T ) diff --git a/eeschema/sch_sheet.cpp b/eeschema/sch_sheet.cpp index 62a84729b5..11d24bb2ed 100644 --- a/eeschema/sch_sheet.cpp +++ b/eeschema/sch_sheet.cpp @@ -3,7 +3,7 @@ // Purpose: member functions for SCH_SHEET // header = sch_sheet.h // Author: jean-pierre Charras -// Modified by: +// Modified by: Wayne Stambaugh // Created: 08/02/2006 18:37:02 // RCS-ID: // Copyright: @@ -16,7 +16,6 @@ #include "macros.h" #include "class_drawpanel.h" #include "drawtxt.h" -#include "confirm.h" #include "trigo.h" #include "richio.h" #include "class_sch_screen.h" @@ -29,7 +28,8 @@ #include "sch_component.h" -SCH_SHEET::SCH_SHEET( const wxPoint& pos ) : SCH_ITEM( NULL, SCH_SHEET_T ) +SCH_SHEET::SCH_SHEET( const wxPoint& pos ) : + SCH_ITEM( NULL, SCH_SHEET_T ) { m_Layer = LAYER_SHEET; m_Pos = pos; @@ -69,7 +69,7 @@ SCH_SHEET::~SCH_SHEET() // perhaps it should be deleted also. if( m_AssociatedScreen ) { - m_AssociatedScreen->GetRefCount(); + m_AssociatedScreen->DecRefCount(); if( m_AssociatedScreen->GetRefCount() == 0 ) delete m_AssociatedScreen; @@ -83,6 +83,38 @@ EDA_ITEM* SCH_SHEET::doClone() const } +void SCH_SHEET::SetScreen( SCH_SCREEN* aScreen ) +{ + if( aScreen == m_AssociatedScreen ) + return; + + if( m_AssociatedScreen != NULL ) + { + m_AssociatedScreen->DecRefCount(); + + if( m_AssociatedScreen->GetRefCount() == 0 ) + { + delete m_AssociatedScreen; + m_AssociatedScreen = NULL; + } + } + + m_AssociatedScreen = aScreen; + + if( m_AssociatedScreen ) + m_AssociatedScreen->IncRefCount(); +} + + +int SCH_SHEET::GetScreenCount() const +{ + if( m_AssociatedScreen == NULL ) + return 0; + + return m_AssociatedScreen->GetRefCount(); +} + + bool SCH_SHEET::Save( FILE* aFile ) const { if( fprintf( aFile, "$Sheet\n" ) == EOF @@ -380,9 +412,7 @@ bool SCH_SHEET::HasUndefinedLabels() void SCH_SHEET::Place( SCH_EDIT_FRAME* frame, wxDC* DC ) { /* Place list structures for new sheet. */ - bool isnew = ( m_Flags & IS_NEW ) ? true : false; - - if( isnew ) + if( IsNew() ) { if( !frame->EditSheet( this, DC ) ) { @@ -413,7 +443,7 @@ void SCH_SHEET::Place( SCH_EDIT_FRAME* frame, wxDC* DC ) SCH_ITEM::Place( frame, DC ); //puts it on the GetDrawItems(). - if( isnew ) + if( IsNew() ) { frame->SetSheetNumberAndCount(); } @@ -621,28 +651,30 @@ int SCH_SHEET::ComponentCount() } -bool SCH_SHEET::SearchHierarchy( wxString aFilename, SCH_SCREEN** aScreen ) +bool SCH_SHEET::SearchHierarchy( const wxString& aFilename, SCH_SCREEN** aScreen ) { if( m_AssociatedScreen ) { - EDA_ITEM* strct = m_AssociatedScreen->GetDrawItems(); + EDA_ITEM* item = m_AssociatedScreen->GetDrawItems(); - while( strct ) + while( item ) { - if( strct->Type() == SCH_SHEET_T ) + if( item->Type() == SCH_SHEET_T ) { - SCH_SHEET* ss = (SCH_SHEET*) strct; - if( ss->m_AssociatedScreen - && ss->m_AssociatedScreen->m_FileName.CmpNoCase( aFilename ) == 0 ) + SCH_SHEET* sheet = (SCH_SHEET*) item; + + if( sheet->m_AssociatedScreen + && sheet->m_AssociatedScreen->GetFileName().CmpNoCase( aFilename ) == 0 ) { - *aScreen = ss->m_AssociatedScreen; + *aScreen = sheet->m_AssociatedScreen; return true; } - if( ss->SearchHierarchy( aFilename, aScreen ) ) + if( sheet->SearchHierarchy( aFilename, aScreen ) ) return true; } - strct = strct->Next(); + + item = item->Next(); } } @@ -691,15 +723,13 @@ bool SCH_SHEET::Load( SCH_EDIT_FRAME* aFrame ) if( screen ) { - m_AssociatedScreen = screen; - m_AssociatedScreen->IncRefCount(); + SetScreen( screen ); //do not need to load the sub-sheets - this has already been done. } else { - m_AssociatedScreen = new SCH_SCREEN(); - m_AssociatedScreen->IncRefCount(); + SetScreen( new SCH_SCREEN() ); success = aFrame->LoadOneEEFile( m_AssociatedScreen, m_FileName ); if( success ) @@ -753,109 +783,6 @@ wxString SCH_SHEET::GetFileName( void ) } -bool SCH_SHEET::ChangeFileName( SCH_EDIT_FRAME* aFrame, const wxString& aFileName ) -{ - if( ( GetFileName() == aFileName ) && m_AssociatedScreen ) - return true; - - SCH_SCREEN* Screen_to_use = NULL; - wxString msg; - bool LoadFromFile = false; - - // do we reload the data from the existing hierarchy - if( g_RootSheet->SearchHierarchy( aFileName, &Screen_to_use ) ) - { - if( m_AssociatedScreen ) // upon initial load, this will be null. - { - msg.Printf( _( "A Sub Hierarchy named %s exists, Use it (The \ -data in this sheet will be replaced)?" ), - GetChars( aFileName ) ); - if( !IsOK( NULL, msg ) ) - { - DisplayInfoMessage( (wxWindow*) NULL, _( "Sheet Filename Renaming Aborted" ) ); - return false; - } - } - } - else if( wxFileExists( aFileName ) ) // do we reload the data from an existing file - { - msg.Printf( _( "A file named %s exists, load it (otherwise keep \ -current sheet data if possible)?" ), - GetChars( aFileName ) ); - - if( IsOK( NULL, msg ) ) - { - LoadFromFile = true; - - // Can be NULL if loading a file when creating a new sheet. - if( m_AssociatedScreen ) - { - m_AssociatedScreen->DecRefCount(); // be careful with these - - if( m_AssociatedScreen->GetRefCount() == 0 ) - SAFE_DELETE( m_AssociatedScreen ); - - m_AssociatedScreen = NULL; // will be created later - } - } - } - - // if an associated screen exists, shared between this sheet and others - // sheets, what we do ? - if( m_AssociatedScreen && ( m_AssociatedScreen->GetRefCount() > 1 ) ) - { - msg = _( "This sheet uses shared data in a complex hierarchy" ); - msg << wxT( "\n" ); - msg << _( "Do we convert it in a simple hierarchical sheet (\ -otherwise delete current sheet data)" ); - - if( IsOK( NULL, msg ) ) - { - LoadFromFile = true; - wxString oldfilename = m_AssociatedScreen->m_FileName; - m_AssociatedScreen->m_FileName = aFileName; - aFrame->SaveEEFile( m_AssociatedScreen, FILE_SAVE_AS ); - m_AssociatedScreen->m_FileName = oldfilename; - } - m_AssociatedScreen->DecRefCount(); //be careful with these - m_AssociatedScreen = NULL; //will be created later - } - - SetFileName( aFileName ); - - // if we use new data (from file or from internal hierarchy), delete the - // current sheet data - if( m_AssociatedScreen && (LoadFromFile || Screen_to_use) ) - { - m_AssociatedScreen->DecRefCount(); - - if( m_AssociatedScreen->GetRefCount() == 0 ) - SAFE_DELETE( m_AssociatedScreen ); - - m_AssociatedScreen = NULL; // so that we reload.. - } - - if( LoadFromFile ) - Load( aFrame ); - else if( Screen_to_use ) - { - m_AssociatedScreen = Screen_to_use; - m_AssociatedScreen->IncRefCount(); - } - - //just make a new screen if needed. - if( !m_AssociatedScreen ) - { - m_AssociatedScreen = new SCH_SCREEN(); - m_AssociatedScreen->IncRefCount(); // be careful with these - } - - m_AssociatedScreen->m_FileName = aFileName; - - return true; -} - - void SCH_SHEET::DisplayInfo( WinEDA_DrawFrame* frame ) { frame->ClearMsgPanel(); diff --git a/eeschema/sch_sheet.h b/eeschema/sch_sheet.h index d5b9e4d2ea..4edc91eb90 100644 --- a/eeschema/sch_sheet.h +++ b/eeschema/sch_sheet.h @@ -80,11 +80,6 @@ public: virtual void CreateGraphicShape( std::vector & aCorner_list, const wxPoint& aPos ); - SCH_SHEET_PIN* Next() - { - return (SCH_SHEET_PIN*) Pnext; - } - void SwapData( SCH_SHEET_PIN* copyitem ); /** @@ -202,19 +197,19 @@ typedef boost::ptr_vector SCH_SHEET_PIN_LIST; class SCH_SHEET : public SCH_ITEM { -public: - wxString m_SheetName; /* this is equivalent to C101 for - * components: it is stored in F0 ... - * of the file. */ -private: + SCH_SCREEN* m_AssociatedScreen; ///< Screen that contains the physical data for + ///< the sheet. In complex hierarchies multiple + ///< sheets can share a common screen. + SCH_SHEET_PIN_LIST m_labels; ///< List of sheet connection points. wxString m_FileName; /* also in SCH_SCREEN (redundant), * but need it here for loading after * reading the sheet description from * file. */ -protected: - SCH_SHEET_PIN_LIST m_labels; /* List of points to be connected.*/ - +public: + wxString m_SheetName; /* this is equivalent to C101 for + * components: it is stored in F0 ... + * of the file. */ public: int m_SheetNameSize; /* Size (height) of the text, used to * draw the sheet name */ @@ -222,13 +217,6 @@ public: * draw the file name */ wxPoint m_Pos; wxSize m_Size; /* Position and Size of *sheet symbol */ - int m_Layer; - SCH_SCREEN* m_AssociatedScreen; /* Associated Screen which - * handle the physical data - * In complex hierarchies we - * can have many SCH_SHEET - * using the same data - */ public: SCH_SHEET( const wxPoint& pos = wxPoint( 0, 0 ) ); @@ -242,6 +230,29 @@ public: return wxT( "SCH_SHEET" ); } + SCH_SCREEN* GetScreen() { return m_AssociatedScreen; } + + /** + * Function SetScreen + * sets the screen associated with this sheet to \a aScreen. + *

+ * The screen reference counting is performed by SetScreen. If \a aScreen is not + * the same as the current screen, the current screen reference count is decremented + * and \a aScreen becomes the screen for the sheet. If the current screen reference + * count reaches zero, the current screen is deleted. NULL is a valid value for + * \a aScreen. + *

+ * @param aScreen The new screen to associate with the sheet. + */ + void SetScreen( SCH_SCREEN* aScreen ); + + /** + * Function GetScreenCount + * returns the number of times the associated screen for the sheet is being used. If + * no screen is associated with the sheet, then zero is returned. + */ + int GetScreenCount() const; + /** * Function Save * writes the data structures for this object out to a FILE in "*.sch" @@ -385,7 +396,7 @@ public: * @param aScreen = a location to return a pointer to the screen (if found) * @return bool if found, and a pointer to the screen */ - bool SearchHierarchy( wxString aFilename, SCH_SCREEN** aScreen ); + bool SearchHierarchy( const wxString& aFilename, SCH_SCREEN** aScreen ); /** * Function LocatePathOfScreen @@ -421,17 +432,6 @@ public: m_FileName = aFilename; } - /** - * Function ChangeFileName - * Set a new filename and manage data and associated screen - * The main difficulty is the filename change in a complex hierarchy. - * - if new filename is not already used: change to the new name (and if an - * existing file is found, load it on request) - * - if new filename is already used (a complex hierarchy) : reference the - * sheet. - * @param aFileName = the new filename - * @param aFrame = the schematic frame - */ bool ChangeFileName( SCH_EDIT_FRAME* aFrame, const wxString& aFileName ); //void RemoveSheet(SCH_SHEET* sheet); diff --git a/eeschema/sch_sheet_path.cpp b/eeschema/sch_sheet_path.cpp index cbfa7e2c5b..6066e97ee2 100644 --- a/eeschema/sch_sheet_path.cpp +++ b/eeschema/sch_sheet_path.cpp @@ -131,7 +131,7 @@ SCH_SCREEN* SCH_SHEET_PATH::LastScreen() SCH_SHEET* lastSheet = Last(); if( lastSheet ) - return lastSheet->m_AssociatedScreen; + return lastSheet->GetScreen(); return NULL; } @@ -146,8 +146,8 @@ SCH_ITEM* SCH_SHEET_PATH::LastDrawList() { SCH_SHEET* lastSheet = Last(); - if( lastSheet && lastSheet->m_AssociatedScreen ) - return lastSheet->m_AssociatedScreen->GetDrawItems(); + if( lastSheet && lastSheet->GetScreen() ) + return lastSheet->GetScreen()->GetDrawItems(); return NULL; } @@ -157,8 +157,8 @@ SCH_ITEM* SCH_SHEET_PATH::FirstDrawList() { SCH_ITEM* item = NULL; - if( m_numSheets && m_sheets[0]->m_AssociatedScreen ) - item = m_sheets[0]->m_AssociatedScreen->GetDrawItems(); + if( m_numSheets && m_sheets[0]->GetScreen() ) + item = m_sheets[0]->GetScreen()->GetDrawItems(); /* @fixme - These lists really should be one of the boost pointer containers. This * is a brain dead hack to allow reverse iteration of EDA_ITEM linked @@ -615,7 +615,7 @@ void SCH_SHEET_LIST::BuildSheetList( SCH_SHEET* aSheet ) m_List[m_index] = m_currList; m_index++; - if( aSheet->m_AssociatedScreen != NULL ) + if( aSheet->GetScreen() != NULL ) { EDA_ITEM* strct = m_currList.LastDrawList(); diff --git a/eeschema/schframe.cpp b/eeschema/schframe.cpp index 12e97967ae..70c29629fa 100644 --- a/eeschema/schframe.cpp +++ b/eeschema/schframe.cpp @@ -326,14 +326,13 @@ void SCH_EDIT_FRAME::CreateScreens() g_RootSheet = new SCH_SHEET(); } - if( g_RootSheet->m_AssociatedScreen == NULL ) + if( g_RootSheet->GetScreen() == NULL ) { - g_RootSheet->m_AssociatedScreen = new SCH_SCREEN(); - g_RootSheet->m_AssociatedScreen->IncRefCount(); + g_RootSheet->SetScreen( new SCH_SCREEN() ); } - g_RootSheet->m_AssociatedScreen->m_FileName = m_DefaultSchematicFileName; - g_RootSheet->m_AssociatedScreen->m_Date = GenDate(); + g_RootSheet->GetScreen()->SetFileName( m_DefaultSchematicFileName ); + g_RootSheet->GetScreen()->m_Date = GenDate(); m_CurrentSheet->Clear(); m_CurrentSheet->Push( g_RootSheet ); @@ -396,11 +395,11 @@ void SCH_EDIT_FRAME::OnCloseWindow( wxCloseEvent& Event ) } } - if( !g_RootSheet->m_AssociatedScreen->m_FileName.IsEmpty() - && (g_RootSheet->m_AssociatedScreen->GetDrawItems() != NULL) ) - SetLastProject( g_RootSheet->m_AssociatedScreen->m_FileName ); + if( !g_RootSheet->GetScreen()->GetFileName().IsEmpty() + && (g_RootSheet->GetScreen()->GetDrawItems() != NULL) ) + SetLastProject( g_RootSheet->GetScreen()->GetFileName() ); - ClearProjectDrawList( g_RootSheet->m_AssociatedScreen, TRUE ); + ClearProjectDrawList( g_RootSheet->GetScreen(), TRUE ); /* all sub sheets are deleted, only the main sheet is usable */ m_CurrentSheet->Clear(); @@ -678,7 +677,7 @@ void SCH_EDIT_FRAME::OnLoadProject( wxCommandEvent& event ) void SCH_EDIT_FRAME::OnOpenPcbnew( wxCommandEvent& event ) { - wxFileName fn = g_RootSheet->m_AssociatedScreen->m_FileName; + wxFileName fn = g_RootSheet->GetScreen()->GetFileName(); if( fn.IsOk() ) { @@ -695,7 +694,7 @@ void SCH_EDIT_FRAME::OnOpenPcbnew( wxCommandEvent& event ) void SCH_EDIT_FRAME::OnOpenCvpcb( wxCommandEvent& event ) { - wxFileName fn = g_RootSheet->m_AssociatedScreen->m_FileName; + wxFileName fn = g_RootSheet->GetScreen()->GetFileName(); fn.SetExt( NetlistFileExtension ); @@ -765,10 +764,11 @@ void SCH_EDIT_FRAME::OnPrint( wxCommandEvent& event ) dlg.ShowModal(); - fn = g_RootSheet->m_AssociatedScreen->m_FileName; + fn = g_RootSheet->GetScreen()->GetFileName(); wxString default_name = NAMELESS_PROJECT; default_name += wxT( ".sch" ); + if( fn.GetFullName() != default_name ) { fn.SetExt( ProjectFileExtension ); diff --git a/eeschema/sheet.cpp b/eeschema/sheet.cpp index 13e17c86d8..b7fe5dabca 100644 --- a/eeschema/sheet.cpp +++ b/eeschema/sheet.cpp @@ -33,19 +33,35 @@ static int s_PreviousSheetHeight; static wxPoint s_OldPos; /* Former position for cancellation or move ReSize */ -/* Routine to edit the SheetName and the FileName for the sheet "Sheet" */ +/** + * Function EditSheet + * is used to edit an existing sheet or add a new sheet to the schematic. + *

+ * When \a aSheet is a new sheet: + *

    + *
  • and the file name already exists in the schematic hierarchy, the screen associated with + * the sheet found in the hierarchy is associated with \a aSheet.
  • + *
  • and the file name already exists on the system, then \a aSheet is loaded with the + * existing file.
  • + *
  • and the file name does not exist in the schematic hierarchy or on the file system, then + * a new screen is created and associated with \a aSheet.
  • + *

+ * When \a aSheet is an existing sheet: + *

    + *
  • and the file name already exists in the schematic hierarchy, the current associated screen + * is replace by the one found in the hierarchy.
  • + *
  • and the file name already exists on the system, the current associated screen file name + * is changed and the file is loaded.
  • + *
  • and the file name does not exist in the schematic hierarchy or on the file system, the + * current associated screen file name is changed and saved to disk.
  • + *

+ */ bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, wxDC* aDC ) { - bool edit = true; - if( aSheet == NULL ) return false; /* Get the new texts */ - aSheet->Draw( DrawPanel, aDC, wxPoint( 0, 0 ), g_XorMode ); - - DrawPanel->m_IgnoreMouseEvents = true; - DIALOG_SCH_SHEET_PROPS dlg( this ); wxString units = GetUnitsLabel( g_UserUnit ); @@ -70,76 +86,135 @@ bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, wxDC* aDC ) dlg.Fit(); dlg.SetMinSize( dlg.GetSize() ); - if( dlg.ShowModal() == wxID_OK ) + if( dlg.ShowModal() == wxID_CANCEL ) + return false; + + wxFileName fileName = dlg.GetFileName(); + fileName.SetExt( SchematicFileExtension ); + + if( !fileName.IsOk() ) { - wxFileName fileName; - wxString msg; + DisplayError( this, _( "File name is not valid!" ) ); + return false; + } - fileName = dlg.GetFileName(); + wxString msg; + wxString tmp; + bool loadFromFile = false; + SCH_SCREEN* useScreen = NULL; - if( !fileName.IsOk() ) + if( !g_RootSheet->SearchHierarchy( fileName.GetFullPath(), &useScreen ) ) + loadFromFile = fileName.FileExists(); + + if( aSheet->GetScreen() == NULL ) // New sheet. + { + if( ( useScreen != NULL ) || loadFromFile ) // Load from existing file. { - DisplayError( this, _( "File name is not valid! Aborted" ) ); - edit = false; + msg.Printf( _( "A file named \"%s\" already exists" ), + GetChars( fileName.GetFullName() ) ); + + if( useScreen != NULL ) + msg += _( " in the current schematic hierarchy" ); + + msg += _(".\n\nDo you want to create a sheet with the contents of this file?" ); + + if( !IsOK( this, msg ) ) + return false; } - else + else // New file. { - fileName.SetExt( SchematicFileExtension ); + aSheet->SetScreen( new SCH_SCREEN() ); + aSheet->GetScreen()->SetFileName( fileName.GetFullPath() ); + } + } + else // Existing sheet. + { + bool isUndoable = true; + bool renameFile = false; - /* m_CurrentSheet->m_AssociatedScreen must be a valid screen, and the - * sheet must have a valid associated filename, - * so we must call m_CurrentSheet->ChangeFileName to set a filename, - * AND always when a new sheet is created ( when - * m_CurrentSheet->m_AssociatedScreen is null ), - * to create or set an Associated Screen - */ - if( ( fileName.GetFullPath() != aSheet->GetFileName() ) - || ( aSheet->m_AssociatedScreen == NULL ) ) + if( fileName.GetFullName().CmpNoCase( aSheet->GetFileName() ) != 0 ) + { + // Sheet file name changes cannot be undone. + isUndoable = false; + msg = _( "Changing the sheet file name cannot be undone. " ); + + if( ( useScreen != NULL ) || loadFromFile ) // Load from existing file. { - msg = _( "Changing the sheet file name can change all the schematic \ -structures and cannot be undone.\nOk to continue renaming?" ); + tmp.Printf( _( "A file named \"%s\" already exists" ), + GetChars( fileName.GetFullName() ) ); + msg += tmp; - if( aSheet->m_AssociatedScreen == NULL || IsOK( NULL, msg ) ) + if( useScreen != NULL ) + msg += _( " in the current schematic hierarchy" ); + + msg += _(".\n\nDo you want to replace the sheet with the contents of this file?" ); + + if( !IsOK( this, msg ) ) + return false; + + if( loadFromFile ) + aSheet->SetScreen( NULL ); + } + else // Save to new file name. + { + if( aSheet->GetScreenCount() > 1 ) { - // do not prompt on a new sheet. in fact, we should not allow a - // sheet to be created without a valid associated filename to be - // read from. - GetScreen()->ClearUndoRedoList(); + msg += _( "This sheet uses shared data in a complex hierarchy.\n\n" ); + msg += _( "Do you wish to convert it to a simple hierarchical sheet?" ); - // set filename and the associated screen - aSheet->ChangeFileName( this, fileName.GetFullPath() ); + if( !IsOK( NULL, msg ) ) + return false; } + + renameFile = true; } + } - else - SaveCopyInUndoList( aSheet, UR_CHANGED ); + aSheet->Draw( DrawPanel, aDC, wxPoint( 0, 0 ), g_XorMode ); + DrawPanel->m_IgnoreMouseEvents = true; - aSheet->m_FileNameSize = ReturnValueFromString( g_UserUnit, - dlg.GetFileNameTextSize(), - m_InternalUnits ); + if( isUndoable ) + SaveCopyInUndoList( aSheet, UR_CHANGED ); - aSheet->m_SheetName = dlg.GetSheetName(); - aSheet->m_SheetNameSize = ReturnValueFromString( g_UserUnit, - dlg.GetSheetNameTextSize(), - m_InternalUnits ); + if( renameFile ) + { + aSheet->GetScreen()->SetFileName( fileName.GetFullName() ); + SaveEEFile( aSheet->GetScreen(), FILE_SAVE_AS ); - if( aSheet->m_SheetName.IsEmpty() ) + // If the the associated screen is shared by more than one sheet, remove the + // screen and reload the file to a new screen. Failure to do this will trash + // the screen reference counting in complex hierarchies. + if( aSheet->GetScreenCount() > 1 ) { - aSheet->m_SheetName.Printf( wxT( "Sheet%8.8lX" ), GetTimeStamp() ); + aSheet->SetScreen( NULL ); + loadFromFile = true; } } } - else - { - edit = false; - } + + aSheet->SetFileName( fileName.GetFullPath() ); + + if( useScreen ) + aSheet->SetScreen( useScreen ); + else if( loadFromFile ) + aSheet->Load( this ); + + aSheet->m_FileNameSize = ReturnValueFromString( g_UserUnit, + dlg.GetFileNameTextSize(), + m_InternalUnits ); + aSheet->m_SheetName = dlg.GetSheetName(); + aSheet->m_SheetNameSize = ReturnValueFromString( g_UserUnit, + dlg.GetSheetNameTextSize(), + m_InternalUnits ); + + if( aSheet->m_SheetName.IsEmpty() ) + aSheet->m_SheetName.Printf( wxT( "Sheet%8.8lX" ), GetTimeStamp() ); DrawPanel->MouseToCursorSchema(); DrawPanel->m_IgnoreMouseEvents = false; - aSheet->Draw( DrawPanel, aDC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE ); - return edit; + return true; } @@ -221,7 +296,7 @@ SCH_SHEET* SCH_EDIT_FRAME::CreateSheet( wxDC* aDC ) sheet->m_Flags = IS_NEW | IS_RESIZED; sheet->m_TimeStamp = GetTimeStamp(); sheet->SetParent( GetScreen() ); - sheet->m_AssociatedScreen = NULL; + sheet->SetScreen( NULL ); s_PreviousSheetWidth = SHEET_MIN_WIDTH; s_PreviousSheetHeight = SHEET_MIN_HEIGHT; diff --git a/eeschema/sheetlab.cpp b/eeschema/sheetlab.cpp index 4d2bad344e..4e9f00c012 100644 --- a/eeschema/sheetlab.cpp +++ b/eeschema/sheetlab.cpp @@ -205,10 +205,10 @@ SCH_SHEET_PIN* SCH_EDIT_FRAME::Import_PinSheet( SCH_SHEET* Sheet, wxDC* DC ) SCH_SHEET_PIN* NewSheetLabel; SCH_HIERLABEL* HLabel = NULL; - if( !Sheet->m_AssociatedScreen ) + if( !Sheet->GetScreen() ) return NULL; - DrawStruct = Sheet->m_AssociatedScreen->GetDrawItems(); + DrawStruct = Sheet->GetScreen()->GetDrawItems(); HLabel = NULL; for( ; DrawStruct != NULL; DrawStruct = DrawStruct->Next() ) diff --git a/gerbview/export_to_pcbnew.cpp b/gerbview/export_to_pcbnew.cpp index 82994cdfa0..f794731bbe 100644 --- a/gerbview/export_to_pcbnew.cpp +++ b/gerbview/export_to_pcbnew.cpp @@ -75,7 +75,7 @@ void WinEDA_GerberFrame::ExportDataInPcbnewFormat( wxCommandEvent& event ) DisplayError( this, msg ); return; } - GetScreen()->m_FileName = FullFileName; + GetScreen()->SetFileName( FullFileName ); SavePcbFormatAscii( this, dest, LayerLookUpTable ); fclose( dest ); } diff --git a/gerbview/files.cpp b/gerbview/files.cpp index 693efec552..04d391b4dc 100644 --- a/gerbview/files.cpp +++ b/gerbview/files.cpp @@ -158,17 +158,19 @@ bool WinEDA_GerberFrame::LoadGerberFiles( const wxString& aFullFileName ) // Read gerber files: each file is loaded on a new gerbview layer int layer = getActiveLayer(); + for( unsigned ii = 0; ii < filenamesList.GetCount(); ii++ ) { wxFileName filename = filenamesList[ii]; filename.SetPath( currentPath ); - GetScreen()->m_FileName = filename.GetFullPath(); + GetScreen()->SetFileName( filename.GetFullPath() ); filename.SetExt( g_PenFilenameExt ); setActiveLayer( layer, false ); - if( Read_GERBER_File( GetScreen()->m_FileName, filename.GetFullPath() ) ) + + if( Read_GERBER_File( GetScreen()->GetFileName(), filename.GetFullPath() ) ) { - SetLastProject( GetScreen()->m_FileName ); + SetLastProject( GetScreen()->GetFileName() ); layer++; if( layer >= NB_LAYERS ) layer = 0; @@ -209,7 +211,7 @@ static void LoadDCodeFile( WinEDA_GerberFrame* frame, GetChars( g_PenFilenameExt ), GetChars( g_PenFilenameExt ) ); wildcard += AllFilesWildcard; - fn = frame->GetScreen()->m_FileName; + fn = frame->GetScreen()->GetFileName(); fn.SetExt( g_PenFilenameExt ); wxFileDialog dlg( (wxWindow*) frame, _( "Load GERBER DCODE File" ), fn.GetPath(), fn.GetFullName(), wildcard, diff --git a/include/class_base_screen.h b/include/class_base_screen.h index 3583fd7c34..036f2b190c 100644 --- a/include/class_base_screen.h +++ b/include/class_base_screen.h @@ -56,6 +56,7 @@ class BASE_SCREEN : public EDA_ITEM EDA_ITEMS m_items; ///< The drawing items associated with this screen. GRIDS m_grids; ///< List of valid grid sizes. EDA_ITEM* m_drawList; ///< Object list for the screen. + wxString m_fileName; ///< File used to load the screen. public: wxPoint m_DrawOrg; /* offsets for drawing the circuit on the screen */ @@ -105,7 +106,6 @@ public: int m_ScreenNumber; int m_NumberOfScreen; - wxString m_FileName; wxString m_Title; wxString m_Date; wxString m_Revision; @@ -157,6 +157,10 @@ public: void InitDatas(); + void SetFileName( const wxString& aFileName ) { m_fileName = aFileName; } + + wxString GetFileName() const { return m_fileName; } + void SetPageSize( wxSize& aPageSize ); wxSize ReturnPageSize( void ); virtual int GetInternalUnits( void ); diff --git a/include/class_sch_screen.h b/include/class_sch_screen.h index 14a659e283..9015575abe 100644 --- a/include/class_sch_screen.h +++ b/include/class_sch_screen.h @@ -48,7 +48,7 @@ public: void DecRefCount(); - void IncRefCount() { m_refCount++; } + void IncRefCount(); int GetRefCount() const { return m_refCount; } diff --git a/include/sch_item_struct.h b/include/sch_item_struct.h index 82865400d8..4ee86c50e2 100644 --- a/include/sch_item_struct.h +++ b/include/sch_item_struct.h @@ -18,6 +18,8 @@ class wxFindReplaceData; typedef boost::ptr_vector< SCH_ITEM > SCH_ITEMS; +typedef SCH_ITEMS::iterator SCH_ITEMS_ITR; +typedef vector< SCH_ITEMS_ITR > SCH_ITEMS_ITRS; // Schematic item filter mask for hit test objects in schematic editor. diff --git a/pcbnew/build_BOM_from_board.cpp b/pcbnew/build_BOM_from_board.cpp index a25edb73a6..e5b3f1c7e8 100644 --- a/pcbnew/build_BOM_from_board.cpp +++ b/pcbnew/build_BOM_from_board.cpp @@ -61,7 +61,7 @@ void WinEDA_PcbFrame::RecreateBOMFileFromBoard( wxCommandEvent& aEvent ) } /* Set the file extension: */ - fn = GetScreen()->m_FileName; + fn = GetScreen()->GetFileName(); fn.SetExt( CsvFileExtension ); wxFileDialog dlg( this, _( "Save Bill of Materials" ), wxGetCwd(), diff --git a/pcbnew/controle.cpp b/pcbnew/controle.cpp index d3866a15d4..013a521d72 100644 --- a/pcbnew/controle.cpp +++ b/pcbnew/controle.cpp @@ -243,7 +243,7 @@ void WinEDA_PcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) if( (CurrentTime - g_SaveTime) > g_TimeOut ) { - wxString tmpFileName = GetScreen()->m_FileName; + wxString tmpFileName = GetScreen()->GetFileName(); wxFileName fn = wxFileName( wxEmptyString, g_SaveFileName, PcbFileExtension ); bool flgmodify = GetScreen()->IsModify(); @@ -254,8 +254,8 @@ void WinEDA_PcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) OnModify(); GetScreen()->SetSave(); // Set the flags m_FlagSave cleared by SetModify() } - GetScreen()->m_FileName = tmpFileName; - SetTitle( GetScreen()->m_FileName ); + GetScreen()->SetFileName( tmpFileName ); + SetTitle( GetScreen()->GetFileName() ); } double scalar = GetScreen()->GetScalingFactor(); diff --git a/pcbnew/dialogs/dialog_SVG_print.cpp b/pcbnew/dialogs/dialog_SVG_print.cpp index 7da44ff5c9..b4938bf86e 100644 --- a/pcbnew/dialogs/dialog_SVG_print.cpp +++ b/pcbnew/dialogs/dialog_SVG_print.cpp @@ -177,7 +177,7 @@ void DIALOG_SVG_PRINT::PrintSVGDoc( bool aPrintAll, bool aPrint_Frame_Ref ) fn = m_FileNameCtrl->GetValue(); if( !fn.IsOk() ) { - fn = screen->m_FileName; + fn = screen->GetFileName(); } if( aPrintAll ) diff --git a/pcbnew/dialogs/dialog_drc.cpp b/pcbnew/dialogs/dialog_drc.cpp index 1d40ae0ff7..d5a2721fae 100644 --- a/pcbnew/dialogs/dialog_drc.cpp +++ b/pcbnew/dialogs/dialog_drc.cpp @@ -272,7 +272,7 @@ void DIALOG_DRC_CONTROL::OnButtonBrowseRptFileClick( wxCommandEvent& event ) wxString wildcard( _( "DRC report files (.rpt)|*.rpt" ) ); wxString Ext( wxT( "rpt" ) ); - fn = m_Parent->GetScreen()->m_FileName + wxT( "-drc" ); + fn = m_Parent->GetScreen()->GetFileName() + wxT( "-drc" ); fn.SetExt( Ext ); wxFileDialog dlg( this, _( "Save DRC Report File" ), wxEmptyString, @@ -555,7 +555,7 @@ void DIALOG_DRC_CONTROL::writeReport( FILE* fp ) int count; fprintf( fp, "** Drc report for %s **\n", - CONV_TO_UTF8( m_Parent->GetScreen()->m_FileName ) ); + CONV_TO_UTF8( m_Parent->GetScreen()->GetFileName() ) ); wxDateTime now = wxDateTime::Now(); diff --git a/pcbnew/dialogs/dialog_netlist.cpp b/pcbnew/dialogs/dialog_netlist.cpp index 6588367896..5c8485ac56 100644 --- a/pcbnew/dialogs/dialog_netlist.cpp +++ b/pcbnew/dialogs/dialog_netlist.cpp @@ -27,7 +27,7 @@ void WinEDA_PcbFrame::InstallNetlistFrame( wxDC* DC, const wxPoint& pos ) if( !fn.FileExists() ) { - fn = GetScreen()->m_FileName; + fn = GetScreen()->GetFileName(); fn.SetExt( NetExtBuffer ); } diff --git a/pcbnew/export_gencad.cpp b/pcbnew/export_gencad.cpp index fb8da56b14..5f2247fa4c 100644 --- a/pcbnew/export_gencad.cpp +++ b/pcbnew/export_gencad.cpp @@ -67,7 +67,7 @@ static int mapYto( int y ) */ void WinEDA_PcbFrame::ExportToGenCAD( wxCommandEvent& event ) { - wxFileName fn = GetScreen()->m_FileName; + wxFileName fn = GetScreen()->GetFileName(); wxString msg, ext, wildcard; FILE* file; @@ -540,7 +540,7 @@ bool CreateHeaderInfoData( FILE* file, WinEDA_PcbFrame* frame ) msg = wxT( "USER " ) + wxGetApp().GetAppName() + wxT( " " ) + GetBuildVersion(); fputs( CONV_TO_UTF8( msg ), file ); fputs( "\n", file ); - msg = wxT( "DRAWING " ) + screen->m_FileName; + msg = wxT( "DRAWING " ) + screen->GetFileName(); fputs( CONV_TO_UTF8( msg ), file ); fputs( "\n", file ); msg = wxT( "REVISION " ) + screen->m_Revision + wxT( " " ) + screen->m_Date; diff --git a/pcbnew/export_vrml.cpp b/pcbnew/export_vrml.cpp index 8e485e4a6f..209ff5eec4 100644 --- a/pcbnew/export_vrml.cpp +++ b/pcbnew/export_vrml.cpp @@ -1134,12 +1134,13 @@ void WinEDA_PcbFrame::OnExportVRML( wxCommandEvent& event ) // Build default file name wxString ext = wxT( "wrl" ); - fn = GetScreen()->m_FileName; + fn = GetScreen()->GetFileName(); fn.SetExt( ext ); DIALOG_EXPORT_3DFILE dlg( this ); dlg.FilePicker()->SetPath( fn.GetFullPath() ); dlg.SetSubdir( subDirFor3Dshapes ); + if( dlg.ShowModal() != wxID_OK ) return; diff --git a/pcbnew/files.cpp b/pcbnew/files.cpp index 9ab41bb611..a5b2982997 100644 --- a/pcbnew/files.cpp +++ b/pcbnew/files.cpp @@ -50,7 +50,7 @@ void WinEDA_PcbFrame::Files_io( wxCommandEvent& event ) switch( id ) { case ID_LOAD_FILE: - LoadOnePcbFile( GetScreen()->m_FileName, false, true ); + LoadOnePcbFile( GetScreen()->GetFileName(), false, true ); ReCreateAuxiliaryToolbar(); SetToolbars(); break; @@ -66,7 +66,7 @@ void WinEDA_PcbFrame::Files_io( wxCommandEvent& event ) } else { - fn = GetScreen()->m_FileName; + fn = GetScreen()->GetFileName(); fn.SetExt( BACKUP_FILE_EXT ); } @@ -85,8 +85,8 @@ void WinEDA_PcbFrame::Files_io( wxCommandEvent& event ) LoadOnePcbFile( fn.GetFullPath(), false ); fn.SetExt( PcbFileExtension ); - GetScreen()->m_FileName = fn.GetFullPath(); - SetTitle( GetScreen()->m_FileName ); + GetScreen()->SetFileName( fn.GetFullPath() ); + SetTitle( GetScreen()->GetFileName() ); ReCreateAuxiliaryToolbar(); SetToolbars(); break; @@ -98,16 +98,16 @@ void WinEDA_PcbFrame::Files_io( wxCommandEvent& event ) case ID_NEW_BOARD: Clear_Pcb( true ); - GetScreen()->m_FileName.Printf( wxT( "%s%cnoname%s" ), + GetScreen()->GetFileName().Printf( wxT( "%s%cnoname%s" ), GetChars( wxGetCwd() ), DIR_SEP, GetChars( PcbFileExtension ) ); - SetTitle( GetScreen()->m_FileName ); + SetTitle( GetScreen()->GetFileName() ); ReCreateLayerBox( NULL ); SetToolbars(); break; case ID_SAVE_BOARD: - SavePcbFile( GetScreen()->m_FileName ); + SavePcbFile( GetScreen()->GetFileName() ); break; case ID_SAVE_BOARD_AS: @@ -152,7 +152,7 @@ the changes?" ) ) ) if( aAppend ) { - GetScreen()->m_FileName = wxEmptyString; + GetScreen()->SetFileName( wxEmptyString ); OnModify(); GetBoard()->m_Status_Pcb = 0; } @@ -185,20 +185,20 @@ the changes?" ) ) ) if( !aAppend ) Clear_Pcb( false ); // pass false since we prompted above for a modified board - GetScreen()->m_FileName = fileName.GetFullPath(); + GetScreen()->SetFileName( fileName.GetFullPath() ); /* Start read PCB file */ - source = wxFopen( GetScreen()->m_FileName, wxT( "rt" ) ); + source = wxFopen( GetScreen()->GetFileName(), wxT( "rt" ) ); if( source == NULL ) { - msg.Printf( _( "File <%s> not found" ), GetChars( GetScreen()->m_FileName ) ); + msg.Printf( _( "File <%s> not found" ), GetChars( GetScreen()->GetFileName() ) ); DisplayError( this, msg ); return false; } - FILE_LINE_READER fileReader( source, GetScreen()->m_FileName ); + FILE_LINE_READER fileReader( source, GetScreen()->GetFileName() ); FILTER_READER reader( fileReader ); @@ -225,7 +225,8 @@ this file again." ) ); } // Reload the corresponding configuration file: - wxSetWorkingDirectory( wxPathOnly( GetScreen()->m_FileName ) ); + wxSetWorkingDirectory( wxPathOnly( GetScreen()->GetFileName() ) ); + if( aAppend ) ReadPcbFile( &reader, true ); else @@ -238,7 +239,7 @@ this file again." ) ); m_DisplayViaFill = DisplayOpt.DisplayViaFill; ReadPcbFile( &reader, false ); - LoadProjectSettings( GetScreen()->m_FileName ); + LoadProjectSettings( GetScreen()->GetFileName() ); } GetScreen()->ClrModify(); @@ -246,20 +247,21 @@ this file again." ) ); /* If append option: change the initial board name to -append.brd */ if( aAppend ) { - wxString new_filename = GetScreen()->m_FileName.BeforeLast( '.' ); + wxString new_filename = GetScreen()->GetFileName().BeforeLast( '.' ); + if ( ! new_filename.EndsWith( wxT( "-append" ) ) ) new_filename += wxT( "-append" ); new_filename += wxT( "." ) + PcbFileExtension; OnModify(); - GetScreen()->m_FileName = new_filename; + GetScreen()->SetFileName( new_filename ); } - GetScreen()->m_FileName.Replace( WIN_STRING_DIR_SEP, UNIX_STRING_DIR_SEP ); + GetScreen()->GetFileName().Replace( WIN_STRING_DIR_SEP, UNIX_STRING_DIR_SEP ); - SetTitle( GetScreen()->m_FileName ); - SetLastProject( GetScreen()->m_FileName ); + SetTitle( GetScreen()->GetFileName() ); + SetLastProject( GetScreen()->GetFileName() ); /* Rebuild the new pad list (for drc and ratsnet control ...) */ GetBoard()->m_Status_Pcb = 0; @@ -331,16 +333,16 @@ bool WinEDA_PcbFrame::SavePcbFile( const wxString& FileName ) if( FileName == wxEmptyString ) { wxFileDialog dlg( this, _( "Save Board File" ), wxEmptyString, - GetScreen()->m_FileName, PcbFileWildcard, + GetScreen()->GetFileName(), PcbFileWildcard, wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); if( dlg.ShowModal() == wxID_CANCEL ) return false; - GetScreen()->m_FileName = dlg.GetPath(); + GetScreen()->SetFileName( dlg.GetPath() ); } else - GetScreen()->m_FileName = FileName; + GetScreen()->SetFileName( FileName ); /* If changes are made, update the board date */ if( GetScreen()->IsModify() ) @@ -348,7 +350,7 @@ bool WinEDA_PcbFrame::SavePcbFile( const wxString& FileName ) GetScreen()->m_Date = GenDate(); } - pcbFileName = GetScreen()->m_FileName; + pcbFileName = GetScreen()->GetFileName(); /* Get the backup file name */ backupFileName = pcbFileName; @@ -387,8 +389,8 @@ bool WinEDA_PcbFrame::SavePcbFile( const wxString& FileName ) if( dest ) { - GetScreen()->m_FileName = pcbFileName.GetFullPath(); - SetTitle( GetScreen()->m_FileName ); + GetScreen()->SetFileName( pcbFileName.GetFullPath() ); + SetTitle( GetScreen()->GetFileName() ); SavePcbFormatAscii( dest ); fclose( dest ); diff --git a/pcbnew/gen_modules_placefile.cpp b/pcbnew/gen_modules_placefile.cpp index 1dd478dc5f..e510db3fd6 100644 --- a/pcbnew/gen_modules_placefile.cpp +++ b/pcbnew/gen_modules_placefile.cpp @@ -134,7 +134,7 @@ void WinEDA_PcbFrame::GenModulesPosition( wxCommandEvent& event ) return; } - fnFront = GetScreen()->m_FileName; + fnFront = GetScreen()->GetFileName(); frontLayerName = GetBoard()->GetLayerName( LAYER_N_FRONT ); fnFront.SetName( fnFront.GetName() + frontLayerName ); fnFront.SetExt( wxT( "pos") ); @@ -149,7 +149,7 @@ void WinEDA_PcbFrame::GenModulesPosition( wxCommandEvent& event ) if( doBoardBack ) { - fnBack = GetScreen()->m_FileName; + fnBack = GetScreen()->GetFileName(); backLayerName = GetBoard()->GetLayerName( LAYER_N_BACK ); fnBack.SetName( fnBack.GetName() + backLayerName ); fnBack.SetExt( wxT( "pos" ) ); @@ -320,7 +320,7 @@ void WinEDA_PcbFrame::GenModuleReport( wxCommandEvent& event ) File_Place_Offset = wxPoint( 0, 0 ); - fn = GetScreen()->m_FileName; + fn = GetScreen()->GetFileName(); fn.SetExt( wxT( "rpt" ) ); rptfile = wxFopen( fn.GetFullPath(), wxT( "wt" ) ); diff --git a/pcbnew/gendrill.cpp b/pcbnew/gendrill.cpp index 4c83533f90..193c3c7308 100644 --- a/pcbnew/gendrill.cpp +++ b/pcbnew/gendrill.cpp @@ -129,7 +129,7 @@ void DIALOG_GENDRILL::GenDrillAndReportFiles( ) if( s_ToolListBuffer.size() > 0 ) //holes? { - fn = m_Parent->GetScreen()->m_FileName; + fn = m_Parent->GetScreen()->GetFileName(); layer_extend.Empty(); if( !gen_through_holes ) @@ -220,7 +220,7 @@ void DIALOG_GENDRILL::GenDrillAndReportFiles( ) if( m_Choice_Drill_Report->GetSelection() > 0 ) { - GenDrillReport( m_Parent->GetScreen()->m_FileName ); + GenDrillReport( m_Parent->GetScreen()->GetFileName() ); } } @@ -647,7 +647,7 @@ void DIALOG_GENDRILL::GenDrillReport( const wxString aFileName ) } GenDrillReportFile( report_dest, m_Parent->GetBoard(), - m_Parent->GetScreen()->m_FileName, + m_Parent->GetScreen()->GetFileName(), m_UnitDrillIsInch, s_HoleListBuffer, s_ToolListBuffer ); diff --git a/pcbnew/initpcb.cpp b/pcbnew/initpcb.cpp index 8778fb049a..085bd8d171 100644 --- a/pcbnew/initpcb.cpp +++ b/pcbnew/initpcb.cpp @@ -46,7 +46,7 @@ bool WinEDA_PcbFrame::Clear_Pcb( bool aQuery ) SetCurItem( NULL ); /* clear filename, to avoid overwriting an old file */ - GetScreen()->m_FileName.Empty(); + GetScreen()->GetFileName().Empty(); /* Init new grid size */ wxRealPoint gridsize = GetScreen()->GetGridSize(); @@ -101,7 +101,7 @@ bool WinEDA_ModuleEditFrame::Clear_Pcb( bool aQuery ) GetBoard()->m_Modules.DeleteAll(); /* init pointeurs et variables */ - GetScreen()->m_FileName.Empty(); + GetScreen()->GetFileName().Empty(); SetCurItem( NULL ); diff --git a/pcbnew/pcbframe.cpp b/pcbnew/pcbframe.cpp index c0dc0d6d44..fcfb8b5c14 100644 --- a/pcbnew/pcbframe.cpp +++ b/pcbnew/pcbframe.cpp @@ -448,14 +448,14 @@ void WinEDA_PcbFrame::OnCloseWindow( wxCloseEvent& Event ) case wxID_OK: case wxID_YES: - SavePcbFile( GetScreen()->m_FileName ); + SavePcbFile( GetScreen()->GetFileName() ); break; } } - if( !GetScreen()->m_FileName.IsEmpty() ) + if( !GetScreen()->GetFileName().IsEmpty() ) { - wxFileName fn = GetScreen()->m_FileName; + wxFileName fn = GetScreen()->GetFileName(); fn.SetExt( ProjectFileExtension ); wxGetApp().WriteProjectConfig( fn.GetFullPath(), GROUP, GetProjectFileParameters() ); } @@ -668,7 +668,7 @@ void WinEDA_PcbFrame::SetLanguage( wxCommandEvent& event ) wxString WinEDA_PcbFrame::GetLastNetListRead() { wxFileName absoluteFileName = m_lastNetListRead; - wxFileName pcbFileName = GetScreen()->m_FileName; + wxFileName pcbFileName = GetScreen()->GetFileName(); if( !absoluteFileName.MakeAbsolute( pcbFileName.GetPath() ) || !absoluteFileName.FileExists() ) @@ -684,7 +684,7 @@ wxString WinEDA_PcbFrame::GetLastNetListRead() void WinEDA_PcbFrame::SetLastNetListRead( const wxString& aLastNetListRead ) { wxFileName relativeFileName = aLastNetListRead; - wxFileName pcbFileName = GetScreen()->m_FileName; + wxFileName pcbFileName = GetScreen()->GetFileName(); if( relativeFileName.MakeRelativeTo( pcbFileName.GetPath() ) && relativeFileName.GetFullPath() != aLastNetListRead ) diff --git a/pcbnew/pcbnew.cpp b/pcbnew/pcbnew.cpp index f5d2c5ff36..b89bb0338a 100644 --- a/pcbnew/pcbnew.cpp +++ b/pcbnew/pcbnew.cpp @@ -164,15 +164,14 @@ Changing extension to .brd." ), GetChars( fn.GetFullPath() ) ); else { // File does not exists: prepare an empty board wxSetWorkingDirectory( fn.GetPath() ); - frame->GetScreen()->m_FileName = fn.GetFullPath(); - frame->GetScreen()->m_FileName.Replace( WIN_STRING_DIR_SEP, UNIX_STRING_DIR_SEP ); - frame->SetTitle( frame->GetScreen()->m_FileName ); - frame->SetLastProject( frame->GetScreen()->m_FileName ); + frame->GetScreen()->SetFileName( fn.GetFullPath( wxPATH_UNIX ) ); + frame->SetTitle( frame->GetScreen()->GetFileName() ); + frame->SetLastProject( frame->GetScreen()->GetFileName() ); frame->OnModify(); // Ready to save the new empty board wxString msg; msg.Printf( _( "File <%s> not existing\nThis is normal for a new project" ), - GetChars( frame->GetScreen()->m_FileName ) ); + GetChars( frame->GetScreen()->GetFileName() ) ); wxMessageBox( msg ); } } diff --git a/pcbnew/pcbnew_config.cpp b/pcbnew/pcbnew_config.cpp index b2bb48d74c..49f9df192b 100644 --- a/pcbnew/pcbnew_config.cpp +++ b/pcbnew/pcbnew_config.cpp @@ -86,7 +86,7 @@ void WinEDA_PcbFrame::Process_Config( wxCommandEvent& event ) case ID_CONFIG_READ: { - fn = GetScreen()->m_FileName; + fn = GetScreen()->GetFileName(); fn.SetExt( ProjectFileExtension ); wxFileDialog dlg( this, _( "Read Project File" ), fn.GetPath(), @@ -175,7 +175,7 @@ void WinEDA_PcbFrame::SaveProjectSettings() { wxFileName fn; - fn = GetScreen()->m_FileName; + fn = GetScreen()->GetFileName(); fn.SetExt( ProjectFileExtension ); wxFileDialog dlg( this, _( "Save Project File" ), fn.GetPath(), fn.GetFullName(), diff --git a/pcbnew/pcbplot.cpp b/pcbnew/pcbplot.cpp index 49c2193303..52c66ee8ee 100644 --- a/pcbnew/pcbplot.cpp +++ b/pcbnew/pcbplot.cpp @@ -285,7 +285,7 @@ void DIALOG_PLOT::Init_Dialog() // Output directory if( g_PcbPlotOptions.GetOutputDirectory().IsEmpty() ) { - fileName = m_Parent->GetScreen()->m_FileName; + fileName = m_Parent->GetScreen()->GetFileName(); m_outputDirectoryName->SetValue( fileName.GetPath() ); } else @@ -612,7 +612,7 @@ void DIALOG_PLOT::Plot( wxCommandEvent& event ) { s_SelectedLayers |= mask; - fn = m_Parent->GetScreen()->m_FileName; + fn = m_Parent->GetScreen()->GetFileName(); fn.SetPath( m_outputDirectoryName->GetValue() ); // Create file name. diff --git a/pcbnew/printout_controler.cpp b/pcbnew/printout_controler.cpp index ea4b1e296d..2e260a04c8 100644 --- a/pcbnew/printout_controler.cpp +++ b/pcbnew/printout_controler.cpp @@ -264,7 +264,7 @@ void BOARD_PRINTOUT_CONTROLER::DrawPage() * is the y coordinate values from - PlotAreaSize.y to 0 */ #ifdef USE_WX_ZOOM int y_dc_offset = PlotAreaSizeInPixels.y; - y_dc_offset = (int) y_dc_offset * userscale; + y_dc_offset = (int) ( ( double ) y_dc_offset * userscale ); dc->SetDeviceOrigin( 0, y_dc_offset ); #endif int ysize = (int) ( PlotAreaSizeInPixels.y / scaley ); diff --git a/pcbnew/specctra_export.cpp b/pcbnew/specctra_export.cpp index edf50b46d2..30f3f67ae8 100644 --- a/pcbnew/specctra_export.cpp +++ b/pcbnew/specctra_export.cpp @@ -63,7 +63,7 @@ static const double safetyMargin = 0.1; // see wxPcbStruct.h void WinEDA_PcbFrame::ExportToSpecctra( wxCommandEvent& event ) { - wxString fullFileName = GetScreen()->m_FileName; + wxString fullFileName = GetScreen()->GetFileName(); wxString path; wxString name; wxString ext; diff --git a/pcbnew/specctra_import.cpp b/pcbnew/specctra_import.cpp index f6edb00c2c..e09c006626 100644 --- a/pcbnew/specctra_import.cpp +++ b/pcbnew/specctra_import.cpp @@ -63,7 +63,7 @@ void WinEDA_PcbFrame::ImportSpecctraSession( wxCommandEvent& event ) } */ - wxString fullFileName = GetScreen()->m_FileName; + wxString fullFileName = GetScreen()->GetFileName(); wxString path; wxString name; wxString ext; diff --git a/pcbnew/xchgmod.cpp b/pcbnew/xchgmod.cpp index 2bc9a77eb2..d64327f079 100644 --- a/pcbnew/xchgmod.cpp +++ b/pcbnew/xchgmod.cpp @@ -154,7 +154,7 @@ int DIALOG_EXCHANGE_MODULE::Maj_ListeCmp( const wxString& reference, return 0; /* no change of name */ /* Calculation CMP file name by changing the extension name NetList */ - fn = m_Parent->GetScreen()->m_FileName; + fn = m_Parent->GetScreen()->GetFileName(); fn.SetExt( NetCmpExtBuffer ); FichCmp = wxFopen( fn.GetFullPath(), wxT( "rt" ) ); @@ -576,7 +576,7 @@ void WinEDA_PcbFrame::RecreateCmpFileFromBoard( wxCommandEvent& aEvent ) } /* Calculation file name by changing the extension name to NetList */ - fn = GetScreen()->m_FileName; + fn = GetScreen()->GetFileName(); fn.SetExt( NetCmpExtBuffer ); wildcard = _( "Component files (." ) + NetCmpExtBuffer + wxT( ")|*." ) + NetCmpExtBuffer;