+
+#if wxUSE_DRAG_AND_DROP
+bool wxDataViewMainWindow::EnableDragSource( const wxDataFormat &format )
+{
+ m_dragFormat = format;
+ m_dragEnabled = format != wxDF_INVALID;
+
+ return true;
+}
+
+bool wxDataViewMainWindow::EnableDropTarget( const wxDataFormat &format )
+{
+ m_dropFormat = format;
+ m_dropEnabled = format != wxDF_INVALID;
+
+ if (m_dropEnabled)
+ SetDropTarget( new wxDataViewDropTarget( new wxCustomDataObject( format ), this ) );
+
+ return true;
+}
+
+void wxDataViewMainWindow::RemoveDropHint()
+{
+ if (m_dropHint)
+ {
+ m_dropHint = false;
+ RefreshRow( m_dropHintLine );
+ m_dropHintLine = (unsigned int) -1;
+ }
+}
+
+wxDragResult wxDataViewMainWindow::OnDragOver( wxDataFormat format, wxCoord x, wxCoord y, wxDragResult def )
+{
+ int xx = x;
+ int yy = y;
+ m_owner->CalcUnscrolledPosition( xx, yy, &xx, &yy );
+ unsigned int row = GetLineAt( yy );
+
+ if ((row >= GetRowCount()) || (yy > GetEndOfLastCol()))
+ {
+ RemoveDropHint();
+ return wxDragNone;
+ }
+
+ wxDataViewItem item = GetItemByRow( row );
+
+ wxDataViewModel *model = GetOwner()->GetModel();
+
+ wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE, m_owner->GetId() );
+ event.SetEventObject( m_owner );
+ event.SetItem( item );
+ event.SetModel( model );
+ event.SetDataFormat( format );
+ if (!m_owner->HandleWindowEvent( event ))
+ {
+ RemoveDropHint();
+ return wxDragNone;
+ }
+
+ if (!event.IsAllowed())
+ {
+ RemoveDropHint();
+ return wxDragNone;
+ }
+
+
+ if (m_dropHint && (row != m_dropHintLine))
+ RefreshRow( m_dropHintLine );
+ m_dropHint = true;
+ m_dropHintLine = row;
+ RefreshRow( row );
+
+ return def;
+}
+
+bool wxDataViewMainWindow::OnDrop( wxDataFormat format, wxCoord x, wxCoord y )
+{
+ RemoveDropHint();
+
+ int xx = x;
+ int yy = y;
+ m_owner->CalcUnscrolledPosition( xx, yy, &xx, &yy );
+ unsigned int row = GetLineAt( yy );
+
+ if ((row >= GetRowCount()) || (yy > GetEndOfLastCol()))
+ return false;
+
+ wxDataViewItem item = GetItemByRow( row );
+
+ wxDataViewModel *model = GetOwner()->GetModel();
+
+ wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE, m_owner->GetId() );
+ event.SetEventObject( m_owner );
+ event.SetItem( item );
+ event.SetModel( model );
+ event.SetDataFormat( format );
+ if (!m_owner->HandleWindowEvent( event ))
+ return false;
+
+ if (!event.IsAllowed())
+ return false;
+
+ return true;
+}
+
+wxDragResult wxDataViewMainWindow::OnData( wxDataFormat format, wxCoord x, wxCoord y, wxDragResult def )
+{
+ int xx = x;
+ int yy = y;
+ m_owner->CalcUnscrolledPosition( xx, yy, &xx, &yy );
+ unsigned int row = GetLineAt( yy );
+
+ if ((row >= GetRowCount()) || (yy > GetEndOfLastCol()))
+ return wxDragNone;
+
+ wxDataViewItem item = GetItemByRow( row );
+
+ wxDataViewModel *model = GetOwner()->GetModel();
+
+ wxCustomDataObject *obj = (wxCustomDataObject *) GetDropTarget()->GetDataObject();
+
+ wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_DROP, m_owner->GetId() );
+ event.SetEventObject( m_owner );
+ event.SetItem( item );
+ event.SetModel( model );
+ event.SetDataFormat( format );
+ event.SetDataSize( obj->GetSize() );
+ event.SetDataBuffer( obj->GetData() );
+ if (!m_owner->HandleWindowEvent( event ))
+ return wxDragNone;
+
+ if (!event.IsAllowed())
+ return wxDragNone;
+
+ return def;
+}
+
+void wxDataViewMainWindow::OnLeave()
+{
+ RemoveDropHint();
+}
+
+wxBitmap wxDataViewMainWindow::CreateItemBitmap( unsigned int row, int &indent )
+{
+ int height = GetLineHeight( row );
+ int width = 0;
+ unsigned int cols = GetOwner()->GetColumnCount();
+ unsigned int col;
+ for (col = 0; col < cols; col++)
+ {
+ wxDataViewColumn *column = GetOwner()->GetColumnAt(col);
+ if (column->IsHidden())
+ continue; // skip it!
+ width += column->GetWidth();
+ }
+
+ indent = 0;
+ if (!IsVirtualList())
+ {
+ wxDataViewTreeNode *node = GetTreeNodeByRow(row);
+ indent = GetOwner()->GetIndent() * node->GetIndentLevel();
+ indent = indent + m_lineHeight; //try to use the m_lineHeight as the expander space
+
+ if(!node->HasChildren())
+ delete node;
+ }
+ width -= indent;
+
+ wxBitmap bitmap( width, height );
+ wxMemoryDC dc( bitmap );
+ dc.SetFont( GetFont() );
+ dc.SetPen( *wxBLACK_PEN );
+ dc.SetBrush( *wxWHITE_BRUSH );
+ dc.DrawRectangle( 0,0,width,height );
+
+ wxDataViewModel *model = m_owner->GetModel();
+
+ wxDataViewColumn *expander = GetOwner()->GetExpanderColumn();
+ if (!expander)
+ {
+ // TODO-RTL: last column for RTL support
+ expander = GetOwner()->GetColumnAt( 0 );
+ GetOwner()->SetExpanderColumn(expander);
+ }
+
+
+ int x = 0;
+ for (col = 0; col < cols; col++)
+ {
+ wxDataViewColumn *column = GetOwner()->GetColumnAt( col );
+ wxDataViewRenderer *cell = column->GetRenderer();
+
+ if (column->IsHidden())
+ continue; // skip it!
+
+ width = column->GetWidth();
+
+ if (column == expander)
+ width -= indent;
+
+ wxVariant value;
+ wxDataViewItem item = GetItemByRow( row );
+ model->GetValue( value, item, column->GetModelColumn());
+ cell->SetValue( value );
+
+ if (cell->GetWantsAttr())
+ {
+ wxDataViewItemAttr attr;
+ bool ret = model->GetAttr( item, column->GetModelColumn(), attr );
+ if (ret)
+ cell->SetAttr( attr );
+ cell->SetHasAttr( ret );
+ }
+
+ wxSize size = cell->GetSize();
+ size.x = wxMin( 2*PADDING_RIGHTLEFT + size.x, width );
+ size.y = height;
+ wxRect item_rect(x, 0, size.x, size.y);
+
+ int align = cell->CalculateAlignment();
+ // horizontal alignment:
+ item_rect.x = x;
+ if (align & wxALIGN_CENTER_HORIZONTAL)
+ item_rect.x = x + (width / 2) - (size.x / 2);
+ else if (align & wxALIGN_RIGHT)
+ item_rect.x = x + width - size.x;
+ //else: wxALIGN_LEFT is the default
+
+ // vertical alignment:
+ item_rect.y = 0;
+ if (align & wxALIGN_CENTER_VERTICAL)
+ item_rect.y = (height / 2) - (size.y / 2);
+ else if (align & wxALIGN_BOTTOM)
+ item_rect.y = height - size.y;
+ //else: wxALIGN_TOP is the default
+
+ // add padding
+ item_rect.x += PADDING_RIGHTLEFT;
+ item_rect.width = size.x - 2 * PADDING_RIGHTLEFT;
+
+ //dc.SetClippingRegion( item_rect );
+ cell->Render( item_rect, &dc, 0 );
+ //dc.DestroyClippingRegion();
+
+ x += width;
+ }
+
+ return bitmap;
+}
+
+#endif // wxUSE_DRAG_AND_DROP
+
+