1/////////////////////////////////////////////////////////////////////////////
2// Name:        life.h
3// Purpose:     The game of Life, created by J. H. Conway
4// Author:      Guillermo Rodriguez Garcia, <guille@iies.es>
5// Modified by:
6// Created:     Jan/2000
7// RCS-ID:      $Id: life.h 41020 2006-09-05 20:47:48Z VZ $
8// Copyright:   (c) 2000, Guillermo Rodriguez Garcia
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _LIFE_APP_H_
13#define _LIFE_APP_H_
14
15// for compilers that support precompilation, includes "wx/wx.h"
16#include "wx/wxprec.h"
17
18#ifdef __BORLANDC__
19    #pragma hdrstop
20#endif
21
22// for all others, include the necessary headers
23#ifndef WX_PRECOMP
24    #include "wx/wx.h"
25#endif
26
27#include "wx/minifram.h"
28
29#include "game.h"
30
31
32// --------------------------------------------------------------------------
33// LifeCanvas
34// --------------------------------------------------------------------------
35
36// Note that in LifeCanvas, all cell coordinates are
37// named i, j, while screen coordinates are named x, y.
38
39class LifeCanvas : public wxWindow
40{
41public:
42    // ctor and dtor
43    LifeCanvas(wxWindow* parent, Life* life, bool interactive = true);
44    virtual ~LifeCanvas();
45
46    // view management
47    int  GetCellSize() const { return m_cellsize; };
48    void SetCellSize(int cellsize);
49    void Recenter(wxInt32 i, wxInt32 j);
50
51    // drawing
52    void DrawChanged();
53    void DrawCell(wxInt32 i, wxInt32 j, bool alive);
54
55private:
56    // any class wishing to process wxWidgets events must use this macro
57    DECLARE_EVENT_TABLE()
58
59    // draw a cell (parametrized by DC)
60    void DrawCell(wxInt32 i, wxInt32 j, wxDC &dc);
61
62    // event handlers
63    void OnPaint(wxPaintEvent& event);
64    void OnMouse(wxMouseEvent& event);
65    void OnSize(wxSizeEvent& event);
66    void OnScroll(wxScrollWinEvent& event);
67    void OnEraseBackground(wxEraseEvent& event);
68
69    // conversion between cell and screen coordinates
70    inline wxInt32 XToCell(wxCoord x) const { return (x / m_cellsize) + m_viewportX; };
71    inline wxInt32 YToCell(wxCoord y) const { return (y / m_cellsize) + m_viewportY; };
72    inline wxCoord CellToX(wxInt32 i) const { return (i - m_viewportX) * m_cellsize; };
73    inline wxCoord CellToY(wxInt32 j) const { return (j - m_viewportY) * m_cellsize; };
74
75    // what is the user doing?
76    enum MouseStatus
77    {
78        MOUSE_NOACTION,
79        MOUSE_DRAWING,
80        MOUSE_ERASING
81    };
82
83    Life        *m_life;            // Life object
84    int          m_cellsize;        // current cell size, in pixels
85    bool         m_interactive;     // is this canvas interactive?
86    MouseStatus  m_status;          // what is the user doing?
87    wxInt32      m_viewportX;       // first visible cell (x coord)
88    wxInt32      m_viewportY;       // first visible cell (y coord)
89    wxInt32      m_viewportW;       // number of visible cells (w)
90    wxInt32      m_viewportH;       // number of visible cells (h)
91    int          m_thumbX;          // horiz. scrollbar thumb position
92    int          m_thumbY;          // vert. scrollbar thumb position
93    wxInt32      m_mi, m_mj;        // last mouse position
94};
95
96
97// --------------------------------------------------------------------------
98// LifeNavigator
99// --------------------------------------------------------------------------
100
101class LifeNavigator : public wxMiniFrame
102{
103public:
104    // ctor
105    LifeNavigator(wxWindow *parent);
106
107private:
108    // any class wishing to process wxWidgets events must use this macro
109    DECLARE_EVENT_TABLE()
110
111    // event handlers
112    void OnClose(wxCloseEvent& event);
113};
114
115
116// --------------------------------------------------------------------------
117// LifeFrame
118// --------------------------------------------------------------------------
119
120class LifeFrame : public wxFrame
121{
122public:
123    // ctor and dtor
124    LifeFrame();
125    virtual ~LifeFrame();
126
127    // member functions
128    void UpdateInfoText();
129    void UpdateUI();
130
131private:
132    // any class wishing to process wxWidgets events must use this macro
133    DECLARE_EVENT_TABLE()
134
135    // event handlers
136    void OnMenu(wxCommandEvent& event);
137    void OnOpen(wxCommandEvent& event);
138    void OnSamples(wxCommandEvent& event);
139    void OnNavigate(wxCommandEvent& event);
140    void OnZoom(wxCommandEvent& event);
141    void OnSlider(wxScrollEvent& event);
142    void OnTimer(wxTimerEvent& event);
143    void OnClose(wxCloseEvent& event);
144
145    // event handler helpers
146    void OnStart();
147    void OnStop();
148    void OnStep();
149
150    Life           *m_life;
151    LifeCanvas     *m_canvas;
152    LifeNavigator  *m_navigator;
153    wxStaticText   *m_text;
154    wxTimer        *m_timer;
155    bool            m_running;
156    bool            m_topspeed;
157    long            m_interval;
158    long            m_tics;
159};
160
161
162// --------------------------------------------------------------------------
163// LifeApp
164// --------------------------------------------------------------------------
165
166class LifeApp : public wxApp
167{
168public:
169    virtual bool OnInit();
170};
171
172#endif  // _LIFE_APP_H_
173