Aegisub/contrib/assdraw/libpropgrid/include/wx/propgrid/propgrid.h

7277 lines
246 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: propgrid.h
// Purpose: wxPropertyGrid
// Author: Jaakko Salli
// Modified by:
// Created: Sep-25-2004
// RCS-ID: $Id:
// Copyright: (c) Jaakko Salli
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifndef __WX_PROPGRID_PROPGRID_H__
#define __WX_PROPGRID_PROPGRID_H__
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma interface "propgrid.cpp"
#endif
#include <wx/window.h>
#include <wx/bitmap.h>
#include <wx/dcclient.h>
#include <wx/scrolwin.h>
#include <wx/dynarray.h>
#include <wx/hashmap.h>
#include <wx/variant.h>
#include <wx/longlong.h>
#include <wx/tooltip.h>
#include <wx/datetime.h>
// NB: Do *NOT * remove this.
#if defined(SWIG) || defined(SWIG_TYPE_TABLE)
#ifndef __WXPYTHON__
#define __WXPYTHON__
#endif
#endif
//
// In case DOXYGEN was not specified...
#if !defined(DOXYGEN) && !defined(_WX_WINDOW_H_BASE_) && !defined(SWIG)
// I've tried to get this auto-defined in Doxygen config, but have not
// succeeded thus far... so using a hack here.
#define DOXYGEN
#endif
// Doxygen special includes
#ifdef DOXYGEN
#include "pg_dox_mainpage.h"
#include "propdev.h"
#endif
//
// Need to define some things for DOXYGEN
#ifdef DOXYGEN
#define wxUSE_VALIDATORS 1
#define wxUSE_DATETIME 1
#define wxUSE_TOOLTIPS 1
#define wxUSE_SPINBTN 1
#define wxUSE_DATEPICKCTRL 1
#endif
//
// Check some wxUSE_FOOs
#ifndef wxUSE_VALIDATORS
#error "wxUSE_VALIDATORS not defined"
#endif
#ifndef wxUSE_DATETIME
#error "wxUSE_DATETIME not defined"
#endif
#ifndef wxUSE_DATEPICKCTRL
#error "wxUSE_DATEPICKCTRL not defined"
#endif
// Uncomment next line to allow wxAdv linkage (required for DatePickerCtrl editor)
// #define wxPG_ALLOW_WXADV
#if defined(__WXPYTHON__)
#include <Python.h>
#undef wxPG_ALLOW_WXADV
#define wxPG_ALLOW_WXADV
#endif
// Defines for component version.
// The following symbols should be updated for each new component release
// since some kind of tests, like those of AM_WXCODE_CHECKFOR_COMPONENT_VERSION()
// for "configure" scripts under unix, use them.
#define wxPROPGRID_MAJOR 1
#define wxPROPGRID_MINOR 2
#define wxPROPGRID_RELEASE 11
// For non-Unix systems (i.e. when building without a configure script),
// users of this component can use the following macro to check if the
// current version is at least major.minor.release
#define wxCHECK_PROPGRID_VERSION(major,minor,release) \
(wxPROPGRID_MAJOR > (major) || \
(wxPROPGRID_MAJOR == (major) && wxPROPGRID_MINOR > (minor)) || \
(wxPROPGRID_MAJOR == (major) && wxPROPGRID_MINOR == (minor) && wxPROPGRID_RELEASE >= (release)))
// Legacy version number
#define wxPG_VERSION ((wxPROPGRID_MAJOR*1000)+(wxPROPGRID_MINOR*100)+(wxPROPGRID_RELEASE*10))
// -----------------------------------------------------------------------
//
// Here are some platform dependent defines
// NOTE: More in propertygrid.cpp
//
#ifndef SWIG
#if defined(__WXMSW__)
// tested
#define wxPG_XBEFORETEXT 5 // space between vertical line and value text
#define wxPG_XBEFOREWIDGET 1 // space between vertical line and value editor control
#define wxPG_TEXTCTRLXADJUST 3 // x position adjustment for wxTextCtrl (and like)
#define wxPG_ICON_WIDTH 9 // comment to use bitmap buttons
#define wxPG_USE_RENDERER_NATIVE 0 // 1 if wxRendererNative should be employed
#define wxPG_DOUBLE_BUFFER 1 // 1 to use double-buffer that guarantees flicker-free painting
#define wxPG_HEAVY_GFX 1 // 1 for prettier appearance
#define wxPG_SUPPORT_TOOLTIPS 1 // Enable tooltips
#elif defined(__WXGTK__)
// tested
#define wxPG_XBEFORETEXT 6 // space between vertical line and value text
#define wxPG_XBEFOREWIDGET 1 // space between vertical line and value editor control
#define wxPG_TEXTCTRLXADJUST 3 // x position adjustment for wxTextCtrl (and like)
#define wxPG_ICON_WIDTH 9 // comment to use bitmap buttons
#define wxPG_USE_RENDERER_NATIVE 0 // 1 if wxRendererNative should be employed
#define wxPG_DOUBLE_BUFFER 1 // 1 to use double-buffer that guarantees flicker-free painting
#define wxPG_HEAVY_GFX 1 // 1 for prettier appearance
#define wxPG_SUPPORT_TOOLTIPS 1 // Enable tooltips
#elif defined(__WXMAC__)
// *not* tested
#define wxPG_XBEFORETEXT 5 // space between vertical line and value text
#define wxPG_XBEFOREWIDGET 1 // space between vertical line and value editor widget
#define wxPG_TEXTCTRLXADJUST 3 // x position adjustment for wxTextCtrl (and like)
#define wxPG_ICON_WIDTH 11 // comment to use bitmap buttons
#define wxPG_USE_RENDERER_NATIVE 1 // 1 if wxRendererNative should be employed
#define wxPG_DOUBLE_BUFFER 0 // 1 to use double-buffer that guarantees flicker-free painting
#define wxPG_HEAVY_GFX 1 // 1 for prettier appearance
#define wxPG_SUPPORT_TOOLTIPS 1 // Enable tooltips
#else
// defaults
// tested on: none.
#define wxPG_XBEFORETEXT 6 // space between vertical line and value text
#define wxPG_XBEFOREWIDGET 1 // space between vertical line and value editor widget
#define wxPG_TEXTCTRLXADJUST 3 // x position adjustment for wxTextCtrl (and like)
#define wxPG_ICON_WIDTH 9 // comment to use bitmap buttons
#define wxPG_USE_RENDERER_NATIVE 0 // 1 if wxRendererNative should be employed
#define wxPG_DOUBLE_BUFFER 0 // 1 to use double-buffer that guarantees flicker-free painting
#define wxPG_HEAVY_GFX 0 // 1 for prettier appearance
#define wxPG_SUPPORT_TOOLTIPS 0 // Enable tooltips
#endif // #if defined(__WXMSW__)
#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
// Need to force disable tooltips?
#if !wxUSE_TOOLTIPS
#undef wxPG_SUPPORT_TOOLTIPS
#define wxPG_SUPPORT_TOOLTIPS 0
#endif
// Set 1 to include basic properties ( ~48k in 0.9.9.2 )
#define wxPG_INCLUDE_BASICPROPS 1
// Set 1 to include advanced properties (wxFontProperty, wxColourProperty, etc.) ( ~32k in 0.9.9.2 )
#define wxPG_INCLUDE_ADVPROPS 1
// Set 1 include wxPropertyGridManager ( ~36k in 0.9.9.1 )
//#define wxPG_INCLUDE_MANAGER 1
// Set 1 to include checkbox editor class ( ~4k in 0.9.9.1 )
#define wxPG_INCLUDE_CHECKBOX 1
// 1 to allow user data for each property
#define wxPG_USE_CLIENT_DATA 1
// NOTE: This is not supported as 1.
#define wxPG_INCLUDE_WXOBJECT 0
// -----------------------------------------------------------------------
#ifdef wxPG_COMPATIBILITY_1_0_0
#define wxRECURSE wxPG_RECURSE
#define wxKEEP_STRUCTURE wxPG_KEEP_STRUCTURE
#define wxPGConstants wxPGChoices
#define wxPG_EX_CLASSIC_SPACING 0
#define wxPGCtrlClass wxWindow
#define wxCCustomTextCtrl wxTextCtrl
#define wxCCustomComboBox wxPGOwnerDrawnComboBox
#define wxCCustomButton wxButton
#endif // #ifdef wxPG_COMPATIBILITY_1_0_0
#ifdef __WXPYTHON__
#define wxPG_PGVARIANT_IS_VARIANT 1 // 1
#define wxPG_VALUETYPE_IS_STRING 0 // 1
#else
#define wxPG_PGVARIANT_IS_VARIANT 0
#define wxPG_VALUETYPE_IS_STRING 0
#endif
#ifndef SWIG
#if !wxCHECK_VERSION(2,9,0)
#if !defined(wxUniChar)
#define wxUniChar wxChar
#endif
//#define wxPGGetIterChar(str, i) str[i]
#define wxPGGetIterChar(str, i) *i
#else
#define wxPGGetIterChar(str, i) *i
#endif
#endif
// -----------------------------------------------------------------------
//
// wxPython special considerations
//
// TODO: Using wxPG_GETVALUE_CONST yields some ugly function
// names, so might as well make those GetPropertyValueAsXXX non-static
// for regular C++ build as well.s
//
#if !wxPG_VALUETYPE_IS_STRING
#define wxPG_VALUETYPE_MSGVAL const wxPGValueType*
#else
#define wxPG_VALUETYPE_MSGVAL wxString
#endif
#ifndef __WXPYTHON__
// Some Strings are returned as const wxChar* in C++, and as wxString in wxPython
// (using just wxString for everything would've been better, but the current scheme
// is necessary for better backwards compatibility).
#define wxPG_CONST_WXCHAR_PTR const wxChar*
#define wxPG_CONST_WXCHAR_DEFVAL ((const wxChar*)NULL)
#define wxPG_TO_WXCHAR_PTR(A) A
#define wxPG_PYTHON_STATIC static
#define wxPG_GETVALUE_CONST
// In C++ we can stick with overloaded methods
#define SetPropertyValueLong SetPropertyValue
#define SetPropertyValueDouble SetPropertyValue
#define SetPropertyValueBool SetPropertyValue
#define SetPropertyValueString SetPropertyValue
#define SetPropertyValueWxObjectPtr SetPropertyValue
#define SetPropertyValuePoint SetPropertyValue
#define SetPropertyValueSize SetPropertyValue
#define SetPropertyValueArrint2 SetPropertyValue
#define SetPropertyValueArrstr2 SetPropertyValue
#define SetPropertyValueDatetime SetPropertyValue
#define SetPropertyValueLongLong SetPropertyValue
#define SetPropertyValueULongLong SetPropertyValue
#else
// Some Strings are returned as const wxChar* in C++, and as wxString in wxPython
// (using just wxString for everything would've been better, but the current scheme
// is necessary for better backwards compatibility).
#define wxPG_CONST_WXCHAR_PTR wxString
#define wxPG_CONST_WXCHAR_DEFVAL wxEmptyString
#define wxPG_TO_WXCHAR_PTR(A) (A.c_str())
// Declaring GetValues as static will yield problems
#define wxPG_PYTHON_STATIC
#define wxPG_GETVALUE_CONST const
// Because SWIG has problems combining overloaded functions and
// Python object-to-wxXXX conversion, we need to use Python proxy
// functions for these value setters.
#define SetPropertyValueArrstr2 _SetPropertyValueArrstr
#define SetPropertyValueArrint2 _SetPropertyValueArrint
#endif
// wxPG_CHECK_FOO_DBG - on Release and wxPython builds, show wxLogWarning instead
// (so that the program flow is not interrupted, but the message can still be seen).
#if !defined(__WXDEBUG__) || defined(__WXPYTHON__)
#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; }
#else
#define wxPG_CHECK_RET_DBG(A,B) wxCHECK_RET(A,B)
#define wxPG_CHECK_MSG_DBG(A,B,C) wxCHECK_MSG(A,B,C)
#endif
// -----------------------------------------------------------------------
// Our very custom dynamic object macros. Should only be used
// directly in an abstract (typeless etc.) base property classes.
#if wxPG_INCLUDE_WXOBJECT
#error "wxPG_INCLUDE_WXOBJECT is not currently supported (as of 1.0.0b)."
#define WX_PG_DECLARE_GETCLASSNAME
#define WX_PG_DECLARE_GETCLASSINFO
#else
#define WX_PG_DECLARE_GETCLASSNAME virtual wxPG_CONST_WXCHAR_PTR GetClassName() const;
#define WX_PG_DECLARE_GETCLASSINFO virtual const wxPGPropertyClassInfo* GetClassInfo() const;
#endif
// -----------------------------------------------------------------------
#ifdef WXMAKINGLIB_PROPGRID
#define WXDLLIMPEXP_PG
#elif defined(WXMAKINGDLL_PROPGRID)
#define WXDLLIMPEXP_PG WXEXPORT
#elif defined(WXUSINGDLL)
#define WXDLLIMPEXP_PG WXIMPORT
#else // not making nor using DLL
#define WXDLLIMPEXP_PG
#endif
// -----------------------------------------------------------------------
#if wxPG_PGVARIANT_IS_VARIANT
#define wxPGVariant wxVariant
#else
class WXDLLIMPEXP_PG wxPGVariant;
#endif
#ifndef SWIG
class WXDLLIMPEXP_PG wxPGValueType;
class WXDLLIMPEXP_PG wxPGEditor;
class WXDLLIMPEXP_PG wxPGProperty;
class WXDLLIMPEXP_PG wxPGPropertyWithChildren;
class WXDLLIMPEXP_PG wxPropertyCategoryClass;
class WXDLLIMPEXP_PG wxPGChoices;
class WXDLLIMPEXP_PG wxPropertyGridState;
class WXDLLIMPEXP_PG wxPropertyContainerMethods;
class WXDLLIMPEXP_PG wxPropertyGrid;
class WXDLLIMPEXP_PG wxPropertyGridEvent;
class WXDLLIMPEXP_PG wxPropertyGridManager;
class WXDLLIMPEXP_PG wxPGOwnerDrawnComboBox;
class WXDLLIMPEXP_PG wxPGCustomComboControl;
struct wxPGPaintData;
extern WXDLLIMPEXP_PG const wxChar *wxPropertyGridNameStr;
#endif // #ifndef SWIG
#ifdef __WXPYTHON__
class wxPGPyEditor;
#endif // #ifndef __WXPYTHON__
/** @defgroup miscellaneous wxPropertyGrid Miscellanous
This section describes some miscellanous values, types and macros.
@{
*/
#if wxPG_PGVARIANT_IS_VARIANT
#define wxPG_EMPTY_ARRAYINT wxArrayInt()
#define wxPG_EMPTY_ARRAYSTRING wxArrayString()
#elif !defined(SWIG)
#define wxPG_EMPTY_ARRAYINT (*((wxArrayInt*)NULL))
#define wxPG_EMPTY_ARRAYSTRING (*((wxArrayString*)NULL))
#else
#define wxPG_EMPTY_ARRAYINT wxArrayInt_wxPG_EMPTY
#define wxPG_EMPTY_ARRAYSTRING wxArrayString_wxPG_EMPTY
#endif
#if !defined(SWIG)
#define wxPG_LABEL (*((wxString*)NULL)) // Used to tell wxPGProperty to use label as name as well.
#define wxPG_NULL_BITMAP wxNullBitmap
#define wxPG_COLOUR_BLACK (*wxBLACK)
#else
#define wxPG_LABEL wxString_wxPG_LABEL
#define wxPG_NULL_BITMAP wxBitmap_NULL
#define wxPG_COLOUR_BLACK wxColour_BLACK
#endif // #ifndef SWIG
// Used to indicate wxPGChoices::Add etc that the value is actually not given
// by the caller.
#define wxPG_INVALID_VALUE INT_MAX
/** Convert Red, Green and Blue to a single 32-bit value.
*/
#define wxPG_COLOUR(R,G,B) ((wxUint32)(R+(G<<8)+(B<<16)))
/** Return this in GetImageSize() to indicate that the custom painted
property image is flexible. That is, it will paint (dropdown)
list item images with PREFWID,PREFHEI size.
*/
#define wxPG_FLEXIBLE_SIZE(PREFWID,PREFHEI) wxSize(-(PREFWID),-(PREFHEI))
#define wxPG_FULL_CUSTOM_PAINT_WIDTH -99999
/** Return this in GetImageSize() to indicate that the property is
custom painted completely (ie. the text as well).
*/
#define wxPG_FULL_CUSTOM_PAINT_SIZE(HEI) \
wxSize(wxPG_FULL_CUSTOM_PAINT_WIDTH,HEI)
/** Return this in GetImageSize() to indicate that the property is
custom painted completely (ie. the text as well), and with flexible
height.
*/
#define wxPG_FULL_CUSTOM_PAINT_FLEXIBLE_SIZE(PREFHEI) \
wxSize(wxPG_FULL_CUSTOM_PAINT_WIDTH,-(PREFHEI))
/** This callback function is used by atleast wxCustomProperty
to facilitiate easy custom action on button press.
\param propGrid
related wxPropertyGrid
\param property
related wxPGProperty
\param ctrl
If not NULL (for example, not selected), a wxWindow* or equivalent
\param data
Value depends on the context.
\retval
True if changed value of the property.
*/
typedef bool (*wxPropertyGridCallback)(wxPropertyGrid* propGrid,
wxPGProperty* property,
wxWindow* ctrl,
int data);
/** This callback function is used by atleast wxCustomProperty
to facilitiate drawing items in drop down list.
Works very much like wxPGProperty::OnCustomPaint.
*/
typedef void (*wxPGPaintCallback)(wxPGProperty* property,
wxDC& dc,
const wxRect& rect,
wxPGPaintData& paintdata);
/** Use this with wxPropertyGrid::IsPropertyKindOf. For example, as in
\code
pg->IsPropertyKindOf(WX_PG_CLASSINFO(wxStringProperty))
\endcode
*/
#define WX_PG_CLASSINFO(NAME) NAME##ClassInfo
/** @}
*/
// -----------------------------------------------------------------------
/** @defgroup wndflags wxPropertyGrid Window Styles
SetWindowStyleFlag method can be used to modify some of these at run-time.
@{
*/
/** This will cause Sort() automatically after an item is added.
When inserting a lot of items in this mode, it may make sense to
use Freeze() before operations and Thaw() afterwards to increase
performance.
*/
#define wxPG_AUTO_SORT 0x00000010
/** Categories are not initially shown (even if added).
IMPORTANT NOTE: If you do not plan to use categories, then this
style will waste resources.
This flag can also be changed using wxPropertyGrid::EnableCategories method.
*/
#define wxPG_HIDE_CATEGORIES 0x00000020
/* This style combines non-categoric mode and automatic sorting.
*/
#define wxPG_ALPHABETIC_MODE (wxPG_HIDE_CATEGORIES|wxPG_AUTO_SORT)
/** Modified values are shown in bold font. Changing this requires Refresh()
to show changes.
*/
#define wxPG_BOLD_MODIFIED 0x00000040
/** When wxPropertyGrid is resized, splitter moves to the center. This
behaviour stops once the user manually moves the splitter.
*/
#define wxPG_SPLITTER_AUTO_CENTER 0x00000080
/** Display tooltips for cell text that cannot be shown completely. If
wxUSE_TOOLTIPS is 0, then this doesn't have any effect.
*/
#define wxPG_TOOLTIPS 0x00000100
/** Disables margin and hides all expand/collapse buttons that would appear
outside the margin (for sub-properties). Toggling this style automatically
expands all collapsed items.
*/
#define wxPG_HIDE_MARGIN 0x00000200
/** This style prevents user from moving the splitter.
*/
#define wxPG_STATIC_SPLITTER 0x00000400
/** Combination of other styles that make it impossible for user to modify
the layout.
*/
#define wxPG_STATIC_LAYOUT (wxPG_HIDE_MARGIN|wxPG_STATIC_SPLITTER)
/** Disables wxTextCtrl based editors for properties which
can be edited in another way. Equals calling wxPropertyGrid::LimitPropertyEditing
for all added properties.
*/
#define wxPG_LIMITED_EDITING 0x00000800
#ifdef DOXYGEN
/** wxTAB_TRAVERSAL allows using Tab/Shift-Tab to travel between properties
in grid. Travelling forwards from last property will navigate to the
next control, and backwards from first will navigate to the previous one.
*/
#define wxTAB_TRAVERSAL 0x00080000
#endif
/** wxPropertyGridManager only: Show toolbar for mode and page selection. */
#define wxPG_TOOLBAR 0x00001000
/** wxPropertyGridManager only: Show adjustable text box showing description
or help text, if available, for currently selected property.
*/
#define wxPG_DESCRIPTION 0x00002000
/** wxPropertyGridManager only: Show compactor button that toggles hidden
state of low-priority properties.
*/
#define wxPG_COMPACTOR 0x00004000
/**
NOTE: wxPG_EX_xxx are extra window styles and must be set using SetExtraStyle()
member function.
Speeds up switching to wxPG_HIDE_CATEGORIES mode. Initially, if wxPG_HIDE_CATEGORIES
is not defined, the non-categorized data storage is not activated, and switching
the mode first time becomes somewhat slower. wxPG_EX_INIT_NOCAT activates the
non-categorized data storage right away. IMPORTANT NOTE: If you do plan not
switching to non-categoric mode, or if you don't plan to use categories at
all, then using this style will result in waste of resources.
*/
#define wxPG_EX_INIT_NOCAT 0x00001000
/** Extended window style that sets wxPropertyGridManager toolbar to not
use flat style.
*/
#define wxPG_EX_NO_FLAT_TOOLBAR 0x00002000
/** This extra style allows editing more similar to some Microsoft/Mono
provided property sheet controls. Currently this includes (but more may be
added later, incase I missed something):
* Pressing ENTER in control, in addition to confirming changes, will
unfocus it.
* Pressing ESC doesn't cancel edit (but still unfocuses the editor).
Note that ESC and ENTER events in editor controls are relayed to the
wxPropertyGrid itself, so that they can be detected by the application.
*/
//#define wxPG_EX_ALTERNATE_KEYS 0x00004000
/** Shows alphabetic/categoric mode buttons from toolbar.
*/
#define wxPG_EX_MODE_BUTTONS 0x00008000
/** Show property help strings as tool tips instead as text on the status bar.
You can set the help strings using SetPropertyHelpString member function.
*/
#define wxPG_EX_HELP_AS_TOOLTIPS 0x00010000
/** Prevent TAB from focusing to wxButtons. This behaviour was default
in version 1.2.0 and earlier.
NOTE! Tabbing to button doesn't work yet. Problem seems to be that on wxMSW
atleast the button doesn't properly propagate key events (yes, I'm using
wxWANTS_CHARS).
*/
//#define wxPG_EX_NO_TAB_TO_BUTTON 0x00020000
/** Set this style to have labels of disabled properties become greyed
along with the values.
*/
#define wxPG_EX_GREY_LABEL_WHEN_DISABLED 0x00040000
/** Allows relying on native double-buffering.
*/
#define wxPG_EX_NATIVE_DOUBLE_BUFFERING 0x00080000
/** Process all events immediately, if possible. That is, ProcessEvent is
called instead of AddPendingEvent.
*/
#define wxPG_EX_PROCESS_EVENTS_IMMEDIATELY 0x00100000
/** Set this style to let user have ability to set values of properties to
unspecified state. Currently, this applies to following properties:
- wxIntProperty, wxUIntProperty, and wxFloatProperty: Clear the
text field.
*/
#define wxPG_EX_AUTO_UNSPECIFIED_VALUES 0x00200000
/** Combines various styles.
*/
#define wxPG_DEFAULT_STYLE (0)
/** Combines various styles.
*/
#define wxPGMAN_DEFAULT_STYLE (0)
/** @}
*/
/** Flags for wxPropertyGrid::GetPropertyValues and wxPropertyGridManager::GetPropertyValues. */
#define wxPG_KEEP_STRUCTURE 0x00000010
/** Flags for wxPropertyGrid::SetPropertyAttribute etc */
#define wxPG_RECURSE 0x00000020
#define wxPG_RECURSE_STARTS 0x00000040
#define wxPG_FORCE 0x00000080
// -----------------------------------------------------------------------
// Property priorities
#define wxPG_LOW 1
#define wxPG_HIGH 2
// -----------------------------------------------------------------------
// Misc argument flags.
#define wxPG_FULL_VALUE 0x00000001 // Get/Store full value instead of displayed value.
#define wxPG_REPORT_ERROR 0x00000002
#define wxPG_PROPERTY_SPECIFIC 0x00000004
#define wxPG_EDITABLE_VALUE 0x00000008 // Get/Store value that must be editable in wxTextCtrl
// -----------------------------------------------------------------------
#if defined(__WXPYTHON__)
#define wxPG_ID_IS_PTR 1
#else
#define wxPG_ID_IS_PTR 0
#endif
#if wxPG_ID_IS_PTR
#define wxNullProperty ((wxPGProperty*)NULL)
#define wxPGId wxPGProperty*
#define wxPGIdGen(PTR) PTR
#define wxPGIdToPtr(ID) ((wxPGProperty*)ID)
#define wxPGIdIsOk(ID) ( ID != ((wxPGProperty*)NULL) )
#else
#define wxNullProperty wxPGId(NULL)
/** \class wxPGId
\ingroup classes
\brief
Simple wrapper for the wxPGProperty pointer.
NB: This class exists because:
- Abstract wxPGId would allow both flexibility and speed
(for possible native'ish implementations, altough this doesn't make
sense anymore).
- wxPG methods should be mostly used for property manipulation
(or such vision I had at first), and since wxPGId id = pg->Append(...)
is faster tow write, it seemed useful.
*However* in future I may just start using wxPG_ID_IS_PTR by the default.
It might even result into slightly smaller code (altough I have checked out
some MSVC generated assembly, and it seems to optimize out the wrapper in
usual scenarios).
*/
class WXDLLIMPEXP_PG wxPGId
{
public:
inline wxPGId() { m_ptr = (wxPGProperty*) NULL; }
~wxPGId() {}
bool IsOk() const { return ( m_ptr != NULL ); }
bool operator == (const wxPGId& other)
{
return m_ptr == other.m_ptr;
}
inline const wxString& GetName() const;
#ifndef SWIG
inline wxPGId( wxPGProperty* ptr ) { m_ptr = ptr; }
inline wxPGId( wxPGProperty& ref ) { m_ptr = &ref; }
operator wxPGProperty* ()
{
return m_ptr;
}
wxPGProperty* GetPropertyPtr() const { return m_ptr; }
#endif // #ifndef SWIG
wxPGProperty& GetProperty() const { return *m_ptr; }
private:
wxPGProperty* m_ptr;
};
#define wxPGIdGen(PTR) wxPGId(PTR)
#define wxPGIdToPtr(ID) ID.GetPropertyPtr()
#define wxPGIdIsOk(ID) ID.IsOk()
#endif // wxPG_ID_IS_PTR
// -----------------------------------------------------------------------
WXDLLIMPEXP_PG void wxPGTypeOperationFailed ( const wxPGProperty* p, const wxChar* typestr, const wxChar* op );
WXDLLIMPEXP_PG void wxPGGetFailed ( const wxPGProperty* p, const wxChar* typestr );
// -----------------------------------------------------------------------
/** @defgroup propflags wxPGProperty Flags
@{
*/
// NOTE: Do not change order of these, and if you add
// any, remember also to update gs_property_flag_to_string
// in propgrid.cpp.
/** Indicates bold font.
*/
#define wxPG_PROP_MODIFIED 0x0001
/** Disables ('greyed' text and editor does not activate) property.
*/
#define wxPG_PROP_DISABLED 0x0002
/** Hider button will hide this property.
*/
#define wxPG_PROP_HIDEABLE 0x0004
/** This property has custom paint image just in front of its value.
If property only draws custom images into a popup list, then this
flag should not be set.
*/
#define wxPG_PROP_CUSTOMIMAGE 0x0008
/** Do not create text based editor for this property (but button-triggered
dialog and choice are ok).
*/
#define wxPG_PROP_NOEDITOR 0x0010
/** Value is unspecified.
*/
#define wxPG_PROP_UNSPECIFIED 0x0020
/** Indicates the bit useable by derived properties.
*/
#define wxPG_PROP_CLASS_SPECIFIC_1 0x0040
/** Indicates the bit useable by derived properties.
*/
#define wxPG_PROP_CLASS_SPECIFIC_2 0x0080
/** Property value cannot be modified. However, editor may be created
so that the value can be easily copied.
*/
#define wxPG_PROP_READONLY 0x0100
/** @}
*/
// Amalgam of flags that should be inherited by sub-properties
#define wxPG_INHERITED_PROPFLAGS (wxPG_PROP_HIDEABLE|wxPG_PROP_NOEDITOR)
// -----------------------------------------------------------------------
/** @defgroup attrids wxPropertyGrid Property Attribute Identifiers
wxPropertyGrid::SetPropertyAttribute accepts one of these as
attrid argument when used with one of the built-in property classes.
@{
*/
/** wxBoolProperty specific, int, default 0. When 1 sets bool property to
use checkbox instead of choice.
*/
#define wxPG_BOOL_USE_CHECKBOX 64
/** wxBoolProperty specific, int, default 0. When 1 sets bool property value
to cycle on double click (instead of showing the popup listbox).
*/
#define wxPG_BOOL_USE_DOUBLE_CLICK_CYCLING 65
/** wxFloatProperty (and similar) specific, int, default -1. Sets the (max) precision
used when floating point value is rendered as text. The default -1 means infinite
precision.
*/
#define wxPG_FLOAT_PRECISION 66
/** The text will be echoed as asterisks (wxTE_PASSWORD will be passed to textctrl etc).
*/
#define wxPG_STRING_PASSWORD 67
/** Define base used by a wxUIntProperty. Valid constants are
wxPG_BASE_OCT, wxPG_BASE_DEC, wxPG_BASE_HEX and wxPG_BASE_HEXL
(lowercase characters).
*/
#define wxPG_UINT_BASE 68
/** Define prefix rendered to wxUIntProperty. Accepted constants
wxPG_PREFIX_NONE, wxPG_PREFIX_0x, and wxPG_PREFIX_DOLLAR_SIGN.
<b>Note:</b> Only wxPG_PREFIX_NONE works with Decimal and Octal
numbers.
*/
#define wxPG_UINT_PREFIX 69
/** wxFileProperty/wxImageFileProperty specific, wxChar*, default is detected/varies.
Sets the wildcard used in the triggered wxFileDialog. Format is the
same.
*/
#define wxPG_FILE_WILDCARD 70
/** wxFileProperty/wxImageFileProperty specific, int, default 1.
When 0, only the file name is shown (i.e. drive and directory are hidden).
*/
#define wxPG_FILE_SHOW_FULL_PATH 71
/** Specific to wxFileProperty and derived properties, wxString, default empty.
If set, then the filename is shown relative to the given path string.
*/
#define wxPG_FILE_SHOW_RELATIVE_PATH 72
/** Specific to wxFileProperty and derived properties, wxString, default is empty.
Sets the initial path of where to look for files.
*/
#define wxPG_FILE_INITIAL_PATH 73
/** Specific to wxFileProperty and derivatives, wxString, default is empty.
Sets a specific title for the dir dialog.
*/
#define wxPG_FILE_DIALOG_TITLE 74
/** Specific to wxDirProperty, wxString, default is empty.
Sets a specific message for the dir dialog.
*/
#define wxPG_DIR_DIALOG_MESSAGE 75
/** Sets displayed date format for wxDateProperty.
*/
#define wxPG_DATE_FORMAT 76
/** Sets wxDatePickerCtrl window style used with wxDateProperty. Default
is wxDP_DEFAULT | wxDP_SHOWCENTURY.
*/
#define wxPG_DATE_PICKER_STYLE 77
#ifdef wxPG_COMPATIBILITY_1_0_0
/** wxCustomProperty specific, wxPGEditor*. Set editor control. Editor pointer is stored
in variable named wxPGEditor_EDITORNAME. So the basic built-in editors are at
wxPGEditor_TextCtrl, wxPGEditor_Choice, wxPGEditor_ComboBox, wxPGEditor_CheckBox,
wxPGEditor_TextCtrlAndButton, and wxPGEditor_ChoiceAndButton.
*/
#define wxPG_CUSTOM_EDITOR 128
/** wxCustomProperty specific, wxBitmap*. Sets a small bitmap. Value must be given as
pointer and it is then copied. If you give it wxNullBitmap, then the current
image (if any) is deleted.
*/
#define wxPG_CUSTOM_IMAGE 129
/** wxCustomProperty specific, void*. Sets callback function (of type wxPropertyGridCallback)
that is called whenever button is pressed.
*/
#define wxPG_CUSTOM_CALLBACK 130
#endif // wxPG_COMPATIBILITY_1_0_0
/** wxCustomProperty specific, void*. Sets callback function (of type wxPGPaintCallback)
that is called whenever image in front of property needs to be repainted. This attribute
takes precedence over bitmap set with wxPG_CUSTOM_IMAGE, and it is only proper way
to draw images to wxCustomProperty's drop down choices list.
\remarks
Callback must handle measure calls (i.e. when rect.x < 0, set paintdata.m_drawnHeight to
height of item in question).
*/
#define wxPG_CUSTOM_PAINT_CALLBACK 131
/** wxCustomProperty specific, int, default 0. Setting to 1 makes children private, similar to other
properties with children.
\remarks
- Children must be added <b>when this attribute has value 0</b>. Otherwise
there will be an assertion failure.
- Changed event occurs on the parent only.
*/
#define wxPG_CUSTOM_PRIVATE_CHILDREN 132
/** wxColourProperty and its kind, int, default 1. Setting this attribute to 0 hides custom
colour from property's list of choices.
*/
#define wxPG_COLOUR_ALLOW_CUSTOM 151
/** First attribute id that is guaranteed not to be used built-in
properties.
*/
#define wxPG_USER_ATTRIBUTE 192
/** @}
*/
//
// Valid constants for wxPG_UINT_BASE attribute
// (long because of wxVariant constructor)
#define wxPG_BASE_OCT (long)8
#define wxPG_BASE_DEC (long)10
#define wxPG_BASE_HEX (long)16
#define wxPG_BASE_HEXL (long)32
//
// Valid constants for wxPG_UINT_PREFIX attribute
#define wxPG_PREFIX_NONE (long)0
#define wxPG_PREFIX_0x (long)1
#define wxPG_PREFIX_DOLLAR_SIGN (long)2
// -----------------------------------------------------------------------
// Value type.
// Value type declarer, with optional declaration part (with creator function).
#define WX_PG_DECLARE_VALUE_TYPE_WITH_DECL(VALUETYPE,DECL) \
extern DECL const wxPGValueType *wxPGValueType_##VALUETYPE; \
extern DECL wxPGValueType* wxPGNewVT##VALUETYPE();
// Value type declarer (with creator function).
#define WX_PG_DECLARE_VALUE_TYPE(VALUETYPE) \
extern const wxPGValueType *wxPGValueType_##VALUETYPE; \
wxPGValueType* wxPGNewVT##VALUETYPE();
// Value type declarer, with optional declaration part.
#define WX_PG_DECLARE_VALUE_TYPE_BUILTIN_WITH_DECL(VALUETYPE,DECL) \
extern DECL const wxPGValueType *wxPGValueType_##VALUETYPE;
// Value type accessor.
#if !wxPG_VALUETYPE_IS_STRING
#define wxPG_VALUETYPE(T) wxPGValueType_##T
#define wxPG_VALUETYPE_PTR(T) wxPGValueType_##T
#else
#define wxPG_VALUETYPE(T) wxT(#T)
#define wxPG_VALUETYPE_PTR(T) wxPropertyContainerMethods::GetValueType(wxT(#T))
#endif
// Like wxPG_VALUETYPE, but casts pointer to exact class.
#define wxPG_VALUETYPE_EXACT(T) ((wxPGValueType##VALUETYPE##Class)wxPGValueType##T)
// Declare builtin value types.
WX_PG_DECLARE_VALUE_TYPE_BUILTIN_WITH_DECL(none,WXDLLIMPEXP_PG)
WX_PG_DECLARE_VALUE_TYPE_BUILTIN_WITH_DECL(wxString,WXDLLIMPEXP_PG)
WX_PG_DECLARE_VALUE_TYPE_BUILTIN_WITH_DECL(long,WXDLLIMPEXP_PG)
WX_PG_DECLARE_VALUE_TYPE_BUILTIN_WITH_DECL(bool,WXDLLIMPEXP_PG)
WX_PG_DECLARE_VALUE_TYPE_BUILTIN_WITH_DECL(double,WXDLLIMPEXP_PG)
WX_PG_DECLARE_VALUE_TYPE_BUILTIN_WITH_DECL(void,WXDLLIMPEXP_PG)
WX_PG_DECLARE_VALUE_TYPE_BUILTIN_WITH_DECL(wxArrayString,WXDLLIMPEXP_PG)
#ifdef __WXPYTHON__
WX_PG_DECLARE_VALUE_TYPE_BUILTIN_WITH_DECL(PyObject,WXDLLIMPEXP_PG)
#endif
//
// With wxWidgets 2.9 and later we demand native C++ RTTI support
#if wxCHECK_VERSION(2,9,0)
#ifdef wxNO_RTTI
#error "You need to enable compiler RTTI support when using wxWidgets 2.9.0 or later"
#endif
#define WX_PG_DECLARE_DYNAMIC_CLASS_VARIANTDATA(A)
#define WX_PG_IMPLEMENT_DYNAMIC_CLASS_VARIANTDATA(A, B)
#else
#define WX_PG_DECLARE_DYNAMIC_CLASS_VARIANTDATA DECLARE_DYNAMIC_CLASS
#define WX_PG_IMPLEMENT_DYNAMIC_CLASS_VARIANTDATA IMPLEMENT_DYNAMIC_CLASS
#endif
// VDC = wxVariantData Class
#define WX_PG_DECLARE_VALUE_TYPE_VDC(VALUETYPE) \
wxVariantData_##VALUETYPE : public wxPGVariantDataWxObj \
{ \
WX_PG_DECLARE_DYNAMIC_CLASS_VARIANTDATA(wxVariantData_##VALUETYPE) \
protected: \
VALUETYPE m_value; \
public: \
wxVariantData_##VALUETYPE(); \
wxVariantData_##VALUETYPE(const VALUETYPE& value); \
virtual void Copy(wxVariantData& data); \
virtual bool Eq(wxVariantData& data) const; \
virtual wxString GetType() const; \
virtual void* GetValuePtr(); \
inline const VALUETYPE& GetValue () const { return m_value; }
// Value type declarer for void* that need auto-generated .
#define WX_PG_DECLARE_VALUE_TYPE_VOIDP_WITH_DECL(VALUETYPE,DECL) \
class DECL WX_PG_DECLARE_VALUE_TYPE_VDC(VALUETYPE) \
}; \
extern DECL const wxPGValueType *wxPGValueType_##VALUETYPE;
#define WX_PG_DECLARE_VALUE_TYPE_VOIDP(VALUETYPE) \
class WX_PG_DECLARE_VALUE_TYPE_VDC(VALUETYPE) \
}; \
WX_PG_DECLARE_VALUE_TYPE(VALUETYPE)
#ifndef SWIG
/** \class wxPGVariantDataWxObj
\ingroup classes
\brief Identical to wxVariantDataWxObjectPtr except that it deletes the
ptr on destruction.
*/
class WXDLLIMPEXP_PG wxPGVariantDataWxObj : public wxVariantData
{
public:
wxPGVariantDataWxObj();
virtual ~wxPGVariantDataWxObj();
#if wxUSE_STD_IOSTREAM
virtual bool Write(wxSTD ostream& str) const;
#endif
virtual bool Write(wxString& str) const;
#if wxUSE_STD_IOSTREAM
virtual bool Read(wxSTD istream& str);
#endif
virtual bool Read(wxString& str);
virtual void* GetValuePtr() = 0;
};
#endif // #ifndef SWIG
#if !wxCHECK_VERSION(2,9,0)
typedef wxList wxVariantList;
#endif
// -----------------------------------------------------------------------
// Editor class.
// Editor accessor.
#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();
// Declare editor class.
#define WX_PG_DECLARE_EDITOR(EDITOR) \
extern wxPGEditor* wxPGEditor_##EDITOR; \
extern wxPGEditor* wxPGConstruct##EDITOR##EditorClass();
// Declare builtin editor classes.
WX_PG_DECLARE_EDITOR_WITH_DECL(TextCtrl,WXDLLIMPEXP_PG)
WX_PG_DECLARE_EDITOR_WITH_DECL(Choice,WXDLLIMPEXP_PG)
WX_PG_DECLARE_EDITOR_WITH_DECL(ComboBox,WXDLLIMPEXP_PG)
WX_PG_DECLARE_EDITOR_WITH_DECL(TextCtrlAndButton,WXDLLIMPEXP_PG)
#if wxPG_INCLUDE_CHECKBOX
WX_PG_DECLARE_EDITOR_WITH_DECL(CheckBox,WXDLLIMPEXP_PG)
#endif
WX_PG_DECLARE_EDITOR_WITH_DECL(ChoiceAndButton,WXDLLIMPEXP_PG)
// -----------------------------------------------------------------------
/** \class wxPGValueType
\ingroup classes
\brief wxPGValueType is base class for property value types.
*/
class WXDLLIMPEXP_PG wxPGValueType
{
public:
virtual ~wxPGValueType() = 0;
/** Returns type name. If there is wxVariantData for this type, then name should
be the same that the class uses (otherwise wxT("void*")). */
virtual wxPG_CONST_WXCHAR_PTR GetTypeName() const = 0;
/** Returns custom type name. If this is base for a type, should not be overridden,
as the default implementation already does good thing and calls GetTypeName.
Otherwise, should be an unique string, such as the class name etc.
*/
virtual wxPG_CONST_WXCHAR_PTR GetCustomTypeName() const;
/** Returns default value.
*/
virtual wxPGVariant GetDefaultValue() const = 0;
/** Creates wxVariant with supplied value and name.
*/
virtual wxVariant GenerateVariant( wxPGVariant value, const wxString& name ) const = 0;
/** Creates new property instance with "proper" class. Initial value is set
to default.
*/
virtual wxPGProperty* GenerateProperty( const wxString& label, const wxString& name ) const = 0;
/** Sets property value from wxVariant.
*/
virtual void SetValueFromVariant( wxPGProperty* property, wxVariant& value ) const = 0;
/** Returns type that can be passed to CreatePropertyByType.
*/
inline wxPG_CONST_WXCHAR_PTR GetType() const
{
return GetCustomTypeName();
}
protected:
};
// -----------------------------------------------------------------------
// wxVariant definition macro (sans functional eq-operator)
#define WX_PG_DECLARE_VARIANT_DATA(CLASSNAME, DATATYPE, DECL) \
class DECL CLASSNAME : public wxVariantData \
{ \
DECLARE_DYNAMIC_CLASS(CLASSNAME) \
public: \
CLASSNAME() { } \
CLASSNAME(const DATATYPE& value) { m_value = value; } \
inline DATATYPE GetValue() const { return m_value; } \
inline const DATATYPE& GetValueRef() const { return m_value; } \
inline void SetValue(const DATATYPE& value) { m_value = value; } \
virtual bool Eq(wxVariantData&) const { return false; } \
virtual wxString GetType() const { return wxT(#DATATYPE); } \
virtual wxVariantData* Clone() { return new CLASSNAME; } \
virtual void Copy(wxVariantData &data) { ((CLASSNAME&)data).SetValue(m_value); } \
virtual bool Read(wxString &) { return false; } \
virtual bool Write(wxString &) const { return true; } \
protected: \
DATATYPE m_value; \
};
#define WX_PG_DECLARE_VARIANT_DATA_PTR(CLASSNAME, DATATYPE, DECL) \
class DECL CLASSNAME : public wxVariantData \
{ \
DECLARE_DYNAMIC_CLASS(CLASSNAME) \
public: \
CLASSNAME() { } \
CLASSNAME(DATATYPE* value) { m_value = value; } \
inline void SetValue(DATATYPE* value) { m_value = value; } \
inline DATATYPE* GetValue() const { return m_value; } \
virtual bool Eq(wxVariantData&) const { return false; } \
virtual wxString GetType() const { return wxT(#DATATYPE); } \
virtual wxVariantData* Clone() { return new CLASSNAME; } \
virtual void Copy(wxVariantData &data) { ((CLASSNAME&)data).SetValue(m_value); } \
virtual bool Read(wxString &) { return false; } \
virtual bool Write(wxString &) const { return true; } \
protected: \
DATATYPE* m_value; \
};
#if wxPG_PGVARIANT_IS_VARIANT
#define wxPGVariantToWxObjectPtr(A,B) wxDynamicCast(A.GetWxObjectPtr(),B);
#define wxPGVariantGetWxObjectPtr(A) A.GetWxObjectPtr()
#define wxPGVariantToWxObject(A) (*A.GetWxObjectPtr())
#define wxPGVariantToDateTime(A) A.GetDateTime()
#define wxPGVariantToWxPoint(A) ((wxPGVariantDataPoint*)(A.GetData()))->GetValueRef()
#define wxPGVariantToWxSize(A) ((wxPGVariantDataSize*)(A.GetData()))->GetValueRef()
#define wxPGVariantToWxLongLong(A) ((wxPGVariantDataLongLong*)(A.GetData()))->GetValueRef()
#define wxPGVariantToWxULongLong(A) ((wxPGVariantDataULongLong*)(A.GetData()))->GetValueRef()
#define wxPGVariantToArrayInt(A) ((wxPGVariantDataArrayInt*)(A.GetData()))->GetValueRef()
#define wxPGVariantToPyObject(A) ((wxPGVariantDataPyObject*)(A.GetData()))->GetValue()
#define wxPGVariantFromWxObject(A) wxVariant((wxObject*)A)
#define wxPGVariantFromLong(A) wxVariant(((long)A))
#if !defined(SWIG)
WX_PG_DECLARE_VARIANT_DATA(wxPGVariantDataPoint, wxPoint, WXDLLIMPEXP_PG)
WX_PG_DECLARE_VARIANT_DATA(wxPGVariantDataSize, wxSize, WXDLLIMPEXP_PG)
WX_PG_DECLARE_VARIANT_DATA(wxPGVariantDataArrayInt, wxArrayInt, WXDLLIMPEXP_PG)
WX_PG_DECLARE_VARIANT_DATA(wxPGVariantDataLongLong, wxLongLong, WXDLLIMPEXP_PG)
WX_PG_DECLARE_VARIANT_DATA(wxPGVariantDataULongLong, wxULongLong, WXDLLIMPEXP_PG)
#ifdef __WXPYTHON__
WX_PG_DECLARE_VARIANT_DATA_PTR(wxPGVariantDataPyObject, PyObject, WXDLLIMPEXP_PG)
#endif
// We need this because wxVariant lacks all necessary constructors
inline wxVariant wxPGVariantCreator(long a) { return wxVariant((long)a); }
inline wxVariant wxPGVariantCreator(int a) { return wxVariant((long)a); }
inline wxVariant wxPGVariantCreator(bool a) { return wxVariant(a); }
inline wxVariant wxPGVariantCreator(const double& a) { return wxVariant(a); }
inline wxVariant wxPGVariantCreator(const wxString& a) { return wxVariant(a); }
// NB: This may look dangerous. However, the wxVariant lives only a very short
// time, so it is very unlikely they value will be modified by some
// "third party".
inline wxVariant wxPGVariantCreator(const wxObject* a) { return wxVariant((wxObject*)a); }
inline wxVariant wxPGVariantCreator(const wxObject& a) { return wxVariant((wxObject*)(&a)); }
inline wxVariant wxPGVariantCreator(wxObject* a) { return wxVariant(a); }
inline wxVariant wxPGVariantCreator(wxObject& a) { return wxVariant(&a); }
inline wxVariant wxPGVariantCreator(void* a) { return wxVariant(a); }
inline wxVariant wxPGVariantCreator(const wxArrayString& a) { return wxVariant((wxArrayString&)a); }
inline wxVariant wxPGVariantCreator(const wxArrayInt& a) { return wxVariant(new wxPGVariantDataArrayInt(a)); }
inline wxVariant wxPGVariantCreator(const wxPoint& a) { return wxVariant(new wxPGVariantDataPoint(a)); }
inline wxVariant wxPGVariantCreator(const wxSize& a) { return wxVariant(new wxPGVariantDataSize(a)); }
inline wxVariant wxPGVariantCreator(const wxLongLong& a) { return wxVariant(new wxPGVariantDataLongLong(a)); }
inline wxVariant wxPGVariantCreator(const wxULongLong& a) { return wxVariant(new wxPGVariantDataULongLong(a)); }
#ifdef __WXPYTHON__
inline wxVariant wxPGVariantCreator(PyObject* a) { return wxVariant(new wxPGVariantDataPyObject(a)); }
#endif
#if wxUSE_DATETIME
inline wxVariant wxPGVariantCreator(const wxDateTime& a) { return wxVariant(a); }
#endif
#endif // !defined(SWIG)
#else // !wxPG_PGVARIANT_IS_VARIANT
union wxPGVariantUnion
{
long m_long;
void* m_ptr;
bool m_bool;
};
//
// Very simple value wrapper class
//
// NB: It only holds the pointers for a short period, so don't
// worry about it not making copies.
class WXDLLIMPEXP_PG wxPGVariant
{
public:
/** Constructor for none. */
wxPGVariant()
{
m_v.m_ptr = (void*)NULL;
}
#ifndef SWIG
/** Constructor for long integer. */
wxPGVariant( long v_long )
{
m_v.m_long = v_long;
}
/** Constructor for integer. */
wxPGVariant( int v_long )
{
m_v.m_long = v_long;
}
/** Constructor for bool. */
wxPGVariant( bool value )
{
m_v.m_bool = value;
}
/** Constructor for float. */
wxPGVariant( const double& v_ptr )
{
m_v.m_ptr = (void*)&v_ptr;
}
/** Constructor for wxString*. */
wxPGVariant( const wxString& v_ptr )
{
m_v.m_ptr = (void*)&v_ptr;
}
/** Constructor for wxArrayString*. */
wxPGVariant( const wxArrayString& v_ptr )
{
m_v.m_ptr = (void*)&v_ptr;
}
/** Constructor for wxArrayInt. */
wxPGVariant( const wxArrayInt& v_ptr )
{
m_v.m_ptr = (void*)&v_ptr;
}
/** Constructor for wxPoint. */
wxPGVariant( const wxPoint& v_ptr )
{
m_v.m_ptr = (void*)&v_ptr;
}
/** Constructor for wxSize. */
wxPGVariant( const wxSize& v_ptr )
{
m_v.m_ptr = (void*)&v_ptr;
}
/** Constructor for wxLongLong. */
wxPGVariant( const wxLongLong& v_ptr )
{
m_v.m_ptr = (void*)&v_ptr;
}
/** Constructor for wxULongLong. */
wxPGVariant( const wxULongLong& v_ptr )
{
m_v.m_ptr = (void*)&v_ptr;
}
/** Constructor for wxObject&. */
wxPGVariant( const wxObject& v_ptr )
{
m_v.m_ptr = (void*)&v_ptr;
}
/** Constructor for wxObject*. */
wxPGVariant( const wxObject* v_ptr )
{
m_v.m_ptr = (void*)v_ptr;
}
/** Constructor for void*. */
wxPGVariant( void* v_ptr )
{
m_v.m_ptr = v_ptr;
}
#if wxUSE_DATETIME
/** Constructor for wxDateTime ptr. */
wxPGVariant( const wxDateTime& dt )
{
m_v.m_ptr = (void*) &dt;
}
#endif
/** Returns value as long integer. */
inline long GetLong() const
{
return m_v.m_long;
}
/** Returns value as boolean integer. */
inline bool GetBool() const
{
return m_v.m_bool;
}
/** Returns value as floating point number. */
inline double GetDouble() const
{
return *((double*)m_v.m_ptr);
}
/** Returns value as floating point number ptr. */
inline double* GetDoublePtr() const
{
return (double*) m_v.m_ptr;
}
/** Returns value as a wxString. */
inline const wxString& GetString() const
{
return *((const wxString*)m_v.m_ptr);
}
/** Returns value as a reference to a wxArrayString. */
inline wxArrayString& GetArrayString() const
{
wxArrayString* temp = (wxArrayString*)m_v.m_ptr;
return *temp;
}
inline const wxObject& GetWxObject() const
{
return *((const wxObject*)m_v.m_ptr);
}
inline wxObject* GetWxObjectPtr() const
{
return (wxObject*)m_v.m_ptr;
}
/** Returns value as void*. */
inline void* GetVoidPtr() const
{
return m_v.m_ptr;
}
#if wxUSE_DATETIME
/** Returns value as const wxDateTime&. */
inline const wxDateTime& GetDateTime() const
{
return *((const wxDateTime*)m_v.m_ptr);
}
#endif
#endif // #ifndef SWIG
/** Returns value as long integer without type checking. */
inline long GetRawLong() const { return m_v.m_long; }
/** Returns value as void* without type checking. */
inline void* GetRawPtr() const { return m_v.m_ptr; }
#undef wxPG_ASSERT_VARIANT_GET
/** Value in portable format. */
wxPGVariantUnion m_v;
};
#define wxPGVariantGetWxObjectPtr(A) ((wxObject*)A.GetRawPtr())
#define wxPGVariantToWxObjectPtr(A,B) wxDynamicCast((wxObject*)A.GetRawPtr(),B);
#define wxPGVariantToWxObject(A) A.GetWxObject()
#define wxPGVariantToDateTime(A) *((wxDateTime*)A.GetVoidPtr())
#define wxPGVariantToWxPoint(A) *((wxPoint*)wxPGVariantToVoidPtr(A))
#define wxPGVariantToWxSize(A) *((wxSize*)wxPGVariantToVoidPtr(A))
#define wxPGVariantToWxLongLong(A) *((wxLongLong*)wxPGVariantToVoidPtr(A))
#define wxPGVariantToWxULongLong(A) *((wxULongLong*)wxPGVariantToVoidPtr(A))
#define wxPGVariantToArrayInt(A) *((wxArrayInt*)A.GetVoidPtr())
#define wxPGVariantFromWxObject(A) *((const wxObject*)A)
#define wxPGVariantFromLong(A) wxPGVariant(A)
#define wxPGVariantCreator wxPGVariant
#endif // !wxPG_PGVARIANT_IS_VARIANT
// Helper macros
#define wxPGVariantToString(A) A.GetString()
#define wxPGVariantToLong(A) A.GetLong()
#define wxPGVariantToBool(A) A.GetBool()
#define wxPGVariantToDouble(A) A.GetDouble()
#define wxPGVariantToArrayString(A) A.GetArrayString()
#define wxPGVariantToVoidPtr(A) A.GetVoidPtr()
#define wxPGVariantFromString(A) A
#define wxPGVariantFromDouble(A) A
#define wxPGVariantFromArrayString(A) A
#define wxPGVariantFromBool(A) A
// -----------------------------------------------------------------------
//
// Property class declaration helper macros
// (wxPGRootPropertyClass and wxPropertyCategory require this).
//
#define WX_PG_DECLARE_CLASSINFO() \
WX_PG_DECLARE_GETCLASSNAME \
WX_PG_DECLARE_GETCLASSINFO
// We don't want to create SWIG interface for DoGetEditorClass (we'll use GetEditor instead)
#ifndef SWIG
#define WX_PG_DECLARE_DOGETEDITORCLASS virtual const wxPGEditor* DoGetEditorClass() const;
#else
#define WX_PG_DECLARE_DOGETEDITORCLASS
#endif
#define WX_PG_DECLARE_PROPERTY_CLASS() \
public: \
virtual wxPG_VALUETYPE_MSGVAL GetValueType() const; \
WX_PG_DECLARE_DOGETEDITORCLASS \
WX_PG_DECLARE_CLASSINFO() \
private:
// Added for SWIG (which apparently doesn't support 0-argument macros)
// NB: Othwise, this is *identical* to WX_PG_DECLARE_PROPERTY_CLASS()
#define WX_PG_DECLARE_PROPERTY_CLASS_NOPARENS \
public: \
virtual wxPG_VALUETYPE_MSGVAL GetValueType() const; \
WX_PG_DECLARE_DOGETEDITORCLASS \
WX_PG_DECLARE_CLASSINFO() \
private:
#ifndef SWIG
// -----------------------------------------------------------------------
// wxPGPropertyClassInfo
typedef wxPGProperty* (*wxPGPropertyConstructor) (const wxString&,const wxString&);
/** \class wxPGPropertyClassInfo
\ingroup classes
\brief Class info structure for wxPGProperty derivatives (may be deprecated
in a future release).
*/
struct wxPGPropertyClassInfo
{
/** One returned by GetPropertyClassName */
const wxChar* m_name;
/** Classinfo of the base property class. */
const wxPGPropertyClassInfo* m_baseInfo;
/** Simple property constructor function. */
wxPGPropertyConstructor m_constructor;
};
// Use this macro to register your custom property classes.
#define wxPGRegisterPropertyClass(NAME) \
wxPropertyGrid::RegisterPropertyClass(wxT(#NAME),&NAME##ClassInfo)
// -----------------------------------------------------------------------
// Structure for relaying choice/list info.
struct wxPGChoiceInfo
{
const wxChar** m_arrWxChars;
wxString* m_arrWxString;
wxPGChoices* m_choices;
int m_itemCount;
};
// -----------------------------------------------------------------------
/** \class wxPGPropertyDataExt
\ingroup classes
\brief wxPGPropertyDataExt is data extension class for wxPGProperty.
*/
class WXDLLIMPEXP_PG wxPGPropertyDataExt
{
public:
wxPGPropertyDataExt()
{
#if wxUSE_VALIDATORS
m_validator = (wxValidator*) NULL;
#endif
m_customEditor = (wxPGEditor*) NULL;
m_valueBitmap = (wxBitmap*) NULL;
}
~wxPGPropertyDataExt()
{
// Do not delete m_customEditor
#if wxUSE_VALIDATORS
delete m_validator;
#endif
delete m_valueBitmap;
}
// For conviency, declare all members public.
wxString m_helpString; // Help shown in statusbar or help box.
const wxPGEditor* m_customEditor; // Overrides editor returned by property class
#if wxUSE_VALIDATORS
// NOTE: This is candidate for hash mapping.
wxValidator* m_validator; // Editor is going to get this validator
#endif
wxBitmap* m_valueBitmap; // Show this in front of the value
};
#endif
// -----------------------------------------------------------------------
/** \class wxPGProperty
\ingroup classes
\brief wxPGProperty, alias wxBasePropertyClass, is base class for properties.
Information here is provided primarily for anyone who creates new properties,
since <b>all operations on properties should be done via wxPropertyGrid's or
wxPropertyGridManager's methods</b>.
\remarks
- When changing name of a property, it is essential to use wxPropertyGrid::SetPropertyName
(that's why there is no SetName method).
*/
class WXDLLIMPEXP_PG wxPGProperty
{
#ifndef SWIG
friend class wxPGPropertyWithChildren;
friend class wxPropertyGrid;
friend class wxPropertyContainerMethods;
friend class wxPropertyGridState;
#endif
public:
// PYSWIG is a special symbol used by my custom scripts. Code to remove it
// automatically should be added in future.
#ifndef PYSWIG
/** Basic constructor. Should not be necessary to override.
*/
wxPGProperty();
#endif
/** Constructor.
Real used property classes should have constructor of this style:
\code
// If MyValueType is a class, then it should be a constant reference
// (e.g. const MyValueType& ) instead.
wxMyProperty( const wxString& label, const wxString& name,
MyValueType value ) : wxPGProperty
{
// Only required if MyValueType is not built-in default
// (wxString, long, double, bool, and wxArrayString are;
// wxFont, wxColour, etc. are not).
wxPG_INIT_REQUIRED_TYPE(MyValueType)
DoSetValue(value); // Generally recommended way to set the initial value.
// If has child properties (i.e. wxPGPropertyWithChildren is used
// as the parent class), then create children here. For example:
// AddChild( new wxStringProperty( wxT("Subprop 1"), wxPG_LABEL, value.GetSubProp1() ) );
}
\endcode
Of course, in this example, wxPGProperty could also be wxPGPropertyWithChildren
(if it has sub-properties) or actually any other property class.
*/
wxPGProperty( const wxString& label, const wxString& name );
/** Virtual destructor. It is customary for derived properties to override this. */
virtual ~wxPGProperty();
/** Sets property's internal value.
\param value
Simple container with GetString(), GetLong() etc. methods. Currently recommended
means to extract value is to use wxPGVariantToXXX(value) macro.
\remarks
Example pseudo-implementation with comments:
\code
void wxMyProperty::DoSetValue ( wxPGVariant value )
{
// A) Get value. For example
const wxMyValueType* pvalue = wxPGVariantToWxObjectPtr(value,wxMyValueType);
// or:
const wxString& str = wxPGVariantToString(value);
// or:
long val = wxPGVariantToLong(value);
// B) If value is wxObject or void based with NULL default, then handle that:
if ( pvalue )
m_value = *pvalue;
else
pmyvalue->SetToDefault();
// Otherwise
// m_value = *pvalue;
// is sufficient.
// C) If has children, this should be here (before displaying in control).
RefreshChildren();
}
\endcode
*/
virtual void DoSetValue( wxPGVariant value );
/** Returns properly constructed wxPGVariant.
*/
virtual wxPGVariant DoGetValue() const;
/** Returns text representation of property's value.
\param argFlags
If wxPG_FULL_VALUE is set, returns complete, storable value instead of displayable
one (they may be different).
*/
virtual wxString GetValueAsString( int argFlags = 0 ) const;
/** Converts string to a value, and if succesfull, calls DoSetValue() on it.
Default behaviour is to do nothing.
\param text
String to get the value from.
\param report_error
If true, invalid string will be reported (prefer to use wxLogError).
\retval
true if value was changed.
*/
virtual bool SetValueFromString( const wxString& text, int flags = 0 );
/** Converts integer to a value, and if succesfull, calls DoSetValue() on it.
Default behaviour is to do nothing.
\param value
Int to get the value from.
\param flags
If has wxPG_FULL_VALUE, then the value given is a actual value and not an index.
\retval
true if value was changed.
*/
virtual bool SetValueFromInt( long value, int flags = 0 );
/** Returns size of the custom painted image in front of property. This method
must be overridden to return non-default value if OnCustomPaint is to be
called.
\remarks
- If flexible image size is desired, return wxPG_FLEXIBLE_SIZE(wid,hei).
OnCustomPaint is then called to measure items as well (see for
wxPGProperty::OnCustomPaint for measure call specs).
- If entire property, including text, is to be custom painted, then
wxPG_FULL_CUSTOM_PAINT_SIZE(hei) or wxPG_FULL_CUSTOM_PAINT_FLEXIBLE_SIZE(hei)
is to be returned.
- Default behaviour is to return wxSize(0,0), which means no image.
- Default image width or height is indicated with dimension -1.
*/
virtual wxSize GetImageSize() const;
/** Events received by editor widgets are processed here. Note that editor class
usually processes most events. Some, such as button press events of
TextCtrlAndButton class, should be handled here. Also, if custom handling
for regular events is desired, then that can also be done (for example,
wxSystemColourProperty custom handles wxEVT_COMMAND_CHOICE_SELECTED).
\param event
Associated wxEvent.
\retval
Should return true if any changes in value should be reported. This is case,
for example, when enter is pressed in wxTextCtrl.
*/
virtual bool OnEvent( wxPropertyGrid* propgrid, wxWindow* wnd_primary, wxEvent& event );
#if wxPG_INCLUDE_WXOBJECT
inline wxPG_CONST_WXCHAR_PTR GetClassName() const
{
return GetClassInfo()->GetClassName();
}
#else
/** Returns classname (for example, "wxStringProperty" for wxStringProperty)
of a property class.
*/
virtual wxPG_CONST_WXCHAR_PTR GetClassName() const = 0;
#endif
/** Returns pointer to the object that has methods related to
the value type of this property. Keep atleast this method
abstract so the class is kept abstract.
*/
#ifndef __WXPYTHON__
virtual const wxPGValueType* GetValueType() const = 0;
#else
#ifndef SWIG
virtual const wxPGValueType* GetValueType() const;
#endif
// Implement this in Python
virtual wxString GetType() const;
#endif
#if !wxPG_VALUETYPE_IS_STRING
const wxPGValueType* GetValueTypePtr() const { return GetValueType(); }
#else
const wxPGValueType* GetValueTypePtr() const;
#endif
#ifndef SWIG
/** Returns pointer to an instance of editor class.
*/
virtual const wxPGEditor* DoGetEditorClass() const;
#endif
#ifdef __WXPYTHON__
/** Returns name of editor used. Takes precendence in the wxPython bindings.
*/
virtual wxString GetEditor() const;
#endif
#if wxUSE_VALIDATORS
/** Returns pointer to the wxValidator that should be used
with the editor of this property (NULL for no validator).
Setting validator explicitly via SetPropertyValidator
will override this.
In most situations, code like this should work well
(macros are used to maintain one actual validator instance,
so on the second call the function exits within the first
macro):
\code
wxValidator* wxMyPropertyClass::DoGetValidator () const
{
WX_PG_DOGETVALIDATOR_ENTRY()
wxMyValidator* validator = new wxMyValidator(...);
... prepare validator...
WX_PG_DOGETVALIDATOR_EXIT(validator)
}
\endcode
\remarks
You can get common filename validator by returning
wxFilePropertyClass::GetClassValidator(). wxDirProperty,
for example, uses it.
*/
virtual wxValidator* DoGetValidator () const;
#endif // #if wxUSE_VALIDATORS
/** Returns 0 for normal items. 1 for categories, -1 for other properties with children,
-2 for wxCustomProperty (mostly like -1 ones but with few expections).
\remarks
Should not be overridden by new custom properties. Usually only used internally.
*/
inline signed char GetParentingType() const { return m_parentingType; }
/** Returns current value's index to the choice control. May also return,
through pointer arguments, strings that should be inserted to that control.
Irrelevant to classes which do not employ wxPG_EDITOR(Choice) or similar.
\remarks
- If returns -1 in choiceinfo->m_itemCount, then in that case this
class be derived from wxBaseEnumPropertyClass (see propdev.h) and
GetEntry is used to fill an array (slower, but handier if you don't
store your labels as arrays of strings).
- Must not crash even if property's set of choices is uninitialized
(i.e. it points to wxPGGlobalVars->m_emptyConstants).
*/
virtual int GetChoiceInfo( wxPGChoiceInfo* choiceinfo );
/** Override to paint an image in front of the property value text or drop-down
list item (but only if wxPGProperty::GetImageSize is overridden as well).
If property's GetImageSize() returns size that has height != 0 but less than
row height ( < 0 has special meanings), wxPropertyGrid calls this method to
draw a custom image in a limited area in front of the editor control or
value text/graphics, and if control has drop-down list, then the image is
drawn there as well (even in the case GetImageSize() returned higher height
than row height).
NOTE: Following applies when GetImageSize() returns a "flexible" height (
using wxPG_FLEXIBLE_SIZE(W,H) macro), which implies variable height items:
If rect.x is < 0, then this is a measure item call, which means that
dc is invalid and only thing that should be done is to set paintdata.m_drawnHeight
to the height of the image of item at index paintdata.m_choiceItem. This call
may be done even as often as once every drop-down popup show.
\param dc
wxDC to paint on.
\param rect
Box reserved for custom graphics. Includes surrounding rectangle, if any.
If x is < 0, then this is a measure item call (see above).
\param paintdata
wxPGPaintData structure with much useful data.
\remarks
- You can actually exceed rect width, but if you do so then paintdata.m_drawnWidth
must be set to the full width drawn in pixels.
- Due to technical reasons, rect's height will be default even if custom height
was reported during measure call.
- Changing font and text colour affects the text drawn next to the painted image
(which is done immediately after the OnCustomPaint call finishes).
- Brush is guaranteed to be default background colour. It has been already used to
clear the background of area being painted. It can be modified.
- Pen is guaranteed to be 1-wide 'black' (or whatever is the proper colour) pen for
drawing framing rectangle. It can be changed as well.
\sa @link GetValueAsString @endlink
*/
virtual void OnCustomPaint( wxDC& dc,
const wxRect& rect, wxPGPaintData& paintdata );
/** Sets an attribute of this property. This is quite property class specific,
and there are no common attributes. Note that attribute may be specific
to a property instance, or it may affect all properties of its class.
\param id
Identifier of attribute
\param value
Value for that attribute.
*/
virtual void SetAttribute( int id, wxVariant& value );
/** Adds entry to property's wxPGChoices and editor control (if it is active).
Returns index of item added.
*/
inline int AppendChoice( const wxString& label, int value = wxPG_INVALID_VALUE )
{
return InsertChoice(label,-1,value);
}
/** Removes entry from property's wxPGChoices and editor control (if it is active).
If selected item is deleted, then the value is set to unspecified.
*/
void DeleteChoice( int index );
/** Returns comma-delimited string of property attributes.
*/
wxString GetAttributes( unsigned int flagmask = 0xFFFF );
#if !wxPG_INCLUDE_WXOBJECT
/** Returns classinfo of the property class.
*/
virtual const wxPGPropertyClassInfo* GetClassInfo() const = 0;
#endif
/** Returns property's label. */
inline const wxString& GetLabel() const { return m_label; }
#ifndef SWIG
/** Returns wxPropertyGridState to which this property belongs. */
wxPropertyGridState* GetParentState() const;
#endif
/** Returns property's name (alternate way to access property). */
inline const wxString& GetName() const { return m_name; }
inline void DoSetName(const wxString& str) { m_name = str; }
/** If property did not have data extension, one is created now
(returns true in that case).
*/
bool EnsureDataExt();
/** Gets pre-calculated top y coordinate of property graphics.
This cannot be relied on all times (wxPropertyGrid knows when :) ),
and value is -1 if property is not visible.
*/
inline int GetY() const { return m_y; }
void UpdateControl( wxWindow* primary );
inline wxString GetDisplayedString() const
{
return GetValueAsString(0);
}
/** Returns property id. */
inline wxPGId GetId() { return wxPGIdGen(this); }
/** Returns property grid where property lies. */
wxPropertyGrid* GetGrid() const;
/** Returns highest level non-category, non-root parent. Useful when you
have nested wxCustomProperties/wxParentProperties.
\remarks
Thus, if immediate parent is root or category, this will return the
property itself.
*/
wxPGProperty* GetMainParent() const;
/** Return parent of property */
inline wxPGPropertyWithChildren* GetParent() const { return m_parent; }
/** Returns true if property is valid and wxPropertyGrid methods
can operate on it safely.
*/
inline bool IsOk() const
{
return (( m_y >= -1 )?true:false);
}
typedef short FlagType;
#ifndef __WXPYTHON__
typedef void* ClientDataType;
#else
typedef PyObject* ClientDataType;
#endif
inline bool IsFlagSet( FlagType flag ) const
{
return ( m_flags & flag ) ? true : false;
}
inline bool IsValueUnspecified() const
{
return ( m_flags & wxPG_PROP_UNSPECIFIED ) ? true : false;
}
bool HasFlag( FlagType flag ) const
{
return ( m_flags & flag ) ? true : false;
}
/** Initializes the property. Usually only called in the constructor.
*/
void Init( const wxString& label, const wxString& name );
/** Returns true if extra children can be added for this property
(i.e. it is wxPropertyCategory or wxCustomProperty)
*/
inline bool CanHaveExtraChildren() const
{
return ( m_parentingType == 1 || m_parentingType == -2 );
}
/** Returns property's data extension (NULL if none). */
inline wxPGPropertyDataExt* GetDataExt() { return m_dataExt; }
unsigned int GetFlags() const
{
return (unsigned int)m_flags;
}
const wxPGEditor* GetEditorClass() const;
#ifndef __WXPYTHON__
/** Returns type name of property that is compatible with CreatePropertyByType.
and wxVariant::GetType.
*/
inline const wxChar* GetType() const
{
return GetValueTypePtr()->GetType();
}
#endif
/** Adds entry to property's wxPGChoices and editor control (if it is active).
Returns index of item added.
*/
int InsertChoice( const wxString& label, int index, int value = wxPG_INVALID_VALUE );
bool IsKindOf( wxPGPropertyClassInfo& info );
/** Returns true if this is a sub-property. */
inline bool IsSubProperty() const
{
wxPGProperty* parent = (wxPGProperty*)m_parent;
if ( parent && parent->GetParentingType() < 0 && parent->m_y > -2 )
return true;
return false;
}
/** Returns last visible sub-property, recursively.
*/
const wxPGProperty* GetLastVisibleSubItem() const;
inline int GetMaxLength() const
{
return (int) m_maxLen;
}
#ifdef SWIG
%pythoncode {
def GetValue(self):
return self.GetGrid().GetPropertyValue(self)
}
#else
/** Returns value as wxVariant.
*/
wxVariant GetValueAsVariant() const;
#endif
/** Returns true if containing grid uses wxPG_EX_AUTO_UNSPECIFIED_VALUES.
*/
bool UsesAutoUnspecified() const;
inline wxBitmap* GetValueImage() const
{
if ( m_dataExt )
return m_dataExt->m_valueBitmap;
return (wxBitmap*) NULL;
}
/** Returns number of children (always 0 for normal properties). */
size_t GetChildCount() const;
inline unsigned int GetArrIndex() const { return m_arrIndex; }
inline unsigned int GetDepth() const { return (unsigned int)m_depth; }
/** Returns position in parent's array. */
inline unsigned int GetIndexInParent() const
{
return (unsigned int)m_arrIndex;
}
/** Hides or reveals the property.
\param hide
true for hide, false for reveal.
*/
inline bool Hide( bool hide );
inline bool IsEnabled() const
{
return ( m_flags & wxPG_PROP_DISABLED ) ? false : true;
}
/** If property's editor is created this forces its recreation. Useful
in SetAttribute etc. Returns true if actually did anything.
*/
bool RecreateEditor();
inline void SetAttrib( int id, wxVariant value )
{
SetAttribute(id,value);
}
/** Sets attributes from a comma-delimited string.
*/
void SetAttributes( const wxString& attributes );
/** Sets editor for a property. */
#ifndef SWIG
inline void SetEditor( const wxPGEditor* editor )
{
EnsureDataExt();
m_dataExt->m_customEditor = editor;
}
#endif
/** Sets editor for a property. */
inline void SetEditor( const wxString& editorName );
/** Changes value of a property with choices, but only
works if the value type is long or string. */
void SetChoiceSelection( int newValue, const wxPGChoiceInfo& choiceInfo );
/** Set wxBitmap in front of the value. This bitmap will be ignored if
property class has implemented OnCustomPaint.
*/
void SetValueImage( wxBitmap& bmp );
/** If property has choices and they are not yet exclusive, new such copy
of them will be created.
*/
void SetChoicesExclusive();
void SetFlag( FlagType flag ) { m_flags |= flag; }
inline void SetHelpString( const wxString& helpString )
{
EnsureDataExt();
m_dataExt->m_helpString = helpString;
}
inline void SetLabel( const wxString& label ) { m_label = label; }
inline void SetValueToUnspecified()
{
m_flags |= wxPG_PROP_UNSPECIFIED;
}
#if wxUSE_VALIDATORS
/** Sets wxValidator for a property*/
inline void SetValidator( const wxValidator& validator )
{
EnsureDataExt();
m_dataExt->m_validator = wxDynamicCast(validator.Clone(),wxValidator);
}
/** Gets assignable version of property's validator. */
inline wxValidator* GetValidator() const
{
if ( m_dataExt )
return m_dataExt->m_validator;
return DoGetValidator();
}
#endif // #if wxUSE_VALIDATORS
inline bool StdValidationProcedure( wxPGVariant value )
{
DoSetValue( value );
return true;
}
/** Updates property value in case there were last minute
changes. If value was unspecified, it will be set to default.
Use only for properties that have TextCtrl-based editor.
\remarks
If you have code similar to
\code
// Update the value in case of last minute changes
if ( primary && propgrid->IsEditorsValueModified() )
GetEditorClass()->CopyValueFromControl( this, primary );
\endcode
in wxPGProperty::OnEvent wxEVT_COMMAND_BUTTON_CLICKED handler,
then replace it with call to this method.
\retval
True if value changed.
*/
bool PrepareValueForDialogEditing( wxPropertyGrid* propgrid );
#if wxPG_USE_CLIENT_DATA
inline ClientDataType GetClientData() const { return m_clientData; }
/** Sets client data (void*) of a property.
\remarks
This untyped client data has to be deleted manually.
*/
inline void SetClientData( ClientDataType clientData )
{
#ifdef __WXPYTHON__
if ( m_clientData )
Py_DECREF( m_clientData );
Py_INCREF( clientData );
#endif
m_clientData = clientData;
}
#endif
/** Sets new set of choices for property.
*/
bool SetChoices( wxPGChoices& choices );
/** Sets new set of choices for property.
*/
inline bool SetChoices( const wxArrayString& labels,
const wxArrayInt& values = wxPG_EMPTY_ARRAYINT );
/** Set max length of text editor.
*/
inline bool SetMaxLength( int maxLen );
inline wxString GetHelpString() const
{
if (m_dataExt)
return m_dataExt->m_helpString;
return wxEmptyString;
}
void ClearFlag( FlagType flag ) { m_flags &= ~(flag); }
// Use, for example, to detect if item is inside collapsed section.
bool IsSomeParent( wxPGProperty* candidate_parent ) const;
// Shows error as a tooltip or something similar (depends on platform).
void ShowError( const wxString& msg );
#if defined(__WXPYTHON__) && !defined(SWIG)
// This is the python object that contains and owns the C++ representation.
PyObject* m_scriptObject;
#endif
#ifndef SWIG
protected:
// Called in constructors.
void Init();
wxString m_label;
wxString m_name;
wxPGPropertyWithChildren* m_parent;
#if wxPG_USE_CLIENT_DATA
ClientDataType m_clientData;
#endif
wxPGPropertyDataExt* m_dataExt; // Optional data extension.
unsigned int m_arrIndex; // Index in parent's property array.
int m_y; // This could be short int.
short m_maxLen; // Maximum length (mainly for string properties).
// Could be in some sort of wxBaseStringProperty, but currently,
// for maximum flexibility and compatibility, we'll stick it here.
// Anyway, we had 3 excess bytes to use so short int will fit in
// just fine.
FlagType m_flags;
// 1 = category
// 0 = no children
// -1 = has fixed-set of sub-properties
// -2 = this is wxCustomProperty (sub-properties can be added)
signed char m_parentingType;
unsigned char m_depth; // Root has 0, categories etc. at that level 1, etc.
// m_depthBgCol indicates width of background colour between margin and item
// (essentially this is category's depth, if none then equals m_depth).
unsigned char m_depthBgCol;
unsigned char m_bgColIndex; // Background brush index.
unsigned char m_fgColIndex; // Foreground colour index.
#endif // #ifndef SWIG
};
extern WXDLLIMPEXP_PG wxPGPropertyClassInfo wxBasePropertyClassInfo;
//
// wxPGId comparison operators.
// TODO: Are these really used?
//
#if !defined(__WXPYTHON__)
inline bool operator==(const wxPGId& id, const wxString& b)
{
wxASSERT(wxPGIdIsOk(id));
const wxString& a = wxPGIdToPtr(id)->GetName();
return (a.Len() == b.Len()) && (a.Cmp(b) == 0);
}
inline bool operator==(const wxPGId& id, const wxChar* b)
{
wxASSERT(wxPGIdIsOk(id));
return wxPGIdToPtr(id)->GetName().Cmp(b) == 0;
}
#endif // !defined(__WXPYTHON__)
// For dual-pointer-usage reasons, we need to use this trickery
// instead of wxObjArray. wxPGValueType hash map is declared
// in propdev.h.
typedef wxArrayPtrVoid wxPGArrayProperty;
// Always use wxString based hashmap with unicode, stl, swig and GCC 4.0+
#if !defined(SWIG)
WX_DECLARE_STRING_HASH_MAP_WITH_DECL(void*,
wxPGHashMapS2P,
class WXDLLIMPEXP_PG);
#else
class WXDLLIMPEXP_PG wxPGHashMapS2P;
#endif
#define wxPGPropNameStr const wxString&
#define wxPGNameConv(STR) STR
// -----------------------------------------------------------------------
#ifndef SWIG
WX_DECLARE_VOIDPTR_HASH_MAP_WITH_DECL(void*,
wxPGHashMapP2P,
class WXDLLIMPEXP_PG);
#else
class WXDLLIMPEXP_PG wxPGHashMapP2P;
#endif // #ifndef SWIG
// -----------------------------------------------------------------------
/** \class wxPGPropertyWithChildren
\ingroup classes
\brief wxPGPropertyWithChildren, alias wxParentPropertyClass, is a base
class for new properties that have sub-properties. For example,
wxFontProperty and wxFlagsProperty descend from this class.
*/
class WXDLLIMPEXP_PG wxPGPropertyWithChildren : public wxPGProperty
{
#ifndef SWIG
friend class wxPGProperty;
friend class wxPropertyGridState;
friend class wxPropertyGrid;
#endif
//_WX_PG_DECLARE_PROPERTY_CLASS(wxPGPropertyWithChildren)
public:
/** Special constructor only used in special cases. */
wxPGPropertyWithChildren();
/** When new class is derived, call this constructor.
\param label
Label for the property.
*/
wxPGPropertyWithChildren( const wxString& label, const wxString& name );
/** Destructor. */
virtual ~wxPGPropertyWithChildren();
//virtual int GetParentingType() const;
/** Advanced variant of GetValueAsString() that forms a string that
contains sequence of text representations of sub-properties.
*/
// Advanced version that gives property list and index to this item
virtual wxString GetValueAsString( int argFlags = 0 ) const;
/** This overridden version converts comma or semicolon separated
tokens into child values.
*/
virtual bool SetValueFromString( const wxString& text, int flags );
/** Refresh values of child properties.
*/
virtual void RefreshChildren();
/** Called after child property p has been altered.
The value of this parent property should now be updated accordingly.
*/
virtual void ChildChanged( wxPGProperty* p );
/** This is used by properties that have fixed sub-properties. */
void AddChild( wxPGProperty* prop );
/** This is used by Insert etc. */
void AddChild2( wxPGProperty* prop, int index = -1, bool correct_mode = true );
/** Returns number of sub-properties. */
inline size_t GetCount() const { return m_children.GetCount(); }
/** Returns sub-property at index i. */
inline wxPGProperty* Item( size_t i ) const { return (wxPGProperty*)m_children.Item(i); }
/** Returns last sub-property.
*/
wxPGProperty* Last() const { return (wxPGProperty*)m_children.Last(); }
/** Returns index of given sub-property. */
inline int Index( const wxPGProperty* p ) const { return m_children.Index((void*)p); }
/** Deletes all sub-properties. */
void Empty();
inline bool IsExpanded() const
{
return ( m_expanded > 0 ) ? true : false;
}
// Puts correct indexes to children
void FixIndexesOfChildren( size_t starthere = 0 );
#ifndef SWIG
// Returns wxPropertyGridState in which this property resides.
wxPropertyGridState* GetParentState() const { return m_parentState; }
#endif
wxPGProperty* GetItemAtY( unsigned int y, unsigned int lh );
/** Returns (direct) child property with given name (or NULL if not found).
*/
wxPGProperty* GetPropertyByName( const wxString& name ) const;
#ifndef SWIG
// Call for after sub-properties added with AddChild
void PrepareSubProperties();
inline void SetParentState( wxPropertyGridState* pstate ) { m_parentState = pstate; }
// Call after fixed sub-properties added/removed after creation.
// if oldSelInd >= 0 and < new max items, then selection is
// moved to it.
void SubPropsChanged( int oldSelInd = -1 );
protected:
wxPropertyGridState* m_parentState;
wxPGArrayProperty m_children;
unsigned char m_expanded;
#endif // SWIG
};
extern WXDLLIMPEXP_PG wxPGPropertyClassInfo wxBaseParentPropertyClassInfo;
// -----------------------------------------------------------------------
/** \class wxPGRootPropertyClass
\ingroup classes
\brief Root parent property.
*/
class WXDLLIMPEXP_PG wxPGRootPropertyClass : public wxPGPropertyWithChildren
{
public:
WX_PG_DECLARE_PROPERTY_CLASS_NOPARENS
public:
/** Constructor. */
wxPGRootPropertyClass();
virtual ~wxPGRootPropertyClass();
protected:
};
// -----------------------------------------------------------------------
/** \class wxPropertyCategoryClass
\ingroup classes
\brief Category (caption) property.
*/
class WXDLLIMPEXP_PG wxPropertyCategoryClass : public wxPGPropertyWithChildren
{
WX_PG_DECLARE_PROPERTY_CLASS_NOPARENS
public:
/** Special constructor only used in special cases. */
wxPropertyCategoryClass();
/** Construct.
\param label
Label for the category.
\remarks
All non-category properties appended will have most recently
added category.
*/
wxPropertyCategoryClass( const wxString& label, const wxString& name = wxPG_LABEL );
~wxPropertyCategoryClass();
/** Must be overridden with function that doesn't do anything. */
virtual wxString GetValueAsString( int argFlags ) const;
inline int GetTextExtent() const { return m_textExtent; }
void CalculateTextExtent( wxWindow* wnd, wxFont& font );
void SetTextColIndex( unsigned int colInd ) { m_capFgColIndex = (wxByte) colInd; }
unsigned int GetTextColIndex() const { return (unsigned int) m_capFgColIndex; }
protected:
int m_textExtent; // pre-calculated length of text
wxByte m_capFgColIndex; // caption text colour index
};
// -----------------------------------------------------------------------
#ifndef SWIG
typedef void* wxPGChoicesId;
class WXDLLIMPEXP_PG wxPGChoicesData
{
public:
// Constructor sets m_refCount to 1.
wxPGChoicesData();
~wxPGChoicesData();
wxArrayString m_arrLabels;
wxArrayInt m_arrValues;
// So that multiple properties can use the same set
int m_refCount;
};
#define wxPGChoicesEmptyData ((wxPGChoicesData*)NULL)
#endif // SWIG
/** \class wxPGChoices
\ingroup classes
\brief Helper class for managing constant (key=value) sequences.
*/
class WXDLLIMPEXP_PG wxPGChoices
{
public:
/** Basic constructor. */
wxPGChoices()
{
Init();
}
/** Copy constructor. */
wxPGChoices( wxPGChoices& a )
{
wxASSERT(a.m_data);
m_data = a.m_data;
a.m_data->m_refCount++;
}
/** Constructor. */
wxPGChoices( const wxChar** labels, const long* values = NULL )
{
Init();
Set(labels,values);
}
/** Constructor. */
wxPGChoices( const wxArrayString& labels, const wxArrayInt& values = wxPG_EMPTY_ARRAYINT )
{
Init();
Set(labels,values);
}
/** Simple interface constructor. */
inline wxPGChoices( wxPGChoicesData* data )
{
wxASSERT(data);
m_data = data;
data->m_refCount++;
}
/** Destructor. */
~wxPGChoices()
{
Free ();
}
void AssignData( wxPGChoicesData* data );
inline void Assign( const wxPGChoices& a )
{
AssignData(a.m_data);
}
/** Adds to current. If did not have own copies, creates them now. If was empty,
identical to set except that creates copies.
*/
void Add( const wxChar** labels, const long* values = NULL );
/** Version that works with wxArrayString. */
void Add( const wxArrayString& arr, const long* values = NULL );
/** Version that works with wxArrayString and wxArrayInt. */
void Add( const wxArrayString& arr, const wxArrayInt& arrint );
/** Adds single item. */
void Add( const wxChar* label, int value = wxPG_INVALID_VALUE );
/** Adds single item. */
void AddAsSorted( const wxString& label, int value = wxPG_INVALID_VALUE );
inline void EnsureData()
{
if ( m_data == wxPGChoicesEmptyData )
m_data = new wxPGChoicesData();
}
/** Returns reference to wxArrayString of labels for you to modify.
*/
inline wxArrayString& GetLabels()
{
wxASSERT( m_data->m_refCount != 0xFFFFFFF );
return m_data->m_arrLabels;
}
/** Returns reference to wxArrayInt of values for you to modify.
*/
inline wxArrayInt& GetValues()
{
wxASSERT( m_data->m_refCount != 0xFFFFFFF );
return m_data->m_arrValues;
}
/** Returns false if this is a constant empty set of choices,
which should not be modified.
*/
bool IsOk () const
{
return ( m_data != wxPGChoicesEmptyData );
}
/** Gets a unsigned number identifying this list. */
wxPGChoicesId GetId() const { return (wxPGChoicesId) m_data; };
/** Removes count items starting at position nIndex. */
inline void RemoveAt(size_t nIndex, size_t count = 1)
{
wxASSERT( m_data->m_refCount != 0xFFFFFFF );
wxPGChoicesData* data = m_data;
data->m_arrLabels.RemoveAt(nIndex,count);
if ( data->m_arrValues.GetCount() )
data->m_arrValues.RemoveAt(nIndex,count);
}
#ifndef SWIG
/** Does not create copies for itself. */
void Set( const wxChar** labels, const long* values = NULL )
{
Free();
Add(labels,values);
}
/** Version that works with wxArrayString.
TODO: Deprecate this.
*/
void Set( wxArrayString& arr, const long* values = (const long*) NULL )
{
Free();
Add(arr,values);
}
#endif // SWIG
/** Version that works with wxArrayString and wxArrayInt. */
void Set( const wxArrayString& labels, const wxArrayInt& values = wxPG_EMPTY_ARRAYINT )
{
Free();
if ( &values )
Add(labels,values);
else
Add(labels);
}
// Creates exclusive copy of current choices
inline void SetExclusive()
{
if ( m_data->m_refCount != 1 )
{
wxPGChoicesData* data = new wxPGChoicesData;
data->m_arrLabels = m_data->m_arrLabels;
data->m_arrValues = m_data->m_arrValues;
Free();
m_data = data;
}
}
inline const wxString& GetLabel( size_t ind ) const
{
return m_data->m_arrLabels[ind];
}
inline const wxArrayString& GetLabels() const { return m_data->m_arrLabels; }
inline size_t GetCount () const
{
wxASSERT_MSG( m_data,
wxT("When checking if wxPGChoices is valid, use IsOk() instead of GetCount()") );
return m_data->m_arrLabels.GetCount();
}
inline int GetValue( size_t ind ) const { return m_data->m_arrValues[ind]; }
inline const wxArrayInt& GetValues() const { return m_data->m_arrValues; }
inline int Index( const wxString& str ) const { return m_data->m_arrLabels.Index(str); }
/** Inserts single item. */
#if wxCHECK_VERSION(2,9,0)
void Insert( const wxString& label, int index, int value = wxPG_INVALID_VALUE );
#else
void Insert( const wxChar* label, int index, int value = wxPG_INVALID_VALUE );
#endif
// Returns data, increases refcount.
inline wxPGChoicesData* GetData()
{
wxASSERT( m_data->m_refCount != 0xFFFFFFF );
m_data->m_refCount++;
return m_data;
}
// Returns plain data ptr - no refcounting stuff is done.
inline wxPGChoicesData* GetDataPtr() const { return m_data; }
// Changes ownership of data to you.
inline wxPGChoicesData* ExtractData()
{
wxPGChoicesData* data = m_data;
m_data = wxPGChoicesEmptyData;
return data;
}
inline void AddString( const wxString& str ) { m_data->m_arrLabels.Add(str); }
inline void AddInt( int val ) { m_data->m_arrValues.Add(val); }
inline void SetLabels( wxArrayString& arr ) { m_data->m_arrLabels = arr; }
inline void SetValues( wxArrayInt& arr ) { m_data->m_arrValues = arr; }
#ifndef SWIG
inline void SetLabels( const wxArrayString& arr ) { m_data->m_arrLabels = arr; }
inline void SetValues( const wxArrayInt& arr ) { m_data->m_arrValues = arr; }
protected:
wxPGChoicesData* m_data;
void Init();
void Free();
#endif
};
// -----------------------------------------------------------------------
// Property declaration.
// Doxygen will only generate warnings here
#ifndef DOXYGEN
#define wxPG_CONSTFUNC(PROP) PROP
#define wxPG_PROPCLASS(PROP) PROP##Class
// Macro based constructor.
#define wxPG_NEWPROPERTY(PROP,LABEL,NAME,VALUE) wx##PROP##Property(LABEL,NAME,VALUE)
#define wxPG_DECLARE_PROPERTY_CLASSINFO(NAME) \
extern wxPGPropertyClassInfo NAME##ClassInfo;
#define wxPG_DECLARE_PROPERTY_CLASSINFO_WITH_DECL(NAME,DECL) \
extern DECL wxPGPropertyClassInfo NAME##ClassInfo;
#define WX_PG_DECLARE_PROPERTY_WITH_DECL(NAME,VALARG,DEFVAL,DECL) \
extern DECL wxPGProperty* wxPG_CONSTFUNC(NAME)( const wxString& label, const wxString& name = wxPG_LABEL, VALARG value = DEFVAL ); \
extern DECL wxPGPropertyClassInfo NAME##ClassInfo;
#define WX_PG_DECLARE_PROPERTY(NAME,VALARG,DEFVAL) \
extern wxPGProperty* wxPG_CONSTFUNC(NAME)( const wxString& label, const wxString& name = wxPG_LABEL, VALARG value = DEFVAL ); \
wxPG_DECLARE_PROPERTY_CLASSINFO(NAME)
//
// Specific macro-based declarations.
//
#define WX_PG_DECLARE_STRING_PROPERTY_WITH_DECL(NAME,DECL) \
extern DECL wxPGProperty* wxPG_CONSTFUNC(NAME)( const wxString& label, const wxString& name= wxPG_LABEL, const wxString& value = wxEmptyString ); \
extern DECL wxPGPropertyClassInfo NAME##ClassInfo;
#define WX_PG_DECLARE_STRING_PROPERTY(NAME) \
extern wxPGProperty* wxPG_CONSTFUNC(NAME)( const wxString& label, const wxString& name= wxPG_LABEL, const wxString& value = wxEmptyString ); \
wxPG_DECLARE_PROPERTY_CLASSINFO(NAME)
#define WX_PG_DECLARE_CUSTOM_FLAGS_PROPERTY_WITH_DECL(NAME,DECL) \
WX_PG_DECLARE_PROPERTY_WITH_DECL(NAME,long,-1,DECL)
#define WX_PG_DECLARE_CUSTOM_FLAGS_PROPERTY(NAME) \
WX_PG_DECLARE_PROPERTY(NAME,long,-1)
#define WX_PG_DECLARE_CUSTOM_ENUM_PROPERTY_WITH_DECL(NAME,DECL) \
WX_PG_DECLARE_PROPERTY_WITH_DECL(NAME,int,-1,DECL)
#define WX_PG_DECLARE_CUSTOM_ENUM_PROPERTY(NAME) \
WX_PG_DECLARE_PROPERTY(NAME,int,-1)
#define WX_PG_DECLARE_ARRAYSTRING_PROPERTY_WITH_DECL(NAME,DECL) \
extern DECL wxPGProperty* wxPG_CONSTFUNC(NAME)( const wxString& label, const wxString& name = wxPG_LABEL, const wxArrayString& value = wxArrayString() ); \
extern DECL wxPGPropertyClassInfo NAME##ClassInfo;
#define WX_PG_DECLARE_ARRAYSTRING_PROPERTY(NAME) \
extern wxPGProperty* wxPG_CONSTFUNC(NAME)( const wxString& label, const wxString& name = wxPG_LABEL, const wxArrayString& value = wxArrayString() ); \
wxPG_DECLARE_PROPERTY_CLASSINFO(NAME)
// Declare basic property classes.
WX_PG_DECLARE_PROPERTY_WITH_DECL(wxStringProperty,const wxString&,wxEmptyString,WXDLLIMPEXP_PG)
WX_PG_DECLARE_PROPERTY_WITH_DECL(wxIntProperty,long,0,WXDLLIMPEXP_PG)
WX_PG_DECLARE_PROPERTY_WITH_DECL(wxUIntProperty,unsigned long,0,WXDLLIMPEXP_PG)
WX_PG_DECLARE_PROPERTY_WITH_DECL(wxFloatProperty,double,0.0,WXDLLIMPEXP_PG)
WX_PG_DECLARE_PROPERTY_WITH_DECL(wxBoolProperty,bool,false,WXDLLIMPEXP_PG)
WX_PG_DECLARE_PROPERTY_WITH_DECL(wxLongStringProperty,const wxString&,wxEmptyString,WXDLLIMPEXP_PG)
WX_PG_DECLARE_PROPERTY_WITH_DECL(wxFileProperty,const wxString&,wxEmptyString,WXDLLIMPEXP_PG)
WX_PG_DECLARE_PROPERTY_WITH_DECL(wxArrayStringProperty,const wxArrayString&,wxArrayString(),WXDLLIMPEXP_PG)
WX_PG_DECLARE_STRING_PROPERTY_WITH_DECL(wxDirProperty,WXDLLIMPEXP_PG)
// Enum and Flags Properties require special attention.
#ifndef SWIG
extern WXDLLIMPEXP_PG wxPGProperty* wxEnumProperty( const wxString& label, const wxString& name,
const wxChar** labels = (const wxChar**) NULL,
const long* values = NULL, int value = 0 );
extern WXDLLIMPEXP_PG wxPGProperty* wxEnumProperty( const wxString& label, const wxString& name,
const wxArrayString& labels, int value = 0 );
extern WXDLLIMPEXP_PG wxPGProperty* wxEnumProperty( const wxString& label, const wxString& name,
wxPGChoices& constants, int value = 0 );
extern WXDLLIMPEXP_PG wxPGProperty* wxEnumProperty( const wxString& label, const wxString& name,
const wxArrayString& choices, const wxArrayInt& values, int value = 0 );
#else
// Separate for SWIG inorder to have more default arguments
extern WXDLLIMPEXP_PG wxPGProperty* wxEnumProperty( const wxString& label, const wxString& name = wxPG_LABEL,
const wxArrayString& choices = wxArrayString(), const wxArrayInt& values = wxArrayInt(), int value = 0 );
#endif // SWIG
extern WXDLLIMPEXP_PG wxPGPropertyClassInfo wxEnumPropertyClassInfo;
#ifndef SWIG
extern WXDLLIMPEXP_PG wxPGProperty* wxEditEnumProperty( const wxString& label, const wxString& name,
const wxChar** labels = (const wxChar**) NULL,
const long* values = NULL, const wxString& value = wxEmptyString );
extern WXDLLIMPEXP_PG wxPGProperty* wxEditEnumProperty( const wxString& label, const wxString& name,
const wxArrayString& labels, const wxString& value = wxEmptyString );
extern WXDLLIMPEXP_PG wxPGProperty* wxEditEnumProperty( const wxString& label, const wxString& name,
wxPGChoices& constants, const wxString& value = wxEmptyString );
extern WXDLLIMPEXP_PG wxPGProperty* wxEditEnumProperty( const wxString& label, const wxString& name,
const wxArrayString& choices, const wxArrayInt& values, const wxString& value = wxEmptyString );
#else
// Separate for SWIG inorder to have more default arguments
extern WXDLLIMPEXP_PG wxPGProperty* wxEditEnumProperty( const wxString& label, const wxString& name = wxPG_LABEL,
const wxArrayString& choices = wxArrayString(), const wxArrayInt& values = wxArrayInt(), const wxString& value = wxEmptyString );
#endif // SWIG
extern WXDLLIMPEXP_PG wxPGPropertyClassInfo wxEditEnumPropertyClassInfo;
#ifndef SWIG
extern WXDLLIMPEXP_PG wxPGProperty* wxFlagsProperty( const wxString& label, const wxString& name, const wxChar** labels = (const wxChar**) NULL,
const long* values = NULL, int value = 0 );
extern WXDLLIMPEXP_PG wxPGProperty* wxFlagsProperty( const wxString& label, const wxString& name,
const wxArrayString& labels, int value = 0 );
extern WXDLLIMPEXP_PG wxPGProperty* wxFlagsProperty( const wxString& label, const wxString& name,
wxPGChoices& constants, int value = 0 );
extern WXDLLIMPEXP_PG wxPGProperty* wxFlagsProperty( const wxString& label, const wxString& name,
const wxArrayString& flag_labels, const wxArrayInt& values, int value = 0 );
#else
// Separate for SWIG inorder to have more default arguments
extern WXDLLIMPEXP_PG wxPGProperty* wxFlagsProperty( const wxString& label, const wxString& name = wxPG_LABEL,
const wxArrayString& flag_labels = wxArrayString(), const wxArrayInt& values = wxArrayInt(), int value = 0 );
#endif // SWIG
extern WXDLLIMPEXP_PG wxPGPropertyClassInfo wxFlagsPropertyClassInfo;
// wxCustomProperty doesn't have value argument.
extern WXDLLIMPEXP_PG wxPGProperty* wxCustomProperty( const wxString& label, const wxString& name = wxPG_LABEL );
extern WXDLLIMPEXP_PG wxPGPropertyClassInfo wxCustomPropertyClassInfo;
// wxParentProperty doesn't have value argument.
extern WXDLLIMPEXP_PG wxPGProperty* wxParentProperty( const wxString& label, const wxString& name );
extern WXDLLIMPEXP_PG wxPGPropertyClassInfo wxParentPropertyClassInfo;
// wxPropertyCategory doesn't have value argument.
extern WXDLLIMPEXP_PG wxPGProperty* wxPropertyCategory ( const wxString& label, const wxString& name = wxPG_LABEL );
extern WXDLLIMPEXP_PG wxPGPropertyClassInfo wxPropertyCategoryClassInfo;
#endif // DOXYGEN
#ifndef wxDynamicCastVariantData
#define wxDynamicCastVariantData wxDynamicCast
#endif
// FIXME: Should this be out-of-inline?
inline wxObject* wxPG_VariantToWxObject( wxVariant& variant, wxClassInfo* classInfo )
{
if ( !variant.IsValueKindOf(classInfo) )
return (wxObject*) NULL;
wxVariantData* vdata = variant.GetData();
wxPGVariantDataWxObj* vdataWxObj = wxDynamicCastVariantData(vdata, wxPGVariantDataWxObj);
if ( vdataWxObj )
return (wxObject*) vdataWxObj->GetValuePtr();
return variant.GetWxObjectPtr();
}
//
// Redefine wxGetVariantCast to also take propertygrid variantdata
// classes into account.
// TODO: Remove after persistent wxObject classes added (i.e.
// GetWxObjectPtr works for all).
//
#undef wxGetVariantCast
#define wxGetVariantCast(var,classname) (classname*)wxPG_VariantToWxObject(var,&classname::ms_classInfo)
// TODO: After a while, remove this.
#define WX_PG_VARIANT_TO_WXOBJECT(VARIANT,CLASSNAME) (CLASSNAME*)wxPG_VariantToWxObject(VARIANT,&CLASSNAME::ms_classInfo)
//#define WX_PG_VARIANT_TO_WXOBJECT(VARIANT,CLASSNAME) wxGetVariantCast(VARIANT,CLASSNAME)
// -----------------------------------------------------------------------
#ifndef SWIG
// We won't need this class from wxPython
/** \class wxPropertyGridState
\ingroup classes
\brief
Contains information of a single wxPropertyGrid page.
*/
// BM_STATE
class WXDLLIMPEXP_PG wxPropertyGridState
{
friend class wxPGProperty;
friend class wxPropertyGrid;
friend class wxPropertyGridManager;
public:
/** Constructor. */
wxPropertyGridState();
/** Destructor. */
virtual ~wxPropertyGridState();
/** Base append. */
wxPGId Append( wxPGProperty* property );
wxPGId AppendIn( wxPGPropertyWithChildren* pwc, const wxString& label, const wxString& propname, wxVariant& value );
/** Returns property by its name. */
wxPGId BaseGetPropertyByName( wxPGPropNameStr name ) const;
/** Called in, for example, wxPropertyGrid::Clear. */
void Clear();
void ClearModifiedStatus( wxPGProperty* p );
static void ClearPropertyAndChildrenFlags( wxPGProperty* p, long flags );
static void SetPropertyAndChildrenFlags( wxPGProperty* p, long flags );
bool ClearPropertyValue( wxPGProperty* p );
inline bool ClearSelection()
{
return DoSelectProperty(wxPGIdGen((wxPGProperty*)NULL));
}
bool Collapse( wxPGProperty* p );
/** Override this member function to add custom behaviour on property deletion.
*/
virtual void DoDelete( wxPGProperty* item );
/** Override this member function to add custom behaviour on property insertion.
*/
virtual wxPGId DoInsert( wxPGPropertyWithChildren* parent, int index, wxPGProperty* property );
bool EnableCategories( bool enable );
/** Enables or disables given property and its subproperties. */
bool EnableProperty( wxPGProperty* p, bool enable );
bool Expand( wxPGProperty* p );
bool ExpandAll( unsigned char do_expand );
/** Returns id of first item, whether it is a category or property. */
inline wxPGId GetFirst() const
{
wxPGProperty* p = (wxPGProperty*) NULL;
if ( m_properties->GetCount() )
p = m_properties->Item(0);
return wxPGIdGen(p);
}
wxPGId GetFirstCategory() const;
wxPGId GetFirstProperty() const;
wxPropertyGrid* GetGrid() const { return m_pPropGrid; }
wxPGId GetNextCategory( wxPGId id ) const;
wxPGId GetNextProperty( wxPGId id ) const;
static wxPGId GetNextSibling( wxPGId id );
static wxPGId GetPrevSibling( wxPGId id );
wxPGId GetPrevProperty( wxPGId id ) const;
wxPGId GetPropertyByLabel( const wxString& name, wxPGPropertyWithChildren* parent = (wxPGPropertyWithChildren*) NULL ) const;
wxVariant GetPropertyValues( const wxString& listname, wxPGId baseparent, long flags ) const;
inline wxPGProperty* GetSelection() const { return m_selected; }
/** Used by SetSplitterLeft. */
int GetLeftSplitterPos( wxClientDC& dc, wxPGPropertyWithChildren* pwc, bool subProps );
inline bool IsDisplayed() const;
inline bool IsInNonCatMode() const { return (bool)(m_properties == m_abcArray); }
/** Only inits arrays, doesn't migrate things or such. */
void InitNonCatMode ();
void LimitPropertyEditing ( wxPGProperty* p, bool limit = true );
bool DoSelectProperty( wxPGProperty* p, unsigned int flags = 0 );
void SetPropertyLabel( wxPGProperty* p, const wxString& newlabel );
bool SetPropertyPriority( wxPGProperty* p, int priority );
void SetPropVal( wxPGProperty* p, const wxPGVariant& value );
bool SetPropertyValue( wxPGProperty* p, const wxPGValueType* typeclass, const wxPGVariant& value );
bool SetPropertyValue( wxPGProperty* p, const wxChar* typestring, const wxPGVariant& value );
bool SetPropertyValueString( wxPGProperty* p, const wxString& value );
bool SetPropertyValue( wxPGProperty* p, wxVariant& value );
bool SetPropertyValueWxObjectPtr( wxPGProperty* p, wxObject* value );
/** Sets value (long integer) of a property. */
inline void SetPropertyValueLong( wxPGProperty* p, long value )
{
SetPropertyValue( p, wxPG_VALUETYPE(long), wxPGVariantFromLong(value) );
}
/** Sets value (integer) of a property. */
inline void SetPropertyValue( wxPGProperty* p, int value )
{
SetPropertyValue( p, wxPG_VALUETYPE(long), wxPGVariantFromLong((long)value) );
}
/** Sets value (floating point) of a property. */
inline void SetPropertyValueDouble( wxPGProperty* p, double value )
{
SetPropertyValue( p, wxPG_VALUETYPE(double), wxPGVariantFromDouble(value) );
}
/** Sets value (bool) of a property. */
inline void SetPropertyValueBool( wxPGProperty* p, bool value )
{
SetPropertyValue( p, wxPG_VALUETYPE(bool), wxPGVariantFromLong(value?(long)1:(long)0) );
}
/** Sets value (wxArrayString) of a property. */
inline void SetPropertyValueArrstr2( wxPGProperty* p, const wxArrayString& value )
{
SetPropertyValue( p, wxPG_VALUETYPE(wxArrayString), wxPGVariantFromArrayString(value) );
}
/** Sets value (void*) of a property. */
inline void SetPropertyValue( wxPGProperty* p, void* value )
{
SetPropertyValue( p, wxPG_VALUETYPE(void), value );
}
/** Sets value (wxPoint&) of a property. */
inline void SetPropertyValuePoint( wxPGProperty* p, const wxPoint& value )
{
wxASSERT(p);
SetPropertyValue( p, wxT("wxPoint"), wxPGVariantCreator(value) );
}
/** Sets value (wxSize&) of a property. */
inline void SetPropertyValueSize( wxPGProperty* p, const wxSize& value )
{
wxASSERT(p);
SetPropertyValue( p, wxT("wxSize"), wxPGVariantCreator(value) );
}
/** Sets value (wxArrayInt&) of a property. */
inline void SetPropertyValueArrint2( wxPGProperty* p, const wxArrayInt& value )
{
wxASSERT(p);
SetPropertyValue( p, wxT("wxArrayInt"), wxPGVariantCreator(value));
}
#if wxUSE_DATETIME
/** Sets value (wxDateTime&) of a property. */
inline void SetPropertyValueDatetime( wxPGProperty* p, const wxDateTime& value )
{
wxASSERT(p);
SetPropertyValue( p, wxT("datetime"), wxPGVariantCreator(value) );
}
#endif
#ifdef __WXPYTHON__
inline void SetPropertyValuePyObject( wxPGProperty* p, PyObject* value )
{
SetPropertyValue( p, wxPG_VALUETYPE(PyObject), wxPGVariantCreator(value) );
}
#endif
/** Sets value (wxLongLong&) of a property. */
inline void SetPropertyValueLongLong( wxPGProperty* p, const wxLongLong& value )
{
wxASSERT(p);
SetPropertyValue( p, wxT("wxLongLong"), wxPGVariantCreator(value) );
}
/** Sets value (wxULongLong&) of a property. */
inline void SetPropertyValueULongLong( wxPGProperty* p, const wxULongLong& value )
{
wxASSERT(p);
SetPropertyValue( p, wxT("wxULongLong"), wxPGVariantCreator(value) );
}
void SetPropertyValues( const wxVariantList& list, wxPGId default_category );
void SetPropertyUnspecified( wxPGProperty* p );
#ifdef wxPG_COMPATIBILITY_1_0_0
#define SetPropertyValueUnspecified SetPropertyUnspecified
#endif
void Sort( wxPGProperty* p );
void Sort();
protected:
#ifndef DOXYGEN
int PrepareToAddItem ( wxPGProperty* property, wxPGPropertyWithChildren* scheduledParent );
/** If visible, then this is pointer to wxPropertyGrid.
This shall *never* be NULL to indicate that this state is not visible.
*/
wxPropertyGrid* m_pPropGrid;
/** Pointer to currently used array. */
wxPGPropertyWithChildren* m_properties;
/** Array for categoric mode. */
wxPGRootPropertyClass m_regularArray;
/** Array for root of non-categoric mode. */
wxPGRootPropertyClass* m_abcArray;
/** Dictionary for name-based access. */
wxPGHashMapS2P m_dictName;
/** Most recently added category. */
wxPropertyCategoryClass* m_currentCategory;
/** Pointer to selected property. */
wxPGProperty* m_selected;
/** 1 if m_lastCaption is also the bottommost caption. */
unsigned char m_lastCaptionBottomnest;
/** 1 items appended/inserted, so stuff needs to be done before drawing;
If m_bottomy == 0, then calcylatey's must be done.
Otherwise just sort.
*/
unsigned char m_itemsAdded;
/** 1 if any value is modified. */
unsigned char m_anyModified;
#endif // #ifndef DOXYGEN
};
#endif // #ifndef SWIG
inline bool wxPGProperty::SetChoices( const wxArrayString& labels,
const wxArrayInt& values )
{
wxPGChoices chs(labels,values);
return SetChoices(chs);
}
// -----------------------------------------------------------------------
/*
wxASSERT_MSG( wxPGIdIsOk(id), \
wxT("invalid property id") ); \
*/
// Helper macro that does necessary preparations when calling
// some wxPGProperty's member function.
#define wxPG_PROP_ID_CALL_PROLOG() \
wxPGProperty *p = wxPGIdToPtr(id); \
wxCHECK_RET( p, wxT("invalid property id") );
#define wxPG_PROP_NAME_CALL_PROLOG() \
wxPGProperty *p = wxPGIdToPtr(GetPropertyByNameI(name)); \
if ( !p ) return;
#define wxPG_PROP_ID_CALL_PROLOG_RETVAL(RVAL) \
wxPGProperty *p = wxPGIdToPtr(id); \
wxCHECK_MSG( p, RVAL, wxT("invalid property id") );
#define wxPG_PROP_NAME_CALL_PROLOG_RETVAL(RVAL) \
wxPGProperty *p = wxPGIdToPtr(GetPropertyByNameI(name)); \
if ( !p ) return RVAL;
// GetPropertyName version used internally. Use GetPropertyName for slight speed advantage,
// or GetPropertyNameA for nice assertion (essential for wxPython bindings).
#define GetPropertyByNameI GetPropertyByNameA
// FOR BACKWARDS COMPATIBILITY
#define GetPropertyByNameWithAssert GetPropertyByNameA
/** \class wxPropertyContainerMethods
\ingroup classes
\brief In order to have most same base methods, both wxPropertyGrid and
wxPropertyGridManager must derive from this.
*/
class WXDLLIMPEXP_PG wxPropertyContainerMethods
// BM_METHODS
{
public:
/** Destructor */
virtual ~wxPropertyContainerMethods() { };
/** Adds choice to a property that can accept one.
\remarks
- If you need to make sure that you modify only the set of choices of
a single property (and not also choices of other properties with initially
identical set), call wxPropertyGrid::SetPropertyChoicesPrivate.
- This usually only works for wxEnumProperty and derivatives (wxFlagsProperty
can get accept new items but its items may not get updated).
*/
void AddPropertyChoice( wxPGId id, const wxString& label, int value = wxPG_INVALID_VALUE );
inline void AddPropertyChoice( wxPGPropNameStr name, const wxString& label, int value = wxPG_INVALID_VALUE )
{
wxPG_PROP_NAME_CALL_PROLOG()
AddPropertyChoice(wxPGIdGen(p),label,value);
}
/** Inorder to add new items into a property with fixed children (for instance, wxFlagsProperty),
you need to call this method. After populating has been finished, you need to call EndAddChildren.
*/
void BeginAddChildren( wxPGId id );
inline void BeginAddChildren( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG()
BeginAddChildren(wxPGIdGen(p));
}
/** Called after population of property with fixed children has finished.
*/
void EndAddChildren( wxPGId id );
inline void EndAddChildren( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG()
EndAddChildren(wxPGIdGen(p));
}
/** Inserts choice to a property that can accept one.
See AddPropertyChoice for more details.
*/
void InsertPropertyChoice( wxPGId id, const wxString& label, int index, int value = wxPG_INVALID_VALUE );
inline void InsertPropertyChoice( wxPGPropNameStr name, const wxString& label, int index, int value = wxPG_INVALID_VALUE )
{
wxPG_PROP_NAME_CALL_PROLOG()
InsertPropertyChoice(wxPGIdGen(p),label,index,value);
}
/** Deletes choice from a property.
If selected item is deleted, then the value is set to unspecified.
See AddPropertyChoice for more details.
*/
void DeletePropertyChoice( wxPGId id, int index );
inline void DeletePropertyChoice( wxPGPropNameStr name, int index )
{
wxPG_PROP_NAME_CALL_PROLOG()
DeletePropertyChoice(wxPGIdGen(p),index);
}
/** Constructs a property. Class used is given as the first
string argument. It may be either normal property class
name, such as "wxIntProperty" or a short one such as
"Int".
*/
static wxPGProperty* CreatePropertyByClass(const wxString &classname,
const wxString &label,
const wxString &name);
/** Constructs a property. Value type name used is given as the first
string argument. It may be "string", "long", etc. Any value returned
by wxVariant::GetType fits there.
Otherwise, this is similar as CreatePropertyByClass.
\remarks
<b>Cannot</b> generate property category.
*/
static wxPGProperty* CreatePropertyByType(const wxString &valuetype,
const wxString &label,
const wxString &name);
/** Deletes a property by id. If category is deleted, all children are automatically deleted as well. */
void Delete( wxPGId id );
/** Deletes a property by name. */
inline void Delete( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG()
Delete( wxPGIdGen(p) );
}
/** Returns id of first child of given property.
\remarks
Does not return sub-properties!
*/
inline wxPGId GetFirstChild( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(wxNullProperty)
wxPGPropertyWithChildren* pwc = (wxPGPropertyWithChildren*) p;
if ( pwc->GetParentingType()==0 || pwc->GetParentingType()==-1 || !pwc->GetCount() )
return wxNullProperty;
return wxPGIdGen(pwc->Item(0));
}
inline wxPGId GetFirstChild( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxNullProperty)
return GetFirstChild( wxPGIdGen(p) );
}
/** Returns next item under the same parent. */
inline wxPGId GetNextSibling( wxPGId id )
{
return wxPropertyGridState::GetNextSibling(id);
}
inline wxPGId GetNextSibling( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxNullProperty)
return wxPropertyGridState::GetNextSibling(wxPGIdGen(p));
}
/** Returns comma-delimited string with property's attributes (both
pseudo-attributes such as "Disabled" and "Modified" and real
attributes such as "BoolUseCheckbox" - actual names may vary).
\param flagmask
Combination of property flags that should be included (in addition
to any other attributes). For example, to avoid adding Modified
attribute use ~(wxPG_PROP_MODIFIED).
\remarks
Atleast in 1.2.x and earlier this does not return complete list of attributes
(for example, no floating point precision) and some attributes have
generic names (such as "Special1" instead of "UseCheckbox" etc)
*/
inline wxString GetPropertyAttributes( wxPGId id, unsigned int flagmask = 0xFFFF ) const
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(m_emptyString)
return p->GetAttributes(flagmask);
}
/** Sets attributes from a string generated by GetPropertyAttributes.
\remarks
Performance may not be top-notch.
*/
inline static void SetPropertyAttributes( wxPGId id, const wxString& attributes )
{
wxPG_PROP_ID_CALL_PROLOG()
p->SetAttributes(attributes);
}
inline void SetPropertyAttributes( wxPGPropNameStr name, const wxString& attributes ) const
{
wxPG_PROP_NAME_CALL_PROLOG()
p->SetAttributes(attributes);
}
/** Returns id of property with given name (case-sensitive). If there is no
property with such name, returned property id is invalid ( i.e. it will return
false with IsOk method).
\remarks
- Sub-properties (i.e. properties which have parent that is not category or
root) can not be accessed globally by their name. Instead, use
"<property>.<subproperty>" in place of "<subproperty>".
*/
wxPGId GetPropertyByName( wxPGPropNameStr name ) const;
/** Returns id of a sub-property 'subname' of property 'name'. Same as
calling GetPropertyByNameI(wxT("name.subname")), albeit slightly faster.
*/
wxPGId GetPropertyByName( wxPGPropNameStr name, wxPGPropNameStr subname ) const;
/** Returns writable reference to property's list of choices (and relevant
values). If property does not have any choices, will return reference
to an invalid set of choices that will return false on IsOk call.
*/
wxPGChoices& GetPropertyChoices( wxPGId id );
wxPGChoices& GetPropertyChoices( wxPGPropNameStr name );
/** Gets name of property's constructor function. */
inline wxPG_CONST_WXCHAR_PTR GetPropertyClassName( wxPGId id ) const
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(wxPG_CONST_WXCHAR_DEFVAL)
return p->GetClassName();
}
/** Gets name of property's constructor function. */
inline wxPG_CONST_WXCHAR_PTR GetPropertyClassName( wxPGPropNameStr name ) const
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxPG_CONST_WXCHAR_DEFVAL)
return p->GetClassName();
}
#if wxPG_USE_CLIENT_DATA
/** Returns client data (void*) of a property. */
inline wxPGProperty::ClientDataType GetPropertyClientData( wxPGId id ) const
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(NULL)
return p->GetClientData();
}
/** Returns client data (void*) of a property. */
inline wxPGProperty::ClientDataType GetPropertyClientData( wxPGPropNameStr name ) const
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(NULL)
return p->GetClientData();
}
#endif
/** Returns property's editor. */
inline const wxPGEditor* GetPropertyEditor( wxPGId id ) const
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(NULL)
return p->GetEditorClass();
}
inline const wxPGEditor* GetPropertyEditor( wxPGPropNameStr name ) const
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(NULL)
return p->GetEditorClass();
}
/** Returns property's custom value image (NULL of none). */
inline wxBitmap* GetPropertyImage( wxPGId id ) const
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(NULL)
if ( p->GetDataExt() )
return p->GetDataExt()->m_valueBitmap;
return (wxBitmap*) NULL;
}
inline wxBitmap* GetPropertyImage( wxPGPropNameStr name ) const
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(NULL)
return GetPropertyImage(wxPGIdGen(p));
}
/** Returns property's position under its parent. */
inline unsigned int GetPropertyIndex( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(INT_MAX)
return p->GetIndexInParent();
}
/** Returns property's position under its parent. */
inline unsigned int GetPropertyIndex( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(INT_MAX)
return p->GetIndexInParent();
}
/** Returns label of a property. */
inline const wxString& GetPropertyLabel( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(m_emptyString)
return p->GetLabel();
}
inline const wxString& GetPropertyLabel( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(m_emptyString)
return p->GetLabel();
}
/** Returns name of a property. Note that obviously there is no name-version
of this member function. */
inline const wxString& GetPropertyName( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(m_emptyString)
return p->GetName();
}
/** Returns parent item of a property. */
inline wxPGId GetPropertyParent( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(wxNullProperty)
return p->GetParent();
}
/** Returns parent item of a property. */
inline wxPGId GetPropertyParent( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxNullProperty)
return p->GetParent();
}
/** Returns priority of a property (wxPG_HIGH or wxPG_LOW). */
inline int GetPropertyPriority( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(wxPG_HIGH)
if ( p && p->IsFlagSet(wxPG_PROP_HIDEABLE) )
return wxPG_LOW;
return wxPG_HIGH;
}
/** Returns priority of a property (wxPG_HIGH or wxPG_LOW). */
inline int GetPropertyPriority( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxPG_HIGH)
return GetPropertyPriority(wxPGIdGen(p));
}
/** Returns pointer to a property.
*/
inline wxPGProperty* GetPropertyPtr( wxPGId id ) const { return wxPGIdToPtr(id); }
/** Returns pointer to a property.
*/
inline wxPGProperty* GetPropertyPtr( wxPGPropNameStr name ) const
{
return wxPGIdToPtr(GetPropertyByName(name));
}
/** Returns help string associated with a property. */
inline wxString GetPropertyHelpString( wxPGId id ) const
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(m_emptyString)
return p->GetHelpString();
}
/** Returns help string associated with a property. */
inline wxString GetPropertyHelpString( wxPGPropNameStr name ) const
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(m_emptyString)
return p->GetHelpString();
}
/** Returns short name for property's class. For example,
"wxPropertyCategory" translates to "Category" and "wxIntProperty"
to "Int".
*/
wxPG_PYTHON_STATIC wxString GetPropertyShortClassName( wxPGId id );
#if wxUSE_VALIDATORS
/** Returns validator of a property as a reference, which you
can pass to any number of SetPropertyValidator.
*/
inline wxValidator* GetPropertyValidator( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(NULL)
return p->GetValidator();
}
inline wxValidator* GetPropertyValidator( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(NULL)
return p->GetValidator();
}
#endif
#ifndef SWIG
/** Returns value as wxVariant. To get wxObject pointer from it,
you will have to use WX_PG_VARIANT_TO_WXOBJECT(VARIANT,CLASSNAME) macro.
If property value is unspecified, Null variant is returned.
*/
inline wxVariant GetPropertyValue( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(wxVariant())
return p->GetValueAsVariant();
}
/** Returns value as wxVariant. To get wxObject pointer from it,
you will have to use WX_PG_VARIANT_TO_WXOBJECT(VARIANT,CLASSNAME) macro.
If property value is unspecified, Null variant is returned.
*/
inline wxVariant GetPropertyValue( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxVariant())
return p->GetValueAsVariant();
}
#endif
wxPG_PYTHON_STATIC wxString GetPropertyValueAsString( wxPGId id ) wxPG_GETVALUE_CONST;
wxPG_PYTHON_STATIC long GetPropertyValueAsLong( wxPGId id ) wxPG_GETVALUE_CONST;
#ifndef SWIG
wxPG_PYTHON_STATIC inline int GetPropertyValueAsInt( wxPGId id ) wxPG_GETVALUE_CONST { return (int)GetPropertyValueAsLong(id); }
#endif
wxPG_PYTHON_STATIC bool GetPropertyValueAsBool( wxPGId id ) wxPG_GETVALUE_CONST;
wxPG_PYTHON_STATIC double GetPropertyValueAsDouble( wxPGId id ) wxPG_GETVALUE_CONST;
wxPG_PYTHON_STATIC const wxObject* GetPropertyValueAsWxObjectPtr( wxPGId id ) wxPG_GETVALUE_CONST;
wxPG_PYTHON_STATIC void* GetPropertyValueAsVoidPtr( wxPGId id ) wxPG_GETVALUE_CONST;
#define wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(TYPENAME, DEFVAL) \
wxPG_PROP_ID_CALL_PROLOG_RETVAL(DEFVAL) \
if ( wxStrcmp(p->GetValueTypePtr()->GetCustomTypeName(),TYPENAME) != 0 ) \
{ \
wxPGGetFailed(p,TYPENAME); \
return DEFVAL; \
}
#if !wxPG_PGVARIANT_IS_VARIANT
wxPG_PYTHON_STATIC const wxArrayString& GetPropertyValueAsArrayString( wxPGId id ) wxPG_GETVALUE_CONST;
#else
wxPG_PYTHON_STATIC inline wxArrayString GetPropertyValueAsArrayString( wxPGId id ) wxPG_GETVALUE_CONST
{
wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("arrstring"), wxArrayString())
return wxPGVariantToArrayString(p->DoGetValue());
}
#endif
#if !wxPG_PGVARIANT_IS_VARIANT
wxPG_PYTHON_STATIC inline const wxPoint& GetPropertyValueAsPoint( wxPGId id ) wxPG_GETVALUE_CONST
{
wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxPoint"), *((const wxPoint*)NULL))
return wxPGVariantToWxPoint(p->DoGetValue());
}
#else
wxPG_PYTHON_STATIC inline wxPoint GetPropertyValueAsPoint( wxPGId id ) wxPG_GETVALUE_CONST
{
wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxPoint"), wxPoint())
return wxPGVariantToWxPoint(p->DoGetValue());
}
#endif
#if !wxPG_PGVARIANT_IS_VARIANT
wxPG_PYTHON_STATIC inline const wxSize& GetPropertyValueAsSize( wxPGId id ) wxPG_GETVALUE_CONST
{
wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxSize"), *((const wxSize*)NULL))
return wxPGVariantToWxSize(p->DoGetValue());
}
#else
wxPG_PYTHON_STATIC inline wxSize GetPropertyValueAsSize( wxPGId id ) wxPG_GETVALUE_CONST
{
wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxSize"), wxSize())
return wxPGVariantToWxSize(p->DoGetValue());
}
#endif
#if !wxPG_PGVARIANT_IS_VARIANT
wxPG_PYTHON_STATIC inline const wxLongLong& GetPropertyValueAsLongLong( wxPGId id ) wxPG_GETVALUE_CONST
{
wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxLongLong"), *((const wxLongLong*)NULL))
return wxPGVariantToWxLongLong(p->DoGetValue());
}
#else
wxPG_PYTHON_STATIC inline wxLongLong GetPropertyValueAsLongLong( wxPGId id ) wxPG_GETVALUE_CONST
{
wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxLongLong"), wxLongLong())
return wxPGVariantToWxLongLong(p->DoGetValue());
}
#endif
#if !wxPG_PGVARIANT_IS_VARIANT
wxPG_PYTHON_STATIC inline const wxULongLong& GetPropertyValueAsULongLong( wxPGId id ) wxPG_GETVALUE_CONST
{
wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxULongLong"), *((const wxULongLong*)NULL))
return wxPGVariantToWxULongLong(p->DoGetValue());
}
#else
wxPG_PYTHON_STATIC inline wxULongLong GetPropertyValueAsULongLong( wxPGId id ) wxPG_GETVALUE_CONST
{
wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxULongLong"), wxULongLong())
return wxPGVariantToWxULongLong(p->DoGetValue());
}
#endif
#if !wxPG_PGVARIANT_IS_VARIANT
wxPG_PYTHON_STATIC inline const wxArrayInt& GetPropertyValueAsArrayInt( wxPGId id ) wxPG_GETVALUE_CONST
{
wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxArrayInt"), wxPG_EMPTY_ARRAYINT)
return wxPGVariantToArrayInt(p->DoGetValue());
}
#else
wxPG_PYTHON_STATIC inline wxArrayInt GetPropertyValueAsArrayInt( wxPGId id ) wxPG_GETVALUE_CONST
{
wxPG_PROP_ID_GETPROPVAL_CALL_PROLOG_RETVAL(wxT("wxArrayInt"), wxArrayInt())
wxArrayInt arr = wxPGVariantToArrayInt(p->DoGetValue());
return arr;
}
#endif
#if wxUSE_DATETIME
wxPG_PYTHON_STATIC inline wxDateTime GetPropertyValueAsDateTime( wxPGId id ) wxPG_GETVALUE_CONST
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(wxDateTime())
if ( wxStrcmp(p->GetValueTypePtr()->GetCustomTypeName(),wxT("datetime")) != 0 )
{
wxPGGetFailed(p,wxT("datetime"));
return wxDateTime();
}
return p->DoGetValue().GetDateTime();
}
#endif
#ifdef __WXPYTHON__
wxPG_PYTHON_STATIC PyObject* GetPropertyValueAsPyObject( wxPGId id ) wxPG_GETVALUE_CONST;
#endif
inline wxString GetPropertyValueAsString( wxPGPropNameStr name ) const
{
return GetPropertyValueAsString( GetPropertyByNameI(name) );
}
inline long GetPropertyValueAsLong( wxPGPropNameStr name ) const
{
return GetPropertyValueAsLong( GetPropertyByNameI(name) );
}
#ifndef SWIG
inline int GetPropertyValueAsInt( wxPGPropNameStr name ) const
{
return GetPropertyValueAsInt( GetPropertyByNameI(name) );
}
#endif
inline bool GetPropertyValueAsBool( wxPGPropNameStr name ) const
{
return GetPropertyValueAsBool( GetPropertyByNameI(name) );
}
inline double GetPropertyValueAsDouble( wxPGPropNameStr name ) const
{
return GetPropertyValueAsDouble( GetPropertyByNameI(name) );
}
inline const wxObject* GetPropertyValueAsWxObjectPtr ( wxPGPropNameStr name ) const
{
return GetPropertyValueAsWxObjectPtr( GetPropertyByNameI(name) );
}
#if !wxPG_PGVARIANT_IS_VARIANT
inline const wxArrayString& GetPropertyValueAsArrayString ( wxPGPropNameStr name ) const
{
return GetPropertyValueAsArrayString( GetPropertyByNameI(name) );
}
inline const wxPoint& GetPropertyValueAsPoint( wxPGPropNameStr name ) const
{
return GetPropertyValueAsPoint( GetPropertyByNameI(name) );
}
inline const wxSize& GetPropertyValueAsSize( wxPGPropNameStr name ) const
{
return GetPropertyValueAsSize( GetPropertyByNameI(name) );
}
inline const wxArrayInt& GetPropertyValueAsArrayInt( wxPGPropNameStr name ) const
{
return GetPropertyValueAsArrayInt( GetPropertyByNameI(name) );
}
#else
inline wxArrayString GetPropertyValueAsArrayString ( wxPGPropNameStr name ) const
{
return GetPropertyValueAsArrayString( GetPropertyByNameI(name) );
}
inline wxPoint GetPropertyValueAsPoint( wxPGPropNameStr name ) const
{
return GetPropertyValueAsPoint( GetPropertyByNameI(name) );
}
inline wxSize GetPropertyValueAsSize( wxPGPropNameStr name ) const
{
return GetPropertyValueAsSize( GetPropertyByNameI(name) );
}
inline wxArrayInt GetPropertyValueAsArrayInt( wxPGPropNameStr name ) const
{
return GetPropertyValueAsArrayInt( GetPropertyByNameI(name) );
}
#endif
#if wxUSE_DATETIME
inline wxDateTime GetPropertyValueAsDateTime( wxPGPropNameStr name ) const
{
return GetPropertyValueAsDateTime( GetPropertyByNameI(name) );
}
#endif
#ifdef __WXPYTHON__
inline PyObject* GetPropertyValueAsPyObject( wxPGPropNameStr name ) const
{
return GetPropertyValueAsPyObject( GetPropertyByNameI(name) );
}
#endif
/** Returns a wxPGValueType class instance that describes
the property's data type.
*/
wxPG_VALUETYPE_MSGVAL GetPropertyValueType( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(wxPG_VALUETYPE(none))
return p->GetValueType();
}
wxPG_VALUETYPE_MSGVAL GetPropertyValueType( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxPG_VALUETYPE(none))
return p->GetValueType();
}
/** Returns property value type name.
*/
inline wxString GetPVTN( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(m_emptyString)
const wxPGValueType* vt = p->GetValueTypePtr();
return vt->GetCustomTypeName();
}
inline wxString GetPVTN( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(m_emptyString)
const wxPGValueType* vt = p->GetValueTypePtr();
return vt->GetCustomTypeName();
}
/** Returns property value type identifier.
*/
inline size_t GetPVTI( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(0)
const wxPGValueType* vt = p->GetValueTypePtr();
return size_t(vt);
}
inline size_t GetPVTI( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(0)
const wxPGValueType* vt = p->GetValueTypePtr();
return size_t(vt);
}
#ifndef SWIG
inline wxPropertyGridState* GetState() const { return m_pState; }
#endif
/** Returns value type class instance for given type name.
*/
static wxPGValueType* GetValueType( const wxString &type );
#if wxPG_VALUETYPE_IS_STRING
/** Return value type class instance for given value type class name.
*/
static wxPGValueType* GetValueTypeByName( const wxString &className );
#endif
/** Hides or reveals a property.
\param hide
If true, hides property, otherwise reveals it.
\remarks
Hiding properties is not compatible with priority system. Using both
at the same time will yield unpredictable results.
*/
bool HideProperty( wxPGId id, bool hide = true );
inline bool HideProperty( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return HideProperty(wxPGIdGen(p));
}
#if wxPG_INCLUDE_ADVPROPS
/** Initializes additional property editors (SpinCtrl etc.). Causes references
to most object files in the library, so calling this may cause significant increase
in executable size when linking with static library.
*/
static void RegisterAdditionalEditors();
#else
static inline void RegisterAdditionalEditors() { }
#endif
#if wxPG_INCLUDE_ADVPROPS
/** Initializes *all* property types. Causes references to most object
files in the library, so calling this may cause significant increase
in executable size when linking with static library.
*/
static void InitAllTypeHandlers();
#else
static inline void InitAllTypeHandlers() { }
#endif
/** Returns true if property is enabled. */
inline bool IsPropertyEnabled( wxPGId id ) const
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(false)
return (!(p->GetFlags() & wxPG_PROP_DISABLED))?true:false;
}
/** Returns true if property is enabled. */
inline bool IsPropertyEnabled( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return (!(p->GetFlags() & wxPG_PROP_DISABLED))?true:false;
}
/** Returns true if property is shown (ie. hideproperty with true not called for it). */
inline bool IsPropertyShown( wxPGId id ) const
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(false)
return (!(p->GetFlags() & wxPG_PROP_HIDEABLE))?true:false;
}
/** Returns true if property is shown (ie. hideproperty with true not called for it). */
inline bool IsPropertyShown( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return (!(p->GetFlags() & wxPG_PROP_HIDEABLE))?true:false;
}
/** Returns true if property's value type has name typestr. */
inline bool IsPropertyValueType( wxPGId id, const wxChar* typestr )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(false)
return (wxStrcmp(p->GetValueTypePtr()->GetTypeName(),typestr) == 0);
}
#if !wxPG_VALUETYPE_IS_STRING
/** Returns true if property's value type is valuetype */
inline bool IsPropertyValueType( wxPGId id, const wxPGValueType* valuetype )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(false)
return ( p->GetValueTypePtr() == valuetype );
}
#endif
/** Returns true if property's value type has same name as a class. */
inline bool IsPropertyValueType( wxPGId id, const wxClassInfo* classinfo )
{
return IsPropertyValueType(id,classinfo->GetClassName());
}
/** Returns true if property's value type has name typestr. */
inline bool IsPropertyValueType( wxPGPropNameStr name, const wxChar* typestr )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return (wxStrcmp(p->GetValueTypePtr()->GetTypeName(),typestr) == 0);
}
#if !wxPG_VALUETYPE_IS_STRING
/** Returns true if property's value type is valuetype */
inline bool IsPropertyValueType( wxPGPropNameStr name, const wxPGValueType* valuetype )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return ( p->GetValueType() == valuetype );
}
#endif
/** Returns true if property's value type has same name as a class. */
inline bool IsPropertyValueType( wxPGPropNameStr name, const wxClassInfo* classinfo )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return IsPropertyValueType(wxPGIdGen(p),classinfo->GetClassName());
}
/** Returns true if given property is expanded. Naturally, always returns false
for properties that cannot be expanded.
*/
static bool IsPropertyExpanded( wxPGId id );
inline bool IsPropertyExpanded( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return IsPropertyExpanded(wxPGIdGen(p));
}
/** Returns true if property is of certain type.
\param info
Preferably use WX_PG_CLASSINFO(PROPERTYNAME). Alternative is
PROPERTYNAMEClassInfo.
*/
static inline bool IsPropertyKindOf( wxPGId id, wxPGPropertyClassInfo& info )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(false)
return p->IsKindOf(info);
}
inline bool IsPropertyKindOf( wxPGPropNameStr name, wxPGPropertyClassInfo& info )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return p->IsKindOf(info);
}
/** Returns true if property has been modified after value set or modify flag
clear by software.
NOTE: Try to use IsPropertyModified instead.
*/
inline bool IsModified( wxPGId id ) const
{
return IsPropertyModified(id);
}
inline bool IsModified( wxPGPropNameStr name )
{
return IsPropertyModified(name);
}
/** Returns true if property is a category. */
inline bool IsPropertyCategory( wxPGId id ) const
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(false)
return (p->GetParentingType()>0)?true:false;
}
inline bool IsPropertyCategory( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return (p->GetParentingType()>0)?true:false;
}
/** Returns true if property has been modified after value set or modify flag
clear by software.
*/
inline bool IsPropertyModified( wxPGId id ) const
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(false)
return ( (p->GetFlags() & wxPG_PROP_MODIFIED) ? true : false );
}
inline bool IsPropertyModified( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return ( (p->GetFlags() & wxPG_PROP_MODIFIED) ? true : false );
}
/** Returns true if property value is set to unspecified.
*/
#ifdef wxPG_COMPATIBILITY_1_0_0
inline bool IsPropertyValueUnspecified( wxPGId id ) const
#else
inline bool IsPropertyUnspecified( wxPGId id ) const
#endif
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(false)
return ( (p->GetFlags() & wxPG_PROP_UNSPECIFIED) ? true : false );
}
#ifdef wxPG_COMPATIBILITY_1_0_0
inline bool IsPropertyValueUnspecified( wxPGPropNameStr name )
{
return IsPropertyValueUnspecified(GetPropertyByNameI(name));
}
#else
inline bool IsPropertyUnspecified( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return IsPropertyUnspecified(wxPGIdGen(p));
}
#endif
/** Basic property classes are registered by the default, but this
registers advanced ones as well.
*/
static void RegisterAdvancedPropertyClasses();
/** Registers property class info with specific name. Preferably use
wxPGRegisterPropertyClass(PROPERTYNAME) macro.
*/
static bool RegisterPropertyClass( const wxChar* name, wxPGPropertyClassInfo* classinfo );
/** Replaces property with id with newly created property. For example,
this code replaces existing property named "Flags" with one that
will have different set of items:
\code
pg->ReplaceProperty(wxT("Flags"),
wxFlagsProperty(wxT("Flags"),wxPG_LABEL,newItems))
\endcode
For more info, see wxPropertyGrid::Insert.
*/
wxPGId ReplaceProperty( wxPGId id, wxPGProperty* property );
inline wxPGId ReplaceProperty( wxPGPropNameStr name, wxPGProperty* property )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxNullProperty)
return ReplaceProperty(wxPGIdGen(p),property);
}
/** Lets user to set the strings listed in the choice dropdown of a wxBoolProperty.
Defaults are "True" and "False", so changing them to, say, "Yes" and "No" may
be useful in some less technical applications.
*/
static void SetBoolChoices( const wxChar* true_choice, const wxChar* false_choice );
/** Set choices of a property to specified set of labels and values.
*/
static inline void SetPropertyChoices(wxPGId id, wxPGChoices& choices)
{
wxPG_PROP_ID_CALL_PROLOG()
p->SetChoices(choices);
}
/** Set choices of a property to specified set of labels and values.
*/
inline void SetPropertyChoices(wxPGPropNameStr name, wxPGChoices& choices)
{
wxPG_PROP_NAME_CALL_PROLOG()
p->SetChoices(choices);
}
/** If property's set of choices is shared, then calling this method converts
it to private.
*/
inline void SetPropertyChoicesExclusive( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG()
p->SetChoicesExclusive();
}
inline void SetPropertyChoicesExclusive( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG()
p->SetChoicesExclusive();
}
/** Sets an attribute of a property. Ids and relevants values are totally
specific to property classes and may affect either the given instance
or all instances of that class. See \ref attrids for list of built-in
attributes.
\param argFlags
Optional. Use wxPG_RECURSE to set the attribute to child properties
as well.
\remarks
wxVariant doesn't have int constructor (as of 2.5.4), so <b>you will
need to cast int values (including most numeral constants) to long</b>.
*/
inline void SetPropertyAttribute( wxPGId id, int attrid, wxVariant value, long argFlags = 0 )
{
DoSetPropertyAttribute(id,attrid,value,argFlags);
}
inline void SetPropertyAttribute( wxPGPropNameStr name, int attrid, wxVariant value, long argFlags = 0 )
{
wxPG_PROP_NAME_CALL_PROLOG()
DoSetPropertyAttribute(wxPGIdGen(p),attrid,value,argFlags);
}
#ifndef SWIG
/** Sets editor control of a property. As editor argument, use
wxPG_EDITOR(EditorName), where basic built-in editor names are TextCtrl, Choice,
ComboBox, CheckBox, TextCtrlAndButton, and ChoiceAndButton. Additional editors
include SpinCtrl and DatePickerCtrl, which also require wxPropertyGrid::RegisterAdditionalEditors()
call prior using.
*/
inline void SetPropertyEditor( wxPGId id, const wxPGEditor* editor )
{
wxPG_PROP_ID_CALL_PROLOG()
wxCHECK_RET( editor, wxT("unknown/NULL editor") );
p->SetEditor(editor);
RefreshProperty(p);
}
inline void SetPropertyEditor( wxPGPropNameStr name, const wxPGEditor* editor )
{
wxPG_PROP_NAME_CALL_PROLOG()
wxCHECK_RET( editor, wxT("unknown/NULL editor") );
p->SetEditor(editor);
RefreshProperty(p);
}
#endif // #ifndef SWIG
/** Sets editor control of a property. As editor argument, use
editor name string, such as wxT("TextCtrl") or wxT("Choice").
*/
inline void SetPropertyEditor( wxPGId id, const wxString& editorName )
{
SetPropertyEditor(id,GetEditorByName(editorName));
}
inline void SetPropertyEditor( wxPGPropNameStr name, const wxString& editorName )
{
SetPropertyEditor(name,GetEditorByName(editorName));
}
#if wxPG_USE_CLIENT_DATA
/** Sets client data (void*) of a property.
\remarks
This untyped client data has to be deleted manually.
*/
inline void SetPropertyClientData( wxPGId id, wxPGProperty::ClientDataType clientData )
{
wxPG_PROP_ID_CALL_PROLOG()
p->SetClientData(clientData);
}
/** Sets client data (void*) of a property.
\remarks
This untyped client data has to be deleted manually.
*/
inline void SetPropertyClientData( wxPGPropNameStr name, wxPGProperty::ClientDataType clientData )
{
wxPG_PROP_NAME_CALL_PROLOG()
p->SetClientData(clientData);
}
#endif
/** Associates the help string with property.
\remarks
By default, text is shown either in the manager's "description"
text box or in the status bar. If extra window style wxPG_EX_HELP_AS_TOOLTIPS
is used, then the text will appear as a tooltip.
*/
inline void SetPropertyHelpString( wxPGId id, const wxString& helpString )
{
wxPG_PROP_ID_CALL_PROLOG()
p->SetHelpString(helpString);
}
inline void SetPropertyHelpString( wxPGPropNameStr name, const wxString& helpString )
{
wxPG_PROP_NAME_CALL_PROLOG()
p->SetHelpString(helpString);
}
/** Set wxBitmap in front of the value.
\remarks
- Bitmap will be ignored if property class has implemented OnCustomPaint.
- Bitmap will be scaled to a size returned by wxPropertyGrid::GetImageSize();
*/
inline void SetPropertyImage( wxPGId id, wxBitmap& bmp )
{
wxPG_PROP_ID_CALL_PROLOG()
p->SetValueImage(bmp);
RefreshProperty(p);
}
inline void SetPropertyImage( wxPGPropNameStr name, wxBitmap& bmp )
{
wxPG_PROP_NAME_CALL_PROLOG()
p->SetValueImage(bmp);
RefreshProperty(p);
}
/** Sets max length of property's text.
*/
bool SetPropertyMaxLength( wxPGId id, int maxLen );
/** Sets max length of property's text.
*/
inline bool SetPropertyMaxLength( wxPGPropNameStr name, int maxLen )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return SetPropertyMaxLength(wxPGIdGen(p),maxLen);
}
/** Property is to be hidden/shown when hider button is toggled or
when wxPropertyGrid::Compact is called.
*/
bool SetPropertyPriority( wxPGId id, int priority );
/** Property is to be hidden/shown when hider button is toggled or
when wxPropertyGrid::Compact is called.
*/
inline bool SetPropertyPriority( wxPGPropNameStr name, int priority )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return SetPropertyPriority(wxPGIdGen(p),priority);
}
#if wxUSE_VALIDATORS
/** Sets validator of a property. For example
\code
// Allow property's value range from -100 to 100
wxIntPropertyValidator validator(-100,100);
wxPGId id = pg->Append( wxIntProperty(wxT("Value 1",wxPG_LABEL,0)) );
pg->SetPropertyValidator( id, validator );
\endcode
*/
inline void SetPropertyValidator( wxPGId id, const wxValidator& validator )
{
wxPG_PROP_ID_CALL_PROLOG()
p->SetValidator(validator);
}
inline void SetPropertyValidator( wxPGPropNameStr name, const wxValidator& validator )
{
wxPG_PROP_NAME_CALL_PROLOG()
p->SetValidator(validator);
}
#endif
/** Toggles priority of a property between wxPG_HIGH and wxPG_LOW.
*/
inline void TogglePropertyPriority( wxPGId id )
{
int priority = wxPG_LOW;
if ( GetPropertyPriority(id) == wxPG_LOW )
priority = wxPG_HIGH;
SetPropertyPriority(id,priority);
}
/** Toggles priority of a property between wxPG_HIGH and wxPG_LOW.
*/
inline void TogglePropertyPriority( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG()
TogglePropertyPriority(wxPGIdGen(p));
}
#ifdef SWIG
%pythoncode {
def MapType(class_,factory):
"Registers Python type/class to property mapping.\n\nfactory: Property builder function/class."
global _type2property
try:
mappings = _type2property
except NameError:
raise AssertionError("call only after a propertygrid or manager instance constructed")
mappings[class_] = factory
def DoDefaultTypeMappings(self):
"Map built-in properties."
global _type2property
try:
mappings = _type2property
return
except NameError:
mappings = {}
_type2property = mappings
mappings[str] = StringProperty
mappings[unicode] = StringProperty
mappings[int] = IntProperty
mappings[float] = FloatProperty
mappings[bool] = BoolProperty
mappings[list] = ArrayStringProperty
mappings[tuple] = ArrayStringProperty
mappings[wx.Font] = FontProperty
mappings[wx.Colour] = ColourProperty
mappings[wx.Size] = SizeProperty
mappings[wx.Point] = PointProperty
mappings[wx.FontData] = FontDataProperty
def GetPropertyValue(self,p):
"Returns Python object value for property.\n\nCaches getters on value type id basis for performance purposes."
global _vt2getter
vtid = self.GetPVTI(p)
if not vtid:
raise TypeError("Property '%s' doesn't have valid value type"%(p.GetName()))
try:
getter = _vt2getter[vtid]
except KeyError:
cls = PropertyContainerMethods
vtn = self.GetPVTN(p)
if vtn == 'long':
getter = cls.GetPropertyValueAsLong
elif vtn == 'string':
getter = cls.GetPropertyValueAsString
elif vtn == 'double':
getter = cls.GetPropertyValueAsDouble
elif vtn == 'bool':
getter = cls.GetPropertyValueAsBool
elif vtn == 'arrstring':
getter = cls.GetPropertyValueAsArrayString
elif vtn == 'wxArrayInt':
getter = cls.GetPropertyValueAsArrayInt
elif vtn == 'PyObject':
getter = cls.GetPropertyValueAsPyObject
elif vtn == 'datetime':
getter = cls.GetPropertyValueAsDateTime
elif vtn == 'wxPoint':
getter = cls.GetPropertyValueAsPoint
elif vtn == 'wxSize':
getter = cls.GetPropertyValueAsSize
elif vtn.startswith('wx'):
getter = cls.GetPropertyValueAsWxObjectPtr
elif not vtn:
if p:
raise ValueError("no property with name '%s'"%p)
else:
raise ValueError("NULL property")
else:
raise AssertionError("Unregistered property grid value type '%s'"%vtn)
_vt2getter[vtid] = getter
return getter(self,p)
def SetPropertyValueArrstr(self,p,v):
"NB: We must implement this in Python because SWIG has problems combining"
" conversion of list to wxArrayXXX and overloaded arguments."
if not isinstance(p,basestring):
self._SetPropertyValueArrstr(p,v)
else:
self._SetPropertyValueArrstr(self.GetPropertyByNameI(p),v)
def SetPropertyValueArrint(self,p,v):
"NB: We must implement this in Python because SWIG has problems combining"
" conversion of list to wxArrayXXX and overloaded arguments."
if not isinstance(p,basestring):
self._SetPropertyValueArrint(p,v)
else:
self._SetPropertyValueArrint(self.GetPropertyByNameI(p),v)
def SetPropertyValue(self,p,v):
"Set property value from Python object.\n\nCaches setters on value type id basis for performance purposes."
cls = self.__class__
if not isinstance(v,basestring):
_vt2setter = cls._vt2setter
vtid = self.GetPVTI(p)
try:
setter = _vt2setter[vtid]
except KeyError:
vtn = self.GetPVTN(p)
if vtn == 'long':
setter = cls.SetPropertyValueLong
elif vtn == 'string':
setter = cls.SetPropertyValueString
elif vtn == 'double':
setter = cls.SetPropertyValueDouble
elif vtn == 'bool':
setter = cls.SetPropertyValueBool
elif vtn == 'arrstring':
setter = cls.SetPropertyValueArrstr
elif vtn == 'wxArrayInt':
setter = cls.SetPropertyValueArrint
elif vtn == 'PyObject':
setter = cls.SetPropertyValuePyObject
elif vtn == 'datetime':
setter = cls.SetPropertyValueDatetime
elif vtn == 'wxPoint':
setter = cls.SetPropertyValuePoint
elif vtn == 'wxSize':
setter = cls.SetPropertyValueSize
elif vtn == 'wxLongLong':
setter = cls.SetPropertyValueLongLong
elif vtn == 'wxULongLong':
setter = cls.SetPropertyValueULongLong
elif vtn.startswith('wx'):
setter = cls.SetPropertyValueWxObjectPtr
elif not vtn:
if p:
raise ValueError("no property with name '%s'"%p)
else:
raise ValueError("NULL property")
else:
raise AssertionError("Unregistered property grid value type '%s'"%vtn)
_vt2setter[vtid] = setter
else:
setter = cls.SetPropertyValueString
return setter(self,p,v)
def DoDefaultValueTypeMappings(self):
"Map pg value type ids to getter methods."
global _vt2getter
try:
vt2getter = _vt2getter
return
except NameError:
vt2getter = {}
_vt2getter = vt2getter
def _GetValues(self,parent,fc,dict_,getter):
p = fc
while p:
pfc = self.GetFirstChild(p)
if pfc:
self._GetValues(p,pfc,dict_,getter)
else:
dict_[p.GetName()] = getter(p)
p = self.GetNextSibling(p)
def GetPropertyValues(self,dict_=None,as_strings=False):
"Returns values in the grid."
""
"dict_: if not given, then a new one is created. dict_ can be"
" object as well, in which case it's __dict__ is used."
"as_strings: if True, then string representations of values"
" are fetched instead of native types. Useful for config and such."
""
"Return value: dictionary with values. It is always a dictionary,"
"so if dict_ was object with __dict__ attribute, then that attribute"
"is returned."
if dict_ is None:
dict_ = {}
elif hasattr(dict_,'__dict__'):
dict_ = dict_.__dict__
if not as_strings:
getter = self.GetPropertyValue
else:
getter = self.GetPropertyValueAsString
root = self.GetRoot()
self._GetValues(root,self.GetFirstChild(root),dict_,getter)
return dict_
GetValues = GetPropertyValues
def SetPropertyValues(self,dict_):
"Sets property values from dict_, which can be either\ndictionary or an object with __dict__ attribute."
""
"autofill: If true, keys with not relevant properties"
" are auto-created. For more info, see AutoFill."
""
"Notes:"
" * Keys starting with underscore are ignored."
autofill = False
if dict_ is None:
dict_ = {}
elif hasattr(dict_,'__dict__'):
dict_ = dict_.__dict__
def set_sub_obj(k0,dict_):
for k,v in dict_.iteritems():
if k[0] != '_':
try:
self.SetPropertyValue(k,v)
except:
try:
if autofill:
self._AutoFillOne(k0,k,v)
continue
except:
if isinstance(v,dict):
set_sub_obj(k,v)
elif hasattr(v,'__dict__'):
set_sub_obj(k,v.__dict__)
cur_page = False
is_manager = isinstance(self,PropertyGridManager)
try:
set_sub_obj(self.GetRoot(),dict_)
except:
import traceback
traceback.print_exc()
self.Refresh()
SetValues = SetPropertyValues
def _AutoFillMany(self,cat,dict_):
for k,v in dict_.iteritems():
self._AutoFillOne(cat,k,v)
def _AutoFillOne(self,cat,k,v):
global _type2property
factory = _type2property.get(v.__class__,None)
if factory:
self.AppendIn( cat, factory(k,k,v) )
elif hasattr(v,'__dict__'):
cat2 = self.AppendIn( cat, PropertyCategory(k) )
self._AutoFillMany(cat2,v.__dict__)
elif isinstance(v,dict):
cat2 = self.AppendIn( cat, PropertyCategory(k) )
self._AutoFillMany(cat2,v)
elif not k.startswith('_'):
raise AssertionError("member '%s' is of unregisted type/class '%s'"%(k,v.__class__))
def AutoFill(self,obj,parent=None):
"Clears properties and re-fills to match members and\nvalues of given object or dictionary obj."
self.edited_objects[parent] = obj
cur_page = False
is_manager = isinstance(self,PropertyGridManager)
if not parent:
if is_manager:
page = self.GetTargetPage()
self.ClearPage(page)
parent = self.GetPageRoot(page)
else:
self.Clear()
parent = self.GetRoot()
else:
p = self.GetFirstChild(parent)
while p:
self.Delete(p)
p = self.GetNextSibling(p)
if not is_manager or page == self.GetSelectedPage():
self.Freeze()
cur_page = True
try:
self._AutoFillMany(parent,obj.__dict__)
except:
import traceback
traceback.print_exc()
if cur_page:
self.Thaw()
def RegisterEditor(self, editor, editorName=None):
"Transform class into instance, if necessary."
if not isinstance(editor, PGEditor):
editor = editor()
if not editorName:
editorName = editor.__class__.__name__
try:
self._editor_instances.append(editor)
except:
self._editor_instances = [editor]
RegisterEditor(editor, editorName)
}
#endif
/** Sets property as read-only. It's value cannot be changed by the user, but the
editor may still be created for copying purposes.
*/
void SetPropertyReadOnly( wxPGId id, bool readOnly = true )
{
wxPG_PROP_ID_CALL_PROLOG()
if ( readOnly )
p->SetFlag(wxPG_PROP_READONLY);
else
p->ClearFlag(wxPG_PROP_READONLY);
}
/** Sets property as read-only. It's value cannot be changed by the user, but the
editor may still be created for copying purposes.
*/
void SetPropertyReadOnly( wxPGPropNameStr name, bool readOnly = true )
{
wxPG_PROP_NAME_CALL_PROLOG()
if ( readOnly )
p->SetFlag(wxPG_PROP_READONLY);
else
p->ClearFlag(wxPG_PROP_READONLY);
}
// GetPropertyByNameI With nice assertion error message.
wxPGId GetPropertyByNameA( wxPGPropNameStr name ) const;
#ifndef SWIG
static wxPGEditor* GetEditorByName( const wxString& editorName );
protected:
// Deriving classes must set this (it must be only or current page).
wxPropertyGridState* m_pState;
// Default call's m_pState's BaseGetPropertyByName
virtual wxPGId DoGetPropertyByName( wxPGPropNameStr name ) const;
virtual void RefreshProperty( wxPGProperty* p ) = 0;
// Intermediate version needed due to wxVariant copying inefficiency
static void DoSetPropertyAttribute( wxPGId id, int attrid, wxVariant& value, long argFlags );
// Empty string object to return from member functions returning const wxString&.
wxString m_emptyString;
#endif // #ifndef SWIG
};
// -----------------------------------------------------------------------
// wxPropertyGrid::DoSelectProperty flags
#define wxPG_SEL_FOCUS 0x01 // Focuses to created editor
#define wxPG_SEL_FORCE 0x02 // Forces deletion and recreation of editor
#define wxPG_SEL_NONVISIBLE 0x04 // For example, doesn't cause EnsureVisible
#define wxPG_SEL_NOVALIDATE 0x08 // Do not validate editor's value before selecting
#define wxPG_SEL_DELETING 0x10 // Property being deselected is about to be deleted
#define wxPG_SEL_SETUNSPEC 0x20 // Property's values was set to unspecified by the user
// -----------------------------------------------------------------------
#ifndef SWIG
// Internal flags
#define wxPG_FL_INITIALIZED 0x0001
#define wxPG_FL_ACTIVATION_BY_CLICK 0x0002 // Set when creating editor controls if it was clicked on.
#define wxPG_FL_DONT_CENTER_SPLITTER 0x0004
#define wxPG_FL_FOCUSED 0x0008
#define wxPG_FL_MOUSE_CAPTURED 0x0010
#define wxPG_FL_MOUSE_INSIDE 0x0020
#define wxPG_FL_VALUE_MODIFIED 0x0040
#define wxPG_FL_PRIMARY_FILLS_ENTIRE 0x0080 // don't clear background of m_wndPrimary
#define wxPG_FL_CUR_USES_CUSTOM_IMAGE 0x0100 // currently active editor uses custom image
#define wxPG_FL_HIDE_STATE 0x0200 // set when hideable properties should be hidden
#define wxPG_FL_SCROLLED 0x0400
#define wxPG_FL_ADDING_HIDEABLES 0x0800 // set when all added/inserted properties get hideable flag
#define wxPG_FL_NOSTATUSBARHELP 0x1000 // Disables showing help strings on statusbar.
#define wxPG_FL_CREATEDSTATE 0x2000 // Marks that we created the state, so we have to destroy it too.
#define wxPG_FL_SCROLLBAR_DETECTED 0x4000 // Set if scrollbar's existence was detected in last onresize.
#define wxPG_FL_DESC_REFRESH_REQUIRED 0x8000 // Set if wxPGMan requires redrawing of description text box.
#define wxPG_FL_SELECTED_IS_PAINT_FLEXIBLE 0x00010000 // Set if selected has flexible imagesize
#define wxPG_FL_IN_MANAGER 0x00020000 // Set if contained in wxPropertyGridManager
#define wxPG_FL_GOOD_SIZE_SET 0x00040000 // Set after wxPropertyGrid is shown in its initial good size
#define wxPG_FL_IGNORE_NEXT_NAVKEY 0x00080000 // Next navigation key event will get ignored
#define wxPG_FL_IN_SELECT_PROPERTY 0x00100000 // Set when in SelectProperty.
#define wxPG_FL_STRING_IN_STATUSBAR 0x00200000 // Set when help string is shown in status bar
#define wxPG_FL_SPLITTER_PRE_SET 0x00400000 // Splitter position has been custom-set by the user
#define wxPG_FL_VALIDATION_FAILED 0x00800000 // Validation failed. Clear on modify event.
#define wxPG_FL_SELECTED_IS_FULL_PAINT 0x01000000 // Set if selected is fully painted (ie. both image and text)
#define wxPG_MAN_FL_PAGE_INSERTED 0x02000000 // Set after page has been inserted to manager
#define wxPG_FL_ABNORMAL_EDITOR 0x04000000 // Active editor control is abnormally large
#endif // #ifndef SWIG
// -----------------------------------------------------------------------
#define wxPG_USE_STATE m_pState
/** \class wxPropertyGrid
\ingroup classes
\brief
wxPropertyGrid is a specialized two-column grid for editing properties
such as strings, numbers, flagsets, fonts, and colours. wxPropertySheet
used to do the very same thing, but it hasn't been updated for a while
and it is currently deprecated.
wxPropertyGrid is modeled after .NET propertygrid (hence the name),
and thus features are similar. However, inorder to keep the widget lightweight,
it does not (and will not) have toolbar for mode and page selection, nor the help
text box. wxAdvancedPropertyGrid (or something similarly named) is planned to have
these features in some distant future.
<h4>Derived from</h4>
wxPropertyContainerMethods\n
wxScrolledWindow\n
wxPanel\n
wxWindow\n
wxEvtHandler\n
wxObject\n
<h4>Include files</h4>
<wx/propertygrid/propertygrid.h>
<h4>Window styles</h4>
@link wndflags Additional Window Styles@endlink
<h4>Event handling</h4>
To process input from a propertygrid control, use these event handler macros to
direct input to member functions that take a wxPropertyGridEvent argument.
<table>
<tr><td>EVT_PG_SELECTED (id, func)</td><td>Property is selected.</td></tr>
<tr><td>EVT_PG_CHANGED (id, func)</td><td>Property value is modified.</td></tr>
<tr><td>EVT_PG_HIGHLIGHTED (id, func)</td><td>Mouse moves over property. Event's property is NULL if hovered on area that is not a property.</td></tr>
<tr><td>EVT_PG_RIGHT_CLICK (id, func)</td><td>Mouse right-clicked on a property.</td></tr>
<tr><td>EVT_PG_DOUBLE_CLICK (id, func)</td><td>Mouse double-clicked on a property.</td></tr>
<tr><td>EVT_PG_ITEM_COLLAPSED (id, func)</td><td>User collapses a property or category.</td></tr>
<tr><td>EVT_PG_ITEM_EXPANDED (id, func)</td><td>User expands a property or category.</td></tr>
<tr><td>EVT_BUTTON (id, func)</td><td>Button in a property editor was clicked. Only occurs if the property doesn't handle button clicks itself.</td></tr>
<tr><td>EVT_TEXT (id, func)</td><td>wxTextCtrl based editor was updated (but property value was not yet modified)</td></tr>
</table>
\sa @link wxPropertyGridEvent wxPropertyGridEvent@endlink
\remarks
- Following functions do not automatically update the screen: Append. You
probably need to explicitly call Refresh() <b>if</b> you called one of these
functions outside parent window constructor.
- Use Freeze() and Thaw() respectively to disable and enable drawing. This
will also delay sorting etc. miscellaneous calculations to the last possible
moment.
- Most methods have two versions - one which accepts property id (faster) and
another that accepts property name (which is a bit slower since it does a hashmap
lookup).
For code examples, see the main page.
*/
// BM_GRID
class WXDLLIMPEXP_PG wxPropertyGrid : public wxScrolledWindow, public wxPropertyContainerMethods
{
#ifndef SWIG
friend class wxPropertyGridState;
friend class wxPropertyContainerMethods;
friend class wxPropertyGridManager;
DECLARE_CLASS(wxPropertyGrid)
#endif
public:
/** Two step constructor. Call Create when this constructor is called to build up the
wxPropertyGrid
*/
#ifdef SWIG
%pythonAppend wxPropertyGrid {
self._setOORInfo(self)
self.DoDefaultTypeMappings()
self.edited_objects = {}
self.DoDefaultValueTypeMappings()
if not hasattr(self.__class__,'_vt2setter'):
self.__class__._vt2setter = {}
}
%pythonAppend wxPropertyGrid() ""
wxPropertyGrid( wxWindow *parent, wxWindowID id = wxID_ANY,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxPG_DEFAULT_STYLE,
const wxChar* name = wxPyPropertyGridNameStr );
%RenameCtor(PrePropertyGrid, wxPropertyGrid());
#else
wxPropertyGrid();
/** The default constructor. The styles to be used are styles valid for
the wxWindow and wxScrolledWindow.
\sa @link wndflags Additional Window Styles@endlink
*/
wxPropertyGrid( wxWindow *parent, wxWindowID id = wxID_ANY,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxPG_DEFAULT_STYLE,
const wxChar* name = wxPropertyGridNameStr );
/** Destructor */
virtual ~wxPropertyGrid();
#endif
/** Appends property to the list. wxPropertyGrid assumes ownership of the object.
Becomes child of most recently added category.
\remarks
- wxPropertyGrid takes the ownership of the property pointer.
- If appending a category with name identical to a category already in the
wxPropertyGrid, then newly created category is deleted, and most recently
added category (under which properties are appended) is set to the one with
same name. This allows easier adding of items to same categories in multiple
passes.
- Does not automatically redraw the control, so you may need to call Refresh
when calling this function after control has been shown for the first time.
*/
wxPGId Append( wxPGProperty* property );
inline wxPGId AppendCategory( const wxString& label, const wxString& name = wxPG_LABEL )
{
return Append( new wxPropertyCategoryClass(label,name) );
}
#ifndef SWIG
#if wxPG_INCLUDE_BASICPROPS
inline wxPGId Append( const wxString& label, const wxString& name = wxPG_LABEL, const wxString& value = wxEmptyString )
{
return Append( wxStringProperty(label,name,value) );
}
inline wxPGId Append( const wxString& label, const wxString& name = wxPG_LABEL, int value = 0 )
{
return Append( wxIntProperty(label,name,value) );
}
inline wxPGId Append( const wxString& label, const wxString& name = wxPG_LABEL, double value = 0.0 )
{
return Append( wxFloatProperty(label,name,value) );
}
inline wxPGId Append( const wxString& label, const wxString& name = wxPG_LABEL, bool value = false )
{
return Append( wxBoolProperty(label,name,value) );
}
#endif
#endif
inline wxPGId AppendIn( wxPGId id, wxPGProperty* property )
{
return Insert(id,-1,property);
}
inline wxPGId AppendIn( wxPGPropNameStr name, wxPGProperty* property )
{
return Insert(GetPropertyByNameI(name),-1,property);
}
inline wxPGId AppendIn( wxPGId id, const wxString& label, const wxString& propname, wxVariant& value )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(wxNullProperty)
return m_pState->AppendIn( (wxPGPropertyWithChildren*)p, label, propname, value );
}
inline wxPGId AppendIn( wxPGPropNameStr name, const wxString& label, const wxString& propname, wxVariant& value )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxNullProperty)
return m_pState->AppendIn( (wxPGPropertyWithChildren*)p, label, propname, value );
}
/** This static function enables or disables automatic use of wxGetTranslation for
following strings: wxEnumProperty list labels, wxFlagsProperty sub-property
labels.
Default is false.
*/
static void AutoGetTranslation( bool enable );
/** Returns true if all property grid data changes have been committed. Usually
only returns false if value in active editor has been invalidated by a
wxValidator.
*/
inline bool CanClose()
{
return DoEditorValidate();
}
/** Returns true if all property grid data changes have been committed. Usually
only returns false if value in active editor has been invalidated by a
wxValidator.
*/
inline bool EditorValidate()
{
return DoEditorValidate();
}
/** Centers the splitter. If argument is true, automatic splitter centering is
enabled (only applicapple if style wxPG_SPLITTER_AUTO_CENTER was defined).
*/
void CenterSplitter( bool enable_auto_centering = false );
/** Two step creation. Whenever the control is created without any parameters, use Create to actually
create it. Don't access the control's public methods before this is called
\sa @link wndflags Additional Window Styles@endlink
*/
bool Create( wxWindow *parent, wxWindowID id = wxID_ANY,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxPG_DEFAULT_STYLE,
const wxChar* name = wxPropertyGridNameStr );
/** Deletes all properties. Does not free memory allocated for arrays etc.
This should *not* be called in wxPropertyGridManager.
*/
void Clear();
/** Resets modified status of a property and all sub-properties.
*/
inline void ClearModifiedStatus( wxPGId id )
{
m_pState->ClearModifiedStatus(wxPGIdToPtr(id));
}
/** Resets modified status of all properties.
*/
inline void ClearModifiedStatus()
{
m_pState->ClearModifiedStatus(m_pState->m_properties);
m_pState->m_anyModified = false;
}
/** Resets value of a property to its default. */
bool ClearPropertyValue( wxPGId id );
/** Resets value of a property to its default. */
inline bool ClearPropertyValue( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return ClearPropertyValue( wxPGIdGen(p) );
}
/** Deselect current selection, if any. Returns true if success
(ie. validator did not intercept). */
bool ClearSelection();
/** Synonymous to Clear.
*/
inline void ClearTargetPage()
{
Clear();
}
/** Collapses given category or property with children.
Returns true if actually collapses.
*/
inline bool Collapse( wxPGId id )
{
return _Collapse(wxPGIdToPtr(id));
}
/** Collapses given category or property with children.
Returns true if actually collapses.
*/
inline bool Collapse( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return _Collapse(p);
}
/** Collapses all items that can be collapsed.
\retval
Return false if failed (may fail if editor value cannot be validated).
*/
inline bool CollapseAll() { return m_pState->ExpandAll(0); }
/** Shows(arg = false) or hides(arg = true) all hideable properties. */
bool Compact( bool compact );
/** Disables property. */
inline bool Disable( wxPGId id ) { return EnableProperty(id,false); }
/** Disables property. */
inline bool Disable( wxPGPropNameStr name ) { return EnableProperty(name,false); }
/** Disables property. */
inline bool DisableProperty( wxPGId id ) { return EnableProperty(id,false); }
/** Disables property. */
inline bool DisableProperty( wxPGPropNameStr name ) { return EnableProperty(name,false); }
/** Enables or disables (shows/hides) categories according to parameter enable. */
bool EnableCategories( bool enable );
/** Enables or disables property, depending on whether enable is true or false. */
bool EnableProperty( wxPGId id, bool enable = true );
/** Enables or disables property, depending on whether enable is true or false. */
inline bool EnableProperty( wxPGPropNameStr name, bool enable = true )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return EnableProperty( wxPGIdGen(p), enable );
}
/** Scrolls and/or expands items to ensure that the given item is visible.
Returns true if something was actually done.
*/
bool EnsureVisible( wxPGId id );
/** Scrolls and/or expands items to ensure that the given item is visible.
Returns true if something was actually done.
*/
inline bool EnsureVisible( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return EnsureVisible( wxPGIdGen(p) );
}
/** Expands given category or property with children.
Returns true if actually expands.
*/
inline bool Expand( wxPGId id )
{
return _Expand(wxPGIdToPtr(id));
}
/** Expands given category or property with children.
Returns true if actually expands.
*/
inline bool Expand( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return _Expand(p);
}
/** Expands all items that can be expanded.
*/
inline void ExpandAll() { m_pState->ExpandAll(1); }
#ifndef SWIG
/** Returns a wxVariant list containing wxVariant versions of all
property values. Order is not guaranteed, but generally it should
match the visible order in the grid.
\param flags
Use wxPG_KEEP_STRUCTURE to retain category structure; each sub
category will be its own wxList of wxVariant.
\remarks
*/
wxVariant GetPropertyValues( const wxString& listname = wxEmptyString,
wxPGId baseparent = wxPGIdGen((wxPGProperty*)NULL), long flags = 0 ) const
{
return m_pState->GetPropertyValues(listname,baseparent,flags);
}
#endif
inline wxFont& GetCaptionFont() { return m_captionFont; }
/** Returns current category caption background colour. */
inline wxColour GetCaptionBackgroundColour() const { return m_colCapBack; }
/** Returns current category caption text colour. */
inline wxColour GetCaptionForegroundColour() const { return m_colCapFore; }
/** Returns current cell background colour. */
inline wxColour GetCellBackgroundColour() const { return m_colPropBack; }
/** Returns current cell text colour when disabled. */
inline wxColour GetCellDisabledTextColour() const { return m_colDisPropFore; }
/** Returns current cell text colour. */
inline wxColour GetCellTextColour() const { return m_colPropFore; }
/** Returns number of children of the root property.
*/
inline size_t GetChildrenCount()
{
return GetChildrenCount( wxPGIdGen(m_pState->m_properties) );
}
/** Returns number of children for the property.
NB: Cannot be in container methods class due to name hiding.
*/
inline size_t GetChildrenCount( wxPGId id ) const
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(0)
return p->GetChildCount();
}
/** Returns number of children for the property. */
inline size_t GetChildrenCount( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(0)
return p->GetChildCount();
}
/** Returns id of first item, whether it is a category or property. */
inline wxPGId GetFirst() const
{
return m_pState->GetFirst();
}
/** Returns id of first visible item, whether it is a category or property.
Note that visible item means category, property, or sub-property which
user can see when control is scrolled properly. It does not only mean
items that are actually painted on the screen.
*/
inline wxPGId GetFirstVisible() const
{
wxPGProperty* p = NULL;
if ( m_pState->m_properties->GetCount() )
{
p = m_pState->m_properties->Item(0);
if ( (m_iFlags & wxPG_FL_HIDE_STATE) && p->m_flags & wxPG_PROP_HIDEABLE )
p = GetNeighbourItem ( p, true, 1 );
}
return wxPGIdGen(p);
}
/** Returns height of highest characters of used font. */
int GetFontHeight() const { return m_fontHeight; }
/** Returns pointer to itself. Dummy function that enables same kind
of code to use wxPropertyGrid and wxPropertyGridManager.
*/
wxPropertyGrid* GetGrid() { return this; }
/** Returns id of first category (from target page). */
inline wxPGId GetFirstCategory() const
{
return m_pState->GetFirstCategory();
}
/** Returns id of first property that is not a category. */
inline wxPGId GetFirstProperty()
{
return m_pState->GetFirstProperty();
}
/** Returns size of the custom paint image in front of property.
If no argument is given, returns preferred size.
*/
wxSize GetImageSize( wxPGId id = wxPGIdGen((wxPGProperty*)NULL) ) const;
/** Returns property (or category) at given y coordinate (relative to control's
top left).
*/
wxPGId GetItemAtY( int y ) { return wxPGIdGen(DoGetItemAtY(y)); }
/** Returns id of last item. Ignores categories and sub-properties.
*/
inline wxPGId GetLastProperty()
{
if ( !m_pState->m_properties->GetCount() ) return wxPGIdGen((wxPGProperty*)NULL);
wxPGProperty* p = GetLastItem(false, false);
if ( p->GetParentingType() > 0 )
return GetPrevProperty ( wxPGIdGen(p) );
return wxPGIdGen(p);
}
/** Returns id of last child of given property.
\remarks
Returns even sub-properties.
*/
inline wxPGId GetLastChild( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(wxNullProperty)
wxPGPropertyWithChildren* pwc = (wxPGPropertyWithChildren*) p;
if ( !pwc->GetParentingType() || !pwc->GetCount() ) return wxNullProperty;
return wxPGIdGen(pwc->Last());
}
inline wxPGId GetLastChild( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxNullProperty)
return GetLastChild( wxPGIdGen(p) );
}
/** Returns id of last visible item. Does <b>not</b> ignore categories sub-properties.
*/
inline wxPGId GetLastVisible()
{
return wxPGIdGen( GetLastItem (true, true) );
}
/** Returns colour of lines between cells. */
inline wxColour GetLineColour() const { return m_colLine; }
/** Returns background colour of margin. */
inline wxColour GetMarginColour() const { return m_colMargin; }
/** Returns id of next property. This does <b>not</b> iterate to sub-properties
or categories, unlike GetNextVisible.
*/
inline wxPGId GetNextProperty( wxPGId id )
{
return m_pState->GetNextProperty(id);
}
/** Returns id of next category after a given property (which does not have to be category). */
inline wxPGId GetNextCategory( wxPGId id ) const
{
return m_pState->GetNextCategory(id);
}
/** Returns id of next visible item.
Note that visible item means category, property, or sub-property which
user can see when control is scrolled properly. It does not only mean
items that are actually painted on the screen.
*/
inline wxPGId GetNextVisible( wxPGId property ) const
{
return wxPGIdGen ( GetNeighbourItem( wxPGIdToPtr(property),
true, 1 ) );
}
/** Returns id of previous property. Unlike GetPrevVisible, this skips categories
and sub-properties.
*/
inline wxPGId GetPrevProperty( wxPGId id )
{
return m_pState->GetPrevProperty(id);
}
/** Returns id of previous item under the same parent. */
inline wxPGId GetPrevSibling( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(wxNullProperty)
return wxPropertyGridState::GetPrevSibling(id);
}
inline wxPGId GetPrevSibling( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxNullProperty)
return wxPropertyGridState::GetPrevSibling(wxPGIdGen(p));
}
/** Returns id of previous visible property.
*/
inline wxPGId GetPrevVisible( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(wxNullProperty)
return wxPGIdGen( GetNeighbourItem( wxPGIdToPtr(id), true, -1 ) );
}
/** Returns id of property's nearest parent category. If no category
found, returns invalid wxPGId.
*/
inline wxPGId GetPropertyCategory( wxPGId id ) const
{
return wxPGIdGen( _GetPropertyCategory ( wxPGIdToPtr(id) ) );
}
inline wxPGId GetPropertyCategory( wxPGPropNameStr name ) const
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxNullProperty)
return _GetPropertyCategory(p);
}
/** Returns cell background colour of a property. */
wxColour GetPropertyBackgroundColour( wxPGId id ) const;
inline wxColour GetPropertyBackgroundColour( wxPGPropNameStr name ) const
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxColour())
return GetPropertyBackgroundColour(wxPGIdGen(p));
}
/** Returns cell background colour of a property. */
inline wxColour GetPropertyColour( wxPGId id ) const
{
return GetPropertyBackgroundColour( id );
}
inline wxColour GetPropertyColour( wxPGPropNameStr name ) const
{
return GetPropertyBackgroundColour( name );
}
/** Returns cell background colour of a property. */
wxColour GetPropertyTextColour( wxPGId id ) const;
inline wxColour GetPropertyTextColour( wxPGPropNameStr name ) const
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxColour())
return GetPropertyTextColour(wxPGIdGen(p));
}
/** Returns id of property with given label (case-sensitive). If there is no
property with such label, returned property id is invalid ( i.e. it will return
false with IsOk method). If there are multiple properties with identical name,
most recent added is returned.
*/
inline wxPGId GetPropertyByLabel( const wxString& name ) const
{
return m_pState->GetPropertyByLabel(name);
}
/** Returns "root property". It does not have name, etc. and it is not
visible. It is only useful for accessing its children.
*/
wxPGId GetRoot() const { return wxPGIdGen(m_pState->m_properties); }
/** Returns height of a single grid row (in pixels). */
int GetRowHeight() const { return m_lineHeight; }
inline wxPGId GetSelectedProperty () const { return GetSelection(); }
/** Returns currently selected property. */
inline wxPGId GetSelection() const
{
return wxPGIdGen(m_selected);
}
/** Returns current selection background colour. */
inline wxColour GetSelectionBackgroundColour() const { return m_colSelBack; }
/** Returns current selection text colour. */
inline wxColour GetSelectionForegroundColour() const { return m_colSelFore; }
/** Returns current splitter x position. */
inline int GetSplitterPosition() const { return m_splitterx; }
/** Returns a binary copy of the current property state.
NOTE: Too much work to implement, and uses would be few indeed.
*/
//wxPropertyGridState* GetCopyOfState() const;
/** Returns current vertical spacing. */
inline int GetVerticalSpacing() const { return (int)m_vspacing; }
/** Returns true if a property is selected. */
inline bool HasSelection() const { return ((m_selected!=(wxPGProperty*)NULL)?true:false); }
/** Hides all low priority properties. */
inline void HideLowPriority() { Compact ( true ); }
/** Inserts property to the list.
\param priorthis
New property is inserted just prior to this. Available only
in the first variant. There are two versions of this function
to allow this parameter to be either an id or name to
a property.
\param parent
New property is inserted under this category. Available only
in the second variant. There are two versions of this function
to allow this parameter to be either an id or name to
a property.
\param index
Index under category. Available only in the second variant.
If index is < 0, property is appended in category.
\param newproperty
Pointer to the inserted property. wxPropertyGrid will take
ownership of this object.
\return
Returns id for the property,
\remarks
- wxPropertyGrid takes the ownership of the property pointer.
While Append may be faster way to add items, make note that when
both data storages (categoric and
non-categoric) are active, Insert becomes even more slow. This is
especially true if current mode is non-categoric.
Example of use:
\code
// append category
wxPGId my_cat_id = propertygrid->Append( new wxPropertyCategoryClass (wxT("My Category")) );
...
// insert into category - using second variant
wxPGId my_item_id_1 = propertygrid->Insert( my_cat_id, 0, new wxStringProperty(wxT("My String 1")) );
// insert before to first item - using first variant
wxPGId my_item_id_2 = propertygrid->Insert ( my_item_id, new wxStringProperty(wxT("My String 2")) );
\endcode
*/
inline wxPGId Insert( wxPGId priorthis, wxPGProperty* newproperty )
{
wxPGId res = _Insert( wxPGIdToPtr( priorthis ), newproperty );
DrawItems( newproperty, (wxPGProperty*) NULL );
return res;
}
/** @link wxPropertyGrid::Insert Insert @endlink */
inline wxPGId Insert( wxPGPropNameStr name, wxPGProperty* newproperty )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxNullProperty)
wxPGId res = _Insert( (wxPGPropertyWithChildren*)p, newproperty );
DrawItems( newproperty, (wxPGProperty*) NULL );
return res;
}
/** @link wxPropertyGrid::Insert Insert @endlink */
inline wxPGId Insert( wxPGId id, int index, wxPGProperty* newproperty )
{
wxPGId res = _Insert( (wxPGPropertyWithChildren*)wxPGIdToPtr (id), index, newproperty );
DrawItems( newproperty, (wxPGProperty*) NULL );
return res;
}
/** @link wxPropertyGrid::Insert Insert @endlink */
inline wxPGId Insert( wxPGPropNameStr name, int index, wxPGProperty* newproperty )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(wxNullProperty)
wxPGId res = _Insert( (wxPGPropertyWithChildren*)p, index, newproperty );
DrawItems( newproperty, (wxPGProperty*) NULL );
return res;
}
inline wxPGId InsertCategory( wxPGId id, int index, const wxString& label, const wxString& name = wxPG_LABEL )
{
return Insert( id, index, new wxPropertyCategoryClass(label,name) );
}
#if wxPG_INCLUDE_BASICPROPS
/** @link wxPropertyGrid::Insert Insert @endlink */
inline wxPGId Insert( wxPGId id, int index, const wxString& label, const wxString& name, const wxString& value = wxEmptyString )
{
return Insert( id, index, wxStringProperty(label,name,value) );
}
/** @link wxPropertyGrid::Insert Insert @endlink */
inline wxPGId Insert( wxPGId id, int index, const wxString& label, const wxString& name, int value )
{
return Insert( id, index, wxIntProperty(label,name,value) );
}
/** @link wxPropertyGrid::Insert Insert @endlink */
inline wxPGId Insert( wxPGId id, int index, const wxString& label, const wxString& name, double value )
{
return Insert( id, index, wxFloatProperty(label,name,value) );
}
/** @link wxPropertyGrid::Insert Insert @endlink */
inline wxPGId Insert( wxPGId id, int index, const wxString& label, const wxString& name, bool value )
{
return Insert( id, index, wxBoolProperty(label,name,value) );
}
#endif
/** Returns true if any property has been modified by the user. */
inline bool IsAnyModified() const { return (m_pState->m_anyModified>0); }
/** Returns true if updating is frozen (ie. Freeze() called but not yet Thaw() ). */
inline bool IsFrozen() const { return (m_frozen>0)?true:false; }
/** Returns true if given property is selected. */
inline bool IsPropertySelected( wxPGId id ) const
{
wxPG_PROP_ID_CALL_PROLOG_RETVAL(false)
return ( m_selected == p ) ? true : false;
}
/** Returns true if given property is selected. */
inline bool IsPropertySelected( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return ( m_selected == p ) ? true : false;
}
/** Disables (limit = true) or enables (limit = false) wxTextCtrl editor of a property,
if it is not the sole mean to edit the value.
*/
void LimitPropertyEditing( wxPGId id, bool limit = true );
/** Disables (limit = true) or enables (limit = false) wxTextCtrl editor of a property,
if it is not the sole mean to edit the value.
*/
inline void LimitPropertyEditing( wxPGPropNameStr name, bool limit = true )
{
wxPG_PROP_NAME_CALL_PROLOG()
LimitPropertyEditing(wxPGIdGen(p),limit);
}
/** Moves splitter as left as possible, while still allowing all
labels to be shown in full.
\param subProps
If false, will still allow sub-properties (ie. properties which
parent is not root or category) to be cropped.
*/
void SetSplitterLeft( bool subProps = false );
/** Registers a new value type. Takes ownership of the object.
\retval
Pointer to the value type that should be used. If on with
the same name already existed, then the first one will be used,
and its pointer is returned instead.
*/
static wxPGValueType* RegisterValueType( wxPGValueType* valueclass, bool noDefCheck = false,
const wxString& className = wxEmptyString );
#ifndef SWIG
/** Registers a new editor class.
\retval
Pointer to the editor class instance that should be used.
*/
static wxPGEditor* RegisterEditorClass( wxPGEditor* editor, const wxString& name,
bool noDefCheck = false );
#endif
/** Resets all colours to the original system values.
*/
void ResetColours();
/** Changes keyboard shortcut to push the editor button.
\remarks
You can set default with keycode 0. Good value for the platform is guessed,
but don't expect it to be very accurate.
*/
void SetButtonShortcut( int keycode, bool ctrlDown = false, bool altDown = false );
/** Sets text colour of a category caption (but not it's children).
*/
void SetCaptionTextColour( wxPGId id, const wxColour& col );
inline void SetCaptionTextColour( wxPGPropNameStr name, const wxColour& col )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetCaptionTextColour( wxPGIdGen(p), col );
}
/** Sets the current category - Append will add non-categories under this one.
*/
inline void SetCurrentCategory( wxPGId id )
{
wxPG_PROP_ID_CALL_PROLOG()
wxPropertyCategoryClass* pc = (wxPropertyCategoryClass*)p;
#ifdef __WXDEBUG__
if ( pc ) wxASSERT( pc->GetParentingType() > 0 );
#endif
m_pState->m_currentCategory = pc;
}
/** Sets the current category - Append will add non-categories under this one.
*/
inline void SetCurrentCategory( wxPGPropNameStr name = wxEmptyString )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetCurrentCategory(wxPGIdGen(p));
}
/** Sets property attribute for all applicapple properties.
Be sure to use this method after all properties have been
added to the grid.
*/
void SetPropertyAttributeAll( int attrid, wxVariant value );
/** Sets background colour of property and all its children, recursively. Colours of
captions are not affected. Background brush cache is optimized for often
set colours to be set last.
\remarks
* Children which already have custom background colour are not affected.
*/
void SetPropertyBackgroundColour( wxPGId id, const wxColour& col );
inline void SetPropertyBackgroundColour( wxPGPropNameStr name, const wxColour& col )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyBackgroundColour( wxPGIdGen(p), col );
}
/** Sets background colour of property and all its children. Colours of
captions are not affected. Background brush cache is optimized for often
set colours to be set last.
NOTE: This function is deprecated. Use SetPropertyBackgroundColour.
*/
inline void SetPropertyColour( wxPGId id, const wxColour& col )
{
SetPropertyBackgroundColour( id, col );
}
inline void SetPropertyColour( wxPGPropNameStr name, const wxColour& col )
{
SetPropertyBackgroundColour( name, col );
}
/** Sets text colour of property and all its children.
\remarks
* Children which already have custom text colour are not affected.
*/
void SetPropertyTextColour( wxPGId id, const wxColour& col );
inline void SetPropertyTextColour( wxPGPropNameStr name, const wxColour& col )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyTextColour( wxPGIdGen(p), col );
}
/** Sets background and text colour of property and all its children to the default. */
void SetPropertyColourToDefault( wxPGId id );
inline void SetPropertyColourToDefault( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyColourToDefault( wxPGIdGen(p) );
}
/** Sets category caption background colour. */
void SetCaptionBackgroundColour(const wxColour& col);
/** Sets category caption text colour. */
void SetCaptionForegroundColour(const wxColour& col);
/** Sets default cell background colour - applies to property cells.
Note that appearance of editor widgets may not be affected.
*/
void SetCellBackgroundColour(const wxColour& col);
/** Sets cell text colour for disabled properties.
*/
void SetCellDisabledTextColour(const wxColour& col);
/** Sets default cell text colour - applies to property name and value text.
Note that appearance of editor widgets may not be affected.
*/
void SetCellTextColour(const wxColour& col);
/** Sets colour of lines between cells. */
void SetLineColour(const wxColour& col);
/** Sets background colour of margin. */
void SetMarginColour(const wxColour& col);
/** Sets selection background colour - applies to selected property name background. */
void SetSelectionBackground(const wxColour& col);
/** Sets selection foreground colour - applies to selected property name text. */
void SetSelectionForeground(const wxColour& col);
/** Sets x coordinate of the splitter. */
inline void SetSplitterPosition( int newxpos, bool refresh = true )
{
DoSetSplitterPosition(newxpos,refresh);
m_iFlags |= wxPG_FL_SPLITTER_PRE_SET;
}
/** Selects a property. Editor widget is automatically created, but
not focused unless focus is true. This will generate wxEVT_PG_SELECT event.
\param id
Id to property to select.
\retval
True if selection finished succesfully. Usually only fails if current
value in editor is not valid.
\sa wxPropertyGrid::Unselect
*/
inline bool SelectProperty( wxPGId id, bool focus = false )
{
return DoSelectProperty(wxPGIdToPtr(id),focus?wxPG_SEL_FOCUS:0);
}
inline bool SelectProperty( wxPGPropNameStr name, bool focus = false )
{
wxPG_PROP_NAME_CALL_PROLOG_RETVAL(false)
return DoSelectProperty(p,focus?wxPG_SEL_FOCUS:0);
}
/** Mostly useful for page switching.
*/
#ifndef SWIG
void SwitchState( wxPropertyGridState* pNewState );
#endif
/** Sets label of a property.
\remarks
This is the only way to set property's name. There is not
wxPGProperty::SetLabel() method.
*/
inline void SetPropertyLabel( wxPGId id, const wxString& newproplabel )
{
wxPG_PROP_ID_CALL_PROLOG()
_SetPropertyLabel( p, newproplabel );
}
/** Sets label of a property.
\remarks
This is the only way to set property's label. There is no
wxPGProperty::SetLabel() method.
*/
inline void SetPropertyLabel( wxPGPropNameStr name, const wxString& newproplabel )
{
wxPG_PROP_NAME_CALL_PROLOG()
_SetPropertyLabel( p, newproplabel );
}
/** Sets name of a property.
\param id
Id of a property.
\param newname
New name.
\remarks
This is the only way to set property's name. There is not
wxPGProperty::SetName() method.
*/
inline void SetPropertyName( wxPGId id, const wxString& newname )
{
DoSetPropertyName( wxPGIdToPtr(id), newname );
}
/** Sets name of a property.
\param name
Label of a property.
\param newname
New name.
\remarks
This is the only way to set property's name. There is not
wxPGProperty::SetName() method.
*/
inline void SetPropertyName( wxPGPropNameStr name, const wxString& newname )
{
wxPG_PROP_NAME_CALL_PROLOG()
DoSetPropertyName( p, newname );
}
/** Sets value (long integer) of a property.
*/
inline void SetPropertyValueLong( wxPGId id, long value )
{
SetPropertyValue( id, wxPG_VALUETYPE(long), wxPGVariantFromLong(value) );
}
#ifndef __WXPYTHON__
/** Sets value (integer) of a property.
*/
inline void SetPropertyValue( wxPGId id, int value )
{
SetPropertyValue( id, wxPG_VALUETYPE(long), wxPGVariantFromLong((long)value) );
}
#endif
/** Sets value (floating point) of a property.
*/
inline void SetPropertyValueDouble( wxPGId id, double value )
{
SetPropertyValue( id, wxPG_VALUETYPE(double), wxPGVariantFromDouble(value) );
}
/** Sets value (bool) of a property.
*/
inline void SetPropertyValueBool( wxPGId id, bool value )
{
SetPropertyValue( id, wxPG_VALUETYPE(bool), wxPGVariantFromLong(value?(long)1:(long)0) );
}
/** Sets value (wxString) of a property.
\remarks
This method uses wxPGProperty::SetValueFromString, which all properties
should implement. This means that there should not be a type error,
and instead the string is converted to property's actual value type.
*/
void SetPropertyValueString( wxPGId id, const wxString& value );
#ifndef __WXPYTHON__
inline void SetPropertyValue( wxPGId id, const wxChar* value )
{
SetPropertyValue(id,wxString(value));
}
#endif
/** Sets value (wxArrayString) of a property.
*/
inline void SetPropertyValueArrstr2( wxPGId id, const wxArrayString& value )
{
SetPropertyValue( id, wxPG_VALUETYPE(wxArrayString), wxPGVariantFromArrayString(value) );
}
/** Sets value (wxObject*) of a property.
*/
void SetPropertyValueWxObjectPtr( wxPGId id, wxObject* value );
#ifndef __WXPYTHON__
/** Sets value (void*) of a property. */
inline void SetPropertyValue( wxPGId id, void* value )
{
SetPropertyValue( id, wxPG_VALUETYPE(void), value );
}
inline void SetPropertyValue ( wxPGId id, wxObject& value )
{
SetPropertyValue(id,&value);
}
/** Sets value (wxVariant&) of a property. */
void SetPropertyValue( wxPGId id, wxVariant& value );
#endif
/** Sets value (wxPoint&) of a property.
*/
inline void SetPropertyValuePoint( wxPGId id, const wxPoint& value )
{
SetPropertyValue( id, wxT("wxPoint"), wxPGVariantCreator(value) );
}
/** Sets value (wxSize&) of a property.
*/
inline void SetPropertyValueSize( wxPGId id, const wxSize& value )
{
SetPropertyValue( id, wxT("wxSize"), wxPGVariantCreator(value) );
}
/** Sets value (wxLongLong&) of a property.
*/
inline void SetPropertyValueLongLong( wxPGId id, const wxLongLong& value )
{
SetPropertyValue( id, wxT("wxLongLong"), wxPGVariantCreator(value) );
}
/** Sets value (wxULongLong&) of a property.
*/
inline void SetPropertyValueULongLong( wxPGId id, const wxULongLong& value )
{
SetPropertyValue( id, wxT("wxULongLong"), wxPGVariantCreator(value) );
}
/** Sets value (wxArrayInt&) of a property.
*/
inline void SetPropertyValueArrint2( wxPGId id, const wxArrayInt& value )
{
SetPropertyValue( id, wxT("wxArrayInt"), wxPGVariantCreator(value) );
}
/** Sets value (wxDateTime&) of a property.
*/
#if wxUSE_DATETIME
inline void SetPropertyValueDatetime( wxPGId id, const wxDateTime& value )
{
SetPropertyValue( id, wxT("datetime"), value );
}
#endif
#ifdef __WXPYTHON__
inline void SetPropertyValuePyObject( wxPGId id, PyObject* value )
{
SetPropertyValue( id, wxT("PyObject"), wxPGVariantCreator(value) );
}
#endif
/** Sets value (long integer) of a property.
*/
inline void SetPropertyValueLong( wxPGPropNameStr name, long value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValue( wxPGIdGen(p), wxPG_VALUETYPE(long), wxPGVariantFromLong(value) );
}
#ifndef __WXPYTHON__
/** Sets value (integer) of a property. */
inline void SetPropertyValue( wxPGPropNameStr name, int value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValue( wxPGIdGen(p), wxPG_VALUETYPE(long), wxPGVariantFromLong(value) );
}
#endif
/** Sets value (floating point) of a property.
*/
inline void SetPropertyValueDouble( wxPGPropNameStr name, double value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValue( wxPGIdGen(p), wxPG_VALUETYPE(double), wxPGVariantFromDouble(value) );
}
/** Sets value (bool) of a property.
*/
inline void SetPropertyValueBool( wxPGPropNameStr name, bool value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValue( wxPGIdGen(p), wxPG_VALUETYPE(bool), wxPGVariantFromLong(value?(long)1:(long)0) );
}
/** Sets value (wxString) of a property. For properties which value type is
not string, calls wxPGProperty::SetValueFromString to translate the value.
*/
inline void SetPropertyValueString( wxPGPropNameStr name, const wxString& value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValueString( wxPGIdGen(p), value );
}
#ifndef __WXPYTHON__
/** Sets value (wxString) of a property. For properties which value type is
not string, calls wxPGProperty::SetValueFromString to translate the value.
*/
inline void SetPropertyValue( wxPGPropNameStr name, const wxChar* value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValue( wxPGIdGen(p), wxString(value) );
}
/** Sets value (void*) of a property. */
inline void SetPropertyValue( wxPGPropNameStr name, void* value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValue( wxPGIdGen(p), wxPG_VALUETYPE(void), value );
}
#endif
/** Sets value (wxObject*) of a property.
*/
inline void SetPropertyValueWxObjectPtr( wxPGPropNameStr name, wxObject* value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValueWxObjectPtr( wxPGIdGen(p), value );
}
#ifndef __WXPYTHON__
inline void SetPropertyValue( wxPGPropNameStr name, wxObject& value )
{
SetPropertyValue(name,&value);
}
/** Sets value (wxVariant&) of a property. */
void SetPropertyValue( wxPGPropNameStr name, wxVariant& value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValue( wxPGIdGen(p), value );
}
/** Sets value (wxArrayString) of a property. */
inline void SetPropertyValueArrstr2( wxPGPropNameStr name, const wxArrayString& value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValue( wxPGIdGen(p), wxPG_VALUETYPE(wxArrayString), wxPGVariantFromArrayString(value) );
}
/** Sets value (wxArrayInt&) of a property. */
inline void SetPropertyValueArrint2( wxPGPropNameStr name, const wxArrayInt& value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValueArrint2( wxPGIdGen(p), value );
}
#endif
/** Sets value (wxDateTime&) of a property.
*/
#if wxUSE_DATETIME
inline void SetPropertyValueDatetime( wxPGPropNameStr name, const wxDateTime& value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValueDatetime( wxPGIdGen(p), value );
}
#endif
/** Sets value (wxPoint&) of a property.
*/
inline void SetPropertyValuePoint( wxPGPropNameStr name, const wxPoint& value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValuePoint( wxPGIdGen(p), value );
}
/** Sets value (wxSize&) of a property.
*/
inline void SetPropertyValueSize( wxPGPropNameStr name, const wxSize& value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValueSize( wxPGIdGen(p), value );
}
/** Sets value (wxLongLong&) of a property.
*/
inline void SetPropertyValueLongLong( wxPGPropNameStr name, const wxLongLong& value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValueLongLong( wxPGIdGen(p), value );
}
/** Sets value (wxULongLong&) of a property.
*/
inline void SetPropertyValueULongLong( wxPGPropNameStr name, const wxULongLong& value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValueULongLong( wxPGIdGen(p), value );
}
#ifdef __WXPYTHON__
inline void SetPropertyValuePyObject( wxPGPropNameStr name, PyObject* value )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyValuePyObject( wxPGIdGen(p), value );
}
#endif
/** Sets property's value to unspecified. If it has children (it may be category),
then the same thing is done to them.
*/
void SetPropertyUnspecified( wxPGId id );
inline void SetPropertyUnspecified ( wxPGPropNameStr name )
{
wxPG_PROP_NAME_CALL_PROLOG()
SetPropertyUnspecified( wxPGIdGen(p) );
}
#ifndef SWIG
/** Sets various property values from a list of wxVariants. If property with
name is missing from the grid, new property is created under given default
category (or root if omitted).
*/
void SetPropertyValues( const wxVariantList& list, wxPGId default_category )
{
m_pState->SetPropertyValues(list,default_category);
}
inline void SetPropertyValues( const wxVariant& list, wxPGId default_category )
{
SetPropertyValues(list.GetList(),default_category);
}
inline void SetPropertyValues( const wxVariantList& list, const wxString& default_category = wxEmptyString )
{
SetPropertyValues(list,GetPropertyByNameI(default_category));
}
inline void SetPropertyValues( const wxVariant& list, const wxString& default_category = wxEmptyString )
{
SetPropertyValues(list.GetList(),GetPropertyByNameI(default_category));
}
#endif
/** Sets vertical spacing. Can be 1, 2, or 3 - a value relative to font
height. Value of 2 should be default on most platforms.
\remarks
On wxMSW, wxComboBox, when used as property editor widget, will spill
out with anything less than 3.
*/
inline void SetVerticalSpacing( int vspacing )
{
m_vspacing = (unsigned char)vspacing;
CalculateFontAndBitmapStuff( vspacing );
if ( !m_pState->m_itemsAdded ) Refresh();
}
/** Shows all low priority properties. */
inline void ShowLowPriority() { Compact ( false ); }
/** Shows an brief error message that is related to a property. */
inline void ShowPropertyError( wxPGId id, const wxString& msg )
{
wxPG_PROP_ID_CALL_PROLOG()
p->ShowError(msg);
}
inline void ShowPropertyError( wxPGPropNameStr name, const wxString& msg )
{
ShowPropertyError (GetPropertyByNameI(name), msg);
}
/** Sorts all items at all levels (except sub-properties). */
void Sort();
/** Sorts children of a category.
*/
void Sort( wxPGId id );
/** Sorts children of a category.
*/
inline void Sort( wxPGPropNameStr name )
{
Sort( GetPropertyByNameI(name) );
}
/** Overridden function.
\sa @link wndflags Additional Window Styles@endlink
*/
virtual void SetWindowStyleFlag( long style );
/** All properties added/inserted will have given priority by default.
\param
priority can be wxPG_HIGH (default) or wxPG_LOW.
*/
inline void SetDefaultPriority( int priority )
{
if ( priority == wxPG_LOW )
m_iFlags |= wxPG_FL_ADDING_HIDEABLES;
else
m_iFlags &= ~(wxPG_FL_ADDING_HIDEABLES);
}
/** Same as SetDefaultPriority(wxPG_HIGH). */
inline void ResetDefaultPriority()
{
SetDefaultPriority(wxPG_HIGH);
}
/** Property editor widget helper methods. */
//@{
/** Call when editor widget's contents is modified. For example, this is called
when changes text in wxTextCtrl (used in wxStringProperty and wxIntProperty).
\remarks
This should only be called by properties.
\sa @link wxPGProperty::OnEvent @endlink
*/
inline void EditorsValueWasModified() { m_iFlags |= wxPG_FL_VALUE_MODIFIED; }
/** Reverse of EditorsValueWasModified(). */
inline void EditorsValueWasNotModified()
{
m_iFlags &= ~(wxPG_FL_VALUE_MODIFIED);
}
/** Returns true if editor's value was marked modified. */
inline bool IsEditorsValueModified() const { return ( m_iFlags & wxPG_FL_VALUE_MODIFIED ) ? true : false; }
/** Shortcut for creating dialog-caller button. Used, for example, by wxFontProperty.
\remarks
This should only be called by properties.
*/
wxWindow* GenerateEditorButton( const wxPoint& pos, const wxSize& sz );
/** Fixes position of wxTextCtrl-like control (wxSpinCtrl usually
fits as one). Call after control has been created (but before
shown).
*/
void FixPosForTextCtrl( wxWindow* ctrl );
/** Shortcut for creating text editor widget.
\param pos
Same as pos given for CreateEditor.
\param sz
Same as sz given for CreateEditor.
\param value
Initial text for wxTextCtrl.
\param secondary
If right-side control, such as button, also created, then create it first
and pass it as this parameter.
\param extraStyle
Extra style flags to pass for wxTextCtrl.
\remarks
Note that this should generally be called only by new classes derived
from wxPGProperty.
*/
wxWindow* GenerateEditorTextCtrl( const wxPoint& pos,
const wxSize& sz,
const wxString& value,
wxWindow* secondary,
int extraStyle = 0,
int maxLen = 0 );
/* Generates both textctrl and button.
*/
wxWindow* GenerateEditorTextCtrlAndButton( const wxPoint& pos,
const wxSize& sz, wxWindow** psecondary, int limited_editing,
wxPGProperty* property );
/** Generates position for a widget editor dialog box.
\param p
Property for which dialog is positioned.
\param sz
Known or over-approximated size of the dialog.
\retval
Position for dialog.
*/
wxPoint GetGoodEditorDialogPosition( wxPGProperty* p,
const wxSize& sz );
// Converts escape sequences in src_str to newlines,
// tabs, etc. and copies result to dst_str.
static wxString& ExpandEscapeSequences( wxString& dst_str, wxString& src_str );
// Converts newlines, tabs, etc. in src_str to escape
// sequences, and copies result to dst_str.
static wxString& CreateEscapeSequences( wxString& dst_str, wxString& src_str );
/** Returns rectangle that fully contains properties between and including p1 and p2.
*/
wxRect GetPropertyRect( const wxPGProperty* p1, const wxPGProperty* p2 ) const;
/** Returns pointer to current active primary editor control (NULL if none).
If editor uses clipper window, pointer is returned to the actual editor, not the clipper.
*/
wxWindow* GetEditorControl() const;
inline wxWindow* GetPrimaryEditor() const
{
return m_wndPrimary;
}
/** Returns pointer to current active secondary editor control (NULL if none).
*/
inline wxWindow* GetEditorControlSecondary() const
{
return m_wndSecondary;
}
inline int IsNextEventIgnored() const
{
return m_ignoredEvents;
}
inline void IgnoreNextEvent()
{
m_ignoredEvents++;
}
inline void IgnoredEventPasses()
{
wxASSERT( m_ignoredEvents > 0 );
m_ignoredEvents--;
}
#ifdef __WXPYTHON__
// Dummy method to put wxRect type info into the wrapper
wxRect DummywxRectTypeInit() const { return wxRect(1,2,3,4); }
#endif
#ifndef SWIG
/** Generates contents for string dst based on the convetents of wxArrayString
src. Format will be <preDelim>str1<postDelim> <preDelim>str2<postDelim>
and so on. Set flags to 1 inorder to convert backslashes to double-back-
slashes and "<preDelims>"'s to "\<preDelims>".
*/
static void ArrayStringToString( wxString& dst, const wxArrayString& src,
wxChar preDelim, wxChar postDelim,
int flags );
/** Pass this function to Connect calls in propertyclass::CreateEditor.
*/
void OnCustomEditorEvent( wxCommandEvent &event );
/** Puts items into sl. Automatic wxGetTranslation is used if enabled. */
void SLAlloc ( unsigned int itemcount, const wxChar** items );
/** Returns sl. */
inline wxArrayString& SLGet() { return m_sl; }
//@}
inline long GetInternalFlags() const { return m_iFlags; }
inline void ClearInternalFlag( long flag ) { m_iFlags &= ~(flag); }
inline unsigned int GetBottomY() const { return m_bottomy; }
inline void SetBottomY( unsigned int y ) { m_bottomy = y; }
inline void IncFrozen() { m_frozen++; }
inline void DecFrozen() { m_frozen--; }
/** Call after a property modified internally.
selFlags are the same as with DoSelectProperty.
NB: Avoid using this method, if possible.
*/
void PropertyWasModified( wxPGProperty* p, int selFlags = 0 );
void OnComboItemPaint( wxPGCustomComboControl* pCb,int item,wxDC& dc,
wxRect& rect,int flags );
// Used by simple check box for keyboard navigation
void SendNavigationKeyEvent( int dir );
#if 0
/* Creates choices for labels and values, or returns existing choices which
point to the same memory.
*/
static wxPGChoices* CreateChoicesArray(const wxChar** labels,
const long* values,
int itemcount);
/* Creates choices for labels and values, or returns existing choices which
point to the same memory (*only* if acceptLabelsAsId=true).
*/
static wxPGChoices* CreateChoicesArray(const wxArrayString& labels,
const wxArrayInt& values = wxPG_EMPTY_ARRAYINT,
bool acceptLabelsAsId = false);
/* Creates choices for labels and values in wxPGChoices, or returns existing
choices which is identical.
*/
static wxPGChoices* CreateChoicesArray(wxPGChoices& choices);
#ifdef __WXDEBUG__
// Displays what dynamic arrays are allocated
static void DumpAllocatedChoiceSets();
#endif
#endif // #if 0
/** Standardized double-to-string conversion.
*/
static void DoubleToString( wxString& target,
double value,
int precision,
bool removeZeroes,
wxString* precTemplate );
protected:
/** wxPropertyGridState used by the grid is created here. If grid is used
in wxPropertyGridManager, there is no point overriding this - instead,
set custom wxPropertyGridPage classes.
*/
virtual wxPropertyGridState* CreateState() const;
#ifndef DOXYGEN
public:
// Control font changer helper.
void SetCurControlBoldFont();
//
// Public methods for semi-public use
// (not protected for optimization)
//
bool DoSelectProperty( wxPGProperty* p, unsigned int flags = 0 );
// Usually called internally after items added/deleted.
void CalculateYs( wxPGPropertyWithChildren* startparent, int startindex );
// Overridden functions.
virtual bool Destroy();
virtual wxSize DoGetBestSize() const;
virtual void Refresh( bool eraseBackground = true,
const wxRect *rect = (const wxRect *) NULL );
virtual bool SetFont( const wxFont& font );
#if wxPG_SUPPORT_TOOLTIPS
void SetToolTip( const wxString& tipString );
#endif
virtual void Freeze();
virtual void SetExtraStyle( long exStyle );
virtual void Thaw();
protected:
/** 1 if calling property event handler. */
unsigned char m_processingEvent;
#ifndef wxPG_ICON_WIDTH
wxBitmap *m_expandbmp, *m_collbmp;
#endif
wxCursor *m_cursorSizeWE;
/** wxWindow pointers to editor control(s). */
wxWindow *m_wndPrimary;
wxWindow *m_wndSecondary;
#if wxPG_DOUBLE_BUFFER
wxBitmap *m_doubleBuffer;
#endif
wxArrayPtrVoid *m_windowsToDelete;
/** Local time ms when control was created. */
wxLongLong m_timeCreated;
/** Indicates bottom of drawn and clickable area on the control. Updated
by CalculateYs. */
unsigned int m_bottomy;
/** Extra Y spacing between the items. */
int m_spacingy;
/** Control client area width; updated on resize. */
int m_width;
/** Control client area height; updated on resize. */
int m_height;
/** Non-client width (auto-centering helper). */
int m_fWidth;
/** List of currently visible properties. */
wxPGArrayProperty m_arrVisible;
/** Previously recorded scroll start position. */
int m_prevVY;
/** Necessary so we know when to re-calculate visibles on resize. */
int m_calcVisHeight;
/** The gutter spacing in front and back of the image. This determines the amount of spacing in front
of each item */
int m_gutterWidth;
/** Includes separator line. */
int m_lineHeight;
/** Gutter*2 + image width. */
int m_marginWidth;
int m_buttonSpacingY; // y spacing for expand/collapse button.
/** Extra margin for expanded sub-group items. */
int m_subgroup_extramargin;
/** The image width of the [+] icon. This is also calculated in the gutter */
int m_iconWidth;
#ifndef wxPG_ICON_WIDTH
/** The image height of the [+] icon. This is calculated as minimal size and to align */
int m_iconHeight;
#endif
/** Current cursor id. */
int m_curcursor;
/** This captionFont is made equal to the font of the wxScrolledWindow. As extra the bold face
is set on it when this is wanted by the user (see flags) */
wxFont m_captionFont;
#if !wxPG_HEAVY_GFX
int m_splitterprevdrawnx;
/** Pen used to draw splitter column when it is being dragged. */
wxPen m_splitterpen;
#endif
int m_fontHeight; // Height of the font.
int m_pushButKeyCode; // Base keycode for triggering push button.
//
// Temporary values
//
/** m_splitterx when drag began. */
int m_startingSplitterX;
/** Bits are used to indicate which colours are customized. */
unsigned short m_coloursCustomized;
/** 0 = not dragging, 1 = drag just started, 2 = drag in progress */
unsigned char m_dragStatus;
/** x - m_splitterx. */
signed char m_dragOffset;
/** 0 = margin, 1 = label, 2 = value. */
unsigned char m_mouseSide;
/** True when editor control is focused. */
unsigned char m_editorFocused;
/** 1 if m_latsCaption is also the bottommost caption. */
//unsigned char m_lastCaptionBottomnest;
/** Set to 1 when graphics frozen. */
unsigned char m_frozen;
unsigned char m_vspacing;
unsigned char m_pushButKeyCodeNeedsAlt; // Does triggering push button need Alt down?
unsigned char m_pushButKeyCodeNeedsCtrl; // Does triggering push button need Ctrl down?
unsigned char m_keyComboConsumed; // Used to track when Alt/Ctrl+Key was consumed.
unsigned char m_ignoredEvents; // Number of EVT_TEXT-style events to ignore.
/** Internal flags - see wxPG_FL_XXX constants. */
wxUint32 m_iFlags;
/** When drawing next time, clear this many item slots at the end. */
int m_clearThisMany;
/** Pointer to selected property. Note that this is duplicated in
m_state for better transiency between pages so that the selected
item can be retained.
*/
wxPGProperty* m_selected;
wxPGProperty* m_propHover; // pointer to property that has mouse on itself
wxWindow* m_eventObject; // EventObject for wxPropertyGridEvents
wxWindow* m_curFocused; // What (global) window is currently focused
// (needed to resolve event handling mess).
wxEvtHandler* m_tlwHandler; // wxPGTLWHandler
wxWindow* m_tlp; // Top level parent
int m_splitterx; // x position for the vertical line dividing name and value
float m_fSplitterX; // accurate splitter position
int m_ctrlXAdjust; // x relative to splitter (needed for resize).
wxColour m_colLine; // lines between cells
wxColour m_colPropFore; // property labels and values are written in this colour
wxColour m_colDisPropFore; // or with this colour when disabled
wxColour m_colPropBack; // background for m_colPropFore
wxColour m_colCapFore; // text color for captions
wxColour m_colCapBack; // background color for captions
wxColour m_colSelFore; // foreground for selected property
wxColour m_colSelBack; // background for selected property (actually use background color when control out-of-focus)
wxColour m_colMargin; // background colour for margin
// NB: These *cannot* be moved to globals.
wxArrayPtrVoid m_arrBgBrushes; // Array of background colour brushes.
wxArrayPtrVoid m_arrFgCols; // Array of foreground colours.
wxArrayString m_sl; // string control helper
protected:
// Sets some members to defaults (called constructors).
void Init1();
// Initializes some members (called by Create and complex constructor).
void Init2();
void OnPaint(wxPaintEvent &event );
// main event receivers
void OnMouseMove( wxMouseEvent &event );
void OnMouseClick( wxMouseEvent &event );
void OnMouseRightClick( wxMouseEvent &event );
void OnMouseDoubleClick( wxMouseEvent &event );
void OnMouseUp( wxMouseEvent &event );
void OnKey( wxKeyEvent &event );
void OnKeyUp( wxKeyEvent &event );
void OnNavigationKey( wxNavigationKeyEvent& event );
void OnResize( wxSizeEvent &event );
// event handlers
bool HandleMouseMove( int x, unsigned int y, wxMouseEvent &event );
bool HandleMouseClick( int x, unsigned int y, wxMouseEvent &event );
bool HandleMouseRightClick( int x, unsigned int y, wxMouseEvent &event );
bool HandleMouseDoubleClick( int x, unsigned int y, wxMouseEvent &event );
bool HandleMouseUp( int x, unsigned int y, wxMouseEvent &event );
void HandleKeyEvent( wxKeyEvent &event );
bool HandleChildKey( wxKeyEvent& event, bool canDestroy ); // Handle TAB and ESCAPE in control
void OnMouseEntry( wxMouseEvent &event );
void OnIdle( wxIdleEvent &event );
void OnFocusEvent( wxFocusEvent &event );
void OnChildFocusEvent( wxChildFocusEvent& event );
bool OnMouseCommon( wxMouseEvent &event, int* px, int *py );
bool OnMouseChildCommon( wxMouseEvent &event, int* px, int *py );
// sub-control event handlers
void OnMouseClickChild( wxMouseEvent &event );
void OnMouseRightClickChild( wxMouseEvent &event );
void OnMouseMoveChild( wxMouseEvent &event );
void OnMouseUpChild( wxMouseEvent &event );
void OnChildKeyDown( wxKeyEvent &event );
void OnChildKeyUp( wxKeyEvent &event );
//void OnFocusChild( wxFocusEvent &event );
void OnCaptureChange( wxMouseCaptureChangedEvent &event );
void OnScrollEvent( wxScrollWinEvent &event );
void OnSysColourChanged( wxSysColourChangedEvent &event );
protected:
/** Adjust the centering of the bitmap icons (collapse / expand) when the caption font changes. They need to
be centered in the middle of the font, so a bit of deltaY adjustment is needed.
On entry, m_captionFont must be set to window font. It will be modified properly.
*/
void CalculateFontAndBitmapStuff( int vspacing );
inline wxRect GetEditorWidgetRect( wxPGProperty* p );
void CorrectEditorWidgetSizeX( int newSplitterx, int newWidth );
#ifdef __WXDEBUG__
void _log_items();
void OnScreenNote( const wxChar* format, ... );
#endif
void DoDrawItems( wxDC& dc,
const wxPGProperty* first_item,
const wxPGProperty* last_item,
const wxRect* clip_rect );
void DoDrawItems2( wxDC& dc,
const wxPGProperty* first_item,
const wxPGProperty* last_item,
const wxRect* clip_rect ) const;
virtual void RefreshProperty( wxPGProperty* p );
/** Draws items from topitemy to bottomitemy */
void DrawItems( wxDC& dc, unsigned int topitemy, unsigned int bottomitemy,
const wxRect* clip_rect = (const wxRect*) NULL );
void DrawItems( const wxPGProperty* p1, const wxPGProperty* p2 );
// In addition to calling DoDrawItems directly, this is the
// only alternative for using wxClientDC - others just call
// RefreshRect.
void DrawItem( wxDC& dc, wxPGProperty* p );
inline void DrawItem( wxPGProperty* p )
{
DrawItems(p,p);
}
virtual void DrawItemAndChildren( wxPGProperty* p );
/** Draws item, children, and consequtive parents as long as category is not met. */
void DrawItemAndValueRelated( wxPGProperty* p );
/** Returns property reference for given property id. */
inline wxPGProperty& GetPropertyById( wxPGId id )
{
return *wxPGIdToPtr(id);
}
static wxPropertyCategoryClass* _GetPropertyCategory( wxPGProperty* p );
void ImprovedClientToScreen( int* px, int* py );
wxPGId _Insert( wxPGProperty* priorthis, wxPGProperty* newproperty );
inline wxPGId _Insert( wxPGPropertyWithChildren* parent, int index, wxPGProperty* newproperty )
{
return m_pState->DoInsert(parent,index,newproperty);
}
// Called by focus event handlers. newFocused is the window that becomes focused.
void HandleFocusChange( wxWindow* newFocused );
/** Reloads all non-customized colours from system settings. */
void RegainColours();
bool DoEditorValidate();
wxPGProperty* DoGetItemAtY( int y );
inline wxPGProperty* DoGetItemAtY_Full( int y )
{
wxASSERT( y >= 0 );
if ( (unsigned int)y >= m_bottomy )
return NULL;
return m_pState->m_properties->GetItemAtY ( y, m_lineHeight );
}
void DoPropertyChanged( wxPGProperty* p, unsigned int selFlags = 0 );
void DoSetSplitterPosition( int newxpos, bool refresh = true );
void FreeEditors();
wxPGProperty* GetLastItem( bool need_visible, bool allow_subprops = true );
void CalculateVisibles( int vy, bool full_recalc );
bool _Expand( wxPGProperty* p, bool sendEvent = false );
bool _Collapse( wxPGProperty* p, bool sendEvent = false );
/** Forces updating the value of property from the editor control.
Returns true if DoPropertyChanged was actually called.
*/
bool CommitChangesFromEditor( wxUint32 flags = 0 );
// Returns nearest paint visible property (such that will be painted unless
// window is scrolled or resized). If given property is paint visible, then
// it itself will be returned.
wxPGProperty* GetNearestPaintVisible( wxPGProperty* p );
/*#ifdef __WXMSW__
virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle) const;
#endif*/
static void RegisterDefaultEditors();
static void RegisterDefaultValues();
// Sets m_bgColIndex to this property and all its children.
void SetBackgroundColourIndex( wxPGProperty* p, int index, int flags );
// Sets m_fgColIndex to this property and all its children.
void SetTextColourIndex( wxPGProperty* p, int index, int flags );
int CacheColour( const wxColour& colour );
void _SetPropertyLabel( wxPGProperty* p, const wxString& newproplabel );
void DoSetPropertyName( wxPGProperty* p, const wxString& newname );
void SetPropertyValue( wxPGId id, const wxPGValueType* typeclass, const wxPGVariant& value );
void SetPropertyValue( wxPGId id, const wxChar* typestring, const wxPGVariant& value );
// Setups event handling for child control
void SetupEventHandling( wxWindow* wnd, int id );
void CustomSetCursor( int type, bool override = false );
void RecalculateVirtualSize();
void PGAdjustScrollbars( int y );
inline bool UsesAutoUnspecified() const
{
return ( GetExtraStyle() & wxPG_EX_AUTO_UNSPECIFIED_VALUES ) ? true : false;
}
/** When splitter is dragged to a new position, this is drawn. */
void DrawSplitterDragColumn( wxDC& dc, int x );
/** If given index is -1, scans for item to either up (dir=0) or down (dir!=0) */
//int GetNearestValidItem ( int index, int dir );
wxPGProperty* GetNeighbourItem( wxPGProperty* item, bool need_visible,
int dir ) const;
void PrepareAfterItemsAdded();
void SendEvent( int eventType, wxPGProperty* p, unsigned int selFlags = 0 );
bool SetPropertyPriority( wxPGProperty* p, int priority );
private:
bool ButtonTriggerKeyTest( wxKeyEvent &event );
#endif // DOXYGEN_SHOULD_SKIP_THIS
private:
DECLARE_EVENT_TABLE()
#endif // #ifndef SWIG
};
#undef wxPG_USE_STATE
// -----------------------------------------------------------------------
//
// Bunch of inlines that need to resolved after all classes have been defined.
//
#ifndef SWIG
inline bool wxPropertyGridState::IsDisplayed() const
{
return ( this == m_pPropGrid->GetState() );
}
#endif
inline void wxPGProperty::SetEditor( const wxString& editorName )
{
EnsureDataExt();
m_dataExt->m_customEditor = wxPropertyContainerMethods::GetEditorByName(editorName);
}
inline bool wxPGProperty::Hide( bool hide )
{
return GetGrid()->HideProperty(wxPGIdGen(this),hide);
}
inline bool wxPGProperty::SetMaxLength( int maxLen )
{
return GetGrid()->SetPropertyMaxLength(wxPGIdGen(this),maxLen);
}
#if !wxPG_ID_IS_PTR
inline const wxString& wxPGId::GetName() const
{
return m_ptr->GetName();
}
#endif
// -----------------------------------------------------------------------
/** \class wxPropertyGridEvent
\ingroup classes
\brief A propertygrid event holds information about events associated with
wxPropertyGrid objects.
<h4>Derived from</h4>
wxNotifyEvent\n
wxCommandEvent\n
wxEvent\n
wxObject\n
<h4>Include files</h4>
<wx/propertygrid/propertygrid.h>
*/
class WXDLLIMPEXP_PG wxPropertyGridEvent : public wxCommandEvent
{
public:
/** Constructor. */
wxPropertyGridEvent(wxEventType commandType=0, int id=0);
#ifndef SWIG
/** Copy constructor. */
wxPropertyGridEvent(const wxPropertyGridEvent& event);
#endif
/** Destructor. */
~wxPropertyGridEvent();
/** Copyer. */
virtual wxEvent* Clone() const;
/** Enables property. */
inline void EnableProperty( bool enable = true )
{
m_pg->EnableProperty(wxPGIdGen(m_property),enable);
}
/** Disables property. */
inline void DisableProperty()
{
m_pg->EnableProperty(wxPGIdGen(m_property),false);
}
inline wxPGId GetMainParent() const
{
wxASSERT(m_property);
return wxPGIdGen(m_property->GetMainParent());
}
/** Returns id of associated property. */
wxPGId GetProperty() const
{
return wxPGIdGen(m_property);
}
#ifndef SWIG
/** Returns pointer to associated property. */
wxPGProperty* GetPropertyPtr() const
{
return m_property;
}
#endif
/** Returns label of associated property. */
const wxString& GetPropertyLabel() const
{
wxASSERT( m_property );
return m_property->GetLabel();
}
/** Returns name of associated property. */
const wxString& GetPropertyName() const
{
wxASSERT( m_property );
return m_property->GetName();
}
#if wxPG_USE_CLIENT_DATA
/** Returns client data of relevant property. */
wxPGProperty::ClientDataType GetPropertyClientData() const
{
wxASSERT( m_property );
return m_property->GetClientData();
}
#endif
#ifndef SWIG
/** Returns value of relevant property. */
wxVariant GetPropertyValue() const
{
wxASSERT( m_property );
return m_property->GetValueAsVariant();
}
inline wxString GetPropertyValueAsString() const
{
return m_pg->GetPropertyValueAsString( wxPGIdGen(m_property) );
}
inline long GetPropertyValueAsLong() const
{
return m_pg->GetPropertyValueAsLong( wxPGIdGen(m_property) );
}
inline int GetPropertyValueAsInt() const
{
return (int)GetPropertyValueAsLong();
}
inline long GetPropertyValueAsBool() const
{
return m_pg->GetPropertyValueAsBool( wxPGIdGen(m_property) );
}
inline double GetPropertyValueAsDouble() const
{
return m_pg->GetPropertyValueAsDouble( wxPGIdGen(m_property) );
}
inline const wxObject* GetPropertyValueAsWxObjectPtr() const
{
return m_pg->GetPropertyValueAsWxObjectPtr( wxPGIdGen(m_property) );
}
inline void* GetPropertyValueAsVoidPtr() const
{
return m_pg->GetPropertyValueAsVoidPtr( wxPGIdGen(m_property) );
}
#if !wxPG_PGVARIANT_IS_VARIANT
inline const wxArrayString& GetPropertyValueAsArrayString() const
{
return m_pg->GetPropertyValueAsArrayString( wxPGIdGen(m_property) );
}
inline const wxPoint& GetPropertyValueAsPoint() const
{
return m_pg->GetPropertyValueAsPoint( wxPGIdGen(m_property) );
}
inline const wxSize& GetPropertyValueAsSize() const
{
return m_pg->GetPropertyValueAsSize( wxPGIdGen(m_property) );
}
inline const wxArrayInt& GetPropertyValueAsArrayInt() const
{
return m_pg->GetPropertyValueAsArrayInt( wxPGIdGen(m_property) );
}
#else
inline wxArrayString GetPropertyValueAsArrayString() const
{
return m_pg->GetPropertyValueAsArrayString( wxPGIdGen(m_property) );
}
inline wxPoint GetPropertyValueAsPoint() const
{
return m_pg->GetPropertyValueAsPoint( wxPGIdGen(m_property) );
}
inline wxSize GetPropertyValueAsSize() const
{
return m_pg->GetPropertyValueAsSize( wxPGIdGen(m_property) );
}
inline wxArrayInt GetPropertyValueAsArrayInt() const
{
return m_pg->GetPropertyValueAsArrayInt( wxPGIdGen(m_property) );
}
#endif
/** Returns value type of relevant property. */
const wxPGValueType* GetPropertyValueType() const
{
return m_property->GetValueTypePtr();
}
#else
%pythoncode {
def GetPropertyValue(self):
return self.GetProperty().GetValue()
}
#endif
/** Returns true if event has associated property. */
inline bool HasProperty() const { return ( m_property != (wxPGProperty*) NULL ); }
inline bool IsPropertyEnabled() const
{
return m_pg->IsPropertyEnabled(wxPGIdGen(m_property));
}
#ifndef SWIG
// IsPending() == true, if sent using AddPendingEvent
inline void SetPending( bool pending ) { m_pending = pending; }
inline bool IsPending() const { return m_pending; }
#if !wxPG_ID_IS_PTR
/** Changes the associated property. */
void SetProperty( wxPGId id ) { m_property = wxPGIdToPtr(id); }
#endif
/** Changes the associated property. */
void SetProperty( wxPGProperty* p ) { m_property = p; }
void SetPropertyGrid( wxPropertyGrid* pg ) { m_pg = pg; }
private:
DECLARE_DYNAMIC_CLASS(wxPropertyGridEvent)
wxPGProperty* m_property;
wxPropertyGrid* m_pg;
bool m_pending;
#endif
};
#define wxPG_BASE_EVT_PRE_ID 1775
#ifndef SWIG
BEGIN_DECLARE_EVENT_TYPES()
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PG, wxEVT_PG_SELECTED, wxPG_BASE_EVT_PRE_ID)
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PG, wxEVT_PG_CHANGED, wxPG_BASE_EVT_PRE_ID+1)
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PG, wxEVT_PG_HIGHLIGHTED, wxPG_BASE_EVT_PRE_ID+2)
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PG, wxEVT_PG_RIGHT_CLICK, wxPG_BASE_EVT_PRE_ID+3)
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PG, wxEVT_PG_PAGE_CHANGED, wxPG_BASE_EVT_PRE_ID+4)
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PG, wxEVT_PG_ITEM_COLLAPSED, wxPG_BASE_EVT_PRE_ID+5)
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PG, wxEVT_PG_ITEM_EXPANDED, wxPG_BASE_EVT_PRE_ID+6)
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PG, wxEVT_PG_DOUBLE_CLICK, wxPG_BASE_EVT_PRE_ID+7)
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PG, wxEVT_PG_COMPACT_MODE_ENTERED, wxPG_BASE_EVT_PRE_ID+8)
DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_PG, wxEVT_PG_EXPANDED_MODE_ENTERED, wxPG_BASE_EVT_PRE_ID+9)
END_DECLARE_EVENT_TYPES()
#else
enum {
wxEVT_PG_SELECTED = wxPG_BASE_EVT_PRE_ID,
wxEVT_PG_CHANGED,
wxEVT_PG_HIGHLIGHTED,
wxEVT_PG_RIGHT_CLICK,
wxEVT_PG_PAGE_CHANGED,
wxEVT_PG_ITEM_COLLAPSED,
wxEVT_PG_ITEM_EXPANDED,
wxEVT_PG_DOUBLE_CLICK,
wxEVT_PG_COMPACT_MODE_ENTERED,
wxEVT_PG_EXPANDED_MODE_ENTERED
};
#endif
#define wxPG_BASE_EVT_TYPE wxEVT_PG_SELECTED
#define wxPG_MAX_EVT_TYPE (wxPG_BASE_EVT_TYPE+30)
#ifndef SWIG
typedef void (wxEvtHandler::*wxPropertyGridEventFunction)(wxPropertyGridEvent&);
#define EVT_PG_SELECTED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_SELECTED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
#define EVT_PG_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
#define EVT_PG_HIGHLIGHTED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_HIGHLIGHTED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
#define EVT_PG_RIGHT_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_RIGHT_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
#define EVT_PG_DOUBLE_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_DOUBLE_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
#define EVT_PG_PAGE_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_PAGE_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
#define EVT_PG_ITEM_COLLAPSED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_COLLAPSED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
#define EVT_PG_ITEM_EXPANDED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_EXPANDED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
#define EVT_PG_COMPACT_MODE_ENTERED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COMPACT_MODE_ENTERED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
#define EVT_PG_EXPANDED_MODE_ENTERED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_EXPANDED_MODE_ENTERED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxPropertyGridEventFunction, & fn ), (wxObject *) NULL ),
#define wxPropertyGridEventHandler(A) ((wxObjectEventFunction)(wxEventFunction)(wxPropertyGridEventFunction)&A)
#endif
// -----------------------------------------------------------------------
/** \class wxPropertyGridPopulator
\ingroup classes
\brief Allows populating wxPropertyGrid from arbitrary text source.
*/
class WXDLLIMPEXP_PG wxPropertyGridPopulator
{
public:
/** Constructor.
\param pg
Property grid to populate.
\param popRoot
Base parent property. Default is root.
*/
inline wxPropertyGridPopulator(wxPropertyGrid* pg = (wxPropertyGrid*) NULL,
wxPGId popRoot = wxNullProperty)
{
Init(pg, popRoot);
}
/** Destructor. */
~wxPropertyGridPopulator();
/** Adds a new set of choices with given id, labels and optional values.
\remarks
choicesId can be any id unique in source (so it does not conflict
with sets of choices created before population process).
*/
void AddChoices(wxPGChoicesId choicesId,
const wxArrayString& choiceLabels,
const wxArrayInt& choiceValues = wxPG_EMPTY_ARRAYINT);
/** Appends a property under current parent.
\param classname
Class name of a property. Understands both wxXXXProperty
and XXX style names. Thus, for example, wxStringProperty
could be created with class names "wxStringProperty", and
"String". Short class name of wxPropertyCategory is
"Category".
\param label
Label for property. Use as in constructor functions.
\param name
Name for property. Use as in constructor functions.
\param value
Value for property is interpreted from this string.
\param attributes
Attributes of a property (both pseudo-attributes like
"Disabled" and "Modified" in addition to real ones
like "Precision") are read from this string. Is intended
for string like one generated by GetPropertyAttributes.
\param choicesId
If non-zero: Id for set of choices unique in source. Pass
either id previously given to AddChoices or a new one.
If new is given, then choiceLabels and choiceValues are
loaded as the contents for the newly created set of choices.
\param choiceLabels
List of choice labels.
\param choiceValues
List of choice values.
*/
wxPGId AppendByClass(const wxString& classname,
const wxString& label,
const wxString& name = wxPG_LABEL,
const wxString& value = wxEmptyString,
const wxString& attributes = wxEmptyString,
wxPGChoicesId choicesId = (wxPGChoicesId)0,
const wxArrayString& choiceLabels = wxPG_EMPTY_ARRAYSTRING,
const wxArrayInt& choiceValues = wxPG_EMPTY_ARRAYINT);
/** Appends a property under current parent. Works just as
AppendByClass, except accepts value type name instead of
class name (value type name of a property can be queried using
wxPropertyGrid::GetPropertyValueType(property)->GetType()).
\remarks
<b>Cannot</b> generate property category.
*/
wxPGId AppendByType(const wxString& valuetype,
const wxString& label,
const wxString& name = wxPG_LABEL,
const wxString& value = wxEmptyString,
const wxString& attributes = wxEmptyString,
wxPGChoicesId choicesId = (wxPGChoicesId)0,
const wxArrayString& choiceLabels = wxPG_EMPTY_ARRAYSTRING,
const wxArrayInt& choiceValues = wxPG_EMPTY_ARRAYINT);
/** Returns id of parent property for which children can currently be added. */
inline wxPGId GetCurrentParent() const
{
return m_curParent;
}
/** Returns true if set of choices with given id has already been added. */
bool HasChoices( wxPGChoicesId id ) const;
/** Sets the property grid to be populated. */
inline void SetGrid( wxPropertyGrid* pg )
{
m_propGrid = pg;
}
/** If possible, sets the property last added as current parent. */
bool BeginChildren();
/** Terminates current parent - sets its parent as the new current parent. */
inline void EndChildren()
{
wxASSERT( wxPGIdIsOk(m_curParent) );
m_curParent = wxPGIdGen(wxPGIdToPtr(m_curParent)->GetParent());
m_lastProperty = wxPGIdGen((wxPGProperty*)NULL);
}
protected:
wxPGId DoAppend(wxPGProperty* p,
const wxString& value,
const wxString& attributes,
wxPGChoicesId choicesId,
const wxArrayString& choiceLabels,
const wxArrayInt& choiceValues);
void Init( wxPropertyGrid* pg, wxPGId popRoot );
/** Used property grid. */
wxPropertyGrid* m_propGrid;
/** Population root. */
wxPGId m_popRoot;
/** Parent of currently added properties. */
wxPGId m_curParent;
/** Id of property last added. */
wxPGId m_lastProperty;
/** Hashmap for source-choices-id to wxPGChoicesData mapping. */
wxPGHashMapP2P m_dictIdChoices;
};
// -----------------------------------------------------------------------
//
// Undefine macros that are not needed outside propertygrid sources
//
#ifndef __wxPG_SOURCE_FILE__
#undef wxPG_FL_DESC_REFRESH_REQUIRED
#undef wxPG_FL_SCROLLBAR_DETECTED
#undef wxPG_FL_CREATEDSTATE
#undef wxPG_FL_NOSTATUSBARHELP
#undef wxPG_FL_SCROLLED
#undef wxPG_FL_HIDE_STATE
#undef wxPG_FL_FOCUS_INSIDE_CHILD
#undef wxPG_FL_FOCUS_INSIDE
#undef wxPG_FL_MOUSE_INSIDE_CHILD
#undef wxPG_FL_CUR_USES_CUSTOM_IMAGE
#undef wxPG_FL_PRIMARY_FILLS_ENTIRE
#undef wxPG_FL_VALUE_MODIFIED
#undef wxPG_FL_MOUSE_INSIDE
#undef wxPG_FL_FOCUSED
#undef wxPG_FL_MOUSE_CAPTURED
#undef wxPG_FL_INITIALIZED
#undef wxPG_FL_ACTIVATION_BY_CLICK
#undef wxPG_FL_DONT_CENTER_SPLITTER
#undef wxPG_SUPPORT_TOOLTIPS
#undef wxPG_DOUBLE_BUFFER
#undef wxPG_HEAVY_GFX
#undef wxPG_ICON_WIDTH
#undef wxPG_USE_RENDERER_NATIVE
// Following are needed by the manager headers
// #undef wxPGIdGen
// #undef wxPGPropNameStr
// #undef wxPGIdToPtr
#endif
// Doxygen special
#ifdef DOXYGEN
#include "manager.h"
#endif
// -----------------------------------------------------------------------
#endif // __WX_PROPGRID_PROPGRID_H__