void QListViewItem::sort()
{
if ( !listView() )
return;
lsc = Unsorted;
enforceSortOrder();
listView()->triggerUpdate();
}
void QListViewItem::enforceSortOrder() const
{
if ( !lv || lv && (lv->d->clearing || lv->d->sortcolumn == Unsorted) )
return;
if ( parentItem &&
(parentItem->lsc != lsc || parentItem->lso != lso) )
((QListViewItem *)this)->sortChildItems( (int)parentItem->lsc,
(bool)parentItem->lso );
else if ( !parentItem &&
( (int)lsc != lv->d->sortcolumn || (bool)lso != lv->d->ascending ) )
((QListViewItem *)this)->sortChildItems( lv->d->sortcolumn, lv->d->ascending );
}
void QListViewItem::sortChildItems( int column, bool ascending )
{
// we try HARD not to sort. if we're already sorted, don't.
if ( column == (int)lsc && ascending == (bool)lso )
return;
if ( column < 0 )
return;
lsc = column;
lso = ascending;
const int nColumns = ( listView() ? listView()->columns() : 0 );
// only sort if the item have more than one child.
if ( column > nColumns || childItem == 0 || (childItem->siblingItem == 0 && childItem->childItem == 0))
return;
// make an array for qHeapSort()
QListViewPrivate::SortableItem * siblings
= new QListViewPrivate::SortableItem[nChildren];
QListViewItem * s = childItem;
int i = 0;
while ( s && i < nChildren ) {
siblings[i].numCols = nColumns;
siblings[i].col = column;
siblings[i].asc = ascending;
siblings[i].item = s;
s = s->siblingItem;
i++;
}
// and sort it.
qHeapSort( siblings, siblings + nChildren );
// build the linked list of siblings, in the appropriate
// direction, and finally set this->childItem to the new top
// child.
if ( ascending ) {
for( i = 0; i < nChildren - 1; i++ )
siblings[i].item->siblingItem = siblings[i+1].item;
siblings[nChildren-1].item->siblingItem = 0;
childItem = siblings[0].item;
} else {
for( i = nChildren - 1; i > 0; i-- )
siblings[i].item->siblingItem = siblings[i-1].item;
siblings[0].item->siblingItem = 0;
childItem = siblings[nChildren-1].item;
}
for ( i = 0; i < nChildren; i++ ) {
if ( siblings[i].item->isOpen() )
siblings[i].item->sort();
}
delete[] siblings;
}