]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/propgrid/propgrid.h
Replaced 'InlineHelp' property attribute with 'Hint'; Use SetHint() wxTextCtrl and...
[wxWidgets.git] / include / wx / propgrid / propgrid.h
index 974fd034cd2c15c20c18ebd1a5e84651808f6236..90b8ba90041de9eef71938050cba5be5fc7ae7e2 100644 (file)
@@ -14,6 +14,7 @@
 
 #if wxUSE_PROPGRID
 
+#include "wx/thread.h"
 #include "wx/dcclient.h"
 #include "wx/scrolwin.h"
 #include "wx/tooltip.h"
@@ -43,6 +44,14 @@ public:
     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;
 
@@ -78,7 +87,10 @@ public:
     wxPGCachedString    m_strMin;
     wxPGCachedString    m_strMax;
     wxPGCachedString    m_strUnits;
+    wxPGCachedString    m_strHint;
+#if wxPG_COMPATIBILITY_1_4
     wxPGCachedString    m_strInlineHelp;
+#endif
 
     // If true then some things are automatically translated
     bool                m_autoGetTranslation;
@@ -181,10 +193,21 @@ wxPG_TOOLBAR                        = 0x00001000,
 /** 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
 {
 
@@ -247,10 +270,48 @@ wxPG_EX_WRITEONLY_BUILTIN_ATTRIBUTES    = 0x00400000,
 
 /** Hides page selection buttons from toolbar.
 */
-wxPG_EX_HIDE_PAGE_BUTTONS               = 0x01000000
+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,
+
+/**
+    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_ENABLE_TLP_TRACKING             = 0x04000000,
+
+/** Don't show divider above toolbar, on Windows.
+*/
+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)
@@ -371,7 +432,7 @@ public:
     /**
         Returns reference to pending value.
     */
-    const wxVariant& GetValue() const
+    wxVariant& GetValue()
     {
         wxASSERT(m_pValue);
         return *m_pValue;
@@ -435,21 +496,35 @@ enum wxPG_KEYBOARD_ACTIONS
 // wxPropertyGrid::DoSelectProperty flags (selFlags)
 
 // Focuses to created editor
-#define wxPG_SEL_FOCUS                  0x01
+#define wxPG_SEL_FOCUS                  0x0001
 // Forces deletion and recreation of editor
-#define wxPG_SEL_FORCE                  0x02
+#define wxPG_SEL_FORCE                  0x0002
 // For example, doesn't cause EnsureVisible
-#define wxPG_SEL_NONVISIBLE             0x04
+#define wxPG_SEL_NONVISIBLE             0x0004
 // 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
-#define wxPG_SEL_DELETING               0x10
+#define wxPG_SEL_DELETING               0x0010
 // 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
-#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        0x80
+#define wxPG_SEL_DONT_SEND_EVENT        0x0080
+// Don't make any graphics updates
+#define wxPG_SEL_NO_REFRESH             0x0100
+
+// -----------------------------------------------------------------------
+
+// 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
+};
 
 
 // -----------------------------------------------------------------------
@@ -490,8 +565,6 @@ enum wxPG_KEYBOARD_ACTIONS
 #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
 // Auto sort is enabled (for categorized mode)
@@ -570,6 +643,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_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
@@ -584,10 +676,11 @@ enum wxPG_KEYBOARD_ACTIONS
 class WXDLLIMPEXP_PROPGRID
     wxPropertyGrid : public wxScrolledWindow, public wxPropertyGridInterface
 {
+    friend class wxPropertyGridEvent;
     friend class wxPropertyGridPageState;
     friend class wxPropertyGridInterface;
     friend class wxPropertyGridManager;
-    friend class wxPGCanvas;
+    friend class wxPGHeaderCtrl;
 
     DECLARE_DYNAMIC_CLASS(wxPropertyGrid)
 public:
@@ -746,9 +839,9 @@ public:
         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. */
@@ -820,6 +913,9 @@ public:
     /** Returns background colour of margin. */
     wxColour GetMarginColour() const { return m_colMargin; }
 
+    /** Returns margin width. */
+    int GetMarginWidth() const { return m_marginWidth; }
+
     /**
         Returns most up-to-date value of selected property. This will return
         value different from GetSelectedProperty()->GetValue() only when text
@@ -839,12 +935,6 @@ public:
     /** Returns currently selected property. */
     wxPGProperty* GetSelectedProperty() const { return GetSelection(); }
 
-    /** Returns currently selected property. */
-    wxPGProperty* GetSelection() const
-    {
-        return m_selected;
-    }
-
     /** Returns current selection background colour. */
     wxColour GetSelectionBackgroundColour() const { return m_colSelBack; }
 
@@ -953,10 +1043,94 @@ public:
                  wxEVT_PG_SELECTED. In wxWidgets 2.9 and later, it no longer
                  does that.
 
-        @see wxPropertyGrid::Unselect
+        @remarks This clears any previous selection.
     */
     bool SelectProperty( wxPGPropArg id, bool focus = false );
 
+    /**
+        Set entire new selection from given list of properties.
+    */
+    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)
+        return DoAddToSelection(p, wxPG_SEL_DONT_SEND_EVENT);
+    }
+
+    /**
+        Removes given property from selection. If property is not selected,
+        an assertion failure will occur.
+    */
+    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);
 
@@ -1024,10 +1198,9 @@ public:
         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);
     }
 
     /**
@@ -1069,6 +1242,41 @@ public:
         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 );
@@ -1156,6 +1364,7 @@ public:
         shown).
     */
     void FixPosForTextCtrl( wxWindow* ctrl,
+                            unsigned int forColumn = 1,
                             const wxPoint& offset = wxPoint(0, 0) );
 
     /** Shortcut for creating text editor widget.
@@ -1179,7 +1388,8 @@ public:
                                       const wxString& value,
                                       wxWindow* secondary,
                                       int extraStyle = 0,
-                                      int maxLen = 0 );
+                                      int maxLen = 0,
+                                      unsigned int forColumn = 1 );
 
     /* Generates both textctrl and button.
     */
@@ -1443,7 +1653,6 @@ public:
 
     //
     // Public methods for semi-public use
-    // (not protected for optimization)
     //
     bool DoSelectProperty( wxPGProperty* p, unsigned int flags = 0 );
 
@@ -1476,9 +1685,6 @@ protected:
     wxWindow            *m_wndEditor;
     wxWindow            *m_wndEditor2;
 
-    /** wxPGCanvas instance. */
-    wxPanel             *m_canvas;
-
 #if wxPG_DOUBLE_BUFFER
     wxBitmap            *m_doubleBuffer;
 #endif
@@ -1588,6 +1794,12 @@ protected:
     /** 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;
+
     //
     // Temporary values
     //
@@ -1635,15 +1847,18 @@ protected:
     /** 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;
 
+    // Active label editor
+    wxTextCtrl*         m_labelEditor;
+
+    // For which property the label editor is active
+    wxPGProperty*       m_labelEditorProperty;
+
     // EventObject for wxPropertyGridEvents
     wxWindow*           m_eventObject;
 
@@ -1651,6 +1866,9 @@ protected:
     // handling mess).
     wxWindow*           m_curFocused;
 
+    // Event currently being sent - NULL if none at the moment
+    wxPropertyGridEvent*    m_processedEvent;
+
     // Last known top-level parent
     wxWindow*           m_tlp;
 
@@ -1665,8 +1883,9 @@ protected:
 
     // y coordinate of property that mouse hovering
     int                 m_propHoverY;
+
     // 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;
@@ -1707,6 +1926,9 @@ protected:
     // labels when properties use common values
     wxVector<wxPGCommonValue*>  m_commonValues;
 
+    // array of live events
+    wxVector<wxPropertyGridEvent*>  m_liveEvents;
+
     // Which cv selection really sets value to unspecified?
     int                 m_cvUnspecified;
 
@@ -1725,7 +1947,6 @@ protected:
 
     // main event receivers
     void OnMouseMove( wxMouseEvent &event );
-    void OnMouseMoveBottom( wxMouseEvent &event );
     void OnMouseClick( wxMouseEvent &event );
     void OnMouseRightClick( wxMouseEvent &event );
     void OnMouseDoubleClick( wxMouseEvent &event );
@@ -1767,6 +1988,11 @@ 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.
@@ -1786,16 +2012,8 @@ protected:
     */
     void CorrectEditorWidgetPosY();
 
-    /** Deselect current selection, if any. Returns true if success
-        (ie. validator did not intercept).
-
-        Unlike ClearSelection(), DoClearSelection() sends the
-        wxEVT_PG_SELECTED event.
-    */
-    bool DoClearSelection();
-
     int DoDrawItems( wxDC& dc,
-                     const wxRect* clipRect,
+                     const wxRect* drawRect,
                      bool isBuffered ) const;
 
     /** Draws an expand/collapse (ie. +/-) button.
@@ -1804,8 +2022,10 @@ protected:
                                      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( wxDC& dc,
+                    unsigned int topItemY,
+                    unsigned int bottomItemY,
+                    const wxRect* drawRect = NULL );
 
     // Translate wxKeyEvent to wxPG_ACTION_XXX
     int KeyEventToActions(wxKeyEvent &event, int* pSecond) const;
@@ -1826,13 +2046,34 @@ protected:
 
     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,
+                                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 );
 
-    void DoSetSplitterPosition_( int newxpos,
-                                 bool refresh = true,
-                                 int splitterIndex = 0,
-                                 bool allPages = false );
+    wxPGProperty* DoGetItemAtY( int y ) const;
 
+    void DestroyEditorWnd( wxWindow* wnd );
     void FreeEditors();
 
     virtual bool DoExpand( wxPGProperty* p, bool sendEvent = false );
@@ -1857,12 +2098,27 @@ protected:
     */
     void RecalculateVirtualSize( int forceXPos = -1 );
 
+    void SetEditorAppearance( const wxPGCell& cell,
+                              bool unspecified = false );
+
+    void ResetEditorAppearance()
+    {
+        wxPGCell cell;
+        cell.SetEmptyData();
+        SetEditorAppearance(cell, false);
+    }
+
     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,
-                    unsigned int selFlags = 0 );
+                    unsigned int selFlags = wxPG_SEL_NOVALIDATE,
+                    unsigned int column = 1 );
 
     void SetFocusOnCanvas();
 
@@ -1893,6 +2149,22 @@ inline unsigned int wxPropertyGridPageState::GetActualVirtualHeight() const
 }
 #endif
 
+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
+
+    if ( !vHintText.IsNull() )
+        return vHintText.GetString();
+
+    return wxEmptyString;
+}
+
 inline int wxPGProperty::GetDisplayedCommonValueCount() const
 {
     if ( HasFlag(wxPG_PROP_USES_COMMON_VALUE) )
@@ -1939,6 +2211,16 @@ wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_PAGE_CHANGED, wxPropert
 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 );
 
 #else
     enum {
@@ -1950,7 +2232,12 @@ wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_DOUBLE_CLICK, wxPropert
         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
 
@@ -1971,6 +2258,11 @@ typedef void (wxEvtHandler::*wxPropertyGridEventFunction)(wxPropertyGridEvent&);
 #define EVT_PG_PAGE_CHANGED(id, fn)          DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_PAGE_CHANGED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
 #define EVT_PG_ITEM_COLLAPSED(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_COLLAPSED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
 #define EVT_PG_ITEM_EXPANDED(id, fn)         DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_EXPANDED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_LABEL_EDIT_BEGIN(id, fn)      DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_LABEL_EDIT_BEGIN, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_LABEL_EDIT_ENDING(id, fn)     DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_LABEL_EDIT_ENDING, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_COL_BEGIN_DRAG(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_BEGIN_DRAG, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_COL_DRAGGING(id, fn)          DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_DRAGGING, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_COL_END_DRAG(id, fn)          DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_END_DRAG, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
 
 #define wxPropertyGridEventHandler(fn) \
     wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn )
@@ -2002,6 +2294,16 @@ public:
     /** 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);
@@ -2035,14 +2337,43 @@ public:
     */
     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.
     */
-    const wxVariant& GetValue() const
+    wxVariant GetPropertyValue() const
     {
-        wxASSERT_MSG( m_validationInfo,
-                      "Only call GetValue from a handler "
-                      "of event type that supports it" );
-        return m_validationInfo->GetValue();
+        if ( m_validationInfo )
+            return m_validationInfo->GetValue();
+        return m_value;
+    }
+
+    /**
+        Returns value of the associated property.
+
+        @see GetPropertyValue
+    */
+    wxVariant GetValue() const
+    {
+        return GetPropertyValue();
     }
 
     /**
@@ -2073,29 +2404,55 @@ public:
         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 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();
+        m_value = m_validationInfo->GetValue();
     }
 
 private:
     void Init();
+    void OnPropertyGridSet();
     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;
 
@@ -2220,7 +2577,6 @@ protected:
     #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_DOUBLE_BUFFER
     #undef wxPG_ICON_WIDTH