-int wxCALLBACK wxDataViewListModelSortedDefaultCompareDescending
- (unsigned int row1, unsigned int row2, unsigned int col, wxDataViewListModel* model )
-{
- return wxDataViewListModelSortedDefaultCompare( row2, row1, col, model );
-}
-
-static wxDataViewListModelCompare s_CmpFunc;
-static wxDataViewListModel *s_CmpModel;
-static unsigned int s_CmpCol;
-
-int LINKAGEMODE wxDataViewIntermediateCmp( unsigned int row1, unsigned int row2 )
-{
- return s_CmpFunc( row1, row2, s_CmpCol, s_CmpModel );
-}
-
-// ---------------------------------------------------------
-// wxDataViewSortedListModel
-// ---------------------------------------------------------
-
-wxDataViewSortedListModel::wxDataViewSortedListModel( wxDataViewListModel *child ) :
- m_array( wxDataViewIntermediateCmp )
-{
- m_child = child;
-
- m_ascending = true;
-
- m_notifierOnChild = new wxDataViewSortedListModelNotifier( this );
- m_child->AddNotifier( m_notifierOnChild );
-
- Resort();
-}
-
-wxDataViewSortedListModel::~wxDataViewSortedListModel()
-{
- if (m_child)
- m_child->RemoveNotifier( m_notifierOnChild );
-}
-
-// FIXME
-void wxDataViewSortedListModel::InitStatics()
-{
- s_CmpCol = 0;
- s_CmpModel = m_child;
- if (m_ascending)
- s_CmpFunc = wxDataViewListModelSortedDefaultCompare;
- else
- s_CmpFunc = wxDataViewListModelSortedDefaultCompareDescending;
-}
-
-void wxDataViewSortedListModel::Resort()
-{
- InitStatics();
-
- m_array.Clear();
- unsigned int n = m_child->GetRowCount();
- unsigned int i;
- for (i = 0; i < n; i++)
- m_array.Add( i );
-
- // do we need the neworder?
- wxDataViewListModel::RowsReordered( NULL );
-}
-
-#if 0
-static void Dump( wxDataViewListModel *model, unsigned int col )
-{
- unsigned int n = model->GetRowCount();
- unsigned int i;
- for (i = 0; i < n; i++)
- {
- wxVariant variant;
- model->GetValue( variant, col, i );
- wxString tmp;
- tmp = variant.GetString();
- wxPrintf( wxT("%d: %s\n"), (int) i, tmp.c_str() );
- }
-}
-#endif
-
-bool wxDataViewSortedListModel::ChildRowAppended()
-{
- // no need to fix up array
-
- unsigned int len = m_array.GetCount();
-
- unsigned int pos = m_array.Add( len );
-
- if (pos == 0)
- return wxDataViewListModel::RowPrepended();
-
- if (pos == len)
- return wxDataViewListModel::RowAppended();
-
- return wxDataViewListModel::RowInserted( pos );
-}
-
-bool wxDataViewSortedListModel::ChildRowPrepended()
-{
- // fix up array
- unsigned int i;
- unsigned int len = m_array.GetCount();
- for (i = 0; i < len; i++)
- {
- unsigned int value = m_array[i];
- m_array[i] = value+1;
- }
-
- unsigned int pos = m_array.Add( 0 );
-
- if (pos == 0)
- return wxDataViewListModel::RowPrepended();
-
- if (pos == len)
- return wxDataViewListModel::RowAppended();
-
- return wxDataViewListModel::RowInserted( pos );
-}
-
-bool wxDataViewSortedListModel::ChildRowInserted( unsigned int before )
-{
- // fix up array
- unsigned int i;
- unsigned int len = m_array.GetCount();
- for (i = 0; i < len; i++)
- {
- unsigned int value = m_array[i];
- if (value >= before)
- m_array[i] = value+1;
- }
-
- unsigned int pos = m_array.Add( before );
-
- if (pos == 0)
- return wxDataViewListModel::RowPrepended();
-
- if (pos == len)
- return wxDataViewListModel::RowAppended();
-
- return wxDataViewListModel::RowInserted( pos );
-}
-
-bool wxDataViewSortedListModel::ChildRowDeleted( unsigned int row )
-{
- unsigned int i;
- unsigned int len = m_array.GetCount();
- int pos = -1;
- for (i = 0; i < len; i++)
- {
- unsigned int value = m_array[i];
- if (value == row)
- {
- // delete later
- pos = (int) i;
- }
- else
- {
- // Fix up array
- if (value > row)
- m_array[i] = value-1;
- }
- }
-
- if (pos == -1)
- return false; // we should probably assert
-
- // remove
- m_array.RemoveAt( (unsigned int) pos );
-
- return wxDataViewListModel::RowDeleted( (unsigned int) pos);
-}
-
-bool wxDataViewSortedListModel::ChildRowChanged( unsigned int row )
-{
- unsigned int i;
- unsigned int len = m_array.GetCount();
-
- // Remove and readd sorted. Find out at which
- // position it was and where it ended.
- unsigned int start_pos = 0,end_pos = 0;
- for (i = 0; i < len; i++)
- if (m_array[i] == row)
- {
- start_pos = i;
- break;
- }
- m_array.RemoveAt( start_pos );
- m_array.Add( row );
-
- for (i = 0; i < len; i++)
- if (m_array[i] == row)
- {
- end_pos = i;
- break;
- }
-
- if (end_pos == start_pos)
- return wxDataViewListModel::RowChanged( start_pos );
-
- // Create an array where order[old] -> new_pos, so that
- // if nothing changed order[0] -> 0 etc.
- unsigned int *order = new unsigned int[ len ];
- // Fill up initial values.
- for (i = 0; i < len; i++)
- order[i] = i;
-
- if (start_pos < end_pos)
- {
- for (i = start_pos; i < end_pos; i++)
- order[i] = order[i+1];
- order[end_pos] = start_pos;
- }
- else
- {
- for (i = end_pos; i > start_pos; i--)
- order[i] = order[i-1];
- order[start_pos] = end_pos;
- }
-
- wxDataViewListModel::RowsReordered( order );
-
- delete [] order;
-
- return true;
-}
-
-bool wxDataViewSortedListModel::ChildValueChanged( unsigned int col, unsigned int row )
-{
- unsigned int i;
- unsigned int len = m_array.GetCount();
-
- // Remove and readd sorted. Find out at which
- // position it was and where it ended.
- unsigned int start_pos = 0,end_pos = 0;
- for (i = 0; i < len; i++)
- if (m_array[i] == row)
- {
- start_pos = i;
- break;
- }
- m_array.RemoveAt( start_pos );
- m_array.Add( row );
-
- for (i = 0; i < len; i++)
- if (m_array[i] == row)
- {
- end_pos = i;
- break;
- }
-
- if (end_pos == start_pos)
- return wxDataViewListModel::ValueChanged( col, start_pos );
-
- // Create an array where order[old] -> new_pos, so that
- // if nothing changed order[0] -> 0 etc.
- unsigned int *order = new unsigned int[ len ];
- // Fill up initial values.
- for (i = 0; i < len; i++)
- order[i] = i;
-
- if (start_pos < end_pos)
- {
- for (i = start_pos; i < end_pos; i++)
- order[i] = order[i+1];
- order[end_pos] = start_pos;
- }
- else
- {
- for (i = end_pos; i > start_pos; i--)
- order[i] = order[i-1];
- order[start_pos] = end_pos;
- }
-
- wxDataViewListModel::RowsReordered( order );
-
- delete [] order;
-
- return true;
-}
-
-bool wxDataViewSortedListModel::ChildRowsReordered( unsigned int *WXUNUSED(new_order) )
-{
- // Nothing needs to be done. If the sort criteria
- // of this list don't change, the order of the
- // items of the child list isn't relevant.
- return true;
-}
-
-bool wxDataViewSortedListModel::ChildCleared()
-{
- return wxDataViewListModel::Cleared();
-}
-
-unsigned int wxDataViewSortedListModel::GetRowCount() const
-{
- return m_array.GetCount();
-}
-
-unsigned int wxDataViewSortedListModel::GetColumnCount() const
-{
- return m_child->GetColumnCount();
-}
-
-wxString wxDataViewSortedListModel::GetColumnType( unsigned int col ) const
-{
- return m_child->GetColumnType( col );
-}
-
-void wxDataViewSortedListModel::GetValue( wxVariant &variant, unsigned int col, unsigned int row ) const
-{
- unsigned int child_row = m_array[row];
- m_child->GetValue( variant, col, child_row );
-}
-
-bool wxDataViewSortedListModel::SetValue( const wxVariant &variant, unsigned int col, unsigned int row )
-{
- unsigned int child_row = m_array[row];
- bool ret = m_child->SetValue( variant, col, child_row );
-
- // Do nothing here as the change in the
- // child model will be reported back.
-
- return ret;
-}
-
-bool wxDataViewSortedListModel::RowAppended()
-{
- // you can only append
- bool ret = m_child->RowAppended();
-
- // Do nothing here as the change in the
- // child model will be reported back.
-
- return ret;
-}
-
-bool wxDataViewSortedListModel::RowPrepended()
-{
- // you can only append
- bool ret = m_child->RowAppended();
-
- // Do nothing here as the change in the
- // child model will be reported back.
-
- return ret;
-}
-
-bool wxDataViewSortedListModel::RowInserted( unsigned int WXUNUSED(before) )
-{
- // you can only append
- bool ret = m_child->RowAppended();
-
- // Do nothing here as the change in the
- // child model will be reported back.
-
- return ret;
-}
-
-bool wxDataViewSortedListModel::RowDeleted( unsigned int row )
-{
- unsigned int child_row = m_array[row];
-
- bool ret = m_child->RowDeleted( child_row );
-
- // Do nothing here as the change in the
- // child model will be reported back.
-
- return ret;
-}
-
-bool wxDataViewSortedListModel::RowChanged( unsigned int row )
-{
- unsigned int child_row = m_array[row];
- bool ret = m_child->RowChanged( child_row );
-
- // Do nothing here as the change in the
- // child model will be reported back.
-
- return ret;
-}
-
-bool wxDataViewSortedListModel::ValueChanged( unsigned int col, unsigned int row )
-{
- unsigned int child_row = m_array[row];
- bool ret = m_child->ValueChanged( col, child_row );
-
- // Do nothing here as the change in the
- // child model will be reported back.
-
- return ret;
-}
-
-bool wxDataViewSortedListModel::RowsReordered( unsigned int *WXUNUSED(new_order) )
-{
- // We sort them ourselves.
-
- return false;
-}
-
-bool wxDataViewSortedListModel::Cleared()
-{
- bool ret = m_child->Cleared();
-
- // Do nothing here as the change in the
- // child model will be reported back.
-
- return ret;