]> git.saurik.com Git - wxWidgets.git/blobdiff - demos/forty/forty.cpp
Tweaked the layout sample a bit for wxGridBagSizer
[wxWidgets.git] / demos / forty / forty.cpp
index 7d65694a9fedefc06275814f2683e00671500872..582cb08f3dbe865fde0cb1e7d0072fc1c3c4dcc2 100644 (file)
 
 #include "canvas.h"
 #include "forty.h"
+#include "card.h"
 #include "scoredg.h"
-#ifdef wx_x
-#include "cards.xbm"
-#endif
 
-class FortyFrame: public wxFrame
-{
-public:
-       FortyFrame(wxFrame* frame, char* title, int x, int y, int w, int h);
-       virtual ~FortyFrame();
-
-       void OnCloseWindow(wxCloseEvent& event);
-
-       // Menu callbacks
-       void NewGame(wxCommandEvent& event);
-       void Exit(wxCommandEvent& event);
-       void About(wxCommandEvent& event);
-       void Undo(wxCommandEvent& event);
-       void Redo(wxCommandEvent& event);
-       void Scores(wxCommandEvent& event);
-       void ToggleRightButtonUndo(wxCommandEvent& event);
-       void ToggleHelpingHand(wxCommandEvent& event);
-
-       DECLARE_EVENT_TABLE()
-
-private:
-       enum MenuCommands { NEW_GAME = 10, SCORES, EXIT,
-                                               UNDO, REDO,
-                                               RIGHT_BUTTON_UNDO, HELPING_HAND,
-                                               ABOUT };
-
-       wxMenuBar*              m_menuBar;
-       FortyCanvas*    m_canvas;
-};
+#if wxUSE_HTML
+#include "wx/file.h"
+#include "wx/html/htmlwin.h"
+#endif
 
 BEGIN_EVENT_TABLE(FortyFrame, wxFrame)
        EVT_MENU(NEW_GAME, FortyFrame::NewGame)
@@ -73,6 +46,7 @@ BEGIN_EVENT_TABLE(FortyFrame, wxFrame)
        EVT_MENU(SCORES, FortyFrame::Scores)
        EVT_MENU(RIGHT_BUTTON_UNDO, FortyFrame::ToggleRightButtonUndo)
        EVT_MENU(HELPING_HAND, FortyFrame::ToggleHelpingHand)
+        EVT_MENU(LARGE_CARDS, FortyFrame::ToggleCardSize)
     EVT_CLOSE(FortyFrame::OnCloseWindow)
 END_EVENT_TABLE()
 
@@ -83,17 +57,42 @@ wxColour* FortyApp::m_backgroundColour = 0;
 wxColour* FortyApp::m_textColour = 0;
 wxBrush*  FortyApp::m_backgroundBrush = 0;
 
+FortyApp::FortyApp()
+{
+}
+
+FortyApp::~FortyApp()
+{
+    delete m_backgroundColour;
+    delete m_textColour;
+    delete m_backgroundBrush;
+    delete Card::m_symbolBmap;
+    delete Card::m_pictureBmap;
+
+}
+
 bool FortyApp::OnInit()
 {
+        bool largecards = FALSE;
+        wxSize size(668,510);
+
+        if ((argc > 1) && (!wxStrcmp(argv[1],_T("-L"))))
+        {
+            largecards = TRUE;
+            size = wxSize(1000,750);
+        }
+
        FortyFrame* frame = new FortyFrame(
                        0,
-                       "Forty Thieves",
-                       -1, -1, 668, 510
+                       _T("Forty Thieves"),
+                        -1, -1, size.x, size.y,largecards
                        );
 
        // Show the frame
        frame->Show(TRUE);
 
+        frame->GetCanvas()->ShowPlayerDialog();
+
        return TRUE;
 }
 
@@ -121,14 +120,14 @@ const wxColour& FortyApp::TextColour()
 {
        if (!m_textColour)
        {
-               m_textColour = new wxColour("BLACK");
+               m_textColour = new wxColour(_T("BLACK"));
        }
 
        return *m_textColour;
 }
 
 // My frame constructor
-FortyFrame::FortyFrame(wxFrame* frame, char* title, int x, int y, int w, int h):
+FortyFrame::FortyFrame(wxFrame* frame, const wxString& title, int x, int y, int w, int h,bool largecards):
        wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h))
 {
 #ifdef __WXMAC__
@@ -137,7 +136,7 @@ FortyFrame::FortyFrame(wxFrame* frame, char* title, int x, int y, int w, int h):
 #endif
        // set the icon
 #ifdef __WXMSW__
-       SetIcon(wxIcon("CardsIcon"));
+       SetIcon(wxIcon(_T("CardsIcon")));
 #else
 #ifdef GTK_TBD
        SetIcon(wxIcon(Cards_bits, Cards_width, Cards_height));
@@ -146,39 +145,48 @@ FortyFrame::FortyFrame(wxFrame* frame, char* title, int x, int y, int w, int h):
 
        // Make a menu bar
        wxMenu* gameMenu = new wxMenu;
-       gameMenu->Append(NEW_GAME, "&New", "Start a new game");
-       gameMenu->Append(SCORES, "&Scores...", "Displays scores");
-       gameMenu->Append(EXIT, "E&xit", "Exits Forty Thieves");
+       gameMenu->Append(NEW_GAME, _T("&New"), _T("Start a new game"));
+       gameMenu->Append(SCORES, _T("&Scores..."), _T("Displays scores"));
+       gameMenu->Append(EXIT, _T("E&xit"), _T("Exits Forty Thieves"));
 
        wxMenu* editMenu = new wxMenu;
-       editMenu->Append(UNDO, "&Undo", "Undo the last move");
-       editMenu->Append(REDO, "&Redo", "Redo a move that has been undone");
+       editMenu->Append(UNDO, _T("&Undo"), _T("Undo the last move"));
+       editMenu->Append(REDO, _T("&Redo"), _T("Redo a move that has been undone"));
 
        wxMenu* optionsMenu = new wxMenu;
        optionsMenu->Append(RIGHT_BUTTON_UNDO,
-                       "&Right button undo",
-                       "Enables/disables right mouse button undo and redo",
+                       _T("&Right button undo"),
+                       _T("Enables/disables right mouse button undo and redo"),
                        TRUE
                        );
        optionsMenu->Append(HELPING_HAND,
-                       "&Helping hand",
-                       "Enables/disables hand cursor when a card can be moved",
+                       _T("&Helping hand"),
+                       _T("Enables/disables hand cursor when a card can be moved"),
                        TRUE
                        );
+        optionsMenu->Append(LARGE_CARDS,
+                        _T("&Large cards"),
+                        _T("Enables/disables large cards for high resolution displays"),
+                        TRUE
+                        );
        optionsMenu->Check(HELPING_HAND, TRUE);
        optionsMenu->Check(RIGHT_BUTTON_UNDO, TRUE);
+        optionsMenu->Check(LARGE_CARDS, largecards ? TRUE : FALSE);
 
        wxMenu* helpMenu = new wxMenu;
-       helpMenu->Append(ABOUT, "&About", "Displays program version information");
+       helpMenu->Append(ABOUT, _T("&About..."), _T("Displays information about the game"));
 
        m_menuBar = new wxMenuBar;
-       m_menuBar->Append(gameMenu,    "&Game");
-       m_menuBar->Append(editMenu,    "&Edit");
-       m_menuBar->Append(optionsMenu, "&Options");
-       m_menuBar->Append(helpMenu,    "&Help");
+       m_menuBar->Append(gameMenu,    _T("&Game"));
+       m_menuBar->Append(editMenu,    _T("&Edit"));
+       m_menuBar->Append(optionsMenu, _T("&Options"));
+       m_menuBar->Append(helpMenu,    _T("&Help"));
 
        SetMenuBar(m_menuBar);
 
+        if (largecards)
+            Card::SetScale(1.3);
+
        m_canvas = new FortyCanvas(this, 0, 0, 400, 400);
        wxLayoutConstraints* constr = new wxLayoutConstraints;
        constr->left.SameAs(this, wxLeft);
@@ -223,17 +231,29 @@ FortyFrame::Exit(wxCommandEvent&)
 void
 FortyFrame::About(wxCommandEvent&)
 {
-       wxMessageBox(
-               "Forty Thieves\n\n"
-               "A freeware program using the wxWindows\n"
-               "portable C++ GUI toolkit.\n"
-               "http://www.wxwindows.org\n"
-               "http://www.freiburg.linux.de/~wxxt\n\n"
-               "Author: Chris Breeze (c) 1992-1998\n"
-               "email: chris.breeze@iname.com",
-               "About Forty Thieves",
-               wxOK, this
-               );
+#if wxUSE_HTML
+    if (wxFileExists(wxT("about.htm")))
+    {
+        FortyAboutDialog dialog(this, -1, wxT("About Forty Thieves"));
+        if (dialog.ShowModal() == wxID_OK)
+        {
+        }
+    }
+    else
+#endif
+    {
+        wxMessageBox(
+            _T("Forty Thieves\n\n")
+            _T("A freeware program using the wxWindows\n")
+            _T("portable C++ GUI toolkit.\n")
+            _T("http://www.wxwindows.org\n")
+            _T("http://www.freiburg.linux.de/~wxxt\n\n")
+            _T("Author: Chris Breeze (c) 1992-1998\n")
+            _T("email: chris.breeze@iname.com"),
+            _T("About Forty Thieves"),
+            wxOK, this
+            );
+    }
 }
 
 void
@@ -269,3 +289,103 @@ FortyFrame::ToggleHelpingHand(wxCommandEvent& event)
        bool checked = m_menuBar->IsChecked(event.GetId());
        m_canvas->EnableHelpingHand(checked);
 }
+
+void
+FortyFrame::ToggleCardSize(wxCommandEvent& event)
+{
+        bool checked = m_menuBar->IsChecked(event.GetId());
+        Card::SetScale(checked ? 1.3 : 1);
+        m_canvas->LayoutGame();
+        m_canvas->Refresh();
+}
+
+//----------------------------------------------------------------------------
+// stAboutDialog
+//----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(FortyAboutDialog,wxDialog)
+END_EVENT_TABLE()
+
+FortyAboutDialog::FortyAboutDialog( wxWindow *parent, wxWindowID id, const wxString &title,
+    const wxPoint &position, const wxSize& size, long style ) :
+    wxDialog( parent, id, title, position, size, style )
+{
+    AddControls(this);
+
+    Centre(wxBOTH);
+}
+
+bool FortyAboutDialog::AddControls(wxWindow* parent)
+{
+#if wxUSE_HTML
+    wxString htmlText;
+    wxString htmlFile(wxT("about.htm"));
+
+    //if (!wxGetApp().GetMemoryTextResource(wxT("about.htm"), htmlText))
+    {
+//        wxSetWorkingDirectory(wxGetApp().GetAppDir());
+//        wxString htmlFile(wxGetApp().GetFullAppPath(wxT("about.htm")));
+        
+        if (wxFileExists(htmlFile))
+        {
+            wxFile file;
+            file.Open(htmlFile, wxFile::read);
+            long len = file.Length();
+            wxChar* buf = htmlText.GetWriteBuf(len + 1);
+            file.Read(buf, len);
+            buf[len] = 0;
+            htmlText.UngetWriteBuf();
+        }
+    }
+
+    if (htmlText.IsEmpty())
+    {
+        htmlText.Printf(wxT("<html><head><title>Warning</title></head><body><P>Sorry, could not find resource for About dialog<P></body></html>"));
+    }
+
+    // Customize the HTML
+#if 0
+    wxString verString;
+    verString.Printf("%.2f", stVERSION_NUMBER);
+    htmlText.Replace(wxT("$VERSION$"), verString);
+#endif
+    htmlText.Replace(wxT("$DATE$"), _T(__DATE__));
+
+    wxSize htmlSize(400, 290);
+
+    // Note: in later versions of wxWin this will be fixed so wxRAISED_BORDER
+    // does the right thing. Meanwhile, this is a workaround.
+#ifdef __WXMSW__
+    long borderStyle = wxDOUBLE_BORDER;
+#else
+    long borderStyle = wxRAISED_BORDER;
+#endif
+
+    wxHtmlWindow* html = new wxHtmlWindow(this, ID_ABOUT_HTML_WINDOW, wxDefaultPosition, htmlSize, borderStyle);
+    html -> SetBorders(10);
+    html -> SetPage(htmlText);
+        
+    //// Start of sizer-based control creation
+
+    wxSizer *item0 = new wxBoxSizer( wxVERTICAL );
+
+    wxWindow *item1 = parent->FindWindow( ID_ABOUT_HTML_WINDOW );
+    wxASSERT( item1 );
+    item0->Add( item1, 0, wxALIGN_CENTRE|wxALL, 5 );
+
+    wxButton *item2 = new wxButton( parent, wxID_CANCEL, _T("&Close"), wxDefaultPosition, wxDefaultSize, 0 );
+    item2->SetDefault();
+    item2->SetFocus();
+
+    item0->Add( item2, 0, wxALIGN_RIGHT|wxALL, 5 );
+
+    parent->SetAutoLayout( TRUE );
+    parent->SetSizer( item0 );
+    parent->Layout();
+    item0->Fit( parent );
+    item0->SetSizeHints( parent );
+#endif
+
+    return TRUE;
+}
+