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
This commit is contained in:
Jaakko Salli
2008-10-16 17:19:50 +00:00
parent f7ca1dd416
commit 1425eca550
12 changed files with 388 additions and 167 deletions

View File

@@ -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;

View File

@@ -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.
*/
wxString GetValueString( int argFlags = 0 ) const;
virtual wxString GetValueAsString( int argFlags = 0 ) const;
/** Synonymous to GetValueAsString().
@deprecated Use GetValueAsString() instead.
@see GetValueAsString()
*/
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; }

View File

@@ -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,6 +338,9 @@ 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,
@@ -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
};
// -----------------------------------------------------------------------

View File

@@ -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;

View File

@@ -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.

View File

@@ -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 )

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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();
wxColourPropertyValue val = GetVal(&value);
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;
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");

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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