📄 propdev.h
字号:
// Use this with 'simple' value types (derived)
#define wxPG_INIT_REQUIRED_TYPE2(T) \
if ( wxPGValueType_##T == (wxPGValueType*) NULL ) \
{ \
wxPGValueType_##T = wxPropertyGrid::RegisterValueType( new wxPGValueType##T##Class, false, wxT(#T) ); \
}
// -----------------------------------------------------------------------
// Editor class registeration macros
#define wxPGRegisterEditorClass(EDITOR) \
if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \
{ \
wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( wxPGConstruct##EDITOR##EditorClass(), wxT(#EDITOR) ); \
}
// Use this in RegisterDefaultEditors.
#define wxPGRegisterDefaultEditorClass(EDITOR) \
if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \
{ \
wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( wxPGConstruct##EDITOR##EditorClass(), wxT(#EDITOR), true ); \
}
#define wxPG_INIT_REQUIRED_EDITOR(T) \
wxPGRegisterEditorClass(T)
// -----------------------------------------------------------------------
#define WX_PG_IMPLEMENT_SUBTYPE(VALUETYPE,CVALUETYPE,DEFPROPERTY,TYPESTRING,GETTER,DEFVAL) \
const wxPGValueType *wxPGValueType_##VALUETYPE = (wxPGValueType*) NULL; \
class wxPGValueType##VALUETYPE##Class : public wxPGValueType \
{ \
public: \
virtual wxPG_CONST_WXCHAR_PTR GetTypeName() const { return TYPESTRING; } \
virtual wxPGVariant GetDefaultValue() const { return wxPGVariantCreator(m_default); } \
virtual wxVariant GenerateVariant( wxPGVariant value, const wxString& name ) const \
{ return wxVariant( value.GETTER(), name ); } \
virtual wxPGProperty* GenerateProperty( const wxString& label, const wxString& name ) const \
{ \
return wxPG_CONSTFUNC(DEFPROPERTY)(label,name); \
} \
virtual void SetValueFromVariant( wxPGProperty* property, wxVariant& value ) const \
{ \
wxPG_CHECK_RET_DBG( wxStrcmp(GetTypeName(),value.GetType().c_str()) == 0, \
wxT("SetValueFromVariant: wxVariant type mismatch.") ); \
property->DoSetValue(value.GETTER()); \
} \
wxPGValueType##VALUETYPE##Class(); \
virtual ~wxPGValueType##VALUETYPE##Class(); \
protected: \
CVALUETYPE m_default; \
}; \
wxPGValueType##VALUETYPE##Class::wxPGValueType##VALUETYPE##Class() { m_default = DEFVAL; } \
wxPGValueType##VALUETYPE##Class::~wxPGValueType##VALUETYPE##Class() { }
#define WX_PG_IMPLEMENT_VALUE_TYPE(VALUETYPE,DEFPROPERTY,TYPESTRING,GETTER,DEFVAL) \
WX_PG_IMPLEMENT_SUBTYPE(VALUETYPE,VALUETYPE,DEFPROPERTY,TYPESTRING,GETTER,DEFVAL)
//
// Implements wxVariantData for the type.
//
#define WX_PG_IMPLEMENT_VALUE_TYPE_VDC(VDCLASS,VALUETYPE) \
IMPLEMENT_DYNAMIC_CLASS(VDCLASS,wxVariantData) \
VDCLASS::VDCLASS() { } \
VDCLASS::VDCLASS(const VALUETYPE& value) \
{ \
m_value = value; \
} \
void VDCLASS::Copy(wxVariantData& data) \
{ \
wxPG_CHECK_RET_DBG( data.GetType() == GetType(), wxT(#VDCLASS) wxT("::Copy: Can't copy to this type of data") ); \
VDCLASS& otherData = (VDCLASS&) data; \
otherData.m_value = m_value; \
} \
wxString VDCLASS::GetType() const \
{ \
return wxString(wxT(#VALUETYPE)); \
} \
bool VDCLASS::Eq(wxVariantData& data) const \
{ \
wxPG_CHECK_MSG_DBG( data.GetType() == GetType(), false, wxT(#VDCLASS) wxT("::Eq: argument mismatch") ); \
VDCLASS& otherData = (VDCLASS&) data; \
return otherData.m_value == m_value; \
} \
void* VDCLASS::GetValuePtr() { return (void*)&m_value; }
#define WX_PG_GENVARIANT_WXOBJ_BASE(VALUETYPE) \
virtual wxVariant GenerateVariant( wxPGVariant value, const wxString& name ) const \
{ return wxVariant( new wxVariantData_##VALUETYPE( (*(VALUETYPE*)wxPGVariantGetWxObjectPtr(value)) ), name ); }
#define WX_PG_GENVARIANT_VOIDP_SIMPLE() \
virtual wxVariant GenerateVariant( wxPGVariant value, const wxString& name ) const \
{ \
void* ptr = (void*)wxPGVariantToVoidPtr(value); \
wxASSERT( ptr ); \
if ( !ptr ) return wxVariant(); \
return wxVariant( ptr, name ); \
}
#define WX_PG_GENVARIANT_VOIDP_CVD(VDCLASS, VALUETYPE) \
virtual wxVariant GenerateVariant( wxPGVariant value, const wxString& name ) const \
{ \
void* ptr = (void*)wxPGVariantToVoidPtr(value); \
wxASSERT( ptr ); \
if ( !ptr ) return wxVariant(); \
return wxVariant( new VDCLASS(*((VALUETYPE*)ptr)), name ); \
}
// TODO: When ready, remove GetValueClassInfo
#define WX_PG_IMPLEMENT_VALUE_TYPE_WXOBJ_BASE(VALUETYPE,DEFPROPERTY,DEFVAL) \
class WX_PG_DECLARE_VALUE_TYPE_VDC(VALUETYPE) \
virtual wxClassInfo* GetValueClassInfo(); \
}; \
WX_PG_IMPLEMENT_VALUE_TYPE_VDC(wxVariantData_##VALUETYPE,VALUETYPE) \
wxClassInfo* wxVariantData_##VALUETYPE::GetValueClassInfo() \
{ \
return m_value.GetClassInfo(); \
} \
const wxPGValueType *wxPGValueType_##VALUETYPE = (wxPGValueType*) NULL; \
class wxPGValueType##VALUETYPE##Class : public wxPGValueType \
{ \
public: \
virtual wxPG_CONST_WXCHAR_PTR GetTypeName() const { return CLASSINFO(VALUETYPE)->GetClassName(); } \
WX_PG_GENVARIANT_WXOBJ_BASE(VALUETYPE) \
virtual wxPGProperty* GenerateProperty( const wxString& label, const wxString& name ) const \
{ \
return wxPG_CONSTFUNC(DEFPROPERTY)(label,name); \
} \
virtual void SetValueFromVariant( wxPGProperty* property, wxVariant& value ) const \
{ \
const VALUETYPE* real_value; \
wxPG_CHECK_RET_DBG( wxStrcmp(GetTypeName(),value.GetType().c_str()) == 0, \
wxT("GetPtrFromVariant: wxVariant type mismatch.") ); \
wxVariantData_##VALUETYPE* vd = (wxVariantData_##VALUETYPE*)value.GetData(); \
if ( vd->IsKindOf(CLASSINFO(wxVariantData_##VALUETYPE)) ) \
real_value = &vd->GetValue(); \
else \
real_value = ((const VALUETYPE*)value.GetWxObjectPtr()); \
property->DoSetValue( (wxObject*) real_value ); \
}
// This should not be used by built-in types (advprops.cpp types should use it though)
#define WX_PG_IMPLEMENT_VALUE_TYPE_CREATOR(VALUETYPE) \
wxPGValueType* wxPGNewVT##VALUETYPE() { return new wxPGValueType##VALUETYPE##Class; }
#define WX_PG_IMPLEMENT_VALUE_TYPE_WXOBJ(VALUETYPE,DEFPROPERTY,DEFVAL) \
WX_PG_IMPLEMENT_VALUE_TYPE_WXOBJ_BASE(VALUETYPE,DEFPROPERTY,DEFVAL) \
virtual wxPGVariant GetDefaultValue() const { return wxPGVariantCreator(DEFVAL); } \
}; \
WX_PG_IMPLEMENT_VALUE_TYPE_CREATOR(VALUETYPE)
#define WX_PG_IMPLEMENT_VALUE_TYPE_WXOBJ_OWNDEFAULT(VALUETYPE,DEFPROPERTY,DEFVAL) \
WX_PG_IMPLEMENT_VALUE_TYPE_WXOBJ_BASE(VALUETYPE,DEFPROPERTY,DEFVAL) \
wxPGValueType##VALUETYPE##Class() { m_default = DEFVAL; } \
virtual ~wxPGValueType##VALUETYPE##Class() { } \
virtual wxPGVariant GetDefaultValue() const { return wxPGVariantCreator((wxObject*)&m_default); } \
protected: \
VALUETYPE m_default; \
}; \
WX_PG_IMPLEMENT_VALUE_TYPE_CREATOR(VALUETYPE)
#define WX_PG_IMPLEMENT_VALUE_TYPE_VOIDP_BASE(VALUETYPE,DEFPROPERTY,DEFVAL,VDCLASS) \
const wxPGValueType *wxPGValueType_##VALUETYPE = (wxPGValueType*)NULL; \
class wxPGValueType##VALUETYPE##Class : public wxPGValueType \
{ \
protected: \
VALUETYPE m_default; \
public: \
virtual wxPG_CONST_WXCHAR_PTR GetTypeName() const { return wxT(#VALUETYPE); } \
virtual wxPG_CONST_WXCHAR_PTR GetCustomTypeName() const { return wxT(#VALUETYPE); } \
virtual wxPGVariant GetDefaultValue() const { return wxPGVariantCreator((void*)&m_default); } \
virtual wxPGProperty* GenerateProperty( const wxString& label, const wxString& name ) const \
{ \
return wxPG_CONSTFUNC(DEFPROPERTY)(label,name); \
} \
virtual void SetValueFromVariant( wxPGProperty* property, wxVariant& value ) const \
{ \
wxPG_CHECK_RET_DBG( wxStrcmp(GetTypeName(),value.GetType().c_str()) == 0, \
wxT("SetValueFromVariant: wxVariant type mismatch.") ); \
VDCLASS* vd = (VDCLASS*)value.GetData(); \
wxPG_CHECK_RET_DBG( vd->IsKindOf(CLASSINFO(VDCLASS)), \
wxT("SetValueFromVariant: wxVariantData mismatch.")); \
property->DoSetValue((void*)&vd->GetValue() ); \
} \
wxPGValueType##VALUETYPE##Class() { m_default = DEFVAL; } \
virtual ~wxPGValueType##VALUETYPE##Class() { }
#define WX_PG_IMPLEMENT_VALUE_TYPE_VOIDP_SIMPLE(VALUETYPE,DEFPROPERTY,DEFVAL) \
WX_PG_IMPLEMENT_VALUE_TYPE_VOIDP_BASE(VALUETYPE,DEFPROPERTY,DEFVAL,wxVariantData_##VALUETYPE) \
WX_PG_GENVARIANT_VOIDP_SIMPLE() \
}; \
WX_PG_IMPLEMENT_VALUE_TYPE_CREATOR(VALUETYPE)
// If you use this macro in application code, you need to pair it with
// WX_PG_DECLARE_VALUE_TYPE with this instead of _VOIDP version.
#define WX_PG_IMPLEMENT_VALUE_TYPE_VOIDP_CVD(VALUETYPE,DEFPROPERTY,DEFVAL,VDCLASS) \
WX_PG_IMPLEMENT_VALUE_TYPE_VOIDP_BASE(VALUETYPE,DEFPROPERTY,DEFVAL,VDCLASS) \
WX_PG_GENVARIANT_VOIDP_CVD(VDCLASS, VALUETYPE) \
}; \
WX_PG_IMPLEMENT_VALUE_TYPE_CREATOR(VALUETYPE)
#define WX_PG_IMPLEMENT_VALUE_TYPE_VOIDP2(VALUETYPE,DEFPROPERTY,DEFVAL,VDCLASS) \
WX_PG_IMPLEMENT_VALUE_TYPE_VDC(VDCLASS,VALUETYPE) \
WX_PG_IMPLEMENT_VALUE_TYPE_VOIDP_CVD(VALUETYPE,DEFPROPERTY,DEFVAL,VDCLASS)
#define WX_PG_IMPLEMENT_VALUE_TYPE_VOIDP(VALUETYPE,DEFPROPERTY,DEFVAL) \
WX_PG_IMPLEMENT_VALUE_TYPE_VOIDP2(VALUETYPE,DEFPROPERTY,DEFVAL,wxVariantData_##VALUETYPE)
//
// Use this to create a new type with a different default value.
// NOTE: With this type you need to use wxPG_INIT_REQUIRED_TYPE2
// instead of wxPG_INIT_REQUIRED_TYPE.
#define WX_PG_IMPLEMENT_DERIVED_TYPE(VALUETYPE,PARENTVT,DEFVAL) \
const wxPGValueType *wxPGValueType_##VALUETYPE = (wxPGValueType*) NULL; \
class wxPGValueType##VALUETYPE##Class : public wxPGValueType \
{ \
protected: \
const wxPGValueType* m_parentClass; \
PARENTVT m_default; \
public: \
virtual wxPG_CONST_WXCHAR_PTR GetTypeName() const { return m_parentClass->GetTypeName(); } \
virtual wxPG_CONST_WXCHAR_PTR GetCustomTypeName() const { return wxT(#VALUETYPE); } \
virtual wxPGVariant GetDefaultValue() const { return wxPGVariantCreator(m_default); } \
virtual wxVariant GenerateVariant ( wxPGVariant value, const wxString& name ) const \
{ return m_parentClass->GenerateVariant(value,name); } \
virtual wxPGProperty* GenerateProperty ( const wxString& label, const wxString& name ) const \
{ return m_parentClass->GenerateProperty(label,name); } \
virtual void SetValueFromVariant ( wxPGProperty* property, wxVariant& value ) const \
{ m_parentClass->SetValueFromVariant(property,value); } \
wxPGValueType##VALUETYPE##Class(); \
virtual ~wxPGValueType##VALUETYPE##Class(); \
}; \
wxPGValueType##VALUETYPE##Class::wxPGValueType##VALUETYPE##Class() \
{ \
m_default = DEFVAL; \
m_parentClass = wxPGValueType_##PARENTVT; \
wxASSERT( m_parentClass != (wxPGValueType*) NULL); \
} \
wxPGValueType##VALUETYPE##Class::~wxPGValueType##VALUETYPE##Class() { }
// -----------------------------------------------------------------------
//
// Additional property class declaration helper macros
//
#define WX_PG_DECLARE_DERIVED_PROPERTY_CLASS() \
public: \
WX_PG_DECLARE_GETCLASSNAME \
WX_PG_DECLARE_GETCLASSINFO \
private:
// -----------------------------------------------------------------------
//
// Property class implementation helper macros.
//
#define WX_PG_DECLARE_PARENTAL_TYPE_METHODS() \
virtual void DoSetValue ( wxPGVariant value ); \
virtual wxPGVariant DoGetValue () const;
#define WX_PG_DECLARE_BASIC_TYPE_METHODS() \
virtual void DoSetValue ( wxPGVariant value ); \
virtual wxPGVariant DoGetValue () const; \
virtual wxString GetValueAsString ( int argFlags = 0 ) const; \
virtual bool SetValueFromString ( const wxString& text, int flags = 0 );
// class WXDLLIMPEXP_PG
#define wxPG_BEGIN_PROPERTY_CLASS_BODY2(CLASSNAME,UPCLASS,T,INTERNAL_T,T_AS_ARG,DECL) \
DECL CLASSNAME : public UPCLASS \
{ \
WX_PG_DECLARE_PROPERTY_CLASS_NOPARENS \
protected: \
INTERNAL_T m_value; \
public: \
CLASSNAME( const wxString& label, const wxString& name, T_AS_ARG value ); \
virtual ~CLASSNAME();
#define wxPG_BEGIN_PROPERTY_CLASS_BODY(NAME,UPCLASS,T,T_AS_ARG) \
wxPG_BEGIN_PROPERTY_CLASS_BODY2(wxPG_PROPCLASS(NAME),UPCLASS,T,T,T_AS_ARG,class)
#define wxPG_BEGIN_PROPERTY_CLASS_BODY_WITH_DECL(NAME,UPCLASS,T,T_AS_ARG,DECL) \
wxPG_BEGIN_PROPERTY_CLASS_BODY2(wxPG_PROPCLASS(NAME),UPCLASS,T,T,T_AS_ARG,class DECL)
#define wxPG_END_PROPERTY_CLASS_BODY() \
};
#define WX_PG_DECLARE_CHOICE_METHODS() \
virtual bool SetValueFromInt( long value, int flags = 0 ); \
virtual int GetChoiceInfo( wxPGChoiceInfo* choiceinfo );
#define WX_PG_DECLARE_EVENT_METHODS() \
virtual bool OnEvent( wxPropertyGrid* propgrid, wxWindow* primary, wxEvent& event );
#define WX_PG_DECLARE_PARENTAL_METHODS() \
virtual void ChildChanged( wxPGProperty* p ); \
virtual void RefreshChildren();
#define WX_PG_DECLARE_CUSTOM_PAINT_METHODS() \
virtual wxSize GetImageSize() const; \
virtual void OnCustomPaint( wxDC& dc, const wxRect& rect, wxPGPaintData& paintdata );
#define WX_PG_DECLARE_ATTRIBUTE_METHODS() \
virtual void SetAttribute( int id, wxVariant& value );
#if wxUSE_VALIDATORS
#define WX_PG_DECLARE_VALIDATOR_METHODS() \
virtual wxValidator* DoGetValidator() const;
#else
#define WX_PG_DECLARE_VALIDATOR_METHODS()
#endif
#if wxPG_INCLUDE_WXOBJECT
#define wxPG_GETCLASSNAME_IMPLEMENTATION(PROPNAME)
#else
#define wxPG_GETCLASSNAME_IMPLEMENTATION(PROPNAME) \
static const wxChar* PROPNAME##_ClassName = wxT(#PROPNAME); \
wxPG_CONST_WXCHAR_PTR PROPNAME##Class::GetClassName() const { return PROPNAME##_ClassName; }
#endif
// Implements sans constructor function. Also, first arg is class name, not property name.
#define WX_PG_IMPLEMENT_PROPERTY_CLASS_PLAIN(PROPNAME,T,EDITOR) \
wxPG_GETCLASSNAME_IMPLEMENTATION(PROPNAME) \
wxPG_VALUETYPE_MSGVAL PROPNAME##Class::GetValueType() const \
{ \
return wxPG_VALUETYPE(T); \
} \
const wxPGEditor* PROPNAME##Class::DoGetEditorClass() const \
{ \
return wxPGEditor_##EDITOR; \
}
#define WX_PG_IMPLEMENT_CLASSINFO(NAME,UPCLASS) \
static wxPGProperty* NAME##Class2(const wxString& label, const wxString& name) \
{ \
return wxPG_CONSTFUNC(NAME)(label,name); \
} \
wxPGPropertyClassInfo NAME##ClassInfo = {wxT(#NAME),&UPCLASS##Info,&NAME##Class2}; \
const wxPGPropertyClassInfo* NAME##Class::GetClassInfo() const \
{ \
return &NAME##ClassInfo; \
}
// second constfunc and classinfo is for creating properties w/o value from text
// (should be changed to simpler scheme in 1.2)
#define WX_PG_IMPLEMENT_CONSTFUNC(NAME,T_AS_ARG) \
wxPGProperty* wxPG_CONSTFUNC(NAME)( const wxString& label, const wxString& name, T_AS_ARG value ) \
{ \
return new wxPG_PROPCLASS(NAME)(label,name,value); \
}
// Adds constructor function as well.
#define WX_PG_IMPLEMENT_PROPERTY_CLASS2(NAME,CLASSNAME,UPCLASS,T,T_AS_ARG,EDITOR) \
WX_PG_IMPLEMENT_CONSTFUNC(NAME,T_AS_ARG) \
WX_PG_IMPLEMENT_CLASSINFO(NAME,UPCLASS) \
WX_PG_IMPLEMENT_PROPERTY_CLASS_PLAIN(NAME,T,EDITOR)
// A regular property
#define WX_PG_IMPLEMENT_PROPERTY_CLASS(NAME,UPNAME,T,T_AS_ARG,EDITOR) \
WX_PG_IMPLEMENT_PROPERTY_CLASS2(NAME,wxPG_PROPCLASS(NAME),wxPG_PROPCLASS(UPNAME),T,T_AS_ARG,EDITOR)
// Derived property class is one that inherits from an existing working property
// class, but assumes same value and editor type.
#define WX_PG_IMPLEMENT_DERIVED_PROPERTY_CLASS(NAME,UPNAME,T_AS_ARG) \
WX_PG_IMPLEMENT_CONSTFUNC(NAME,T_AS_ARG) \
WX_PG_IMPLEMENT_CLASSINFO(NAME,UPNAME##Class) \
wxPG_GETCLASSNAME_IMPLEMENTATION(NAME)
// -----------------------------------------------------------------------
#define wxPG_NO_ESCAPE wxPG_PROP_NO_ESCAPE // No escape sequences
#define wxPG_ESCAPE 0 // Escape sequences
#define WX_PG_IMPLEMENT_STRING_PROPERTY_WITH_VALIDATOR(NAME,FLAGS) \
class NAME##Class : public wxLongStringPropertyClass \
{ \
WX_PG_DECLARE_DERIVED_PROPERTY_CLASS() \
public: \
NAME##Class( const wxString& name, const wxString& label, const wxString& value ); \
virtual ~NAME##Class(); \
virtual bool OnButtonClick( wxPropertyGrid* propgrid, wxString& value ); \
WX_PG_DECLARE_VALIDATOR_METHODS() \
}; \
WX_PG_IMPLEMENT_DERIVED_PROPERTY_CLASS(NAME,wxLongStringProperty,const wxString&) \
NAME##Class::NAME##Class( const wxString& name, const wxString& label, const wxString& value ) \
: wxLongStringPropertyClass(name,label,value) \
{ \
m_flags |= FLAGS; \
} \
NAME##Class::~NAME##Class() { }
#if wxUSE_VALIDATORS
#define WX_PG_IMPLEMENT_STRING_PROPERTY(NAME,FLAGS) \
WX_PG_IMPLEMENT_STRING_PROPERTY_WITH_VALIDATOR(NAME,FLAGS) \
wxValidator* wxPG_PROPCLASS(NAME)::DoGetValidator () const \
{ return (wxValidator*) NULL; }
#else
#define WX_PG_IMPLEMENT_STRING_PROPERTY WX_PG_IMPLEMENT_STRING_PROPERTY_WITH_VALIDATOR
#endif
// -----------------------------------------------------------------------
// This will create interface for wxFlagsProperty derived class
// named CLASSNAME.
#define WX_PG_IMPLEMENT_CUSTOM_FLAGS_PROPERTY2(NAME,CLASSNAME,LABELS,VALUES,DEFVAL) \
class CLASSNAME : public wxFlagsPropertyClass \
{ \
WX_PG_DECLARE_PROPERTY_CLASS() \
public: \
CLASSNAME( const wxString& label, const wxString& name, long value ); \
virtual ~CLASSNAME(); \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -