-// ---------------------------------------------------------
-// wxDataViewSortedListModelNotifier
-// ---------------------------------------------------------
-
-class wxDataViewSortedListModelNotifier: public wxDataViewListModelNotifier
-{
-public:
- wxDataViewSortedListModelNotifier( wxDataViewSortedListModel *model )
- { m_model = model; }
-
- virtual bool RowAppended()
- { return m_model->ChildRowAppended(); }
-
- virtual bool RowPrepended()
- { return m_model->ChildRowPrepended(); }
-
- virtual bool RowInserted( unsigned int before )
- { return m_model->ChildRowInserted( before ); }
-
- virtual bool RowDeleted( unsigned int row )
- { return m_model->ChildRowDeleted( row ); }
-
- virtual bool RowChanged( unsigned int row )
- { return m_model->ChildRowChanged( row ); }
-
- virtual bool ValueChanged( unsigned int col, unsigned int row )
- { return m_model->ChildValueChanged( col, row); }
-
- virtual bool RowsReordered( unsigned int *new_order )
- { return m_model->ChildRowsReordered( new_order ); }
-
- virtual bool Cleared()
- { return m_model->ChildCleared(); }
-
- wxDataViewSortedListModel *m_model;
-};
-
-// ---------------------------------------------------------
-// wxDataViewSortedListModel compare function
-// ---------------------------------------------------------
-
-int wxCALLBACK wxDataViewListModelSortedDefaultCompare
- (unsigned int row1, unsigned int row2, unsigned int col, wxDataViewListModel* model )
-{
- wxVariant value1,value2;
- model->GetValue( value1, col, row1 );
- model->GetValue( value2, col, row2 );
- if (value1.GetType() == wxT("string"))
- {
- wxString str1 = value1.GetString();
- wxString str2 = value2.GetString();
- return str1.Cmp( str2 );
- }
- if (value1.GetType() == wxT("long"))
- {
- long l1 = value1.GetLong();
- long l2 = value2.GetLong();
- return l1-l2;
- }
- if (value1.GetType() == wxT("double"))
- {
- double d1 = value1.GetDouble();
- double d2 = value2.GetDouble();
- if (d1 == d2) return 0;
- if (d1 < d2) return 1;
- return -1;
- }
- if (value1.GetType() == wxT("datetime"))
- {
- wxDateTime dt1 = value1.GetDateTime();
- wxDateTime dt2 = value2.GetDateTime();
- if (dt1.IsEqualTo(dt2)) return 0;
- if (dt1.IsEarlierThan(dt2)) return 1;
- return -1;
- }
-
- return 0;
-}
-
-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 );
-
- m_child->IncRef();
-
- Resort();
-}
-
-wxDataViewSortedListModel::~wxDataViewSortedListModel()
-{
- DetachChild();
-}
-
-void wxDataViewSortedListModel::DetachChild()
-{
- if (m_child)
- {
- m_child->RemoveNotifier( m_notifierOnChild );
- m_child->DecRef();
- }
-
- m_child = NULL;
-}
-
-// 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();
-
- if (!m_child) return;
-
- unsigned int n = m_child->GetRowCount();
-
- unsigned int i;
- if (n != m_array.GetCount())
- {
- // probably sorted for the first time -> no reordered
- // -- just create index and leave
- m_array.Clear();
- for (i = 0; i < n; i++)
- m_array.Add( i );
- return;
- }
-
- unsigned int *old_array = new unsigned int[ n ];
-
- for (i = 0; i < n; i++)
- old_array[i] = m_array[ i ];
-
- m_array.Clear();
- for (i = 0; i < n; i++)
- m_array.Add( i );
-
- unsigned int *order = new unsigned int[ n ];
-
- for (i = 0; i < n; i++)
- {
- unsigned int new_value = m_array[i];
-
- unsigned int old_pos;
- for (old_pos = 0; old_pos < n; old_pos++)
- if (old_array[old_pos] == new_value)
- break;
- order[i] = old_pos;
- }
-
- delete [] old_array;
-
- wxDataViewListModel::RowsReordered( order );
-
- delete [] order;
-}
-
-#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
-{
- if (!m_child) return 0;
-
- return m_child->GetRowCount();
-}
-
-unsigned int wxDataViewSortedListModel::GetColumnCount() const
-{
- if (!m_child) return 0;
-
- 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;
-}
-