X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5fdb6350921035ace3d9619bd2d36f776d0653ef..534090e354ebd5b4c42e6c27a6aa6073c0ef669e:/include/wx/propgrid/propgrid.h diff --git a/include/wx/propgrid/propgrid.h b/include/wx/propgrid/propgrid.h index 974fd034cd..90b8ba9004 100644 --- a/include/wx/propgrid/propgrid.h +++ b/include/wx/propgrid/propgrid.h @@ -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 m_commonValues; + // array of live events + wxVector 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