X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d997c6118c9727ab5a6e2f6f0e2be14bab09f8dc..116de9914878c202141f0ea20251a451593a52c9:/src/msw/stattext.cpp diff --git a/src/msw/stattext.cpp b/src/msw/stattext.cpp index 0ea485b4f7..c16b89c12b 100644 --- a/src/msw/stattext.cpp +++ b/src/msw/stattext.cpp @@ -18,6 +18,8 @@ #if wxUSE_STATTEXT +#include "wx/stattext.h" + #ifndef WX_PRECOMP #include "wx/event.h" #include "wx/app.h" @@ -26,7 +28,6 @@ #include "wx/settings.h" #endif -#include "wx/stattext.h" #include "wx/msw/private.h" #if wxUSE_EXTENDED_RTTI @@ -99,11 +100,6 @@ bool wxStaticText::Create(wxWindow *parent, return true; } -wxBorder wxStaticText::GetDefaultBorder() const -{ - return wxBORDER_NONE; -} - WXDWORD wxStaticText::MSWGetStyle(long style, WXDWORD *exstyle) const { WXDWORD msStyle = wxControl::MSWGetStyle(style, exstyle); @@ -119,7 +115,19 @@ WXDWORD wxStaticText::MSWGetStyle(long style, WXDWORD *exstyle) const else msStyle |= SS_LEFT; +#ifdef SS_ENDELLIPSIS // this style is necessary to receive mouse events + // Win NT and later have the SS_ENDELLIPSIS style which is useful to us: + if (wxGetOsVersion() == wxOS_WINDOWS_NT) + { + // for now, add the SS_ENDELLIPSIS style if wxST_ELLIPSIZE_END is given; + // we may need to remove it later in ::SetLabel() if the given label + // has newlines + if ( style & wxST_ELLIPSIZE_END ) + msStyle |= SS_ENDELLIPSIS; + } +#endif // SS_ENDELLIPSIS + msStyle |= SS_NOTIFY; return msStyle; @@ -127,7 +135,7 @@ WXDWORD wxStaticText::MSWGetStyle(long style, WXDWORD *exstyle) const wxSize wxStaticText::DoGetBestSize() const { - wxClientDC dc(wx_const_cast(wxStaticText *, this)); + wxClientDC dc(const_cast(this)); wxFont font(GetFont()); if (!font.Ok()) font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); @@ -135,8 +143,7 @@ wxSize wxStaticText::DoGetBestSize() const dc.SetFont(font); wxCoord widthTextMax, heightTextTotal; - dc.GetMultiLineTextExtent(::wxStripMenuCodes(GetLabel()), - &widthTextMax, &heightTextTotal); + dc.GetMultiLineTextExtent(GetLabelText(), &widthTextMax, &heightTextTotal); #ifdef __WXWINCE__ if ( widthTextMax ) @@ -181,20 +188,66 @@ wxSize wxStaticText::DoGetBestSize() const void wxStaticText::DoSetSize(int x, int y, int w, int h, int sizeFlags) { - // we need to refresh the window after changing its size as the standard - // control doesn't always update itself properly + // note: we first need to set the size and _then_ call UpdateLabel wxStaticTextBase::DoSetSize(x, y, w, h, sizeFlags); +#ifdef SS_ENDELLIPSIS + // do we need to ellipsize the contents? + long styleReal = ::GetWindowLong(GetHwnd(), GWL_STYLE); + if ( !(styleReal & SS_ENDELLIPSIS) ) + { + // we don't have SS_ENDELLIPSIS style: + // we need to (eventually) do ellipsization ourselves + UpdateLabel(); + } + //else: we don't or the OS will do it for us +#endif // SS_ENDELLIPSIS + + // we need to refresh the window after changing its size as the standard + // control doesn't always update itself properly Refresh(); } void wxStaticText::SetLabel(const wxString& label) { - wxStaticTextBase::SetLabel(label); +#ifdef SS_ENDELLIPSIS + long styleReal = ::GetWindowLong(GetHwnd(), GWL_STYLE); + if ( HasFlag(wxST_ELLIPSIZE_END) && + wxGetOsVersion() == wxOS_WINDOWS_NT ) + { + // adding SS_ENDELLIPSIS or SS_ENDELLIPSIS "disables" the correct + // newline handling in static texts: the newlines in the labels are + // shown as square. Thus we don't use it even on newer OS when + // the static label contains a newline. + if ( label.Contains(wxT('\n')) ) + styleReal &= ~SS_ENDELLIPSIS; + else + styleReal |= SS_ENDELLIPSIS; + + ::SetWindowLong(GetHwnd(), GWL_STYLE, styleReal); + } + else // style not supported natively + { + styleReal &= ~SS_ENDELLIPSIS; + ::SetWindowLong(GetHwnd(), GWL_STYLE, styleReal); + } +#endif // SS_ENDELLIPSIS + + // this call will save the label in m_labelOrig and set it into this window + // (through wxWindow::SetLabel) + m_labelOrig = label; + +#ifdef SS_ENDELLIPSIS + if ( styleReal & SS_ENDELLIPSIS ) + DoSetLabel(RemoveMarkup(label)); + else +#endif // SS_ENDELLIPSIS + DoSetLabel(GetEllipsizedLabelWithoutMarkup()); // adjust the size of the window to fit to the label unless autoresizing is // disabled - if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) ) + if ( !HasFlag(wxST_NO_AUTORESIZE) && + !IsEllipsized() ) // if ellipsize is ON, then we don't want to get resized! { InvalidateBestSize(); DoSetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, @@ -202,14 +255,13 @@ void wxStaticText::SetLabel(const wxString& label) } } - bool wxStaticText::SetFont(const wxFont& font) { bool ret = wxControl::SetFont(font); // adjust the size of the window to fit to the label unless autoresizing is // disabled - if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) ) + if ( !HasFlag(wxST_NO_AUTORESIZE) ) { InvalidateBestSize(); DoSetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, @@ -219,4 +271,17 @@ bool wxStaticText::SetFont(const wxFont& font) return ret; } +// for wxST_ELLIPSIZE_* support: + +wxString wxStaticText::DoGetLabel() const +{ + return wxGetWindowText(GetHwnd()); +} + +void wxStaticText::DoSetLabel(const wxString& str) +{ + SetWindowText(GetHwnd(), str.c_str()); +} + + #endif // wxUSE_STATTEXT