From 758cbedf846a9d21a5feb3ac3a89882ccb8a4375 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 11 Feb 2000 21:14:58 +0000 Subject: [PATCH] added attr assignment for rows/columns git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5975 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/grid.h | 20 +++- samples/newgrid/griddemo.cpp | 17 +++ src/generic/grid.cpp | 210 ++++++++++++++++++++++++++++++++--- 3 files changed, 230 insertions(+), 17 deletions(-) diff --git a/include/wx/generic/grid.h b/include/wx/generic/grid.h index a6fc79412b..3095e18d37 100644 --- a/include/wx/generic/grid.h +++ b/include/wx/generic/grid.h @@ -199,7 +199,10 @@ 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: @@ -209,8 +212,11 @@ public: // DecRef() must be called on the returned pointer virtual wxGridCellAttr *GetAttr(int row, int col) const; - // takes ownership of the pointer, don't call DecRef() on it + // 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(); @@ -270,8 +276,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(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; @@ -674,6 +682,10 @@ 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; } diff --git a/samples/newgrid/griddemo.cpp b/samples/newgrid/griddemo.cpp index 768c9c5737..99b7a7492e 100644 --- a/samples/newgrid/griddemo.cpp +++ b/samples/newgrid/griddemo.cpp @@ -201,6 +201,14 @@ GridFrame::GridFrame() grid->SetCellAlignment(4, 4, wxCENTRE, wxCENTRE); grid->SetCellRenderer(4, 4, new MyGridCellRenderer); + wxGridCellAttr *attr; + attr = new wxGridCellAttr; + attr->SetTextColour(*wxBLUE); + grid->SetColAttr(5, attr); + attr = new wxGridCellAttr; + attr->SetBackgroundColour(*wxBLUE); + grid->SetRowAttr(5, attr); + wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL ); topSizer->Add( grid, 1, @@ -447,14 +455,20 @@ void GridFrame::SetCellFgColour( wxCommandEvent& WXUNUSED(ev) ) { wxColour col = wxGetColourFromUser(this); if ( col.Ok() ) + { grid->SetDefaultCellTextColour(col); + grid->Refresh(); + } } void GridFrame::SetCellBgColour( wxCommandEvent& WXUNUSED(ev) ) { wxColour col = wxGetColourFromUser(this); if ( col.Ok() ) + { grid->SetDefaultCellBackgroundColour(col); + grid->Refresh(); + } } void GridFrame::OnLabelLeftClick( wxGridEvent& ev ) @@ -573,6 +587,9 @@ void GridFrame::OnQuit( wxCommandEvent& WXUNUSED(ev) ) // MyGridCellRenderer // ---------------------------------------------------------------------------- +// do something that the default renderer doesn't here just to show that it is +// possible to alter the appearance of the cell beyond what the attributes +// allow void MyGridCellRenderer::Draw(wxGrid& grid, wxDC& dc, const wxRect& rect, diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 157ec1f569..022349a967 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -9,6 +9,14 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + #ifdef __GNUG__ #pragma implementation "grid.h" #endif @@ -39,9 +47,11 @@ #include "wx/generic/grid.h" // ---------------------------------------------------------------------------- -// array classes instantiation +// array classes // ---------------------------------------------------------------------------- +WX_DEFINE_ARRAY(wxGridCellAttr *, wxArrayAttrs); + struct wxGridCellWithAttr { wxGridCellWithAttr(int row, int col, wxGridCellAttr *attr_) @@ -156,10 +166,12 @@ private: DECLARE_EVENT_TABLE() }; +// ---------------------------------------------------------------------------- // the internal data representation used by wxGridCellAttrProvider -// -// TODO make it more efficient -class WXDLLEXPORT wxGridCellAttrProviderData +// ---------------------------------------------------------------------------- + +// this class stores attributes set for cells +class WXDLLEXPORT wxGridCellAttrData { public: void SetAttr(wxGridCellAttr *attr, int row, int col); @@ -172,6 +184,30 @@ private: wxGridCellWithAttrArray m_attrs; }; +// this class stores attributes set for rows or columns +class WXDLLEXPORT wxGridRowOrColAttrData +{ +public: + ~wxGridRowOrColAttrData(); + + void SetAttr(wxGridCellAttr *attr, int rowOrCol); + wxGridCellAttr *GetAttr(int rowOrCol) const; + +private: + wxArrayInt m_rowsOrCols; + wxArrayAttrs m_attrs; +}; + +// NB: this is just a wrapper around 3 objects: one which stores cell +// attributes, and 2 others for row/col ones +class WXDLLEXPORT wxGridCellAttrProviderData +{ +public: + wxGridCellAttrData m_cellAttrs; + wxGridRowOrColAttrData m_rowAttrs, + m_colAttrs; +}; + // ---------------------------------------------------------------------------- // conditional compilation // ---------------------------------------------------------------------------- @@ -266,11 +302,10 @@ void wxGridCellStringRenderer::Draw(wxGrid& grid, } // ---------------------------------------------------------------------------- -// wxGridCellAttrProviderData +// wxGridCellAttrData // ---------------------------------------------------------------------------- -void wxGridCellAttrProviderData::SetAttr(wxGridCellAttr *attr, - int row, int col) +void wxGridCellAttrData::SetAttr(wxGridCellAttr *attr, int row, int col) { int n = FindIndex(row, col); if ( n == wxNOT_FOUND ) @@ -293,7 +328,7 @@ void wxGridCellAttrProviderData::SetAttr(wxGridCellAttr *attr, } } -wxGridCellAttr *wxGridCellAttrProviderData::GetAttr(int row, int col) const +wxGridCellAttr *wxGridCellAttrData::GetAttr(int row, int col) const { wxGridCellAttr *attr = (wxGridCellAttr *)NULL; @@ -307,7 +342,7 @@ wxGridCellAttr *wxGridCellAttrProviderData::GetAttr(int row, int col) const return attr; } -int wxGridCellAttrProviderData::FindIndex(int row, int col) const +int wxGridCellAttrData::FindIndex(int row, int col) const { size_t count = m_attrs.GetCount(); for ( size_t n = 0; n < count; n++ ) @@ -322,6 +357,59 @@ int wxGridCellAttrProviderData::FindIndex(int row, int col) const return wxNOT_FOUND; } +// ---------------------------------------------------------------------------- +// wxGridRowOrColAttrData +// ---------------------------------------------------------------------------- + +wxGridRowOrColAttrData::~wxGridRowOrColAttrData() +{ + size_t count = m_attrs.Count(); + for ( size_t n = 0; n < count; n++ ) + { + m_attrs[n]->DecRef(); + } +} + +wxGridCellAttr *wxGridRowOrColAttrData::GetAttr(int rowOrCol) const +{ + wxGridCellAttr *attr = (wxGridCellAttr *)NULL; + + int n = m_rowsOrCols.Index(rowOrCol); + if ( n != wxNOT_FOUND ) + { + attr = m_attrs[(size_t)n]; + attr->IncRef(); + } + + return attr; +} + +void wxGridRowOrColAttrData::SetAttr(wxGridCellAttr *attr, int rowOrCol) +{ + int n = m_rowsOrCols.Index(rowOrCol); + if ( n == wxNOT_FOUND ) + { + // add the attribute + m_rowsOrCols.Add(rowOrCol); + m_attrs.Add(attr); + } + else + { + if ( attr ) + { + // change the attribute + m_attrs[(size_t)n] = attr; + } + else + { + // remove this attribute + m_attrs[(size_t)n]->DecRef(); + m_rowsOrCols.RemoveAt((size_t)n); + m_attrs.RemoveAt((size_t)n); + } + } +} + // ---------------------------------------------------------------------------- // wxGridCellAttrProvider // ---------------------------------------------------------------------------- @@ -343,7 +431,27 @@ void wxGridCellAttrProvider::InitData() wxGridCellAttr *wxGridCellAttrProvider::GetAttr(int row, int col) const { - return m_data ? m_data->GetAttr(row, col) : (wxGridCellAttr *)NULL; + wxGridCellAttr *attr = (wxGridCellAttr *)NULL; + if ( m_data ) + { + // first look for the attribute of this specific cell + attr = m_data->m_cellAttrs.GetAttr(row, col); + + if ( !attr ) + { + // then look for the col attr (col attributes are more common than + // the row ones, hence they have priority) + attr = m_data->m_colAttrs.GetAttr(col); + } + + if ( !attr ) + { + // finally try the row attributes + attr = m_data->m_rowAttrs.GetAttr(row); + } + } + + return attr; } void wxGridCellAttrProvider::SetAttr(wxGridCellAttr *attr, @@ -352,9 +460,29 @@ void wxGridCellAttrProvider::SetAttr(wxGridCellAttr *attr, if ( !m_data ) InitData(); - m_data->SetAttr(attr, row, col); + m_data->m_cellAttrs.SetAttr(attr, row, col); +} + +void wxGridCellAttrProvider::SetRowAttr(wxGridCellAttr *attr, int row) +{ + if ( !m_data ) + InitData(); + + m_data->m_rowAttrs.SetAttr(attr, row); +} + +void wxGridCellAttrProvider::SetColAttr(wxGridCellAttr *attr, int col) +{ + if ( !m_data ) + InitData(); + + m_data->m_colAttrs.SetAttr(attr, col); } +// ---------------------------------------------------------------------------- +// wxGridTableBase +// ---------------------------------------------------------------------------- + ////////////////////////////////////////////////////////////////////// // // Abstract base class for grid data (the model) @@ -387,7 +515,7 @@ wxGridCellAttr *wxGridTableBase::GetAttr(int row, int col) return (wxGridCellAttr *)NULL; } -void wxGridTableBase::SetAttr(wxGridCellAttr *attr, int row, int col ) +void wxGridTableBase::SetAttr(wxGridCellAttr* attr, int row, int col) { if ( m_attrProvider ) { @@ -401,6 +529,34 @@ void wxGridTableBase::SetAttr(wxGridCellAttr *attr, int row, int col ) } } +void wxGridTableBase::SetRowAttr(wxGridCellAttr *attr, int row) +{ + if ( m_attrProvider ) + { + m_attrProvider->SetRowAttr(attr, row); + } + else + { + // as we take ownership of the pointer and don't store it, we must + // free it now + attr->SafeDecRef(); + } +} + +void wxGridTableBase::SetColAttr(wxGridCellAttr *attr, int col) +{ + if ( m_attrProvider ) + { + m_attrProvider->SetColAttr(attr, col); + } + else + { + // as we take ownership of the pointer and don't store it, we must + // free it now + attr->SafeDecRef(); + } +} + bool wxGridTableBase::InsertRows( size_t pos, size_t numRows ) { wxFAIL_MSG( wxT("Called grid table class function InsertRows\n" @@ -4744,7 +4900,7 @@ void wxGrid::GetCellAlignment( int row, int col, int *horiz, int *vert ) } // ---------------------------------------------------------------------------- -// setting cell attributes: this is forwarded to the table +// attribute support: cache, automatic provider creation, ... // ---------------------------------------------------------------------------- bool wxGrid::CanHaveAttributes() @@ -4845,6 +5001,34 @@ wxGridCellAttr *wxGrid::GetOrCreateCellAttr(int row, int col) const return attr; } +// ---------------------------------------------------------------------------- +// setting cell attributes: this is forwarded to the table +// ---------------------------------------------------------------------------- + +void wxGrid::SetRowAttr(int row, wxGridCellAttr *attr) +{ + if ( CanHaveAttributes() ) + { + m_table->SetRowAttr(attr, row); + } + else + { + attr->SafeDecRef(); + } +} + +void wxGrid::SetColAttr(int col, wxGridCellAttr *attr) +{ + if ( CanHaveAttributes() ) + { + m_table->SetColAttr(attr, col); + } + else + { + attr->SafeDecRef(); + } +} + void wxGrid::SetCellBackgroundColour( int row, int col, const wxColour& colour ) { if ( CanHaveAttributes() ) -- 2.45.2