#if wxUSE_PROPGRID
+#include "wx/thread.h"
#include "wx/dcclient.h"
#include "wx/scrolwin.h"
#include "wx/tooltip.h"
wxPGGlobalVarsClass();
~wxPGGlobalVarsClass();
+#if wxUSE_THREADS
+ // Critical section for handling the globals. Generally it is not needed
+ // since GUI code is supposed to be in single thread. However,
+ // we do want the user to be able to convey wxPropertyGridEvents to other
+ // threads.
+ wxCriticalSection m_critSect;
+#endif
+
// Used by advprops, but here to make things easier.
wxString m_pDefaultImageWildcard;
/** wxPropertyGridManager only: Show adjustable text box showing description
or help text, if available, for currently selected property.
*/
-wxPG_DESCRIPTION = 0x00002000
+wxPG_DESCRIPTION = 0x00002000,
+/** wxPropertyGridManager only: don't show an internal border around
+ the property grid.
+*/
+wxPG_NO_INTERNAL_BORDER = 0x00004000
};
+#if wxPG_COMPATIBILITY_1_4
+ // In wxPG 1.4 this was used to enable now-default theme border support
+ // in wxPropertyGridManager.
+ #define wxPG_THEME_BORDER 0x00000000
+#endif
+
+
enum wxPG_EX_WINDOW_STYLES
{
/** Hides page selection buttons from toolbar.
*/
-wxPG_EX_HIDE_PAGE_BUTTONS = 0x01000000
+wxPG_EX_HIDE_PAGE_BUTTONS = 0x01000000,
+
+/** Allows multiple properties to be selected by user (by pressing SHIFT
+ when clicking on a property, or by dragging with left mouse button
+ down).
+
+ You can get array of selected properties with
+ wxPropertyGridInterface::GetSelectedProperties(). In multiple selection
+ mode wxPropertyGridInterface::GetSelection() returns
+ property which has editor active (usually the first one
+ selected). Other useful member functions are ClearSelection(),
+ AddToSelection() and RemoveFromSelection().
+*/
+wxPG_EX_MULTIPLE_SELECTION = 0x02000000,
+
+/**
+ This enables top-level window tracking which allows wxPropertyGrid to
+ notify the application of last-minute property value changes by user.
+
+ This style is not enabled by default because it may cause crashes when
+ wxPropertyGrid is used in with wxAUI or similar system.
+
+ @remarks If you are not in fact using any system that may change
+ wxPropertyGrid's top-level parent window on its own, then you
+ are recommended to enable this style.
+*/
+wxPG_EX_ENABLE_TLP_TRACKING = 0x04000000,
+
+/** Don't show divider above toolbar, on Windows.
+*/
+wxPG_EX_NO_TOOLBAR_DIVIDER = 0x08000000,
+
+/** Show a separator below the toolbar.
+*/
+wxPG_EX_TOOLBAR_SEPARATOR = 0x10000000
};
+#if wxPG_COMPATIBILITY_1_4
+ #define wxPG_EX_DISABLE_TLP_TRACKING 0x00000000
+#endif
+
/** Combines various styles.
*/
#define wxPG_DEFAULT_STYLE (0)
/**
Returns reference to pending value.
*/
- const wxVariant& GetValue() const
+ wxVariant& GetValue()
{
wxASSERT(m_pValue);
return *m_pValue;
// wxPropertyGrid::DoSelectProperty flags (selFlags)
// Focuses to created editor
-#define wxPG_SEL_FOCUS 0x01
+#define wxPG_SEL_FOCUS 0x0001
// Forces deletion and recreation of editor
-#define wxPG_SEL_FORCE 0x02
+#define wxPG_SEL_FORCE 0x0002
// For example, doesn't cause EnsureVisible
-#define wxPG_SEL_NONVISIBLE 0x04
+#define wxPG_SEL_NONVISIBLE 0x0004
// Do not validate editor's value before selecting
-#define wxPG_SEL_NOVALIDATE 0x08
+#define wxPG_SEL_NOVALIDATE 0x0008
// Property being deselected is about to be deleted
-#define wxPG_SEL_DELETING 0x10
+#define wxPG_SEL_DELETING 0x0010
// Property's values was set to unspecified by the user
-#define wxPG_SEL_SETUNSPEC 0x20
+#define wxPG_SEL_SETUNSPEC 0x0020
// Property's event handler changed the value
-#define wxPG_SEL_DIALOGVAL 0x40
-
+#define wxPG_SEL_DIALOGVAL 0x0040
+// Set to disable sending of wxEVT_PG_SELECTED event
+#define wxPG_SEL_DONT_SEND_EVENT 0x0080
+// Don't make any graphics updates
+#define wxPG_SEL_NO_REFRESH 0x0100
// -----------------------------------------------------------------------
#define wxPG_FL_IN_SELECT_PROPERTY 0x00100000
// Set when help string is shown in status bar
#define wxPG_FL_STRING_IN_STATUSBAR 0x00200000
-// Splitter position has been custom-set by the user
-#define wxPG_FL_SPLITTER_PRE_SET 0x00400000
// Validation failed. Clear on modify event.
#define wxPG_FL_VALIDATION_FAILED 0x00800000
// Auto sort is enabled (for categorized mode)
@beginEventTable{wxPropertyGridEvent}
@event{EVT_PG_SELECTED (id, func)}
- Respond to wxEVT_PG_SELECTED event, generated when property value
- has been changed by user.
+ Respond to wxEVT_PG_SELECTED event, generated when a property selection
+ has been changed, either by user action or by indirect program
+ function. For instance, collapsing a parent property programmatically
+ causes any selected child property to become unselected, and may
+ therefore cause this event to be generated.
@event{EVT_PG_CHANGING(id, func)}
Respond to wxEVT_PG_CHANGING event, generated when property value
is about to be changed by user. Use wxPropertyGridEvent::GetValue()
@event{EVT_PG_ITEM_EXPANDED(id, func)}
Respond to wxEVT_PG_ITEM_EXPANDED event, generated when user expands
a property or category..
+ @event{EVT_PG_LABEL_EDIT_BEGIN(id, func)}
+ Respond to wxEVT_PG_LABEL_EDIT_BEGIN event, generated when is about to
+ begin editing a property label. You can veto this event to prevent the
+ action.
+ @event{EVT_PG_LABEL_EDIT_ENDING(id, func)}
+ Respond to wxEVT_PG_LABEL_EDIT_ENDING event, generated when is about to
+ end editing of a property label. You can veto this event to prevent the
+ action.
@endEventTable
@remarks
class WXDLLIMPEXP_PROPGRID
wxPropertyGrid : public wxScrolledWindow, public wxPropertyGridInterface
{
+ friend class wxPropertyGridEvent;
friend class wxPropertyGridPageState;
friend class wxPropertyGridInterface;
friend class wxPropertyGridManager;
- friend class wxPGCanvas;
DECLARE_DYNAMIC_CLASS(wxPropertyGrid)
public:
Returns wxWindow that the properties are painted on, and which should
be used as the parent for editor controls.
*/
- wxPanel* GetPanel() const
+ wxWindow* GetPanel()
{
- return m_canvas;
+ return this;
}
/** Returns current category caption background colour. */
/** Returns currently selected property. */
wxPGProperty* GetSelectedProperty() const { return GetSelection(); }
- /** Returns currently selected property. */
- wxPGProperty* GetSelection() const
- {
- return m_selected;
- }
-
/** Returns current selection background colour. */
wxColour GetSelectionBackgroundColour() const { return m_colSelBack; }
/**
Selects a property.
Editor widget is automatically created, but not focused unless focus is
- true. This will generate wxEVT_PG_SELECT event.
+ true.
+
@param id
Property to select.
+
@return
True if selection finished successfully. Usually only fails if
current value in editor is not valid.
- @see wxPropertyGrid::Unselect
+
+ @remarks In wxPropertyGrid 1.4, this member function used to generate
+ wxEVT_PG_SELECTED. In wxWidgets 2.9 and later, it no longer
+ does that.
+
+ @remarks This clears any previous selection.
*/
- bool SelectProperty( wxPGPropArg id, bool focus = false )
+ bool SelectProperty( wxPGPropArg id, bool focus = false );
+
+ /**
+ Set entire new selection from given list of properties.
+ */
+ void SetSelection( const wxArrayPGProperty& newSelection )
+ {
+ DoSetSelection( newSelection, wxPG_SEL_DONT_SEND_EVENT );
+ }
+
+ /**
+ Adds given property into selection. If wxPG_EX_MULTIPLE_SELECTION
+ extra style is not used, then this has same effect as
+ calling SelectProperty().
+
+ @remarks Multiple selection is not supported for categories. This
+ means that if you have properties selected, you cannot
+ add category to selection, and also if you have category
+ selected, you cannot add other properties to selection.
+ This member function will fail silently in these cases,
+ even returning true.
+ */
+ bool AddToSelection( wxPGPropArg id )
{
wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
- return DoSelectProperty(p,focus?wxPG_SEL_FOCUS:0);
+ return DoAddToSelection(p, wxPG_SEL_DONT_SEND_EVENT);
+ }
+
+ /**
+ Removes given property from selection. If property is not selected,
+ an assertion failure will occur.
+ */
+ bool RemoveFromSelection( wxPGPropArg id )
+ {
+ wxPG_PROP_ARG_CALL_PROLOG_RETVAL(false)
+ return DoRemoveFromSelection(p, wxPG_SEL_DONT_SEND_EVENT);
+ }
+
+ /**
+ Makes given column editable by user.
+
+ @param editable
+ Using @false here will disable column from being editable.
+ */
+ void MakeColumnEditable( unsigned int column, bool editable = true );
+
+ /**
+ Creates label editor wxTextCtrl for given column, for property
+ that is currently selected. When multiple selection is
+ enabled, this applies to whatever property GetSelection()
+ returns.
+
+ @param colIndex
+ Which column's label to edit. Note that you should not
+ use value 1, which is reserved for property value
+ column.
+
+ @see EndLabelEdit(), MakeColumnEditable()
+ */
+ void BeginLabelEdit( unsigned int column = 0 )
+ {
+ DoBeginLabelEdit(column, wxPG_SEL_DONT_SEND_EVENT);
+ }
+
+ /**
+ Destroys label editor wxTextCtrl, if any.
+
+ @param commit
+ Use @true (default) to store edited label text in
+ property cell data.
+
+ @see BeginLabelEdit(), MakeColumnEditable()
+ */
+ void EndLabelEdit( bool commit = true )
+ {
+ DoEndLabelEdit(commit, wxPG_SEL_DONT_SEND_EVENT);
+ }
+
+ /**
+ Returns currently active label editor, NULL if none.
+ */
+ wxTextCtrl* GetLabelEditor() const
+ {
+ return m_labelEditor;
}
/** Sets category caption background colour. */
void SetSplitterPosition( int newxpos, int col = 0 )
{
DoSetSplitterPosition_(newxpos, true, col);
- m_iFlags |= wxPG_FL_SPLITTER_PRE_SET;
+ m_pState->m_isSplitterPreSet = true;
}
/**
shown).
*/
void FixPosForTextCtrl( wxWindow* ctrl,
+ unsigned int forColumn = 1,
const wxPoint& offset = wxPoint(0, 0) );
/** Shortcut for creating text editor widget.
const wxString& value,
wxWindow* secondary,
int extraStyle = 0,
- int maxLen = 0 );
+ int maxLen = 0,
+ unsigned int forColumn = 1 );
/* Generates both textctrl and button.
*/
//
// Public methods for semi-public use
- // (not protected for optimization)
//
bool DoSelectProperty( wxPGProperty* p, unsigned int flags = 0 );
wxWindow *m_wndEditor;
wxWindow *m_wndEditor2;
- /** wxPGCanvas instance. */
- wxPanel *m_canvas;
-
#if wxPG_DOUBLE_BUFFER
wxBitmap *m_doubleBuffer;
#endif
/** 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;
+ // Mouse is hovering over this column (index)
+ unsigned int m_colHover;
// pointer to property that has mouse hovering
wxPGProperty* m_propHover;
+ // Active label editor
+ wxTextCtrl* m_labelEditor;
+
+ // For which property the label editor is active
+ wxPGProperty* m_labelEditorProperty;
+
// EventObject for wxPropertyGridEvents
wxWindow* m_eventObject;
// handling mess).
wxWindow* m_curFocused;
+ // Event currently being sent - NULL if none at the moment
+ wxPropertyGridEvent* m_processedEvent;
+
// Last known top-level parent
wxWindow* m_tlp;
// y coordinate of property that mouse hovering
int m_propHoverY;
+
// Which column's editor is selected (usually 1)?
- int m_selColumn;
+ unsigned int m_selColumn;
// x relative to splitter (needed for resize).
int m_ctrlXAdjust;
// labels when properties use common values
wxVector<wxPGCommonValue*> m_commonValues;
+ // array of live events
+ wxVector<wxPropertyGridEvent*> m_liveEvents;
+
// Which cv selection really sets value to unspecified?
int m_cvUnspecified;
// main event receivers
void OnMouseMove( wxMouseEvent &event );
- void OnMouseMoveBottom( wxMouseEvent &event );
void OnMouseClick( wxMouseEvent &event );
void OnMouseRightClick( wxMouseEvent &event );
void OnMouseDoubleClick( wxMouseEvent &event );
protected:
+ bool AddToSelectionFromInputEvent( wxPGProperty* prop,
+ unsigned int colIndex,
+ wxMouseEvent* event = NULL,
+ int selFlags = 0 );
+
/**
Adjust the centering of the bitmap icons (collapse / expand) when the
caption font changes.
*/
void CorrectEditorWidgetPosY();
- /** Deselect current selection, if any. Returns true if success
- (ie. validator did not intercept). */
- bool DoClearSelection();
-
int DoDrawItems( wxDC& dc,
- const wxRect* clipRect,
+ const wxRect* drawRect,
bool isBuffered ) const;
/** Draws an expand/collapse (ie. +/-) button.
wxPGProperty* property ) const;
/** 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( wxDC& dc,
+ unsigned int topItemY,
+ unsigned int bottomItemY,
+ const wxRect* drawRect = NULL );
// Translate wxKeyEvent to wxPG_ACTION_XXX
int KeyEventToActions(wxKeyEvent &event, int* pSecond) const;
bool DoEditorValidate();
+ // Similar to DoSelectProperty() but also works on columns
+ // other than 1. Does not active editor if column is not
+ // editable.
+ bool DoSelectAndEdit( wxPGProperty* prop,
+ unsigned int colIndex,
+ unsigned int selFlags );
+
+ void DoSetSelection( const wxArrayPGProperty& newSelection,
+ int selFlags = 0 );
+
+ bool DoAddToSelection( wxPGProperty* prop,
+ int selFlags = 0 );
+
+ bool DoRemoveFromSelection( wxPGProperty* prop,
+ int selFlags = 0 );
+
+ void DoBeginLabelEdit( unsigned int colIndex, int selFlags = 0 );
+ void DoEndLabelEdit( bool commit, int selFlags = 0 );
+ void OnLabelEditorEnterPress( wxCommandEvent& event );
+ void OnLabelEditorKeyPress( wxKeyEvent& event );
+
wxPGProperty* DoGetItemAtY( int y ) const;
void DoSetSplitterPosition_( int newxpos,
int splitterIndex = 0,
bool allPages = false );
+ void DestroyEditorWnd( wxWindow* wnd );
void FreeEditors();
virtual bool DoExpand( wxPGProperty* p, bool sendEvent = false );
void PrepareAfterItemsAdded();
- bool SendEvent( int eventType,
- wxPGProperty* p,
+ // Omit the wxPG_SEL_NOVALIDATE flag to allow vetoing the event
+ bool SendEvent( int eventType, wxPGProperty* p,
wxVariant* pValue = NULL,
- unsigned int selFlags = 0 );
+ unsigned int selFlags = wxPG_SEL_NOVALIDATE,
+ unsigned int column = 1 );
void SetFocusOnCanvas();
m_customEditor = wxPropertyGridInterface::GetEditorByName(editorName);
}
-inline void wxPGProperty::SetName( const wxString& newName )
-{
- GetGrid()->SetPropertyName(this, newName);
-}
-
inline bool wxPGProperty::Hide( bool hide, int flags )
{
return GetGrid()->HideProperty(this, hide, flags);
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_ITEM_COLLAPSED, wxPropertyGridEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_ITEM_EXPANDED, wxPropertyGridEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID, wxEVT_PG_DOUBLE_CLICK, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID,
+ wxEVT_PG_LABEL_EDIT_BEGIN, wxPropertyGridEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID,
+ wxEVT_PG_LABEL_EDIT_ENDING, wxPropertyGridEvent );
#else
enum {
wxEVT_PG_PAGE_CHANGED,
wxEVT_PG_ITEM_COLLAPSED,
wxEVT_PG_ITEM_EXPANDED,
- wxEVT_PG_DOUBLE_CLICK
+ wxEVT_PG_DOUBLE_CLICK,
+ wxEVT_PG_LABEL_EDIT_BEGIN,
+ wxEVT_PG_LABEL_EDIT_ENDING
};
#endif
#define EVT_PG_PAGE_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_PAGE_CHANGED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
#define EVT_PG_ITEM_COLLAPSED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_COLLAPSED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
#define EVT_PG_ITEM_EXPANDED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_EXPANDED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_LABEL_EDIT_BEGIN(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_LABEL_EDIT_BEGIN, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_LABEL_EDIT_ENDING(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_LABEL_EDIT_ENDING, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
#define wxPropertyGridEventHandler(fn) \
wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn )
/** Copyer. */
virtual wxEvent* Clone() const;
+ /**
+ Returns the column index associated with this event.
+ */
+ unsigned int GetColumn() const
+ {
+ return m_column;
+ }
+
wxPGProperty* GetMainParent() const
{
wxASSERT(m_property);
*/
void Veto( bool veto = true ) { m_wasVetoed = veto; }
- /** Returns value that is about to be set for wxEVT_PG_CHANGING.
+ /**
+ Returns name of the associated property.
+
+ @remarks Property name is stored in event, so it remains
+ accessible even after the associated property or
+ the property grid has been deleted.
+ */
+ wxString GetPropertyName() const
+ {
+ return m_propertyName;
+ }
+
+ /**
+ Returns value of the associated property. Works for all event
+ types, but for wxEVT_PG_CHANGING this member function returns
+ the value that is pending, so you can call Veto() if the
+ value is not satisfactory.
+
+ @remarks Property value is stored in event, so it remains
+ accessible even after the associated property or
+ the property grid has been deleted.
+ */
+ wxVariant GetPropertyValue() const
+ {
+ if ( m_validationInfo )
+ return m_validationInfo->GetValue();
+ return m_value;
+ }
+
+ /**
+ Returns value of the associated property.
+
+ @see GetPropertyValue
*/
- const wxVariant& GetValue() const
+ wxVariant GetValue() const
{
- wxASSERT_MSG( m_validationInfo,
- "Only call GetValue from a handler "
- "of event type that supports it" );
- return m_validationInfo->GetValue();
+ return GetPropertyValue();
}
/**
return m_validationInfo->GetFailureBehavior();
}
+ void SetColumn( unsigned int column )
+ {
+ m_column = column;
+ }
+
void SetCanVeto( bool canVeto ) { m_canVeto = canVeto; }
bool WasVetoed() const { return m_wasVetoed; }
/** Changes the associated property. */
- void SetProperty( wxPGProperty* p ) { m_property = p; }
+ void SetProperty( wxPGProperty* p )
+ {
+ m_property = p;
+ if ( p )
+ m_propertyName = p->GetName();
+ }
- void SetPropertyGrid( wxPropertyGrid* pg ) { m_pg = pg; }
+ void SetPropertyValue( wxVariant value )
+ {
+ m_value = value;
+ }
+
+ void SetPropertyGrid( wxPropertyGrid* pg )
+ {
+ m_pg = pg;
+ OnPropertyGridSet();
+ }
void SetupValidationInfo()
{
wxASSERT(m_pg);
wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
m_validationInfo = &m_pg->GetValidationInfo();
+ m_value = m_validationInfo->GetValue();
}
private:
void Init();
+ void OnPropertyGridSet();
DECLARE_DYNAMIC_CLASS(wxPropertyGridEvent)
wxPGProperty* m_property;
wxPropertyGrid* m_pg;
wxPGValidationInfo* m_validationInfo;
+ wxString m_propertyName;
+ wxVariant m_value;
+
+ unsigned int m_column;
+
bool m_canVeto;
bool m_wasVetoed;
#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_ICON_WIDTH