From 1d910ac1fcebc69cda4c0b85278af09a55c9a611 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 22 Jan 2000 23:15:52 +0000 Subject: [PATCH] 1. added wxMemoryConfig (private) class 2. some minor tweaks to config usage in wxFontMapper git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5599 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/memconf.h | 54 ++++++++++++++++++++++++++++++++++++++ src/common/appcmn.cpp | 4 +-- src/common/fileconf.cpp | 2 +- src/common/fontmap.cpp | 57 +++++++++++++++++++++++++++++++++++------ 4 files changed, 106 insertions(+), 11 deletions(-) create mode 100644 include/wx/memconf.h diff --git a/include/wx/memconf.h b/include/wx/memconf.h new file mode 100644 index 0000000000..0d7a2228b6 --- /dev/null +++ b/include/wx/memconf.h @@ -0,0 +1,54 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/memconf.h +// Purpose: wxMemoryConfig class: a wxConfigBase implementation which only +// stores the settings in memory (thus they are lost when the +// program terminates) +// Author: Vadim Zeitlin +// Modified by: +// Created: 22.01.00 +// RCS-ID: $Id$ +// Copyright: (c) 2000 Vadim Zeitlin +// Licence: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +/* + * NB: I don't see how this class may possibly be useful to the application + * program (as the settings are lost on program termination), but it is + * handy to have it inside wxWindows. So for now let's say that this class + * is private and should only be used by wxWindows itself - this might + * change in the future. + */ + +#ifndef _WX_MEMCONF_H_ +#define _WX_MEMCONF_H_ + +// no #pragma interface because no implementation file + +#if wxUSE_CONFIG + +#include "wx/fileconf.h" // the base class + +// ---------------------------------------------------------------------------- +// wxMemoryConfig: a config class which stores settings in non-persistent way +// ---------------------------------------------------------------------------- + +// notice that we inherit from wxFileConfig which already stores its data in +// memory and just disable file reading/writing - this is probably not optimal +// and might be changed in future as well (this class will always deriev from +// wxConfigBase though) +class wxMemoryConfig : public wxFileConfig +{ +public: + // default (and only) ctor + wxMemoryConfig() : wxFileConfig(wxEmptyString, // default app name + wxEmptyString, // default vendor name + wxEmptyString, // no local config file + wxEmptyString, // no system config file + 0) // don't use any files + { + } +}; + +#endif // wxUSE_CONFIG + +#endif // _WX_MEMCONF_H_ diff --git a/src/common/appcmn.cpp b/src/common/appcmn.cpp index d185f5bff0..18d3dcafff 100644 --- a/src/common/appcmn.cpp +++ b/src/common/appcmn.cpp @@ -63,14 +63,14 @@ void wxAppBase::ProcessPendingEvents() delete node; // In ProcessPendingEvents(), new handlers might be add - // and we can safely leave the critical section here. + // and we can safely leave the critical section here. wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); handler->ProcessPendingEvents(); wxENTER_CRIT_SECT( *wxPendingEventsLocker ); node = wxPendingEvents->First(); } - + wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); } diff --git a/src/common/fileconf.cpp b/src/common/fileconf.cpp index 49f6127500..8c96c4d6bd 100644 --- a/src/common/fileconf.cpp +++ b/src/common/fileconf.cpp @@ -764,7 +764,7 @@ bool wxFileConfig::Write(const wxString& key, long lValue) bool wxFileConfig::Flush(bool /* bCurrentOnly */) { - if ( LineListIsEmpty() || !m_pRootGroup->IsDirty() ) + if ( LineListIsEmpty() || !m_pRootGroup->IsDirty() || !m_strLocalFile ) return TRUE; wxTempFile file(m_strLocalFile); diff --git a/src/common/fontmap.cpp b/src/common/fontmap.cpp index 4bf7daa110..116565bbcf 100644 --- a/src/common/fontmap.cpp +++ b/src/common/fontmap.cpp @@ -36,6 +36,7 @@ #include "wx/fontmap.h" #include "wx/config.h" +#include "wx/memconf.h" #include "wx/msgdlg.h" #include "wx/fontdlg.h" @@ -223,7 +224,18 @@ wxConfigBase *wxFontMapper::GetConfig() if ( !m_config ) { // try the default - m_config = wxConfig::Get(FALSE/*don't create on demand*/); + 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()); } } @@ -435,7 +448,7 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, 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; }