Add ellipsizeMode parameter to wxRenderNative::DrawItemText()

Instead of the default end ellipsize mode used in the native and generic
implementation, allow specifying the mode with an additional parameter.

Closes https://github.com/wxWidgets/wxWidgets/pull/97
This commit is contained in:
Tobias Taschner
2015-09-20 16:59:37 +02:00
committed by Vadim Zeitlin
parent 60a3d76045
commit 44bcc3a723
5 changed files with 48 additions and 28 deletions

View File

@@ -346,7 +346,8 @@ public:
const wxString& text, const wxString& text,
const wxRect& rect, const wxRect& rect,
int align = wxALIGN_LEFT | wxALIGN_TOP, int align = wxALIGN_LEFT | wxALIGN_TOP,
int flags = 0) = 0; int flags = 0,
wxEllipsizeMode ellipsizeMode = wxELLIPSIZE_END) = 0;
// geometry functions // geometry functions
// ------------------ // ------------------
@@ -548,8 +549,9 @@ public:
const wxString& text, const wxString& text,
const wxRect& rect, const wxRect& rect,
int align = wxALIGN_LEFT | wxALIGN_TOP, int align = wxALIGN_LEFT | wxALIGN_TOP,
int flags = 0) int flags = 0,
{ m_rendererNative.DrawItemText(win, dc, text, rect, align, flags); } wxEllipsizeMode ellipsizeMode = wxELLIPSIZE_END)
{ m_rendererNative.DrawItemText(win, dc, text, rect, align, flags, ellipsizeMode); }
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win) virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win)
{ return m_rendererNative.GetSplitterParams(win); } { return m_rendererNative.GetSplitterParams(win); }

View File

@@ -430,7 +430,8 @@ public:
const wxString& text, const wxString& text,
const wxRect& rect, const wxRect& rect,
int align = wxALIGN_LEFT | wxALIGN_TOP, int align = wxALIGN_LEFT | wxALIGN_TOP,
int flags = 0) = 0; int flags = 0,
wxEllipsizeMode ellipsizeMode = wxELLIPSIZE_END) = 0;
/** /**
Draw a blank push button that looks very similar to wxButton. Draw a blank push button that looks very similar to wxButton.

View File

@@ -981,20 +981,6 @@ wxDataViewCustomRendererBase::RenderText(const wxString& text,
rectText.x += xoffset; rectText.x += xoffset;
rectText.width -= xoffset; rectText.width -= xoffset;
// check if we want to ellipsize the text if it doesn't fit
wxString ellipsizedText;
if ( GetEllipsizeMode() != wxELLIPSIZE_NONE )
{
ellipsizedText = wxControl::Ellipsize
(
text,
*dc,
GetEllipsizeMode(),
rectText.width,
wxELLIPSIZE_FLAGS_NONE
);
}
int flags = 0; int flags = 0;
if ( state & wxDATAVIEW_CELL_SELECTED ) if ( state & wxDATAVIEW_CELL_SELECTED )
flags |= wxCONTROL_SELECTED | wxCONTROL_FOCUSED; flags |= wxCONTROL_SELECTED | wxCONTROL_FOCUSED;
@@ -1005,10 +991,11 @@ wxDataViewCustomRendererBase::RenderText(const wxString& text,
wxRendererNative::Get().DrawItemText( wxRendererNative::Get().DrawItemText(
GetOwner()->GetOwner(), GetOwner()->GetOwner(),
*dc, *dc,
ellipsizedText.empty() ? text : ellipsizedText, text,
rectText, rectText,
GetEffectiveAlignment(), GetEffectiveAlignment(),
flags); flags,
GetEllipsizeMode());
} }
void wxDataViewCustomRendererBase::SetEnabled(bool enabled) void wxDataViewCustomRendererBase::SetEnabled(bool enabled)

View File

@@ -150,7 +150,8 @@ public:
const wxString& text, const wxString& text,
const wxRect& rect, const wxRect& rect,
int align = wxALIGN_LEFT | wxALIGN_TOP, int align = wxALIGN_LEFT | wxALIGN_TOP,
int flags = 0) wxOVERRIDE; int flags = 0,
wxEllipsizeMode ellipsizeMode = wxELLIPSIZE_END) wxOVERRIDE;
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win) wxOVERRIDE; virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win) wxOVERRIDE;
@@ -888,7 +889,8 @@ wxRendererGeneric::DrawItemText(wxWindow* win,
const wxString& text, const wxString& text,
const wxRect& rect, const wxRect& rect,
int align, int align,
int flags) int flags,
wxEllipsizeMode ellipsizeMode)
{ {
// Determine text color // Determine text color
wxColour textColour; wxColour textColour;
@@ -913,7 +915,7 @@ wxRendererGeneric::DrawItemText(wxWindow* win,
} }
const wxString paintText = wxControl::Ellipsize(text, dc, const wxString paintText = wxControl::Ellipsize(text, dc,
wxELLIPSIZE_END, ellipsizeMode,
rect.GetWidth()); rect.GetWidth());
// Draw text // Draw text

View File

@@ -26,6 +26,7 @@
#ifndef WX_PRECOMP #ifndef WX_PRECOMP
#include "wx/string.h" #include "wx/string.h"
#include "wx/window.h" #include "wx/window.h"
#include "wx/control.h" // for wxControl::Ellipsize()
#include "wx/dc.h" #include "wx/dc.h"
#include "wx/settings.h" #include "wx/settings.h"
#endif //WX_PRECOMP #endif //WX_PRECOMP
@@ -338,7 +339,8 @@ public:
const wxString& text, const wxString& text,
const wxRect& rect, const wxRect& rect,
int align = wxALIGN_LEFT | wxALIGN_TOP, int align = wxALIGN_LEFT | wxALIGN_TOP,
int flags = 0); int flags = 0,
wxEllipsizeMode ellipsizeMode = wxELLIPSIZE_END);
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win); virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win);
@@ -970,7 +972,8 @@ void wxRendererXP::DrawItemText(wxWindow* win,
const wxString& text, const wxString& text,
const wxRect& rect, const wxRect& rect,
int align, int align,
int flags) int flags,
wxEllipsizeMode ellipsizeMode)
{ {
wxUxThemeHandle hTheme(win, L"LISTVIEW"); wxUxThemeHandle hTheme(win, L"LISTVIEW");
@@ -999,7 +1002,7 @@ void wxRendererXP::DrawItemText(wxWindow* win,
textOpts.crText = wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT).GetPixel(); textOpts.crText = wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT).GetPixel();
} }
DWORD textFlags = DT_NOPREFIX | DT_END_ELLIPSIS; DWORD textFlags = DT_NOPREFIX;
if ( align & wxALIGN_CENTER_HORIZONTAL ) if ( align & wxALIGN_CENTER_HORIZONTAL )
textFlags |= DT_CENTER; textFlags |= DT_CENTER;
else if ( align & wxALIGN_RIGHT ) else if ( align & wxALIGN_RIGHT )
@@ -1014,12 +1017,37 @@ void wxRendererXP::DrawItemText(wxWindow* win,
else else
textFlags |= DT_TOP; textFlags |= DT_TOP;
const wxString* drawText = &text;
wxString ellipsizedText;
switch ( ellipsizeMode )
{
case wxELLIPSIZE_NONE:
// no flag required
break;
case wxELLIPSIZE_START:
case wxELLIPSIZE_MIDDLE:
// no native support for this ellipsize modes, use wxWidgets
// implementation (may not be 100% accurate because per
// definition the theme defines the font but should be close
// enough with current windows themes)
drawText = &ellipsizedText;
ellipsizedText = wxControl::Ellipsize(text, dc, ellipsizeMode,
rect.width,
wxELLIPSIZE_FLAGS_NONE);
break;
case wxELLIPSIZE_END:
textFlags |= DT_END_ELLIPSIS;
break;
}
te->DrawThemeTextEx(hTheme, dc.GetHDC(), LVP_LISTITEM, itemState, te->DrawThemeTextEx(hTheme, dc.GetHDC(), LVP_LISTITEM, itemState,
text.wchar_str(), -1, textFlags, &rc, &textOpts); drawText->wchar_str(), -1, textFlags, &rc, &textOpts);
} }
else else
{ {
m_rendererNative.DrawItemText(win, dc, text, rect, align, flags); m_rendererNative.DrawItemText(win, dc, text, rect, align, flags, ellipsizeMode);
} }
} }