// left to the derived classes
virtual void SetParameters(const wxString& params);
+ // create a new object which is the copy of this one
+ virtual wxGridCellRenderer *Clone() const = 0;
+
protected:
// virtual dtor for any base class - private because only DecRef() can
// delete us
wxDC& dc,
int row, int col);
+ virtual wxGridCellRenderer *Clone() const
+ { return new wxGridCellStringRenderer; }
+
protected:
// set the text colours before drawing
void SetTextColoursAndFont(wxGrid& grid,
wxDC& dc,
int row, int col);
+ virtual wxGridCellRenderer *Clone() const
+ { return new wxGridCellNumberRenderer; }
+
protected:
wxString GetString(wxGrid& grid, int row, int col);
};
// parameters string format is "width[,precision]"
virtual void SetParameters(const wxString& params);
+ virtual wxGridCellRenderer *Clone() const;
+
protected:
wxString GetString(wxGrid& grid, int row, int col);
wxDC& dc,
int row, int col);
+ virtual wxGridCellRenderer *Clone() const
+ { return new wxGridCellBoolRenderer; }
+
private:
static wxSize ms_sizeCheckMark;
};
SetPrecision(precision);
}
+wxGridCellRenderer *wxGridCellFloatRenderer::Clone() const
+{
+ wxGridCellFloatRenderer *renderer = new wxGridCellFloatRenderer;
+ renderer->m_width = m_width;
+ renderer->m_precision = m_precision;
+ renderer->m_format = m_format;
+
+ return renderer;
+}
+
wxString wxGridCellFloatRenderer::GetString(wxGrid& grid, int row, int col)
{
wxGridTableBase *table = grid.GetTable();
wxGridCellRenderer*
wxGrid::GetDefaultRendererForType(const wxString& typeName) const
{
- // the first part of the typename is the "real" type, anything after ':'
- // are the parameters for the renderer
- wxString type = typeName.BeforeFirst(_T(':'));
-
- int index = m_typeRegistry->FindDataType(type);
+ // first try to find an exact match
+ wxGridCellRenderer *renderer;
+ int index = m_typeRegistry->FindDataType(typeName);
if ( index == wxNOT_FOUND )
{
- wxFAIL_MSG(wxT("Unknown data type name"));
+ // then try to construct a renderer from the base name and parameters
+ // following it
- return NULL;
- }
+ // the first part of the typename is the "real" type, anything after ':'
+ // are the parameters for the renderer
+ index = m_typeRegistry->FindDataType(typeName.BeforeFirst(_T(':')));
+ if ( index == wxNOT_FOUND )
+ {
+ wxFAIL_MSG(wxT("Unknown data type name"));
+
+ return NULL;
+ }
+
+ renderer = m_typeRegistry->GetRenderer(index);
+ wxGridCellRenderer *rendererOld = renderer;
+ renderer = renderer->Clone();
+ rendererOld->DecRef();
- wxGridCellRenderer *renderer = m_typeRegistry->GetRenderer(index);
+ // do it even if there are no parameters to reset them to defaults
+ renderer->SetParameters(typeName.AfterFirst(_T(':')));
- // do it even if there are no parameters to reset them to defaults
- renderer->SetParameters(typeName.AfterFirst(_T(':')));
+ // register the new typename
+ m_typeRegistry->RegisterDataType(typeName, renderer, NULL);
+ }
+ else
+ {
+ renderer = m_typeRegistry->GetRenderer(index);
+ }
return renderer;
}