]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/fontmap.cpp
Stupid bug: using LastError() instead of Error()
[wxWidgets.git] / src / common / fontmap.cpp
index 05b1edd2abc9fdcfccb57be33b6955fe4f1adb05..116565bbcfe8fcd3b12a987a0be31056a416ee5f 100644 (file)
@@ -36,6 +36,7 @@
 
 #include "wx/fontmap.h"
 #include "wx/config.h"
 
 #include "wx/fontmap.h"
 #include "wx/config.h"
+#include "wx/memconf.h"
 
 #include "wx/msgdlg.h"
 #include "wx/fontdlg.h"
 
 #include "wx/msgdlg.h"
 #include "wx/fontdlg.h"
@@ -47,7 +48,7 @@
 // ----------------------------------------------------------------------------
 
 // the config paths we use
 // ----------------------------------------------------------------------------
 
 // 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");
 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
     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;
     }
 
     return m_config;
@@ -343,8 +355,9 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset,
             }
             else
             {
             }
             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;
 
         // 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 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];
 
 
         wxString *encodingNamesTranslated = new wxString[count];
 
@@ -459,9 +472,22 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset,
 
         if ( n != -1 )
         {
 
         if ( n != -1 )
         {
-            // TODO save the result in the config!
-
             encoding = gs_encodings[n];
             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
     }
         }
         //else: cancelled
     }
@@ -498,10 +524,13 @@ bool wxFontMapper::TestAltEncoding(const wxString& configEntry,
 
 bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
                                      wxNativeEncodingInfo *info,
 
 bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
                                      wxNativeEncodingInfo *info,
+                                     const wxString& facename,
                                      bool interactive)
 {
     wxCHECK_MSG( info, FALSE, wxT("bad pointer in GetAltForEncoding") );
 
                                      bool interactive)
 {
     wxCHECK_MSG( info, FALSE, wxT("bad pointer in GetAltForEncoding") );
 
+    info->facename = facename;
+
     if ( encoding == wxFONTENCODING_DEFAULT )
     {
         encoding = wxFont::GetDefaultEncoding();
     if ( encoding == wxFONTENCODING_DEFAULT )
     {
         encoding = wxFont::GetDefaultEncoding();
@@ -518,7 +547,12 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
         // wxFatalError doesn't return
     }
 
         // wxFatalError doesn't return
     }
 
-    wxString configEntry = 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;
 
     // do we have a font spec for this encoding?
     wxString pathOld;
@@ -530,6 +564,12 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
 
         RestorePath(pathOld);
 
 
         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) )
         if ( !!fontinfo )
         {
             if ( info->FromString(fontinfo) )
@@ -547,6 +587,7 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
                               "a valid font encoding info"), fontinfo.c_str());
             }
         }
                               "a valid font encoding info"), fontinfo.c_str());
             }
         }
+        //else: there is no information in config about this encoding
     }
 
     // ask the user
     }
 
     // ask the user
@@ -582,6 +623,7 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
                 wxFont font = retData.GetChosenFont();
 
                 *info = retData.EncodingInfo();
                 wxFont font = retData.GetChosenFont();
 
                 *info = retData.EncodingInfo();
+                info -> encoding = retData.GetEncoding();
 
                 // remember this in the config
                 if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) )
 
                 // remember this in the config
                 if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) )
@@ -601,11 +643,42 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
 
 
     // now try the default mappings:
 
 
     // now try the default mappings:
-    
     wxFontEncodingArray equiv = wxEncodingConverter::GetAllEquivalents(encoding);
     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;
         if ( TestAltEncoding(configEntry, equiv[i], info) )
             return TRUE;
+    }
 
     return FALSE;
 }
 
     return FALSE;
 }
+
+
+
+bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
+                                     wxFontEncoding *alt_encoding,
+                                     const wxString& facename,
+                                     bool interactive)
+{
+    wxNativeEncodingInfo info;
+    bool r = GetAltForEncoding(encoding, &info, facename, interactive);
+    *alt_encoding = info.encoding;
+    return r;
+}
+
+
+
+bool wxFontMapper::IsEncodingAvailable(wxFontEncoding encoding,
+                                       const wxString& facename)
+{
+    wxNativeEncodingInfo info;
+
+    if (wxGetNativeFontEncoding(encoding, &info))
+    {
+        info.facename = facename;
+        return wxTestFontEncoding(info);
+    }
+    else
+        return FALSE;
+}