// Purpose: wxDataViewCtrl generic implementation
// Author: Robert Roebling
// Modified by: Francesco Montorsi, Guru Kathiresan, Bo Yang
-// Id: $Id$
// Copyright: (c) 1998 Robert Roebling
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
bool wxDataViewBitmapRenderer::Render( wxRect cell, wxDC *dc, int WXUNUSED(state) )
{
if (m_bitmap.IsOk())
- dc->DrawBitmap( m_bitmap, cell.x, cell.y );
+ dc->DrawBitmap( m_bitmap, cell.x, cell.y, true /* use mask */ );
else if (m_icon.IsOk())
dc->DrawIcon( m_icon, cell.x, cell.y );
return true;
}
-bool wxDataViewToggleRenderer::WXActivateCell(const wxRect& cellRect,
+bool wxDataViewToggleRenderer::WXActivateCell(const wxRect& WXUNUSED(cellRect),
wxDataViewModel *model,
const wxDataViewItem& item,
unsigned int col,
{
// Only react to clicks directly on the checkbox, not elsewhere in the
// same cell.
- //
- // We suppose that the checkbox is centred in the total cell rectangle
- // as this is how it's rendered, at least under MSW. If this turns out
- // to be a wrong assumption, we probably would need to do the hit test
- // checking in wxRendererNative but for now this simple solution works.
- wxRect checkRect = wxRect(GetSize()).CentreIn(cellRect);
-
- // After centering in cellRect, we need to pull it back to (0, 0) as
- // the mouse coordinates passed to us are relative to cellRect already.
- checkRect.Offset(-cellRect.GetPosition());
-
- if ( !checkRect.Contains(mouseEvent->GetPosition()) )
+ if ( !wxRect(GetSize()).Contains(mouseEvent->GetPosition()) )
return false;
}
return;
}
+#if wxUSE_DRAG_AND_DROP
+ if (event.Dragging() || ((m_dragCount > 0) && event.Leaving()))
+ {
+ if (m_dragCount == 0)
+ {
+ // we have to report the raw, physical coords as we want to be
+ // able to call HitTest(event.m_pointDrag) from the user code to
+ // get the item being dragged
+ m_dragStart = event.GetPosition();
+ }
+
+ m_dragCount++;
+ if ((m_dragCount < 3) && (event.Leaving()))
+ m_dragCount = 3;
+ else if (m_dragCount != 3)
+ return;
+
+ if (event.LeftIsDown())
+ {
+ m_owner->CalcUnscrolledPosition( m_dragStart.x, m_dragStart.y,
+ &m_dragStart.x, &m_dragStart.y );
+ unsigned int drag_item_row = GetLineAt( m_dragStart.y );
+ wxDataViewItem itemDragged = GetItemByRow( drag_item_row );
+
+ // Notify cell about drag
+ wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_BEGIN_DRAG, m_owner->GetId() );
+ event.SetEventObject( m_owner );
+ event.SetItem( itemDragged );
+ event.SetModel( model );
+ if (!m_owner->HandleWindowEvent( event ))
+ return;
+
+ if (!event.IsAllowed())
+ return;
+
+ wxDataObject *obj = event.GetDataObject();
+ if (!obj)
+ return;
+
+ wxDataViewDropSource drag( this, drag_item_row );
+ drag.SetData( *obj );
+ /* wxDragResult res = */ drag.DoDragDrop(event.GetDragFlags());
+ delete obj;
+ }
+ return;
+ }
+ else
+ {
+ m_dragCount = 0;
+ }
+#endif // wxUSE_DRAG_AND_DROP
+
// Check if we clicked outside the item area.
if ((current >= GetRowCount()) || !col)
{
}
}
-#if wxUSE_DRAG_AND_DROP
- if (event.Dragging())
- {
- if (m_dragCount == 0)
- {
- // we have to report the raw, physical coords as we want to be
- // able to call HitTest(event.m_pointDrag) from the user code to
- // get the item being dragged
- m_dragStart = event.GetPosition();
- }
-
- m_dragCount++;
-
- if (m_dragCount != 3)
- return;
-
- if (event.LeftIsDown())
- {
- m_owner->CalcUnscrolledPosition( m_dragStart.x, m_dragStart.y,
- &m_dragStart.x, &m_dragStart.y );
- unsigned int drag_item_row = GetLineAt( m_dragStart.y );
- wxDataViewItem itemDragged = GetItemByRow( drag_item_row );
-
- // Notify cell about drag
- wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_BEGIN_DRAG, m_owner->GetId() );
- event.SetEventObject( m_owner );
- event.SetItem( itemDragged );
- event.SetModel( model );
- if (!m_owner->HandleWindowEvent( event ))
- return;
-
- if (!event.IsAllowed())
- return;
-
- wxDataObject *obj = event.GetDataObject();
- if (!obj)
- return;
-
- wxDataViewDropSource drag( this, drag_item_row );
- drag.SetData( *obj );
- /* wxDragResult res = */ drag.DoDragDrop(event.GetDragFlags());
- delete obj;
- }
- return;
- }
- else
- {
- m_dragCount = 0;
- }
-#endif // wxUSE_DRAG_AND_DROP
-
bool simulateClick = false;
if (event.ButtonDClick())
GetLineHeight( current ) );
// Report position relative to the cell's custom area, i.e.
- // no the entire space as given by the control but the one
+ // not the entire space as given by the control but the one
// used by the renderer after calculation of alignment etc.
+ //
+ // Notice that this results in negative coordinates when clicking
+ // in the upper left corner of a centre-aligned cell which doesn't
+ // fill its column entirely so this is somewhat surprising, but we
+ // do it like this for compatibility with the native GTK+ version,
+ // see #12270.
// adjust the rectangle ourselves to account for the alignment
+ int align = cell->GetAlignment();
+ if ( align == wxDVR_DEFAULT_ALIGNMENT )
+ align = wxALIGN_CENTRE;
+
wxRect rectItem = cell_rect;
- const int align = cell->GetAlignment();
- if ( align != wxDVR_DEFAULT_ALIGNMENT )
+ const wxSize size = cell->GetSize();
+ if ( size.x >= 0 && size.x < cell_rect.width )
{
- const wxSize size = cell->GetSize();
-
- if ( size.x >= 0 && size.x < cell_rect.width )
- {
- if ( align & wxALIGN_CENTER_HORIZONTAL )
- rectItem.x += (cell_rect.width - size.x)/2;
- else if ( align & wxALIGN_RIGHT )
- rectItem.x += cell_rect.width - size.x;
- // else: wxALIGN_LEFT is the default
- }
+ if ( align & wxALIGN_CENTER_HORIZONTAL )
+ rectItem.x += (cell_rect.width - size.x)/2;
+ else if ( align & wxALIGN_RIGHT )
+ rectItem.x += cell_rect.width - size.x;
+ // else: wxALIGN_LEFT is the default
+ }
- if ( size.y >= 0 && size.y < cell_rect.height )
- {
- if ( align & wxALIGN_CENTER_VERTICAL )
- rectItem.y += (cell_rect.height - size.y)/2;
- else if ( align & wxALIGN_BOTTOM )
- rectItem.y += cell_rect.height - size.y;
- // else: wxALIGN_TOP is the default
- }
+ if ( size.y >= 0 && size.y < cell_rect.height )
+ {
+ if ( align & wxALIGN_CENTER_VERTICAL )
+ rectItem.y += (cell_rect.height - size.y)/2;
+ else if ( align & wxALIGN_BOTTOM )
+ rectItem.y += cell_rect.height - size.y;
+ // else: wxALIGN_TOP is the default
}
wxMouseEvent event2(event);