#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_LABEL_EDGE_ZONE 2
#define WXGRID_MIN_ROW_HEIGHT 15
#define WXGRID_MIN_COL_WIDTH 15
#define WXGRID_DEFAULT_SCROLLBAR_WIDTH 16
#define wxGRID_VALUE_BOOL _T("bool")
#define wxGRID_VALUE_NUMBER _T("long")
#define wxGRID_VALUE_FLOAT _T("double")
+#define wxGRID_VALUE_CHOICE _T("choice")
#define wxGRID_VALUE_TEXT wxGRID_VALUE_STRING
#define wxGRID_VALUE_LONG wxGRID_VALUE_NUMBER
class WXDLLEXPORT wxGridTableBase;
class WXDLLEXPORT wxGridWindow;
class WXDLLEXPORT wxGridTypeRegistry;
+class WXDLLEXPORT wxGridSelection;
class WXDLLEXPORT wxCheckBox;
class WXDLLEXPORT wxComboBox;
class WXDLLEXPORT wxTextCtrl;
class WXDLLEXPORT wxSpinCtrl;
+// ----------------------------------------------------------------------------
+// macros
+// ----------------------------------------------------------------------------
+
+#define wxSafeIncRef(p) if ( p ) (p)->IncRef()
+#define wxSafeDecRef(p) if ( p ) (p)->DecRef()
+
+// ----------------------------------------------------------------------------
+// wxGridCellWorker: common base class for wxGridCellRenderer and
+// wxGridCellEditor
+//
+// NB: this is more an implementation convenience than a design issue, so this
+// class is not documented and is not public at all
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxGridCellWorker
+{
+public:
+ wxGridCellWorker() { m_nRef = 1; }
+
+ // this class is ref counted: it is created with ref count of 1, so
+ // 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; }
+
+ // interpret renderer parameters: arbitrary string whose interpretatin is
+ // left to the derived classes
+ virtual void SetParameters(const wxString& params);
+
+protected:
+ // virtual dtor for any base class - private because only DecRef() can
+ // delete us
+ virtual ~wxGridCellWorker();
+
+private:
+ size_t m_nRef;
+
+ // suppress the stupid gcc warning about the class having private dtor and
+ // no friends
+ friend class wxGridCellWorkerDummyFriend;
+};
+
// ----------------------------------------------------------------------------
// wxGridCellRenderer: this class is responsible for actually drawing the cell
// in the grid. You may pass it to the wxGridCellAttr (below) to change the
// predefined derived classes or derive your own class from it.
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxGridCellRenderer
+class WXDLLEXPORT wxGridCellRenderer : public wxGridCellWorker
{
public:
// draw the given cell on the provided DC inside the given rectangle
wxDC& dc,
int row, int col) = 0;
- // virtual dtor for any base class
- virtual ~wxGridCellRenderer();
+ // create a new object which is the copy of this one
+ virtual wxGridCellRenderer *Clone() const = 0;
};
// the default renderer for the cells containing string data
wxDC& dc,
int row, int col);
+ virtual wxGridCellRenderer *Clone() const
+ { return new wxGridCellStringRenderer; }
+
protected:
// set the text colours before drawing
void SetTextColoursAndFont(wxGrid& grid,
wxDC& dc,
int row, int col);
+ virtual wxGridCellRenderer *Clone() const
+ { return new wxGridCellNumberRenderer; }
+
protected:
wxString GetString(wxGrid& grid, int row, int col);
};
class WXDLLEXPORT wxGridCellFloatRenderer : public wxGridCellStringRenderer
{
public:
- wxGridCellFloatRenderer(int width, int precision);
+ wxGridCellFloatRenderer(int width = -1, int precision = -1);
// get/change formatting parameters
int GetWidth() const { return m_width; }
- void SetWidth(int width) { m_width = width; }
+ void SetWidth(int width) { m_width = width; m_format.clear(); }
int GetPrecision() const { return m_precision; }
- void SetPrecision(int precision) { m_precision = precision; }
+ void SetPrecision(int precision) { m_precision = precision; m_format.clear(); }
// draw the string right aligned with given width/precision
virtual void Draw(wxGrid& grid,
wxGridCellAttr& attr,
wxDC& dc,
int row, int col);
+
+ // parameters string format is "width[,precision]"
+ virtual void SetParameters(const wxString& params);
+
+ virtual wxGridCellRenderer *Clone() const;
+
protected:
wxString GetString(wxGrid& grid, int row, int col);
private:
// formatting parameters
int m_width,
- m_precision;
+ m_precision;
wxString m_format;
};
wxDC& dc,
int row, int col);
+ virtual wxGridCellRenderer *Clone() const
+ { return new wxGridCellBoolRenderer; }
+
private:
static wxSize ms_sizeCheckMark;
};
// even for the entire grid.
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxGridCellEditor
+class WXDLLEXPORT wxGridCellEditor : public wxGridCellWorker
{
public:
wxGridCellEditor();
- virtual ~wxGridCellEditor();
bool IsCreated() { return m_control != NULL; }
// Final cleanup
virtual void Destroy();
+ // create a new object which is the copy of this one
+ virtual wxGridCellEditor *Clone() const = 0;
+
protected:
+ // the dtor is private because only DecRef() can delete us
+ virtual ~wxGridCellEditor();
+
// the control we show on screen
wxControl* m_control;
wxColour m_colFgOld,
m_colBgOld;
wxFont m_fontOld;
+
+ // suppress the stupid gcc warning about the class having private dtor and
+ // no friends
+ friend class wxGridCellEditorDummyFriend;
};
// the editor for string/text data
virtual void StartingKey(wxKeyEvent& event);
virtual void HandleReturn(wxKeyEvent& event);
+ // parameters string format is "max_width"
+ virtual void SetParameters(const wxString& params);
+
+ virtual wxGridCellEditor *Clone() const
+ { return new wxGridCellTextEditor; }
+
protected:
wxTextCtrl *Text() const { return (wxTextCtrl *)m_control; }
void DoReset(const wxString& startValue);
private:
+ size_t m_maxChars; // max number of chars allowed
wxString m_startValue;
};
virtual void Reset();
virtual void StartingKey(wxKeyEvent& event);
+ // parameters string format is "min,max"
+ virtual void SetParameters(const wxString& params);
+
+ virtual wxGridCellEditor *Clone() const
+ { return new wxGridCellNumberEditor(m_min, m_max); }
+
protected:
wxSpinCtrl *Spin() const { return (wxSpinCtrl *)m_control; }
virtual void Reset();
virtual void StartingKey(wxKeyEvent& event);
+ virtual wxGridCellEditor *Clone() const
+ { return new wxGridCellFloatEditor; }
+
protected:
// string representation of m_valueOld
wxString GetString() const
virtual void Reset();
virtual void StartingClick();
+ virtual wxGridCellEditor *Clone() const
+ { return new wxGridCellBoolEditor; }
+
protected:
wxCheckBox *CBox() const { return (wxCheckBox *)m_control; }
{
public:
// if !allowOthers, user can't type a string not in choices array
- wxGridCellChoiceEditor(size_t count, const wxChar* choices[],
+ wxGridCellChoiceEditor(size_t count = 0,
+ const wxChar* choices[] = NULL,
bool allowOthers = FALSE);
virtual void Create(wxWindow* parent,
virtual void Reset();
+ // parameters string format is "item1[,item2[...,itemN]]"
+ virtual void SetParameters(const wxString& params);
+
+ virtual wxGridCellEditor *Clone() const;
+
protected:
wxComboBox *Combo() const { return (wxComboBox *)m_control; }
SetAlignment(hAlign, vAlign);
}
- // creates a new copy of this object: warning, this is destructive copy
- // (this is why it's non const), the renderer and editor are "given to"
- // the new object
- wxGridCellAttr *Clone();
+ // creates a new copy of this object
+ wxGridCellAttr *Clone() const;
// this class is ref counted: it is created with ref count of 1, so
// 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 SafeIncRef() { if ( this ) IncRef(); }
- void SafeDecRef() { if ( this ) DecRef(); }
// setters
void SetTextColour(const wxColour& colText) { m_colText = colText; }
// takes ownership of the pointer
void SetRenderer(wxGridCellRenderer *renderer)
- { delete m_renderer; m_renderer = renderer; }
+ { wxSafeDecRef(m_renderer); m_renderer = renderer; }
void SetEditor(wxGridCellEditor* editor)
- { delete m_editor; m_editor = editor; }
+ { wxSafeDecRef(m_editor); m_editor = editor; }
// accessors
bool HasTextColour() const { return m_colText.Ok(); }
}
// the dtor is private because only DecRef() can delete us
- ~wxGridCellAttr() { delete m_renderer; delete m_editor; }
+ ~wxGridCellAttr()
+ {
+ wxSafeDecRef(m_renderer);
+ wxSafeDecRef(m_editor);
+ }
// the ref count - when it goes to 0, we die
size_t m_nRef;
~wxGrid();
- bool CreateGrid( int numRows, int numCols );
+ enum wxGridSelectionModes {wxGridSelectCells,
+ wxGridSelectRows,
+ wxGridSelectColumns};
+ bool CreateGrid( int numRows, int numCols,
+ wxGrid::wxGridSelectionModes selmode =
+ wxGrid::wxGridSelectCells );
+
+ void SetSelectionMode(wxGrid::wxGridSelectionModes selmode);
// ------ grid dimensions
//
void DoEndDragResizeCol();
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 );
void DisableDragGridSize() { EnableDragGridSize(FALSE); }
bool CanDragGridSize() { return m_canDragGridSize; }
-
// this sets the specified attribute for all cells in this row/col
void SetRowAttr(int row, wxGridCellAttr *attr);
void SetColAttr(int col, wxGridCellAttr *attr);
+ // shortcuts for setting the column parameters
+
+ // set the format for the data in the column: default is string
+ void SetColFormatBool(int col);
+ void SetColFormatNumber(int col);
+ void SetColFormatFloat(int col, int width = -1, int precision = -1);
+ void SetColFormatCustom(int col, const wxString& typeName);
+
void EnableGridLines( bool enable = TRUE );
bool GridLinesEnabled() { return m_gridLinesEnabled; }
void SetColSize( int col, int width );
- // automatically size the column 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 );
+ // 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); }
+ 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 )
// the grid creation because it won't resize the column if it's already
// narrower than the minimal width
void SetColMinimalWidth( int col, int width );
+ void SetRowMinimalHeight( int row, int width );
void SetDefaultCellBackgroundColour( const wxColour& );
void SetCellBackgroundColour( int row, int col, const wxColour& );
void SelectAll();
- bool IsSelection()
- { return ( m_selectedTopLeft != wxGridNoCellCoords &&
- m_selectedBottomRight != wxGridNoCellCoords );
- }
+ bool IsSelection();
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( int row, int col );
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();
- }
-
// This function returns the rectangle that encloses the block of cells
// limited by TopLeft and BottomRight cell in device coords and clipped
//
wxRect SelectionToDeviceRect()
{
- return BlockToDeviceRect( m_selectedTopLeft,
- m_selectedBottomRight );
+ return BlockToDeviceRect( m_selectingTopLeft,
+ m_selectingBottomRight );
}
// Access or update the selection fore/back colours
wxGridCellCoords m_currentCellCoords;
- wxGridCellCoords m_selectedTopLeft;
- wxGridCellCoords m_selectedBottomRight;
+ wxGridCellCoords m_selectingTopLeft;
+ wxGridCellCoords m_selectingBottomRight;
+ wxGridSelection *m_selection;
wxColour m_selectionBackground;
wxColour m_selectionForeground;
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
- wxHashTable m_colMinWidths;
+ wxHashTableLong m_colMinWidths,
+ m_rowMinHeights;
- // get the minimal width of the given column
- int GetColMinimalWidth(int col) const;
+ // get the minimal width of the given column/row
+ int GetColMinimalWidth(int col) const;
+ int GetRowMinimalHeight(int col) const;
// do we have some place to store attributes in?
bool CanHaveAttributes();
bool GetModelValues();
bool SetModelValues();
+ friend class wxGridSelection;
DECLARE_DYNAMIC_CLASS( wxGrid )
DECLARE_EVENT_TABLE()
#endif // #ifndef __WXGRID_H__
#endif // ifndef wxUSE_NEW_GRID
-