]> git.saurik.com Git - wxWidgets.git/blobdiff - src/propgrid/propgridpagestate.cpp
applying patch, fixes #10523
[wxWidgets.git] / src / propgrid / propgridpagestate.cpp
index 0803b1203759d23e408ac5fda4de70d9a2ca2c95..0e34d126fbb573f37f711d89da9237ea07dadce0 100644 (file)
@@ -201,12 +201,12 @@ void wxPropertyGridIteratorBase::Next( bool iterateChildren )
 
 wxPropertyGridPageState::wxPropertyGridPageState()
 {
-    m_pPropGrid = (wxPropertyGrid*) NULL;
+    m_pPropGrid = NULL;
     m_regularArray.SetParentState(this);
     m_properties = &m_regularArray;
-    m_abcArray = (wxPGRootProperty*) NULL;
-    m_currentCategory = (wxPropertyCategory*) NULL;
-    m_selected = (wxPGProperty*) NULL;
+    m_abcArray = NULL;
+    m_currentCategory = NULL;
+    m_selected = NULL;
     m_width = 0;
     m_virtualHeight = 0;
     m_lastCaptionBottomnest = 1;
@@ -231,7 +231,7 @@ void wxPropertyGridPageState::InitNonCatMode()
 {
     if ( !m_abcArray )
     {
-        m_abcArray = new wxPGRootProperty();
+        m_abcArray = new wxPGRootProperty(wxS("<Root_NonCat>"));
         m_abcArray->SetParentState(this);
         m_abcArray->SetFlag(wxPG_PROP_CHILDREN_ARE_COPIES);
     }
@@ -268,20 +268,27 @@ void wxPropertyGridPageState::InitNonCatMode()
 
 void wxPropertyGridPageState::DoClear()
 {
+    if ( m_pPropGrid && m_pPropGrid->GetState() == this  )
+    {
+        m_pPropGrid->ClearSelection(false);
+    }
+    else
+    {
+        m_selected = NULL;
+    }
+
     m_regularArray.Empty();
     if ( m_abcArray )
         m_abcArray->Empty();
 
     m_dictName.clear();
 
-    m_currentCategory = (wxPropertyCategory*) NULL;
+    m_currentCategory = NULL;
     m_lastCaptionBottomnest = 1;
     m_itemsAdded = 0;
 
     m_virtualHeight = 0;
     m_vhCalcPending = 0;
-
-    m_selected = (wxPGProperty*) NULL;
 }
 
 // -----------------------------------------------------------------------
@@ -369,7 +376,7 @@ void wxPropertyGridPageState::OnClientWidthChange( int newWidth, int widthChange
 wxPGProperty* wxPropertyGridPageState::GetLastItem( int flags )
 {
     if ( !m_properties->GetChildCount() )
-        return (wxPGProperty*) NULL;
+        return NULL;
 
     wxPG_ITERATOR_CREATE_MASKS(flags, int itemExMask, int parentExMask)
 
@@ -403,7 +410,7 @@ wxPropertyCategory* wxPropertyGridPageState::GetPropertyCategory( const wxPGProp
             return (wxPropertyCategory*)parent;
     } while ( grandparent );
 
-    return (wxPropertyCategory*) NULL;
+    return NULL;
 }
 
 // -----------------------------------------------------------------------
@@ -443,7 +450,7 @@ wxPGProperty* wxPropertyGridPageState::BaseGetPropertyByName( const wxString& na
     it = m_dictName.find(name);
     if ( it != m_dictName.end() )
         return (wxPGProperty*) it->second;
-    return (wxPGProperty*) NULL;
+    return NULL;
 }
 
 // -----------------------------------------------------------------------
@@ -490,7 +497,7 @@ void wxPropertyGridPageState::DoSetPropertyName( wxPGProperty* p,
 #define ITEM_ITERATION_INIT(startparent, startindex, state) \
     parent = startparent; \
     i = (unsigned int)startindex; \
-    if ( parent == (wxPGProperty*) NULL ) \
+    if ( parent == NULL ) \
     { \
         parent = state->m_properties; \
         i = 0; \
@@ -683,17 +690,9 @@ void wxPropertyGridPageState::DoSort( int flags )
 {
     DoSortChildren( m_properties, flags | wxPG_RECURSE );
 
-    // Sort categories as well (but we need not do it recursively)
-    if ( IsInNonCatMode() )
-    {
-        size_t i;
-        for ( i=0;i<m_regularArray.GetChildCount();i++)
-        {
-            wxPGProperty* p = m_regularArray.Item(i);
-            if ( p->IsCategory() )
-                DoSortChildren( p, 0 );
-        }
-    }
+    // We used to sort categories as well here also if in non-categorized
+    // mode, but doing would naturally cause child indices to become
+    // corrupted.
 }
 
 // -----------------------------------------------------------------------
@@ -720,7 +719,7 @@ wxPGProperty* wxPropertyGridPageState::DoGetItemAtY( int y ) const
 {
     // Outside?
     if ( y < 0 )
-        return (wxPGProperty*) NULL;
+        return NULL;
 
     unsigned int a = 0;
     return m_properties->GetItemAtY(y, GetGrid()->m_lineHeight, &a);
@@ -871,7 +870,7 @@ void wxPropertyGridPageState::SetSplitterLeft( bool subProps )
 {
     wxPropertyGrid* pg = GetGrid();
     wxClientDC dc(pg);
-    dc.SetFont(pg->m_font);
+    dc.SetFont(pg->GetFont());
 
     int maxW = GetColumnFitWidth(dc, m_properties, 0, subProps);
 
@@ -888,7 +887,7 @@ wxSize wxPropertyGridPageState::DoFitColumns( bool WXUNUSED(allowGridResize) )
 {
     wxPropertyGrid* pg = GetGrid();
     wxClientDC dc(pg);
-    dc.SetFont(pg->m_font);
+    dc.SetFont(pg->GetFont());
 
     int marginWidth = pg->m_marginWidth;
     int accWid = marginWidth;
@@ -1208,33 +1207,6 @@ bool wxPropertyGridPageState::DoSetPropertyValueWxObjectPtr( wxPGProperty* p, wx
     return false;
 }
 
-// -----------------------------------------------------------------------
-
-void wxPropertyGridPageState::DoSetPropertyValueUnspecified( wxPGProperty* p )
-{
-    wxCHECK_RET( p, wxT("invalid property id") );
-
-    if ( !p->IsValueUnspecified() )
-    {
-        // Value should be set first - editor class methods may need it
-        p->m_value.MakeNull();
-
-        wxASSERT( m_pPropGrid );
-
-        if ( m_pPropGrid->GetState() == this )
-        {
-            if ( m_pPropGrid->m_selected == p && m_pPropGrid->m_wndEditor )
-            {
-                p->GetEditorClass()->SetValueToUnspecified(p, m_pPropGrid->GetEditorControl());
-            }
-        }
-
-        unsigned int i;
-        for ( i = 0; i < p->GetChildCount(); i++ )
-            DoSetPropertyValueUnspecified( p->Item(i) );
-    }
-}
-
 // -----------------------------------------------------------------------
 // wxPropertyGridPageState property operations
 // -----------------------------------------------------------------------
@@ -1458,7 +1430,7 @@ void wxPropertyGridPageState::DoSetPropertyValues( const wxVariantList& list, wx
                     if ( wxStrcmp(current->GetType(), wxS("list")) == 0 )
                     {
                         DoSetPropertyValues( current->GetList(),
-                                p->IsCategory()?p:((wxPGProperty*)NULL)
+                                p->IsCategory()?p:(NULL)
                             );
                     }
                     else
@@ -1570,7 +1542,7 @@ bool wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property,
 
     // This will allow better behavior.
     if ( scheduledParent == m_properties )
-        scheduledParent = (wxPGProperty*) NULL;
+        scheduledParent = NULL;
 
     if ( scheduledParent && !scheduledParent->IsCategory() )
     {
@@ -1648,7 +1620,7 @@ wxPGProperty* wxPropertyGridPageState::DoAppend( wxPGProperty* property )
 {
     wxPropertyCategory* cur_cat = m_currentCategory;
     if ( property->IsCategory() )
-        cur_cat = (wxPropertyCategory*) NULL;
+        cur_cat = NULL;
 
     return DoInsert( cur_cat, -1, property );
 }
@@ -1671,6 +1643,9 @@ wxPGProperty* wxPropertyGridPageState::DoInsert( wxPGProperty* parent, int index
     if ( !res )
         return m_currentCategory;
 
+    bool parentIsRoot = parent->IsRoot();
+    bool parentIsCategory = parent->IsCategory();
+
     // Note that item must be added into current mode later.
 
     // If parent is wxParentProperty, just stick it in...
@@ -1683,42 +1658,34 @@ wxPGProperty* wxPropertyGridPageState::DoInsert( wxPGProperty* parent, int index
     //   1) Add to given category in given index.
     //   2) Add as last item in m_abcArray.
 
-    if ( !parent->IsCategory() && !parent->IsRoot() )
-    {
-        // Parent is wxParentingProperty: Just stick it in...
-        parent->AddChild2( property, index );
-    }
-    else
+    if ( m_properties == &m_regularArray )
     {
-        // Parent is Category or Root.
+        // We are currently in Categorized mode
 
-        if ( m_properties == &m_regularArray )
+        // Only add non-categories to m_abcArray.
+        if ( m_abcArray && !property->IsCategory() &&
+             (parentIsCategory || parentIsRoot) )
         {
-            // Categorized mode
-
-            // Only add non-categories to m_abcArray.
-            if ( m_abcArray && !property->IsCategory() )
-                m_abcArray->AddChild2( property, -1, false );
-
-            // Add to current mode.
-            parent->AddChild2( property, index );
-
+            m_abcArray->AddChild2( property, -1, false );
         }
-        else
-        {
-            // Non-categorized mode.
 
-            if ( parent != m_properties )
-                // Parent is category.
-                parent->AddChild2( property, index, false );
-            else
-                // Parent is root.
-                m_regularArray.AddChild2( property, -1, false );
-
-            // Add to current mode (no categories).
-            if ( !property->IsCategory() )
-                m_abcArray->AddChild2( property, index );
-        }
+        // Add to current mode.
+        parent->AddChild2( property, index, true );
+    }
+    else
+    {
+        // We are currently in Non-categorized/Alphabetic mode
+
+        if ( parentIsCategory )
+            // Parent is category.
+            parent->AddChild2( property, index, false );
+        else if ( parentIsRoot )
+            // Parent is root.
+            m_regularArray.AddChild2( property, -1, false );
+
+        // Add to current mode
+        if ( !property->IsCategory() )
+            m_abcArray->AddChild2( property, index, true );
     }
 
     // category stuff
@@ -1732,7 +1699,7 @@ wxPGProperty* wxPropertyGridPageState::DoInsert( wxPGProperty* parent, int index
 
     // Only add name to hashmap if parent is root or category
     if ( property->m_name.length() &&
-        (parent->IsCategory() || parent->IsRoot()) )
+        (parentIsCategory || parentIsRoot) )
         m_dictName[property->m_name] = (void*) property;
 
     VirtualHeightChanged();
@@ -1769,7 +1736,7 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item, bool doDelete )
         if ( item->IsCategory() )
         {
             if ( pwc == m_currentCategory )
-                m_currentCategory = (wxPropertyCategory*) NULL;
+                m_currentCategory = NULL;
         }
 
         item->DeleteChildren();