/***************************************************/
	/* Files.cpp: Lecture / Sauvegarde des fichiers PCB */
	/***************************************************/

#include "fctsys.h"

#include "common.h"
#include "pcbnew.h"
#include "protos.h"
#include "id.h"


/****************************************************/
void WinEDA_PcbFrame::Files_io(wxCommandEvent& event)
/****************************************************/
/* Gestion generale  des commandes de lecture de fichiers
*/
{
int id = event.GetId();
wxClientDC dc(DrawPanel);
wxString msg;

	DrawPanel->PrepareGraphicContext(&dc);

	// Arret des commandes en cours
	if( DrawPanel->ManageCurseur && DrawPanel->ForceCloseManageCurseur )
	{
		DrawPanel->ForceCloseManageCurseur(DrawPanel, &dc);
	}
	SetToolID(0, wxCURSOR_ARROW,wxEmptyString);

	switch (id)
		{
		case ID_MENU_LOAD_FILE:
		case ID_LOAD_FILE:
			Clear_Pcb(&dc, TRUE);
			LoadOnePcbFile(wxEmptyString, &dc, FALSE);
			ReCreateAuxiliaryToolbar();
		break;

		case ID_MENU_READ_LAST_SAVED_VERSION_BOARD:
		case ID_MENU_RECOVER_BOARD:
		{
			wxString filename, oldfilename = GetScreen()->m_FileName;
			if ( id == ID_MENU_RECOVER_BOARD)
			{
				filename = g_SaveFileName + PcbExtBuffer;
			}
			else
			{
				filename = oldfilename;
				ChangeFileNameExt(filename, wxT(".000"));
			}
			if ( ! wxFileExists(filename) )
			{
				msg = _("Recovery file ") + filename + _(" not found");
				DisplayInfo(this, msg);
				break;
			}
			else
			{
				msg = _("Ok to load Recovery file ") + filename;
				if ( ! IsOK (this, msg) ) break; 
			}
			Clear_Pcb(&dc, TRUE);
			LoadOnePcbFile(filename, &dc, FALSE);
			GetScreen()->m_FileName = oldfilename;
			SetTitle(GetScreen()->m_FileName);
			ReCreateAuxiliaryToolbar();
		}
		break;

		case ID_MENU_APPEND_FILE:
		case ID_APPEND_FILE:
			LoadOnePcbFile(wxEmptyString, &dc, TRUE);
			break;

		case ID_MENU_NEW_BOARD:
		case ID_NEW_BOARD:
			Clear_Pcb(&dc, TRUE);
			GetScreen()->m_FileName.Printf( wxT("%s%cnoname%s"),
					wxGetCwd().GetData(), DIR_SEP, PcbExtBuffer.GetData());
			SetTitle(GetScreen()->m_FileName);
			break;

		case ID_LOAD_FILE_1:
		case ID_LOAD_FILE_2:
		case ID_LOAD_FILE_3:
		case ID_LOAD_FILE_4:
		case ID_LOAD_FILE_5:
		case ID_LOAD_FILE_6:
		case ID_LOAD_FILE_7:
		case ID_LOAD_FILE_8:
		case ID_LOAD_FILE_9:
		case ID_LOAD_FILE_10:
			Clear_Pcb(&dc, TRUE);
			wxSetWorkingDirectory(wxPathOnly(GetLastProject(id - ID_LOAD_FILE_1)));
			LoadOnePcbFile(	GetLastProject(id - ID_LOAD_FILE_1).GetData(),
				&dc, FALSE);
			ReCreateAuxiliaryToolbar();
			break;

		case ID_SAVE_BOARD:
		case ID_MENU_SAVE_BOARD:
			SavePcbFile(GetScreen()->m_FileName);
			break;

		case ID_MENU_SAVE_BOARD_AS:
			SavePcbFile(wxEmptyString);
			break;

		case ID_PCB_GEN_CMP_FILE:
			RecreateCmpFileFromBoard();
			break;

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




/*****************************************************************************************/
int WinEDA_PcbFrame::LoadOnePcbFile(const wxString & FullFileName, wxDC * DC, bool Append)
/******************************************************************************************/
/*
 Lecture d'un fichier PCB, le nom etant dans PcbNameBuffer.s
 retourne:
	0 si fichier non lu ( annulation de commande ... )
	1 si OK
*/
{
int ii;
FILE * source;
wxString msg;
	
	ActiveScreen = GetScreen();

	if( GetScreen()->IsModify() &&  !Append )
		{
		if( !IsOK(this, _("Board Modified: Continue ?"))  )
			return(0);
		}

	m_SelTrackWidthBox_Changed = TRUE;
	m_SelViaSizeBox_Changed = TRUE;

	if( Append )
		{
		GetScreen()->m_FileName = wxEmptyString;
		GetScreen()->SetModify();
		m_Pcb->m_Status_Pcb = 0;
		}

	if( FullFileName == wxEmptyString)
		{
		msg = wxT("*") + PcbExtBuffer;
		wxString FileName =
			EDA_FileSelector(_("Board files:"),
					wxEmptyString,						/* Chemin par defaut */
					GetScreen()->m_FileName,	 	/* nom fichier par defaut */
					PcbExtBuffer,			/* extension par defaut */
					msg,					/* Masque d'affichage */
					this,
					wxFD_OPEN,
					FALSE
					);
			if ( FileName == wxEmptyString ) return FALSE;
			GetScreen()->m_FileName = FileName;
		}

	else GetScreen()->m_FileName = FullFileName;

	/////////////////////////
	/* Lecture Fichier PCB */
	/////////////////////////

	source = wxFopen(GetScreen()->m_FileName,wxT("rt"));
	if (source == NULL)
	{
		msg.Printf(_("File <%s> not found"),GetScreen()->m_FileName.GetData()) ;
		DisplayError(this, msg) ;
		return(0);
	}


	/* Lecture de l'entete et TEST si PCB format ASCII */
	GetLine(source, cbuf, &ii );
	if( strncmp( cbuf, "PCBNEW-BOARD",12) != 0)
	{
		fclose(source);
		DisplayError(this, wxT("Unknown file type"));
		return(0);
	}

	SetTitle(GetScreen()->m_FileName);
	SetLastProject(GetScreen()->m_FileName);

	// Rechargement de la configuration:
	wxSetWorkingDirectory( wxPathOnly(GetScreen()->m_FileName) );
	if( Append ) ReadPcbFile(DC, source, TRUE);
	else
		{
		Read_Config(GetScreen()->m_FileName);

		// Mise a jour du toolbar d'options
		m_DisplayPcbTrackFill = DisplayOpt.DisplayPcbTrackFill;
		m_DisplayModText = DisplayOpt.DisplayModText ;
		m_DisplayModEdge = DisplayOpt.DisplayModEdge;
		m_DisplayPadFill = DisplayOpt.DisplayPadFill;

		ReadPcbFile(DC, source, FALSE);
		}

	fclose(source);

	GetScreen()->ClrModify();

	if(	Append )
		{
		GetScreen()->SetModify();
		GetScreen()->m_FileName.Printf( wxT("%s%cnoname%s"),
			wxGetCwd().GetData(), DIR_SEP, PcbExtBuffer.GetData());
		}


	/* liste des pads recalculee avec Affichage des messages d'erreur */
	build_liste_pads();

	Affiche_Infos_Status_Pcb(this);

	g_SaveTime = time(NULL);
	return(1);
}



/***********************************************************/
bool WinEDA_PcbFrame::SavePcbFile(const wxString & FileName)
/************************************************************/
/* Sauvegarde du fichier PCB en format ASCII
*/
{
wxString old_name, FullFileName, msg;
bool saveok = TRUE;
FILE * dest;

	if( FileName == wxEmptyString )
		{
		msg = wxT("*") + PcbExtBuffer;
		FullFileName = EDA_FileSelector(_("Board files:"),
					wxEmptyString,						/* Chemin par defaut */
					GetScreen()->m_FileName,	 	/* nom fichier par defaut */
					PcbExtBuffer,			/* extension par defaut */
					msg,					/* Masque d'affichage */
					this,
					wxFD_SAVE,
					FALSE
					);
			if ( FullFileName == wxEmptyString ) return FALSE;
			GetScreen()->m_FileName = FullFileName;
		}
	else GetScreen()->m_FileName = FileName;

	/* mise a jour date si modifications */
	if ( GetScreen()->IsModify() )
		{
		GetScreen()->m_Date = GenDate();
		}

	/* Calcul du nom du fichier a creer */
	FullFileName = MakeFileName(wxEmptyString, GetScreen()->m_FileName, PcbExtBuffer);

	/* Calcul du nom du fichier de sauvegarde */
	old_name = FullFileName;
	ChangeFileNameExt(old_name,wxT(".000"));

	/* Changement du nom de l'ancien fichier s'il existe */
	if ( wxFileExists(FullFileName) )
		{
		/* conversion en *.000 de l'ancien fichier */
		wxRemoveFile(old_name);	/* S'il y a une ancienne sauvegarde */
		if( ! wxRenameFile(FullFileName,old_name) )
			{
			msg = _("Warning: unable to create bakfile ") + old_name;
			DisplayError(this, msg, 15) ;
			saveok = FALSE;
			}
		}

	else
		{
		old_name = wxEmptyString; saveok = FALSE;
		}

	/* Sauvegarde de l'ancien fichier */
	dest = wxFopen(FullFileName, wxT("wt"));
	if (dest == 0)
		{
		msg = _("Unable to create ") + FullFileName;
		DisplayError(this, msg) ;
		saveok = FALSE;
		}

	if( dest )
		{
		GetScreen()->m_FileName = FullFileName;
		SetTitle(GetScreen()->m_FileName);
		SavePcbFormatAscii(dest);
		fclose(dest) ;
		}

	/* Affichage des fichiers crees: */
	MsgPanel->EraseMsgBox();

	if( saveok )
	{
		msg = _("Backup file: ") + old_name;
		Affiche_1_Parametre(this, 1,msg, wxEmptyString, CYAN);
	}

	if ( dest )	msg = _("Write Board file: ");
	else msg = _("Failed to create ");
	msg += FullFileName;

	Affiche_1_Parametre(this, 1,wxEmptyString,msg, CYAN);
	g_SaveTime = time(NULL);	/* Reset delai pour sauvegarde automatique */
	GetScreen()->ClrModify();
	return TRUE;
}