-*/
- SortPrepare();
- g_model->Resort();
-
- //Send event
- wxWindow *parent = GetParent();
- wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED, parent->GetId());
- le.SetEventObject(parent);
- le.SetModel(GetOwner()->GetModel());
- le.SetItem(item);
- le.SetColumn(col);
- le.SetDataViewColumn(GetOwner()->GetColumn(col));
- parent->GetEventHandler()->ProcessEvent(le);
-
- return true;
-}
-
-bool wxDataViewMainWindow::Cleared()
-{
- DestroyTree();
-
- SortPrepare();
- BuildTree( GetOwner()->GetModel() );
-
- UpdateDisplay();
-
- return true;
-}
-
-void wxDataViewMainWindow::UpdateDisplay()
-{
- m_dirty = true;
-}
-
-void wxDataViewMainWindow::OnInternalIdle()
-{
- wxWindow::OnInternalIdle();
-
- if (m_dirty)
- {
- RecalculateDisplay();
- m_dirty = false;
- }
-}
-
-void wxDataViewMainWindow::RecalculateDisplay()
-{
- wxDataViewModel *model = GetOwner()->GetModel();
- if (!model)
- {
- Refresh();
- return;
- }
-
- int width = GetEndOfLastCol();
- int height = GetRowCount() * m_lineHeight;
-
- SetVirtualSize( width, height );
- GetOwner()->SetScrollRate( 10, m_lineHeight );
-
- Refresh();
-}
-
-void wxDataViewMainWindow::ScrollWindow( int dx, int dy, const wxRect *rect )
-{
- wxWindow::ScrollWindow( dx, dy, rect );
-
- if (GetOwner()->m_headerArea)
- GetOwner()->m_headerArea->ScrollWindow( dx, 0 );
-}
-
-void wxDataViewMainWindow::ScrollTo( int rows, int column )
-{
- int x, y;
- m_owner->GetScrollPixelsPerUnit( &x, &y );
- int sy = rows*m_lineHeight/y;
- int sx = 0;
- if( column != -1 )
- {
- wxRect rect = GetClientRect();
- int colnum = 0;
- int x_start = 0, x_end = 0, w = 0;
- int xx, yy, xe;
- m_owner->CalcUnscrolledPosition( rect.x, rect.y, &xx, &yy );
- for (x_start = 0; colnum < column; colnum++)
- {
- wxDataViewColumn *col = GetOwner()->GetColumn(colnum);
- if (col->IsHidden())
- continue; // skip it!
-
- w = col->GetWidth();
- x_start += w;
- }
-
- x_end = x_start + w;
- xe = xx + rect.width;
- if( x_end > xe )
- {
- sx = ( xx + x_end - xe )/x;
- }
- if( x_start < xx )
- {
- sx = x_start/x;
- }
- }
- m_owner->Scroll( sx, sy );
-}
-
-void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
-{
- wxDataViewModel *model = GetOwner()->GetModel();
- wxAutoBufferedPaintDC dc( this );
-
- // prepare the DC
- dc.SetBackground(GetBackgroundColour());
- dc.Clear();
- GetOwner()->PrepareDC( dc );
- dc.SetFont( GetFont() );
-
- wxRect update = GetUpdateRegion().GetBox();
- m_owner->CalcUnscrolledPosition( update.x, update.y, &update.x, &update.y );
-
- // compute which items needs to be redrawn
- unsigned int item_start = wxMax( 0, (update.y / m_lineHeight) );
- unsigned int item_count =
- wxMin( (int)(((update.y + update.height) / m_lineHeight) - item_start + 1),
- (int)(GetRowCount( ) - item_start));
- unsigned int item_last = item_start + item_count;
-
- // compute which columns needs to be redrawn
- unsigned int cols = GetOwner()->GetColumnCount();
- unsigned int col_start = 0;
- unsigned int x_start = 0;
- for (x_start = 0; col_start < cols; col_start++)
- {
- wxDataViewColumn *col = GetOwner()->GetColumn(col_start);
- if (col->IsHidden())
- continue; // skip it!
-
- unsigned int w = col->GetWidth();
- if (x_start+w >= (unsigned int)update.x)
- break;
-
- x_start += w;
- }
-
- unsigned int col_last = col_start;
- unsigned int x_last = x_start;
- for (; col_last < cols; col_last++)
- {
- wxDataViewColumn *col = GetOwner()->GetColumn(col_last);
- if (col->IsHidden())
- continue; // skip it!
-
- 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;