X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b99be8fb783c506bd71f6ae156a1f2fba0303037..0dfef5a8124ac0f1bb2aed6ef5ddfa833e8e2c6e:/include/wx/generic/grid.h diff --git a/include/wx/generic/grid.h b/include/wx/generic/grid.h index 65ed902b90..438f9cd5ce 100644 --- a/include/wx/generic/grid.h +++ b/include/wx/generic/grid.h @@ -31,7 +31,7 @@ #include "wx/textctrl.h" #include "wx/combobox.h" #include "wx/dynarray.h" - +#include "wx/timer.h" // Default parameters for wxGrid // @@ -54,12 +54,135 @@ // forward declarations // ---------------------------------------------------------------------------- +class WXDLLEXPORT wxGrid; +class WXDLLEXPORT wxGridCellAttr; class WXDLLEXPORT wxGridCellAttrProviderData; -class WXDLLEXPORT wxGridRowLabelWindow; class WXDLLEXPORT wxGridColLabelWindow; class WXDLLEXPORT wxGridCornerLabelWindow; +class WXDLLEXPORT wxGridRowLabelWindow; +class WXDLLEXPORT wxGridTableBase; class WXDLLEXPORT wxGridWindow; -class WXDLLEXPORT wxGrid; + +// ---------------------------------------------------------------------------- +// 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 oyur own class from it. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxGridCellRenderer +{ +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. + // + // this pure virtual function has a default implementation which will + // prepare the DC using the given attribute: it will draw the rectangle + // with the bg colour from attr and set the text colour and font + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected) = 0; +}; + +// the default renderer for the cells containing string data +class WXDLLEXPORT wxGridCellStringRenderer : public wxGridCellRenderer +{ +public: + // draw the string + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected); +}; + + +// ---------------------------------------------------------------------------- +// wxGridCellEditor: This class is responsible for providing and manipulating +// the in-place edit controls for the grid. Instances of wxGridCellEditor +// (actually, instances of derived classes since it is an ABC) can be +// associated with the cell attributes for individual cells, rows, columns, or +// even for the entire grid. +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxGridCellEditor +{ +public: + wxGridCellEditor(); + virtual ~wxGridCellEditor(); + + bool IsCreated() { return m_control != NULL; } + + // Creates the actual edit control + virtual void Create(wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + wxEvtHandler* evtHandler) = 0; + + // Size and position the edit control + virtual void SetSize(const wxRect& rect); + + // Show or hide the edit control + virtual void Show(bool show); + + // Fetch the value from the table and prepare the edit control + // to begin editing. Set the focus to the edit control. + virtual void BeginEdit(int row, int col, wxGrid* grid, + wxGridCellAttr* attr) = 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, wxGridCellAttr* attr) = 0; + + // Reset the value in the control back to its starting value + virtual void Reset() = 0; + + // Some types of controls on some platforms may need some help + // with the Return key. + virtual void HandleReturn(wxKeyEvent& event); + + // Final cleanup + virtual void Destroy(); + +protected: + wxControl* m_control; +}; + + +class WXDLLEXPORT wxGridCellTextEditor : public wxGridCellEditor +{ +public: + wxGridCellTextEditor(); + + virtual void Create(wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + wxEvtHandler* evtHandler); + + virtual void BeginEdit(int row, int col, wxGrid* grid, + wxGridCellAttr* attr); + + virtual bool EndEdit(int row, int col, bool saveValue, + wxGrid* grid, wxGridCellAttr* attr); + + virtual void Reset(); + virtual void HandleReturn(wxKeyEvent& event); + + +private: + wxString m_startValue; +}; // ---------------------------------------------------------------------------- // wxGridCellAttr: this class can be used to alter the cells appearance in @@ -73,6 +196,7 @@ public: // ctors wxGridCellAttr() { + Init(); SetAlignment(0, 0); } @@ -83,11 +207,20 @@ public: int vAlign) : m_colText(colText), m_colBack(colBack), m_font(font) { + Init(); SetAlignment(hAlign, vAlign); } // default copy ctor ok + // 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; } void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; } @@ -98,27 +231,47 @@ public: m_vAlign = vAlign; } + // takes ownership of the pointer + void SetRenderer(wxGridCellRenderer *renderer) + { delete m_renderer; m_renderer = renderer; } + // accessors bool HasTextColour() const { return m_colText.Ok(); } bool HasBackgroundColour() const { return m_colBack.Ok(); } bool HasFont() const { return m_font.Ok(); } bool HasAlignment() const { return m_hAlign || m_vAlign; } + bool HasRenderer() const { return m_renderer != NULL; } - const wxColour& GetTextColour() const { return m_colText; } - const wxColour& GetBackgroundColour() const { return m_colBack; } - const wxFont& GetFont() const { return m_font; } - void GetAlignment(int *hAlign, int *vAlign) - { - if ( hAlign ) *hAlign = m_hAlign; - if ( vAlign ) *vAlign = m_vAlign; - } + const wxColour& GetTextColour() const; + const wxColour& GetBackgroundColour() const; + const wxFont& GetFont() const; + void GetAlignment(int *hAlign, int *vAlign) const; + wxGridCellRenderer *GetRenderer() const; + + void SetDefAttr(wxGridCellAttr* defAttr) { m_defGridAttr = defAttr; } private: + // the common part of all ctors + void Init() { m_nRef = 1; m_renderer = (wxGridCellRenderer *)NULL; } + + // the dtor is private because only DecRef() can delete us + ~wxGridCellAttr() { delete m_renderer; } + + // the ref count - when it goes to 0, we die + size_t m_nRef; + wxColour m_colText, m_colBack; wxFont m_font; int m_hAlign, m_vAlign; + + wxGridCellRenderer *m_renderer; + wxGridCellAttr* m_defGridAttr; + + // suppress the stupid gcc warning about the class having private dtor and + // no friends + friend class wxGridCellAttrDummyFriend; }; // ---------------------------------------------------------------------------- @@ -129,15 +282,24 @@ private: // implementation note: we separate it from wxGridTableBase because we wish to // avoid deriving a new table class if possible, and sometimes it will be // enough to just derive another wxGridCellAttrProvider instead - +// +// the default implementation is reasonably efficient for the generic case, +// but you might still wish to implement your own for some specific situations +// if you have performance problems with the stock one class WXDLLEXPORT wxGridCellAttrProvider { public: wxGridCellAttrProvider(); virtual ~wxGridCellAttrProvider(); + // DecRef() must be called on the returned pointer virtual wxGridCellAttr *GetAttr(int row, int col) const; - virtual void SetAttr(const wxGridCellAttr *attr, int row, int col); + + // all these functions take ownership of the pointer, don't call DecRef() + // on it + virtual void SetAttr(wxGridCellAttr *attr, int row, int col); + virtual void SetRowAttr(wxGridCellAttr *attr, int row); + virtual void SetColAttr(wxGridCellAttr *attr, int col); private: void InitData(); @@ -197,8 +359,10 @@ public: // overridden to handle attributes directly in this class. virtual wxGridCellAttr *GetAttr( int row, int col ); - // takes ownership of the pointer - virtual void SetAttr(const wxGridCellAttr *attr, int row, int col ); + // these functions take ownership of the pointer + virtual void SetAttr(wxGridCellAttr* attr, int row, int col); + virtual void SetRowAttr(wxGridCellAttr *attr, int row); + virtual void SetColAttr(wxGridCellAttr *attr, int col); private: wxGrid * m_view; @@ -407,6 +571,20 @@ private: DECLARE_EVENT_TABLE() }; +//----------------------------------------------------------------------------- +// wxGridEditTimer (internal) +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxGridEditTimer: public wxTimer +{ + private: + wxGrid *m_owner; + + public: + wxGridEditTimer( wxGrid *owner ); + void Notify(); +}; + // ---------------------------------------------------------------------------- // wxGrid // ---------------------------------------------------------------------------- @@ -458,9 +636,11 @@ public: void ProcessGridCellMouseEvent( wxMouseEvent& event ); bool ProcessTableMessage( wxGridTableMessage& ); + void DoEndDragResizeRow(); + void DoEndDragResizeCol(); wxGridTableBase * GetTable() const { return m_table; } - void SetTable( wxGridTableBase *table ) { m_table = table; } + bool SetTable( wxGridTableBase *table, bool takeOwnership=FALSE ); void ClearGrid(); bool InsertRows( int pos = 0, int numRows = 1, bool updateLabels=TRUE ); @@ -474,8 +654,6 @@ public: void DrawCellBorder( wxDC& dc, const wxGridCellCoords& ); void DrawAllGridLines( wxDC& dc, const wxRegion & reg ); void DrawCell( wxDC& dc, const wxGridCellCoords& ); - void DrawCellBackground( wxDC& dc, const wxGridCellCoords& ); - void DrawCellValue( wxDC& dc, const wxGridCellCoords& ); void DrawRowLabels( wxDC& dc ); void DrawRowLabel( wxDC& dc, int row ); @@ -515,9 +693,7 @@ public: bool IsEditable() { return m_editable; } void EnableEditing( bool edit ); -#if 0 // at the moment the cell edit control is always active void EnableCellEditControl( bool enable ); -#endif bool IsCellEditControlEnabled() { return (m_cellEditCtrl && m_cellEditCtrlEnabled); } @@ -590,7 +766,7 @@ public: wxString GetColLabelValue( int col ); wxColour GetGridLineColour() { return m_gridLineColour; } - void SetRowLabelSize( int width ); + void SetRowLabelSize( int width ); void SetColLabelSize( int height ); void SetLabelBackgroundColour( const wxColour& ); void SetLabelTextColour( const wxColour& ); @@ -601,10 +777,13 @@ public: void SetColLabelValue( int col, const wxString& ); void SetGridLineColour( const wxColour& ); + // this sets the specified attribute for all cells in this row/col + void SetRowAttr(int row, wxGridCellAttr *attr); + void SetColAttr(int col, wxGridCellAttr *attr); + void EnableGridLines( bool enable = TRUE ); bool GridLinesEnabled() { return m_gridLinesEnabled; } - // ------ row and col formatting // int GetDefaultRowSize(); @@ -635,6 +814,12 @@ public: void SetDefaultCellAlignment( int horiz, int vert ); void SetCellAlignment( int row, int col, int horiz, int vert ); + // takes ownership of the pointer + void SetDefaultRenderer(wxGridCellRenderer *renderer); + void SetCellRenderer(int row, int col, wxGridCellRenderer *renderer); + wxGridCellRenderer *GetDefaultRenderer() const; + wxGridCellRenderer* GetCellRenderer(int row, int col); + // ------ cell value accessors // @@ -718,6 +903,16 @@ public: m_selectedBottomRight ); } + // Access or update the selection fore/back colours + wxColour GetSelectionBackground() const + { return m_selectionBackground; } + wxColour GetSelectionForeground() const + { return m_selectionForeground; } + + void SetSelectionBackground(const wxColour& c) { m_selectionBackground = c; } + void SetSelectionForeground(const wxColour& c) { m_selectionForeground = c; } + + // ------ For compatibility with previous wxGrid only... // @@ -828,10 +1023,10 @@ public: } wxFont GetCellTextFont() const - { return m_defaultCellFont; } + { return m_defaultCellAttr->GetFont(); } wxFont GetCellTextFont(int WXUNUSED(row), int WXUNUSED(col)) const - { return m_defaultCellFont; } + { return m_defaultCellAttr->GetFont(); } void SetCellTextFont(const wxFont& fnt) { SetDefaultCellFont( fnt ); } @@ -890,6 +1085,7 @@ protected: wxGridCornerLabelWindow *m_cornerLabelWin; wxGridTableBase *m_table; + bool m_ownTable; int m_left; int m_top; @@ -903,6 +1099,8 @@ protected: wxGridCellCoords m_selectedTopLeft; wxGridCellCoords m_selectedBottomRight; + wxColour m_selectionBackground; + wxColour m_selectionForeground; int m_defaultRowHeight; wxArrayInt m_rowHeights; @@ -930,14 +1128,41 @@ protected: wxColour m_gridLineColour; bool m_gridLinesEnabled; - // default cell attributes - wxFont m_defaultCellFont; - int m_defaultCellHAlign, - m_defaultCellVAlign; // do we have some place to store attributes in? bool CanHaveAttributes(); + // returns the attribute we may modify in place: a new one if this cell + // doesn't have any yet or the existing one if it does + // + // DecRef() must be called on the returned pointer, as usual + wxGridCellAttr *GetOrCreateCellAttr(int row, int col) const; + + // cell attribute cache (currently we only cache 1, may be will do + // more/better later) + struct CachedAttr + { + int row, col; + wxGridCellAttr *attr; + } m_attrCache; + + // invalidates the attribute cache + void ClearAttrCache(); + + // adds an attribute to cache + void CacheAttr(int row, int col, wxGridCellAttr *attr) const; + + // looks for an attr in cache, returns TRUE if found + bool LookupAttr(int row, int col, wxGridCellAttr **attr) const; + + // looks for the attr in cache, if not found asks the table and caches the + // result + wxGridCellAttr *GetCellAttr(int row, int col) const; + + // the default cell attr object for cells that don't have their own + wxGridCellAttr* m_defaultCellAttr; + + wxGridCellCoordsArray m_cellsExposed; wxArrayInt m_rowsExposed; wxArrayInt m_colsExposed; @@ -947,18 +1172,34 @@ protected: bool m_inOnKeyDown; int m_batchCount; - int m_cursorMode; - enum { WXGRID_CURSOR_SELECT_CELL, - WXGRID_CURSOR_RESIZE_ROW, - WXGRID_CURSOR_RESIZE_COL, - WXGRID_CURSOR_SELECT_ROW, - WXGRID_CURSOR_SELECT_COL + enum CursorMode + { + WXGRID_CURSOR_SELECT_CELL, + WXGRID_CURSOR_RESIZE_ROW, + WXGRID_CURSOR_RESIZE_COL, + WXGRID_CURSOR_SELECT_ROW, + WXGRID_CURSOR_SELECT_COL }; + // this method not only sets m_cursorMode but also sets the correct cursor + // for the given mode and, if captureMouse is not FALSE releases the mouse + // if it was captured and captures it if it must be captured + // + // for this to work, you should always use it and not set m_cursorMode + // directly! + void ChangeCursorMode(CursorMode mode, + wxWindow *win = (wxWindow *)NULL, + bool captureMouse = TRUE); + + wxWindow *m_winCapture; // the window which captured the mouse + CursorMode m_cursorMode; + int m_dragLastPos; int m_dragRowOrCol; bool m_isDragging; + wxTimer *m_editTimer; + wxGridCellCoords m_selectionStart; wxCursor m_rowResizeCursor; @@ -988,6 +1229,7 @@ protected: void OnPaint( wxPaintEvent& ); void OnSize( wxSizeEvent& ); void OnKeyDown( wxKeyEvent& ); + void OnEraseBackground( wxEraseEvent& ); void SetCurrentCell( const wxGridCellCoords& coords );