]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/stattext.cpp
document On{Open,Save}Document()
[wxWidgets.git] / src / mac / carbon / stattext.cpp
index be737ac8be29532a6de9fe01c10be61a87f60293..d0285e6b065092b7e5d050259d7887ea90e20a56 100644 (file)
@@ -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;
 }
 
@@ -76,9 +75,12 @@ wxSize wxStaticText::DoGetBestSize() const
 {
     Rect bestsize = { 0 , 0 , 0 , 0 } ;
     Point bounds;
-    
+
     // try the built-in best size if available
+    Boolean former = m_peer->GetData<Boolean>( 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<ControlFontStyleRec>( 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<wxStaticText*>(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<CFStringRef>(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);
+
+        // and leave ellipsization to the OS
+        DoSetLabel(str);
+    }
+    else // not supported natively
+    {
+        DoSetLabel(GetEllipsizedLabelWithoutMarkup());
+    }
 
-    if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) )
+    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<CFStringRef>(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