]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/fontmap.cpp
added wxEXEC_NOHIDE flag, modified wxExecute() to take a combination of bit flags...
[wxWidgets.git] / src / common / fontmap.cpp
index 8b159319d4a0ae3d1f7f1c040f3355459c4c3927..022d92d0e3925707e5beec033e65b2f4cf27401a 100644 (file)
@@ -88,6 +88,10 @@ static wxFontEncoding gs_encodings[] =
     wxFONTENCODING_ISO8859_14,
     wxFONTENCODING_ISO8859_15,
     wxFONTENCODING_KOI8,
     wxFONTENCODING_ISO8859_14,
     wxFONTENCODING_ISO8859_15,
     wxFONTENCODING_KOI8,
+    wxFONTENCODING_CP932,
+    wxFONTENCODING_CP936,
+    wxFONTENCODING_CP949,
+    wxFONTENCODING_CP950,
     wxFONTENCODING_CP1250,
     wxFONTENCODING_CP1251,
     wxFONTENCODING_CP1252,
     wxFONTENCODING_CP1250,
     wxFONTENCODING_CP1251,
     wxFONTENCODING_CP1252,
@@ -120,6 +124,10 @@ static const wxChar* gs_encodingDescs[] =
     wxTRANSLATE( "Celtic (ISO-8859-14)" ),
     wxTRANSLATE( "Western European with Euro (ISO-8859-15)" ),
     wxTRANSLATE( "KOI8-R" ),
     wxTRANSLATE( "Celtic (ISO-8859-14)" ),
     wxTRANSLATE( "Western European with Euro (ISO-8859-15)" ),
     wxTRANSLATE( "KOI8-R" ),
+    wxTRANSLATE( "Windows Japanese (CP 932)" ),
+    wxTRANSLATE( "Windows Chinese Simplified (CP 936)" ),
+    wxTRANSLATE( "Windows Korean (CP 949)" ),
+    wxTRANSLATE( "Windows Chinese Traditional (CP 950)" ),
     wxTRANSLATE( "Windows Central European (CP 1250)" ),
     wxTRANSLATE( "Windows Cyrillic (CP 1251)" ),
     wxTRANSLATE( "Windows Western European (CP 1252)" ),
     wxTRANSLATE( "Windows Central European (CP 1250)" ),
     wxTRANSLATE( "Windows Cyrillic (CP 1251)" ),
     wxTRANSLATE( "Windows Western European (CP 1252)" ),
@@ -133,7 +141,7 @@ static const wxChar* gs_encodingDescs[] =
     wxTRANSLATE( "Unicode 8 bit (UTF-8)" ),
 };
 
     wxTRANSLATE( "Unicode 8 bit (UTF-8)" ),
 };
 
-// and the internal names
+// and the internal names (these are not translated on purpose!)
 static const wxChar* gs_encodingNames[] =
 {
     wxT( "iso-8859-1" ),
 static const wxChar* gs_encodingNames[] =
 {
     wxT( "iso-8859-1" ),
@@ -152,6 +160,10 @@ static const wxChar* gs_encodingNames[] =
     wxT( "iso-8859-14" ),
     wxT( "iso-8859-15" ),
     wxT( "koi8-r" ),
     wxT( "iso-8859-14" ),
     wxT( "iso-8859-15" ),
     wxT( "koi8-r" ),
+    wxT( "windows-932" ),
+    wxT( "windows-936" ),
+    wxT( "windows-949" ),
+    wxT( "windows-950" ),
     wxT( "windows-1250" ),
     wxT( "windows-1251" ),
     wxT( "windows-1252" ),
     wxT( "windows-1250" ),
     wxT( "windows-1251" ),
     wxT( "windows-1252" ),
@@ -161,8 +173,8 @@ static const wxChar* gs_encodingNames[] =
     wxT( "windows-1256" ),
     wxT( "windows-1257" ),
     wxT( "windows-437" ),
     wxT( "windows-1256" ),
     wxT( "windows-1257" ),
     wxT( "windows-437" ),
-    wxT( "utf7" ),
-    wxT( "utf8" ),
+    wxT( "utf-7" ),
+    wxT( "utf-8" ),
 };
 
 // ----------------------------------------------------------------------------
 };
 
 // ----------------------------------------------------------------------------
@@ -225,6 +237,10 @@ wxFontMapper::wxFontMapper()
 
 wxFontMapper::~wxFontMapper()
 {
 
 wxFontMapper::~wxFontMapper()
 {
+#if wxUSE_CONFIG
+    if ( m_configIsDummy )
+        delete m_config;
+#endif // wxUSE_CONFIG
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------
@@ -277,12 +293,13 @@ wxConfigBase *wxFontMapper::GetConfig()
     {
         // 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.
     {
         // 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.
+        delete m_config;
         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
         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 
+        //        either doesn't use wxConfig at all or creates wxConfig object in
+        //        wxApp::OnInit(), before any real interaction with the user takes
         //        place...
     }
 
         //        place...
     }
 
@@ -385,7 +402,7 @@ wxString wxFontMapper::GetEncodingName(wxFontEncoding encoding)
     {
         if ( gs_encodings[i] == encoding )
         {
     {
         if ( gs_encodings[i] == encoding )
         {
-            return wxGetTranslation(gs_encodingNames[i]);
+            return gs_encodingNames[i];
         }
     }
 
         }
     }
 
@@ -398,6 +415,12 @@ wxString wxFontMapper::GetEncodingName(wxFontEncoding encoding)
 wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset,
                                                bool interactive)
 {
 wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset,
                                                bool interactive)
 {
+    // a special pseudo encoding which means "don't ask me about this charset
+    // any more" - we need it to avoid driving the user crazy with asking him
+    // time after time about the same charset which he [presumably] doesn't
+    // have the fonts fot
+    static const int wxFONTENCODING_UNKNOWN = -2;
+
     wxFontEncoding encoding = wxFONTENCODING_SYSTEM;
 
     // we're going to modify it, make a copy
     wxFontEncoding encoding = wxFONTENCODING_SYSTEM;
 
     // we're going to modify it, make a copy
@@ -414,6 +437,12 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset,
         long value = config->Read(charset, -1l);
         if ( value != -1 )
         {
         long value = config->Read(charset, -1l);
         if ( value != -1 )
         {
+            if ( value == wxFONTENCODING_UNKNOWN )
+            {
+                // don't try to find it, in particular don't ask the user
+                return wxFONTENCODING_SYSTEM;
+            }
+
             if ( value >= 0 && value <= wxFONTENCODING_MAX )
             {
                 encoding = (wxFontEncoding)value;
             if ( value >= 0 && value <= wxFONTENCODING_MAX )
             {
                 encoding = (wxFontEncoding)value;
@@ -440,7 +469,7 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset,
 
         RestorePath(pathOld);
     }
 
         RestorePath(pathOld);
     }
-#endif
+#endif // wxUSE_CONFIG
 
     // if didn't find it there, try to recognize it ourselves
     if ( encoding == wxFONTENCODING_SYSTEM )
 
     // if didn't find it there, try to recognize it ourselves
     if ( encoding == wxFONTENCODING_SYSTEM )
@@ -450,7 +479,7 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset,
         cs.Trim(FALSE);
 
         // discard the optional quotes
         cs.Trim(FALSE);
 
         // discard the optional quotes
-        if ( !!cs )
+        if ( !cs.empty() )
         {
             if ( cs[0u] == _T('"') && cs.Last() == _T('"') )
             {
         {
             if ( cs[0u] == _T('"') && cs.Last() == _T('"') )
             {
@@ -460,7 +489,7 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset,
 
         cs.MakeUpper();
 
 
         cs.MakeUpper();
 
-        if ( !cs || cs == wxT("US-ASCII") )
+        if ( cs.empty() || cs == _T("US-ASCII") )
         {
             encoding = wxFONTENCODING_DEFAULT;
         }
         {
             encoding = wxFONTENCODING_DEFAULT;
         }
@@ -540,6 +569,25 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset,
                             encoding = (wxFontEncoding)value;
                         }
                     }
                             encoding = (wxFontEncoding)value;
                         }
                     }
+
+                    switch ( value )
+                    {
+                        case 932:
+                            encoding = wxFONTENCODING_CP932;
+                            break;
+
+                        case 936:
+                            encoding = wxFONTENCODING_CP936;
+                            break;
+
+                        case 949:
+                            encoding = wxFONTENCODING_CP949;
+                            break;
+
+                        case 950:
+                            encoding = wxFONTENCODING_CP950;
+                            break;
+                    }
                 }
             }
         }
                 }
             }
         }
@@ -590,24 +638,25 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset,
         if ( n != -1 )
         {
             encoding = gs_encodings[n];
         if ( n != -1 )
         {
             encoding = gs_encodings[n];
+        }
 
 #if wxUSE_CONFIG
         // save the result in the config now
 
 #if wxUSE_CONFIG
         // 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());
-                }
+        if ( ChangePath(FONTMAPPER_CHARSET_PATH, &pathOld) )
+        {
+            wxConfigBase *config = GetConfig();
 
 
-                RestorePath(pathOld);
+            // remember the alt encoding for this charset - or remember that
+            // we don't know it
+            long value = n == -1 ? wxFONTENCODING_UNKNOWN : (long)encoding;
+            if ( !config->Write(charset, value) )
+            {
+                wxLogError(_("Failed to remember the encoding for the charset '%s'."), charset.c_str());
             }
             }
-#endif // wxUSE_CONFIG
+
+            RestorePath(pathOld);
         }
         }
-        //else: cancelled
+#endif // wxUSE_CONFIG
     }
 #endif // wxUSE_GUI
 
     }
 #endif // wxUSE_GUI
 
@@ -694,12 +743,13 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
     // message
     if ( encoding == wxFONTENCODING_SYSTEM )
     {
     // message
     if ( encoding == wxFONTENCODING_SYSTEM )
     {
-        wxFatalError(_("can't load any font, aborting"));
+        wxLogFatalError(_("can't load any font, aborting"));
 
 
-        // wxFatalError doesn't return
+        // wxLogFatalError doesn't return
     }
 
     }
 
-    wxString configEntry, encName = GetEncodingName(encoding);
+    wxString configEntry,
+             encName = GetEncodingName(encoding);
     if ( !!facename )
     {
         configEntry = facename + _T("_");
     if ( !!facename )
     {
         configEntry = facename + _T("_");
@@ -755,6 +805,29 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
     }
 #endif // wxUSE_CONFIG
 
     }
 #endif // wxUSE_CONFIG
 
+    // now try to map this encoding to a compatible one which we have on this
+    // system
+    wxFontEncodingArray equiv = wxEncodingConverter::GetAllEquivalents(encoding);
+    size_t count = equiv.GetCount();
+    bool foundEquivEncoding = FALSE;
+    wxFontEncoding equivEncoding = wxFONTENCODING_SYSTEM;
+    if ( count )
+    {
+        for ( size_t i = 0; i < count && !foundEquivEncoding; i++ )
+        {
+            // don't test for encoding itself, we already know we don't have it
+            if ( equiv[i] == encoding )
+                continue;
+
+            if ( TestAltEncoding(configEntry, equiv[i], info) )
+            {
+                equivEncoding = equiv[i];
+
+                foundEquivEncoding = TRUE;
+            }
+        }
+    }
+
     // ask the user
 #if wxUSE_FONTDLG
     if ( interactive )
     // ask the user
 #if wxUSE_FONTDLG
     if ( interactive )
@@ -763,29 +836,40 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
         if ( !title )
             title << wxTheApp->GetAppName() << _(": unknown encoding");
 
         if ( !title )
             title << wxTheApp->GetAppName() << _(": unknown encoding");
 
-        // the message
-        wxString msg;
-        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());
+        // built the message
+        wxString encDesc = GetEncodingDescription(encoding),
+                 msg;
+        if ( foundEquivEncoding )
+        {
+            // ask the user if he wants to override found alternative encoding
+            msg.Printf(_("No font for displaying text in encoding '%s' found,\nbut an alternative encoding '%s' is available.\nDo you want to use this encoding (otherwise you will have to choose another one)?"),
+                       encDesc.c_str(), GetEncodingDescription(equivEncoding).c_str());
+        }
+        else
+        {
+            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)?"),
+                       encDesc.c_str());
+        }
 
 
-        wxWindow *parent = m_windowParent;
-        if ( !parent )
-            parent = wxTheApp->GetTopWindow();
+        // the question is different in 2 cases so the answer has to be
+        // interpreted differently as well
+        int answer = foundEquivEncoding ? wxNO : wxYES;
 
         if ( wxMessageBox(msg, title,
 
         if ( wxMessageBox(msg, title,
-                          wxICON_QUESTION | wxYES_NO, parent) == wxYES )
+                          wxICON_QUESTION | wxYES_NO,
+                          m_windowParent) == answer )
         {
             wxFontData data;
             data.SetEncoding(encoding);
             data.EncodingInfo() = *info;
         {
             wxFontData data;
             data.SetEncoding(encoding);
             data.EncodingInfo() = *info;
-            wxFontDialog dialog(parent, &data);
+            wxFontDialog dialog(m_windowParent, &data);
             if ( dialog.ShowModal() == wxID_OK )
             {
                 wxFontData retData = dialog.GetFontData();
                 wxFont font = retData.GetChosenFont();
 
                 *info = retData.EncodingInfo();
             if ( dialog.ShowModal() == wxID_OK )
             {
                 wxFontData retData = dialog.GetFontData();
                 wxFont font = retData.GetChosenFont();
 
                 *info = retData.EncodingInfo();
-                info -> encoding = retData.GetEncoding();
+                info->encoding = retData.GetEncoding();
 
 #if wxUSE_CONFIG
                 // remember this in the config
 
 #if wxUSE_CONFIG
                 // remember this in the config
@@ -803,12 +887,19 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
         }
         else
         {
         }
         else
         {
-            // the user doesn't want to select a font for this encoding,
+            // the user doesn't want to select a font for this encoding
+            // or selected to use equivalent encoding
+            //
             // remember it to avoid asking the same question again later
 #if wxUSE_CONFIG
             if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) )
             {
             // 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);
+                GetConfig()->Write
+                             (
+                                configEntry,
+                                foundEquivEncoding ? info->ToString().c_str()
+                                                   : FONTMAPPER_FONT_DONT_ASK
+                             );
 
                 RestorePath(pathOld);
             }
 
                 RestorePath(pathOld);
             }
@@ -818,19 +909,7 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
     //else: we're in non-interactive mode
 #endif // wxUSE_FONTDLG
 
     //else: we're in non-interactive mode
 #endif // wxUSE_FONTDLG
 
-    // now try the default mappings:
-    wxFontEncodingArray equiv = wxEncodingConverter::GetAllEquivalents(encoding);
-    size_t count = equiv.GetCount();
-    if ( count )
-    {
-        for ( size_t i = (equiv[0] == encoding) ? 1 : 0; i < count; i++ )
-        {
-            if ( TestAltEncoding(configEntry, equiv[i], info) )
-                return TRUE;
-        }
-    }
-
-    return FALSE;
+    return foundEquivEncoding;
 }
 
 bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
 }
 
 bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,