wxBLACK usage.
[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 // For compilers that support precompilation, includes "wx/wx.h".
15 #include "wx/wxprec.h"
16
17 #ifdef __BORLANDC__
18 #pragma hdrstop
19 #endif
20
21 #ifndef WX_PRECOMP
22 #include "wx/wx.h"
23 #endif
24
25 #include "canvas.h"
26 #include "forty.h"
27 #include "card.h"
28 #include "scoredg.h"
29
30 #if wxUSE_HTML
31 #include "wx/textfile.h"
32 #include "wx/html/htmlwin.h"
33 #endif
34
35 #include "wx/stockitem.h"
36
37 BEGIN_EVENT_TABLE(FortyFrame, wxFrame)
38 EVT_MENU(wxID_NEW, FortyFrame::NewGame)
39 EVT_MENU(wxID_EXIT, FortyFrame::Exit)
40 EVT_MENU(wxID_ABOUT, FortyFrame::About)
41 EVT_MENU(wxID_HELP_CONTENTS, FortyFrame::Help)
42 EVT_MENU(wxID_UNDO, FortyFrame::Undo)
43 EVT_MENU(wxID_REDO, FortyFrame::Redo)
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)
48 EVT_CLOSE(FortyFrame::OnCloseWindow)
49 END_EVENT_TABLE()
50
51 // Create a new application object
52 IMPLEMENT_APP (FortyApp)
53
54 wxColour* FortyApp::m_backgroundColour = 0;
55 wxColour* FortyApp::m_textColour = 0;
56 wxBrush* FortyApp::m_backgroundBrush = 0;
57
58 FortyApp::~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
68 bool FortyApp::OnInit()
69 {
70 bool largecards = false;
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 }
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(*wxBLACK);
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(wxID_NEW, wxGetStockLabel(wxID_NEW), _T("Start a new game"));
152 gameMenu->Append(SCORES, _T("&Scores..."), _T("Displays scores"));
153 gameMenu->Append(wxID_EXIT, wxGetStockLabel(wxID_EXIT), _T("Exits Forty Thieves"));
154
155 wxMenu* editMenu = new wxMenu;
156 editMenu->Append(wxID_UNDO, wxGetStockLabel(wxID_UNDO), _T("Undo the last move"));
157 editMenu->Append(wxID_REDO, wxGetStockLabel(wxID_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 void FortyFrame::OnCloseWindow(wxCloseEvent& event)
207 {
208 if (m_canvas->OnCloseCanvas() )
209 {
210 this->Destroy();
211 }
212 else
213 event.Veto();
214 }
215
216 void
217 FortyFrame::NewGame(wxCommandEvent&)
218 {
219 m_canvas->NewGame();
220 }
221
222 void
223 FortyFrame::Exit(wxCommandEvent&)
224 {
225 Close(true);
226 }
227
228 void
229 FortyFrame::Help(wxCommandEvent& event)
230 {
231 #if wxUSE_HTML
232 if (wxFileExists(wxGetApp().GetHelpFile()))
233 {
234 FortyAboutDialog dialog(this, wxID_ANY, wxT("Forty Thieves Instructions"));
235 if (dialog.ShowModal() == wxID_OK)
236 {
237 }
238 }
239 else
240 #endif
241 {
242 About(event);
243 }
244 }
245
246 void
247 FortyFrame::About(wxCommandEvent&)
248 {
249 wxMessageBox(
250 _T("Forty Thieves\n\n")
251 _T("A free card game written with the wxWidgets toolkit\n")
252 _T("Author: Chris Breeze (c) 1992-2004\n")
253 _T("email: chris@breezesys.com"),
254 _T("About Forty Thieves"),
255 wxOK|wxICON_INFORMATION, this
256 );
257 }
258
259
260 void
261 FortyFrame::Undo(wxCommandEvent&)
262 {
263 m_canvas->Undo();
264 }
265
266 void
267 FortyFrame::Redo(wxCommandEvent&)
268 {
269 m_canvas->Redo();
270 }
271
272 void
273 FortyFrame::Scores(wxCommandEvent&)
274 {
275 m_canvas->UpdateScores();
276 ScoreDialog scores(this, m_canvas->GetScoreFile());
277 scores.Display();
278 }
279
280 void
281 FortyFrame::ToggleRightButtonUndo(wxCommandEvent& event)
282 {
283 bool checked = m_menuBar->IsChecked(event.GetId());
284 m_canvas->EnableRightButtonUndo(checked);
285 }
286
287 void
288 FortyFrame::ToggleHelpingHand(wxCommandEvent& event)
289 {
290 bool checked = m_menuBar->IsChecked(event.GetId());
291 m_canvas->EnableHelpingHand(checked);
292 }
293
294 void
295 FortyFrame::ToggleCardSize(wxCommandEvent& event)
296 {
297 bool checked = m_menuBar->IsChecked(event.GetId());
298 Card::SetScale(checked ? 1.3 : 1);
299 m_canvas->LayoutGame();
300 m_canvas->Refresh();
301 }
302
303 //----------------------------------------------------------------------------
304 // stAboutDialog
305 //----------------------------------------------------------------------------
306
307 BEGIN_EVENT_TABLE(FortyAboutDialog,wxDialog)
308 EVT_BUTTON(wxID_CLOSE, wxDialog::OnOK)
309 END_EVENT_TABLE()
310
311 FortyAboutDialog::FortyAboutDialog( wxWindow *parent, wxWindowID id, const wxString &title,
312 const wxPoint &position, const wxSize& size, long style ) :
313 wxDialog( parent, id, title, position, size, style )
314 {
315 AddControls(this);
316
317 Centre(wxBOTH);
318 }
319
320 bool FortyAboutDialog::AddControls(wxWindow* parent)
321 {
322 #if wxUSE_HTML
323 wxString htmlText;
324 wxString htmlFile = wxGetApp().GetHelpFile();
325
326 {
327 wxTextFile file(htmlFile);
328 if (file.Exists())
329 {
330 file.Open();
331 for ( htmlText = file.GetFirstLine();
332 !file.Eof();
333 htmlText << file.GetNextLine() << _T("\n") ) ;
334 }
335 }
336
337 if (htmlText.empty())
338 {
339 htmlText.Printf(wxT("<html><head><title>Warning</title></head><body><P>Sorry, could not find resource for About dialog<P></body></html>"));
340 }
341
342 // Customize the HTML
343 htmlText.Replace(wxT("$DATE$"), _T(__DATE__));
344
345 wxSize htmlSize(400, 290);
346
347 // Note: in later versions of wxWin this will be fixed so wxRAISED_BORDER
348 // does the right thing. Meanwhile, this is a workaround.
349 #ifdef __WXMSW__
350 long borderStyle = wxDOUBLE_BORDER;
351 #else
352 long borderStyle = wxRAISED_BORDER;
353 #endif
354
355 wxHtmlWindow* html = new wxHtmlWindow(this, ID_ABOUT_HTML_WINDOW, wxDefaultPosition, htmlSize, borderStyle);
356 html -> SetBorders(10);
357 html -> SetPage(htmlText);
358
359 //// Start of sizer-based control creation
360
361 wxSizer *item0 = new wxBoxSizer( wxVERTICAL );
362
363 wxWindow *item1 = parent->FindWindow( ID_ABOUT_HTML_WINDOW );
364 wxASSERT( item1 );
365 item0->Add( item1, 0, wxALIGN_CENTRE|wxALL, 5 );
366
367 wxButton *item2 = new wxButton( parent, wxID_CLOSE );
368 item2->SetDefault();
369 item2->SetFocus();
370
371 item0->Add( item2, 0, wxALIGN_RIGHT|wxALL, 5 );
372
373 parent->SetSizer( item0 );
374 parent->Layout();
375 item0->Fit( parent );
376 item0->SetSizeHints( parent );
377 #endif
378
379 return true;
380 }
381