]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/fontmap.cpp
Committing in .
[wxWidgets.git] / src / common / fontmap.cpp
index 13b709008275f3720f89420c0b67074197f25cb7..8b159319d4a0ae3d1f7f1c040f3355459c4c3927 100644 (file)
@@ -28,6 +28,8 @@
     #pragma hdrstop
 #endif
 
+#if wxUSE_FONTMAP
+
 #ifndef WX_PRECOMP
     #include "wx/app.h"
     #include "wx/log.h"
 // ----------------------------------------------------------------------------
 
 // the config paths we use
+#if wxUSE_CONFIG
 static const wxChar* FONTMAPPER_ROOT_PATH = wxT("/wxWindows/FontMapper");
 static const wxChar* FONTMAPPER_CHARSET_PATH = wxT("Charsets");
 static const wxChar* FONTMAPPER_CHARSET_ALIAS_PATH = wxT("Aliases");
+
+// we only ask questions in GUI mode
 #if wxUSE_GUI
     static const wxChar* FONTMAPPER_FONT_FROM_ENCODING_PATH = wxT("Encodings");
+    static const wxChar* FONTMAPPER_FONT_DONT_ASK = wxT("none");
 #endif // wxUSE_GUI
+#endif // wxUSE_CONFIG
 
 // encodings supported by GetEncodingDescription
 static wxFontEncoding gs_encodings[] =
@@ -129,21 +136,21 @@ static const wxChar* gs_encodingDescs[] =
 // and the internal names
 static const wxChar* gs_encodingNames[] =
 {
-    wxT( "iso8859-1" ),
-    wxT( "iso8859-2" ),
-    wxT( "iso8859-3" ),
-    wxT( "iso8859-4" ),
-    wxT( "iso8859-5" ),
-    wxT( "iso8859-6" ),
-    wxT( "iso8859-7" ),
-    wxT( "iso8859-8" ),
-    wxT( "iso8859-9" ),
-    wxT( "iso8859-10" ),
-    wxT( "iso8859-11" ),
-    wxT( "iso8859-12" ),
-    wxT( "iso8859-13" ),
-    wxT( "iso8859-14" ),
-    wxT( "iso8859-15" ),
+    wxT( "iso-8859-1" ),
+    wxT( "iso-8859-2" ),
+    wxT( "iso-8859-3" ),
+    wxT( "iso-8859-4" ),
+    wxT( "iso-8859-5" ),
+    wxT( "iso-8859-6" ),
+    wxT( "iso-8859-7" ),
+    wxT( "iso-8859-8" ),
+    wxT( "iso-8859-9" ),
+    wxT( "iso-8859-10" ),
+    wxT( "iso-8859-11" ),
+    wxT( "iso-8859-12" ),
+    wxT( "iso-8859-13" ),
+    wxT( "iso-8859-14" ),
+    wxT( "iso-8859-15" ),
     wxT( "koi8-r" ),
     wxT( "windows-1250" ),
     wxT( "windows-1251" ),
@@ -208,6 +215,7 @@ wxFontMapper::wxFontMapper()
 {
 #if wxUSE_CONFIG
     m_config = NULL;
+    m_configIsDummy = FALSE;
 #endif // wxUSE_CONFIG
 
 #if wxUSE_GUI
@@ -257,10 +265,27 @@ wxConfigBase *wxFontMapper::GetConfig()
             // but will allow us to remember the results of the questions at
             // least during this run
             m_config = new wxMemoryConfig;
-            wxConfig::Set(m_config);
+            m_configIsDummy = TRUE;
+            // VS: we can't call wxConfig::Set(m_config) here because that would
+            //     disable automatic wxConfig instance creation if this code was
+            //     called before wxApp::OnInit (this happens in wxGTK -- it sets
+            //     default wxFont encoding in wxApp::Initialize())
         }
     }
 
+    if ( m_configIsDummy && wxConfig::Get(FALSE) != NULL )
+    {
+        // VS: in case we created dummy m_config (see above), we want to switch back
+        //     to the real one as soon as one becomes available.
+        m_config = wxConfig::Get(FALSE);
+        m_configIsDummy = FALSE;
+        // FIXME: ideally, we should add keys from dummy config to the real one now,
+        //        but it is a low-priority task because typical wxWin application
+        //        either doesn't use wxConfig at all or creates wxConfig object in 
+        //        wxApp::OnInit(), before any real interaction with the user takes 
+        //        place...
+    }
+
     return m_config;
 }
 
@@ -692,33 +717,46 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
 
         RestorePath(pathOld);
 
-        if ( !!fontinfo && !!facename )
+        // this special value means that we don't know of fonts for this
+        // encoding but, moreover, have already asked the user as well and he
+        // didn't specify any font neither
+        if ( fontinfo == FONTMAPPER_FONT_DONT_ASK )
         {
-            // we tried to find a match with facename - now try without it
-            fontinfo = config->Read(encName);
+            interactive = FALSE;
         }
-
-        if ( !!fontinfo )
+        else // use the info entered the last time
         {
-            if ( info->FromString(fontinfo) )
+            if ( !!fontinfo && !!facename )
             {
-                if ( wxTestFontEncoding(*info) )
-                {
-                    // ok, got something
-                    return TRUE;
-                }
-                //else: no such fonts, look for something else
+                // we tried to find a match with facename - now try without it
+                fontinfo = config->Read(encName);
             }
-            else
+
+            if ( !!fontinfo )
             {
-                wxLogDebug(wxT("corrupted config data: string '%s' is not a valid font encoding info"), fontinfo.c_str());
+                if ( info->FromString(fontinfo) )
+                {
+                    if ( wxTestFontEncoding(*info) )
+                    {
+                        // ok, got something
+                        return TRUE;
+                    }
+                    //else: no such fonts, look for something else
+                    //      (should we erase the outdated value?)
+                }
+                else
+                {
+                    wxLogDebug(wxT("corrupted config data: string '%s' is not a valid font encoding info"),
+                               fontinfo.c_str());
+                }
             }
+            //else: there is no information in config about this encoding
         }
-        //else: there is no information in config about this encoding
     }
 #endif // wxUSE_CONFIG
 
     // ask the user
+#if wxUSE_FONTDLG
     if ( interactive )
     {
         wxString title(m_titleDialog);
@@ -727,7 +765,7 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
 
         // the message
         wxString msg;
-        msg.Printf(_("The encoding '%s' is unknown.\nWould you like to select a font to be used for this encoding\n(otherwise the text in this encoding will not be shown correctly)?"),
+        msg.Printf(_("No font for displaying text in encoding '%s' found.\nWould you like to select a font to be used for this encoding\n(otherwise the text in this encoding will not be shown correctly)?"),
                      GetEncodingDescription(encoding).c_str());
 
         wxWindow *parent = m_windowParent;
@@ -750,7 +788,7 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
                 info -> encoding = retData.GetEncoding();
 
 #if wxUSE_CONFIG
-            // remember this in the config
+                // remember this in the config
                 if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) )
                 {
                     GetConfig()->Write(configEntry, info->ToString());
@@ -763,9 +801,22 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
             }
             //else: the user canceled the font selection dialog
         }
-        //else: the user doesn't want to select a font
+        else
+        {
+            // the user doesn't want to select a font for this encoding,
+            // remember it to avoid asking the same question again later
+#if wxUSE_CONFIG
+            if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) )
+            {
+                GetConfig()->Write(configEntry, FONTMAPPER_FONT_DONT_ASK);
+
+                RestorePath(pathOld);
+            }
+#endif // wxUSE_CONFIG
+        }
     }
     //else: we're in non-interactive mode
+#endif // wxUSE_FONTDLG
 
     // now try the default mappings:
     wxFontEncodingArray equiv = wxEncodingConverter::GetAllEquivalents(encoding);
@@ -808,3 +859,5 @@ bool wxFontMapper::IsEncodingAvailable(wxFontEncoding encoding,
 }
 
 #endif // wxUSE_GUI
+
+#endif // wxUSE_FONTMAP