#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;
#define wxSafeDecRef(p) if ( p ) (p)->DecRef()
// ----------------------------------------------------------------------------
-// wxGridCellRenderer: this class is responsible for actually drawing the cell
-// in the grid. You may pass it to the wxGridCellAttr (below) to change the
-// format of one given cell or to wxGrid::SetDefaultRenderer() to change the
-// view of all cells. This is an ABC, you will normally use one of the
-// predefined derived classes or derive your own class from it.
+// 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 wxGridCellRenderer
+class WXDLLEXPORT wxGridCellWorker
{
public:
- wxGridCellRenderer() { m_nRef = 1; }
+ 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
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
+// format of one given cell or to wxGrid::SetDefaultRenderer() to change the
+// view of all cells. This is an ABC, you will normally use one of the
+// predefined derived classes or derive your own class from it.
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxGridCellRenderer : public wxGridCellWorker
+{
+public:
// draw the given cell on the provided DC inside the given rectangle
// using the style specified by the attribute and the default or selected
// state corresponding to the isSelected value.
wxDC& dc,
int row, int col) = 0;
-protected:
- // virtual dtor for any base class - private because only DecRef() can
- // delete us
- virtual ~wxGridCellRenderer();
-
-private:
- size_t m_nRef;
-
- // suppress the stupid gcc warning about the class having private dtor and
- // no friends
- friend class wxGridCellRendererDummyFriend;
+ // 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();
- // 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; }
-
bool IsCreated() { return m_control != NULL; }
// Creates the actual edit control
// 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 ref count - when it goes to 0, we die
- size_t m_nRef;
-
// the control we show on screen
wxControl* m_control;
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; }
~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 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;
bool GetModelValues();
bool SetModelValues();
+ friend class wxGridSelection;
DECLARE_DYNAMIC_CLASS( wxGrid )
DECLARE_EVENT_TABLE()
#endif // #ifndef __WXGRID_H__
#endif // ifndef wxUSE_NEW_GRID
-