// Author: Stefan Csomor
// Modified by:
// Created: 04/01/98
-// RCS-ID: $Id: stattext.cpp 54845 2008-07-30 14:52:41Z SC $
// Copyright: (c) Stefan Csomor
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/settings.h"
#endif // WX_PRECOMP
-#include "wx/notebook.h"
-#include "wx/tabctrl.h"
-
#include "wx/osx/private.h"
+#if wxUSE_MARKUP
+ #include "wx/osx/cocoa/private/markuptoattr.h"
+#endif // wxUSE_MARKUP
+
#include <stdio.h>
-wxSize wxStaticText::DoGetBestSize() const
+@interface wxNSStaticTextView : NSTextField
{
- Point bounds;
-#if wxOSX_USE_CARBON
- Rect bestsize = { 0 , 0 , 0 , 0 } ;
-
- // 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 ;
- bounds.v = bestsize.bottom - bestsize.top ;
- }
- else
-#endif
- {
-#if wxOSX_USE_CARBON
- ControlFontStyleRec controlFont;
- OSStatus err = m_peer->GetData<ControlFontStyleRec>( kControlEntireControl, kControlFontStyleTag, &controlFont );
- verify_noerr( err );
-
- wxCFStringRef str( m_label, GetFont().GetEncoding() );
-
-#if wxOSX_USE_ATSU_TEXT
- SInt16 baseline;
- 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
-#endif
- {
- wxClientDC dc(const_cast<wxStaticText*>(this));
- wxCoord width, height ;
- dc.GetTextExtent( m_label , &width, &height);
- bounds.h = width;
- bounds.v = height;
- }
+}
+@end
- if ( m_label.empty() )
- bounds.h = 0;
- }
- bounds.h += MacGetLeftBorderSize() + MacGetRightBorderSize();
- bounds.v += MacGetTopBorderSize() + MacGetBottomBorderSize();
+@implementation wxNSStaticTextView
- return wxSize( bounds.h, bounds.v );
++ (void)initialize
+{
+ static BOOL initialized = NO;
+ if (!initialized)
+ {
+ initialized = YES;
+ wxOSXCocoaClassAddWXMethods( self );
+ }
}
-// for wxST_ELLIPSIZE_* support:
+- (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]];
+ }
+ }
+}
-/*
- FIXME: UpdateLabel() should be called on size events when wxST_ELLIPSIZE_START is set
- to allow correct dynamic ellipsizing of the label
-*/
+@end
-@interface wxNSTextField : NSTextField
+class wxStaticTextCocoaImpl : public wxWidgetCocoaImpl
{
- wxWidgetImpl* m_impl;
-}
+public:
+ wxStaticTextCocoaImpl( wxWindowMac* peer , WXWidget w , NSLineBreakMode lineBreak) : wxWidgetCocoaImpl(peer, w)
+ {
+ m_lineBreak = lineBreak;
+ }
-- (void)setImplementation: (wxWidgetImpl *) theImplementation;
-- (wxWidgetImpl*) implementation;
-- (BOOL) isFlipped;
+ virtual void SetLabel(const wxString& title, wxFontEncoding encoding)
+ {
+ wxCFStringRef text( title , encoding );
-@end
+ NSMutableAttributedString *
+ attrstring = [[NSMutableAttributedString alloc] initWithString:text.AsNSString()];
+ DoSetAttrString(attrstring);
+ [attrstring release];
+ }
-@implementation wxNSTextField
+#if wxUSE_MARKUP
+ virtual void SetLabelMarkup( const wxString& markup)
+ {
+ wxMarkupToAttrString toAttr(GetWXPeer(), markup);
-- (void)setImplementation: (wxWidgetImpl *) theImplementation
-{
- m_impl = theImplementation;
-}
+ DoSetAttrString(toAttr.GetNSAttributedString());
+ }
+#endif // wxUSE_MARKUP
-- (wxWidgetImpl*) implementation
-{
- return m_impl;
-}
+private:
+ void DoSetAttrString(NSMutableAttributedString *attrstring)
+ {
+ 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];
+ }
-- (BOOL) isFlipped
-{
- return YES;
-}
+ NSLineBreakMode m_lineBreak;
+};
-// use our common calls
-- (void) setTitle:(NSString *) title
+wxSize wxStaticText::DoGetBestSize() const
{
- [self setStringValue: title];
+ return wxWindowMac::DoGetBestSize() ;
}
-@end
-
-
-wxWidgetImplType* wxWidgetImpl::CreateStaticText( wxWindowMac* wxpeer,
- wxWindowMac* parent,
- wxWindowID id,
- const wxString& label,
- const wxPoint& pos,
+wxWidgetImplType* wxWidgetImpl::CreateStaticText( wxWindowMac* wxpeer,
+ wxWindowMac* WXUNUSED(parent),
+ wxWindowID WXUNUSED(id),
+ const wxString& WXUNUSED(label),
+ const wxPoint& pos,
const wxSize& size,
- long style,
- long extraStyle)
+ long style,
+ long WXUNUSED(extraStyle))
{
- NSView* sv = (wxpeer->GetParent()->GetHandle() );
-
- NSRect r = wxToNSRect( sv, wxRect( pos, size) );
- // Rect bounds = wxMacGetBoundsForControl( wxpeer, pos , size ) ;
- wxNSTextField* v = [[wxNSTextField alloc] initWithFrame:r];
- [sv addSubview:v];
+ NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
+ wxNSStaticTextView* v = [[wxNSStaticTextView alloc] initWithFrame:r];
- [v setBezeled:NO];
[v setEditable:NO];
[v setDrawsBackground:NO];
-
- wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v );
- [v setImplementation:c];
- 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 setSelectable: NO];
+ [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;
+ }
+ else
+ {
+ [[v cell] setWraps:YES];
}
- return peer;
- */
+
+ wxWidgetCocoaImpl* c = new wxStaticTextCocoaImpl( wxpeer, v, linebreak );
+ return c;
}
#endif //if wxUSE_STATTEXT