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
// 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; }

View File

@ -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,

View File

@ -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() )