]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/fontmap.cpp
moved wxDash typedef to gdicmn.h
[wxWidgets.git] / src / common / fontmap.cpp
index 694bbc943f399e8c41ce1d86adb07d7593a01541..116565bbcfe8fcd3b12a987a0be31056a416ee5f 100644 (file)
@@ -36,6 +36,7 @@
 
 #include "wx/fontmap.h"
 #include "wx/config.h"
+#include "wx/memconf.h"
 
 #include "wx/msgdlg.h"
 #include "wx/fontdlg.h"
@@ -47,7 +48,7 @@
 // ----------------------------------------------------------------------------
 
 // the config paths we use
-static const wxChar* FONTMAPPER_ROOT_PATH = wxT("FontMapper");
+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");
 static const wxChar* FONTMAPPER_FONT_FROM_ENCODING_PATH = wxT("Encodings");
@@ -223,7 +224,18 @@ wxConfigBase *wxFontMapper::GetConfig()
     if ( !m_config )
     {
         // try the default
-        m_config = wxConfig::Get();
+        m_config = wxConfig::Get(FALSE /*don't create on demand*/ );
+
+        if ( !m_config )
+        {
+            // we still want to have a config object because otherwise we would
+            // keep asking the user the same questions in the interactive mode,
+            // so create a dummy config which won't write to any files/registry
+            // but will allow us to remember the results of the questions at
+            // least during this run
+            m_config = new wxMemoryConfig;
+            wxConfig::Set(m_config);
+        }
     }
 
     return m_config;
@@ -343,8 +355,9 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset,
             }
             else
             {
-                wxLogDebug(wxT("corrupted config data - invalid encoding %ld "
-                              "for charset '%s'"), value, charset.c_str());
+                wxLogDebug(wxT("corrupted config data: invalid encoding %ld "
+                               "for charset '%s' ignored"),
+                           value, charset.c_str());
             }
         }
 
@@ -426,16 +439,16 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset,
 
         // the message
         wxString msg;
-        msg.Printf(_("The charset '%s' is unknown. You may select another "
-                     "charset to replace it with or choose [Cancel] if it "
-                     "cannot be replaced"), charset.c_str());
+        msg.Printf(_("The charset '%s' is unknown. You may select\n"
+                     "another charset to replace it with or choose\n"
+                     "[Cancel] if it cannot be replaced"), charset.c_str());
 
         // the list of choices
         size_t count = WXSIZEOF(gs_encodingDescs);
 
         wxASSERT_MSG( count == WXSIZEOF(gs_encodings),
                       wxT("inconsitency detected - forgot to update one of "
-                         "the arrays?") );
+                          "the arrays?") );
 
         wxString *encodingNamesTranslated = new wxString[count];
 
@@ -459,9 +472,22 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset,
 
         if ( n != -1 )
         {
-            // TODO save the result in the config!
-
             encoding = gs_encodings[n];
+
+            // save the result in the config now
+            if ( ChangePath(FONTMAPPER_CHARSET_PATH, &pathOld) )
+            {
+                wxConfigBase *config = GetConfig();
+
+                // remember the alt encoding for this charset
+                if ( !config->Write(charset, (long)encoding) )
+                {
+                    wxLogError(_("Failed to remember the encoding "
+                                 "for the charset '%s'."), charset.c_str());
+                }
+
+                RestorePath(pathOld);
+            }
         }
         //else: cancelled
     }
@@ -521,7 +547,12 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
         // wxFatalError doesn't return
     }
 
-    wxString configEntry = facename + _T("_") + GetEncodingName(encoding);
+    wxString configEntry, encName = GetEncodingName(encoding);
+    if ( !!facename )
+    {
+        configEntry = facename + _T("_");
+    }
+    configEntry += encName;
 
     // do we have a font spec for this encoding?
     wxString pathOld;
@@ -533,6 +564,12 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
 
         RestorePath(pathOld);
 
+        if ( !!fontinfo && !!facename )
+        {
+            // we tried to find a match with facename - now try without it
+            fontinfo = config->Read(encName);
+        }
+
         if ( !!fontinfo )
         {
             if ( info->FromString(fontinfo) )
@@ -550,6 +587,7 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
                               "a valid font encoding info"), fontinfo.c_str());
             }
         }
+        //else: there is no information in config about this encoding
     }
 
     // ask the user
@@ -606,9 +644,12 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
 
     // now try the default mappings:
     wxFontEncodingArray equiv = wxEncodingConverter::GetAllEquivalents(encoding);
-    for ( unsigned i = (equiv[0] == encoding) ? 1 : 0; i < equiv.GetCount(); i++ )
+    size_t count = equiv.GetCount();
+    for ( size_t i = (equiv[0] == encoding) ? 1 : 0; i < count; i++ )
+    {
         if ( TestAltEncoding(configEntry, equiv[i], info) )
             return TRUE;
+    }
 
     return FALSE;
 }