]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/cocoa/stattext.mm
fixing class
[wxWidgets.git] / src / osx / cocoa / stattext.mm
index d37673bc8c38e15beadf8884e1bf502bc3acc657..591a97a4764a1e9fb6475d751d498891409745dd 100644 (file)
@@ -4,7 +4,7 @@
 // Author:      Stefan Csomor
 // Modified by:
 // Created:     04/01/98
-// RCS-ID:      $Id: stattext.cpp 54845 2008-07-30 14:52:41Z SC $
+// RCS-ID:      $Id$
 // Copyright:   (c) Stefan Csomor
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/osx/private.h"
 
+#if wxUSE_MARKUP
+    #include "wx/osx/cocoa/private/markuptoattr.h"
+#endif // wxUSE_MARKUP
+
 #include <stdio.h>
 
-@interface wxNSStaticTextView : NSTextView
+@interface wxNSStaticTextView : NSTextField
 {
-    wxWidgetCocoaImpl* impl;
 }
-
-- (void) setImplementation:(wxWidgetCocoaImpl*) item;
-- (wxWidgetCocoaImpl*) implementation;
 @end
+
 @implementation wxNSStaticTextView
 
 + (void)initialize
 {
     static BOOL initialized = NO;
-    if (!initialized) 
-    {    
+    if (!initialized)
+    {
         initialized = YES;
         wxOSXCocoaClassAddWXMethods( self );
     }
 }
 
-- (wxWidgetCocoaImpl*) implementation
-{
-    return impl;
-}
+- (void) setEnabled:(BOOL) flag 
+{ 
+    [super setEnabled: flag]; 
+    
+    if (![self drawsBackground]) { 
+        // Static text is drawn incorrectly when disabled. 
+        // For an explanation, see 
+        // http://www.cocoabuilder.com/archive/message/cocoa/2006/7/21/168028 
+        if (flag)
+        { 
+            [self setTextColor: [NSColor controlTextColor]]; 
+        }
+        else 
+        { 
+            [self setTextColor: [NSColor secondarySelectedControlColor]]; 
+        } 
+    } 
+} 
 
-- (void) setImplementation:(wxWidgetCocoaImpl*) item
-{
-    impl = item;
-}
 @end
 
 class wxStaticTextCocoaImpl : public wxWidgetCocoaImpl
 {
 public:
-    wxStaticTextCocoaImpl( wxWindowMac* peer , WXWidget w ) : wxWidgetCocoaImpl(peer, w)
+    wxStaticTextCocoaImpl( wxWindowMac* peer , WXWidget w , NSLineBreakMode lineBreak) : wxWidgetCocoaImpl(peer, w)
     {
+        m_lineBreak = lineBreak;
     }
-    
-    virtual void SetLabel(const wxString& title, wxFontEncoding encoding) 
-    { 
-        wxNSStaticTextView* v = (wxNSStaticTextView*)GetWXWidget();
-        wxWindow* wxpeer = GetWXPeer();
-        [v setString: wxCFStringRef( title , wxpeer->GetFont().GetEncoding() ).AsNSString()];
-    
-        int style = wxpeer->GetWindowStyleFlag();
-        NSRange allText = NSMakeRange(0, title.length());
-        if (style & wxALIGN_CENTER)
-            [v setAlignment: NSCenterTextAlignment range: allText];
-        else if (style & wxALIGN_RIGHT)
-            [v setAlignment: NSRightTextAlignment range: allText];
-    }
-};
 
-wxSize wxStaticText::DoGetBestSize() const
-{
-    Point bounds;
-    
-#if wxOSX_USE_ATSU_TEXT
-    OSStatus err = noErr;
-    wxCFStringRef str( m_label,  GetFont().GetEncoding() );
+    virtual void SetLabel(const wxString& title, wxFontEncoding encoding)
+    {
+        wxCFStringRef text( title , encoding );
+
+        NSMutableAttributedString *
+            attrstring = [[NSMutableAttributedString alloc] initWithString:text.AsNSString()];
+        DoSetAttrString(attrstring);
+        [attrstring release];
+    }
 
-    SInt16 baseline;
-    if ( m_font.MacGetThemeFontID() != kThemeCurrentPortFont )
+#if wxUSE_MARKUP
+    virtual void SetLabelMarkup( const wxString& markup)
     {
-        err = GetThemeTextDimensions(
-            (!m_label.empty() ? (CFStringRef)str : CFSTR(" ")),
-            m_font.MacGetThemeFontID(), kThemeStateActive, false, &bounds, &baseline );
-        verify_noerr( err );
+        wxMarkupToAttrString toAttr(GetWXPeer(), markup);
+
+        DoSetAttrString(toAttr.GetNSAttributedString());
     }
-    else
-#endif
+#endif // wxUSE_MARKUP
+
+private:
+    void DoSetAttrString(NSMutableAttributedString *attrstring)
     {
-        wxClientDC dc(const_cast<wxStaticText*>(this));
-        wxCoord width, height ;
-        dc.GetMultiLineTextExtent( m_label , &width, &height);
-        // FIXME: The calculations returned by this function are too small
-        // for some strings, so we adjust manually.
-        bounds.h = width+12;
-        bounds.v = height+4;
+        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
+        [paragraphStyle setLineBreakMode:m_lineBreak];
+        int style = GetWXPeer()->GetWindowStyleFlag();
+        if (style & wxALIGN_CENTER_HORIZONTAL)
+            [paragraphStyle setAlignment: NSCenterTextAlignment];
+        else if (style & wxALIGN_RIGHT)
+            [paragraphStyle setAlignment: NSRightTextAlignment];
+
+        [attrstring addAttribute:NSParagraphStyleAttributeName
+                    value:paragraphStyle
+                    range:NSMakeRange(0, [attrstring length])];
+        NSCell* cell = [(wxNSStaticTextView *)GetWXWidget() cell];
+        [cell setAttributedStringValue:attrstring];
+        [paragraphStyle release];
     }
-    
-    if ( m_label.empty() )
-        bounds.h = 0;
 
-    bounds.h += MacGetLeftBorderSize() + MacGetRightBorderSize();
-    bounds.v += MacGetTopBorderSize() + MacGetBottomBorderSize();
+    NSLineBreakMode m_lineBreak;
+};
 
-    return wxSize( bounds.h, bounds.v );
+wxSize wxStaticText::DoGetBestSize() const
+{
+    return wxWindowMac::DoGetBestSize() ;
 }
 
-// for wxST_ELLIPSIZE_* support:
-
-/*
-   FIXME: UpdateLabel() should be called on size events when wxST_ELLIPSIZE_START is set
-          to allow correct dynamic ellipsizing of the label
-*/
-
 wxWidgetImplType* wxWidgetImpl::CreateStaticText( wxWindowMac* wxpeer,
-                                    wxWindowMac* parent,
-                                    wxWindowID id,
-                                    const wxString& label,
+                                    wxWindowMac* WXUNUSED(parent),
+                                    wxWindowID WXUNUSED(id),
+                                    const wxString& WXUNUSED(label),
                                     const wxPoint& pos,
                                     const wxSize& size,
                                     long style,
-                                    long extraStyle)
+                                    long WXUNUSED(extraStyle))
 {
     NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
     wxNSStaticTextView* v = [[wxNSStaticTextView alloc] initWithFrame:r];
@@ -139,29 +138,26 @@ wxWidgetImplType* wxWidgetImpl::CreateStaticText( wxWindowMac* wxpeer,
     [v setEditable:NO];
     [v setDrawsBackground:NO];
     [v setSelectable: NO];
-            
-    wxWidgetCocoaImpl* c = new wxStaticTextCocoaImpl( wxpeer, v );
-    return c;
-/*
-    Rect bounds = wxMacGetBoundsForControl( wxpeer, pos, size );
-
-    wxMacControl* peer = new wxMacControl( wxpeer );
-    OSStatus err = CreateStaticTextControl(
-        MAC_WXHWND(parent->MacGetTopLevelWindowRef()),
-        &bounds, NULL, NULL, peer->GetControlRefAddr() );
-    verify_noerr( err );
+    [v setBezeled:NO];
+    [v setBordered:NO];
 
-    if ( ( style & wxST_ELLIPSIZE_END ) || ( style & wxST_ELLIPSIZE_MIDDLE ) )
+    NSLineBreakMode linebreak = NSLineBreakByWordWrapping;
+    if ( ((wxStaticText*)wxpeer)->IsEllipsized() )
     {
-        TruncCode tCode = truncEnd;
         if ( style & wxST_ELLIPSIZE_MIDDLE )
-            tCode = truncMiddle;
-
-        err = peer->SetData( kControlStaticTextTruncTag, tCode );
-        err = peer->SetData( kControlStaticTextIsMultilineTag, (Boolean)0 );
+            linebreak = NSLineBreakByTruncatingMiddle;
+        else if (style & wxST_ELLIPSIZE_END )
+            linebreak = NSLineBreakByTruncatingTail;
+        else if (style & wxST_ELLIPSIZE_START )
+            linebreak = NSLineBreakByTruncatingHead;
     }
-    return peer;
-    */
+    else
+    {
+        [[v cell] setWraps:YES];
+    }
+
+    wxWidgetCocoaImpl* c = new wxStaticTextCocoaImpl( wxpeer, v, linebreak );
+    return c;
 }
 
 #endif //if wxUSE_STATTEXT