// Author: Jaakko Salli
// Modified by:
// Created: 2008-08-31
-// RCS-ID: $Id:
+// RCS-ID: $Id$
// Copyright: (c) Jaakko Salli
-// Licence: wxWindows license
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PROPGRID_PROPGRIDDEFS_H_
#define _WX_PROPGRID_PROPGRIDDEFS_H_
+#include "wx/defs.h"
+
+#if wxUSE_PROPGRID
+
#include "wx/dynarray.h"
+#include "wx/vector.h"
#include "wx/hashmap.h"
#include "wx/variant.h"
+#include "wx/any.h"
#include "wx/longlong.h"
#include "wx/clntdata.h"
// NOTE: More in propertygrid.cpp
//
-#ifndef SWIG
-
#if defined(__WXMSW__)
// space between vertical line and value text
// space between vertical line and value editor control
#define wxPG_XBEFOREWIDGET 1
- // x position adjustment for wxTextCtrl (and like)
- #define wxPG_TEXTCTRLXADJUST 3
-
// comment to use bitmap buttons
#define wxPG_ICON_WIDTH 9
// 1 if wxRendererNative should be employed
#define wxPG_USE_RENDERER_NATIVE 0
- // 1 to use double-buffer that guarantees flicker-free painting
- #define wxPG_DOUBLE_BUFFER 1
-
// Enable tooltips
#define wxPG_SUPPORT_TOOLTIPS 1
// width of optional bitmap/image in front of property
#define wxPG_CUSTOM_IMAGE_WIDTH 20
- // 1 to create controls out of sight, hide them, and then move them into
- // correct position
- #define wxPG_CREATE_CONTROLS_HIDDEN 0
-
// 1 if splitter drag detect margin and control cannot overlap
#define wxPG_NO_CHILD_EVT_MOTION 0
- // If 1, then setting empty tooltip actually hides it
- #define wxPG_ALLOW_EMPTY_TOOLTIPS 1
-
#define wxPG_NAT_BUTTON_BORDER_ANY 1
#define wxPG_NAT_BUTTON_BORDER_X 1
#define wxPG_NAT_BUTTON_BORDER_Y 1
- // If 1 then controls are refreshed after selected was drawn.
- #define wxPG_REFRESH_CONTROLS_AFTER_REPAINT 0
+ // If 1 then controls are refreshed explicitly in a few places
+ #define wxPG_REFRESH_CONTROLS 0
#elif defined(__WXGTK__)
#define wxPG_XBEFOREWIDGET 1
// x position adjustment for wxTextCtrl (and like)
- #define wxPG_TEXTCTRLXADJUST 3
+ // NB: Only define wxPG_TEXTCTRLXADJUST for platforms that do not
+ // (yet) support wxTextEntry::SetMargins() for the left margin.
+ //#define wxPG_TEXTCTRLXADJUST 3
// comment to use bitmap buttons
#define wxPG_ICON_WIDTH 9
// 1 if wxRendererNative should be employed
- #define wxPG_USE_RENDERER_NATIVE 0
-
- // 1 to use double-buffer that guarantees flicker-free painting
- #define wxPG_DOUBLE_BUFFER 1
+ #define wxPG_USE_RENDERER_NATIVE 1
// Enable tooltips
#define wxPG_SUPPORT_TOOLTIPS 1
// width of optional bitmap/image in front of property
#define wxPG_CUSTOM_IMAGE_WIDTH 20
- // 1 to create controls out of sight, hide them, and then move them into
- // correct position
- #define wxPG_CREATE_CONTROLS_HIDDEN 0
-
// 1 if splitter drag detect margin and control cannot overlap
#define wxPG_NO_CHILD_EVT_MOTION 1
- // If 1, then setting empty tooltip actually hides it
- #define wxPG_ALLOW_EMPTY_TOOLTIPS 0
-
#define wxPG_NAT_BUTTON_BORDER_ANY 1
#define wxPG_NAT_BUTTON_BORDER_X 1
#define wxPG_NAT_BUTTON_BORDER_Y 1
// If 1 then controls are refreshed after selected was drawn.
- #define wxPG_REFRESH_CONTROLS_AFTER_REPAINT 1
+ #define wxPG_REFRESH_CONTROLS 1
#elif defined(__WXMAC__)
#define wxPG_XBEFOREWIDGET 1
// x position adjustment for wxTextCtrl (and like)
- #define wxPG_TEXTCTRLXADJUST 3
+ #define wxPG_TEXTCTRLXADJUST 0
// comment to use bitmap buttons
#define wxPG_ICON_WIDTH 11
// 1 if wxRendererNative should be employed
#define wxPG_USE_RENDERER_NATIVE 1
- // 1 to use double-buffer that guarantees flicker-free painting
- #define wxPG_DOUBLE_BUFFER 0
-
// Enable tooltips
#define wxPG_SUPPORT_TOOLTIPS 1
// width of optional bitmap/image in front of property
#define wxPG_CUSTOM_IMAGE_WIDTH 20
- // 1 to create controls out of sight, hide them, and then move them into
- // correct position
- #define wxPG_CREATE_CONTROLS_HIDDEN 0
-
// 1 if splitter drag detect margin and control cannot overlap
#define wxPG_NO_CHILD_EVT_MOTION 0
- // If 1, then setting empty tooltip actually hides it
- #define wxPG_ALLOW_EMPTY_TOOLTIPS 1
-
#define wxPG_NAT_BUTTON_BORDER_ANY 0
#define wxPG_NAT_BUTTON_BORDER_X 0
#define wxPG_NAT_BUTTON_BORDER_Y 0
// If 1 then controls are refreshed after selected was drawn.
- #define wxPG_REFRESH_CONTROLS_AFTER_REPAINT 0
+ #define wxPG_REFRESH_CONTROLS 0
#else // defaults
// 1 if wxRendererNative should be employed
#define wxPG_USE_RENDERER_NATIVE 0
- // 1 to use double-buffer that guarantees flicker-free painting
- #define wxPG_DOUBLE_BUFFER 0
-
// Enable tooltips
#define wxPG_SUPPORT_TOOLTIPS 0
// width of optional bitmap/image in front of property
#define wxPG_CUSTOM_IMAGE_WIDTH 20
- // 1 to create controls out of sight, hide them, and then move them into
- // correct position
- #define wxPG_CREATE_CONTROLS_HIDDEN 0
-
// 1 if splitter drag detect margin and control cannot overlap
#define wxPG_NO_CHILD_EVT_MOTION 1
- // If 1, then setting empty tooltip actually hides it
- #define wxPG_ALLOW_EMPTY_TOOLTIPS 0
-
#define wxPG_NAT_BUTTON_BORDER_ANY 0
#define wxPG_NAT_BUTTON_BORDER_X 0
#define wxPG_NAT_BUTTON_BORDER_Y 0
// If 1 then controls are refreshed after selected was drawn.
- #define wxPG_REFRESH_CONTROLS_AFTER_REPAINT 1
+ #define wxPG_REFRESH_CONTROLS 0
#endif // platform
#define wxCC_CUSTOM_IMAGE_MARGIN1 4 // before image
#define wxCC_CUSTOM_IMAGE_MARGIN2 5 // after image
+#define DEFAULT_IMAGE_OFFSET_INCREMENT \
+ (wxCC_CUSTOM_IMAGE_MARGIN1 + wxCC_CUSTOM_IMAGE_MARGIN2)
+
#define wxPG_DRAG_MARGIN 30
#if wxPG_NO_CHILD_EVT_MOTION
#if defined(__WXWINCE__)
#define wxPG_SMALL_SCREEN 1
- #undef wxPG_DOUBLE_BUFFER
- #define wxPG_DOUBLE_BUFFER 0
#else
#define wxPG_SMALL_SCREEN 0
#endif
-#endif // #ifndef SWIG
// Undefine wxPG_ICON_WIDTH to use supplied xpm bitmaps instead
// (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
// -----------------------------------------------------------------------
-// wxPG_CHECK_FOO_DBG - debug check with message that does not
-// interrupt program flow.
-#define wxPG_CHECK_RET_DBG(A,B) \
- if ( !(A) ) { wxLogWarning(B); return; }
-#define wxPG_CHECK_MSG_DBG(A,B,C) \
- if ( !(A) ) { wxLogWarning(C); return B; }
-
-
class wxPGEditor;
class wxPGProperty;
class wxPropertyCategory;
class wxPropertyGridEvent;
class wxPropertyGridManager;
class wxPGOwnerDrawnComboBox;
-class wxPGCustomComboControl;
class wxPGEditorDialogAdapter;
-struct wxPGValidationInfo;
+class wxPGValidationInfo;
// -----------------------------------------------------------------------
@{
*/
-#ifndef SWIG
- // Used to tell wxPGProperty to use label as name as well
- #define wxPG_LABEL (*wxPGProperty::sm_wxPG_LABEL)
- // This is the value placed in wxPGProperty::sm_wxPG_LABEL
- #define wxPG_LABEL_STRING wxS("@!")
- #define wxPG_NULL_BITMAP wxNullBitmap
- #define wxPG_COLOUR_BLACK (*wxBLACK)
-#else
- #define wxPG_NULL_BITMAP wxBitmap_NULL
- #define wxPG_COLOUR_BLACK wxColour_BLACK
-#endif // #ifndef SWIG
+// Used to tell wxPGProperty to use label as name as well
+#define wxPG_LABEL (*wxPGProperty::sm_wxPG_LABEL)
+
+// This is the value placed in wxPGProperty::sm_wxPG_LABEL
+#define wxPG_LABEL_STRING wxS("@!")
+#define wxPG_NULL_BITMAP wxNullBitmap
+#define wxPG_COLOUR_BLACK (*wxBLACK)
/** Convert Red, Green and Blue to a single 32-bit value.
*/
#define wxPG_DEFAULT_IMAGE_SIZE wxSize(-1, -1)
+/** This callback function is used for sorting properties.
+
+ Call wxPropertyGrid::SetSortFunction() to set it.
+
+ Sort function should return a value greater than 0 if position of p1 is
+ after p2. So, for instance, when comparing property names, you can use
+ following implementation:
+
+ @code
+ int MyPropertySortFunction(wxPropertyGrid* propGrid,
+ wxPGProperty* p1,
+ wxPGProperty* p2)
+ {
+ return p1->GetBaseName().compare( p2->GetBaseName() );
+ }
+ @endcode
+*/
+typedef int (*wxPGSortCallback)(wxPropertyGrid* propGrid,
+ wxPGProperty* p1,
+ wxPGProperty* p2);
+
+
+
typedef wxString wxPGCachedString;
/** @}
// -----------------------------------------------------------------------
-#ifndef SWIG
-
-#if wxUSE_STL
-typedef std::vector<wxPGProperty*> wxArrayPGProperty;
-#else
WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(wxPGProperty*, wxArrayPGProperty,
wxBaseArrayPtrVoid,
class WXDLLIMPEXP_PROPGRID);
-#endif
-// Always use wxString based hashmap with unicode, stl, swig and GCC 4.0+
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,
wxPGHashMapI2I,
class WXDLLIMPEXP_PROPGRID);
-#endif // #ifndef SWIG
+// Utility to find if specific item is in a vector. Returns index to
+// the item, or wxNOT_FOUND if not present.
+template<typename CONTAINER, typename T>
+int wxPGFindInVector( CONTAINER vector, const T& item )
+{
+ for ( unsigned int i=0; i<vector.size(); i++ )
+ {
+ if ( vector[i] == item )
+ return (int) i;
+ }
+ return wxNOT_FOUND;
+}
// -----------------------------------------------------------------------
wxPG_RECURSE_STARTS = 0x00000080,
/** Force value change. */
-wxPG_FORCE = 0x00000100
+wxPG_FORCE = 0x00000100,
+
+/** Only sort categories and their immediate children.
+ Sorting done by wxPG_AUTO_SORT option uses this.
+*/
+wxPG_SORT_TOP_LEVEL_ONLY = 0x00000200
};
// Used when dealing with fragments of composite string value
wxPG_COMPOSITE_FRAGMENT = 0x00000010,
- // Means property for which final string value is for can not really be
+ // Means property for which final string value is for cannot 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,
+
+ // Value is being set programmatically (ie. not by user)
+ wxPG_PROGRAMMATIC_VALUE = 0x00000080
};
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
// Editor class.
-#ifndef SWIG
-
-// Editor accessor.
+// Editor accessor (for backwards compatiblity use only).
#define wxPG_EDITOR(T) wxPGEditor_##T
-// Declare editor class, with optional part.
-#define WX_PG_DECLARE_EDITOR_WITH_DECL(EDITOR,DECL) \
-extern DECL wxPGEditor* wxPGEditor_##EDITOR; \
-extern DECL wxPGEditor* wxPGConstruct##EDITOR##EditorClass();
+// Macro for declaring editor class, with optional impexpdecl part.
+#ifndef WX_PG_DECLARE_EDITOR_WITH_DECL
+
+ #define WX_PG_DECLARE_EDITOR_WITH_DECL(EDITOR,DECL) \
+ extern DECL wxPGEditor* wxPGEditor_##EDITOR; \
+ extern DECL wxPGEditor* wxPGConstruct##EDITOR##EditorClass();
+
+#endif
// Declare editor class.
#define WX_PG_DECLARE_EDITOR(EDITOR) \
#endif
WX_PG_DECLARE_EDITOR_WITH_DECL(ChoiceAndButton,WXDLLIMPEXP_PROPGRID)
-#endif // !SWIG
-
// -----------------------------------------------------------------------
#ifndef SWIG
{ return wxVariant(value); }
template<> inline wxVariant WXVARIANT( const wxString& value )
{ return wxVariant(value); }
+#if wxUSE_LONGLONG
+template<> inline wxVariant WXVARIANT( const wxLongLong& value )
+ { return wxVariant(value); }
+template<> inline wxVariant WXVARIANT( const wxULongLong& value )
+ { return wxVariant(value); }
+#endif
#if wxUSE_DATETIME
template<> inline wxVariant WXVARIANT( const wxDateTime& value )
{ return wxVariant(value); }
#define WX_PG_IMPLEMENT_VARIANT_DATA(classname) \
WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED(classname, wxEMPTY_PARAMETER_VALUE)
-#define WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_NO_EQ(classname,expdecl) \
+// Add getter (ie. classname << variant) separately to allow
+// custom implementations.
+#define WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_NO_EQ_NO_GETTER(classname,expdecl) \
const char* classname##_VariantType = #classname; \
class classname##VariantData: public wxVariantData \
{ \
classname##VariantData( const classname &value ) { m_value = value; } \
\
classname &GetValue() { return m_value; } \
+\
+ const classname &GetValue() const { return m_value; } \
\
virtual bool Eq(wxVariantData& data) const; \
\
\
virtual wxVariantData* Clone() const { return new classname##VariantData(m_value); } \
\
- classname& GetValueRef() { return m_value; } \
-\
- const classname& GetValueRef() const { return m_value; } \
-\
+ DECLARE_WXANY_CONVERSION() \
protected:\
classname m_value; \
};\
\
+IMPLEMENT_TRIVIAL_WXANY_CONVERSION(classname, classname##VariantData) \
+\
wxString classname##VariantData::GetType() const\
{\
return wxS(#classname);\
}\
\
-expdecl classname& operator << ( classname &value, const wxVariant &variant )\
-{\
- wxASSERT( variant.GetType() == #classname );\
- \
- classname##VariantData *data = (classname##VariantData*) variant.GetData();\
- value = data->GetValue();\
- return value;\
-}\
-\
expdecl wxVariant& operator << ( wxVariant &variant, const classname &value )\
{\
classname##VariantData *data = new classname##VariantData( value );\
} \
expdecl classname& classname##RefFromVariant( wxVariant& variant ) \
{ \
- wxASSERT( variant.GetType() == #classname );\
- classname##VariantData *data = (classname##VariantData*) variant.GetData();\
- return data->GetValueRef();\
+ wxASSERT_MSG( variant.GetType() == wxS(#classname), \
+ wxString::Format("Variant type should have been '%s'" \
+ "instead of '%s'", \
+ wxS(#classname), \
+ variant.GetType().c_str())); \
+ classname##VariantData *data = \
+ (classname##VariantData*) variant.GetData(); \
+ return data->GetValue();\
} \
expdecl const classname& classname##RefFromVariant( const wxVariant& variant ) \
{ \
+ wxASSERT_MSG( variant.GetType() == wxS(#classname), \
+ wxString::Format("Variant type should have been '%s'" \
+ "instead of '%s'", \
+ wxS(#classname), \
+ variant.GetType().c_str())); \
+ classname##VariantData *data = \
+ (classname##VariantData*) variant.GetData(); \
+ return data->GetValue();\
+}
+
+#define WX_PG_IMPLEMENT_VARIANT_DATA_GETTER(classname, expdecl) \
+expdecl classname& operator << ( classname &value, const wxVariant &variant )\
+{\
wxASSERT( variant.GetType() == #classname );\
+ \
classname##VariantData *data = (classname##VariantData*) variant.GetData();\
- return data->GetValueRef();\
+ value = data->GetValue();\
+ return value;\
}
-// implements a wxVariantData-derived class using for the Eq() method the
-// operator== which must have been provided by "classname"
-#define WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED(classname,expdecl) \
-WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_NO_EQ(classname,wxEMPTY_PARAMETER_VALUE expdecl) \
-\
+#define WX_PG_IMPLEMENT_VARIANT_DATA_EQ(classname, expdecl) \
bool classname##VariantData::Eq(wxVariantData& data) const \
{\
wxASSERT( GetType() == data.GetType() );\
return otherData.m_value == m_value;\
}
+// implements a wxVariantData-derived class using for the Eq() method the
+// operator== which must have been provided by "classname"
+#define WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED(classname,expdecl) \
+WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_NO_EQ_NO_GETTER(classname,wxEMPTY_PARAMETER_VALUE expdecl) \
+WX_PG_IMPLEMENT_VARIANT_DATA_GETTER(classname,wxEMPTY_PARAMETER_VALUE expdecl) \
+WX_PG_IMPLEMENT_VARIANT_DATA_EQ(classname,wxEMPTY_PARAMETER_VALUE expdecl)
+
#define WX_PG_IMPLEMENT_VARIANT_DATA(classname) \
WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED(classname, wxEMPTY_PARAMETER_VALUE)
// with Eq() implementation that always returns false
#define WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_DUMMY_EQ(classname,expdecl) \
-WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_NO_EQ(classname,wxEMPTY_PARAMETER_VALUE expdecl) \
+WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_NO_EQ_NO_GETTER(classname,wxEMPTY_PARAMETER_VALUE expdecl) \
+WX_PG_IMPLEMENT_VARIANT_DATA_GETTER(classname,wxEMPTY_PARAMETER_VALUE expdecl) \
\
bool classname##VariantData::Eq(wxVariantData& WXUNUSED(data)) const \
{\
WX_PG_DECLARE_VARIANT_DATA_EXPORTED(wxPoint, WXDLLIMPEXP_PROPGRID)
WX_PG_DECLARE_VARIANT_DATA_EXPORTED(wxSize, WXDLLIMPEXP_PROPGRID)
WX_PG_DECLARE_VARIANT_DATA_EXPORTED(wxArrayInt, WXDLLIMPEXP_PROPGRID)
-WX_PG_DECLARE_VARIANT_DATA_EXPORTED(wxLongLong, WXDLLIMPEXP_PROPGRID)
-WX_PG_DECLARE_VARIANT_DATA_EXPORTED(wxULongLong, WXDLLIMPEXP_PROPGRID)
DECLARE_VARIANT_OBJECT_EXPORTED(wxFont, WXDLLIMPEXP_PROPGRID)
template<> inline wxVariant WXVARIANT( const wxFont& value )
{
#define wxPG_VARIANT_TYPE_DOUBLE wxS("double")
#define wxPG_VARIANT_TYPE_ARRSTRING wxS("arrstring")
#define wxPG_VARIANT_TYPE_DATETIME wxS("datetime")
-
-// Safely converts a wxVariant to (long) int. Supports converting from string
-// and boolean as well.
-WXDLLIMPEXP_PROPGRID
-long wxPGVariantToInt( const wxVariant& variant, long defVal = 1 );
-
-// Safely converts a wxVariant to wxLongLong_t. Returns true on success.
-WXDLLIMPEXP_PROPGRID
-bool wxPGVariantToLongLong( const wxVariant& variant, wxLongLong_t* pResult );
-
-// Safely converts a wxVariant to wxULongLong_t. Returns true on success.
-WXDLLIMPEXP_PROPGRID
-bool wxPGVariantToULongLong( const wxVariant& variant, wxULongLong_t* pResult );
-
-// Safely converts a wxVariant to double. Supports converting from string and
-// wxLongLong as well.
-WXDLLIMPEXP_PROPGRID
-bool wxPGVariantToDouble( const wxVariant& variant, double* pResult );
+#define wxPG_VARIANT_TYPE_LONGLONG wxS("longlong")
+#define wxPG_VARIANT_TYPE_ULONGLONG wxS("ulonglong")
#endif // !SWIG
// -----------------------------------------------------------------------
-#ifndef SWIG
-
//
// Tokenizer macros.
// NOTE: I have made two versions - worse ones (performance and consistency
#define WX_PG_TOKENIZER2_END() \
}
-#endif
-
// -----------------------------------------------------------------------
+#endif // wxUSE_PROPGRID
+
#endif // _WX_PROPGRID_PROPGRIDDEFS_H_