X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/26e8da413ca453b72d118b6bb139a41921efd187..8b4457965a0c0d0ef828dbf7cca3d2f947083054:/src/generic/listctrl.cpp?ds=sidebyside diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 9e4c6128f3..5a55c70613 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -392,7 +392,12 @@ private: // draw the text on the DC with the correct justification; also add an // ellipsis if the text is too large to fit in the current width - void DrawTextFormatted(wxDC *dc, const wxString &text, int col, int x, int y, int width); + void DrawTextFormatted(wxDC *dc, + const wxString &text, + int col, + int x, + int yMid, // this is middle, not top, of the text + int width); }; WX_DECLARE_EXPORTED_OBJARRAY(wxListLineData, wxListLineDataArray); @@ -1498,7 +1503,7 @@ void wxListLineData::DrawInReportMode( wxDC *dc, dc->DrawRectangle( rectHL ); wxCoord x = rect.x + HEADER_OFFSET_X, - y = rect.y + (LINE_SPACING + EXTRA_HEIGHT) / 2; + yMid = rect.y + rect.height/2; size_t col = 0; for ( wxListItemDataList::compatibility_iterator node = m_items.GetFirst(); @@ -1514,8 +1519,8 @@ void wxListLineData::DrawInReportMode( wxDC *dc, if ( item->HasImage() ) { int ix, iy; - m_owner->DrawImage( item->GetImage(), dc, xOld, y ); m_owner->GetImageSize( item->GetImage(), ix, iy ); + m_owner->DrawImage( item->GetImage(), dc, xOld, yMid - iy/2 ); ix += IMAGE_MARGIN_IN_REPORT_MODE; @@ -1523,10 +1528,8 @@ void wxListLineData::DrawInReportMode( wxDC *dc, width -= ix; } - wxDCClipper clipper(*dc, xOld, y, width - 8, rect.height); - if ( item->HasText() ) - DrawTextFormatted(dc, item->GetText(), col, xOld, y, width - 8); + DrawTextFormatted(dc, item->GetText(), col, xOld, yMid, width - 8); } } @@ -1534,18 +1537,21 @@ void wxListLineData::DrawTextFormatted(wxDC *dc, const wxString &text, int col, int x, - int y, + int yMid, int width) { - wxString drawntext, ellipsis; - wxCoord w, h, base_w; - wxListItem item; + wxCoord w, h; + dc->GetTextExtent(text, &w, &h); + + const wxCoord y = yMid - (h + 1)/2; + + wxDCClipper clipper(*dc, x, y, width, h); // determine if the string can fit inside the current width - dc->GetTextExtent(text, &w, &h); if (w <= width) { // it can, draw it using the items alignment + wxListItem item; m_owner->GetColumn(col, item); switch ( item.GetAlign() ) { @@ -1571,13 +1577,14 @@ void wxListLineData::DrawTextFormatted(wxDC *dc, else // otherwise, truncate and add an ellipsis if possible { // determine the base width - ellipsis = wxString(wxT("...")); + wxString ellipsis(wxT("...")); + wxCoord base_w; dc->GetTextExtent(ellipsis, &base_w, &h); // continue until we have enough space or only one character left wxCoord w_c, h_c; size_t len = text.Length(); - drawntext = text.Left(len); + wxString drawntext = text.Left(len); while (len > 1) { dc->GetTextExtent(drawntext.Last(), &w_c, &h_c); @@ -2035,7 +2042,7 @@ void wxListTextCtrlWrapper::Finish() { m_finished = true; - m_text->PopEventHandler(this); + m_text->RemoveEventHandler(this); m_owner->FinishEditing(m_text); delete this; @@ -2942,7 +2949,8 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) if ( !hitResult ) { - // outside of any item + // outside of any item, reset the selection and bail out + HighlightAll(false); return; } @@ -4927,11 +4935,18 @@ bool wxGenericListCtrl::SetItemState( long item, long state, long stateMask ) bool wxGenericListCtrl::SetItemImage( long item, int image, int WXUNUSED(selImage) ) +{ + return SetItemColumnImage(item, 0, image); +} + +bool +wxGenericListCtrl::SetItemColumnImage( long item, long column, int image ) { wxListItem info; info.m_image = image; info.m_mask = wxLIST_MASK_IMAGE; info.m_itemId = item; + info.m_col = column; m_mainWin->SetItem( info ); return true; }