]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/utilscocoa.mm
Add wxTextEntryBase::ForwardEnableTextChangedEvents().
[wxWidgets.git] / src / osx / carbon / utilscocoa.mm
index 25ec0b1e7eb8f8aceeb147ff9cdac820a3f0d2c0..c787a15a336ae56a19b540f79feda2efa5c3e7ae 100644 (file)
@@ -55,12 +55,12 @@ CGContextRef wxOSXGetContextFromCurrentContext()
     return context;
 }
 
     return context;
 }
 
-bool wxOSXLockFocus( WXWidget view) 
+bool wxOSXLockFocus( WXWidget view)
 {
     return [view lockFocusIfCanDraw];
 }
 
 {
     return [view lockFocusIfCanDraw];
 }
 
-void wxOSXUnlockFocus( WXWidget view) 
+void wxOSXUnlockFocus( WXWidget view)
 {
     [view unlockFocus];
 }
 {
     [view unlockFocus];
 }
@@ -102,6 +102,40 @@ void* wxMacCocoaRetain( void* obj )
 // ----------------------------------------------------------------------------
 
 #if wxOSX_USE_COCOA
 // ----------------------------------------------------------------------------
 
 #if wxOSX_USE_COCOA
+wxFont::wxFont(WX_NSFont nsfont)
+{
+    [nsfont retain];
+    wxNativeFontInfo info;
+    SetNativeInfoFromNSFont(nsfont, &info);
+    Create(info);
+}
+
+void wxFont::SetNativeInfoFromNSFont(WX_NSFont nsfont, wxNativeFontInfo* info)
+{   
+    NSFontDescriptor*desc = [[nsfont fontDescriptor] retain];
+    if ( info->m_faceName.empty())
+    {
+        wxFontStyle fontstyle = wxFONTSTYLE_NORMAL;
+        wxFontWeight fontweight = wxFONTWEIGHT_NORMAL;
+        bool underlined = false;
+
+        int size = (int) ([desc pointSize]+0.5);
+        NSFontSymbolicTraits traits = [desc symbolicTraits];
+
+        if ( traits & NSFontBoldTrait )
+            fontweight = wxFONTWEIGHT_BOLD ;
+        else
+            fontweight = wxFONTWEIGHT_NORMAL ;
+        if ( traits & NSFontItalicTrait )
+            fontstyle = wxFONTSTYLE_ITALIC ;
+
+        wxCFStringRef fontname( [desc postscriptName] );
+        info->Init(size,wxFONTFAMILY_DEFAULT,fontstyle,fontweight,underlined,
+            fontname.AsString(), wxFONTENCODING_DEFAULT);
+
+    }
+    info->m_nsFontDescriptor = desc;
+}
 
 WX_NSFont wxFont::OSXCreateNSFont(wxOSXSystemFont font, wxNativeFontInfo* info)
 {
 
 WX_NSFont wxFont::OSXCreateNSFont(wxOSXSystemFont font, wxNativeFontInfo* info)
 {
@@ -138,29 +172,7 @@ WX_NSFont wxFont::OSXCreateNSFont(wxOSXSystemFont font, wxNativeFontInfo* info)
             break;
     }
     [nsfont retain];
             break;
     }
     [nsfont retain];
-    NSFontDescriptor*desc = [[nsfont fontDescriptor] retain];
-    if ( info->m_faceName.empty())
-    {
-        wxFontStyle fontstyle = wxFONTSTYLE_NORMAL;
-        wxFontWeight fontweight = wxFONTWEIGHT_NORMAL;
-        bool underlined = false;
-        
-        int size = (int) ([desc pointSize]+0.5);
-        NSFontSymbolicTraits traits = [desc symbolicTraits];
-            
-        if ( traits & NSFontBoldTrait )
-            fontweight = wxFONTWEIGHT_BOLD ;
-        else
-            fontweight = wxFONTWEIGHT_NORMAL ;
-        if ( traits & NSFontItalicTrait )
-            fontstyle = wxFONTSTYLE_ITALIC ;
-             
-        wxCFStringRef fontname( [desc postscriptName] );
-        info->Init(size,wxFONTFAMILY_DEFAULT,fontstyle,fontweight,underlined,
-            fontname.AsString(), wxFONTENCODING_DEFAULT);
-        
-    }
-    info->m_nsFontDescriptor = desc;
+    SetNativeInfoFromNSFont(nsfont, info);
     return nsfont;
 }
 
     return nsfont;
 }
 
@@ -168,7 +180,7 @@ void wxNativeFontInfo::OSXValidateNSFontDescriptor()
 {
     NSFontDescriptor* desc  = nil;
     NSFontSymbolicTraits traits = 0;
 {
     NSFontDescriptor* desc  = nil;
     NSFontSymbolicTraits traits = 0;
-    float weight = 0; 
+    float weight = 0;
 
     if (m_weight == wxFONTWEIGHT_BOLD)
     {
 
     if (m_weight == wxFONTWEIGHT_BOLD)
     {
@@ -177,15 +189,15 @@ void wxNativeFontInfo::OSXValidateNSFontDescriptor()
     }
     else if (m_weight == wxFONTWEIGHT_LIGHT)
         weight = -1;
     }
     else if (m_weight == wxFONTWEIGHT_LIGHT)
         weight = -1;
-    
+
     if (m_style == wxFONTSTYLE_ITALIC || m_style == wxFONTSTYLE_SLANT)
         traits |= NSFontItalicTrait;
 
     desc = [NSFontDescriptor fontDescriptorWithFontAttributes:
     if (m_style == wxFONTSTYLE_ITALIC || m_style == wxFONTSTYLE_SLANT)
         traits |= NSFontItalicTrait;
 
     desc = [NSFontDescriptor fontDescriptorWithFontAttributes:
-        [[NSDictionary alloc] initWithObjectsAndKeys:
-            wxCFStringRef(m_faceName).AsNSString(), NSFontFamilyAttribute, 
-            [NSNumber numberWithFloat:m_pointSize], NSFontSizeAttribute, 
-            [NSNumber numberWithUnsignedInt:traits], NSFontSymbolicTrait, 
+        [NSDictionary dictionaryWithObjectsAndKeys:
+            wxCFStringRef(m_faceName).AsNSString(), NSFontFamilyAttribute,
+            [NSNumber numberWithFloat:m_pointSize], NSFontSizeAttribute,
+            [NSNumber numberWithUnsignedInt:traits], NSFontSymbolicTrait,
             [NSNumber numberWithFloat:weight],NSFontWeightTrait,
             nil]];
 
             [NSNumber numberWithFloat:weight],NSFontWeightTrait,
             nil]];
 
@@ -237,11 +249,11 @@ WX_UIFont wxFont::OSXCreateUIFont(wxOSXSystemFont font, wxNativeFontInfo* info)
         wxFontStyle fontstyle = wxFONTSTYLE_NORMAL;
         wxFontWeight fontweight = wxFONTWEIGHT_NORMAL;
         bool underlined = false;
         wxFontStyle fontstyle = wxFONTSTYLE_NORMAL;
         wxFontWeight fontweight = wxFONTWEIGHT_NORMAL;
         bool underlined = false;
-        
+
         int size = (int) ([uifont pointSize]+0.5);
         /*
         NSFontSymbolicTraits traits = [desc symbolicTraits];
         int size = (int) ([uifont pointSize]+0.5);
         /*
         NSFontSymbolicTraits traits = [desc symbolicTraits];
-            
+
         if ( traits & NSFontBoldTrait )
             fontweight = wxFONTWEIGHT_BOLD ;
         else
         if ( traits & NSFontBoldTrait )
             fontweight = wxFONTWEIGHT_BOLD ;
         else
@@ -249,10 +261,10 @@ WX_UIFont wxFont::OSXCreateUIFont(wxOSXSystemFont font, wxNativeFontInfo* info)
         if ( traits & NSFontItalicTrait )
             fontstyle = wxFONTSTYLE_ITALIC ;
         */
         if ( traits & NSFontItalicTrait )
             fontstyle = wxFONTSTYLE_ITALIC ;
         */
-        wxCFStringRef fontname( [uifont familyName] );
+        wxCFStringRef fontname( wxCFRetain([uifont familyName]) );
         info->Init(size,wxFONTFAMILY_DEFAULT,fontstyle,fontweight,underlined,
             fontname.AsString(), wxFONTENCODING_DEFAULT);
         info->Init(size,wxFONTFAMILY_DEFAULT,fontstyle,fontweight,underlined,
             fontname.AsString(), wxFONTENCODING_DEFAULT);
-        
+
     }
     return uifont;
 }
     }
     return uifont;
 }
@@ -270,26 +282,37 @@ WX_UIFont wxFont::OSXCreateUIFont(const wxNativeFontInfo* info)
 // NSImage Utils
 // ----------------------------------------------------------------------------
 
 // NSImage Utils
 // ----------------------------------------------------------------------------
 
+#if wxOSX_USE_IPHONE
+
+WX_UIImage  wxOSXCreateUIImageFromCGImage( CGImageRef image )
+{
+    UIImage  *newImage = [UIImage imageWithCGImage:image];
+    [newImage autorelease];
+    return( newImage );
+}
+
+#endif
+
 #if wxOSX_USE_COCOA
 
 //  From "Cocoa Drawing Guide:Working with Images"
 WX_NSImage  wxOSXCreateNSImageFromCGImage( CGImageRef image )
 {
     NSRect      imageRect    = NSMakeRect(0.0, 0.0, 0.0, 0.0);
 #if wxOSX_USE_COCOA
 
 //  From "Cocoa Drawing Guide:Working with Images"
 WX_NSImage  wxOSXCreateNSImageFromCGImage( CGImageRef image )
 {
     NSRect      imageRect    = NSMakeRect(0.0, 0.0, 0.0, 0.0);
-    
+
     // Get the image dimensions.
     imageRect.size.height = CGImageGetHeight(image);
     imageRect.size.width = CGImageGetWidth(image);
     // Get the image dimensions.
     imageRect.size.height = CGImageGetHeight(image);
     imageRect.size.width = CGImageGetWidth(image);
-    
+
     // Create a new image to receive the Quartz image data.
     // Create a new image to receive the Quartz image data.
-    NSImage  *newImage = [[NSImage alloc] initWithSize:imageRect.size]; 
+    NSImage  *newImage = [[NSImage alloc] initWithSize:imageRect.size];
     [newImage lockFocus];
     [newImage lockFocus];
-    
+
     // Get the Quartz context and draw.
     CGContextRef  imageContext = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
     CGContextDrawImage( imageContext, *(CGRect*)&imageRect, image );
     [newImage unlockFocus];
     // Get the Quartz context and draw.
     CGContextRef  imageContext = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
     CGContextDrawImage( imageContext, *(CGRect*)&imageRect, image );
     [newImage unlockFocus];
-    
+
     /*
         // Create a bitmap rep from the image...
         NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:cgImage];
     /*
         // Create a bitmap rep from the image...
         NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:cgImage];
@@ -302,6 +325,25 @@ WX_NSImage  wxOSXCreateNSImageFromCGImage( CGImageRef image )
     return( newImage );
 }
 
     return( newImage );
 }
 
+CGImageRef wxOSXCreateCGImageFromNSImage( WX_NSImage nsimage )
+{
+    // based on http://www.mail-archive.com/cocoa-dev@lists.apple.com/msg18065.html
+    
+    NSSize imageSize = [nsimage size];
+    CGColorSpaceRef genericRGB = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 
+    CGContextRef context = CGBitmapContextCreate(NULL, imageSize.width, imageSize.height, 8, 0, genericRGB, kCGImageAlphaPremultipliedFirst); 
+    NSGraphicsContext *nsGraphicsContext = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:NO];
+    [NSGraphicsContext saveGraphicsState];
+    [NSGraphicsContext setCurrentContext:nsGraphicsContext];
+    [[NSColor whiteColor] setFill];
+    NSRectFill(NSMakeRect(0.0, 0.0, imageSize.width, imageSize.height));
+    [nsimage drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];
+    [NSGraphicsContext setCurrentContext:nsGraphicsContext];
+    CGImageRef image = CGBitmapContextCreateImage(context);
+    CFRelease(context);
+    return image;
+ }
+
 // ----------------------------------------------------------------------------
 // NSCursor Utils
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // NSCursor Utils
 // ----------------------------------------------------------------------------
@@ -425,7 +467,7 @@ WX_NSCursor wxMacCocoaCreateStockCursor( int cursor_type )
     case wxCURSOR_HAND:
         cursor = [[NSCursor pointingHandCursor] retain];
         break;
     case wxCURSOR_HAND:
         cursor = [[NSCursor pointingHandCursor] retain];
         break;
-        
+
     case wxCURSOR_BULLSEYE:
         cursor = wxGetStockCursor(kwxCursorBullseye);
         break;
     case wxCURSOR_BULLSEYE:
         cursor = wxGetStockCursor(kwxCursorBullseye);
         break;
@@ -494,19 +536,19 @@ WX_NSCursor wxMacCocoaCreateStockCursor( int cursor_type )
 WX_NSCursor  wxMacCocoaCreateCursorFromCGImage( CGImageRef cgImageRef, float hotSpotX, float hotSpotY )
 {
     static BOOL    firstTime  = YES;
 WX_NSCursor  wxMacCocoaCreateCursorFromCGImage( CGImageRef cgImageRef, float hotSpotX, float hotSpotY )
 {
     static BOOL    firstTime  = YES;
-    
+
     if ( firstTime )
     {
         //  Must first call [[[NSWindow alloc] init] release] to get the NSWindow machinery set up so that NSCursor can use a window to cache the cursor image
         [[[NSWindow alloc] init] release];
         firstTime = NO;
     }
     if ( firstTime )
     {
         //  Must first call [[[NSWindow alloc] init] release] to get the NSWindow machinery set up so that NSCursor can use a window to cache the cursor image
         [[[NSWindow alloc] init] release];
         firstTime = NO;
     }
-    
+
     NSImage    *nsImage  = wxOSXCreateNSImageFromCGImage( cgImageRef );
     NSCursor  *cursor    = [[NSCursor alloc] initWithImage:nsImage hotSpot:NSMakePoint( hotSpotX, hotSpotY )];
     NSImage    *nsImage  = wxOSXCreateNSImageFromCGImage( cgImageRef );
     NSCursor  *cursor    = [[NSCursor alloc] initWithImage:nsImage hotSpot:NSMakePoint( hotSpotX, hotSpotY )];
-    
+
     [nsImage release];
     [nsImage release];
-    
+
     return cursor;
 }
 
     return cursor;
 }