From d8812c6e0e780fb2dae99bc352c5061f58793e14 Mon Sep 17 00:00:00 2001 From: Jaakko Salli Date: Mon, 12 Jan 2009 16:12:15 +0000 Subject: [PATCH] Added wxPGProperty::OnValidationFailure(); needed it and some other tweaks to allow vetoing value changes of ComboBox editors git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58047 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/propgrid/property.h | 9 +++++++++ include/wx/propgrid/propgrid.h | 8 ++------ include/wx/propgrid/props.h | 3 +++ interface/wx/propgrid/property.h | 9 +++++++++ src/propgrid/property.cpp | 4 ++++ src/propgrid/propgrid.cpp | 23 +++++++++++++++++++++++ src/propgrid/props.cpp | 10 ++++++++++ 7 files changed, 60 insertions(+), 6 deletions(-) diff --git a/include/wx/propgrid/property.h b/include/wx/propgrid/property.h index d305659326..176db3d61e 100644 --- a/include/wx/propgrid/property.h +++ b/include/wx/propgrid/property.h @@ -1423,6 +1423,15 @@ public: */ virtual wxPGEditorDialogAdapter* GetEditorDialog() const; + /** + Called whenever validation has failed with given pending value. + + @remarks If you implement this in your custom property class, please + remember to call the baser implementation as well, since they + may use it to revert property into pre-change state. + */ + virtual void OnValidationFailure( wxVariant& pendingValue ); + /** Append a new choice to property's list of choices. */ int AddChoice( const wxString& label, int value = wxPG_INVALID_VALUE ) diff --git a/include/wx/propgrid/propgrid.h b/include/wx/propgrid/propgrid.h index 9fbb5adaac..fefc72e3b3 100644 --- a/include/wx/propgrid/propgrid.h +++ b/include/wx/propgrid/propgrid.h @@ -1294,12 +1294,8 @@ public: To add your own validation failure behavior, override 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. */ diff --git a/include/wx/propgrid/props.h b/include/wx/propgrid/props.h index f7247bc815..3d9885c041 100644 --- a/include/wx/propgrid/props.h +++ b/include/wx/propgrid/props.h @@ -428,6 +428,8 @@ public: // this take advantage of it. virtual int GetChoiceSelection() const { return m_index; } + virtual void OnValidationFailure( wxVariant& pendingValue ); + protected: int GetIndex() const; @@ -447,6 +449,7 @@ private: // Relies on ValidateValue being called always before OnSetValue static int ms_nextIndex; + static int ms_prevIndex; }; // ----------------------------------------------------------------------- diff --git a/interface/wx/propgrid/property.h b/interface/wx/propgrid/property.h index 5cd1d564a1..c78af7a893 100644 --- a/interface/wx/propgrid/property.h +++ b/interface/wx/propgrid/property.h @@ -852,6 +852,15 @@ public: */ virtual wxPGEditorDialogAdapter* GetEditorDialog() const; + /** + Called whenever validation has failed with given pending value. + + @remarks If you implement this in your custom property class, please + remember to call the baser implementation as well, since they + may use it to revert property into pre-change state. + */ + virtual void OnValidationFailure( wxVariant& pendingValue ); + /** Append a new choice to property's list of choices. diff --git a/src/propgrid/property.cpp b/src/propgrid/property.cpp index aea73df3b9..ac6d0d192c 100644 --- a/src/propgrid/property.cpp +++ b/src/propgrid/property.cpp @@ -652,6 +652,10 @@ void wxPGProperty::RefreshChildren () { } +void wxPGProperty::OnValidationFailure( wxVariant& WXUNUSED(pendingValue) ) +{ +} + void wxPGProperty::GetDisplayInfo( unsigned int column, int choiceIndex, int flags, diff --git a/src/propgrid/propgrid.cpp b/src/propgrid/propgrid.cpp index bf16d22fdf..237158f0bb 100644 --- a/src/propgrid/propgrid.cpp +++ b/src/propgrid/propgrid.cpp @@ -2602,6 +2602,29 @@ void wxPropertyGrid::DoShowPropertyError( wxPGProperty* WXUNUSED(property), cons // ----------------------------------------------------------------------- +bool wxPropertyGrid::OnValidationFailure( wxPGProperty* property, + wxVariant& invalidValue ) +{ + wxWindow* editor = GetEditorControl(); + + // First call property's handler + property->OnValidationFailure(invalidValue); + + bool res = DoOnValidationFailure(property, invalidValue); + + // + // For non-wxTextCtrl editors, we do need to revert the value + if ( !editor->IsKindOf(CLASSINFO(wxTextCtrl)) && + property == m_selected ) + { + property->GetEditorClass()->UpdateControl(property, editor); + } + + property->SetFlag(wxPG_PROP_INVALID_VALUE); + + return res; +} + bool wxPropertyGrid::DoOnValidationFailure( wxPGProperty* property, wxVariant& WXUNUSED(invalidValue) ) { int vfb = m_validationInfo.m_failureBehavior; diff --git a/src/propgrid/props.cpp b/src/propgrid/props.cpp index df7efa118a..336c55fdc5 100644 --- a/src/propgrid/props.cpp +++ b/src/propgrid/props.cpp @@ -963,6 +963,7 @@ wxEnumProperty::~wxEnumProperty () } int wxEnumProperty::ms_nextIndex = -2; +int wxEnumProperty::ms_prevIndex = -1; void wxEnumProperty::OnSetValue() { @@ -1113,8 +1114,17 @@ bool wxEnumProperty::ValueFromInt_( wxVariant& variant, int intVal, int argFlags return false; } +void +wxEnumProperty::OnValidationFailure( wxVariant& WXUNUSED(pendingValue) ) +{ + // Revert index + m_index = ms_prevIndex; + ResetNextIndex(); +} + void wxEnumProperty::SetIndex( int index ) { + ms_prevIndex = m_index; ms_nextIndex = -2; m_index = index; } -- 2.45.2