X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/020b004113a8ab9b9c42a9a56716f3a27b0a8621..b245cbc587f379bf9cc27122c3f3f50c1d424186:/src/propgrid/propgridpagestate.cpp diff --git a/src/propgrid/propgridpagestate.cpp b/src/propgrid/propgridpagestate.cpp index 693d339217..aa5b0244f8 100644 --- a/src/propgrid/propgridpagestate.cpp +++ b/src/propgrid/propgridpagestate.cpp @@ -4,7 +4,7 @@ // Author: Jaakko Salli // Modified by: // Created: 2008-08-24 -// RCS-ID: $Id: +// RCS-ID: $Id$ // Copyright: (c) Jaakko Salli // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// @@ -38,9 +38,9 @@ // This define is necessary to prevent macro clearing #define __wxPG_SOURCE_FILE__ -#include -#include -#include +#include "wx/propgrid/propgridpagestate.h" +#include "wx/propgrid/propgrid.h" +#include "wx/propgrid/editors.h" #define wxPG_DEFAULT_SPLITTERX 110 @@ -74,11 +74,10 @@ void wxPropertyGridIteratorBase::Init( wxPropertyGridPageState* state, int flags void wxPropertyGridIteratorBase::Init( wxPropertyGridPageState* state, int flags, int startPos, int dir ) { - wxPGProperty* property; + wxPGProperty* property = NULL; if ( startPos == wxTOP ) { - property = NULL; if ( dir == 0 ) dir = 1; } @@ -90,8 +89,7 @@ void wxPropertyGridIteratorBase::Init( wxPropertyGridPageState* state, int flags } else { - wxASSERT_MSG( false, wxT("Only supported stating positions are wxTOP and wxBOTTOM") ); - property = NULL; + wxFAIL_MSG("Only supported starting positions are wxTOP and wxBOTTOM"); } Init( state, flags, property, dir ); @@ -470,7 +468,7 @@ void wxPropertyGridPageState::DoSetPropertyName( wxPGProperty* p, // NB: Nowadays only needed for alphabetic/categoric mode switching. // ----------------------------------------------------------------------- -#define II_INVALID_I 0x00FFFFFF +//#define II_INVALID_I 0x00FFFFFF #define ITEM_ITERATION_VARIABLES \ wxPGProperty* parent; \ @@ -481,6 +479,7 @@ void wxPropertyGridPageState::DoSetPropertyName( wxPGProperty* p, parent = m_properties; \ i = 0; +#if 0 #define ITEM_ITERATION_INIT(startparent, startindex, state) \ parent = startparent; \ i = (unsigned int)startindex; \ @@ -489,6 +488,7 @@ void wxPropertyGridPageState::DoSetPropertyName( wxPGProperty* p, parent = state->m_properties; \ i = 0; \ } +#endif #define ITEM_ITERATION_LOOP_BEGIN \ do \ @@ -592,13 +592,25 @@ bool wxPropertyGridPageState::EnableCategories( bool enable ) // ----------------------------------------------------------------------- -static int wxPG_SortFunc(void **p1, void **p2) +#if wxUSE_STL +#include + +static bool wxPG_SortFunc(wxPGProperty *p1, wxPGProperty *p2) { - wxPGProperty *pp1 = *((wxPGProperty**)p1); - wxPGProperty *pp2 = *((wxPGProperty**)p2); + return p1->GetLabel() < p2->GetLabel(); +} + +#else + +static int wxPG_SortFunc(wxPGProperty **p1, wxPGProperty **p2) +{ + wxPGProperty *pp1 = *p1; + wxPGProperty *pp2 = *p2; return pp1->GetLabel().compare( pp2->GetLabel() ); } +#endif + void wxPropertyGridPageState::SortChildren( wxPGProperty* p ) { if ( !p ) @@ -613,10 +625,14 @@ void wxPropertyGridPageState::SortChildren( wxPGProperty* p ) 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 ); +#endif // Fix indexes - pwc->FixIndexesOfChildren(); + pwc->FixIndicesOfChildren(); } @@ -681,7 +697,10 @@ int wxPropertyGridPageState::GetColumnFitWidth(wxClientDC& dc, 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 ); @@ -876,8 +895,6 @@ void wxPropertyGridPageState::CheckColumnWidths( int widthChange ) int reduceCol = -1; int highestColWidth = 0; - bool minimizedCols = false; - #ifdef __WXDEBUG__ if ( debug ) wxLogDebug(wxT("ColumnWidthCheck (virtualWidth: %i, clientWidth: %i)"), width, clientWidth); @@ -891,7 +908,6 @@ void wxPropertyGridPageState::CheckColumnWidths( int widthChange ) if ( m_colWidths[i] <= min ) { m_colWidths[i] = min; - minimizedCols = true; } else { @@ -928,10 +944,10 @@ void wxPropertyGridPageState::CheckColumnWidths( int widthChange ) if ( colsWidth < width ) { // Increase column - #ifdef __WXDEBUG__ - if ( debug ) - wxLogDebug(wxT(" Adjust last column to %i"), m_colWidths[lastColumn] + widthHigher); - #endif +#ifdef __WXDEBUG__ + if ( debug ) + wxLogDebug(wxT(" Adjust last column to %i"), m_colWidths[lastColumn] + widthHigher); +#endif m_colWidths[lastColumn] = m_colWidths[lastColumn] + widthHigher; } else if ( colsWidth > width ) @@ -1084,7 +1100,7 @@ bool wxPropertyGridPageState::DoSetPropertyValueString( wxPGProperty* p, const w { 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; @@ -1357,7 +1373,7 @@ void wxPropertyGridPageState::DoSetPropertyValues( const wxVariantList& list, wx // // Second pass for special entries - for ( node = list.begin(); node != list.end(); node++ ) + for ( node = list.begin(); node != list.end(); ++node ) { wxVariant *current = (wxVariant*)*node; @@ -1421,7 +1437,7 @@ void wxPropertyGridPageState::DoSetPropertyValues( const wxVariantList& list, wx if ( numSpecialEntries ) { - for ( node = list.begin(); node != list.end(); node++ ) + for ( node = list.begin(); node != list.end(); ++node ) { wxVariant *current = (wxVariant*)*node; @@ -1452,7 +1468,7 @@ void wxPropertyGridPageState::DoSetPropertyValues( const wxVariantList& list, wx wxVariantList& list2 = current->GetList(); wxVariantList::const_iterator node2; - for ( node2 = list2.begin(); node2 != list2.end(); node2++ ) + for ( node2 = list2.begin(); node2 != list2.end(); ++node2 ) { wxVariant *attr = (wxVariant*)*node2; foundProp->SetAttribute( attr->GetName(), *attr ); @@ -1492,8 +1508,8 @@ void wxPropertyGridPageState::DoSetPropertyValues( const wxVariantList& list, wx // wxPropertyGridPageState property adding and removal // ----------------------------------------------------------------------- -int wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property, - wxPGProperty* scheduledParent ) +bool wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property, + wxPGProperty* scheduledParent ) { wxPropertyGrid* propGrid = m_pPropGrid; @@ -1529,7 +1545,7 @@ int wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property, { delete property; m_currentCategory = pwc; - return 2; // Tells the caller what we did. + return false; } } } @@ -1546,123 +1562,29 @@ int wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property, #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); - } + // NULL parent == root parent + if ( !scheduledParent ) + scheduledParent = DoGetRoot(); - // 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; + property->m_parent = scheduledParent; - if ( !property->IsCategory() ) - { - // This is not a category. + property->InitAfterAdded(this, propGrid); - //wxASSERT_MSG( property->GetEditorClass(), wxT("Editor class not initialized!") ); - - // 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()); - - return 1; } + + return true; } // ----------------------------------------------------------------------- @@ -1687,11 +1609,11 @@ wxPGProperty* wxPropertyGridPageState::DoInsert( wxPGProperty* parent, int index 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. @@ -1720,7 +1642,7 @@ wxPGProperty* wxPropertyGridPageState::DoInsert( wxPGProperty* parent, int index // 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. @@ -1739,7 +1661,7 @@ wxPGProperty* wxPropertyGridPageState::DoInsert( wxPGProperty* parent, int index m_regularArray.AddChild2( property, -1, false ); // Add to current mode (no categories). - if ( parenting <= 0 ) + if ( !property->IsCategory() ) m_abcArray->AddChild2( property, index ); } } @@ -1806,11 +1728,11 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item ) wxPGProperty * p = pwc->Item( i ); wxASSERT( p != NULL ); if ( !p->IsCategory() ) - m_abcArray->m_children.Remove( p ); + m_abcArray->RemoveChild(p); } if ( IsInNonCatMode() ) - m_abcArray->FixIndexesOfChildren(); + m_abcArray->FixIndicesOfChildren(); } } @@ -1822,14 +1744,13 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item ) if ( !item->IsCategory() && item->GetParent()->IsCategory() ) { if ( m_abcArray ) - { - m_abcArray->m_children.Remove( item ); - } + m_abcArray->RemoveChild(item); } // 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 { @@ -1854,14 +1775,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 ); - 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); } }