]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/generic/grid.h
Standard frame resource defines for OS/2
[wxWidgets.git] / include / wx / generic / grid.h
index 9df770ec8ea56dd2d2b93ad0caf8dd6ef6212bae..06345817afe5066d81efefbd9add81b515671fda 100644 (file)
 #include "wx/dynarray.h"
 #include "wx/timer.h"
 
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
 // Default parameters for wxGrid
 //
 #define WXGRID_DEFAULT_NUMBER_ROWS            10
 #define WXGRID_MIN_COL_WIDTH                  15
 #define WXGRID_DEFAULT_SCROLLBAR_WIDTH        16
 
+// type names for grid table values
+#define wxGRID_VALUE_STRING     _T("string")
+#define wxGRID_VALUE_BOOL       _T("bool")
+#define wxGRID_VALUE_NUMBER     _T("long")
+#define wxGRID_VALUE_FLOAT      _T("double")
+
+#define wxGRID_VALUE_TEXT wxGRID_VALUE_STRING
+#define wxGRID_VALUE_LONG wxGRID_VALUE_NUMBER
+
 // ----------------------------------------------------------------------------
 // forward declarations
 // ----------------------------------------------------------------------------
@@ -64,7 +77,9 @@ class WXDLLEXPORT wxGridWindow;
 class WXDLLEXPORT wxGridTypeRegistry;
 
 class WXDLLEXPORT wxCheckBox;
+class WXDLLEXPORT wxComboBox;
 class WXDLLEXPORT wxTextCtrl;
+class WXDLLEXPORT wxSpinCtrl;
 
 // ----------------------------------------------------------------------------
 // wxGridCellRenderer: this class is responsible for actually drawing the cell
@@ -90,6 +105,15 @@ public:
                       const wxRect& rect,
                       int row, int col,
                       bool isSelected) = 0;
+
+    // get the preferred size of the cell for its contents
+    virtual wxSize GetBestSize(wxGrid& grid,
+                               wxGridCellAttr& attr,
+                               wxDC& dc,
+                               int row, int col) = 0;
+
+    // virtual dtor for any base class
+    virtual ~wxGridCellRenderer();
 };
 
 // the default renderer for the cells containing string data
@@ -103,13 +127,85 @@ public:
                       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);
+
+protected:
+    // set the text colours before drawing
+    void SetTextColoursAndFont(wxGrid& grid,
+                               wxGridCellAttr& attr,
+                               wxDC& dc,
+                               bool isSelected);
+
+    // calc the string extent for given string/font
+    wxSize DoGetBestSize(wxGridCellAttr& attr,
+                         wxDC& dc,
+                         const wxString& text);
+};
+
+// the default renderer for the cells containing numeric (long) data
+class WXDLLEXPORT wxGridCellNumberRenderer : public wxGridCellStringRenderer
+{
+public:
+    // draw the string right aligned
+    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);
+
+protected:
+    wxString GetString(wxGrid& grid, int row, int col);
+};
+
+class WXDLLEXPORT wxGridCellFloatRenderer : public wxGridCellStringRenderer
+{
+public:
+    wxGridCellFloatRenderer(int width, int precision);
+
+    // get/change formatting parameters
+    int GetWidth() const { return m_width; }
+    void SetWidth(int width) { m_width = width; }
+    int GetPrecision() const { return m_precision; }
+    void SetPrecision(int precision) { m_precision = precision; }
+
+    // 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);
+protected:
+    wxString GetString(wxGrid& grid, int row, int col);
+
+private:
+    // formatting parameters
+    int m_width,
+        m_precision;
+
+    wxString m_format;
 };
 
 // renderer for boolean fields
 class WXDLLEXPORT wxGridCellBoolRenderer : public wxGridCellRenderer
 {
 public:
-
     // draw a check mark or nothing
     virtual void Draw(wxGrid& grid,
                       wxGridCellAttr& attr,
@@ -117,6 +213,15 @@ public:
                       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);
+
+private:
+    static wxSize ms_sizeCheckMark;
 };
 
 // ----------------------------------------------------------------------------
@@ -155,11 +260,9 @@ public:
     // to begin editing.  Set the focus to the edit control.
     virtual void BeginEdit(int row, int col, wxGrid* grid) = 0;
 
-    // Complete the editing of the current cell.  If saveValue is
-    // true then send the new value back to the table.  Returns true
-    // if the value has changed.  If necessary, the control may be
-    // destroyed.
-    virtual bool EndEdit(int row, int col,  bool saveValue, wxGrid* grid) = 0;
+    // Complete the editing of the current cell. Returns true if the value has
+    // changed.  If necessary, the control may be destroyed.
+    virtual bool EndEdit(int row, int col, wxGrid* grid) = 0;
 
     // Reset the value in the control back to its starting value
     virtual void Reset() = 0;
@@ -201,11 +304,12 @@ public:
     virtual void Create(wxWindow* parent,
                         wxWindowID id,
                         wxEvtHandler* evtHandler);
+    virtual void SetSize(const wxRect& rect);
 
     virtual void PaintBackground(const wxRect& rectCell, wxGridCellAttr *attr);
 
     virtual void BeginEdit(int row, int col, wxGrid* grid);
-    virtual bool EndEdit(int row, int col,  bool saveValue, wxGrid* grid);
+    virtual bool EndEdit(int row, int col, wxGrid* grid);
 
     virtual void Reset();
     virtual void StartingKey(wxKeyEvent& event);
@@ -214,10 +318,72 @@ public:
 protected:
     wxTextCtrl *Text() const { return (wxTextCtrl *)m_control; }
 
+    // parts of our virtual functions reused by the derived classes
+    void DoBeginEdit(const wxString& startValue);
+    void DoReset(const wxString& startValue);
+
 private:
     wxString m_startValue;
 };
 
+// the editor for numeric (long) data
+class WXDLLEXPORT wxGridCellNumberEditor : public wxGridCellTextEditor
+{
+public:
+    // allows to specify the range - if min == max == -1, no range checking is
+    // done
+    wxGridCellNumberEditor(int min = -1, int max = -1);
+
+    virtual void Create(wxWindow* parent,
+                        wxWindowID id,
+                        wxEvtHandler* evtHandler);
+
+    virtual void BeginEdit(int row, int col, wxGrid* grid);
+    virtual bool EndEdit(int row, int col, wxGrid* grid);
+
+    virtual void Reset();
+    virtual void StartingKey(wxKeyEvent& event);
+
+protected:
+    wxSpinCtrl *Spin() const { return (wxSpinCtrl *)m_control; }
+
+    // if HasRange(), we use wxSpinCtrl - otherwise wxTextCtrl
+    bool HasRange() const { return m_min != m_max; }
+
+    // string representation of m_valueOld
+    wxString GetString() const
+        { return wxString::Format(_T("%ld"), m_valueOld); }
+
+private:
+    int m_min,
+        m_max;
+
+    long m_valueOld;
+};
+
+// the editor for floating point numbers (double) data
+class WXDLLEXPORT wxGridCellFloatEditor : public wxGridCellTextEditor
+{
+public:
+    virtual void Create(wxWindow* parent,
+                        wxWindowID id,
+                        wxEvtHandler* evtHandler);
+
+    virtual void BeginEdit(int row, int col, wxGrid* grid);
+    virtual bool EndEdit(int row, int col, wxGrid* grid);
+
+    virtual void Reset();
+    virtual void StartingKey(wxKeyEvent& event);
+
+protected:
+    // string representation of m_valueOld
+    wxString GetString() const
+        { return wxString::Format(_T("%f"), m_valueOld); }
+
+private:
+    double m_valueOld;
+};
+
 // the editor for boolean data
 class WXDLLEXPORT wxGridCellBoolEditor : public wxGridCellEditor
 {
@@ -230,7 +396,7 @@ public:
     virtual void Show(bool show, wxGridCellAttr *attr = (wxGridCellAttr *)NULL);
 
     virtual void BeginEdit(int row, int col, wxGrid* grid);
-    virtual bool EndEdit(int row, int col,  bool saveValue, wxGrid* grid);
+    virtual bool EndEdit(int row, int col, wxGrid* grid);
 
     virtual void Reset();
     virtual void StartingClick();
@@ -242,6 +408,33 @@ private:
     bool m_startValue;
 };
 
+// the editor for string data allowing to choose from the list of strings
+class WXDLLEXPORT wxGridCellChoiceEditor : public wxGridCellEditor
+{
+public:
+    // if !allowOthers, user can't type a string not in choices array
+    wxGridCellChoiceEditor(size_t count, const wxChar* choices[],
+                           bool allowOthers = FALSE);
+
+    virtual void Create(wxWindow* parent,
+                        wxWindowID id,
+                        wxEvtHandler* evtHandler);
+
+    virtual void PaintBackground(const wxRect& rectCell, wxGridCellAttr *attr);
+
+    virtual void BeginEdit(int row, int col, wxGrid* grid);
+    virtual bool EndEdit(int row, int col, wxGrid* grid);
+
+    virtual void Reset();
+
+protected:
+    wxComboBox *Combo() const { return (wxComboBox *)m_control; }
+
+private:
+    wxString        m_startValue;
+    wxArrayString   m_choices;
+    bool            m_allowOthers;
+};
 // ----------------------------------------------------------------------------
 // wxGridCellAttr: this class can be used to alter the cells appearance in
 // the grid by changing their colour/font/... from default. An object of this
@@ -310,8 +503,8 @@ public:
     const wxColour& GetBackgroundColour() const;
     const wxFont& GetFont() const;
     void GetAlignment(int *hAlign, int *vAlign) const;
-    wxGridCellRenderer *GetRenderer(wxGridCellRenderer* def) const;
-    wxGridCellEditor *GetEditor(wxGridCellEditor* def) const;
+    wxGridCellRenderer *GetRenderer(wxGrid* grid, int row, int col) const;
+    wxGridCellEditor *GetEditor(wxGrid* grid, int row, int col) const;
 
     bool IsReadOnly() const { return m_isReadOnly; }
 
@@ -707,6 +900,7 @@ public:
     bool DeleteCols( int pos = 0, int numCols = 1, bool updateLabels=TRUE );
 
     void DrawGridCellArea( wxDC& dc );
+    void DrawGridSpace( wxDC& dc );
     void DrawCellBorder( wxDC& dc, const wxGridCellCoords& );
     void DrawAllGridLines( wxDC& dc, const wxRegion & reg );
     void DrawCell( wxDC& dc, const wxGridCellCoords& );
@@ -763,7 +957,6 @@ public:
 
     void ShowCellEditControl();
     void HideCellEditControl();
-    void SetEditControlValue( const wxString& s = wxEmptyString );
     void SaveEditControlValue();
 
 
@@ -839,13 +1032,17 @@ public:
     void     SetRowLabelValue( int row, const wxString& );
     void     SetColLabelValue( int col, const wxString& );
     void     SetGridLineColour( const wxColour& );
-    
+
     void     EnableDragRowSize( bool enable = TRUE );
     void     DisableDragRowSize() { EnableDragRowSize( FALSE ); }
     bool     CanDragRowSize() { return m_canDragRowSize; }
     void     EnableDragColSize( bool enable = TRUE );
     void     DisableDragColSize() { EnableDragColSize( FALSE ); }
     bool     CanDragColSize() { return m_canDragColSize; }
+    void     EnableDragGridSize(bool enable = 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);
@@ -875,6 +1072,20 @@ public:
 
     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 );
+
+    // auto size all columns (very ineffective for big grids!)
+    void     AutoSizeColumns( bool setAsMin = TRUE );
+
+    void     AutoSizeRows( bool setAsMin = TRUE );
+
+    // 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
+    void     AutoSize();
+
     // column won't be resized to be lesser width - this must be called during
     // the grid creation because it won't resize the column if it's already
     // narrower than the minimal width
@@ -1004,10 +1215,12 @@ public:
     void RegisterDataType(const wxString& typeName,
                           wxGridCellRenderer* renderer,
                           wxGridCellEditor* editor);
-    wxGridCellEditor* GetDefaultEditorForCell(int row, int col);
-    wxGridCellRenderer* GetDefaultRendererForCell(int row, int col);
-    wxGridCellEditor* GetDefaultEditorForType(const wxString& typeName);
-    wxGridCellRenderer* GetDefaultRendererForType(const wxString& typeName);
+    wxGridCellEditor* GetDefaultEditorForCell(int row, int col) const;
+    wxGridCellEditor* GetDefaultEditorForCell(const wxGridCellCoords& c) const
+        { return GetDefaultEditorForCell(c.GetRow(), c.GetCol()); }
+    wxGridCellRenderer* GetDefaultRendererForCell(int row, int col) const;
+    wxGridCellEditor* GetDefaultEditorForType(const wxString& typeName) const;
+    wxGridCellRenderer* GetDefaultRendererForType(const wxString& typeName) const;
 
 
 
@@ -1021,7 +1234,7 @@ public:
     //
 
     wxGrid( wxWindow *parent,
-            int x = -1, int y = -1, int w = -1, int h = -1,
+            int x, int y, int w = -1, int h = -1,
             long style = 0,
             const wxString& name = wxPanelNameStr )
         : wxScrolledWindow( parent, -1, wxPoint(x,y), wxSize(w,h), style, name )
@@ -1171,9 +1384,6 @@ public:
            wxGRID_CHOICE,
            wxGRID_COMBOBOX };
 
-    // for wxGridCellBoolEditor
-    wxWindow *GetGridWindow() const;
-
 protected:
     bool m_created;
     bool m_displayed;
@@ -1328,6 +1538,7 @@ protected:
 
     bool    m_canDragRowSize;
     bool    m_canDragColSize;
+    bool    m_canDragGridSize;
     int     m_dragLastPos;
     int     m_dragRowOrCol;
     bool    m_isDragging;
@@ -1381,8 +1592,6 @@ protected:
     DECLARE_EVENT_TABLE()
 };
 
-
-
 // ----------------------------------------------------------------------------
 // Grid event class and event types
 // ----------------------------------------------------------------------------