fontmap.cpp

来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 530 行 · 第 1/2 页

CPP
530
字号
/////////////////////////////////////////////////////////////////////////////
// Name:        common/fontmap.cpp
// Purpose:     wxFontMapper class
// Author:      Vadim Zeitlin
// Modified by:
// Created:     04.11.99
// RCS-ID:      $Id: fontmap.cpp,v 1.71.2.1 2006/02/13 00:24:50 VZ Exp $
// Copyright:   (c) 1999-2003 Vadim Zeitlin <vadim@wxwindows.org>
// Licence:     wxWindows licence
/////////////////////////////////////////////////////////////////////////////

// ============================================================================
// declarations
// ============================================================================

// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------

#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
    #pragma implementation "fontmap.h"
#endif

// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"

#ifdef __BORLANDC__
    #pragma hdrstop
#endif

#if wxUSE_FONTMAP

#ifndef WX_PRECOMP
    #include "wx/app.h"
    #include "wx/log.h"
    #include "wx/intl.h"
#endif // PCH

#if wxUSE_CONFIG
    #include "wx/config.h"
#endif // wxUSE_CONFIG

#if defined(__WXMSW__)
  #include  "wx/msw/private.h"  // includes windows.h for LOGFONT
  #include  "wx/msw/winundef.h"
#endif

#include "wx/fontmap.h"
#include "wx/fmappriv.h"
#include "wx/fontutil.h"
#include "wx/msgdlg.h"
#include "wx/fontdlg.h"
#include "wx/choicdlg.h"
#include "wx/encinfo.h"

#include "wx/encconv.h"

#if wxUSE_EXTENDED_RTTI

wxBEGIN_ENUM( wxFontEncoding )
    wxENUM_MEMBER( wxFONTENCODING_SYSTEM )
    wxENUM_MEMBER( wxFONTENCODING_DEFAULT )

    wxENUM_MEMBER( wxFONTENCODING_ISO8859_1 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_2 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_3 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_4 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_5 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_6 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_7 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_8 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_9 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_10 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_11 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_12 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_13 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_14 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_15 )
    wxENUM_MEMBER( wxFONTENCODING_ISO8859_MAX )
    wxENUM_MEMBER( wxFONTENCODING_KOI8 )
    wxENUM_MEMBER( wxFONTENCODING_KOI8_U )
    wxENUM_MEMBER( wxFONTENCODING_ALTERNATIVE )
    wxENUM_MEMBER( wxFONTENCODING_BULGARIAN )
    wxENUM_MEMBER( wxFONTENCODING_CP437 )
    wxENUM_MEMBER( wxFONTENCODING_CP850 )
    wxENUM_MEMBER( wxFONTENCODING_CP852 )
    wxENUM_MEMBER( wxFONTENCODING_CP855 )
    wxENUM_MEMBER( wxFONTENCODING_CP866 )

    wxENUM_MEMBER( wxFONTENCODING_CP874 )
    wxENUM_MEMBER( wxFONTENCODING_CP932 )
    wxENUM_MEMBER( wxFONTENCODING_CP936 )
    wxENUM_MEMBER( wxFONTENCODING_CP949 )
    wxENUM_MEMBER( wxFONTENCODING_CP950 )
    wxENUM_MEMBER( wxFONTENCODING_CP1250 )
    wxENUM_MEMBER( wxFONTENCODING_CP1251 )
    wxENUM_MEMBER( wxFONTENCODING_CP1252 )
    wxENUM_MEMBER( wxFONTENCODING_CP1253 )
    wxENUM_MEMBER( wxFONTENCODING_CP1254 )
    wxENUM_MEMBER( wxFONTENCODING_CP1255 )
    wxENUM_MEMBER( wxFONTENCODING_CP1256 )
    wxENUM_MEMBER( wxFONTENCODING_CP1257 )
    wxENUM_MEMBER( wxFONTENCODING_CP12_MAX )
    wxENUM_MEMBER( wxFONTENCODING_UTF7 )
    wxENUM_MEMBER( wxFONTENCODING_UTF8 )
    wxENUM_MEMBER( wxFONTENCODING_GB2312 )
    wxENUM_MEMBER( wxFONTENCODING_BIG5 )
    wxENUM_MEMBER( wxFONTENCODING_SHIFT_JIS )
    wxENUM_MEMBER( wxFONTENCODING_EUC_JP )
    wxENUM_MEMBER( wxFONTENCODING_UNICODE )
wxEND_ENUM( wxFontEncoding )
#endif

// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------

// the config paths we use
#if wxUSE_CONFIG

static const wxChar* FONTMAPPER_FONT_FROM_ENCODING_PATH = wxT("Encodings");
static const wxChar* FONTMAPPER_FONT_DONT_ASK = wxT("none");

#endif // wxUSE_CONFIG

// ----------------------------------------------------------------------------
// private classes
// ----------------------------------------------------------------------------

// it may happen that while we're showing a dialog asking the user about
// something, another request for an encoding mapping arrives: in this case it
// is best to not do anything because otherwise we risk to enter an infinite
// loop so we create an object of this class on stack to test for this in all
// interactive functions
class ReentrancyBlocker
{
public:
    ReentrancyBlocker(bool& flag) : m_flagOld(flag), m_flag(flag)
        { m_flag = true; }
    ~ReentrancyBlocker() { m_flag = m_flagOld; }

private:
    bool m_flagOld;
    bool& m_flag;

    DECLARE_NO_COPY_CLASS(ReentrancyBlocker)
};

// ============================================================================
// implementation
// ============================================================================

// ----------------------------------------------------------------------------
// ctor and dtor
// ----------------------------------------------------------------------------

wxFontMapper::wxFontMapper()
{
    m_windowParent = NULL;
}

wxFontMapper::~wxFontMapper()
{
}

bool wxFontMapper::IsWxFontMapper()
{   return true; }

/* static */
wxFontMapper *wxFontMapper::Get()
{
    wxFontMapperBase *fontmapper = wxFontMapperBase::Get();
    wxASSERT_MSG(fontmapper->IsWxFontMapper(), wxT("GUI code requested a wxFontMapper but we only have a wxFontMapperBase."));
    // Now return it anyway because there's a chance the GUI code might just
    // only want to call wxFontMapperBase functions.
    return (wxFontMapper*)fontmapper;
}

wxFontEncoding
wxFontMapper::CharsetToEncoding(const wxString& charset, bool interactive)
{
    // try the ways not needing the users intervention first
    int encoding = wxFontMapperBase::NonInteractiveCharsetToEncoding(charset);

    // if we failed to find the encoding, ask the user -- unless disabled
    if ( encoding == wxFONTENCODING_UNKNOWN )
    {
        // this is the special value which disables asking the user (he had
        // chosen to suppress this the last time)
        encoding = wxFONTENCODING_SYSTEM;
    }
#if wxUSE_CHOICEDLG
    else if ( (encoding == wxFONTENCODING_SYSTEM) && interactive )
    {
        // prepare the dialog data

        // the dialog title
        wxString title(m_titleDialog);
        if ( !title )
            title << wxTheApp->GetAppName() << _(": unknown charset");

        // the message
        wxString msg;
        msg.Printf(_("The charset '%s' is unknown. You may select\nanother charset to replace it with or choose\n[Cancel] if it cannot be replaced"), charset.c_str());

        // the list of choices
        const size_t count = GetSupportedEncodingsCount();

        wxString *encodingNamesTranslated = new wxString[count];

        for ( size_t i = 0; i < count; i++ )
        {
            encodingNamesTranslated[i] = GetEncodingDescription(GetEncoding(i));
        }

        // the parent window
        wxWindow *parent = m_windowParent;
        if ( !parent )
            parent = wxTheApp->GetTopWindow();

        // do ask the user and get back the index in encodings table
        int n = wxGetSingleChoiceIndex(msg, title,
                                       count,
                                       encodingNamesTranslated,
                                       parent);

        delete [] encodingNamesTranslated;

        if ( n != -1 )
        {
            encoding = GetEncoding(n);
        }

#if wxUSE_CONFIG && wxUSE_FILECONFIG
        // save the result in the config now
        wxFontMapperPathChanger path(this, FONTMAPPER_CHARSET_PATH);
        if ( path.IsOk() )
        {
            wxConfigBase *config = GetConfig();

            // remember the alt encoding for this charset -- or remember that
            // we don't know it
            long value = n == -1 ? (long)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
    }
#else
    wxUnusedVar(interactive);
#endif // wxUSE_CHOICEDLG

    return (wxFontEncoding)encoding;
}

// ----------------------------------------------------------------------------
// support for unknown encodings: we maintain a map between the
// (platform-specific) strings identifying them and our wxFontEncodings they
// correspond to which is used by GetFontForEncoding() function
// ----------------------------------------------------------------------------

bool wxFontMapper::TestAltEncoding(const wxString& configEntry,
                                   wxFontEncoding encReplacement,

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?