X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1425eca550ca78f6d0824e50376d763aff17242d..7344108e8a129a3f9b4df5ab0f98a1713db03b89:/include/wx/propgrid/propgriddefs.h diff --git a/include/wx/propgrid/propgriddefs.h b/include/wx/propgrid/propgriddefs.h index 98c339c062..f462f29e15 100644 --- a/include/wx/propgrid/propgriddefs.h +++ b/include/wx/propgrid/propgriddefs.h @@ -6,18 +6,21 @@ // Created: 2008-08-31 // 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" @@ -28,8 +31,6 @@ // NOTE: More in propertygrid.cpp // -#ifndef SWIG - #if defined(__WXMSW__) // space between vertical line and value text @@ -37,39 +38,26 @@ // 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__) @@ -79,38 +67,30 @@ #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 1 - // 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 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__) @@ -127,31 +107,21 @@ // 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 @@ -168,31 +138,21 @@ // 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 @@ -201,6 +161,9 @@ #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 @@ -217,13 +180,10 @@ #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) @@ -252,14 +212,6 @@ // ----------------------------------------------------------------------- -// 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; @@ -274,7 +226,6 @@ class wxPropertyGrid; class wxPropertyGridEvent; class wxPropertyGridManager; class wxPGOwnerDrawnComboBox; -class wxPGCustomComboControl; class wxPGEditorDialogAdapter; class wxPGValidationInfo; @@ -287,17 +238,13 @@ 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. */ @@ -310,6 +257,29 @@ class wxPGValidationInfo; #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; /** @} @@ -323,17 +293,10 @@ typedef wxString wxPGCachedString; // ----------------------------------------------------------------------- -#ifndef SWIG - -#if wxUSE_STL -typedef std::vector 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); @@ -341,7 +304,7 @@ WX_DECLARE_STRING_HASH_MAP_WITH_DECL(void*, WX_DECLARE_STRING_HASH_MAP_WITH_DECL(wxString, wxPGHashMapS2S, class WXDLLIMPEXP_PROPGRID); - + WX_DECLARE_VOIDPTR_HASH_MAP_WITH_DECL(void*, wxPGHashMapP2P, class WXDLLIMPEXP_PROPGRID); @@ -353,7 +316,18 @@ WX_DECLARE_HASH_MAP_WITH_DECL(wxInt32, 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 +int wxPGFindInVector( CONTAINER vector, const T& item ) +{ + for ( unsigned int i=0; i inline wxVariant WXVARIANT( const wxArrayString& value ) { 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); } @@ -547,10 +535,13 @@ public:\ \ virtual wxVariantData* Clone() const { return new classname##VariantData(m_value); } \ \ + DECLARE_WXANY_CONVERSION() \ protected:\ classname m_value; \ };\ \ +IMPLEMENT_TRIVIAL_WXANY_CONVERSION(classname, classname##VariantData) \ +\ wxString classname##VariantData::GetType() const\ {\ return wxS(#classname);\ @@ -564,14 +555,24 @@ expdecl wxVariant& operator << ( wxVariant &variant, const classname &value )\ } \ expdecl classname& classname##RefFromVariant( wxVariant& variant ) \ { \ - wxASSERT( variant.GetType() == #classname );\ - classname##VariantData *data = (classname##VariantData*) variant.GetData();\ + 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( variant.GetType() == #classname );\ - classname##VariantData *data = (classname##VariantData*) variant.GetData();\ + 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();\ } @@ -621,8 +622,6 @@ WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_DUMMY_EQ(classname, wxEMPTY_PARAMETER_VALU 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 ) { @@ -638,27 +637,6 @@ template<> inline wxVariant WXVARIANT( const wxColour& value ) return variant; } -#if wxUSE_LONGLONG_NATIVE - -template<> inline wxVariant WXVARIANT( const wxLongLong_t& value ) -{ - wxVariant variant; - variant << wxLongLong(value); - return variant; -} - -template<> inline wxVariant WXVARIANT( const wxULongLong_t& value ) -{ - wxVariant variant; - variant << wxULongLong(value); - return variant; -} - -WXDLLIMPEXP_PROPGRID wxLongLong_t& operator << ( wxLongLong_t &value, const wxVariant &variant ); -WXDLLIMPEXP_PROPGRID wxULongLong_t& operator << ( wxULongLong_t &value, const wxVariant &variant ); - -#endif // wxUSE_LONGLONG_NATIVE - // Define constants for common wxVariant type strings #define wxPG_VARIANT_TYPE_STRING wxPGGlobalVars->m_strstring @@ -668,31 +646,13 @@ WXDLLIMPEXP_PROPGRID wxULongLong_t& operator << ( wxULongLong_t &value, const wx #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 @@ -748,8 +708,6 @@ protected: #define WX_PG_TOKENIZER2_END() \ } -#endif - // ----------------------------------------------------------------------- #endif // wxUSE_PROPGRID