Merged wxBaseEnumPropertyClass (intermediate property class with obsolete purpose) to wxEnumPropertyClass
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56486 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -343,82 +343,6 @@ public:
|
|||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
/** @class wxBaseEnumProperty
|
|
||||||
@ingroup classes
|
|
||||||
Derive dynamic custom properties with choices from this class.
|
|
||||||
|
|
||||||
@remarks
|
|
||||||
- Updating private index is important. You can do this either by calling
|
|
||||||
SetIndex() in IntToValue, and then letting wxBaseEnumProperty::OnSetValue
|
|
||||||
be called (by not implementing it, or by calling super class function in
|
|
||||||
it) -OR- you can just call SetIndex in OnSetValue.
|
|
||||||
*/
|
|
||||||
class WXDLLIMPEXP_PROPGRID wxBaseEnumProperty : public wxPGProperty
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
wxBaseEnumProperty( const wxString& label = wxPG_LABEL,
|
|
||||||
const wxString& name = wxPG_LABEL );
|
|
||||||
|
|
||||||
virtual void OnSetValue();
|
|
||||||
virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
|
|
||||||
virtual bool StringToValue( wxVariant& variant,
|
|
||||||
const wxString& text,
|
|
||||||
int argFlags = 0 ) const;
|
|
||||||
virtual bool ValidateValue( wxVariant& value,
|
|
||||||
wxPGValidationInfo& validationInfo ) const;
|
|
||||||
|
|
||||||
// If wxPG_FULL_VALUE is not set in flags, then the value is interpreted
|
|
||||||
// as index to choices list. Otherwise, it is actual value.
|
|
||||||
virtual bool IntToValue( wxVariant& variant,
|
|
||||||
int number,
|
|
||||||
int argFlags = 0 ) const;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Additional virtuals
|
|
||||||
|
|
||||||
// This must be overridden to have non-index based value
|
|
||||||
virtual int GetIndexForValue( int value ) const;
|
|
||||||
|
|
||||||
// This returns string and value for index
|
|
||||||
// Returns NULL if beyond last item
|
|
||||||
// pvalue is never NULL - always set it.
|
|
||||||
virtual const wxString* GetEntry( size_t index, int* pvalue ) const = 0;
|
|
||||||
|
|
||||||
// GetChoiceSelection needs to overridden since m_index is
|
|
||||||
// the true index, and various property classes derived from
|
|
||||||
// this take advantage of it.
|
|
||||||
virtual int GetChoiceSelection() const { return m_index; }
|
|
||||||
|
|
||||||
int GetValueForIndex( size_t index ) const
|
|
||||||
{
|
|
||||||
int v;
|
|
||||||
GetEntry( index, &v );
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
int GetIndex() const;
|
|
||||||
void SetIndex( int index );
|
|
||||||
|
|
||||||
bool ValueFromString_( wxVariant& value,
|
|
||||||
const wxString& text,
|
|
||||||
int argFlags ) const;
|
|
||||||
bool ValueFromInt_( wxVariant& value, int intVal, int argFlags ) const;
|
|
||||||
|
|
||||||
static void ResetNextIndex() { ms_nextIndex = -2; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
// This is private so that classes are guaranteed to use GetIndex
|
|
||||||
// for up-to-date index value.
|
|
||||||
int m_index;
|
|
||||||
|
|
||||||
// Relies on ValidateValue being called always before OnSetValue
|
|
||||||
static int ms_nextIndex;
|
|
||||||
};
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
|
|
||||||
// If set, then selection of choices is static and should not be
|
// If set, then selection of choices is static and should not be
|
||||||
// changed (i.e. returns NULL in GetPropertyChoices).
|
// changed (i.e. returns NULL in GetPropertyChoices).
|
||||||
#define wxPG_PROP_STATIC_CHOICES wxPG_PROP_CLASS_SPECIFIC_1
|
#define wxPG_PROP_STATIC_CHOICES wxPG_PROP_CLASS_SPECIFIC_1
|
||||||
@@ -427,8 +351,14 @@ private:
|
|||||||
@ingroup classes
|
@ingroup classes
|
||||||
You can derive custom properties with choices from this class. See
|
You can derive custom properties with choices from this class. See
|
||||||
wxBaseEnumProperty for remarks.
|
wxBaseEnumProperty for remarks.
|
||||||
|
|
||||||
|
@remarks
|
||||||
|
- Updating private index is important. You can do this either by calling
|
||||||
|
SetIndex() in IntToValue, and then letting wxBaseEnumProperty::OnSetValue
|
||||||
|
be called (by not implementing it, or by calling super class function in
|
||||||
|
it) -OR- you can just call SetIndex in OnSetValue.
|
||||||
*/
|
*/
|
||||||
class WXDLLIMPEXP_PROPGRID wxEnumProperty : public wxBaseEnumProperty
|
class WXDLLIMPEXP_PROPGRID wxEnumProperty : public wxPGProperty
|
||||||
{
|
{
|
||||||
WX_PG_DECLARE_PROPERTY_CLASS(wxEnumProperty)
|
WX_PG_DECLARE_PROPERTY_CLASS(wxEnumProperty)
|
||||||
public:
|
public:
|
||||||
@@ -467,11 +397,52 @@ public:
|
|||||||
|
|
||||||
virtual ~wxEnumProperty();
|
virtual ~wxEnumProperty();
|
||||||
|
|
||||||
virtual int GetIndexForValue( int value ) const;
|
|
||||||
virtual const wxString* GetEntry( size_t index, int* pvalue ) const;
|
|
||||||
|
|
||||||
size_t GetItemCount() const { return m_choices.GetCount(); }
|
size_t GetItemCount() const { return m_choices.GetCount(); }
|
||||||
const wxPGChoices& GetChoices() const { return m_choices; }
|
|
||||||
|
virtual void OnSetValue();
|
||||||
|
virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
|
||||||
|
virtual bool StringToValue( wxVariant& variant,
|
||||||
|
const wxString& text,
|
||||||
|
int argFlags = 0 ) const;
|
||||||
|
virtual bool ValidateValue( wxVariant& value,
|
||||||
|
wxPGValidationInfo& validationInfo ) const;
|
||||||
|
|
||||||
|
// If wxPG_FULL_VALUE is not set in flags, then the value is interpreted
|
||||||
|
// as index to choices list. Otherwise, it is actual value.
|
||||||
|
virtual bool IntToValue( wxVariant& variant,
|
||||||
|
int number,
|
||||||
|
int argFlags = 0 ) const;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Additional virtuals
|
||||||
|
|
||||||
|
// This must be overridden to have non-index based value
|
||||||
|
virtual int GetIndexForValue( int value ) const;
|
||||||
|
|
||||||
|
// GetChoiceSelection needs to overridden since m_index is
|
||||||
|
// the true index, and various property classes derived from
|
||||||
|
// this take advantage of it.
|
||||||
|
virtual int GetChoiceSelection() const { return m_index; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
int GetIndex() const;
|
||||||
|
void SetIndex( int index );
|
||||||
|
|
||||||
|
bool ValueFromString_( wxVariant& value,
|
||||||
|
const wxString& text,
|
||||||
|
int argFlags ) const;
|
||||||
|
bool ValueFromInt_( wxVariant& value, int intVal, int argFlags ) const;
|
||||||
|
|
||||||
|
static void ResetNextIndex() { ms_nextIndex = -2; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
// This is private so that classes are guaranteed to use GetIndex
|
||||||
|
// for up-to-date index value.
|
||||||
|
int m_index;
|
||||||
|
|
||||||
|
// Relies on ValidateValue being called always before OnSetValue
|
||||||
|
static int ms_nextIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
@@ -1082,7 +1082,7 @@ bool wxSystemColourProperty::QueryColourFromUser( wxVariant& variant ) const
|
|||||||
bool wxSystemColourProperty::IntToValue( wxVariant& variant, int number, int WXUNUSED(argFlags) ) const
|
bool wxSystemColourProperty::IntToValue( wxVariant& variant, int number, int WXUNUSED(argFlags) ) const
|
||||||
{
|
{
|
||||||
int index = number;
|
int index = number;
|
||||||
int type = GetValueForIndex(index);
|
int type = m_choices.GetValue(index);
|
||||||
|
|
||||||
if ( type == wxPG_COLOUR_CUSTOM )
|
if ( type == wxPG_COLOUR_CUSTOM )
|
||||||
{
|
{
|
||||||
|
@@ -878,26 +878,93 @@ bool wxBoolProperty::DoSetAttribute( const wxString& name, wxVariant& value )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
// wxBaseEnumProperty
|
// wxEnumProperty
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
int wxBaseEnumProperty::ms_nextIndex = -2;
|
IMPLEMENT_DYNAMIC_CLASS(wxEnumProperty, wxPGProperty)
|
||||||
|
|
||||||
wxBaseEnumProperty::wxBaseEnumProperty( const wxString& label, const wxString& name )
|
WX_PG_IMPLEMENT_PROPERTY_CLASS_PLAIN(wxEnumProperty,long,Choice)
|
||||||
: wxPGProperty(label,name)
|
|
||||||
|
wxEnumProperty::wxEnumProperty( const wxString& label, const wxString& name, const wxChar** labels,
|
||||||
|
const long* values, int value ) : wxPGProperty(label,name)
|
||||||
{
|
{
|
||||||
m_value = wxPGVariant_Zero;
|
SetIndex(0);
|
||||||
|
|
||||||
|
if ( labels )
|
||||||
|
{
|
||||||
|
m_choices.Add(labels,values);
|
||||||
|
|
||||||
|
if ( GetItemCount() )
|
||||||
|
SetValue( (long)value );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** If has values array, then returns number at index with value -
|
wxEnumProperty::wxEnumProperty( const wxString& label, const wxString& name, const wxChar** labels,
|
||||||
otherwise just returns the value.
|
const long* values, wxPGChoices* choicesCache, int value )
|
||||||
*/
|
: wxPGProperty(label,name)
|
||||||
int wxBaseEnumProperty::GetIndexForValue( int value ) const
|
|
||||||
{
|
{
|
||||||
|
SetIndex(0);
|
||||||
|
|
||||||
|
wxASSERT( choicesCache );
|
||||||
|
|
||||||
|
if ( choicesCache->IsOk() )
|
||||||
|
{
|
||||||
|
m_choices.Assign( *choicesCache );
|
||||||
|
m_value = wxPGVariant_Zero;
|
||||||
|
}
|
||||||
|
else if ( labels )
|
||||||
|
{
|
||||||
|
m_choices.Add(labels,values);
|
||||||
|
|
||||||
|
if ( GetItemCount() )
|
||||||
|
SetValue( (long)value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxEnumProperty::wxEnumProperty( const wxString& label, const wxString& name,
|
||||||
|
const wxArrayString& labels, const wxArrayInt& values, int value )
|
||||||
|
: wxPGProperty(label,name)
|
||||||
|
{
|
||||||
|
SetIndex(0);
|
||||||
|
|
||||||
|
if ( &labels && labels.size() )
|
||||||
|
{
|
||||||
|
m_choices.Set(labels, values);
|
||||||
|
|
||||||
|
if ( GetItemCount() )
|
||||||
|
SetValue( (long)value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxEnumProperty::wxEnumProperty( const wxString& label, const wxString& name,
|
||||||
|
wxPGChoices& choices, int value )
|
||||||
|
: wxPGProperty(label,name)
|
||||||
|
{
|
||||||
|
m_choices.Assign( choices );
|
||||||
|
|
||||||
|
if ( GetItemCount() )
|
||||||
|
SetValue( (long)value );
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxEnumProperty::GetIndexForValue( int value ) const
|
||||||
|
{
|
||||||
|
if ( !m_choices.IsOk() )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
int intVal = m_choices.Index(value);
|
||||||
|
if ( intVal >= 0 )
|
||||||
|
return intVal;
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxBaseEnumProperty::OnSetValue()
|
wxEnumProperty::~wxEnumProperty ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int wxEnumProperty::ms_nextIndex = -2;
|
||||||
|
|
||||||
|
void wxEnumProperty::OnSetValue()
|
||||||
{
|
{
|
||||||
wxString variantType = m_value.GetType();
|
wxString variantType = m_value.GetType();
|
||||||
|
|
||||||
@@ -915,7 +982,7 @@ void wxBaseEnumProperty::OnSetValue()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxBaseEnumProperty::ValidateValue( wxVariant& value, wxPGValidationInfo& WXUNUSED(validationInfo) ) const
|
bool wxEnumProperty::ValidateValue( wxVariant& value, wxPGValidationInfo& WXUNUSED(validationInfo) ) const
|
||||||
{
|
{
|
||||||
// Make sure string value is in the list,
|
// Make sure string value is in the list,
|
||||||
// unless property has string as preferred value type
|
// unless property has string as preferred value type
|
||||||
@@ -927,7 +994,7 @@ bool wxBaseEnumProperty::ValidateValue( wxVariant& value, wxPGValidationInfo& WX
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString wxBaseEnumProperty::ValueToString( wxVariant& value,
|
wxString wxEnumProperty::ValueToString( wxVariant& value,
|
||||||
int WXUNUSED(argFlags) ) const
|
int WXUNUSED(argFlags) ) const
|
||||||
{
|
{
|
||||||
if ( value.GetType() == wxPG_VARIANT_TYPE_STRING )
|
if ( value.GetType() == wxPG_VARIANT_TYPE_STRING )
|
||||||
@@ -940,36 +1007,30 @@ wxString wxBaseEnumProperty::ValueToString( wxVariant& value,
|
|||||||
return m_choices.GetLabel(index);
|
return m_choices.GetLabel(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxBaseEnumProperty::StringToValue( wxVariant& variant, const wxString& text, int argFlags ) const
|
bool wxEnumProperty::StringToValue( wxVariant& variant, const wxString& text, int argFlags ) const
|
||||||
{
|
{
|
||||||
return ValueFromString_( variant, text, argFlags );
|
return ValueFromString_( variant, text, argFlags );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxBaseEnumProperty::IntToValue( wxVariant& variant, int intVal, int argFlags ) const
|
bool wxEnumProperty::IntToValue( wxVariant& variant, int intVal, int argFlags ) const
|
||||||
{
|
{
|
||||||
return ValueFromInt_( variant, intVal, argFlags );
|
return ValueFromInt_( variant, intVal, argFlags );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxBaseEnumProperty::ValueFromString_( wxVariant& value, const wxString& text, int argFlags ) const
|
bool wxEnumProperty::ValueFromString_( wxVariant& value, const wxString& text, int argFlags ) const
|
||||||
{
|
{
|
||||||
size_t i = 0;
|
|
||||||
const wxString* entryLabel;
|
|
||||||
int entryValue;
|
|
||||||
int useIndex = -1;
|
int useIndex = -1;
|
||||||
long useValue = 0;
|
long useValue = 0;
|
||||||
|
|
||||||
entryLabel = GetEntry(i, &entryValue);
|
for ( unsigned int i=0; i<m_choices.GetCount(); i++ )
|
||||||
while ( entryLabel )
|
|
||||||
{
|
{
|
||||||
if ( text.CmpNoCase(*entryLabel) == 0 )
|
const wxString& entryLabel = m_choices.GetLabel(i);
|
||||||
|
if ( text.CmpNoCase(entryLabel) == 0 )
|
||||||
{
|
{
|
||||||
useIndex = (int)i;
|
useIndex = (int)i;
|
||||||
useValue = (long)entryValue;
|
useValue = m_choices.GetValue(i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
i++;
|
|
||||||
entryLabel = GetEntry(i, &entryValue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool asText = false;
|
bool asText = false;
|
||||||
@@ -1021,7 +1082,7 @@ bool wxBaseEnumProperty::ValueFromString_( wxVariant& value, const wxString& tex
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxBaseEnumProperty::ValueFromInt_( wxVariant& variant, int intVal, int argFlags ) const
|
bool wxEnumProperty::ValueFromInt_( wxVariant& variant, int intVal, int argFlags ) const
|
||||||
{
|
{
|
||||||
// If wxPG_FULL_VALUE is *not* in argFlags, then intVal is index from combo box.
|
// If wxPG_FULL_VALUE is *not* in argFlags, then intVal is index from combo box.
|
||||||
//
|
//
|
||||||
@@ -1042,7 +1103,7 @@ bool wxBaseEnumProperty::ValueFromInt_( wxVariant& variant, int intVal, int argF
|
|||||||
if ( ms_nextIndex != -2 )
|
if ( ms_nextIndex != -2 )
|
||||||
{
|
{
|
||||||
if ( !(argFlags & wxPG_FULL_VALUE) )
|
if ( !(argFlags & wxPG_FULL_VALUE) )
|
||||||
GetEntry(intVal, &intVal);
|
intVal = m_choices.GetValue(intVal);
|
||||||
|
|
||||||
variant = (long)intVal;
|
variant = (long)intVal;
|
||||||
|
|
||||||
@@ -1052,117 +1113,19 @@ bool wxBaseEnumProperty::ValueFromInt_( wxVariant& variant, int intVal, int argF
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxBaseEnumProperty::SetIndex( int index )
|
void wxEnumProperty::SetIndex( int index )
|
||||||
{
|
{
|
||||||
ms_nextIndex = -2;
|
ms_nextIndex = -2;
|
||||||
m_index = index;
|
m_index = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxBaseEnumProperty::GetIndex() const
|
int wxEnumProperty::GetIndex() const
|
||||||
{
|
{
|
||||||
if ( ms_nextIndex != -2 )
|
if ( ms_nextIndex != -2 )
|
||||||
return ms_nextIndex;
|
return ms_nextIndex;
|
||||||
return m_index;
|
return m_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
// wxEnumProperty
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxEnumProperty, wxPGProperty)
|
|
||||||
|
|
||||||
WX_PG_IMPLEMENT_PROPERTY_CLASS_PLAIN(wxEnumProperty,long,Choice)
|
|
||||||
|
|
||||||
wxEnumProperty::wxEnumProperty( const wxString& label, const wxString& name, const wxChar** labels,
|
|
||||||
const long* values, int value ) : wxBaseEnumProperty(label,name)
|
|
||||||
{
|
|
||||||
SetIndex(0);
|
|
||||||
|
|
||||||
if ( labels )
|
|
||||||
{
|
|
||||||
m_choices.Add(labels,values);
|
|
||||||
|
|
||||||
if ( GetItemCount() )
|
|
||||||
SetValue( (long)value );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wxEnumProperty::wxEnumProperty( const wxString& label, const wxString& name, const wxChar** labels,
|
|
||||||
const long* values, wxPGChoices* choicesCache, int value )
|
|
||||||
: wxBaseEnumProperty(label,name)
|
|
||||||
{
|
|
||||||
SetIndex(0);
|
|
||||||
|
|
||||||
wxASSERT( choicesCache );
|
|
||||||
|
|
||||||
if ( choicesCache->IsOk() )
|
|
||||||
{
|
|
||||||
m_choices.Assign( *choicesCache );
|
|
||||||
m_value = wxPGVariant_Zero;
|
|
||||||
}
|
|
||||||
else if ( labels )
|
|
||||||
{
|
|
||||||
m_choices.Add(labels,values);
|
|
||||||
|
|
||||||
if ( GetItemCount() )
|
|
||||||
SetValue( (long)value );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wxEnumProperty::wxEnumProperty( const wxString& label, const wxString& name,
|
|
||||||
const wxArrayString& labels, const wxArrayInt& values, int value ) : wxBaseEnumProperty(label,name)
|
|
||||||
{
|
|
||||||
SetIndex(0);
|
|
||||||
|
|
||||||
if ( &labels && labels.size() )
|
|
||||||
{
|
|
||||||
m_choices.Set(labels, values);
|
|
||||||
|
|
||||||
if ( GetItemCount() )
|
|
||||||
SetValue( (long)value );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wxEnumProperty::wxEnumProperty( const wxString& label, const wxString& name,
|
|
||||||
wxPGChoices& choices, int value )
|
|
||||||
: wxBaseEnumProperty(label,name)
|
|
||||||
{
|
|
||||||
m_choices.Assign( choices );
|
|
||||||
|
|
||||||
if ( GetItemCount() )
|
|
||||||
SetValue( (long)value );
|
|
||||||
}
|
|
||||||
|
|
||||||
int wxEnumProperty::GetIndexForValue( int value ) const
|
|
||||||
{
|
|
||||||
if ( !m_choices.IsOk() )
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
int intVal = m_choices.Index(value);
|
|
||||||
if ( intVal >= 0 )
|
|
||||||
return intVal;
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxEnumProperty::~wxEnumProperty ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
const wxString* wxEnumProperty::GetEntry( size_t index, int* pvalue ) const
|
|
||||||
{
|
|
||||||
if ( m_choices.IsOk() && index < m_choices.GetCount() )
|
|
||||||
{
|
|
||||||
int value = m_choices.GetValue(index);
|
|
||||||
|
|
||||||
if ( pvalue )
|
|
||||||
*pvalue = value;
|
|
||||||
|
|
||||||
return &m_choices.GetLabel(index);
|
|
||||||
}
|
|
||||||
return (const wxString*) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
// wxEditEnumProperty
|
// wxEditEnumProperty
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user