//
// $Source: /cvsroot/gambit/gambit/sources/gui/nfgtable.h,v $
// $Date: 2006/11/11 17:30:25 $
// $Revision: 1.19 $
//
// DESCRIPTION:
// Declaration of control to display/edit strategic game tables
//
// This file is part of Gambit
// Copyright (c) 2005, The Gambit Project
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//

#ifndef NFGTABLE_H
#define NFGTABLE_H

class gbtGameDocument;
class gbtNfgPanel;

//!
//! This is a panel which manages three wxSheet instances: one which
//! contains the payoffs of the strategic form, and two which handle
//! the display of row and column labels
//!
class gbtTableWidget : public wxPanel {
private:
  gbtGameDocument *m_doc;
  gbtNfgPanel *m_nfgPanel;
  wxSheet *m_payoffSheet, *m_rowSheet, *m_colSheet;

  Gambit::Array<int> m_rowPlayers, m_colPlayers;

  /// @name Event handlers
  //@{
  /// Called when row label sheet is scrolled
  void OnRowSheetScroll(wxSheetEvent &);
  /// Called when column label sheet is scrolled
  void OnColSheetScroll(wxSheetEvent &);
  /// Called when payoff sheet is scrolled
  void OnPayoffScroll(wxSheetEvent &);

  /// Called when row label sheet row is resized
  void OnRowSheetRow(wxSheetEvent &);
  /// Called when payoff sheet row is resized
  void OnPayoffRow(wxSheetEvent &);

  /// Called when col label sheet column is resized
  void OnColSheetColumn(wxSheetEvent &);
  /// Called when payoff sheet column is resized
  void OnPayoffColumn(wxSheetEvent &);

  /// Called when row label sheet column is resized
  void OnRowSheetColumn(wxSheetEvent &);
  /// Called when column label sheet row is resized
  void OnColSheetRow(wxSheetEvent &);

  /// Called when editing begins in any cell
  void OnBeginEdit(wxSheetEvent &);
  //@}

public:
  gbtTableWidget(gbtNfgPanel *p_parent, wxWindowID p_id,
		 gbtGameDocument *p_doc);

  /// @name Coordination of sheets
  //@{
  /// Scroll row and column label sheets
  void SetGridOrigin(int x, int y);

  /// Synchronize with document state
  void OnUpdate(void);

  /// Post any pending edits
  void PostPendingChanges(void);

  /// Are we showing dominance indicators or not?
  bool ShowDominance(void) const;
  //@}

  /// @name View state
  //@{
  /// Returns the number of players assigned to the rows
  int NumRowPlayers(void) const { return m_rowPlayers.Length(); }

  /// Returns the index'th player assigned to the rows (1=slowest incrementing)
  int GetRowPlayer(int index) const { return m_rowPlayers[index]; }

  /// Sets the index'th row player (1=slowest, n+1=fastest)
  void SetRowPlayer(int index, int pl);

  /// Returns the number of row contingencies (i.e., rows in the table)
  int NumRowContingencies(void) const;

  /// Returns the number of rows spanned by strategy of row player index
  int NumRowsSpanned(int index) const;

  /// Returns the strategy index for row player 'player' corresponding to 'row'
  int RowToStrategy(int player, int row) const;

  /// Returns the number of players assigned to the columns
  int NumColPlayers(void) const { return m_colPlayers.Length(); }

  /// Returns the index'th player assigned to the columns (1=slowest)
  int GetColPlayer(int index) const { return m_colPlayers[index]; }

  /// Sets the index'th column player (1=slowest, n+1=fastest)
  void SetColPlayer(int index, int pl);

  /// Returns the number of column contingencies 
  /// (Note that each column contingency corresponds to #players cols!)
  int NumColContingencies(void) const;

  /// Returns the number of columns spanned by strategy of column player index
  int NumColsSpanned(int index) const;

  /// Returns the strategy index for row player 'player' corresponding to 'row'
  int ColToStrategy(int player, int row) const;

  /// Returns the strategy profile corresponding to a cell
  Gambit::PureStrategyProfile CellToProfile(const wxSheetCoords &) const;
  //@}

  /// @name Exporting/printing graphics
  //@{
  /// Creates a printout object of the game as currently displayed
  wxPrintout *GetPrintout(void);
  /// Creates a bitmap of the game as currently displayed
  bool GetBitmap(wxBitmap &, int marginX, int marginY);
  /// Outputs the game as currently displayed to a SVG file
  void GetSVG(const wxString &p_filename, int marginX, int marginY);
  /// Prints the game as currently displayed, centered on the DC
  void RenderGame(wxDC &p_dc, int marginX, int marginY);
  //@}
};

#endif  // NFGTABLE_H


syntax highlighted by Code2HTML, v. 0.9.1