]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/propgrid/propgrid.h
enum wxWebViewBackend has been removed.
[wxWidgets.git] / include / wx / propgrid / propgrid.h
index 2666cee1b438dd49cca974af4ed3074337343285..96bd76b787153644e6737450d5a1e27bc105adc9 100644 (file)
@@ -4,34 +4,44 @@
 // Author:      Jaakko Salli
 // Modified by:
 // Created:     2004-09-25
 // Author:      Jaakko Salli
 // Modified by:
 // Created:     2004-09-25
-// RCS-ID:      $Id:
+// RCS-ID:      $Id$
 // Copyright:   (c) Jaakko Salli
 // Copyright:   (c) Jaakko Salli
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_PROPGRID_PROPGRID_H_
 #define _WX_PROPGRID_PROPGRID_H_
 
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_PROPGRID_PROPGRID_H_
 #define _WX_PROPGRID_PROPGRID_H_
 
+#include "wx/defs.h"
+
+#if wxUSE_PROPGRID
+
+#include "wx/thread.h"
 #include "wx/dcclient.h"
 #include "wx/dcclient.h"
+#include "wx/control.h"
 #include "wx/scrolwin.h"
 #include "wx/tooltip.h"
 #include "wx/datetime.h"
 #include "wx/scrolwin.h"
 #include "wx/tooltip.h"
 #include "wx/datetime.h"
+#include "wx/recguard.h"
 
 #include "wx/propgrid/property.h"
 #include "wx/propgrid/propgridiface.h"
 
 
 #ifndef SWIG
 
 #include "wx/propgrid/property.h"
 #include "wx/propgrid/propgridiface.h"
 
 
 #ifndef SWIG
-extern WXDLLIMPEXP_PROPGRID const wxChar *wxPropertyGridNameStr;
+extern WXDLLIMPEXP_DATA_PROPGRID(const char) wxPropertyGridNameStr[];
 #endif
 
 #endif
 
+class wxPGComboBox;
+
+#if wxUSE_STATUSBAR
+class WXDLLIMPEXP_FWD_CORE wxStatusBar;
+#endif
 
 // -----------------------------------------------------------------------
 // Global variables
 // -----------------------------------------------------------------------
 
 
 // -----------------------------------------------------------------------
 // Global variables
 // -----------------------------------------------------------------------
 
-#ifndef SWIG
-
 // This is required for sharing common global variables.
 class WXDLLIMPEXP_PROPGRID wxPGGlobalVarsClass
 {
 // This is required for sharing common global variables.
 class WXDLLIMPEXP_PROPGRID wxPGGlobalVarsClass
 {
@@ -40,6 +50,14 @@ public:
     wxPGGlobalVarsClass();
     ~wxPGGlobalVarsClass();
 
     wxPGGlobalVarsClass();
     ~wxPGGlobalVarsClass();
 
+#if wxUSE_THREADS
+    // Critical section for handling the globals. Generally it is not needed
+    // since GUI code is supposed to be in single thread. However,
+    // we do want the user to be able to convey wxPropertyGridEvents to other
+    // threads.
+    wxCriticalSection   m_critSect;
+#endif
+
     // Used by advprops, but here to make things easier.
     wxString            m_pDefaultImageWildcard;
 
     // Used by advprops, but here to make things easier.
     wxString            m_pDefaultImageWildcard;
 
@@ -47,7 +65,7 @@ public:
     wxPGHashMapS2P      m_mapEditorClasses;
 
 #if wxUSE_VALIDATORS
     wxPGHashMapS2P      m_mapEditorClasses;
 
 #if wxUSE_VALIDATORS
-    wxArrayPtrVoid      m_arrValidators; // These wxValidators need to be freed
+    wxVector<wxValidator*>  m_arrValidators; // These wxValidators need to be freed
 #endif
 
     wxPGHashMapS2P      m_dictPropertyClassInfo; // PropertyName -> ClassInfo
 #endif
 
     wxPGHashMapS2P      m_dictPropertyClassInfo; // PropertyName -> ClassInfo
@@ -57,19 +75,6 @@ public:
     // Replace with your own to affect all properties using default renderer.
     wxPGCellRenderer*   m_defaultRenderer;
 
     // Replace with your own to affect all properties using default renderer.
     wxPGCellRenderer*   m_defaultRenderer;
 
-    // These are for fast variant type comparison
-    wxPGVariantDataClassInfo wxVariantClassInfo_long;
-    wxPGVariantDataClassInfo wxVariantClassInfo_string;
-    wxPGVariantDataClassInfo wxVariantClassInfo_double;
-    wxPGVariantDataClassInfo wxVariantClassInfo_bool;
-    wxPGVariantDataClassInfo wxVariantClassInfo_arrstring;
-    wxPGVariantDataClassInfo wxVariantClassInfo_wxobject;
-    wxPGVariantDataClassInfo wxVariantClassInfo_list;
-    wxPGVariantDataClassInfo wxVariantClassInfo_wxColour;
-#if wxUSE_DATETIME
-    wxPGVariantDataClassInfo wxVariantClassInfo_datetime;
-#endif
-
     wxPGChoices         m_boolChoices;
 
     wxVariant           m_vEmptyString;
     wxPGChoices         m_boolChoices;
 
     wxVariant           m_vEmptyString;
@@ -79,10 +84,19 @@ public:
     wxVariant           m_vFalse;
 
     // Cached constant strings
     wxVariant           m_vFalse;
 
     // Cached constant strings
+    wxPGCachedString    m_strstring;
+    wxPGCachedString    m_strlong;
+    wxPGCachedString    m_strbool;
+    wxPGCachedString    m_strlist;
+
+    wxPGCachedString    m_strDefaultValue;
     wxPGCachedString    m_strMin;
     wxPGCachedString    m_strMax;
     wxPGCachedString    m_strUnits;
     wxPGCachedString    m_strMin;
     wxPGCachedString    m_strMax;
     wxPGCachedString    m_strUnits;
+    wxPGCachedString    m_strHint;
+#if wxPG_COMPATIBILITY_1_4
     wxPGCachedString    m_strInlineHelp;
     wxPGCachedString    m_strInlineHelp;
+#endif
 
     // If true then some things are automatically translated
     bool                m_autoGetTranslation;
 
     // If true then some things are automatically translated
     bool                m_autoGetTranslation;
@@ -92,21 +106,12 @@ public:
 
     int                 m_extraStyle;  // global extra style
 
 
     int                 m_extraStyle;  // global extra style
 
-#ifdef __WXDEBUG__
     int                 m_warnings;
     int                 m_warnings;
-#endif
 
     int HasExtraStyle( int style ) const { return (m_extraStyle & style); }
 };
 
 
     int HasExtraStyle( int style ) const { return (m_extraStyle & style); }
 };
 
-extern WXDLLIMPEXP_PROPGRID wxPGGlobalVarsClass* wxPGGlobalVars;
-
-#define wxPGIsVariantType(VARIANT, T) \
-    ((VARIANT).GetData() && \
-     typeid(*(VARIANT).GetData()) == *wxPGGlobalVars->wxVariantClassInfo_##T)
-
-#define wxPGIsVariantClassInfo(CLASSINFO, T) \
-    (*CLASSINFO == *wxPGGlobalVars->wxVariantClassInfo_##T)
+extern WXDLLIMPEXP_DATA_PROPGRID(wxPGGlobalVarsClass*) wxPGGlobalVars;
 
 #define wxPGVariant_EmptyString     (wxPGGlobalVars->m_vEmptyString)
 #define wxPGVariant_Zero            (wxPGGlobalVars->m_vZero)
 
 #define wxPGVariant_EmptyString     (wxPGGlobalVars->m_vEmptyString)
 #define wxPGVariant_Zero            (wxPGGlobalVars->m_vZero)
@@ -116,9 +121,9 @@ extern WXDLLIMPEXP_PROPGRID wxPGGlobalVarsClass* wxPGGlobalVars;
 
 #define wxPGVariant_Bool(A)     (A?wxPGVariant_True:wxPGVariant_False)
 
 
 #define wxPGVariant_Bool(A)     (A?wxPGVariant_True:wxPGVariant_False)
 
-#define wxPGVariantAssign(A, B) A = B
-
-#endif // !SWIG
+// When wxPG is loaded dynamically after the application is already running
+// then the built-in module system won't pick this one up.  Add it manually.
+WXDLLIMPEXP_PROPGRID void wxPGInitResourceModule();
 
 // -----------------------------------------------------------------------
 
 
 // -----------------------------------------------------------------------
 
@@ -153,8 +158,12 @@ wxPG_ALPHABETIC_MODE                = (wxPG_HIDE_CATEGORIES|wxPG_AUTO_SORT),
 */
 wxPG_BOLD_MODIFIED                  = 0x00000040,
 
 */
 wxPG_BOLD_MODIFIED                  = 0x00000040,
 
-/** When wxPropertyGrid is resized, splitter moves to the center. This
-    behavior stops once the user manually moves the splitter.
+/** Using this style, the column splitters move automatically based on column
+    proportions (default is equal proportion for every column). This behaviour
+    stops once the user manually moves a splitter, and returns when a
+    splitter is double-clicked.
+
+    @see wxPropertyGridInterface::SetColumnProportion().
 */
 wxPG_SPLITTER_AUTO_CENTER           = 0x00000080,
 
 */
 wxPG_SPLITTER_AUTO_CENTER           = 0x00000080,
 
@@ -192,10 +201,21 @@ wxPG_TOOLBAR                        = 0x00001000,
 /** wxPropertyGridManager only: Show adjustable text box showing description
     or help text, if available, for currently selected property.
 */
 /** wxPropertyGridManager only: Show adjustable text box showing description
     or help text, if available, for currently selected property.
 */
-wxPG_DESCRIPTION                    = 0x00002000
+wxPG_DESCRIPTION                    = 0x00002000,
 
 
+/** wxPropertyGridManager only: don't show an internal border around the
+    property grid. Recommended if you use a header.
+*/
+wxPG_NO_INTERNAL_BORDER             = 0x00004000
 };
 
 };
 
+#if wxPG_COMPATIBILITY_1_4
+    // In wxPG 1.4 this was used to enable now-default theme border support
+    // in wxPropertyGridManager.
+    #define wxPG_THEME_BORDER           0x00000000
+#endif
+
+
 enum wxPG_EX_WINDOW_STYLES
 {
 
 enum wxPG_EX_WINDOW_STYLES
 {
 
@@ -228,7 +248,7 @@ wxPG_EX_MODE_BUTTONS                = 0x00008000,
 */
 wxPG_EX_HELP_AS_TOOLTIPS            = 0x00010000,
 
 */
 wxPG_EX_HELP_AS_TOOLTIPS            = 0x00010000,
 
-/** Prevent TAB from focusing to wxButtons. This behavior was default
+/** Prevent TAB from focusing to wxButtons. This behaviour was default
     in version 1.2.0 and earlier.
     NOTE! Tabbing to button doesn't work yet. Problem seems to be that on wxMSW
       atleast the button doesn't properly propagate key events (yes, I'm using
     in version 1.2.0 and earlier.
     NOTE! Tabbing to button doesn't work yet. Problem seems to be that on wxMSW
       atleast the button doesn't properly propagate key events (yes, I'm using
@@ -256,18 +276,50 @@ wxPG_EX_AUTO_UNSPECIFIED_VALUES         = 0x00200000,
 */
 wxPG_EX_WRITEONLY_BUILTIN_ATTRIBUTES    = 0x00400000,
 
 */
 wxPG_EX_WRITEONLY_BUILTIN_ATTRIBUTES    = 0x00400000,
 
+/** Hides page selection buttons from toolbar.
+*/
+wxPG_EX_HIDE_PAGE_BUTTONS               = 0x01000000,
+
+/** Allows multiple properties to be selected by user (by pressing SHIFT
+    when clicking on a property, or by dragging with left mouse button
+    down).
+
+    You can get array of selected properties with
+    wxPropertyGridInterface::GetSelectedProperties(). In multiple selection
+    mode wxPropertyGridInterface::GetSelection() returns
+    property which has editor active (usually the first one
+    selected). Other useful member functions are ClearSelection(),
+    AddToSelection() and RemoveFromSelection().
+*/
+wxPG_EX_MULTIPLE_SELECTION              = 0x02000000,
+
 /**
 /**
-    With this style Validators on properties will work same as in
-    wxPropertyGrid 1.2.
+    This enables top-level window tracking which allows wxPropertyGrid to
+    notify the application of last-minute property value changes by user.
+
+    This style is not enabled by default because it may cause crashes when
+    wxPropertyGrid is used in with wxAUI or similar system.
+
+    @remarks If you are not in fact using any system that may change
+             wxPropertyGrid's top-level parent window on its own, then you
+             are recommended to enable this style.
 */
 */
-wxPG_EX_LEGACY_VALIDATORS               = 0x00800000,
+wxPG_EX_ENABLE_TLP_TRACKING             = 0x04000000,
 
 
-/** Hides page selection buttons from toolbar.
+/** Don't show divider above toolbar, on Windows.
 */
 */
-wxPG_EX_HIDE_PAGE_BUTTONS               = 0x01000000
+wxPG_EX_NO_TOOLBAR_DIVIDER              = 0x08000000,
+
+/** Show a separator below the toolbar.
+*/
+wxPG_EX_TOOLBAR_SEPARATOR               = 0x10000000
 
 };
 
 
 };
 
+#if wxPG_COMPATIBILITY_1_4
+    #define wxPG_EX_DISABLE_TLP_TRACKING    0x00000000
+#endif
+
 /** Combines various styles.
 */
 #define wxPG_DEFAULT_STYLE          (0)
 /** Combines various styles.
 */
 #define wxPG_DEFAULT_STYLE          (0)
@@ -324,7 +376,7 @@ protected:
 
 // -----------------------------------------------------------------------
 
 
 // -----------------------------------------------------------------------
 
-/** @section propgrid_vfbflags wxPropertyGrid Validation Failure Behavior Flags
+/** @section propgrid_vfbflags wxPropertyGrid Validation Failure behaviour Flags
     @{
 */
 
     @{
 */
 
@@ -332,7 +384,7 @@ enum wxPG_VALIDATION_FAILURE_BEHAVIOR_FLAGS
 {
 
 /** Prevents user from leaving property unless value is valid. If this
 {
 
 /** Prevents user from leaving property unless value is valid. If this
-    behavior flag is not used, then value change is instead cancelled.
+    behaviour flag is not used, then value change is instead cancelled.
 */
 wxPG_VFB_STAY_IN_PROPERTY           = 0x01,
 
 */
 wxPG_VFB_STAY_IN_PROPERTY           = 0x01,
 
@@ -344,12 +396,34 @@ wxPG_VFB_BEEP                       = 0x02,
 */
 wxPG_VFB_MARK_CELL                  = 0x04,
 
 */
 wxPG_VFB_MARK_CELL                  = 0x04,
 
-/** Display customizable text message explaining the situation.
+/**
+    Display a text message explaining the situation.
+
+    To customize the way the message is displayed, you need to
+    reimplement wxPropertyGrid::DoShowPropertyError() in a
+    derived class. Default behaviour is to display the text on
+    the top-level frame's status bar, if present, and otherwise
+    using wxMessageBox.
 */
 wxPG_VFB_SHOW_MESSAGE               = 0x08,
 
 */
 wxPG_VFB_SHOW_MESSAGE               = 0x08,
 
+/**
+    Similar to wxPG_VFB_SHOW_MESSAGE, except always displays the
+    message using wxMessageBox.
+*/
+wxPG_VFB_SHOW_MESSAGEBOX            = 0x10,
+
+/**
+    Similar to wxPG_VFB_SHOW_MESSAGE, except always displays the
+    message on the status bar (when present - you can reimplement
+    wxPropertyGrid::GetStatusBar() in a derived class to specify
+    this yourself).
+*/
+wxPG_VFB_SHOW_MESSAGE_ON_STATUSBAR  = 0x20,
+
 /** Defaults. */
 /** Defaults. */
-wxPG_VFB_DEFAULT                    = wxPG_VFB_STAY_IN_PROPERTY|wxPG_VFB_BEEP,
+wxPG_VFB_DEFAULT                    = wxPG_VFB_MARK_CELL |
+                                      wxPG_VFB_SHOW_MESSAGEBOX,
 
 /** Only used internally. */
 wxPG_VFB_UNDEFINED                  = 0x80
 
 /** Only used internally. */
 wxPG_VFB_UNDEFINED                  = 0x80
@@ -359,36 +433,83 @@ wxPG_VFB_UNDEFINED                  = 0x80
 /** @}
 */
 
 /** @}
 */
 
-typedef wxByte wxPGVFBFlags;
+// Having this as define instead of wxByte typedef makes things easier for
+// wxPython bindings (ignoring and redefining it in SWIG interface file
+// seemed rather tricky)
+#define wxPGVFBFlags unsigned char
 
 
-/** @class wxPGValidationInfo
+/**
+    wxPGValidationInfo
 
     Used to convey validation information to and from functions that
 
     Used to convey validation information to and from functions that
-    actually perform validation.
+    actually perform validation. Mostly used in custom property
+    classes.
 */
 */
-struct wxPGValidationInfo
+class WXDLLIMPEXP_PROPGRID wxPGValidationInfo
 {
 {
-    /** Value to be validated.
+    friend class wxPropertyGrid;
+public:
+    wxPGValidationInfo()
+    {
+        m_failureBehavior = 0;
+        m_isFailing = false;
+    }
+
+    ~wxPGValidationInfo()
+    {
+    }
+
+    /**
+        @return Returns failure behaviour which is a combination of
+               @ref propgrid_vfbflags.
     */
     */
-    wxVariant*      m_pValue;
+    wxPGVFBFlags GetFailureBehavior() const
+        { return m_failureBehavior; }
 
 
-    /** Message displayed on validation failure.
+    /**
+        Returns current failure message.
     */
     */
-    wxString        m_failureMessage;
+    const wxString& GetFailureMessage() const
+        { return m_failureMessage; }
 
 
-    /** Validation failure behavior. Use wxPG_VFB_XXX flags.
+    /**
+        Returns reference to pending value.
     */
     */
-    wxPGVFBFlags    m_failureBehavior;
+    wxVariant& GetValue()
+    {
+        wxASSERT(m_pValue);
+        return *m_pValue;
+    }
 
 
-    wxPGVFBFlags GetFailureBehavior() const { return m_failureBehavior; }
+    /** Set validation failure behaviour
 
 
+        @param failureBehavior
+            Mixture of @ref propgrid_vfbflags.
+    */
     void SetFailureBehavior(wxPGVFBFlags failureBehavior)
         { m_failureBehavior = failureBehavior; }
 
     void SetFailureBehavior(wxPGVFBFlags failureBehavior)
         { m_failureBehavior = failureBehavior; }
 
-    const wxString& GetFailureMessage() const { return m_failureMessage; }
-
+    /**
+        Set current failure message.
+    */
     void SetFailureMessage(const wxString& message)
         { m_failureMessage = message; }
     void SetFailureMessage(const wxString& message)
         { m_failureMessage = message; }
+
+private:
+    /** Value to be validated.
+    */
+    wxVariant*      m_pValue;
+
+    /** Message displayed on validation failure.
+    */
+    wxString        m_failureMessage;
+
+    /** Validation failure behaviour. Use wxPG_VFB_XXX flags.
+    */
+    wxPGVFBFlags    m_failureBehavior;
+
+    // True when validation is currently failing.
+    bool            m_isFailing;
 };
 
 // -----------------------------------------------------------------------
 };
 
 // -----------------------------------------------------------------------
@@ -403,14 +524,32 @@ struct wxPGValidationInfo
 enum wxPG_KEYBOARD_ACTIONS
 {
     wxPG_ACTION_INVALID = 0,
 enum wxPG_KEYBOARD_ACTIONS
 {
     wxPG_ACTION_INVALID = 0,
+
+    /** Select the next property. */
     wxPG_ACTION_NEXT_PROPERTY,
     wxPG_ACTION_NEXT_PROPERTY,
+
+    /** Select the previous property. */
     wxPG_ACTION_PREV_PROPERTY,
     wxPG_ACTION_PREV_PROPERTY,
+
+    /** Expand the selected property, if it has child items. */
     wxPG_ACTION_EXPAND_PROPERTY,
     wxPG_ACTION_EXPAND_PROPERTY,
+
+    /** Collapse the selected property, if it has child items. */
     wxPG_ACTION_COLLAPSE_PROPERTY,
     wxPG_ACTION_COLLAPSE_PROPERTY,
+
+    /** Cancel and undo any editing done in the currently active property
+        editor.
+    */
     wxPG_ACTION_CANCEL_EDIT,
     wxPG_ACTION_CANCEL_EDIT,
-    wxPG_ACTION_CUT,
-    wxPG_ACTION_COPY,
-    wxPG_ACTION_PASTE,
+
+    /** Move focus to the editor control of the currently selected
+        property.
+    */
+    wxPG_ACTION_EDIT,
+
+    /** Causes editor's button (if any) to be pressed. */
+    wxPG_ACTION_PRESS_BUTTON,
+
     wxPG_ACTION_MAX
 };
 
     wxPG_ACTION_MAX
 };
 
@@ -423,24 +562,38 @@ enum wxPG_KEYBOARD_ACTIONS
 // wxPropertyGrid::DoSelectProperty flags (selFlags)
 
 // Focuses to created editor
 // wxPropertyGrid::DoSelectProperty flags (selFlags)
 
 // Focuses to created editor
-#define wxPG_SEL_FOCUS      0x01
+#define wxPG_SEL_FOCUS                  0x0001
 // Forces deletion and recreation of editor
 // Forces deletion and recreation of editor
-#define wxPG_SEL_FORCE      0x02
+#define wxPG_SEL_FORCE                  0x0002
 // For example, doesn't cause EnsureVisible
 // For example, doesn't cause EnsureVisible
-#define wxPG_SEL_NONVISIBLE 0x04
+#define wxPG_SEL_NONVISIBLE             0x0004
 // Do not validate editor's value before selecting
 // Do not validate editor's value before selecting
-#define wxPG_SEL_NOVALIDATE 0x08
+#define wxPG_SEL_NOVALIDATE             0x0008
 // Property being deselected is about to be deleted
 // Property being deselected is about to be deleted
-#define wxPG_SEL_DELETING   0x10
+#define wxPG_SEL_DELETING               0x0010
 // Property's values was set to unspecified by the user
 // Property's values was set to unspecified by the user
-#define wxPG_SEL_SETUNSPEC  0x20
+#define wxPG_SEL_SETUNSPEC              0x0020
 // Property's event handler changed the value
 // Property's event handler changed the value
-#define wxPG_SEL_DIALOGVAL  0x40
-
+#define wxPG_SEL_DIALOGVAL              0x0040
+// Set to disable sending of wxEVT_PG_SELECTED event
+#define wxPG_SEL_DONT_SEND_EVENT        0x0080
+// Don't make any graphics updates
+#define wxPG_SEL_NO_REFRESH             0x0100
 
 // -----------------------------------------------------------------------
 
 
 // -----------------------------------------------------------------------
 
-#ifndef SWIG
+// DoSetSplitterPosition() flags
+
+enum wxPG_SET_SPLITTER_POSITION_SPLITTER_FLAGS
+{
+    wxPG_SPLITTER_REFRESH           = 0x0001,
+    wxPG_SPLITTER_ALL_PAGES         = 0x0002,
+    wxPG_SPLITTER_FROM_EVENT        = 0x0004,
+    wxPG_SPLITTER_FROM_AUTO_CENTER  = 0x0008
+};
+
+
+// -----------------------------------------------------------------------
 
 // Internal flags
 #define wxPG_FL_INITIALIZED                 0x0001
 
 // Internal flags
 #define wxPG_FL_INITIALIZED                 0x0001
@@ -472,24 +625,18 @@ enum wxPG_KEYBOARD_ACTIONS
 #define wxPG_FL_IN_MANAGER                  0x00020000
 // Set after wxPropertyGrid is shown in its initial good size
 #define wxPG_FL_GOOD_SIZE_SET               0x00040000
 #define wxPG_FL_IN_MANAGER                  0x00020000
 // Set after wxPropertyGrid is shown in its initial good size
 #define wxPG_FL_GOOD_SIZE_SET               0x00040000
-// Next navigation key event will get ignored
-#define wxPG_FL_IGNORE_NEXT_NAVKEY          0x00080000
 // Set when in SelectProperty.
 #define wxPG_FL_IN_SELECT_PROPERTY          0x00100000
 // Set when help string is shown in status bar
 #define wxPG_FL_STRING_IN_STATUSBAR         0x00200000
 // Set when in SelectProperty.
 #define wxPG_FL_IN_SELECT_PROPERTY          0x00100000
 // Set when help string is shown in status bar
 #define wxPG_FL_STRING_IN_STATUSBAR         0x00200000
-// Splitter position has been custom-set by the user
-#define wxPG_FL_SPLITTER_PRE_SET            0x00400000
-// Validation failed. Clear on modify event.
-#define wxPG_FL_VALIDATION_FAILED           0x00800000
-// Set if selected is fully painted (ie. both image and text)
-//#define wxPG_FL_SELECTED_IS_FULL_PAINT      0x01000000
+// Auto sort is enabled (for categorized mode)
+#define wxPG_FL_CATMODE_AUTO_SORT           0x01000000
 // Set after page has been inserted to manager
 #define wxPG_MAN_FL_PAGE_INSERTED           0x02000000
 // Active editor control is abnormally large
 #define wxPG_FL_ABNORMAL_EDITOR             0x04000000
 // Set after page has been inserted to manager
 #define wxPG_MAN_FL_PAGE_INSERTED           0x02000000
 // Active editor control is abnormally large
 #define wxPG_FL_ABNORMAL_EDITOR             0x04000000
-// Recursion guard for OnCustomEditorEvent
-#define wxPG_FL_IN_ONCUSTOMEDITOREVENT      0x08000000
+// Recursion guard for HandleCustomEditorEvent
+#define wxPG_FL_IN_HANDLECUSTOMEDITOREVENT  0x08000000
 #define wxPG_FL_VALUE_CHANGE_IN_EVENT       0x10000000
 // Editor control width should not change on resize
 #define wxPG_FL_FIXED_WIDTH_EDITOR          0x20000000
 #define wxPG_FL_VALUE_CHANGE_IN_EVENT       0x10000000
 // Editor control width should not change on resize
 #define wxPG_FL_FIXED_WIDTH_EDITOR          0x20000000
@@ -498,9 +645,7 @@ enum wxPG_KEYBOARD_ACTIONS
 // Prevents RecalculateVirtualSize re-entrancy
 #define wxPG_FL_RECALCULATING_VIRTUAL_SIZE  0x80000000
 
 // Prevents RecalculateVirtualSize re-entrancy
 #define wxPG_FL_RECALCULATING_VIRTUAL_SIZE  0x80000000
 
-#endif // #ifndef SWIG
-
-#if !defined(__wxPG_SOURCE_FILE__) && !defined(SWIG)
+#if !defined(__wxPG_SOURCE_FILE__)
     // Reduce compile time, but still include in user app
     #include "wx/propgrid/props.h"
 #endif
     // Reduce compile time, but still include in user app
     #include "wx/propgrid/props.h"
 #endif
@@ -532,8 +677,11 @@ enum wxPG_KEYBOARD_ACTIONS
 
     @beginEventTable{wxPropertyGridEvent}
     @event{EVT_PG_SELECTED (id, func)}
 
     @beginEventTable{wxPropertyGridEvent}
     @event{EVT_PG_SELECTED (id, func)}
-        Respond to wxEVT_PG_SELECTED event, generated when property value
-        has been changed by user.
+        Respond to wxEVT_PG_SELECTED event, generated when a property selection
+        has been changed, either by user action or by indirect program
+        function. For instance, collapsing a parent property programmatically
+        causes any selected child property to become unselected, and may
+        therefore cause this event to be generated.
     @event{EVT_PG_CHANGING(id, func)}
         Respond to wxEVT_PG_CHANGING event, generated when property value
         is about to be changed by user. Use wxPropertyGridEvent::GetValue()
     @event{EVT_PG_CHANGING(id, func)}
         Respond to wxEVT_PG_CHANGING event, generated when property value
         is about to be changed by user. Use wxPropertyGridEvent::GetValue()
@@ -555,6 +703,25 @@ enum wxPG_KEYBOARD_ACTIONS
     @event{EVT_PG_ITEM_EXPANDED(id, func)}
         Respond to wxEVT_PG_ITEM_EXPANDED event, generated when user expands
         a property or category..
     @event{EVT_PG_ITEM_EXPANDED(id, func)}
         Respond to wxEVT_PG_ITEM_EXPANDED event, generated when user expands
         a property or category..
+    @event{EVT_PG_LABEL_EDIT_BEGIN(id, func)}
+        Respond to wxEVT_PG_LABEL_EDIT_BEGIN event, generated when is about to
+        begin editing a property label. You can veto this event to prevent the
+        action.
+    @event{EVT_PG_LABEL_EDIT_ENDING(id, func)}
+        Respond to wxEVT_PG_LABEL_EDIT_ENDING event, generated when is about to
+        end editing of a property label. You can veto this event to prevent the
+        action.
+    @event{EVT_PG_COL_BEGIN_DRAG(id, func)}
+        Respond to wxEVT_PG_COL_BEGIN_DRAG event, generated when user
+        starts resizing a column - can be vetoed.
+    @event{EVT_PG_COL_DRAGGING,(id, func)}
+        Respond to wxEVT_PG_COL_DRAGGING, event, generated when a
+        column resize by user is in progress. This event is also generated
+        when user double-clicks the splitter in order to recenter
+        it.
+    @event{EVT_PG_COL_END_DRAG(id, func)}
+        Respond to wxEVT_PG_COL_END_DRAG event, generated after column
+        resize by user has finished.
     @endEventTable
 
     @remarks
     @endEventTable
 
     @remarks
@@ -566,38 +733,20 @@ enum wxPG_KEYBOARD_ACTIONS
     @library{wxpropgrid}
     @category{propgrid}
 */
     @library{wxpropgrid}
     @category{propgrid}
 */
-class WXDLLIMPEXP_PROPGRID
-    wxPropertyGrid : public wxScrolledWindow, public wxPropertyGridInterface
+class WXDLLIMPEXP_PROPGRID wxPropertyGrid : public wxControl,
+                                            public wxScrollHelper,
+                                            public wxPropertyGridInterface
 {
 {
+    friend class wxPropertyGridEvent;
     friend class wxPropertyGridPageState;
     friend class wxPropertyGridInterface;
     friend class wxPropertyGridManager;
     friend class wxPropertyGridPageState;
     friend class wxPropertyGridInterface;
     friend class wxPropertyGridManager;
-    friend class wxPGCanvas;
+    friend class wxPGHeaderCtrl;
 
 
-#ifndef SWIG
     DECLARE_DYNAMIC_CLASS(wxPropertyGrid)
     DECLARE_DYNAMIC_CLASS(wxPropertyGrid)
-#endif
 public:
 
 public:
 
-#ifdef SWIG
-    %pythonAppend wxPropertyGrid {
-        self._setOORInfo(self)
-        self.DoDefaultTypeMappings()
-        self.edited_objects = {}
-        self.DoDefaultValueTypeMappings()
-        if not hasattr(self.__class__,'_vt2setter'):
-            self.__class__._vt2setter = {}
-    }
-    %pythonAppend wxPropertyGrid() ""
-
-    wxPropertyGrid( wxWindow *parent, wxWindowID id = wxID_ANY,
-                    const wxPoint& pos = wxDefaultPosition,
-                    const wxSize& size = wxDefaultSize,
-                    long style = wxPG_DEFAULT_STYLE,
-                    const wxChar* name = wxPyPropertyGridNameStr );
-    %RenameCtor(PrePropertyGrid,  wxPropertyGrid());
-#else
-
+#ifndef SWIG
     /**
         Two step constructor.
 
     /**
         Two step constructor.
 
@@ -605,28 +754,56 @@ public:
         wxPropertyGrid
     */
     wxPropertyGrid();
         wxPropertyGrid
     */
     wxPropertyGrid();
+#endif
 
     /** The default constructor. The styles to be used are styles valid for
 
     /** The default constructor. The styles to be used are styles valid for
-        the wxWindow and wxScrolledWindow.
-        @see @link wndflags Additional Window Styles@endlink
+        the wxWindow.
+
+        @see @link wndflags Additional Window Styles @endlink
     */
     wxPropertyGrid( wxWindow *parent, wxWindowID id = wxID_ANY,
                     const wxPoint& pos = wxDefaultPosition,
                     const wxSize& size = wxDefaultSize,
                     long style = wxPG_DEFAULT_STYLE,
     */
     wxPropertyGrid( wxWindow *parent, wxWindowID id = wxID_ANY,
                     const wxPoint& pos = wxDefaultPosition,
                     const wxSize& size = wxDefaultSize,
                     long style = wxPG_DEFAULT_STYLE,
-                    const wxChar* name = wxPropertyGridNameStr );
+                    const wxString& name = wxPropertyGridNameStr );
 
     /** Destructor */
     virtual ~wxPropertyGrid();
 
     /** Destructor */
     virtual ~wxPropertyGrid();
-#endif
 
     /** Adds given key combination to trigger given action.
 
     /** Adds given key combination to trigger given action.
+
+        Here is a sample code to make Enter key press move focus to
+        the next property.
+
+        @code
+            propGrid->AddActionTrigger(wxPG_ACTION_NEXT_PROPERTY,
+                                       WXK_RETURN);
+            propGrid->DedicateKey(WXK_RETURN);
+        @endcode
+
         @param action
         @param action
-            Which action to trigger. See @link pgactions List of list of
-            wxPropertyGrid actions@endlink.
+            Which action to trigger. See @ref propgrid_keyboard_actions.
+        @param keycode
+            Which keycode triggers the action.
+        @param modifiers
+            Which key event modifiers, in addition to keycode, are needed to
+            trigger the action.
     */
     void AddActionTrigger( int action, int keycode, int modifiers = 0 );
 
     */
     void AddActionTrigger( int action, int keycode, int modifiers = 0 );
 
+    /**
+        Dedicates a specific keycode to wxPropertyGrid. This means that such
+        key presses will not be redirected to editor controls.
+
+        Using this function allows, for example, navigation between
+        properties using arrow keys even when the focus is in the editor
+        control.
+    */
+    void DedicateKey( int keycode )
+    {
+        m_dedicatedKeys.push_back(keycode);
+    }
+
     /**
         This static function enables or disables automatic use of
         wxGetTranslation for following strings: wxEnumProperty list labels,
     /**
         This static function enables or disables automatic use of
         wxGetTranslation for following strings: wxEnumProperty list labels,
@@ -650,10 +827,11 @@ public:
     /**
         Centers the splitter.
 
     /**
         Centers the splitter.
 
-        If argument is true, automatic splitter centering is enabled (only
-        applicapple if style wxPG_SPLITTER_AUTO_CENTER was defined).
+        @param enableAutoResizing
+            If @true, automatic column resizing is enabled (only applicapple
+            if window style wxPG_SPLITTER_AUTO_CENTER is used).
     */
     */
-    void CenterSplitter( bool enable_auto_centering = false );
+    void CenterSplitter( bool enableAutoResizing = false );
 
     /** Deletes all properties.
     */
 
     /** Deletes all properties.
     */
@@ -687,7 +865,7 @@ public:
                  const wxPoint& pos = wxDefaultPosition,
                  const wxSize& size = wxDefaultSize,
                  long style = wxPG_DEFAULT_STYLE,
                  const wxPoint& pos = wxDefaultPosition,
                  const wxSize& size = wxDefaultSize,
                  long style = wxPG_DEFAULT_STYLE,
-                 const wxChar* name = wxPropertyGridNameStr );
+                 const wxString& name = wxPropertyGridNameStr );
 
     /**
         Call when editor widget's contents is modified.
 
     /**
         Call when editor widget's contents is modified.
@@ -749,9 +927,9 @@ public:
         Returns wxWindow that the properties are painted on, and which should
         be used as the parent for editor controls.
     */
         Returns wxWindow that the properties are painted on, and which should
         be used as the parent for editor controls.
     */
-    wxPanel* GetPanel() const
+    wxWindow* GetPanel()
     {
     {
-        return m_canvas;
+        return this;
     }
 
     /** Returns current category caption background colour. */
     }
 
     /** Returns current category caption background colour. */
@@ -773,10 +951,12 @@ public:
     /** Returns current cell text colour. */
     wxColour GetCellTextColour() const { return m_colPropFore; }
 
     /** Returns current cell text colour. */
     wxColour GetCellTextColour() const { return m_colPropFore; }
 
-    /** Returns number of columns on current page. */
-    int GetColumnCount() const
+    /**
+        Returns number of columns currently on grid.
+    */
+    unsigned int GetColumnCount() const
     {
     {
-        return m_pState->m_colWidths.size();
+        return (unsigned int) m_pState->m_colWidths.size();
     }
 
     /** Returns colour of empty space below properties. */
     }
 
     /** Returns colour of empty space below properties. */
@@ -821,11 +1001,16 @@ public:
     /** Returns background colour of margin. */
     wxColour GetMarginColour() const { return m_colMargin; }
 
     /** Returns background colour of margin. */
     wxColour GetMarginColour() const { return m_colMargin; }
 
-    /** Returns cell background colour of a property. */
-    wxColour GetPropertyBackgroundColour( wxPGPropArg id ) const;
+    /** Returns margin width. */
+    int GetMarginWidth() const { return m_marginWidth; }
 
 
-    /** Returns cell background colour of a property. */
-    wxColour GetPropertyTextColour( wxPGPropArg id ) const;
+    /**
+        Returns most up-to-date value of selected property. This will return
+        value different from GetSelectedProperty()->GetValue() only when text
+        editor is activate and string edited by user represents valid,
+        uncommitted property value.
+    */
+    wxVariant GetUncommittedPropertyValue();
 
     /** Returns "root property". It does not have name, etc. and it is not
         visible. It is only useful for accessing its children.
 
     /** Returns "root property". It does not have name, etc. and it is not
         visible. It is only useful for accessing its children.
@@ -836,13 +1021,7 @@ public:
     int GetRowHeight() const { return m_lineHeight; }
 
     /** Returns currently selected property. */
     int GetRowHeight() const { return m_lineHeight; }
 
     /** Returns currently selected property. */
-    wxPGProperty* GetSelectedProperty () const { return GetSelection(); }
-
-    /** Returns currently selected property. */
-    wxPGProperty* GetSelection() const
-    {
-        return m_selected;
-    }
+    wxPGProperty* GetSelectedProperty() const { return GetSelection(); }
 
     /** Returns current selection background colour. */
     wxColour GetSelectionBackgroundColour() const { return m_colSelBack; }
 
     /** Returns current selection background colour. */
     wxColour GetSelectionBackgroundColour() const { return m_colSelBack; }
@@ -850,9 +1029,13 @@ public:
     /** Returns current selection text colour. */
     wxColour GetSelectionForegroundColour() const { return m_colSelFore; }
 
     /** Returns current selection text colour. */
     wxColour GetSelectionForegroundColour() const { return m_colSelFore; }
 
-    /** Returns current splitter x position. */
-    int GetSplitterPosition() const
-        { return m_pState->DoGetSplitterPosition(0); }
+    /**
+        Returns current splitter x position.
+    */
+    int GetSplitterPosition( unsigned int splitterIndex = 0 ) const
+    {
+        return m_pState->DoGetSplitterPosition(splitterIndex);
+    }
 
     /** Returns wxTextCtrl active in currently selected property, if any. Takes
         into account wxOwnerDrawnComboBox.
 
     /** Returns wxTextCtrl active in currently selected property, if any. Takes
         into account wxOwnerDrawnComboBox.
@@ -867,15 +1050,24 @@ public:
     /** Returns current vertical spacing. */
     int GetVerticalSpacing() const { return (int)m_vspacing; }
 
     /** Returns current vertical spacing. */
     int GetVerticalSpacing() const { return (int)m_vspacing; }
 
+    /**
+        Returns @true if a property editor control has focus.
+    */
+    bool IsEditorFocused() const;
+
     /** Returns true if editor's value was marked modified.
     */
     bool IsEditorsValueModified() const
         { return  ( m_iFlags & wxPG_FL_VALUE_MODIFIED ) ? true : false; }
 
     /** Returns true if editor's value was marked modified.
     */
     bool IsEditorsValueModified() const
         { return  ( m_iFlags & wxPG_FL_VALUE_MODIFIED ) ? true : false; }
 
-    /** Returns information about arbitrary position in the grid.
+    /**
+        Returns information about arbitrary position in the grid.
 
 
-        For wxPropertyGridHitTestResult definition, see
-        wxPropertyGridPageState::HitTest().
+        @param pt
+            Coordinates in the virtual grid space. You may need to use
+            wxScrolled<T>::CalcScrolledPosition() for translating
+            wxPropertyGrid client coordinates into something this member
+            function can use.
     */
     wxPropertyGridHitTestResult HitTest( const wxPoint& pt ) const;
 
     */
     wxPropertyGridHitTestResult HitTest( const wxPoint& pt ) const;
 
@@ -888,49 +1080,157 @@ public:
      */
     bool IsFrozen() const { return (m_frozen>0)?true:false; }
 
      */
     bool IsFrozen() const { return (m_frozen>0)?true:false; }
 
+    /**
+        It is recommended that you call this function any time your code causes
+        wxPropertyGrid's top-level parent to change. wxPropertyGrid's OnIdle()
+        handler should be able to detect most changes, but it is not perfect.
+
+        @param newTLP
+            New top-level parent that is about to be set. Old top-level parent
+            window should still exist as the current one.
+
+        @remarks This function is automatically called from wxPropertyGrid::
+                 Reparent() and wxPropertyGridManager::Reparent(). You only
+                 need to use it if you reparent wxPropertyGrid indirectly.
+    */
+    void OnTLPChanging( wxWindow* newTLP );
+
     /** Redraws given property.
     */
     virtual void RefreshProperty( wxPGProperty* p );
 
     /** Redraws given property.
     */
     virtual void RefreshProperty( wxPGProperty* p );
 
-#ifndef SWIG
     /** Registers a new editor class.
         @return
         Pointer to the editor class instance that should be used.
     */
     static wxPGEditor* RegisterEditorClass( wxPGEditor* editor,
     /** Registers a new editor class.
         @return
         Pointer to the editor class instance that should be used.
     */
     static wxPGEditor* RegisterEditorClass( wxPGEditor* editor,
-                                            const wxString& name,
-                                            bool noDefCheck = false );
-#endif
+                                            bool noDefCheck = false )
+    {
+        return DoRegisterEditorClass(editor, wxEmptyString, noDefCheck);
+    }
+
+    static wxPGEditor* DoRegisterEditorClass( wxPGEditor* editorClass,
+                                              const wxString& editorName,
+                                              bool noDefCheck = false );
 
     /** Resets all colours to the original system values.
     */
     void ResetColours();
 
 
     /** Resets all colours to the original system values.
     */
     void ResetColours();
 
+    /**
+        Resets column sizes and splitter positions, based on proportions.
+
+        @param enableAutoResizing
+            If @true, automatic column resizing is enabled (only applicapple
+            if window style wxPG_SPLITTER_AUTO_CENTER is used).
+
+        @see wxPropertyGridInterface::SetColumnProportion()
+    */
+    void ResetColumnSizes( bool enableAutoResizing = false );
+
     /**
         Selects a property.
         Editor widget is automatically created, but not focused unless focus is
     /**
         Selects a property.
         Editor widget is automatically created, but not focused unless focus is
-        true. This will generate wxEVT_PG_SELECT event.
+        true.
+
         @param id
             Property to select.
         @param id
             Property to select.
+
         @return
             True if selection finished successfully. Usually only fails if
             current value in editor is not valid.
         @return
             True if selection finished successfully. Usually only fails if
             current value in editor is not valid.
-        @see wxPropertyGrid::Unselect
+
+        @remarks In wxPropertyGrid 1.4, this member function used to generate
+                 wxEVT_PG_SELECTED. In wxWidgets 2.9 and later, it no longer
+                 does that.
+
+        @remarks This clears any previous selection.
+    */
+    bool SelectProperty( wxPGPropArg id, bool focus = false );
+
+    /**
+        Set entire new selection from given list of properties.
     */
     */
-    bool SelectProperty( wxPGPropArg id, bool focus = false )
+    void SetSelection( const wxArrayPGProperty& newSelection )
+    {
+        DoSetSelection( newSelection, wxPG_SEL_DONT_SEND_EVENT );
+    }
+
+    /**
+        Adds given property into selection. If wxPG_EX_MULTIPLE_SELECTION
+        extra style is not used, then this has same effect as
+        calling SelectProperty().
+
+        @remarks Multiple selection is not supported for categories. This
+                 means that if you have properties selected, you cannot
+                 add category to selection, and also if you have category
+                 selected, you cannot add other properties to selection.
+                 This member function will fail silently in these cases,
+                 even returning true.
+    */
+    bool AddToSelection( wxPGPropArg id )
     {
         wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
     {
         wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
-        return DoSelectProperty(p,focus?wxPG_SEL_FOCUS:0);
+        return DoAddToSelection(p, wxPG_SEL_DONT_SEND_EVENT);
     }
 
     }
 
-    /** Changes keyboard shortcut to push the editor button.
-        @remarks
-        You can set default with keycode 0. Good value for the platform is
-        guessed, but don't expect it to be very accurate.
+    /**
+        Removes given property from selection. If property is not selected,
+        an assertion failure will occur.
     */
     */
-    void SetButtonShortcut( int keycode,
-                            bool ctrlDown = false,
-                            bool altDown = false );
+    bool RemoveFromSelection( wxPGPropArg id )
+    {
+        wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
+        return DoRemoveFromSelection(p, wxPG_SEL_DONT_SEND_EVENT);
+    }
+
+    /**
+        Makes given column editable by user.
+
+        @param editable
+            Using @false here will disable column from being editable.
+    */
+    void MakeColumnEditable( unsigned int column, bool editable = true );
+
+    /**
+        Creates label editor wxTextCtrl for given column, for property
+        that is currently selected. When multiple selection is
+        enabled, this applies to whatever property GetSelection()
+        returns.
+
+        @param colIndex
+            Which column's label to edit. Note that you should not
+            use value 1, which is reserved for property value
+            column.
+
+        @see EndLabelEdit(), MakeColumnEditable()
+    */
+    void BeginLabelEdit( unsigned int column = 0 )
+    {
+        DoBeginLabelEdit(column, wxPG_SEL_DONT_SEND_EVENT);
+    }
+
+    /**
+        Destroys label editor wxTextCtrl, if any.
+
+        @param commit
+            Use @true (default) to store edited label text in
+            property cell data.
+
+        @see BeginLabelEdit(), MakeColumnEditable()
+    */
+    void EndLabelEdit( bool commit = true )
+    {
+        DoEndLabelEdit(commit, wxPG_SEL_DONT_SEND_EVENT);
+    }
+
+    /**
+        Returns currently active label editor, NULL if none.
+    */
+    wxTextCtrl* GetLabelEditor() const
+    {
+        return m_labelEditor;
+    }
 
     /** Sets category caption background colour. */
     void SetCaptionBackgroundColour(const wxColour& col);
 
     /** Sets category caption background colour. */
     void SetCaptionBackgroundColour(const wxColour& col);
@@ -967,10 +1267,8 @@ public:
     void SetCurrentCategory( wxPGPropArg id )
     {
         wxPG_PROP_ARG_CALL_PROLOG()
     void SetCurrentCategory( wxPGPropArg id )
     {
         wxPG_PROP_ARG_CALL_PROLOG()
-        wxPropertyCategory* pc = (wxPropertyCategory*)p;
-#ifdef __WXDEBUG__
-        if ( pc ) wxASSERT( pc->IsCategory() );
-#endif
+        wxPropertyCategory* pc = wxDynamicCast(p, wxPropertyCategory);
+        wxASSERT(pc);
         m_pState->m_currentCategory = pc;
     }
 
         m_pState->m_currentCategory = pc;
     }
 
@@ -983,28 +1281,6 @@ public:
     /** Sets background colour of margin. */
     void SetMarginColour(const wxColour& col);
 
     /** Sets background colour of margin. */
     void SetMarginColour(const wxColour& col);
 
-    /** Sets property attribute for all applicapple properties.
-        Be sure to use this method only after all properties have been
-        added to the grid.
-    */
-    void SetPropertyAttributeAll( const wxString& attrName, wxVariant value );
-
-    /** Sets background colour of property and all its children. Colours of
-        captions are not affected. Background brush cache is optimized for often
-        set colours to be set last.
-    */
-    void SetPropertyBackgroundColour( wxPGPropArg id, const wxColour& col );
-
-    /** Resets text and background colours of given property.
-    */
-    void SetPropertyColoursToDefault( wxPGPropArg id );
-
-    /** Sets text colour of property and all its children.
-    */
-    void SetPropertyTextColour( wxPGPropArg id,
-                                const wxColour& col,
-                                bool recursively = true );
-
     /**
         Sets selection background colour - applies to selected property name
         background.
     /**
         Sets selection background colour - applies to selected property name
         background.
@@ -1023,44 +1299,103 @@ public:
         during form creation may fail as initial grid size is often smaller
         than desired splitter position, especially when sizers are being used.
     */
         during form creation may fail as initial grid size is often smaller
         than desired splitter position, especially when sizers are being used.
     */
-    void SetSplitterPosition( int newxpos, int col = 0 )
+    void SetSplitterPosition( int newXPos, int col = 0 )
     {
     {
-        DoSetSplitterPosition_(newxpos, true, col);
-        m_iFlags |= wxPG_FL_SPLITTER_PRE_SET;
+        DoSetSplitterPosition(newXPos, col, wxPG_SPLITTER_REFRESH);
     }
 
     }
 
-    /** Set virtual width for this particular page. Width -1 indicates that the
-        virtual width should be disabled. */
-    void SetVirtualWidth( int width );
+    /**
+        Sets the property sorting function.
+
+        @param sortFunction
+            The sorting function to be used. It should return a value greater
+            than 0 if position of p1 is after p2. So, for instance, when
+            comparing property names, you can use following implementation:
+
+            @code
+                int MyPropertySortFunction(wxPropertyGrid* propGrid,
+                                           wxPGProperty* p1,
+                                           wxPGProperty* p2)
+                {
+                    return p1->GetBaseName().compare( p2->GetBaseName() );
+                }
+            @endcode
 
 
-    /** Sets name of a property.
-        @param id
-        Name or pointer of property which name to change.
-        @param newname
-        New name.
+        @remarks
+            Default property sort function sorts properties by their labels
+            (case-insensitively).
+
+        @see GetSortFunction, wxPropertyGridInterface::Sort,
+             wxPropertyGridInterface::SortChildren
     */
     */
-    void SetPropertyName( wxPGPropArg id, const wxString& newname )
+    void SetSortFunction( wxPGSortCallback sortFunction )
     {
     {
-        wxPG_PROP_ARG_CALL_PROLOG()
-        DoSetPropertyName( p, newname );
+        m_sortFunction = sortFunction;
     }
 
     }
 
-    /** Moves splitter as left as possible, while still allowing all
+    /**
+        Returns the property sort function (default is @NULL).
+
+        @see SetSortFunction
+    */
+    wxPGSortCallback GetSortFunction() const
+    {
+        return m_sortFunction;
+    }
+
+    /**
+        Sets appearance of value cells representing an unspecified property
+        value. Default appearance is blank.
+
+        @remarks If you set the unspecified value to have any
+                 textual representation, then that will override
+                 "InlineHelp" attribute.
+
+        @see wxPGProperty::SetValueToUnspecified(),
+             wxPGProperty::IsValueUnspecified()
+    */
+    void SetUnspecifiedValueAppearance( const wxPGCell& cell )
+    {
+        m_unspecifiedAppearance = m_propertyDefaultCell;
+        m_unspecifiedAppearance.MergeFrom(cell);
+    }
+
+    /**
+        Returns current appearance of unspecified value cells.
+
+        @see SetUnspecifiedValueAppearance()
+    */
+    const wxPGCell& GetUnspecifiedValueAppearance() const
+    {
+        return m_unspecifiedAppearance;
+    }
+
+    /**
+        Returns (visual) text representation of the unspecified
+        property value.
+
+        @param argFlags For internal use only.
+    */
+    wxString GetUnspecifiedValueText( int argFlags = 0 ) const;
+
+    /** Set virtual width for this particular page. Width -1 indicates that the
+        virtual width should be disabled. */
+    void SetVirtualWidth( int width );
+
+    /**
+        Moves splitter as left as possible, while still allowing all
         labels to be shown in full.
         labels to be shown in full.
-        @param subProps
-        If false, will still allow sub-properties (ie. properties which
-        parent is not root or category) to be cropped.
+
+        @param privateChildrenToo
+            If @false, will still allow private children to be cropped.
     */
     */
-    void SetSplitterLeft( bool subProps = false )
+    void SetSplitterLeft( bool privateChildrenToo = false )
     {
     {
-        m_pState->SetSplitterLeft(subProps);
+        m_pState->SetSplitterLeft(privateChildrenToo);
     }
 
     /** Sets vertical spacing. Can be 1, 2, or 3 - a value relative to font
         height. Value of 2 should be default on most platforms.
     }
 
     /** Sets vertical spacing. Can be 1, 2, or 3 - a value relative to font
         height. Value of 2 should be default on most platforms.
-        @remarks
-        On wxMSW, wxComboBox, when used as property editor widget, will spill
-        out with anything less than 3.
     */
     void SetVerticalSpacing( int vspacing )
     {
     */
     void SetVerticalSpacing( int vspacing )
     {
@@ -1076,13 +1411,6 @@ public:
         DoShowPropertyError(p, msg);
     }
 
         DoShowPropertyError(p, msg);
     }
 
-    /** Sorts all items at all levels (except sub-properties). */
-    void Sort();
-
-    /** Sorts children of a category.
-    */
-    void SortChildren( wxPGPropArg id );
-
     /////////////////////////////////////////////////////////////////
     //
     // Following methods do not need to be (currently) documented
     /////////////////////////////////////////////////////////////////
     //
     // Following methods do not need to be (currently) documented
@@ -1101,7 +1429,7 @@ public:
     */
     unsigned int GetCommonValueCount() const
     {
     */
     unsigned int GetCommonValueCount() const
     {
-        return m_commonValues.size();
+        return (unsigned int) m_commonValues.size();
     }
 
     /** Returns label of given common value.
     }
 
     /** Returns label of given common value.
@@ -1137,6 +1465,7 @@ public:
         shown).
     */
     void FixPosForTextCtrl( wxWindow* ctrl,
         shown).
     */
     void FixPosForTextCtrl( wxWindow* ctrl,
+                            unsigned int forColumn = 1,
                             const wxPoint& offset = wxPoint(0, 0) );
 
     /** Shortcut for creating text editor widget.
                             const wxPoint& offset = wxPoint(0, 0) );
 
     /** Shortcut for creating text editor widget.
@@ -1160,7 +1489,8 @@ public:
                                       const wxString& value,
                                       wxWindow* secondary,
                                       int extraStyle = 0,
                                       const wxString& value,
                                       wxWindow* secondary,
                                       int extraStyle = 0,
-                                      int maxLen = 0 );
+                                      int maxLen = 0,
+                                      unsigned int forColumn = 1 );
 
     /* Generates both textctrl and button.
     */
 
     /* Generates both textctrl and button.
     */
@@ -1191,22 +1521,15 @@ public:
 
     /**
         Returns rectangle that fully contains properties between and including
 
     /**
         Returns rectangle that fully contains properties between and including
-        p1 and p2.
+        p1 and p2. Rectangle is in virtual scrolled window coordinates.
     */
     wxRect GetPropertyRect( const wxPGProperty* p1,
                             const wxPGProperty* p2 ) const;
 
     /** Returns pointer to current active primary editor control (NULL if none).
     */
     wxRect GetPropertyRect( const wxPGProperty* p1,
                             const wxPGProperty* p2 ) const;
 
     /** Returns pointer to current active primary editor control (NULL if none).
-
-        If editor uses clipper window, pointer is returned to the actual
-        editor, not the clipper.
     */
     wxWindow* GetEditorControl() const;
 
     */
     wxWindow* GetEditorControl() const;
 
-    /** Adjusts given position if topCtrlWnd is child of clipper window.
-    */
-    bool AdjustPosForClipperWindow( wxWindow* topCtrlWnd, int* x, int* y );
-
     wxWindow* GetPrimaryEditor() const
     {
         return GetEditorControl();
     wxWindow* GetPrimaryEditor() const
     {
         return GetEditorControl();
@@ -1221,46 +1544,38 @@ public:
         return m_wndEditor2;
     }
 
         return m_wndEditor2;
     }
 
-#ifndef SWIG
-
     /**
     /**
-        Generates contents for string dst based on the contents of
-        wxArrayString src.
-
-        Format will be "(preDelim)str1(postDelim) (preDelim)str2(postDelim) and
-        so on. Set flags to 1 inorder to convert backslashes to double-back-
-        slashes and "(preDelims)"'s to "(preDelims)".
+        Refreshes any active editor control.
     */
     */
-    static void ArrayStringToString( wxString& dst, const wxArrayString& src,
-                                     wxChar preDelim, wxChar postDelim,
-                                     int flags );
+    void RefreshEditor();
+
+    // Events from editor controls are forward to this function
+    bool HandleCustomEditorEvent( wxEvent &event );
 
     // Mostly useful for page switching.
     void SwitchState( wxPropertyGridPageState* pNewState );
 
 
     // Mostly useful for page switching.
     void SwitchState( wxPropertyGridPageState* pNewState );
 
-    /** Pass this function to Connect calls in propertyclass::CreateEditor.
-    */
-    void OnCustomEditorEvent( wxCommandEvent &event );
-
     long GetInternalFlags() const { return m_iFlags; }
     long GetInternalFlags() const { return m_iFlags; }
+    bool HasInternalFlag( long flag ) const
+        { return (m_iFlags & flag) ? true : false; }
     void SetInternalFlag( long flag ) { m_iFlags |= flag; }
     void ClearInternalFlag( long flag ) { m_iFlags &= ~(flag); }
     void IncFrozen() { m_frozen++; }
     void DecFrozen() { m_frozen--; }
 
     void SetInternalFlag( long flag ) { m_iFlags |= flag; }
     void ClearInternalFlag( long flag ) { m_iFlags &= ~(flag); }
     void IncFrozen() { m_frozen++; }
     void DecFrozen() { m_frozen--; }
 
-    void OnComboItemPaint( wxPGCustomComboControl* pCb,int item,wxDC& dc,
-                           wxRect& rect,int flags );
-
-    // Used by simple check box for keyboard navigation
-    void SendNavigationKeyEvent( int dir );
+    void OnComboItemPaint( const wxPGComboBox* pCb,
+                           int item,
+                           wxDC* pDc,
+                           wxRect& rect,
+                           int flags );
 
     /** Standardized double-to-string conversion.
     */
 
     /** Standardized double-to-string conversion.
     */
-    static void DoubleToString( wxString& target,
-                                double value,
-                                int precision,
-                                bool removeZeroes,
-                                wxString* precTemplate );
+    static const wxString& DoubleToString( wxString& target,
+                                           double value,
+                                           int precision,
+                                           bool removeZeroes,
+                                           wxString* precTemplate = NULL );
 
     /**
         Call this from wxPGProperty::OnEvent() to cause property value to be
 
     /**
         Call this from wxPGProperty::OnEvent() to cause property value to be
@@ -1274,6 +1589,21 @@ public:
         m_iFlags |= wxPG_FL_VALUE_CHANGE_IN_EVENT;
     }
 
         m_iFlags |= wxPG_FL_VALUE_CHANGE_IN_EVENT;
     }
 
+    /**
+        You can use this member function, for instance, to detect in
+        wxPGProperty::OnEvent() if wxPGProperty::SetValueInEvent() was
+        already called in wxPGEditor::OnEvent(). It really only detects
+        if was value was changed using wxPGProperty::SetValueInEvent(), which
+        is usually used when a 'picker' dialog is displayed. If value was
+        written by "normal means" in wxPGProperty::StringToValue() or
+        IntToValue(), then this function will return false (on the other hand,
+        wxPGProperty::OnEvent() is not even called in those cases).
+    */
+    bool WasValueChangedInEvent() const
+    {
+        return (m_iFlags & wxPG_FL_VALUE_CHANGE_IN_EVENT) ? true : false;
+    }
+
     /** Returns true if given event is from first of an array of buttons
         (as can be in case when wxPGMultiButton is used).
     */
     /** Returns true if given event is from first of an array of buttons
         (as can be in case when wxPGMultiButton is used).
     */
@@ -1288,12 +1618,6 @@ public:
     virtual bool DoPropertyChanged( wxPGProperty* p,
                                     unsigned int selFlags = 0 );
 
     virtual bool DoPropertyChanged( wxPGProperty* p,
                                     unsigned int selFlags = 0 );
 
-    /**
-        Runs all validation functionality (includes sending wxEVT_PG_CHANGING).
-        Returns true if all tests passed.
-    */
-    virtual bool PerformValidation( wxPGProperty* p, wxVariant& pendingValue );
-
     /** Called when validation for given property fails.
         @param invalidValue
             Value which failed in validation.
     /** Called when validation for given property fails.
         @param invalidValue
             Value which failed in validation.
@@ -1301,15 +1625,11 @@ public:
             Return true if user is allowed to change to another property even
             if current has invalid value.
         @remarks
             Return true if user is allowed to change to another property even
             if current has invalid value.
         @remarks
-        To add your own validation failure behavior, override
+        To add your own validation failure behaviour, override
         wxPropertyGrid::DoOnValidationFailure().
     */
         wxPropertyGrid::DoOnValidationFailure().
     */
-    bool OnValidationFailure( wxPGProperty* property, wxVariant& invalidValue )
-    {
-        bool res = DoOnValidationFailure(property, invalidValue);
-        property->SetFlag(wxPG_PROP_INVALID_VALUE);
-        return res;
-    }
+    bool OnValidationFailure( wxPGProperty* property,
+                              wxVariant& invalidValue );
 
     /** Called to indicate property and editor has valid value now.
     */
 
     /** Called to indicate property and editor has valid value now.
     */
@@ -1323,13 +1643,39 @@ public:
         m_validationInfo.m_failureMessage.clear();
     }
 
         m_validationInfo.m_failureMessage.clear();
     }
 
-    /** Override in derived class to display error messages in custom manner
+    /**
+        Override in derived class to display error messages in custom manner
         (these message usually only result from validation failure).
         (these message usually only result from validation failure).
+
+        @remarks If you implement this, then you also need to implement
+                 DoHidePropertyError() - possibly to do nothing, if error
+                 does not need hiding (e.g. it was logged or shown in a
+                 message box).
+
+        @see DoHidePropertyError()
     */
     virtual void DoShowPropertyError( wxPGProperty* property,
                                       const wxString& msg );
 
     */
     virtual void DoShowPropertyError( wxPGProperty* property,
                                       const wxString& msg );
 
-    /** Override to customize property validation failure behavior.
+    /**
+        Override in derived class to hide an error displayed by
+        DoShowPropertyError().
+
+        @see DoShowPropertyError()
+    */
+    virtual void DoHidePropertyError( wxPGProperty* property );
+
+#if wxUSE_STATUSBAR
+    /**
+        Return wxStatusBar that is used by this wxPropertyGrid. You can
+        reimplement this member function in derived class to override
+        the default behaviour of using the top-level wxFrame's status
+        bar, if any.
+    */
+    virtual wxStatusBar* GetStatusBar();
+#endif
+
+    /** Override to customize property validation failure behaviour.
         @param invalidValue
             Value which failed in validation.
         @return
         @param invalidValue
             Value which failed in validation.
         @return
@@ -1361,6 +1707,23 @@ public:
     */
     bool UnfocusEditor();
 
     */
     bool UnfocusEditor();
 
+    virtual void SetWindowStyleFlag( long style );
+
+    void DrawItems( const wxPGProperty* p1, const wxPGProperty* p2 );
+
+    void DrawItem( wxPGProperty* p )
+    {
+        DrawItems(p,p);
+    }
+
+    virtual void DrawItemAndChildren( wxPGProperty* p );
+
+    /**
+        Draws item, children, and consequtive parents as long as category is
+        not met.
+     */
+    void DrawItemAndValueRelated( wxPGProperty* p );
+
 protected:
 
     /**
 protected:
 
     /**
@@ -1371,36 +1734,56 @@ protected:
     */
     virtual wxPropertyGridPageState* CreateState() const;
 
     */
     virtual wxPropertyGridPageState* CreateState() const;
 
-#ifndef DOXYGEN
+    enum PerformValidationFlags
+    {
+        SendEvtChanging         = 0x0001,
+        IsStandaloneValidation  = 0x0002   // Not called in response to event
+    };
+
+    /**
+        Runs all validation functionality (includes sending wxEVT_PG_CHANGING).
+        Returns true if all tests passed. Implement in derived class to
+        add additional validation behaviour.
+    */
+    virtual bool PerformValidation( wxPGProperty* p,
+                                    wxVariant& pendingValue,
+                                    int flags = SendEvtChanging );
+
 public:
 
     // Control font changer helper.
     void SetCurControlBoldFont();
 
 public:
 
     // Control font changer helper.
     void SetCurControlBoldFont();
 
+    wxPGCell& GetPropertyDefaultCell()
+    {
+        return m_propertyDefaultCell;
+    }
+
+    wxPGCell& GetCategoryDefaultCell()
+    {
+        return m_categoryDefaultCell;
+    }
+
     //
     // Public methods for semi-public use
     //
     // Public methods for semi-public use
-    // (not protected for optimization)
     //
     bool DoSelectProperty( wxPGProperty* p, unsigned int flags = 0 );
 
     // Overridden functions.
     virtual bool Destroy();
     //
     bool DoSelectProperty( wxPGProperty* p, unsigned int flags = 0 );
 
     // Overridden functions.
     virtual bool Destroy();
-    virtual wxSize DoGetBestSize() const;
     // Returns property at given y coordinate (relative to grid's top left).
     wxPGProperty* GetItemAtY( int y ) const { return DoGetItemAtY(y); }
 
     virtual void Refresh( bool eraseBackground = true,
                           const wxRect *rect = (const wxRect *) NULL );
     virtual bool SetFont( const wxFont& font );
     // Returns property at given y coordinate (relative to grid's top left).
     wxPGProperty* GetItemAtY( int y ) const { return DoGetItemAtY(y); }
 
     virtual void Refresh( bool eraseBackground = true,
                           const wxRect *rect = (const wxRect *) NULL );
     virtual bool SetFont( const wxFont& font );
-#if wxPG_SUPPORT_TOOLTIPS
-    void SetToolTip( const wxString& tipString );
-#endif
     virtual void Freeze();
     virtual void SetExtraStyle( long exStyle );
     virtual void Thaw();
     virtual void Freeze();
     virtual void SetExtraStyle( long exStyle );
     virtual void Thaw();
-
+    virtual bool Reparent( wxWindowBase *newParent );
 
 protected:
 
 protected:
+    virtual wxSize DoGetBestSize() const;
 
 #ifndef wxPG_ICON_WIDTH
     wxBitmap            *m_expandbmp, *m_collbmp;
 
 #ifndef wxPG_ICON_WIDTH
     wxBitmap            *m_expandbmp, *m_collbmp;
@@ -1412,14 +1795,7 @@ protected:
     wxWindow            *m_wndEditor;
     wxWindow            *m_wndEditor2;
 
     wxWindow            *m_wndEditor;
     wxWindow            *m_wndEditor2;
 
-    /** wxPGCanvas instance. */
-    wxPanel             *m_canvas;
-
-#if wxPG_DOUBLE_BUFFER
     wxBitmap            *m_doubleBuffer;
     wxBitmap            *m_doubleBuffer;
-#endif
-
-    wxArrayPtrVoid      *m_windowsToDelete;
 
     /** Local time ms when control was created. */
     wxLongLong          m_timeCreated;
 
     /** Local time ms when control was created. */
     wxLongLong          m_timeCreated;
@@ -1486,19 +1862,11 @@ protected:
     /** Current cursor id. */
     int                 m_curcursor;
 
     /** Current cursor id. */
     int                 m_curcursor;
 
-    /**
-        This captionFont is made equal to the font of the wxScrolledWindow.
-
-        As extra the bold face is set on it when this is wanted by the user
-        (see flags)
-     */
+    // Caption font. Same as normal font plus bold style.
     wxFont              m_captionFont;
 
     int                 m_fontHeight;  // Height of the font.
 
     wxFont              m_captionFont;
 
     int                 m_fontHeight;  // Height of the font.
 
-    // Base keycode for triggering push button.
-    int                 m_pushButKeyCode;
-
     /** m_splitterx when drag began. */
     int                 m_startingSplitterX;
 
     /** m_splitterx when drag began. */
     int                 m_startingSplitterX;
 
@@ -1529,6 +1897,20 @@ protected:
     /** Actions and keys that trigger them. */
     wxPGHashMapI2I      m_actionTriggers;
 
     /** Actions and keys that trigger them. */
     wxPGHashMapI2I      m_actionTriggers;
 
+    /** Appearance of currently active editor. */
+    wxPGCell            m_editorAppearance;
+
+    /** Appearance of a unspecified value cell. */
+    wxPGCell            m_unspecifiedAppearance;
+
+    /** List of properties to be deleted/removed in idle event handler. */
+    wxArrayPGProperty   m_deletedProperties;
+    wxArrayPGProperty   m_removedProperties;
+
+    /** List of key codes that will not be handed over to editor controls. */
+    // FIXME: Make this a hash set once there is template-based wxHashSet.
+    wxVector<int>       m_dedicatedKeys;
+
     //
     // Temporary values
     //
     //
     // Temporary values
     //
@@ -1556,41 +1938,43 @@ protected:
 
     unsigned char       m_vspacing;
 
 
     unsigned char       m_vspacing;
 
-    // Does triggering push button need Alt down?
-    unsigned char       m_pushButKeyCodeNeedsAlt;
-
-    // Does triggering push button need Ctrl down?
-    unsigned char       m_pushButKeyCodeNeedsCtrl;
-
     // Used to track when Alt/Ctrl+Key was consumed.
     unsigned char       m_keyComboConsumed;
 
     /** 1 if in DoPropertyChanged() */
     // Used to track when Alt/Ctrl+Key was consumed.
     unsigned char       m_keyComboConsumed;
 
     /** 1 if in DoPropertyChanged() */
-    unsigned char       m_inDoPropertyChanged;
+    bool                m_inDoPropertyChanged;
 
     /** 1 if in CommitChangesFromEditor() */
 
     /** 1 if in CommitChangesFromEditor() */
-    unsigned char       m_inCommitChangesFromEditor;
+    bool                m_inCommitChangesFromEditor;
 
     /** 1 if in DoSelectProperty() */
 
     /** 1 if in DoSelectProperty() */
-    unsigned char       m_inDoSelectProperty;
+    bool                m_inDoSelectProperty;
+
+    bool                m_inOnValidationFailure;
 
     wxPGVFBFlags        m_permanentValidationFailureBehavior;  // Set by app
 
 
     wxPGVFBFlags        m_permanentValidationFailureBehavior;  // Set by app
 
+    // DoEditorValidate() recursion guard
+    wxRecursionGuardFlag    m_validatingEditor;
+
     /** Internal flags - see wxPG_FL_XXX constants. */
     wxUint32            m_iFlags;
 
     /** When drawing next time, clear this many item slots at the end. */
     int                 m_clearThisMany;
 
     /** Internal flags - see wxPG_FL_XXX constants. */
     wxUint32            m_iFlags;
 
     /** When drawing next time, clear this many item slots at the end. */
     int                 m_clearThisMany;
 
-    /** Pointer to selected property. Note that this is duplicated in
-        m_state for better transiency between pages so that the selected
-        item can be retained.
-    */
-    wxPGProperty*       m_selected;
+    // Mouse is hovering over this column (index)
+    unsigned int        m_colHover;
 
     // pointer to property that has mouse hovering
     wxPGProperty*       m_propHover;
 
 
     // pointer to property that has mouse hovering
     wxPGProperty*       m_propHover;
 
+    // Active label editor
+    wxTextCtrl*         m_labelEditor;
+
+    // For which property the label editor is active
+    wxPGProperty*       m_labelEditorProperty;
+
     // EventObject for wxPropertyGridEvents
     wxWindow*           m_eventObject;
 
     // EventObject for wxPropertyGridEvents
     wxWindow*           m_eventObject;
 
@@ -1598,16 +1982,26 @@ protected:
     // handling mess).
     wxWindow*           m_curFocused;
 
     // handling mess).
     wxWindow*           m_curFocused;
 
-    // wxPGTLWHandler
-    wxEvtHandler*       m_tlwHandler;
+    // Event currently being sent - NULL if none at the moment
+    wxPropertyGridEvent*    m_processedEvent;
 
 
-    // Top level parent
+    // Last known top-level parent
     wxWindow*           m_tlp;
 
     wxWindow*           m_tlp;
 
+    // Last closed top-level parent
+    wxWindow*           m_tlpClosed;
+
+    // Local time ms when tlp was closed.
+    wxLongLong          m_tlpClosedTime;
+
+    // Sort function
+    wxPGSortCallback    m_sortFunction;
+
     // y coordinate of property that mouse hovering
     int                 m_propHoverY;
     // y coordinate of property that mouse hovering
     int                 m_propHoverY;
+
     // Which column's editor is selected (usually 1)?
     // Which column's editor is selected (usually 1)?
-    int                 m_selColumn;
+    unsigned int        m_selColumn;
 
     // x relative to splitter (needed for resize).
     int                 m_ctrlXAdjust;
 
     // x relative to splitter (needed for resize).
     int                 m_ctrlXAdjust;
@@ -1634,18 +2028,23 @@ protected:
     // background colour for empty space below the grid
     wxColour            m_colEmptySpace;
 
     // background colour for empty space below the grid
     wxColour            m_colEmptySpace;
 
-    // temp property array used in DoDrawItems
-    wxArrayPtrVoid      m_visPropArray;
+    // Default property colours
+    wxPGCell            m_propertyDefaultCell;
 
 
-    // NB: These *cannot* be moved to globals.
+    // Default property category
+    wxPGCell            m_categoryDefaultCell;
+
+    // Backup of selected property's cells
+    wxVector<wxPGCell>  m_propCellsBackup;
 
 
-    // Array of background colour brushes.
-    wxArrayPtrVoid      m_arrBgBrushes;
-    // Array of foreground colours.
-    wxArrayPtrVoid      m_arrFgCols;
+    // NB: These *cannot* be moved to globals.
 
     // labels when properties use common values
 
     // labels when properties use common values
-    wxArrayPtrVoid      m_commonValues;
+    wxVector<wxPGCommonValue*>  m_commonValues;
+
+    // array of live events
+    wxVector<wxPropertyGridEvent*>  m_liveEvents;
+
     // Which cv selection really sets value to unspecified?
     int                 m_cvUnspecified;
 
     // Which cv selection really sets value to unspecified?
     int                 m_cvUnspecified;
 
@@ -1664,14 +2063,11 @@ protected:
 
     // main event receivers
     void OnMouseMove( wxMouseEvent &event );
 
     // main event receivers
     void OnMouseMove( wxMouseEvent &event );
-    void OnMouseMoveBottom( wxMouseEvent &event );
     void OnMouseClick( wxMouseEvent &event );
     void OnMouseRightClick( wxMouseEvent &event );
     void OnMouseDoubleClick( wxMouseEvent &event );
     void OnMouseUp( wxMouseEvent &event );
     void OnKey( wxKeyEvent &event );
     void OnMouseClick( wxMouseEvent &event );
     void OnMouseRightClick( wxMouseEvent &event );
     void OnMouseDoubleClick( wxMouseEvent &event );
     void OnMouseUp( wxMouseEvent &event );
     void OnKey( wxKeyEvent &event );
-    void OnKeyUp( wxKeyEvent &event );
-    void OnNavigationKey( wxNavigationKeyEvent& event );
     void OnResize( wxSizeEvent &event );
 
     // event handlers
     void OnResize( wxSizeEvent &event );
 
     // event handlers
@@ -1680,9 +2076,7 @@ protected:
     bool HandleMouseRightClick( int x, unsigned int y, wxMouseEvent &event );
     bool HandleMouseDoubleClick( int x, unsigned int y, wxMouseEvent &event );
     bool HandleMouseUp( int x, unsigned int y, wxMouseEvent &event );
     bool HandleMouseRightClick( int x, unsigned int y, wxMouseEvent &event );
     bool HandleMouseDoubleClick( int x, unsigned int y, wxMouseEvent &event );
     bool HandleMouseUp( int x, unsigned int y, wxMouseEvent &event );
-    void HandleKeyEvent( wxKeyEvent &event );
-    // Handle TAB and ESCAPE in control
-    bool HandleChildKey( wxKeyEvent& event );
+    void HandleKeyEvent( wxKeyEvent &event, bool fromChild );
 
     void OnMouseEntry( wxMouseEvent &event );
 
 
     void OnMouseEntry( wxMouseEvent &event );
 
@@ -1699,7 +2093,6 @@ protected:
     void OnMouseMoveChild( wxMouseEvent &event );
     void OnMouseUpChild( wxMouseEvent &event );
     void OnChildKeyDown( wxKeyEvent &event );
     void OnMouseMoveChild( wxMouseEvent &event );
     void OnMouseUpChild( wxMouseEvent &event );
     void OnChildKeyDown( wxKeyEvent &event );
-    void OnChildKeyUp( wxKeyEvent &event );
 
     void OnCaptureChange( wxMouseCaptureChangedEvent &event );
 
 
     void OnCaptureChange( wxMouseCaptureChangedEvent &event );
 
@@ -1707,8 +2100,15 @@ protected:
 
     void OnSysColourChanged( wxSysColourChangedEvent &event );
 
 
     void OnSysColourChanged( wxSysColourChangedEvent &event );
 
+    void OnTLPClose( wxCloseEvent& event );
+
 protected:
 
 protected:
 
+    bool AddToSelectionFromInputEvent( wxPGProperty* prop,
+                                       unsigned int colIndex,
+                                       wxMouseEvent* event = NULL,
+                                       int selFlags = 0 );
+
     /**
         Adjust the centering of the bitmap icons (collapse / expand) when the
         caption font changes.
     /**
         Adjust the centering of the bitmap icons (collapse / expand) when the
         caption font changes.
@@ -1728,46 +2128,20 @@ protected:
     */
     void CorrectEditorWidgetPosY();
 
     */
     void CorrectEditorWidgetPosY();
 
-#ifdef __WXDEBUG__
-    void _log_items();
-    void OnScreenNote( const wxChar* format, ... );
-#endif
-
-    /** Deselect current selection, if any. Returns true if success
-        (ie. validator did not intercept). */
-    bool DoClearSelection();
-
     int DoDrawItems( wxDC& dc,
     int DoDrawItems( wxDC& dc,
-                     const wxPGProperty* first_item,
-                     const wxPGProperty* last_item,
-                     const wxRect* clip_rect,
+                     const wxRect* itemsRect,
                      bool isBuffered ) const;
 
                      bool isBuffered ) const;
 
-    void DoSetPropertyValueUnspecified( wxPGProperty* p );
-
     /** Draws an expand/collapse (ie. +/-) button.
     */
     virtual void DrawExpanderButton( wxDC& dc, const wxRect& rect,
                                      wxPGProperty* property ) const;
 
     /** Draws items from topitemy to bottomitemy */
     /** Draws an expand/collapse (ie. +/-) button.
     */
     virtual void DrawExpanderButton( wxDC& dc, const wxRect& rect,
                                      wxPGProperty* property ) const;
 
     /** Draws items from topitemy to bottomitemy */
-    void DrawItems( wxDC& dc, unsigned int topitemy, unsigned int bottomitemy,
-                    const wxRect* clip_rect = (const wxRect*) NULL );
-
-    void DrawItems( const wxPGProperty* p1, const wxPGProperty* p2 );
-
-    void DrawItem( wxPGProperty* p )
-    {
-        DrawItems(p,p);
-    }
-
-    virtual void DrawItemAndChildren( wxPGProperty* p );
-
-    /**
-        Draws item, children, and consequtive parents as long as category is
-        not met.
-     */
-    void DrawItemAndValueRelated( wxPGProperty* p );
+    void DrawItems( wxDC& dc,
+                    unsigned int topItemY,
+                    unsigned int bottomItemY,
+                    const wxRect* itemsRect = NULL );
 
     // Translate wxKeyEvent to wxPG_ACTION_XXX
     int KeyEventToActions(wxKeyEvent &event, int* pSecond) const;
 
     // Translate wxKeyEvent to wxPG_ACTION_XXX
     int KeyEventToActions(wxKeyEvent &event, int* pSecond) const;
@@ -1786,15 +2160,36 @@ protected:
     /** Reloads all non-customized colours from system settings. */
     void RegainColours();
 
     /** Reloads all non-customized colours from system settings. */
     void RegainColours();
 
-    bool DoEditorValidate();
+    virtual bool DoEditorValidate();
 
 
-    wxPGProperty* DoGetItemAtY( int y ) const;
+    // Similar to DoSelectProperty() but also works on columns
+    // other than 1. Does not active editor if column is not
+    // editable.
+    bool DoSelectAndEdit( wxPGProperty* prop,
+                          unsigned int colIndex,
+                          unsigned int selFlags );
+
+    void DoSetSelection( const wxArrayPGProperty& newSelection,
+                         int selFlags = 0 );
 
 
-    void DoSetSplitterPosition_( int newxpos,
-                                 bool refresh = true,
-                                 int splitterIndex = 0,
-                                 bool allPages = false );
+    void DoSetSplitterPosition( int newxpos,
+                                int splitterIndex = 0,
+                                int flags = wxPG_SPLITTER_REFRESH );
 
 
+    bool DoAddToSelection( wxPGProperty* prop,
+                           int selFlags = 0 );
+
+    bool DoRemoveFromSelection( wxPGProperty* prop,
+                                int selFlags = 0 );
+
+    void DoBeginLabelEdit( unsigned int colIndex, int selFlags = 0 );
+    void DoEndLabelEdit( bool commit, int selFlags = 0 );
+    void OnLabelEditorEnterPress( wxCommandEvent& event );
+    void OnLabelEditorKeyPress( wxKeyEvent& event );
+
+    wxPGProperty* DoGetItemAtY( int y ) const;
+
+    void DestroyEditorWnd( wxWindow* wnd );
     void FreeEditors();
 
     virtual bool DoExpand( wxPGProperty* p, bool sendEvent = false );
     void FreeEditors();
 
     virtual bool DoExpand( wxPGProperty* p, bool sendEvent = false );
@@ -1808,48 +2203,50 @@ protected:
 
     static void RegisterDefaultEditors();
 
 
     static void RegisterDefaultEditors();
 
-    // Sets m_bgColIndex to this property and all its children.
-    void SetBackgroundColourIndex( wxPGProperty* p, int index );
-
-    // Sets m_fgColIndex to this property and all its children.
-    void SetTextColourIndex( wxPGProperty* p, int index, int flags );
-
-    int CacheColour( const wxColour& colour );
-
-    void DoSetPropertyName( wxPGProperty* p, const wxString& newname );
-
-    // Setups event handling for child control
-    void SetupEventHandling( wxWindow* wnd, int id );
+    // Sets up basic event handling for child control
+    void SetupChildEventHandling( wxWindow* wnd );
 
     void CustomSetCursor( int type, bool override = false );
 
 
     void CustomSetCursor( int type, bool override = false );
 
-    virtual bool ProcessEvent(wxEvent& event);
-    virtual void SetWindowStyleFlag( long style );
-
     /**
         Repositions scrollbar and underlying panel according to changed virtual
         size.
     */
     void RecalculateVirtualSize( int forceXPos = -1 );
 
     /**
         Repositions scrollbar and underlying panel according to changed virtual
         size.
     */
     void RecalculateVirtualSize( int forceXPos = -1 );
 
+    void SetEditorAppearance( const wxPGCell& cell,
+                              bool unspecified = false );
+
+    void ResetEditorAppearance()
+    {
+        wxPGCell cell;
+        cell.SetEmptyData();
+        SetEditorAppearance(cell, false);
+    }
+
     void PrepareAfterItemsAdded();
 
     void PrepareAfterItemsAdded();
 
-    bool SendEvent( int eventType,
-                    wxPGProperty* p,
+    /**
+        Send event from the property grid.
+
+        Omit the wxPG_SEL_NOVALIDATE flag to allow vetoing the event
+    */
+    bool SendEvent( int eventType, wxPGProperty* p,
                     wxVariant* pValue = NULL,
                     wxVariant* pValue = NULL,
-                    unsigned int selFlags = 0 );
+                    unsigned int selFlags = wxPG_SEL_NOVALIDATE,
+                    unsigned int column = 1 );
+
+    // This function only moves focus to the wxPropertyGrid if it already
+    // was on one of its child controls.
+    void SetFocusOnCanvas();
 
     bool DoHideProperty( wxPGProperty* p, bool hide, int flags );
 
 private:
 
 
     bool DoHideProperty( wxPGProperty* p, bool hide, int flags );
 
 private:
 
-    bool ButtonTriggerKeyTest( wxKeyEvent &event );
-
-#endif // DOXYGEN_SHOULD_SKIP_THIS
+    bool ButtonTriggerKeyTest( int action, wxKeyEvent& event );
 
 
-private:
     DECLARE_EVENT_TABLE()
     DECLARE_EVENT_TABLE()
-#endif // #ifndef SWIG
 };
 
 // -----------------------------------------------------------------------
 };
 
 // -----------------------------------------------------------------------
@@ -1857,7 +2254,6 @@ private:
 // Bunch of inlines that need to resolved after all classes have been defined.
 //
 
 // Bunch of inlines that need to resolved after all classes have been defined.
 //
 
-#ifndef SWIG
 inline bool wxPropertyGridPageState::IsDisplayed() const
 {
     return ( this == m_pPropGrid->GetState() );
 inline bool wxPropertyGridPageState::IsDisplayed() const
 {
     return ( this == m_pPropGrid->GetState() );
@@ -1867,32 +2263,42 @@ inline unsigned int wxPropertyGridPageState::GetActualVirtualHeight() const
 {
     return DoGetRoot()->GetChildrenHeight(GetGrid()->GetRowHeight());
 }
 {
     return DoGetRoot()->GetChildrenHeight(GetGrid()->GetRowHeight());
 }
+
+inline wxString wxPGProperty::GetHintText() const
+{
+    wxVariant vHintText = GetAttribute(wxPGGlobalVars->m_strHint);
+
+#if wxPG_COMPATIBILITY_1_4
+    // Try the old, deprecated "InlineHelp"
+    if ( vHintText.IsNull() )
+        vHintText = GetAttribute(wxPGGlobalVars->m_strInlineHelp);
 #endif
 
 #endif
 
+    if ( !vHintText.IsNull() )
+        return vHintText.GetString();
+
+    return wxEmptyString;
+}
+
 inline int wxPGProperty::GetDisplayedCommonValueCount() const
 {
     if ( HasFlag(wxPG_PROP_USES_COMMON_VALUE) )
     {
         wxPropertyGrid* pg = GetGrid();
         if ( pg )
 inline int wxPGProperty::GetDisplayedCommonValueCount() const
 {
     if ( HasFlag(wxPG_PROP_USES_COMMON_VALUE) )
     {
         wxPropertyGrid* pg = GetGrid();
         if ( pg )
-            return pg->GetCommonValueCount();
+            return (int) pg->GetCommonValueCount();
     }
     return 0;
 }
 
     }
     return 0;
 }
 
-inline void wxPGProperty::SetEditor( const wxString& editorName )
+inline void wxPGProperty::SetDefaultValue( wxVariant& value )
 {
 {
-    m_customEditor = wxPropertyGridInterface::GetEditorByName(editorName);
+    SetAttribute(wxPG_ATTR_DEFAULT_VALUE, value);
 }
 
 }
 
-inline void wxPGProperty::SetName( const wxString& newName )
-{
-    GetGrid()->SetPropertyName(this, newName);
-}
-
-inline bool wxPGProperty::Hide( bool hide, int flags )
+inline void wxPGProperty::SetEditor( const wxString& editorName )
 {
 {
-    return GetGrid()->HideProperty(this, hide, flags);
+    m_customEditor = wxPropertyGridInterface::GetEditorByName(editorName);
 }
 
 inline bool wxPGProperty::SetMaxLength( int maxLen )
 }
 
 inline bool wxPGProperty::SetMaxLength( int maxLen )
@@ -1902,22 +2308,30 @@ inline bool wxPGProperty::SetMaxLength( int maxLen )
 
 // -----------------------------------------------------------------------
 
 
 // -----------------------------------------------------------------------
 
+#define wxPG_BASE_EVT_PRE_ID     1775
 
 #ifndef SWIG
 
 
 #ifndef SWIG
 
-#define wxPG_BASE_EVT_PRE_ID     1775
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_SELECTED, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_CHANGING, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_CHANGED, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_HIGHLIGHTED, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_RIGHT_CLICK, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_PAGE_CHANGED, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_ITEM_COLLAPSED, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_ITEM_EXPANDED, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_DOUBLE_CLICK, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID,
+                          wxEVT_PG_LABEL_EDIT_BEGIN, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID,
+                          wxEVT_PG_LABEL_EDIT_ENDING, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID,
+                          wxEVT_PG_COL_BEGIN_DRAG, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID,
+                          wxEVT_PG_COL_DRAGGING, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID,
+                          wxEVT_PG_COL_END_DRAG, wxPropertyGridEvent );
 
 
-BEGIN_DECLARE_EVENT_TYPES()
-    DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_SELECTED,           wxPG_BASE_EVT_PRE_ID)
-    DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_CHANGING,           wxPG_BASE_EVT_PRE_ID+1)
-    DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_CHANGED,            wxPG_BASE_EVT_PRE_ID+2)
-    DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_HIGHLIGHTED,        wxPG_BASE_EVT_PRE_ID+3)
-    DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_RIGHT_CLICK,        wxPG_BASE_EVT_PRE_ID+4)
-    DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_PAGE_CHANGED,       wxPG_BASE_EVT_PRE_ID+5)
-    DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_ITEM_COLLAPSED,     wxPG_BASE_EVT_PRE_ID+6)
-    DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_ITEM_EXPANDED,      wxPG_BASE_EVT_PRE_ID+7)
-    DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PROPGRID, wxEVT_PG_DOUBLE_CLICK,       wxPG_BASE_EVT_PRE_ID+8)
-END_DECLARE_EVENT_TYPES()
 #else
     enum {
         wxEVT_PG_SELECTED = wxPG_BASE_EVT_PRE_ID,
 #else
     enum {
         wxEVT_PG_SELECTED = wxPG_BASE_EVT_PRE_ID,
@@ -1928,7 +2342,12 @@ END_DECLARE_EVENT_TYPES()
         wxEVT_PG_PAGE_CHANGED,
         wxEVT_PG_ITEM_COLLAPSED,
         wxEVT_PG_ITEM_EXPANDED,
         wxEVT_PG_PAGE_CHANGED,
         wxEVT_PG_ITEM_COLLAPSED,
         wxEVT_PG_ITEM_EXPANDED,
-        wxEVT_PG_DOUBLE_CLICK
+        wxEVT_PG_DOUBLE_CLICK,
+        wxEVT_PG_LABEL_EDIT_BEGIN,
+        wxEVT_PG_LABEL_EDIT_ENDING,
+        wxEVT_PG_COL_BEGIN_DRAG,
+        wxEVT_PG_COL_DRAGGING,
+        wxEVT_PG_COL_END_DRAG
     };
 #endif
 
     };
 #endif
 
@@ -1940,18 +2359,23 @@ END_DECLARE_EVENT_TYPES()
 #ifndef SWIG
 typedef void (wxEvtHandler::*wxPropertyGridEventFunction)(wxPropertyGridEvent&);
 
 #ifndef SWIG
 typedef void (wxEvtHandler::*wxPropertyGridEventFunction)(wxPropertyGridEvent&);
 
-#define EVT_PG_SELECTED(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_SELECTED, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
-#define EVT_PG_CHANGING(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_CHANGING, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
-#define EVT_PG_CHANGED(id, fn)               DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
-#define EVT_PG_HIGHLIGHTED(id, fn)           DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_HIGHLIGHTED, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
-#define EVT_PG_RIGHT_CLICK(id, fn)           DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_RIGHT_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
-#define EVT_PG_DOUBLE_CLICK(id, fn)          DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_DOUBLE_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
-#define EVT_PG_PAGE_CHANGED(id, fn)          DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_PAGE_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
-#define EVT_PG_ITEM_COLLAPSED(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_COLLAPSED, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
-#define EVT_PG_ITEM_EXPANDED(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_EXPANDED, id, -1, (wxObjectEventFunction) (wxEventFunction)  wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
-
-#define wxPropertyGridEventHandler(A) \
-    ((wxObjectEventFunction)(wxEventFunction)(wxPropertyGridEventFunction)&A)
+#define EVT_PG_SELECTED(id, fn)              wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_SELECTED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_CHANGING(id, fn)              wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_CHANGING, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_CHANGED(id, fn)               wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_CHANGED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_HIGHLIGHTED(id, fn)           wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_HIGHLIGHTED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_RIGHT_CLICK(id, fn)           wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_RIGHT_CLICK, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_DOUBLE_CLICK(id, fn)          wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_DOUBLE_CLICK, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_PAGE_CHANGED(id, fn)          wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_PAGE_CHANGED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_ITEM_COLLAPSED(id, fn)        wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_COLLAPSED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_ITEM_EXPANDED(id, fn)         wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_EXPANDED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_LABEL_EDIT_BEGIN(id, fn)      wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_LABEL_EDIT_BEGIN, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_LABEL_EDIT_ENDING(id, fn)     wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_LABEL_EDIT_ENDING, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_COL_BEGIN_DRAG(id, fn)        wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_BEGIN_DRAG, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_COL_DRAGGING(id, fn)          wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_DRAGGING, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_COL_END_DRAG(id, fn)          wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_END_DRAG, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+
+#define wxPropertyGridEventHandler(fn) \
+    wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn )
 
 #endif
 
 
 #endif
 
@@ -1970,16 +2394,26 @@ public:
 
     /** Constructor. */
     wxPropertyGridEvent(wxEventType commandType=0, int id=0);
 
     /** Constructor. */
     wxPropertyGridEvent(wxEventType commandType=0, int id=0);
-#ifndef SWIG
+
     /** Copy constructor. */
     wxPropertyGridEvent(const wxPropertyGridEvent& event);
     /** Copy constructor. */
     wxPropertyGridEvent(const wxPropertyGridEvent& event);
-#endif
+
     /** Destructor. */
     ~wxPropertyGridEvent();
 
     /** Copyer. */
     virtual wxEvent* Clone() const;
 
     /** Destructor. */
     ~wxPropertyGridEvent();
 
     /** Copyer. */
     virtual wxEvent* Clone() const;
 
+    /**
+        Returns the column index associated with this event.
+        For the column dragging events, it is the column to the left
+        of the splitter being dragged
+    */
+    unsigned int GetColumn() const
+    {
+        return m_column;
+    }
+
     wxPGProperty* GetMainParent() const
     {
         wxASSERT(m_property);
     wxPGProperty* GetMainParent() const
     {
         wxASSERT(m_property);
@@ -1998,9 +2432,6 @@ public:
         return *m_validationInfo;
     }
 
         return *m_validationInfo;
     }
 
-    /** Returns true if event has associated property. */
-    bool HasProperty() const { return ( m_property != (wxPGProperty*) NULL ); }
-
     /** Returns true if you can veto the action that the event is signaling.
     */
     bool CanVeto() const { return m_canVeto; }
     /** Returns true if you can veto the action that the event is signaling.
     */
     bool CanVeto() const { return m_canVeto; }
@@ -2016,26 +2447,55 @@ public:
     */
     void Veto( bool veto = true ) { m_wasVetoed = veto; }
 
     */
     void Veto( bool veto = true ) { m_wasVetoed = veto; }
 
-    /** Returns value that is about to be set for wxEVT_PG_CHANGING.
+    /**
+        Returns name of the associated property.
+
+        @remarks Property name is stored in event, so it remains
+                 accessible even after the associated property or
+                 the property grid has been deleted.
+    */
+    wxString GetPropertyName() const
+    {
+        return m_propertyName;
+    }
+
+    /**
+        Returns value of the associated property. Works for all event
+        types, but for wxEVT_PG_CHANGING this member function returns
+        the value that is pending, so you can call Veto() if the
+        value is not satisfactory.
+
+        @remarks Property value is stored in event, so it remains
+                 accessible even after the associated property or
+                 the property grid has been deleted.
+    */
+    wxVariant GetPropertyValue() const
+    {
+        if ( m_validationInfo )
+            return m_validationInfo->GetValue();
+        return m_value;
+    }
+
+    /**
+        Returns value of the associated property.
+
+        @see GetPropertyValue
     */
     */
-    const wxVariant& GetValue() const
+    wxVariant GetValue() const
     {
     {
-        wxASSERT_MSG( m_validationInfo,
-                      "Only call GetValue from a handler "
-                      "of event type that supports it" );
-        return *m_validationInfo->m_pValue;
+        return GetPropertyValue();
     }
 
     /**
     }
 
     /**
-        Set override validation failure behavior.
+        Set override validation failure behaviour.
 
         Only effective if Veto was also called, and only allowed if event type
         is wxEVT_PG_CHANGING.
     */
 
         Only effective if Veto was also called, and only allowed if event type
         is wxEVT_PG_CHANGING.
     */
-    void SetValidationFailureBehavior( int flags )
+    void SetValidationFailureBehavior( wxPGVFBFlags flags )
     {
         wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
     {
         wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
-        m_validationInfo->m_failureBehavior = (wxPGVFBFlags) flags;
+        m_validationInfo->SetFailureBehavior( flags );
     }
 
     /** Sets custom failure message for this time only. Only applies if
     }
 
     /** Sets custom failure message for this time only. Only applies if
@@ -2044,43 +2504,66 @@ public:
     void SetValidationFailureMessage( const wxString& message )
     {
         wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
     void SetValidationFailureMessage( const wxString& message )
     {
         wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
-        m_validationInfo->m_failureMessage = message;
+        m_validationInfo->SetFailureMessage( message );
     }
 
     }
 
-#ifndef SWIG
     wxPGVFBFlags GetValidationFailureBehavior() const
     {
         wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
     wxPGVFBFlags GetValidationFailureBehavior() const
     {
         wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
-        return m_validationInfo->m_failureBehavior;
+        return m_validationInfo->GetFailureBehavior();
+    }
+
+    void SetColumn( unsigned int column )
+    {
+        m_column = column;
     }
 
     void SetCanVeto( bool canVeto ) { m_canVeto = canVeto; }
     bool WasVetoed() const { return m_wasVetoed; }
 
     /** Changes the associated property. */
     }
 
     void SetCanVeto( bool canVeto ) { m_canVeto = canVeto; }
     bool WasVetoed() const { return m_wasVetoed; }
 
     /** Changes the associated property. */
-    void SetProperty( wxPGProperty* p ) { m_property = p; }
+    void SetProperty( wxPGProperty* p )
+    {
+        m_property = p;
+        if ( p )
+            m_propertyName = p->GetName();
+    }
 
 
-    void SetPropertyGrid( wxPropertyGrid* pg ) { m_pg = pg; }
+    void SetPropertyValue( wxVariant value )
+    {
+        m_value = value;
+    }
+
+    void SetPropertyGrid( wxPropertyGrid* pg )
+    {
+        m_pg = pg;
+        OnPropertyGridSet();
+    }
 
     void SetupValidationInfo()
     {
         wxASSERT(m_pg);
         wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
         m_validationInfo = &m_pg->GetValidationInfo();
 
     void SetupValidationInfo()
     {
         wxASSERT(m_pg);
         wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
         m_validationInfo = &m_pg->GetValidationInfo();
+        m_value = m_validationInfo->GetValue();
     }
 
 private:
     void Init();
     }
 
 private:
     void Init();
+    void OnPropertyGridSet();
     DECLARE_DYNAMIC_CLASS(wxPropertyGridEvent)
 
     wxPGProperty*       m_property;
     wxPropertyGrid*     m_pg;
     wxPGValidationInfo* m_validationInfo;
 
     DECLARE_DYNAMIC_CLASS(wxPropertyGridEvent)
 
     wxPGProperty*       m_property;
     wxPropertyGrid*     m_pg;
     wxPGValidationInfo* m_validationInfo;
 
+    wxString            m_propertyName;
+    wxVariant           m_value;
+
+    unsigned int        m_column;
+
     bool                m_canVeto;
     bool                m_wasVetoed;
     bool                m_canVeto;
     bool                m_wasVetoed;
-
-#endif
 };
 
 
 };
 
 
@@ -2201,22 +2684,16 @@ protected:
     #undef wxPG_FL_MOUSE_CAPTURED
     #undef wxPG_FL_INITIALIZED
     #undef wxPG_FL_ACTIVATION_BY_CLICK
     #undef wxPG_FL_MOUSE_CAPTURED
     #undef wxPG_FL_INITIALIZED
     #undef wxPG_FL_ACTIVATION_BY_CLICK
-    #undef wxPG_FL_DONT_CENTER_SPLITTER
     #undef wxPG_SUPPORT_TOOLTIPS
     #undef wxPG_SUPPORT_TOOLTIPS
-    #undef wxPG_DOUBLE_BUFFER
     #undef wxPG_ICON_WIDTH
     #undef wxPG_USE_RENDERER_NATIVE
 // Following are needed by the manager headers
 //    #undef const wxString&
 #endif
 
     #undef wxPG_ICON_WIDTH
     #undef wxPG_USE_RENDERER_NATIVE
 // Following are needed by the manager headers
 //    #undef const wxString&
 #endif
 
-// Doxygen special
-#ifdef DOXYGEN
-    #include "wx/propgrid/editor.h"
-    #include "wx/propgrid/manager.h"
-#endif
-
 // -----------------------------------------------------------------------
 
 // -----------------------------------------------------------------------
 
+#endif
+
 #endif // _WX_PROPGRID_PROPGRID_H_
 
 #endif // _WX_PROPGRID_PROPGRID_H_