home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2233.zip / wxOS2-2_3_3.zip / wxWindows-2.3.3 / demos / forty / forty.cpp < prev    next >
C/C++ Source or Header  |  2002-06-12  |  10KB  |  392 lines

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