]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/propgrid/props.h
going private for m_peer to give a foundation for better encapsulation
[wxWidgets.git] / include / wx / propgrid / props.h
index b2c23b9ce12135e16c670da83c3bacb5c66de481..77470cda2c99d5c9bc7ea0bbf2adf3865d145bbf 100644 (file)
 // Author:      Jaakko Salli
 // Modified by:
 // Created:     2007-03-28
-// RCS-ID:      $Id:
+// RCS-ID:      $Id$
 // Copyright:   (c) Jaakko Salli
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_PROPGRID_PROPS_H_
 #define _WX_PROPGRID_PROPS_H_
 
+#include "wx/defs.h"
+
+#if wxUSE_PROPGRID
+
 // -----------------------------------------------------------------------
 
-class wxArrayEditorDialog;
+class wxPGArrayEditorDialog;
 
 #include "wx/propgrid/editors.h"
 
-// -----------------------------------------------------------------------
+#include "wx/filename.h"
+#include "wx/dialog.h"
+#include "wx/textctrl.h"
+#include "wx/button.h"
+#include "wx/listbox.h"
+#include "wx/valtext.h"
 
-//
-// Additional property class declaration helper macros
-//
+// -----------------------------------------------------------------------
 
 //
 // Property class implementation helper macros.
 //
 
-#define WX_PG_DECLARE_BASIC_TYPE_METHODS() \
-    virtual wxString GetValueAsString( int argFlags = 0 ) const; \
-    virtual bool StringToValue( wxVariant& variant, \
-                                const wxString& text, \
-                                int argFlags = 0 ) const;
-
-#define WX_PG_DECLARE_CHOICE_METHODS() \
-    virtual bool IntToValue( wxVariant& variant, \
-                             int number, int argFlags = 0 ) const; \
-    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( wxVariant& thisValue, \
-                               int childIndex, wxVariant& childValue ) const; \
-    virtual void RefreshChildren();
-
-#define WX_PG_DECLARE_CUSTOM_PAINT_METHODS() \
-    virtual wxSize OnMeasureImage( int item ) const; \
-    virtual void OnCustomPaint( wxDC& dc, \
-                                const wxRect& rect, wxPGPaintData& paintdata );
-
-#define WX_PG_DECLARE_ATTRIBUTE_METHODS() \
-    virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
-
-#define WX_PG_DECLARE_VALIDATOR_METHODS() \
-    virtual wxValidator* DoGetValidator() const;
-
-// Adds constructor function as well.
-#define WX_PG_IMPLEMENT_PROPERTY_CLASS2(NAME,CLASSNAME,\
-                                        UPCLASS,T,T_AS_ARG,EDITOR) \
+#define WX_PG_IMPLEMENT_PROPERTY_CLASS(NAME, UPCLASS, T, T_AS_ARG, EDITOR) \
 IMPLEMENT_DYNAMIC_CLASS(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,NAME,UPNAME,T,T_AS_ARG,EDITOR)
-
-#define WX_PG_DECLARE_DERIVED_PROPERTY_CLASS(CLASSNAME) \
-DECLARE_DYNAMIC_CLASS(CLASSNAME)
-
-// 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) \
-IMPLEMENT_DYNAMIC_CLASS(NAME, UPNAME)
-
-// -----------------------------------------------------------------------
-
-#define wxPG_NO_ESCAPE      wxPG_PROP_NO_ESCAPE     // No escape sequences
-#define wxPG_ESCAPE         0                       // Escape sequences
-
-#define WX_PG_DECLARE_STRING_PROPERTY_WITH_DECL(NAME, DECL) \
-DECL NAME : public wxLongStringProperty \
-{ \
-    WX_PG_DECLARE_DERIVED_PROPERTY_CLASS(NAME) \
-public: \
-    NAME( const wxString& name = wxPG_LABEL, \
-          const wxString& label = wxPG_LABEL, \
-          const wxString& value = wxEmptyString); \
-    virtual ~NAME(); \
-    virtual bool OnButtonClick( wxPropertyGrid* propgrid, wxString& value ); \
-    WX_PG_DECLARE_VALIDATOR_METHODS() \
-};
-
-#define WX_PG_DECLARE_STRING_PROPERTY(NAME) \
-WX_PG_DECLARE_STRING_PROPERTY_WITH_DECL(NAME, class) \
-
-#define WX_PG_IMPLEMENT_STRING_PROPERTY_WITH_VALIDATOR(NAME, FLAGS) \
-WX_PG_IMPLEMENT_DERIVED_PROPERTY_CLASS(NAME,wxLongStringProperty,\
-                                       const wxString&) \
-NAME::NAME( const wxString& name, \
-            const wxString& label, \
-            const wxString& value ) \
-  : wxLongStringProperty(name,label,value) \
-{ \
-    m_flags |= FLAGS; \
-} \
-NAME::~NAME() { }
-
-#define WX_PG_IMPLEMENT_STRING_PROPERTY(NAME, FLAGS) \
-WX_PG_IMPLEMENT_STRING_PROPERTY_WITH_VALIDATOR(NAME,FLAGS) \
-wxValidator* NAME::DoGetValidator () const \
-{ return (wxValidator*) NULL; }
-
-// -----------------------------------------------------------------------
-
-#define WX_PG_DECLARE_CUSTOM_FLAGS_PROPERTY_WITH_DECL(CLASSNAME,DECL) \
-DECL CLASSNAME : public wxFlagsProperty \
-{ \
-    WX_PG_DECLARE_PROPERTY_CLASS(CLASSNAME) \
-public: \
-    CLASSNAME( const wxString& label = wxPG_LABEL, \
-               const wxString& name = wxPG_LABEL, \
-               long value = -1 ); \
-    virtual ~CLASSNAME(); \
-};
-
-#define WX_PG_DECLARE_CUSTOM_FLAGS_PROPERTY(CLASSNAME) \
-WX_PG_DECLARE_CUSTOM_FLAGS_PROPERTY_WITH_DECL(CLASSNAME, class)
-
-// This will create interface for wxFlagsProperty derived class
-// named CLASSNAME.
-#define WX_PG_IMPLEMENT_CUSTOM_FLAGS_PROPERTY(CLASSNAME,LABELS,VALUES,DEFVAL) \
-WX_PG_IMPLEMENT_PROPERTY_CLASS(CLASSNAME,wxFlagsProperty,long_##CLASSNAME,\
-                               long,TextCtrl) \
-CLASSNAME::CLASSNAME( const wxString& label, \
-                      const wxString& name, \
-                      long value ) \
-    : wxFlagsProperty(label,name,LABELS,VALUES,value!=-1?value:DEFVAL) \
-{ \
-    m_flags |= wxPG_PROP_STATIC_CHOICES; \
-} \
-CLASSNAME::~CLASSNAME() { }
-
-
-// -----------------------------------------------------------------------
-
-#define WX_PG_DECLARE_CUSTOM_ENUM_PROPERTY_WITH_DECL(CLASSNAME, DECL) \
-class CLASSNAME : public wxEnumProperty \
-{ \
-    WX_PG_DECLARE_PROPERTY_CLASS(CLASSNAME) \
-public: \
-    CLASSNAME( const wxString& label = wxPG_LABEL, \
-               const wxString& name = wxPG_LABEL, \
-               int value = -1 ); \
-    virtual ~CLASSNAME(); \
-};
-
-#define WX_PG_DECLARE_CUSTOM_ENUM_PROPERTY(CLASSNAME) \
-WX_PG_DECLARE_CUSTOM_ENUM_PROPERTY_WITH_DECL(CLASSNAME, class)
-
-#define WX_PG_IMPLEMENT_CUSTOM_ENUM_PROPERTY(CLASSNAME,LABELS,VALUES,DEFVAL) \
-WX_PG_IMPLEMENT_PROPERTY_CLASS(CLASSNAME, wxEnumProperty, long_##CLASSNAME, \
-                               int, Choice) \
-CLASSNAME::CLASSNAME( const wxString& label, const wxString& name, int value ) \
-    : wxEnumProperty(label,name,LABELS,VALUES,value!=-1?value:DEFVAL) \
-{ \
-    m_flags |= wxPG_PROP_STATIC_CHOICES; \
-} \
-CLASSNAME::~CLASSNAME() { }
-
-
-// -----------------------------------------------------------------------
-
-#define WX_PG_DECLARE_CUSTOM_COLOUR_PROPERTY_WITH_DECL(CLASSNAME, DECL) \
-DECL CLASSNAME : public wxSystemColourProperty \
-{ \
-    DECLARE_DYNAMIC_CLASS(CLASSNAME) \
-public: \
-    CLASSNAME( const wxString& label = wxPG_LABEL, \
-               const wxString& name = wxPG_LABEL, \
-               const wxColourPropertyValue& value = wxColourPropertyValue() ); \
-    virtual ~CLASSNAME(); \
-    virtual wxColour GetColour( int index ) const; \
-};
-
-#define WX_PG_DECLARE_CUSTOM_COLOUR_PROPERTY(CLASSNAME) \
-WX_PG_DECLARE_CUSTOM_COLOUR_PROPERTY_WITH_DECL(CLASSNAME, class)
-
-#define WX_PG_IMPLEMENT_CUSTOM_COLOUR_PROPERTY(CLASSNAME,\
-                                               LABELS,VALUES,COLOURS) \
-static wxPGChoices gs_##CLASSNAME##_choicesCache; \
-WX_PG_IMPLEMENT_DERIVED_PROPERTY_CLASS(CLASSNAME, wxSystemColourProperty, \
-                                       const wxColourPropertyValue&) \
-CLASSNAME::CLASSNAME( const wxString& label, const wxString& name, \
-    const wxColourPropertyValue& value ) \
-    : wxSystemColourProperty(label, name, LABELS, VALUES, \
-                             &gs_##CLASSNAME##_choicesCache, value ) \
-{ \
-    m_flags |= wxPG_PROP_TRANSLATE_CUSTOM; \
-} \
-CLASSNAME::~CLASSNAME () { } \
-wxColour CLASSNAME::GetColour ( int index ) const \
-{ \
-    if ( !m_choices.HasValue(index) ) \
-    { \
-        wxASSERT( index < (int)m_choices.GetCount() ); \
-        return COLOURS[index]; \
-    } \
-    return COLOURS[m_choices.GetValue(index)]; \
-}
-
-// -----------------------------------------------------------------------
-
-#define WX_PG_DECLARE_CUSTOM_COLOUR_PROPERTY_USES_WXCOLOUR_WITH_DECL(CLASSNAME,\
-                                                                     DECL) \
-DECL CLASSNAME : public wxSystemColourProperty \
-{ \
-    WX_PG_DECLARE_PROPERTY_CLASS(CLASSNAME) \
-public: \
-    CLASSNAME( const wxString& label = wxPG_LABEL, \
-               const wxString& name = wxPG_LABEL, \
-               const wxColour& value = wxColour() ); \
-    virtual ~CLASSNAME(); \
-    virtual wxString GetValueAsString( int argFlags ) const; \
-    virtual wxColour GetColour( int index ) const; \
-    virtual wxVariant DoTranslateVal( wxColourPropertyValue& v ) const; \
-    void Init( wxColour colour ); \
-};
-
-#define WX_PG_DECLARE_CUSTOM_COLOUR_PROPERTY_USES_WXCOLOUR(CLASSNAME) \
-WX_PG_DECLARE_CUSTOM_COLOUR_PROPERTY_USES_WXCOLOUR_WITH_DECL(CLASSNAME, class)
-
-#define WX_PG_IMPLEMENT_CUSTOM_COLOUR_PROPERTY_USES_WXCOLOUR2(CLASSNAME, \
-                                                              LABELS, \
-                                                              VALUES, \
-                                                              COLOURS, \
-                                                              EDITOR) \
-static wxPGChoices gs_##CLASSNAME##_choicesCache; \
-WX_PG_IMPLEMENT_PROPERTY_CLASS(CLASSNAME, wxSystemColourProperty, \
-                               wxColour, const wxColour&,EDITOR) \
-CLASSNAME::CLASSNAME( const wxString& label, \
-                      const wxString& name, \
-                      const wxColour& value ) \
-    : wxSystemColourProperty(label, name, LABELS, VALUES, \
-                             &gs_##CLASSNAME##_choicesCache, value ) \
-{ \
-    if ( &value ) \
-        Init( value ); \
-    else \
-        Init( *wxWHITE ); \
-    m_flags |= wxPG_PROP_TRANSLATE_CUSTOM; \
-} \
-CLASSNAME::~CLASSNAME() { } \
-void CLASSNAME::Init( wxColour colour ) \
-{ \
-    if ( !colour.Ok() ) \
-        colour = *wxWHITE; \
-    wxVariant variant; \
-    variant << colour; \
-    m_value = variant; \
-    int ind = ColToInd(colour); \
-    if ( ind < 0 ) \
-        ind = m_choices.GetCount() - 1; \
-    SetIndex( ind ); \
-} \
-wxString CLASSNAME::GetValueAsString( int argFlags ) const \
-{ \
-    const wxPGEditor* editor = GetEditorClass(); \
-    if ( editor != wxPG_EDITOR(Choice) && \
-         editor != wxPG_EDITOR(ChoiceAndButton) && \
-         editor != wxPG_EDITOR(ComboBox) ) \
-        argFlags |= wxPG_PROPERTY_SPECIFIC; \
-    return wxSystemColourProperty::GetValueAsString(argFlags); \
-} \
-wxColour CLASSNAME::GetColour( int index ) const \
-{ \
-    if ( !m_choices.HasValue(index) ) \
-    { \
-        wxASSERT( index < (int)GetItemCount() ); \
-        return COLOURS[index]; \
-    } \
-    return COLOURS[m_choices.GetValue(index)]; \
-} \
-wxVariant CLASSNAME::DoTranslateVal( wxColourPropertyValue& v ) const \
-{ \
-    wxVariant variant; \
-    variant << v.m_colour; \
-    return variant; \
-}
-
-
-#define WX_PG_IMPLEMENT_CUSTOM_COLOUR_PROPERTY_USES_WXCOLOUR(CLASSNAME, \
-                                                             LABELS, \
-                                                             VALUES, \
-                                                             COLOURS) \
-WX_PG_IMPLEMENT_CUSTOM_COLOUR_PROPERTY_USES_WXCOLOUR2(CLASSNAME, \
-                                                      LABELS, \
-                                                      VALUES, \
-                                                      COLOURS, \
-                                                      Choice)
+WX_PG_IMPLEMENT_PROPERTY_CLASS_PLAIN(NAME, T, EDITOR)
 
 // -----------------------------------------------------------------------
 
 //
 // These macros help creating DoGetValidator
 #define WX_PG_DOGETVALIDATOR_ENTRY() \
-    static wxValidator* s_ptr = (wxValidator*) NULL; \
+    static wxValidator* s_ptr = NULL; \
     if ( s_ptr ) return s_ptr;
 
 // Common function exit
 #define WX_PG_DOGETVALIDATOR_EXIT(VALIDATOR) \
     s_ptr = VALIDATOR; \
-    wxPGGlobalVars->m_arrValidators.Add( (void*) VALIDATOR ); \
+    wxPGGlobalVars->m_arrValidators.push_back( VALIDATOR ); \
     return VALIDATOR;
 
 // -----------------------------------------------------------------------
 
-#ifndef SWIG
-
 /** @class wxPGInDialogValidator
     @ingroup classes
     Creates and manages a temporary wxTextCtrl for validation purposes.
@@ -348,8 +82,6 @@ private:
     wxTextCtrl*         m_textCtrl;
 };
 
-#endif  // SWIG
-
 
 // -----------------------------------------------------------------------
 // Property classes
@@ -377,8 +109,12 @@ public:
                       const wxString& value = wxEmptyString );
     virtual ~wxStringProperty();
 
-    WX_PG_DECLARE_BASIC_TYPE_METHODS()
-    WX_PG_DECLARE_ATTRIBUTE_METHODS()
+    virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
+    virtual bool StringToValue( wxVariant& variant,
+                                const wxString& text,
+                                int argFlags = 0 ) const;
+
+    virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
 
     /** This is updated so "<composed>" special value can be handled.
     */
@@ -389,10 +125,9 @@ protected:
 
 // -----------------------------------------------------------------------
 
-#ifndef SWIG
-/** Constants used with DoValidation() methods.
+/** Constants used with NumericValidation<>().
 */
-enum
+enum wxPGNumericValidationConstants
 {
     /** Instead of modifying the value, show an error message.
     */
@@ -406,10 +141,32 @@ enum
     */
     wxPG_PROPERTY_VALIDATION_WRAP               = 2
 };
-#endif
 
 // -----------------------------------------------------------------------
 
+#if wxUSE_VALIDATORS
+
+/**
+    A more comprehensive numeric validator class.
+*/
+class WXDLLIMPEXP_PROPGRID wxNumericPropertyValidator : public wxTextValidator
+{
+public:
+    enum NumericType
+    {
+        Signed = 0,
+        Unsigned,
+        Float
+    };
+
+    wxNumericPropertyValidator( NumericType numericType, int base = 10 );
+    virtual ~wxNumericPropertyValidator() { }
+    virtual bool Validate(wxWindow* parent);
+};
+
+#endif // wxUSE_VALIDATORS
+
+
 /** @class wxIntProperty
     @ingroup classes
     Basic property with integer value.
@@ -463,7 +220,10 @@ public:
     wxIntProperty( const wxString& label,
                    const wxString& name,
                    const wxLongLong& value );
-    WX_PG_DECLARE_BASIC_TYPE_METHODS()
+    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;
     virtual bool IntToValue( wxVariant& variant,
@@ -514,10 +274,14 @@ public:
     wxUIntProperty( const wxString& label,
                     const wxString& name,
                     const wxULongLong& value );
-    WX_PG_DECLARE_BASIC_TYPE_METHODS()
-    WX_PG_DECLARE_ATTRIBUTE_METHODS()
+    virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
+    virtual bool StringToValue( wxVariant& variant,
+                                const wxString& text,
+                                int argFlags = 0 ) const;
+    virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
     virtual bool ValidateValue( wxVariant& value,
                                 wxPGValidationInfo& validationInfo ) const;
+    virtual wxValidator* DoGetValidator () const;
     virtual bool IntToValue( wxVariant& variant,
                              int number,
                              int argFlags = 0 ) const;
@@ -548,8 +312,11 @@ public:
                      double value = 0.0 );
     virtual ~wxFloatProperty();
 
-    WX_PG_DECLARE_BASIC_TYPE_METHODS()
-    WX_PG_DECLARE_ATTRIBUTE_METHODS()
+    virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
+    virtual bool StringToValue( wxVariant& variant,
+                                const wxString& text,
+                                int argFlags = 0 ) const;
+    virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
     virtual bool ValidateValue( wxVariant& value,
                                 wxPGValidationInfo& validationInfo ) const;
 
@@ -560,17 +327,15 @@ public:
                               wxPGValidationInfo* pValidationInfo,
                               int mode =
                                  wxPG_PROPERTY_VALIDATION_ERROR_MESSAGE );
+    static wxValidator* GetClassValidator();
+    virtual wxValidator* DoGetValidator () const;
 
 protected:
     int m_precision;
-    virtual wxValidator* DoGetValidator () const;
 };
 
 // -----------------------------------------------------------------------
 
-// Exclude class from wxPython bindings
-#ifndef SWIG
-
 /** @class wxBoolProperty
     @ingroup classes
     Basic property with boolean value.
@@ -588,82 +353,13 @@ public:
                     bool value = false );
     virtual ~wxBoolProperty();
 
-    WX_PG_DECLARE_BASIC_TYPE_METHODS()
-    WX_PG_DECLARE_CHOICE_METHODS()
-    WX_PG_DECLARE_ATTRIBUTE_METHODS()
-};
-
-#endif  // !SWIG
-
-// -----------------------------------------------------------------------
-
-/** @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 GetValueAsString( int argFlags ) const;
+    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;
-
-    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;
+                             int number, int argFlags = 0 ) const;
+    virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
 };
 
 // -----------------------------------------------------------------------
@@ -676,8 +372,14 @@ private:
     @ingroup classes
     You can derive custom properties with choices from this class. See
     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)
 public:
@@ -685,7 +387,7 @@ public:
 #ifndef SWIG
     wxEnumProperty( const wxString& label = wxPG_LABEL,
                     const wxString& name = wxPG_LABEL,
-                    const wxChar** labels = NULL,
+                    const wxChar* const* labels = NULL,
                     const long* values = NULL,
                     int value = 0 );
     wxEnumProperty( const wxString& label,
@@ -696,7 +398,7 @@ public:
     // Special constructor for caching choices (used by derived class)
     wxEnumProperty( const wxString& label,
                     const wxString& name,
-                    const wxChar** labels,
+                    const wxChar* const* labels,
                     const long* values,
                     wxPGChoices* choicesCache,
                     int value = 0 );
@@ -716,15 +418,54 @@ public:
 
     virtual ~wxEnumProperty();
 
-    virtual int GetChoiceInfo( wxPGChoiceInfo* choiceinfo );
+    size_t GetItemCount() const { return m_choices.GetCount(); }
+
+    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;
-    virtual const wxString* GetEntry( size_t index, int* pvalue ) const;
 
-    size_t GetItemCount() const { return m_choices.GetCount(); }
-    const wxPGChoices& GetChoices() const { return m_choices; }
+    // 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; }
+
+    virtual void OnValidationFailure( wxVariant& pendingValue );
 
 protected:
-    wxPGChoices             m_choices;
+
+    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;
 };
 
 // -----------------------------------------------------------------------
@@ -744,7 +485,7 @@ public:
 
     wxEditEnumProperty( const wxString& label,
                         const wxString& name,
-                        const wxChar** labels,
+                        const wxChar* const* labels,
                         const long* values,
                         const wxString& value );
     wxEditEnumProperty( const wxString& label = wxPG_LABEL,
@@ -760,7 +501,7 @@ public:
     // Special constructor for caching choices (used by derived class)
     wxEditEnumProperty( const wxString& label,
                         const wxString& name,
-                        const wxChar** labels,
+                        const wxChar* const* labels,
                         const long* values,
                         wxPGChoices* choicesCache,
                         const wxString& value );
@@ -790,7 +531,7 @@ public:
 #ifndef SWIG
     wxFlagsProperty( const wxString& label,
                      const wxString& name,
-                     const wxChar** labels,
+                     const wxChar* const* labels,
                      const long* values = NULL,
                      long value = 0 );
     wxFlagsProperty( const wxString& label,
@@ -806,17 +547,19 @@ public:
     virtual ~wxFlagsProperty ();
 
     virtual void OnSetValue();
-    virtual wxString GetValueAsString( int argFlags ) const;
+    virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
     virtual bool StringToValue( wxVariant& variant,
                                 const wxString& text,
                                 int flags ) const;
-    virtual void ChildChanged( wxVariant& thisValue,
-                               int childIndex,
-                               wxVariant& childValue ) const;
+    virtual wxVariant ChildChanged( wxVariant& thisValue,
+                                    int childIndex,
+                                    wxVariant& childValue ) const;
     virtual void RefreshChildren();
+    virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
 
-    // this is necessary for conveying m_choices
-    virtual int GetChoiceInfo( wxPGChoiceInfo* choiceinfo );
+    // GetChoiceSelection needs to overridden since m_choices is
+    // used and value is integer, but it is not index.
+    virtual int GetChoiceSelection() const { return wxNOT_FOUND; }
 
     // helpers
     size_t GetItemCount() const { return m_choices.GetCount(); }
@@ -824,8 +567,6 @@ public:
         { return m_choices.GetLabel(ind); }
 
 protected:
-    wxPGChoices             m_choices;
-
     // Used to detect if choices have been changed
     wxPGChoicesData*        m_oldChoicesData;
 
@@ -854,8 +595,6 @@ public:
 
 // -----------------------------------------------------------------------
 
-#include "wx/filename.h"
-
 // Indicates first bit useable by derived properties.
 #define wxPG_PROP_SHOW_FULL_FILENAME  wxPG_PROP_CLASS_SPECIFIC_1
 
@@ -885,23 +624,26 @@ public:
     virtual ~wxFileProperty ();
 
     virtual void OnSetValue();
-    virtual wxString GetValueAsString( int argFlags ) const;
+    virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
     virtual bool StringToValue( wxVariant& variant,
                                 const wxString& text,
                                 int argFlags = 0 ) const;
     virtual wxPGEditorDialogAdapter* GetEditorDialog() const;
-
-    WX_PG_DECLARE_ATTRIBUTE_METHODS()
+    virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
 
     static wxValidator* GetClassValidator();
     virtual wxValidator* DoGetValidator() const;
 
+    /**
+        Returns filename to file represented by current value.
+    */
+    wxFileName GetFileName() const;
+
 protected:
     wxString    m_wildcard;
     wxString    m_basePath; // If set, then show path relative to it
     wxString    m_initialPath; // If set, start the file dialog here
     wxString    m_dlgTitle; // If set, used as title for file dialog
-    wxFileName  m_filename; // used as primary storage
     int         m_indFilter; // index to the selected filter
 };
 
@@ -937,12 +679,12 @@ public:
                           const wxString& value = wxEmptyString );
     virtual ~wxLongStringProperty();
 
-    virtual wxString GetValueAsString( int argFlags = 0 ) const;
+    virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
     virtual bool StringToValue( wxVariant& variant,
                                 const wxString& text,
                                 int argFlags = 0 ) const;
-
-    WX_PG_DECLARE_EVENT_METHODS()
+    virtual bool OnEvent( wxPropertyGrid* propgrid,
+                          wxWindow* primary, wxEvent& event );
 
     // Shows string editor dialog. Value to be edited should be read from
     // value, and if dialog is not cancelled, it should be stored back and true
@@ -959,9 +701,6 @@ protected:
 // -----------------------------------------------------------------------
 
 
-// Exclude class from wxPython bindings
-#ifndef SWIG
-
 /** @class wxDirProperty
     @ingroup classes
     Like wxLongStringProperty, but the button triggers dir selector instead.
@@ -971,17 +710,15 @@ protected:
 */
 class WXDLLIMPEXP_PROPGRID wxDirProperty : public wxLongStringProperty
 {
-#ifndef SWIG
     DECLARE_DYNAMIC_CLASS(wxDirProperty)
-#endif
 public:
     wxDirProperty( const wxString& name = wxPG_LABEL,
                    const wxString& label = wxPG_LABEL,
                    const wxString& value = wxEmptyString );
     virtual ~wxDirProperty();
 
-    WX_PG_DECLARE_ATTRIBUTE_METHODS()
-    WX_PG_DECLARE_VALIDATOR_METHODS()
+    virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
+    virtual wxValidator* DoGetValidator() const;
 
     virtual bool OnButtonClick ( wxPropertyGrid* propGrid, wxString& value );
 
@@ -989,8 +726,6 @@ protected:
     wxString    m_dlgMessage;
 };
 
-#endif  // !SWIG
-
 // -----------------------------------------------------------------------
 
 // wxBoolProperty specific flags
@@ -1009,17 +744,24 @@ class WXDLLIMPEXP_PROPGRID wxArrayStringProperty : public wxPGProperty
 {
     WX_PG_DECLARE_PROPERTY_CLASS(wxArrayStringProperty)
 public:
-
     wxArrayStringProperty( const wxString& label = wxPG_LABEL,
                            const wxString& name = wxPG_LABEL,
                            const wxArrayString& value = wxArrayString() );
     virtual ~wxArrayStringProperty();
 
     virtual void OnSetValue();
-    WX_PG_DECLARE_BASIC_TYPE_METHODS()
-    WX_PG_DECLARE_EVENT_METHODS()
+    virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
+    virtual bool StringToValue( wxVariant& variant,
+                                const wxString& text,
+                                int argFlags = 0 ) const;
+    virtual bool OnEvent( wxPropertyGrid* propgrid,
+                          wxWindow* primary, wxEvent& event );
+    virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
 
-    virtual void GenerateValueAsString();
+    // Implement in derived class for custom array-to-string conversion.
+    virtual void ConvertArrayToString(const wxArrayString& arr,
+                                      wxString* pString,
+                                      const wxUniChar& delimiter) const;
 
     // Shows string editor dialog. Value to be edited should be read from
     // value, and if dialog is not cancelled, it should be stored back and true
@@ -1031,13 +773,30 @@ public:
                                 wxWindow* primary,
                                 const wxChar* cbt );
 
-#ifndef SWIG
-    // Creates wxArrayEditorDialog for string editing. Called in OnButtonClick.
-    virtual wxArrayEditorDialog* CreateEditorDialog();
-#endif
+    // Creates wxPGArrayEditorDialog for string editing. Called in OnButtonClick.
+    virtual wxPGArrayEditorDialog* CreateEditorDialog();
+
+    enum ConversionFlags
+    {
+        Escape          = 0x01,
+        QuoteStrings    = 0x02
+    };
+
+    /**
+        Generates contents for string dst based on the contents of
+        wxArrayString src.
+    */
+    static void ArrayStringToString( wxString& dst, const wxArrayString& src,
+                                     wxUniChar delimiter, int flags );
 
 protected:
+    // Previously this was to be implemented in derived class for array-to-
+    // string conversion. Now you should implement ConvertValueToString()
+    // instead.
+    virtual void GenerateValueAsString();
+
     wxString        m_display; // Cache for displayed text.
+    wxUniChar       m_delimiter;
 };
 
 // -----------------------------------------------------------------------
@@ -1052,13 +811,10 @@ public: \
               const wxString& name = wxPG_LABEL, \
               const wxArrayString& value = wxArrayString() ); \
     ~PROPNAME(); \
-    virtual void GenerateValueAsString(); \
-    virtual bool StringToValue( wxVariant& value, \
-                                const wxString& text, int = 0 ) const; \
     virtual bool OnEvent( wxPropertyGrid* propgrid, \
                           wxWindow* primary, wxEvent& event ); \
     virtual bool OnCustomStringEdit( wxWindow* parent, wxString& value ); \
-    WX_PG_DECLARE_VALIDATOR_METHODS() \
+    virtual wxValidator* DoGetValidator() const; \
 };
 
 #define WX_PG_DECLARE_ARRAYSTRING_PROPERTY_WITH_VALIDATOR(PROPNAM) \
@@ -1076,32 +832,9 @@ PROPNAME::PROPNAME( const wxString& label, \
     : wxArrayStringProperty(label,name,value) \
 { \
     PROPNAME::GenerateValueAsString(); \
+    m_delimiter = DELIMCHAR; \
 } \
 PROPNAME::~PROPNAME() { } \
-void PROPNAME::GenerateValueAsString() \
-{ \
-    wxChar delimChar = DELIMCHAR; \
-    if ( delimChar == wxS('"') ) \
-        wxArrayStringProperty::GenerateValueAsString(); \
-    else \
-        wxPropertyGrid::ArrayStringToString(m_display, \
-                                            m_value.GetArrayString(), \
-                                            0,DELIMCHAR,0); \
-} \
-bool PROPNAME::StringToValue( wxVariant& variant, \
-                              const wxString& text, int ) const \
-{ \
-    wxChar delimChar = DELIMCHAR; \
-    if ( delimChar == wxS('"') ) \
-        return wxArrayStringProperty::StringToValue(variant, text, 0); \
-    \
-    wxArrayString arr; \
-    WX_PG_TOKENIZER1_BEGIN(text,DELIMCHAR) \
-        arr.Add( token ); \
-    WX_PG_TOKENIZER1_END() \
-    variant = arr; \
-    return true; \
-} \
 bool PROPNAME::OnEvent( wxPropertyGrid* propgrid, \
                         wxWindow* primary, wxEvent& event ) \
 { \
@@ -1121,29 +854,30 @@ WX_PG_IMPLEMENT_ARRAYSTRING_PROPERTY_WITH_VALIDATOR(PROPNAME, \
                                                     DELIMCHAR, \
                                                     CUSTBUTTXT) \
 wxValidator* PROPNAME::DoGetValidator () const \
-{ return (wxValidator*) NULL; }
+{ return NULL; }
 
 
 // -----------------------------------------------------------------------
-// wxArrayEditorDialog
+// wxPGArrayEditorDialog
 // -----------------------------------------------------------------------
 
-#include "wx/textctrl.h"
-#include "wx/button.h"
-#include "wx/listbox.h"
+#if wxUSE_EDITABLELISTBOX
+
+class WXDLLIMPEXP_FWD_ADV wxEditableListBox;
+class WXDLLIMPEXP_FWD_CORE wxListEvent;
 
 #define wxAEDIALOG_STYLE \
     (wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxOK | wxCANCEL | wxCENTRE)
 
-class WXDLLIMPEXP_PROPGRID wxArrayEditorDialog : public wxDialog
+class WXDLLIMPEXP_PROPGRID wxPGArrayEditorDialog : public wxDialog
 {
 public:
-    wxArrayEditorDialog();
-    virtual ~wxArrayEditorDialog() { }
+    wxPGArrayEditorDialog();
+    virtual ~wxPGArrayEditorDialog() { }
 
     void Init();
 
-    wxArrayEditorDialog( wxWindow *parent,
+    wxPGArrayEditorDialog( wxWindow *parent,
                          const wxString& message,
                          const wxString& caption,
                          long style = wxAEDIALOG_STYLE,
@@ -1157,6 +891,11 @@ public:
                  const wxPoint& pos = wxDefaultPosition,
                  const wxSize& sz = wxDefaultSize );
 
+    void EnableCustomNewAction()
+    {
+        m_hasCustomNewAction = true;
+    }
+
     /** Set value modified by dialog.
     */
     virtual void SetDialogValue( const wxVariant& WXUNUSED(value) )
@@ -1182,43 +921,36 @@ public:
     */
     virtual wxValidator* GetTextCtrlValidator() const
     {
-        return (wxValidator*) NULL;
+        return NULL;
     }
 
     // Returns true if array was actually modified
     bool IsModified() const { return m_modified; }
 
-    //const wxArrayString& GetStrings() const { return m_array; }
+    // wxEditableListBox utilities
+    int GetSelection() const;
 
     // implementation from now on
-    void OnUpdateClick(wxCommandEvent& event);
     void OnAddClick(wxCommandEvent& event);
     void OnDeleteClick(wxCommandEvent& event);
-    void OnListBoxClick(wxCommandEvent& event);
     void OnUpClick(wxCommandEvent& event);
     void OnDownClick(wxCommandEvent& event);
-    //void OnCustomEditClick(wxCommandEvent& event);
+    void OnEndLabelEdit(wxListEvent& event);
     void OnIdle(wxIdleEvent& event);
 
 protected:
-    wxTextCtrl*     m_edValue;
-    wxListBox*      m_lbStrings;
+    wxEditableListBox*  m_elb;
 
-    wxButton*       m_butAdd;       // Button pointers
-    wxButton*       m_butCustom;    // required for disabling/enabling changing.
-    wxButton*       m_butUpdate;
-    wxButton*       m_butRemove;
-    wxButton*       m_butUp;
-    wxButton*       m_butDown;
+    // These are used for focus repair
+    wxWindow*           m_elbSubPanel;
+    wxWindow*           m_lastFocused;
 
-    //wxArrayString   m_array;
-
-    const wxChar*   m_custBtText;
-    //wxArrayStringPropertyClass*     m_pCallingClass;
+    // A new item, edited by user, is pending at this index.
+    // It will be committed once list ctrl item editing is done.
+    int             m_itemPendingAtIndex;
 
     bool            m_modified;
-
-    unsigned char   m_curFocus;
+    bool            m_hasCustomNewAction;
 
     // These must be overridden - must return true on success.
     virtual wxString ArrayGet( size_t index ) = 0;
@@ -1227,20 +959,24 @@ protected:
     virtual bool ArraySet( size_t index, const wxString& str ) = 0;
     virtual void ArrayRemoveAt( int index ) = 0;
     virtual void ArraySwap( size_t first, size_t second ) = 0;
+    virtual bool OnCustomNewAction(wxString* WXUNUSED(resString))
+    {
+        return false;
+    }
 
 private:
-#ifndef SWIG
-    DECLARE_DYNAMIC_CLASS_NO_COPY(wxArrayEditorDialog)
+    DECLARE_DYNAMIC_CLASS_NO_COPY(wxPGArrayEditorDialog)
     DECLARE_EVENT_TABLE()
-#endif
 };
 
+#endif // wxUSE_EDITABLELISTBOX
+
 // -----------------------------------------------------------------------
 // wxPGArrayStringEditorDialog
 // -----------------------------------------------------------------------
 
 class WXDLLIMPEXP_PROPGRID
-    wxPGArrayStringEditorDialog : public wxArrayEditorDialog
+    wxPGArrayStringEditorDialog : public wxPGArrayEditorDialog
 {
 public:
     wxPGArrayStringEditorDialog();
@@ -1258,13 +994,17 @@ public:
         return m_array;
     }
 
-    void SetCustomButton( const wxChar* custBtText, wxArrayStringProperty* pcc )
+    void SetCustomButton( const wxString& custBtText,
+                          wxArrayStringProperty* pcc )
     {
-        m_custBtText = custBtText;
-        m_pCallingClass = pcc;
+        if ( !custBtText.empty() )
+        {
+            EnableCustomNewAction();
+            m_pCallingClass = pcc;
+        }
     }
 
-    void OnCustomEditClick(wxCommandEvent& event);
+    virtual bool OnCustomNewAction(wxString* resString);
 
 protected:
     wxArrayString   m_array;
@@ -1279,12 +1019,12 @@ protected:
     virtual void ArraySwap( size_t first, size_t second );
 
 private:
-#ifndef SWIG
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxPGArrayStringEditorDialog)
     DECLARE_EVENT_TABLE()
-#endif
 };
 
 // -----------------------------------------------------------------------
 
+#endif // wxUSE_PROPGRID
+
 #endif // _WX_PROPGRID_PROPS_H_