X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ef5df12bdf587773bcd0ac0e521af9fc9013a0c9..912c39325bfc8e9625d79d9114f67eb8d68326ce:/include/wx/generic/grid.h diff --git a/include/wx/generic/grid.h b/include/wx/generic/grid.h index 5601ed1c2a..a9acd59db1 100644 --- a/include/wx/generic/grid.h +++ b/include/wx/generic/grid.h @@ -2,42 +2,33 @@ // Name: wx/generic/grid.h // Purpose: wxGrid and related classes // Author: Michael Bedward (based on code by Julian Smart, Robin Dunn) -// Modified by: +// Modified by: Santiago Palacios // Created: 1/08/1999 // RCS-ID: $Id$ // Copyright: (c) Michael Bedward // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#include "wx/defs.h" +#ifndef _WX_GENERIC_GRID_H_ +#define _WX_GENERIC_GRID_H_ -#ifndef __WXGRID_H__ -#define __WXGRID_H__ +#include "wx/defs.h" -#if defined(__GNUG__) && !defined(__APPLE__) -#pragma interface "grid.h" -#endif +#if wxUSE_GRID -#include "wx/hash.h" -#include "wx/panel.h" #include "wx/scrolwin.h" -#include "wx/string.h" -#include "wx/scrolbar.h" -#include "wx/event.h" -#include "wx/combobox.h" -#include "wx/dynarray.h" -#include "wx/timer.h" -#include "wx/clntdata.h" // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- +extern WXDLLIMPEXP_DATA_ADV(const wxChar) wxGridNameStr[]; + // Default parameters for wxGrid // #define WXGRID_DEFAULT_NUMBER_ROWS 10 #define WXGRID_DEFAULT_NUMBER_COLS 10 -#ifdef __WXMSW__ +#if defined(__WXMSW__) || defined(__WXGTK20__) #define WXGRID_DEFAULT_ROW_HEIGHT 25 #else #define WXGRID_DEFAULT_ROW_HEIGHT 30 @@ -64,21 +55,22 @@ // forward declarations // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxGrid; -class WXDLLEXPORT wxGridCellAttr; -class WXDLLEXPORT wxGridCellAttrProviderData; -class WXDLLEXPORT wxGridColLabelWindow; -class WXDLLEXPORT wxGridCornerLabelWindow; -class WXDLLEXPORT wxGridRowLabelWindow; -class WXDLLEXPORT wxGridTableBase; -class WXDLLEXPORT wxGridWindow; -class WXDLLEXPORT wxGridTypeRegistry; -class WXDLLEXPORT wxGridSelection; +class WXDLLIMPEXP_ADV wxGrid; +class WXDLLIMPEXP_ADV wxGridCellAttr; +class WXDLLIMPEXP_ADV wxGridCellAttrProviderData; +class WXDLLIMPEXP_ADV wxGridColLabelWindow; +class WXDLLIMPEXP_ADV wxGridCornerLabelWindow; +class WXDLLIMPEXP_ADV wxGridRowLabelWindow; +class WXDLLIMPEXP_ADV wxGridWindow; +class WXDLLIMPEXP_ADV wxGridTypeRegistry; +class WXDLLIMPEXP_ADV wxGridSelection; class WXDLLEXPORT wxCheckBox; class WXDLLEXPORT wxComboBox; class WXDLLEXPORT wxTextCtrl; +#if wxUSE_SPINCTRL class WXDLLEXPORT wxSpinCtrl; +#endif // ---------------------------------------------------------------------------- // macros @@ -95,7 +87,7 @@ class WXDLLEXPORT wxSpinCtrl; // class is not documented and is not public at all // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxGridCellWorker : public wxClientDataContainer +class WXDLLIMPEXP_ADV wxGridCellWorker : public wxClientDataContainer { public: wxGridCellWorker() { m_nRef = 1; } @@ -104,7 +96,7 @@ public: // calling DecRef() once will delete it. Calling IncRef() allows to lock // it until the matching DecRef() is called void IncRef() { m_nRef++; } - void DecRef() { if ( !--m_nRef ) delete this; } + void DecRef() { if ( --m_nRef == 0 ) delete this; } // interpret renderer parameters: arbitrary string whose interpretatin is // left to the derived classes @@ -131,7 +123,7 @@ private: // predefined derived classes or derive your own class from it. // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxGridCellRenderer : public wxGridCellWorker +class WXDLLIMPEXP_ADV wxGridCellRenderer : public wxGridCellWorker { public: // draw the given cell on the provided DC inside the given rectangle @@ -159,7 +151,7 @@ public: }; // the default renderer for the cells containing string data -class WXDLLEXPORT wxGridCellStringRenderer : public wxGridCellRenderer +class WXDLLIMPEXP_ADV wxGridCellStringRenderer : public wxGridCellRenderer { public: // draw the string @@ -181,19 +173,19 @@ public: protected: // set the text colours before drawing - void SetTextColoursAndFont(wxGrid& grid, - wxGridCellAttr& attr, + void SetTextColoursAndFont(const wxGrid& grid, + const wxGridCellAttr& attr, wxDC& dc, bool isSelected); // calc the string extent for given string/font - wxSize DoGetBestSize(wxGridCellAttr& attr, + wxSize DoGetBestSize(const wxGridCellAttr& attr, wxDC& dc, const wxString& text); }; // the default renderer for the cells containing numeric (long) data -class WXDLLEXPORT wxGridCellNumberRenderer : public wxGridCellStringRenderer +class WXDLLIMPEXP_ADV wxGridCellNumberRenderer : public wxGridCellStringRenderer { public: // draw the string right aligned @@ -213,10 +205,10 @@ public: { return new wxGridCellNumberRenderer; } protected: - wxString GetString(wxGrid& grid, int row, int col); + wxString GetString(const wxGrid& grid, int row, int col); }; -class WXDLLEXPORT wxGridCellFloatRenderer : public wxGridCellStringRenderer +class WXDLLIMPEXP_ADV wxGridCellFloatRenderer : public wxGridCellStringRenderer { public: wxGridCellFloatRenderer(int width = -1, int precision = -1); @@ -246,7 +238,7 @@ public: virtual wxGridCellRenderer *Clone() const; protected: - wxString GetString(wxGrid& grid, int row, int col); + wxString GetString(const wxGrid& grid, int row, int col); private: // formatting parameters @@ -257,7 +249,7 @@ private: }; // renderer for boolean fields -class WXDLLEXPORT wxGridCellBoolRenderer : public wxGridCellRenderer +class WXDLLIMPEXP_ADV wxGridCellBoolRenderer : public wxGridCellRenderer { public: // draw a check mark or nothing @@ -289,7 +281,7 @@ private: // even for the entire grid. // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxGridCellEditor : public wxGridCellWorker +class WXDLLIMPEXP_ADV wxGridCellEditor : public wxGridCellWorker { public: wxGridCellEditor(); @@ -328,7 +320,7 @@ public: // Reset the value in the control back to its starting value virtual void Reset() = 0; - // return TRUE to allow the given key to start editing: the base class + // return true to allow the given key to start editing: the base class // version only checks that the event has no modifiers. The derived // classes are supposed to do "if ( base::IsAcceptedKey() && ... )" in // their IsAcceptedKey() implementation, although, of course, it is not a @@ -356,7 +348,6 @@ public: // create a new object which is the copy of this one virtual wxGridCellEditor *Clone() const = 0; - // DJC MAPTEK // added GetValue so we can get the value which is in the control virtual wxString GetValue() const = 0; @@ -372,7 +363,7 @@ protected: // if we change the colours/font of the control from the default ones, we // must restore the default later and we save them here between calls to - // Show(TRUE) and Show(FALSE) + // Show(true) and Show(false) wxColour m_colFgOld, m_colBgOld; wxFont m_fontOld; @@ -387,7 +378,7 @@ protected: #if wxUSE_TEXTCTRL // the editor for string/text data -class WXDLLEXPORT wxGridCellTextEditor : public wxGridCellEditor +class WXDLLIMPEXP_ADV wxGridCellTextEditor : public wxGridCellEditor { public: wxGridCellTextEditor(); @@ -413,9 +404,9 @@ public: virtual wxGridCellEditor *Clone() const { return new wxGridCellTextEditor; } - // DJC MAPTEK // added GetValue so we can get the value which is in the control virtual wxString GetValue() const; + protected: wxTextCtrl *Text() const { return (wxTextCtrl *)m_control; } @@ -426,10 +417,12 @@ protected: private: size_t m_maxChars; // max number of chars allowed wxString m_startValue; + + DECLARE_NO_COPY_CLASS(wxGridCellTextEditor) }; // the editor for numeric (long) data -class WXDLLEXPORT wxGridCellNumberEditor : public wxGridCellTextEditor +class WXDLLIMPEXP_ADV wxGridCellNumberEditor : public wxGridCellTextEditor { public: // allows to specify the range - if min == max == -1, no range checking is @@ -452,15 +445,24 @@ public: virtual wxGridCellEditor *Clone() const { return new wxGridCellNumberEditor(m_min, m_max); } - // DJC MAPTEK + // added GetValue so we can get the value which is in the control virtual wxString GetValue() const; protected: +#if wxUSE_SPINCTRL wxSpinCtrl *Spin() const { return (wxSpinCtrl *)m_control; } +#endif // if HasRange(), we use wxSpinCtrl - otherwise wxTextCtrl - bool HasRange() const { return m_min != m_max; } + bool HasRange() const + { +#if wxUSE_SPINCTRL + return m_min != m_max; +#else + return false; +#endif + } // string representation of m_valueOld wxString GetString() const @@ -471,10 +473,12 @@ private: m_max; long m_valueOld; + + DECLARE_NO_COPY_CLASS(wxGridCellNumberEditor) }; // the editor for floating point numbers (double) data -class WXDLLEXPORT wxGridCellFloatEditor : public wxGridCellTextEditor +class WXDLLIMPEXP_ADV wxGridCellFloatEditor : public wxGridCellTextEditor { public: wxGridCellFloatEditor(int width = -1, int precision = -1); @@ -504,6 +508,8 @@ private: int m_width, m_precision; double m_valueOld; + + DECLARE_NO_COPY_CLASS(wxGridCellFloatEditor) }; #endif // wxUSE_TEXTCTRL @@ -511,15 +517,17 @@ private: #if wxUSE_CHECKBOX // the editor for boolean data -class WXDLLEXPORT wxGridCellBoolEditor : public wxGridCellEditor +class WXDLLIMPEXP_ADV wxGridCellBoolEditor : public wxGridCellEditor { public: + wxGridCellBoolEditor() { } + virtual void Create(wxWindow* parent, wxWindowID id, wxEvtHandler* evtHandler); virtual void SetSize(const wxRect& rect); - virtual void Show(bool show, wxGridCellAttr *attr = (wxGridCellAttr *)NULL); + virtual void Show(bool show, wxGridCellAttr *attr = NULL); virtual bool IsAcceptedKey(wxKeyEvent& event); virtual void BeginEdit(int row, int col, wxGrid* grid); @@ -527,18 +535,33 @@ public: virtual void Reset(); virtual void StartingClick(); + virtual void StartingKey(wxKeyEvent& event); virtual wxGridCellEditor *Clone() const { return new wxGridCellBoolEditor; } - // DJC MAPTEK - // added GetValue so we can get the value which is in the control + + // added GetValue so we can get the value which is in the control, see + // also UseStringValues() virtual wxString GetValue() const; + // set the string values returned by GetValue() for the true and false + // states, respectively + static void UseStringValues(const wxString& valueTrue = _T("1"), + const wxString& valueFalse = wxEmptyString); + + // return true if the given string is equal to the string representation of + // true value which we currently use + static bool IsTrueValue(const wxString& value); + protected: wxCheckBox *CBox() const { return (wxCheckBox *)m_control; } private: bool m_startValue; + + static wxString ms_stringValues[2]; + + DECLARE_NO_COPY_CLASS(wxGridCellBoolEditor) }; #endif // wxUSE_CHECKBOX @@ -546,13 +569,15 @@ private: #if wxUSE_COMBOBOX // the editor for string data allowing to choose from the list of strings -class WXDLLEXPORT wxGridCellChoiceEditor : public wxGridCellEditor +class WXDLLIMPEXP_ADV wxGridCellChoiceEditor : public wxGridCellEditor { public: // if !allowOthers, user can't type a string not in choices array wxGridCellChoiceEditor(size_t count = 0, const wxString choices[] = NULL, - bool allowOthers = FALSE); + bool allowOthers = false); + wxGridCellChoiceEditor(const wxArrayString& choices, + bool allowOthers = false); virtual void Create(wxWindow* parent, wxWindowID id, @@ -569,7 +594,7 @@ public: virtual void SetParameters(const wxString& params); virtual wxGridCellEditor *Clone() const; - // DJC MAPTEK + // added GetValue so we can get the value which is in the control virtual wxString GetValue() const; @@ -582,6 +607,8 @@ protected: wxString m_startValue; wxArrayString m_choices; bool m_allowOthers; + + DECLARE_NO_COPY_CLASS(wxGridCellChoiceEditor) }; #endif // wxUSE_COMBOBOX @@ -592,7 +619,7 @@ protected: // class may be returned by wxGridTable::GetAttr(). // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxGridCellAttr : public wxClientDataContainer +class WXDLLIMPEXP_ADV wxGridCellAttr : public wxClientDataContainer { public: enum wxAttrKind @@ -605,13 +632,6 @@ public: Merged }; - enum wxAttrOverflowMode - { - Unset = -1, - Overflow, - SingleCell - }; - // ctors wxGridCellAttr(wxGridCellAttr *attrDefault = NULL) { @@ -642,7 +662,7 @@ public: // calling DecRef() once will delete it. Calling IncRef() allows to lock // it until the matching DecRef() is called void IncRef() { m_nRef++; } - void DecRef() { if ( !--m_nRef ) delete this; } + void DecRef() { if ( --m_nRef == 0 ) delete this; } // setters void SetTextColour(const wxColour& colText) { m_colText = colText; } @@ -654,9 +674,9 @@ public: m_vAlign = vAlign; } void SetSize(int num_rows, int num_cols); - void SetOverflow(bool allow = TRUE) + void SetOverflow(bool allow = true) { m_overflow = allow ? Overflow : SingleCell; } - void SetReadOnly(bool isReadOnly = TRUE) + void SetReadOnly(bool isReadOnly = true) { m_isReadOnly = isReadOnly ? ReadOnly : ReadWrite; } // takes ownership of the pointer @@ -675,7 +695,8 @@ public: bool HasRenderer() const { return m_renderer != NULL; } bool HasEditor() const { return m_editor != NULL; } bool HasReadWriteMode() const { return m_isReadOnly != Unset; } - bool HasOverflowMode() const { return m_overflow != Unset; } + bool HasOverflowMode() const { return m_overflow != UnsetOverflow; } + bool HasSize() const { return m_sizeRows != 1 || m_sizeCols != 1; } const wxColour& GetTextColour() const; const wxColour& GetBackgroundColour() const; @@ -683,7 +704,7 @@ public: void GetAlignment(int *hAlign, int *vAlign) const; void GetSize(int *num_rows, int *num_cols) const; bool GetOverflow() const - { return m_overflow != wxGridCellAttr::SingleCell; } + { return m_overflow != SingleCell; } wxGridCellRenderer *GetRenderer(wxGrid* grid, int row, int col) const; wxGridCellEditor *GetEditor(wxGrid* grid, int row, int col) const; @@ -693,6 +714,14 @@ public: void SetDefAttr(wxGridCellAttr* defAttr) { m_defGridAttr = defAttr; } +protected: + // the dtor is private because only DecRef() can delete us + virtual ~wxGridCellAttr() + { + wxSafeDecRef(m_renderer); + wxSafeDecRef(m_editor); + } + private: enum wxAttrReadMode { @@ -701,15 +730,16 @@ private: ReadOnly }; + enum wxAttrOverflowMode + { + UnsetOverflow = -1, + Overflow, + SingleCell + }; + // the common part of all ctors void Init(wxGridCellAttr *attrDefault = NULL); - // the dtor is private because only DecRef() can delete us - ~wxGridCellAttr() - { - wxSafeDecRef(m_renderer); - wxSafeDecRef(m_editor); - } // the ref count - when it goes to 0, we die size_t m_nRef; @@ -752,7 +782,7 @@ private: // the default implementation is reasonably efficient for the generic case, // but you might still wish to implement your own for some specific situations // if you have performance problems with the stock one -class WXDLLEXPORT wxGridCellAttrProvider : public wxClientDataContainer +class WXDLLIMPEXP_ADV wxGridCellAttrProvider : public wxClientDataContainer { public: wxGridCellAttrProvider(); @@ -788,7 +818,7 @@ private: ////////////////////////////////////////////////////////////////////// -class WXDLLEXPORT wxGridTableBase : public wxObject, public wxClientDataContainer +class WXDLLIMPEXP_ADV wxGridTableBase : public wxObject, public wxClientDataContainer { public: wxGridTableBase(); @@ -866,7 +896,7 @@ private: wxGrid * m_view; wxGridCellAttrProvider *m_attrProvider; - DECLARE_ABSTRACT_CLASS( wxGridTableBase ); + DECLARE_ABSTRACT_CLASS(wxGridTableBase) DECLARE_NO_COPY_CLASS(wxGridTableBase) }; @@ -889,7 +919,7 @@ enum wxGridTableRequest wxGRIDTABLE_NOTIFY_COLS_DELETED }; -class WXDLLEXPORT wxGridTableMessage +class WXDLLIMPEXP_ADV wxGridTableMessage { public: wxGridTableMessage(); @@ -921,7 +951,8 @@ private: // A 2-dimensional array of strings for data values // -WX_DECLARE_EXPORTED_OBJARRAY(wxArrayString, wxGridStringArray); +WX_DECLARE_OBJARRAY_WITH_DECL(wxArrayString, wxGridStringArray, + class WXDLLIMPEXP_ADV); @@ -931,7 +962,7 @@ WX_DECLARE_EXPORTED_OBJARRAY(wxArrayString, wxGridStringArray); // that are stored in memory // -class WXDLLEXPORT wxGridStringTable : public wxGridTableBase +class WXDLLIMPEXP_ADV wxGridStringTable : public wxGridTableBase { public: wxGridStringTable(); @@ -970,7 +1001,7 @@ private: wxArrayString m_rowLabels; wxArrayString m_colLabels; - DECLARE_DYNAMIC_CLASS( wxGridStringTable ) + DECLARE_DYNAMIC_CLASS_NO_COPY( wxGridStringTable ) }; @@ -983,7 +1014,7 @@ private: // wxGridCellCoords: location of a cell in the grid // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxGridCellCoords +class WXDLLIMPEXP_ADV wxGridCellCoords { public: wxGridCellCoords() { m_row = m_col = -1; } @@ -1030,31 +1061,36 @@ private: // For comparisons... // -extern WXDLLEXPORT wxGridCellCoords wxGridNoCellCoords; -extern WXDLLEXPORT wxRect wxGridNoCellRect; +extern WXDLLIMPEXP_ADV wxGridCellCoords wxGridNoCellCoords; +extern WXDLLIMPEXP_ADV wxRect wxGridNoCellRect; // An array of cell coords... // -WX_DECLARE_EXPORTED_OBJARRAY(wxGridCellCoords, wxGridCellCoordsArray); +WX_DECLARE_OBJARRAY_WITH_DECL(wxGridCellCoords, wxGridCellCoordsArray, + class WXDLLIMPEXP_ADV); // ---------------------------------------------------------------------------- // wxGrid // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxGrid : public wxScrolledWindow +class WXDLLIMPEXP_ADV wxGrid : public wxScrolledWindow { public: - wxGrid() - { - Create(); - } + wxGrid() ; - wxGrid( wxWindow *parent, + wxGrid( wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxWANTS_CHARS, - const wxString& name = wxPanelNameStr ); + const wxString& name = wxGridNameStr ); + + bool Create( wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxWANTS_CHARS, + const wxString& name = wxGridNameStr ); virtual ~wxGrid(); @@ -1093,19 +1129,20 @@ public: void DoEndDragResizeRow(); void DoEndDragResizeCol(); + void DoEndDragMoveCol(); wxGridTableBase * GetTable() const { return m_table; } - bool SetTable( wxGridTableBase *table, bool takeOwnership=FALSE, + bool SetTable( wxGridTableBase *table, bool takeOwnership = false, wxGrid::wxGridSelectionModes selmode = wxGrid::wxGridSelectCells ); 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 ); + 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 ); void DrawGridCellArea( wxDC& dc , const wxGridCellCoordsArray& cells ); void DrawGridSpace( wxDC& dc ); @@ -1118,11 +1155,11 @@ public: // and may be overridden by the user virtual void DrawCellHighlight( wxDC& dc, const wxGridCellAttr *attr ); - void DrawRowLabels( wxDC& dc, const wxArrayInt& rows ); - void DrawRowLabel( wxDC& dc, int row ); + virtual void DrawRowLabels( wxDC& dc, const wxArrayInt& rows ); + virtual void DrawRowLabel( wxDC& dc, int row ); - void DrawColLabels( wxDC& dc, const wxArrayInt& cols ); - void DrawColLabel( wxDC& dc, int col ); + virtual void DrawColLabels( wxDC& dc, const wxArrayInt& cols ); + virtual void DrawColLabel( wxDC& dc, int col ); // ------ Cell text drawing functions @@ -1143,7 +1180,7 @@ public: // void StringToLines( const wxString& value, wxArrayString& lines ); - void GetTextBoxSize( wxDC& dc, + void GetTextBoxSize( const wxDC& dc, const wxArrayString& lines, long *width, long *height ); @@ -1158,7 +1195,7 @@ public: int GetBatchCount() { return m_batchCount; } - virtual void Refresh(bool eraseb = TRUE, + virtual void Refresh(bool eraseb = true, const wxRect* rect = (const wxRect *) NULL); // Use this, rather than wxWindow::Refresh(), to force an @@ -1176,8 +1213,8 @@ public: bool IsEditable() const { return m_editable; } void EnableEditing( bool edit ); - void EnableCellEditControl( bool enable = TRUE ); - void DisableCellEditControl() { EnableCellEditControl(FALSE); } + void EnableCellEditControl( bool enable = true ); + void DisableCellEditControl() { EnableCellEditControl(false); } bool CanEnableCellControl() const; bool IsCellEditControlEnabled() const; bool IsCellEditControlShown() const; @@ -1196,7 +1233,7 @@ public: // void XYToCell( int x, int y, wxGridCellCoords& ); int YToRow( int y ); - int XToCol( int x ); + int XToCol( int x, bool clipToMinMax = false ); int YToEdgeOfRow( int y ); int XToEdgeOfCol( int x ); @@ -1211,8 +1248,8 @@ public: // check to see if a cell is either wholly visible (the default arg) or // at least partially visible in the grid window // - bool IsVisible( int row, int col, bool wholeCellVisible = TRUE ); - bool IsVisible( const wxGridCellCoords& coords, bool wholeCellVisible = TRUE ) + bool IsVisible( int row, int col, bool wholeCellVisible = true ); + bool IsVisible( const wxGridCellCoords& coords, bool wholeCellVisible = true ) { return IsVisible( coords.GetRow(), coords.GetCol(), wholeCellVisible ); } void MakeCellVisible( int row, int col ); void MakeCellVisible( const wxGridCellCoords& coords ) @@ -1251,6 +1288,12 @@ public: wxString GetRowLabelValue( int row ); wxString GetColLabelValue( int col ); wxColour GetGridLineColour() { return m_gridLineColour; } + + // these methods may be overridden to customize individual grid lines + // appearance + virtual wxPen GetDefaultGridLinePen(); + virtual wxPen GetRowGridLinePen(int row); + virtual wxPen GetColGridLinePen(int col); wxColour GetCellHighlightColour() { return m_cellHighlightColour; } int GetCellHighlightPenWidth() { return m_cellHighlightPenWidth; } int GetCellHighlightROPenWidth() { return m_cellHighlightROPenWidth; } @@ -1270,21 +1313,35 @@ public: void SetCellHighlightPenWidth(int width); void SetCellHighlightROPenWidth(int width); - void EnableDragRowSize( bool enable = TRUE ); - void DisableDragRowSize() { EnableDragRowSize( FALSE ); } + void EnableDragRowSize( bool enable = true ); + void DisableDragRowSize() { EnableDragRowSize( false ); } bool CanDragRowSize() { return m_canDragRowSize; } - void EnableDragColSize( bool enable = TRUE ); - void DisableDragColSize() { EnableDragColSize( FALSE ); } + void EnableDragColSize( bool enable = true ); + void DisableDragColSize() { EnableDragColSize( false ); } bool CanDragColSize() { return m_canDragColSize; } - void EnableDragGridSize(bool enable = TRUE); - void DisableDragGridSize() { EnableDragGridSize(FALSE); } + void EnableDragColMove( bool enable = true ); + void DisableDragColMove() { EnableDragColMove( false ); } + bool CanDragColMove() { return m_canDragColMove; } + void EnableDragGridSize(bool enable = true); + void DisableDragGridSize() { EnableDragGridSize(false); } bool CanDragGridSize() { return m_canDragGridSize; } + void EnableDragCell( bool enable = true ); + void DisableDragCell() { EnableDragCell( false ); } + bool CanDragCell() { return m_canDragCell; } + // this sets the specified attribute for this cell or in this row/col void SetAttr(int row, int col, wxGridCellAttr *attr); void SetRowAttr(int row, wxGridCellAttr *attr); void SetColAttr(int col, wxGridCellAttr *attr); + // returns the attribute we may modify in place: a new one if this cell + // doesn't have any yet or the existing one if it does + // + // DecRef() must be called on the returned pointer, as usual + wxGridCellAttr *GetOrCreateCellAttr(int row, int col) const; + + // shortcuts for setting the column parameters // set the format for the data in the column: default is string @@ -1293,7 +1350,7 @@ public: void SetColFormatFloat(int col, int width = -1, int precision = -1); void SetColFormatCustom(int col, const wxString& typeName); - void EnableGridLines( bool enable = TRUE ); + void EnableGridLines( bool enable = true ); bool GridLinesEnabled() { return m_gridLinesEnabled; } // ------ row and col formatting @@ -1314,26 +1371,53 @@ public: bool GetCellOverflow( int row, int col ); void GetCellSize( int row, int col, int *num_rows, int *num_cols ); - void SetDefaultRowSize( int height, bool resizeExistingRows = FALSE ); + void SetDefaultRowSize( int height, bool resizeExistingRows = false ); void SetRowSize( int row, int height ); - void SetDefaultColSize( int width, bool resizeExistingCols = FALSE ); + void SetDefaultColSize( int width, bool resizeExistingCols = false ); void SetColSize( int col, int width ); + //Column positions + int GetColAt( int colPos ) const + { + if ( m_colAt.IsEmpty() ) + return colPos; + else + return m_colAt[colPos]; + } + + void SetColPos( int colID, int newPos ); + + int GetColPos( int colID ) const + { + if ( m_colAt.IsEmpty() ) + return colID; + else + { + for ( int i = 0; i < m_numCols; i++ ) + { + if ( m_colAt[i] == colID ) + return i; + } + } + + return -1; + } + // automatically size the column or row to fit to its contents, if - // setAsMin is TRUE, this optimal width will also be set as minimal width + // setAsMin is true, this optimal width will also be set as minimal width // for this column - void AutoSizeColumn( int col, bool setAsMin = TRUE ) - { AutoSizeColOrRow(col, setAsMin, TRUE); } - void AutoSizeRow( int row, bool setAsMin = TRUE ) - { AutoSizeColOrRow(row, setAsMin, FALSE); } + void AutoSizeColumn( int col, bool setAsMin = true ) + { AutoSizeColOrRow(col, setAsMin, true); } + void AutoSizeRow( int row, bool setAsMin = true ) + { AutoSizeColOrRow(row, setAsMin, false); } // auto size all columns (very ineffective for big grids!) - void AutoSizeColumns( bool setAsMin = TRUE ) - { (void)SetOrCalcColumnSizes(FALSE, setAsMin); } + void AutoSizeColumns( bool setAsMin = true ) + { (void)SetOrCalcColumnSizes(false, setAsMin); } - void AutoSizeRows( bool setAsMin = TRUE ) - { (void)SetOrCalcRowSizes(FALSE, setAsMin); } + void AutoSizeRows( bool setAsMin = true ) + { (void)SetOrCalcRowSizes(false, setAsMin); } // auto size the grid, that is make the columns/rows of the "right" size // and also set the grid size to just fit its contents @@ -1351,6 +1435,18 @@ public: void SetColMinimalWidth( int col, int width ); void SetRowMinimalHeight( int row, int width ); + /* These members can be used to query and modify the minimal + * acceptable size of grid rows and columns. Call this function in + * your code which creates the grid if you want to display cells + * with a size smaller than the default acceptable minimum size. + * Like the members SetColMinimalWidth and SetRowMinimalWidth, + * the existing rows or columns will not be checked/resized. + */ + void SetColMinimalAcceptableWidth( int width ); + void SetRowMinimalAcceptableHeight( int width ); + int GetColMinimalAcceptableWidth() const; + int GetRowMinimalAcceptableHeight() const; + void SetDefaultCellBackgroundColour( const wxColour& ); void SetCellBackgroundColour( int row, int col, const wxColour& ); void SetDefaultCellTextColour( const wxColour& ); @@ -1399,23 +1495,23 @@ public: void SetCellValue( const wxGridCellCoords& coords, const wxString& s ) { SetCellValue( coords.GetRow(), coords.GetCol(), s ); } - // returns TRUE if the cell can't be edited + // returns true if the cell can't be edited bool IsReadOnly(int row, int col) const; // make the cell editable/readonly - void SetReadOnly(int row, int col, bool isReadOnly = TRUE); + void SetReadOnly(int row, int col, bool isReadOnly = true); // ------ select blocks of cells // - void SelectRow( int row, bool addToSelected = FALSE ); - void SelectCol( int col, bool addToSelected = FALSE ); + void SelectRow( int row, bool addToSelected = false ); + void SelectCol( int col, bool addToSelected = false ); void SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol, - bool addToSelected = FALSE ); + bool addToSelected = false ); void SelectBlock( const wxGridCellCoords& topLeft, const wxGridCellCoords& bottomRight, - bool addToSelected = FALSE ) + bool addToSelected = false ) { SelectBlock( topLeft.GetRow(), topLeft.GetCol(), bottomRight.GetRow(), bottomRight.GetCol(), addToSelected ); } @@ -1488,6 +1584,26 @@ public: wxWindow* GetGridColLabelWindow() { return (wxWindow*)m_colLabelWin; } wxWindow* GetGridCornerLabelWindow() { return (wxWindow*)m_cornerLabelWin; } + // Allow adjustment of scroll increment. The default is (15, 15). + void SetScrollLineX(int x) { m_scrollLineX = x; } + void SetScrollLineY(int y) { m_scrollLineY = y; } + int GetScrollLineX() const { return m_scrollLineX; } + int GetScrollLineY() const { return m_scrollLineY; } + + // Implementation + int GetScrollX(int x) const + { + return (x + GetScrollLineX() - 1) / GetScrollLineX(); + } + + int GetScrollY(int y) const + { + return (y + GetScrollLineY() - 1) / GetScrollLineY(); + } + + + // override some base class functions + virtual bool Enable(bool enable = true); // ------ For compatibility with previous wxGrid only... @@ -1500,10 +1616,10 @@ public: // wxGrid( wxWindow *parent, - int x, int y, int w = -1, int h = -1, + int x, int y, int w = wxDefaultCoord, int h = wxDefaultCoord, long style = wxWANTS_CHARS, const wxString& name = wxPanelNameStr ) - : wxScrolledWindow( parent, -1, wxPoint(x,y), wxSize(w,h), + : wxScrolledWindow( parent, wxID_ANY, wxPoint(x,y), wxSize(w,h), (style|wxWANTS_CHARS), name ) { Create(); @@ -1623,10 +1739,10 @@ public: { SetCellBackgroundColour( row, col, colour ); } bool GetEditable() { return IsEditable(); } - void SetEditable( bool edit = TRUE ) { EnableEditing( edit ); } + void SetEditable( bool edit = true ) { EnableEditing( edit ); } bool GetEditInPlace() { return IsCellEditControlEnabled(); } - void SetEditInPlace(bool WXUNUSED(edit) = TRUE) { } + void SetEditInPlace(bool WXUNUSED(edit) = true) { } void SetCellAlignment( int align, int row, int col) { SetCellAlignment(row, col, align, wxALIGN_CENTER); } @@ -1686,6 +1802,7 @@ protected: void InitRowHeights(); int m_defaultRowHeight; + int m_minAcceptableRowHeight; wxArrayInt m_rowHeights; wxArrayInt m_rowBottoms; @@ -1693,6 +1810,7 @@ protected: void InitColWidths(); int m_defaultColWidth; + int m_minAcceptableColWidth; wxArrayInt m_colWidths; wxArrayInt m_colRights; @@ -1737,16 +1855,16 @@ protected: // common part of AutoSizeColumn/Row() and GetBestSize() - int SetOrCalcColumnSizes(bool calcOnly, bool setAsMin = TRUE); - int SetOrCalcRowSizes(bool calcOnly, bool setAsMin = TRUE); + int SetOrCalcColumnSizes(bool calcOnly, bool setAsMin = true); + int SetOrCalcRowSizes(bool calcOnly, bool setAsMin = true); // common part of AutoSizeColumn/Row() void AutoSizeColOrRow(int n, bool setAsMin, bool column /* or row? */); // if a column has a minimal width, it will be the value for it in this // hash table - wxHashTableLong m_colMinWidths, - m_rowMinHeights; + wxLongToLongHashMap m_colMinWidths, + m_rowMinHeights; // get the minimal width of the given column/row int GetColMinimalWidth(int col) const; @@ -1755,12 +1873,6 @@ protected: // do we have some place to store attributes in? bool CanHaveAttributes(); - // returns the attribute we may modify in place: a new one if this cell - // doesn't have any yet or the existing one if it does - // - // DecRef() must be called on the returned pointer, as usual - wxGridCellAttr *GetOrCreateCellAttr(int row, int col) const; - // cell attribute cache (currently we only cache 1, may be will do // more/better later) struct CachedAttr @@ -1775,7 +1887,7 @@ protected: // adds an attribute to cache void CacheAttr(int row, int col, wxGridCellAttr *attr) const; - // looks for an attr in cache, returns TRUE if found + // looks for an attr in cache, returns true if found bool LookupAttr(int row, int col, wxGridCellAttr **attr) const; // looks for the attr in cache, if not found asks the table and caches the @@ -1800,25 +1912,32 @@ protected: WXGRID_CURSOR_RESIZE_ROW, WXGRID_CURSOR_RESIZE_COL, WXGRID_CURSOR_SELECT_ROW, - WXGRID_CURSOR_SELECT_COL + WXGRID_CURSOR_SELECT_COL, + WXGRID_CURSOR_MOVE_COL }; // this method not only sets m_cursorMode but also sets the correct cursor - // for the given mode and, if captureMouse is not FALSE releases the mouse + // for the given mode and, if captureMouse is not false releases the mouse // if it was captured and captures it if it must be captured // // for this to work, you should always use it and not set m_cursorMode // directly! void ChangeCursorMode(CursorMode mode, wxWindow *win = (wxWindow *)NULL, - bool captureMouse = TRUE); + bool captureMouse = true); wxWindow *m_winCapture; // the window which captured the mouse CursorMode m_cursorMode; + //Column positions + wxArrayInt m_colAt; + int m_moveToCol; + bool m_canDragRowSize; bool m_canDragColSize; + bool m_canDragColMove; bool m_canDragGridSize; + bool m_canDragCell; int m_dragLastPos; int m_dragRowOrCol; bool m_isDragging; @@ -1834,6 +1953,8 @@ protected: bool m_editable; // applies to whole grid bool m_cellEditCtrlEnabled; // is in-place edit currently shown? + int m_scrollLineX; // X scroll increment + int m_scrollLineY; // Y scroll increment void Create(); void Init(); @@ -1855,6 +1976,7 @@ protected: void OnSize( wxSizeEvent& ); void OnKeyDown( wxKeyEvent& ); void OnKeyUp( wxKeyEvent& ); + void OnChar( wxKeyEvent& ); void OnEraseBackground( wxEraseEvent& ); @@ -1874,18 +1996,19 @@ protected: bool GetModelValues(); bool SetModelValues(); - friend class WXDLLEXPORT wxGridSelection; + friend class WXDLLIMPEXP_ADV wxGridSelection; DECLARE_DYNAMIC_CLASS( wxGrid ) DECLARE_EVENT_TABLE() DECLARE_NO_COPY_CLASS(wxGrid) }; + // ---------------------------------------------------------------------------- // Grid event class and event types // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxGridEvent : public wxNotifyEvent +class WXDLLIMPEXP_ADV wxGridEvent : public wxNotifyEvent { public: wxGridEvent() @@ -1895,8 +2018,8 @@ public: } wxGridEvent(int id, wxEventType type, wxObject* obj, - int row=-1, int col=-1, int x=-1, int y=-1, bool sel = TRUE, - bool control=FALSE, bool shift=FALSE, bool alt=FALSE, bool meta=FALSE); + int row=-1, int col=-1, int x=-1, int y=-1, bool sel = true, + bool control = false, bool shift = false, bool alt = false, bool meta = false); virtual int GetRow() { return m_row; } virtual int GetCol() { return m_col; } @@ -1906,6 +2029,16 @@ public: bool MetaDown() { return m_meta; } bool ShiftDown() { return m_shift; } bool AltDown() { return m_alt; } + bool CmdDown() + { +#if defined(__WXMAC__) || defined(__WXCOCOA__) + return MetaDown(); +#else + return ControlDown(); +#endif + } + + virtual wxEvent *Clone() const { return new wxGridEvent(*this); } protected: int m_row; @@ -1918,10 +2051,10 @@ protected: bool m_shift; bool m_alt; - DECLARE_DYNAMIC_CLASS(wxGridEvent) + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridEvent) }; -class WXDLLEXPORT wxGridSizeEvent : public wxNotifyEvent +class WXDLLIMPEXP_ADV wxGridSizeEvent : public wxNotifyEvent { public: wxGridSizeEvent() @@ -1932,7 +2065,7 @@ public: 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); + 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 ); } @@ -1940,6 +2073,16 @@ public: bool MetaDown() { return m_meta; } bool ShiftDown() { return m_shift; } bool AltDown() { return m_alt; } + bool CmdDown() + { +#if defined(__WXMAC__) || defined(__WXCOCOA__) + return MetaDown(); +#else + return ControlDown(); +#endif + } + + virtual wxEvent *Clone() const { return new wxGridSizeEvent(*this); } protected: int m_rowOrCol; @@ -1950,11 +2093,11 @@ protected: bool m_shift; bool m_alt; - DECLARE_DYNAMIC_CLASS(wxGridSizeEvent) + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridSizeEvent) }; -class WXDLLEXPORT wxGridRangeSelectEvent : public wxNotifyEvent +class WXDLLIMPEXP_ADV wxGridRangeSelectEvent : public wxNotifyEvent { public: wxGridRangeSelectEvent() @@ -1962,19 +2105,19 @@ public: { m_topLeft = wxGridNoCellCoords; m_bottomRight = wxGridNoCellCoords; - m_selecting = FALSE; - m_control = FALSE; - m_meta = FALSE; - m_shift = FALSE; - m_alt = FALSE; + m_selecting = false; + 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 sel = TRUE, - bool control=FALSE, bool shift=FALSE, - bool alt=FALSE, bool meta=FALSE); + bool sel = true, + bool control = false, bool shift = false, + bool alt = false, bool meta = false); wxGridCellCoords GetTopLeftCoords() { return m_topLeft; } wxGridCellCoords GetBottomRightCoords() { return m_bottomRight; } @@ -1987,6 +2130,16 @@ public: bool MetaDown() { return m_meta; } bool ShiftDown() { return m_shift; } bool AltDown() { return m_alt; } + bool CmdDown() + { +#if defined(__WXMAC__) || defined(__WXCOCOA__) + return MetaDown(); +#else + return ControlDown(); +#endif + } + + virtual wxEvent *Clone() const { return new wxGridRangeSelectEvent(*this); } protected: wxGridCellCoords m_topLeft; @@ -1997,11 +2150,11 @@ protected: bool m_shift; bool m_alt; - DECLARE_DYNAMIC_CLASS(wxGridRangeSelectEvent) + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridRangeSelectEvent) }; -class WXDLLEXPORT wxGridEditorCreatedEvent : public wxCommandEvent { +class WXDLLIMPEXP_ADV wxGridEditorCreatedEvent : public wxCommandEvent { public: wxGridEditorCreatedEvent() : wxCommandEvent() @@ -2020,34 +2173,36 @@ public: void SetRow(int row) { m_row = row; } void SetCol(int col) { m_col = col; } void SetControl(wxControl* ctrl) { m_ctrl = ctrl; } + + virtual wxEvent *Clone() const { return new wxGridEditorCreatedEvent(*this); } private: int m_row; int m_col; wxControl* m_ctrl; - DECLARE_DYNAMIC_CLASS(wxGridEditorCreatedEvent) - DECLARE_NO_COPY_CLASS(wxGridEditorCreatedEvent) + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridEditorCreatedEvent) }; BEGIN_DECLARE_EVENT_TYPES() - DECLARE_EVENT_TYPE(wxEVT_GRID_CELL_LEFT_CLICK, 1580) - DECLARE_EVENT_TYPE(wxEVT_GRID_CELL_RIGHT_CLICK, 1581) - DECLARE_EVENT_TYPE(wxEVT_GRID_CELL_LEFT_DCLICK, 1582) - DECLARE_EVENT_TYPE(wxEVT_GRID_CELL_RIGHT_DCLICK, 1583) - DECLARE_EVENT_TYPE(wxEVT_GRID_LABEL_LEFT_CLICK, 1584) - DECLARE_EVENT_TYPE(wxEVT_GRID_LABEL_RIGHT_CLICK, 1585) - DECLARE_EVENT_TYPE(wxEVT_GRID_LABEL_LEFT_DCLICK, 1586) - DECLARE_EVENT_TYPE(wxEVT_GRID_LABEL_RIGHT_DCLICK, 1587) - DECLARE_EVENT_TYPE(wxEVT_GRID_ROW_SIZE, 1588) - DECLARE_EVENT_TYPE(wxEVT_GRID_COL_SIZE, 1589) - DECLARE_EVENT_TYPE(wxEVT_GRID_RANGE_SELECT, 1590) - DECLARE_EVENT_TYPE(wxEVT_GRID_CELL_CHANGE, 1591) - DECLARE_EVENT_TYPE(wxEVT_GRID_SELECT_CELL, 1592) - DECLARE_EVENT_TYPE(wxEVT_GRID_EDITOR_SHOWN, 1593) - DECLARE_EVENT_TYPE(wxEVT_GRID_EDITOR_HIDDEN, 1594) - DECLARE_EVENT_TYPE(wxEVT_GRID_EDITOR_CREATED, 1595) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_LEFT_CLICK, 1580) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_RIGHT_CLICK, 1581) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_LEFT_DCLICK, 1582) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_RIGHT_DCLICK, 1583) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_LEFT_CLICK, 1584) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_RIGHT_CLICK, 1585) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_LEFT_DCLICK, 1586) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_LABEL_RIGHT_DCLICK, 1587) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_ROW_SIZE, 1588) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_COL_SIZE, 1589) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_RANGE_SELECT, 1590) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_CHANGE, 1591) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_SELECT_CELL, 1592) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_EDITOR_SHOWN, 1593) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_EDITOR_HIDDEN, 1594) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_EDITOR_CREATED, 1595) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_CELL_BEGIN_DRAG, 1596) END_DECLARE_EVENT_TYPES() @@ -2056,23 +2211,67 @@ typedef void (wxEvtHandler::*wxGridSizeEventFunction)(wxGridSizeEvent&); typedef void (wxEvtHandler::*wxGridRangeSelectEventFunction)(wxGridRangeSelectEvent&); typedef void (wxEvtHandler::*wxGridEditorCreatedEventFunction)(wxGridEditorCreatedEvent&); -#define EVT_GRID_CELL_LEFT_CLICK(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CELL_LEFT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), -#define EVT_GRID_CELL_RIGHT_CLICK(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CELL_RIGHT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), -#define EVT_GRID_CELL_LEFT_DCLICK(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CELL_LEFT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), -#define EVT_GRID_CELL_RIGHT_DCLICK(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CELL_RIGHT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), -#define EVT_GRID_LABEL_LEFT_CLICK(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_LABEL_LEFT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), -#define EVT_GRID_LABEL_RIGHT_CLICK(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_LABEL_RIGHT_CLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), -#define EVT_GRID_LABEL_LEFT_DCLICK(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_LABEL_LEFT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), -#define EVT_GRID_LABEL_RIGHT_DCLICK(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_LABEL_RIGHT_DCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), -#define EVT_GRID_ROW_SIZE(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_ROW_SIZE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridSizeEventFunction) &fn, NULL ), -#define EVT_GRID_COL_SIZE(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_COL_SIZE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridSizeEventFunction) &fn, NULL ), -#define EVT_GRID_RANGE_SELECT(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_RANGE_SELECT, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridRangeSelectEventFunction) &fn, NULL ), -#define EVT_GRID_CELL_CHANGE(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CELL_CHANGE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), -#define EVT_GRID_SELECT_CELL(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_SELECT_CELL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), -#define EVT_GRID_EDITOR_SHOWN(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_EDITOR_SHOWN, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), -#define EVT_GRID_EDITOR_HIDDEN(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_EDITOR_HIDDEN, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), -#define EVT_GRID_EDITOR_CREATED(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_EDITOR_CREATED, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEditorCreatedEventFunction) &fn, NULL ), - +#define wxGridEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxGridEventFunction, &func) + +#define wxGridSizeEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxGridSizeEventFunction, &func) + +#define wxGridRangeSelectEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxGridRangeSelectEventFunction, &func) + +#define wxGridEditorCreatedEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxGridEditorCreatedEventFunction, &func) + +#define wx__DECLARE_GRIDEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_GRID_ ## evt, id, wxGridEventHandler(fn)) + +#define wx__DECLARE_GRIDSIZEEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_GRID_ ## evt, id, wxGridSizeEventHandler(fn)) + +#define wx__DECLARE_GRIDRANGESELEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_GRID_ ## evt, id, wxGridRangeSelectEventHandler(fn)) + +#define wx__DECLARE_GRIDEDITOREVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_GRID_ ## evt, id, wxGridEditorCreatedEventHandler(fn)) + +#define EVT_GRID_CMD_CELL_LEFT_CLICK(id, fn) wx__DECLARE_GRIDEVT(CELL_LEFT_CLICK, id, fn) +#define EVT_GRID_CMD_CELL_RIGHT_CLICK(id, fn) wx__DECLARE_GRIDEVT(CELL_RIGHT_CLICK, id, fn) +#define EVT_GRID_CMD_CELL_LEFT_DCLICK(id, fn) wx__DECLARE_GRIDEVT(CELL_LEFT_DCLICK, id, fn) +#define EVT_GRID_CMD_CELL_RIGHT_DCLICK(id, fn) wx__DECLARE_GRIDEVT(CELL_RIGHT_DCLICK, id, fn) +#define EVT_GRID_CMD_LABEL_LEFT_CLICK(id, fn) wx__DECLARE_GRIDEVT(LABEL_LEFT_CLICK, id, fn) +#define EVT_GRID_CMD_LABEL_RIGHT_CLICK(id, fn) wx__DECLARE_GRIDEVT(LABEL_RIGHT_CLICK, id, fn) +#define EVT_GRID_CMD_LABEL_LEFT_DCLICK(id, fn) wx__DECLARE_GRIDEVT(LABEL_LEFT_DCLICK, id, fn) +#define EVT_GRID_CMD_LABEL_RIGHT_DCLICK(id, fn) wx__DECLARE_GRIDEVT(LABEL_RIGHT_DCLICK, id, fn) +#define EVT_GRID_CMD_ROW_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(ROW_SIZE, id, fn) +#define EVT_GRID_CMD_COL_SIZE(id, fn) wx__DECLARE_GRIDSIZEEVT(COL_SIZE, id, fn) +#define EVT_GRID_CMD_RANGE_SELECT(id, fn) wx__DECLARE_GRIDRANGESELEVT(RANGE_SELECT, id, fn) +#define EVT_GRID_CMD_CELL_CHANGE(id, fn) wx__DECLARE_GRIDEVT(CELL_CHANGE, id, fn) +#define EVT_GRID_CMD_SELECT_CELL(id, fn) wx__DECLARE_GRIDEVT(SELECT_CELL, id, fn) +#define EVT_GRID_CMD_EDITOR_SHOWN(id, fn) wx__DECLARE_GRIDEVT(EDITOR_SHOWN, id, fn) +#define EVT_GRID_CMD_EDITOR_HIDDEN(id, fn) wx__DECLARE_GRIDEVT(EDITOR_HIDDEN, id, fn) +#define EVT_GRID_CMD_EDITOR_CREATED(id, fn) wx__DECLARE_GRIDEDITOREVT(EDITOR_CREATED, id, fn) +#define EVT_GRID_CMD_CELL_BEGIN_DRAG(id, fn) wx__DECLARE_GRIDEVT(CELL_BEGIN_DRAG, id, fn) + +// same as above but for any id (exists mainly for backwards compatibility but +// then it's also true that you rarely have multiple grid in the same window) +#define EVT_GRID_CELL_LEFT_CLICK(fn) EVT_GRID_CMD_CELL_LEFT_CLICK(wxID_ANY, fn) +#define EVT_GRID_CELL_RIGHT_CLICK(fn) EVT_GRID_CMD_CELL_RIGHT_CLICK(wxID_ANY, fn) +#define EVT_GRID_CELL_LEFT_DCLICK(fn) EVT_GRID_CMD_CELL_LEFT_DCLICK(wxID_ANY, fn) +#define EVT_GRID_CELL_RIGHT_DCLICK(fn) EVT_GRID_CMD_CELL_RIGHT_DCLICK(wxID_ANY, fn) +#define EVT_GRID_LABEL_LEFT_CLICK(fn) EVT_GRID_CMD_LABEL_LEFT_CLICK(wxID_ANY, fn) +#define EVT_GRID_LABEL_RIGHT_CLICK(fn) EVT_GRID_CMD_LABEL_RIGHT_CLICK(wxID_ANY, fn) +#define EVT_GRID_LABEL_LEFT_DCLICK(fn) EVT_GRID_CMD_LABEL_LEFT_DCLICK(wxID_ANY, fn) +#define EVT_GRID_LABEL_RIGHT_DCLICK(fn) EVT_GRID_CMD_LABEL_RIGHT_DCLICK(wxID_ANY, fn) +#define EVT_GRID_ROW_SIZE(fn) EVT_GRID_CMD_ROW_SIZE(wxID_ANY, fn) +#define EVT_GRID_COL_SIZE(fn) EVT_GRID_CMD_COL_SIZE(wxID_ANY, fn) +#define EVT_GRID_RANGE_SELECT(fn) EVT_GRID_CMD_RANGE_SELECT(wxID_ANY, fn) +#define EVT_GRID_CELL_CHANGE(fn) EVT_GRID_CMD_CELL_CHANGE(wxID_ANY, fn) +#define EVT_GRID_SELECT_CELL(fn) EVT_GRID_CMD_SELECT_CELL(wxID_ANY, fn) +#define EVT_GRID_EDITOR_SHOWN(fn) EVT_GRID_CMD_EDITOR_SHOWN(wxID_ANY, fn) +#define EVT_GRID_EDITOR_HIDDEN(fn) EVT_GRID_CMD_EDITOR_HIDDEN(wxID_ANY, fn) +#define EVT_GRID_EDITOR_CREATED(fn) EVT_GRID_CMD_EDITOR_CREATED(wxID_ANY, fn) +#define EVT_GRID_CELL_BEGIN_DRAG(fn) EVT_GRID_CMD_CELL_BEGIN_DRAG(wxID_ANY, fn) #if 0 // TODO: implement these ? others ? @@ -2080,11 +2279,11 @@ extern const int wxEVT_GRID_CREATE_CELL; extern const int wxEVT_GRID_CHANGE_LABELS; extern const int wxEVT_GRID_CHANGE_SEL_LABEL; -#define EVT_GRID_CREATE_CELL(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CREATE_CELL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), -#define EVT_GRID_CHANGE_LABELS(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CHANGE_LABELS, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), -#define EVT_GRID_CHANGE_SEL_LABEL(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CHANGE_SEL_LABEL, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxGridEventFunction) &fn, NULL ), +#define EVT_GRID_CREATE_CELL(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CREATE_CELL, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ), +#define EVT_GRID_CHANGE_LABELS(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CHANGE_LABELS, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ), +#define EVT_GRID_CHANGE_SEL_LABEL(fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_GRID_CHANGE_SEL_LABEL, wxID_ANY, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxGridEventFunction, &fn ), NULL ), #endif -#endif // ifndef wxUSE_GRID - +#endif // wxUSE_GRID +#endif // _WX_GENERIC_GRID_H_