Allow cloning client data stored in wxGrid attributes etc

Add wxSharedClientDataContainer class storing ref-counted client data
and use it instead of plain wxClientDataContainer in wxGridCellAttr,
wxGridCellEditor and wxGridCellRenderer classes.

This allows to keep the same client data associated with many grid cells
without having to make many copies of it.
This commit is contained in:
Frode Roxrud Gill
2022-03-13 17:05:12 +01:00
committed by Vadim Zeitlin
parent 88e92a5f01
commit f646e8b11c
11 changed files with 387 additions and 152 deletions

View File

@@ -14,6 +14,7 @@
#include "wx/defs.h"
#include "wx/string.h"
#include "wx/hashmap.h"
#include "wx/sharedptr.h"
typedef int (*wxShadowObjectMethod)(void*, void*);
WX_DECLARE_STRING_HASH_MAP_WITH_DECL(
@@ -158,5 +159,40 @@ protected:
};
// This class is a replacement for wxClientDataContainer, and unlike
// wxClientDataContainer the wxSharedClientDataContainer client data is
// copiable, so it can be copied when objects containing it are cloned.
// Like wxClientDataContainer, wxSharedClientDataContainer is a mixin
// that provides storage and management of "client data.". The client data
// is reference counted and managed by the container.
//
// NOTE: If your class has a clone function and needs to store client data,
// use wxSharedClientDataContainer and not wxClientDataContainer!
class WXDLLIMPEXP_BASE wxSharedClientDataContainer
{
public:
// Provide the same functions as in wxClientDataContainer, so that objects
// using it and this class could be used in exactly the same way.
void SetClientObject(wxClientData *data);
wxClientData *GetClientObject() const;
void SetClientData(void *data);
void *GetClientData() const;
protected:
bool HasClientDataContainer() const { return m_data.get() != NULL; }
wxSharedPtr<wxClientDataContainer> GetClientDataContainer() const { return m_data; }
void SetClientDataContainer(wxSharedPtr<wxClientDataContainer> data) { m_data = data; }
private:
// Helper function that will create m_data if it is currently NULL
wxClientDataContainer *GetValidClientData();
// m_data is shared, not deep copied, when cloned. If you make changes to
// the data in one instance of your class, you change it for all cloned
// instances!
wxSharedPtr<wxClientDataContainer> m_data;
};
#endif // _WX_CLNTDATAH__

View File

@@ -138,11 +138,14 @@ class wxGridDirectionOperations;
// class is not documented and is not public at all
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_CORE wxGridCellWorker : public wxClientDataContainer, public wxRefCounter
class WXDLLIMPEXP_CORE wxGridCellWorker : public wxSharedClientDataContainer,
public wxRefCounter
{
public:
wxGridCellWorker() { }
wxGridCellWorker(const wxGridCellWorker& other);
// interpret renderer parameters: arbitrary string whose interpretation is
// left to the derived classes
virtual void SetParameters(const wxString& params);
@@ -169,6 +172,16 @@ private:
class WXDLLIMPEXP_CORE wxGridCellRenderer : public wxGridCellWorker
{
public:
wxGridCellRenderer()
: wxGridCellWorker()
{
}
wxGridCellRenderer(const wxGridCellRenderer& other)
: wxGridCellWorker(other)
{
}
// draw the given cell on the provided DC inside the given rectangle
// using the style specified by the attribute and the default or selected
// state corresponding to the isSelected value.
@@ -376,7 +389,14 @@ private:
class WXDLLIMPEXP_CORE wxGridCellEditor : public wxGridCellWorker
{
public:
wxGridCellEditor();
wxGridCellEditor()
: wxGridCellWorker(),
m_control(NULL),
m_attr(NULL)
{
}
wxGridCellEditor(const wxGridCellEditor& other);
bool IsCreated() const { return m_control != NULL; }
@@ -524,8 +544,6 @@ protected:
// suppress the stupid gcc warning about the class having private dtor and
// no friends
friend class wxGridCellEditorDummyFriend;
wxDECLARE_NO_COPY_CLASS(wxGridCellEditor);
};
// Smart pointer to wxGridCellEditor, calling DecRef() on it automatically.
@@ -535,6 +553,16 @@ typedef wxObjectDataPtr<wxGridCellEditor> wxGridCellEditorPtr;
class wxGridCellActivatableEditor : public wxGridCellEditor
{
public:
wxGridCellActivatableEditor()
: wxGridCellEditor()
{
}
wxGridCellActivatableEditor(const wxGridCellActivatableEditor& other)
: wxGridCellEditor(other)
{
}
// In this class these methods must be overridden.
virtual wxGridActivationResult
TryActivate(int row, int col, wxGrid* grid,
@@ -705,7 +733,8 @@ private:
// class may be returned by wxGridTable::GetAttr().
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_CORE wxGridCellAttr : public wxClientDataContainer, public wxRefCounter
class WXDLLIMPEXP_CORE wxGridCellAttr : public wxSharedClientDataContainer,
public wxRefCounter
{
public:
enum wxAttrKind

View File

@@ -23,6 +23,16 @@
class WXDLLIMPEXP_ADV wxGridCellStringRenderer : public wxGridCellRenderer
{
public:
wxGridCellStringRenderer()
: wxGridCellRenderer()
{
}
wxGridCellStringRenderer(const wxGridCellStringRenderer& other)
: wxGridCellRenderer(other)
{
}
// draw the string
virtual void Draw(wxGrid& grid,
wxGridCellAttr& attr,
@@ -38,7 +48,7 @@ public:
int row, int col) wxOVERRIDE;
virtual wxGridCellRenderer *Clone() const wxOVERRIDE
{ return new wxGridCellStringRenderer; }
{ return new wxGridCellStringRenderer(*this); }
protected:
// calc the string extent for given string/font
@@ -53,11 +63,19 @@ class WXDLLIMPEXP_ADV wxGridCellNumberRenderer : public wxGridCellStringRenderer
public:
explicit wxGridCellNumberRenderer(long minValue = LONG_MIN,
long maxValue = LONG_MAX)
: m_minValue(minValue),
: wxGridCellStringRenderer(),
m_minValue(minValue),
m_maxValue(maxValue)
{
}
wxGridCellNumberRenderer(const wxGridCellNumberRenderer& other)
: wxGridCellStringRenderer(other),
m_minValue(other.m_minValue),
m_maxValue(other.m_maxValue)
{
}
// draw the string right aligned
virtual void Draw(wxGrid& grid,
wxGridCellAttr& attr,
@@ -79,7 +97,7 @@ public:
virtual void SetParameters(const wxString& params) wxOVERRIDE;
virtual wxGridCellRenderer *Clone() const wxOVERRIDE
{ return new wxGridCellNumberRenderer(m_minValue, m_maxValue); }
{ return new wxGridCellNumberRenderer(*this); }
protected:
wxString GetString(const wxGrid& grid, int row, int col);
@@ -95,6 +113,15 @@ public:
int precision = -1,
int format = wxGRID_FLOAT_FORMAT_DEFAULT);
wxGridCellFloatRenderer(const wxGridCellFloatRenderer& other)
: wxGridCellStringRenderer(other),
m_width(other.m_width),
m_precision(other.m_precision),
m_style(other.m_style),
m_format(other.m_format)
{
}
// get/change formatting parameters
int GetWidth() const { return m_width; }
void SetWidth(int width) { m_width = width; m_format.clear(); }
@@ -120,7 +147,8 @@ public:
// with format being one of f|e|g|E|F|G
virtual void SetParameters(const wxString& params) wxOVERRIDE;
virtual wxGridCellRenderer *Clone() const wxOVERRIDE;
virtual wxGridCellRenderer *Clone() const wxOVERRIDE
{ return new wxGridCellFloatRenderer(*this); }
protected:
wxString GetString(const wxGrid& grid, int row, int col);
@@ -138,6 +166,16 @@ private:
class WXDLLIMPEXP_ADV wxGridCellBoolRenderer : public wxGridCellRenderer
{
public:
wxGridCellBoolRenderer()
: wxGridCellRenderer()
{
}
wxGridCellBoolRenderer(const wxGridCellBoolRenderer& other)
: wxGridCellRenderer(other)
{
}
// draw a check mark or nothing
virtual void Draw(wxGrid& grid,
wxGridCellAttr& attr,
@@ -157,7 +195,7 @@ public:
wxDC& dc) wxOVERRIDE;
virtual wxGridCellRenderer *Clone() const wxOVERRIDE
{ return new wxGridCellBoolRenderer; }
{ return new wxGridCellBoolRenderer(*this); }
};
@@ -174,7 +212,8 @@ public:
explicit wxGridCellDateRenderer(const wxString& outformat = wxString());
wxGridCellDateRenderer(const wxGridCellDateRenderer& other)
: m_oformat(other.m_oformat),
: wxGridCellStringRenderer(other),
m_oformat(other.m_oformat),
m_tz(other.m_tz)
{
}
@@ -196,7 +235,8 @@ public:
wxGridCellAttr& attr,
wxDC& dc) wxOVERRIDE;
virtual wxGridCellRenderer *Clone() const wxOVERRIDE;
virtual wxGridCellRenderer *Clone() const wxOVERRIDE
{ return new wxGridCellDateRenderer(*this); }
// output strptime()-like format string
virtual void SetParameters(const wxString& params) wxOVERRIDE;
@@ -226,7 +266,8 @@ public:
{
}
virtual wxGridCellRenderer *Clone() const wxOVERRIDE;
virtual wxGridCellRenderer *Clone() const wxOVERRIDE
{ return new wxGridCellDateTimeRenderer(*this); }
protected:
virtual void
@@ -242,7 +283,9 @@ protected:
class WXDLLIMPEXP_ADV wxGridCellChoiceRenderer : public wxGridCellStringRenderer
{
public:
wxGridCellChoiceRenderer() { }
wxGridCellChoiceRenderer( const wxString& choices = wxEmptyString );
wxGridCellChoiceRenderer(const wxGridCellChoiceRenderer& other);
virtual wxSize GetMaxBestSize(wxGrid& grid,
wxGridCellAttr& attr,
@@ -257,10 +300,6 @@ public:
}
protected:
wxGridCellChoiceRenderer(const wxGridCellChoiceRenderer& other)
: m_choices(other.m_choices)
{
}
wxArrayString m_choices;
};
@@ -270,7 +309,15 @@ protected:
class WXDLLIMPEXP_ADV wxGridCellEnumRenderer : public wxGridCellChoiceRenderer
{
public:
wxGridCellEnumRenderer( const wxString& choices = wxEmptyString );
wxGridCellEnumRenderer( const wxString& choices = wxEmptyString )
: wxGridCellChoiceRenderer(choices)
{
}
wxGridCellEnumRenderer(const wxGridCellEnumRenderer& other)
: wxGridCellChoiceRenderer(other)
{
}
// draw the string right aligned
virtual void Draw(wxGrid& grid,
@@ -285,7 +332,8 @@ public:
wxDC& dc,
int row, int col) wxOVERRIDE;
virtual wxGridCellRenderer *Clone() const wxOVERRIDE;
virtual wxGridCellRenderer *Clone() const wxOVERRIDE
{ return new wxGridCellEnumRenderer(*this); }
protected:
wxString GetString(const wxGrid& grid, int row, int col);
@@ -295,7 +343,15 @@ protected:
class WXDLLIMPEXP_ADV wxGridCellAutoWrapStringRenderer : public wxGridCellStringRenderer
{
public:
wxGridCellAutoWrapStringRenderer() : wxGridCellStringRenderer() { }
wxGridCellAutoWrapStringRenderer()
: wxGridCellStringRenderer()
{
}
wxGridCellAutoWrapStringRenderer(const wxGridCellAutoWrapStringRenderer& other)
: wxGridCellStringRenderer(other)
{
}
virtual void Draw(wxGrid& grid,
wxGridCellAttr& attr,
@@ -322,7 +378,7 @@ public:
int height) wxOVERRIDE;
virtual wxGridCellRenderer *Clone() const wxOVERRIDE
{ return new wxGridCellAutoWrapStringRenderer; }
{ return new wxGridCellAutoWrapStringRenderer(*this); }
private:
wxArrayString GetTextLines( wxGrid& grid,

View File

@@ -55,7 +55,13 @@ private:
class WXDLLIMPEXP_ADV wxGridCellTextEditor : public wxGridCellEditor
{
public:
explicit wxGridCellTextEditor(size_t maxChars = 0);
explicit wxGridCellTextEditor(size_t maxChars = 0)
: wxGridCellEditor(),
m_maxChars(maxChars)
{
}
wxGridCellTextEditor(const wxGridCellTextEditor& other);
virtual void Create(wxWindow* parent,
wxWindowID id,
@@ -78,7 +84,8 @@ public:
virtual void SetValidator(const wxValidator& validator);
#endif
virtual wxGridCellEditor *Clone() const wxOVERRIDE;
virtual wxGridCellEditor *Clone() const wxOVERRIDE
{ return new wxGridCellTextEditor(*this); }
// added GetValue so we can get the value which is in the control
virtual wxString GetValue() const wxOVERRIDE;
@@ -98,8 +105,6 @@ private:
wxScopedPtr<wxValidator> m_validator;
#endif
wxString m_value;
wxDECLARE_NO_COPY_CLASS(wxGridCellTextEditor);
};
// the editor for numeric (long) data
@@ -108,7 +113,20 @@ class WXDLLIMPEXP_ADV wxGridCellNumberEditor : public wxGridCellTextEditor
public:
// allows to specify the range - if min == max == -1, no range checking is
// done
wxGridCellNumberEditor(int min = -1, int max = -1);
wxGridCellNumberEditor(int min = -1, int max = -1)
: wxGridCellTextEditor(),
m_min(min),
m_max(max)
{
}
wxGridCellNumberEditor(const wxGridCellNumberEditor& other)
: wxGridCellTextEditor(other),
m_min(other.m_min),
m_max(other.m_max),
m_value(other.m_value)
{
}
virtual void Create(wxWindow* parent,
wxWindowID id,
@@ -129,7 +147,7 @@ public:
virtual void SetParameters(const wxString& params) wxOVERRIDE;
virtual wxGridCellEditor *Clone() const wxOVERRIDE
{ return new wxGridCellNumberEditor(m_min, m_max); }
{ return new wxGridCellNumberEditor(*this); }
// added GetValue so we can get the value which is in the control
virtual wxString GetValue() const wxOVERRIDE;
@@ -158,8 +176,6 @@ private:
m_max;
long m_value;
wxDECLARE_NO_COPY_CLASS(wxGridCellNumberEditor);
};
@@ -193,7 +209,23 @@ class WXDLLIMPEXP_ADV wxGridCellFloatEditor : public wxGridCellTextEditor
public:
wxGridCellFloatEditor(int width = -1,
int precision = -1,
int format = wxGRID_FLOAT_FORMAT_DEFAULT);
int format = wxGRID_FLOAT_FORMAT_DEFAULT)
: wxGridCellTextEditor(),
m_width(width),
m_precision(precision),
m_style(format)
{
}
wxGridCellFloatEditor(const wxGridCellFloatEditor& other)
: wxGridCellTextEditor(other),
m_width(other.m_width),
m_precision(other.m_precision),
m_value(other.m_value),
m_style(other.m_style),
m_format(other.m_format)
{
}
virtual void Create(wxWindow* parent,
wxWindowID id,
@@ -209,7 +241,7 @@ public:
virtual void StartingKey(wxKeyEvent& event) wxOVERRIDE;
virtual wxGridCellEditor *Clone() const wxOVERRIDE
{ return new wxGridCellFloatEditor(m_width, m_precision); }
{ return new wxGridCellFloatEditor(*this); }
// parameters string format is "width[,precision[,format]]"
// format to choose between f|e|g|E|G (f is used by default)
@@ -226,8 +258,6 @@ private:
int m_style;
wxString m_format;
wxDECLARE_NO_COPY_CLASS(wxGridCellFloatEditor);
};
#endif // wxUSE_TEXTCTRL
@@ -238,7 +268,16 @@ private:
class WXDLLIMPEXP_ADV wxGridCellBoolEditor : public wxGridCellEditor
{
public:
wxGridCellBoolEditor() { }
wxGridCellBoolEditor()
: wxGridCellEditor()
{
}
wxGridCellBoolEditor(const wxGridCellBoolEditor& other)
: wxGridCellEditor(other),
m_value(other.m_value)
{
}
virtual wxGridActivationResult
TryActivate(int row, int col, wxGrid* grid,
@@ -263,7 +302,7 @@ public:
virtual void StartingKey(wxKeyEvent& event) wxOVERRIDE;
virtual wxGridCellEditor *Clone() const wxOVERRIDE
{ return new wxGridCellBoolEditor; }
{ return new wxGridCellBoolEditor(*this); }
// added GetValue so we can get the value which is in the control, see
// also UseStringValues()
@@ -294,8 +333,6 @@ private:
bool m_value;
static wxString ms_stringValues[2];
wxDECLARE_NO_COPY_CLASS(wxGridCellBoolEditor);
};
#endif // wxUSE_CHECKBOX
@@ -311,7 +348,20 @@ public:
const wxString choices[] = NULL,
bool allowOthers = false);
wxGridCellChoiceEditor(const wxArrayString& choices,
bool allowOthers = false);
bool allowOthers = false)
: wxGridCellEditor(),
m_choices(choices),
m_allowOthers(allowOthers)
{
}
wxGridCellChoiceEditor(const wxGridCellChoiceEditor& other)
: wxGridCellEditor(other),
m_value(other.m_value),
m_choices(other.m_choices),
m_allowOthers(other.m_allowOthers)
{
}
virtual void Create(wxWindow* parent,
wxWindowID id,
@@ -329,7 +379,8 @@ public:
// parameters string format is "item1[,item2[...,itemN]]"
virtual void SetParameters(const wxString& params) wxOVERRIDE;
virtual wxGridCellEditor *Clone() const wxOVERRIDE;
virtual wxGridCellEditor *Clone() const wxOVERRIDE
{ return new wxGridCellChoiceEditor(*this); }
// added GetValue so we can get the value which is in the control
virtual wxString GetValue() const wxOVERRIDE;
@@ -342,8 +393,6 @@ protected:
wxString m_value;
wxArrayString m_choices;
bool m_allowOthers;
wxDECLARE_NO_COPY_CLASS(wxGridCellChoiceEditor);
};
#endif // wxUSE_COMBOBOX
@@ -354,9 +403,17 @@ class WXDLLIMPEXP_ADV wxGridCellEnumEditor : public wxGridCellChoiceEditor
{
public:
wxGridCellEnumEditor( const wxString& choices = wxEmptyString );
wxGridCellEnumEditor(const wxGridCellEnumEditor& other)
: wxGridCellChoiceEditor(other),
m_index(other.m_index)
{
}
virtual ~wxGridCellEnumEditor() {}
virtual wxGridCellEditor* Clone() const wxOVERRIDE;
virtual wxGridCellEditor* Clone() const wxOVERRIDE
{ return new wxGridCellEnumEditor(*this); }
virtual void BeginEdit(int row, int col, wxGrid* grid) wxOVERRIDE;
virtual bool EndEdit(int row, int col, const wxGrid* grid,
@@ -365,8 +422,6 @@ public:
private:
long m_index;
wxDECLARE_NO_COPY_CLASS(wxGridCellEnumEditor);
};
#endif // wxUSE_COMBOBOX
@@ -374,15 +429,22 @@ private:
class WXDLLIMPEXP_ADV wxGridCellAutoWrapStringEditor : public wxGridCellTextEditor
{
public:
wxGridCellAutoWrapStringEditor() : wxGridCellTextEditor() { }
wxGridCellAutoWrapStringEditor()
: wxGridCellTextEditor()
{
}
wxGridCellAutoWrapStringEditor(const wxGridCellAutoWrapStringEditor& other)
: wxGridCellTextEditor(other)
{
}
virtual void Create(wxWindow* parent,
wxWindowID id,
wxEvtHandler* evtHandler) wxOVERRIDE;
virtual wxGridCellEditor *Clone() const wxOVERRIDE
{ return new wxGridCellAutoWrapStringEditor; }
wxDECLARE_NO_COPY_CLASS(wxGridCellAutoWrapStringEditor);
{ return new wxGridCellAutoWrapStringEditor(*this); }
};
#if wxUSE_DATEPICKCTRL
@@ -392,6 +454,13 @@ class WXDLLIMPEXP_ADV wxGridCellDateEditor : public wxGridCellEditor
public:
explicit wxGridCellDateEditor(const wxString& format = wxString());
wxGridCellDateEditor(const wxGridCellDateEditor& other)
: wxGridCellEditor(other),
m_value(other.m_value),
m_format(other.m_format)
{
}
virtual void SetParameters(const wxString& params) wxOVERRIDE;
virtual void Create(wxWindow* parent,
@@ -407,7 +476,8 @@ public:
virtual void Reset() wxOVERRIDE;
virtual wxGridCellEditor *Clone() const wxOVERRIDE;
virtual wxGridCellEditor *Clone() const wxOVERRIDE
{ return new wxGridCellDateEditor(*this); }
virtual wxString GetValue() const wxOVERRIDE;
@@ -417,8 +487,6 @@ protected:
private:
wxDateTime m_value;
wxString m_format;
wxDECLARE_NO_COPY_CLASS(wxGridCellDateEditor);
};
#endif // wxUSE_DATEPICKCTRL

View File

@@ -21,7 +21,7 @@
@library{wxbase}
@category{containers}
@see wxEvtHandler, wxClientData
@see wxSharedClientDataContainer, wxEvtHandler, wxClientData
*/
class wxClientDataContainer
{
@@ -59,6 +59,56 @@ public:
/**
@class wxSharedClientDataContainer
This class is a replacement for @ref wxClientDataContainer, and unlike
wxClientDataContainer the wxSharedClientDataContainer client data is
copiable, so it can be copied when objects containing it are cloned.
Like wxClientDataContainer, wxSharedClientDataContainer is a mixin
that provides storage and management of "client data.". The client data
is reference counted and managed by the container. As the client data
is a shared object, changing the client data used by any object changes
it for all other objects, too.
@note If your class has a Clone function and needs to store client data,
use wxSharedClientDataContainer and not wxClientDataContainer!
@library{wxbase}
@category{containers}
@see wxClientDataContainer, wxClientData
@since 3.1.7
*/
class wxSharedClientDataContainer
{
public:
// Provide the same functions as in wxClientDataContainer, so that objects
// using it and this class could be used in exactly the same way.
/**
Get the untyped client data.
*/
void* GetClientData() const;
/**
Get a pointer to the client data object.
*/
wxClientData* GetClientObject() const;
/**
Set the untyped client data.
*/
void SetClientData(void* data);
/**
Set the client data object. Any previous object will be deleted.
*/
void SetClientObject(wxClientData* data);
};
/**
@class wxClientData

View File

@@ -28,7 +28,7 @@
wxGridCellFloatRenderer, wxGridCellNumberRenderer,
wxGridCellStringRenderer
*/
class wxGridCellRenderer : public wxClientDataContainer, public wxRefCounter
class wxGridCellRenderer : public wxSharedClientDataContainer, public wxRefCounter
{
public:
wxGridCellRenderer();
@@ -571,7 +571,7 @@ public:
wxGridCellFloatEditor, wxGridCellNumberEditor,
wxGridCellTextEditor, wxGridCellDateEditor
*/
class wxGridCellEditor : public wxClientDataContainer, public wxRefCounter
class wxGridCellEditor : public wxSharedClientDataContainer, public wxRefCounter
{
public:
/**
@@ -1217,7 +1217,7 @@ public:
@library{wxcore}
@category{grid}
*/
class wxGridCellAttr : public wxClientDataContainer, public wxRefCounter
class wxGridCellAttr : public wxSharedClientDataContainer, public wxRefCounter
{
public:
/**

View File

@@ -72,6 +72,35 @@ void *wxClientDataContainer::DoGetClientData() const
}
void wxSharedClientDataContainer::SetClientObject(wxClientData *data)
{
GetValidClientData()->SetClientObject(data);
}
wxClientData *wxSharedClientDataContainer::GetClientObject() const
{
return HasClientDataContainer() ? GetClientDataContainer()->GetClientObject() : NULL;
}
void wxSharedClientDataContainer::SetClientData(void *data)
{
GetValidClientData()->SetClientData(data);
}
void *wxSharedClientDataContainer::GetClientData() const
{
return HasClientDataContainer() ? GetClientDataContainer()->GetClientData() : NULL;
}
wxClientDataContainer *wxSharedClientDataContainer::GetValidClientData()
{
if ( !HasClientDataContainer() )
{
m_data = new wxClientDataContainer;
}
return m_data.get();
}
// ----------------------------------------------------------------------------

View File

@@ -253,6 +253,11 @@ int wxGridColumnOperations::GetFirstLine(const wxGrid *grid, wxGridWindow *gridW
// wxGridCellRenderer and wxGridCellEditor managing ref counting
// ----------------------------------------------------------------------------
wxGridCellWorker::wxGridCellWorker(const wxGridCellWorker& other)
{
SetClientDataContainer(other.GetClientDataContainer());
}
void wxGridCellWorker::SetParameters(const wxString& WXUNUSED(params))
{
// nothing to do
@@ -445,6 +450,8 @@ wxGridCellAttr *wxGridCellAttr::Clone() const
m_editor->IncRef();
}
attr->SetClientDataContainer(GetClientDataContainer());
if ( IsReadOnly() )
attr->SetReadOnly();
@@ -485,6 +492,10 @@ void wxGridCellAttr::MergeWith(wxGridCellAttr *mergefrom)
m_editor = mergefrom->m_editor;
m_editor->IncRef();
}
if ( !HasClientDataContainer() && mergefrom->HasClientDataContainer() )
{
SetClientDataContainer(mergefrom->GetClientDataContainer());
}
if ( !HasReadWriteMode() && mergefrom->HasReadWriteMode() )
SetReadOnly(mergefrom->IsReadOnly());

View File

@@ -158,6 +158,7 @@ using namespace wxGridPrivate;
// Enables a grid cell to display a formatted date
wxGridCellDateRenderer::wxGridCellDateRenderer(const wxString& outformat)
: wxGridCellStringRenderer()
{
if ( outformat.empty() )
{
@@ -170,11 +171,6 @@ wxGridCellDateRenderer::wxGridCellDateRenderer(const wxString& outformat)
m_tz = wxDateTime::Local;
}
wxGridCellRenderer *wxGridCellDateRenderer::Clone() const
{
return new wxGridCellDateRenderer(*this);
}
wxString wxGridCellDateRenderer::GetString(const wxGrid& grid, int row, int col)
{
wxString text;
@@ -256,11 +252,6 @@ wxGridCellDateTimeRenderer::wxGridCellDateTimeRenderer(const wxString& outformat
{
}
wxGridCellRenderer *wxGridCellDateTimeRenderer::Clone() const
{
return new wxGridCellDateTimeRenderer(*this);
}
void
wxGridCellDateTimeRenderer::GetDateParseParams(DateParseParams& params) const
{
@@ -273,6 +264,19 @@ wxGridCellDateTimeRenderer::GetDateParseParams(DateParseParams& params) const
// wxGridCellChoiceRenderer
// ----------------------------------------------------------------------------
wxGridCellChoiceRenderer::wxGridCellChoiceRenderer(const wxString& choices)
: wxGridCellStringRenderer()
{
if (!choices.empty())
SetParameters(choices);
}
wxGridCellChoiceRenderer::wxGridCellChoiceRenderer(const wxGridCellChoiceRenderer& other)
: wxGridCellStringRenderer(other),
m_choices(other.m_choices)
{
}
wxSize wxGridCellChoiceRenderer::GetMaxBestSize(wxGrid& WXUNUSED(grid),
wxGridCellAttr& attr,
wxDC& dc)
@@ -308,19 +312,6 @@ void wxGridCellChoiceRenderer::SetParameters(const wxString& params)
// eg data in cell is 0,1,2 ... n the cell could be rendered as "John","Fred"..."Bob"
wxGridCellEnumRenderer::wxGridCellEnumRenderer(const wxString& choices)
{
if (!choices.empty())
SetParameters(choices);
}
wxGridCellRenderer *wxGridCellEnumRenderer::Clone() const
{
wxGridCellEnumRenderer *renderer = new wxGridCellEnumRenderer;
renderer->m_choices = m_choices;
return renderer;
}
wxString wxGridCellEnumRenderer::GetString(const wxGrid& grid, int row, int col)
{
wxGridTableBase *table = grid.GetTable();
@@ -809,23 +800,13 @@ void wxGridCellNumberRenderer::SetParameters(const wxString& params)
wxGridCellFloatRenderer::wxGridCellFloatRenderer(int width,
int precision,
int format)
: wxGridCellStringRenderer()
{
SetWidth(width);
SetPrecision(precision);
SetFormat(format);
}
wxGridCellRenderer *wxGridCellFloatRenderer::Clone() const
{
wxGridCellFloatRenderer *renderer = new wxGridCellFloatRenderer;
renderer->m_width = m_width;
renderer->m_precision = m_precision;
renderer->m_style = m_style;
renderer->m_format = m_format;
return renderer;
}
wxString wxGridCellFloatRenderer::GetString(const wxGrid& grid, int row, int col)
{
wxGridTableBase *table = grid.GetTable();

View File

@@ -228,10 +228,14 @@ void wxGridCellEditorEvtHandler::OnChar(wxKeyEvent& event)
// wxGridCellEditor
// ----------------------------------------------------------------------------
wxGridCellEditor::wxGridCellEditor()
wxGridCellEditor::wxGridCellEditor(const wxGridCellEditor& other)
: wxGridCellWorker(other),
m_control(other.m_control),
m_colFgOld(other.m_colFgOld),
m_colBgOld(other.m_colBgOld),
m_fontOld(other.m_fontOld)
{
m_control = NULL;
m_attr = NULL;
m_attr = other.m_attr ? other.m_attr->Clone() : NULL;
}
wxGridCellEditor::~wxGridCellEditor()
@@ -434,9 +438,17 @@ void wxGridCellEditor::StartingClick()
// wxGridCellTextEditor
// ----------------------------------------------------------------------------
wxGridCellTextEditor::wxGridCellTextEditor(size_t maxChars)
wxGridCellTextEditor::wxGridCellTextEditor(const wxGridCellTextEditor& other)
: wxGridCellEditor(other),
m_maxChars(other.m_maxChars),
m_value(other.m_value)
{
m_maxChars = maxChars;
#if wxUSE_VALIDATORS
if ( other.m_validator )
{
SetValidator(*other.m_validator);
}
#endif
}
void wxGridCellTextEditor::Create(wxWindow* parent,
@@ -669,18 +681,6 @@ void wxGridCellTextEditor::SetValidator(const wxValidator& validator)
}
#endif
wxGridCellEditor *wxGridCellTextEditor::Clone() const
{
wxGridCellTextEditor* editor = new wxGridCellTextEditor(m_maxChars);
#if wxUSE_VALIDATORS
if ( m_validator )
{
editor->SetValidator(*m_validator);
}
#endif
return editor;
}
// return the value in the text control
wxString wxGridCellTextEditor::GetValue() const
{
@@ -691,12 +691,6 @@ wxString wxGridCellTextEditor::GetValue() const
// wxGridCellNumberEditor
// ----------------------------------------------------------------------------
wxGridCellNumberEditor::wxGridCellNumberEditor(int min, int max)
{
m_min = min;
m_max = max;
}
void wxGridCellNumberEditor::Create(wxWindow* parent,
wxWindowID id,
wxEvtHandler* evtHandler)
@@ -964,15 +958,6 @@ wxString wxGridCellNumberEditor::GetValue() const
// wxGridCellFloatEditor
// ----------------------------------------------------------------------------
wxGridCellFloatEditor::wxGridCellFloatEditor(int width,
int precision,
int format)
{
m_width = width;
m_precision = precision;
m_style = format;
}
void wxGridCellFloatEditor::Create(wxWindow* parent,
wxWindowID id,
wxEvtHandler* evtHandler)
@@ -1486,15 +1471,11 @@ void wxGridCellBoolEditor::SetGridFromValue(int row, int col, wxGrid* grid) cons
// wxGridCellChoiceEditor
// ----------------------------------------------------------------------------
wxGridCellChoiceEditor::wxGridCellChoiceEditor(const wxArrayString& choices,
bool allowOthers)
: m_choices(choices),
m_allowOthers(allowOthers) { }
wxGridCellChoiceEditor::wxGridCellChoiceEditor(size_t count,
const wxString choices[],
bool allowOthers)
: m_allowOthers(allowOthers)
: wxGridCellEditor(),
m_allowOthers(allowOthers)
{
if ( count )
{
@@ -1506,15 +1487,6 @@ wxGridCellChoiceEditor::wxGridCellChoiceEditor(size_t count,
}
}
wxGridCellEditor *wxGridCellChoiceEditor::Clone() const
{
wxGridCellChoiceEditor *editor = new wxGridCellChoiceEditor;
editor->m_allowOthers = m_allowOthers;
editor->m_choices = m_choices;
return editor;
}
void wxGridCellChoiceEditor::Create(wxWindow* parent,
wxWindowID id,
wxEvtHandler* evtHandler)
@@ -1684,21 +1656,13 @@ void wxGridCellChoiceEditor::OnComboCloseUp(wxCommandEvent& WXUNUSED(evt))
// "John","Fred"..."Bob" in the combo choice box
wxGridCellEnumEditor::wxGridCellEnumEditor(const wxString& choices)
:wxGridCellChoiceEditor()
: wxGridCellChoiceEditor(),
m_index(-1)
{
m_index = -1;
if (!choices.empty())
SetParameters(choices);
}
wxGridCellEditor *wxGridCellEnumEditor::Clone() const
{
wxGridCellEnumEditor *editor = new wxGridCellEnumEditor();
editor->m_index = m_index;
return editor;
}
void wxGridCellEnumEditor::BeginEdit(int row, int col, wxGrid* grid)
{
wxASSERT_MSG(m_control,
@@ -1846,6 +1810,7 @@ struct wxGridCellDateEditorKeyHandler
#endif // __WXGTK__
wxGridCellDateEditor::wxGridCellDateEditor(const wxString& format)
: wxGridCellEditor()
{
SetParameters(format);
}
@@ -1957,11 +1922,6 @@ void wxGridCellDateEditor::Reset()
m_value = DatePicker()->GetValue();
}
wxGridCellEditor *wxGridCellDateEditor::Clone() const
{
return new wxGridCellDateEditor(m_format);
}
wxString wxGridCellDateEditor::GetValue() const
{
wxASSERT_MSG(m_control, "The wxGridCellDateEditor must be created first!");

View File

@@ -1729,6 +1729,21 @@ TEST_CASE_METHOD(GridTestCase, "Grid::CellAttribute", "[attr][cell][grid]")
CHECK_ATTR_COUNT( 0 );
}
SECTION("Cloning")
{
CHECK_ATTR_COUNT( 0 );
m_grid->GetOrCreateCellAttrPtr(0, 0)
->SetClientObject(new wxStringClientData("test"));
CHECK_ATTR_COUNT( 1 );
m_grid->SetAttr(0, 1, m_grid->GetOrCreateCellAttrPtr(0, 0)->Clone());
CHECK_ATTR_COUNT( 2 );
wxClientData* const
data = m_grid->GetOrCreateCellAttrPtr(0, 1)->GetClientObject();
CHECK( static_cast<wxStringClientData*>(data)->GetData() == "test" );
}
// Fill the grid with attributes for next sections.