]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/propgrid/propgrid.h
Make wxChoicebook background transparent.
[wxWidgets.git] / include / wx / propgrid / propgrid.h
index 2d744fe7c9bad5b14345c6780ea0ee408d2999ab..23cf2550e91b911ea84c90c96defe23aca7f8707 100644 (file)
@@ -6,19 +6,23 @@
 // Created:     2004-09-25
 // RCS-ID:      $Id$
 // Copyright:   (c) Jaakko Salli
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_PROPGRID_PROPGRID_H_
 #define _WX_PROPGRID_PROPGRID_H_
 
+#include "wx/defs.h"
+
 #if wxUSE_PROPGRID
 
 #include "wx/thread.h"
 #include "wx/dcclient.h"
+#include "wx/control.h"
 #include "wx/scrolwin.h"
 #include "wx/tooltip.h"
 #include "wx/datetime.h"
+#include "wx/recguard.h"
 
 #include "wx/propgrid/property.h"
 #include "wx/propgrid/propgridiface.h"
@@ -30,6 +34,10 @@ extern WXDLLIMPEXP_DATA_PROPGRID(const char) wxPropertyGridNameStr[];
 
 class wxPGComboBox;
 
+#if wxUSE_STATUSBAR
+class WXDLLIMPEXP_FWD_CORE wxStatusBar;
+#endif
+
 // -----------------------------------------------------------------------
 // Global variables
 // -----------------------------------------------------------------------
@@ -388,12 +396,34 @@ wxPG_VFB_BEEP                       = 0x02,
 */
 wxPG_VFB_MARK_CELL                  = 0x04,
 
-/** Display customizable text message explaining the situation.
+/**
+    Display a text message explaining the situation.
+
+    To customize the way the message is displayed, you need to
+    reimplement wxPropertyGrid::DoShowPropertyError() in a
+    derived class. Default behavior is to display the text on
+    the top-level frame's status bar, if present, and otherwise
+    using wxMessageBox.
 */
 wxPG_VFB_SHOW_MESSAGE               = 0x08,
 
+/**
+    Similar to wxPG_VFB_SHOW_MESSAGE, except always displays the
+    message using wxMessageBox.
+*/
+wxPG_VFB_SHOW_MESSAGEBOX            = 0x10,
+
+/**
+    Similar to wxPG_VFB_SHOW_MESSAGE, except always displays the
+    message on the status bar (when present - you can reimplement
+    wxPropertyGrid::GetStatusBar() in a derived class to specify
+    this yourself).
+*/
+wxPG_VFB_SHOW_MESSAGE_ON_STATUSBAR  = 0x20,
+
 /** Defaults. */
-wxPG_VFB_DEFAULT                    = wxPG_VFB_STAY_IN_PROPERTY|wxPG_VFB_BEEP,
+wxPG_VFB_DEFAULT                    = wxPG_VFB_MARK_CELL |
+                                      wxPG_VFB_SHOW_MESSAGEBOX,
 
 /** Only used internally. */
 wxPG_VFB_UNDEFINED                  = 0x80
@@ -403,7 +433,10 @@ wxPG_VFB_UNDEFINED                  = 0x80
 /** @}
 */
 
-typedef wxByte wxPGVFBFlags;
+// Having this as define instead of wxByte typedef makes things easier for
+// wxPython bindings (ignoring and redefining it in SWIG interface file
+// seemed rather tricky)
+#define wxPGVFBFlags unsigned char
 
 /**
     wxPGValidationInfo
@@ -416,6 +449,16 @@ class WXDLLIMPEXP_PROPGRID wxPGValidationInfo
 {
     friend class wxPropertyGrid;
 public:
+    wxPGValidationInfo()
+    {
+        m_failureBehavior = 0;
+        m_isFailing = false;
+    }
+
+    ~wxPGValidationInfo()
+    {
+    }
+
     /**
         @return Returns failure behavior which is a combination of
                @ref propgrid_vfbflags.
@@ -464,6 +507,9 @@ private:
     /** Validation failure behavior. Use wxPG_VFB_XXX flags.
     */
     wxPGVFBFlags    m_failureBehavior;
+
+    // True when validation is currently failing.
+    bool            m_isFailing;
 };
 
 // -----------------------------------------------------------------------
@@ -563,8 +609,6 @@ enum wxPG_SET_SPLITTER_POSITION_SPLITTER_FLAGS
 #define wxPG_FL_IN_SELECT_PROPERTY          0x00100000
 // Set when help string is shown in status bar
 #define wxPG_FL_STRING_IN_STATUSBAR         0x00200000
-// Validation failed. Clear on modify event.
-#define wxPG_FL_VALIDATION_FAILED           0x00800000
 // Auto sort is enabled (for categorized mode)
 #define wxPG_FL_CATMODE_AUTO_SORT           0x01000000
 // Set after page has been inserted to manager
@@ -669,8 +713,9 @@ enum wxPG_SET_SPLITTER_POSITION_SPLITTER_FLAGS
     @library{wxpropgrid}
     @category{propgrid}
 */
-class WXDLLIMPEXP_PROPGRID
-    wxPropertyGrid : public wxScrolledWindow, public wxPropertyGridInterface
+class WXDLLIMPEXP_PROPGRID wxPropertyGrid : public wxControl,
+                                            public wxScrollHelper,
+                                            public wxPropertyGridInterface
 {
     friend class wxPropertyGridEvent;
     friend class wxPropertyGridPageState;
@@ -692,7 +737,7 @@ public:
 #endif
 
     /** The default constructor. The styles to be used are styles valid for
-        the wxWindow and wxScrolledWindow.
+        the wxWindow.
 
         @see @link wndflags Additional Window Styles @endlink
     */
@@ -707,12 +752,34 @@ public:
 
     /** Adds given key combination to trigger given action.
 
+        Here is a sample code to make Enter key press move focus to
+        the next property.
+
+        @code
+            propGrid->AddActionTrigger(wxPG_ACTION_NEXT_PROPERTY,
+                                       WXK_RETURN);
+            propGrid->DedicateKey(WXK_RETURN);
+        @endcode
+
         @param action
             Which action to trigger. See @link pgactions List of list of
             wxPropertyGrid actions@endlink.
     */
     void AddActionTrigger( int action, int keycode, int modifiers = 0 );
 
+    /**
+        Dedicates a specific keycode to wxPropertyGrid. This means that such
+        key presses will not be redirected to editor controls.
+
+        Using this function allows, for example, navigation between
+        properties using arrow keys even when the focus is in the editor
+        control.
+    */
+    void DedicateKey( int keycode )
+    {
+        m_dedicatedKeys.push_back(keycode);
+    }
+
     /**
         This static function enables or disables automatic use of
         wxGetTranslation for following strings: wxEnumProperty list labels,
@@ -735,7 +802,7 @@ public:
 
     /**
         Centers the splitter.
-        
+
         @param enableAutoResizing
             If @true, automatic column resizing is enabled (only applicapple
             if window style wxPG_SPLITTER_AUTO_CENTER is used).
@@ -974,7 +1041,7 @@ public:
 
         @param pt
             Coordinates in the virtual grid space. You may need to use
-            wxScrolledWindow::CalcScrolledPosition() for translating
+            wxScrolled<T>::CalcScrolledPosition() for translating
             wxPropertyGrid client coordinates into something this member
             function can use.
     */
@@ -1430,7 +1497,7 @@ public:
 
     /**
         Returns rectangle that fully contains properties between and including
-        p1 and p2.
+        p1 and p2. Rectangle is in virtual scrolled window coordinates.
     */
     wxRect GetPropertyRect( const wxPGProperty* p1,
                             const wxPGProperty* p2 ) const;
@@ -1461,18 +1528,6 @@ public:
     // Events from editor controls are forward to this function
     void HandleCustomEditorEvent( wxEvent &event );
 
-    /**
-        Generates contents for string dst based on the contents 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 );
-
     // Mostly useful for page switching.
     void SwitchState( wxPropertyGridPageState* pNewState );
 
@@ -1564,12 +1619,38 @@ public:
         m_validationInfo.m_failureMessage.clear();
     }
 
-    /** Override in derived class to display error messages in custom manner
+    /**
+        Override in derived class to display error messages in custom manner
         (these message usually only result from validation failure).
+
+        @remarks If you implement this, then you also need to implement
+                 DoHidePropertyError() - possibly to do nothing, if error
+                 does not need hiding (e.g. it was logged or shown in a
+                 message box).
+
+        @see DoHidePropertyError()
     */
     virtual void DoShowPropertyError( wxPGProperty* property,
                                       const wxString& msg );
 
+    /**
+        Override in derived class to hide an error displayed by
+        DoShowPropertyError().
+
+        @see DoShowPropertyError()
+    */
+    virtual void DoHidePropertyError( wxPGProperty* property );
+
+#if wxUSE_STATUSBAR
+    /**
+        Return wxStatusBar that is used by this wxPropertyGrid. You can
+        reimplement this member function in derived class to override
+        the default behavior of using the top-level wxFrame's status
+        bar, if any.
+    */
+    virtual wxStatusBar* GetStatusBar();
+#endif
+
     /** Override to customize property validation failure behavior.
         @param invalidValue
             Value which failed in validation.
@@ -1672,9 +1753,6 @@ public:
     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();
@@ -1762,12 +1840,7 @@ protected:
     /** 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)
-     */
+    // Caption font. Same as normal font plus bold style.
     wxFont              m_captionFont;
 
     int                 m_fontHeight;  // Height of the font.
@@ -1808,6 +1881,14 @@ protected:
     /** Appearance of a unspecified value cell. */
     wxPGCell            m_unspecifiedAppearance;
 
+    /** List of properties to be deleted/removed in idle event handler. */
+    wxArrayPGProperty   m_deletedProperties;
+    wxArrayPGProperty   m_removedProperties;
+
+    /** List of key codes that will not be handed over to editor controls. */
+    // FIXME: Make this a hash set once there is template-based wxHashSet.
+    wxVector<int>       m_dedicatedKeys;
+
     //
     // Temporary values
     //
@@ -1839,16 +1920,21 @@ protected:
     unsigned char       m_keyComboConsumed;
 
     /** 1 if in DoPropertyChanged() */
-    unsigned char       m_inDoPropertyChanged;
+    bool                m_inDoPropertyChanged;
 
     /** 1 if in CommitChangesFromEditor() */
-    unsigned char       m_inCommitChangesFromEditor;
+    bool                m_inCommitChangesFromEditor;
 
     /** 1 if in DoSelectProperty() */
-    unsigned char       m_inDoSelectProperty;
+    bool                m_inDoSelectProperty;
+
+    bool                m_inOnValidationFailure;
 
     wxPGVFBFlags        m_permanentValidationFailureBehavior;  // Set by app
 
+    // DoEditorValidate() recursion guard
+    wxRecursionGuardFlag    m_validatingEditor;
+
     /** Internal flags - see wxPG_FL_XXX constants. */
     wxUint32            m_iFlags;
 
@@ -2021,7 +2107,7 @@ protected:
     void CorrectEditorWidgetPosY();
 
     int DoDrawItems( wxDC& dc,
-                     const wxRect* drawRect,
+                     const wxRect* itemsRect,
                      bool isBuffered ) const;
 
     /** Draws an expand/collapse (ie. +/-) button.
@@ -2033,7 +2119,7 @@ protected:
     void DrawItems( wxDC& dc,
                     unsigned int topItemY,
                     unsigned int bottomItemY,
-                    const wxRect* drawRect = NULL );
+                    const wxRect* itemsRect = NULL );
 
     // Translate wxKeyEvent to wxPG_ACTION_XXX
     int KeyEventToActions(wxKeyEvent &event, int* pSecond) const;
@@ -2052,7 +2138,7 @@ protected:
     /** Reloads all non-customized colours from system settings. */
     void RegainColours();
 
-    bool DoEditorValidate();
+    virtual bool DoEditorValidate();
 
     // Similar to DoSelectProperty() but also works on columns
     // other than 1. Does not active editor if column is not
@@ -2191,11 +2277,6 @@ inline void wxPGProperty::SetEditor( const wxString& editorName )
     m_customEditor = wxPropertyGridInterface::GetEditorByName(editorName);
 }
 
-inline bool wxPGProperty::Hide( bool hide, int flags )
-{
-    return GetGrid()->HideProperty(this, hide, flags);
-}
-
 inline bool wxPGProperty::SetMaxLength( int maxLen )
 {
     return GetGrid()->SetPropertyMaxLength(this,maxLen);
@@ -2254,20 +2335,20 @@ wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_PROPGRID,
 #ifndef SWIG
 typedef void (wxEvtHandler::*wxPropertyGridEventFunction)(wxPropertyGridEvent&);
 
-#define EVT_PG_SELECTED(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_SELECTED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
-#define EVT_PG_CHANGING(id, fn)              DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_CHANGING, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
-#define EVT_PG_CHANGED(id, fn)               DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_CHANGED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
-#define EVT_PG_HIGHLIGHTED(id, fn)           DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_HIGHLIGHTED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
-#define EVT_PG_RIGHT_CLICK(id, fn)           DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_RIGHT_CLICK, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
-#define EVT_PG_DOUBLE_CLICK(id, fn)          DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_DOUBLE_CLICK, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
-#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 EVT_PG_COL_BEGIN_DRAG(id, fn)        DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_BEGIN_DRAG, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
-#define EVT_PG_COL_DRAGGING(id, fn)          DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_DRAGGING, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
-#define EVT_PG_COL_END_DRAG(id, fn)          DECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_END_DRAG, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_SELECTED(id, fn)              wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_SELECTED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_CHANGING(id, fn)              wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_CHANGING, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_CHANGED(id, fn)               wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_CHANGED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_HIGHLIGHTED(id, fn)           wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_HIGHLIGHTED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_RIGHT_CLICK(id, fn)           wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_RIGHT_CLICK, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_DOUBLE_CLICK(id, fn)          wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_DOUBLE_CLICK, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_PAGE_CHANGED(id, fn)          wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_PAGE_CHANGED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_ITEM_COLLAPSED(id, fn)        wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_COLLAPSED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_ITEM_EXPANDED(id, fn)         wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_ITEM_EXPANDED, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_LABEL_EDIT_BEGIN(id, fn)      wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_LABEL_EDIT_BEGIN, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_LABEL_EDIT_ENDING(id, fn)     wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_LABEL_EDIT_ENDING, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_COL_BEGIN_DRAG(id, fn)        wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_BEGIN_DRAG, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_COL_DRAGGING(id, fn)          wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_DRAGGING, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
+#define EVT_PG_COL_END_DRAG(id, fn)          wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_PG_COL_END_DRAG, id, -1, wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn ), NULL ),
 
 #define wxPropertyGridEventHandler(fn) \
     wxEVENT_HANDLER_CAST( wxPropertyGridEventFunction, fn )