]> git.saurik.com Git - wxWidgets.git/commitdiff
cocoa doesn't need system framework - string conversion for cocoa - focus for cocoa...
authorRyan Norton <wxprojects@comcast.net>
Mon, 11 Oct 2004 02:02:30 +0000 (02:02 +0000)
committerRyan Norton <wxprojects@comcast.net>
Mon, 11 Oct 2004 02:02:30 +0000 (02:02 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29780 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

configure
configure.in
include/wx/cocoa/NSView.h
include/wx/cocoa/window.h
src/cocoa/window.mm
src/common/strconv.cpp
tests/strings/strings.cpp

index dee1df68d9206026950732df26368b63e64be77c..0d289f40ecfd3101176e8dbccb7d1443e8597dca 100755 (executable)
--- a/configure
+++ b/configure
@@ -37472,7 +37472,7 @@ if test "$wxUSE_MAC" = 1 ; then
     LDFLAGS="$LDFLAGS -framework Carbon -framework Cocoa -framework System"
 fi
 if test "$wxUSE_COCOA" = 1 ; then
-    LDFLAGS="$LDFLAGS -framework Cocoa -framework System"
+    LDFLAGS="$LDFLAGS -framework Cocoa"
 fi
 
 
@@ -39781,6 +39781,8 @@ fi
 
 
 
+
+
 BAKEFILE_AUTOCONF_INC_M4_VERSION="0.1.4"
 
 
index b7ba447ca81eb6dcdf85e639a377b754e0969828..acf701009e42ba441c2b2196833c0fe1dd0754e2 100644 (file)
@@ -5808,7 +5808,7 @@ if test "$wxUSE_MAC" = 1 ; then
     LDFLAGS="$LDFLAGS -framework Carbon -framework Cocoa -framework System"
 fi
 if test "$wxUSE_COCOA" = 1 ; then
-    LDFLAGS="$LDFLAGS -framework Cocoa -framework System"
+    LDFLAGS="$LDFLAGS -framework Cocoa"
 fi
 
 dnl FIXME: should this be covered by the conditional above
index ffff7fdf92242e42e12832d21c862a8c35bbc0e7..50a583c5d2f0f0492cb903fe0944849dadc01ea2 100644 (file)
@@ -16,6 +16,7 @@
 #include "wx/cocoa/ObjcAssociate.h"
 
 typedef struct _NSRect NSRect;
+class wxWindow;
 
 WX_DECLARE_OBJC_HASHMAP(NSView);
 class wxCocoaNSView
@@ -28,6 +29,8 @@ public:
 protected:
     static void *sm_cocoaObserver;
 public:
+    virtual wxWindow* GetWxWindow() const
+    {  return NULL;    }
     virtual void Cocoa_FrameChanged(void) = 0;
     virtual bool Cocoa_drawRect(const NSRect &rect)
     {   return false; }
index 3f0138d6ce0c42b60b041cdc8d3e6027f1cb467d..d9d55e3218f95c04f8a37c021e8406eeba7c27a9 100644 (file)
@@ -81,6 +81,7 @@ protected:
 
     void CocoaCreateNSScrollView();
     void InitMouseEvent(wxMouseEvent &event, WX_NSEvent cocoaEvent);
+    virtual wxWindow* GetWxWindow() const;
     virtual void Cocoa_FrameChanged(void);
     virtual bool Cocoa_drawRect(const NSRect &rect);
     virtual bool Cocoa_mouseDown(WX_NSEvent theEvent);
index 0395a461c1ed5764b069a02a88c670775cb9a368..630b14bd65db677568432cf11dbd69a5378f1de9 100644 (file)
@@ -695,6 +695,11 @@ WXWidget wxWindow::GetHandle() const
     return m_cocoaNSView;
 }
 
+wxWindow* wxWindow::GetWxWindow() const
+{
+    return (wxWindow*) this;
+}
+
 void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
 {
     [m_cocoaNSView setNeedsDisplay:YES];
@@ -702,7 +707,14 @@ void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
 
 void wxWindow::SetFocus()
 {
-    // TODO
+#ifdef __WXDEBUG__
+    bool bOK = 
+#endif
+        [GetNSView() lockFocusIfCanDraw];
+        
+    //Note that the normal lockFocus works on hidden and minimized windows
+    //and has no return value - which probably isn't what we want
+    wxASSERT(bOK);
 }
 
 void wxWindow::DoCaptureMouse()
@@ -883,8 +895,12 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
 // Get the window with the focus
 wxWindow *wxWindowBase::DoFindFocus()
 {
-    // TODO
-    return NULL;
+    wxCocoaNSView *win = wxCocoaNSView::GetFromCocoa([NSView focusView]);
+    
+    if (!win)
+        return NULL;
+        
+    return win->GetWxWindow();
 }
 
 /* static */ wxWindow *wxWindowBase::GetCapture()
index 667874bdef8db342ce46944c06718b8cbd25979a..e0e0def4dab52144752101e38bb899fc744842eb 100644 (file)
@@ -1286,6 +1286,701 @@ private:
 
 #endif // wxHAVE_WIN32_MB2WC
 
+// ============================================================================
+// Cocoa conversion classes
+// ============================================================================
+
+#if defined(__WXCOCOA__)
+
+// RN:  There is no UTF-32 support in either Core Foundation or 
+// Cocoa.  Strangely enough, internally Core Foundation uses
+// UTF 32 internally quite a bit - its just not public (yet).
+
+#include <CoreFoundation/CFString.h>
+#include <CoreFoundation/CFStringEncodingExt.h>
+
+CFStringEncoding wxCFStringEncFromFontEnc(wxFontEncoding encoding)
+{      
+       CFStringEncoding enc = 0 ;
+       if ( encoding == wxFONTENCODING_DEFAULT )
+       {
+#if wxUSE_GUI
+               encoding = wxFont::GetDefaultEncoding() ;
+#else
+               encoding = wxLocale::GetSystemEncoding() ;
+#endif
+       }
+       else switch( encoding)
+       {
+               case wxFONTENCODING_ISO8859_1 :
+               enc = kCFStringEncodingISOLatin1 ;
+               break ;
+               case wxFONTENCODING_ISO8859_2 :
+               enc = kCFStringEncodingISOLatin2;
+               break ;
+               case wxFONTENCODING_ISO8859_3 :
+               enc = kCFStringEncodingISOLatin3 ;
+               break ;
+               case wxFONTENCODING_ISO8859_4 :
+               enc = kCFStringEncodingISOLatin4;
+               break ;
+               case wxFONTENCODING_ISO8859_5 :
+               enc = kCFStringEncodingISOLatinCyrillic;
+               break ;
+               case wxFONTENCODING_ISO8859_6 :
+               enc = kCFStringEncodingISOLatinArabic;
+               break ;
+               case wxFONTENCODING_ISO8859_7 :
+               enc = kCFStringEncodingISOLatinGreek;
+               break ;
+               case wxFONTENCODING_ISO8859_8 :
+               enc = kCFStringEncodingISOLatinHebrew;
+               break ;
+               case wxFONTENCODING_ISO8859_9 :
+               enc = kCFStringEncodingISOLatin5;
+               break ;
+               case wxFONTENCODING_ISO8859_10 :
+               enc = kCFStringEncodingISOLatin6;
+               break ;
+               case wxFONTENCODING_ISO8859_11 :
+               enc = kCFStringEncodingISOLatinThai;
+               break ;
+               case wxFONTENCODING_ISO8859_13 :
+               enc = kCFStringEncodingISOLatin7;
+               break ;
+               case wxFONTENCODING_ISO8859_14 :
+               enc = kCFStringEncodingISOLatin8;
+               break ;
+               case wxFONTENCODING_ISO8859_15 :
+               enc = kCFStringEncodingISOLatin9;
+               break ;
+
+               case wxFONTENCODING_KOI8 :
+               enc = kCFStringEncodingKOI8_R;
+               break ;
+               case wxFONTENCODING_ALTERNATIVE : // MS-DOS CP866
+               enc = kCFStringEncodingDOSRussian;
+               break ;
+
+//             case wxFONTENCODING_BULGARIAN : 
+//             enc = ;
+//             break ;
+                       
+               case wxFONTENCODING_CP437 : 
+               enc =kCFStringEncodingDOSLatinUS ;
+               break ;
+               case wxFONTENCODING_CP850 :
+               enc = kCFStringEncodingDOSLatin1;
+               break ;
+               case wxFONTENCODING_CP852 : 
+               enc = kCFStringEncodingDOSLatin2;
+               break ;
+               case wxFONTENCODING_CP855 :
+               enc = kCFStringEncodingDOSCyrillic;
+               break ;
+               case wxFONTENCODING_CP866 :
+               enc =kCFStringEncodingDOSRussian ;
+               break ;
+               case wxFONTENCODING_CP874 :
+               enc = kCFStringEncodingDOSThai;
+               break ;
+               case wxFONTENCODING_CP932 : 
+               enc = kCFStringEncodingDOSJapanese;
+               break ;
+               case wxFONTENCODING_CP936 : 
+               enc =kCFStringEncodingDOSChineseSimplif ;
+               break ;
+               case wxFONTENCODING_CP949 : 
+               enc = kCFStringEncodingDOSKorean;
+               break ;
+               case wxFONTENCODING_CP950 : 
+               enc = kCFStringEncodingDOSChineseTrad;
+               break ;
+               
+               case wxFONTENCODING_CP1250 : 
+               enc = kCFStringEncodingWindowsLatin2;
+               break ;
+               case wxFONTENCODING_CP1251 : 
+               enc =kCFStringEncodingWindowsCyrillic ;
+               break ;
+               case wxFONTENCODING_CP1252 : 
+               enc =kCFStringEncodingWindowsLatin1 ;
+               break ;
+               case wxFONTENCODING_CP1253 : 
+               enc = kCFStringEncodingWindowsGreek;
+               break ;
+               case wxFONTENCODING_CP1254 : 
+               enc = kCFStringEncodingWindowsLatin5;
+               break ;
+               case wxFONTENCODING_CP1255 : 
+               enc =kCFStringEncodingWindowsHebrew ;
+               break ;
+               case wxFONTENCODING_CP1256 : 
+               enc =kCFStringEncodingWindowsArabic ;
+               break ;
+               case wxFONTENCODING_CP1257 : 
+               enc = kCFStringEncodingWindowsBalticRim;
+               break ;
+               case wxFONTENCODING_UTF7 : 
+               enc = kCFStringEncodingNonLossyASCII ;
+               break ;
+               case wxFONTENCODING_UTF8 : 
+               enc = kCFStringEncodingUTF8 ;
+               break ;
+               case wxFONTENCODING_EUC_JP : 
+               enc = kCFStringEncodingEUC_JP;
+               break ;
+               case wxFONTENCODING_UTF16 : 
+            enc = kCFStringEncodingUnicode ;
+               break ;            
+        case wxFONTENCODING_MACROMAN :
+            enc = kCFStringEncodingMacRoman ;
+            break ;
+        case wxFONTENCODING_MACJAPANESE :
+            enc = kCFStringEncodingMacJapanese ;
+            break ;
+        case wxFONTENCODING_MACCHINESETRAD :
+            enc = kCFStringEncodingMacChineseTrad ;
+            break ;
+        case wxFONTENCODING_MACKOREAN :
+            enc = kCFStringEncodingMacKorean ;
+            break ;
+        case wxFONTENCODING_MACARABIC :
+            enc = kCFStringEncodingMacArabic ;
+            break ;
+        case wxFONTENCODING_MACHEBREW :
+            enc = kCFStringEncodingMacHebrew ;
+            break ;
+        case wxFONTENCODING_MACGREEK :
+            enc = kCFStringEncodingMacGreek ;
+            break ;
+        case wxFONTENCODING_MACCYRILLIC :
+            enc = kCFStringEncodingMacCyrillic ;
+            break ;
+        case wxFONTENCODING_MACDEVANAGARI :
+            enc = kCFStringEncodingMacDevanagari ;
+            break ;
+        case wxFONTENCODING_MACGURMUKHI :
+            enc = kCFStringEncodingMacGurmukhi ;
+            break ;
+        case wxFONTENCODING_MACGUJARATI :
+            enc = kCFStringEncodingMacGujarati ;
+            break ;
+        case wxFONTENCODING_MACORIYA :
+            enc = kCFStringEncodingMacOriya ;
+            break ;
+        case wxFONTENCODING_MACBENGALI :
+            enc = kCFStringEncodingMacBengali ;
+            break ;
+        case wxFONTENCODING_MACTAMIL :
+            enc = kCFStringEncodingMacTamil ;
+            break ;
+        case wxFONTENCODING_MACTELUGU :
+            enc = kCFStringEncodingMacTelugu ;
+            break ;
+        case wxFONTENCODING_MACKANNADA :
+            enc = kCFStringEncodingMacKannada ;
+            break ;
+        case wxFONTENCODING_MACMALAJALAM :
+            enc = kCFStringEncodingMacMalayalam ;
+            break ;
+        case wxFONTENCODING_MACSINHALESE :
+            enc = kCFStringEncodingMacSinhalese ;
+            break ;
+        case wxFONTENCODING_MACBURMESE :
+            enc = kCFStringEncodingMacBurmese ;
+            break ;
+        case wxFONTENCODING_MACKHMER :
+            enc = kCFStringEncodingMacKhmer ;
+            break ;
+        case wxFONTENCODING_MACTHAI :
+            enc = kCFStringEncodingMacThai ;
+            break ;
+        case wxFONTENCODING_MACLAOTIAN :
+            enc = kCFStringEncodingMacLaotian ;
+            break ;
+        case wxFONTENCODING_MACGEORGIAN :
+            enc = kCFStringEncodingMacGeorgian ;
+            break ;
+        case wxFONTENCODING_MACARMENIAN :
+            enc = kCFStringEncodingMacArmenian ;
+            break ;
+        case wxFONTENCODING_MACCHINESESIMP :
+            enc = kCFStringEncodingMacChineseSimp ;
+            break ;
+        case wxFONTENCODING_MACTIBETAN :
+            enc = kCFStringEncodingMacTibetan ;
+            break ;
+        case wxFONTENCODING_MACMONGOLIAN :
+            enc = kCFStringEncodingMacMongolian ;
+            break ;
+        case wxFONTENCODING_MACETHIOPIC :
+            enc = kCFStringEncodingMacEthiopic ;
+            break ;
+        case wxFONTENCODING_MACCENTRALEUR :
+            enc = kCFStringEncodingMacCentralEurRoman ;
+            break ;
+        case wxFONTENCODING_MACVIATNAMESE :
+            enc = kCFStringEncodingMacVietnamese ;
+            break ;
+        case wxFONTENCODING_MACARABICEXT :
+            enc = kCFStringEncodingMacExtArabic ;
+            break ;
+        case wxFONTENCODING_MACSYMBOL :
+            enc = kCFStringEncodingMacSymbol ;
+            break ;
+        case wxFONTENCODING_MACDINGBATS :
+            enc = kCFStringEncodingMacDingbats ;
+            break ;
+        case wxFONTENCODING_MACTURKISH :
+            enc = kCFStringEncodingMacTurkish ;
+            break ;
+        case wxFONTENCODING_MACCROATIAN :
+            enc = kCFStringEncodingMacCroatian ;
+            break ;
+        case wxFONTENCODING_MACICELANDIC :
+            enc = kCFStringEncodingMacIcelandic ;
+            break ;
+        case wxFONTENCODING_MACROMANIAN :
+            enc = kCFStringEncodingMacRomanian ;
+            break ;
+        case wxFONTENCODING_MACCELTIC :
+            enc = kCFStringEncodingMacCeltic ;
+            break ;
+        case wxFONTENCODING_MACGAELIC :
+            enc = kCFStringEncodingMacGaelic ;
+            break ;
+//        case wxFONTENCODING_MACKEYBOARD :
+//            enc = kCFStringEncodingMacKeyboardGlyphs ;
+//            break ;    
+               default :
+                       // because gcc is picky
+                       break ;
+       } ;
+       return enc ;
+}
+
+wxFontEncoding wxFontEncFromCFStringEnc(CFStringEncoding encoding)
+{      
+       wxFontEncoding enc = wxFONTENCODING_DEFAULT ;
+
+       switch( encoding)
+       {
+               case kCFStringEncodingISOLatin1  :
+               enc = wxFONTENCODING_ISO8859_1 ;
+               break ;
+               case kCFStringEncodingISOLatin2 :
+               enc = wxFONTENCODING_ISO8859_2;
+               break ;
+               case kCFStringEncodingISOLatin3 :
+               enc = wxFONTENCODING_ISO8859_3 ;
+               break ;
+               case kCFStringEncodingISOLatin4 :
+               enc = wxFONTENCODING_ISO8859_4;
+               break ;
+               case kCFStringEncodingISOLatinCyrillic :
+               enc = wxFONTENCODING_ISO8859_5;
+               break ;
+               case kCFStringEncodingISOLatinArabic :
+               enc = wxFONTENCODING_ISO8859_6;
+               break ;
+               case kCFStringEncodingISOLatinGreek :
+               enc = wxFONTENCODING_ISO8859_7;
+               break ;
+               case kCFStringEncodingISOLatinHebrew :
+               enc = wxFONTENCODING_ISO8859_8;
+               break ;
+               case kCFStringEncodingISOLatin5 :
+               enc = wxFONTENCODING_ISO8859_9;
+               break ;
+               case kCFStringEncodingISOLatin6 :
+               enc = wxFONTENCODING_ISO8859_10;
+               break ;
+               case kCFStringEncodingISOLatin7 :
+               enc = wxFONTENCODING_ISO8859_13;
+               break ;
+               case kCFStringEncodingISOLatin8 :
+               enc = wxFONTENCODING_ISO8859_14;
+               break ;
+               case kCFStringEncodingISOLatin9 :
+               enc =wxFONTENCODING_ISO8859_15 ;
+               break ;
+
+               case kCFStringEncodingKOI8_R :
+               enc = wxFONTENCODING_KOI8;
+               break ;
+
+//             case  : 
+//             enc = wxFONTENCODING_BULGARIAN;
+//             break ;
+
+               case kCFStringEncodingDOSLatinUS : 
+               enc = wxFONTENCODING_CP437;
+               break ;
+               case kCFStringEncodingDOSLatin1 :
+               enc = wxFONTENCODING_CP850;
+               break ;
+               case kCFStringEncodingDOSLatin2 : 
+               enc =wxFONTENCODING_CP852 ;
+               break ;
+               case kCFStringEncodingDOSCyrillic :
+               enc = wxFONTENCODING_CP855;
+               break ;
+               case kCFStringEncodingDOSRussian :
+               enc = wxFONTENCODING_CP866;
+               break ;
+               case kCFStringEncodingDOSThai :
+               enc =wxFONTENCODING_CP874 ;
+               break ;
+               case kCFStringEncodingDOSJapanese : 
+               enc = wxFONTENCODING_CP932;
+               break ;
+               case kCFStringEncodingDOSChineseSimplif : 
+               enc = wxFONTENCODING_CP936;
+               break ;
+               case kCFStringEncodingDOSKorean : 
+               enc = wxFONTENCODING_CP949;
+               break ;
+               case kCFStringEncodingDOSChineseTrad : 
+               enc = wxFONTENCODING_CP950;
+               break ;
+               
+               case kCFStringEncodingWindowsLatin2 : 
+               enc = wxFONTENCODING_CP1250;
+               break ;
+               case kCFStringEncodingWindowsCyrillic : 
+               enc = wxFONTENCODING_CP1251;
+               break ;
+               case kCFStringEncodingWindowsLatin1 : 
+               enc = wxFONTENCODING_CP1252;
+               break ;
+               case kCFStringEncodingWindowsGreek : 
+               enc = wxFONTENCODING_CP1253;
+               break ;
+               case kCFStringEncodingWindowsLatin5 : 
+               enc = wxFONTENCODING_CP1254;
+               break ;
+               case kCFStringEncodingWindowsHebrew : 
+               enc = wxFONTENCODING_CP1255;
+               break ;
+               case kCFStringEncodingWindowsArabic : 
+               enc = wxFONTENCODING_CP1256;
+               break ;
+               case kCFStringEncodingWindowsBalticRim : 
+               enc =wxFONTENCODING_CP1257 ;
+               break ;
+               case kCFStringEncodingEUC_JP : 
+               enc = wxFONTENCODING_EUC_JP;
+               break ;
+        case kCFStringEncodingUnicode :
+            enc = wxFONTENCODING_UTF16;
+            break;
+        case kCFStringEncodingMacRoman :
+            enc = wxFONTENCODING_MACROMAN ;
+            break ;
+        case kCFStringEncodingMacJapanese :
+            enc = wxFONTENCODING_MACJAPANESE ;
+            break ;
+        case kCFStringEncodingMacChineseTrad :
+            enc = wxFONTENCODING_MACCHINESETRAD ;
+            break ;
+        case kCFStringEncodingMacKorean :
+            enc = wxFONTENCODING_MACKOREAN ;
+            break ;
+        case kCFStringEncodingMacArabic :
+            enc =wxFONTENCODING_MACARABIC ;
+            break ;
+        case kCFStringEncodingMacHebrew :
+            enc = wxFONTENCODING_MACHEBREW ;
+            break ;
+        case kCFStringEncodingMacGreek :
+            enc = wxFONTENCODING_MACGREEK ;
+            break ;
+        case kCFStringEncodingMacCyrillic :
+            enc = wxFONTENCODING_MACCYRILLIC ;
+            break ;
+        case kCFStringEncodingMacDevanagari :
+            enc = wxFONTENCODING_MACDEVANAGARI ;
+            break ;
+        case kCFStringEncodingMacGurmukhi :
+            enc = wxFONTENCODING_MACGURMUKHI ;
+            break ;
+        case kCFStringEncodingMacGujarati :
+            enc = wxFONTENCODING_MACGUJARATI ;
+            break ;
+        case kCFStringEncodingMacOriya :
+            enc =wxFONTENCODING_MACORIYA ;
+            break ;
+        case kCFStringEncodingMacBengali :
+            enc =wxFONTENCODING_MACBENGALI ;
+            break ;
+        case kCFStringEncodingMacTamil :
+            enc = wxFONTENCODING_MACTAMIL ;
+            break ;
+        case kCFStringEncodingMacTelugu :
+            enc = wxFONTENCODING_MACTELUGU ;
+            break ;
+        case kCFStringEncodingMacKannada :
+            enc = wxFONTENCODING_MACKANNADA ;
+            break ;
+        case kCFStringEncodingMacMalayalam :
+            enc = wxFONTENCODING_MACMALAJALAM ;
+            break ;
+        case kCFStringEncodingMacSinhalese :
+            enc = wxFONTENCODING_MACSINHALESE ;
+            break ;
+        case kCFStringEncodingMacBurmese :
+            enc = wxFONTENCODING_MACBURMESE ;
+            break ;
+        case kCFStringEncodingMacKhmer :
+            enc = wxFONTENCODING_MACKHMER ;
+            break ;
+        case kCFStringEncodingMacThai :
+            enc = wxFONTENCODING_MACTHAI ;
+            break ;
+        case kCFStringEncodingMacLaotian :
+            enc = wxFONTENCODING_MACLAOTIAN ;
+            break ;
+        case kCFStringEncodingMacGeorgian :
+            enc = wxFONTENCODING_MACGEORGIAN ;
+            break ;
+        case kCFStringEncodingMacArmenian :
+            enc = wxFONTENCODING_MACARMENIAN ;
+            break ;
+        case kCFStringEncodingMacChineseSimp :
+            enc = wxFONTENCODING_MACCHINESESIMP ;
+            break ;
+        case kCFStringEncodingMacTibetan :
+            enc = wxFONTENCODING_MACTIBETAN ;
+            break ;
+        case kCFStringEncodingMacMongolian :
+            enc = wxFONTENCODING_MACMONGOLIAN ;
+            break ;
+        case kCFStringEncodingMacEthiopic :
+            enc = wxFONTENCODING_MACETHIOPIC ;
+            break ;
+        case kCFStringEncodingMacCentralEurRoman:
+            enc = wxFONTENCODING_MACCENTRALEUR  ;
+            break ;
+        case kCFStringEncodingMacVietnamese:
+            enc = wxFONTENCODING_MACVIATNAMESE  ;
+            break ;
+        case kCFStringEncodingMacExtArabic :
+            enc = wxFONTENCODING_MACARABICEXT ;
+            break ;
+        case kCFStringEncodingMacSymbol :
+            enc = wxFONTENCODING_MACSYMBOL ;
+            break ;
+        case kCFStringEncodingMacDingbats :
+            enc = wxFONTENCODING_MACDINGBATS ;
+            break ;
+        case kCFStringEncodingMacTurkish :
+            enc = wxFONTENCODING_MACTURKISH ;
+            break ;
+        case kCFStringEncodingMacCroatian :
+            enc = wxFONTENCODING_MACCROATIAN ;
+            break ;
+        case kCFStringEncodingMacIcelandic :
+            enc = wxFONTENCODING_MACICELANDIC ;
+            break ;
+        case kCFStringEncodingMacRomanian :
+            enc = wxFONTENCODING_MACROMANIAN ;
+            break ;
+        case kCFStringEncodingMacCeltic :
+            enc = wxFONTENCODING_MACCELTIC ;
+            break ;
+        case kCFStringEncodingMacGaelic :
+            enc = wxFONTENCODING_MACGAELIC ;
+            break ;
+//        case kCFStringEncodingMacKeyboardGlyphs :
+//            enc = wxFONTENCODING_MACKEYBOARD ;
+//            break ;       
+       } ;
+       return enc ;
+}
+
+class wxMBConv_cocoa : public wxMBConv
+{
+public:
+    wxMBConv_cocoa()
+    {
+        Init(CFStringGetSystemEncoding()) ;
+    }
+
+    wxMBConv_cocoa(const wxChar* name)
+    {
+        Init( wxCFStringEncFromFontEnc(wxFontMapper::Get()->CharsetToEncoding(name, false) ) ) ;
+    }
+
+    wxMBConv_cocoa(wxFontEncoding encoding)
+    {
+        Init( wxCFStringEncFromFontEnc(encoding) );
+    }
+
+    ~wxMBConv_cocoa()
+    {
+    }
+
+    void Init( CFStringEncoding encoding)
+    {
+        m_char_encoding = encoding ;
+        m_unicode_encoding = kCFStringEncodingUnicode;
+    }
+
+    size_t MB2WC(wchar_t * szOut, const char * szUnConv, size_t nOutSize) const
+    {
+        wxASSERT(szUnConv);
+        
+        size_t nBufSize = strlen(szUnConv) + 1;
+        size_t nRealOutSize;
+
+        UniChar* szUniCharBuffer       = (UniChar*) szOut; 
+        wchar_t* szConvBuffer          = szOut;
+        
+        if (szConvBuffer == NULL && nOutSize != 0)
+        {
+            szConvBuffer = new wchar_t[nOutSize] ;
+        }
+
+#if SIZEOF_WCHAR_T == 4
+        szUniCharBuffer = new UniChar[nOutSize];
+#endif
+
+        CFDataRef theData = CFDataCreateWithBytesNoCopy (
+                                            NULL,      //allocator 
+                                            (const UInt8*)szUnConv, 
+                                            nBufSize - 1,
+                                            NULL       //deallocator
+                                            ); 
+
+        wxASSERT(theData);
+
+        CFStringRef theString = CFStringCreateFromExternalRepresentation (
+                                                NULL,
+                                                theData,
+                                                m_char_encoding 
+                                                );
+
+        wxASSERT(theString);
+
+        if (nOutSize == 0)
+        {
+            nRealOutSize = CFStringGetLength(theString) + 1;
+            CFRelease(theString);
+            return nRealOutSize - 1;
+        }
+        
+        CFRange theRange = { 0, CFStringGetLength(theString) };
+        
+        CFStringGetCharacters(theString, theRange, szUniCharBuffer);
+        
+        
+        nRealOutSize = (CFStringGetLength(theString) + 1);
+        
+        CFRelease(theString);
+        
+        szUniCharBuffer[nRealOutSize-1] = '\0' ;
+
+#if SIZEOF_WCHAR_T == 4
+        wxMBConvUTF16 converter ;
+        converter.MB2WC(szConvBuffer  , (const char*)szUniCharBuffer , nRealOutSize ) ;
+        delete[] szUniCharBuffer;
+#endif
+        if ( szOut == NULL )
+            delete [] szConvBuffer;
+
+        return nRealOutSize ;
+    }
+
+    size_t WC2MB(char *szOut, const wchar_t *szUnConv, size_t nOutSize) const
+    {
+        size_t nBufSize = wxWcslen(szUnConv) + 1;
+        size_t nRealOutSize;
+        char* szBuffer = szOut;
+        UniChar* szUniBuffer = (UniChar*) szUnConv;
+        
+        if (szOut == NULL)
+        {
+            // worst case
+            nRealOutSize = ((nBufSize - 1) << 1)+1 ;
+            szBuffer = new char[ nRealOutSize ] ;
+        }
+        else
+            nRealOutSize = nOutSize;
+
+#if SIZEOF_WCHAR_T == 4
+        wxMBConvUTF16BE converter ;
+        nBufSize = converter.WC2MB( NULL , szUnConv , 0 );
+        szUniBuffer = new UniChar[ (nBufSize / sizeof(UniChar)) + 1] ;
+        converter.WC2MB( (char*) szUniBuffer , szUnConv, nBufSize + sizeof(UniChar)) ;
+        nBufSize /= sizeof(UniChar);
+        ++nBufSize;
+#endif
+
+        CFStringRef theString = CFStringCreateWithCharactersNoCopy(
+                                NULL, //allocator
+                                szUniBuffer,
+                                nBufSize,
+                                NULL //deallocator
+                            );
+        
+        wxASSERT(theString);
+        
+        //Note that CER puts a BOM when converting to unicode
+        //so we may want to check and use getchars instead in that case
+        CFDataRef theData = CFStringCreateExternalRepresentation(
+                                NULL, //allocator
+                                theString,
+                                m_char_encoding,
+                                0 //what to put in characters that can't be converted -
+                                    //0 tells CFString to return NULL if it meets such a character
+                        );
+
+        if(!theData)
+            return (size_t)-1;
+        
+        CFRelease(theString);
+        
+        nRealOutSize = CFDataGetLength(theData);
+
+        if ( szOut == NULL )
+            delete[] szBuffer;
+
+        if(nOutSize == 0)
+        {
+//TODO: This gets flagged as a non-malloced address by the debugger...
+//#if SIZEOF_WCHAR_T == 4
+//        delete[] szUniBuffer;
+//#endif
+            CFRelease(theData);
+            return nRealOutSize - 1;
+        }
+        
+        CFRange theRange = {0, CFDataGetLength(theData) };
+        CFDataGetBytes(theData, theRange, (UInt8*) szBuffer);
+            
+        CFRelease(theData);    
+        
+//TODO: This gets flagged as a non-malloced address by the debugger...
+//#if SIZEOF_WCHAR_T == 4
+//        delete[] szUniBuffer;
+//#endif
+        return  nRealOutSize - 1;
+    }
+
+    bool IsOk() const
+    { 
+        //TODO: check for invalid en/de/coding
+        return true; 
+    }
+
+private:
+    CFStringEncoding m_char_encoding ;
+    CFStringEncoding m_unicode_encoding ;
+};
+
+#endif // defined(__WXCOCOA__)
+
 // ============================================================================
 // Mac conversion classes
 // ============================================================================
@@ -1640,6 +2335,20 @@ wxMBConv *wxCSConv::DoCreate() const
         }
     }
 #endif
+#if defined(__WXCOCOA__)
+    {
+        if ( m_name || ( m_encoding <= wxFONTENCODING_UTF16 ) )
+        {
+
+            wxMBConv_cocoa *conv = m_name ? new wxMBConv_cocoa(m_name)
+                                          : new wxMBConv_cocoa(m_encoding);
+            if ( conv->IsOk() )
+                 return conv;
+
+            delete conv;
+        }
+    }
+#endif
     // step (2)
     wxFontEncoding enc = m_encoding;
 #if wxUSE_FONTMAP
index b27fbc79f133efa4cecc2818064683ab6ef11ec3..c4346c0116331fd9030b5597a95a53d737fd0471 100644 (file)
@@ -181,11 +181,13 @@ void StringTestCase::ConstructorsWithConversion()
 void StringTestCase::Conversion()
 {
 #if wxUSE_UNICODE
-        wxString szTheString(wxT("TheString"));
-        szTheString.insert(3, 1, '\0');
+        wxString szTheString(L"The\0String", wxConvLibc, 10);
         wxCharBuffer theBuffer = szTheString.mb_str();
         
         CPPUNIT_ASSERT( memcmp(theBuffer.data(), "The\0String", 11) == 0 );     
+
+        wxString szTheString2("The\0String", wxConvLocal, 10);
+        CPPUNIT_ASSERT( wxMemcmp(szTheString2.c_str(), L"The\0String", 11) == 0 );     
 #else
 #      if wxUSE_WCHAR_T
         wxString szTheString(wxT("TheString"));