1///////////////////////////////////////////////////////////////////////////// 2// Name: scoredg.cpp 3// Purpose: Forty Thieves patience game 4// Author: Chris Breeze 5// Modified by: 6// Created: 21/07/97 7// RCS-ID: $Id: scoredg.cpp 42816 2006-10-31 08:50:17Z RD $ 8// Copyright: (c) 1993-1998 Chris Breeze 9// Licence: wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11 12// For compilers that support precompilation, includes "wx/wx.h". 13#include "wx/wxprec.h" 14 15#ifdef __BORLANDC__ 16#pragma hdrstop 17#endif 18 19#ifndef WX_PRECOMP 20#include "wx/wx.h" 21#endif 22 23#include "scorefil.h" 24#include "scoredg.h" 25 26// adjust USE_GRID_FOR_SCORE with O or 1 to your preferences 27// by default it takes wxGrid component for score display if available in target port 28#define USE_GRID_FOR_SCORE wxUSE_GRID 29 30#if USE_GRID_FOR_SCORE 31#include "wx/grid.h" 32#else 33class ScoreCanvas : public wxScrolledWindow 34{ 35public: 36 ScoreCanvas(wxWindow* parent, ScoreFile* scoreFile, const wxPoint& pos, wxSize& size); 37 virtual ~ScoreCanvas(); 38 39 void OnDraw(wxDC& dc); 40 41private: 42 wxFont *m_font; 43 wxString m_text; 44}; 45 46ScoreCanvas::ScoreCanvas(wxWindow* parent, ScoreFile* scoreFile, const wxPoint& pos, wxSize& size) : 47 wxScrolledWindow(parent, wxID_ANY, pos, size, wxSUNKEN_BORDER) 48{ 49 SetBackgroundColour(*wxWHITE); 50#ifdef __WXGTK__ 51 m_font = wxTheFontList->FindOrCreateFont(12, wxROMAN, wxNORMAL, wxNORMAL); 52#else 53 m_font = wxTheFontList->FindOrCreateFont(10, wxSWISS, wxNORMAL, wxNORMAL); 54#endif 55 56 wxArrayString players; 57 scoreFile->GetPlayerList( players); 58 59 wxString os; 60 61 os << wxT("Player\tWins\tGames\tScore\n"); 62 for (unsigned int i = 0; i < players.Count(); i++) 63 { 64 int wins, games, score; 65 scoreFile->ReadPlayersScore(players[i], wins, games, score); 66 int average = 0; 67 if (games > 0) 68 { 69 average = (2 * score + games) / (2 * games); 70 } 71 72 os << players[i] << wxT('\t') 73 << wins << wxT('\t') 74 << games << wxT('\t') 75 << average << wxT('\n'); 76 } 77 os << wxT('\0'); 78 m_text = os; 79} 80 81ScoreCanvas::~ScoreCanvas() 82{ 83} 84 85void ScoreCanvas::OnDraw(wxDC& dc) 86{ 87 dc.SetFont(* m_font); 88 89 const wxChar* str = m_text; 90 unsigned int tab = 0; 91 unsigned int tabstops[] = { 5, 100, 150, 200 }; 92 93 // get the line spacing for the current font 94 int lineSpacing; 95 { 96 long w, h; 97 dc.GetTextExtent(wxT("Testing"), &w, &h); 98 lineSpacing = (int)h; 99 } 100 101 int y = 0; 102 while (*str) 103 { 104 wxChar text[256]; 105 wxChar* dest = text; 106 107 while (*str && *str >= ' ') *dest++ = *str++; 108 *dest = '\0'; 109 110 dc.DrawText(text, tabstops[tab], y); 111 112 if (*str == '\t') 113 { 114 if (tab < sizeof(tabstops) / sizeof(tabstops[0]) - 1) 115 { 116 tab++; 117 } 118 } 119 else if (*str == '\n') 120 { 121 tab = 0; 122 y += lineSpacing; 123 } 124 if (*str) str++; 125 } 126} 127#endif 128 129BEGIN_EVENT_TABLE(ScoreDialog, wxDialog) 130 EVT_CLOSE(ScoreDialog::OnCloseWindow) 131END_EVENT_TABLE() 132 133ScoreDialog::ScoreDialog(wxWindow* parent, ScoreFile* file) : 134 wxDialog(parent, wxID_ANY, _("Scores"), 135 wxDefaultPosition, wxSize(400, 300)), 136 m_scoreFile(file) 137{ 138 // create grid with players 139 wxArrayString players; 140 file->GetPlayerList(players); 141 142 wxSize sz = wxSize(400, 300); 143 144#if USE_GRID_FOR_SCORE 145 wxGrid* list = new wxGrid(this, wxID_ANY, wxDefaultPosition, sz, 0); 146 list->CreateGrid(players.Count(), 4); 147 for (unsigned int i = 0; i < players.Count(); i++) 148 { 149 int wins, games, score; 150 wxString string_value; 151 152 file->ReadPlayersScore(players[i], wins, games, score); 153 int average = 0; 154 if (games > 0) 155 { 156 average = (2 * score + games) / (2 * games); 157 } 158 list->SetCellValue(i,0,players[i]); 159 string_value.Printf( _T("%u"), wins ); 160 list->SetCellValue(i,1,string_value); 161 string_value.Printf( _T("%u"), games ); 162 list->SetCellValue(i,2,string_value); 163 string_value.Printf( _T("%u"), average ); 164 list->SetCellValue(i,3,string_value); 165 } 166 list->SetColLabelValue(0, _T("Players")); 167 list->SetColLabelValue(1, _T("Wins")); 168 list->SetColLabelValue(2, _T("Games")); 169 list->SetColLabelValue(3, _T("Score")); 170 list->SetEditable(false); 171 list->AutoSizeColumns(); 172 list->AutoSizeRows(); 173 list->SetRowLabelSize(0); 174 list->EnableDragRowSize(false); 175 list->EnableDragColSize(false); 176 list->EnableDragGridSize(false); 177 list->ClearSelection(); 178 list->EnableEditing(false); 179 sz.x = wxDefaultCoord; 180#else 181 ScoreCanvas* list = new ScoreCanvas(this, m_scoreFile, wxDefaultPosition, sz); 182#endif 183 184 list->SetInitialSize(sz); 185 186 // locate and resize with sizers 187 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL ); 188 topsizer->Add( list, 1, wxALL|wxGROW, 10 ); 189 wxButton *button = new wxButton(this, wxID_OK); 190 topsizer->Add( button, 0, wxALIGN_CENTER_HORIZONTAL|wxALL , 10 ); 191 button->SetFocus(); 192 193 SetSizer( topsizer ); 194 195 GetSizer()->Fit(this); 196 GetSizer()->SetSizeHints(this); 197 198 CentreOnParent(); 199} 200 201void ScoreDialog::Display() 202{ 203 ShowModal(); 204} 205 206void ScoreDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) 207{ 208 EndModal(wxID_OK); 209} 210