/****************************/
/*	EESCHEMA - files-io.cpp	*/
/****************************/

#include "fctsys.h"
#include "gr_basic.h"

#include "common.h"
#include "program.h"
#include "libcmp.h"
#include "general.h"

#include "protos.h"
#include "id.h"

#include "schframe.h"

/* Fonctions locales */


/****************************************************************/
void WinEDA_SchematicFrame::Save_File( wxCommandEvent& event )
/****************************************************************/

/* Commands to save project or the current page.
 */
{
    int id = event.GetId();

    switch( id )
    {
    case ID_SAVE_PROJECT:     /* Update Schematic File */
        SaveProject( );
        break;

    case ID_SAVE_ONE_SHEET:     /* Update Schematic File */
        SaveEEFile( NULL, FILE_SAVE_AS );
        break;

    case ID_SAVE_ONE_SHEET_AS:     /* Save EED (new name) */
        SaveEEFile( NULL, FILE_SAVE_NEW );
        break;

    default:
        DisplayError( this, wxT( "WinEDA_SchematicFrame::Save_File Internal Error" ) );
        break;
    }
}


/******************************************************************************************/
//bool WinEDA_SchematicFrame::LoadOneSheet(DrawSheetStruct* sheet, const wxString& filename )
/******************************************************************************************/
//{
//	return FALSE; 
	//when is this used? and why?
	/*
	//this must be called with a non-null pointer screen pointer, clearly. 
	//also note that this is for reading in a *root* file
    wxString FullFileName = filename;

    if( FullFileName.IsEmpty() )
    {
        wxString mask;
        mask = wxT( "*" ) + g_SchExtBuffer;
        FullFileName = EDA_FileSelector( _( "Schematic files:" ),
                                         wxEmptyString,         //default path
                                         sheet->m_AssociatedScreen->m_FileName,// default filename 
                                         g_SchExtBuffer,        // extension par defaut
                                         mask,                  // Masque d'affichage
                                         this,
                                         wxFD_OPEN,
                                         FALSE
                                         );
        if( FullFileName.IsEmpty() )
            return FALSE;
    }

    ClearProjectDrawList( screen, TRUE );
	printf("in LoadOneScreen setting screen filename: %s \n", (const char*) FullFileName.mb_str() ); 
    screen->m_FileName = FullFileName;
	LoadDrawSheet( DrawSheetStruct * sheet, filename); 
    screen->SetModify();

    if( GetScreen() == screen )
        Refresh( TRUE );
    return TRUE;
	*/
//}

/************************************************************************************/
int WinEDA_SchematicFrame::LoadOneEEProject( const wxString& FileName, bool IsNew )
/************************************************************************************/
{
	/*
	*  Load an entire project 
	* ( schematic root file and its subhierarchies, the configuration and the libs
	*  which are not already loaded)
	*/
	SCH_SCREEN*    screen;
	wxString       FullFileName, msg;
	bool           LibCacheExist = FALSE;

	EDA_ScreenList ScreenList;

	for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() )
	{
		if( screen->IsModify() )
			break;
	}

	if( screen )
	{
		if( !IsOK( this, _( "Clear Schematic Hierarchy (modified!)?" ) ) )
			return FALSE;
		if( g_RootSheet->m_AssociatedScreen->m_FileName != g_DefaultSchematicFileName )
			SetLastProject( g_RootSheet->m_AssociatedScreen->m_FileName );
	}

	FullFileName = FileName;
	if( ( FullFileName.IsEmpty() ) && !IsNew )
	{
		wxString mask = wxT( "*" ) + g_SchExtBuffer;
		FullFileName = EDA_FileSelector( _( "Schematic files:" ),
					wxEmptyString,     /* Chemin par defaut */
					wxEmptyString,     /* nom fichier par defaut */
	 				g_SchExtBuffer,    /* extension par defaut */
					mask,              /* Masque d'affichage */
					this,
					wxFD_OPEN,
					TRUE
					);
		if( FullFileName.IsEmpty() )
			return FALSE;
	}
	if(g_RootSheet){
		SAFE_DELETE(g_RootSheet);
	}
	CreateScreens(); 
	screen = (SCH_SCREEN*)GetScreen(); 
	
	wxSetWorkingDirectory( wxPathOnly( FullFileName ) );
	GetScreen()->m_FileName = FullFileName;
	g_RootSheet->SetFileName(FullFileName);
	Affiche_Message( wxEmptyString );
	MsgPanel->EraseMsgBox();

	memset( &g_EESchemaVar, 0, sizeof(g_EESchemaVar) );

	GetScreen()->ClrModify();
	//m_CurrentSheet->m_AssociatedScreen->Pnext = NULL; should be by default

	if( IsNew )
	{
		screen->m_CurrentSheetDesc = &g_Sheet_A4;
		screen->SetZoom( 32 );
		screen->m_ScreenNumber = screen->m_NumberOfScreen = 1;
		screen->m_Title = wxT( "noname.sch" );
		GetScreen()->m_FileName = screen->m_Title;
		screen->m_Company.Empty();
		screen->m_Commentaire1.Empty();
		screen->m_Commentaire2.Empty();
		screen->m_Commentaire3.Empty();
		screen->m_Commentaire4.Empty();
		Read_Config( wxEmptyString, TRUE );
		Zoom_Automatique( TRUE );
		ReDrawPanel();
		return 1;
	}

    // Rechargement de la configuration:
	msg = _( "Ready\nWorking dir: \n" ) + wxGetCwd();
	PrintMsg( msg );

	Read_Config( wxEmptyString, FALSE );

    // Delete old caches.
	LibraryStruct* nextlib, * lib = g_LibraryList;
	for( ; lib != NULL; lib = nextlib )
	{
		nextlib = lib->m_Pnext;
		if( lib->m_IsLibCache )
			FreeCmpLibrary( this, lib->m_Name );
	}

	if( IsNew )
	{
		ReDrawPanel();
		return 1;
	}

    // Loading the project library cache
	wxString       FullLibName;
	wxString       shortfilename;
	wxSplitPath( g_RootSheet->m_AssociatedScreen->m_FileName, NULL, &shortfilename, NULL );
	FullLibName << wxT( "." ) << STRING_DIR_SEP << shortfilename << wxT( ".cache" ) <<
			g_LibExtBuffer;
	if( wxFileExists( FullLibName ) )
	{
		wxString libname;
		libname = FullLibName;
		ChangeFileNameExt( libname, wxEmptyString );
		msg = wxT( "Load " ) + FullLibName;
		LibraryStruct* LibCache = LoadLibraryName( this, FullLibName, libname );
		if( LibCache )
		{
			LibCache->m_IsLibCache = TRUE;
			msg += wxT( " OK" );
		}
		else
			msg += wxT( " ->Error" );
		PrintMsg( msg );
		LibCacheExist = TRUE;
	}

	if( !wxFileExists( g_RootSheet->m_AssociatedScreen->m_FileName ) && !LibCacheExist )   // Nouveau projet prpbablement
	{
		msg.Printf( _( "File %s not found (new project ?)" ),
					g_RootSheet->m_AssociatedScreen->m_FileName.GetData() );
		DisplayInfo( this, msg, 20 );
		return -1;
	}

	//load the project.
	SAFE_DELETE(g_RootSheet->m_AssociatedScreen); 
	bool diag = g_RootSheet->Load(this);

	/* Reaffichage ecran de base (ROOT) si necessaire */
	ActiveScreen = GetScreen(); 
	Zoom_Automatique( FALSE );
	DrawPanel->Refresh( TRUE );
	return diag;
}
/**********************************************************/
SCH_SCREEN * WinEDA_SchematicFrame::CreateNewScreen(
		SCH_SCREEN * OldScreen, int TimeStamp)
/**********************************************************/
/* Routine de creation ( par allocation memoire ) d'un nouvel ecran
		cet ecran est en chainage arriere avec OldScreen
		la valeur TimeStamp est attribuee au parametre NewScreen->TimeStamp
*/
{
	SCH_SCREEN * NewScreen;

	NewScreen = new SCH_SCREEN(SCHEMATIC_FRAME);

	NewScreen->SetRefreshReq();
	if(OldScreen) NewScreen->m_Company = OldScreen->m_Company;
	NewScreen->m_TimeStamp = TimeStamp;

	NewScreen->Pback = OldScreen;

	return(NewScreen);
}

/****************************************************/
void WinEDA_SchematicFrame::SaveProject( )
/****************************************************/

/* Saves the entire project and creates an archive for components
 *  the library archive name is <root_name>.cache.lib
 */
{
    SCH_SCREEN* screen;
    wxString    LibArchiveFileName;

    EDA_ScreenList ScreenList;

    for( screen = ScreenList.GetFirst(); screen != NULL;
			screen = ScreenList.GetNext() )
    {
		printf("SaveEEFile, %s\n", CONV_TO_UTF8(screen->m_FileName) ); 
        SaveEEFile( screen, FILE_SAVE_AS );
    }

    /* Creation du fichier d'archivage composants en repertoire courant */
    LibArchiveFileName = MakeFileName( wxEmptyString, GetScreen()->m_FileName, wxEmptyString );
    ChangeFileNameExt( LibArchiveFileName, wxEmptyString );
    
    /* mise a jour extension  */
    LibArchiveFileName += wxT( ".cache" ) + g_LibExtBuffer;
    LibArchive( this, LibArchiveFileName );
}


/************************/
int CountCmpNumber()
/************************/

/* Routine retournant le nombre de composants dans le schema,
 *  powers non comprises */
{
	return g_RootSheet->ComponentCount(); 
	/*
    BASE_SCREEN*    Window;
    EDA_BaseStruct* Phead;
    int             Nb = 0;

	
	
    Window = ScreenSch;
    while( Window )
    {
        for( Phead = Window->EEDrawList; Phead != NULL; Phead = Phead->Pnext )
        {
            if( Phead->Type() == DRAW_LIB_ITEM_STRUCT_TYPE )
            {
                DrawPartStruct* Cmp = (DrawPartStruct*) Phead;
                if( Cmp->m_Field[VALUE].m_Text.GetChar( 0 ) != '#' )
                    Nb++;
            }
        }

        Window = (BASE_SCREEN*) Window->Pnext;
    }

    return Nb;
	*/
}