]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/generic/gridctrl.h
fixing overrelease and out-of-bounds write, fixes #13725
[wxWidgets.git] / include / wx / generic / gridctrl.h
index 9699f0476bda24c4c91bea1b599056c58dbe5ba2..b9ee0a1a0f027107067f6c207e2172d0f0f3ba54 100644 (file)
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////
-// Name:        generic/gridctrl.h
+// Name:        wx/generic/gridctrl.h
 // Purpose:     wxGrid controls
 // Author:      Paul Gammans, Roger Gammans
 // Modified by:
 #ifndef _WX_GENERIC_GRIDCTRL_H_
 #define _WX_GENERIC_GRIDCTRL_H_
 
-#if defined(__GNUG__) && !defined(__APPLE__)
-    #pragma interface "gridctrl.h"
-#endif
+#include "wx/grid.h"
 
 #if wxUSE_GRID
 
-#include "wx/grid.h"
-#include "wx/string.h"
-#include "wx/arrstr.h"
-#include "wx/datetime.h"
+#define wxGRID_VALUE_CHOICEINT    wxT("choiceint")
+#define wxGRID_VALUE_DATETIME     wxT("datetime")
 
-#define wxGRID_VALUE_CHOICEINT    _T("choiceint")
-#define wxGRID_VALUE_DATETIME     _T("datetime")
 
-#if wxUSE_DATETIME
-
-// the default renderer for the cells containing Time and dates..
-class WXDLLEXPORT wxGridCellDateTimeRenderer : public wxGridCellStringRenderer
+// the default renderer for the cells containing string data
+class WXDLLIMPEXP_ADV wxGridCellStringRenderer : public wxGridCellRenderer
 {
 public:
-    wxGridCellDateTimeRenderer(wxString outformat =  _T("%c"),
-                               wxString informat =  _T("%c"));
+    // draw the string
+    virtual void Draw(wxGrid& grid,
+                      wxGridCellAttr& attr,
+                      wxDC& dc,
+                      const wxRect& rect,
+                      int row, int col,
+                      bool isSelected);
+
+    // return the string extent
+    virtual wxSize GetBestSize(wxGrid& grid,
+                               wxGridCellAttr& attr,
+                               wxDC& dc,
+                               int row, int col);
+
+    virtual wxGridCellRenderer *Clone() const
+        { return new wxGridCellStringRenderer; }
+
+protected:
+    // set the text colours before drawing
+    void SetTextColoursAndFont(const wxGrid& grid,
+                               const wxGridCellAttr& attr,
+                               wxDC& dc,
+                               bool isSelected);
 
+    // calc the string extent for given string/font
+    wxSize DoGetBestSize(const wxGridCellAttr& attr,
+                         wxDC& dc,
+                         const wxString& text);
+};
+
+// the default renderer for the cells containing numeric (long) data
+class WXDLLIMPEXP_ADV wxGridCellNumberRenderer : public wxGridCellStringRenderer
+{
+public:
     // draw the string right aligned
     virtual void Draw(wxGrid& grid,
                       wxGridCellAttr& attr,
@@ -48,27 +71,95 @@ public:
                                wxDC& dc,
                                int row, int col);
 
-    virtual wxGridCellRenderer *Clone() const;
+    virtual wxGridCellRenderer *Clone() const
+        { return new wxGridCellNumberRenderer; }
 
-    // parameters string format is "width[,precision]"
+protected:
+    wxString GetString(const wxGrid& grid, int row, int col);
+};
+
+class WXDLLIMPEXP_ADV wxGridCellFloatRenderer : public wxGridCellStringRenderer
+{
+public:
+    wxGridCellFloatRenderer(int width = -1,
+                            int precision = -1,
+                            int format = wxGRID_FLOAT_FORMAT_DEFAULT);
+
+    // get/change formatting parameters
+    int GetWidth() const { return m_width; }
+    void SetWidth(int width) { m_width = width; m_format.clear(); }
+    int GetPrecision() const { return m_precision; }
+    void SetPrecision(int precision) { m_precision = precision; m_format.clear(); }
+    int GetFormat() const { return m_style; }
+    void SetFormat(int format) { m_style = format; m_format.clear(); }
+
+    // draw the string right aligned with given width/precision
+    virtual void Draw(wxGrid& grid,
+                      wxGridCellAttr& attr,
+                      wxDC& dc,
+                      const wxRect& rect,
+                      int row, int col,
+                      bool isSelected);
+
+    virtual wxSize GetBestSize(wxGrid& grid,
+                               wxGridCellAttr& attr,
+                               wxDC& dc,
+                               int row, int col);
+
+    // parameters string format is "width[,precision[,format]]"
+    // with format being one of f|e|g|E|F|G
     virtual void SetParameters(const wxString& params);
 
+    virtual wxGridCellRenderer *Clone() const;
+
 protected:
-    wxString GetString(wxGrid& grid, int row, int col);
+    wxString GetString(const wxGrid& grid, int row, int col);
 
-    wxString m_iformat;
-    wxString m_oformat;
-    wxDateTime m_dateDef;
-    wxDateTime::TimeZone m_tz;
+private:
+    // formatting parameters
+    int m_width,
+        m_precision;
+
+    int m_style;
+    wxString m_format;
 };
 
-#endif // wxUSE_DATETIME
+// renderer for boolean fields
+class WXDLLIMPEXP_ADV wxGridCellBoolRenderer : public wxGridCellRenderer
+{
+public:
+    // draw a check mark or nothing
+    virtual void Draw(wxGrid& grid,
+                      wxGridCellAttr& attr,
+                      wxDC& dc,
+                      const wxRect& rect,
+                      int row, int col,
+                      bool isSelected);
+
+    // return the checkmark size
+    virtual wxSize GetBestSize(wxGrid& grid,
+                               wxGridCellAttr& attr,
+                               wxDC& dc,
+                               int row, int col);
 
-// the default renderer for the cells containing Time and dates..
-class WXDLLEXPORT wxGridCellEnumRenderer : public wxGridCellStringRenderer
+    virtual wxGridCellRenderer *Clone() const
+        { return new wxGridCellBoolRenderer; }
+
+private:
+    static wxSize ms_sizeCheckMark;
+};
+
+
+#if wxUSE_DATETIME
+
+#include "wx/datetime.h"
+
+// the default renderer for the cells containing times and dates
+class WXDLLIMPEXP_ADV wxGridCellDateTimeRenderer : public wxGridCellStringRenderer
 {
 public:
-    wxGridCellEnumRenderer( const wxString& choices = wxEmptyString );
+    wxGridCellDateTimeRenderer(const wxString& outformat = wxDefaultDateTimeFormat,
+                               const wxString& informat = wxDefaultDateTimeFormat);
 
     // draw the string right aligned
     virtual void Draw(wxGrid& grid,
@@ -85,52 +176,53 @@ public:
 
     virtual wxGridCellRenderer *Clone() const;
 
-    // parameters string format is "item1[,item2[...,itemN]]"
+    // output strptime()-like format string
     virtual void SetParameters(const wxString& params);
 
 protected:
-    wxString GetString(wxGrid& grid, int row, int col);
+    wxString GetString(const wxGrid& grid, int row, int col);
 
-    wxArrayString m_choices;
+    wxString m_iformat;
+    wxString m_oformat;
+    wxDateTime m_dateDef;
+    wxDateTime::TimeZone m_tz;
 };
 
+#endif // wxUSE_DATETIME
 
-#if wxUSE_COMBOBOX
-
-class WXDLLEXPORT wxGridCellEnumEditor : public wxGridCellChoiceEditor
+// renders a number using the corresponding text string
+class WXDLLIMPEXP_ADV wxGridCellEnumRenderer : public wxGridCellStringRenderer
 {
 public:
-    wxGridCellEnumEditor( const wxString& choices = wxEmptyString );
-    virtual ~wxGridCellEnumEditor() {};
-
-    virtual wxGridCellEditor*  Clone() const;
-
-    virtual bool EndEdit(int row, int col, wxGrid* grid);
-    virtual void BeginEdit(int row, int col, wxGrid* grid);
+    wxGridCellEnumRenderer( const wxString& choices = wxEmptyString );
 
-private:
-    long int   m_startint;
+    // draw the string right aligned
+    virtual void Draw(wxGrid& grid,
+                      wxGridCellAttr& attr,
+                      wxDC& dc,
+                      const wxRect& rect,
+                      int row, int col,
+                      bool isSelected);
 
-    DECLARE_NO_COPY_CLASS(wxGridCellEnumEditor)
-};
+    virtual wxSize GetBestSize(wxGrid& grid,
+                               wxGridCellAttr& attr,
+                               wxDC& dc,
+                               int row, int col);
 
-#endif // wxUSE_COMBOBOX
+    virtual wxGridCellRenderer *Clone() const;
 
-class WXDLLEXPORT wxGridCellAutoWrapStringEditor : public wxGridCellTextEditor
-{
-public:
-    wxGridCellAutoWrapStringEditor() : wxGridCellTextEditor() { }
-    virtual void Create(wxWindow* parent,
-                        wxWindowID id,
-                        wxEvtHandler* evtHandler);
+    // parameters string format is "item1[,item2[...,itemN]]" where itemN will
+    // be used if the cell value is N-1
+    virtual void SetParameters(const wxString& params);
 
-    virtual wxGridCellEditor *Clone() const
-        { return new wxGridCellAutoWrapStringEditor; }
+protected:
+    wxString GetString(const wxGrid& grid, int row, int col);
 
-    DECLARE_NO_COPY_CLASS(wxGridCellAutoWrapStringEditor)
+    wxArrayString m_choices;
 };
 
-class WXDLLEXPORT wxGridCellAutoWrapStringRenderer : public wxGridCellStringRenderer
+
+class WXDLLIMPEXP_ADV wxGridCellAutoWrapStringRenderer : public wxGridCellStringRenderer
 {
 public:
     wxGridCellAutoWrapStringRenderer() : wxGridCellStringRenderer() { }
@@ -153,13 +245,11 @@ public:
 private:
     wxArrayString GetTextLines( wxGrid& grid,
                                 wxDC& dc,
-                                wxGridCellAttr& attr,
+                                const wxGridCellAttr& attr,
                                 const wxRect& rect,
                                 int row, int col);
 
 };
 
-#endif  // #if wxUSE_GRID
-
-#endif //_WX_GENERIC_GRIDCTRL_H_
-
+#endif  // wxUSE_GRID
+#endif // _WX_GENERIC_GRIDCTRL_H_