fixed setting more than one attr for a cell
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5970 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
3ace2e6d5c
commit
2e9a678817
@ -73,6 +73,7 @@ public:
|
||||
// ctors
|
||||
wxGridCellAttr()
|
||||
{
|
||||
Init();
|
||||
SetAlignment(0, 0);
|
||||
}
|
||||
|
||||
@ -83,11 +84,19 @@ 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 SafeDecRef() { if ( this ) DecRef(); }
|
||||
|
||||
// setters
|
||||
void SetTextColour(const wxColour& colText) { m_colText = colText; }
|
||||
void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; }
|
||||
@ -114,11 +123,24 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
// the common part of all ctors
|
||||
void Init() { m_nRef = 1; }
|
||||
|
||||
// the dtor is private because only DecRef() can delete us
|
||||
~wxGridCellAttr() { }
|
||||
|
||||
// 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;
|
||||
|
||||
// suppress the stupid gcc warning about the class having private dtor and
|
||||
// no friends
|
||||
friend class wxGridCellAttrDummyFriend;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@ -136,8 +158,11 @@ 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);
|
||||
|
||||
// takes ownership of the pointer, don't call DecRef() on it
|
||||
virtual void SetAttr(wxGridCellAttr *attr, int row, int col);
|
||||
|
||||
private:
|
||||
void InitData();
|
||||
@ -198,7 +223,7 @@ public:
|
||||
virtual wxGridCellAttr *GetAttr( int row, int col );
|
||||
|
||||
// takes ownership of the pointer
|
||||
virtual void SetAttr(const wxGridCellAttr *attr, int row, int col );
|
||||
virtual void SetAttr(wxGridCellAttr *attr, int row, int col );
|
||||
|
||||
private:
|
||||
wxGrid * m_view;
|
||||
@ -940,6 +965,12 @@ protected:
|
||||
// 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 *GetCellAttr(int row, int col) const;
|
||||
|
||||
wxGridCellCoordsArray m_cellsExposed;
|
||||
wxArrayInt m_rowsExposed;
|
||||
wxArrayInt m_colsExposed;
|
||||
|
@ -165,9 +165,9 @@ GridFrame::GridFrame()
|
||||
|
||||
grid->SetCellValue(2, 2, "red");
|
||||
grid->SetCellTextColour(2, 2, *wxRED);
|
||||
grid->SetCellValue(3, 3, "green on white");
|
||||
grid->SetCellValue(3, 3, "green on grey");
|
||||
grid->SetCellTextColour(3, 3, *wxGREEN);
|
||||
grid->SetCellBackgroundColour(3, 3, *wxWHITE);
|
||||
grid->SetCellBackgroundColour(3, 3, *wxLIGHT_GREY);
|
||||
|
||||
wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
|
||||
topSizer->Add( grid,
|
||||
|
@ -44,13 +44,18 @@
|
||||
|
||||
struct wxGridCellWithAttr
|
||||
{
|
||||
wxGridCellWithAttr(int row, int col, const wxGridCellAttr *pAttr)
|
||||
: coords(row, col), attr(*pAttr)
|
||||
wxGridCellWithAttr(int row, int col, wxGridCellAttr *attr_)
|
||||
: coords(row, col), attr(attr_)
|
||||
{
|
||||
}
|
||||
|
||||
~wxGridCellWithAttr()
|
||||
{
|
||||
attr->DecRef();
|
||||
}
|
||||
|
||||
wxGridCellCoords coords;
|
||||
wxGridCellAttr attr;
|
||||
wxGridCellAttr *attr;
|
||||
};
|
||||
|
||||
WX_DECLARE_OBJARRAY(wxGridCellWithAttr, wxGridCellWithAttrArray);
|
||||
@ -157,7 +162,7 @@ private:
|
||||
class WXDLLEXPORT wxGridCellAttrProviderData
|
||||
{
|
||||
public:
|
||||
void SetAttr(const wxGridCellAttr *attr, int row, int col);
|
||||
void SetAttr(wxGridCellAttr *attr, int row, int col);
|
||||
wxGridCellAttr *GetAttr(int row, int col) const;
|
||||
|
||||
private:
|
||||
@ -188,7 +193,7 @@ static const size_t GRID_SCROLL_LINE = 10;
|
||||
// wxGridCellAttrProviderData
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxGridCellAttrProviderData::SetAttr(const wxGridCellAttr *attr,
|
||||
void wxGridCellAttrProviderData::SetAttr(wxGridCellAttr *attr,
|
||||
int row, int col)
|
||||
{
|
||||
int n = FindIndex(row, col);
|
||||
@ -202,7 +207,7 @@ void wxGridCellAttrProviderData::SetAttr(const wxGridCellAttr *attr,
|
||||
if ( attr )
|
||||
{
|
||||
// change the attribute
|
||||
m_attrs[(size_t)n].attr = *attr;
|
||||
m_attrs[(size_t)n].attr = attr;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -210,8 +215,6 @@ void wxGridCellAttrProviderData::SetAttr(const wxGridCellAttr *attr,
|
||||
m_attrs.RemoveAt((size_t)n);
|
||||
}
|
||||
}
|
||||
|
||||
delete attr;
|
||||
}
|
||||
|
||||
wxGridCellAttr *wxGridCellAttrProviderData::GetAttr(int row, int col) const
|
||||
@ -221,7 +224,8 @@ wxGridCellAttr *wxGridCellAttrProviderData::GetAttr(int row, int col) const
|
||||
int n = FindIndex(row, col);
|
||||
if ( n != wxNOT_FOUND )
|
||||
{
|
||||
attr = new wxGridCellAttr(m_attrs[(size_t)n].attr);
|
||||
attr = m_attrs[(size_t)n].attr;
|
||||
attr->IncRef();
|
||||
}
|
||||
|
||||
return attr;
|
||||
@ -266,7 +270,7 @@ wxGridCellAttr *wxGridCellAttrProvider::GetAttr(int row, int col) const
|
||||
return m_data ? m_data->GetAttr(row, col) : (wxGridCellAttr *)NULL;
|
||||
}
|
||||
|
||||
void wxGridCellAttrProvider::SetAttr(const wxGridCellAttr *attr,
|
||||
void wxGridCellAttrProvider::SetAttr(wxGridCellAttr *attr,
|
||||
int row, int col)
|
||||
{
|
||||
if ( !m_data )
|
||||
@ -307,7 +311,7 @@ wxGridCellAttr *wxGridTableBase::GetAttr(int row, int col)
|
||||
return (wxGridCellAttr *)NULL;
|
||||
}
|
||||
|
||||
void wxGridTableBase::SetAttr(const wxGridCellAttr *attr, int row, int col )
|
||||
void wxGridTableBase::SetAttr(wxGridCellAttr *attr, int row, int col )
|
||||
{
|
||||
if ( m_attrProvider )
|
||||
{
|
||||
@ -317,7 +321,7 @@ void wxGridTableBase::SetAttr(const wxGridCellAttr *attr, int row, int col )
|
||||
{
|
||||
// as we take ownership of the pointer and don't store it, we must
|
||||
// free it now
|
||||
delete attr;
|
||||
attr->SafeDecRef();
|
||||
}
|
||||
}
|
||||
|
||||
@ -4566,12 +4570,68 @@ int wxGrid::GetColSize( int col )
|
||||
return m_colWidths[col];
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// access to the grid attributes: each of them has a default value in the grid
|
||||
// itself and may be overidden on a per-cell basis
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// setting default attributes
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxGrid::SetDefaultCellBackgroundColour( const wxColour& col )
|
||||
{
|
||||
m_gridWin->SetBackgroundColour(col);
|
||||
}
|
||||
|
||||
void wxGrid::SetDefaultCellTextColour( const wxColour& col )
|
||||
{
|
||||
m_gridWin->SetForegroundColour(col);
|
||||
}
|
||||
|
||||
void wxGrid::SetDefaultCellAlignment( int horiz, int vert )
|
||||
{
|
||||
m_defaultCellHAlign = horiz;
|
||||
m_defaultCellVAlign = vert;
|
||||
}
|
||||
|
||||
void wxGrid::SetDefaultCellFont( const wxFont& font )
|
||||
{
|
||||
m_defaultCellFont = font;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// access to the default attrbiutes
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxColour wxGrid::GetDefaultCellBackgroundColour()
|
||||
{
|
||||
return m_gridWin->GetBackgroundColour();
|
||||
}
|
||||
|
||||
// TODO VZ: this must be optimized to allow only retrieveing attr once!
|
||||
wxColour wxGrid::GetDefaultCellTextColour()
|
||||
{
|
||||
return m_gridWin->GetForegroundColour();
|
||||
}
|
||||
|
||||
wxFont wxGrid::GetDefaultCellFont()
|
||||
{
|
||||
return m_defaultCellFont;
|
||||
}
|
||||
|
||||
void wxGrid::GetDefaultCellAlignment( int *horiz, int *vert )
|
||||
{
|
||||
if ( horiz )
|
||||
*horiz = m_defaultCellHAlign;
|
||||
if ( vert )
|
||||
*vert = m_defaultCellVAlign;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// access to cell attributes
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// TODO VZ: we must cache the attr to allow only retrieveing it once!
|
||||
|
||||
wxColour wxGrid::GetCellBackgroundColour(int row, int col)
|
||||
{
|
||||
@ -4583,16 +4643,11 @@ wxColour wxGrid::GetCellBackgroundColour(int row, int col)
|
||||
else
|
||||
colour = GetDefaultCellBackgroundColour();
|
||||
|
||||
delete attr;
|
||||
attr->SafeDecRef();
|
||||
|
||||
return colour;
|
||||
}
|
||||
|
||||
wxColour wxGrid::GetDefaultCellTextColour()
|
||||
{
|
||||
return m_gridWin->GetForegroundColour();
|
||||
}
|
||||
|
||||
wxColour wxGrid::GetCellTextColour( int row, int col )
|
||||
{
|
||||
wxGridCellAttr *attr = m_table ? m_table->GetAttr(row, col) : NULL;
|
||||
@ -4603,17 +4658,11 @@ wxColour wxGrid::GetCellTextColour( int row, int col )
|
||||
else
|
||||
colour = GetDefaultCellTextColour();
|
||||
|
||||
delete attr;
|
||||
attr->SafeDecRef();
|
||||
|
||||
return colour;
|
||||
}
|
||||
|
||||
|
||||
wxFont wxGrid::GetDefaultCellFont()
|
||||
{
|
||||
return m_defaultCellFont;
|
||||
}
|
||||
|
||||
wxFont wxGrid::GetCellFont( int row, int col )
|
||||
{
|
||||
wxGridCellAttr *attr = m_table ? m_table->GetAttr(row, col) : NULL;
|
||||
@ -4624,19 +4673,11 @@ wxFont wxGrid::GetCellFont( int row, int col )
|
||||
else
|
||||
font = GetDefaultCellFont();
|
||||
|
||||
delete attr;
|
||||
attr->SafeDecRef();
|
||||
|
||||
return font;
|
||||
}
|
||||
|
||||
void wxGrid::GetDefaultCellAlignment( int *horiz, int *vert )
|
||||
{
|
||||
if ( horiz )
|
||||
*horiz = m_defaultCellHAlign;
|
||||
if ( vert )
|
||||
*vert = m_defaultCellVAlign;
|
||||
}
|
||||
|
||||
void wxGrid::GetCellAlignment( int row, int col, int *horiz, int *vert )
|
||||
{
|
||||
wxGridCellAttr *attr = m_table ? m_table->GetAttr(row, col) : NULL;
|
||||
@ -4646,9 +4687,91 @@ void wxGrid::GetCellAlignment( int row, int col, int *horiz, int *vert )
|
||||
else
|
||||
GetDefaultCellAlignment(horiz, vert);
|
||||
|
||||
delete attr;
|
||||
attr->SafeDecRef();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// setting cell attributes: this is forwarded to the table
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
bool wxGrid::CanHaveAttributes()
|
||||
{
|
||||
if ( !m_table )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( !m_table->GetAttrProvider() )
|
||||
{
|
||||
// use the default attr provider by default
|
||||
// (another choice would be to just return FALSE thus forcing the user
|
||||
// to it himself)
|
||||
m_table->SetAttrProvider(new wxGridCellAttrProvider);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
wxGridCellAttr *wxGrid::GetCellAttr(int row, int col) const
|
||||
{
|
||||
wxGridCellAttr *attr = m_table->GetAttr(row, col);
|
||||
if ( !attr )
|
||||
{
|
||||
attr = new wxGridCellAttr;
|
||||
|
||||
// artificially inc the ref count to match DecRef() in caller
|
||||
attr->IncRef();
|
||||
|
||||
m_table->SetAttr(attr, row, col);
|
||||
}
|
||||
|
||||
return attr;
|
||||
}
|
||||
|
||||
void wxGrid::SetCellBackgroundColour( int row, int col, const wxColour& colour )
|
||||
{
|
||||
if ( CanHaveAttributes() )
|
||||
{
|
||||
wxGridCellAttr *attr = GetCellAttr(row, col);
|
||||
attr->SetBackgroundColour(colour);
|
||||
attr->DecRef();
|
||||
}
|
||||
}
|
||||
|
||||
void wxGrid::SetCellTextColour( int row, int col, const wxColour& colour )
|
||||
{
|
||||
if ( CanHaveAttributes() )
|
||||
{
|
||||
wxGridCellAttr *attr = GetCellAttr(row, col);
|
||||
attr->SetTextColour(colour);
|
||||
attr->DecRef();
|
||||
}
|
||||
}
|
||||
|
||||
void wxGrid::SetCellFont( int row, int col, const wxFont& font )
|
||||
{
|
||||
if ( CanHaveAttributes() )
|
||||
{
|
||||
wxGridCellAttr *attr = GetCellAttr(row, col);
|
||||
attr->SetFont(font);
|
||||
attr->DecRef();
|
||||
}
|
||||
}
|
||||
|
||||
void wxGrid::SetCellAlignment( int row, int col, int horiz, int vert )
|
||||
{
|
||||
if ( CanHaveAttributes() )
|
||||
{
|
||||
wxGridCellAttr *attr = GetCellAttr(row, col);
|
||||
attr->SetAlignment(horiz, vert);
|
||||
attr->DecRef();
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// row/col size
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxGrid::SetDefaultRowSize( int height, bool resizeExistingRows )
|
||||
{
|
||||
m_defaultRowHeight = wxMax( height, WXGRID_MIN_ROW_HEIGHT );
|
||||
@ -4719,90 +4842,6 @@ void wxGrid::SetColSize( int col, int width )
|
||||
CalcDimensions();
|
||||
}
|
||||
|
||||
void wxGrid::SetDefaultCellBackgroundColour( const wxColour& col )
|
||||
{
|
||||
m_gridWin->SetBackgroundColour(col);
|
||||
}
|
||||
|
||||
void wxGrid::SetDefaultCellTextColour( const wxColour& col )
|
||||
{
|
||||
m_gridWin->SetForegroundColour(col);
|
||||
}
|
||||
|
||||
void wxGrid::SetDefaultCellAlignment( int horiz, int vert )
|
||||
{
|
||||
m_defaultCellHAlign = horiz;
|
||||
m_defaultCellVAlign = vert;
|
||||
}
|
||||
|
||||
bool wxGrid::CanHaveAttributes()
|
||||
{
|
||||
if ( !m_table )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( !m_table->GetAttrProvider() )
|
||||
{
|
||||
// use the default attr provider by default
|
||||
// (another choice would be to just return FALSE thus forcing the user
|
||||
// to it himself)
|
||||
m_table->SetAttrProvider(new wxGridCellAttrProvider);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void wxGrid::SetCellBackgroundColour( int row, int col, const wxColour& colour )
|
||||
{
|
||||
if ( CanHaveAttributes() )
|
||||
{
|
||||
wxGridCellAttr *attr = new wxGridCellAttr;
|
||||
attr->SetBackgroundColour(colour);
|
||||
|
||||
m_table->SetAttr(attr, row, col);
|
||||
}
|
||||
}
|
||||
|
||||
void wxGrid::SetCellTextColour( int row, int col, const wxColour& colour )
|
||||
{
|
||||
if ( CanHaveAttributes() )
|
||||
{
|
||||
wxGridCellAttr *attr = new wxGridCellAttr;
|
||||
attr->SetTextColour(colour);
|
||||
|
||||
m_table->SetAttr(attr, row, col);
|
||||
}
|
||||
}
|
||||
|
||||
void wxGrid::SetDefaultCellFont( const wxFont& font )
|
||||
{
|
||||
m_defaultCellFont = font;
|
||||
}
|
||||
|
||||
void wxGrid::SetCellFont( int row, int col, const wxFont& font )
|
||||
{
|
||||
if ( CanHaveAttributes() )
|
||||
{
|
||||
wxGridCellAttr *attr = new wxGridCellAttr;
|
||||
attr->SetFont(font);
|
||||
|
||||
m_table->SetAttr(attr, row, col);
|
||||
}
|
||||
}
|
||||
|
||||
void wxGrid::SetCellAlignment( int row, int col, int horiz, int vert )
|
||||
{
|
||||
if ( CanHaveAttributes() )
|
||||
{
|
||||
wxGridCellAttr *attr = new wxGridCellAttr;
|
||||
attr->SetAlignment(horiz, vert);
|
||||
|
||||
m_table->SetAttr(attr, row, col);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// ------ cell value accessor functions
|
||||
|
Loading…
Reference in New Issue
Block a user