From 2814e718bae5580c4464e1ef9f426704dd8d33bb Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 27 Feb 2011 12:48:38 +0000 Subject: [PATCH] Add markup support to generic wxStaticText implementation. wxMarkupText allows to easily support markup in the controls that we draw ourselves so use it in wxGenericStaticText to have a possibility to use markup on all platforms, even those where there is no native markup support in wxStaticText itself. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67067 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/stattextg.h | 24 +++++++++++- src/generic/stattextg.cpp | 68 ++++++++++++++++++++++++++++++---- 2 files changed, 83 insertions(+), 9 deletions(-) diff --git a/include/wx/generic/stattextg.h b/include/wx/generic/stattextg.h index 361c3dc007..9df2cd912f 100644 --- a/include/wx/generic/stattextg.h +++ b/include/wx/generic/stattextg.h @@ -22,7 +22,7 @@ class WXDLLIMPEXP_CORE wxGenericStaticText : public wxStaticTextBase { public: - wxGenericStaticText() { } + wxGenericStaticText() { Init(); } wxGenericStaticText(wxWindow *parent, wxWindowID id, @@ -32,6 +32,8 @@ public: long style = 0, const wxString& name = wxStaticTextNameStr) { + Init(); + Create(parent, id, label, pos, size, style, name); } @@ -43,6 +45,8 @@ public: long style = 0, const wxString& name = wxStaticTextNameStr); + virtual ~wxGenericStaticText(); + // overridden base class virtual methods virtual void SetLabel(const wxString& label); @@ -56,12 +60,30 @@ protected: void DoSetSize(int x, int y, int width, int height, int sizeFlags); +#if wxUSE_MARKUP + virtual bool DoSetLabelMarkup(const wxString& markup); +#endif // wxUSE_MARKUP + private: + void Init() + { +#if wxUSE_MARKUP + m_markupText = NULL; +#endif // wxUSE_MARKUP + } + void OnPaint(wxPaintEvent& event); + void DoDrawLabel(wxDC& dc, const wxRect& rect); + + // These fields are only used if m_markupText == NULL. wxString m_label; int m_mnemonic; +#if wxUSE_MARKUP + class wxMarkupText *m_markupText; +#endif // wxUSE_MARKUP + DECLARE_DYNAMIC_CLASS_NO_COPY(wxGenericStaticText) }; diff --git a/src/generic/stattextg.cpp b/src/generic/stattextg.cpp index 8a53e1409f..4d8d120b11 100644 --- a/src/generic/stattextg.cpp +++ b/src/generic/stattextg.cpp @@ -24,6 +24,9 @@ #include "wx/generic/stattextg.h" +#if wxUSE_MARKUP + #include "wx/generic/private/markuptext.h" +#endif // wxUSE_MARKUP IMPLEMENT_DYNAMIC_CLASS(wxGenericStaticText, wxStaticTextBase) @@ -46,12 +49,26 @@ bool wxGenericStaticText::Create(wxWindow *parent, return true; } +wxGenericStaticText::~wxGenericStaticText() +{ +#if wxUSE_MARKUP + delete m_markupText; +#endif // wxUSE_MARKUP +} + +void wxGenericStaticText::DoDrawLabel(wxDC& dc, const wxRect& rect) +{ +#if wxUSE_MARKUP + if ( m_markupText ) + m_markupText->Render(dc, rect, wxMarkupText::Render_ShowAccels); + else +#endif // wxUSE_MARKUP + dc.DrawLabel(m_label, rect, GetAlignment(), m_mnemonic); +} + void wxGenericStaticText::OnPaint(wxPaintEvent& WXUNUSED(event)) { - if ( m_label.empty() ) - return; wxPaintDC dc(this); - PrepareDC(dc); wxRect rect = GetClientRect(); if ( IsEnabled() ) @@ -66,20 +83,24 @@ void wxGenericStaticText::OnPaint(wxPaintEvent& WXUNUSED(event)) wxSystemSettings::GetColour(wxSYS_COLOUR_BTNHIGHLIGHT)); wxRect rectShadow = rect; rectShadow.Offset(1, 1); - dc.DrawLabel(m_label, rectShadow, GetAlignment(), m_mnemonic); + DoDrawLabel(dc, rectShadow); dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW)); } - dc.DrawLabel(m_label, wxNullBitmap, rect, GetAlignment(), m_mnemonic); + DoDrawLabel(dc, rect); } wxSize wxGenericStaticText::DoGetBestClientSize() const { wxClientDC dc(wxConstCast(this, wxGenericStaticText)); - wxCoord width, height; - dc.GetMultiLineTextExtent(GetLabel(), &width, &height); - return wxSize(width, height); + +#if wxUSE_MARKUP + if ( m_markupText ) + return m_markupText->Measure(dc); +#endif // wxUSE_MARKUP + + return dc.GetMultiLineTextExtent(GetLabel()); } void wxGenericStaticText::SetLabel(const wxString& label) @@ -88,6 +109,15 @@ void wxGenericStaticText::SetLabel(const wxString& label) DoSetLabel(GetEllipsizedLabel()); if ( !HasFlag(wxST_NO_AUTORESIZE) && !IsEllipsized() ) InvalidateBestSize(); + +#if wxUSE_MARKUP + if ( m_markupText ) + { + delete m_markupText; + m_markupText = NULL; + } +#endif // wxUSE_MARKUP + Refresh(); } @@ -96,6 +126,28 @@ void wxGenericStaticText::DoSetLabel(const wxString& label) m_mnemonic = FindAccelIndex(label, &m_label); } +#if wxUSE_MARKUP + +bool wxGenericStaticText::DoSetLabelMarkup(const wxString& markup) +{ + if ( !wxStaticTextBase::DoSetLabelMarkup(markup) ) + return false; + + if ( !m_markupText ) + m_markupText = new wxMarkupText(markup); + else + m_markupText->SetMarkup(markup); + + if ( !HasFlag(wxST_NO_AUTORESIZE) ) + InvalidateBestSize(); + + Refresh(); + + return true; +} + +#endif // wxUSE_MARKUP + bool wxGenericStaticText::SetFont(const wxFont &font) { if ( !wxControl::SetFont(font) ) -- 2.45.2