added attr assignment for rows/columns

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5975 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2000-02-11 21:14:58 +00:00
parent 0a97676587
commit 758cbedf84
3 changed files with 230 additions and 17 deletions

View File

@@ -199,7 +199,10 @@ private:
// implementation note: we separate it from wxGridTableBase because we wish to // implementation note: we separate it from wxGridTableBase because we wish to
// avoid deriving a new table class if possible, and sometimes it will be // avoid deriving a new table class if possible, and sometimes it will be
// enough to just derive another wxGridCellAttrProvider instead // 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 class WXDLLEXPORT wxGridCellAttrProvider
{ {
public: public:
@@ -209,8 +212,11 @@ public:
// DecRef() must be called on the returned pointer // DecRef() must be called on the returned pointer
virtual wxGridCellAttr *GetAttr(int row, int col) const; 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 SetAttr(wxGridCellAttr *attr, int row, int col);
virtual void SetRowAttr(wxGridCellAttr *attr, int row);
virtual void SetColAttr(wxGridCellAttr *attr, int col);
private: private:
void InitData(); void InitData();
@@ -270,8 +276,10 @@ public:
// overridden to handle attributes directly in this class. // overridden to handle attributes directly in this class.
virtual wxGridCellAttr *GetAttr( int row, int col ); virtual wxGridCellAttr *GetAttr( int row, int col );
// takes ownership of the pointer // these functions take ownership of the pointer
virtual void SetAttr(wxGridCellAttr *attr, int row, int col ); virtual void SetAttr(wxGridCellAttr* attr, int row, int col);
virtual void SetRowAttr(wxGridCellAttr *attr, int row);
virtual void SetColAttr(wxGridCellAttr *attr, int col);
private: private:
wxGrid * m_view; wxGrid * m_view;
@@ -674,6 +682,10 @@ public:
void SetColLabelValue( int col, const wxString& ); void SetColLabelValue( int col, const wxString& );
void SetGridLineColour( const wxColour& ); 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 ); void EnableGridLines( bool enable = TRUE );
bool GridLinesEnabled() { return m_gridLinesEnabled; } bool GridLinesEnabled() { return m_gridLinesEnabled; }

View File

@@ -201,6 +201,14 @@ GridFrame::GridFrame()
grid->SetCellAlignment(4, 4, wxCENTRE, wxCENTRE); grid->SetCellAlignment(4, 4, wxCENTRE, wxCENTRE);
grid->SetCellRenderer(4, 4, new MyGridCellRenderer); 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 ); wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
topSizer->Add( grid, topSizer->Add( grid,
1, 1,
@@ -447,14 +455,20 @@ void GridFrame::SetCellFgColour( wxCommandEvent& WXUNUSED(ev) )
{ {
wxColour col = wxGetColourFromUser(this); wxColour col = wxGetColourFromUser(this);
if ( col.Ok() ) if ( col.Ok() )
{
grid->SetDefaultCellTextColour(col); grid->SetDefaultCellTextColour(col);
grid->Refresh();
}
} }
void GridFrame::SetCellBgColour( wxCommandEvent& WXUNUSED(ev) ) void GridFrame::SetCellBgColour( wxCommandEvent& WXUNUSED(ev) )
{ {
wxColour col = wxGetColourFromUser(this); wxColour col = wxGetColourFromUser(this);
if ( col.Ok() ) if ( col.Ok() )
{
grid->SetDefaultCellBackgroundColour(col); grid->SetDefaultCellBackgroundColour(col);
grid->Refresh();
}
} }
void GridFrame::OnLabelLeftClick( wxGridEvent& ev ) void GridFrame::OnLabelLeftClick( wxGridEvent& ev )
@@ -573,6 +587,9 @@ void GridFrame::OnQuit( wxCommandEvent& WXUNUSED(ev) )
// MyGridCellRenderer // 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, void MyGridCellRenderer::Draw(wxGrid& grid,
wxDC& dc, wxDC& dc,
const wxRect& rect, const wxRect& rect,

View File

@@ -9,6 +9,14 @@
// Licence: wxWindows licence // Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#ifdef __GNUG__ #ifdef __GNUG__
#pragma implementation "grid.h" #pragma implementation "grid.h"
#endif #endif
@@ -39,9 +47,11 @@
#include "wx/generic/grid.h" #include "wx/generic/grid.h"
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// array classes instantiation // array classes
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
WX_DEFINE_ARRAY(wxGridCellAttr *, wxArrayAttrs);
struct wxGridCellWithAttr struct wxGridCellWithAttr
{ {
wxGridCellWithAttr(int row, int col, wxGridCellAttr *attr_) wxGridCellWithAttr(int row, int col, wxGridCellAttr *attr_)
@@ -156,10 +166,12 @@ private:
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
// ----------------------------------------------------------------------------
// the internal data representation used by wxGridCellAttrProvider // 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: public:
void SetAttr(wxGridCellAttr *attr, int row, int col); void SetAttr(wxGridCellAttr *attr, int row, int col);
@@ -172,6 +184,30 @@ private:
wxGridCellWithAttrArray m_attrs; 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 // conditional compilation
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -266,11 +302,10 @@ void wxGridCellStringRenderer::Draw(wxGrid& grid,
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxGridCellAttrProviderData // wxGridCellAttrData
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void wxGridCellAttrProviderData::SetAttr(wxGridCellAttr *attr, void wxGridCellAttrData::SetAttr(wxGridCellAttr *attr, int row, int col)
int row, int col)
{ {
int n = FindIndex(row, col); int n = FindIndex(row, col);
if ( n == wxNOT_FOUND ) 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; wxGridCellAttr *attr = (wxGridCellAttr *)NULL;
@@ -307,7 +342,7 @@ wxGridCellAttr *wxGridCellAttrProviderData::GetAttr(int row, int col) const
return attr; return attr;
} }
int wxGridCellAttrProviderData::FindIndex(int row, int col) const int wxGridCellAttrData::FindIndex(int row, int col) const
{ {
size_t count = m_attrs.GetCount(); size_t count = m_attrs.GetCount();
for ( size_t n = 0; n < count; n++ ) for ( size_t n = 0; n < count; n++ )
@@ -322,6 +357,59 @@ int wxGridCellAttrProviderData::FindIndex(int row, int col) const
return wxNOT_FOUND; 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 // wxGridCellAttrProvider
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -343,7 +431,27 @@ void wxGridCellAttrProvider::InitData()
wxGridCellAttr *wxGridCellAttrProvider::GetAttr(int row, int col) const 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, void wxGridCellAttrProvider::SetAttr(wxGridCellAttr *attr,
@@ -352,9 +460,29 @@ void wxGridCellAttrProvider::SetAttr(wxGridCellAttr *attr,
if ( !m_data ) if ( !m_data )
InitData(); 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) // Abstract base class for grid data (the model)
@@ -387,7 +515,7 @@ wxGridCellAttr *wxGridTableBase::GetAttr(int row, int col)
return (wxGridCellAttr *)NULL; return (wxGridCellAttr *)NULL;
} }
void wxGridTableBase::SetAttr(wxGridCellAttr *attr, int row, int col ) void wxGridTableBase::SetAttr(wxGridCellAttr* attr, int row, int col)
{ {
if ( m_attrProvider ) 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 ) bool wxGridTableBase::InsertRows( size_t pos, size_t numRows )
{ {
wxFAIL_MSG( wxT("Called grid table class function InsertRows\n" 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() bool wxGrid::CanHaveAttributes()
@@ -4845,6 +5001,34 @@ wxGridCellAttr *wxGrid::GetOrCreateCellAttr(int row, int col) const
return attr; 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 ) void wxGrid::SetCellBackgroundColour( int row, int col, const wxColour& colour )
{ {
if ( CanHaveAttributes() ) if ( CanHaveAttributes() )