wxWidgets/include/wx/generic/grid.h
Michael Bedward 52068ea5ff Fixed bug that caused wrong block of cells to be selected if the
mouse was dragged out of the grid cell area.

Cell text values now echo changes in top edit control if in-place
editing is disabled.

Changed highlight scheme again so that a border is drawn around the
current cell whether in-place editing is on or off. Hopefully this is
less confusing.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4207 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
1999-10-27 03:05:05 +00:00

1062 lines
35 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: grid.h
// Purpose: wxGrid and related classes
// Author: Michael Bedward (based on code by Julian Smart, Robin Dunn)
// Modified by:
// Created: 1/08/1999
// RCS-ID: $Id$
// Copyright: (c) Michael Bedward
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/defs.h"
#if !defined(wxUSE_NEW_GRID) || !(wxUSE_NEW_GRID)
#include "gridg.h"
#else
#ifndef __WXGRID_H__
#define __WXGRID_H__
#ifdef __GNUG__
#pragma interface "grid.h"
#endif
#include "wx/panel.h"
#include "wx/string.h"
#include "wx/scrolbar.h"
#include "wx/event.h"
#include "wx/textctrl.h"
#include "wx/combobox.h"
#include "wx/dynarray.h"
// Default parameters for wxGrid
//
#define WXGRID_DEFAULT_NUMBER_ROWS 10
#define WXGRID_DEFAULT_NUMBER_COLS 10
#ifdef __WXMSW__
#define WXGRID_DEFAULT_ROW_HEIGHT 25
#else
#define WXGRID_DEFAULT_ROW_HEIGHT 30
#endif // __WXMSW__
#define WXGRID_DEFAULT_COL_WIDTH 80
#define WXGRID_DEFAULT_COL_LABEL_HEIGHT 32
#define WXGRID_DEFAULT_ROW_LABEL_WIDTH 82
#define WXGRID_LABEL_EDGE_ZONE 5
#define WXGRID_MIN_ROW_HEIGHT 15
#define WXGRID_MIN_COL_WIDTH 15
#define WXGRID_DEFAULT_SCROLLBAR_WIDTH 16
#define WXGRID_DEFAULT_TOPEDIT_WIDTH 300
#define WXGRID_DEFAULT_TOPEDIT_HEIGHT 60
class wxGrid;
//////////////////////////////////////////////////////////////////////
//
// Grid table classes
//
//////////////////////////////////////////////////////////////////////
class wxGridTableBase : public wxObject
{
wxGrid * m_view;
public:
wxGridTableBase();
virtual ~wxGridTableBase();
// You must override these functions in a derived table class
//
virtual long GetNumberRows() = 0;
virtual long GetNumberCols() = 0;
virtual wxString GetValue( int row, int col ) = 0;
virtual void SetValue( int row, int col, const wxString& s ) = 0;
virtual bool IsEmptyCell( int row, int col ) = 0;
// Overriding these is optional
//
virtual void SetView( wxGrid *grid ) { m_view = grid; }
virtual wxGrid * GetView() const { return m_view; }
virtual void Clear() {}
virtual bool InsertRows( size_t pos = 0, size_t numRows = 1 );
virtual bool AppendRows( size_t numRows = 1 );
virtual bool DeleteRows( size_t pos = 0, size_t numRows = 1 );
virtual bool InsertCols( size_t pos = 0, size_t numCols = 1 );
virtual bool AppendCols( size_t numCols = 1 );
virtual bool DeleteCols( size_t pos = 0, size_t numCols = 1 );
virtual wxString GetRowLabelValue( int row );
virtual wxString GetColLabelValue( int col );
virtual void SetRowLabelValue( int WXUNUSED(row), const wxString& ) {}
virtual void SetColLabelValue( int WXUNUSED(col), const wxString& ) {}
DECLARE_ABSTRACT_CLASS( wxGridTableBase );
};
// IDs for messages sent from grid table to view
//
enum wxGridTableRequest {
wxGRIDTABLE_REQUEST_VIEW_GET_VALUES = 2000,
wxGRIDTABLE_REQUEST_VIEW_SEND_VALUES,
wxGRIDTABLE_NOTIFY_ROWS_INSERTED,
wxGRIDTABLE_NOTIFY_ROWS_APPENDED,
wxGRIDTABLE_NOTIFY_ROWS_DELETED,
wxGRIDTABLE_NOTIFY_COLS_INSERTED,
wxGRIDTABLE_NOTIFY_COLS_APPENDED,
wxGRIDTABLE_NOTIFY_COLS_DELETED
};
class wxGridTableMessage
{
wxGridTableBase *m_table;
int m_id;
int m_comInt1;
int m_comInt2;
public:
wxGridTableMessage();
wxGridTableMessage( wxGridTableBase *table, int id,
int comInt1 = -1,
int comInt2 = -1 );
void SetTableObject( wxGridTableBase *table ) { m_table = table; }
wxGridTableBase * GetTableObject() const { return m_table; }
void SetId( int id ) { m_id = id; }
int GetId() { return m_id; }
void SetCommandInt( int comInt1 ) { m_comInt1 = comInt1; }
int GetCommandInt() { return m_comInt1; }
void SetCommandInt2( int comInt2 ) { m_comInt2 = comInt2; }
int GetCommandInt2() { return m_comInt2; }
};
// ------ wxGridStringArray
// A 2-dimensional array of strings for data values
//
WX_DECLARE_OBJARRAY(wxArrayString, wxGridStringArray);
// ------ wxGridStringTable
//
// Simplest type of data table for a grid for small tables of strings
// that are stored in memory
//
class wxGridStringTable : public wxGridTableBase
{
wxGridStringArray m_data;
// These only get used if you set your own labels, otherwise the
// GetRow/ColLabelValue functions return wxGridTableBase defaults
//
wxArrayString m_rowLabels;
wxArrayString m_colLabels;
public:
wxGridStringTable();
wxGridStringTable( int numRows, int numCols );
~wxGridStringTable();
// these are pure virtual in wxGridTableBase
//
long GetNumberRows();
long GetNumberCols();
wxString GetValue( int row, int col );
void SetValue( int row, int col, const wxString& s );
bool IsEmptyCell( int row, int col );
// overridden functions from wxGridTableBase
//
void Clear();
bool InsertRows( size_t pos = 0, size_t numRows = 1 );
bool AppendRows( size_t numRows = 1 );
bool DeleteRows( size_t pos = 0, size_t numRows = 1 );
bool InsertCols( size_t pos = 0, size_t numCols = 1 );
bool AppendCols( size_t numCols = 1 );
bool DeleteCols( size_t pos = 0, size_t numCols = 1 );
void SetRowLabelValue( int row, const wxString& );
void SetColLabelValue( int col, const wxString& );
wxString GetRowLabelValue( int row );
wxString GetColLabelValue( int col );
DECLARE_DYNAMIC_CLASS( wxGridStringTable )
};
//////////////////////////////////////////////////////////////////////
//
// Grid view classes
//
//////////////////////////////////////////////////////////////////////
class wxGridCellCoords
{
long m_row;
long m_col;
public:
wxGridCellCoords() { m_row = m_col = -1; }
wxGridCellCoords( int r, int c ) { m_row = r; m_col = c; }
// default copy ctor is ok
long GetRow() const { return m_row; }
void SetRow( long n ) { m_row = n; }
long GetCol() const { return m_col; }
void SetCol( long n ) { m_col = n; }
void Set( long row, long col ) { m_row = row; m_col = col; }
wxGridCellCoords& operator=( const wxGridCellCoords& other )
{
if ( &other != this )
{
m_row=other.m_row;
m_col=other.m_col;
}
return *this;
}
bool operator==( const wxGridCellCoords& other )
{
return (m_row == other.m_row && m_col == other.m_col);
}
bool operator!=( const wxGridCellCoords& other )
{
return (m_row != other.m_row || m_col != other.m_col);
}
bool operator!()
{
return (m_row == -1 && m_col == -1 );
}
};
// For comparisons...
//
extern wxGridCellCoords wxGridNoCellCoords;
extern wxRect wxGridNoCellRect;
// This set of classes is to provide for the use of different types of
// cell edit controls in the grid while avoiding the wx class info
// system in deference to wxPython
class wxGridTextCtrl : public wxTextCtrl
{
// TRUE for controls placed over cells,
// FALSE for a control on a grid control panel
bool m_isCellControl;
wxString startValue;
void OnKeyDown( wxKeyEvent& );
public:
wxGridTextCtrl() {}
wxGridTextCtrl( wxWindow *,
bool isCellControl,
wxWindowID id,
const wxString& value = wxEmptyString,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0 );
void SetStartValue( const wxString& );
wxString GetStartValue() { return startValue; }
DECLARE_DYNAMIC_CLASS( wxGridTextCtrl )
DECLARE_EVENT_TABLE()
};
class wxGrid : public wxPanel
{
DECLARE_DYNAMIC_CLASS( wxGrid )
protected:
bool m_created;
wxGridTableBase *m_table;
int m_left;
int m_top;
int m_right;
int m_bottom;
int m_numRows;
int m_numCols;
wxGridCellCoords m_currentCellCoords;
bool m_currentCellHighlighted;
wxGridCellCoords m_selectedTopLeft;
wxGridCellCoords m_selectedBottomRight;
int m_defaultRowHeight;
wxArrayInt m_rowHeights;
wxArrayInt m_rowBottoms;
int m_defaultColWidth;
wxArrayInt m_colWidths;
wxArrayInt m_colRights;
int m_rowLabelWidth;
int m_colLabelHeight;
wxColour m_labelBackgroundColour;
wxColour m_labelTextColour;
wxFont m_labelFont;
int m_rowLabelHorizAlign;
int m_rowLabelVertAlign;
int m_colLabelHorizAlign;
int m_colLabelVertAlign;
bool m_defaultRowLabelValues;
bool m_defaultColLabelValues;
wxColour m_gridLineColour;
bool m_gridLinesEnabled;
wxFont m_defaultCellFont;
wxScrollBar * m_horizScrollBar;
wxScrollBar * m_vertScrollBar;
int m_scrollBarWidth;
int m_scrollPosX;
int m_scrollPosY;
int m_wholeColsVisible;
int m_wholeRowsVisible;
bool m_inOnKeyDown;
bool m_inOnText;
bool m_firstPaint;
int m_batchCount;
int m_cursorMode;
enum { WXGRID_CURSOR_DEFAULT,
WXGRID_CURSOR_SELECT_CELL,
WXGRID_CURSOR_RESIZE_ROW,
WXGRID_CURSOR_RESIZE_COL,
WXGRID_CURSOR_SELECT_ROW,
WXGRID_CURSOR_SELECT_COL
};
int m_dragLastPos;
int m_dragRowOrCol;
bool m_isDragging;
wxGridCellCoords m_selectionStart;
wxCursor m_rowResizeCursor;
wxCursor m_colResizeCursor;
bool m_editable; // applies to whole grid
int m_editCtrlType; // for current cell
wxWindow* m_cellEditCtrl;
bool m_cellEditCtrlEnabled;
wxWindow* m_topEditCtrl;
bool m_topEditCtrlEnabled;
// ------ internal init and update functions
//
void Create();
void Init();
void CalcDimensions();
bool IsOnScreen();
bool Redimension( wxGridTableMessage& );
// ------ event processing
//
bool SendEvent( const wxEventType,
int row, int col,
wxMouseEvent& );
bool SendEvent( const wxEventType,
int row, int col );
void OnPaint( wxPaintEvent& );
void OnSize( wxSizeEvent& );
void OnMouse( wxMouseEvent& );
void OnKeyDown( wxKeyEvent& );
void OnText( wxKeyEvent& );
void OnGridScroll( wxScrollEvent& );
void SelectCell( const wxGridCellCoords& coords );
void SelectCell( int row, int col )
{ SelectCell( wxGridCellCoords(row, col) ); }
// ------ edit controls
//
void ShowCellEditControl();
void HideCellEditControl();
void SaveEditControlValue();
// ------ grid location functions
//
int XYToArea( int x, int y ); // returns one of the following...
enum { WXGRID_NOAREA,
WXGRID_ROWLABEL,
WXGRID_ROWLABEL_EDGE,
WXGRID_COLLABEL,
WXGRID_COLLABEL_EDGE,
WXGRID_CORNERLABEL,
WXGRID_CELL };
void XYToCell( int x, int y, wxGridCellCoords& );
int YToRow( int y );
int XToCol( int x );
int YToEdgeOfRow( int y );
int XToEdgeOfCol( int x );
wxRect CellToRect( int row, int col );
wxRect CellToRect( const wxGridCellCoords& coords )
{ return CellToRect( coords.GetRow(), coords.GetCol() ); }
bool MoveCursorUp();
bool MoveCursorDown();
bool MoveCursorLeft();
bool MoveCursorRight();
bool MovePageDown();
bool MovePageUp();
bool MoveCursorUpBlock();
bool MoveCursorDownBlock();
bool MoveCursorLeftBlock();
bool MoveCursorRightBlock();
// ------ label drawing functions
//
void DrawLabelAreas( wxDC& dc );
void DrawColLabelBorders( wxDC& dc );
void DrawColLabels( wxDC& dc );
void DrawColLabel( wxDC& dc, const wxRect&, int col );
void DrawRowLabelBorders( wxDC& dc );
void DrawRowLabels( wxDC& dc );
void DrawRowLabel( wxDC& dc, const wxRect&, int col );
// ------ cell drawing functions
//
void DrawCellArea( wxDC& dc );
void DrawGridLines( wxDC& dc );
void DrawCells( wxDC& dc );
void DrawCellBackground( wxDC& dc, const wxRect&, int row, int col );
void DrawCellValue( wxDC& dc, const wxRect&, int row, int col,
const wxString& value = wxEmptyString, bool useValueArg = FALSE );
// this updates the displayed cell text value but not the underlying
// table cell value (it is used to echo text being entered into
// the top edit control when in-place editing is turned off)
//
void DrawCellValue( const wxGridCellCoords& coords, const wxString& value );
// these are useful when you just need to draw one or a few
// cells
void DrawCell( int row, int col );
void DrawCell( const wxGridCellCoords& coords )
{ DrawCell( coords.GetRow(), coords.GetCol() ); }
void DrawCellHighlight( wxDC& dc, int row, int col );
void DrawCellHighlight( wxDC& dc, wxGridCellCoords& coords )
{ DrawCellHighlight( dc, coords.GetRow(), coords.GetCol() ); }
void ShowCurrentCellHighlight( wxDC& dc );
void HideCurrentCellHighlight( wxDC& dc );
// ------ generic drawing functions
//
void DrawTextRectangle( wxDC& dc, const wxString&, const wxRect&,
int horizontalAlignment = wxLEFT,
int verticalAlignment = wxTOP );
// Split a string containing newline chararcters into an array of
// strings and return the number of lines
//
void StringToLines( const wxString& value, wxArrayString& lines );
void GetTextBoxSize( wxDC& dc,
wxArrayString& lines,
long *width, long *height );
// ------ functions to get/send data (see also public functions)
//
bool GetModelValues();
bool SetModelValues();
////////////////////// Public section ////////////////////
public:
wxGrid()
{ Create(); }
wxGrid( wxWindow *parent,
wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxPanelNameStr )
: wxPanel( parent, id, pos, size, style, name )
{
Create();
}
~wxGrid();
bool CreateGrid( int numRows = WXGRID_DEFAULT_NUMBER_ROWS,
int numCols = WXGRID_DEFAULT_NUMBER_COLS );
wxGridTableBase * GetTable() const { return m_table; }
void SetTable( wxGridTableBase *table ) { m_table = table; }
void ClearGrid();
bool InsertRows( int pos = 0, int numRows = 1, bool updateLabels=TRUE );
bool AppendRows( int numRows = 1, bool updateLabels=TRUE );
bool DeleteRows( int pos = 0, int numRows = 1, bool updateLabels=TRUE );
bool InsertCols( int pos = 0, int numCols = 1, bool updateLabels=TRUE );
bool AppendCols( int numCols = 1, bool updateLabels=TRUE );
bool DeleteCols( int pos = 0, int numCols = 1, bool updateLabels=TRUE );
// ------ editing and edit controls
//
bool IsEditable() { return m_editable; }
void EnableEditing( bool edit );
void EnableTopEditControl( bool enable );
bool IsTopEditControlEnabled()
{ return (m_topEditCtrl && m_topEditCtrlEnabled); }
void EnableCellEditControl( bool enable );
bool IsCellEditControlEnabled()
{ return (m_cellEditCtrl && m_cellEditCtrlEnabled); }
void SetEditControlValue( const wxString& s = wxEmptyString );
// ------ grid dimensions
//
int GetNumberRows() { return m_numRows; }
int GetNumberCols() { return m_numCols; }
int GetNumberVisibleRows() { return m_wholeRowsVisible; }
int GetNumberVisibleCols() { return m_wholeColsVisible; }
// ------
// Code that does a lot of grid modification can be enclosed
// between BeginBatch() and EndBatch() calls to avoid screen
// flicker
//
void BeginBatch() { m_batchCount++; }
void EndBatch() { if ( m_batchCount > 0 ) m_batchCount--; }
int GetBatchCount() { return m_batchCount; }
// ------ label and gridline formatting
//
int GetDefaultRowLabelSize() { return WXGRID_DEFAULT_ROW_LABEL_WIDTH; }
int GetRowLabelSize() { return m_rowLabelWidth; }
int GetDefaultColLabelSize() { return WXGRID_DEFAULT_COL_LABEL_HEIGHT; }
int GetColLabelSize() { return m_colLabelHeight; }
wxColour GetLabelBackgroundColour() { return m_labelBackgroundColour; }
wxColour GetLabelTextColour() { return m_labelTextColour; }
wxFont GetLabelFont() { return m_labelFont; }
void GetRowLabelAlignment( int *horiz, int *vert );
void GetColLabelAlignment( int *horiz, int *vert );
wxString GetRowLabelValue( int row );
wxString GetColLabelValue( int col );
wxColour GetGridLineColour() { return m_gridLineColour; }
void SetRowLabelSize( int width );
void SetColLabelSize( int height );
void SetLabelBackgroundColour( const wxColour& );
void SetLabelTextColour( const wxColour& );
void SetLabelFont( const wxFont& );
void SetRowLabelAlignment( int horiz, int vert );
void SetColLabelAlignment( int horiz, int vert );
void SetRowLabelValue( int row, const wxString& );
void SetColLabelValue( int col, const wxString& );
void SetGridLineColour( const wxColour& );
void EnableGridLines( bool enable = TRUE );
bool GridLinesEnabled() { return m_gridLinesEnabled; }
// ------ row and col formatting
//
int GetDefaultRowSize();
int GetRowSize( int row );
int GetDefaultColSize();
int GetColSize( int col );
wxColour GetDefaultCellBackgroundColour();
wxColour GetCellBackgroundColour( int row, int col );
wxColour GetDefaultCellTextColour();
wxColour GetCellTextColour( int row, int col );
wxColour GetCellHighlightColour();
wxFont GetDefaultCellFont();
wxFont GetCellFont( int row, int col );
void GetDefaultCellAlignment( int *horiz, int *vert );
void GetCellAlignment( int row, int col, int *horiz, int *vert );
void SetDefaultRowSize( int height, bool resizeExistingRows = FALSE );
void SetRowSize( int row, int height );
void SetDefaultColSize( int width, bool resizeExistingCols = FALSE );
void SetColSize( int col, int width );
void SetDefaultCellBackgroundColour( const wxColour& );
void SetCellBackgroundColour( int row, int col, const wxColour& );
void SetDefaultCellTextColour( const wxColour& );
void SetCellTextColour( int row, int col, const wxColour& );
void SetCellHighlightColour( const wxColour& );
void SetDefaultCellFont( const wxFont& );
void SetCellFont( int row, int col, const wxFont& );
void SetDefaultCellAlignment( int horiz, int vert );
void SetCellAlignment( int row, int col, int horiz, int vert );
// ------ cell value accessors
//
wxString GetCellValue( int row, int col )
{
if ( m_table )
{
return m_table->GetValue( row, col );
}
else
{
return wxEmptyString;
}
}
wxString GetCellValue( const wxGridCellCoords& coords )
{ return GetCellValue( coords.GetRow(), coords.GetCol() ); }
void SetCellValue( int row, int col, const wxString& s );
void SetCellValue( const wxGridCellCoords& coords, const wxString& s )
{ SetCellValue( coords.GetRow(), coords.GetCol(), s ); }
// ------ interaction with data model
//
bool ProcessTableMessage( wxGridTableMessage& );
// ------ grid location functions
//
int GetGridCursorRow() { return m_currentCellCoords.GetRow(); }
int GetGridCursorCol() { return m_currentCellCoords.GetCol(); }
int GetHorizontalScrollPos() { return m_scrollPosX; }
int GetVerticalScrollPos() { return m_scrollPosY; }
bool IsVisible( const wxGridCellCoords& );
void MakeCellVisible( int row, int col );
void MakeCellVisible( const wxGridCellCoords& coords )
{ MakeCellVisible( coords.GetRow(), coords.GetCol() ); }
void SetGridCursor( int row, int col )
{ SelectCell( wxGridCellCoords(row, col) ); }
void SetHorizontalScrollPos( int leftMostCol );
void SetVerticalScrollPos( int topMostRow );
// ------ selections of blocks of cells
//
void SelectRow( int row, bool addToSelected = FALSE );
void SelectCol( int col, bool addToSelected = FALSE );
void SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol );
void SelectBlock( const wxGridCellCoords& topLeft,
const wxGridCellCoords& bottomRight )
{ SelectBlock( topLeft.GetRow(), topLeft.GetCol(),
bottomRight.GetRow(), bottomRight.GetCol() ); }
void SelectAll();
bool IsSelection()
{ return ( m_selectedTopLeft != wxGridNoCellCoords &&
m_selectedBottomRight != wxGridNoCellCoords );
}
void ClearSelection();
bool IsInSelection( int row, int col )
{ return ( IsSelection() &&
row >= m_selectedTopLeft.GetRow() &&
col >= m_selectedTopLeft.GetCol() &&
row <= m_selectedBottomRight.GetRow() &&
col <= m_selectedBottomRight.GetCol() );
}
bool IsInSelection( const wxGridCellCoords& coords )
{ return IsInSelection( coords.GetRow(), coords.GetCol() ); }
void GetSelection( int* topRow, int* leftCol, int* bottomRow, int* rightCol )
{
// these will all be -1 if there is no selected block
//
*topRow = m_selectedTopLeft.GetRow();
*leftCol = m_selectedTopLeft.GetCol();
*bottomRow = m_selectedBottomRight.GetRow();
*rightCol = m_selectedBottomRight.GetCol();
}
// get coordinates of selected block edges for repainting etc.
//
wxRect SelectionToRect();
// ------ For compatibility with previous wxGrid only...
//
// ************************************************
// ** Don't use these in new code because they **
// ** are liable to disappear in a future **
// ** revision **
// ************************************************
//
wxGrid( wxWindow *parent,
int x = -1, int y = -1, int w = -1, int h = -1,
long style = 0,
const wxString& name = wxPanelNameStr )
: wxPanel( parent, -1, wxPoint(x,y), wxSize(w,h), style, name )
{
Create();
}
void SetCellValue( const wxString& val, int row, int col )
{ SetCellValue( row, col, val ); }
void AdjustScrollbars()
{ CalcDimensions(); }
void UpdateDimensions()
{ CalcDimensions(); }
int GetRows() { return GetNumberRows(); }
int GetCols() { return GetNumberCols(); }
int GetCursorRow() { return GetGridCursorRow(); }
int GetCursorColumn() { return GetGridCursorCol(); }
int GetScrollPosX() { return GetHorizontalScrollPos(); }
int GetScrollPosY() { return GetVerticalScrollPos(); }
void SetScrollX( int x ) { SetHorizontalScrollPos( x ); }
void SetScrollY( int y ) { SetVerticalScrollPos( y ); }
void SetColumnWidth( int col, int width )
{ SetColSize( col, width ); }
int GetColumnWidth( int col )
{ return GetColSize( col ); }
void SetRowHeight( int row, int height )
{ SetRowSize( row, height ); }
int GetRowHeight( int row )
{ return GetRowSize( row ); }
int GetViewHeight()
{ return m_wholeRowsVisible; }
int GetViewWidth()
{ return m_wholeColsVisible; }
void SetLabelSize( int orientation, int sz )
{
if ( orientation == wxHORIZONTAL )
SetColLabelSize( sz );
else
SetRowLabelSize( sz );
}
int GetLabelSize( int orientation )
{
if ( orientation == wxHORIZONTAL )
return GetColLabelSize();
else
return GetRowLabelSize();
}
void SetLabelAlignment( int orientation, int align )
{
if ( orientation == wxHORIZONTAL )
SetColLabelAlignment( align, -1 );
else
SetRowLabelAlignment( align, -1 );
}
int GetLabelAlignment( int orientation, int WXUNUSED(align) )
{
int h, v;
if ( orientation == wxHORIZONTAL )
{
GetColLabelAlignment( &h, &v );
return h;
}
else
{
GetRowLabelAlignment( &h, &v );
return h;
}
}
void SetLabelValue( int orientation, const wxString& val, int pos )
{
if ( orientation == wxHORIZONTAL )
SetColLabelValue( pos, val );
else
SetRowLabelValue( pos, val );
}
wxString GetLabelValue( int orientation, int pos)
{
if ( orientation == wxHORIZONTAL )
return GetColLabelValue( pos );
else
return GetRowLabelValue( pos );
}
wxFont GetCellTextFont() const
{ return m_defaultCellFont; }
wxFont GetCellTextFont(int WXUNUSED(row), int WXUNUSED(col)) const
{ return m_defaultCellFont; }
void SetCellTextFont(const wxFont& fnt)
{ SetDefaultCellFont( fnt ); }
void SetCellTextFont(const wxFont& fnt, int row, int col)
{ SetCellFont( row, col, fnt ); }
void SetCellTextColour(const wxColour& val, int row, int col)
{ SetCellTextColour( row, col, val ); }
void SetCellTextColour(const wxColour& col)
{ SetDefaultCellTextColour( col ); }
void SetCellBackgroundColour(const wxColour& col)
{ SetDefaultCellBackgroundColour( col ); }
void SetCellBackgroundColour(const wxColour& colour, int row, int col)
{ SetCellBackgroundColour( row, col, colour ); }
bool GetEditable() { return IsEditable(); }
void SetEditable( bool edit = TRUE ) { EnableEditing( edit ); }
bool GetEditInPlace() { return IsCellEditControlEnabled(); }
void SetEditInPlace(bool edit = TRUE) { EnableCellEditControl( edit ); }
void SetCellAlignment( int align, int row, int col)
{ SetCellAlignment(row, col, align, wxCENTER); }
void SetCellAlignment( int WXUNUSED(align) ) {}
void SetCellBitmap(wxBitmap *WXUNUSED(bitmap), int WXUNUSED(row), int WXUNUSED(col))
{ }
void SetDividerPen(const wxPen& WXUNUSED(pen)) { }
wxPen& GetDividerPen() const { return wxNullPen; }
void OnActivate(bool WXUNUSED(active)) {}
// ******** End of compatibility functions **********
// ------ control IDs
enum { wxGRID_HORIZSCROLL = 2000,
wxGRID_VERTSCROLL,
wxGRID_CELLCTRL,
wxGRID_TOPCTRL };
// ------ control types
enum { wxGRID_TEXTCTRL = 100,
wxGRID_CHECKBOX,
wxGRID_CHOICE,
wxGRID_COMBOBOX };
DECLARE_EVENT_TABLE()
};
//
// ------ Grid event class and event types
//
class WXDLLEXPORT wxGridEvent : public wxNotifyEvent
{
DECLARE_DYNAMIC_CLASS(wxGridEvent)
protected:
int m_row;
int m_col;
int m_x;
int m_y;
bool m_control;
bool m_meta;
bool m_shift;
bool m_alt;
public:
wxGridEvent()
: wxNotifyEvent(), m_row(-1), m_col(-1), m_x(-1), m_y(-1),
m_control(0), m_meta(0), m_shift(0), m_alt(0)
{
}
wxGridEvent(int id, wxEventType type, wxObject* obj,
int row=-1, int col=-1, int x=-1, int y=-1,
bool control=FALSE, bool shift=FALSE, bool alt=FALSE, bool meta=FALSE);
virtual int GetRow() { return m_row; }
virtual int GetCol() { return m_col; }
wxPoint GetPosition() { return wxPoint( m_x, m_y ); }
bool ControlDown() { return m_control; }
bool MetaDown() { return m_meta; }
bool ShiftDown() { return m_shift; }
bool AltDown() { return m_alt; }
};
class WXDLLEXPORT wxGridSizeEvent : public wxNotifyEvent
{
DECLARE_DYNAMIC_CLASS(wxGridSizeEvent)
protected:
int m_rowOrCol;
int m_x;
int m_y;
bool m_control;
bool m_meta;
bool m_shift;
bool m_alt;
public:
wxGridSizeEvent()
: wxNotifyEvent(), m_rowOrCol(-1), m_x(-1), m_y(-1),
m_control(0), m_meta(0), m_shift(0), m_alt(0)
{
}
wxGridSizeEvent(int id, wxEventType type, wxObject* obj,
int rowOrCol=-1, int x=-1, int y=-1,
bool control=FALSE, bool shift=FALSE, bool alt=FALSE, bool meta=FALSE);
int GetRowOrCol() { return m_rowOrCol; }
wxPoint GetPosition() { return wxPoint( m_x, m_y ); }
bool ControlDown() { return m_control; }
bool MetaDown() { return m_meta; }
bool ShiftDown() { return m_shift; }
bool AltDown() { return m_alt; }
};
class WXDLLEXPORT wxGridRangeSelectEvent : public wxNotifyEvent
{
DECLARE_DYNAMIC_CLASS(wxGridRangeSelectEvent)
protected:
wxGridCellCoords m_topLeft;
wxGridCellCoords m_bottomRight;
bool m_control;
bool m_meta;
bool m_shift;
bool m_alt;
public:
wxGridRangeSelectEvent()
: wxNotifyEvent()
{
m_topLeft = wxGridNoCellCoords;
m_bottomRight = wxGridNoCellCoords;
m_control = FALSE;
m_meta = FALSE;
m_shift = FALSE;
m_alt = FALSE;
}
wxGridRangeSelectEvent(int id, wxEventType type, wxObject* obj,
const wxGridCellCoords& topLeft,
const wxGridCellCoords& bottomRight,
bool control=FALSE, bool shift=FALSE,
bool alt=FALSE, bool meta=FALSE);
wxGridCellCoords GetTopLeftCoords() { return m_topLeft; }
wxGridCellCoords GetBottomRightCoords() { return m_bottomRight; }
int GetTopRow() { return m_topLeft.GetRow(); }
int GetBottomRow() { return m_bottomRight.GetRow(); }
int GetLeftCol() { return m_topLeft.GetCol(); }
int GetRightCol() { return m_bottomRight.GetCol(); }
bool ControlDown() { return m_control; }
bool MetaDown() { return m_meta; }
bool ShiftDown() { return m_shift; }
bool AltDown() { return m_alt; }
};
const wxEventType EVT_GRID_CELL_LEFT_CLICK = wxEVT_FIRST + 1580;
const wxEventType EVT_GRID_CELL_RIGHT_CLICK = wxEVT_FIRST + 1581;
const wxEventType EVT_GRID_CELL_LEFT_DCLICK = wxEVT_FIRST + 1582;
const wxEventType EVT_GRID_CELL_RIGHT_DCLICK = wxEVT_FIRST + 1583;
const wxEventType EVT_GRID_LABEL_LEFT_CLICK = wxEVT_FIRST + 1584;
const wxEventType EVT_GRID_LABEL_RIGHT_CLICK = wxEVT_FIRST + 1585;
const wxEventType EVT_GRID_LABEL_LEFT_DCLICK = wxEVT_FIRST + 1586;
const wxEventType EVT_GRID_LABEL_RIGHT_DCLICK = wxEVT_FIRST + 1587;
const wxEventType EVT_GRID_ROW_SIZE = wxEVT_FIRST + 1588;
const wxEventType EVT_GRID_COL_SIZE = wxEVT_FIRST + 1589;
const wxEventType EVT_GRID_RANGE_SELECT = wxEVT_FIRST + 1590;
const wxEventType EVT_GRID_CELL_CHANGE = wxEVT_FIRST + 1591;
const wxEventType EVT_GRID_SELECT_CELL = wxEVT_FIRST + 1592;
typedef void (wxEvtHandler::*wxGridEventFunction)(wxGridEvent&);
typedef void (wxEvtHandler::*wxGridSizeEventFunction)(wxGridSizeEvent&);
typedef void (wxEvtHandler::*wxGridRangeSelectEventFunction)(wxGridRangeSelectEvent&);
#define EVT_GRID_CELL_LEFT_CLICK(fn) { EVT_GRID_CELL_LEFT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
#define EVT_GRID_CELL_RIGHT_CLICK(fn) { EVT_GRID_CELL_RIGHT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
#define EVT_GRID_CELL_LEFT_DCLICK(fn) { EVT_GRID_CELL_LEFT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
#define EVT_GRID_CELL_RIGHT_DCLICK(fn) { EVT_GRID_CELL_RIGHT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
#define EVT_GRID_LABEL_LEFT_CLICK(fn) { EVT_GRID_LABEL_LEFT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
#define EVT_GRID_LABEL_RIGHT_CLICK(fn) { EVT_GRID_LABEL_RIGHT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
#define EVT_GRID_LABEL_LEFT_DCLICK(fn) { EVT_GRID_LABEL_LEFT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
#define EVT_GRID_LABEL_RIGHT_DCLICK(fn) { EVT_GRID_LABEL_RIGHT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
#define EVT_GRID_ROW_SIZE(fn) { EVT_GRID_ROW_SIZE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridSizeEventFunction) &fn, NULL },
#define EVT_GRID_COL_SIZE(fn) { EVT_GRID_COL_SIZE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridSizeEventFunction) &fn, NULL },
#define EVT_GRID_RANGE_SELECT(fn) { EVT_GRID_RANGE_SELECT, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridRangeSelectEventFunction) &fn, NULL },
#define EVT_GRID_CELL_CHANGE(fn) { EVT_GRID_CELL_CHANGE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
#define EVT_GRID_SELECT_CELL(fn) { EVT_GRID_SELECT_CELL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
#if 0 // TODO: implement these ? others ?
const wxEventType EVT_GRID_CREATE_CELL = wxEVT_FIRST + 1576;
const wxEventType EVT_GRID_CHANGE_LABELS = wxEVT_FIRST + 1577;
const wxEventType EVT_GRID_CHANGE_SEL_LABEL = wxEVT_FIRST + 1578;
#define EVT_GRID_CREATE_CELL(fn) { EVT_GRID_CREATE_CELL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
#define EVT_GRID_CHANGE_LABELS(fn) { EVT_GRID_CHANGE_LABELS, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
#define EVT_GRID_CHANGE_SEL_LABEL(fn) { EVT_GRID_CHANGE_SEL_LABEL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL },
#endif
#endif // #ifndef __WXGRID_H__
#endif // ifndef wxUSE_NEW_GRID