From 01b5ad3b500627ae3ebadc755f47c816a859e6bb Mon Sep 17 00:00:00 2001 From: Jaakko Salli Date: Tue, 11 Aug 2009 16:53:05 +0000 Subject: [PATCH] Do not generate wxEVT_PG_SELECTED with direct ClearSelection() and SelectProperty() calls git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61644 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/propgrid/propgrid.h | 44 +++++++++++++++++---------- include/wx/propgrid/propgridiface.h | 6 +++- interface/wx/propgrid/manager.h | 7 ++++- interface/wx/propgrid/propgrid.h | 16 +++++++--- interface/wx/propgrid/propgridiface.h | 6 ++++ src/propgrid/propgrid.cpp | 33 ++++++++++++++------ src/propgrid/propgridiface.cpp | 10 +++--- 7 files changed, 84 insertions(+), 38 deletions(-) diff --git a/include/wx/propgrid/propgrid.h b/include/wx/propgrid/propgrid.h index 6ebd16505d..d9744d8173 100644 --- a/include/wx/propgrid/propgrid.h +++ b/include/wx/propgrid/propgrid.h @@ -435,19 +435,21 @@ enum wxPG_KEYBOARD_ACTIONS // wxPropertyGrid::DoSelectProperty flags (selFlags) // Focuses to created editor -#define wxPG_SEL_FOCUS 0x01 +#define wxPG_SEL_FOCUS 0x01 // Forces deletion and recreation of editor -#define wxPG_SEL_FORCE 0x02 +#define wxPG_SEL_FORCE 0x02 // For example, doesn't cause EnsureVisible -#define wxPG_SEL_NONVISIBLE 0x04 +#define wxPG_SEL_NONVISIBLE 0x04 // Do not validate editor's value before selecting -#define wxPG_SEL_NOVALIDATE 0x08 +#define wxPG_SEL_NOVALIDATE 0x08 // Property being deselected is about to be deleted -#define wxPG_SEL_DELETING 0x10 +#define wxPG_SEL_DELETING 0x10 // Property's values was set to unspecified by the user -#define wxPG_SEL_SETUNSPEC 0x20 +#define wxPG_SEL_SETUNSPEC 0x20 // Property's event handler changed the value -#define wxPG_SEL_DIALOGVAL 0x40 +#define wxPG_SEL_DIALOGVAL 0x40 +// Set to disable sending of wxEVT_PG_SELECTED event +#define wxPG_SEL_DONT_SEND_EVENT 0x80 // ----------------------------------------------------------------------- @@ -542,8 +544,11 @@ enum wxPG_KEYBOARD_ACTIONS @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() @@ -935,19 +940,22 @@ public: /** 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. + @return True if selection finished successfully. Usually only fails if current value in editor is not valid. + + @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. + @see wxPropertyGrid::Unselect */ - bool SelectProperty( wxPGPropArg id, bool focus = false ) - { - wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false) - return DoSelectProperty(p,focus?wxPG_SEL_FOCUS:0); - } + bool SelectProperty( wxPGPropArg id, bool focus = false ); /** Sets category caption background colour. */ void SetCaptionBackgroundColour(const wxColour& col); @@ -1779,7 +1787,11 @@ protected: void CorrectEditorWidgetPosY(); /** Deselect current selection, if any. Returns true if success - (ie. validator did not intercept). */ + (ie. validator did not intercept). + + Unlike ClearSelection(), DoClearSelection() sends the + wxEVT_PG_SELECTED event. + */ bool DoClearSelection(); int DoDrawItems( wxDC& dc, diff --git a/include/wx/propgrid/propgridiface.h b/include/wx/propgrid/propgridiface.h index 88474fd569..e7bbd29a0a 100644 --- a/include/wx/propgrid/propgridiface.h +++ b/include/wx/propgrid/propgridiface.h @@ -210,8 +210,12 @@ public: @return Returns @true if successful or if there was no selection. May fail if validation was enabled and active editor had invalid value. + + @remarks In wxPropertyGrid 1.4, this member function used to send + wxPG_EVT_SELECTED. In wxWidgets 2.9 and later, it no longer + does that. */ - bool ClearSelection( bool validation = false); + bool ClearSelection( bool validation = false ); /** Resets modified status of all properties. */ diff --git a/interface/wx/propgrid/manager.h b/interface/wx/propgrid/manager.h index f867108b36..ff4a39314a 100644 --- a/interface/wx/propgrid/manager.h +++ b/interface/wx/propgrid/manager.h @@ -411,7 +411,12 @@ public: /** Select and displays a given page. */ void SelectPage( wxPropertyGridPage* page ); - /** Select a property. */ + /** + Select a property. + + @see wxPropertyGrid::SelectProperty(), + wxPropertyGridInterface::ClearSelection() + */ bool SelectProperty( wxPGPropArg id, bool focus = false ); /** diff --git a/interface/wx/propgrid/propgrid.h b/interface/wx/propgrid/propgrid.h index 3709af9cef..42366a011c 100644 --- a/interface/wx/propgrid/propgrid.h +++ b/interface/wx/propgrid/propgrid.h @@ -320,8 +320,11 @@ typedef int (*wxPGSortCallback)(wxPropertyGrid* propGrid, @beginEventEmissionTable{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() @@ -707,8 +710,7 @@ public: /** Selects a property. Editor widget is automatically created, but - not focused unless focus is true. This will generate wxEVT_PG_SELECT - event. + not focused unless focus is true. @param id Property to select (name or pointer). @@ -719,7 +721,11 @@ public: @return returns @true if selection finished successfully. Usually only fails if current value in editor is not valid. - @see wxPropertyGrid::ClearSelection() + @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. + + @see wxPropertyGridInterface::ClearSelection() */ bool SelectProperty( wxPGPropArg id, bool focus = false ); diff --git a/interface/wx/propgrid/propgridiface.h b/interface/wx/propgrid/propgridiface.h index 39375cb6a1..512411ec59 100644 --- a/interface/wx/propgrid/propgridiface.h +++ b/interface/wx/propgrid/propgridiface.h @@ -91,6 +91,12 @@ public: @return Returns @true if successful or if there was no selection. May fail if validation was enabled and active editor had invalid value. + + @remarks In wxPropertyGrid 1.4, this member function used to send + wxPG_EVT_SELECTED. In wxWidgets 2.9 and later, it no longer + does that. + + @see wxPropertyGrid::SelectProperty() */ bool ClearSelection( bool validation = false); diff --git a/src/propgrid/propgrid.cpp b/src/propgrid/propgrid.cpp index 62459e6476..b323f7f4cf 100644 --- a/src/propgrid/propgrid.cpp +++ b/src/propgrid/propgrid.cpp @@ -849,7 +849,7 @@ void wxPropertyGrid::OnTLPChanging( wxWindow* newTLP ) void wxPropertyGrid::OnTLPClose( wxCloseEvent& event ) { // ClearSelection forces value validation/commit. - if ( event.CanVeto() && !ClearSelection() ) + if ( event.CanVeto() && !DoClearSelection() ) { event.Veto(); return; @@ -1071,7 +1071,7 @@ void wxPropertyGrid::ResetColours() bool wxPropertyGrid::SetFont( const wxFont& font ) { // Must disable active editor. - ClearSelection(false); + DoClearSelection(); bool res = wxScrolledWindow::SetFont( font ); if ( res && GetParent()) // may not have been Create()ed yet @@ -2168,7 +2168,7 @@ void wxPropertyGrid::Clear() bool wxPropertyGrid::EnableCategories( bool enable ) { - ClearSelection(false); + DoClearSelection(); if ( enable ) { @@ -2220,7 +2220,7 @@ void wxPropertyGrid::SwitchState( wxPropertyGridPageState* pNewState ) wxPGProperty* oldSelection = m_selected; - ClearSelection(false); + DoClearSelection(); m_pState->m_selected = oldSelection; @@ -3608,7 +3608,8 @@ bool wxPropertyGrid::DoSelectProperty( wxPGProperty* p, unsigned int flags ) m_inDoSelectProperty = 0; // call wx event handler (here so that it also occurs on deselection) - SendEvent( wxEVT_PG_SELECTED, m_selected, NULL, flags ); + if ( !(flags & wxPG_SEL_DONT_SEND_EVENT) ) + SendEvent( wxEVT_PG_SELECTED, m_selected, NULL, flags ); return true; } @@ -3661,11 +3662,23 @@ void wxPropertyGrid::RefreshEditor() // ----------------------------------------------------------------------- -// This method is not inline because it called dozens of times -// (i.e. two-arg function calls create smaller code size). +bool wxPropertyGrid::SelectProperty( wxPGPropArg id, bool focus ) +{ + wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false) + + int flags = wxPG_SEL_DONT_SEND_EVENT; + if ( focus ) + flags |= wxPG_SEL_FOCUS; + + return DoSelectProperty(p, flags); +} + +// ----------------------------------------------------------------------- + bool wxPropertyGrid::DoClearSelection() { - return DoSelectProperty(NULL); + // Unlike ClearSelection(), here we send the wxEVT_PG_SELECTED event. + return DoSelectProperty(NULL, 0); } // ----------------------------------------------------------------------- @@ -3679,7 +3692,7 @@ bool wxPropertyGrid::DoCollapse( wxPGProperty* p, bool sendEvents ) // If active editor was inside collapsed section, then disable it if ( m_selected && m_selected->IsSomeParent(p) ) { - ClearSelection(false); + DoClearSelection(); } // Store dont-center-splitter flag 'cause we need to temporarily set it @@ -3764,7 +3777,7 @@ bool wxPropertyGrid::DoHideProperty( wxPGProperty* p, bool hide, int flags ) ( m_selected == p || m_selected->IsSomeParent(p) ) ) { - ClearSelection(false); + DoClearSelection(); } m_pState->DoHideProperty(p, hide, flags); diff --git a/src/propgrid/propgridiface.cpp b/src/propgrid/propgridiface.cpp index ea0b4ee072..ff891b9f4f 100644 --- a/src/propgrid/propgridiface.cpp +++ b/src/propgrid/propgridiface.cpp @@ -220,7 +220,7 @@ wxPGProperty* wxPropertyGridInterface::ReplaceProperty( wxPGPropArg id, wxPGProp bool wxPropertyGridInterface::ClearSelection( bool validation ) { - int flags = 0; + int flags = wxPG_SEL_DONT_SEND_EVENT; if ( !validation ) flags |= wxPG_SEL_NOVALIDATE; @@ -297,7 +297,7 @@ bool wxPropertyGridInterface::ExpandAll( bool doExpand ) if ( GetSelection() && GetSelection() != state->DoGetRoot() && !doExpand ) { - pg->ClearSelection(false); + pg->DoClearSelection(); } wxPGVIterator it; @@ -579,7 +579,7 @@ void wxPropertyGridInterface::Sort( int flags ) { wxPropertyGrid* pg = GetPropertyGrid(); - pg->ClearSelection(false); + pg->DoClearSelection(); unsigned int pageIndex = 0; @@ -1091,9 +1091,9 @@ bool wxPropertyGridInterface::RestoreEditableState( const wxString& src, int res if ( pgSelectionSet ) { if ( newSelection ) - pg->SelectProperty(newSelection); + pg->DoSelectProperty(newSelection); else - pg->ClearSelection(); + pg->DoClearSelection(); } if ( selectedPage != -1 ) -- 2.47.2