There were two fundamental problems: first, we painted on a separately created
wxClientDC instead of using the wxPaintDC already available in wxGrid. Second,
we invalidated the control while painting, resulting in endless repainting, at
least under wxGTK.
Fix the first problem by passing wxDC to wxGridCellEditor::PaintBackground()
and the second one by not refreshing the control from there as it just seems
unnecessary.
Also pass the attribute by reference for consistency with
wxGridCellRenderer::Draw() and because this pointer can never be NULL.
Closes #2628.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72697
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
// Draws the part of the cell not occupied by the control: the base class
// version just fills it with background colour from the attribute
- virtual void PaintBackground(const wxRect& rectCell, wxGridCellAttr *attr);
+ virtual void PaintBackground(wxDC& dc,
+ const wxRect& rectCell,
+ const wxGridCellAttr& attr);
// The methods called by wxGrid when a cell is edited: first BeginEdit() is
wxEvtHandler* evtHandler);
virtual void SetSize(const wxRect& rect);
- virtual void PaintBackground(const wxRect& rectCell, wxGridCellAttr *attr);
+ virtual void PaintBackground(wxDC& dc,
+ const wxRect& rectCell,
+ const wxGridCellAttr& attr);
virtual bool IsAcceptedKey(wxKeyEvent& event);
virtual void BeginEdit(int row, int col, wxGrid* grid);
virtual void SetSize(const wxRect& rect);
- virtual void PaintBackground(const wxRect& rectCell, wxGridCellAttr *attr);
+ virtual void PaintBackground(wxDC& dc,
+ const wxRect& rectCell,
+ const wxGridCellAttr& attr);
virtual void BeginEdit(int row, int col, wxGrid* grid);
virtual bool EndEdit(int row, int col, const wxGrid* grid,
grid->SetCellValue( 0, 5, wxT("Press\nCtrl+arrow\nto skip over\ncells") );
grid->SetRowSize( 99, 60 );
+ grid->SetCellValue(98, 98, "Test background colour setting");
+ grid->SetCellBackgroundColour(98, 99, wxColour(255, 127, 127));
+ grid->SetCellBackgroundColour(99, 98, wxColour(255, 127, 127));
grid->SetCellValue( 99, 99, wxT("Ctrl+End\nwill go to\nthis cell") );
grid->SetCellValue( 1, 0, wxT("This default cell will overflow into neighboring cells, but not if you turn overflow off."));
grid->SetCellRenderer(3, 0, new wxGridCellBoolRenderer);
grid->SetCellEditor(3, 0, new wxGridCellBoolEditor);
+ grid->SetCellBackgroundColour(3, 0, wxColour(255, 127, 127));
wxGridCellAttr *attr;
attr = new wxGridCellAttr;
// implicitly, causing this out-of order render.
#if !defined(__WXMAC__)
wxGridCellEditor *editor = attr->GetEditor(this, row, col);
- editor->PaintBackground(rect, attr);
+ editor->PaintBackground(dc, rect, *attr);
editor->DecRef();
#endif
}
m_control->PushEventHandler(evtHandler);
}
-void wxGridCellEditor::PaintBackground(const wxRect& rectCell,
- wxGridCellAttr *attr)
+void wxGridCellEditor::PaintBackground(wxDC& dc,
+ const wxRect& rectCell,
+ const wxGridCellAttr& attr)
{
// erase the background because we might not fill the cell
- wxClientDC dc(m_control->GetParent());
- wxGridWindow* gridWindow = wxDynamicCast(m_control->GetParent(), wxGridWindow);
- if (gridWindow)
- gridWindow->GetOwner()->PrepareDC(dc);
-
dc.SetPen(*wxTRANSPARENT_PEN);
- dc.SetBrush(wxBrush(attr->GetBackgroundColour()));
+ dc.SetBrush(wxBrush(attr.GetBackgroundColour()));
dc.DrawRectangle(rectCell);
-
- // redraw the control we just painted over
- m_control->Refresh();
}
void wxGridCellEditor::Destroy()
wxGridCellEditor::Create(parent, id, evtHandler);
}
-void wxGridCellTextEditor::PaintBackground(const wxRect& WXUNUSED(rectCell),
- wxGridCellAttr * WXUNUSED(attr))
+void wxGridCellTextEditor::PaintBackground(wxDC& WXUNUSED(dc),
+ const wxRect& WXUNUSED(rectCell),
+ const wxGridCellAttr& WXUNUSED(attr))
{
// as we fill the entire client area,
// don't do anything here to minimize flicker
wxGridCellEditor::SetSize(rectTallEnough);
}
-void wxGridCellChoiceEditor::PaintBackground(const wxRect& rectCell,
- wxGridCellAttr * attr)
+void wxGridCellChoiceEditor::PaintBackground(wxDC& dc,
+ const wxRect& rectCell,
+ const wxGridCellAttr& attr)
{
// as we fill the entire client area, don't do anything here to minimize
// flicker
// TODO: It doesn't actually fill the client area since the height of a
// combo always defaults to the standard. Until someone has time to
// figure out the right rectangle to paint, just do it the normal way.
- wxGridCellEditor::PaintBackground(rectCell, attr);
+ wxGridCellEditor::PaintBackground(dc, rectCell, attr);
}
void wxGridCellChoiceEditor::BeginEdit(int row, int col, wxGrid* grid)