Implemented 3D search path configuration GUI

This commit is contained in:
Cirilo Bernardo 2016-01-18 19:53:35 +11:00
parent 7848b2a52e
commit 54940002f9
5 changed files with 228 additions and 164 deletions

View File

@ -150,20 +150,10 @@ bool S3D_FILENAME_RESOLVER::createPathList( void )
lpath.m_description = _( "Current project directory" ); lpath.m_description = _( "Current project directory" );
m_Paths.push_back( lpath ); m_Paths.push_back( lpath );
if( wxGetEnv( wxT( "KISYS3DMOD" ), &kmod ) && !kmod.empty() ) lpath.m_alias = wxT( "KISYS3DMOD" );
{ lpath.m_pathvar = wxT( "${KISYS3DMOD}" );
wxFileName tmp( kmod ); lpath.m_description = _( "Legacy 3D environment path" );
wxString kpath = tmp.GetFullPath(); addPath( lpath );
if( tmp.Normalize() && lpath.m_pathexp.Cmp( kpath ) )
{
lpath.m_alias = wxT( "KISYS3DMOD" );
lpath.m_pathvar = wxT( "${KISYS3DMOD}" );
lpath.m_pathexp = kpath;
lpath.m_description = _( "Legacy 3D environment path" );
addPath( lpath );
}
}
if( !m_ConfigDir.empty() ) if( !m_ConfigDir.empty() )
readPathList(); readPathList();
@ -499,6 +489,10 @@ bool S3D_FILENAME_RESOLVER::readPathList( void )
if( !getHollerith( cfgLine, idx, al.m_alias ) ) if( !getHollerith( cfgLine, idx, al.m_alias ) )
continue; continue;
// never add on KISYS3DMOD from a config file
if( !al.m_alias.Cmp( wxT( "KISYS3DMOD" ) ) )
continue;
if( !getHollerith( cfgLine, idx, al.m_pathvar ) ) if( !getHollerith( cfgLine, idx, al.m_pathvar ) )
continue; continue;
@ -524,16 +518,40 @@ bool S3D_FILENAME_RESOLVER::writePathList( void )
std::cerr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; std::cerr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = _( "3D configuration directory is unknown" ); wxString errmsg = _( "3D configuration directory is unknown" );
std::cerr << " * " << errmsg.ToUTF8() << "\n"; std::cerr << " * " << errmsg.ToUTF8() << "\n";
wxMessageBox( errmsg, _T( "Write 3D search path list" ) );
return false; return false;
} }
if( m_Paths.empty() || 1 == m_Paths.size() )
return false;
wxFileName cfgpath( m_ConfigDir, S3D_RESOLVER_CONFIG ); wxFileName cfgpath( m_ConfigDir, S3D_RESOLVER_CONFIG );
wxString cfgname = cfgpath.GetFullPath(); wxString cfgname = cfgpath.GetFullPath();
std::ofstream cfgFile; std::ofstream cfgFile;
if( m_Paths.empty() || 1 == m_Paths.size() )
{
wxMessageDialog md( NULL,
_T( "3D search path list is empty;\ncontinue to write empty file?" ),
_T( "Write 3D search path list" ), wxYES_NO );
if( md.ShowModal() == wxID_YES )
{
cfgFile.open( cfgname.ToUTF8(), std::ios_base::trunc );
if( !cfgFile.is_open() )
{
wxMessageBox( _T( "Could not open configuration file" ),
_T( "Write 3D search path list" ) );
return false;
}
cfgFile.close();
return true;
}
return false;
}
cfgFile.open( cfgname.ToUTF8(), std::ios_base::trunc ); cfgFile.open( cfgname.ToUTF8(), std::ios_base::trunc );
if( !cfgFile.is_open() ) if( !cfgFile.is_open() )
@ -541,6 +559,9 @@ bool S3D_FILENAME_RESOLVER::writePathList( void )
std::cerr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; std::cerr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
wxString errmsg = _( "could not open configuration file " ); wxString errmsg = _( "could not open configuration file " );
std::cerr << " * " << errmsg.ToUTF8() << " '" << cfgname.ToUTF8() << "'\n"; std::cerr << " * " << errmsg.ToUTF8() << " '" << cfgname.ToUTF8() << "'\n";
wxMessageBox( _T( "Could not open configuration file" ),
_T( "Write 3D search path list" ) );
return false; return false;
} }
@ -554,6 +575,13 @@ bool S3D_FILENAME_RESOLVER::writePathList( void )
while( sPL != ePL ) while( sPL != ePL )
{ {
// never write the KISYS3DMOD entry
if( !sPL->m_alias.Cmp( wxT( "KISYS3DMOD") ) )
{
++sPL;
continue;
}
tstr = sPL->m_alias.ToUTF8(); tstr = sPL->m_alias.ToUTF8();
cfgFile << "\"" << tstr.size() << ":" << tstr << "\","; cfgFile << "\"" << tstr.size() << ":" << tstr << "\",";
tstr = sPL->m_pathvar.ToUTF8(); tstr = sPL->m_pathvar.ToUTF8();
@ -567,7 +595,12 @@ bool S3D_FILENAME_RESOLVER::writePathList( void )
cfgFile.close(); cfgFile.close();
if( bad ) if( bad )
{
wxMessageBox( _T( "Problems writing configuration file" ),
_T( "Write 3D search path list" ) );
return false; return false;
}
return true; return true;
} }

View File

@ -29,6 +29,10 @@ DLG_3D_PATH_CONFIG::DLG_3D_PATH_CONFIG( wxWindow* aParent, S3D_FILENAME_RESOLVER
DLG_3D_PATH_CONFIG_BASE( aParent ), m_resolver( aResolver ) DLG_3D_PATH_CONFIG_BASE( aParent ), m_resolver( aResolver )
{ {
m_Aliases->EnableEditing( true ); m_Aliases->EnableEditing( true );
m_Aliases->SetColMinimalWidth( 0, 80 );
m_Aliases->SetColMinimalWidth( 1, 300 );
m_Aliases->SetColMinimalWidth( 2, 120 );
m_Aliases->SetColMinimalAcceptableWidth( 80 );
if( m_resolver ) if( m_resolver )
{ {
@ -42,10 +46,10 @@ DLG_3D_PATH_CONFIG::DLG_3D_PATH_CONFIG( wxWindow* aParent, S3D_FILENAME_RESOLVER
if( listsize > 0 ) if( listsize > 0 )
m_curdir = rpaths->front().m_pathexp; m_curdir = rpaths->front().m_pathexp;
if( listsize < 2 ) if( listsize < 3 )
return; return;
listsize = listsize - 1 - m_Aliases->GetNumberRows(); listsize = listsize - 2 - m_Aliases->GetNumberRows();
// note: if the list allocation fails we have bigger problems // note: if the list allocation fails we have bigger problems
// and there is no point in trying to notify the user here // and there is no point in trying to notify the user here
@ -56,7 +60,9 @@ DLG_3D_PATH_CONFIG::DLG_3D_PATH_CONFIG( wxWindow* aParent, S3D_FILENAME_RESOLVER
std::list< S3D_ALIAS >::const_iterator eL = rpaths->end(); std::list< S3D_ALIAS >::const_iterator eL = rpaths->end();
int nitems = 0; int nitems = 0;
// skip the first entry which is always the current project dir // skip the first 2 entries which are always the current project dir
// and KISYS3DMOD
++sL;
++sL; ++sL;
wxGridCellTextEditor* pEdAlias; wxGridCellTextEditor* pEdAlias;
@ -74,10 +80,9 @@ DLG_3D_PATH_CONFIG::DLG_3D_PATH_CONFIG( wxWindow* aParent, S3D_FILENAME_RESOLVER
++sL; ++sL;
} }
m_Aliases->AutoSizeColumns(); m_Aliases->AutoSize();
} }
Layout();
Fit(); Fit();
SetMinSize( GetSize() ); SetMinSize( GetSize() );
@ -88,7 +93,12 @@ DLG_3D_PATH_CONFIG::DLG_3D_PATH_CONFIG( wxWindow* aParent, S3D_FILENAME_RESOLVER
bool DLG_3D_PATH_CONFIG::TransferDataFromWindow() bool DLG_3D_PATH_CONFIG::TransferDataFromWindow()
{ {
if( NULL == m_resolver ) if( NULL == m_resolver )
{
wxMessageBox( _T( "[BUG] No valid resolver; data will not be updated" ),
_T( "Update 3D search path list" ) );
return false; return false;
}
std::vector<S3D_ALIAS> alist; std::vector<S3D_ALIAS> alist;
S3D_ALIAS alias; S3D_ALIAS alias;
@ -129,6 +139,8 @@ void DLG_3D_PATH_CONFIG::OnAddAlias( wxCommandEvent& event )
pEdAlias->SetValidator( m_aliasValidator ); pEdAlias->SetValidator( m_aliasValidator );
pEdAlias->DecRef(); pEdAlias->DecRef();
m_Aliases->SelectRow( ni, false ); m_Aliases->SelectRow( ni, false );
m_Aliases->AutoSize();
Fit();
// TODO: set the editors on any newly created rows // TODO: set the editors on any newly created rows
} }
@ -164,6 +176,8 @@ void DLG_3D_PATH_CONFIG::OnDelAlias( wxCommandEvent& event )
ni = m_Aliases->GetNumberRows() - 1; ni = m_Aliases->GetNumberRows() - 1;
m_Aliases->SelectRow( ni, false ); m_Aliases->SelectRow( ni, false );
m_Aliases->AutoSize();
Fit();
} }
else else
{ {

View File

@ -16,6 +16,9 @@ DLG_3D_PATH_CONFIG_BASE::DLG_3D_PATH_CONFIG_BASE( wxWindow* parent, wxWindowID i
wxBoxSizer* bSizer1; wxBoxSizer* bSizer1;
bSizer1 = new wxBoxSizer( wxVERTICAL ); bSizer1 = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* bSizer3;
bSizer3 = new wxBoxSizer( wxHORIZONTAL );
m_Aliases = new wxGrid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); m_Aliases = new wxGrid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
// Grid // Grid
@ -26,7 +29,6 @@ DLG_3D_PATH_CONFIG_BASE::DLG_3D_PATH_CONFIG_BASE( wxWindow* parent, wxWindowID i
m_Aliases->SetMargins( 0, 0 ); m_Aliases->SetMargins( 0, 0 );
// Columns // Columns
m_Aliases->AutoSizeColumns();
m_Aliases->EnableDragColMove( false ); m_Aliases->EnableDragColMove( false );
m_Aliases->EnableDragColSize( true ); m_Aliases->EnableDragColSize( true );
m_Aliases->SetColLabelSize( 30 ); m_Aliases->SetColLabelSize( 30 );
@ -36,7 +38,8 @@ DLG_3D_PATH_CONFIG_BASE::DLG_3D_PATH_CONFIG_BASE( wxWindow* parent, wxWindowID i
m_Aliases->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); m_Aliases->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
// Rows // Rows
m_Aliases->EnableDragRowSize( true ); m_Aliases->AutoSizeRows();
m_Aliases->EnableDragRowSize( false );
m_Aliases->SetRowLabelSize( 80 ); m_Aliases->SetRowLabelSize( 80 );
m_Aliases->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); m_Aliases->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
@ -44,7 +47,10 @@ DLG_3D_PATH_CONFIG_BASE::DLG_3D_PATH_CONFIG_BASE( wxWindow* parent, wxWindowID i
// Cell Defaults // Cell Defaults
m_Aliases->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP ); m_Aliases->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
bSizer1->Add( m_Aliases, 0, wxALL, 5 ); bSizer3->Add( m_Aliases, 1, wxALL|wxEXPAND, 5 );
bSizer1->Add( bSizer3, 1, wxEXPAND, 5 );
wxBoxSizer* bSizer2; wxBoxSizer* bSizer2;
bSizer2 = new wxBoxSizer( wxHORIZONTAL ); bSizer2 = new wxBoxSizer( wxHORIZONTAL );

View File

@ -95,145 +95,156 @@
<property name="permission">none</property> <property name="permission">none</property>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxALL</property> <property name="flag">wxEXPAND</property>
<property name="proportion">0</property> <property name="proportion">1</property>
<object class="wxGrid" expanded="1"> <object class="wxBoxSizer" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="autosize_cols">1</property>
<property name="autosize_rows">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="cell_bg"></property>
<property name="cell_font"></property>
<property name="cell_horiz_alignment">wxALIGN_LEFT</property>
<property name="cell_text"></property>
<property name="cell_vert_alignment">wxALIGN_TOP</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="col_label_horiz_alignment">wxALIGN_CENTRE</property>
<property name="col_label_size">30</property>
<property name="col_label_values">&quot;Alias&quot; &quot;Path&quot; &quot;Description&quot;</property>
<property name="col_label_vert_alignment">wxALIGN_CENTRE</property>
<property name="cols">3</property>
<property name="column_sizes"></property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_col_move">0</property>
<property name="drag_col_size">1</property>
<property name="drag_grid_size">0</property>
<property name="drag_row_size">1</property>
<property name="editing">1</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="grid_line_color"></property>
<property name="grid_lines">1</property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label_bg"></property>
<property name="label_font"></property>
<property name="label_text"></property>
<property name="margin_height">0</property>
<property name="margin_width">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property> <property name="minimum_size"></property>
<property name="moveable">1</property> <property name="name">bSizer3</property>
<property name="name">m_Aliases</property> <property name="orient">wxHORIZONTAL</property>
<property name="pane_border">1</property> <property name="permission">none</property>
<property name="pane_position"></property> <object class="sizeritem" expanded="1">
<property name="pane_size"></property> <property name="border">5</property>
<property name="permission">protected</property> <property name="flag">wxALL|wxEXPAND</property>
<property name="pin_button">1</property> <property name="proportion">1</property>
<property name="pos"></property> <object class="wxGrid" expanded="1">
<property name="resize">Resizable</property> <property name="BottomDockable">1</property>
<property name="row_label_horiz_alignment">wxALIGN_CENTRE</property> <property name="LeftDockable">1</property>
<property name="row_label_size">80</property> <property name="RightDockable">1</property>
<property name="row_label_values"></property> <property name="TopDockable">1</property>
<property name="row_label_vert_alignment">wxALIGN_CENTRE</property> <property name="aui_layer"></property>
<property name="row_sizes"></property> <property name="aui_name"></property>
<property name="rows">1</property> <property name="aui_position"></property>
<property name="show">1</property> <property name="aui_row"></property>
<property name="size"></property> <property name="autosize_cols">0</property>
<property name="subclass"></property> <property name="autosize_rows">1</property>
<property name="toolbar_pane">0</property> <property name="best_size"></property>
<property name="tooltip"></property> <property name="bg"></property>
<property name="window_extra_style"></property> <property name="caption"></property>
<property name="window_name"></property> <property name="caption_visible">1</property>
<property name="window_style"></property> <property name="cell_bg"></property>
<event name="OnChar"></event> <property name="cell_font"></property>
<event name="OnEnterWindow"></event> <property name="cell_horiz_alignment">wxALIGN_LEFT</property>
<event name="OnEraseBackground"></event> <property name="cell_text"></property>
<event name="OnGridCellChange"></event> <property name="cell_vert_alignment">wxALIGN_TOP</property>
<event name="OnGridCellLeftClick"></event> <property name="center_pane">0</property>
<event name="OnGridCellLeftDClick"></event> <property name="close_button">1</property>
<event name="OnGridCellRightClick"></event> <property name="col_label_horiz_alignment">wxALIGN_CENTRE</property>
<event name="OnGridCellRightDClick"></event> <property name="col_label_size">30</property>
<event name="OnGridCmdCellChange"></event> <property name="col_label_values">&quot;Alias&quot; &quot;Path&quot; &quot;Description&quot;</property>
<event name="OnGridCmdCellLeftClick"></event> <property name="col_label_vert_alignment">wxALIGN_CENTRE</property>
<event name="OnGridCmdCellLeftDClick"></event> <property name="cols">3</property>
<event name="OnGridCmdCellRightClick"></event> <property name="column_sizes"></property>
<event name="OnGridCmdCellRightDClick"></event> <property name="context_help"></property>
<event name="OnGridCmdColSize"></event> <property name="context_menu">1</property>
<event name="OnGridCmdEditorCreated"></event> <property name="default_pane">0</property>
<event name="OnGridCmdEditorHidden"></event> <property name="dock">Dock</property>
<event name="OnGridCmdEditorShown"></event> <property name="dock_fixed">0</property>
<event name="OnGridCmdLabelLeftClick"></event> <property name="docking">Left</property>
<event name="OnGridCmdLabelLeftDClick"></event> <property name="drag_col_move">0</property>
<event name="OnGridCmdLabelRightClick"></event> <property name="drag_col_size">1</property>
<event name="OnGridCmdLabelRightDClick"></event> <property name="drag_grid_size">0</property>
<event name="OnGridCmdRangeSelect"></event> <property name="drag_row_size">0</property>
<event name="OnGridCmdRowSize"></event> <property name="editing">1</property>
<event name="OnGridCmdSelectCell"></event> <property name="enabled">1</property>
<event name="OnGridColSize"></event> <property name="fg"></property>
<event name="OnGridEditorCreated"></event> <property name="floatable">1</property>
<event name="OnGridEditorHidden"></event> <property name="font"></property>
<event name="OnGridEditorShown"></event> <property name="grid_line_color"></property>
<event name="OnGridLabelLeftClick"></event> <property name="grid_lines">1</property>
<event name="OnGridLabelLeftDClick"></event> <property name="gripper">0</property>
<event name="OnGridLabelRightClick"></event> <property name="hidden">0</property>
<event name="OnGridLabelRightDClick"></event> <property name="id">wxID_ANY</property>
<event name="OnGridRangeSelect"></event> <property name="label_bg"></property>
<event name="OnGridRowSize"></event> <property name="label_font"></property>
<event name="OnGridSelectCell"></event> <property name="label_text"></property>
<event name="OnKeyDown"></event> <property name="margin_height">0</property>
<event name="OnKeyUp"></event> <property name="margin_width">0</property>
<event name="OnKillFocus"></event> <property name="max_size"></property>
<event name="OnLeaveWindow"></event> <property name="maximize_button">0</property>
<event name="OnLeftDClick"></event> <property name="maximum_size"></property>
<event name="OnLeftDown"></event> <property name="min_size"></property>
<event name="OnLeftUp"></event> <property name="minimize_button">0</property>
<event name="OnMiddleDClick"></event> <property name="minimum_size"></property>
<event name="OnMiddleDown"></event> <property name="moveable">1</property>
<event name="OnMiddleUp"></event> <property name="name">m_Aliases</property>
<event name="OnMotion"></event> <property name="pane_border">1</property>
<event name="OnMouseEvents"></event> <property name="pane_position"></property>
<event name="OnMouseWheel"></event> <property name="pane_size"></property>
<event name="OnPaint"></event> <property name="permission">protected</property>
<event name="OnRightDClick"></event> <property name="pin_button">1</property>
<event name="OnRightDown"></event> <property name="pos"></property>
<event name="OnRightUp"></event> <property name="resize">Resizable</property>
<event name="OnSetFocus"></event> <property name="row_label_horiz_alignment">wxALIGN_CENTRE</property>
<event name="OnSize"></event> <property name="row_label_size">80</property>
<event name="OnUpdateUI"></event> <property name="row_label_values"></property>
<property name="row_label_vert_alignment">wxALIGN_CENTRE</property>
<property name="row_sizes"></property>
<property name="rows">1</property>
<property name="show">1</property>
<property name="size"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnGridCellChange"></event>
<event name="OnGridCellLeftClick"></event>
<event name="OnGridCellLeftDClick"></event>
<event name="OnGridCellRightClick"></event>
<event name="OnGridCellRightDClick"></event>
<event name="OnGridCmdCellChange"></event>
<event name="OnGridCmdCellLeftClick"></event>
<event name="OnGridCmdCellLeftDClick"></event>
<event name="OnGridCmdCellRightClick"></event>
<event name="OnGridCmdCellRightDClick"></event>
<event name="OnGridCmdColSize"></event>
<event name="OnGridCmdEditorCreated"></event>
<event name="OnGridCmdEditorHidden"></event>
<event name="OnGridCmdEditorShown"></event>
<event name="OnGridCmdLabelLeftClick"></event>
<event name="OnGridCmdLabelLeftDClick"></event>
<event name="OnGridCmdLabelRightClick"></event>
<event name="OnGridCmdLabelRightDClick"></event>
<event name="OnGridCmdRangeSelect"></event>
<event name="OnGridCmdRowSize"></event>
<event name="OnGridCmdSelectCell"></event>
<event name="OnGridColSize"></event>
<event name="OnGridEditorCreated"></event>
<event name="OnGridEditorHidden"></event>
<event name="OnGridEditorShown"></event>
<event name="OnGridLabelLeftClick"></event>
<event name="OnGridLabelLeftDClick"></event>
<event name="OnGridLabelRightClick"></event>
<event name="OnGridLabelRightDClick"></event>
<event name="OnGridRangeSelect"></event>
<event name="OnGridRowSize"></event>
<event name="OnGridSelectCell"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object> </object>
</object> </object>
<object class="sizeritem" expanded="1"> <object class="sizeritem" expanded="1">

View File

@ -20,8 +20,8 @@ class DIALOG_SHIM;
#include <wx/font.h> #include <wx/font.h>
#include <wx/grid.h> #include <wx/grid.h>
#include <wx/gdicmn.h> #include <wx/gdicmn.h>
#include <wx/button.h>
#include <wx/sizer.h> #include <wx/sizer.h>
#include <wx/button.h>
#include <wx/frame.h> #include <wx/frame.h>
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////