]> git.saurik.com Git - wxWidgets.git/commitdiff
Add markup support to wxOSX/Cocoa wxStaticText and wxButton.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 27 Feb 2011 12:48:46 +0000 (12:48 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 27 Feb 2011 12:48:46 +0000 (12:48 +0000)
Add wxMarkupToAttrString helper that converts wx markup to OS X attribute
strings and use it in wxStaticText and wxButton.

This required adding new SetLabelMarkup() method to wxWidgetCocoaImpl, it
seems to make sense to have it there as it could be implemented by more
controls in the future.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67069 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/osx/button.h
include/wx/osx/cocoa/private/markuptoattr.h [new file with mode: 0644]
include/wx/osx/core/private.h
include/wx/osx/stattext.h
src/osx/button_osx.cpp
src/osx/cocoa/button.mm
src/osx/cocoa/stattext.mm
src/osx/stattext_osx.cpp

index 987c8e9792495024a3d2b55f01da3cfaa442ecdf..1d0353ef87a3d5712f493dfd0468d83c05d0d758 100644 (file)
@@ -68,6 +68,11 @@ protected:
         InvalidateBestSize();
     }
 
+#if wxUSE_MARKUP && wxOSX_USE_COCOA
+    virtual bool DoSetLabelMarkup(const wxString& markup);
+#endif // wxUSE_MARKUP && wxOSX_USE_COCOA
+
+
     // the margins around the bitmap
     int m_marginX;
     int m_marginY;
diff --git a/include/wx/osx/cocoa/private/markuptoattr.h b/include/wx/osx/cocoa/private/markuptoattr.h
new file mode 100644 (file)
index 0000000..63269e3
--- /dev/null
@@ -0,0 +1,120 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        wx/osx/cocoa/private/markuptoattr.h
+// Purpose:     Class to convert markup to Cocoa attributed strings.
+// Author:      Vadim Zeitlin
+// Created:     2011-02-22
+// RCS-ID:      $Id: wxhead.h,v 1.12 2010-04-22 12:44:51 zeitlin Exp $
+// Copyright:   (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_OSX_COCOA_PRIVATE_MARKUPTOATTR_H_
+#define _WX_OSX_COCOA_PRIVATE_MARKUPTOATTR_H_
+
+#include "wx/private/markupparserattr.h"
+
+// ----------------------------------------------------------------------------
+// wxMarkupToAttrString: create NSAttributedString from markup.
+// ----------------------------------------------------------------------------
+
+class wxMarkupToAttrString : public wxMarkupParserAttrOutput
+{
+public:
+    // We don't care about the original colours because we never use them but
+    // we do need the correct initial font as we apply modifiers (e.g. create a
+    // font larger than it) to it and so it must be valid.
+    wxMarkupToAttrString(wxWindow *win, const wxString& markup)
+        : wxMarkupParserAttrOutput(win->GetFont(), wxColour(), wxColour())
+    {
+        const wxCFStringRef
+            label(wxControl::RemoveMnemonics(wxMarkupParser::Strip(markup)));
+        m_attrString = [[NSMutableAttributedString alloc]
+                        initWithString: label.AsNSString()];
+
+        m_pos = 0;
+
+        [m_attrString beginEditing];
+
+        // First thing we do is change the default string font: as mentioned in
+        // Apple documentation, attributed strings use "Helvetica 12" font by
+        // default which is different from the system "Lucida Grande" font. So
+        // we need to explicitly change the font for the entire string.
+        [m_attrString addAttribute:NSFontAttributeName
+                      value:win->GetFont().OSXGetNSFont()
+                      range:NSMakeRange(0, [m_attrString length])];
+
+        // Now translate the markup tags to corresponding attributes.
+        wxMarkupParser parser(*this);
+        parser.Parse(markup);
+
+        [m_attrString endEditing];
+    }
+
+    ~wxMarkupToAttrString()
+    {
+        [m_attrString release];
+    }
+
+    // Accessor for the users of this class.
+    //
+    // We keep ownership of the returned string.
+    NSMutableAttributedString *GetNSAttributedString() const
+    {
+        return m_attrString;
+    }
+
+
+    // Implement base class pure virtual methods to process markup tags.
+    virtual void OnText(const wxString& text)
+    {
+        m_pos += wxControl::RemoveMnemonics(text).length();
+    }
+
+    virtual void OnAttrStart(const Attr& WXUNUSED(attr))
+    {
+        // Just remember the starting position of the range, we can't really
+        // set the attribute until we find the end of it.
+        m_rangeStarts.push(m_pos);
+    }
+
+    virtual void OnAttrEnd(const Attr& attr)
+    {
+        unsigned start = m_rangeStarts.top();
+        m_rangeStarts.pop();
+
+        const NSRange range = NSMakeRange(start, m_pos - start);
+
+        [m_attrString addAttribute:NSFontAttributeName
+                      value:attr.font.OSXGetNSFont()
+                      range:range];
+
+        if ( attr.foreground.IsOk() )
+        {
+            [m_attrString addAttribute:NSForegroundColorAttributeName
+                          value:attr.foreground.OSXGetNSColor()
+                          range:range];
+        }
+
+        if ( attr.background.IsOk() )
+        {
+            [m_attrString addAttribute:NSBackgroundColorAttributeName
+                          value:attr.background.OSXGetNSColor()
+                          range:range];
+        }
+    }
+
+private:
+    // The attributed string we're building.
+    NSMutableAttributedString *m_attrString;
+
+    // The current position in the output string.
+    unsigned m_pos;
+
+    // The positions of starting ranges.
+    wxStack<unsigned> m_rangeStarts;
+
+
+    wxDECLARE_NO_COPY_CLASS(wxMarkupToAttrString);
+};
+
+#endif // _WX_OSX_COCOA_PRIVATE_MARKUPTOATTR_H_
index 285561a45d208e641eb5a752152b82d19f639eee..a42f8287abad1e5664f75686c12c63bf753c33a3 100644 (file)
@@ -270,6 +270,9 @@ public :
     virtual void        SetDefaultButton( bool isDefault ) = 0;
     virtual void        PerformClick() = 0;
     virtual void        SetLabel( const wxString& title, wxFontEncoding encoding ) = 0;
+#if wxOSX_USE_COCOA
+    virtual void        SetLabelMarkup( const wxString& WXUNUSED(markup) ) { }
+#endif
 
     virtual void        SetCursor( const wxCursor & cursor ) = 0;
     virtual void        CaptureMouse() = 0;
index 3f76b748a48cdce83da5eec536f053257af91d77..fe366452a4b048b5349e54b9b03743b3e53c4254 100644 (file)
@@ -47,6 +47,10 @@ protected :
 
   virtual wxSize DoGetBestSize() const ;
 
+#if wxUSE_MARKUP && wxOSX_USE_COCOA
+    virtual bool DoSetLabelMarkup(const wxString& markup);
+#endif // wxUSE_MARKUP && wxOSX_USE_COCOA
+
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxStaticText)
 };
 
index 045ea7967540c7a11e912833e9373708b551d1bd..358fffffd3f5a450134b483ff2edde9640dedd75 100644 (file)
@@ -142,6 +142,20 @@ void wxButton::DoSetBitmapPosition(wxDirection dir)
     InvalidateBestSize();
 }
 
+#if wxUSE_MARKUP && wxOSX_USE_COCOA
+
+bool wxButton::DoSetLabelMarkup(const wxString& markup)
+{
+    if ( !wxButtonBase::DoSetLabelMarkup(markup) )
+        return false;
+
+    m_peer->SetLabelMarkup(markup);
+
+    return true;
+}
+
+#endif // wxUSE_MARKUP && wxOSX_USE_COCOA
+
 wxWindow *wxButton::SetDefault()
 {
     wxWindow *btnOldDefault = wxButtonBase::SetDefault();
index babc50e4293aa0ce903e9d9a64a40c63e7e87f6d..8e25f09c48e46210cfa193ca8e53d737a0ade4f4 100644 (file)
 
 #include "wx/osx/private.h"
 
+#if wxUSE_MARKUP
+    #include "wx/osx/cocoa/private/markuptoattr.h"
+#endif // wxUSE_MARKUP
+
+
 wxSize wxButton::DoGetBestSize() const
 {
     // We only use help button bezel if we don't have any (non standard) label
@@ -125,6 +130,23 @@ public:
         wxWidgetCocoaImpl::SetBitmap(bitmap);
     }
 
+    virtual void SetLabelMarkup(const wxString& markup)
+    {
+        wxMarkupToAttrString toAttr(GetWXPeer(), markup);
+        NSMutableAttributedString *attrString = toAttr.GetNSAttributedString();
+
+        // Button text is always centered.
+        NSMutableParagraphStyle *
+            paragraphStyle = [[NSMutableParagraphStyle alloc] init];
+        [paragraphStyle setAlignment: NSCenterTextAlignment];
+        [attrString addAttribute:NSParagraphStyleAttributeName
+                    value:paragraphStyle
+                    range:NSMakeRange(0, [attrString length])];
+        [paragraphStyle release];
+
+        [GetNSButton() setAttributedTitle:attrString];
+    }
+
     void SetPressedBitmap( const wxBitmap& bitmap )
     {
         NSButton* button = GetNSButton();
index 57ba5c40699bd5d33ac31fb075b256281bee87ad..c096753e0b4d2f3313f882dc426d7fa3e7b1098c 100644 (file)
 
 #include "wx/osx/private.h"
 
+#if wxUSE_MARKUP
+    #include "wx/osx/cocoa/private/markuptoattr.h"
+#endif // wxUSE_MARKUP
+
 #include <stdio.h>
 
 @interface wxNSStaticTextView : NSTextField
@@ -75,26 +79,42 @@ public:
 
     virtual void SetLabel(const wxString& title, wxFontEncoding encoding)
     {
-        wxNSStaticTextView* v = (wxNSStaticTextView*)GetWXWidget();
-        wxWindow* wxpeer = GetWXPeer();
-        NSCell* cell = [v cell];
         wxCFStringRef text( title , encoding );
 
+        NSMutableAttributedString *
+            attrstring = [[NSMutableAttributedString alloc] initWithString:text.AsNSString()];
+        DoSetAttrString(attrstring);
+        [attrstring release];
+    }
+
+#if wxUSE_MARKUP
+    virtual void SetLabelMarkup( const wxString& markup)
+    {
+        wxMarkupToAttrString toAttr(GetWXPeer(), markup);
+
+        DoSetAttrString(toAttr.GetNSAttributedString());
+    }
+#endif // wxUSE_MARKUP
+
+private:
+    void DoSetAttrString(NSMutableAttributedString *attrstring)
+    {
         NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
         [paragraphStyle setLineBreakMode:m_lineBreak];
-        int style = wxpeer->GetWindowStyleFlag();
+        int style = GetWXPeer()->GetWindowStyleFlag();
         if (style & wxALIGN_CENTER)
             [paragraphStyle setAlignment: NSCenterTextAlignment];
         else if (style & wxALIGN_RIGHT)
             [paragraphStyle setAlignment: NSRightTextAlignment];
 
-        NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:paragraphStyle, NSParagraphStyleAttributeName, nil];
-        NSAttributedString *attrstring = [[NSAttributedString alloc] initWithString:text.AsNSString() attributes:dict];
+        [attrstring addAttribute:NSParagraphStyleAttributeName
+                    value:paragraphStyle
+                    range:NSMakeRange(0, [attrstring length])];
+        NSCell* cell = [(wxNSStaticTextView *)GetWXWidget() cell];
         [cell setAttributedStringValue:attrstring];
-        [attrstring release];
         [paragraphStyle release];
     }
-private :
+
     NSLineBreakMode m_lineBreak;
 };
 
index bf1e915c0d5a9e8211d4633a7162d7bf7d8b5843..0ff943ff6d6e930d3409237f978c9e21f93aae3f 100644 (file)
@@ -104,6 +104,20 @@ void wxStaticText::DoSetLabel(const wxString& label)
     m_peer->SetLabel(m_label , GetFont().GetEncoding() );
 }
 
+#if wxUSE_MARKUP && wxOSX_USE_COCOA
+
+bool wxStaticText::DoSetLabelMarkup(const wxString& markup)
+{
+    if ( !wxStaticTextBase::DoSetLabelMarkup(markup) )
+        return false;
+
+    m_peer->SetLabelMarkup(markup);
+
+    return true;
+}
+
+#endif // wxUSE_MARKUP && wxOSX_USE_COCOA
+
 wxString wxStaticText::DoGetLabel() const
 {
     return m_label;