// Author: Jaakko Salli
// Modified by:
// Created: 2004-09-25
-// RCS-ID: $Id:
+// RCS-ID: $Id$
// Copyright: (c) Jaakko Salli
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PROPGRID_PROPGRID_H_
#define _WX_PROPGRID_PROPGRID_H_
+#if wxUSE_PROPGRID
+
#include "wx/dcclient.h"
#include "wx/scrolwin.h"
#include "wx/tooltip.h"
wxPGHashMapS2P m_mapEditorClasses;
#if wxUSE_VALIDATORS
- wxArrayPtrVoid m_arrValidators; // These wxValidators need to be freed
+ wxVector<wxValidator*> m_arrValidators; // These wxValidators need to be freed
#endif
wxPGHashMapS2P m_dictPropertyClassInfo; // PropertyName -> ClassInfo
*/
wxPG_EX_WRITEONLY_BUILTIN_ATTRIBUTES = 0x00400000,
-/**
- With this style Validators on properties will work same as in
- wxPropertyGrid 1.2.
-*/
-wxPG_EX_LEGACY_VALIDATORS = 0x00800000,
-
/** Hides page selection buttons from toolbar.
*/
wxPG_EX_HIDE_PAGE_BUTTONS = 0x01000000
typedef wxByte wxPGVFBFlags;
-/** @class wxPGValidationInfo
+/**
+ wxPGValidationInfo
Used to convey validation information to and from functions that
- actually perform validation.
+ actually perform validation. Mostly used in custom property
+ classes.
*/
-struct wxPGValidationInfo
+class WXDLLIMPEXP_PROPGRID wxPGValidationInfo
{
- /** Value to be validated.
+ friend class wxPropertyGrid;
+public:
+ /**
+ @return Returns failure behavior which is a combination of
+ @ref propgrid_vfbflags.
*/
- wxVariant* m_pValue;
+ wxPGVFBFlags GetFailureBehavior() const
+ { return m_failureBehavior; }
- /** Message displayed on validation failure.
+ /**
+ Returns current failure message.
*/
- wxString m_failureMessage;
+ const wxString& GetFailureMessage() const
+ { return m_failureMessage; }
- /** Validation failure behavior. Use wxPG_VFB_XXX flags.
+ /**
+ Returns reference to pending value.
*/
- wxPGVFBFlags m_failureBehavior;
+ const wxVariant& GetValue() const
+ {
+ wxASSERT(m_pValue);
+ return *m_pValue;
+ }
- wxPGVFBFlags GetFailureBehavior() const { return m_failureBehavior; }
+ /** Set validation failure behavior
+ @param failureBehavior
+ Mixture of @ref propgrid_vfbflags.
+ */
void SetFailureBehavior(wxPGVFBFlags failureBehavior)
{ m_failureBehavior = failureBehavior; }
- const wxString& GetFailureMessage() const { return m_failureMessage; }
-
+ /**
+ Set current failure message.
+ */
void SetFailureMessage(const wxString& message)
{ m_failureMessage = message; }
+
+private:
+ /** Value to be validated.
+ */
+ wxVariant* m_pValue;
+
+ /** Message displayed on validation failure.
+ */
+ wxString m_failureMessage;
+
+ /** Validation failure behavior. Use wxPG_VFB_XXX flags.
+ */
+ wxPGVFBFlags m_failureBehavior;
};
// -----------------------------------------------------------------------
wxPG_ACTION_EXPAND_PROPERTY,
wxPG_ACTION_COLLAPSE_PROPERTY,
wxPG_ACTION_CANCEL_EDIT,
- wxPG_ACTION_CUT,
- wxPG_ACTION_COPY,
- wxPG_ACTION_PASTE,
+ wxPG_ACTION_PRESS_BUTTON, // Causes editor button (if any) to be pressed
wxPG_ACTION_MAX
};
-
+
/** @}
*/
#define wxPG_FL_IN_MANAGER 0x00020000
// Set after wxPropertyGrid is shown in its initial good size
#define wxPG_FL_GOOD_SIZE_SET 0x00040000
-// Next navigation key event will get ignored
-#define wxPG_FL_IGNORE_NEXT_NAVKEY 0x00080000
// Set when in SelectProperty.
#define wxPG_FL_IN_SELECT_PROPERTY 0x00100000
// Set when help string is shown in status bar
#define wxPG_FL_SPLITTER_PRE_SET 0x00400000
// Validation failed. Clear on modify event.
#define wxPG_FL_VALIDATION_FAILED 0x00800000
-// Set if selected is fully painted (ie. both image and text)
-//#define wxPG_FL_SELECTED_IS_FULL_PAINT 0x01000000
+// Auto sort is enabled (for categorized mode)
+#define wxPG_FL_CATMODE_AUTO_SORT 0x01000000
// Set after page has been inserted to manager
#define wxPG_MAN_FL_PAGE_INSERTED 0x02000000
// Active editor control is abnormally large
/** Returns current cell text colour. */
wxColour GetCellTextColour() const { return m_colPropFore; }
- /** Returns number of columns on current page. */
- int GetColumnCount() const
+ /**
+ Returns number of columns currently on grid.
+ */
+ unsigned int GetColumnCount() const
{
- return m_pState->m_colWidths.size();
+ return (unsigned int) m_pState->m_colWidths.size();
}
/** Returns colour of empty space below properties. */
/** Returns background colour of margin. */
wxColour GetMarginColour() const { return m_colMargin; }
+ /**
+ Returns most up-to-date value of selected property. This will return
+ value different from GetSelectedProperty()->GetValue() only when text
+ editor is activate and string edited by user represents valid,
+ uncommitted property value.
+ */
+ wxVariant GetUncommittedPropertyValue();
+
/** Returns cell background colour of a property. */
wxColour GetPropertyBackgroundColour( wxPGPropArg id ) const;
int GetRowHeight() const { return m_lineHeight; }
/** Returns currently selected property. */
- wxPGProperty* GetSelectedProperty () const { return GetSelection(); }
+ wxPGProperty* GetSelectedProperty() const { return GetSelection(); }
/** Returns currently selected property. */
wxPGProperty* GetSelection() const
Pointer to the editor class instance that should be used.
*/
static wxPGEditor* RegisterEditorClass( wxPGEditor* editor,
- const wxString& name,
bool noDefCheck = false );
#endif
return DoSelectProperty(p,focus?wxPG_SEL_FOCUS:0);
}
- /** 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 category caption background colour. */
void SetCaptionBackgroundColour(const wxColour& col);
/** Sets background colour of margin. */
void SetMarginColour(const wxColour& col);
- /** Sets property attribute for all applicapple properties.
- Be sure to use this method only after all properties have been
- added to the grid.
- */
- void SetPropertyAttributeAll( const wxString& attrName, wxVariant value );
-
/** 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.
virtual width should be disabled. */
void SetVirtualWidth( int width );
- /** Sets name of a property.
- @param id
- Name or pointer of property which name to change.
- @param newname
- New name.
- */
- void SetPropertyName( wxPGPropArg id, const wxString& newname )
- {
- wxPG_PROP_ARG_CALL_PROLOG()
- DoSetPropertyName( p, newname );
- }
-
- /** Moves splitter as left as possible, while still allowing all
+ /**
+ 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.
+
+ @param privateChildrenToo
+ If @false, will still allow private children to be cropped.
*/
- void SetSplitterLeft( bool subProps = false )
+ void SetSplitterLeft( bool privateChildrenToo = false )
{
- m_pState->SetSplitterLeft(subProps);
+ m_pState->SetSplitterLeft(privateChildrenToo);
}
/** 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.
*/
void SetVerticalSpacing( int vspacing )
{
*/
unsigned int GetCommonValueCount() const
{
- return m_commonValues.size();
+ return (unsigned int) m_commonValues.size();
}
/** Returns label of given common value.
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;
- /** Adjusts given position if topCtrlWnd is child of clipper window.
- */
- bool AdjustPosForClipperWindow( wxWindow* topCtrlWnd, int* x, int* y );
-
wxWindow* GetPrimaryEditor() const
{
return GetEditorControl();
// Mostly useful for page switching.
void SwitchState( wxPropertyGridPageState* pNewState );
- /** Pass this function to Connect calls in propertyclass::CreateEditor.
+ /**
+ When creating custom property editors, connect required editor events to
+ this function. For instance:
+
+ @code
+ control->Connect(control->GetId(), wxEVT_COMMAND_TEXT_UPDATED,
+ wxEventHandler(wxPropertyGrid::OnCustomEditorEvent),
+ NULL, propgrid);
+ @endcode
+
+ @remarks You should never need to call this function directly!
+
+ @see wxPGEditor::CreateControls(), wxEvtHandler::Connect()
*/
- void OnCustomEditorEvent( wxCommandEvent &event );
+ void OnCustomEditorEvent( wxEvent &event );
long GetInternalFlags() const { return m_iFlags; }
+ bool HasInternalFlag( long flag ) const
+ { return (m_iFlags & flag) ? true : false; }
void SetInternalFlag( long flag ) { m_iFlags |= flag; }
void ClearInternalFlag( long flag ) { m_iFlags &= ~(flag); }
void IncFrozen() { m_frozen++; }
void OnComboItemPaint( wxPGCustomComboControl* pCb,int item,wxDC& dc,
wxRect& rect,int flags );
- // Used by simple check box for keyboard navigation
- void SendNavigationKeyEvent( int dir );
-
/** Standardized double-to-string conversion.
*/
static void DoubleToString( wxString& target,
virtual bool DoPropertyChanged( wxPGProperty* p,
unsigned int selFlags = 0 );
- /**
- Runs all validation functionality (includes sending wxEVT_PG_CHANGING).
- Returns true if all tests passed.
- */
- virtual bool PerformValidation( wxPGProperty* p, wxVariant& pendingValue );
-
/** Called when validation for given property fails.
@param invalidValue
Value which failed in validation.
*/
virtual wxPropertyGridPageState* CreateState() const;
-#ifndef DOXYGEN
+ enum PerformValidationFlags
+ {
+ SendEvtChanging = 0x0001,
+ IsStandaloneValidation = 0x0002 // Not called in response to event
+ };
+
+ /**
+ Runs all validation functionality (includes sending wxEVT_PG_CHANGING).
+ Returns true if all tests passed. Implement in derived class to
+ add additional validation behavior.
+ */
+ virtual bool PerformValidation( wxPGProperty* p,
+ wxVariant& pendingValue,
+ int flags = SendEvtChanging );
+
public:
// Control font changer helper.
wxBitmap *m_doubleBuffer;
#endif
- wxArrayPtrVoid *m_windowsToDelete;
-
/** Local time ms when control was created. */
wxLongLong m_timeCreated;
int m_fontHeight; // Height of the font.
- // Base keycode for triggering push button.
- int m_pushButKeyCode;
-
/** m_splitterx when drag began. */
int m_startingSplitterX;
unsigned char m_vspacing;
- // Does triggering push button need Alt down?
- unsigned char m_pushButKeyCodeNeedsAlt;
-
- // Does triggering push button need Ctrl down?
- unsigned char m_pushButKeyCodeNeedsCtrl;
-
// Used to track when Alt/Ctrl+Key was consumed.
unsigned char m_keyComboConsumed;
// Array of background colour brushes.
wxArrayPtrVoid m_arrBgBrushes;
+
// Array of foreground colours.
wxArrayPtrVoid m_arrFgCols;
// labels when properties use common values
- wxArrayPtrVoid m_commonValues;
+ wxVector<wxPGCommonValue*> m_commonValues;
+
// Which cv selection really sets value to unspecified?
int m_cvUnspecified;
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 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 );
- // Handle TAB and ESCAPE in control
- bool HandleChildKey( wxKeyEvent& event );
+ void HandleKeyEvent( wxKeyEvent &event, bool fromChild );
void OnMouseEntry( wxMouseEvent &event );
void OnMouseMoveChild( wxMouseEvent &event );
void OnMouseUpChild( wxMouseEvent &event );
void OnChildKeyDown( wxKeyEvent &event );
- void OnChildKeyUp( wxKeyEvent &event );
void OnCaptureChange( wxMouseCaptureChangedEvent &event );
void ImprovedClientToScreen( int* px, int* py );
+ // Returns True if editor control has focus
+ bool IsEditorFocused() const;
+
// Called by focus event handlers. newFocused is the window that becomes
// focused.
void HandleFocusChange( wxWindow* newFocused );
int CacheColour( const wxColour& colour );
- void DoSetPropertyName( wxPGProperty* p, const wxString& newname );
-
- // Setups event handling for child control
- void SetupEventHandling( wxWindow* wnd, int id );
+ // Sets up basic event handling for child control
+ void SetupChildEventHandling( wxWindow* wnd );
void CustomSetCursor( int type, bool override = false );
wxVariant* pValue = NULL,
unsigned int selFlags = 0 );
+ void SetFocusOnCanvas();
+
bool DoHideProperty( wxPGProperty* p, bool hide, int flags );
private:
- bool ButtonTriggerKeyTest( wxKeyEvent &event );
-
-#endif // DOXYGEN_SHOULD_SKIP_THIS
+ bool ButtonTriggerKeyTest( int action, wxKeyEvent& event );
-private:
DECLARE_EVENT_TABLE()
#endif // #ifndef SWIG
};
{
wxPropertyGrid* pg = GetGrid();
if ( pg )
- return pg->GetCommonValueCount();
+ return (int) pg->GetCommonValueCount();
}
return 0;
}
return *m_validationInfo;
}
- /** Returns true if event has associated property. */
- bool HasProperty() const { return ( m_property != (wxPGProperty*) NULL ); }
-
/** Returns true if you can veto the action that the event is signaling.
*/
bool CanVeto() const { return m_canVeto; }
wxASSERT_MSG( m_validationInfo,
"Only call GetValue from a handler "
"of event type that supports it" );
- return *m_validationInfo->m_pValue;
+ return m_validationInfo->GetValue();
}
/**
Only effective if Veto was also called, and only allowed if event type
is wxEVT_PG_CHANGING.
*/
- void SetValidationFailureBehavior( int flags )
+ void SetValidationFailureBehavior( wxPGVFBFlags flags )
{
wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
- m_validationInfo->m_failureBehavior = (wxPGVFBFlags) flags;
+ m_validationInfo->SetFailureBehavior( flags );
}
/** Sets custom failure message for this time only. Only applies if
void SetValidationFailureMessage( const wxString& message )
{
wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
- m_validationInfo->m_failureMessage = message;
+ m_validationInfo->SetFailureMessage( message );
}
#ifndef SWIG
wxPGVFBFlags GetValidationFailureBehavior() const
{
wxASSERT( GetEventType() == wxEVT_PG_CHANGING );
- return m_validationInfo->m_failureBehavior;
+ return m_validationInfo->GetFailureBehavior();
}
void SetCanVeto( bool canVeto ) { m_canVeto = canVeto; }
// #undef const wxString&
#endif
-// Doxygen special
-#ifdef DOXYGEN
- #include "wx/propgrid/editor.h"
- #include "wx/propgrid/manager.h"
-#endif
-
// -----------------------------------------------------------------------
+#endif
+
#endif // _WX_PROPGRID_PROPGRID_H_