From f93107bcae43f725081b802b47027ed7a44dcd6d Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Wed, 2 Oct 2002 13:54:09 +0000 Subject: [PATCH] Applied patch [ 615769 ] generic wxListCtrl enhancements implemented a couple of things missing from the generic wxListCtrl class which make it more similar to the Windows port 1) implemented wxLIST_FORMAT_RIGHT and wxLIST_FORMAT_CENTER 2) added an ellipsis (...) to the end of the string and shortened the string to fit inside the allowed width 3) left a margin of 8 pixels between columns so that the text is not shoved right together Note this is my first patch to wxWindows. I did read the patch howto and I think I got it right but please feel free to bother me about any discrepancies. In addition, I am not sure if the way I implemented the new routine to handle the formatting is adequate performance wise but it doesn't seem to slow things down too badly on my machine... :-) In addition, if this routine is accepted, it could also be used for the header data as well -- thoughts? Anthony Tuininga git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@17437 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/generic/listctrl.cpp | 62 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 8a939f3371..40cf73afd0 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -421,6 +421,10 @@ private: const wxListItemAttr *attr, bool highlight); + // 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); + // these are only used by GetImage/SetImage above, we don't support images // with subitems at the public API level yet void SetImage( int index, int image ); @@ -1738,15 +1742,69 @@ void wxListLineData::DrawInReportMode( wxDC *dc, width -= ix; } - wxDCClipper clipper(*dc, xOld, y, width, rect.height); + wxDCClipper clipper(*dc, xOld, y, width - 8, rect.height); if ( item->HasText() ) { - dc->DrawText( item->GetText(), xOld, y ); + DrawTextFormatted(dc, item->GetText(), col, xOld, y, width - 8); } } } +void wxListLineData::DrawTextFormatted( wxDC *dc, + const wxString &text, + int col, + int x, + int y, + int width ) +{ + wxString drawntext, ellipsis; + wxCoord w, h, base_w; + wxListItem item; + + // determine if the string can fit inside the current width + dc->GetTextExtent(text, &w, &h); + + // if it can, draw it + if (w <= width) { + m_owner->GetColumn(col, item); + if (item.m_format == wxLIST_FORMAT_LEFT) + dc->DrawText(text, x, y); + else if (item.m_format == wxLIST_FORMAT_RIGHT) + dc->DrawText(text, x + width - w, y); + else if (item.m_format == wxLIST_FORMAT_CENTER) + dc->DrawText(text, x + ((width - w) / 2), y); + + // otherwise, truncate and add an ellipsis if possible + } else { + + // determine the base width + ellipsis = wxString(wxT("...")); + 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) { + dc->GetTextExtent(drawntext, &w, &h); + if (w + base_w <= width) + break; + drawntext = drawntext.Left(drawntext.Length() - 1); + } + + // if still not enough space, remove ellipsis characters + while (ellipsis.Length() > 0 && w + base_w > width) { + ellipsis = ellipsis.Left(ellipsis.Length() - 1); + dc->GetTextExtent(ellipsis, &base_w, &h); + } + + // now draw the text + dc->DrawText(drawntext, x, y); + dc->DrawText(ellipsis, x + w, y); + + } + +} + bool wxListLineData::Highlight( bool on ) { wxCHECK_MSG( !m_owner->IsVirtual(), FALSE, _T("unexpected call to Highlight") );