// Author: Jaakko Salli
// Modified by:
// Created: 2007-03-28
-// RCS-ID: $Id:
+// RCS-ID: $Id$
// Copyright: (c) Jaakko Salli
-// Licence: wxWindows license
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PROPGRID_PROPS_H_
#define _WX_PROPGRID_PROPS_H_
+#include "wx/defs.h"
+
+#if wxUSE_PROPGRID
+
// -----------------------------------------------------------------------
-class wxArrayEditorDialog;
+class wxPGArrayEditorDialog;
#include "wx/propgrid/editors.h"
-// -----------------------------------------------------------------------
+#include "wx/filename.h"
+#include "wx/dialog.h"
+#include "wx/textctrl.h"
+#include "wx/button.h"
+#include "wx/listbox.h"
+#include "wx/valtext.h"
-//
-// Additional property class declaration helper macros
-//
+// -----------------------------------------------------------------------
//
// Property class implementation helper macros.
//
-#define WX_PG_DECLARE_BASIC_TYPE_METHODS() \
- virtual wxString GetValueAsString( int argFlags = 0 ) const; \
- virtual bool StringToValue( wxVariant& variant, \
- const wxString& text, \
- int argFlags = 0 ) const;
-
-#define WX_PG_DECLARE_CHOICE_METHODS() \
- virtual bool IntToValue( wxVariant& variant, \
- int number, int argFlags = 0 ) const; \
- virtual int GetChoiceInfo( wxPGChoiceInfo* choiceinfo );
-
-#define WX_PG_DECLARE_EVENT_METHODS() \
- virtual bool OnEvent( wxPropertyGrid* propgrid, \
- wxWindow* primary, wxEvent& event );
-
-#define WX_PG_DECLARE_PARENTAL_METHODS() \
- virtual void ChildChanged( wxVariant& thisValue, \
- int childIndex, wxVariant& childValue ) const; \
- virtual void RefreshChildren();
-
-#define WX_PG_DECLARE_CUSTOM_PAINT_METHODS() \
- virtual wxSize OnMeasureImage( int item ) const; \
- virtual void OnCustomPaint( wxDC& dc, \
- const wxRect& rect, wxPGPaintData& paintdata );
-
-#define WX_PG_DECLARE_ATTRIBUTE_METHODS() \
- virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
-
-#define WX_PG_DECLARE_VALIDATOR_METHODS() \
- virtual wxValidator* DoGetValidator() const;
-
-// Adds constructor function as well.
-#define WX_PG_IMPLEMENT_PROPERTY_CLASS2(NAME,CLASSNAME,\
- UPCLASS,T,T_AS_ARG,EDITOR) \
+#define WX_PG_IMPLEMENT_PROPERTY_CLASS(NAME, UPCLASS, T, T_AS_ARG, EDITOR) \
IMPLEMENT_DYNAMIC_CLASS(NAME, UPCLASS) \
-WX_PG_IMPLEMENT_PROPERTY_CLASS_PLAIN(NAME,T,EDITOR)
-
-// A regular property
-#define WX_PG_IMPLEMENT_PROPERTY_CLASS(NAME,UPNAME,T,T_AS_ARG,EDITOR) \
-WX_PG_IMPLEMENT_PROPERTY_CLASS2(NAME,NAME,UPNAME,T,T_AS_ARG,EDITOR)
-
-#define WX_PG_DECLARE_DERIVED_PROPERTY_CLASS(CLASSNAME) \
-DECLARE_DYNAMIC_CLASS(CLASSNAME)
-
-// Derived property class is one that inherits from an existing working property
-// class, but assumes same value and editor type.
-#define WX_PG_IMPLEMENT_DERIVED_PROPERTY_CLASS(NAME,UPNAME,T_AS_ARG) \
-IMPLEMENT_DYNAMIC_CLASS(NAME, UPNAME)
-
-// -----------------------------------------------------------------------
-
-#define wxPG_NO_ESCAPE wxPG_PROP_NO_ESCAPE // No escape sequences
-#define wxPG_ESCAPE 0 // Escape sequences
-
-#define WX_PG_DECLARE_STRING_PROPERTY_WITH_DECL(NAME, DECL) \
-DECL NAME : public wxLongStringProperty \
-{ \
- WX_PG_DECLARE_DERIVED_PROPERTY_CLASS(NAME) \
-public: \
- NAME( const wxString& name = wxPG_LABEL, \
- const wxString& label = wxPG_LABEL, \
- const wxString& value = wxEmptyString); \
- virtual ~NAME(); \
- virtual bool OnButtonClick( wxPropertyGrid* propgrid, wxString& value ); \
- WX_PG_DECLARE_VALIDATOR_METHODS() \
-};
-
-#define WX_PG_DECLARE_STRING_PROPERTY(NAME) \
-WX_PG_DECLARE_STRING_PROPERTY_WITH_DECL(NAME, class) \
-
-#define WX_PG_IMPLEMENT_STRING_PROPERTY_WITH_VALIDATOR(NAME, FLAGS) \
-WX_PG_IMPLEMENT_DERIVED_PROPERTY_CLASS(NAME,wxLongStringProperty,\
- const wxString&) \
-NAME::NAME( const wxString& name, \
- const wxString& label, \
- const wxString& value ) \
- : wxLongStringProperty(name,label,value) \
-{ \
- m_flags |= FLAGS; \
-} \
-NAME::~NAME() { }
-
-#define WX_PG_IMPLEMENT_STRING_PROPERTY(NAME, FLAGS) \
-WX_PG_IMPLEMENT_STRING_PROPERTY_WITH_VALIDATOR(NAME,FLAGS) \
-wxValidator* NAME::DoGetValidator () const \
-{ return (wxValidator*) NULL; }
-
-// -----------------------------------------------------------------------
-
-#define WX_PG_DECLARE_CUSTOM_FLAGS_PROPERTY_WITH_DECL(CLASSNAME,DECL) \
-DECL CLASSNAME : public wxFlagsProperty \
-{ \
- WX_PG_DECLARE_PROPERTY_CLASS(CLASSNAME) \
-public: \
- CLASSNAME( const wxString& label = wxPG_LABEL, \
- const wxString& name = wxPG_LABEL, \
- long value = -1 ); \
- virtual ~CLASSNAME(); \
-};
-
-#define WX_PG_DECLARE_CUSTOM_FLAGS_PROPERTY(CLASSNAME) \
-WX_PG_DECLARE_CUSTOM_FLAGS_PROPERTY_WITH_DECL(CLASSNAME, class)
-
-// This will create interface for wxFlagsProperty derived class
-// named CLASSNAME.
-#define WX_PG_IMPLEMENT_CUSTOM_FLAGS_PROPERTY(CLASSNAME,LABELS,VALUES,DEFVAL) \
-WX_PG_IMPLEMENT_PROPERTY_CLASS(CLASSNAME,wxFlagsProperty,long_##CLASSNAME,\
- long,TextCtrl) \
-CLASSNAME::CLASSNAME( const wxString& label, \
- const wxString& name, \
- long value ) \
- : wxFlagsProperty(label,name,LABELS,VALUES,value!=-1?value:DEFVAL) \
-{ \
- m_flags |= wxPG_PROP_STATIC_CHOICES; \
-} \
-CLASSNAME::~CLASSNAME() { }
-
-
-// -----------------------------------------------------------------------
-
-#define WX_PG_DECLARE_CUSTOM_ENUM_PROPERTY_WITH_DECL(CLASSNAME, DECL) \
-class CLASSNAME : public wxEnumProperty \
-{ \
- WX_PG_DECLARE_PROPERTY_CLASS(CLASSNAME) \
-public: \
- CLASSNAME( const wxString& label = wxPG_LABEL, \
- const wxString& name = wxPG_LABEL, \
- int value = -1 ); \
- virtual ~CLASSNAME(); \
-};
-
-#define WX_PG_DECLARE_CUSTOM_ENUM_PROPERTY(CLASSNAME) \
-WX_PG_DECLARE_CUSTOM_ENUM_PROPERTY_WITH_DECL(CLASSNAME, class)
-
-#define WX_PG_IMPLEMENT_CUSTOM_ENUM_PROPERTY(CLASSNAME,LABELS,VALUES,DEFVAL) \
-WX_PG_IMPLEMENT_PROPERTY_CLASS(CLASSNAME, wxEnumProperty, long_##CLASSNAME, \
- int, Choice) \
-CLASSNAME::CLASSNAME( const wxString& label, const wxString& name, int value ) \
- : wxEnumProperty(label,name,LABELS,VALUES,value!=-1?value:DEFVAL) \
-{ \
- m_flags |= wxPG_PROP_STATIC_CHOICES; \
-} \
-CLASSNAME::~CLASSNAME() { }
-
-
-// -----------------------------------------------------------------------
-
-#define WX_PG_DECLARE_CUSTOM_COLOUR_PROPERTY_WITH_DECL(CLASSNAME, DECL) \
-DECL CLASSNAME : public wxSystemColourProperty \
-{ \
- DECLARE_DYNAMIC_CLASS(CLASSNAME) \
-public: \
- CLASSNAME( const wxString& label = wxPG_LABEL, \
- const wxString& name = wxPG_LABEL, \
- const wxColourPropertyValue& value = wxColourPropertyValue() ); \
- virtual ~CLASSNAME(); \
- virtual wxColour GetColour( int index ) const; \
-};
-
-#define WX_PG_DECLARE_CUSTOM_COLOUR_PROPERTY(CLASSNAME) \
-WX_PG_DECLARE_CUSTOM_COLOUR_PROPERTY_WITH_DECL(CLASSNAME, class)
-
-#define WX_PG_IMPLEMENT_CUSTOM_COLOUR_PROPERTY(CLASSNAME,\
- LABELS,VALUES,COLOURS) \
-static wxPGChoices gs_##CLASSNAME##_choicesCache; \
-WX_PG_IMPLEMENT_DERIVED_PROPERTY_CLASS(CLASSNAME, wxSystemColourProperty, \
- const wxColourPropertyValue&) \
-CLASSNAME::CLASSNAME( const wxString& label, const wxString& name, \
- const wxColourPropertyValue& value ) \
- : wxSystemColourProperty(label, name, LABELS, VALUES, \
- &gs_##CLASSNAME##_choicesCache, value ) \
-{ \
- m_flags |= wxPG_PROP_TRANSLATE_CUSTOM; \
-} \
-CLASSNAME::~CLASSNAME () { } \
-wxColour CLASSNAME::GetColour ( int index ) const \
-{ \
- if ( !m_choices.HasValue(index) ) \
- { \
- wxASSERT( index < (int)m_choices.GetCount() ); \
- return COLOURS[index]; \
- } \
- return COLOURS[m_choices.GetValue(index)]; \
-}
-
-// -----------------------------------------------------------------------
-
-#define WX_PG_DECLARE_CUSTOM_COLOUR_PROPERTY_USES_WXCOLOUR_WITH_DECL(CLASSNAME,\
- DECL) \
-DECL CLASSNAME : public wxSystemColourProperty \
-{ \
- WX_PG_DECLARE_PROPERTY_CLASS(CLASSNAME) \
-public: \
- CLASSNAME( const wxString& label = wxPG_LABEL, \
- const wxString& name = wxPG_LABEL, \
- const wxColour& value = wxColour() ); \
- virtual ~CLASSNAME(); \
- virtual wxString GetValueAsString( int argFlags ) const; \
- virtual wxColour GetColour( int index ) const; \
- virtual wxVariant DoTranslateVal( wxColourPropertyValue& v ) const; \
- void Init( wxColour colour ); \
-};
-
-#define WX_PG_DECLARE_CUSTOM_COLOUR_PROPERTY_USES_WXCOLOUR(CLASSNAME) \
-WX_PG_DECLARE_CUSTOM_COLOUR_PROPERTY_USES_WXCOLOUR_WITH_DECL(CLASSNAME, class)
-
-#define WX_PG_IMPLEMENT_CUSTOM_COLOUR_PROPERTY_USES_WXCOLOUR2(CLASSNAME, \
- LABELS, \
- VALUES, \
- COLOURS, \
- EDITOR) \
-static wxPGChoices gs_##CLASSNAME##_choicesCache; \
-WX_PG_IMPLEMENT_PROPERTY_CLASS(CLASSNAME, wxSystemColourProperty, \
- wxColour, const wxColour&,EDITOR) \
-CLASSNAME::CLASSNAME( const wxString& label, \
- const wxString& name, \
- const wxColour& value ) \
- : wxSystemColourProperty(label, name, LABELS, VALUES, \
- &gs_##CLASSNAME##_choicesCache, value ) \
-{ \
- if ( &value ) \
- Init( value ); \
- else \
- Init( *wxWHITE ); \
- m_flags |= wxPG_PROP_TRANSLATE_CUSTOM; \
-} \
-CLASSNAME::~CLASSNAME() { } \
-void CLASSNAME::Init( wxColour colour ) \
-{ \
- if ( !colour.Ok() ) \
- colour = *wxWHITE; \
- wxVariant variant; \
- variant << colour; \
- m_value = variant; \
- int ind = ColToInd(colour); \
- if ( ind < 0 ) \
- ind = m_choices.GetCount() - 1; \
- SetIndex( ind ); \
-} \
-wxString CLASSNAME::GetValueAsString( int argFlags ) const \
-{ \
- const wxPGEditor* editor = GetEditorClass(); \
- if ( editor != wxPG_EDITOR(Choice) && \
- editor != wxPG_EDITOR(ChoiceAndButton) && \
- editor != wxPG_EDITOR(ComboBox) ) \
- argFlags |= wxPG_PROPERTY_SPECIFIC; \
- return wxSystemColourProperty::GetValueAsString(argFlags); \
-} \
-wxColour CLASSNAME::GetColour( int index ) const \
-{ \
- if ( !m_choices.HasValue(index) ) \
- { \
- wxASSERT( index < (int)GetItemCount() ); \
- return COLOURS[index]; \
- } \
- return COLOURS[m_choices.GetValue(index)]; \
-} \
-wxVariant CLASSNAME::DoTranslateVal( wxColourPropertyValue& v ) const \
-{ \
- wxVariant variant; \
- variant << v.m_colour; \
- return variant; \
-}
-
-
-#define WX_PG_IMPLEMENT_CUSTOM_COLOUR_PROPERTY_USES_WXCOLOUR(CLASSNAME, \
- LABELS, \
- VALUES, \
- COLOURS) \
-WX_PG_IMPLEMENT_CUSTOM_COLOUR_PROPERTY_USES_WXCOLOUR2(CLASSNAME, \
- LABELS, \
- VALUES, \
- COLOURS, \
- Choice)
+WX_PG_IMPLEMENT_PROPERTY_CLASS_PLAIN(NAME, T, EDITOR)
// -----------------------------------------------------------------------
//
// These macros help creating DoGetValidator
#define WX_PG_DOGETVALIDATOR_ENTRY() \
- static wxValidator* s_ptr = (wxValidator*) NULL; \
+ static wxValidator* s_ptr = NULL; \
if ( s_ptr ) return s_ptr;
// Common function exit
#define WX_PG_DOGETVALIDATOR_EXIT(VALIDATOR) \
s_ptr = VALIDATOR; \
- wxPGGlobalVars->m_arrValidators.Add( (void*) VALIDATOR ); \
+ wxPGGlobalVars->m_arrValidators.push_back( VALIDATOR ); \
return VALIDATOR;
// -----------------------------------------------------------------------
-#ifndef SWIG
-
/** @class wxPGInDialogValidator
@ingroup classes
Creates and manages a temporary wxTextCtrl for validation purposes.
wxTextCtrl* m_textCtrl;
};
-#endif // SWIG
-
// -----------------------------------------------------------------------
// Property classes
Basic property with string value.
<b>Supported special attributes:</b>
- - "Password": set to 1 inorder to enable wxTE_PASSWORD on the editor.
+ - "Password": set to 1 in order to enable wxTE_PASSWORD on the editor.
@remarks
- If value "<composed>" is set, then actual value is formed (or composed)
const wxString& value = wxEmptyString );
virtual ~wxStringProperty();
- WX_PG_DECLARE_BASIC_TYPE_METHODS()
- WX_PG_DECLARE_ATTRIBUTE_METHODS()
+ virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
+ virtual bool StringToValue( wxVariant& variant,
+ const wxString& text,
+ int argFlags = 0 ) const;
+
+ virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
/** This is updated so "<composed>" special value can be handled.
*/
// -----------------------------------------------------------------------
-#ifndef SWIG
-/** Constants used with DoValidation() methods.
+/** Constants used with NumericValidation<>().
*/
-enum
+enum wxPGNumericValidationConstants
{
/** Instead of modifying the value, show an error message.
*/
*/
wxPG_PROPERTY_VALIDATION_WRAP = 2
};
-#endif
// -----------------------------------------------------------------------
+#if wxUSE_VALIDATORS
+
+/**
+ A more comprehensive numeric validator class.
+*/
+class WXDLLIMPEXP_PROPGRID wxNumericPropertyValidator : public wxTextValidator
+{
+public:
+ enum NumericType
+ {
+ Signed = 0,
+ Unsigned,
+ Float
+ };
+
+ wxNumericPropertyValidator( NumericType numericType, int base = 10 );
+ virtual ~wxNumericPropertyValidator() { }
+ virtual bool Validate(wxWindow* parent);
+};
+
+#endif // wxUSE_VALIDATORS
+
+
/** @class wxIntProperty
@ingroup classes
Basic property with integer value.
wxIntProperty( const wxString& label,
const wxString& name,
const wxLongLong& value );
- WX_PG_DECLARE_BASIC_TYPE_METHODS()
+ virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
+ virtual bool StringToValue( wxVariant& variant,
+ const wxString& text,
+ int argFlags = 0 ) const;
virtual bool ValidateValue( wxVariant& value,
wxPGValidationInfo& validationInfo ) const;
virtual bool IntToValue( wxVariant& variant,
wxUIntProperty( const wxString& label,
const wxString& name,
const wxULongLong& value );
- WX_PG_DECLARE_BASIC_TYPE_METHODS()
- WX_PG_DECLARE_ATTRIBUTE_METHODS()
+ virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
+ virtual bool StringToValue( wxVariant& variant,
+ const wxString& text,
+ int argFlags = 0 ) const;
+ virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
virtual bool ValidateValue( wxVariant& value,
wxPGValidationInfo& validationInfo ) const;
+ virtual wxValidator* DoGetValidator () const;
virtual bool IntToValue( wxVariant& variant,
int number,
int argFlags = 0 ) const;
double value = 0.0 );
virtual ~wxFloatProperty();
- WX_PG_DECLARE_BASIC_TYPE_METHODS()
- WX_PG_DECLARE_ATTRIBUTE_METHODS()
+ virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
+ virtual bool StringToValue( wxVariant& variant,
+ const wxString& text,
+ int argFlags = 0 ) const;
+ virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
virtual bool ValidateValue( wxVariant& value,
wxPGValidationInfo& validationInfo ) const;
wxPGValidationInfo* pValidationInfo,
int mode =
wxPG_PROPERTY_VALIDATION_ERROR_MESSAGE );
+ static wxValidator* GetClassValidator();
+ virtual wxValidator* DoGetValidator () const;
protected:
int m_precision;
- virtual wxValidator* DoGetValidator () const;
};
// -----------------------------------------------------------------------
-// Exclude class from wxPython bindings
-#ifndef SWIG
-
/** @class wxBoolProperty
@ingroup classes
Basic property with boolean value.
bool value = false );
virtual ~wxBoolProperty();
- WX_PG_DECLARE_BASIC_TYPE_METHODS()
- WX_PG_DECLARE_CHOICE_METHODS()
- WX_PG_DECLARE_ATTRIBUTE_METHODS()
-};
-
-#endif // !SWIG
-
-// -----------------------------------------------------------------------
-
-/** @class wxBaseEnumProperty
- @ingroup classes
- Derive dynamic custom properties with choices from this class.
-
- @remarks
- - Updating private index is important. You can do this either by calling
- SetIndex() in IntToValue, and then letting wxBaseEnumProperty::OnSetValue
- be called (by not implementing it, or by calling super class function in
- it) -OR- you can just call SetIndex in OnSetValue.
-*/
-class WXDLLIMPEXP_PROPGRID wxBaseEnumProperty : public wxPGProperty
-{
-public:
- wxBaseEnumProperty( const wxString& label = wxPG_LABEL,
- 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;
- virtual bool ValidateValue( wxVariant& value,
- wxPGValidationInfo& validationInfo ) const;
-
- // If wxPG_FULL_VALUE is not set in flags, then the value is interpreted
- // as index to choices list. Otherwise, it is actual value.
virtual bool IntToValue( wxVariant& variant,
- int number,
- int argFlags = 0 ) const;
-
- //
- // Additional virtuals
-
- // This must be overridden to have non-index based value
- virtual int GetIndexForValue( int value ) const;
-
- // This returns string and value for index
- // Returns NULL if beyond last item
- // pvalue is never NULL - always set it.
- virtual const wxString* GetEntry( size_t index, int* pvalue ) const = 0;
-
- int GetValueForIndex( size_t index ) const
- {
- int v;
- GetEntry( index, &v );
- return v;
- }
-
-protected:
-
- int GetIndex() const;
- void SetIndex( int index );
-
- bool ValueFromString_( wxVariant& value,
- const wxString& text,
- int argFlags ) const;
- bool ValueFromInt_( wxVariant& value, int intVal, int argFlags ) const;
-
- static void ResetNextIndex() { ms_nextIndex = -2; }
-
-private:
- // This is private so that classes are guaranteed to use GetIndex
- // for up-to-date index value.
- int m_index;
-
- // Relies on ValidateValue being called always before OnSetValue
- static int ms_nextIndex;
+ int number, int argFlags = 0 ) const;
+ virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
};
// -----------------------------------------------------------------------
@ingroup classes
You can derive custom properties with choices from this class. See
wxBaseEnumProperty for remarks.
+
+ @remarks
+ - Updating private index is important. You can do this either by calling
+ SetIndex() in IntToValue, and then letting wxBaseEnumProperty::OnSetValue
+ be called (by not implementing it, or by calling super class function in
+ it) -OR- you can just call SetIndex in OnSetValue.
*/
-class WXDLLIMPEXP_PROPGRID wxEnumProperty : public wxBaseEnumProperty
+class WXDLLIMPEXP_PROPGRID wxEnumProperty : public wxPGProperty
{
WX_PG_DECLARE_PROPERTY_CLASS(wxEnumProperty)
public:
#ifndef SWIG
wxEnumProperty( const wxString& label = wxPG_LABEL,
const wxString& name = wxPG_LABEL,
- const wxChar** labels = NULL,
+ const wxChar* const* labels = NULL,
const long* values = NULL,
int value = 0 );
wxEnumProperty( const wxString& label,
// Special constructor for caching choices (used by derived class)
wxEnumProperty( const wxString& label,
const wxString& name,
- const wxChar** labels,
+ const wxChar* const* labels,
const long* values,
wxPGChoices* choicesCache,
int value = 0 );
virtual ~wxEnumProperty();
- virtual int GetChoiceInfo( wxPGChoiceInfo* choiceinfo );
+ size_t GetItemCount() const { return m_choices.GetCount(); }
+
+ virtual void OnSetValue();
+ virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
+ virtual bool StringToValue( wxVariant& variant,
+ const wxString& text,
+ int argFlags = 0 ) const;
+ virtual bool ValidateValue( wxVariant& value,
+ wxPGValidationInfo& validationInfo ) const;
+
+ // If wxPG_FULL_VALUE is not set in flags, then the value is interpreted
+ // as index to choices list. Otherwise, it is actual value.
+ virtual bool IntToValue( wxVariant& variant,
+ int number,
+ int argFlags = 0 ) const;
+
+ //
+ // Additional virtuals
+
+ // This must be overridden to have non-index based value
virtual int GetIndexForValue( int value ) const;
- virtual const wxString* GetEntry( size_t index, int* pvalue ) const;
- size_t GetItemCount() const { return m_choices.GetCount(); }
- const wxPGChoices& GetChoices() const { return m_choices; }
+ // GetChoiceSelection needs to overridden since m_index is
+ // the true index, and various property classes derived from
+ // this take advantage of it.
+ virtual int GetChoiceSelection() const { return m_index; }
+
+ virtual void OnValidationFailure( wxVariant& pendingValue );
protected:
- wxPGChoices m_choices;
+
+ int GetIndex() const;
+ void SetIndex( int index );
+
+ bool ValueFromString_( wxVariant& value,
+ const wxString& text,
+ int argFlags ) const;
+ bool ValueFromInt_( wxVariant& value, int intVal, int argFlags ) const;
+
+ static void ResetNextIndex() { ms_nextIndex = -2; }
+
+private:
+ // This is private so that classes are guaranteed to use GetIndex
+ // for up-to-date index value.
+ int m_index;
+
+ // Relies on ValidateValue being called always before OnSetValue
+ static int ms_nextIndex;
};
// -----------------------------------------------------------------------
wxEditEnumProperty( const wxString& label,
const wxString& name,
- const wxChar** labels,
+ const wxChar* const* labels,
const long* values,
const wxString& value );
wxEditEnumProperty( const wxString& label = wxPG_LABEL,
// Special constructor for caching choices (used by derived class)
wxEditEnumProperty( const wxString& label,
const wxString& name,
- const wxChar** labels,
+ const wxChar* const* labels,
const long* values,
wxPGChoices* choicesCache,
const wxString& value );
@ingroup classes
Represents a bit set that fits in a long integer. wxBoolProperty
sub-properties are created for editing individual bits. Textctrl is created
- to manually edit the flags as a text; a continous sequence of spaces,
+ to manually edit the flags as a text; a continuous sequence of spaces,
commas and semicolons is considered as a flag id separator.
<b>Note:</b> When changing "choices" (ie. flag labels) of wxFlagsProperty,
you will need to use SetPropertyChoices - otherwise they will not get
#ifndef SWIG
wxFlagsProperty( const wxString& label,
const wxString& name,
- const wxChar** labels,
+ const wxChar* const* labels,
const long* values = NULL,
long value = 0 );
wxFlagsProperty( const wxString& label,
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;
- virtual void ChildChanged( wxVariant& thisValue,
- int childIndex,
- wxVariant& childValue ) const;
+ virtual wxVariant ChildChanged( wxVariant& thisValue,
+ int childIndex,
+ wxVariant& childValue ) const;
virtual void RefreshChildren();
+ virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
- // this is necessary for conveying m_choices
- virtual int GetChoiceInfo( wxPGChoiceInfo* choiceinfo );
+ // GetChoiceSelection needs to overridden since m_choices is
+ // used and value is integer, but it is not index.
+ virtual int GetChoiceSelection() const { return wxNOT_FOUND; }
// helpers
size_t GetItemCount() const { return m_choices.GetCount(); }
const wxString& GetLabel( size_t ind ) const
- { return m_choices.GetLabel(ind); }
+ { return m_choices.GetLabel(static_cast<int>(ind)); }
protected:
- wxPGChoices m_choices;
-
// Used to detect if choices have been changed
wxPGChoicesData* m_oldChoicesData;
// -----------------------------------------------------------------------
-#include "wx/filename.h"
-
// Indicates first bit useable by derived properties.
#define wxPG_PROP_SHOW_FULL_FILENAME wxPG_PROP_CLASS_SPECIFIC_1
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;
virtual wxPGEditorDialogAdapter* GetEditorDialog() const;
-
- WX_PG_DECLARE_ATTRIBUTE_METHODS()
+ virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
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
};
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;
-
- WX_PG_DECLARE_EVENT_METHODS()
+ virtual bool OnEvent( wxPropertyGrid* propgrid,
+ wxWindow* primary, wxEvent& event );
// Shows string editor dialog. Value to be edited should be read from
// value, and if dialog is not cancelled, it should be stored back and true
// -----------------------------------------------------------------------
-// Exclude class from wxPython bindings
-#ifndef SWIG
-
/** @class wxDirProperty
@ingroup classes
Like wxLongStringProperty, but the button triggers dir selector instead.
*/
class WXDLLIMPEXP_PROPGRID wxDirProperty : public wxLongStringProperty
{
-#ifndef SWIG
DECLARE_DYNAMIC_CLASS(wxDirProperty)
-#endif
public:
wxDirProperty( const wxString& name = wxPG_LABEL,
const wxString& label = wxPG_LABEL,
const wxString& value = wxEmptyString );
virtual ~wxDirProperty();
- WX_PG_DECLARE_ATTRIBUTE_METHODS()
- WX_PG_DECLARE_VALIDATOR_METHODS()
+ virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
+ virtual wxValidator* DoGetValidator() const;
virtual bool OnButtonClick ( wxPropertyGrid* propGrid, wxString& value );
wxString m_dlgMessage;
};
-#endif // !SWIG
-
// -----------------------------------------------------------------------
// wxBoolProperty specific flags
{
WX_PG_DECLARE_PROPERTY_CLASS(wxArrayStringProperty)
public:
-
wxArrayStringProperty( const wxString& label = wxPG_LABEL,
const wxString& name = wxPG_LABEL,
const wxArrayString& value = wxArrayString() );
virtual ~wxArrayStringProperty();
virtual void OnSetValue();
- WX_PG_DECLARE_BASIC_TYPE_METHODS()
- WX_PG_DECLARE_EVENT_METHODS()
+ virtual wxString ValueToString( wxVariant& value, int argFlags = 0 ) const;
+ virtual bool StringToValue( wxVariant& variant,
+ const wxString& text,
+ int argFlags = 0 ) const;
+ virtual bool OnEvent( wxPropertyGrid* propgrid,
+ wxWindow* primary, wxEvent& event );
+ virtual bool DoSetAttribute( const wxString& name, wxVariant& value );
- virtual void GenerateValueAsString();
+ // Implement in derived class for custom array-to-string conversion.
+ virtual void ConvertArrayToString(const wxArrayString& arr,
+ wxString* pString,
+ const wxUniChar& delimiter) const;
// Shows string editor dialog. Value to be edited should be read from
// value, and if dialog is not cancelled, it should be stored back and true
wxWindow* primary,
const wxChar* cbt );
-#ifndef SWIG
- // Creates wxArrayEditorDialog for string editing. Called in OnButtonClick.
- virtual wxArrayEditorDialog* CreateEditorDialog();
-#endif
+ // Creates wxPGArrayEditorDialog for string editing. Called in OnButtonClick.
+ virtual wxPGArrayEditorDialog* CreateEditorDialog();
+
+ enum ConversionFlags
+ {
+ Escape = 0x01,
+ QuoteStrings = 0x02
+ };
+
+ /**
+ Generates contents for string dst based on the contents of
+ wxArrayString src.
+ */
+ static void ArrayStringToString( wxString& dst, const wxArrayString& src,
+ wxUniChar delimiter, int flags );
protected:
+ // Previously this was to be implemented in derived class for array-to-
+ // string conversion. Now you should implement ConvertValueToString()
+ // instead.
+ virtual void GenerateValueAsString();
+
wxString m_display; // Cache for displayed text.
+ wxUniChar m_delimiter;
};
// -----------------------------------------------------------------------
const wxString& name = wxPG_LABEL, \
const wxArrayString& value = wxArrayString() ); \
~PROPNAME(); \
- virtual void GenerateValueAsString(); \
- virtual bool StringToValue( wxVariant& value, \
- const wxString& text, int = 0 ) const; \
virtual bool OnEvent( wxPropertyGrid* propgrid, \
wxWindow* primary, wxEvent& event ); \
virtual bool OnCustomStringEdit( wxWindow* parent, wxString& value ); \
- WX_PG_DECLARE_VALIDATOR_METHODS() \
+ virtual wxValidator* DoGetValidator() const; \
};
#define WX_PG_DECLARE_ARRAYSTRING_PROPERTY_WITH_VALIDATOR(PROPNAM) \
: wxArrayStringProperty(label,name,value) \
{ \
PROPNAME::GenerateValueAsString(); \
+ m_delimiter = DELIMCHAR; \
} \
PROPNAME::~PROPNAME() { } \
-void PROPNAME::GenerateValueAsString() \
-{ \
- wxChar delimChar = DELIMCHAR; \
- if ( delimChar == wxS('"') ) \
- wxArrayStringProperty::GenerateValueAsString(); \
- else \
- wxPropertyGrid::ArrayStringToString(m_display, \
- m_value.GetArrayString(), \
- 0,DELIMCHAR,0); \
-} \
-bool PROPNAME::StringToValue( wxVariant& variant, \
- const wxString& text, int ) const \
-{ \
- wxChar delimChar = DELIMCHAR; \
- if ( delimChar == wxS('"') ) \
- return wxArrayStringProperty::StringToValue(variant, text, 0); \
- \
- wxArrayString arr; \
- WX_PG_TOKENIZER1_BEGIN(text,DELIMCHAR) \
- arr.Add( token ); \
- WX_PG_TOKENIZER1_END() \
- variant = arr; \
- return true; \
-} \
bool PROPNAME::OnEvent( wxPropertyGrid* propgrid, \
wxWindow* primary, wxEvent& event ) \
{ \
DELIMCHAR, \
CUSTBUTTXT) \
wxValidator* PROPNAME::DoGetValidator () const \
-{ return (wxValidator*) NULL; }
+{ return NULL; }
// -----------------------------------------------------------------------
-// wxArrayEditorDialog
+// wxPGArrayEditorDialog
// -----------------------------------------------------------------------
-#include "wx/textctrl.h"
-#include "wx/button.h"
-#include "wx/listbox.h"
+#if wxUSE_EDITABLELISTBOX
+
+class WXDLLIMPEXP_FWD_ADV wxEditableListBox;
+class WXDLLIMPEXP_FWD_CORE wxListEvent;
#define wxAEDIALOG_STYLE \
(wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxOK | wxCANCEL | wxCENTRE)
-class WXDLLIMPEXP_PROPGRID wxArrayEditorDialog : public wxDialog
+class WXDLLIMPEXP_PROPGRID wxPGArrayEditorDialog : public wxDialog
{
public:
- wxArrayEditorDialog();
- virtual ~wxArrayEditorDialog() { }
+ wxPGArrayEditorDialog();
+ virtual ~wxPGArrayEditorDialog() { }
void Init();
- wxArrayEditorDialog( wxWindow *parent,
+ wxPGArrayEditorDialog( wxWindow *parent,
const wxString& message,
const wxString& caption,
long style = wxAEDIALOG_STYLE,
const wxPoint& pos = wxDefaultPosition,
const wxSize& sz = wxDefaultSize );
+ void EnableCustomNewAction()
+ {
+ m_hasCustomNewAction = true;
+ }
+
/** Set value modified by dialog.
*/
virtual void SetDialogValue( const wxVariant& WXUNUSED(value) )
*/
virtual wxValidator* GetTextCtrlValidator() const
{
- return (wxValidator*) NULL;
+ return NULL;
}
// Returns true if array was actually modified
bool IsModified() const { return m_modified; }
- //const wxArrayString& GetStrings() const { return m_array; }
+ // wxEditableListBox utilities
+ int GetSelection() const;
// implementation from now on
- void OnUpdateClick(wxCommandEvent& event);
void OnAddClick(wxCommandEvent& event);
void OnDeleteClick(wxCommandEvent& event);
- void OnListBoxClick(wxCommandEvent& event);
void OnUpClick(wxCommandEvent& event);
void OnDownClick(wxCommandEvent& event);
- //void OnCustomEditClick(wxCommandEvent& event);
+ void OnEndLabelEdit(wxListEvent& event);
void OnIdle(wxIdleEvent& event);
protected:
- wxTextCtrl* m_edValue;
- wxListBox* m_lbStrings;
+ wxEditableListBox* m_elb;
- wxButton* m_butAdd; // Button pointers
- wxButton* m_butCustom; // required for disabling/enabling changing.
- wxButton* m_butUpdate;
- wxButton* m_butRemove;
- wxButton* m_butUp;
- wxButton* m_butDown;
+ // These are used for focus repair
+ wxWindow* m_elbSubPanel;
+ wxWindow* m_lastFocused;
- //wxArrayString m_array;
-
- const wxChar* m_custBtText;
- //wxArrayStringPropertyClass* m_pCallingClass;
+ // A new item, edited by user, is pending at this index.
+ // It will be committed once list ctrl item editing is done.
+ int m_itemPendingAtIndex;
bool m_modified;
-
- unsigned char m_curFocus;
+ bool m_hasCustomNewAction;
// These must be overridden - must return true on success.
virtual wxString ArrayGet( size_t index ) = 0;
virtual bool ArraySet( size_t index, const wxString& str ) = 0;
virtual void ArrayRemoveAt( int index ) = 0;
virtual void ArraySwap( size_t first, size_t second ) = 0;
+ virtual bool OnCustomNewAction(wxString* WXUNUSED(resString))
+ {
+ return false;
+ }
private:
-#ifndef SWIG
- DECLARE_DYNAMIC_CLASS_NO_COPY(wxArrayEditorDialog)
+ DECLARE_DYNAMIC_CLASS_NO_COPY(wxPGArrayEditorDialog)
DECLARE_EVENT_TABLE()
-#endif
};
+#endif // wxUSE_EDITABLELISTBOX
+
// -----------------------------------------------------------------------
// wxPGArrayStringEditorDialog
// -----------------------------------------------------------------------
class WXDLLIMPEXP_PROPGRID
- wxPGArrayStringEditorDialog : public wxArrayEditorDialog
+ wxPGArrayStringEditorDialog : public wxPGArrayEditorDialog
{
public:
wxPGArrayStringEditorDialog();
return m_array;
}
- void SetCustomButton( const wxChar* custBtText, wxArrayStringProperty* pcc )
+ void SetCustomButton( const wxString& custBtText,
+ wxArrayStringProperty* pcc )
{
- m_custBtText = custBtText;
- m_pCallingClass = pcc;
+ if ( !custBtText.empty() )
+ {
+ EnableCustomNewAction();
+ m_pCallingClass = pcc;
+ }
}
- void OnCustomEditClick(wxCommandEvent& event);
+ virtual bool OnCustomNewAction(wxString* resString);
protected:
wxArrayString m_array;
virtual void ArraySwap( size_t first, size_t second );
private:
-#ifndef SWIG
DECLARE_DYNAMIC_CLASS_NO_COPY(wxPGArrayStringEditorDialog)
DECLARE_EVENT_TABLE()
-#endif
};
// -----------------------------------------------------------------------
+#endif // wxUSE_PROPGRID
+
#endif // _WX_PROPGRID_PROPS_H_