X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6daa30a07e725f267464951d6c60788248267016..794bcc2dea743ac907b839f54e451847c9ea4b72:/include/wx/generic/grid.h diff --git a/include/wx/generic/grid.h b/include/wx/generic/grid.h index ccb1eb5d3d..743cd7aae5 100644 --- a/include/wx/generic/grid.h +++ b/include/wx/generic/grid.h @@ -32,6 +32,10 @@ #include "wx/dynarray.h" #include "wx/timer.h" +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + // Default parameters for wxGrid // #define WXGRID_DEFAULT_NUMBER_ROWS 10 @@ -49,6 +53,15 @@ #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,14 @@ 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 ); + // 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 +1209,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; @@ -1171,9 +1378,6 @@ public: wxGRID_CHOICE, wxGRID_COMBOBOX }; - // for wxGridCellBoolEditor - wxWindow *GetGridWindow() const; - protected: bool m_created; bool m_displayed; @@ -1328,6 +1532,7 @@ protected: bool m_canDragRowSize; bool m_canDragColSize; + bool m_canDragGridSize; int m_dragLastPos; int m_dragRowOrCol; bool m_isDragging; @@ -1381,8 +1586,6 @@ protected: DECLARE_EVENT_TABLE() }; - - // ---------------------------------------------------------------------------- // Grid event class and event types // ----------------------------------------------------------------------------