X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a4e3249255361245b5a4bc746e40374f2186439e..7c60222510bc5e197b12f153c4bf05db66cb0f4a:/src/osx/cocoa/stattext.mm diff --git a/src/osx/cocoa/stattext.mm b/src/osx/cocoa/stattext.mm index d37673bc8c..591a97a476 100644 --- a/src/osx/cocoa/stattext.mm +++ b/src/osx/cocoa/stattext.mm @@ -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 ///////////////////////////////////////////////////////////////////////////// @@ -25,113 +25,112 @@ #include "wx/osx/private.h" +#if wxUSE_MARKUP + #include "wx/osx/cocoa/private/markuptoattr.h" +#endif // wxUSE_MARKUP + #include -@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(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