/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* 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/.
*
*/
#include <drawingml/texteffectscontext.hxx>
#include <oox/helper/attributelist.hxx>
#include <oox/token/namespaces.hxx>
#include <map>
namespace oox::drawingml {
namespace
{
OUString const & lclGetNameForElementId(sal_uInt32 aId)
{
static std::map<sal_uInt32, OUString> const aIdMap
{
{ OOX_TOKEN(w14, srgbClr) , "srgbClr" },
{ OOX_TOKEN(w14, schemeClr) , "schemeClr" },
{ OOX_TOKEN(w14, tint) , "tint" },
{ OOX_TOKEN(w14, shade) , "shade" },
{ OOX_TOKEN(w14, alpha) , "alpha" },
{ OOX_TOKEN(w14, hueMod) , "hueMod" },
{ OOX_TOKEN(w14, sat) , "sat" },
{ OOX_TOKEN(w14, satOff) , "satOff" },
{ OOX_TOKEN(w14, satMod) , "satMod" },
{ OOX_TOKEN(w14, lum) , "lum" },
{ OOX_TOKEN(w14, lumOff) , "lumOff" },
{ OOX_TOKEN(w14, lumMod) , "lumMod" },
{ OOX_TOKEN(w14, noFill) , "noFill" },
{ OOX_TOKEN(w14, solidFill) , "solidFill" },
{ OOX_TOKEN(w14, gradFill) , "gradFill" },
{ OOX_TOKEN(w14, gsLst) , "gsLst" },
{ OOX_TOKEN(w14, gs) , "gs" },
{ OOX_TOKEN(w14, pos) , "pos" },
{ OOX_TOKEN(w14, lin) , "lin" },
{ OOX_TOKEN(w14, path) , "path" },
{ OOX_TOKEN(w14, fillToRect) , "fillToRect" },
{ OOX_TOKEN(w14, prstDash) , "prstDash" },
{ OOX_TOKEN(w14, round) , "round" },
{ OOX_TOKEN(w14, bevel) , "bevel" },
{ OOX_TOKEN(w14, miter) , "miter" },
{ OOX_TOKEN(w14, camera) , "camera" },
{ OOX_TOKEN(w14, lightRig) , "lightRig" },
{ OOX_TOKEN(w14, rot) , "rot" },
{ OOX_TOKEN(w14, bevelT) , "bevelT" },
{ OOX_TOKEN(w14, bevelB) , "bevelB" },
{ OOX_TOKEN(w14, extrusionClr) , "extrusionClr" },
{ OOX_TOKEN(w14, contourClr) , "contourClr" } ,
{ OOX_TOKEN(w14, styleSet) , "styleSet" },
{ OOX_TOKEN(w14, glow) , "glow" },
{ OOX_TOKEN(w14, shadow) , "shadow" },
{ OOX_TOKEN(w14, reflection) , "reflection" },
{ OOX_TOKEN(w14, textOutline) , "textOutline" },
{ OOX_TOKEN(w14, textFill) , "textFill" },
{ OOX_TOKEN(w14, scene3d) , "scene3d" },
{ OOX_TOKEN(w14, props3d) , "props3d" },
{ OOX_TOKEN(w14, ligatures) , "ligatures" },
{ OOX_TOKEN(w14, numForm) , "numForm" },
{ OOX_TOKEN(w14, numSpacing) , "numSpacing" },
{ OOX_TOKEN(w14, stylisticSets), "stylisticSets" },
{ OOX_TOKEN(w14, cntxtAlts) , "cntxtAlts" },
};
const auto iter = aIdMap.find(aId);
assert(iter != aIdMap.end());
return iter->second;
}
OUString const & lclGetGrabBagName(sal_uInt32 aId)
{
static std::map<sal_uInt32, OUString> const aGrabBagNameMap
{
{ OOX_TOKEN(w14, glow) , "CharGlowTextEffect" },
{ OOX_TOKEN(w14, shadow) , "CharShadowTextEffect" },
{ OOX_TOKEN(w14, reflection) , "CharReflectionTextEffect" },
{ OOX_TOKEN(w14, textOutline) , "CharTextOutlineTextEffect" },
{ OOX_TOKEN(w14, textFill) , "CharTextFillTextEffect" },
{ OOX_TOKEN(w14, scene3d) , "CharScene3DTextEffect" },
{ OOX_TOKEN(w14, props3d) , "CharProps3DTextEffect" },
{ OOX_TOKEN(w14, ligatures) , "CharLigaturesTextEffect" },
{ OOX_TOKEN(w14, numForm) , "CharNumFormTextEffect" },
{ OOX_TOKEN(w14, numSpacing) , "CharNumSpacingTextEffect" },
{ OOX_TOKEN(w14, stylisticSets), "CharStylisticSetsTextEffect" },
{ OOX_TOKEN(w14, cntxtAlts) , "CharCntxtAltsTextEffect" },
};
const auto iter = aGrabBagNameMap.find(aId);
assert(iter != aGrabBagNameMap.end());
return iter->second;
}
}
using namespace oox::core;
using namespace com::sun::star::uno;
using namespace com::sun::star::beans;
TextEffectsContext::TextEffectsContext(
ContextHandler2Helper const & rParent,
sal_Int32 aElementToken,
std::vector<PropertyValue>& rTextEffectsProperties)
: ContextHandler2(rParent)
, mrTextEffectsProperties(rTextEffectsProperties)
, mnCurrentElement(aElementToken)
{
}
TextEffectsContext::~TextEffectsContext()
{
}
void TextEffectsContext::pushAttributeToGrabBag (sal_Int32 aAttributeId, const OUString& rElementName, const AttributeList& rAttribs)
{
if (!rAttribs.hasAttribute(aAttributeId))
return ;
OUString aString = rAttribs.getStringDefaulted(aAttributeId);
mpGrabBagStack->addString(rElementName, aString);
}
void TextEffectsContext::processAttributes(const AttributeList& rAttribs)
{
mpGrabBagStack->push(u"attributes" _ustr);
switch (mnCurrentElement)
{
case OOX_TOKEN(w14, glow):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, rad), u"rad" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, srgbClr):
case OOX_TOKEN(w14, schemeClr):
case OOX_TOKEN(w14, tint):
case OOX_TOKEN(w14, shade):
case OOX_TOKEN(w14, alpha):
case OOX_TOKEN(w14, hueMod):
case OOX_TOKEN(w14, sat):
case OOX_TOKEN(w14, satOff):
case OOX_TOKEN(w14, satMod):
case OOX_TOKEN(w14, lum):
case OOX_TOKEN(w14, lumOff):
case OOX_TOKEN(w14, lumMod):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, val), u"val" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, shadow):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, blurRad), u"blurRad" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, dist), u"dist" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, dir), u"dir" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, sx), u"sx" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, sy), u"sy" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, kx), u"kx" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, ky), u"ky" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, algn), u"algn" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, reflection):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, blurRad), u"blurRad" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, stA), u"stA" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, stPos), u"stPos" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, endA), u"endA" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, endPos), u"endPos" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, dist), u"dist" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, dir), u"dir" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, fadeDir), u"fadeDir" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, sx), u"sx" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, sy), u"sy" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, kx), u"kx" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, ky), u"ky" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, algn), u"algn" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, textOutline):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, w), u"w" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, cap), u"cap" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, cmpd), u"cmpd" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, algn), u"algn" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, prstDash):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, val), u"val" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, gs):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, pos), u"pos" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, lin):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, ang), u"ang" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, scaled), u"scaled" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, path):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, path), u"path" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, fillToRect):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, l), u"l" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, t), u"t" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, r), u"r" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, b), u"b" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, miter):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, lim), u"lim" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, camera):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, prst), u"prst" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, lightRig):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, rig), u"rig" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, dir), u"dir" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, rot):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, lat), u"lat" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, lon), u"lon" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, rev), u"rev" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, props3d):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, extrusionH), u"extrusionH" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, contourW), u"contourW" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, prstMaterial), u"prstMaterial" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, bevelT):
case OOX_TOKEN(w14, bevelB):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, w), u"w" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, h), u"h" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, prst), u"prst" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, ligatures):
case OOX_TOKEN(w14, numForm):
case OOX_TOKEN(w14, numSpacing):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, val), u"val" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, styleSet):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, id), u"id" _ustr, rAttribs);
pushAttributeToGrabBag(OOX_TOKEN(w14, val), u"val" _ustr, rAttribs);
}
break ;
case OOX_TOKEN(w14, cntxtAlts):
{
pushAttributeToGrabBag(OOX_TOKEN(w14, val), u"val" _ustr, rAttribs);
}
break ;
default :
break ;
}
mpGrabBagStack->pop();
}
void TextEffectsContext::onStartElement(const oox::AttributeList& rAttribs)
{
if (mpGrabBagStack == nullptr)
{
OUString aGrabBagName = lclGetGrabBagName(mnCurrentElement);
mpGrabBagStack.reset(new GrabBagStack(aGrabBagName));
}
OUString aElementName = lclGetNameForElementId(mnCurrentElement);
mpGrabBagStack->push(aElementName);
processAttributes(rAttribs);
}
void TextEffectsContext::onEndElement()
{
mpGrabBagStack->pop();
if (mpGrabBagStack->isStackEmpty())
{
Sequence<PropertyValue> aSeq;
PropertyValue aPropertyValue = mpGrabBagStack->getRootProperty();
aPropertyValue.Value >>= aSeq;
aPropertyValue.Value <<= aSeq[0 ];
mrTextEffectsProperties.push_back(aPropertyValue);
}
}
ContextHandlerRef TextEffectsContext::onCreateContext(sal_Int32 aElementToken, const AttributeList& /*rAttribs*/)
{
mnCurrentElement = aElementToken;
return this ;
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Messung V0.5 in Prozent C=93 H=90 G=91
¤ Dauer der Verarbeitung: 0.4 Sekunden
¤
*© Formatika GbR, Deutschland