X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/670f9935630beb2123a5ca62894ae92a3f0efa4f..409521e45d44fc57df39efcb965701d378edcb20:/src/mac/carbon/stattext.cpp diff --git a/src/mac/carbon/stattext.cpp b/src/mac/carbon/stattext.cpp index b6bb94d019..c0217bb8ae 100644 --- a/src/mac/carbon/stattext.cpp +++ b/src/mac/carbon/stattext.cpp @@ -17,14 +17,14 @@ #ifndef WX_PRECOMP #include "wx/app.h" + #include "wx/utils.h" + #include "wx/dc.h" + #include "wx/dcclient.h" + #include "wx/settings.h" #endif // WX_PRECOMP #include "wx/notebook.h" #include "wx/tabctrl.h" -#include "wx/dc.h" -#include "wx/dcclient.h" -#include "wx/utils.h" -#include "wx/settings.h" #include "wx/mac/uma.h" @@ -43,24 +43,21 @@ bool wxStaticText::Create( wxWindow *parent, { m_macIsUserPane = false; - m_label = wxStripMenuCodes( 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; + SInt16 baseline; + wxMacCFStringHolder str( m_label, m_font.GetEncoding() ); +#ifndef __LP64__ + 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 = wxStripMenuCodes( 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); + + wxMacCFStringHolder str( m_label, m_font.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