propgriddefs.h 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name: wx/propgrid/propgriddefs.h
  3. // Purpose: wxPropertyGrid miscellaneous definitions
  4. // Author: Jaakko Salli
  5. // Modified by:
  6. // Created: 2008-08-31
  7. // Copyright: (c) Jaakko Salli
  8. // Licence: wxWindows licence
  9. /////////////////////////////////////////////////////////////////////////////
  10. #ifndef _WX_PROPGRID_PROPGRIDDEFS_H_
  11. #define _WX_PROPGRID_PROPGRIDDEFS_H_
  12. #include "wx/defs.h"
  13. #if wxUSE_PROPGRID
  14. #include "wx/dynarray.h"
  15. #include "wx/vector.h"
  16. #include "wx/hashmap.h"
  17. #include "wx/variant.h"
  18. #include "wx/any.h"
  19. #include "wx/longlong.h"
  20. #include "wx/clntdata.h"
  21. // -----------------------------------------------------------------------
  22. //
  23. // Here are some platform dependent defines
  24. // NOTE: More in propertygrid.cpp
  25. //
  26. #if defined(__WXMSW__)
  27. // space between vertical line and value text
  28. #define wxPG_XBEFORETEXT 4
  29. // space between vertical line and value editor control
  30. #define wxPG_XBEFOREWIDGET 1
  31. // comment to use bitmap buttons
  32. #define wxPG_ICON_WIDTH 9
  33. // 1 if wxRendererNative should be employed
  34. #define wxPG_USE_RENDERER_NATIVE 0
  35. // Enable tooltips
  36. #define wxPG_SUPPORT_TOOLTIPS 1
  37. // width of optional bitmap/image in front of property
  38. #define wxPG_CUSTOM_IMAGE_WIDTH 20
  39. // 1 if splitter drag detect margin and control cannot overlap
  40. #define wxPG_NO_CHILD_EVT_MOTION 0
  41. #define wxPG_NAT_BUTTON_BORDER_ANY 1
  42. #define wxPG_NAT_BUTTON_BORDER_X 1
  43. #define wxPG_NAT_BUTTON_BORDER_Y 1
  44. // If 1 then controls are refreshed explicitly in a few places
  45. #define wxPG_REFRESH_CONTROLS 0
  46. #elif defined(__WXGTK__)
  47. // space between vertical line and value text
  48. #define wxPG_XBEFORETEXT 5
  49. // space between vertical line and value editor control
  50. #define wxPG_XBEFOREWIDGET 1
  51. // x position adjustment for wxTextCtrl (and like)
  52. // NB: Only define wxPG_TEXTCTRLXADJUST for platforms that do not
  53. // (yet) support wxTextEntry::SetMargins() for the left margin.
  54. //#define wxPG_TEXTCTRLXADJUST 3
  55. // comment to use bitmap buttons
  56. #define wxPG_ICON_WIDTH 9
  57. // 1 if wxRendererNative should be employed
  58. #define wxPG_USE_RENDERER_NATIVE 1
  59. // Enable tooltips
  60. #define wxPG_SUPPORT_TOOLTIPS 1
  61. // width of optional bitmap/image in front of property
  62. #define wxPG_CUSTOM_IMAGE_WIDTH 20
  63. // 1 if splitter drag detect margin and control cannot overlap
  64. #define wxPG_NO_CHILD_EVT_MOTION 1
  65. #define wxPG_NAT_BUTTON_BORDER_ANY 1
  66. #define wxPG_NAT_BUTTON_BORDER_X 1
  67. #define wxPG_NAT_BUTTON_BORDER_Y 1
  68. // If 1 then controls are refreshed after selected was drawn.
  69. #define wxPG_REFRESH_CONTROLS 1
  70. #elif defined(__WXMAC__)
  71. // space between vertical line and value text
  72. #define wxPG_XBEFORETEXT 4
  73. // space between vertical line and value editor widget
  74. #define wxPG_XBEFOREWIDGET 1
  75. // x position adjustment for wxTextCtrl (and like)
  76. #define wxPG_TEXTCTRLXADJUST 0
  77. // comment to use bitmap buttons
  78. #define wxPG_ICON_WIDTH 11
  79. // 1 if wxRendererNative should be employed
  80. #define wxPG_USE_RENDERER_NATIVE 1
  81. // Enable tooltips
  82. #define wxPG_SUPPORT_TOOLTIPS 1
  83. // width of optional bitmap/image in front of property
  84. #define wxPG_CUSTOM_IMAGE_WIDTH 20
  85. // 1 if splitter drag detect margin and control cannot overlap
  86. #define wxPG_NO_CHILD_EVT_MOTION 0
  87. #define wxPG_NAT_BUTTON_BORDER_ANY 0
  88. #define wxPG_NAT_BUTTON_BORDER_X 0
  89. #define wxPG_NAT_BUTTON_BORDER_Y 0
  90. // If 1 then controls are refreshed after selected was drawn.
  91. #define wxPG_REFRESH_CONTROLS 0
  92. #else // defaults
  93. // space between vertical line and value text
  94. #define wxPG_XBEFORETEXT 5
  95. // space between vertical line and value editor widget
  96. #define wxPG_XBEFOREWIDGET 1
  97. // x position adjustment for wxTextCtrl (and like)
  98. #define wxPG_TEXTCTRLXADJUST 3
  99. // comment to use bitmap buttons
  100. #define wxPG_ICON_WIDTH 9
  101. // 1 if wxRendererNative should be employed
  102. #define wxPG_USE_RENDERER_NATIVE 0
  103. // Enable tooltips
  104. #define wxPG_SUPPORT_TOOLTIPS 0
  105. // width of optional bitmap/image in front of property
  106. #define wxPG_CUSTOM_IMAGE_WIDTH 20
  107. // 1 if splitter drag detect margin and control cannot overlap
  108. #define wxPG_NO_CHILD_EVT_MOTION 1
  109. #define wxPG_NAT_BUTTON_BORDER_ANY 0
  110. #define wxPG_NAT_BUTTON_BORDER_X 0
  111. #define wxPG_NAT_BUTTON_BORDER_Y 0
  112. // If 1 then controls are refreshed after selected was drawn.
  113. #define wxPG_REFRESH_CONTROLS 0
  114. #endif // platform
  115. #define wxPG_CONTROL_MARGIN 0 // space between splitter and control
  116. #define wxCC_CUSTOM_IMAGE_MARGIN1 4 // before image
  117. #define wxCC_CUSTOM_IMAGE_MARGIN2 5 // after image
  118. #define DEFAULT_IMAGE_OFFSET_INCREMENT \
  119. (wxCC_CUSTOM_IMAGE_MARGIN1 + wxCC_CUSTOM_IMAGE_MARGIN2)
  120. #define wxPG_DRAG_MARGIN 30
  121. #if wxPG_NO_CHILD_EVT_MOTION
  122. #define wxPG_SPLITTERX_DETECTMARGIN1 3 // this much on left
  123. #define wxPG_SPLITTERX_DETECTMARGIN2 2 // this much on right
  124. #else
  125. #define wxPG_SPLITTERX_DETECTMARGIN1 3 // this much on left
  126. #define wxPG_SPLITTERX_DETECTMARGIN2 2 // this much on right
  127. #endif
  128. // Use this macro to generate standard custom image height from
  129. #define wxPG_STD_CUST_IMAGE_HEIGHT(LINEHEIGHT) (LINEHEIGHT-3)
  130. #if defined(__WXWINCE__)
  131. #define wxPG_SMALL_SCREEN 1
  132. #else
  133. #define wxPG_SMALL_SCREEN 0
  134. #endif
  135. // Undefine wxPG_ICON_WIDTH to use supplied xpm bitmaps instead
  136. // (for tree buttons)
  137. //#undef wxPG_ICON_WIDTH
  138. #if WXWIN_COMPATIBILITY_2_6 || WXWIN_COMPATIBILITY_2_8
  139. #define wxPG_COMPATIBILITY_1_4 1
  140. #else
  141. #define wxPG_COMPATIBILITY_1_4 0
  142. #endif
  143. // Need to force disable tooltips?
  144. #if !wxUSE_TOOLTIPS
  145. #undef wxPG_SUPPORT_TOOLTIPS
  146. #define wxPG_SUPPORT_TOOLTIPS 0
  147. #endif
  148. // Set 1 to include advanced properties (wxFontProperty, wxColourProperty, etc.)
  149. #ifndef wxPG_INCLUDE_ADVPROPS
  150. #define wxPG_INCLUDE_ADVPROPS 1
  151. #endif
  152. // Set 1 to include checkbox editor class
  153. #define wxPG_INCLUDE_CHECKBOX 1
  154. // -----------------------------------------------------------------------
  155. class wxPGEditor;
  156. class wxPGProperty;
  157. class wxPropertyCategory;
  158. class wxPGChoices;
  159. class wxPropertyGridPageState;
  160. class wxPGCell;
  161. class wxPGCellRenderer;
  162. class wxPGChoiceEntry;
  163. class wxPGPropArgCls;
  164. class wxPropertyGridInterface;
  165. class wxPropertyGrid;
  166. class wxPropertyGridEvent;
  167. class wxPropertyGridManager;
  168. class wxPGOwnerDrawnComboBox;
  169. class wxPGEditorDialogAdapter;
  170. class wxPGValidationInfo;
  171. // -----------------------------------------------------------------------
  172. /** @section propgrid_misc wxPropertyGrid Miscellanous
  173. This section describes some miscellanous values, types and macros.
  174. @{
  175. */
  176. // Used to tell wxPGProperty to use label as name as well
  177. #define wxPG_LABEL (*wxPGProperty::sm_wxPG_LABEL)
  178. // This is the value placed in wxPGProperty::sm_wxPG_LABEL
  179. #define wxPG_LABEL_STRING wxS("@!")
  180. #define wxPG_NULL_BITMAP wxNullBitmap
  181. #define wxPG_COLOUR_BLACK (*wxBLACK)
  182. /** Convert Red, Green and Blue to a single 32-bit value.
  183. */
  184. #define wxPG_COLOUR(R,G,B) ((wxUint32)(R+(G<<8)+(B<<16)))
  185. /** If property is supposed to have custom-painted image, then returning
  186. this in OnMeasureImage() will usually be enough.
  187. */
  188. #define wxPG_DEFAULT_IMAGE_SIZE wxSize(-1, -1)
  189. /** This callback function is used for sorting properties.
  190. Call wxPropertyGrid::SetSortFunction() to set it.
  191. Sort function should return a value greater than 0 if position of p1 is
  192. after p2. So, for instance, when comparing property names, you can use
  193. following implementation:
  194. @code
  195. int MyPropertySortFunction(wxPropertyGrid* propGrid,
  196. wxPGProperty* p1,
  197. wxPGProperty* p2)
  198. {
  199. return p1->GetBaseName().compare( p2->GetBaseName() );
  200. }
  201. @endcode
  202. */
  203. typedef int (*wxPGSortCallback)(wxPropertyGrid* propGrid,
  204. wxPGProperty* p1,
  205. wxPGProperty* p2);
  206. typedef wxString wxPGCachedString;
  207. /** @}
  208. */
  209. // -----------------------------------------------------------------------
  210. // Used to indicate wxPGChoices::Add etc that the value is actually not given
  211. // by the caller.
  212. #define wxPG_INVALID_VALUE INT_MAX
  213. // -----------------------------------------------------------------------
  214. WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(wxPGProperty*, wxArrayPGProperty,
  215. wxBaseArrayPtrVoid,
  216. class WXDLLIMPEXP_PROPGRID);
  217. WX_DECLARE_STRING_HASH_MAP_WITH_DECL(void*,
  218. wxPGHashMapS2P,
  219. class WXDLLIMPEXP_PROPGRID);
  220. WX_DECLARE_STRING_HASH_MAP_WITH_DECL(wxString,
  221. wxPGHashMapS2S,
  222. class WXDLLIMPEXP_PROPGRID);
  223. WX_DECLARE_VOIDPTR_HASH_MAP_WITH_DECL(void*,
  224. wxPGHashMapP2P,
  225. class WXDLLIMPEXP_PROPGRID);
  226. WX_DECLARE_HASH_MAP_WITH_DECL(wxInt32,
  227. wxInt32,
  228. wxIntegerHash,
  229. wxIntegerEqual,
  230. wxPGHashMapI2I,
  231. class WXDLLIMPEXP_PROPGRID);
  232. // Utility to find if specific item is in a vector. Returns index to
  233. // the item, or wxNOT_FOUND if not present.
  234. template<typename CONTAINER, typename T>
  235. int wxPGFindInVector( CONTAINER vector, const T& item )
  236. {
  237. for ( unsigned int i=0; i<vector.size(); i++ )
  238. {
  239. if ( vector[i] == item )
  240. return (int) i;
  241. }
  242. return wxNOT_FOUND;
  243. }
  244. // -----------------------------------------------------------------------
  245. enum wxPG_GETPROPERTYVALUES_FLAGS
  246. {
  247. /** Flags for wxPropertyGridInterface::GetPropertyValues */
  248. wxPG_KEEP_STRUCTURE = 0x00000010,
  249. /** Flags for wxPropertyGrid::SetPropertyAttribute() etc */
  250. wxPG_RECURSE = 0x00000020,
  251. /** Include attributes for GetPropertyValues. */
  252. wxPG_INC_ATTRIBUTES = 0x00000040,
  253. /** Used when first starting recursion. */
  254. wxPG_RECURSE_STARTS = 0x00000080,
  255. /** Force value change. */
  256. wxPG_FORCE = 0x00000100,
  257. /** Only sort categories and their immediate children.
  258. Sorting done by wxPG_AUTO_SORT option uses this.
  259. */
  260. wxPG_SORT_TOP_LEVEL_ONLY = 0x00000200
  261. };
  262. /** Flags for wxPropertyGrid::SetPropertyAttribute() etc */
  263. #define wxPG_DONT_RECURSE 0x00000000
  264. // -----------------------------------------------------------------------
  265. // Misc argument flags.
  266. enum wxPG_MISC_ARG_FLAGS
  267. {
  268. // Get/Store full value instead of displayed value.
  269. wxPG_FULL_VALUE = 0x00000001,
  270. wxPG_REPORT_ERROR = 0x00000002,
  271. wxPG_PROPERTY_SPECIFIC = 0x00000004,
  272. // Get/Store editable value instead of displayed one (should only be
  273. // different in the case of common values)
  274. wxPG_EDITABLE_VALUE = 0x00000008,
  275. // Used when dealing with fragments of composite string value
  276. wxPG_COMPOSITE_FRAGMENT = 0x00000010,
  277. // Means property for which final string value is for cannot really be
  278. // edited.
  279. wxPG_UNEDITABLE_COMPOSITE_FRAGMENT = 0x00000020,
  280. // ValueToString() called from GetValueAsString()
  281. // (guarantees that input wxVariant value is current own value)
  282. wxPG_VALUE_IS_CURRENT = 0x00000040,
  283. // Value is being set programmatically (ie. not by user)
  284. wxPG_PROGRAMMATIC_VALUE = 0x00000080
  285. };
  286. // -----------------------------------------------------------------------
  287. // wxPGProperty::SetValue() flags
  288. enum wxPG_SETVALUE_FLAGS
  289. {
  290. wxPG_SETVAL_REFRESH_EDITOR = 0x0001,
  291. wxPG_SETVAL_AGGREGATED = 0x0002,
  292. wxPG_SETVAL_FROM_PARENT = 0x0004,
  293. wxPG_SETVAL_BY_USER = 0x0008 // Set if value changed by user
  294. };
  295. // -----------------------------------------------------------------------
  296. //
  297. // Valid constants for wxPG_UINT_BASE attribute
  298. // (long because of wxVariant constructor)
  299. #define wxPG_BASE_OCT (long)8
  300. #define wxPG_BASE_DEC (long)10
  301. #define wxPG_BASE_HEX (long)16
  302. #define wxPG_BASE_HEXL (long)32
  303. //
  304. // Valid constants for wxPG_UINT_PREFIX attribute
  305. #define wxPG_PREFIX_NONE (long)0
  306. #define wxPG_PREFIX_0x (long)1
  307. #define wxPG_PREFIX_DOLLAR_SIGN (long)2
  308. // -----------------------------------------------------------------------
  309. // Editor class.
  310. // Editor accessor (for backwards compatiblity use only).
  311. #define wxPG_EDITOR(T) wxPGEditor_##T
  312. // Macro for declaring editor class, with optional impexpdecl part.
  313. #ifndef WX_PG_DECLARE_EDITOR_WITH_DECL
  314. #define WX_PG_DECLARE_EDITOR_WITH_DECL(EDITOR,DECL) \
  315. extern DECL wxPGEditor* wxPGEditor_##EDITOR; \
  316. extern DECL wxPGEditor* wxPGConstruct##EDITOR##EditorClass();
  317. #endif
  318. // Declare editor class.
  319. #define WX_PG_DECLARE_EDITOR(EDITOR) \
  320. extern wxPGEditor* wxPGEditor_##EDITOR; \
  321. extern wxPGEditor* wxPGConstruct##EDITOR##EditorClass();
  322. // Declare builtin editor classes.
  323. WX_PG_DECLARE_EDITOR_WITH_DECL(TextCtrl,WXDLLIMPEXP_PROPGRID)
  324. WX_PG_DECLARE_EDITOR_WITH_DECL(Choice,WXDLLIMPEXP_PROPGRID)
  325. WX_PG_DECLARE_EDITOR_WITH_DECL(ComboBox,WXDLLIMPEXP_PROPGRID)
  326. WX_PG_DECLARE_EDITOR_WITH_DECL(TextCtrlAndButton,WXDLLIMPEXP_PROPGRID)
  327. #if wxPG_INCLUDE_CHECKBOX
  328. WX_PG_DECLARE_EDITOR_WITH_DECL(CheckBox,WXDLLIMPEXP_PROPGRID)
  329. #endif
  330. WX_PG_DECLARE_EDITOR_WITH_DECL(ChoiceAndButton,WXDLLIMPEXP_PROPGRID)
  331. // -----------------------------------------------------------------------
  332. #ifndef SWIG
  333. //
  334. // Macro WXVARIANT allows creation of wxVariant from any type supported by
  335. // wxWidgets internally, and of all types created using
  336. // WX_PG_DECLARE_VARIANT_DATA.
  337. template<class T>
  338. wxVariant WXVARIANT( const T& WXUNUSED(value) )
  339. {
  340. wxFAIL_MSG("Code should always call specializations of this template");
  341. return wxVariant();
  342. }
  343. template<> inline wxVariant WXVARIANT( const int& value )
  344. { return wxVariant((long)value); }
  345. template<> inline wxVariant WXVARIANT( const long& value )
  346. { return wxVariant(value); }
  347. template<> inline wxVariant WXVARIANT( const bool& value )
  348. { return wxVariant(value); }
  349. template<> inline wxVariant WXVARIANT( const double& value )
  350. { return wxVariant(value); }
  351. template<> inline wxVariant WXVARIANT( const wxArrayString& value )
  352. { return wxVariant(value); }
  353. template<> inline wxVariant WXVARIANT( const wxString& value )
  354. { return wxVariant(value); }
  355. #if wxUSE_LONGLONG
  356. template<> inline wxVariant WXVARIANT( const wxLongLong& value )
  357. { return wxVariant(value); }
  358. template<> inline wxVariant WXVARIANT( const wxULongLong& value )
  359. { return wxVariant(value); }
  360. #endif
  361. #if wxUSE_DATETIME
  362. template<> inline wxVariant WXVARIANT( const wxDateTime& value )
  363. { return wxVariant(value); }
  364. #endif
  365. //
  366. // These are modified versions of DECLARE/WX_PG_IMPLEMENT_VARIANT_DATA
  367. // macros found in variant.h. Difference are as follows:
  368. // * These support non-wxObject data
  369. // * These implement classname##RefFromVariant function which returns
  370. // reference to data within.
  371. // * const char* classname##_VariantType which equals classname.
  372. // * WXVARIANT
  373. //
  374. #define WX_PG_DECLARE_VARIANT_DATA(classname) \
  375. WX_PG_DECLARE_VARIANT_DATA_EXPORTED(classname, wxEMPTY_PARAMETER_VALUE)
  376. #define WX_PG_DECLARE_VARIANT_DATA_EXPORTED(classname,expdecl) \
  377. expdecl classname& operator << ( classname &object, const wxVariant &variant ); \
  378. expdecl wxVariant& operator << ( wxVariant &variant, const classname &object ); \
  379. expdecl const classname& classname##RefFromVariant( const wxVariant& variant ); \
  380. expdecl classname& classname##RefFromVariant( wxVariant& variant ); \
  381. template<> inline wxVariant WXVARIANT( const classname& value ) \
  382. { \
  383. wxVariant variant; \
  384. variant << value; \
  385. return variant; \
  386. } \
  387. extern expdecl const char* classname##_VariantType;
  388. #define WX_PG_IMPLEMENT_VARIANT_DATA(classname) \
  389. WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED(classname, wxEMPTY_PARAMETER_VALUE)
  390. // Add getter (ie. classname << variant) separately to allow
  391. // custom implementations.
  392. #define WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_NO_EQ_NO_GETTER(classname,expdecl) \
  393. const char* classname##_VariantType = #classname; \
  394. class classname##VariantData: public wxVariantData \
  395. { \
  396. public:\
  397. classname##VariantData() {} \
  398. classname##VariantData( const classname &value ) { m_value = value; } \
  399. \
  400. classname &GetValue() { return m_value; } \
  401. \
  402. const classname &GetValue() const { return m_value; } \
  403. \
  404. virtual bool Eq(wxVariantData& data) const; \
  405. \
  406. virtual wxString GetType() const; \
  407. \
  408. virtual wxVariantData* Clone() const { return new classname##VariantData(m_value); } \
  409. \
  410. DECLARE_WXANY_CONVERSION() \
  411. protected:\
  412. classname m_value; \
  413. };\
  414. \
  415. IMPLEMENT_TRIVIAL_WXANY_CONVERSION(classname, classname##VariantData) \
  416. \
  417. wxString classname##VariantData::GetType() const\
  418. {\
  419. return wxS(#classname);\
  420. }\
  421. \
  422. expdecl wxVariant& operator << ( wxVariant &variant, const classname &value )\
  423. {\
  424. classname##VariantData *data = new classname##VariantData( value );\
  425. variant.SetData( data );\
  426. return variant;\
  427. } \
  428. expdecl classname& classname##RefFromVariant( wxVariant& variant ) \
  429. { \
  430. wxASSERT_MSG( variant.GetType() == wxS(#classname), \
  431. wxString::Format("Variant type should have been '%s'" \
  432. "instead of '%s'", \
  433. wxS(#classname), \
  434. variant.GetType().c_str())); \
  435. classname##VariantData *data = \
  436. (classname##VariantData*) variant.GetData(); \
  437. return data->GetValue();\
  438. } \
  439. expdecl const classname& classname##RefFromVariant( const wxVariant& variant ) \
  440. { \
  441. wxASSERT_MSG( variant.GetType() == wxS(#classname), \
  442. wxString::Format("Variant type should have been '%s'" \
  443. "instead of '%s'", \
  444. wxS(#classname), \
  445. variant.GetType().c_str())); \
  446. classname##VariantData *data = \
  447. (classname##VariantData*) variant.GetData(); \
  448. return data->GetValue();\
  449. }
  450. #define WX_PG_IMPLEMENT_VARIANT_DATA_GETTER(classname, expdecl) \
  451. expdecl classname& operator << ( classname &value, const wxVariant &variant )\
  452. {\
  453. wxASSERT( variant.GetType() == #classname );\
  454. \
  455. classname##VariantData *data = (classname##VariantData*) variant.GetData();\
  456. value = data->GetValue();\
  457. return value;\
  458. }
  459. #define WX_PG_IMPLEMENT_VARIANT_DATA_EQ(classname, expdecl) \
  460. bool classname##VariantData::Eq(wxVariantData& data) const \
  461. {\
  462. wxASSERT( GetType() == data.GetType() );\
  463. \
  464. classname##VariantData & otherData = (classname##VariantData &) data;\
  465. \
  466. return otherData.m_value == m_value;\
  467. }
  468. // implements a wxVariantData-derived class using for the Eq() method the
  469. // operator== which must have been provided by "classname"
  470. #define WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED(classname,expdecl) \
  471. WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_NO_EQ_NO_GETTER(classname,wxEMPTY_PARAMETER_VALUE expdecl) \
  472. WX_PG_IMPLEMENT_VARIANT_DATA_GETTER(classname,wxEMPTY_PARAMETER_VALUE expdecl) \
  473. WX_PG_IMPLEMENT_VARIANT_DATA_EQ(classname,wxEMPTY_PARAMETER_VALUE expdecl)
  474. #define WX_PG_IMPLEMENT_VARIANT_DATA(classname) \
  475. WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED(classname, wxEMPTY_PARAMETER_VALUE)
  476. // with Eq() implementation that always returns false
  477. #define WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_DUMMY_EQ(classname,expdecl) \
  478. WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_NO_EQ_NO_GETTER(classname,wxEMPTY_PARAMETER_VALUE expdecl) \
  479. WX_PG_IMPLEMENT_VARIANT_DATA_GETTER(classname,wxEMPTY_PARAMETER_VALUE expdecl) \
  480. \
  481. bool classname##VariantData::Eq(wxVariantData& WXUNUSED(data)) const \
  482. {\
  483. return false; \
  484. }
  485. #define WX_PG_IMPLEMENT_VARIANT_DATA_DUMMY_EQ(classname) \
  486. WX_PG_IMPLEMENT_VARIANT_DATA_EXPORTED_DUMMY_EQ(classname, wxEMPTY_PARAMETER_VALUE)
  487. WX_PG_DECLARE_VARIANT_DATA_EXPORTED(wxPoint, WXDLLIMPEXP_PROPGRID)
  488. WX_PG_DECLARE_VARIANT_DATA_EXPORTED(wxSize, WXDLLIMPEXP_PROPGRID)
  489. WX_PG_DECLARE_VARIANT_DATA_EXPORTED(wxArrayInt, WXDLLIMPEXP_PROPGRID)
  490. DECLARE_VARIANT_OBJECT_EXPORTED(wxFont, WXDLLIMPEXP_PROPGRID)
  491. template<> inline wxVariant WXVARIANT( const wxFont& value )
  492. {
  493. wxVariant variant;
  494. variant << value;
  495. return variant;
  496. }
  497. template<> inline wxVariant WXVARIANT( const wxColour& value )
  498. {
  499. wxVariant variant;
  500. variant << value;
  501. return variant;
  502. }
  503. // Define constants for common wxVariant type strings
  504. #define wxPG_VARIANT_TYPE_STRING wxPGGlobalVars->m_strstring
  505. #define wxPG_VARIANT_TYPE_LONG wxPGGlobalVars->m_strlong
  506. #define wxPG_VARIANT_TYPE_BOOL wxPGGlobalVars->m_strbool
  507. #define wxPG_VARIANT_TYPE_LIST wxPGGlobalVars->m_strlist
  508. #define wxPG_VARIANT_TYPE_DOUBLE wxS("double")
  509. #define wxPG_VARIANT_TYPE_ARRSTRING wxS("arrstring")
  510. #define wxPG_VARIANT_TYPE_DATETIME wxS("datetime")
  511. #define wxPG_VARIANT_TYPE_LONGLONG wxS("longlong")
  512. #define wxPG_VARIANT_TYPE_ULONGLONG wxS("ulonglong")
  513. #endif // !SWIG
  514. // -----------------------------------------------------------------------
  515. //
  516. // Tokenizer macros.
  517. // NOTE: I have made two versions - worse ones (performance and consistency
  518. // wise) use wxStringTokenizer and better ones (may have unfound bugs)
  519. // use custom code.
  520. //
  521. #include "wx/tokenzr.h"
  522. // TOKENIZER1 can be done with wxStringTokenizer
  523. #define WX_PG_TOKENIZER1_BEGIN(WXSTRING,DELIMITER) \
  524. wxStringTokenizer tkz(WXSTRING,DELIMITER,wxTOKEN_RET_EMPTY); \
  525. while ( tkz.HasMoreTokens() ) \
  526. { \
  527. wxString token = tkz.GetNextToken(); \
  528. token.Trim(true); \
  529. token.Trim(false);
  530. #define WX_PG_TOKENIZER1_END() \
  531. }
  532. //
  533. // 2nd version: tokens are surrounded by DELIMITERs (for example, C-style
  534. // strings). TOKENIZER2 must use custom code (a class) for full compliance with
  535. // " surrounded strings with \" inside.
  536. //
  537. // class implementation is in propgrid.cpp
  538. //
  539. class WXDLLIMPEXP_PROPGRID wxPGStringTokenizer
  540. {
  541. public:
  542. wxPGStringTokenizer( const wxString& str, wxChar delimeter );
  543. ~wxPGStringTokenizer();
  544. bool HasMoreTokens(); // not const so we can do some stuff in it
  545. wxString GetNextToken();
  546. protected:
  547. const wxString* m_str;
  548. wxString::const_iterator m_curPos;
  549. wxString m_readyToken;
  550. wxUniChar m_delimeter;
  551. };
  552. #define WX_PG_TOKENIZER2_BEGIN(WXSTRING,DELIMITER) \
  553. wxPGStringTokenizer tkz(WXSTRING,DELIMITER); \
  554. while ( tkz.HasMoreTokens() ) \
  555. { \
  556. wxString token = tkz.GetNextToken();
  557. #define WX_PG_TOKENIZER2_END() \
  558. }
  559. // -----------------------------------------------------------------------
  560. #endif // wxUSE_PROPGRID
  561. #endif // _WX_PROPGRID_PROPGRIDDEFS_H_