// headers, declarations, constants
// ==========================================================================
-#ifdef __GNUG__
- #pragma implementation "life.h"
-#endif
-
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#include "wx/statline.h"
#include "wx/wfstream.h"
#include "wx/filedlg.h"
+#include "wx/stockitem.h"
#include "life.h"
#include "game.h"
// --------------------------------------------------------------------------
// IDs for the controls and the menu commands. Exluding those already defined
-// by wxWindows, such as wxID_NEW.
+// by wxWidgets, such as wxID_NEW.
enum
{
// timer
ID_SOUTH,
ID_EAST,
ID_WEST,
- ID_ZOOMIN,
- ID_ZOOMOUT,
ID_INFO,
// game menu
ID_START,
ID_STEP,
- ID_STOP,
ID_TOPSPEED,
// speed selection slider
};
// --------------------------------------------------------------------------
-// event tables and other macros for wxWindows
+// event tables and other macros for wxWidgets
// --------------------------------------------------------------------------
// Event tables
BEGIN_EVENT_TABLE(LifeFrame, wxFrame)
- EVT_MENU (wxID_NEW, LifeFrame::OnMenu)
- EVT_MENU (wxID_OPEN, LifeFrame::OnOpen)
- EVT_MENU (ID_SAMPLES, LifeFrame::OnSamples)
- EVT_MENU (wxID_ABOUT, LifeFrame::OnMenu)
- EVT_MENU (wxID_EXIT, LifeFrame::OnMenu)
- EVT_MENU (ID_SHOWNAV, LifeFrame::OnMenu)
- EVT_MENU (ID_ORIGIN, LifeFrame::OnNavigate)
- EVT_BUTTON (ID_CENTER, LifeFrame::OnNavigate)
- EVT_BUTTON (ID_NORTH, LifeFrame::OnNavigate)
- EVT_BUTTON (ID_SOUTH, LifeFrame::OnNavigate)
- EVT_BUTTON (ID_EAST, LifeFrame::OnNavigate)
- EVT_BUTTON (ID_WEST, LifeFrame::OnNavigate)
- EVT_MENU (ID_ZOOMIN, LifeFrame::OnZoom)
- EVT_MENU (ID_ZOOMOUT, LifeFrame::OnZoom)
- EVT_MENU (ID_INFO, LifeFrame::OnMenu)
- EVT_MENU (ID_START, LifeFrame::OnMenu)
- EVT_MENU (ID_STEP, LifeFrame::OnMenu)
- EVT_MENU (ID_STOP, LifeFrame::OnMenu)
- EVT_MENU (ID_TOPSPEED, LifeFrame::OnMenu)
- EVT_COMMAND_SCROLL (ID_SLIDER, LifeFrame::OnSlider)
- EVT_TIMER (ID_TIMER, LifeFrame::OnTimer)
- EVT_CLOSE ( LifeFrame::OnClose)
+ EVT_MENU (wxID_NEW, LifeFrame::OnMenu)
+#if wxUSE_FILEDLG
+ EVT_MENU (wxID_OPEN, LifeFrame::OnOpen)
+#endif
+ EVT_MENU (ID_SAMPLES, LifeFrame::OnSamples)
+ EVT_MENU (wxID_ABOUT, LifeFrame::OnMenu)
+ EVT_MENU (wxID_EXIT, LifeFrame::OnMenu)
+ EVT_MENU (ID_SHOWNAV, LifeFrame::OnMenu)
+ EVT_MENU (ID_ORIGIN, LifeFrame::OnNavigate)
+ EVT_BUTTON (ID_CENTER, LifeFrame::OnNavigate)
+ EVT_BUTTON (ID_NORTH, LifeFrame::OnNavigate)
+ EVT_BUTTON (ID_SOUTH, LifeFrame::OnNavigate)
+ EVT_BUTTON (ID_EAST, LifeFrame::OnNavigate)
+ EVT_BUTTON (ID_WEST, LifeFrame::OnNavigate)
+ EVT_MENU (wxID_ZOOM_IN, LifeFrame::OnZoom)
+ EVT_MENU (wxID_ZOOM_OUT,LifeFrame::OnZoom)
+ EVT_MENU (ID_INFO, LifeFrame::OnMenu)
+ EVT_MENU (ID_START, LifeFrame::OnMenu)
+ EVT_MENU (ID_STEP, LifeFrame::OnMenu)
+ EVT_MENU (wxID_STOP, LifeFrame::OnMenu)
+ EVT_MENU (ID_TOPSPEED, LifeFrame::OnMenu)
+ EVT_COMMAND_SCROLL (ID_SLIDER, LifeFrame::OnSlider)
+ EVT_TIMER (ID_TIMER, LifeFrame::OnTimer)
+ EVT_CLOSE ( LifeFrame::OnClose)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(LifeNavigator, wxMiniFrame)
// some shortcuts
#define ADD_TOOL(id, bmp, tooltip, help) \
- toolBar->AddTool(id, bmp, wxNullBitmap, false, -1, -1, (wxObject *)0, tooltip, help)
+ toolBar->AddTool(id, bmp, wxNullBitmap, false, wxDefaultCoord, wxDefaultCoord, (wxObject *)NULL, tooltip, help)
// --------------------------------------------------------------------------
// --------------------------------------------------------------------------
// frame constructor
-LifeFrame::LifeFrame() : wxFrame( (wxFrame *) NULL, wxID_ANY,
- _("Life!"), wxPoint(200, 200) )
+LifeFrame::LifeFrame() :
+ wxFrame( (wxFrame *) NULL, wxID_ANY, _("Life!"), wxDefaultPosition ),
+ m_navigator(NULL)
{
// frame icon
SetIcon(wxICON(mondrian));
wxMenu *menuGame = new wxMenu(wxMENU_TEAROFF);
wxMenu *menuHelp = new wxMenu(wxMENU_TEAROFF);
- menuFile->Append(wxID_NEW, _("&New"), _("Start a new game"));
- menuFile->Append(wxID_OPEN, _("&Open..."), _("Open an existing Life pattern"));
+ menuFile->Append(wxID_NEW, wxEmptyString, _("Start a new game"));
+#if wxUSE_FILEDLG
+ menuFile->Append(wxID_OPEN, wxEmptyString, _("Open an existing Life pattern"));
+#endif
menuFile->Append(ID_SAMPLES, _("&Sample game..."), _("Select a sample configuration"));
+#if ! (defined(__SMARTPHONE__) || defined(__POCKETPC__))
menuFile->AppendSeparator();
- menuFile->Append(wxID_EXIT, _("E&xit\tAlt-X"), _("Quit this program"));
+ menuFile->Append(wxID_EXIT);
menuView->Append(ID_SHOWNAV, _("Navigation &toolbox"), _("Show or hide toolbox"), wxITEM_CHECK);
menuView->Check(ID_SHOWNAV, true);
menuView->AppendSeparator();
+#endif
+
menuView->Append(ID_ORIGIN, _("&Absolute origin"), _("Go to (0, 0)"));
menuView->Append(ID_CENTER, _("&Center of mass"), _("Find center of mass"));
menuView->Append(ID_NORTH, _("&North"), _("Find northernmost cell"));
menuView->Append(ID_EAST, _("&East"), _("Find easternmost cell"));
menuView->Append(ID_WEST, _("&West"), _("Find westernmost cell"));
menuView->AppendSeparator();
- menuView->Append(ID_ZOOMIN, _("Zoom &in\tCtrl-I"), _("Zoom in"));
- menuView->Append(ID_ZOOMOUT, _("Zoom &out\tCtrl-O"), _("Zoom out"));
+ menuView->Append(wxID_ZOOM_IN, wxEmptyString, _("Zoom in"));
+ menuView->Append(wxID_ZOOM_OUT, wxEmptyString, _("Zoom out"));
menuView->Append(ID_INFO, _("&Description\tCtrl-D"), _("View pattern description"));
menuGame->Append(ID_START, _("&Start\tCtrl-S"), _("Start"));
menuGame->Append(ID_STEP, _("&Next\tCtrl-N"), _("Single step"));
- menuGame->Append(ID_STOP, _("S&top\tCtrl-T"), _("Stop"));
- menuGame->Enable(ID_STOP, false);
+ menuGame->Append(wxID_STOP, wxEmptyString, _("Stop"));
+ menuGame->Enable(wxID_STOP, false);
menuGame->AppendSeparator();
menuGame->Append(ID_TOPSPEED, _("T&op speed!"), _("Go as fast as possible"));
toolBar->SetMargins(5, 5);
toolBar->SetToolBitmapSize(wxSize(16, 16));
- ADD_TOOL(wxID_NEW, tbBitmaps[0], _("New"), _("Start a new game"));
- ADD_TOOL(wxID_OPEN, tbBitmaps[1], _("Open"), _("Open an existing Life pattern"));
+ ADD_TOOL(wxID_NEW, tbBitmaps[0], wxGetStockLabel(wxID_NEW, wxSTOCK_NOFLAGS), _("Start a new game"));
+#ifndef __POCKETPC__
+#if wxUSE_FILEDLG
+ ADD_TOOL(wxID_OPEN, tbBitmaps[1], wxGetStockLabel(wxID_OPEN, wxSTOCK_NOFLAGS), _("Open an existing Life pattern"));
+#endif // wxUSE_FILEDLG
+
toolBar->AddSeparator();
- ADD_TOOL(ID_ZOOMIN, tbBitmaps[2], _("Zoom in"), _("Zoom in"));
- ADD_TOOL(ID_ZOOMOUT, tbBitmaps[3], _("Zoom out"), _("Zoom out"));
+ ADD_TOOL(wxID_ZOOM_IN, tbBitmaps[2], wxGetStockLabel(wxID_ZOOM_IN, wxSTOCK_NOFLAGS), _("Zoom in"));
+ ADD_TOOL(wxID_ZOOM_OUT, tbBitmaps[3], wxGetStockLabel(wxID_ZOOM_OUT, wxSTOCK_NOFLAGS), _("Zoom out"));
ADD_TOOL(ID_INFO, tbBitmaps[4], _("Description"), _("Show description"));
toolBar->AddSeparator();
+#endif // __POCKETPC__
ADD_TOOL(ID_START, tbBitmaps[5], _("Start"), _("Start"));
- ADD_TOOL(ID_STOP, tbBitmaps[6], _("Stop"), _("Stop"));
+ ADD_TOOL(wxID_STOP, tbBitmaps[6], _("Stop"), _("Stop"));
toolBar->Realize();
- toolBar->EnableTool(ID_STOP, false); // must be after Realize() !
+ toolBar->EnableTool(wxID_STOP, false); // must be after Realize() !
+#if wxUSE_STATUSBAR
// status bar
CreateStatusBar(2);
SetStatusText(_("Welcome to Life!"));
+#endif // wxUSE_STATUSBAR
// game and timer
m_life = new Life();
wxSlider *slider = new wxSlider(panel2, ID_SLIDER,
5, 1, 10,
wxDefaultPosition,
- wxSize(200, -1),
+ wxSize(200, wxDefaultCoord),
wxSL_HORIZONTAL | wxSL_AUTOTICKS);
UpdateInfoText();
wxBoxSizer *sizer2 = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *sizer3 = new wxBoxSizer(wxVERTICAL);
+#if wxUSE_STATLINE
sizer1->Add( new wxStaticLine(panel1, wxID_ANY), 0, wxGROW );
+#endif // wxUSE_STATLINE
sizer1->Add( m_canvas, 1, wxGROW | wxALL, 2 );
+#if wxUSE_STATLINE
sizer1->Add( new wxStaticLine(panel1, wxID_ANY), 0, wxGROW );
+#endif // wxUSE_STATLINE
panel1->SetSizer( sizer1 );
sizer1->Fit( panel1 );
sizer3->Add( panel1, 1, wxGROW );
sizer3->Add( panel2, 0, wxGROW );
SetSizer( sizer3 );
+
+#ifndef __WXWINCE__
sizer3->Fit( this );
// set minimum frame size
sizer3->SetSizeHints( this );
- // navigator frame
+ // navigator frame - not appropriate for small devices
m_navigator = new LifeNavigator(this);
+#endif
+
}
LifeFrame::~LifeFrame()
{
// start / stop
GetToolBar()->EnableTool(ID_START, !m_running);
- GetToolBar()->EnableTool(ID_STOP, m_running);
+ GetToolBar()->EnableTool(wxID_STOP, m_running);
GetMenuBar()->Enable(ID_START, !m_running);
GetMenuBar()->Enable(ID_STEP, !m_running);
- GetMenuBar()->Enable(ID_STOP, m_running);
+ GetMenuBar()->Enable(wxID_STOP, m_running);
GetMenuBar()->Enable(ID_TOPSPEED, !m_topspeed);
// zooming
int cellsize = m_canvas->GetCellSize();
- GetToolBar()->EnableTool(ID_ZOOMIN, cellsize < 32);
- GetToolBar()->EnableTool(ID_ZOOMOUT, cellsize > 1);
- GetMenuBar()->Enable(ID_ZOOMIN, cellsize < 32);
- GetMenuBar()->Enable(ID_ZOOMOUT, cellsize > 1);
+ GetToolBar()->EnableTool(wxID_ZOOM_IN, cellsize < 32);
+ GetToolBar()->EnableTool(wxID_ZOOM_OUT, cellsize > 1);
+ GetMenuBar()->Enable(wxID_ZOOM_IN, cellsize < 32);
+ GetMenuBar()->Enable(wxID_ZOOM_OUT, cellsize > 1);
}
// Event handlers -----------------------------------------------------------
case ID_SHOWNAV:
{
bool checked = GetMenuBar()->GetMenu(1)->IsChecked(ID_SHOWNAV);
- m_navigator->Show(checked);
+ if (m_navigator)
+ m_navigator->Show(checked);
break;
}
case ID_INFO:
{
wxString desc = m_life->GetDescription();
- if ( desc.IsEmpty() )
+ if ( desc.empty() )
desc = _("Not available");
// should we make the description editable here?
}
case ID_START : OnStart(); break;
case ID_STEP : OnStep(); break;
- case ID_STOP : OnStop(); break;
+ case wxID_STOP : OnStop(); break;
case ID_TOPSPEED:
{
m_running = true;
}
}
+#if wxUSE_FILEDLG
void LifeFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
{
wxFileDialog filedlg(this,
wxEmptyString,
wxEmptyString,
_("Life patterns (*.lif)|*.lif|All files (*.*)|*.*"),
- wxOPEN | wxFILE_MUST_EXIST);
+ wxFD_OPEN | wxFD_FILE_MUST_EXIST);
if (filedlg.ShowModal() == wxID_OK)
{
}
}
}
+#endif
void LifeFrame::OnSamples(wxCommandEvent& WXUNUSED(event))
{
{
int cellsize = m_canvas->GetCellSize();
- if ((event.GetId() == ID_ZOOMIN) && cellsize < 32)
+ if ((event.GetId() == wxID_ZOOM_IN) && cellsize < 32)
{
m_canvas->SetCellSize(cellsize * 2);
UpdateUI();
}
- else if ((event.GetId() == ID_ZOOMOUT) && cellsize > 1)
+ else if ((event.GetId() == wxID_ZOOM_OUT) && cellsize > 1)
{
m_canvas->SetCellSize(cellsize / 2);
UpdateUI();
// canvas constructor
LifeCanvas::LifeCanvas(wxWindow *parent, Life *life, bool interactive)
: wxWindow(parent, wxID_ANY, wxDefaultPosition, wxSize(100, 100),
- wxSUNKEN_BORDER|wxFULL_REPAINT_ON_RESIZE)
+ wxFULL_REPAINT_ON_RESIZE
+#if !defined(__SMARTPHONE__) && !defined(__POCKETPC__)
+ |wxSUNKEN_BORDER
+#else
+ |wxSIMPLE_BORDER
+#endif
+ )
{
m_life = life;
m_interactive = interactive;
dc.SetPen(alive? *wxBLACK_PEN : *wxWHITE_PEN);
dc.SetBrush(alive? *wxBLACK_BRUSH : *wxWHITE_BRUSH);
- dc.BeginDrawing();
DrawCell(i, j, dc);
- dc.EndDrawing();
}
void LifeCanvas::DrawCell(wxInt32 i, wxInt32 j, wxDC &dc)
m_viewportY + m_viewportH,
true);
- dc.BeginDrawing();
-
if (m_cellsize == 1)
{
dc.SetPen(*wxBLACK_PEN);
for (size_t m = 0; m < ncells; m++)
DrawCell(cells[m].i, cells[m].j, dc);
}
- dc.EndDrawing();
}
// event handlers
bool done = m_life->FindMore(&cells, &ncells);
// erase all damaged cells and draw the grid
- dc.BeginDrawing();
dc.SetBrush(*wxWHITE_BRUSH);
if (m_cellsize <= 2)
// last set
for (size_t m = 0; m < ncells; m++)
DrawCell(cells[m].i, cells[m].j, dc);
-
- dc.EndDrawing();
}
void LifeCanvas::OnMouse(wxMouseEvent& event)
wxInt32 i = XToCell( event.GetX() );
wxInt32 j = YToCell( event.GetY() );
+#if wxUSE_STATUSBAR
// set statusbar text
wxString msg;
msg.Printf(_("Cell: (%d, %d)"), i, j);
((LifeFrame *) wxGetApp().GetTopWindow())->SetStatusText(msg, 1);
+#endif // wxUSE_STATUSBAR
// NOTE that wxMouseEvent::LeftDown() and wxMouseEvent::LeftIsDown()
// have different semantics. The first one is used to signal that the
wxClientDC dc(this);
dc.SetPen(alive? *wxBLACK_PEN : *wxWHITE_PEN);
dc.SetBrush(alive? *wxBLACK_BRUSH : *wxWHITE_BRUSH);
- dc.BeginDrawing();
// draw a line of cells using Bresenham's algorithm
wxInt32 d, ii, jj, di, ai, si, dj, aj, sj;
DrawCell(ii, jj, dc);
m_mi = ii;
m_mj = jj;
-
- dc.EndDrawing();
}
((LifeFrame *) wxGetApp().GetTopWindow())->UpdateInfoText();
void LifeCanvas::OnScroll(wxScrollWinEvent& event)
{
- WXTYPE type = event.GetEventType();
+ WXTYPE type = (WXTYPE)event.GetEventType();
int pos = event.GetPosition();
int orient = event.GetOrientation();
{
// do nothing. I just don't want the background to be erased, you know.
}
-
-