X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/32cd189dfcfe96c41e32c3b9827bf67484c60b13..8064223b7b1b3657363b7a635c381b9269d95e55:/src/mac/carbon/stattext.cpp diff --git a/src/mac/carbon/stattext.cpp b/src/mac/carbon/stattext.cpp index 0898022392..d2f9fd1cea 100644 --- a/src/mac/carbon/stattext.cpp +++ b/src/mac/carbon/stattext.cpp @@ -43,24 +43,21 @@ bool wxStaticText::Create( wxWindow *parent, { m_macIsUserPane = false; - m_label = GetLabelText( label ); - if ( !wxControl::Create( parent, id, pos, size, style, wxDefaultValidator, name ) ) return false; Rect bounds = wxMacGetBoundsForControl( this, pos, size ); - wxMacCFStringHolder str( m_label, m_font.GetEncoding() ); m_peer = new wxMacControl( this ); OSStatus err = CreateStaticTextControl( MAC_WXHWND(parent->MacGetTopLevelWindowRef()), - &bounds, str, NULL, m_peer->GetControlRefAddr() ); + &bounds, NULL, NULL, m_peer->GetControlRefAddr() ); verify_noerr( err ); - if ( ( style & wxST_DOTS_END ) || ( style & wxST_DOTS_MIDDLE ) ) + if ( ( style & wxST_ELLIPSIZE_END ) || ( style & wxST_ELLIPSIZE_MIDDLE ) ) { TruncCode tCode = truncEnd; - if ( style & wxST_DOTS_MIDDLE ) + if ( style & wxST_ELLIPSIZE_MIDDLE ) tCode = truncMiddle; err = m_peer->SetData( kControlStaticTextTruncTag, tCode ); @@ -69,58 +66,84 @@ bool wxStaticText::Create( wxWindow *parent, MacPostControlCreate( pos, size ); + SetLabel(label); + return true; } wxSize wxStaticText::DoGetBestSize() const { - ControlFontStyleRec controlFont; - OSStatus err = m_peer->GetData( kControlEntireControl, kControlFontStyleTag, &controlFont ); - verify_noerr( err ); - + Rect bestsize = { 0 , 0 , 0 , 0 } ; Point bounds; - SInt16 baseline; - wxMacCFStringHolder str( m_label, m_font.GetEncoding() ); - - if ( m_font.MacGetThemeFontID() != kThemeCurrentPortFont ) + + // try the built-in best size if available + Boolean former = m_peer->GetData( kControlStaticTextIsMultilineTag); + m_peer->SetData( kControlStaticTextIsMultilineTag, (Boolean)0 ); + m_peer->GetBestRect( &bestsize ) ; + m_peer->SetData( kControlStaticTextIsMultilineTag, former ); + if ( !EmptyRect( &bestsize ) ) { - err = GetThemeTextDimensions( - (!m_label.empty() ? (CFStringRef)str : CFSTR(" ")), - m_font.MacGetThemeFontID(), kThemeStateActive, false, &bounds, &baseline ); - verify_noerr( err ); + bounds.h = bestsize.right - bestsize.left ; + bounds.v = bestsize.bottom - bestsize.top ; } else { - wxMacWindowStateSaver sv( this ); - ::TextFont( m_font.MacGetFontNum() ); - ::TextSize( (short)(m_font.MacGetFontSize()) ); - ::TextFace( m_font.MacGetFontStyle() ); - - err = GetThemeTextDimensions( - (!m_label.empty() ? (CFStringRef)str : CFSTR(" ")), - kThemeCurrentPortFont, kThemeStateActive, false, &bounds, &baseline ); + ControlFontStyleRec controlFont; + OSStatus err = m_peer->GetData( kControlEntireControl, kControlFontStyleTag, &controlFont ); verify_noerr( err ); - } - if ( m_label.empty() ) - bounds.h = 0; + wxCFStringRef str( m_label, GetFont().GetEncoding() ); +#if wxMAC_USE_ATSU_TEXT + SInt16 baseline; + if ( m_font.MacGetThemeFontID() != kThemeCurrentPortFont ) + { + err = GetThemeTextDimensions( + (!m_label.empty() ? (CFStringRef)str : CFSTR(" ")), + m_font.MacGetThemeFontID(), kThemeStateActive, false, &bounds, &baseline ); + verify_noerr( err ); + } + else +#endif + { + wxClientDC dc(const_cast(this)); + wxCoord width, height ; + dc.GetTextExtent( m_label , &width, &height); + bounds.h = width; + bounds.v = height; + } + + if ( m_label.empty() ) + bounds.h = 0; + } bounds.h += MacGetLeftBorderSize() + MacGetRightBorderSize(); bounds.v += MacGetTopBorderSize() + MacGetBottomBorderSize(); return wxSize( bounds.h, bounds.v ); } -void wxStaticText::SetLabel( const wxString& st ) +void wxStaticText::SetLabel(const wxString& label) { - m_label = GetLabelText( st ); + m_labelOrig = label; - wxMacCFStringHolder str( m_label, m_font.GetEncoding() ); - CFStringRef ref = str; - OSStatus err = m_peer->SetData(kControlEntireControl, kControlStaticTextCFStringTag, ref ); - verify_noerr( err ); + // middle/end ellipsization is handled by the OS: + if ( HasFlag(wxST_ELLIPSIZE_END) || HasFlag(wxST_ELLIPSIZE_MIDDLE) ) + { + // remove markup + wxString str(label); + if (HasFlag(wxST_MARKUP)) + str = RemoveMarkup(label); - if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) ) + // and leave ellipsization to the OS + DoSetLabel(str); + } + else // not supported natively + { + DoSetLabel(GetEllipsizedLabelWithoutMarkup()); + } + + if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) && + !IsEllipsized() ) // don't resize if we adjust to current size { InvalidateBestSize(); SetSize( GetBestSize() ); @@ -148,4 +171,27 @@ bool wxStaticText::SetFont(const wxFont& font) return ret; } + +// for wxST_ELLIPSIZE_* support: + +void wxStaticText::DoSetLabel(const wxString& label) +{ + m_labelOrig = label; + m_label = RemoveMnemonics(label); + + wxCFStringRef str( m_label, GetFont().GetEncoding() ); + OSStatus err = m_peer->SetData(kControlEntireControl, kControlStaticTextCFStringTag, str); + verify_noerr( err ); +} + +wxString wxStaticText::DoGetLabel() const +{ + return m_label; +} + +/* + FIXME: UpdateLabel() should be called on size events when wxST_ELLIPSIZE_START is set + to allow correct dynamic ellipsizing of the label +*/ + #endif //if wxUSE_STATTEXT