From: Jaakko Salli Date: Thu, 16 Oct 2008 17:19:50 +0000 (+0000) Subject: Added virtual wxPGProperty::ValueToString(). In derived property classes, now it... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/1425eca550ca78f6d0824e50376d763aff17242d Added virtual wxPGProperty::ValueToString(). In derived property classes, now it must be implemented instead of GetValueAsString (assertion failure is raised at run-time if you fail to do so). This change is needed to properly support wxEVT_PG_CHANGING for nested composite string properties. wxPGProperty::GenerateComposedValue() partially updated to support this. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56363 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/propgrid/advprops.h b/include/wx/propgrid/advprops.h index 042d6021ab..250acb8bb5 100644 --- a/include/wx/propgrid/advprops.h +++ b/include/wx/propgrid/advprops.h @@ -180,7 +180,7 @@ public: const wxFont& value = wxFont()); virtual ~wxFontProperty(); virtual void OnSetValue(); - virtual wxString GetValueAsString( int argFlags = 0 ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool OnEvent( wxPropertyGrid* propgrid, wxWindow* primary, wxEvent& event ); virtual void ChildChanged( wxVariant& thisValue, @@ -231,7 +231,7 @@ public: */ virtual int GetCustomColourIndex() const; - virtual wxString GetValueAsString( int argFlags = 0 ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool StringToValue( wxVariant& variant, const wxString& text, int argFlags = 0 ) const; @@ -292,7 +292,7 @@ public: virtual ~wxColourProperty(); protected: - virtual wxString GetValueAsString( int argFlags ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual wxColour GetColour( int index ) const; virtual wxVariant DoTranslateVal( wxColourPropertyValue& v ) const; @@ -392,7 +392,7 @@ public: virtual ~wxMultiChoiceProperty(); virtual void OnSetValue(); - virtual wxString GetValueAsString( int flags = 0 ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool StringToValue(wxVariant& variant, const wxString& text, int argFlags = 0) const; @@ -406,7 +406,7 @@ public: protected: - void GenerateValueAsString(); + void GenerateValueAsString( wxString* target ) const; // Returns translation of values into string indices. wxArrayInt GetValueAsIndices() const; @@ -442,7 +442,7 @@ public: const wxDateTime& value = wxDateTime() ); virtual ~wxDateProperty(); - virtual wxString GetValueAsString( int flags = 0 ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool StringToValue(wxVariant& variant, const wxString& text, int argFlags = 0) const; diff --git a/include/wx/propgrid/property.h b/include/wx/propgrid/property.h index 1d95ae5abb..13ba5c5be8 100644 --- a/include/wx/propgrid/property.h +++ b/include/wx/propgrid/property.h @@ -1033,7 +1033,7 @@ public: If wxPG_FULL_VALUE is set, returns complete, storable value instead of displayable one (they may be different). If wxPG_COMPOSITE_FRAGMENT is set, text is interpreted as a part of - composite property string value (as generated by GetValueAsString() + composite property string value (as generated by ValueToString() called with this same flag). @return Returns @true if resulting wxVariant value was different. @@ -1081,22 +1081,24 @@ public: int number, int argFlags = 0 ) const; #endif // !defined(SWIG) || defined(CREATE_VCW) + /** + Converts property value into a text representation. -public: - /** Returns text representation of property's value. + @param value + Value to be converted. @param argFlags + If 0 (default value), then displayed string is returned. If wxPG_FULL_VALUE is set, returns complete, storable string value instead of displayable. If wxPG_EDITABLE_VALUE is set, returns string value that must be editable in textctrl. If wxPG_COMPOSITE_FRAGMENT is set, returns text that is appropriate to - display as a part of composite property string value. + display as a part of string property's composite text + representation. - @remarks - Default implementation returns string composed from text - representations of child properties. + @remarks Default implementation calls GenerateComposedValue(). */ - virtual wxString GetValueAsString( int argFlags = 0 ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; /** Converts string to a value, and if successful, calls SetValue() on it. Default behavior is to do nothing. @@ -1279,7 +1281,7 @@ public: colour) pen for drawing framing rectangle. It can be changed as well. - @see GetValueAsString() + @see ValueToString() */ virtual void OnCustomPaint( wxDC& dc, const wxRect& rect, @@ -1387,8 +1389,14 @@ public: else ClearFlag( wxPG_PROP_USES_COMMON_VALUE ); } - /** Composes text from values of child properties. */ - void GenerateComposedValue( wxString& text, int argFlags = 0 ) const; + /** + Composes text from values of child properties. You usually do not have + to care about arguments other than 'text'. + */ + void GenerateComposedValue( wxString& text, + int argFlags = wxPG_VALUE_IS_CURRENT, + const wxVariantList* valueOverrides = NULL, + wxPGHashMapS2S* childResults = NULL ) const; /** Returns property's label. */ const wxString& GetLabel() const { return m_label; } @@ -1435,11 +1443,31 @@ public: } #endif - /** To acquire property's value as string, you should use this - function (instead of GetValueAsString()), as it may produce - more accurate value in future versions. + /** Returns text representation of property's value. + + @param argFlags + If 0 (default value), then displayed string is returned. + If wxPG_FULL_VALUE is set, returns complete, storable string value + instead of displayable. If wxPG_EDITABLE_VALUE is set, returns + string value that must be editable in textctrl. If + wxPG_COMPOSITE_FRAGMENT is set, returns text that is appropriate to + display as a part of string property's composite text + representation. + + @remarks In older versions, this function used to be overridden to convert + property's value into a string representation. This function is + now handled by ValueToString(), and overriding this function now + will result in run-time assertion failure. + */ + virtual wxString GetValueAsString( int argFlags = 0 ) const; + + /** Synonymous to GetValueAsString(). + + @deprecated Use GetValueAsString() instead. + + @see GetValueAsString() */ - wxString GetValueString( int argFlags = 0 ) const; + wxDEPRECATED( wxString GetValueString( int argFlags = 0 ) const ); void UpdateControl( wxWindow* primary ); @@ -1460,7 +1488,7 @@ public: wxString GetDisplayedString() const { - return GetValueString(0); + return GetValueAsString(0); } /** Returns property grid where property lies. */ @@ -2183,7 +2211,7 @@ public: int GetTextExtent( const wxWindow* wnd, const wxFont& font ) const; protected: - virtual wxString GetValueAsString( int argFlags ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags ) const; void SetTextColIndex( unsigned int colInd ) { m_capFgColIndex = (wxByte) colInd; } diff --git a/include/wx/propgrid/propgriddefs.h b/include/wx/propgrid/propgriddefs.h index ca0c5340be..98c339c062 100644 --- a/include/wx/propgrid/propgriddefs.h +++ b/include/wx/propgrid/propgriddefs.h @@ -229,6 +229,12 @@ // (for tree buttons) //#undef wxPG_ICON_WIDTH +#if WXWIN_COMPATIBILITY_2_6 || WXWIN_COMPATIBILITY_2_8 + #define wxPG_COMPATIBILITY_1_4 1 +#else + #define wxPG_COMPATIBILITY_1_4 0 +#endif + // Need to force disable tooltips? #if !wxUSE_TOOLTIPS #undef wxPG_SUPPORT_TOOLTIPS @@ -332,7 +338,10 @@ WX_DECLARE_STRING_HASH_MAP_WITH_DECL(void*, wxPGHashMapS2P, class WXDLLIMPEXP_PROPGRID); - +WX_DECLARE_STRING_HASH_MAP_WITH_DECL(wxString, + wxPGHashMapS2S, + class WXDLLIMPEXP_PROPGRID); + WX_DECLARE_VOIDPTR_HASH_MAP_WITH_DECL(void*, wxPGHashMapP2P, class WXDLLIMPEXP_PROPGRID); @@ -392,7 +401,11 @@ enum wxPG_MISC_ARG_FLAGS // Means property for which final string value is for can not really be // edited. - wxPG_UNEDITABLE_COMPOSITE_FRAGMENT = 0x00000020 + wxPG_UNEDITABLE_COMPOSITE_FRAGMENT = 0x00000020, + + // ValueToString() called from GetValueAsString() + // (guarantees that input wxVariant value is current own value) + wxPG_VALUE_IS_CURRENT = 0x00000040 }; // ----------------------------------------------------------------------- diff --git a/include/wx/propgrid/props.h b/include/wx/propgrid/props.h index 6609bdbb3a..965de7dc7a 100644 --- a/include/wx/propgrid/props.h +++ b/include/wx/propgrid/props.h @@ -106,7 +106,7 @@ public: const wxString& value = wxEmptyString ); virtual ~wxStringProperty(); - virtual wxString GetValueAsString( int argFlags = 0 ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool StringToValue( wxVariant& variant, const wxString& text, int argFlags = 0 ) const; @@ -196,7 +196,7 @@ public: wxIntProperty( const wxString& label, const wxString& name, const wxLongLong& value ); - virtual wxString GetValueAsString( int argFlags = 0 ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool StringToValue( wxVariant& variant, const wxString& text, int argFlags = 0 ) const; @@ -250,7 +250,7 @@ public: wxUIntProperty( const wxString& label, const wxString& name, const wxULongLong& value ); - virtual wxString GetValueAsString( int argFlags = 0 ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool StringToValue( wxVariant& variant, const wxString& text, int argFlags = 0 ) const; @@ -287,7 +287,7 @@ public: double value = 0.0 ); virtual ~wxFloatProperty(); - virtual wxString GetValueAsString( int argFlags = 0 ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool StringToValue( wxVariant& variant, const wxString& text, int argFlags = 0 ) const; @@ -330,7 +330,7 @@ public: bool value = false ); virtual ~wxBoolProperty(); - virtual wxString GetValueAsString( int argFlags = 0 ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool StringToValue( wxVariant& variant, const wxString& text, int argFlags = 0 ) const; @@ -360,7 +360,7 @@ public: const wxString& name = wxPG_LABEL ); virtual void OnSetValue(); - virtual wxString GetValueAsString( int argFlags ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool StringToValue( wxVariant& variant, const wxString& text, int argFlags = 0 ) const; @@ -553,7 +553,7 @@ public: virtual ~wxFlagsProperty (); virtual void OnSetValue(); - virtual wxString GetValueAsString( int argFlags ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool StringToValue( wxVariant& variant, const wxString& text, int flags ) const; @@ -631,7 +631,7 @@ public: virtual ~wxFileProperty (); virtual void OnSetValue(); - virtual wxString GetValueAsString( int argFlags ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool StringToValue( wxVariant& variant, const wxString& text, int argFlags = 0 ) const; @@ -641,12 +641,16 @@ public: static wxValidator* GetClassValidator(); virtual wxValidator* DoGetValidator() const; + /** + Returns filename to file represented by current value. + */ + wxFileName GetFileName() const; + protected: wxString m_wildcard; wxString m_basePath; // If set, then show path relative to it wxString m_initialPath; // If set, start the file dialog here wxString m_dlgTitle; // If set, used as title for file dialog - wxFileName m_filename; // used as primary storage int m_indFilter; // index to the selected filter }; @@ -682,7 +686,7 @@ public: const wxString& value = wxEmptyString ); virtual ~wxLongStringProperty(); - virtual wxString GetValueAsString( int argFlags = 0 ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool StringToValue( wxVariant& variant, const wxString& text, int argFlags = 0 ) const; @@ -761,7 +765,7 @@ public: virtual ~wxArrayStringProperty(); virtual void OnSetValue(); - virtual wxString GetValueAsString( int argFlags = 0 ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool StringToValue( wxVariant& variant, const wxString& text, int argFlags = 0 ) const; diff --git a/interface/wx/propgrid/property.h b/interface/wx/propgrid/property.h index 057154a0a6..a9ca0b8b35 100644 --- a/interface/wx/propgrid/property.h +++ b/interface/wx/propgrid/property.h @@ -421,9 +421,10 @@ return wxPGEditor_TextCtrl; } - virtual wxString GetValueAsString( int argFlags ) const + virtual wxString ValueToString( wxVariant& value, + int argFlags ) const { - // TODO: Return property value in string format + // TODO: Convert given property value to a string } virtual bool StringToValue( wxVariant& variant, const wxString& text, int argFlags ) @@ -542,7 +543,7 @@ public: If wxPG_FULL_VALUE is set, returns complete, storable value instead of displayable one (they may be different). If wxPG_COMPOSITE_FRAGMENT is set, text is interpreted as a part of - composite property string value (as generated by GetValueAsString() + composite property string value (as generated by ValueToString() called with this same flag). @return Returns @true if resulting wxVariant value was different. @@ -587,19 +588,23 @@ public: virtual bool IntToValue( wxVariant& value, int number, int argFlags = 0 ) const; /** - Returns text representation of property's value. + Converts property value into a text representation. + + @param value + Value to be converted. @param argFlags - If wxPG_FULL_VALUE is set, returns complete, storable string value instead of displayable. - If wxPG_EDITABLE_VALUE is set, returns string value that must be editable in textctrl. - If wxPG_COMPOSITE_FRAGMENT is set, returns text that is appropriate to display - as a part of composite property string value. + If 0 (default value), then displayed string is returned. + If wxPG_FULL_VALUE is set, returns complete, storable string value + instead of displayable. If wxPG_EDITABLE_VALUE is set, returns + string value that must be editable in textctrl. If + wxPG_COMPOSITE_FRAGMENT is set, returns text that is appropriate to + display as a part of string property's composite text + representation. - @remarks - Default implementation returns string composed from text representations of - child properties. + @remarks Default implementation calls GenerateComposedValue(). */ - virtual wxString GetValueAsString( int argFlags = 0 ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; /** Converts string to a value, and if successful, calls SetValue() on it. @@ -785,7 +790,7 @@ public: - Pen is guaranteed to be 1-wide 'black' (or whatever is the proper colour) pen for drawing framing rectangle. It can be changed as well. - @see GetValueAsString() + @see ValueToString() */ virtual void OnCustomPaint( wxDC& dc, const wxRect& rect, wxPGPaintData& paintdata ); @@ -923,7 +928,10 @@ public: /** Deletes all child properties. */ void Empty(); - /** Composes text from values of child properties. */ + /** + Composes text from values of child properties. You usually do not have + to care about arguments other than 'text'. + */ void GenerateComposedValue( wxString& text, int argFlags = 0 ) const; /** @@ -1099,14 +1107,31 @@ public: */ wxBitmap* GetValueImage() const; - /** - To acquire property's value as string, you should use this - function (instead of GetValueAsString()), as it may produce - more accurate value in future versions. + /** Returns text representation of property's value. + + @param argFlags + If 0 (default value), then displayed string is returned. + If wxPG_FULL_VALUE is set, returns complete, storable string value + instead of displayable. If wxPG_EDITABLE_VALUE is set, returns + string value that must be editable in textctrl. If + wxPG_COMPOSITE_FRAGMENT is set, returns text that is appropriate to + display as a part of string property's composite text + representation. + + @remarks In older versions, this function used to be overridden to convert + property's value into a string representation. This function is + now handled by ValueToString(), and overriding this function now + will result in run-time assertion failure. + */ + virtual wxString GetValueAsString( int argFlags = 0 ) const; + + /** Synonymous to GetValueAsString(). + + @deprecated Use GetValueAsString() instead. @see GetValueAsString() */ - wxString GetValueString( int argFlags = 0 ) const; + wxDEPRECATED( wxString GetValueString( int argFlags = 0 ) const ); /** Returns value type used by this property. diff --git a/samples/propgrid/propgrid.cpp b/samples/propgrid/propgrid.cpp index b3552e617f..4b3172ec74 100644 --- a/samples/propgrid/propgrid.cpp +++ b/samples/propgrid/propgrid.cpp @@ -287,6 +287,7 @@ void wxAdvImageFileProperty::OnSetValue() if ( imagename.length() ) { + wxFileName filename = GetFileName(); size_t prevCount = g_myImageArray.GetCount(); int index = ms_choices.Index(imagename); @@ -294,7 +295,7 @@ void wxAdvImageFileProperty::OnSetValue() if ( index == wxNOT_FOUND ) { ms_choices.Add( imagename ); - g_myImageArray.Add( new wxMyImageInfo( m_filename.GetFullPath() ) ); + g_myImageArray.Add( new wxMyImageInfo( filename.GetFullPath() ) ); index = g_myImageArray.GetCount() - 1; } @@ -303,8 +304,8 @@ void wxAdvImageFileProperty::OnSetValue() if ( !g_myImageArray[index].m_pThumbnail2 ) { // Load if file exists. - if ( m_filename.FileExists() ) - m_pImage = new wxImage( m_filename.GetFullPath() ); + if ( filename.FileExists() ) + m_pImage = new wxImage( filename.GetFullPath() ); } m_index = index; @@ -365,9 +366,10 @@ void wxAdvImageFileProperty::LoadThumbnails( size_t index ) if ( !mii.m_pThumbnail2 ) { + wxFileName filename = GetFileName(); if ( !m_pImage || !m_pImage->Ok() || - m_filename != mii.m_path + filename != mii.m_path ) { if ( m_pImage ) diff --git a/samples/propgrid/sampleprops.cpp b/samples/propgrid/sampleprops.cpp index 8216a7eb67..5791ebae83 100644 --- a/samples/propgrid/sampleprops.cpp +++ b/samples/propgrid/sampleprops.cpp @@ -513,16 +513,29 @@ wxArrayDoubleProperty::~wxArrayDoubleProperty () { } void wxArrayDoubleProperty::OnSetValue() { + // Generate cached display string, to optimize grid drawing GenerateValueAsString( m_display, m_precision, true ); } -wxString wxArrayDoubleProperty::GetValueAsString( int arg_flags ) const +wxString wxArrayDoubleProperty::ValueToString( wxVariant& value, + int argFlags ) const { - if ( !(arg_flags & wxPG_FULL_VALUE )) - return m_display; - wxString s; - GenerateValueAsString(s,-1,false); + + if ( argFlags & wxPG_FULL_VALUE ) + { + GenerateValueAsString(s,-1,false); + } + else + { + // + // Display cached string only if value truly matches m_value + if ( value.GetData() == m_value.GetData() ) + return m_display; + else + GenerateValueAsString( s, m_precision, true ); + } + return s; } diff --git a/samples/propgrid/sampleprops.h b/samples/propgrid/sampleprops.h index 2f4045f061..3399ec8db8 100644 --- a/samples/propgrid/sampleprops.h +++ b/samples/propgrid/sampleprops.h @@ -113,7 +113,7 @@ public: virtual ~wxArrayDoubleProperty (); virtual void OnSetValue(); - virtual wxString GetValueAsString( int argFlags = 0 ) const; + virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const; virtual bool StringToValue( wxVariant& variant, const wxString& text, int argFlags = 0 ) const; diff --git a/src/propgrid/advprops.cpp b/src/propgrid/advprops.cpp index 2e93e339f7..fb6a32b3ce 100644 --- a/src/propgrid/advprops.cpp +++ b/src/propgrid/advprops.cpp @@ -522,9 +522,10 @@ void wxFontProperty::OnSetValue() } } -wxString wxFontProperty::GetValueAsString( int argFlags ) const +wxString wxFontProperty::ValueToString( wxVariant& value, + int argFlags ) const { - return wxPGProperty::GetValueAsString(argFlags); + return wxPGProperty::ValueToString(value, argFlags); } bool wxFontProperty::OnEvent( wxPropertyGrid* propgrid, wxWindow* WXUNUSED(primary), @@ -999,24 +1000,12 @@ wxString wxSystemColourProperty::ColourToString( const wxColour& col, int index return m_choices.GetLabel(index); } -wxString wxSystemColourProperty::GetValueAsString( int argFlags ) const +wxString wxSystemColourProperty::ValueToString( wxVariant& value, + int WXUNUSED(argFlags) ) const { - wxColourPropertyValue val = GetVal(); - - int ind = GetIndex(); - - // Always show custom colour for textctrl-editor - if ( val.m_type == wxPG_COLOUR_CUSTOM || - ind == GetCustomColourIndex() || - (argFlags & wxPG_PROPERTY_SPECIFIC) ) - { - return ColourToString(val.m_colour, wxNOT_FOUND); - } - - if ( ind == -1 ) - return wxEmptyString; + wxColourPropertyValue val = GetVal(&value); - return ColourToString(val.m_colour, ind); + return ColourToString(val.m_colour, m_choices.Index(val.m_type)); } @@ -1392,7 +1381,8 @@ void wxColourProperty::Init( wxColour colour ) SetIndex( ind ); } -wxString wxColourProperty::GetValueAsString( int argFlags ) const +wxString wxColourProperty::ValueToString( wxVariant& value, + int argFlags ) const { const wxPGEditor* editor = GetEditorClass(); if ( editor != wxPGEditor_Choice && @@ -1400,7 +1390,7 @@ wxString wxColourProperty::GetValueAsString( int argFlags ) const editor != wxPGEditor_ComboBox ) argFlags |= wxPG_PROPERTY_SPECIFIC; - return wxSystemColourProperty::GetValueAsString(argFlags); + return wxSystemColourProperty::ValueToString(value, argFlags); } wxColour wxColourProperty::GetColour( int index ) const @@ -1651,10 +1641,12 @@ void wxImageFileProperty::OnSetValue() m_pBitmap = NULL; } + wxFileName filename = GetFileName(); + // Create the image thumbnail - if ( m_filename.FileExists() ) + if ( filename.FileExists() ) { - m_pImage = new wxImage( m_filename.GetFullPath() ); + m_pImage = new wxImage( filename.GetFullPath() ); } } @@ -1739,22 +1731,29 @@ wxMultiChoiceProperty::~wxMultiChoiceProperty() void wxMultiChoiceProperty::OnSetValue() { - GenerateValueAsString(); + GenerateValueAsString(&m_display); } -wxString wxMultiChoiceProperty::GetValueAsString( int ) const +wxString wxMultiChoiceProperty::ValueToString( wxVariant& value, + int argFlags ) const { - return m_display; + // If possible, use cached string + if ( argFlags & wxPG_VALUE_IS_CURRENT ) + return m_display; + + wxString s; + GenerateValueAsString(&s); + return s; } -void wxMultiChoiceProperty::GenerateValueAsString() +void wxMultiChoiceProperty::GenerateValueAsString( wxString* target ) const { wxArrayString strings; if ( m_value.GetType() == wxPG_VARIANT_TYPE_ARRSTRING ) strings = m_value.GetArrayString(); - wxString& tempStr = m_display; + wxString& tempStr = *target; unsigned int i; unsigned int itemCount = strings.size(); @@ -1951,11 +1950,12 @@ bool wxDateProperty::StringToValue( wxVariant& variant, const wxString& text, return false; } -wxString wxDateProperty::GetValueAsString( int argFlags ) const +wxString wxDateProperty::ValueToString( wxVariant& value, + int argFlags ) const { const wxChar* format = (const wxChar*) NULL; - wxDateTime dateTime = m_value.GetDateTime(); + wxDateTime dateTime = value.GetDateTime(); if ( !dateTime.IsValid() ) return wxT("Invalid"); diff --git a/src/propgrid/editors.cpp b/src/propgrid/editors.cpp index 54f02888b2..e1b1e13731 100644 --- a/src/propgrid/editors.cpp +++ b/src/propgrid/editors.cpp @@ -236,7 +236,8 @@ wxPGWindowList wxPGTextCtrlEditor::CreateControls( wxPropertyGrid* propGrid, return (wxWindow*) NULL; if ( !property->IsValueUnspecified() ) - text = property->GetValueString(property->HasFlag(wxPG_PROP_READONLY)?0:wxPG_EDITABLE_VALUE); + text = property->GetValueAsString(property->HasFlag(wxPG_PROP_READONLY) ? + 0 : wxPG_EDITABLE_VALUE); int flags = 0; if ( (property->GetFlags() & wxPG_PROP_PASSWORD) && @@ -620,7 +621,7 @@ void wxPropertyGrid::OnComboItemPaint( wxPGCustomComboControl* pCc, else { if ( !p->IsValueUnspecified() ) - text = p->GetValueString(0); + text = p->GetValueAsString(0); } } @@ -1020,7 +1021,7 @@ WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(ComboBox, void wxPGComboBoxEditor::UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const { wxOwnerDrawnComboBox* cb = (wxOwnerDrawnComboBox*)ctrl; - cb->SetValue(property->GetValueString(wxPG_EDITABLE_VALUE)); + cb->SetValue(property->GetValueAsString(wxPG_EDITABLE_VALUE)); // TODO: If string matches any selection, then select that. } @@ -1801,7 +1802,7 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrlAndButton( const wxPoint& pos, wxString text; if ( !property->IsValueUnspecified() ) - text = property->GetValueString(property->HasFlag(wxPG_PROP_READONLY)?0:wxPG_EDITABLE_VALUE); + text = property->GetValueAsString(property->HasFlag(wxPG_PROP_READONLY)?0:wxPG_EDITABLE_VALUE); return GenerateEditorTextCtrl(pos,sz,text,but,property->m_maxLen); } diff --git a/src/propgrid/property.cpp b/src/propgrid/property.cpp index 7479aba04a..d2ad9a372d 100644 --- a/src/propgrid/property.cpp +++ b/src/propgrid/property.cpp @@ -43,6 +43,12 @@ #define PWC_CHILD_SUMMARY_CHAR_LIMIT 64 // Character limit of summary field when not editing +#if wxPG_COMPATIBILITY_1_4 + +// Used to establish backwards compatiblity +const char* g_invalidStringContent = "@__TOTALLY_INVALID_STRING__@"; + +#endif // ----------------------------------------------------------------------- @@ -220,7 +226,7 @@ void wxPGDefaultRenderer::Render( wxDC& dc, const wxRect& rect, if ( column == 0 ) text = property->GetLabel(); else if ( column == 1 ) - text = property->GetValueString(); + text = property->GetValueAsString(); else text = wxEmptyString; } @@ -274,7 +280,7 @@ void wxPGDefaultRenderer::Render( wxDC& dc, const wxRect& rect, imageOffset = paintdata.m_drawnWidth; } - text = property->GetValueString(); + text = property->GetValueAsString(); // Add units string? if ( propertyGrid->GetColumnCount() <= 2 ) @@ -423,6 +429,13 @@ void wxPGProperty::InitAfterAdded( wxPropertyGridPageState* pageState, m_parentState = pageState; +#if wxPG_COMPATIBILITY_1_4 + // Make sure deprecated virtual functions are not implemented + wxString s = GetValueAsString( 0xFFFF ); + wxASSERT_MSG( s == g_invalidStringContent, + "Implement ValueToString() instead of GetValueAsString()" ); +#endif + if ( !parentIsRoot ) { m_bgColIndex = parent->m_bgColIndex; @@ -651,7 +664,10 @@ wxString wxPGProperty::GetColumnText( unsigned int col ) const return wxEmptyString; } -void wxPGProperty::GenerateComposedValue( wxString& text, int argFlags ) const +void wxPGProperty::GenerateComposedValue( wxString& text, + int argFlags, + const wxVariantList* valueOverrides, + wxPGHashMapS2S* childResults ) const { int i; int iMax = m_children.size(); @@ -671,11 +687,64 @@ void wxPGProperty::GenerateComposedValue( wxString& text, int argFlags ) const wxPGProperty* curChild = m_children[0]; + bool overridesLeft = false; + wxVariant overrideValue; + wxVariantList::const_iterator node; + + if ( valueOverrides ) + { + node = valueOverrides->begin(); + if ( node != valueOverrides->end() ) + { + overrideValue = *node; + overridesLeft = true; + } + } + for ( i = 0; i < iMax; i++ ) { + wxVariant childValue; + + wxString childLabel = curChild->GetLabel(); + + // Check for value override + if ( overridesLeft && overrideValue.GetName() == childLabel ) + { + if ( !overrideValue.IsNull() ) + childValue = overrideValue; + else + childValue = curChild->GetValue(); + node++; + if ( node != valueOverrides->end() ) + overrideValue = *node; + else + overridesLeft = false; + } + else + { + childValue = curChild->GetValue(); + } + wxString s; - if ( !curChild->IsValueUnspecified() ) - s = curChild->GetValueString(argFlags|wxPG_COMPOSITE_FRAGMENT); + if ( !childValue.IsNull() ) + { + if ( overridesLeft && + curChild->HasFlag(wxPG_PROP_COMPOSED_VALUE) && + childValue.GetType() == wxPG_VARIANT_TYPE_LIST ) + { + wxVariantList& childList = childValue.GetList(); + GenerateComposedValue(s, argFlags|wxPG_COMPOSITE_FRAGMENT, + &childList, childResults); + } + else + { + s = curChild->ValueToString(childValue, + argFlags|wxPG_COMPOSITE_FRAGMENT); + } + } + + if ( childResults && curChild->GetChildCount() ) + (*childResults)[curChild->GetName()] = s; bool skip = false; if ( (argFlags & wxPG_UNEDITABLE_COMPOSITE_FRAGMENT) && !s.length() ) @@ -714,24 +783,45 @@ void wxPGProperty::GenerateComposedValue( wxString& text, int argFlags ) const text += wxS("; ..."); } -wxString wxPGProperty::GetValueAsString( int argFlags ) const +wxString wxPGProperty::ValueToString( wxVariant& WXUNUSED(value), + int argFlags ) const { wxCHECK_MSG( GetChildCount() > 0, wxString(), - wxT("If user property does not have any children, it must override GetValueAsString") ); + "If user property does not have any children, it must " + "override GetValueAsString" ); + + // FIXME: Currently code below only works if value is actually m_value + wxASSERT_MSG( argFlags & wxPG_VALUE_IS_CURRENT, + "Sorry, currently default wxPGProperty::ValueToString() " + "implementation only works if value is m_value." ); wxString text; GenerateComposedValue(text, argFlags); return text; } -wxString wxPGProperty::GetValueString( int argFlags ) const +wxString wxPGProperty::GetValueAsString( int argFlags ) const { +#if wxPG_COMPATIBILITY_1_4 + // This is backwards compatibility test + // That is, to make sure this function is not overridden + // (instead, ValueToString() should be). + if ( argFlags == 0xFFFF ) + { + // Do not override! (for backwards compliancy) + return g_invalidStringContent; + } +#endif + if ( IsValueUnspecified() ) return wxEmptyString; if ( m_commonValue == -1 ) - return GetValueAsString(argFlags); + { + wxVariant value(GetValue()); + return ValueToString(value, argFlags|wxPG_VALUE_IS_CURRENT); + } // // Return common value's string representation @@ -752,6 +842,11 @@ wxString wxPGProperty::GetValueString( int argFlags ) const } } +wxString wxPGProperty::GetValueString( int argFlags ) const +{ + return GetValueAsString(argFlags); +} + bool wxPGProperty::IntToValue( wxVariant& variant, int number, int WXUNUSED(argFlags) ) const { variant = (long)number; @@ -2020,7 +2115,7 @@ wxPGProperty* wxPGProperty::UpdateParentValues() !parent->IsCategory() && !parent->IsRoot() ) { wxString s; - parent->GenerateComposedValue(s, 0); + parent->GenerateComposedValue(s); parent->m_value = s; return parent->UpdateParentValues(); } @@ -2134,7 +2229,8 @@ wxPropertyCategory::~wxPropertyCategory() } -wxString wxPropertyCategory::GetValueAsString( int ) const +wxString wxPropertyCategory::ValueToString( wxVariant& WXUNUSED(value), + int WXUNUSED(argFlags) ) const { return wxEmptyString; } diff --git a/src/propgrid/props.cpp b/src/propgrid/props.cpp index ddf4d7ec05..340d727a73 100644 --- a/src/propgrid/props.cpp +++ b/src/propgrid/props.cpp @@ -79,22 +79,30 @@ void wxStringProperty::OnSetValue() if ( HasFlag(wxPG_PROP_COMPOSED_VALUE) ) { wxString s; - GenerateComposedValue(s, 0); + GenerateComposedValue(s); m_value = s; } } wxStringProperty::~wxStringProperty() { } -wxString wxStringProperty::GetValueAsString( int argFlags ) const +wxString wxStringProperty::ValueToString( wxVariant& value, + int argFlags ) const { - wxString s = m_value.GetString(); + wxString s = value.GetString(); if ( GetChildCount() && HasFlag(wxPG_PROP_COMPOSED_VALUE) ) { // Value stored in m_value is non-editable, non-full value if ( (argFlags & wxPG_FULL_VALUE) || (argFlags & wxPG_EDITABLE_VALUE) ) + { + // Calling this under incorrect conditions will fail + wxASSERT_MSG( argFlags & wxPG_VALUE_IS_CURRENT, + "Sorry, currently default wxPGProperty::ValueToString() " + "implementation only works if value is m_value." ); + GenerateComposedValue(s, argFlags); + } return s; } @@ -154,16 +162,17 @@ wxIntProperty::wxIntProperty( const wxString& label, const wxString& name, wxIntProperty::~wxIntProperty() { } -wxString wxIntProperty::GetValueAsString( int ) const +wxString wxIntProperty::ValueToString( wxVariant& value, + int WXUNUSED(argFlags) ) const { - if ( m_value.GetType() == wxPG_VARIANT_TYPE_LONG ) + if ( value.GetType() == wxPG_VARIANT_TYPE_LONG ) { - return wxString::Format(wxS("%li"),m_value.GetLong()); + return wxString::Format(wxS("%li"),value.GetLong()); } - else if ( m_value.GetType() == wxLongLong_VariantType ) + else if ( value.GetType() == wxLongLong_VariantType ) { wxLongLong ll; - ll << m_value; + ll << value; return ll.ToString(); } @@ -388,19 +397,20 @@ wxUIntProperty::wxUIntProperty( const wxString& label, const wxString& name, wxUIntProperty::~wxUIntProperty() { } -wxString wxUIntProperty::GetValueAsString( int ) const +wxString wxUIntProperty::ValueToString( wxVariant& value, + int WXUNUSED(argFlags) ) const { size_t index = m_base + m_prefix; if ( index >= wxPG_UINT_TEMPLATE_MAX ) index = wxPG_BASE_DEC; - if ( m_value.GetType() == wxPG_VARIANT_TYPE_LONG ) + if ( value.GetType() == wxPG_VARIANT_TYPE_LONG ) { - return wxString::Format(gs_uintTemplates32[index], (unsigned long)m_value.GetLong()); + return wxString::Format(gs_uintTemplates32[index], (unsigned long)value.GetLong()); } wxULongLong ull; - ull << m_value; + ull << value; return wxString::Format(gs_uintTemplates64[index], ull.GetValue()); } @@ -612,13 +622,14 @@ void wxPropertyGrid::DoubleToString(wxString& target, } } -wxString wxFloatProperty::GetValueAsString( int argFlags ) const +wxString wxFloatProperty::ValueToString( wxVariant& value, + int argFlags ) const { wxString text; - if ( !m_value.IsNull() ) + if ( !value.IsNull() ) { wxPropertyGrid::DoubleToString(text, - m_value, + value, m_precision, !(argFlags & wxPG_FULL_VALUE), (wxString*) NULL); @@ -766,15 +777,16 @@ wxBoolProperty::wxBoolProperty( const wxString& label, const wxString& name, boo wxBoolProperty::~wxBoolProperty() { } -wxString wxBoolProperty::GetValueAsString( int argFlags ) const +wxString wxBoolProperty::ValueToString( wxVariant& value, + int argFlags ) const { - bool value = m_value.GetBool(); + bool boolValue = value.GetBool(); // As a fragment of composite string value, // make it a little more readable. if ( argFlags & wxPG_COMPOSITE_FRAGMENT ) { - if ( value ) + if ( boolValue ) { return m_label; } @@ -795,12 +807,12 @@ wxString wxBoolProperty::GetValueAsString( int argFlags ) const if ( !(argFlags & wxPG_FULL_VALUE) ) { - return wxPGGlobalVars->m_boolChoices[value?1:0].GetText(); + return wxPGGlobalVars->m_boolChoices[boolValue?1:0].GetText(); } wxString text; - if (value) text = wxS("true"); + if ( boolValue ) text = wxS("true"); else text = wxS("false"); return text; @@ -915,20 +927,17 @@ bool wxBaseEnumProperty::ValidateValue( wxVariant& value, wxPGValidationInfo& WX return true; } -wxString wxBaseEnumProperty::GetValueAsString( int ) const +wxString wxBaseEnumProperty::ValueToString( wxVariant& value, + int WXUNUSED(argFlags) ) const { - if ( m_value.GetType() == wxPG_VARIANT_TYPE_STRING ) - return m_value.GetString(); + if ( value.GetType() == wxPG_VARIANT_TYPE_STRING ) + return value.GetString(); - if ( m_index >= 0 ) - { - int unusedVal; - const wxString* pstr = GetEntry( m_index, &unusedVal ); + int index = m_choices.Index(value.GetLong()); + if ( index < 0 ) + return wxEmptyString; - if ( pstr ) - return *pstr; - } - return wxEmptyString; + return m_choices.GetLabel(index); } bool wxBaseEnumProperty::StringToValue( wxVariant& variant, const wxString& text, int argFlags ) const @@ -1407,14 +1416,15 @@ void wxFlagsProperty::OnSetValue() } } -wxString wxFlagsProperty::GetValueAsString( int ) const +wxString wxFlagsProperty::ValueToString( wxVariant& value, + int WXUNUSED(argFlags) ) const { wxString text; if ( !m_choices.IsOk() ) return text; - long flags = m_value; + long flags = value; unsigned int i; const wxPGChoices& choices = m_choices; @@ -1602,7 +1612,8 @@ bool wxPGFileDialogAdapter::DoShowDialog( wxPropertyGrid* propGrid, wxPGProperty if ( property->IsKindOf(CLASSINFO(wxFileProperty)) ) { fileProp = ((wxFileProperty*)property); - path = fileProp->m_filename.GetPath(); + wxFileName filename = fileProp->GetValue().GetString(); + path = filename.GetPath(); indFilter = fileProp->m_indFilter; if ( !path.length() && fileProp->m_basePath.length() ) @@ -1688,18 +1699,17 @@ void wxFileProperty::OnSetValue() { const wxString& fnstr = m_value.GetString(); - m_filename = fnstr; + wxFileName filename = fnstr; - if ( !m_filename.HasName() ) + if ( !filename.HasName() ) { m_value = wxPGVariant_EmptyString; - m_filename.Clear(); } // Find index for extension. if ( m_indFilter < 0 && fnstr.length() ) { - wxString ext = m_filename.GetExt(); + wxString ext = filename.GetExt(); int curind = 0; size_t pos = 0; size_t len = m_wildcard.length(); @@ -1736,29 +1746,44 @@ void wxFileProperty::OnSetValue() } } -wxString wxFileProperty::GetValueAsString( int argFlags ) const +wxFileName wxFileProperty::GetFileName() const { - // Always return empty string when name component is empty - wxString fullName = m_filename.GetFullName(); + wxFileName filename; + + if ( !m_value.IsNull() ) + filename = m_value.GetString(); + + return filename; +} + +wxString wxFileProperty::ValueToString( wxVariant& value, + int argFlags ) const +{ + wxFileName filename = value.GetString(); + + if ( !filename.HasName() ) + return wxEmptyString; + + wxString fullName = filename.GetFullName(); if ( !fullName.length() ) - return fullName; + return wxEmptyString; if ( argFlags & wxPG_FULL_VALUE ) { - return m_filename.GetFullPath(); + return filename.GetFullPath(); } else if ( m_flags & wxPG_PROP_SHOW_FULL_FILENAME ) { if ( m_basePath.Length() ) { - wxFileName fn2(m_filename); + wxFileName fn2(filename); fn2.MakeRelativeTo(m_basePath); return fn2.GetFullPath(); } - return m_filename.GetFullPath(); + return filename.GetFullPath(); } - return m_filename.GetFullName(); + return filename.GetFullName(); } wxPGEditorDialogAdapter* wxFileProperty::GetEditorDialog() const @@ -1768,9 +1793,11 @@ wxPGEditorDialogAdapter* wxFileProperty::GetEditorDialog() const bool wxFileProperty::StringToValue( wxVariant& variant, const wxString& text, int argFlags ) const { + wxFileName filename = variant.GetString(); + if ( (m_flags & wxPG_PROP_SHOW_FULL_FILENAME) || (argFlags & wxPG_FULL_VALUE) ) { - if ( m_filename != text ) + if ( filename != text ) { variant = text; return true; @@ -1778,9 +1805,9 @@ bool wxFileProperty::StringToValue( wxVariant& variant, const wxString& text, in } else { - if ( m_filename.GetFullName() != text ) + if ( filename.GetFullName() != text ) { - wxFileName fn = m_filename; + wxFileName fn = filename; fn.SetFullName(text); variant = fn.GetFullPath(); return true; @@ -1873,9 +1900,10 @@ wxLongStringProperty::wxLongStringProperty( const wxString& label, const wxStrin wxLongStringProperty::~wxLongStringProperty() {} -wxString wxLongStringProperty::GetValueAsString( int ) const +wxString wxLongStringProperty::ValueToString( wxVariant& value, + int WXUNUSED(argFlags) ) const { - return m_value; + return value; } bool wxLongStringProperty::OnEvent( wxPropertyGrid* propGrid, wxWindow* WXUNUSED(primary), @@ -2396,9 +2424,23 @@ void wxArrayStringProperty::OnSetValue() GenerateValueAsString(); } -wxString wxArrayStringProperty::GetValueAsString( int WXUNUSED(argFlags) ) const +#define ARRSTRPROP_ARRAY_TO_STRING(STRING,ARRAY) \ + wxPropertyGrid::ArrayStringToString(STRING,ARRAY,wxS('"'),wxS('"'),1) + +wxString wxArrayStringProperty::ValueToString( wxVariant& WXUNUSED(value), + int argFlags ) const { - return m_display; + // + // If this is called from GetValueAsString(), return cached string + if ( argFlags & wxPG_VALUE_IS_CURRENT ) + { + return m_display; + } + + wxArrayString arr = m_value.GetArrayString(); + wxString s; + ARRSTRPROP_ARRAY_TO_STRING(s, arr); + return s; } // Converts wxArrayString to a string separated by delimeters and spaces. @@ -2461,13 +2503,10 @@ void wxPropertyGrid::ArrayStringToString( wxString& dst, const wxArrayString& sr } } -#define ARRSTRPROP_ARRAY_TO_STRING(STRING,ARRAY) \ - wxPropertyGrid::ArrayStringToString(STRING,ARRAY,wxS('"'),wxS('"'),1); - void wxArrayStringProperty::GenerateValueAsString() { wxArrayString arr = m_value.GetArrayString(); - ARRSTRPROP_ARRAY_TO_STRING(m_display, arr) + ARRSTRPROP_ARRAY_TO_STRING(m_display, arr); } // Default implementation doesn't do anything. @@ -2525,7 +2564,7 @@ bool wxArrayStringProperty::OnButtonClick( wxPropertyGrid* propGrid, { wxArrayString actualValue = value.GetArrayString(); wxString tempStr; - ARRSTRPROP_ARRAY_TO_STRING(tempStr, actualValue) + ARRSTRPROP_ARRAY_TO_STRING(tempStr, actualValue); #if wxUSE_VALIDATORS if ( dialogValidator.DoValidate( propGrid, validator, tempStr ) ) #endif