]> git.saurik.com Git - wxWidgets.git/blobdiff - src/propgrid/propgridpagestate.cpp
Added wxChoice renderer to wxDataViewCtrl
[wxWidgets.git] / src / propgrid / propgridpagestate.cpp
index 859dff0d519e4083df228885ace02b20d6e0d802..fc4f6f14e5b57ba33457220dbdc2012a6d45d4cc 100644 (file)
@@ -4,7 +4,7 @@
 // Author:      Jaakko Salli
 // Modified by:
 // Created:     2008-08-24
 // Author:      Jaakko Salli
 // Modified by:
 // Created:     2008-08-24
-// RCS-ID:      $Id:
+// RCS-ID:      $Id$
 // Copyright:   (c) Jaakko Salli
 // Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 // Copyright:   (c) Jaakko Salli
 // Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
@@ -16,6 +16,8 @@
     #pragma hdrstop
 #endif
 
     #pragma hdrstop
 #endif
 
+#if wxUSE_PROPGRID
+
 #ifndef WX_PRECOMP
     #include "wx/defs.h"
     #include "wx/object.h"
 #ifndef WX_PRECOMP
     #include "wx/defs.h"
     #include "wx/object.h"
     #include "wx/panel.h"
     #include "wx/dc.h"
     #include "wx/dcmemory.h"
     #include "wx/panel.h"
     #include "wx/dc.h"
     #include "wx/dcmemory.h"
-    #include "wx/button.h"
     #include "wx/pen.h"
     #include "wx/brush.h"
     #include "wx/pen.h"
     #include "wx/brush.h"
-    #include "wx/cursor.h"
-    #include "wx/dialog.h"
-    #include "wx/settings.h"
-    #include "wx/msgdlg.h"
-    #include "wx/choice.h"
-    #include "wx/stattext.h"
-    #include "wx/scrolwin.h"
-    #include "wx/dirdlg.h"
-    #include "wx/layout.h"
-    #include "wx/sizer.h"
-    #include "wx/textdlg.h"
-    #include "wx/filedlg.h"
-    #include "wx/statusbr.h"
     #include "wx/intl.h"
     #include "wx/intl.h"
-    #include "wx/frame.h"
     #include "wx/stopwatch.h"
 #endif
 
 // This define is necessary to prevent macro clearing
 #define __wxPG_SOURCE_FILE__
 
     #include "wx/stopwatch.h"
 #endif
 
 // This define is necessary to prevent macro clearing
 #define __wxPG_SOURCE_FILE__
 
-#include <wx/propgrid/propgridpagestate.h>
-#include <wx/propgrid/propgrid.h>
-#include <wx/propgrid/editors.h>
-
+#include "wx/propgrid/propgridpagestate.h"
+#include "wx/propgrid/propgrid.h"
+#include "wx/propgrid/editors.h"
 
 #define wxPG_DEFAULT_SPLITTERX      110
 
 
 #define wxPG_DEFAULT_SPLITTERX      110
 
@@ -399,7 +385,8 @@ wxPGProperty* wxPropertyGridPageState::GetLastItem( int flags )
     if ( pwc->GetFlags() & itemExMask )
     {
         wxPropertyGridIterator it( this, flags, pwc );
     if ( pwc->GetFlags() & itemExMask )
     {
         wxPropertyGridIterator it( this, flags, pwc );
-        for ( ; !it.AtEnd(); it.Prev() );
+        for ( ; !it.AtEnd(); it.Prev() )
+            ;
         pwc = (wxPGProperty*) it.GetProperty();
     }
 
         pwc = (wxPGProperty*) it.GetProperty();
     }
 
@@ -461,6 +448,19 @@ wxPGProperty* wxPropertyGridPageState::BaseGetPropertyByName( const wxString& na
     return (wxPGProperty*) NULL;
 }
 
     return (wxPGProperty*) NULL;
 }
 
+// -----------------------------------------------------------------------
+
+void wxPropertyGridPageState::DoSetPropertyName( wxPGProperty* p,
+                                                 const wxString& newName )
+{
+    wxCHECK_RET( p, wxT("invalid property id") );
+
+    if ( p->GetBaseName().Len() ) m_dictName.erase( p->GetBaseName() );
+    if ( newName.Len() ) m_dictName[newName] = (void*) p;
+
+    p->DoSetName(newName);
+}
+
 // -----------------------------------------------------------------------
 // wxPropertyGridPageState global operations
 // -----------------------------------------------------------------------
 // -----------------------------------------------------------------------
 // wxPropertyGridPageState global operations
 // -----------------------------------------------------------------------
@@ -592,13 +592,25 @@ bool wxPropertyGridPageState::EnableCategories( bool enable )
 
 // -----------------------------------------------------------------------
 
 
 // -----------------------------------------------------------------------
 
-static int wxPG_SortFunc(void **p1, void **p2)
+#if wxUSE_STL
+#include <algorithm>
+
+static bool wxPG_SortFunc(wxPGProperty *p1, wxPGProperty *p2)
+{
+    return p1->GetLabel() < p2->GetLabel();
+}
+
+#else
+
+static int wxPG_SortFunc(wxPGProperty **p1, wxPGProperty **p2)
 {
 {
-    wxPGProperty *pp1 = *((wxPGProperty**)p1);
-    wxPGProperty *pp2 = *((wxPGProperty**)p2);
+    wxPGProperty *pp1 = *p1;
+    wxPGProperty *pp2 = *p2;
     return pp1->GetLabel().compare( pp2->GetLabel() );
 }
 
     return pp1->GetLabel().compare( pp2->GetLabel() );
 }
 
+#endif
+
 void wxPropertyGridPageState::SortChildren( wxPGProperty* p )
 {
     if ( !p )
 void wxPropertyGridPageState::SortChildren( wxPGProperty* p )
 {
     if ( !p )
@@ -613,10 +625,14 @@ void wxPropertyGridPageState::SortChildren( wxPGProperty* p )
     if ( pwc->GetChildCount() < 1 )
         return;
 
     if ( pwc->GetChildCount() < 1 )
         return;
 
+#if wxUSE_STL
+    std::sort(pwc->m_children.begin(), pwc->m_children.end(), wxPG_SortFunc);
+#else
     pwc->m_children.Sort( wxPG_SortFunc );
     pwc->m_children.Sort( wxPG_SortFunc );
+#endif
 
     // Fix indexes
 
     // Fix indexes
-    pwc->FixIndexesOfChildren();
+    pwc->FixIndicesOfChildren();
 
 }
 
 
 }
 
@@ -681,7 +697,10 @@ int wxPropertyGridPageState::GetColumnFitWidth(wxClientDC& dc,
         wxPGProperty* p = pwc->Item(i);
         if ( !p->IsCategory() )
         {
         wxPGProperty* p = pwc->Item(i);
         if ( !p->IsCategory() )
         {
-            dc.GetTextExtent( p->GetColumnText(col), &w, &h );
+            const wxPGCell* cell = NULL;
+            wxString text;
+            p->GetDisplayInfo(col, -1, 0, &text, &cell);
+            dc.GetTextExtent(text, &w, &h);
             if ( col == 0 )
                 w += ( ((int)p->m_depth-1) * pg->m_subgroup_extramargin );
 
             if ( col == 0 )
                 w += ( ((int)p->m_depth-1) * pg->m_subgroup_extramargin );
 
@@ -1084,7 +1103,7 @@ bool wxPropertyGridPageState::DoSetPropertyValueString( wxPGProperty* p, const w
 {
     if ( p )
     {
 {
     if ( p )
     {
-        int flags = wxPG_REPORT_ERROR|wxPG_FULL_VALUE;
+        int flags = wxPG_REPORT_ERROR|wxPG_FULL_VALUE|wxPG_PROGRAMMATIC_VALUE;
 
         wxVariant variant = p->GetValueRef();
         bool res;
 
         wxVariant variant = p->GetValueRef();
         bool res;
@@ -1447,7 +1466,7 @@ void wxPropertyGridPageState::DoSetPropertyValues( const wxVariantList& list, wx
                             wxPGProperty* foundProp = BaseGetPropertyByName(propName);
                             if ( foundProp )
                             {
                             wxPGProperty* foundProp = BaseGetPropertyByName(propName);
                             if ( foundProp )
                             {
-                                wxASSERT( wxPGIsVariantType(*current, list) );
+                                wxASSERT( current->GetType() == wxPG_VARIANT_TYPE_LIST );
 
                                 wxVariantList& list2 = current->GetList();
                                 wxVariantList::const_iterator node2;
 
                                 wxVariantList& list2 = current->GetList();
                                 wxVariantList::const_iterator node2;
@@ -1492,8 +1511,8 @@ void wxPropertyGridPageState::DoSetPropertyValues( const wxVariantList& list, wx
 // wxPropertyGridPageState property adding and removal
 // -----------------------------------------------------------------------
 
 // wxPropertyGridPageState property adding and removal
 // -----------------------------------------------------------------------
 
-int wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property,
-                                           wxPGProperty* scheduledParent )
+bool wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property,
+                                                wxPGProperty* scheduledParent )
 {
     wxPropertyGrid* propGrid = m_pPropGrid;
 
 {
     wxPropertyGrid* propGrid = m_pPropGrid;
 
@@ -1501,6 +1520,12 @@ int wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property,
     if ( scheduledParent == m_properties )
         scheduledParent = (wxPGProperty*) NULL;
 
     if ( scheduledParent == m_properties )
         scheduledParent = (wxPGProperty*) NULL;
 
+    if ( scheduledParent && !scheduledParent->IsCategory() )
+    {
+        wxASSERT_MSG( property->GetBaseName().length(),
+                      "Property's children must have unique, non-empty names within their scope" );
+    }
+
     property->m_parentState = this;
 
     if ( property->IsCategory() )
     property->m_parentState = this;
 
     if ( property->IsCategory() )
@@ -1523,7 +1548,7 @@ int wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property,
             {
                 delete property;
                 m_currentCategory = pwc;
             {
                 delete property;
                 m_currentCategory = pwc;
-                return 2; // Tells the caller what we did.
+                return false;
             }
         }
     }
             }
         }
     }
@@ -1540,123 +1565,29 @@ int wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property,
 #endif
 
     // Make sure nothing is selected.
 #endif
 
     // Make sure nothing is selected.
-    if ( propGrid && propGrid->m_selected )
-    {
-        bool selRes = propGrid->ClearSelection();
-        wxPG_CHECK_MSG_DBG( selRes,
-                            -1,
-                            wxT("failed to deselect a property (editor probably had invalid value)") );
-    }
+    if ( propGrid )
+        propGrid->ClearSelection(false);
 
 
-    if ( scheduledParent )
-    {
-        // Use parent's colours.
-        property->m_bgColIndex = scheduledParent->m_bgColIndex;
-        property->m_fgColIndex = scheduledParent->m_fgColIndex;
-
-        // Fix no parent does not yet have parenting flag yet, set one now
-        if ( !scheduledParent->HasFlag(wxPG_PROP_PARENTAL_FLAGS) )
-            scheduledParent->SetParentalType(wxPG_PROP_MISC_PARENT);
-            //scheduledParent->SetFlag(wxPG_PROP_MISC_PARENT);
-    }
-
-    // If in hideable adding mode, or if assigned parent is hideable, then
-    // make this one hideable.
-    if (
-         ( scheduledParent && (scheduledParent->m_flags & wxPG_PROP_HIDDEN) ) ||
-         ( propGrid && (propGrid->m_iFlags & wxPG_FL_ADDING_HIDEABLES) )
-       )
-        property->SetFlag( wxPG_PROP_HIDDEN );
-
-    // Set custom image flag.
-    int custImgHeight = property->OnMeasureImage().y;
-    if ( custImgHeight < 0 /*|| custImgHeight > 1*/ )
-    {
-        property->m_flags |= wxPG_PROP_CUSTOMIMAGE;
-    }
-
-    if ( propGrid && (propGrid->GetWindowStyleFlag() & wxPG_LIMITED_EDITING) )
-        property->m_flags |= wxPG_PROP_NOEDITOR;
+    // NULL parent == root parent
+    if ( !scheduledParent )
+        scheduledParent = DoGetRoot();
 
 
-    if ( !property->IsCategory() )
-    {
-        // This is not a category.
+    property->m_parent = scheduledParent;
 
 
-        //wxASSERT_MSG( property->GetEditorClass(), wxT("Editor class not initialized!") );
+    property->InitAfterAdded(this, propGrid);
 
 
-        // Depth.
-        //
-        unsigned char depth = 1;
-        if ( scheduledParent )
-        {
-            depth = scheduledParent->m_depth;
-            if ( !scheduledParent->IsCategory() )
-                depth++;
-        }
-        property->m_depth = depth;
-        unsigned char greyDepth = depth;
-
-        if ( scheduledParent )
-        {
-            wxPropertyCategory* pc;
-
-            if ( scheduledParent->IsCategory() || scheduledParent->IsRoot() )
-                pc = (wxPropertyCategory*)scheduledParent;
-            else
-                // This conditional compile is necessary to
-                // bypass some compiler bug.
-                pc = GetPropertyCategory(scheduledParent);
-
-            if ( pc )
-                greyDepth = pc->GetDepth();
-            else
-                greyDepth = scheduledParent->m_depthBgCol;
-        }
-
-        property->m_depthBgCol = greyDepth;
-
-        // Prepare children pre-added children
-        if ( property->GetChildCount() )
-        {
-            property->SetParentalType(wxPG_PROP_AGGREGATE);
-
-            property->SetExpanded(false); // Properties with children are not expanded by default.
-            if ( propGrid && propGrid->GetWindowStyleFlag() & wxPG_HIDE_MARGIN )
-                property->SetExpanded(true); // ...unless it cannot be expanded.
-
-            property->PrepareSubProperties();
-
-            return -1;
-        }
-
-        if ( propGrid && (propGrid->GetExtraStyle() & wxPG_EX_AUTO_UNSPECIFIED_VALUES) )
-            property->SetFlagRecursively(wxPG_PROP_AUTO_UNSPECIFIED, true);
-
-        return 0;
-    }
-    else
+    if ( property->IsCategory() )
     {
     {
-        // This is a category.
-
-        // depth
-        unsigned char depth = 1;
-        if ( scheduledParent )
-        {
-            depth = scheduledParent->m_depth + 1;
-        }
-        property->m_depth = depth;
-        property->m_depthBgCol = depth;
+        wxPropertyCategory* pc = wxStaticCast(property, wxPropertyCategory);
 
 
-        m_currentCategory = (wxPropertyCategory*)property;
+        m_currentCategory = pc;
 
 
-        wxPropertyCategory* pc = (wxPropertyCategory*)property;
-
-        // Calculate text extent for caption item.
+        // Calculate text extent for category caption
         if ( propGrid )
             pc->CalculateTextExtent(propGrid, propGrid->GetCaptionFont());
         if ( propGrid )
             pc->CalculateTextExtent(propGrid, propGrid->GetCaptionFont());
-
-        return 1;
     }
     }
+
+    return true;
 }
 
 // -----------------------------------------------------------------------
 }
 
 // -----------------------------------------------------------------------
@@ -1681,11 +1612,11 @@ wxPGProperty* wxPropertyGridPageState::DoInsert( wxPGProperty* parent, int index
                  wxNullProperty,
                  wxT("when adding properties to fixed parents, use BeginAddChildren and EndAddChildren.") );
 
                  wxNullProperty,
                  wxT("when adding properties to fixed parents, use BeginAddChildren and EndAddChildren.") );
 
-    int parenting = PrepareToAddItem( property, (wxPropertyCategory*)parent );
+    bool res = PrepareToAddItem( property, (wxPropertyCategory*)parent );
 
 
-    // This type of invalid parenting value indicates we should exit now, returning
-    // id of most recent category.
-    if ( parenting > 1 )
+    // PrepareToAddItem() may just decide to use use current category
+    // instead of adding new one.
+    if ( !res )
         return m_currentCategory;
 
     // Note that item must be added into current mode later.
         return m_currentCategory;
 
     // Note that item must be added into current mode later.
@@ -1714,7 +1645,7 @@ wxPGProperty* wxPropertyGridPageState::DoInsert( wxPGProperty* parent, int index
             // Categorized mode
 
             // Only add non-categories to m_abcArray.
             // Categorized mode
 
             // Only add non-categories to m_abcArray.
-            if ( m_abcArray && parenting <= 0 )
+            if ( m_abcArray && !property->IsCategory() )
                 m_abcArray->AddChild2( property, -1, false );
 
             // Add to current mode.
                 m_abcArray->AddChild2( property, -1, false );
 
             // Add to current mode.
@@ -1733,7 +1664,7 @@ wxPGProperty* wxPropertyGridPageState::DoInsert( wxPGProperty* parent, int index
                 m_regularArray.AddChild2( property, -1, false );
 
             // Add to current mode (no categories).
                 m_regularArray.AddChild2( property, -1, false );
 
             // Add to current mode (no categories).
-            if ( parenting <= 0 )
+            if ( !property->IsCategory() )
                 m_abcArray->AddChild2( property, index );
         }
     }
                 m_abcArray->AddChild2( property, index );
         }
     }
@@ -1800,11 +1731,11 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item )
                 wxPGProperty * p = pwc->Item( i );
                 wxASSERT( p != NULL );
                 if ( !p->IsCategory() )
                 wxPGProperty * p = pwc->Item( i );
                 wxASSERT( p != NULL );
                 if ( !p->IsCategory() )
-                    m_abcArray->m_children.Remove( p );
+                    m_abcArray->RemoveChild(p);
             }
 
             if ( IsInNonCatMode() )
             }
 
             if ( IsInNonCatMode() )
-                m_abcArray->FixIndexesOfChildren();
+                m_abcArray->FixIndicesOfChildren();
         }
     }
 
         }
     }
 
@@ -1816,14 +1747,13 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item )
         if ( !item->IsCategory() && item->GetParent()->IsCategory() )
         {
             if ( m_abcArray )
         if ( !item->IsCategory() && item->GetParent()->IsCategory() )
         {
             if ( m_abcArray )
-            {
-                m_abcArray->m_children.Remove( item );
-            }
+                m_abcArray->RemoveChild(item);
         }
 
         // categorized mode - categorized array
         }
 
         // categorized mode - categorized array
-        item->m_parent->m_children.RemoveAt(indinparent);
-        item->m_parent->FixIndexesOfChildren(/*indinparent*/);
+        wxArrayPGProperty& parentsChildren = item->m_parent->m_children;
+        parentsChildren.erase( parentsChildren.begin() + indinparent );
+        item->m_parent->FixIndicesOfChildren();
     }
     else
     {
     }
     else
     {
@@ -1848,14 +1778,15 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item )
                 }
             }
         }
                 }
             }
         }
-        cat_parent->m_children.RemoveAt(cat_index);
+        cat_parent->m_children.erase(cat_parent->m_children.begin()+cat_index);
 
         // non-categorized mode - non-categorized array
         if ( !item->IsCategory() )
         {
             wxASSERT( item->m_parent == m_abcArray );
 
         // non-categorized mode - non-categorized array
         if ( !item->IsCategory() )
         {
             wxASSERT( item->m_parent == m_abcArray );
-            item->m_parent->m_children.RemoveAt(indinparent);
-            item->m_parent->FixIndexesOfChildren(indinparent);
+            wxArrayPGProperty& parentsChildren = item->m_parent->m_children;
+            parentsChildren.erase(parentsChildren.begin() + indinparent);
+            item->m_parent->FixIndicesOfChildren(indinparent);
         }
     }
 
         }
     }
 
@@ -1870,3 +1801,5 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item )
 }
 
 // -----------------------------------------------------------------------
 }
 
 // -----------------------------------------------------------------------
+
+#endif  // wxUSE_PROPGRID