]> git.saurik.com Git - wxWidgets.git/commitdiff
better font round-trip fidelity (native->wx->native), fixing fontdialog for osx_cocoa...
authorStefan Csomor <csomor@advancedconcepts.ch>
Fri, 3 Jul 2009 07:13:53 +0000 (07:13 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Fri, 3 Jul 2009 07:13:53 +0000 (07:13 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61298 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/osx/carbon/fontdlgosx.mm
src/osx/carbon/utilscocoa.mm

index 0fa7163333def6413a3f0fafbe2422be403f0f58..7890a015d674525d4ae5c9cc5db19aa5decaf232 100644 (file)
 
 extern "C" int RunMixedFontDialog(wxFontDialog* dialog) ;
 
-int RunMixedFontDialog(wxFontDialog* WXUNUSED(dialog))
+int RunMixedFontDialog(wxFontDialog* dialog)
 {
+#if wxOSX_USE_COCOA
+    wxFontData& fontdata= ((wxFontDialog*)dialog)->GetFontData() ;
+#else
+    wxUnusedVar(dialog);
+#endif
     int retval = wxID_CANCEL ;
 
-    if ( !NSApplicationLoad() )
-    {
-        wxFAIL_MSG("Couldn't load Cocoa in Carbon Environment");
-    }
-
     wxAutoNSAutoreleasePool pool;
 
     // setting up the ok/cancel buttons
@@ -172,11 +172,34 @@ int RunMixedFontDialog(wxFontDialog* WXUNUSED(dialog))
     }
 
     [accessoryView resetFlags];
+#if wxOSX_USE_COCOA
+    wxFont font = *wxNORMAL_FONT ;
+    if ( fontdata.m_initialFont.Ok() )
+    {
+        font = fontdata.m_initialFont ;
+    }
 
-    NSModalSession session = [NSApp beginModalSessionForWindow:fontPanel];
+    [[NSFontPanel sharedFontPanel] setPanelFont: font.OSXGetNSFont() isMultiple:NO];
 
-    [NSApp runModalSession:session];
+    if(fontdata.m_fontColour.Ok())
+        [[NSColorPanel sharedColorPanel] setColor:
+            [NSColor colorWithCalibratedRed:fontdata.m_fontColour.Red() / 255.0
+                                        green:fontdata.m_fontColour.Green() / 255.0
+                                        blue:fontdata.m_fontColour.Blue() / 255.0
+                                        alpha:1.0]
+        ];
+    else
+        [[NSColorPanel sharedColorPanel] setColor:[NSColor blackColor]];
+#endif
+
+    NSModalSession session = [NSApp beginModalSessionForWindow:fontPanel];
 
+    for (;;) 
+    {
+        if ([NSApp runModalSession:session] != NSRunContinuesResponse)
+            break;
+    }
+    
     [NSApp endModalSession:session];
 
     // if we don't reenable it, FPShowHideFontPanel does not work
@@ -184,13 +207,41 @@ int RunMixedFontDialog(wxFontDialog* WXUNUSED(dialog))
 #if wxOSX_USE_CARBON
     if( FPIsFontPanelVisible())
         FPShowHideFontPanel() ;
+#else
+    [fontPanel close];
 #endif
 
     if ( [accessoryView closedWithOk])
     {
+#if wxOSX_USE_COCOA
+        NSFont* theFont = [fontPanel panelConvertFont:[NSFont userFontOfSize:0]];
+
+        //Get more information about the user's chosen font
+        NSFontTraitMask theTraits = [[NSFontManager sharedFontManager] traitsOfFont:theFont];
+        int theFontWeight = [[NSFontManager sharedFontManager] weightOfFont:theFont];
+        int theFontSize = (int) [theFont pointSize];
+
+        wxFontFamily fontFamily = wxFONTFAMILY_DEFAULT;
+        //Set the wx font to the appropriate data
+        if(theTraits & NSFixedPitchFontMask)
+            fontFamily = wxFONTFAMILY_TELETYPE;
+
+        fontdata.m_chosenFont = wxFont( theFontSize, fontFamily,
+            theTraits & NSItalicFontMask ? wxFONTSTYLE_ITALIC : 0,
+            theFontWeight < 5 ? wxLIGHT : theFontWeight >= 9 ? wxBOLD : wxNORMAL,
+            false, wxStringWithNSString([theFont familyName]) );
+
+        //Get the shared color panel along with the chosen color and set the chosen color
+        NSColor* theColor = [[[NSColorPanel sharedColorPanel] color] colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
+
+        fontdata.m_fontColour.Set((unsigned char) ([theColor redComponent] * 255.0),
+                                    (unsigned char) ([theColor greenComponent] * 255.0),
+                                    (unsigned char) ([theColor blueComponent] * 255.0));
+#endif
         retval = wxID_OK ;
     }
-
+    [fontPanel setAccessoryView:nil];
+    [accessoryView release];
 
     return retval ;
 }
@@ -334,18 +385,6 @@ bool wxFontDialog::Create(wxWindow *parent, const wxFontData& data)
 {
     m_fontData = data;
 
-    //
-    //  This is the key call - this initializes
-    //  events and window stuff for cocoa for carbon
-    //  applications.
-    //
-    //  This is also the only call here that is
-    //  10.2+ specific (the rest is OSX only),
-    //  which, ironically, the carbon font
-    //  panel requires.
-    //
-    bool bOK = NSApplicationLoad();
-
     //autorelease pool - req'd for carbon
     NSAutoreleasePool *thePool;
     thePool = [[NSAutoreleasePool alloc] init];
@@ -396,7 +435,7 @@ bool wxFontDialog::Create(wxWindow *parent, const wxFontData& data)
     //We're done - free up the pool
     [thePool release];
 
-    return bOK;
+    return true;
 }
 
 int wxFontDialog::ShowModal()
index 4fd68fff45965729d306518909a53d60112950ed..25ec0b1e7eb8f8aceeb147ff9cdac820a3f0d2c0 100644 (file)
@@ -166,18 +166,29 @@ WX_NSFont wxFont::OSXCreateNSFont(wxOSXSystemFont font, wxNativeFontInfo* info)
 
 void wxNativeFontInfo::OSXValidateNSFontDescriptor()
 {
-    NSFontDescriptor* desc  = [NSFontDescriptor fontDescriptorWithName:wxCFStringRef(m_faceName).AsNSString() size:m_pointSize];
+    NSFontDescriptor* desc  = nil;
     NSFontSymbolicTraits traits = 0;
+    float weight = 0; 
 
     if (m_weight == wxFONTWEIGHT_BOLD)
+    {
         traits |= NSFontBoldTrait;
+        weight = 1.0;
+    }
+    else if (m_weight == wxFONTWEIGHT_LIGHT)
+        weight = -1;
+    
     if (m_style == wxFONTSTYLE_ITALIC || m_style == wxFONTSTYLE_SLANT)
         traits |= NSFontItalicTrait;
 
-    if ( traits != 0 )
-    {
-        desc = [desc fontDescriptorWithSymbolicTraits:traits];
-    }
+    desc = [NSFontDescriptor fontDescriptorWithFontAttributes:
+        [[NSDictionary alloc] initWithObjectsAndKeys:
+            wxCFStringRef(m_faceName).AsNSString(), NSFontFamilyAttribute, 
+            [NSNumber numberWithFloat:m_pointSize], NSFontSizeAttribute, 
+            [NSNumber numberWithUnsignedInt:traits], NSFontSymbolicTrait, 
+            [NSNumber numberWithFloat:weight],NSFontWeightTrait,
+            nil]];
+
     wxMacCocoaRetain(desc);
     m_nsFontDescriptor = desc;
 }