Support ellipsizing of markup text in wxDVC

Fix wxDataViewTextRenderer to at least partially respect ellipsize mode
when using markup text. Generic implementation only supports
wxELLIPSIZE_END and wxELLIPSIZE_NONE at the moment, but the wxOSX and
wxGTK ones have full support.
This commit is contained in:
Václav Slavík
2016-10-19 16:52:23 +02:00
committed by Václav Slavík
parent 92a1f643ba
commit 58fc33d7c2
4 changed files with 31 additions and 9 deletions

View File

@@ -11,9 +11,9 @@
#define _WX_GENERIC_PRIVATE_MARKUPTEXT_H_ #define _WX_GENERIC_PRIVATE_MARKUPTEXT_H_
#include "wx/defs.h" #include "wx/defs.h"
#include "wx/gdicmn.h"
class WXDLLIMPEXP_FWD_CORE wxDC; class WXDLLIMPEXP_FWD_CORE wxDC;
class WXDLLIMPEXP_FWD_CORE wxRect;
class wxMarkupParserOutput; class wxMarkupParserOutput;
@@ -84,10 +84,14 @@ public:
// The meaning of the flags here is different than in the overload above: // The meaning of the flags here is different than in the overload above:
// they're passed to DrawItemText() and Render_ShowAccels is not supported // they're passed to DrawItemText() and Render_ShowAccels is not supported
// here. // here.
//
// Currently the only supported ellipsize modes are wxELLIPSIZE_NONE and
// wxELLIPSIZE_END, the others are treated as wxELLIPSIZE_END.
void RenderItemText(wxWindow *win, void RenderItemText(wxWindow *win,
wxDC& dc, wxDC& dc,
const wxRect& rect, const wxRect& rect,
int rendererFlags); int rendererFlags,
wxEllipsizeMode ellipsizeMode);
private: private:
wxString m_markup; wxString m_markup;

View File

@@ -1095,7 +1095,7 @@ bool wxDataViewTextRenderer::Render(wxRect rect, wxDC *dc, int state)
int flags = 0; int flags = 0;
if ( state & wxDATAVIEW_CELL_SELECTED ) if ( state & wxDATAVIEW_CELL_SELECTED )
flags |= wxCONTROL_SELECTED; flags |= wxCONTROL_SELECTED;
m_markupText->RenderItemText(GetView(), *dc, rect, flags); m_markupText->RenderItemText(GetView(), *dc, rect, flags, GetEllipsizeMode());
} }
else else
#endif // wxUSE_MARKUP #endif // wxUSE_MARKUP

View File

@@ -237,18 +237,22 @@ public:
wxMarkupParserRenderItemOutput(wxWindow *win, wxMarkupParserRenderItemOutput(wxWindow *win,
wxDC& dc, wxDC& dc,
const wxRect& rect, const wxRect& rect,
int rendererFlags) int rendererFlags,
wxEllipsizeMode ellipsizeMode)
: wxMarkupParserRenderOutput(dc, rect, wxMarkupText::Render_Default), : wxMarkupParserRenderOutput(dc, rect, wxMarkupText::Render_Default),
m_win(win), m_win(win),
m_rendererFlags(rendererFlags), m_rendererFlags(rendererFlags),
m_renderer(&wxRendererNative::Get()) m_renderer(&wxRendererNative::Get())
{ {
// TODO: Support all ellipsizing modes
m_ellipsizeMode = ellipsizeMode == wxELLIPSIZE_NONE ? wxELLIPSIZE_NONE : wxELLIPSIZE_END;
} }
virtual void OnText(const wxString& text) wxOVERRIDE virtual void OnText(const wxString& text) wxOVERRIDE
{ {
wxRect rect(m_rect); wxRect rect(m_rect);
rect.x = m_pos; rect.x = m_pos;
rect.SetRight(m_rect.GetRight());
m_renderer->DrawItemText(m_win, m_renderer->DrawItemText(m_win,
m_dc, m_dc,
@@ -256,7 +260,7 @@ public:
rect, rect,
wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL, wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL,
m_rendererFlags, m_rendererFlags,
wxELLIPSIZE_NONE); m_ellipsizeMode);
m_pos += m_dc.GetTextExtent(text).x; m_pos += m_dc.GetTextExtent(text).x;
} }
@@ -264,6 +268,7 @@ public:
private: private:
wxWindow* const m_win; wxWindow* const m_win;
int const m_rendererFlags; int const m_rendererFlags;
wxEllipsizeMode m_ellipsizeMode;
wxRendererNative* const m_renderer; wxRendererNative* const m_renderer;
wxDECLARE_NO_COPY_CLASS(wxMarkupParserRenderItemOutput); wxDECLARE_NO_COPY_CLASS(wxMarkupParserRenderItemOutput);
@@ -310,9 +315,10 @@ void wxMarkupText::Render(wxDC& dc, const wxRect& rect, int flags)
void wxMarkupText::RenderItemText(wxWindow *win, void wxMarkupText::RenderItemText(wxWindow *win,
wxDC& dc, wxDC& dc,
const wxRect& rect, const wxRect& rect,
int rendererFlags) int rendererFlags,
wxEllipsizeMode ellipsizeMode)
{ {
wxMarkupParserRenderItemOutput out(win, dc, rect, rendererFlags); wxMarkupParserRenderItemOutput out(win, dc, rect, rendererFlags, ellipsizeMode);
wxMarkupParser parser(out); wxMarkupParser parser(out);
parser.Parse(m_markup); parser.Parse(m_markup);
} }

View File

@@ -2825,17 +2825,29 @@ void wxDataViewTextRenderer::EnableMarkup(bool enable)
bool wxDataViewTextRenderer::MacRender() bool wxDataViewTextRenderer::MacRender()
{ {
NSCell *cell = GetNativeData()->GetItemCell();
#if wxUSE_MARKUP #if wxUSE_MARKUP
if ( m_useMarkup ) if ( m_useMarkup )
{ {
wxMarkupToAttrString toAttr(GetView(), GetValue().GetString()); wxMarkupToAttrString toAttr(GetView(), GetValue().GetString());
NSMutableAttributedString *str = toAttr.GetNSAttributedString();
[GetNativeData()->GetItemCell() setAttributedStringValue:toAttr.GetNSAttributedString()]; if ( [cell lineBreakMode] != NSLineBreakByClipping )
{
NSMutableParagraphStyle *par = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
[par setLineBreakMode:[cell lineBreakMode]];
[str addAttribute:NSParagraphStyleAttributeName
value:par
range:NSMakeRange(0, [str length])];
[par release];
}
[cell setAttributedStringValue:str];
return true; return true;
} }
#endif // wxUSE_MARKUP #endif // wxUSE_MARKUP
[GetNativeData()->GetItemCell() setObjectValue:wxCFStringRef(GetValue().GetString()).AsNSString()]; [cell setObjectValue:wxCFStringRef(GetValue().GetString()).AsNSString()];
return true; return true;
} }