Reverted to old wxPG_AUTO_SORT behavior in which only root properties and immediate children of categories are (automatically) sorted; Added Sort flags; Applied slight optimization when sorting on propgridmanager page change

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57975 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Jaakko Salli
2009-01-10 15:16:03 +00:00
parent fa8224a15a
commit 0eb877f2c1
7 changed files with 73 additions and 31 deletions

View File

@@ -387,7 +387,12 @@ wxPG_INC_ATTRIBUTES = 0x00000040,
wxPG_RECURSE_STARTS = 0x00000080,
/** Force value change. */
wxPG_FORCE = 0x00000100
wxPG_FORCE = 0x00000100,
/** Only sort categories and their immediate children.
Sorting done by wxPG_AUTO_SORT option uses this.
*/
wxPG_SORT_TOP_LEVEL_ONLY = 0x00000200
};

View File

@@ -1227,11 +1227,17 @@ public:
void SetValidationFailureBehavior( int vfbFlags );
/**
Sorts all properties.
Sorts all properties recursively.
@param flags
This can contain any of the following options:
wxPG_SORT_TOP_LEVEL_ONLY: Only sort categories and their
immediate children. Sorting done by wxPG_AUTO_SORT option
uses this.
@see SortChildren, wxPropertyGrid::SetSortFunction
*/
void Sort();
void Sort( int flags = 0 );
/**
Sorts children of a property.
@@ -1239,15 +1245,16 @@ public:
@param id
Name or pointer to a property.
@param recursively
If @true, then children are sorted recursively.
@param flags
This can contain any of the following options:
wxPG_RECURSE: Sorts recursively.
@see Sort, wxPropertyGrid::SetSortFunction
*/
void SortChildren( wxPGPropArg id, bool recursively = false )
void SortChildren( wxPGPropArg id, int flags = 0 )
{
wxPG_PROP_ARG_CALL_PROLOG()
m_pState->DoSortChildren(p, recursively);
m_pState->DoSortChildren(p, flags);
}
#ifdef SWIG

View File

@@ -613,8 +613,10 @@ public:
/** Set virtual width for this particular page. */
void SetVirtualWidth( int width );
void DoSortChildren( wxPGProperty* p, bool recursively = false );
void DoSort();
void DoSortChildren( wxPGProperty* p, int flags = 0 );
void DoSort( int flags = 0 );
bool PrepareAfterItemsAdded();
void SetSelection( wxPGProperty* p ) { m_selected = p; }

View File

@@ -902,11 +902,17 @@ public:
void SetValidationFailureBehavior( int vfbFlags );
/**
Sorts all properties.
Sorts all properties recursively.
@param flags
This can contain any of the following options:
wxPG_SORT_TOP_LEVEL_ONLY: Only sort categories and their
immediate children. Sorting done by wxPG_AUTO_SORT option
uses this.
@see SortChildren, wxPropertyGrid::SetSortFunction
*/
void Sort();
void Sort( int flags = 0 );
/**
Sorts children of a property.
@@ -914,12 +920,13 @@ public:
@param id
Name or pointer to a property.
@param recursively
If @true, then children are sorted recursively.
@param flags
This can contain any of the following options:
wxPG_RECURSE: Sorts recursively.
@see Sort, wxPropertyGrid::SetSortFunction
*/
void SortChildren( wxPGPropArg id, bool recursively = false );
void SortChildren( wxPGPropArg id, int flags = 0 );
/**
Returns editor pointer of editor with given name;

View File

@@ -1180,7 +1180,7 @@ void wxPropertyGrid::PrepareAfterItemsAdded()
m_pState->m_itemsAdded = 0;
if ( m_windowStyle & wxPG_AUTO_SORT )
Sort();
Sort(wxPG_SORT_TOP_LEVEL_ONLY);
RecalculateVirtualSize();
}
@@ -2277,8 +2277,7 @@ void wxPropertyGrid::SwitchState( wxPropertyGridPageState* pNewState )
else if ( !m_frozen )
{
// Refresh, if not frozen.
if ( m_pState->m_itemsAdded )
PrepareAfterItemsAdded();
m_pState->PrepareAfterItemsAdded();
// Reselect
if ( m_pState->m_selected )

View File

@@ -762,7 +762,7 @@ bool wxPropertyGridInterface::Expand( wxPGPropArg id )
// -----------------------------------------------------------------------
void wxPropertyGridInterface::Sort()
void wxPropertyGridInterface::Sort( int flags )
{
wxPropertyGrid* pg = GetPropertyGrid();
@@ -774,7 +774,7 @@ void wxPropertyGridInterface::Sort()
{
wxPropertyGridPageState* page = GetPageState(pageIndex);
if ( !page ) break;
page->DoSort();
page->DoSort(flags);
pageIndex++;
}
}

View File

@@ -635,16 +635,21 @@ static int wxPG_SortFunc_ByLabel(wxPGProperty **pp1, wxPGProperty **pp2)
#endif
void wxPropertyGridPageState::DoSortChildren( wxPGProperty* p,
bool recursively )
int flags )
{
if ( !p )
p = m_properties;
// Can only sort items with children
if ( !p->GetChildCount() )
return;
// Can only sort items with children
if ( p->GetChildCount() < 1 )
// Never sort children of aggregate properties
if ( p->HasFlag(wxPG_PROP_AGGREGATE) )
return;
if ( (flags & wxPG_SORT_TOP_LEVEL_ONLY)
&& !p->IsCategory() && !p->IsRoot() )
return;
#if wxUSE_STL
@@ -661,35 +666,52 @@ void wxPropertyGridPageState::DoSortChildren( wxPGProperty* p,
p->m_children.Sort( wxPG_SortFunc_ByLabel );
#endif
// Fix indexes
// Fix indices
p->FixIndicesOfChildren();
if ( recursively && !p->HasFlag(wxPG_PROP_AGGREGATE) )
if ( flags & wxPG_RECURSE )
{
// Apply sort recursively
for ( unsigned int i=0; i<p->GetChildCount(); i++ )
DoSortChildren(p->Item(i));
DoSortChildren(p->Item(i), flags);
}
}
// -----------------------------------------------------------------------
void wxPropertyGridPageState::DoSort()
void wxPropertyGridPageState::DoSort( int flags )
{
DoSortChildren( m_properties, true );
DoSortChildren( m_properties, flags | wxPG_RECURSE );
// Sort categories as well (but we need not do it recursively)
if ( !IsInNonCatMode() )
if ( IsInNonCatMode() )
{
size_t i;
for ( i=0;i<m_properties->GetChildCount();i++)
for ( i=0;i<m_regularArray.GetChildCount();i++)
{
wxPGProperty* p = m_properties->Item(i);
wxPGProperty* p = m_regularArray.Item(i);
if ( p->IsCategory() )
DoSortChildren( p );
DoSortChildren( p, 0 );
}
}
}
// -----------------------------------------------------------------------
bool wxPropertyGridPageState::PrepareAfterItemsAdded()
{
if ( !m_itemsAdded ) return false;
wxPropertyGrid* pg = GetGrid();
m_itemsAdded = 0;
if ( pg->HasFlag(wxPG_AUTO_SORT) )
DoSort(wxPG_SORT_TOP_LEVEL_ONLY);
return true;
}
// -----------------------------------------------------------------------
// wxPropertyGridPageState splitter, column and hittest functions
// -----------------------------------------------------------------------