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:
@@ -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; }
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
|
@@ -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)
|
||||||
@@ -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() )
|
||||||
|
Reference in New Issue
Block a user