Implement most of AppendRow(), PrependRow(), InsertRow(),

DeleteRow() for GTK+ version and sorted model.
  Added tests for these.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41450 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2006-09-25 21:11:14 +00:00
parent 627e49c80c
commit 4627af27d4
4 changed files with 273 additions and 22 deletions

View File

@@ -216,17 +216,31 @@ class wxDataViewSortedListModelNotifier: public wxDataViewListModelNotifier
{
public:
wxDataViewSortedListModelNotifier( wxDataViewSortedListModel *model )
{ m_model = model; }
{ m_model = model; }
virtual bool RowAppended() { return true; }
virtual bool RowPrepended() { return true; }
virtual bool RowInserted( size_t WXUNUSED(before) ) { return true; }
virtual bool RowDeleted( size_t WXUNUSED(row) ) { return true; }
virtual bool RowChanged( size_t WXUNUSED(row) ) { return true; }
virtual bool RowAppended()
{ return m_model->ChildRowAppended(); }
virtual bool RowPrepended()
{ return m_model->ChildRowPrepended(); }
virtual bool RowInserted( size_t before )
{ return m_model->ChildRowInserted( before ); }
virtual bool RowDeleted( size_t row )
{ return m_model->ChildRowDeleted( row ); }
virtual bool RowChanged( size_t row )
{ return m_model->ChildRowChanged( row ); }
virtual bool ValueChanged( size_t col, size_t row )
{ return m_model->ChildValueChanged( col, row); }
virtual bool RowsReordered( size_t *WXUNUSED(new_order) ) { return true; }
virtual bool Cleared() { return true; }
{ return m_model->ChildValueChanged( col, row); }
virtual bool RowsReordered( size_t *new_order )
{ return m_model->ChildRowsReordered( new_order ); }
virtual bool Cleared()
{ return m_model->ChildCleared(); }
wxDataViewSortedListModel *m_model;
};
@@ -332,6 +346,152 @@ static void Dump( wxDataViewListModel *model, size_t col )
}
#endif
bool wxDataViewSortedListModel::ChildRowAppended()
{
// no need to fix up array
size_t len = m_array.GetCount();
size_t 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
size_t i;
size_t len = m_array.GetCount();
for (i = 0; i < len; i++)
{
size_t value = m_array[i];
m_array[i] = value+1;
}
size_t pos = m_array.Add( 0 );
if (pos == 0)
return wxDataViewListModel::RowPrepended();
if (pos == len)
return wxDataViewListModel::RowAppended();
return wxDataViewListModel::RowInserted( pos );
}
bool wxDataViewSortedListModel::ChildRowInserted( size_t before )
{
// fix up array
size_t i;
size_t len = m_array.GetCount();
for (i = 0; i < len; i++)
{
size_t value = m_array[i];
if (value >= before)
m_array[i] = value+1;
}
size_t pos = m_array.Add( before );
if (pos == 0)
return wxDataViewListModel::RowPrepended();
if (pos == len)
return wxDataViewListModel::RowAppended();
return wxDataViewListModel::RowInserted( pos );
}
bool wxDataViewSortedListModel::ChildRowDeleted( size_t row )
{
size_t i;
size_t len = m_array.GetCount();
int pos = -1;
for (i = 0; i < len; i++)
{
size_t 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( (size_t) pos );
return wxDataViewListModel::RowDeleted( (size_t) pos);
}
bool wxDataViewSortedListModel::ChildRowChanged( size_t row )
{
size_t i;
size_t len = m_array.GetCount();
// Remove and readd sorted. Find out at which
// position it was and where it ended.
size_t 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.
size_t *order = new size_t[ 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( size_t col, size_t row )
{
size_t i;
@@ -386,6 +546,19 @@ bool wxDataViewSortedListModel::ChildValueChanged( size_t col, size_t row )
return true;
}
bool wxDataViewSortedListModel::ChildRowsReordered( size_t *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();
}
size_t wxDataViewSortedListModel::GetNumberOfRows()
{
return m_array.GetCount();
@@ -412,7 +585,8 @@ bool wxDataViewSortedListModel::SetValue( wxVariant &variant, size_t col, size_t
size_t child_row = m_array[row];
bool ret = m_child->SetValue( variant, col, child_row );
// Resort in ::ChildValueChanged() which gets reported back.
// Do nothing here as the change in the
// child model will be reported back.
return ret;
}
@@ -422,7 +596,8 @@ bool wxDataViewSortedListModel::RowAppended()
// you can only append
bool ret = m_child->RowAppended();
// report RowInsrted
// Do nothing here as the change in the
// child model will be reported back.
return ret;
}
@@ -432,7 +607,8 @@ bool wxDataViewSortedListModel::RowPrepended()
// you can only append
bool ret = m_child->RowAppended();
// report RowInsrted
// Do nothing here as the change in the
// child model will be reported back.
return ret;
}
@@ -442,7 +618,8 @@ bool wxDataViewSortedListModel::RowInserted( size_t WXUNUSED(before) )
// you can only append
bool ret = m_child->RowAppended();
// report different RowInsrted
// Do nothing here as the change in the
// child model will be reported back.
return ret;
}
@@ -492,8 +669,9 @@ bool wxDataViewSortedListModel::Cleared()
{
bool ret = m_child->Cleared();
wxDataViewListModel::Cleared();
// Do nothing here as the change in the
// child model will be reported back.
return ret;
}