X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4d7e2cdad3ccf26cc5185eb30ef827b1c767e7c4..6cef0db28018fd2644ee4e38af715872e5242459:/src/mac/carbon/stattext.cpp?ds=sidebyside diff --git a/src/mac/carbon/stattext.cpp b/src/mac/carbon/stattext.cpp index be737ac8be..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,6 +66,8 @@ bool wxStaticText::Create( wxWindow *parent, MacPostControlCreate( pos, size ); + SetLabel(label); + return true; } @@ -78,7 +77,10 @@ wxSize wxStaticText::DoGetBestSize() const Point bounds; // 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 ) ) { bounds.h = bestsize.right - bestsize.left ; @@ -90,9 +92,10 @@ wxSize wxStaticText::DoGetBestSize() const OSStatus err = m_peer->GetData( kControlEntireControl, kControlFontStyleTag, &controlFont ); verify_noerr( err ); - SInt16 baseline; - wxMacCFStringHolder str( m_label, m_font.GetEncoding() ); + wxCFStringRef str( m_label, GetFont().GetEncoding() ); +#if wxMAC_USE_ATSU_TEXT + SInt16 baseline; if ( m_font.MacGetThemeFontID() != kThemeCurrentPortFont ) { err = GetThemeTextDimensions( @@ -101,24 +104,13 @@ wxSize wxStaticText::DoGetBestSize() const verify_noerr( err ); } else +#endif { - #if wxMAC_USE_CORE_GRAPHICS wxClientDC dc(const_cast(this)); wxCoord width, height ; dc.GetTextExtent( m_label , &width, &height); bounds.h = width; bounds.v = height; - #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 ); - verify_noerr( err ); - #endif } if ( m_label.empty() ) @@ -130,16 +122,28 @@ wxSize wxStaticText::DoGetBestSize() const 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() ); @@ -167,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