X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2b01fd49183b64be59c4e7ba9bdaee479ff29ed2..7d61c83f406d54aefe0aac9b6de39bdc8f1c295f:/include/wx/generic/grid.h diff --git a/include/wx/generic/grid.h b/include/wx/generic/grid.h index c554e7236d..c78fe9494d 100644 --- a/include/wx/generic/grid.h +++ b/include/wx/generic/grid.h @@ -2,37 +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 ///////////////////////////////////////////////////////////////////////////// -#ifndef __WXGRID_H__ -#define __WXGRID_H__ +#ifndef _WX_GENERIC_GRID_H_ +#define _WX_GENERIC_GRID_H_ + +#include "wx/defs.h" + +#if wxUSE_GRID -#include "wx/hashmap.h" -#include "wx/panel.h" #include "wx/scrolwin.h" -#include "wx/string.h" -#include "wx/arrstr.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 @@ -55,26 +51,37 @@ #define wxGRID_VALUE_TEXT wxGRID_VALUE_STRING #define wxGRID_VALUE_LONG wxGRID_VALUE_NUMBER +// magic constant which tells (to some functions) to automatically calculate +// the appropriate size +#define wxGRID_AUTOSIZE (-1) + +// many wxGrid methods work either with columns or rows, this enum is used for +// the parameter indicating which one should it be +enum wxGridDirection +{ + wxGRID_COLUMN, + wxGRID_ROW +}; + // ---------------------------------------------------------------------------- // forward declarations // ---------------------------------------------------------------------------- -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 wxGridTableBase; -class WXDLLIMPEXP_ADV wxGridWindow; -class WXDLLIMPEXP_ADV wxGridTypeRegistry; -class WXDLLIMPEXP_ADV wxGridSelection; - -class WXDLLEXPORT wxCheckBox; -class WXDLLEXPORT wxComboBox; -class WXDLLEXPORT wxTextCtrl; +class WXDLLIMPEXP_FWD_ADV wxGrid; +class WXDLLIMPEXP_FWD_ADV wxGridCellAttr; +class WXDLLIMPEXP_FWD_ADV wxGridCellAttrProviderData; +class WXDLLIMPEXP_FWD_ADV wxGridColLabelWindow; +class WXDLLIMPEXP_FWD_ADV wxGridCornerLabelWindow; +class WXDLLIMPEXP_FWD_ADV wxGridRowLabelWindow; +class WXDLLIMPEXP_FWD_ADV wxGridWindow; +class WXDLLIMPEXP_FWD_ADV wxGridTypeRegistry; +class WXDLLIMPEXP_FWD_ADV wxGridSelection; + +class WXDLLIMPEXP_FWD_CORE wxCheckBox; +class WXDLLIMPEXP_FWD_CORE wxComboBox; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; #if wxUSE_SPINCTRL -class WXDLLEXPORT wxSpinCtrl; +class WXDLLIMPEXP_FWD_CORE wxSpinCtrl; #endif // ---------------------------------------------------------------------------- @@ -353,7 +360,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; @@ -410,13 +416,15 @@ 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; } // parts of our virtual functions reused by the derived classes + void DoCreate(wxWindow* parent, wxWindowID id, wxEvtHandler* evtHandler, + long style = 0); void DoBeginEdit(const wxString& startValue); void DoReset(const wxString& startValue); @@ -451,7 +459,7 @@ 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; @@ -533,7 +541,7 @@ public: 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); @@ -545,16 +553,28 @@ public: 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) }; @@ -588,7 +608,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; @@ -699,8 +719,8 @@ public: void GetSize(int *num_rows, int *num_cols) const; bool GetOverflow() const { return m_overflow != SingleCell; } - wxGridCellRenderer *GetRenderer(wxGrid* grid, int row, int col) const; - wxGridCellEditor *GetEditor(wxGrid* grid, int row, int col) const; + wxGridCellRenderer *GetRenderer(const wxGrid* grid, int row, int col) const; + wxGridCellEditor *GetEditor(const wxGrid* grid, int row, int col) const; bool IsReadOnly() const { return m_isReadOnly == wxGridCellAttr::ReadOnly; } @@ -1077,14 +1097,14 @@ public: 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 = wxPanelNameStr ); + const wxString& name = wxGridNameStr ); virtual ~wxGrid(); @@ -1101,16 +1121,16 @@ public: // ------ grid dimensions // - int GetNumberRows() { return m_numRows; } - int GetNumberCols() { return m_numCols; } + int GetNumberRows() const { return m_numRows; } + int GetNumberCols() const { return m_numCols; } // ------ display update functions // - wxArrayInt CalcRowLabelsExposed( const wxRegion& reg ); + wxArrayInt CalcRowLabelsExposed( const wxRegion& reg ) const; - wxArrayInt CalcColLabelsExposed( const wxRegion& reg ); - wxGridCellCoordsArray CalcCellsExposed( const wxRegion& reg ); + wxArrayInt CalcColLabelsExposed( const wxRegion& reg ) const; + wxGridCellCoordsArray CalcCellsExposed( const wxRegion& reg ) const; // ------ event handlers @@ -1123,6 +1143,7 @@ public: void DoEndDragResizeRow(); void DoEndDragResizeCol(); + void DoEndDragMoveCol(); wxGridTableBase * GetTable() const { return m_table; } bool SetTable( wxGridTableBase *table, bool takeOwnership = false, @@ -1168,14 +1189,14 @@ public: int textOrientation = wxHORIZONTAL ); - // Split a string containing newline chararcters into an array of + // Split a string containing newline characters into an array of // strings and return the number of lines // - void StringToLines( const wxString& value, wxArrayString& lines ); + void StringToLines( const wxString& value, wxArrayString& lines ) const; void GetTextBoxSize( const wxDC& dc, const wxArrayString& lines, - long *width, long *height ); + long *width, long *height ) const; // ------ @@ -1224,25 +1245,25 @@ public: // grid cells and labels so you will need to convert from device // coordinates for mouse events etc. // - void XYToCell( int x, int y, wxGridCellCoords& ); - int YToRow( int y ); - int XToCol( int x ); + void XYToCell( int x, int y, wxGridCellCoords& ) const; + int YToRow( int y ) const; + int XToCol( int x, bool clipToMinMax = false ) const; - int YToEdgeOfRow( int y ); - int XToEdgeOfCol( int x ); + int YToEdgeOfRow( int y ) const; + int XToEdgeOfCol( int x ) const; - wxRect CellToRect( int row, int col ); - wxRect CellToRect( const wxGridCellCoords& coords ) + wxRect CellToRect( int row, int col ) const; + wxRect CellToRect( const wxGridCellCoords& coords ) const { return CellToRect( coords.GetRow(), coords.GetCol() ); } - int GetGridCursorRow() { return m_currentCellCoords.GetRow(); } - int GetGridCursorCol() { return m_currentCellCoords.GetCol(); } + int GetGridCursorRow() const { return m_currentCellCoords.GetRow(); } + int GetGridCursorCol() const { return m_currentCellCoords.GetCol(); } // 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 ) const; + bool IsVisible( const wxGridCellCoords& coords, bool wholeCellVisible = true ) const { return IsVisible( coords.GetRow(), coords.GetCol(), wholeCellVisible ); } void MakeCellVisible( int row, int col ); void MakeCellVisible( const wxGridCellCoords& coords ) @@ -1268,22 +1289,28 @@ public: // ------ 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 ); - int GetColLabelTextOrientation(); - wxString GetRowLabelValue( int row ); - wxString GetColLabelValue( int col ); - wxColour GetGridLineColour() { return m_gridLineColour; } - wxColour GetCellHighlightColour() { return m_cellHighlightColour; } - int GetCellHighlightPenWidth() { return m_cellHighlightPenWidth; } - int GetCellHighlightROPenWidth() { return m_cellHighlightROPenWidth; } + int GetDefaultRowLabelSize() const { return WXGRID_DEFAULT_ROW_LABEL_WIDTH; } + int GetRowLabelSize() const { return m_rowLabelWidth; } + int GetDefaultColLabelSize() const { return WXGRID_DEFAULT_COL_LABEL_HEIGHT; } + int GetColLabelSize() const { return m_colLabelHeight; } + wxColour GetLabelBackgroundColour() const { return m_labelBackgroundColour; } + wxColour GetLabelTextColour() const { return m_labelTextColour; } + wxFont GetLabelFont() const { return m_labelFont; } + void GetRowLabelAlignment( int *horiz, int *vert ) const; + void GetColLabelAlignment( int *horiz, int *vert ) const; + int GetColLabelTextOrientation() const; + wxString GetRowLabelValue( int row ) const; + wxString GetColLabelValue( int col ) const; + wxColour GetGridLineColour() const { 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() const { return m_cellHighlightColour; } + int GetCellHighlightPenWidth() const { return m_cellHighlightPenWidth; } + int GetCellHighlightROPenWidth() const { return m_cellHighlightROPenWidth; } void SetRowLabelSize( int width ); void SetColLabelSize( int height ); @@ -1302,17 +1329,20 @@ public: void EnableDragRowSize( bool enable = true ); void DisableDragRowSize() { EnableDragRowSize( false ); } - bool CanDragRowSize() { return m_canDragRowSize; } + bool CanDragRowSize() const { return m_canDragRowSize; } void EnableDragColSize( bool enable = true ); void DisableDragColSize() { EnableDragColSize( false ); } - bool CanDragColSize() { return m_canDragColSize; } + bool CanDragColSize() const { return m_canDragColSize; } + void EnableDragColMove( bool enable = true ); + void DisableDragColMove() { EnableDragColMove( false ); } + bool CanDragColMove() const { return m_canDragColMove; } void EnableDragGridSize(bool enable = true); void DisableDragGridSize() { EnableDragGridSize(false); } - bool CanDragGridSize() { return m_canDragGridSize; } + bool CanDragGridSize() const { return m_canDragGridSize; } void EnableDragCell( bool enable = true ); void DisableDragCell() { EnableDragCell( false ); } - bool CanDragCell() { return m_canDragCell; } + bool CanDragCell() const { return m_canDragCell; } // this sets the specified attribute for this cell or in this row/col void SetAttr(int row, int col, wxGridCellAttr *attr); @@ -1335,25 +1365,25 @@ public: void SetColFormatCustom(int col, const wxString& typeName); void EnableGridLines( bool enable = true ); - bool GridLinesEnabled() { return m_gridLinesEnabled; } + bool GridLinesEnabled() const { 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 ); - wxFont GetDefaultCellFont(); - wxFont GetCellFont( int row, int col ); - void GetDefaultCellAlignment( int *horiz, int *vert ); - void GetCellAlignment( int row, int col, int *horiz, int *vert ); - bool GetDefaultCellOverflow(); - bool GetCellOverflow( int row, int col ); - void GetCellSize( int row, int col, int *num_rows, int *num_cols ); + int GetDefaultRowSize() const; + int GetRowSize( int row ) const; + int GetDefaultColSize() const; + int GetColSize( int col ) const; + wxColour GetDefaultCellBackgroundColour() const; + wxColour GetCellBackgroundColour( int row, int col ) const; + wxColour GetDefaultCellTextColour() const; + wxColour GetCellTextColour( int row, int col ) const; + wxFont GetDefaultCellFont() const; + wxFont GetCellFont( int row, int col ) const; + void GetDefaultCellAlignment( int *horiz, int *vert ) const; + void GetCellAlignment( int row, int col, int *horiz, int *vert ) const; + bool GetDefaultCellOverflow() const; + bool GetCellOverflow( int row, int col ) const; + void GetCellSize( int row, int col, int *num_rows, int *num_cols ) const; void SetDefaultRowSize( int height, bool resizeExistingRows = false ); void SetRowSize( int row, int height ); @@ -1361,13 +1391,40 @@ public: 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 // for this column void AutoSizeColumn( int col, bool setAsMin = true ) - { AutoSizeColOrRow(col, setAsMin, true); } + { AutoSizeColOrRow(col, setAsMin, wxGRID_COLUMN); } void AutoSizeRow( int row, bool setAsMin = true ) - { AutoSizeColOrRow(row, setAsMin, false); } + { AutoSizeColOrRow(row, setAsMin, wxGRID_ROW); } // auto size all columns (very ineffective for big grids!) void AutoSizeColumns( bool setAsMin = true ) @@ -1380,6 +1437,10 @@ public: // and also set the grid size to just fit its contents void AutoSize(); + // Note for both AutoSizeRowLabelSize and AutoSizeColLabelSize: + // If col equals to wxGRID_AUTOSIZE value then function autosizes labels column + // instead of data column. Note that this operation may be slow for large + // tables. // autosize row height depending on label text void AutoSizeRowLabelSize( int row ); @@ -1421,19 +1482,19 @@ public: void SetDefaultRenderer(wxGridCellRenderer *renderer); void SetCellRenderer(int row, int col, wxGridCellRenderer *renderer); wxGridCellRenderer *GetDefaultRenderer() const; - wxGridCellRenderer* GetCellRenderer(int row, int col); + wxGridCellRenderer* GetCellRenderer(int row, int col) const; // takes ownership of the pointer void SetDefaultEditor(wxGridCellEditor *editor); void SetCellEditor(int row, int col, wxGridCellEditor *editor); wxGridCellEditor *GetDefaultEditor() const; - wxGridCellEditor* GetCellEditor(int row, int col); + wxGridCellEditor* GetCellEditor(int row, int col) const; // ------ cell value accessors // - wxString GetCellValue( int row, int col ) + wxString GetCellValue( int row, int col ) const { if ( m_table ) { @@ -1445,7 +1506,7 @@ public: } } - wxString GetCellValue( const wxGridCellCoords& coords ) + wxString GetCellValue( const wxGridCellCoords& coords ) const { return GetCellValue( coords.GetRow(), coords.GetCol() ); } void SetCellValue( int row, int col, const wxString& s ); @@ -1475,7 +1536,7 @@ public: void SelectAll(); - bool IsSelection(); + bool IsSelection() const; // ------ deselect blocks or cells // @@ -1501,7 +1562,7 @@ public: // to the client size of the grid window. // wxRect BlockToDeviceRect( const wxGridCellCoords & topLeft, - const wxGridCellCoords & bottomRight ); + const wxGridCellCoords & bottomRight ) const; // Access or update the selection fore/back colours wxColour GetSelectionBackground() const @@ -1536,10 +1597,10 @@ public: } // Accessors for component windows - wxWindow* GetGridWindow() { return (wxWindow*)m_gridWin; } - wxWindow* GetGridRowLabelWindow() { return (wxWindow*)m_rowLabelWin; } - wxWindow* GetGridColLabelWindow() { return (wxWindow*)m_colLabelWin; } - wxWindow* GetGridCornerLabelWindow() { return (wxWindow*)m_cornerLabelWin; } + wxWindow* GetGridWindow() const { return (wxWindow*)m_gridWin; } + wxWindow* GetGridRowLabelWindow() const { return (wxWindow*)m_rowLabelWin; } + wxWindow* GetGridColLabelWindow() const { return (wxWindow*)m_colLabelWin; } + wxWindow* GetGridCornerLabelWindow() const { return (wxWindow*)m_cornerLabelWin; } // Allow adjustment of scroll increment. The default is (15, 15). void SetScrollLineX(int x) { m_scrollLineX = x; } @@ -1588,13 +1649,13 @@ public: void UpdateDimensions() { CalcDimensions(); } - int GetRows() { return GetNumberRows(); } - int GetCols() { return GetNumberCols(); } - int GetCursorRow() { return GetGridCursorRow(); } - int GetCursorColumn() { return GetGridCursorCol(); } + int GetRows() const { return GetNumberRows(); } + int GetCols() const { return GetNumberCols(); } + int GetCursorRow() const { return GetGridCursorRow(); } + int GetCursorColumn() const { return GetGridCursorCol(); } - int GetScrollPosX() { return 0; } - int GetScrollPosY() { return 0; } + int GetScrollPosX() const { return 0; } + int GetScrollPosY() const { return 0; } void SetScrollX( int WXUNUSED(x) ) { } void SetScrollY( int WXUNUSED(y) ) { } @@ -1602,7 +1663,7 @@ public: void SetColumnWidth( int col, int width ) { SetColSize( col, width ); } - int GetColumnWidth( int col ) + int GetColumnWidth( int col ) const { return GetColSize( col ); } void SetRowHeight( int row, int height ) @@ -1610,10 +1671,10 @@ public: // GetRowHeight() is below - int GetViewHeight() // returned num whole rows visible + int GetViewHeight() const // returned num whole rows visible { return 0; } - int GetViewWidth() // returned num whole cols visible + int GetViewWidth() const // returned num whole cols visible { return 0; } void SetLabelSize( int orientation, int sz ) @@ -1624,7 +1685,7 @@ public: SetRowLabelSize( sz ); } - int GetLabelSize( int orientation ) + int GetLabelSize( int orientation ) const { if ( orientation == wxHORIZONTAL ) return GetColLabelSize(); @@ -1640,7 +1701,7 @@ public: SetRowLabelAlignment( align, -1 ); } - int GetLabelAlignment( int orientation, int WXUNUSED(align) ) + int GetLabelAlignment( int orientation, int WXUNUSED(align) ) const { int h, v; if ( orientation == wxHORIZONTAL ) @@ -1663,7 +1724,7 @@ public: SetRowLabelValue( pos, val ); } - wxString GetLabelValue( int orientation, int pos) + wxString GetLabelValue( int orientation, int pos) const { if ( orientation == wxHORIZONTAL ) return GetColLabelValue( pos ); @@ -1695,9 +1756,9 @@ public: void SetCellBackgroundColour(const wxColour& colour, int row, int col) { SetCellBackgroundColour( row, col, colour ); } - bool GetEditable() { return IsEditable(); } + bool GetEditable() const { return IsEditable(); } void SetEditable( bool edit = true ) { EnableEditing( edit ); } - bool GetEditInPlace() { return IsCellEditControlEnabled(); } + bool GetEditInPlace() const { return IsCellEditControlEnabled(); } void SetEditInPlace(bool WXUNUSED(edit) = true) { } @@ -1727,6 +1788,9 @@ public: // overridden wxWindow methods virtual void Fit(); + // implementation only + void CancelMouseCapture(); + protected: virtual wxSize DoGetBestSize() const; @@ -1816,7 +1880,10 @@ protected: int SetOrCalcRowSizes(bool calcOnly, bool setAsMin = true); // common part of AutoSizeColumn/Row() - void AutoSizeColOrRow(int n, bool setAsMin, bool column /* or row? */); + void AutoSizeColOrRow(int n, bool setAsMin, wxGridDirection direction); + + // Calculate the minimum acceptable size for labels area + wxCoord CalcColOrRowLabelAreaMinSize(wxGridDirection direction); // if a column has a minimal width, it will be the value for it in this // hash table @@ -1828,7 +1895,7 @@ protected: int GetRowMinimalHeight(int col) const; // do we have some place to store attributes in? - bool CanHaveAttributes(); + bool CanHaveAttributes() const; // cell attribute cache (currently we only cache 1, may be will do // more/better later) @@ -1850,7 +1917,7 @@ protected: // looks for the attr in cache, if not found asks the table and caches the // result wxGridCellAttr *GetCellAttr(int row, int col) const; - wxGridCellAttr *GetCellAttr(const wxGridCellCoords& coords ) + wxGridCellAttr *GetCellAttr(const wxGridCellCoords& coords ) const { return GetCellAttr( coords.GetRow(), coords.GetCol() ); } // the default cell attr object for cells that don't have their own @@ -1869,7 +1936,8 @@ 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 @@ -1885,8 +1953,13 @@ protected: 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; @@ -1947,13 +2020,53 @@ protected: bool GetModelValues(); bool SetModelValues(); - friend class WXDLLIMPEXP_ADV wxGridSelection; + friend class WXDLLIMPEXP_FWD_ADV wxGridSelection; DECLARE_DYNAMIC_CLASS( wxGrid ) DECLARE_EVENT_TABLE() DECLARE_NO_COPY_CLASS(wxGrid) }; +// ---------------------------------------------------------------------------- +// wxGridUpdateLocker prevents updates to a grid during its lifetime +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxGridUpdateLocker +{ +public: + // if the pointer is NULL, Create() can be called later + wxGridUpdateLocker(wxGrid *grid = NULL) + { + Init(grid); + } + + // can be called if ctor was used with a NULL pointer, must not be called + // more than once + void Create(wxGrid *grid) + { + wxASSERT_MSG( !m_grid, _T("shouldn't be called more than once") ); + + Init(grid); + } + + ~wxGridUpdateLocker() + { + if ( m_grid ) + m_grid->EndBatch(); + } + +private: + void Init(wxGrid *grid) + { + m_grid = grid; + if ( m_grid ) + m_grid->BeginBatch(); + } + + wxGrid *m_grid; + + DECLARE_NO_COPY_CLASS(wxGridUpdateLocker) +}; // ---------------------------------------------------------------------------- // Grid event class and event types @@ -1980,7 +2093,7 @@ public: bool MetaDown() { return m_meta; } bool ShiftDown() { return m_shift; } bool AltDown() { return m_alt; } - bool CmdDown() + bool CmdDown() { #if defined(__WXMAC__) || defined(__WXCOCOA__) return MetaDown(); @@ -1989,6 +2102,8 @@ public: #endif } + virtual wxEvent *Clone() const { return new wxGridEvent(*this); } + protected: int m_row; int m_col; @@ -2000,7 +2115,7 @@ protected: bool m_shift; bool m_alt; - DECLARE_DYNAMIC_CLASS_NO_COPY(wxGridEvent) + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridEvent) }; class WXDLLIMPEXP_ADV wxGridSizeEvent : public wxNotifyEvent @@ -2022,7 +2137,7 @@ public: bool MetaDown() { return m_meta; } bool ShiftDown() { return m_shift; } bool AltDown() { return m_alt; } - bool CmdDown() + bool CmdDown() { #if defined(__WXMAC__) || defined(__WXCOCOA__) return MetaDown(); @@ -2031,6 +2146,8 @@ public: #endif } + virtual wxEvent *Clone() const { return new wxGridSizeEvent(*this); } + protected: int m_rowOrCol; int m_x; @@ -2040,7 +2157,7 @@ protected: bool m_shift; bool m_alt; - DECLARE_DYNAMIC_CLASS_NO_COPY(wxGridSizeEvent) + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridSizeEvent) }; @@ -2077,7 +2194,7 @@ public: bool MetaDown() { return m_meta; } bool ShiftDown() { return m_shift; } bool AltDown() { return m_alt; } - bool CmdDown() + bool CmdDown() { #if defined(__WXMAC__) || defined(__WXCOCOA__) return MetaDown(); @@ -2086,6 +2203,8 @@ public: #endif } + virtual wxEvent *Clone() const { return new wxGridRangeSelectEvent(*this); } + protected: wxGridCellCoords m_topLeft; wxGridCellCoords m_bottomRight; @@ -2095,7 +2214,7 @@ protected: bool m_shift; bool m_alt; - DECLARE_DYNAMIC_CLASS_NO_COPY(wxGridRangeSelectEvent) + DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxGridRangeSelectEvent) }; @@ -2119,13 +2238,14 @@ public: 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) }; @@ -2147,6 +2267,7 @@ BEGIN_DECLARE_EVENT_TYPES() 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) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_GRID_COL_MOVE, 1597) END_DECLARE_EVENT_TYPES() @@ -2189,6 +2310,7 @@ typedef void (wxEvtHandler::*wxGridEditorCreatedEventFunction)(wxGridEditorCreat #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_COL_MOVE(id, fn) wx__DECLARE_GRIDSIZEEVT(COL_MOVE, 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) @@ -2209,6 +2331,7 @@ typedef void (wxEvtHandler::*wxGridEditorCreatedEventFunction)(wxGridEditorCreat #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_COL_MOVE(fn) EVT_GRID_CMD_COL_MOVE(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) @@ -2229,5 +2352,5 @@ extern const int wxEVT_GRID_CHANGE_SEL_LABEL; #endif -#endif // ifndef wxUSE_GRID - +#endif // wxUSE_GRID +#endif // _WX_GENERIC_GRID_H_