]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/propgrid/propgrid.h
Add support for the new history functions to the ie backend. For this we manage our...
[wxWidgets.git] / include / wx / propgrid / propgrid.h
index 9d783e2be08a4d71b2b3e949f969d310d382340c..96bd76b787153644e6737450d5a1e27bc105adc9 100644 (file)
@@ -6,16 +6,19 @@
 // Created:     2004-09-25
 // RCS-ID:      $Id$
 // Copyright:   (c) Jaakko Salli
 // 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_
 
 /////////////////////////////////////////////////////////////////////////////
 
 #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"
 #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/scrolwin.h"
 #include "wx/tooltip.h"
 #include "wx/datetime.h"
@@ -31,6 +34,10 @@ extern WXDLLIMPEXP_DATA_PROPGRID(const char) wxPropertyGridNameStr[];
 
 class wxPGComboBox;
 
 
 class wxPGComboBox;
 
+#if wxUSE_STATUSBAR
+class WXDLLIMPEXP_FWD_CORE wxStatusBar;
+#endif
+
 // -----------------------------------------------------------------------
 // Global variables
 // -----------------------------------------------------------------------
 // -----------------------------------------------------------------------
 // Global variables
 // -----------------------------------------------------------------------
@@ -152,7 +159,7 @@ wxPG_ALPHABETIC_MODE                = (wxPG_HIDE_CATEGORIES|wxPG_AUTO_SORT),
 wxPG_BOLD_MODIFIED                  = 0x00000040,
 
 /** Using this style, the column splitters move automatically based on column
 wxPG_BOLD_MODIFIED                  = 0x00000040,
 
 /** Using this style, the column splitters move automatically based on column
-    proportions (default is equal proportion for every column). This behavior
+    proportions (default is equal proportion for every column). This behaviour
     stops once the user manually moves a splitter, and returns when a
     splitter is double-clicked.
 
     stops once the user manually moves a splitter, and returns when a
     splitter is double-clicked.
 
@@ -241,7 +248,7 @@ wxPG_EX_MODE_BUTTONS                = 0x00008000,
 */
 wxPG_EX_HELP_AS_TOOLTIPS            = 0x00010000,
 
 */
 wxPG_EX_HELP_AS_TOOLTIPS            = 0x00010000,
 
-/** Prevent TAB from focusing to wxButtons. This behavior was default
+/** 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
     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
@@ -369,7 +376,7 @@ protected:
 
 // -----------------------------------------------------------------------
 
 
 // -----------------------------------------------------------------------
 
-/** @section propgrid_vfbflags wxPropertyGrid Validation Failure Behavior Flags
+/** @section propgrid_vfbflags wxPropertyGrid Validation Failure behaviour Flags
     @{
 */
 
     @{
 */
 
@@ -377,7 +384,7 @@ enum wxPG_VALIDATION_FAILURE_BEHAVIOR_FLAGS
 {
 
 /** Prevents user from leaving property unless value is valid. If this
 {
 
 /** Prevents user from leaving property unless value is valid. If this
-    behavior flag is not used, then value change is instead cancelled.
+    behaviour flag is not used, then value change is instead cancelled.
 */
 wxPG_VFB_STAY_IN_PROPERTY           = 0x01,
 
 */
 wxPG_VFB_STAY_IN_PROPERTY           = 0x01,
 
@@ -389,12 +396,34 @@ wxPG_VFB_BEEP                       = 0x02,
 */
 wxPG_VFB_MARK_CELL                  = 0x04,
 
 */
 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 behaviour is to display the text on
+    the top-level frame's status bar, if present, and otherwise
+    using wxMessageBox.
 */
 wxPG_VFB_SHOW_MESSAGE               = 0x08,
 
 */
 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. */
 /** 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
 
 /** Only used internally. */
 wxPG_VFB_UNDEFINED                  = 0x80
@@ -420,8 +449,18 @@ class WXDLLIMPEXP_PROPGRID wxPGValidationInfo
 {
     friend class wxPropertyGrid;
 public:
 {
     friend class wxPropertyGrid;
 public:
+    wxPGValidationInfo()
+    {
+        m_failureBehavior = 0;
+        m_isFailing = false;
+    }
+
+    ~wxPGValidationInfo()
+    {
+    }
+
     /**
     /**
-        @return Returns failure behavior which is a combination of
+        @return Returns failure behaviour which is a combination of
                @ref propgrid_vfbflags.
     */
     wxPGVFBFlags GetFailureBehavior() const
                @ref propgrid_vfbflags.
     */
     wxPGVFBFlags GetFailureBehavior() const
@@ -442,7 +481,7 @@ public:
         return *m_pValue;
     }
 
         return *m_pValue;
     }
 
-    /** Set validation failure behavior
+    /** Set validation failure behaviour
 
         @param failureBehavior
             Mixture of @ref propgrid_vfbflags.
 
         @param failureBehavior
             Mixture of @ref propgrid_vfbflags.
@@ -465,9 +504,12 @@ private:
     */
     wxString        m_failureMessage;
 
     */
     wxString        m_failureMessage;
 
-    /** Validation failure behavior. Use wxPG_VFB_XXX flags.
+    /** Validation failure behaviour. Use wxPG_VFB_XXX flags.
     */
     wxPGVFBFlags    m_failureBehavior;
     */
     wxPGVFBFlags    m_failureBehavior;
+
+    // True when validation is currently failing.
+    bool            m_isFailing;
 };
 
 // -----------------------------------------------------------------------
 };
 
 // -----------------------------------------------------------------------
@@ -482,12 +524,32 @@ private:
 enum wxPG_KEYBOARD_ACTIONS
 {
     wxPG_ACTION_INVALID = 0,
 enum wxPG_KEYBOARD_ACTIONS
 {
     wxPG_ACTION_INVALID = 0,
+
+    /** Select the next property. */
     wxPG_ACTION_NEXT_PROPERTY,
     wxPG_ACTION_NEXT_PROPERTY,
+
+    /** Select the previous property. */
     wxPG_ACTION_PREV_PROPERTY,
     wxPG_ACTION_PREV_PROPERTY,
+
+    /** Expand the selected property, if it has child items. */
     wxPG_ACTION_EXPAND_PROPERTY,
     wxPG_ACTION_EXPAND_PROPERTY,
+
+    /** Collapse the selected property, if it has child items. */
     wxPG_ACTION_COLLAPSE_PROPERTY,
     wxPG_ACTION_COLLAPSE_PROPERTY,
+
+    /** Cancel and undo any editing done in the currently active property
+        editor.
+    */
     wxPG_ACTION_CANCEL_EDIT,
     wxPG_ACTION_CANCEL_EDIT,
-    wxPG_ACTION_PRESS_BUTTON,  // Causes editor button (if any) to be pressed
+
+    /** Move focus to the editor control of the currently selected
+        property.
+    */
+    wxPG_ACTION_EDIT,
+
+    /** Causes editor's button (if any) to be pressed. */
+    wxPG_ACTION_PRESS_BUTTON,
+
     wxPG_ACTION_MAX
 };
 
     wxPG_ACTION_MAX
 };
 
@@ -671,8 +733,9 @@ enum wxPG_SET_SPLITTER_POSITION_SPLITTER_FLAGS
     @library{wxpropgrid}
     @category{propgrid}
 */
     @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;
 {
     friend class wxPropertyGridEvent;
     friend class wxPropertyGridPageState;
@@ -694,7 +757,7 @@ public:
 #endif
 
     /** The default constructor. The styles to be used are styles valid for
 #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
     */
 
         @see @link wndflags Additional Window Styles @endlink
     */
@@ -709,12 +772,38 @@ public:
 
     /** Adds given key combination to trigger given action.
 
 
     /** 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
         @param action
-            Which action to trigger. See @link pgactions List of list of
-            wxPropertyGrid actions@endlink.
+            Which action to trigger. See @ref propgrid_keyboard_actions.
+        @param keycode
+            Which keycode triggers the action.
+        @param modifiers
+            Which key event modifiers, in addition to keycode, are needed to
+            trigger the action.
     */
     void AddActionTrigger( int action, int keycode, int modifiers = 0 );
 
     */
     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,
     /**
         This static function enables or disables automatic use of
         wxGetTranslation for following strings: wxEnumProperty list labels,
@@ -737,7 +826,7 @@ public:
 
     /**
         Centers the splitter.
 
     /**
         Centers the splitter.
-        
+
         @param enableAutoResizing
             If @true, automatic column resizing is enabled (only applicapple
             if window style wxPG_SPLITTER_AUTO_CENTER is used).
         @param enableAutoResizing
             If @true, automatic column resizing is enabled (only applicapple
             if window style wxPG_SPLITTER_AUTO_CENTER is used).
@@ -976,7 +1065,7 @@ public:
 
         @param pt
             Coordinates in the virtual grid space. You may need to use
 
         @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.
     */
             wxPropertyGrid client coordinates into something this member
             function can use.
     */
@@ -1461,19 +1550,7 @@ public:
     void RefreshEditor();
 
     // Events from editor controls are forward to this function
     void RefreshEditor();
 
     // 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 );
+    bool HandleCustomEditorEvent( wxEvent &event );
 
     // Mostly useful for page switching.
     void SwitchState( wxPropertyGridPageState* pNewState );
 
     // Mostly useful for page switching.
     void SwitchState( wxPropertyGridPageState* pNewState );
@@ -1494,11 +1571,11 @@ public:
 
     /** Standardized double-to-string conversion.
     */
 
     /** Standardized double-to-string conversion.
     */
-    static void DoubleToString( wxString& target,
-                                double value,
-                                int precision,
-                                bool removeZeroes,
-                                wxString* precTemplate );
+    static const wxString& DoubleToString( wxString& target,
+                                           double value,
+                                           int precision,
+                                           bool removeZeroes,
+                                           wxString* precTemplate = NULL );
 
     /**
         Call this from wxPGProperty::OnEvent() to cause property value to be
 
     /**
         Call this from wxPGProperty::OnEvent() to cause property value to be
@@ -1548,7 +1625,7 @@ public:
             Return true if user is allowed to change to another property even
             if current has invalid value.
         @remarks
             Return true if user is allowed to change to another property even
             if current has invalid value.
         @remarks
-        To add your own validation failure behavior, override
+        To add your own validation failure behaviour, override
         wxPropertyGrid::DoOnValidationFailure().
     */
     bool OnValidationFailure( wxPGProperty* property,
         wxPropertyGrid::DoOnValidationFailure().
     */
     bool OnValidationFailure( wxPGProperty* property,
@@ -1566,13 +1643,39 @@ public:
         m_validationInfo.m_failureMessage.clear();
     }
 
         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).
         (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 );
 
     */
     virtual void DoShowPropertyError( wxPGProperty* property,
                                       const wxString& msg );
 
-    /** Override to customize property validation failure behavior.
+    /**
+        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 behaviour of using the top-level wxFrame's status
+        bar, if any.
+    */
+    virtual wxStatusBar* GetStatusBar();
+#endif
+
+    /** Override to customize property validation failure behaviour.
         @param invalidValue
             Value which failed in validation.
         @return
         @param invalidValue
             Value which failed in validation.
         @return
@@ -1640,7 +1743,7 @@ protected:
     /**
         Runs all validation functionality (includes sending wxEVT_PG_CHANGING).
         Returns true if all tests passed. Implement in derived class to
     /**
         Runs all validation functionality (includes sending wxEVT_PG_CHANGING).
         Returns true if all tests passed. Implement in derived class to
-        add additional validation behavior.
+        add additional validation behaviour.
     */
     virtual bool PerformValidation( wxPGProperty* p,
                                     wxVariant& pendingValue,
     */
     virtual bool PerformValidation( wxPGProperty* p,
                                     wxVariant& pendingValue,
@@ -1674,9 +1777,6 @@ public:
     virtual void Refresh( bool eraseBackground = true,
                           const wxRect *rect = (const wxRect *) NULL );
     virtual bool SetFont( const wxFont& font );
     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();
     virtual void Freeze();
     virtual void SetExtraStyle( long exStyle );
     virtual void Thaw();
@@ -1695,9 +1795,7 @@ protected:
     wxWindow            *m_wndEditor;
     wxWindow            *m_wndEditor2;
 
     wxWindow            *m_wndEditor;
     wxWindow            *m_wndEditor2;
 
-#if wxPG_DOUBLE_BUFFER
     wxBitmap            *m_doubleBuffer;
     wxBitmap            *m_doubleBuffer;
-#endif
 
     /** Local time ms when control was created. */
     wxLongLong          m_timeCreated;
 
     /** Local time ms when control was created. */
     wxLongLong          m_timeCreated;
@@ -1764,12 +1862,7 @@ protected:
     /** Current cursor id. */
     int                 m_curcursor;
 
     /** 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.
     wxFont              m_captionFont;
 
     int                 m_fontHeight;  // Height of the font.
@@ -1814,6 +1907,10 @@ protected:
     wxArrayPGProperty   m_deletedProperties;
     wxArrayPGProperty   m_removedProperties;
 
     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
     //
     //
     // Temporary values
     //
@@ -1845,13 +1942,15 @@ protected:
     unsigned char       m_keyComboConsumed;
 
     /** 1 if in DoPropertyChanged() */
     unsigned char       m_keyComboConsumed;
 
     /** 1 if in DoPropertyChanged() */
-    unsigned char       m_inDoPropertyChanged;
+    bool                m_inDoPropertyChanged;
 
     /** 1 if in CommitChangesFromEditor() */
 
     /** 1 if in CommitChangesFromEditor() */
-    unsigned char       m_inCommitChangesFromEditor;
+    bool                m_inCommitChangesFromEditor;
 
     /** 1 if in DoSelectProperty() */
 
     /** 1 if in DoSelectProperty() */
-    unsigned char       m_inDoSelectProperty;
+    bool                m_inDoSelectProperty;
+
+    bool                m_inOnValidationFailure;
 
     wxPGVFBFlags        m_permanentValidationFailureBehavior;  // Set by app
 
 
     wxPGVFBFlags        m_permanentValidationFailureBehavior;  // Set by app
 
@@ -2030,7 +2129,7 @@ protected:
     void CorrectEditorWidgetPosY();
 
     int DoDrawItems( wxDC& dc,
     void CorrectEditorWidgetPosY();
 
     int DoDrawItems( wxDC& dc,
-                     const wxRect* drawRect,
+                     const wxRect* itemsRect,
                      bool isBuffered ) const;
 
     /** Draws an expand/collapse (ie. +/-) button.
                      bool isBuffered ) const;
 
     /** Draws an expand/collapse (ie. +/-) button.
@@ -2042,7 +2141,7 @@ protected:
     void DrawItems( wxDC& dc,
                     unsigned int topItemY,
                     unsigned int bottomItemY,
     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;
 
     // Translate wxKeyEvent to wxPG_ACTION_XXX
     int KeyEventToActions(wxKeyEvent &event, int* pSecond) const;
@@ -2137,6 +2236,8 @@ protected:
                     unsigned int selFlags = wxPG_SEL_NOVALIDATE,
                     unsigned int column = 1 );
 
                     unsigned int selFlags = wxPG_SEL_NOVALIDATE,
                     unsigned int column = 1 );
 
+    // This function only moves focus to the wxPropertyGrid if it already
+    // was on one of its child controls.
     void SetFocusOnCanvas();
 
     bool DoHideProperty( wxPGProperty* p, bool hide, int flags );
     void SetFocusOnCanvas();
 
     bool DoHideProperty( wxPGProperty* p, bool hide, int flags );
@@ -2386,7 +2487,7 @@ public:
     }
 
     /**
     }
 
     /**
-        Set override validation failure behavior.
+        Set override validation failure behaviour.
 
         Only effective if Veto was also called, and only allowed if event type
         is wxEVT_PG_CHANGING.
 
         Only effective if Veto was also called, and only allowed if event type
         is wxEVT_PG_CHANGING.
@@ -2584,7 +2685,6 @@ protected:
     #undef wxPG_FL_INITIALIZED
     #undef wxPG_FL_ACTIVATION_BY_CLICK
     #undef wxPG_SUPPORT_TOOLTIPS
     #undef wxPG_FL_INITIALIZED
     #undef wxPG_FL_ACTIVATION_BY_CLICK
     #undef wxPG_SUPPORT_TOOLTIPS
-    #undef wxPG_DOUBLE_BUFFER
     #undef wxPG_ICON_WIDTH
     #undef wxPG_USE_RENDERER_NATIVE
 // Following are needed by the manager headers
     #undef wxPG_ICON_WIDTH
     #undef wxPG_USE_RENDERER_NATIVE
 // Following are needed by the manager headers