]> git.saurik.com Git - wxWidgets.git/commitdiff
User should no longer be able to modify disabled or read only child properties by...
authorJaakko Salli <jaakko.salli@dnainternet.net>
Mon, 20 Oct 2008 17:01:17 +0000 (17:01 +0000)
committerJaakko Salli <jaakko.salli@dnainternet.net>
Mon, 20 Oct 2008 17:01:17 +0000 (17:01 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56475 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/propgrid/property.h
include/wx/propgrid/propgriddefs.h
src/propgrid/property.cpp
src/propgrid/propgrid.cpp
src/propgrid/propgridpagestate.cpp

index 8a087be51e7c88ebd6dbc0c5f1e6a871abc91781..90494f078347899a4b98fbf1c4c2c675f964cf53 100644 (file)
@@ -1107,7 +1107,7 @@ public:
         @return
         true if value was changed.
     */
-    bool SetValueFromString( const wxString& text, int flags = 0 );
+    bool SetValueFromString( const wxString& text, int flags = wxPG_PROGRAMMATIC_VALUE );
 
     /** Converts integer to a value, and if succesful, calls SetValue() on it.
         Default behavior is to do nothing.
index 98c339c062da99cc56d8a7ed04c955740fe30692..2f9be1eea79631d3063b4eff756dc9650c5c5595 100644 (file)
@@ -405,7 +405,10 @@ enum wxPG_MISC_ARG_FLAGS
 
     // ValueToString() called from GetValueAsString()
     // (guarantees that input wxVariant value is current own value)
-    wxPG_VALUE_IS_CURRENT               = 0x00000040
+    wxPG_VALUE_IS_CURRENT               = 0x00000040,
+
+    // Value is being set programmatically (ie. not by user)
+    wxPG_PROGRAMMATIC_VALUE             = 0x00000080
 };
 
 // -----------------------------------------------------------------------
index 093793c8026a85950fa824569c32e1a0a28cf2f3..65811cca7a5e4ee938141a952e39c86c0863cf26 100644 (file)
@@ -881,7 +881,7 @@ bool wxPGProperty::StringToValue( wxVariant& variant, const wxString& text, int
     wxVariantList temp_list;
     wxVariant list(temp_list);
 
-    int propagatedFlags = argFlags & wxPG_REPORT_ERROR;
+    int propagatedFlags = argFlags & (wxPG_REPORT_ERROR|wxPG_PROGRAMMATIC_VALUE);
 
 #ifdef __WXDEBUG__
     bool debug_print = false;
@@ -914,41 +914,45 @@ bool wxPGProperty::StringToValue( wxVariant& variant, const wxString& text, int
                 if ( !addOnlyIfNotEmpty || len > 0 )
                 {
                     const wxPGProperty* child = Item(curChild);
+                    wxVariant variant(child->GetValue());
+                    variant.SetName(child->GetBaseName());
+
                 #ifdef __WXDEBUG__
                     if ( debug_print )
                         wxLogDebug(wxT("token = '%s', child = %s"),token.c_str(),child->GetLabel().c_str());
                 #endif
 
-                    if ( len > 0 )
+                    // Add only if editable or setting programmatically
+                    if ( (argFlags & wxPG_PROGRAMMATIC_VALUE) ||
+                         !child->HasFlag(wxPG_PROP_DISABLED|wxPG_PROP_READONLY) )
                     {
-                        bool wasUnspecified = child->IsValueUnspecified();
-
-                        wxVariant variant(child->GetValueRef());
-                        if ( child->StringToValue(variant, token, propagatedFlags|wxPG_COMPOSITE_FRAGMENT) )
+                        if ( len > 0 )
                         {
-                            variant.SetName(child->GetBaseName());
+                            bool wasUnspecified = child->IsValueUnspecified();
 
-                            // Clear unspecified flag only if OnSetValue() didn't
-                            // affect it.
-                            if ( child->IsValueUnspecified() &&
-                                 (wasUnspecified || !UsesAutoUnspecified()) )
+                            if ( child->StringToValue(variant, token, propagatedFlags|wxPG_COMPOSITE_FRAGMENT) )
                             {
-                                variant = child->GetDefaultValue();
-                            }
+                                // Clear unspecified flag only if OnSetValue() didn't
+                                // affect it.
+                                if ( child->IsValueUnspecified() &&
+                                     (wasUnspecified || !UsesAutoUnspecified()) )
+                                {
+                                    variant = child->GetDefaultValue();
+                                }
 
-                            list.Append(variant);
+                                list.Append(variant);
 
+                                changed = true;
+                            }
+                        }
+                        else
+                        {
+                            // Empty, becomes unspecified
+                            variant.MakeNull();
+                            list.Append(variant);
                             changed = true;
                         }
                     }
-                    else
-                    {
-                        // Empty, becomes unspecified
-                        wxVariant variant2;
-                        variant2.SetName(child->GetBaseName());
-                        list.Append(variant2);
-                        changed = true;
-                    }
 
                     curChild++;
                     if ( curChild >= iMax )
@@ -997,17 +1001,22 @@ bool wxPGProperty::StringToValue( wxVariant& variant, const wxString& text, int
 
                     wxVariant oldChildValue = child->GetValue();
                     wxVariant variant(oldChildValue);
-                    bool stvRes = child->StringToValue( variant, token, propagatedFlags );
-                    if ( stvRes || (variant != oldChildValue) )
+
+                    if ( (argFlags & wxPG_PROGRAMMATIC_VALUE) ||
+                         !child->HasFlag(wxPG_PROP_DISABLED|wxPG_PROP_READONLY) )
                     {
-                        if ( stvRes )
+                        bool stvRes = child->StringToValue( variant, token, propagatedFlags );
+                        if ( stvRes || (variant != oldChildValue) )
+                        {
+                            if ( stvRes )
+                                changed = true;
+                        }
+                        else
+                        {
+                            // Failed, becomes unspecified
+                            variant.MakeNull();
                             changed = true;
-                    }
-                    else
-                    {
-                        // Failed, becomes unspecified
-                        variant.MakeNull();
-                        changed = true;
+                        }
                     }
 
                     variant.SetName(child->GetBaseName());
index 1c364c0862ae5e920a4f64540d15f4459589947d..4e790e752528c0ee84bf3220d2d35694f979265d 100644 (file)
@@ -5855,7 +5855,8 @@ wxPGProperty* wxPropertyGridPopulator::Add( const wxString& propClass,
     m_state->DoInsert(parent, -1, property);
 
     if ( propValue )
-        property->SetValueFromString( *propValue, wxPG_FULL_VALUE );
+        property->SetValueFromString( *propValue, wxPG_FULL_VALUE|
+                                                  wxPG_PROGRAMMATIC_VALUE );
 
     return property;
 }
index fe2c7a0d66ad273b31eafba33335bfc55b59ed35..1b2f47a091a2f5aaed25d4d3e775cc781df9fe11 100644 (file)
@@ -1100,7 +1100,7 @@ bool wxPropertyGridPageState::DoSetPropertyValueString( wxPGProperty* p, const w
 {
     if ( p )
     {
-        int flags = wxPG_REPORT_ERROR|wxPG_FULL_VALUE;
+        int flags = wxPG_REPORT_ERROR|wxPG_FULL_VALUE|wxPG_PROGRAMMATIC_VALUE;
 
         wxVariant variant = p->GetValueRef();
         bool res;