-class RowToItemJob: public DoJob
-{
-public:
- RowToItemJob( unsigned int row , int current )
- { this->row = row; this->current = current; }
- virtual ~RowToItemJob() {}
-
- virtual int operator() ( wxDataViewTreeNode * node )
- {
- current ++;
- if( current == static_cast<int>(row))
- {
- ret = node->GetItem();
- return DoJob::OK;
- }
-
- if( node->GetSubTreeCount() + current < static_cast<int>(row) )
- {
- current += node->GetSubTreeCount();
- return DoJob::IGR;
- }
- else
- {
- // If the current has no child node, we can find the desired item of the row
- // number directly.
- // This if can speed up finding in some case, and will has a very good effect
- // when it comes to list view
- if( node->GetNodes().GetCount() == 0)
- {
- int index = static_cast<int>(row) - current - 1;
- ret = wxDataViewItem(node->GetChildren().Item( index ));
- return DoJob::OK;
- }
- return DoJob::CONT;
- }
- }
-
- virtual int operator() ( void * n )
- {
- current ++;
- if( current == static_cast<int>(row))
- {
- ret = wxDataViewItem( n );
- return DoJob::OK;
- }
- return DoJob::CONT;
- }
-
- wxDataViewItem GetResult() const
- { return ret; }
-
-private:
- unsigned int row;
- int current;
- wxDataViewItem ret;
-};
-
-wxDataViewItem wxDataViewMainWindow::GetItemByRow(unsigned int row) const
-{
- if (IsVirtualList())
- {
- return wxDataViewItem( wxUIntToPtr(row+1) );
- }
- else
- {
- RowToItemJob job( row, -2 );
- Walker( m_root , job );
- return job.GetResult();
- }
-}