cocoa doesn't need system framework - string conversion for cocoa - focus for cocoa - a bit of change for string unit tests for new functionality

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29780 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Ryan Norton 2004-10-11 02:02:30 +00:00
parent 80389ff709
commit f7e98dee7e
7 changed files with 740 additions and 7 deletions

4
configure vendored
View File

@ -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"

View 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

View 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; }

View 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);

View 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()

View 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

View 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"));