Files
libreoffice/svtools/source/config/fontsubstconfig.cxx

194 lines
6.9 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
re-base on ALv2 code. Includes: Patch contributed by: Jurgen Schmidt remove onlineregistration with dependencies http://svn.apache.org/viewvc?view=revision&revision=1240245 imported patch package_eventlistener.patch http://svn.apache.org/viewvc?view=revision&revision=1172103 Patch contributed by Pedro Giffuni Accept Google Chrome OS fonts as equivalent to MS fonts. http://svn.apache.org/viewvc?view=revision&revision=1233155 http://svn.apache.org/viewvc?view=revision&revision=1233408 Patch contributed by Andre Fischer Do not add targets for junit tests when junit is disabled. http://svn.apache.org/viewvc?view=revision&revision=1241508 Patches contributed by Mathias Bauer (and others) gnumake4 work variously http://svn.apache.org/viewvc?view=revision&revision=1394707 http://svn.apache.org/viewvc?view=revision&revision=1394326 cws mba34issues01: #i114600#: remove forbidden characters from list of unencoded characters http://svn.apache.org/viewvc?view=revision&revision=1172370 Patches contributed by Oliver Rainer-Wittman some clean up in JPEGReader due to memory constraints http://svn.apache.org/viewvc?view=revision&revision=1299729 119114 - method <UpdateDialog::addSpecificError(..)> - create entry with correct type http://svn.apache.org/viewvc?view=revision&revision=1305265 Patches contributed by Ariel Constenla-Haile i118707 - make toolbar control's popup window grab focus http://svn.apache.org/viewvc?view=revision&revision=1225846 Patches contributed by Herbert Duerr #i118662# remove usage of BerkeleyDB in desktop module http://svn.apache.org/viewvc?view=revision&revision=1213171 minor cleanups in dp_persmap.* http://svn.apache.org/viewvc?view=revision&revision=1215064 flush early to prevent problem with extension manager not cleaning up its objects http://svn.apache.org/viewvc?view=revision&revision=1228147 i118726 do not flush *pmap file while reading it http://svn.apache.org/viewvc?view=revision&revision=1230614 #i119048# migrate BDB extension entries using a simple heuristic http://svn.apache.org/viewvc?view=revision&revision=1300972 #i119048# handle edge cases when importing BDB hash files http://svn.apache.org/viewvc?view=revision&revision=1301428 #i119113# fix of-by-one when importing BDB files http://svn.apache.org/viewvc?view=revision&revision=1305420 restore our encryption settings, icon themes, and dictionaries. removed wrapper hacks, kill obsolete bundled extension blob / pre-registration handling, remove duplicated quickstart code. remove OS/2 conditionals.
2012-11-15 17:28:16 +00:00
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <svtools/fontsubstconfig.hxx>
#include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#include <tools/debug.hxx>
#include <vcl/outdev.hxx>
2012-01-21 01:53:20 -05:00
#include <boost/ptr_container/ptr_vector.hpp>
using namespace utl;
using namespace com::sun::star;
using namespace com::sun::star::uno;
using namespace com::sun::star::beans;
2011-02-27 17:05:28 +01:00
const sal_Char cReplacement[] = "Replacement";
const sal_Char cFontPairs[] = "FontPairs";
const sal_Char cReplaceFont[] = "ReplaceFont";
const sal_Char cSubstituteFont[]= "SubstituteFont";
const sal_Char cOnScreenOnly[] = "OnScreenOnly";
const sal_Char cAlways[] = "Always";
2012-01-21 01:53:20 -05:00
typedef boost::ptr_vector<SubstitutionStruct> SubstitutionStructArr;
struct SvtFontSubstConfig_Impl
{
SubstitutionStructArr aSubstArr;
};
SvtFontSubstConfig::SvtFontSubstConfig() :
ConfigItem(OUString("Office.Common/Font/Substitution")),
bIsEnabled(false),
pImpl(new SvtFontSubstConfig_Impl)
{
Sequence<OUString> aNames(1);
aNames.getArray()[0] = cReplacement;
Sequence<Any> aValues = GetProperties(aNames);
DBG_ASSERT(aValues.getConstArray()[0].hasValue(), "no value available");
if(aValues.getConstArray()[0].hasValue())
bIsEnabled = *static_cast<sal_Bool const *>(aValues.getConstArray()[0].getValue());
OUString sPropPrefix(cFontPairs);
Sequence<OUString> aNodeNames = GetNodeNames(sPropPrefix, CONFIG_NAME_LOCAL_PATH);
const OUString* pNodeNames = aNodeNames.getConstArray();
Sequence<OUString> aPropNames(aNodeNames.getLength() * 4);
OUString* pNames = aPropNames.getArray();
sal_Int32 nName = 0;
sPropPrefix += "/";
sal_Int32 nNode;
for(nNode = 0; nNode < aNodeNames.getLength(); nNode++)
{
OUString sStart = sPropPrefix + pNodeNames[nNode] + "/";
pNames[nName] = sStart; pNames[nName++] += cReplaceFont;
pNames[nName] = sStart; pNames[nName++] += cSubstituteFont;
pNames[nName] = sStart; pNames[nName++] += cAlways;
pNames[nName] = sStart; pNames[nName++] += cOnScreenOnly;
}
Sequence<Any> aNodeValues = GetProperties(aPropNames);
const Any* pNodeValues = aNodeValues.getConstArray();
nName = 0;
for(nNode = 0; nNode < aNodeNames.getLength(); nNode++)
{
2012-01-21 01:53:20 -05:00
SubstitutionStruct* pInsert = new SubstitutionStruct;
pNodeValues[nName++] >>= pInsert->sFont;
pNodeValues[nName++] >>= pInsert->sReplaceBy;
pInsert->bReplaceAlways = *static_cast<sal_Bool const *>(pNodeValues[nName++].getValue());
pInsert->bReplaceOnScreenOnly = *static_cast<sal_Bool const *>(pNodeValues[nName++].getValue());
2012-01-21 01:53:20 -05:00
pImpl->aSubstArr.push_back(pInsert);
}
}
SvtFontSubstConfig::~SvtFontSubstConfig()
{
delete pImpl;
}
void SvtFontSubstConfig::Notify( const com::sun::star::uno::Sequence< OUString >& )
{
}
void SvtFontSubstConfig::ImplCommit()
{
Sequence<OUString> aNames(1);
aNames.getArray()[0] = cReplacement;
Sequence<Any> aValues(1);
aValues.getArray()[0].setValue(&bIsEnabled, cppu::UnoType<bool>::get());
PutProperties(aNames, aValues);
OUString sNode(cFontPairs);
2012-01-21 01:53:20 -05:00
if(pImpl->aSubstArr.empty())
ClearNodeSet(sNode);
else
{
2012-01-21 01:53:20 -05:00
Sequence<PropertyValue> aSetValues(4 * pImpl->aSubstArr.size());
PropertyValue* pSetValues = aSetValues.getArray();
sal_Int32 nSetValue = 0;
const OUString sReplaceFont(cReplaceFont);
const OUString sSubstituteFont(cSubstituteFont);
const OUString sAlways(cAlways);
const OUString sOnScreenOnly(cOnScreenOnly);
const uno::Type& rBoolType = cppu::UnoType<bool>::get();
2012-01-21 01:53:20 -05:00
for(size_t i = 0; i < pImpl->aSubstArr.size(); i++)
{
OUString sPrefix = sNode + "/_" + OUString::number(i) + "/";
2012-01-21 01:53:20 -05:00
SubstitutionStruct& pSubst = pImpl->aSubstArr[i];
pSetValues[nSetValue].Name = sPrefix; pSetValues[nSetValue].Name += sReplaceFont;
2012-01-21 01:53:20 -05:00
pSetValues[nSetValue++].Value <<= pSubst.sFont;
pSetValues[nSetValue].Name = sPrefix; pSetValues[nSetValue].Name += sSubstituteFont;
2012-01-21 01:53:20 -05:00
pSetValues[nSetValue++].Value <<= pSubst.sReplaceBy;
pSetValues[nSetValue].Name = sPrefix; pSetValues[nSetValue].Name += sAlways;
2012-01-21 01:53:20 -05:00
pSetValues[nSetValue++].Value.setValue(&pSubst.bReplaceAlways, rBoolType);
pSetValues[nSetValue].Name = sPrefix; pSetValues[nSetValue].Name += sOnScreenOnly;
2012-01-21 01:53:20 -05:00
pSetValues[nSetValue++].Value.setValue(&pSubst.bReplaceOnScreenOnly, rBoolType);
}
ReplaceSetProperties(sNode, aSetValues);
}
}
sal_Int32 SvtFontSubstConfig::SubstitutionCount() const
{
2012-01-21 01:53:20 -05:00
return pImpl->aSubstArr.size();
}
void SvtFontSubstConfig::ClearSubstitutions()
{
2012-01-21 01:53:20 -05:00
pImpl->aSubstArr.clear();
}
const SubstitutionStruct* SvtFontSubstConfig::GetSubstitution(sal_Int32 nPos)
{
2012-01-21 01:53:20 -05:00
sal_Int32 nCount = static_cast<sal_Int32>(pImpl->aSubstArr.size());
DBG_ASSERT(nPos >= 0 && nPos < nCount, "illegal array index");
if(nPos >= 0 && nPos < nCount)
return &pImpl->aSubstArr[nPos];
return NULL;
}
void SvtFontSubstConfig::AddSubstitution(const SubstitutionStruct& rToAdd)
{
2012-01-21 01:53:20 -05:00
pImpl->aSubstArr.push_back(new SubstitutionStruct(rToAdd));
}
void SvtFontSubstConfig::Apply()
{
OutputDevice::BeginFontSubstitution();
// remove old substitions
sal_uInt16 nOldCount = OutputDevice::GetFontSubstituteCount();
while (nOldCount)
OutputDevice::RemoveFontSubstitute(--nOldCount);
// read new substitutions
sal_Int32 nCount = IsEnabled() ? SubstitutionCount() : 0;
for (sal_Int32 i = 0; i < nCount; i++)
{
AddFontSubstituteFlags nFlags = AddFontSubstituteFlags::NONE;
const SubstitutionStruct* pSubs = GetSubstitution(i);
if(pSubs->bReplaceAlways)
nFlags |= AddFontSubstituteFlags::ALWAYS;
if(pSubs->bReplaceOnScreenOnly)
nFlags |= AddFontSubstituteFlags::ScreenOnly;
OutputDevice::AddFontSubstitute( pSubs->sFont, pSubs->sReplaceBy, nFlags );
}
OutputDevice::EndFontSubstitution();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */