X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ca7353de3ac75143c8af50e358dc8b680db17d88..55e18dbe2faca047b2008734782d52a6eb140115:/src/generic/listctrl.cpp diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index d1e2359f23..bf85914d4c 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -495,7 +495,9 @@ private: // common part of all ctors void Init(); - void SendListEvent(wxEventType type, wxPoint pos); + // generate and process the list event of the given type, return true if + // it wasn't vetoed, i.e. if we should proceed + bool SendListEvent(wxEventType type, wxPoint pos); DECLARE_DYNAMIC_CLASS(wxListHeaderWindow) DECLARE_EVENT_TABLE() @@ -1806,13 +1808,17 @@ void wxListLineData::DrawTextFormatted(wxDC *dc, dc->GetTextExtent(ellipsis, &base_w, &h); // continue until we have enough space or only one character left - drawntext = text.Left(text.Length() - 1); - while (drawntext.Length() > 1) + wxCoord w_c, h_c; + size_t len = text.Length(); + drawntext = text.Left(len); + while (len > 1) { - dc->GetTextExtent(drawntext, &w, &h); + dc->GetTextExtent(drawntext.Last(), &w_c, &h_c); + drawntext.RemoveLast(); + len--; + w -= w_c; if (w + base_w <= width) break; - drawntext = drawntext.Left(drawntext.Length() - 1); } // if still not enough space, remove ellipsis characters @@ -2130,8 +2136,7 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event ) if (m_isDragging) { - SendListEvent(wxEVT_COMMAND_LIST_COL_DRAGGING, - event.GetPosition()); + SendListEvent(wxEVT_COMMAND_LIST_COL_DRAGGING, event.GetPosition()); // we don't draw the line beyond our window, but we allow dragging it // there @@ -2150,8 +2155,7 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event ) m_isDragging = FALSE; m_dirty = TRUE; m_owner->SetColumnWidth( m_column, m_currentX - m_minX ); - SendListEvent(wxEVT_COMMAND_LIST_COL_END_DRAG, - event.GetPosition()); + SendListEvent(wxEVT_COMMAND_LIST_COL_END_DRAG, event.GetPosition()); } else { @@ -2204,12 +2208,15 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event ) { if (hit_border && event.LeftDown()) { - m_isDragging = TRUE; - m_currentX = x; - DrawCurrent(); - CaptureMouse(); - SendListEvent(wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, - event.GetPosition()); + if ( SendListEvent(wxEVT_COMMAND_LIST_COL_BEGIN_DRAG, + event.GetPosition()) ) + { + m_isDragging = TRUE; + m_currentX = x; + DrawCurrent(); + CaptureMouse(); + } + //else: column resizing was vetoed by the user code } else // click on a column { @@ -2244,7 +2251,7 @@ void wxListHeaderWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) m_owner->SetFocus(); } -void wxListHeaderWindow::SendListEvent(wxEventType type, wxPoint pos) +bool wxListHeaderWindow::SendListEvent(wxEventType type, wxPoint pos) { wxWindow *parent = GetParent(); wxListEvent le( type, parent->GetId() ); @@ -2258,7 +2265,7 @@ void wxListHeaderWindow::SendListEvent(wxEventType type, wxPoint pos) le.m_pointDrag.y -= GetSize().y; le.m_col = m_column; - parent->GetEventHandler()->ProcessEvent( le ); + return !parent->GetEventHandler()->ProcessEvent( le ) || le.IsAllowed(); } //----------------------------------------------------------------------------- @@ -3196,6 +3203,7 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) wxListEvent le( command, GetParent()->GetId() ); le.SetEventObject( GetParent() ); + le.m_itemIndex = current; le.m_pointDrag = m_dragStart; GetParent()->GetEventHandler()->ProcessEvent( le ); @@ -4710,7 +4718,7 @@ bool wxGenericListCtrl::Create(wxWindow *parent, return FALSE; // don't create the inner window with the border - style &= ~wxSUNKEN_BORDER; + style &= ~wxBORDER_MASK; m_mainWin = new wxListMainWindow( this, -1, wxPoint(0,0), size, style ); @@ -4906,6 +4914,8 @@ bool wxGenericListCtrl::SetItemData( long item, long data ) bool wxGenericListCtrl::GetItemRect( long item, wxRect &rect, int WXUNUSED(code) ) const { m_mainWin->GetItemRect( item, rect ); + if ( m_mainWin->HasHeader() ) + rect.y += HEADER_HEIGHT + 1; return TRUE; }