	/******************************************************************/
	/* mdiframe.cpp - fonctions de la classe du type WinEDA_MainFrame */
	/******************************************************************/

#ifdef __GNUG__
#pragma implementation
#endif

#ifdef KICAD_PYTHON
#include <pyhandler.h>
#endif

#include "fctsys.h"

#include "common.h"

#include "bitmaps.h"
#include "protos.h"

#include "id.h"

#include "kicad.h"

	/****************/
	/* Constructeur */
	/****************/

WinEDA_MainFrame::WinEDA_MainFrame(WinEDA_App * eda_app,
						wxWindow *parent, const wxString & title,
						const wxPoint& pos, const wxSize& size):
		WinEDA_BasicFrame(parent, KICAD_MAIN_FRAME, eda_app, title, pos, size )
{
wxString msg;
wxSize clientsize;

	m_FrameName = wxT("KicadFrame");
	m_VToolBar = NULL;
	m_LeftWin = NULL;
	m_BottomWin = NULL;
	m_CommandWin = NULL;
	m_LeftWin_Width = 200;
	m_CommandWin_Height = 82;

	GetSettings();
	if( m_Parent->m_EDA_Config )
	{
		m_Parent->m_EDA_Config->Read(wxT("LeftWinWidth"), &m_LeftWin_Width);
		m_Parent->m_EDA_Config->Read(wxT("CommandWinWidth"), &m_CommandWin_Height);
	}

	SetSize(m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y);

	// ajuste la ligne de status
int dims[3] = { -1, -1, 100};
	CreateStatusBar(3);
	SetStatusWidths(3,dims);

	// Give an icon
	#ifdef __WINDOWS__
	SetIcon(wxICON(a_kicad_icon));
	#else
	SetIcon(wxICON(kicad_icon));
	#endif

	clientsize = GetClientSize();

  // Left window: is the box which display tree project
	m_LeftWin = new WinEDA_PrjFrame(this, wxDefaultPosition, wxDefaultSize);
	m_LeftWin->SetDefaultSize(wxSize(m_LeftWin_Width, clientsize.y));
	m_LeftWin->SetOrientation(wxLAYOUT_VERTICAL);
	m_LeftWin->SetAlignment(wxLAYOUT_LEFT);
	m_LeftWin->SetSashVisible(wxSASH_RIGHT, TRUE);
	m_LeftWin->SetExtraBorderSize(2);

	// Bottom Window: box to display messages
	m_BottomWin = new wxSashLayoutWindow(this, ID_BOTTOM_FRAME,
				wxDefaultPosition, wxDefaultSize,
				wxNO_BORDER|wxSW_3D);
	m_BottomWin->SetDefaultSize(wxSize(clientsize.x, 150));
	m_BottomWin->SetOrientation(wxLAYOUT_HORIZONTAL);
	m_BottomWin->SetAlignment(wxLAYOUT_BOTTOM);
	m_BottomWin->SetSashVisible(wxSASH_TOP, TRUE);
	m_BottomWin->SetSashVisible(wxSASH_LEFT, TRUE);
	m_BottomWin->SetExtraBorderSize(2);

	m_DialogWin = new wxTextCtrl(m_BottomWin, ID_MAIN_DIALOG, wxEmptyString,
				wxDefaultPosition, wxDefaultSize,
				wxTE_MULTILINE|
				wxNO_BORDER|
				wxTE_READONLY);
	m_DialogWin->SetFont(* g_StdFont);

	// m_CommandWin is the box with buttons which launch eechema, pcbnew ...
	m_CommandWin = new WinEDA_CommandFrame(this, ID_MAIN_COMMAND,
				wxPoint(m_LeftWin_Width, 0), wxSize(clientsize.x, m_CommandWin_Height),
				wxNO_BORDER|wxSW_3D);
	m_CommandWin->SetDefaultSize(wxSize(clientsize.x, 100));
	m_CommandWin->SetOrientation(wxLAYOUT_HORIZONTAL);
	m_CommandWin->SetAlignment(wxLAYOUT_TOP);
	m_CommandWin->SetSashVisible(wxSASH_BOTTOM, TRUE);
	m_CommandWin->SetSashVisible(wxSASH_LEFT, TRUE);
	m_CommandWin->SetExtraBorderSize(2);
	m_CommandWin->SetFont(* g_StdFont);

	CreateCommandToolbar();

wxString line;
	msg = wxGetCwd();
	line.Printf( _("Ready\nWorking dir: %s\n"), msg.GetData());
	PrintMsg(line);

	#ifdef KICAD_PYTHON
	PyHandler::GetInstance()->DeclareEvent(wxT("kicad::LoadProject"));
	#endif
}

	/***************/
	/* Destructeur */
	/***************/

WinEDA_MainFrame::~WinEDA_MainFrame(void)
{
	if( m_Parent->m_EDA_Config )
	{
		m_LeftWin_Width = m_LeftWin->GetSize().x;
		m_CommandWin_Height = m_CommandWin->GetSize().y;
		m_Parent->m_EDA_Config->Write(wxT("LeftWinWidth"), m_LeftWin_Width);
		m_Parent->m_EDA_Config->Write(wxT("CommandWinWidth"), m_CommandWin_Height);
	}
}


/*******************************************************/
void WinEDA_MainFrame::PrintMsg(const wxString & text)
/*******************************************************/
/*
imprime le message dans la fenetre des messages
*/
{
	m_DialogWin->SetFont(* g_StdFont);
	m_DialogWin->AppendText(text);
}

/****************************************************/
void WinEDA_MainFrame::OnSashDrag(wxSashEvent& event)
/****************************************************/
/* Resize windows when dragging window borders
*/
{
int w, h;
wxSize newsize;

	if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)
        return;

	GetClientSize(&w, &h);

	switch (event.GetId())
	{
		case ID_LEFT_FRAME:
		{
			m_LeftWin->SetDefaultSize(wxSize(event.GetDragRect().width, -1));
            break;
		}

		case ID_BOTTOM_FRAME:
		{
			newsize = event.GetDragRect().GetSize();
			m_LeftWin->SetDefaultSize(wxSize(w-newsize.x, -1));
 			m_BottomWin->SetDefaultSize(wxSize(-1, newsize.y));
			m_CommandWin->SetDefaultSize(wxSize(-1, h - newsize.y));
			break;
		}

		case ID_MAIN_COMMAND:
		{
			newsize = event.GetDragRect().GetSize();
			m_LeftWin->SetDefaultSize(wxSize(w-newsize.x, -1));
			m_CommandWin->SetDefaultSize(wxSize(-1, newsize.y));
			m_BottomWin->SetDefaultSize(wxSize(-1, h - newsize.y));
			break;
		}
	}
	wxLayoutAlgorithm layout;
    layout.LayoutFrame(this);
}

/************************************************/
void WinEDA_MainFrame::OnSize(wxSizeEvent& event)
/************************************************/
{
	if (m_CommandWin && m_BottomWin)
	{
		int w, h, dy;
		wxSize bsize, hsize;
		GetClientSize(&w, &h);
		bsize = m_BottomWin->GetSize();
		hsize = m_CommandWin->GetSize();
		dy = h - hsize.y;
		if ( dy < 50 )
		{
			dy = 50;
			hsize.y = h - dy;
		}
		m_CommandWin->SetDefaultSize(wxSize(-1, hsize.y));
		m_BottomWin->SetDefaultSize(wxSize(-1, dy));
	};

	wxLayoutAlgorithm layout;
	layout.LayoutFrame(this);
	if ( m_CommandWin ) m_CommandWin->Refresh(TRUE);
}


/**********************************************************/
void WinEDA_MainFrame::OnCloseWindow(wxCloseEvent & Event)
/**********************************************************/
{
int px, py;

	SetLastProject(m_PrjFileName);

	if ( ! IsIconized() )
		{
		/* Memorisation position sur l'ecran */
		GetPosition(&px, &py);
		m_FramePos.x = px;
		m_FramePos.y = py;

		/* Memorisation dimension de la fenetre */
		GetSize(&px, &py);
		m_FrameSize.x = px;
		m_FrameSize.y = py;
		}

	Event.SetCanVeto(TRUE);

	SaveSettings();

	// Close the help frame
	if ( m_Parent->m_HtmlCtrl )
		{
		if ( m_Parent->m_HtmlCtrl->GetFrame() ) // returns NULL if no help frame active
			m_Parent->m_HtmlCtrl->GetFrame()->Close(TRUE);
		m_Parent->m_HtmlCtrl = NULL;
		}

	Destroy();
}


/**********************************************************/
void WinEDA_MainFrame::OnPaint(wxPaintEvent & event)
/**********************************************************/
{
	event.Skip();
}

/*******************************************/
void WinEDA_MainFrame::ReDraw(wxDC * DC)
/*******************************************/
{
}



/**********************************************************************/
void WinEDA_MainFrame::Process_Special_Functions(wxCommandEvent& event)
/**********************************************************************/
{
int id = event.GetId();

	switch ( id )
		{
		case ID_EXIT :
			Close(TRUE);
			break;

		default:
			DisplayError(this, wxT("WinEDA_MainFrame::Process_Special_Functions error"));
			break;
		}
}


/********************************************************/
void WinEDA_MainFrame::Process_Fct(wxCommandEvent& event)
/*********************************************************/
{
int id = event.GetId();
wxString FullFileName = m_PrjFileName;


	switch (id)
	{
		case ID_TO_PCB:
			ChangeFileNameExt(FullFileName, g_BoardExtBuffer);
			AddDelimiterString(FullFileName);
			ExecuteFile(this, PCBNEW_EXE, FullFileName);
			break;

		case ID_TO_CVPCB:
			ChangeFileNameExt(FullFileName, g_NetlistExtBuffer);
			AddDelimiterString(FullFileName);
			ExecuteFile(this, CVPCB_EXE, FullFileName);
			break;

		case ID_TO_EESCHEMA:
			ChangeFileNameExt(FullFileName, g_SchExtBuffer);
			AddDelimiterString(FullFileName);
			ExecuteFile(this, EESCHEMA_EXE, FullFileName);
			break;

		case ID_TO_GERBVIEW:
			FullFileName = wxGetCwd() + STRING_DIR_SEP;
			AddDelimiterString(FullFileName);
			ExecuteFile(this, GERBVIEW_EXE, FullFileName);
			break;

		case ID_TO_EDITOR:
		{
			wxString editorname = GetEditorName();
			if ( !editorname.IsEmpty() )
				ExecuteFile(this, editorname, wxEmptyString);
		}
			break;

#ifdef KICAD_PYTHON
		case ID_RUN_PYTHON:
		{
			wxString script = EDA_FileSelector( _("Execute Python Script:"),
												wxEmptyString,		  		/* Chemin par defaut */
												wxEmptyString,				/* nom fichier par defaut */
												wxT( ".py" ),			    /* extension par defaut */
												wxT("*.py"), /* Masque d'affichage */
												this,
												wxFD_OPEN,
												FALSE
												);
			if ( script.IsEmpty() ) break;
			PyHandler::GetInstance()->RunScript( script );
		}
			break;
#endif
		case ID_BROWSE_AN_SELECT_FILE:
			{
			wxString mask(wxT("*")), extension;
#ifdef __WINDOWS__
			mask += wxT(".*");
			extension = wxT(".*");
#endif
			FullFileName = EDA_FileSelector( _("Load file:"),
					wxGetCwd(),		  	/* Default path */
					wxEmptyString,		/* default filename */
					extension,			/* default ext. */
					mask,				/* mask for filename filter */
					this,
					wxFD_OPEN,
					TRUE
					);
			if ( ! FullFileName.IsEmpty() )
				{
				AddDelimiterString(FullFileName);
				wxString editorname = GetEditorName();
				if ( ! editorname.IsEmpty() )
					ExecuteFile(this, editorname, FullFileName);
				}
			}
			break;

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


/********************************************************/
void WinEDA_MainFrame::OnRefresh(wxCommandEvent & event )
/********************************************************/
{
	m_LeftWin->ReCreateTreePrj();
}

/*********************************/
void WinEDA_MainFrame::ClearMsg()
/*********************************/
{
	m_DialogWin->Clear();
}

#ifdef KICAD_PYTHON
void WinEDA_MainFrame::OnRefreshPy() { m_LeftWin->ReCreateTreePrj(); }
#endif

