Fixes for wxUSE_STATUSBAR.
[wxWidgets.git] / demos / forty / forty.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: forty.cpp
3 // Purpose: Forty Thieves patience game
4 // Author: Chris Breeze
5 // Modified by:
6 // Created: 21/07/97
7 // RCS-ID: $Id$
8 // Copyright: (c) 1993-1998 Chris Breeze
9 // Licence: wxWindows licence
10 //---------------------------------------------------------------------------
11 // Last modified: 22nd July 1998 - ported to wxWidgets 2.0
12 /////////////////////////////////////////////////////////////////////////////
13
14 #ifdef __GNUG__
15 #pragma implementation
16 #pragma interface
17 #endif
18
19 // For compilers that support precompilation, includes "wx/wx.h".
20 #include "wx/wxprec.h"
21
22 #ifdef __BORLANDC__
23 #pragma hdrstop
24 #endif
25
26 #ifndef WX_PRECOMP
27 #include "wx/wx.h"
28 #endif
29
30 #include "canvas.h"
31 #include "forty.h"
32 #include "card.h"
33 #include "scoredg.h"
34
35 #if wxUSE_HTML
36 #include "wx/file.h"
37 #include "wx/html/htmlwin.h"
38 #endif
39
40 BEGIN_EVENT_TABLE(FortyFrame, wxFrame)
41 EVT_MENU(NEW_GAME, FortyFrame::NewGame)
42 EVT_MENU(wxID_EXIT, FortyFrame::Exit)
43 EVT_MENU(wxID_ABOUT, FortyFrame::About)
44 EVT_MENU(wxID_HELP_CONTENTS, FortyFrame::Help)
45 EVT_MENU(UNDO, FortyFrame::Undo)
46 EVT_MENU(REDO, FortyFrame::Redo)
47 EVT_MENU(SCORES, FortyFrame::Scores)
48 EVT_MENU(RIGHT_BUTTON_UNDO, FortyFrame::ToggleRightButtonUndo)
49 EVT_MENU(HELPING_HAND, FortyFrame::ToggleHelpingHand)
50 EVT_MENU(LARGE_CARDS, FortyFrame::ToggleCardSize)
51 EVT_CLOSE(FortyFrame::OnCloseWindow)
52 END_EVENT_TABLE()
53
54 // Create a new application object
55 IMPLEMENT_APP (FortyApp)
56
57 wxColour* FortyApp::m_backgroundColour = 0;
58 wxColour* FortyApp::m_textColour = 0;
59 wxBrush* FortyApp::m_backgroundBrush = 0;
60
61 FortyApp::FortyApp()
62 {
63 }
64
65 FortyApp::~FortyApp()
66 {
67 delete m_backgroundColour;
68 delete m_textColour;
69 delete m_backgroundBrush;
70 delete Card::m_symbolBmap;
71 delete Card::m_pictureBmap;
72
73 }
74
75 bool FortyApp::OnInit()
76 {
77 bool largecards = false;
78
79 wxSize size(668,510);
80
81 if ((argc > 1) && (!wxStrcmp(argv[1],_T("-L"))))
82 {
83 largecards = true;
84 size = wxSize(1000,750);
85 }
86
87 FortyFrame* frame = new FortyFrame(
88 0,
89 _T("Forty Thieves"),
90 wxDefaultPosition,
91 size,
92 largecards
93 );
94
95 // Show the frame
96 frame->Show(true);
97
98 frame->GetCanvas()->ShowPlayerDialog();
99
100 return true;
101 }
102
103 const wxColour& FortyApp::BackgroundColour()
104 {
105 if (!m_backgroundColour)
106 {
107 m_backgroundColour = new wxColour(0, 128, 0);
108 }
109
110 return *m_backgroundColour;
111 }
112
113 const wxBrush& FortyApp::BackgroundBrush()
114 {
115 if (!m_backgroundBrush)
116 {
117 m_backgroundBrush = new wxBrush(BackgroundColour(), wxSOLID);
118 }
119
120 return *m_backgroundBrush;
121 }
122
123 const wxColour& FortyApp::TextColour()
124 {
125 if (!m_textColour)
126 {
127 m_textColour = new wxColour(_T("BLACK"));
128 }
129
130 return *m_textColour;
131 }
132
133 // My frame constructor
134 FortyFrame::FortyFrame(wxFrame* frame, const wxString& title, const wxPoint& pos, const wxSize& size, bool largecards):
135 wxFrame(frame, wxID_ANY, title, pos, size)
136 {
137 #ifdef __WXMAC__
138 wxApp::s_macAboutMenuItemId = wxID_ABOUT ;
139 #endif
140 // set the icon
141 #ifdef __WXMSW__
142 SetIcon(wxIcon(_T("CardsIcon")));
143 #else
144 #ifdef GTK_TBD
145 SetIcon(wxIcon(Cards_bits, Cards_width, Cards_height));
146 #endif
147 #endif
148
149 // Make a menu bar
150 wxMenu* gameMenu = new wxMenu;
151 gameMenu->Append(NEW_GAME, _T("&New"), _T("Start a new game"));
152 gameMenu->Append(SCORES, _T("&Scores..."), _T("Displays scores"));
153 gameMenu->Append(wxID_EXIT, _T("E&xit"), _T("Exits Forty Thieves"));
154
155 wxMenu* editMenu = new wxMenu;
156 editMenu->Append(UNDO, _T("&Undo"), _T("Undo the last move"));
157 editMenu->Append(REDO, _T("&Redo"), _T("Redo a move that has been undone"));
158
159 wxMenu* optionsMenu = new wxMenu;
160 optionsMenu->Append(RIGHT_BUTTON_UNDO,
161 _T("&Right button undo"),
162 _T("Enables/disables right mouse button undo and redo"),
163 true
164 );
165 optionsMenu->Append(HELPING_HAND,
166 _T("&Helping hand"),
167 _T("Enables/disables hand cursor when a card can be moved"),
168 true
169 );
170 optionsMenu->Append(LARGE_CARDS,
171 _T("&Large cards"),
172 _T("Enables/disables large cards for high resolution displays"),
173 true
174 );
175 optionsMenu->Check(HELPING_HAND, true);
176 optionsMenu->Check(RIGHT_BUTTON_UNDO, true);
177 optionsMenu->Check(LARGE_CARDS, largecards ? true : false);
178
179 wxMenu* helpMenu = new wxMenu;
180 helpMenu->Append(wxID_HELP_CONTENTS, _T("&Help Contents"), _T("Displays information about playing the game"));
181 helpMenu->Append(wxID_ABOUT, _T("&About..."), _T("About Forty Thieves"));
182
183 m_menuBar = new wxMenuBar;
184 m_menuBar->Append(gameMenu, _T("&Game"));
185 m_menuBar->Append(editMenu, _T("&Edit"));
186 m_menuBar->Append(optionsMenu, _T("&Options"));
187 m_menuBar->Append(helpMenu, _T("&Help"));
188
189 SetMenuBar(m_menuBar);
190
191 if (largecards)
192 Card::SetScale(1.3);
193
194 m_canvas = new FortyCanvas(this, wxDefaultPosition, size);
195
196 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
197 topsizer->Add( m_canvas, 1, wxEXPAND | wxALL, 0);
198 SetSizer( topsizer );
199 topsizer->SetSizeHints( this );
200
201 #if wxUSE_STATUSBAR
202 CreateStatusBar();
203 #endif // wxUSE_STATUSBAR
204 }
205
206 FortyFrame::~FortyFrame()
207 {
208 }
209
210 void FortyFrame::OnCloseWindow(wxCloseEvent& event)
211 {
212 if (m_canvas->OnCloseCanvas() )
213 {
214 this->Destroy();
215 }
216 else
217 event.Veto();
218 }
219
220 void
221 FortyFrame::NewGame(wxCommandEvent&)
222 {
223 m_canvas->NewGame();
224 }
225
226 void
227 FortyFrame::Exit(wxCommandEvent&)
228 {
229 Close(true);
230 }
231
232 void
233 FortyFrame::Help(wxCommandEvent& event)
234 {
235 #if wxUSE_HTML
236 if (wxFileExists(wxT("about.htm")))
237 {
238 FortyAboutDialog dialog(this, wxID_ANY, wxT("Forty Thieves Instructions"));
239 if (dialog.ShowModal() == wxID_OK)
240 {
241 }
242 }
243 else
244 #endif
245 {
246 About(event);
247 }
248 }
249
250 void
251 FortyFrame::About(wxCommandEvent&)
252 {
253 wxMessageBox(
254 _T("Forty Thieves\n\n")
255 _T("A free card game written with the wxWidgets toolkit\n")
256 _T("Author: Chris Breeze (c) 1992-2004\n")
257 _T("email: chris@breezesys.com"),
258 _T("About Forty Thieves"),
259 wxOK|wxICON_INFORMATION, this
260 );
261 }
262
263
264 void
265 FortyFrame::Undo(wxCommandEvent&)
266 {
267 m_canvas->Undo();
268 }
269
270 void
271 FortyFrame::Redo(wxCommandEvent&)
272 {
273 m_canvas->Redo();
274 }
275
276 void
277 FortyFrame::Scores(wxCommandEvent&)
278 {
279 m_canvas->UpdateScores();
280 ScoreDialog scores(this, m_canvas->GetScoreFile());
281 scores.Display();
282 }
283
284 void
285 FortyFrame::ToggleRightButtonUndo(wxCommandEvent& event)
286 {
287 bool checked = m_menuBar->IsChecked(event.GetId());
288 m_canvas->EnableRightButtonUndo(checked);
289 }
290
291 void
292 FortyFrame::ToggleHelpingHand(wxCommandEvent& event)
293 {
294 bool checked = m_menuBar->IsChecked(event.GetId());
295 m_canvas->EnableHelpingHand(checked);
296 }
297
298 void
299 FortyFrame::ToggleCardSize(wxCommandEvent& event)
300 {
301 bool checked = m_menuBar->IsChecked(event.GetId());
302 Card::SetScale(checked ? 1.3 : 1);
303 m_canvas->LayoutGame();
304 m_canvas->Refresh();
305 }
306
307 //----------------------------------------------------------------------------
308 // stAboutDialog
309 //----------------------------------------------------------------------------
310
311 BEGIN_EVENT_TABLE(FortyAboutDialog,wxDialog)
312 END_EVENT_TABLE()
313
314 FortyAboutDialog::FortyAboutDialog( wxWindow *parent, wxWindowID id, const wxString &title,
315 const wxPoint &position, const wxSize& size, long style ) :
316 wxDialog( parent, id, title, position, size, style )
317 {
318 AddControls(this);
319
320 Centre(wxBOTH);
321 }
322
323 bool FortyAboutDialog::AddControls(wxWindow* parent)
324 {
325 #if wxUSE_HTML
326 wxString htmlText;
327 wxString htmlFile(wxT("about.htm"));
328
329 //if (!wxGetApp().GetMemoryTextResource(wxT("about.htm"), htmlText))
330 {
331 // wxSetWorkingDirectory(wxGetApp().GetAppDir());
332 // wxString htmlFile(wxGetApp().GetFullAppPath(wxT("about.htm")));
333
334 if (wxFileExists(htmlFile))
335 {
336 wxFile file;
337 file.Open(htmlFile, wxFile::read);
338 long len = file.Length();
339 wxChar* buf = htmlText.GetWriteBuf(len + 1);
340 file.Read(buf, len);
341 buf[len] = 0;
342 htmlText.UngetWriteBuf();
343 }
344 }
345
346 if (htmlText.IsEmpty())
347 {
348 htmlText.Printf(wxT("<html><head><title>Warning</title></head><body><P>Sorry, could not find resource for About dialog<P></body></html>"));
349 }
350
351 // Customize the HTML
352 #if 0
353 wxString verString;
354 verString.Printf("%.2f", stVERSION_NUMBER);
355 htmlText.Replace(wxT("$VERSION$"), verString);
356 #endif
357 htmlText.Replace(wxT("$DATE$"), _T(__DATE__));
358
359 wxSize htmlSize(400, 290);
360
361 // Note: in later versions of wxWin this will be fixed so wxRAISED_BORDER
362 // does the right thing. Meanwhile, this is a workaround.
363 #ifdef __WXMSW__
364 long borderStyle = wxDOUBLE_BORDER;
365 #else
366 long borderStyle = wxRAISED_BORDER;
367 #endif
368
369 wxHtmlWindow* html = new wxHtmlWindow(this, ID_ABOUT_HTML_WINDOW, wxDefaultPosition, htmlSize, borderStyle);
370 html -> SetBorders(10);
371 html -> SetPage(htmlText);
372
373 //// Start of sizer-based control creation
374
375 wxSizer *item0 = new wxBoxSizer( wxVERTICAL );
376
377 wxWindow *item1 = parent->FindWindow( ID_ABOUT_HTML_WINDOW );
378 wxASSERT( item1 );
379 item0->Add( item1, 0, wxALIGN_CENTRE|wxALL, 5 );
380
381 wxButton *item2 = new wxButton( parent, wxID_CANCEL, _T("&Close"), wxDefaultPosition, wxDefaultSize, 0 );
382 item2->SetDefault();
383 item2->SetFocus();
384
385 item0->Add( item2, 0, wxALIGN_RIGHT|wxALL, 5 );
386
387 parent->SetSizer( item0 );
388 parent->Layout();
389 item0->Fit( parent );
390 item0->SetSizeHints( parent );
391 #endif
392
393 return true;
394 }
395