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