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

View File

@@ -430,7 +430,8 @@ public:
const wxString& text,
const wxRect& rect,
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.

View File

@@ -981,20 +981,6 @@ wxDataViewCustomRendererBase::RenderText(const wxString& text,
rectText.x += 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;
if ( state & wxDATAVIEW_CELL_SELECTED )
flags |= wxCONTROL_SELECTED | wxCONTROL_FOCUSED;
@@ -1005,10 +991,11 @@ wxDataViewCustomRendererBase::RenderText(const wxString& text,
wxRendererNative::Get().DrawItemText(
GetOwner()->GetOwner(),
*dc,
ellipsizedText.empty() ? text : ellipsizedText,
text,
rectText,
GetEffectiveAlignment(),
flags);
flags,
GetEllipsizeMode());
}
void wxDataViewCustomRendererBase::SetEnabled(bool enabled)

View File

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

View File

@@ -26,6 +26,7 @@
#ifndef WX_PRECOMP
#include "wx/string.h"
#include "wx/window.h"
#include "wx/control.h" // for wxControl::Ellipsize()
#include "wx/dc.h"
#include "wx/settings.h"
#endif //WX_PRECOMP
@@ -338,7 +339,8 @@ public:
const wxString& text,
const wxRect& rect,
int align = wxALIGN_LEFT | wxALIGN_TOP,
int flags = 0);
int flags = 0,
wxEllipsizeMode ellipsizeMode = wxELLIPSIZE_END);
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win);
@@ -970,7 +972,8 @@ void wxRendererXP::DrawItemText(wxWindow* win,
const wxString& text,
const wxRect& rect,
int align,
int flags)
int flags,
wxEllipsizeMode ellipsizeMode)
{
wxUxThemeHandle hTheme(win, L"LISTVIEW");
@@ -999,7 +1002,7 @@ void wxRendererXP::DrawItemText(wxWindow* win,
textOpts.crText = wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT).GetPixel();
}
DWORD textFlags = DT_NOPREFIX | DT_END_ELLIPSIS;
DWORD textFlags = DT_NOPREFIX;
if ( align & wxALIGN_CENTER_HORIZONTAL )
textFlags |= DT_CENTER;
else if ( align & wxALIGN_RIGHT )
@@ -1014,12 +1017,37 @@ void wxRendererXP::DrawItemText(wxWindow* win,
else
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,
text.wchar_str(), -1, textFlags, &rc, &textOpts);
drawText->wchar_str(), -1, textFlags, &rc, &textOpts);
}
else
{
m_rendererNative.DrawItemText(win, dc, text, rect, align, flags);
m_rendererNative.DrawItemText(win, dc, text, rect, align, flags, ellipsizeMode);
}
}