kicad-source/kicad/mdiframe.cpp

396 lines
9.8 KiB
C++

/******************************************************************/
/* 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