]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/propgrid/propgridpagestate.h
Resolve GCC's 'type-punned pointer will break strict-aliasing rules' warning by break...
[wxWidgets.git] / include / wx / propgrid / propgridpagestate.h
index 95909a3b409e9a8deeed15a36567ac6f4b171407..828db8d2a04b17cb9a9efeb416f7a9ce2bf83834 100644 (file)
     A return value from wxPropertyGrid::HitTest(),
     contains all you need to know about an arbitrary location on the grid.
 */
     A return value from wxPropertyGrid::HitTest(),
     contains all you need to know about an arbitrary location on the grid.
 */
-struct WXDLLIMPEXP_PROPGRID wxPropertyGridHitTestResult
+class WXDLLIMPEXP_PROPGRID wxPropertyGridHitTestResult
 {
     friend class wxPropertyGridPageState;
 public:
 {
     friend class wxPropertyGridPageState;
 public:
+    wxPropertyGridHitTestResult()
+    {
+        m_property = NULL;
+        m_column = -1;
+        m_splitter = -1;
+        m_splitterHitOffset = 0;
+    }
 
 
-    wxPGProperty* GetProperty() const { return property; }
+    ~wxPropertyGridHitTestResult()
+    {
+    }
 
 
-    /** Column. -1 for margin. */
-    int             column;
+    /**
+        Returns column hit. -1 for margin.
+    */
+    int GetColumn() const { return m_column; }
 
 
-    /** Index of splitter hit, -1 for none. */
-    int             splitter;
+    /**
+        Returns property hit. NULL if empty space below
+        properties was hit instead.
+    */
+    wxPGProperty* GetProperty() const
+    {
+        return m_property;
+    }
 
 
-    /** If splitter hit, offset to that */
-    int             splitterHitOffset;
+    /**
+        Returns index of splitter hit, -1 for none.
+    */
+    int GetSplitter() const { return m_splitter; }
+
+    /**
+        If splitter hit, then this member function
+        returns offset to the exact splitter position.
+    */
+    int GetSplitterHitOffset() const { return m_splitterHitOffset; }
 
 private:
     /** Property. NULL if empty space below properties was hit */
 
 private:
     /** Property. NULL if empty space below properties was hit */
-    wxPGProperty*   property;
+    wxPGProperty*   m_property;
+
+    /** Column. -1 for margin. */
+    int             m_column;
+
+    /** Index of splitter hit, -1 for none. */
+    int             m_splitter;
+
+    /** If splitter hit, offset to that */
+    int             m_splitterHitOffset;
 };
 
 // -----------------------------------------------------------------------
 };
 
 // -----------------------------------------------------------------------
@@ -234,7 +268,8 @@ private:
     } \
     const CLASS& operator=( const CLASS& it ) \
     { \
     } \
     const CLASS& operator=( const CLASS& it ) \
     { \
-        Assign(it); \
+        if (this != &it) \
+            Assign(it); \
         return *this; \
     } \
     CLASS& operator++() { Next(); return *this; } \
         return *this; \
     } \
     CLASS& operator++() { Next(); return *this; } \
@@ -289,6 +324,23 @@ public:
                             const wxPGProperty,
                             const wxPropertyGridPageState)
 
                             const wxPGProperty,
                             const wxPropertyGridPageState)
 
+    /**
+        Additional copy constructor.
+    */
+    wxPropertyGridConstIterator( const wxPropertyGridIterator& other )
+    {
+        Assign(other);
+    }
+
+    /**
+        Additional assignment operator.
+    */
+    const wxPropertyGridConstIterator& operator=( const wxPropertyGridIterator& it )
+    {
+        Assign(it);
+        return *this;
+    }
+
 protected:
 };
 
 protected:
 };
 
@@ -296,28 +348,16 @@ protected:
 
 /** Base class to derive new viterators.
 */
 
 /** Base class to derive new viterators.
 */
-class WXDLLIMPEXP_PROPGRID wxPGVIteratorBase
+class WXDLLIMPEXP_PROPGRID wxPGVIteratorBase : public wxObjectRefData
 {
     friend class wxPGVIterator;
 public:
 {
     friend class wxPGVIterator;
 public:
-    wxPGVIteratorBase() { m_refCount = 1; }
+    wxPGVIteratorBase() { }
     virtual void Next() = 0;
     virtual void Next() = 0;
-    void IncRef()
-    {
-        m_refCount++;
-    }
-    void DecRef()
-    {
-        m_refCount--;
-        if ( m_refCount <= 0 )
-            delete this;
-    }
 protected:
     virtual ~wxPGVIteratorBase() { }
 
     wxPropertyGridIterator  m_it;
 protected:
     virtual ~wxPGVIteratorBase() { }
 
     wxPropertyGridIterator  m_it;
-private:
-    int     m_refCount;
 };
 
 /** @class wxPGVIterator
 };
 
 /** @class wxPGVIterator
@@ -339,15 +379,16 @@ public:
         m_pIt = it.m_pIt;
         m_pIt->IncRef();
     }
         m_pIt = it.m_pIt;
         m_pIt->IncRef();
     }
-#ifndef SWIG
     const wxPGVIterator& operator=( const wxPGVIterator& it )
     {
     const wxPGVIterator& operator=( const wxPGVIterator& it )
     {
-        UnRef();
-        m_pIt = it.m_pIt;
-        m_pIt->IncRef();
+        if (this != &it)
+        {
+            UnRef();
+            m_pIt = it.m_pIt;
+            m_pIt->IncRef();
+        }
         return *this;
     }
         return *this;
     }
-#endif
     void Next() { m_pIt->Next(); }
     bool AtEnd() const { return m_pIt->m_it.AtEnd(); }
     wxPGProperty* GetProperty() const { return m_pIt->m_it.GetProperty(); }
     void Next() { m_pIt->Next(); }
     bool AtEnd() const { return m_pIt->m_it.AtEnd(); }
     wxPGProperty* GetProperty() const { return m_pIt->m_it.GetProperty(); }
@@ -357,9 +398,6 @@ protected:
 
 // -----------------------------------------------------------------------
 
 
 // -----------------------------------------------------------------------
 
-#ifndef SWIG
-// We won't need this class from wxPython
-
 /** @class wxPropertyGridPageState
 
     Contains low-level property page information (properties, column widths,
 /** @class wxPropertyGridPageState
 
     Contains low-level property page information (properties, column widths,
@@ -400,7 +438,7 @@ public:
         Override this member function to add custom behavior on property
         deletion.
     */
         Override this member function to add custom behavior on property
         deletion.
     */
-    virtual void DoDelete( wxPGProperty* item );
+    virtual void DoDelete( wxPGProperty* item, bool doDelete = true );
 
     wxSize DoFitColumns( bool allowGridResize = false );
 
 
     wxSize DoFitColumns( bool allowGridResize = false );
 
@@ -420,8 +458,7 @@ public:
     */
     virtual void DoSetSplitterPosition( int pos,
                                         int splitterColumn = 0,
     */
     virtual void DoSetSplitterPosition( int pos,
                                         int splitterColumn = 0,
-                                        bool allPages = false,
-                                        bool fromAutoCenter = false );
+                                        int flags = 0 );
 
     bool EnableCategories( bool enable );
 
 
     bool EnableCategories( bool enable );
 
@@ -466,11 +503,6 @@ public:
         return (unsigned int) m_colWidths.size();
     }
 
         return (unsigned int) m_colWidths.size();
     }
 
-    wxPGProperty* GetSelection() const
-    {
-        return m_selected;
-    }
-
     int GetColumnMinWidth( int column ) const;
 
     int GetColumnWidth( unsigned int column ) const
     int GetColumnMinWidth( int column ) const;
 
     int GetColumnWidth( unsigned int column ) const
@@ -491,6 +523,39 @@ public:
         return ((wxPropertyGridPageState*)this)->GetLastItem(flags);
     }
 
         return ((wxPropertyGridPageState*)this)->GetLastItem(flags);
     }
 
+    /**
+        Returns currently selected property.
+    */
+    wxPGProperty* GetSelection() const
+    {
+        if ( m_selection.size() == 0 )
+            return NULL;
+        return m_selection[0];
+    }
+
+    void DoSetSelection( wxPGProperty* prop )
+    {
+        m_selection.clear();
+        if ( prop )
+            m_selection.push_back(prop);
+    }
+
+    bool DoClearSelection()
+    {
+        return DoSelectProperty(NULL);
+    }
+
+    void DoRemoveFromSelection( wxPGProperty* prop );
+
+    void DoSetColumnProportion( unsigned int column, int proportion );
+
+    int DoGetColumnProportion( unsigned int column ) const
+    {
+        return m_columnProportions[column];
+    }
+
+    void ResetColumnSizes( int setSplitterFlags );
+
     wxPropertyCategory* GetPropertyCategory( const wxPGProperty* p ) const;
 
     wxPGProperty* GetPropertyByLabel( const wxString& name,
     wxPropertyCategory* GetPropertyCategory( const wxPGProperty* p ) const;
 
     wxPGProperty* GetPropertyByLabel( const wxString& name,
@@ -521,24 +586,13 @@ public:
                           unsigned int col,
                           bool subProps) const;
 
                           unsigned int col,
                           bool subProps) const;
 
-    /** Returns information about arbitrary position in the grid.
-
-        wxPropertyGridHitTestResult definition:
-        @code
-            struct wxPropertyGridHitTestResult
-            {
-                wxPGProperty* GetProperty() const;
-
-                // column. -1 for margin
-                int             column;
-
-                // Index of splitter hit, -1 for none.
-                int             splitter;
+    /**
+        Returns information about arbitrary position in the grid.
 
 
-                // If splitter hit, then offset to that.
-                int             splitterHitOffset;
-            };
-        @endcode
+        @param pt
+            Logical coordinates in the virtual grid space. Use
+            wxScrolledWindow::CalcUnscrolledPosition() if you need to
+            translate a scrolled position into a logical one.
     */
     wxPropertyGridHitTestResult HitTest( const wxPoint& pt ) const;
 
     */
     wxPropertyGridHitTestResult HitTest( const wxPoint& pt ) const;
 
@@ -548,9 +602,6 @@ public:
 
     bool IsInNonCatMode() const { return (bool)(m_properties == m_abcArray); }
 
 
     bool IsInNonCatMode() const { return (bool)(m_properties == m_abcArray); }
 
-    /** Only inits arrays, doesn't migrate things or such. */
-    void InitNonCatMode ();
-
     void DoLimitPropertyEditing( wxPGProperty* p, bool limit = true )
     {
         p->SetFlagRecursively(wxPG_PROP_NOEDITOR, limit);
     void DoLimitPropertyEditing( wxPGProperty* p, bool limit = true )
     {
         p->SetFlagRecursively(wxPG_PROP_NOEDITOR, limit);
@@ -585,17 +636,15 @@ public:
     void DoSetPropertyValues( const wxVariantList& list,
                               wxPGProperty* default_category );
 
     void DoSetPropertyValues( const wxVariantList& list,
                               wxPGProperty* default_category );
 
-    void DoSetPropertyValueUnspecified( wxPGProperty* p );
-
     void SetSplitterLeft( bool subProps = false );
 
     /** Set virtual width for this particular page. */
     void SetVirtualWidth( int width );
 
     void SetSplitterLeft( bool subProps = false );
 
     /** Set virtual width for this particular page. */
     void SetVirtualWidth( int width );
 
-    void SortChildren( wxPGProperty* p );
-    void Sort();
+    void DoSortChildren( wxPGProperty* p, int flags = 0 );
+    void DoSort( int flags = 0 );
 
 
-    void SetSelection( wxPGProperty* p ) { m_selected = p; }
+    bool PrepareAfterItemsAdded();
 
     /** Called after virtual height needs to be recalculated.
     */
 
     /** Called after virtual height needs to be recalculated.
     */
@@ -610,14 +659,11 @@ public:
     /** Returns property by its name. */
     wxPGProperty* BaseGetPropertyByName( const wxString& name ) const;
 
     /** Returns property by its name. */
     wxPGProperty* BaseGetPropertyByName( const wxString& name ) const;
 
-    void DoClearSelection()
-    {
-        m_selected = NULL;
-    }
-
     /** Called in, for example, wxPropertyGrid::Clear. */
     void DoClear();
 
     /** Called in, for example, wxPropertyGrid::Clear. */
     void DoClear();
 
+    bool DoIsPropertySelected( wxPGProperty* prop ) const;
+
     bool DoCollapse( wxPGProperty* p );
 
     bool DoExpand( wxPGProperty* p );
     bool DoCollapse( wxPGProperty* p );
 
     bool DoExpand( wxPGProperty* p );
@@ -626,6 +672,11 @@ public:
 
 protected:
 
 
 protected:
 
+    // Utility to check if two properties are visibly next to each other
+    bool ArePropertiesAdjacent( wxPGProperty* prop1,
+                                wxPGProperty* prop2,
+                                int iterFlags = wxPG_ITERATE_VISIBLE ) const;
+
     int DoGetSplitterPosition( int splitterIndex = 0 ) const;
 
     /** Returns column at x coordinate (in GetGrid()->GetPanel()).
     int DoGetSplitterPosition( int splitterIndex = 0 ) const;
 
     /** Returns column at x coordinate (in GetGrid()->GetPanel()).
@@ -659,13 +710,19 @@ protected:
     /** List of column widths (first column does not include margin). */
     wxArrayInt                  m_colWidths;
 
     /** List of column widths (first column does not include margin). */
     wxArrayInt                  m_colWidths;
 
+    /** List of indices of columns the user can edit by clicking it. */
+    wxArrayInt                  m_editableColumns;
+
+    /** Column proportions */
+    wxArrayInt                  m_columnProportions;
+
     double                      m_fSplitterX;
 
     /** Most recently added category. */
     wxPropertyCategory*         m_currentCategory;
 
     double                      m_fSplitterX;
 
     /** Most recently added category. */
     wxPropertyCategory*         m_currentCategory;
 
-    /** Pointer to selected property. */
-    wxPGProperty*               m_selected;
+    /** Array of selected property. */
+    wxArrayPGProperty           m_selection;
 
     /** Virtual width. */
     int                         m_width;
 
     /** Virtual width. */
     int                         m_width;
@@ -686,9 +743,17 @@ protected:
     unsigned char               m_anyModified;
 
     unsigned char               m_vhCalcPending;
     unsigned char               m_anyModified;
 
     unsigned char               m_vhCalcPending;
-};
 
 
-#endif // #ifndef SWIG
+    /** True if splitter has been pre-set by the application. */
+    bool                        m_isSplitterPreSet;
+
+    /** Used to (temporarily) disable splitter centering. */
+    bool                        m_dontCenterSplitter;
+
+private:
+    /** Only inits arrays, doesn't migrate things or such. */
+    void InitNonCatMode();
+};
 
 // -----------------------------------------------------------------------
 
 
 // -----------------------------------------------------------------------