- if (x_last > (unsigned int)update.GetRight())
- break;
-
- x_last += col->GetWidth();
- }
-
- // Draw horizontal rules if required
- if ( m_owner->HasFlag(wxDV_HORIZ_RULES) )
- {
- dc.SetPen(m_penRule);
- dc.SetBrush(*wxTRANSPARENT_BRUSH);
-
- for (unsigned int i = item_start; i <= item_last+1; i++)
- {
- int y = i * m_lineHeight;
- dc.DrawLine(x_start, y, x_last, y);
- }
- }
-
- // Draw vertical rules if required
- if ( m_owner->HasFlag(wxDV_VERT_RULES) )
- {
- dc.SetPen(m_penRule);
- dc.SetBrush(*wxTRANSPARENT_BRUSH);
-
- int x = x_start;
- for (unsigned int i = col_start; i < col_last; i++)
- {
- wxDataViewColumn *col = GetOwner()->GetColumn(i);
- if (col->IsHidden())
- continue; // skip it
-
- dc.DrawLine(x, item_start * m_lineHeight,
- x, item_last * m_lineHeight);
-
- x += col->GetWidth();
- }
-
- // Draw last vertical rule
- dc.DrawLine(x, item_start * m_lineHeight,
- x, item_last * m_lineHeight);
- }
-
- // redraw the background for the items which are selected/current
- for (unsigned int item = item_start; item < item_last; item++)
- {
- bool selected = m_selection.Index( item ) != wxNOT_FOUND;
- if (selected || item == m_currentRow)
- {
- int flags = selected ? (int)wxCONTROL_SELECTED : 0;
- if (item == m_currentRow)
- flags |= wxCONTROL_CURRENT;
- if (m_hasFocus)
- flags |= wxCONTROL_FOCUSED;
-
- wxRect rect( x_start, item*m_lineHeight, x_last, m_lineHeight );
- wxRendererNative::Get().DrawItemSelectionRect
- (
- this,
- dc,
- rect,
- flags
- );
- }
- }
-
- wxDataViewColumn *expander = GetOwner()->GetExpanderColumn();
- if (!expander)
- {
- // TODO: last column for RTL support
- expander = GetOwner()->GetColumn( 0 );
- GetOwner()->SetExpanderColumn(expander);
- }
-
- // redraw all cells for all rows which must be repainted and for all columns
- wxRect cell_rect;
- cell_rect.x = x_start;
- cell_rect.height = m_lineHeight; // -1 is for the horizontal rules
- for (unsigned int i = col_start; i < col_last; i++)
- {
- wxDataViewColumn *col = GetOwner()->GetColumn( i );
- wxDataViewRenderer *cell = col->GetRenderer();
- cell_rect.width = col->GetWidth();
-
- if (col->IsHidden())
- continue; // skipt it!
-
-
- for (unsigned int item = item_start; item < item_last; item++)
- {
- // get the cell value and set it into the renderer
- wxVariant value;
- wxDataViewTreeNode *node = NULL;
- wxDataViewItem dataitem;
-
- if (m_root)
- {
- node = GetTreeNodeByRow(item);
- if( node == NULL )
- continue;
-
- dataitem = node->GetItem();
-
- if ((i > 0) && model->IsContainer(dataitem) && !model->HasContainerColumns(dataitem))
- continue;
- }
- else
- {
- dataitem = wxDataViewItem( (void*) item );
- }
-
- model->GetValue( value, dataitem, col->GetModelColumn());
- cell->SetValue( value );
-
- if (cell->GetWantsAttr())
- {
- wxDataViewItemAttr attr;
- bool ret = model->GetAttr( dataitem, col->GetModelColumn(), attr );
- if (ret)
- cell->SetAttr( attr );
- cell->SetHasAttr( ret );
- }
-
- // update the y offset
- cell_rect.y = item * m_lineHeight;
-
- //Draw the expander here.
- int indent = 0;
- if ((m_root) && (col == expander))
- {
- indent = node->GetIndentLevel();
-
- //Calculate the indent first
- indent = cell_rect.x + GetOwner()->GetIndent() * indent;
-
- int expander_width = m_lineHeight - 2*EXPANDER_MARGIN;
- // change the cell_rect.x to the appropriate pos
- int expander_x = indent + EXPANDER_MARGIN , expander_y = cell_rect.y + EXPANDER_MARGIN ;
- indent = indent + m_lineHeight ; //try to use the m_lineHeight as the expander space
- dc.SetPen( m_penExpander );
- dc.SetBrush( wxNullBrush );
- if( node->HasChildren() )
- {
- wxRect rect( expander_x , expander_y, expander_width, expander_width);
- int flag = 0;
- if (m_underMouse == node)
- {
- flag |= wxCONTROL_CURRENT;
- }
- if( node->IsOpen() )
- wxRendererNative::Get().DrawTreeItemButton( this, dc, rect, flag|wxCONTROL_EXPANDED );
- else
- wxRendererNative::Get().DrawTreeItemButton( this, dc, rect, flag);
- }
- else
- {
- // I am wondering whether we should draw dot lines between tree nodes
- if (node)
- delete node;
- // Yes, if the node does not have any child, it must be a leaf which
- // mean that it is a temporarily created by GetTreeNodeByRow
- }