Split wxDataViewVirtualModel fork wxDataViewIndexModel to make the code clearer and let wxDataViewIndexModel behave the same on all platforms

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53077 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2008-04-07 09:27:21 +00:00
parent 2edac25b2e
commit e39de7022c
7 changed files with 461 additions and 306 deletions

View File

@@ -224,7 +224,7 @@ public:
virtual bool HasDefaultCompare() const { return false; } virtual bool HasDefaultCompare() const { return false; }
// internal // internal
virtual bool IsIndexListModel() const { return false; } virtual bool IsVirtualListModel() const { return false; }
protected: protected:
// the user should not delete this class directly: he should use DecRef() instead! // the user should not delete this class directly: he should use DecRef() instead!
@@ -284,7 +284,7 @@ public:
virtual unsigned int GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const; virtual unsigned int GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const;
// internal // internal
virtual bool IsIndexListModel() const { return true; } virtual bool IsVirtualListModel() const { return false; }
unsigned int GetLastIndex() const { return m_lastIndex; } unsigned int GetLastIndex() const { return m_lastIndex; }
private: private:
@@ -294,6 +294,71 @@ private:
bool m_useHash; bool m_useHash;
}; };
// ---------------------------------------------------------
// wxDataViewVirtualListModel
// ---------------------------------------------------------
#ifdef __WXMAC__
// better than nothing
typedef wxDataViewVirtualListModel wxDataViewIndexListModel
#else
class WXDLLIMPEXP_ADV wxDataViewVirtualListModel: public wxDataViewModel
{
public:
wxDataViewVirtualListModel( unsigned int initial_size = 0 );
~wxDataViewVirtualListModel();
virtual void GetValue( wxVariant &variant,
unsigned int row, unsigned int col ) const = 0;
virtual bool SetValue( const wxVariant &variant,
unsigned int row, unsigned int col ) = 0;
virtual bool GetAttr( unsigned int WXUNUSED(row), unsigned int WXUNUSED(col), wxDataViewItemAttr &WXUNUSED(attr) )
{ return false; }
void RowPrepended();
void RowInserted( unsigned int before );
void RowAppended();
void RowDeleted( unsigned int row );
void RowsDeleted( const wxArrayInt &rows );
void RowChanged( unsigned int row );
void RowValueChanged( unsigned int row, unsigned int col );
void Reset( unsigned int new_size );
// convert to/from row/wxDataViewItem
unsigned int GetRow( const wxDataViewItem &item ) const;
wxDataViewItem GetItem( unsigned int row ) const;
// compare based on index
virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
unsigned int column, bool ascending );
virtual bool HasDefaultCompare() const;
// implement base methods
virtual void GetValue( wxVariant &variant,
const wxDataViewItem &item, unsigned int col ) const;
virtual bool SetValue( const wxVariant &variant,
const wxDataViewItem &item, unsigned int col );
virtual bool GetAttr( const wxDataViewItem &item, unsigned int col, wxDataViewItemAttr &attr );
virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const;
virtual bool IsContainer( const wxDataViewItem &item ) const;
virtual unsigned int GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const;
// internal
virtual bool IsVirtualListModel() const { return true; }
unsigned int GetLastIndex() const { return m_lastIndex; }
private:
wxDataViewItemArray m_hash;
unsigned int m_lastIndex;
bool m_ordered;
};
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// wxDataViewEditorCtrlEvtHandler // wxDataViewEditorCtrlEvtHandler

View File

@@ -136,13 +136,6 @@ public:
unsigned int WXUNUSED(col) ) unsigned int WXUNUSED(col) )
{ return false; } { return false; }
virtual bool RightClick( wxPoint WXUNUSED(cursor),
wxRect WXUNUSED(cell),
wxDataViewModel *WXUNUSED(model),
const wxDataViewItem & WXUNUSED(item),
unsigned int WXUNUSED(col) )
{ return false; }
virtual bool StartDrag( wxPoint WXUNUSED(cursor), virtual bool StartDrag( wxPoint WXUNUSED(cursor),
wxRect WXUNUSED(cell), wxRect WXUNUSED(cell),
wxDataViewModel *WXUNUSED(model), wxDataViewModel *WXUNUSED(model),

View File

@@ -155,127 +155,6 @@ public:
/**
@class wxDataViewIndexListModel
@wxheader{dataview.h}
wxDataViewIndexListModel is a specialized data model which lets
you address an item by its position (row) rather than its
wxDataViewItem (which you can obtain from this class).
This model also provides its own
wxDataViewIndexListModel::Compare method
which sorts the model's data by the index.
This model is special in the it is implemented differently under OS X
and other platforms. Under OS X a wxDataViewItem is always persistent
and this is also the case for this class. Under other platforms, the
meaning of a wxDataViewItem is changed to reflect a row number for
wxDataViewIndexListModel. The consequence of this is that
wxDataViewIndexListModel can be used as a virtual model with an
almost infinate number of items on platforms other than OS X.
@library{wxbase}
@category{FIXME}
*/
class wxDataViewIndexListModel : public wxDataViewModel
{
public:
/**
Constructor.
*/
wxDataViewIndexListModel(unsigned int initial_size = 0);
/**
Destructor.
*/
~wxDataViewIndexListModel();
/**
Compare method that sorts the items by their index.
*/
int Compare(const wxDataViewItem& item1,
const wxDataViewItem& item2,
unsigned int column, bool ascending);
/**
Oberride this to indicate that the row has special font attributes.
This only affects the
wxDataViewTextRendererText() renderer.
See also wxDataViewItemAttr.
*/
bool GetAttr(unsigned int row, unsigned int col,
wxDataViewItemAttr& attr);
/**
Returns the wxDataViewItem at the given @e row.
*/
wxDataViewItem GetItem(unsigned int row) const;
/**
Returns the position of given @e item.
*/
unsigned int GetRow(const wxDataViewItem& item) const;
/**
Override this to allow getting values from the model.
*/
void GetValue(wxVariant& variant, unsigned int row,
unsigned int col) const;
/**
Call this after if the data has to be read again from
the model. This is useful after major changes when
calling the methods below (possibly thousands of times)
doesn't make sense.
*/
void Reset(unsigned int new_size);
/**
Call this after a row has been appended to the model.
*/
void RowAppended();
/**
Call this after a row has been changed.
*/
void RowChanged(unsigned int row);
/**
Call this after a row has been deleted.
*/
void RowDeleted(unsigned int row);
/**
Call this after a row has been inserted at the given position.
*/
void RowInserted(unsigned int before);
/**
Call this after a row has been prepended to the model.
*/
void RowPrepended();
/**
Call this after a value has been changed.
*/
void RowValueChanged(unsigned int row, unsigned int col);
/**
Call this after rows have been deleted. The array will internally
get copied and sorted in descending order so that the rows with
the highest position will be deleted first.
*/
void RowsDeleted(const wxArrayInt& rows);
/**
Called in order to set a value in the model.
*/
bool SetValue(const wxVariant& variant, unsigned int row,
unsigned int col);
};
/** /**
@class wxDataViewModel @class wxDataViewModel
@wxheader{dataview.h} @wxheader{dataview.h}
@@ -341,6 +220,7 @@ public:
Currently wxWidgets provides the following models apart Currently wxWidgets provides the following models apart
from the base model: from the base model:
wxDataViewIndexListModel, wxDataViewIndexListModel,
wxDataViewVirtualListModel,
wxDataViewTreeStore. wxDataViewTreeStore.
Note that wxDataViewModel is reference counted, derives from Note that wxDataViewModel is reference counted, derives from
@@ -542,6 +422,154 @@ public:
/**
@class wxDataViewIndexListModel
@wxheader{dataview.h}
wxDataViewIndexListModel is a specialized data model which lets
you address an item by its position (row) rather than its
wxDataViewItem (which you can obtain from this class).
This model also provides its own wxDataViewIndexListModel::Compare
method which sorts the model's data by the index.
This model is not a virtual model since the control stores
each wxDataViewItem. Use wxDataViewVirtualListModel if you
need to display millions of items or have other reason to
use a virtual control.
@library{wxbase}
@category{FIXME}
*/
class wxDataViewIndexListModel : public wxDataViewModel
{
public:
/**
Constructor.
*/
wxDataViewIndexListModel(unsigned int initial_size = 0);
/**
Destructor.
*/
~wxDataViewIndexListModel();
/**
Compare method that sorts the items by their index.
*/
int Compare(const wxDataViewItem& item1,
const wxDataViewItem& item2,
unsigned int column, bool ascending);
/**
Oberride this to indicate that the row has special font attributes.
This only affects the
wxDataViewTextRendererText() renderer.
See also wxDataViewItemAttr.
*/
bool GetAttr(unsigned int row, unsigned int col,
wxDataViewItemAttr& attr);
/**
Returns the wxDataViewItem at the given @e row.
*/
wxDataViewItem GetItem(unsigned int row) const;
/**
Returns the position of given @e item.
*/
unsigned int GetRow(const wxDataViewItem& item) const;
/**
Override this to allow getting values from the model.
*/
void GetValue(wxVariant& variant, unsigned int row,
unsigned int col) const;
/**
Call this after if the data has to be read again from
the model. This is useful after major changes when
calling the methods below (possibly thousands of times)
doesn't make sense.
*/
void Reset(unsigned int new_size);
/**
Call this after a row has been appended to the model.
*/
void RowAppended();
/**
Call this after a row has been changed.
*/
void RowChanged(unsigned int row);
/**
Call this after a row has been deleted.
*/
void RowDeleted(unsigned int row);
/**
Call this after a row has been inserted at the given position.
*/
void RowInserted(unsigned int before);
/**
Call this after a row has been prepended to the model.
*/
void RowPrepended();
/**
Call this after a value has been changed.
*/
void RowValueChanged(unsigned int row, unsigned int col);
/**
Call this after rows have been deleted. The array will internally
get copied and sorted in descending order so that the rows with
the highest position will be deleted first.
*/
void RowsDeleted(const wxArrayInt& rows);
/**
Called in order to set a value in the model.
*/
bool SetValue(const wxVariant& variant, unsigned int row,
unsigned int col);
};
/**
@class wxDataViewVirtualListModel
@wxheader{dataview.h}
wxDataViewVirtualListModel is a specialized data model which lets
you address an item by its position (row) rather than its
wxDataViewItem and as such offers the exact same interface as
wxDataViewIndexListModel. The important difference is that under
platforms other than OS X, using this model will result in a
truely virtual control able to handle millions of items as the
control doesn't store any item (a feature not supported by the
Carbon API under OS X).
@see wxDataViewIndexListModel for the API.
@library{wxbase}
@category{FIXME}
*/
class wxDataViewVirtualListModel : public wxDataViewModel
{
public:
/**
Constructor.
*/
wxDataViewVirtualListModel(unsigned int initial_size = 0);
}
/** /**
@class wxDataViewItemAttr @class wxDataViewItemAttr
@wxheader{dataview.h} @wxheader{dataview.h}
@@ -703,6 +731,14 @@ public:
*/ */
~wxDataViewCtrl(); ~wxDataViewCtrl();
/**
Add a wxDataViewColumn to the control. Returns
@e @true on success.
Note that there is a number of short cut methods which implicitly create
a wxDataViewColumn and a wxDataViewRenderer for it (see below).
*/
virtual bool AppendColumn(wxDataViewColumn* col);
//@{ //@{
/** /**
Appends a column for rendering a bitmap. Returns the wxDataViewColumn Appends a column for rendering a bitmap. Returns the wxDataViewColumn
@@ -722,19 +758,13 @@ public:
int flags = wxDATAVIEW_COL_RESIZABLE); int flags = wxDATAVIEW_COL_RESIZABLE);
//@} //@}
/**
Add a wxDataViewColumn to the control. Returns
@e @true on success.
Note that there is a number of short cut methods which implicitly create
a wxDataViewColumn and a
wxDataViewRenderer for it (see below).
*/
virtual bool AppendColumn(wxDataViewColumn* col);
//@{ //@{
/** /**
Appends a column for rendering a date. Returns the wxDataViewColumn Appends a column for rendering a date. Returns the wxDataViewColumn
created in the function or @NULL on failure. created in the function or @NULL on failure.
NB: The @e align parameter is applied to both the column header and
the column renderer.
*/ */
wxDataViewColumn* AppendDateColumn(const wxString& label, wxDataViewColumn* AppendDateColumn(const wxString& label,
unsigned int model_column, unsigned int model_column,
@@ -753,8 +783,11 @@ public:
//@{ //@{
/** /**
Appends a column for rendering text with an icon. Returns the wxDataViewColumn Appends a column for rendering text with an icon. Returns the wxDataViewColumn
created in the function or @NULL on failure. This uses the created in the function or @NULL on failure. This method uses the
wxDataViewIconTextRenderer. wxDataViewIconTextRenderer class.
NB: The @e align parameter is applied to both the column header and
the column renderer.
*/ */
wxDataViewColumn* AppendIconTextColumn(const wxString& label, wxDataViewColumn* AppendIconTextColumn(const wxString& label,
unsigned int model_column, unsigned int model_column,
@@ -773,8 +806,10 @@ public:
//@{ //@{
/** /**
Appends a column for rendering a progress indicator. Returns the Appends a column for rendering a progress indicator. Returns the
wxDataViewColumn wxDataViewColumn created in the function or @NULL on failure.
created in the function or @NULL on failure.
NB: The @e align parameter is applied to both the column header and
the column renderer.
*/ */
wxDataViewColumn* AppendProgressColumn(const wxString& label, wxDataViewColumn* AppendProgressColumn(const wxString& label,
unsigned int model_column, unsigned int model_column,
@@ -794,6 +829,9 @@ public:
/** /**
Appends a column for rendering text. Returns the wxDataViewColumn Appends a column for rendering text. Returns the wxDataViewColumn
created in the function or @NULL on failure. created in the function or @NULL on failure.
NB: The @e align parameter is applied to both the column header and
the column renderer.
*/ */
wxDataViewColumn* AppendTextColumn(const wxString& label, wxDataViewColumn* AppendTextColumn(const wxString& label,
unsigned int model_column, unsigned int model_column,
@@ -813,6 +851,9 @@ public:
/** /**
Appends a column for rendering a toggle. Returns the wxDataViewColumn Appends a column for rendering a toggle. Returns the wxDataViewColumn
created in the function or @NULL on failure. created in the function or @NULL on failure.
NB: The @e align parameter is applied to both the column header and
the column renderer.
*/ */
wxDataViewColumn* AppendToggleColumn(const wxString& label, wxDataViewColumn* AppendToggleColumn(const wxString& label,
unsigned int model_column, unsigned int model_column,
@@ -829,8 +870,8 @@ public:
//@} //@}
/** /**
Associates a wxDataViewModel with the Associates a wxDataViewModel with the control. This increases the reference
control. This increases the reference count of the model by 1. count of the model by 1.
*/ */
virtual bool AssociateModel(wxDataViewModel* model); virtual bool AssociateModel(wxDataViewModel* model);

View File

@@ -402,14 +402,14 @@ static int my_sort( int *v1, int *v2 )
return *v1-*v2; return *v1-*v2;
} }
class MyListModel: public wxDataViewIndexListModel class MyListModel: public wxDataViewVirtualListModel
{ {
public: public:
MyListModel() : MyListModel() :
#ifdef __WXMAC__ #ifdef __WXMAC__
wxDataViewIndexListModel( 1000 + 100 ) wxDataViewVirtualListModel( 1000 + 100 )
#else #else
wxDataViewIndexListModel( 100000 + 100 ) wxDataViewVirtualListModel( 100000 + 100 )
#endif #endif
{ {
#ifdef __WXMAC__ #ifdef __WXMAC__
@@ -825,7 +825,7 @@ MyFrame::MyFrame(wxFrame *frame, const wxString &title, int x, int y, int w, int
m_listCtrl->AssociateModel( m_list_model.get() ); m_listCtrl->AssociateModel( m_list_model.get() );
#if 1 #if 1
m_listCtrl->AppendTextColumn (wxT("editable string"), 0, wxDATAVIEW_CELL_EDITABLE, 120 ); m_listCtrl->AppendTextColumn (wxT("editable string"), 0, wxDATAVIEW_CELL_EDITABLE, 120, wxALIGN_RIGHT );
m_listCtrl->AppendIconTextColumn(wxT("icon"), 1, wxDATAVIEW_CELL_INERT, 60 ); m_listCtrl->AppendIconTextColumn(wxT("icon"), 1, wxDATAVIEW_CELL_INERT, 60 );
#else #else
m_listCtrl->AppendTextColumn (wxT("editable string"), 0, wxDATAVIEW_CELL_EDITABLE ); m_listCtrl->AppendTextColumn (wxT("editable string"), 0, wxDATAVIEW_CELL_EDITABLE );

View File

@@ -297,29 +297,22 @@ int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem
// wxDataViewIndexListModel // wxDataViewIndexListModel
// --------------------------------------------------------- // ---------------------------------------------------------
static int my_sort( int *v1, int *v2 )
{
return *v2-*v1;
}
wxDataViewIndexListModel::wxDataViewIndexListModel( unsigned int initial_size ) wxDataViewIndexListModel::wxDataViewIndexListModel( unsigned int initial_size )
{ {
#ifndef __WXMAC__ // IDs are ordered until an item gets deleted or inserted
m_useHash = false; m_ordered = true;
#else
m_useHash = true; // build initial index
#endif unsigned int i;
for (i = 1; i < initial_size+1; i++)
if (m_useHash)
{
// IDs are ordered until an item gets deleted or inserted
m_ordered = true;
// build initial index
unsigned int i;
for (i = 1; i < initial_size+1; i++)
m_hash.Add( (void*) i ); m_hash.Add( (void*) i );
m_lastIndex = initial_size + 1; m_lastIndex = initial_size + 1;
}
else
{
m_lastIndex = initial_size-1;
}
} }
wxDataViewIndexListModel::~wxDataViewIndexListModel() wxDataViewIndexListModel::~wxDataViewIndexListModel()
@@ -328,103 +321,55 @@ wxDataViewIndexListModel::~wxDataViewIndexListModel()
void wxDataViewIndexListModel::Reset( unsigned int new_size ) void wxDataViewIndexListModel::Reset( unsigned int new_size )
{ {
if (m_useHash) m_hash.Clear();
{
m_hash.Clear();
// IDs are ordered until an item gets deleted or inserted // IDs are ordered until an item gets deleted or inserted
m_ordered = true; m_ordered = true;
// build initial index // build initial index
unsigned int i; unsigned int i;
for (i = 1; i < new_size+1; i++) for (i = 1; i < new_size+1; i++)
m_hash.Add( (void*) i ); m_hash.Add( (void*) i );
m_lastIndex = new_size + 1; m_lastIndex = new_size + 1;
}
else
{
m_lastIndex = new_size-1;
}
wxDataViewModel::Cleared(); wxDataViewModel::Cleared();
} }
void wxDataViewIndexListModel::RowPrepended() void wxDataViewIndexListModel::RowPrepended()
{ {
if (m_useHash) m_ordered = false;
{
m_ordered = false;
unsigned int id = m_lastIndex++; unsigned int id = m_lastIndex++;
m_hash.Insert( (void*) id, 0 ); m_hash.Insert( (void*) id, 0 );
wxDataViewItem item( (void*) id ); wxDataViewItem item( (void*) id );
ItemAdded( wxDataViewItem(0), item ); ItemAdded( wxDataViewItem(0), item );
}
else
{
m_lastIndex++;
wxDataViewItem item( (void*) 0 );
ItemAdded( wxDataViewItem(0), item );
}
} }
void wxDataViewIndexListModel::RowInserted( unsigned int before ) void wxDataViewIndexListModel::RowInserted( unsigned int before )
{ {
if (m_useHash) m_ordered = false;
{
m_ordered = false;
unsigned int id = m_lastIndex++; unsigned int id = m_lastIndex++;
m_hash.Insert( (void*) id, before ); m_hash.Insert( (void*) id, before );
wxDataViewItem item( (void*) id ); wxDataViewItem item( (void*) id );
ItemAdded( wxDataViewItem(0), item ); ItemAdded( wxDataViewItem(0), item );
}
else
{
m_lastIndex++;
wxDataViewItem item( (void*) before );
ItemAdded( wxDataViewItem(0), item );
}
} }
void wxDataViewIndexListModel::RowAppended() void wxDataViewIndexListModel::RowAppended()
{ {
if (m_useHash) unsigned int id = m_lastIndex++;
{ m_hash.Add( (void*) id );
unsigned int id = m_lastIndex++; wxDataViewItem item( (void*) id );
m_hash.Add( (void*) id ); ItemAdded( wxDataViewItem(0), item );
wxDataViewItem item( (void*) id );
ItemAdded( wxDataViewItem(0), item );
}
else
{
m_lastIndex++;
wxDataViewItem item( (void*) m_lastIndex );
ItemAdded( wxDataViewItem(0), item );
}
} }
void wxDataViewIndexListModel::RowDeleted( unsigned int row ) void wxDataViewIndexListModel::RowDeleted( unsigned int row )
{ {
if (m_useHash) m_ordered = false;
{
m_ordered = false;
wxDataViewItem item( m_hash[row] ); wxDataViewItem item( m_hash[row] );
wxDataViewModel::ItemDeleted( wxDataViewItem(0), item ); wxDataViewModel::ItemDeleted( wxDataViewItem(0), item );
m_hash.RemoveAt( row ); m_hash.RemoveAt( row );
}
else
{
wxDataViewItem item( (void*) row );
wxDataViewModel::ItemDeleted( wxDataViewItem(0), item );
m_lastIndex++;
}
}
static int my_sort( int *v1, int *v2 )
{
return *v2-*v1;
} }
void wxDataViewIndexListModel::RowsDeleted( const wxArrayInt &rows ) void wxDataViewIndexListModel::RowsDeleted( const wxArrayInt &rows )
@@ -432,35 +377,19 @@ void wxDataViewIndexListModel::RowsDeleted( const wxArrayInt &rows )
wxArrayInt sorted = rows; wxArrayInt sorted = rows;
sorted.Sort( my_sort ); sorted.Sort( my_sort );
if (m_useHash) m_ordered = false;
{
m_ordered = false;
wxDataViewItemArray array; wxDataViewItemArray array;
unsigned int i; unsigned int i;
for (i = 0; i < rows.GetCount(); i++) for (i = 0; i < rows.GetCount(); i++)
{ {
wxDataViewItem item( m_hash[rows[i]] ); wxDataViewItem item( m_hash[rows[i]] );
array.Add( item ); array.Add( item );
} }
wxDataViewModel::ItemsDeleted( wxDataViewItem(0), array ); wxDataViewModel::ItemsDeleted( wxDataViewItem(0), array );
for (i = 0; i < sorted.GetCount(); i++) for (i = 0; i < sorted.GetCount(); i++)
m_hash.RemoveAt( sorted[i] ); m_hash.RemoveAt( sorted[i] );
}
else
{
wxDataViewItemArray array;
unsigned int i;
for (i = 0; i < sorted.GetCount(); i++)
{
wxDataViewItem item( (void*) sorted[i] );
array.Add( item );
}
wxDataViewModel::ItemsDeleted( wxDataViewItem(0), array );
m_lastIndex -= rows.GetCount();
}
} }
void wxDataViewIndexListModel::RowChanged( unsigned int row ) void wxDataViewIndexListModel::RowChanged( unsigned int row )
@@ -475,34 +404,20 @@ void wxDataViewIndexListModel::RowValueChanged( unsigned int row, unsigned int c
unsigned int wxDataViewIndexListModel::GetRow( const wxDataViewItem &item ) const unsigned int wxDataViewIndexListModel::GetRow( const wxDataViewItem &item ) const
{ {
if (m_useHash) if (m_ordered)
{ {
if (m_ordered)
{
unsigned int pos = wxPtrToUInt( item.GetID() ); unsigned int pos = wxPtrToUInt( item.GetID() );
return pos-1; return pos-1;
} }
// assert for not found // assert for not found
return (unsigned int) m_hash.Index( item.GetID() ); return (unsigned int) m_hash.Index( item.GetID() );
}
else
{
return wxPtrToUInt( item.GetID() );
}
} }
wxDataViewItem wxDataViewIndexListModel::GetItem( unsigned int row ) const wxDataViewItem wxDataViewIndexListModel::GetItem( unsigned int row ) const
{ {
if (m_useHash) wxASSERT( row < m_hash.GetCount() );
{ return wxDataViewItem( m_hash[row] );
wxASSERT( row < m_hash.GetCount() );
return wxDataViewItem( m_hash[row] );
}
else
{
return wxDataViewItem( (void*) row );
}
} }
bool wxDataViewIndexListModel::HasDefaultCompare() const bool wxDataViewIndexListModel::HasDefaultCompare() const
@@ -515,7 +430,7 @@ int wxDataViewIndexListModel::Compare(const wxDataViewItem& item1,
unsigned int WXUNUSED(column), unsigned int WXUNUSED(column),
bool ascending) bool ascending)
{ {
if (m_ordered || !m_useHash) if (m_ordered)
{ {
unsigned int pos1 = wxPtrToUInt(item1.GetID()); unsigned int pos1 = wxPtrToUInt(item1.GetID());
unsigned int pos2 = wxPtrToUInt(item2.GetID()); unsigned int pos2 = wxPtrToUInt(item2.GetID());
@@ -565,9 +480,6 @@ bool wxDataViewIndexListModel::IsContainer( const wxDataViewItem &item ) const
unsigned int wxDataViewIndexListModel::GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const unsigned int wxDataViewIndexListModel::GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const
{ {
if (!m_useHash)
return 0; // error
if (item.IsOk()) if (item.IsOk())
return 0; return 0;
@@ -576,6 +488,150 @@ unsigned int wxDataViewIndexListModel::GetChildren( const wxDataViewItem &item,
return m_hash.GetCount(); return m_hash.GetCount();
} }
// ---------------------------------------------------------
// wxDataViewVirtualListModel
// ---------------------------------------------------------
#ifndef __WXMAC__
wxDataViewVirtualListModel::wxDataViewVirtualListModel( unsigned int initial_size )
{
m_lastIndex = initial_size-1;
}
wxDataViewVirtualListModel::~wxDataViewVirtualListModel()
{
}
void wxDataViewVirtualListModel::Reset( unsigned int new_size )
{
m_lastIndex = new_size-1;
wxDataViewModel::Cleared();
}
void wxDataViewVirtualListModel::RowPrepended()
{
m_lastIndex++;
wxDataViewItem item( (void*) 0 );
ItemAdded( wxDataViewItem(0), item );
}
void wxDataViewVirtualListModel::RowInserted( unsigned int before )
{
m_lastIndex++;
wxDataViewItem item( (void*) before );
ItemAdded( wxDataViewItem(0), item );
}
void wxDataViewVirtualListModel::RowAppended()
{
m_lastIndex++;
wxDataViewItem item( (void*) m_lastIndex );
ItemAdded( wxDataViewItem(0), item );
}
void wxDataViewVirtualListModel::RowDeleted( unsigned int row )
{
wxDataViewItem item( (void*) row );
wxDataViewModel::ItemDeleted( wxDataViewItem(0), item );
m_lastIndex++;
}
void wxDataViewVirtualListModel::RowsDeleted( const wxArrayInt &rows )
{
wxArrayInt sorted = rows;
sorted.Sort( my_sort );
wxDataViewItemArray array;
unsigned int i;
for (i = 0; i < sorted.GetCount(); i++)
{
wxDataViewItem item( (void*) sorted[i] );
array.Add( item );
}
wxDataViewModel::ItemsDeleted( wxDataViewItem(0), array );
m_lastIndex -= rows.GetCount();
}
void wxDataViewVirtualListModel::RowChanged( unsigned int row )
{
wxDataViewModel::ItemChanged( GetItem(row) );
}
void wxDataViewVirtualListModel::RowValueChanged( unsigned int row, unsigned int col )
{
wxDataViewModel::ValueChanged( GetItem(row), col );
}
unsigned int wxDataViewVirtualListModel::GetRow( const wxDataViewItem &item ) const
{
return wxPtrToUInt( item.GetID() );
}
wxDataViewItem wxDataViewVirtualListModel::GetItem( unsigned int row ) const
{
return wxDataViewItem( (void*) row );
}
bool wxDataViewVirtualListModel::HasDefaultCompare() const
{
return true;
}
int wxDataViewVirtualListModel::Compare(const wxDataViewItem& item1,
const wxDataViewItem& item2,
unsigned int WXUNUSED(column),
bool ascending)
{
unsigned int pos1 = wxPtrToUInt(item1.GetID());
unsigned int pos2 = wxPtrToUInt(item2.GetID());
if (ascending)
return pos1 - pos2;
else
return pos2 - pos1;
}
void wxDataViewVirtualListModel::GetValue( wxVariant &variant,
const wxDataViewItem &item, unsigned int col ) const
{
GetValue( variant, GetRow(item), col );
}
bool wxDataViewVirtualListModel::SetValue( const wxVariant &variant,
const wxDataViewItem &item, unsigned int col )
{
return SetValue( variant, GetRow(item), col );
}
bool wxDataViewVirtualListModel::GetAttr( const wxDataViewItem &item, unsigned int col, wxDataViewItemAttr &attr )
{
return GetAttr( GetRow(item), col, attr );
}
wxDataViewItem wxDataViewVirtualListModel::GetParent( const wxDataViewItem & WXUNUSED(item) ) const
{
return wxDataViewItem(0);
}
bool wxDataViewVirtualListModel::IsContainer( const wxDataViewItem &item ) const
{
// only the invisible root item has children
if (!item.IsOk())
return true;
return false;
}
unsigned int wxDataViewVirtualListModel::GetChildren( const wxDataViewItem &WXUNUSED(item), wxDataViewItemArray &WXUNUSED(children) ) const
{
return 0; // should we report an error ?
}
#endif // __WXMAC__
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// wxDataViewIconText // wxDataViewIconText
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@@ -3351,7 +3351,7 @@ void wxDataViewMainWindow::BuildTree(wxDataViewModel * model)
{ {
DestroyTree(); DestroyTree();
if (GetOwner()->GetModel()->IsIndexListModel()) if (GetOwner()->GetModel()->IsVirtualListModel())
{ {
m_count = -1 ; m_count = -1 ;
return; return;

View File

@@ -1080,7 +1080,7 @@ gtk_wx_cell_renderer_render (GtkCellRenderer *renderer,
rect.y += cell_area->y; rect.y += cell_area->y;
rect.width -= renderer->xpad * 2; rect.width -= renderer->xpad * 2;
rect.height -= renderer->ypad * 2; rect.height -= renderer->ypad * 2;
GdkRectangle dummy; GdkRectangle dummy;
if (gdk_rectangle_intersect (expose_area, &rect, &dummy)) if (gdk_rectangle_intersect (expose_area, &rect, &dummy))
{ {
@@ -2262,7 +2262,7 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column),
wxDataViewModel *wx_model = tree_model->internal->GetDataViewModel(); wxDataViewModel *wx_model = tree_model->internal->GetDataViewModel();
if (!wx_model->IsIndexListModel()) if (!wx_model->IsVirtualListModel())
{ {
if (wx_model->IsContainer( item )) if (wx_model->IsContainer( item ))
@@ -2752,7 +2752,7 @@ wxDataViewCtrlInternal::wxDataViewCtrlInternal( wxDataViewCtrl *owner,
m_sort_column = -1; m_sort_column = -1;
m_dataview_sort_column = NULL; m_dataview_sort_column = NULL;
if (!m_wx_model->IsIndexListModel()) if (!m_wx_model->IsVirtualListModel())
InitTree(); InitTree();
} }
@@ -2871,13 +2871,13 @@ bool wxDataViewCtrlInternal::Cleared()
void wxDataViewCtrlInternal::Resort() void wxDataViewCtrlInternal::Resort()
{ {
if (!m_wx_model->IsIndexListModel()) if (!m_wx_model->IsVirtualListModel())
m_root->Resort(); m_root->Resort();
} }
bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ) bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item )
{ {
if (!m_wx_model->IsIndexListModel()) if (!m_wx_model->IsVirtualListModel())
{ {
wxGtkTreeModelNode *parent_node = FindNode( parent ); wxGtkTreeModelNode *parent_node = FindNode( parent );
if (m_wx_model->IsContainer( item )) if (m_wx_model->IsContainer( item ))
@@ -2891,7 +2891,7 @@ bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDa
bool wxDataViewCtrlInternal::ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item ) bool wxDataViewCtrlInternal::ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item )
{ {
if (!m_wx_model->IsIndexListModel()) if (!m_wx_model->IsVirtualListModel())
{ {
wxGtkTreeModelNode *parent_node = FindNode( parent ); wxGtkTreeModelNode *parent_node = FindNode( parent );
parent_node->DeleteChild( item.GetID() ); parent_node->DeleteChild( item.GetID() );
@@ -2928,7 +2928,7 @@ bool wxDataViewCtrlInternal::ValueChanged( const wxDataViewItem &item, unsigned
GtkTreeModelFlags wxDataViewCtrlInternal::get_flags() GtkTreeModelFlags wxDataViewCtrlInternal::get_flags()
{ {
if (m_wx_model->IsIndexListModel()) if (m_wx_model->IsVirtualListModel())
return GTK_TREE_MODEL_LIST_ONLY; return GTK_TREE_MODEL_LIST_ONLY;
else else
return GTK_TREE_MODEL_ITERS_PERSIST; return GTK_TREE_MODEL_ITERS_PERSIST;
@@ -2936,7 +2936,7 @@ GtkTreeModelFlags wxDataViewCtrlInternal::get_flags()
gboolean wxDataViewCtrlInternal::get_iter( GtkTreeIter *iter, GtkTreePath *path ) gboolean wxDataViewCtrlInternal::get_iter( GtkTreeIter *iter, GtkTreePath *path )
{ {
if (m_wx_model->IsIndexListModel()) if (m_wx_model->IsVirtualListModel())
{ {
wxDataViewIndexListModel *wx_model = (wxDataViewIndexListModel*) m_wx_model; wxDataViewIndexListModel *wx_model = (wxDataViewIndexListModel*) m_wx_model;
@@ -2996,7 +2996,7 @@ GtkTreePath *wxDataViewCtrlInternal::get_path( GtkTreeIter *iter )
{ {
GtkTreePath *retval = gtk_tree_path_new (); GtkTreePath *retval = gtk_tree_path_new ();
if (m_wx_model->IsIndexListModel()) if (m_wx_model->IsVirtualListModel())
{ {
// user_data is just the index // user_data is just the index
int i = (wxUIntPtr) iter->user_data; int i = (wxUIntPtr) iter->user_data;
@@ -3023,7 +3023,7 @@ GtkTreePath *wxDataViewCtrlInternal::get_path( GtkTreeIter *iter )
gboolean wxDataViewCtrlInternal::iter_next( GtkTreeIter *iter ) gboolean wxDataViewCtrlInternal::iter_next( GtkTreeIter *iter )
{ {
if (m_wx_model->IsIndexListModel()) if (m_wx_model->IsVirtualListModel())
{ {
wxDataViewIndexListModel *wx_model = (wxDataViewIndexListModel*) m_wx_model; wxDataViewIndexListModel *wx_model = (wxDataViewIndexListModel*) m_wx_model;
@@ -3057,7 +3057,7 @@ gboolean wxDataViewCtrlInternal::iter_next( GtkTreeIter *iter )
gboolean wxDataViewCtrlInternal::iter_children( GtkTreeIter *iter, GtkTreeIter *parent ) gboolean wxDataViewCtrlInternal::iter_children( GtkTreeIter *iter, GtkTreeIter *parent )
{ {
if (m_wx_model->IsIndexListModel()) if (m_wx_model->IsVirtualListModel())
{ {
// this is a list, nodes have no children // this is a list, nodes have no children
if (parent) if (parent)
@@ -3090,7 +3090,7 @@ gboolean wxDataViewCtrlInternal::iter_children( GtkTreeIter *iter, GtkTreeIter *
gboolean wxDataViewCtrlInternal::iter_has_child( GtkTreeIter *iter ) gboolean wxDataViewCtrlInternal::iter_has_child( GtkTreeIter *iter )
{ {
if (m_wx_model->IsIndexListModel()) if (m_wx_model->IsVirtualListModel())
{ {
// this is a list, nodes have no children // this is a list, nodes have no children
return FALSE; return FALSE;
@@ -3113,7 +3113,7 @@ gboolean wxDataViewCtrlInternal::iter_has_child( GtkTreeIter *iter )
gint wxDataViewCtrlInternal::iter_n_children( GtkTreeIter *iter ) gint wxDataViewCtrlInternal::iter_n_children( GtkTreeIter *iter )
{ {
if (m_wx_model->IsIndexListModel()) if (m_wx_model->IsVirtualListModel())
{ {
wxDataViewIndexListModel *wx_model = (wxDataViewIndexListModel*) m_wx_model; wxDataViewIndexListModel *wx_model = (wxDataViewIndexListModel*) m_wx_model;
@@ -3140,7 +3140,7 @@ gint wxDataViewCtrlInternal::iter_n_children( GtkTreeIter *iter )
gboolean wxDataViewCtrlInternal::iter_nth_child( GtkTreeIter *iter, GtkTreeIter *parent, gint n ) gboolean wxDataViewCtrlInternal::iter_nth_child( GtkTreeIter *iter, GtkTreeIter *parent, gint n )
{ {
if (m_wx_model->IsIndexListModel()) if (m_wx_model->IsVirtualListModel())
{ {
wxDataViewIndexListModel *wx_model = (wxDataViewIndexListModel*) m_wx_model; wxDataViewIndexListModel *wx_model = (wxDataViewIndexListModel*) m_wx_model;
@@ -3181,7 +3181,7 @@ gboolean wxDataViewCtrlInternal::iter_nth_child( GtkTreeIter *iter, GtkTreeIter
gboolean wxDataViewCtrlInternal::iter_parent( GtkTreeIter *iter, GtkTreeIter *child ) gboolean wxDataViewCtrlInternal::iter_parent( GtkTreeIter *iter, GtkTreeIter *child )
{ {
if (m_wx_model->IsIndexListModel()) if (m_wx_model->IsVirtualListModel())
{ {
return FALSE; return FALSE;
} }