]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/corefoundation/cfstring.cpp
Bring wxSpinCtrl closer to HIG
[wxWidgets.git] / src / mac / corefoundation / cfstring.cpp
index 95a2c7a04259c8c304791847c00d138376ac4ea8..dbe52f6e57c365383005debd60fb1f5b980a84a4 100644 (file)
 
 #include "wx/mac/corefoundation/cfstring.h"
 
 
 #include "wx/mac/corefoundation/cfstring.h"
 
-#ifdef __DARWIN__
-    #include <CoreServices/CoreServices.h>
-#else
-    #include <TextCommon.h>
-#endif
+#include <CoreServices/CoreServices.h>
 
 void wxMacConvertNewlines13To10( char * data )
 {
 
 void wxMacConvertNewlines13To10( char * data )
 {
@@ -593,17 +589,16 @@ wxFontEncoding wxMacGetFontEncFromSystemEnc(wxUint32 encoding)
 
 
 //
 
 
 //
-// CFStringRefs (Carbon only)
+// CFStringRefs
 //
 
 //
 
-// converts this string into a carbon foundation string with optional pc 2 mac encoding
-void wxMacCFStringHolder::Assign( const wxString &st , wxFontEncoding WXUNUSED_IN_UNICODE(encoding) )
+// converts this string into a core foundation string with optional pc 2 mac encoding
+
+wxCFStringRef::wxCFStringRef( const wxString &st , wxFontEncoding WXUNUSED_IN_UNICODE(encoding) )
 {
 {
-    Release() ;
     if (st.IsEmpty())
     {
     if (st.IsEmpty())
     {
-        m_cfs = CFSTR("") ;
-        CFRetain( m_cfs ) ;
+        reset( wxCFRetain( CFSTR("") ) );
     }
     else
     {
     }
     else
     {
@@ -611,42 +606,52 @@ void wxMacCFStringHolder::Assign( const wxString &st , wxFontEncoding WXUNUSED_I
         wxMacConvertNewlines13To10( &str ) ;
 #if wxUSE_UNICODE
 #if SIZEOF_WCHAR_T == 2
         wxMacConvertNewlines13To10( &str ) ;
 #if wxUSE_UNICODE
 #if SIZEOF_WCHAR_T == 2
-        m_cfs = CFStringCreateWithCharacters( kCFAllocatorDefault,
-            (UniChar*)str.wc_str() , str.Len() );
+        reset( CFStringCreateWithCharacters( kCFAllocatorDefault,
+            (UniChar*)str.wc_str() , str.Len() ) );
 #else
         wxMBConvUTF16 converter ;
 #else
         wxMBConvUTF16 converter ;
-        size_t unicharlen = converter.WC2MB( NULL , str.wc_str() , 0 ) ;
-        UniChar *unibuf = new UniChar[ unicharlen / sizeof(UniChar) + 1 ] ;
-        converter.WC2MB( (char*)unibuf , str.wc_str() , unicharlen ) ;
-        m_cfs = CFStringCreateWithCharacters( kCFAllocatorDefault ,
-            unibuf , unicharlen / sizeof(UniChar) ) ;
-        delete[] unibuf ;
+        size_t unicharbytes = converter.FromWChar( NULL , 0 , str.wc_str() , str.Length() ) ;
+        wxASSERT( unicharbytes != wxCONV_FAILED );
+        if ( unicharbytes == wxCONV_FAILED )
+        {
+            // create an empty string
+            reset( wxCFRetain( CFSTR("") ) );
+        }
+        else
+        {
+            // unicharbytes: number of bytes needed for UTF-16 encoded string (without terminating null)
+            // unichars: number of UTF-16 characters (without terminating null)
+            size_t unichars = unicharbytes /  sizeof(UniChar) ;
+            UniChar *unibuf = new UniChar[ unichars ] ;
+            converter.FromWChar( (char*)unibuf , unicharbytes , str.wc_str() , str.Length() ) ;
+            reset( CFStringCreateWithCharacters( kCFAllocatorDefault , unibuf , unichars ) ) ;
+            delete[] unibuf ;
+        }
 #endif
 #else // not wxUSE_UNICODE
 #endif
 #else // not wxUSE_UNICODE
-        m_cfs = CFStringCreateWithCString( kCFAllocatorSystemDefault , str.c_str() ,
-            wxMacGetSystemEncFromFontEnc( encoding ) ) ;
+        reset( CFStringCreateWithCString( kCFAllocatorSystemDefault , str.c_str() ,
+            wxMacGetSystemEncFromFontEnc( encoding ) ) );
 #endif
     }
 #endif
     }
-    m_release = true ;
 }
 
 }
 
-wxString wxMacCFStringHolder::AsString(wxFontEncoding WXUNUSED_IN_UNICODE(encoding))
+wxString wxCFStringRef::AsString(wxFontEncoding WXUNUSED_IN_UNICODE(encoding))
 {
 {
-    if ( m_cfs == NULL )
+    if ( !get() )
         return wxEmptyString ;
 
         return wxEmptyString ;
 
-    Size cflen = CFStringGetLength( m_cfs )  ;
+    Size cflen = CFStringGetLength( get() )  ;
     size_t noChars ;
     wxChar* buf = NULL ;
 
 #if wxUSE_UNICODE
 #if SIZEOF_WCHAR_T == 2
     buf = new wxChar[ cflen + 1 ] ;
     size_t noChars ;
     wxChar* buf = NULL ;
 
 #if wxUSE_UNICODE
 #if SIZEOF_WCHAR_T == 2
     buf = new wxChar[ cflen + 1 ] ;
-    CFStringGetCharacters( m_cfs , CFRangeMake( 0 , cflen ) , (UniChar*) buf ) ;
+    CFStringGetCharacters( get() , CFRangeMake( 0 , cflen ) , (UniChar*) buf ) ;
     noChars = cflen ;
 #else
     UniChar* unibuf = new UniChar[ cflen + 1 ] ;
     noChars = cflen ;
 #else
     UniChar* unibuf = new UniChar[ cflen + 1 ] ;
-    CFStringGetCharacters( m_cfs , CFRangeMake( 0 , cflen ) , (UniChar*) unibuf ) ;
+    CFStringGetCharacters( get() , CFRangeMake( 0 , cflen ) , (UniChar*) unibuf ) ;
     unibuf[cflen] = 0 ;
     wxMBConvUTF16 converter ;
     noChars = converter.MB2WC( NULL , (const char*)unibuf , 0 ) ;
     unibuf[cflen] = 0 ;
     wxMBConvUTF16 converter ;
     noChars = converter.MB2WC( NULL , (const char*)unibuf , 0 ) ;
@@ -658,10 +663,10 @@ wxString wxMacCFStringHolder::AsString(wxFontEncoding WXUNUSED_IN_UNICODE(encodi
 #endif
 #else
     CFIndex cStrLen ;
 #endif
 #else
     CFIndex cStrLen ;
-    CFStringGetBytes( m_cfs , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) ,
+    CFStringGetBytes( get() , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) ,
         '?' , false , NULL , 0 , &cStrLen ) ;
     buf = new wxChar[ cStrLen + 1 ] ;
         '?' , false , NULL , 0 , &cStrLen ) ;
     buf = new wxChar[ cStrLen + 1 ] ;
-    CFStringGetBytes( m_cfs , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) ,
+    CFStringGetBytes( get() , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) ,
         '?' , false , (unsigned char*) buf , cStrLen , &cStrLen) ;
     noChars = cStrLen ;
 #endif
         '?' , false , (unsigned char*) buf , cStrLen , &cStrLen) ;
     noChars = cStrLen ;
 #endif
@@ -673,6 +678,9 @@ wxString wxMacCFStringHolder::AsString(wxFontEncoding WXUNUSED_IN_UNICODE(encodi
     return result ;
 }
 
     return result ;
 }
 
+//
+// wxMacUniCharBuffer
+//
 
 wxMacUniCharBuffer::wxMacUniCharBuffer( const wxString &str )
 {
 
 wxMacUniCharBuffer::wxMacUniCharBuffer( const wxString &str )
 {