fontmap.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 530 行 · 第 1/2 页
CPP
530 行
wxNativeEncodingInfo *info)
{
if ( wxGetNativeFontEncoding(encReplacement, info) &&
wxTestFontEncoding(*info) )
{
#if wxUSE_CONFIG && wxUSE_FILECONFIG
// remember the mapping in the config
wxFontMapperPathChanger path(this, FONTMAPPER_FONT_FROM_ENCODING_PATH);
if ( path.IsOk() )
{
GetConfig()->Write(configEntry, info->ToString());
}
#else
wxUnusedVar(configEntry);
#endif // wxUSE_CONFIG
return true;
}
return false;
}
bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
wxNativeEncodingInfo *info,
const wxString& facename,
bool interactive)
{
#if wxUSE_GUI
// we need a flag to prevent infinite recursion which happens, for
// example, when GetAltForEncoding() is called from an OnPaint() handler:
// in this case, wxYield() which is called from wxMessageBox() we use here
// will lead to another call of OnPaint() and hence to another call of
// GetAltForEncoding() -- and it is impossible to catch this from the user
// code because we are called from wxFont ctor implicitly.
// assume we're always called from the main thread, so that it is safe to
// use a static var
static bool s_inGetAltForEncoding = false;
if ( interactive && s_inGetAltForEncoding )
return false;
ReentrancyBlocker blocker(s_inGetAltForEncoding);
#endif // wxUSE_GUI
wxCHECK_MSG( info, false, wxT("bad pointer in GetAltForEncoding") );
info->facename = facename;
if ( encoding == wxFONTENCODING_DEFAULT )
{
encoding = wxFont::GetDefaultEncoding();
}
// if we failed to load the system default encoding, something is really
// wrong and we'd better stop now -- otherwise we will go into endless
// recursion trying to create the font in the msg box with the error
// message
if ( encoding == wxFONTENCODING_SYSTEM )
{
wxLogFatalError(_("can't load any font, aborting"));
// wxLogFatalError doesn't return
}
wxString configEntry,
encName = GetEncodingName(encoding);
if ( !facename.empty() )
{
configEntry = facename + _T("_");
}
configEntry += encName;
#if wxUSE_CONFIG && wxUSE_FILECONFIG
// do we have a font spec for this encoding?
wxString fontinfo;
wxFontMapperPathChanger path(this, FONTMAPPER_FONT_FROM_ENCODING_PATH);
if ( path.IsOk() )
{
fontinfo = GetConfig()->Read(configEntry);
}
// 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 )
{
interactive = false;
}
else // use the info entered the last time
{
if ( !fontinfo.empty() && !facename.empty() )
{
// we tried to find a match with facename -- now try without it
fontinfo = GetConfig()->Read(encName);
}
if ( !fontinfo.empty() )
{
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
}
#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 )
{
wxString title(m_titleDialog);
if ( !title )
title << wxTheApp->GetAppName() << _(": unknown encoding");
// 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());
}
// 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,
wxICON_QUESTION | wxYES_NO,
m_windowParent) == answer )
{
wxFontData data;
data.SetEncoding(encoding);
data.EncodingInfo() = *info;
wxFontDialog dialog(m_windowParent, data);
if ( dialog.ShowModal() == wxID_OK )
{
wxFontData retData = dialog.GetFontData();
*info = retData.EncodingInfo();
info->encoding = retData.GetEncoding();
#if wxUSE_CONFIG && wxUSE_FILECONFIG
// remember this in the config
wxFontMapperPathChanger path(this,
FONTMAPPER_FONT_FROM_ENCODING_PATH);
if ( path.IsOk() )
{
GetConfig()->Write(configEntry, info->ToString());
}
#endif // wxUSE_CONFIG
return true;
}
//else: the user canceled the font selection dialog
}
else
{
// 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 && wxUSE_FILECONFIG
wxFontMapperPathChanger path(this,
FONTMAPPER_FONT_FROM_ENCODING_PATH);
if ( path.IsOk() )
{
GetConfig()->Write
(
configEntry,
foundEquivEncoding ? info->ToString().c_str()
: FONTMAPPER_FONT_DONT_ASK
);
}
#endif // wxUSE_CONFIG
}
}
//else: we're in non-interactive mode
#else
wxUnusedVar(equivEncoding);
#endif // wxUSE_FONTDLG
return foundEquivEncoding;
}
bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
wxFontEncoding *encodingAlt,
const wxString& facename,
bool interactive)
{
wxCHECK_MSG( encodingAlt, false,
_T("wxFontEncoding::GetAltForEncoding(): NULL pointer") );
#ifdef __WXGTK20__
// in GTK+ 2 we can always use UTF-8 for everything so just do it,
// especially as no other font encodings are currently supported
*encodingAlt = wxFONTENCODING_UTF8;
return true;
#else // !wxGTK2
wxNativeEncodingInfo info;
if ( !GetAltForEncoding(encoding, &info, facename, interactive) )
return false;
*encodingAlt = info.encoding;
return true;
#endif // wxGTK2/!wxGTK2
}
bool wxFontMapper::IsEncodingAvailable(wxFontEncoding encoding,
const wxString& facename)
{
wxNativeEncodingInfo info;
if ( !wxGetNativeFontEncoding(encoding, &info) )
return false;
info.facename = facename;
return wxTestFontEncoding(info);
}
#endif // wxUSE_FONTMAP
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?