summaryrefslogtreecommitdiff
path: root/writerfilter/source
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/source')
-rw-r--r--writerfilter/source/dmapper/BorderHandler.cxx243
-rw-r--r--writerfilter/source/dmapper/BorderHandler.hxx86
-rw-r--r--writerfilter/source/dmapper/CellColorHandler.cxx395
-rw-r--r--writerfilter/source/dmapper/CellColorHandler.hxx79
-rw-r--r--writerfilter/source/dmapper/CellMarginHandler.cxx177
-rw-r--r--writerfilter/source/dmapper/CellMarginHandler.hxx64
-rw-r--r--writerfilter/source/dmapper/ConversionHelper.cxx691
-rw-r--r--writerfilter/source/dmapper/ConversionHelper.hxx60
-rw-r--r--writerfilter/source/dmapper/DocumentProtection.cxx239
-rw-r--r--writerfilter/source/dmapper/DocumentProtection.hxx88
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx5049
-rw-r--r--writerfilter/source/dmapper/DomainMapper.hxx199
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableHandler.cxx1778
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableHandler.hxx121
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableManager.cxx864
-rw-r--r--writerfilter/source/dmapper/DomainMapperTableManager.hxx172
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx9924
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.hxx1258
-rw-r--r--writerfilter/source/dmapper/FFDataHandler.cxx190
-rw-r--r--writerfilter/source/dmapper/FFDataHandler.hxx99
-rw-r--r--writerfilter/source/dmapper/FieldTypes.hxx306
-rw-r--r--writerfilter/source/dmapper/FontTable.cxx299
-rw-r--r--writerfilter/source/dmapper/FontTable.hxx106
-rw-r--r--writerfilter/source/dmapper/FormControlHelper.cxx379
-rw-r--r--writerfilter/source/dmapper/FormControlHelper.hxx52
-rw-r--r--writerfilter/source/dmapper/GraphicHelpers.cxx434
-rw-r--r--writerfilter/source/dmapper/GraphicHelpers.hxx82
-rw-r--r--writerfilter/source/dmapper/GraphicImport.cxx2118
-rw-r--r--writerfilter/source/dmapper/GraphicImport.hxx140
-rw-r--r--writerfilter/source/dmapper/LatentStyleHandler.cxx71
-rw-r--r--writerfilter/source/dmapper/LatentStyleHandler.hxx35
-rw-r--r--writerfilter/source/dmapper/LoggedResources.cxx401
-rw-r--r--writerfilter/source/dmapper/LoggedResources.hxx147
-rw-r--r--writerfilter/source/dmapper/MeasureHandler.cxx136
-rw-r--r--writerfilter/source/dmapper/MeasureHandler.hxx60
-rw-r--r--writerfilter/source/dmapper/ModelEventListener.cxx117
-rw-r--r--writerfilter/source/dmapper/ModelEventListener.hxx40
-rw-r--r--writerfilter/source/dmapper/NumberingManager.cxx1213
-rw-r--r--writerfilter/source/dmapper/NumberingManager.hxx251
-rw-r--r--writerfilter/source/dmapper/OLEHandler.cxx331
-rw-r--r--writerfilter/source/dmapper/OLEHandler.hxx94
-rw-r--r--writerfilter/source/dmapper/PageBordersHandler.cxx145
-rw-r--r--writerfilter/source/dmapper/PageBordersHandler.hxx62
-rw-r--r--writerfilter/source/dmapper/PropertyIds.cxx415
-rw-r--r--writerfilter/source/dmapper/PropertyIds.hxx399
-rw-r--r--writerfilter/source/dmapper/PropertyMap.cxx2170
-rw-r--r--writerfilter/source/dmapper/PropertyMap.hxx651
-rw-r--r--writerfilter/source/dmapper/PropertyMapHelper.cxx98
-rw-r--r--writerfilter/source/dmapper/PropertyMapHelper.hxx34
-rw-r--r--writerfilter/source/dmapper/SdtHelper.cxx647
-rw-r--r--writerfilter/source/dmapper/SdtHelper.hxx255
-rw-r--r--writerfilter/source/dmapper/SectionColumnHandler.cxx90
-rw-r--r--writerfilter/source/dmapper/SectionColumnHandler.hxx62
-rw-r--r--writerfilter/source/dmapper/SettingsTable.cxx800
-rw-r--r--writerfilter/source/dmapper/SettingsTable.hxx113
-rw-r--r--writerfilter/source/dmapper/SmartTagHandler.cxx127
-rw-r--r--writerfilter/source/dmapper/SmartTagHandler.hxx60
-rw-r--r--writerfilter/source/dmapper/StyleSheetTable.cxx1830
-rw-r--r--writerfilter/source/dmapper/StyleSheetTable.hxx155
-rw-r--r--writerfilter/source/dmapper/TDefTableHandler.cxx538
-rw-r--r--writerfilter/source/dmapper/TDefTableHandler.hxx82
-rw-r--r--writerfilter/source/dmapper/TableData.hxx419
-rw-r--r--writerfilter/source/dmapper/TableManager.cxx686
-rw-r--r--writerfilter/source/dmapper/TableManager.hxx527
-rw-r--r--writerfilter/source/dmapper/TablePositionHandler.cxx160
-rw-r--r--writerfilter/source/dmapper/TablePositionHandler.hxx71
-rw-r--r--writerfilter/source/dmapper/TablePropertiesHandler.cxx398
-rw-r--r--writerfilter/source/dmapper/TablePropertiesHandler.hxx94
-rw-r--r--writerfilter/source/dmapper/TagLogger.cxx240
-rw-r--r--writerfilter/source/dmapper/TagLogger.hxx70
-rw-r--r--writerfilter/source/dmapper/TblStylePrHandler.cxx259
-rw-r--r--writerfilter/source/dmapper/TblStylePrHandler.hxx82
-rw-r--r--writerfilter/source/dmapper/TextEffectsHandler.cxx806
-rw-r--r--writerfilter/source/dmapper/TextEffectsHandler.hxx69
-rw-r--r--writerfilter/source/dmapper/ThemeColorHandler.hxx68
-rw-r--r--writerfilter/source/dmapper/ThemeHandler.cxx423
-rw-r--r--writerfilter/source/dmapper/ThemeHandler.hxx35
-rw-r--r--writerfilter/source/dmapper/TrackChangesHandler.cxx88
-rw-r--r--writerfilter/source/dmapper/TrackChangesHandler.hxx40
-rw-r--r--writerfilter/source/dmapper/WrapPolygonHandler.cxx214
-rw-r--r--writerfilter/source/dmapper/WrapPolygonHandler.hxx82
-rw-r--r--writerfilter/source/dmapper/WriteProtection.cxx140
-rw-r--r--writerfilter/source/dmapper/WriteProtection.hxx58
-rw-r--r--writerfilter/source/dmapper/domainmapperfactory.cxx39
-rw-r--r--writerfilter/source/dmapper/util.cxx70
-rw-r--r--writerfilter/source/dmapper/util.hxx32
-rw-r--r--writerfilter/source/filter/RtfFilter.cxx220
-rw-r--r--writerfilter/source/filter/WriterFilter.cxx367
-rw-r--r--writerfilter/source/ooxml/Handler.cxx435
-rw-r--r--writerfilter/source/ooxml/Handler.hxx179
-rw-r--r--writerfilter/source/ooxml/OOXMLBinaryObjectReference.cxx73
-rw-r--r--writerfilter/source/ooxml/OOXMLBinaryObjectReference.hxx43
-rw-r--r--writerfilter/source/ooxml/OOXMLDocumentImpl.cxx911
-rw-r--r--writerfilter/source/ooxml/OOXMLDocumentImpl.hxx171
-rw-r--r--writerfilter/source/ooxml/OOXMLFactory.cxx179
-rw-r--r--writerfilter/source/ooxml/OOXMLFactory.hxx109
-rw-r--r--writerfilter/source/ooxml/OOXMLFastContextHandler.cxx2384
-rw-r--r--writerfilter/source/ooxml/OOXMLFastContextHandler.hxx634
-rw-r--r--writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.cxx71
-rw-r--r--writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.hxx47
-rw-r--r--writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx146
-rw-r--r--writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx90
-rw-r--r--writerfilter/source/ooxml/OOXMLFastHelper.hxx61
-rw-r--r--writerfilter/source/ooxml/OOXMLParserState.cxx296
-rw-r--r--writerfilter/source/ooxml/OOXMLParserState.hxx130
-rw-r--r--writerfilter/source/ooxml/OOXMLPropertySet.cxx844
-rw-r--r--writerfilter/source/ooxml/OOXMLPropertySet.hxx415
-rw-r--r--writerfilter/source/ooxml/OOXMLStreamImpl.cxx449
-rw-r--r--writerfilter/source/ooxml/OOXMLStreamImpl.hxx83
-rw-r--r--writerfilter/source/ooxml/README13
-rw-r--r--writerfilter/source/ooxml/factory_ns.py76
-rw-r--r--writerfilter/source/ooxml/factoryimpl.py214
-rw-r--r--writerfilter/source/ooxml/factoryimpl_ns.py755
-rw-r--r--writerfilter/source/ooxml/factoryinc.py49
-rw-r--r--writerfilter/source/ooxml/model.xml19426
-rw-r--r--writerfilter/source/ooxml/modelpreprocess.py90
-rw-r--r--writerfilter/source/ooxml/qnametostr.py64
-rw-r--r--writerfilter/source/ooxml/resourceids.py60
-rw-r--r--writerfilter/source/ooxml/tox.ini2
-rw-r--r--writerfilter/source/rtftok/README12
-rw-r--r--writerfilter/source/rtftok/rtfcharsets.cxx66
-rw-r--r--writerfilter/source/rtftok/rtfcharsets.hxx37
-rw-r--r--writerfilter/source/rtftok/rtfcontrolwords.cxx1900
-rw-r--r--writerfilter/source/rtftok/rtfcontrolwords.hxx2049
-rw-r--r--writerfilter/source/rtftok/rtfdispatchdestination.cxx684
-rw-r--r--writerfilter/source/rtftok/rtfdispatchflag.cxx1381
-rw-r--r--writerfilter/source/rtftok/rtfdispatchsymbol.cxx455
-rw-r--r--writerfilter/source/rtftok/rtfdispatchvalue.cxx1909
-rw-r--r--writerfilter/source/rtftok/rtfdocumentfactory.cxx28
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx4062
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.hxx995
-rw-r--r--writerfilter/source/rtftok/rtffly.hxx138
-rw-r--r--writerfilter/source/rtftok/rtflistener.hxx69
-rw-r--r--writerfilter/source/rtftok/rtflookahead.cxx101
-rw-r--r--writerfilter/source/rtftok/rtflookahead.hxx57
-rw-r--r--writerfilter/source/rtftok/rtfreferenceproperties.cxx40
-rw-r--r--writerfilter/source/rtftok/rtfreferenceproperties.hxx33
-rw-r--r--writerfilter/source/rtftok/rtfreferencetable.cxx29
-rw-r--r--writerfilter/source/rtftok/rtfreferencetable.hxx32
-rw-r--r--writerfilter/source/rtftok/rtfsdrimport.cxx1186
-rw-r--r--writerfilter/source/rtftok/rtfsdrimport.hxx104
-rw-r--r--writerfilter/source/rtftok/rtfskipdestination.cxx42
-rw-r--r--writerfilter/source/rtftok/rtfskipdestination.hxx33
-rw-r--r--writerfilter/source/rtftok/rtfsprm.cxx487
-rw-r--r--writerfilter/source/rtftok/rtfsprm.hxx101
-rw-r--r--writerfilter/source/rtftok/rtftokenizer.cxx330
-rw-r--r--writerfilter/source/rtftok/rtftokenizer.hxx72
-rw-r--r--writerfilter/source/rtftok/rtfvalue.cxx231
-rw-r--r--writerfilter/source/rtftok/rtfvalue.hxx91
149 files changed, 0 insertions, 88331 deletions
diff --git a/writerfilter/source/dmapper/BorderHandler.cxx b/writerfilter/source/dmapper/BorderHandler.cxx
deleted file mode 100644
index ed14194c2a01..000000000000
--- a/writerfilter/source/dmapper/BorderHandler.cxx
+++ /dev/null
@@ -1,243 +0,0 @@
-/* -*- 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/.
- *
- * 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 "BorderHandler.hxx"
-#include "TDefTableHandler.hxx"
-#include "PropertyMap.hxx"
-#include "ConversionHelper.hxx"
-#include <com/sun/star/table/BorderLine2.hpp>
-#include <o3tl/enumarray.hxx>
-#include <o3tl/enumrange.hxx>
-#include <ooxml/resourceids.hxx>
-#include <filter/msfilter/util.hxx>
-#include <comphelper/sequence.hxx>
-#include <tools/color.hxx>
-
-namespace writerfilter::dmapper {
-
-using namespace ::com::sun::star;
-
-
-BorderHandler::BorderHandler( bool bOOXML ) :
-LoggedProperties("BorderHandler"),
-m_nLineWidth(15), // Word default, in twips
-m_nLineType(0),
-m_nLineColor(0),
-m_nLineDistance(0),
-m_bShadow(false),
-m_bOOXML( bOOXML )
-{
- m_aFilledLines.fill(false);
- m_aBorderLines.fill(table::BorderLine2());
-}
-
-BorderHandler::~BorderHandler()
-{
-}
-
-void BorderHandler::lcl_attribute(Id rName, Value & rVal)
-{
- sal_Int32 nIntValue = rVal.getInt();
- switch( rName )
- {
- case NS_ooxml::LN_CT_Border_sz:
- // width of a single line in 1/8 pt, max of 32 pt -> twip * 5 / 2.
- m_nLineWidth = nIntValue * 5 / 2;
- appendGrabBag("sz", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Border_val:
- m_nLineType = nIntValue;
- appendGrabBag("val", TDefTableHandler::getBorderTypeString(nIntValue));
- break;
- case NS_ooxml::LN_CT_Border_color:
- m_nLineColor = nIntValue;
- appendGrabBag("color", msfilter::util::ConvertColorOU(Color(ColorTransparency, nIntValue)));
- break;
- case NS_ooxml::LN_CT_Border_space: // border distance in points
- m_nLineDistance = ConversionHelper::convertTwipToMM100( nIntValue * 20 );
- appendGrabBag("space", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Border_shadow:
- m_bShadow = nIntValue;
- break;
- case NS_ooxml::LN_CT_Border_frame:
- appendGrabBag("frame", OUString::number(nIntValue, 16));
- break;
- case NS_ooxml::LN_CT_Border_themeTint:
- m_nThemeTint = nIntValue;
- appendGrabBag("themeTint", OUString::number(nIntValue, 16));
- break;
- case NS_ooxml::LN_CT_Border_themeShade:
- m_nThemeShade = nIntValue;
- appendGrabBag("themeShade", OUString::number(nIntValue, 16));
- break;
- case NS_ooxml::LN_CT_Border_themeColor:
- m_eThemeColorType = TDefTableHandler::getThemeColorTypeIndex(nIntValue);
- appendGrabBag("themeColor", TDefTableHandler::getThemeColorTypeString(nIntValue));
- break;
- default:
- OSL_FAIL( "unknown attribute");
- }
-}
-
-void BorderHandler::lcl_sprm(Sprm & rSprm)
-{
- BorderPosition pos;
- const bool rtl = false; // TODO detect
- OUString aBorderPos;
- switch( rSprm.getId())
- {
- case NS_ooxml::LN_CT_TblBorders_top:
- pos = BorderPosition::Top;
- aBorderPos = "top";
- break;
- case NS_ooxml::LN_CT_TblBorders_start:
- pos = rtl ? BorderPosition::Right : BorderPosition::Left;
- aBorderPos = "start";
- break;
- case NS_ooxml::LN_CT_TblBorders_left:
- pos = BorderPosition::Left;
- aBorderPos = "left";
- break;
- case NS_ooxml::LN_CT_TblBorders_bottom:
- pos = BorderPosition::Bottom;
- aBorderPos = "bottom";
- break;
- case NS_ooxml::LN_CT_TblBorders_end:
- pos = rtl ? BorderPosition::Left : BorderPosition::Right;
- aBorderPos = "end";
- break;
- case NS_ooxml::LN_CT_TblBorders_right:
- pos = BorderPosition::Right;
- aBorderPos = "right";
- break;
- case NS_ooxml::LN_CT_TblBorders_insideH:
- pos = BorderPosition::Horizontal;
- aBorderPos = "insideH";
- break;
- case NS_ooxml::LN_CT_TblBorders_insideV:
- pos = BorderPosition::Vertical;
- aBorderPos = "insideV";
- break;
- default:
- return;
- }
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties)
- {
- std::vector<beans::PropertyValue> aSavedGrabBag;
- if (!m_aInteropGrabBagName.isEmpty())
- {
- aSavedGrabBag = m_aInteropGrabBag;
- m_aInteropGrabBag.clear();
- }
- pProperties->resolve(*this);
- if (!m_aInteropGrabBagName.isEmpty())
- {
- aSavedGrabBag.push_back(getInteropGrabBag(aBorderPos));
- m_aInteropGrabBag = aSavedGrabBag;
- }
- }
- ConversionHelper::MakeBorderLine( m_nLineWidth, m_nLineType, m_nLineColor,
- m_aBorderLines[ pos ], m_bOOXML );
- m_aFilledLines[ pos ] = true;
-}
-
-PropertyMapPtr BorderHandler::getProperties()
-{
- static const o3tl::enumarray<BorderPosition, PropertyIds> aPropNames =
- {
- PROP_TOP_BORDER,
- PROP_LEFT_BORDER,
- PROP_BOTTOM_BORDER,
- PROP_RIGHT_BORDER,
- META_PROP_HORIZONTAL_BORDER,
- META_PROP_VERTICAL_BORDER
- };
- PropertyMapPtr pPropertyMap(new PropertyMap);
- // don't fill in default properties
- if( m_bOOXML )
- {
- for( auto nProp: o3tl::enumrange<BorderPosition>())
- {
- if ( m_aFilledLines[nProp] ) {
- pPropertyMap->Insert( aPropNames[nProp], uno::Any( m_aBorderLines[nProp] ) );
- }
- }
- }
- return pPropertyMap;
-}
-
-table::BorderLine2 BorderHandler::getBorderLine()
-{
- table::BorderLine2 aBorderLine;
- ConversionHelper::MakeBorderLine( m_nLineWidth, m_nLineType, m_nLineColor, aBorderLine, m_bOOXML );
- return aBorderLine;
-}
-
-
-void BorderHandler::enableInteropGrabBag(const OUString& aName)
-{
- m_aInteropGrabBagName = aName;
-}
-
-beans::PropertyValue BorderHandler::getInteropGrabBag(const OUString& aName)
-{
- beans::PropertyValue aRet;
- if (aName.isEmpty())
- aRet.Name = m_aInteropGrabBagName;
- else
- aRet.Name = aName;
-
- aRet.Value <<= comphelper::containerToSequence(m_aInteropGrabBag);
- return aRet;
-}
-
-void BorderHandler::appendGrabBag(const OUString& aKey, const OUString& aValue)
-{
- beans::PropertyValue aProperty;
- aProperty.Name = aKey;
- aProperty.Value <<= aValue;
- m_aInteropGrabBag.push_back(aProperty);
-}
-
-model::ComplexColor BorderHandler::getComplexColor() const
-{
- model::ComplexColor aComplexColor;
- if (m_eThemeColorType == model::ThemeColorType::Unknown)
- return aComplexColor;
-
- aComplexColor.setThemeColor(m_eThemeColorType);
-
- if (m_nThemeTint > 0 )
- {
- sal_Int16 nTint = sal_Int16((255.0 - m_nThemeTint) * 10000.0 / 255.0);
- aComplexColor.addTransformation({model::TransformationType::Tint, nTint});
- }
- if (m_nThemeShade > 0)
- {
- sal_Int16 nShade = sal_Int16((255.0 - m_nThemeShade) * 10000 / 255.0);
- aComplexColor.addTransformation({model::TransformationType::Shade, nShade});
- }
-
- return aComplexColor;
-}
-
-} //namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/BorderHandler.hxx b/writerfilter/source/dmapper/BorderHandler.hxx
deleted file mode 100644
index 9a523bffc576..000000000000
--- a/writerfilter/source/dmapper/BorderHandler.hxx
+++ /dev/null
@@ -1,86 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <vector>
-#include "LoggedResources.hxx"
-#include "PropertyMap.hxx"
-#include <com/sun/star/table/BorderLine2.hpp>
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <o3tl/enumarray.hxx>
-#include <docmodel/theme/ThemeColorType.hxx>
-#include <docmodel/color/ComplexColor.hxx>
-
-namespace writerfilter::dmapper
-{
-class PropertyMap;
-class BorderHandler : public LoggedProperties
-{
-private:
- //todo: order is a guess
- enum class BorderPosition
- {
- Top,
- Left,
- Bottom,
- Right,
- Horizontal,
- Vertical,
- LAST = Vertical
- };
-
- //values of the current border
- sal_Int32 m_nLineWidth;
- sal_Int32 m_nLineType;
- sal_Int32 m_nLineColor;
- sal_Int32 m_nLineDistance;
- bool m_bShadow;
- bool m_bOOXML;
- model::ThemeColorType m_eThemeColorType = model::ThemeColorType::Unknown;
- sal_Int32 m_nThemeShade = 0;
- sal_Int32 m_nThemeTint = 0;
-
- o3tl::enumarray<BorderPosition, bool> m_aFilledLines;
- o3tl::enumarray<BorderPosition, css::table::BorderLine2> m_aBorderLines;
- OUString m_aInteropGrabBagName;
- std::vector<css::beans::PropertyValue> m_aInteropGrabBag;
- void appendGrabBag(const OUString& aKey, const OUString& aValue);
-
- // Properties
- virtual void lcl_attribute(Id Name, Value & val) override;
- virtual void lcl_sprm(Sprm & sprm) override;
-
-public:
- explicit BorderHandler( bool bOOXML );
- virtual ~BorderHandler() override;
-
- PropertyMapPtr getProperties();
- css::table::BorderLine2 getBorderLine();
- sal_Int32 getLineDistance() const { return m_nLineDistance;}
- sal_Int32 getLineType() const { return m_nLineType;}
- bool getShadow() const { return m_bShadow;}
- void enableInteropGrabBag(const OUString& aName);
- css::beans::PropertyValue getInteropGrabBag(const OUString& aName = OUString());
-
- model::ComplexColor getComplexColor() const;
-
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/CellColorHandler.cxx b/writerfilter/source/dmapper/CellColorHandler.cxx
deleted file mode 100644
index b99d40c08a12..000000000000
--- a/writerfilter/source/dmapper/CellColorHandler.cxx
+++ /dev/null
@@ -1,395 +0,0 @@
-/* -*- 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/.
- *
- * 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 "CellColorHandler.hxx"
-#include "PropertyMap.hxx"
-#include "TDefTableHandler.hxx"
-#include <ooxml/resourceids.hxx>
-#include <com/sun/star/drawing/FillStyle.hpp>
-#include <com/sun/star/drawing/ShadingPattern.hpp>
-#include <filter/msfilter/util.hxx>
-#include <comphelper/sequence.hxx>
-#include <tools/color.hxx>
-#include <docmodel/uno/UnoComplexColor.hxx>
-
-namespace writerfilter::dmapper {
-
-using namespace ::com::sun::star;
-
-CellColorHandler::CellColorHandler() :
-LoggedProperties("CellColorHandler"),
-m_nShadingPattern( drawing::ShadingPattern::CLEAR ),
-m_nColor( 0xffffffff ),
-m_nFillColor( 0xffffffff ),
-m_bAutoFillColor( true ),
-m_bFillSpecified( false ),
- m_OutputFormat( Form )
-{
-}
-
-CellColorHandler::~CellColorHandler()
-{
-}
-
-// ST_Shd strings are converted to integers by the tokenizer, store strings in
-// the InteropGrabBag
-static uno::Any lcl_ConvertShd(sal_Int32 nIntValue)
-{
- OUString aRet;
- // This should be in sync with the ST_Shd list in ooxml's model.xml.
- switch (nIntValue)
- {
- case NS_ooxml::LN_Value_ST_Shd_clear: aRet = "clear"; break;
- case NS_ooxml::LN_Value_ST_Shd_solid: aRet = "solid"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct5: aRet = "pct5"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct10: aRet = "pct10"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct20: aRet = "pct20"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct25: aRet = "pct25"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct30: aRet = "pct30"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct40: aRet = "pct40"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct50: aRet = "pct50"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct60: aRet = "pct60"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct70: aRet = "pct70"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct75: aRet = "pct75"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct80: aRet = "pct80"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct90: aRet = "pct90"; break;
- case NS_ooxml::LN_Value_ST_Shd_horzStripe: aRet = "horzStripe"; break;
- case NS_ooxml::LN_Value_ST_Shd_vertStripe: aRet = "vertStripe"; break;
- case NS_ooxml::LN_Value_ST_Shd_reverseDiagStripe: aRet = "reverseDiagStripe"; break;
- case NS_ooxml::LN_Value_ST_Shd_diagStripe: aRet = "diagStripe"; break;
- case NS_ooxml::LN_Value_ST_Shd_horzCross: aRet = "horzCross"; break;
- case NS_ooxml::LN_Value_ST_Shd_diagCross: aRet = "diagCross"; break;
- case NS_ooxml::LN_Value_ST_Shd_thinHorzStripe: aRet = "thinHorzStripe"; break;
- case NS_ooxml::LN_Value_ST_Shd_thinVertStripe: aRet = "thinVertStripe"; break;
- case NS_ooxml::LN_Value_ST_Shd_thinReverseDiagStripe: aRet = "thinReverseDiagStripe"; break;
- case NS_ooxml::LN_Value_ST_Shd_thinDiagStripe: aRet = "thinDiagStripe"; break;
- case NS_ooxml::LN_Value_ST_Shd_thinHorzCross: aRet = "thinHorzCross"; break;
- case NS_ooxml::LN_Value_ST_Shd_thinDiagCross: aRet = "thinDiagCross"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct12: aRet = "pct12"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct15: aRet = "pct15"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct35: aRet = "pct35"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct37: aRet = "pct37"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct45: aRet = "pct45"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct55: aRet = "pct55"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct62: aRet = "pct62"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct65: aRet = "pct65"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct85: aRet = "pct85"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct87: aRet = "pct87"; break;
- case NS_ooxml::LN_Value_ST_Shd_pct95: aRet = "pct95"; break;
- case NS_ooxml::LN_Value_ST_Shd_nil: aRet = "nil"; break;
- }
- return uno::Any(aRet);
-}
-
-void CellColorHandler::lcl_attribute(Id rName, Value & rVal)
-{
- sal_Int32 nIntValue = rVal.getInt();
- switch( rName )
- {
- case NS_ooxml::LN_CT_Shd_val:
- {
- createGrabBag("val", lcl_ConvertShd(nIntValue));
- m_nShadingPattern = nIntValue;
- }
- break;
- case NS_ooxml::LN_CT_Shd_fill:
- createGrabBag("fill", uno::Any(msfilter::util::ConvertColorOU(Color(ColorTransparency, nIntValue))));
- if( nIntValue == sal_Int32(COL_AUTO) )
- nIntValue = 0xffffff; //fill color auto means white
- else
- m_bAutoFillColor = false;
-
- m_nFillColor = nIntValue;
- m_bFillSpecified = true;
- break;
- case NS_ooxml::LN_CT_Shd_color:
- createGrabBag("color", uno::Any(msfilter::util::ConvertColorOU(Color(ColorTransparency, nIntValue))));
- if( nIntValue == sal_Int32(COL_AUTO) )
- nIntValue = 0; //shading color auto means black
- //color of the shading
- m_nColor = nIntValue;
- break;
- case NS_ooxml::LN_CT_Shd_themeFill:
- m_eFillThemeColorType = TDefTableHandler::getThemeColorTypeIndex(nIntValue);
- createGrabBag("themeFill", uno::Any(TDefTableHandler::getThemeColorTypeString(nIntValue)));
- break;
- case NS_ooxml::LN_CT_Shd_themeFillShade:
- m_nFillThemeColorShade = nIntValue;
- createGrabBag("themeFillShade", uno::Any(OUString::number(nIntValue, 16)));
- break;
- case NS_ooxml::LN_CT_Shd_themeFillTint:
- m_nFillThemeColorTint = nIntValue;
- createGrabBag("themeFillTint", uno::Any(OUString::number(nIntValue, 16)));
- break;
- case NS_ooxml::LN_CT_Shd_themeColor:
- m_eThemeColorType = TDefTableHandler::getThemeColorTypeIndex(nIntValue);
- createGrabBag("themeColor", uno::Any(TDefTableHandler::getThemeColorTypeString(nIntValue)));
- break;
- case NS_ooxml::LN_CT_Shd_themeShade:
- m_nThemeColorShade = nIntValue;
- createGrabBag("themeShade", uno::Any(OUString::number(nIntValue, 16)));
- break;
- case NS_ooxml::LN_CT_Shd_themeTint:
- m_nThemeColorTint = nIntValue;
- createGrabBag("themeTint", uno::Any(OUString::number(nIntValue, 16)));
- break;
- default:
- OSL_FAIL( "unknown attribute");
- }
-}
-
-void CellColorHandler::lcl_sprm(Sprm &) {}
-
-TablePropertyMapPtr CellColorHandler::getProperties()
-{
- TablePropertyMapPtr pPropertyMap(new TablePropertyMap);
-
- // Code from binary word filter (the values are out of 1000)
- sal_Int32 nWW8BrushStyle = 0;
- switch (m_nShadingPattern)
- {
- // Clear-Brush
- case NS_ooxml::LN_Value_ST_Shd_clear: nWW8BrushStyle = 0; break;
- // Solid-Brush
- case NS_ooxml::LN_Value_ST_Shd_solid: nWW8BrushStyle = 1000; break;
- // Percent values
- case NS_ooxml::LN_Value_ST_Shd_pct5: nWW8BrushStyle = 50; break;
- case NS_ooxml::LN_Value_ST_Shd_pct10: nWW8BrushStyle = 100; break;
- case NS_ooxml::LN_Value_ST_Shd_pct20: nWW8BrushStyle = 200; break;
- case NS_ooxml::LN_Value_ST_Shd_pct25: nWW8BrushStyle = 250; break;
- case NS_ooxml::LN_Value_ST_Shd_pct30: nWW8BrushStyle = 300; break;
- case NS_ooxml::LN_Value_ST_Shd_pct40: nWW8BrushStyle = 400; break;
- case NS_ooxml::LN_Value_ST_Shd_pct50: nWW8BrushStyle = 500; break;
- case NS_ooxml::LN_Value_ST_Shd_pct60: nWW8BrushStyle = 600; break;
- case NS_ooxml::LN_Value_ST_Shd_pct70: nWW8BrushStyle = 700; break;
- case NS_ooxml::LN_Value_ST_Shd_pct75: nWW8BrushStyle = 750; break;
- case NS_ooxml::LN_Value_ST_Shd_pct80: nWW8BrushStyle = 800; break;
- case NS_ooxml::LN_Value_ST_Shd_pct90: nWW8BrushStyle = 900; break;
- // Special cases
- case NS_ooxml::LN_Value_ST_Shd_horzStripe: nWW8BrushStyle = 333; break; // Dark Horizontal
- case NS_ooxml::LN_Value_ST_Shd_vertStripe: nWW8BrushStyle = 333; break; // Dark Vertical
- case NS_ooxml::LN_Value_ST_Shd_reverseDiagStripe: nWW8BrushStyle = 333; break; // Dark Forward Diagonal
- case NS_ooxml::LN_Value_ST_Shd_diagStripe: nWW8BrushStyle = 333; break; // Dark Backward Diagonal
- case NS_ooxml::LN_Value_ST_Shd_horzCross: nWW8BrushStyle = 333; break; // Dark Cross
- case NS_ooxml::LN_Value_ST_Shd_diagCross: nWW8BrushStyle = 333; break; // Dark Diagonal Cross
- case NS_ooxml::LN_Value_ST_Shd_thinHorzStripe: nWW8BrushStyle = 333; break; // Horizontal
- case NS_ooxml::LN_Value_ST_Shd_thinVertStripe: nWW8BrushStyle = 333; break; // Vertical
- case NS_ooxml::LN_Value_ST_Shd_thinReverseDiagStripe: nWW8BrushStyle = 333; break; // Forward Diagonal
- case NS_ooxml::LN_Value_ST_Shd_thinDiagStripe: nWW8BrushStyle = 333; break; // Backward Diagonal
- case NS_ooxml::LN_Value_ST_Shd_thinHorzCross: nWW8BrushStyle = 333; break; // Cross
- case NS_ooxml::LN_Value_ST_Shd_thinDiagCross: nWW8BrushStyle = 333; break; // 25 Diagonal Cross
- // Different shading types
- case NS_ooxml::LN_Value_ST_Shd_pct12: nWW8BrushStyle = 125; break;
- case NS_ooxml::LN_Value_ST_Shd_pct15: nWW8BrushStyle = 150; break;
- case NS_ooxml::LN_Value_ST_Shd_pct35: nWW8BrushStyle = 350; break;
- case NS_ooxml::LN_Value_ST_Shd_pct37: nWW8BrushStyle = 375; break;
- case NS_ooxml::LN_Value_ST_Shd_pct45: nWW8BrushStyle = 450; break;
- case NS_ooxml::LN_Value_ST_Shd_pct55: nWW8BrushStyle = 550; break;
- case NS_ooxml::LN_Value_ST_Shd_pct62: nWW8BrushStyle = 625; break;
- case NS_ooxml::LN_Value_ST_Shd_pct65: nWW8BrushStyle = 650; break;
- case NS_ooxml::LN_Value_ST_Shd_pct85: nWW8BrushStyle = 850; break;
- case NS_ooxml::LN_Value_ST_Shd_pct87: nWW8BrushStyle = 875; break;
- case NS_ooxml::LN_Value_ST_Shd_pct95: nWW8BrushStyle = 950; break;
- }
-
- sal_Int32 nApplyColor = 0;
- if( !nWW8BrushStyle )
- {
- // Clear-Brush
- if ( m_bFillSpecified && m_bAutoFillColor )
- nApplyColor = sal_Int32(COL_AUTO);
- else
- nApplyColor = m_nFillColor;
- }
- else
- {
- sal_Int32 nFore = m_nColor;
- sal_Int32 nBack = m_nFillColor;
-
- sal_uInt32 nRed = ((nFore & 0xff0000)>>0x10) * nWW8BrushStyle;
- sal_uInt32 nGreen = ((nFore & 0xff00)>>0x8) * nWW8BrushStyle;
- sal_uInt32 nBlue = (nFore & 0xff) * nWW8BrushStyle;
- nRed += ((nBack & 0xff0000)>>0x10) * (1000L - nWW8BrushStyle);
- nGreen += ((nBack & 0xff00)>>0x8)* (1000L - nWW8BrushStyle);
- nBlue += (nBack & 0xff) * (1000L - nWW8BrushStyle);
-
- nApplyColor = ( (nRed/1000) << 0x10 ) + ((nGreen/1000) << 8) + nBlue/1000;
- }
-
- // Check if it is a 'Character'
- if (m_OutputFormat == Character)
- {
- sal_Int32 nShadingPattern = drawing::ShadingPattern::CLEAR;
- switch (m_nShadingPattern)
- {
- case NS_ooxml::LN_Value_ST_Shd_clear: nShadingPattern = drawing::ShadingPattern::CLEAR; break;
- case NS_ooxml::LN_Value_ST_Shd_solid: nShadingPattern = drawing::ShadingPattern::SOLID; break;
- case NS_ooxml::LN_Value_ST_Shd_pct5: nShadingPattern = drawing::ShadingPattern::PCT5; break;
- case NS_ooxml::LN_Value_ST_Shd_pct10: nShadingPattern = drawing::ShadingPattern::PCT10; break;
- case NS_ooxml::LN_Value_ST_Shd_pct20: nShadingPattern = drawing::ShadingPattern::PCT20; break;
- case NS_ooxml::LN_Value_ST_Shd_pct25: nShadingPattern = drawing::ShadingPattern::PCT25; break;
- case NS_ooxml::LN_Value_ST_Shd_pct30: nShadingPattern = drawing::ShadingPattern::PCT30; break;
- case NS_ooxml::LN_Value_ST_Shd_pct40: nShadingPattern = drawing::ShadingPattern::PCT40; break;
- case NS_ooxml::LN_Value_ST_Shd_pct50: nShadingPattern = drawing::ShadingPattern::PCT50; break;
- case NS_ooxml::LN_Value_ST_Shd_pct60: nShadingPattern = drawing::ShadingPattern::PCT60; break;
- case NS_ooxml::LN_Value_ST_Shd_pct70: nShadingPattern = drawing::ShadingPattern::PCT70; break;
- case NS_ooxml::LN_Value_ST_Shd_pct75: nShadingPattern = drawing::ShadingPattern::PCT75; break;
- case NS_ooxml::LN_Value_ST_Shd_pct80: nShadingPattern = drawing::ShadingPattern::PCT80; break;
- case NS_ooxml::LN_Value_ST_Shd_pct90: nShadingPattern = drawing::ShadingPattern::PCT90; break;
- case NS_ooxml::LN_Value_ST_Shd_horzStripe: nShadingPattern = drawing::ShadingPattern::HORZ_STRIPE; break;
- case NS_ooxml::LN_Value_ST_Shd_vertStripe: nShadingPattern = drawing::ShadingPattern::VERT_STRIPE; break;
- case NS_ooxml::LN_Value_ST_Shd_reverseDiagStripe: nShadingPattern = drawing::ShadingPattern::REVERSE_DIAG_STRIPE; break;
- case NS_ooxml::LN_Value_ST_Shd_diagStripe: nShadingPattern = drawing::ShadingPattern::DIAG_STRIPE; break;
- case NS_ooxml::LN_Value_ST_Shd_horzCross: nShadingPattern = drawing::ShadingPattern::HORZ_CROSS; break;
- case NS_ooxml::LN_Value_ST_Shd_diagCross: nShadingPattern = drawing::ShadingPattern::DIAG_CROSS; break;
- case NS_ooxml::LN_Value_ST_Shd_thinHorzStripe: nShadingPattern = drawing::ShadingPattern::THIN_HORZ_STRIPE; break;
- case NS_ooxml::LN_Value_ST_Shd_thinVertStripe: nShadingPattern = drawing::ShadingPattern::THIN_VERT_STRIPE; break;
- case NS_ooxml::LN_Value_ST_Shd_thinReverseDiagStripe: nShadingPattern = drawing::ShadingPattern::THIN_REVERSE_DIAG_STRIPE; break;
- case NS_ooxml::LN_Value_ST_Shd_thinDiagStripe: nShadingPattern = drawing::ShadingPattern::THIN_DIAG_STRIPE; break;
- case NS_ooxml::LN_Value_ST_Shd_thinHorzCross: nShadingPattern = drawing::ShadingPattern::THIN_HORZ_CROSS; break;
- case NS_ooxml::LN_Value_ST_Shd_thinDiagCross: nShadingPattern = drawing::ShadingPattern::THIN_DIAG_CROSS; break;
- case NS_ooxml::LN_Value_ST_Shd_pct12: nShadingPattern = drawing::ShadingPattern::PCT12; break;
- case NS_ooxml::LN_Value_ST_Shd_pct15: nShadingPattern = drawing::ShadingPattern::PCT15; break;
- case NS_ooxml::LN_Value_ST_Shd_pct35: nShadingPattern = drawing::ShadingPattern::PCT35; break;
- case NS_ooxml::LN_Value_ST_Shd_pct37: nShadingPattern = drawing::ShadingPattern::PCT37; break;
- case NS_ooxml::LN_Value_ST_Shd_pct45: nShadingPattern = drawing::ShadingPattern::PCT45; break;
- case NS_ooxml::LN_Value_ST_Shd_pct55: nShadingPattern = drawing::ShadingPattern::PCT55; break;
- case NS_ooxml::LN_Value_ST_Shd_pct62: nShadingPattern = drawing::ShadingPattern::PCT62; break;
- case NS_ooxml::LN_Value_ST_Shd_pct65: nShadingPattern = drawing::ShadingPattern::PCT65; break;
- case NS_ooxml::LN_Value_ST_Shd_pct85: nShadingPattern = drawing::ShadingPattern::PCT85; break;
- case NS_ooxml::LN_Value_ST_Shd_pct87: nShadingPattern = drawing::ShadingPattern::PCT87; break;
- case NS_ooxml::LN_Value_ST_Shd_pct95: nShadingPattern = drawing::ShadingPattern::PCT95; break;
- }
-
- // Write the shading pattern property
- pPropertyMap->Insert(PROP_CHAR_SHADING_VALUE, uno::Any( nShadingPattern ));
- }
-
- if (m_OutputFormat == Paragraph && m_nShadingPattern != NS_ooxml::LN_Value_ST_Shd_nil)
- {
- if (nWW8BrushStyle || !m_bAutoFillColor)
- pPropertyMap->Insert(PROP_FILL_STYLE, uno::Any(drawing::FillStyle_SOLID));
- else if (m_bFillSpecified) // m_bAutoFillColor == true
- pPropertyMap->Insert(PROP_FILL_STYLE, uno::Any(drawing::FillStyle_NONE));
-
- pPropertyMap->Insert(PROP_FILL_COLOR, uno::Any(nApplyColor));
- auto xComplexColor = model::color::createXComplexColor(getFillComplexColor());
- pPropertyMap->Insert(PROP_FILL_COMPLEX_COLOR, uno::Any(xComplexColor));
- }
- else if ( nWW8BrushStyle || !m_bAutoFillColor || m_bFillSpecified )
- {
- if (m_OutputFormat == Form)
- {
- pPropertyMap->Insert(PROP_BACK_COLOR, uno::Any(nApplyColor));
- }
- else
- {
- pPropertyMap->Insert(PROP_CHAR_BACK_COLOR, uno::Any(nApplyColor));
- auto aComplexColor = getFillComplexColor();
- if (aComplexColor.getType() != model::ColorType::Unused)
- {
- auto xComplexColor = model::color::createXComplexColor(aComplexColor);
- pPropertyMap->Insert(PROP_CHAR_BACKGROUND_COMPLEX_COLOR, uno::Any(xComplexColor));
- }
- }
- }
- createGrabBag("originalColor", uno::Any(msfilter::util::ConvertColorOU(Color(ColorTransparency, nApplyColor))));
-
- return pPropertyMap;
-}
-
-void CellColorHandler::createGrabBag(const OUString& aName, const uno::Any& rAny)
-{
- if (m_aInteropGrabBagName.isEmpty())
- return;
-
- beans::PropertyValue aValue;
- aValue.Name = aName;
- aValue.Value = rAny;
- m_aInteropGrabBag.push_back(aValue);
-}
-
-void CellColorHandler::enableInteropGrabBag(const OUString& aName)
-{
- m_aInteropGrabBagName = aName;
-}
-
-beans::PropertyValue CellColorHandler::getInteropGrabBag()
-{
- beans::PropertyValue aRet;
- aRet.Name = m_aInteropGrabBagName;
- aRet.Value <<= comphelper::containerToSequence(m_aInteropGrabBag);
- return aRet;
-}
-
-void CellColorHandler::disableInteropGrabBag()
-{
- m_aInteropGrabBagName.clear();
- m_aInteropGrabBag.clear();
-}
-
-bool CellColorHandler::isInteropGrabBagEnabled() const
-{
- return !(m_aInteropGrabBagName.isEmpty());
-}
-
-model::ComplexColor CellColorHandler::getComplexColor() const
-{
- model::ComplexColor aComplexColor;
- if (m_eThemeColorType != model::ThemeColorType::Unknown)
- {
- aComplexColor.setThemeColor(m_eThemeColorType);
-
- if (m_nThemeColorTint > 0 )
- {
- sal_Int16 nTint = sal_Int16((255.0 - m_nThemeColorTint) * 10000.0 / 255.0);
- aComplexColor.addTransformation({model::TransformationType::Tint, nTint});
- }
- if (m_nThemeColorShade > 0)
- {
- sal_Int16 nShade = sal_Int16((255.0 - m_nThemeColorShade) * 10000 / 255.0);
- aComplexColor.addTransformation({model::TransformationType::Shade, nShade});
- }
- }
- return aComplexColor;
-}
-
-model::ComplexColor CellColorHandler::getFillComplexColor() const
-{
- model::ComplexColor aComplexColor;
- if (m_eFillThemeColorType != model::ThemeColorType::Unknown)
- {
- aComplexColor.setThemeColor(m_eFillThemeColorType);
-
- if (m_nFillThemeColorTint > 0 )
- {
- sal_Int16 nTint = sal_Int16((255.0 - m_nFillThemeColorTint) * 10000.0 / 255.0);
- aComplexColor.addTransformation({model::TransformationType::Tint, nTint});
- }
- if (m_nFillThemeColorShade > 0)
- {
- sal_Int16 nShade = sal_Int16((255.0 - m_nFillThemeColorShade) * 10000.0 / 255.0);
- aComplexColor.addTransformation({model::TransformationType::Shade, nShade});
- }
- }
- return aComplexColor;
-}
-
-} //namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/CellColorHandler.hxx b/writerfilter/source/dmapper/CellColorHandler.hxx
deleted file mode 100644
index 418f8e1f93e4..000000000000
--- a/writerfilter/source/dmapper/CellColorHandler.hxx
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include "LoggedResources.hxx"
-#include "PropertyMap.hxx"
-#include <vector>
-#include <docmodel/theme/ThemeColorType.hxx>
-#include <docmodel/color/ComplexColor.hxx>
-#include <com/sun/star/beans/PropertyValue.hpp>
-
-namespace writerfilter::dmapper
-{
-class TablePropertyMap;
-class CellColorHandler : public LoggedProperties
-{
-public:
- enum OutputFormat { Form, Paragraph, Character }; // for what part of the document
-private:
- sal_Int32 m_nShadingPattern;
-
- sal_Int32 m_nColor;
- model::ThemeColorType m_eThemeColorType = model::ThemeColorType::Unknown;
- sal_Int32 m_nThemeColorTint = 0;
- sal_Int32 m_nThemeColorShade = 0;
-
- sal_Int32 m_nFillColor;
- model::ThemeColorType m_eFillThemeColorType = model::ThemeColorType::Unknown;
- sal_Int32 m_nFillThemeColorTint = 0;
- sal_Int32 m_nFillThemeColorShade = 0;
-
- bool m_bAutoFillColor;
- bool m_bFillSpecified;
- OutputFormat m_OutputFormat;
-
- OUString m_aInteropGrabBagName;
- std::vector<css::beans::PropertyValue> m_aInteropGrabBag;
-
- // Properties
- virtual void lcl_attribute(Id Name, Value & val) override;
- virtual void lcl_sprm(Sprm & sprm) override;
-
- void createGrabBag(const OUString& aName, const css::uno::Any& rValue);
-
-public:
- CellColorHandler( );
- virtual ~CellColorHandler() override;
-
- TablePropertyMapPtr getProperties();
-
- void setOutputFormat( OutputFormat format ) { m_OutputFormat = format; }
-
- void enableInteropGrabBag(const OUString& aName);
- css::beans::PropertyValue getInteropGrabBag();
- void disableInteropGrabBag();
- bool isInteropGrabBagEnabled() const;
-
- model::ComplexColor getComplexColor() const;
- model::ComplexColor getFillComplexColor() const;
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/CellMarginHandler.cxx b/writerfilter/source/dmapper/CellMarginHandler.cxx
deleted file mode 100644
index e8262156e55f..000000000000
--- a/writerfilter/source/dmapper/CellMarginHandler.cxx
+++ /dev/null
@@ -1,177 +0,0 @@
-/* -*- 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/.
- *
- * 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 "CellMarginHandler.hxx"
-#include "ConversionHelper.hxx"
-#include <ooxml/resourceids.hxx>
-#include <comphelper/propertysequence.hxx>
-#include <comphelper/sequence.hxx>
-#include <sal/log.hxx>
-
-namespace writerfilter::dmapper {
-
-using namespace ::com::sun::star;
-using namespace ::writerfilter;
-
-CellMarginHandler::CellMarginHandler() :
-LoggedProperties("CellMarginHandler"),
-m_nValue( 0 ),
-m_nWidth( 0 ),
-m_nType( 0 ),
-m_nLeftMargin( 0 ),
-m_bLeftMarginValid( false ),
-m_nRightMargin( 0 ),
-m_bRightMarginValid( false ),
-m_nTopMargin( 0 ),
-m_bTopMarginValid( false ),
-m_nBottomMargin( 0 ),
-m_bBottomMarginValid( false )
-{
-}
-
-CellMarginHandler::~CellMarginHandler()
-{
-}
-
-void CellMarginHandler::lcl_attribute(Id rName, Value & rVal)
-{
- sal_Int32 nIntValue = rVal.getInt();
- switch( rName )
- {
- case NS_ooxml::LN_CT_TblWidth_w:
- m_nWidth = nIntValue;
- m_nValue = ConversionHelper::convertTwipToMM100Unsigned( nIntValue );
- break;
- case NS_ooxml::LN_CT_TblWidth_type:
- SAL_WARN_IF(NS_ooxml::LN_Value_ST_TblWidth_dxa != sal::static_int_cast<Id>(nIntValue), "writerfilter", "CellMarginHandler: cell margins work for absolute values only");
- m_nType = nIntValue;
- break;
- default:
- SAL_INFO("writerfilter", "CellMarginHandler::lcl_attribute: unknown attribute");
- }
-}
-
-void CellMarginHandler::createGrabBag(const OUString& aName)
-{
- if (m_aInteropGrabBagName.isEmpty())
- return;
-
- beans::PropertyValue aRet;
- aRet.Name = aName;
-
- OUString sType;
- switch (m_nType)
- {
- case NS_ooxml::LN_Value_ST_TblWidth_nil: sType = "nil"; break;
- case NS_ooxml::LN_Value_ST_TblWidth_pct: sType = "pct"; break;
- case NS_ooxml::LN_Value_ST_TblWidth_dxa: sType = "dxa"; break;
- case NS_ooxml::LN_Value_ST_TblWidth_auto: sType = "auto"; break;
- }
- uno::Sequence<beans::PropertyValue> aSeq( comphelper::InitPropertySequence({
- { "w", uno::Any(m_nWidth) },
- { "type", uno::Any(sType) }
- }));
-
- aRet.Value <<= aSeq;
- m_aInteropGrabBag.push_back(aRet);
-}
-
-void CellMarginHandler::lcl_sprm(Sprm & rSprm)
-{
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties)
- {
- pProperties->resolve( *this );
- const bool rtl = false; // TODO
- switch( rSprm.getId() )
- {
- case NS_ooxml::LN_CT_TblCellMar_top:
- case NS_ooxml::LN_CT_TcMar_top:
- m_nTopMargin = m_nValue;
- m_bTopMarginValid = true;
- createGrabBag("top");
- break;
- case NS_ooxml::LN_CT_TblCellMar_start:
- case NS_ooxml::LN_CT_TcMar_start:
- if( rtl )
- {
- m_nRightMargin = m_nValue;
- m_bRightMarginValid = true;
- }
- else
- {
- m_nLeftMargin = m_nValue;
- m_bLeftMarginValid = true;
- }
- createGrabBag("start");
- break;
- case NS_ooxml::LN_CT_TblCellMar_left:
- case NS_ooxml::LN_CT_TcMar_left:
- m_nLeftMargin = m_nValue;
- m_bLeftMarginValid = true;
- createGrabBag("left");
- break;
- case NS_ooxml::LN_CT_TblCellMar_bottom:
- case NS_ooxml::LN_CT_TcMar_bottom:
- m_nBottomMargin = m_nValue;
- m_bBottomMarginValid = true;
- createGrabBag("bottom");
- break;
- case NS_ooxml::LN_CT_TblCellMar_end:
- case NS_ooxml::LN_CT_TcMar_end:
- if( rtl )
- {
- m_nLeftMargin = m_nValue;
- m_bLeftMarginValid = true;
- }
- else
- {
- m_nRightMargin = m_nValue;
- m_bRightMarginValid = true;
- }
- createGrabBag("end");
- break;
- case NS_ooxml::LN_CT_TblCellMar_right:
- case NS_ooxml::LN_CT_TcMar_right:
- m_nRightMargin = m_nValue;
- m_bRightMarginValid = true;
- createGrabBag("right");
- break;
- default:
- SAL_WARN("writerfilter", "CellMarginHandler::lcl_sprm: unknown sprm");
- }
- }
- m_nValue = 0;
-}
-
-void CellMarginHandler::enableInteropGrabBag(const OUString& aName)
-{
- m_aInteropGrabBagName = aName;
-}
-
-beans::PropertyValue CellMarginHandler::getInteropGrabBag()
-{
- beans::PropertyValue aRet;
- aRet.Name = m_aInteropGrabBagName;
- aRet.Value <<= comphelper::containerToSequence(m_aInteropGrabBag);
- return aRet;
-}
-
-} //namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/CellMarginHandler.hxx b/writerfilter/source/dmapper/CellMarginHandler.hxx
deleted file mode 100644
index 8dcbf2dc5245..000000000000
--- a/writerfilter/source/dmapper/CellMarginHandler.hxx
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include "LoggedResources.hxx"
-#include <vector>
-#include <com/sun/star/beans/PropertyValue.hpp>
-
-namespace writerfilter::dmapper
-{
-class TablePropertyMap;
-class CellMarginHandler : public LoggedProperties
-{
-private:
- sal_Int32 m_nValue; ///< Converted value.
- sal_Int32 m_nWidth; ///< Original value.
- sal_Int32 m_nType; ///< Unit of the value (dxa, etc).
-
- OUString m_aInteropGrabBagName;
- std::vector<css::beans::PropertyValue> m_aInteropGrabBag;
-
- // Properties
- virtual void lcl_attribute(Id Name, Value & val) override;
- virtual void lcl_sprm(Sprm & sprm) override;
-
- void createGrabBag(const OUString& aName);
-
-public:
- sal_Int32 m_nLeftMargin;
- bool m_bLeftMarginValid;
- sal_Int32 m_nRightMargin;
- bool m_bRightMarginValid;
- sal_Int32 m_nTopMargin;
- bool m_bTopMarginValid;
- sal_Int32 m_nBottomMargin;
- bool m_bBottomMarginValid;
-
-public:
- CellMarginHandler( );
- virtual ~CellMarginHandler() override;
-
- void enableInteropGrabBag(const OUString& aName);
- css::beans::PropertyValue getInteropGrabBag();
-
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/ConversionHelper.cxx b/writerfilter/source/dmapper/ConversionHelper.cxx
deleted file mode 100644
index 7f3f11544c85..000000000000
--- a/writerfilter/source/dmapper/ConversionHelper.cxx
+++ /dev/null
@@ -1,691 +0,0 @@
-/* -*- 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/.
- *
- * 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 "ConversionHelper.hxx"
-#include <com/sun/star/table/BorderLine2.hpp>
-#include <com/sun/star/lang/Locale.hpp>
-#include <com/sun/star/text/HoriOrientation.hpp>
-#include <com/sun/star/style/NumberingType.hpp>
-#include <editeng/borderline.hxx>
-#include <ooxml/resourceids.hxx>
-#include <rtl/ustrbuf.hxx>
-#include <tools/color.hxx>
-#include <tools/mapunit.hxx>
-#include <tools/UnitConversion.hxx>
-#include <o3tl/string_view.hxx>
-
-using namespace com::sun::star;
-
-namespace writerfilter::dmapper::ConversionHelper{
-
-/// Convert OOXML border style to WW8 that editeng can handle.
-static sal_Int32 lcl_convertBorderStyleFromToken(sal_Int32 nOOXMLType)
-{
- switch (nOOXMLType)
- {
- case NS_ooxml::LN_Value_ST_Border_nil: return 255;
- case NS_ooxml::LN_Value_ST_Border_none: return 0;
- case NS_ooxml::LN_Value_ST_Border_single: return 1;
- case NS_ooxml::LN_Value_ST_Border_thick: return 2;
- case NS_ooxml::LN_Value_ST_Border_double: return 3;
- case NS_ooxml::LN_Value_ST_Border_dotted: return 6;
- case NS_ooxml::LN_Value_ST_Border_dashed: return 7;
- case NS_ooxml::LN_Value_ST_Border_dotDash: return 8;
- case NS_ooxml::LN_Value_ST_Border_dotDotDash: return 9;
- case NS_ooxml::LN_Value_ST_Border_triple: return 10;
- case NS_ooxml::LN_Value_ST_Border_thinThickSmallGap: return 11;
- case NS_ooxml::LN_Value_ST_Border_thickThinSmallGap: return 12;
- case NS_ooxml::LN_Value_ST_Border_thinThickThinSmallGap: return 13;
- case NS_ooxml::LN_Value_ST_Border_thinThickMediumGap: return 14;
- case NS_ooxml::LN_Value_ST_Border_thickThinMediumGap: return 15;
- case NS_ooxml::LN_Value_ST_Border_thinThickThinMediumGap: return 16;
- case NS_ooxml::LN_Value_ST_Border_thinThickLargeGap: return 17;
- case NS_ooxml::LN_Value_ST_Border_thickThinLargeGap: return 18;
- case NS_ooxml::LN_Value_ST_Border_thinThickThinLargeGap: return 19;
- case NS_ooxml::LN_Value_ST_Border_wave: return 20;
- case NS_ooxml::LN_Value_ST_Border_doubleWave: return 21;
- case NS_ooxml::LN_Value_ST_Border_dashSmallGap: return 22;
- case NS_ooxml::LN_Value_ST_Border_dashDotStroked: return 23;
- case NS_ooxml::LN_Value_ST_Border_threeDEmboss: return 24;
- case NS_ooxml::LN_Value_ST_Border_threeDEngrave: return 25;
- case NS_ooxml::LN_Value_ST_Border_outset: return 26;
- case NS_ooxml::LN_Value_ST_Border_inset: return 27;
- case NS_ooxml::LN_Value_ST_Border_apples: return 64;
- case NS_ooxml::LN_Value_ST_Border_archedScallops: return 65;
- case NS_ooxml::LN_Value_ST_Border_babyPacifier: return 66;
- case NS_ooxml::LN_Value_ST_Border_babyRattle: return 67;
- case NS_ooxml::LN_Value_ST_Border_balloons3Colors: return 68;
- case NS_ooxml::LN_Value_ST_Border_balloonsHotAir: return 69;
- case NS_ooxml::LN_Value_ST_Border_basicBlackDashes: return 70;
- case NS_ooxml::LN_Value_ST_Border_basicBlackDots: return 71;
- case NS_ooxml::LN_Value_ST_Border_basicBlackSquares: return 72;
- case NS_ooxml::LN_Value_ST_Border_basicThinLines: return 73;
- case NS_ooxml::LN_Value_ST_Border_basicWhiteDashes: return 74;
- case NS_ooxml::LN_Value_ST_Border_basicWhiteDots: return 75;
- case NS_ooxml::LN_Value_ST_Border_basicWhiteSquares: return 76;
- case NS_ooxml::LN_Value_ST_Border_basicWideInline: return 77;
- case NS_ooxml::LN_Value_ST_Border_basicWideMidline: return 78;
- case NS_ooxml::LN_Value_ST_Border_basicWideOutline: return 79;
- case NS_ooxml::LN_Value_ST_Border_bats: return 80;
- case NS_ooxml::LN_Value_ST_Border_birds: return 81;
- case NS_ooxml::LN_Value_ST_Border_birdsFlight: return 82;
- case NS_ooxml::LN_Value_ST_Border_cabins: return 83;
- case NS_ooxml::LN_Value_ST_Border_cakeSlice: return 84;
- case NS_ooxml::LN_Value_ST_Border_candyCorn: return 85;
- case NS_ooxml::LN_Value_ST_Border_celticKnotwork: return 86;
- case NS_ooxml::LN_Value_ST_Border_certificateBanner: return 87;
- case NS_ooxml::LN_Value_ST_Border_chainLink: return 88;
- case NS_ooxml::LN_Value_ST_Border_champagneBottle: return 89;
- case NS_ooxml::LN_Value_ST_Border_checkedBarBlack: return 90;
- case NS_ooxml::LN_Value_ST_Border_checkedBarColor: return 91;
- case NS_ooxml::LN_Value_ST_Border_checkered: return 92;
- case NS_ooxml::LN_Value_ST_Border_christmasTree: return 93;
- case NS_ooxml::LN_Value_ST_Border_circlesLines: return 94;
- case NS_ooxml::LN_Value_ST_Border_circlesRectangles: return 95;
- case NS_ooxml::LN_Value_ST_Border_classicalWave: return 96;
- case NS_ooxml::LN_Value_ST_Border_clocks: return 97;
- case NS_ooxml::LN_Value_ST_Border_compass: return 98;
- case NS_ooxml::LN_Value_ST_Border_confetti: return 99;
- case NS_ooxml::LN_Value_ST_Border_confettiGrays: return 100;
- case NS_ooxml::LN_Value_ST_Border_confettiOutline: return 101;
- case NS_ooxml::LN_Value_ST_Border_confettiStreamers: return 102;
- case NS_ooxml::LN_Value_ST_Border_confettiWhite: return 103;
- case NS_ooxml::LN_Value_ST_Border_cornerTriangles: return 104;
- case NS_ooxml::LN_Value_ST_Border_couponCutoutDashes: return 105;
- case NS_ooxml::LN_Value_ST_Border_couponCutoutDots: return 106;
- case NS_ooxml::LN_Value_ST_Border_crazyMaze: return 107;
- case NS_ooxml::LN_Value_ST_Border_creaturesButterfly: return 108;
- case NS_ooxml::LN_Value_ST_Border_creaturesFish: return 109;
- case NS_ooxml::LN_Value_ST_Border_creaturesInsects: return 110;
- case NS_ooxml::LN_Value_ST_Border_creaturesLadyBug: return 111;
- case NS_ooxml::LN_Value_ST_Border_crossStitch: return 112;
- case NS_ooxml::LN_Value_ST_Border_cup: return 113;
- case NS_ooxml::LN_Value_ST_Border_decoArch: return 114;
- case NS_ooxml::LN_Value_ST_Border_decoArchColor: return 115;
- case NS_ooxml::LN_Value_ST_Border_decoBlocks: return 116;
- case NS_ooxml::LN_Value_ST_Border_diamondsGray: return 117;
- case NS_ooxml::LN_Value_ST_Border_doubleD: return 118;
- case NS_ooxml::LN_Value_ST_Border_doubleDiamonds: return 119;
- case NS_ooxml::LN_Value_ST_Border_earth1: return 120;
- case NS_ooxml::LN_Value_ST_Border_earth2: return 121;
- case NS_ooxml::LN_Value_ST_Border_eclipsingSquares1: return 122;
- case NS_ooxml::LN_Value_ST_Border_eclipsingSquares2: return 123;
- case NS_ooxml::LN_Value_ST_Border_eggsBlack: return 124;
- case NS_ooxml::LN_Value_ST_Border_fans: return 125;
- case NS_ooxml::LN_Value_ST_Border_film: return 126;
- case NS_ooxml::LN_Value_ST_Border_firecrackers: return 127;
- case NS_ooxml::LN_Value_ST_Border_flowersBlockPrint: return 128;
- case NS_ooxml::LN_Value_ST_Border_flowersDaisies: return 129;
- case NS_ooxml::LN_Value_ST_Border_flowersModern1: return 130;
- case NS_ooxml::LN_Value_ST_Border_flowersModern2: return 131;
- case NS_ooxml::LN_Value_ST_Border_flowersPansy: return 132;
- case NS_ooxml::LN_Value_ST_Border_flowersRedRose: return 133;
- case NS_ooxml::LN_Value_ST_Border_flowersRoses: return 134;
- case NS_ooxml::LN_Value_ST_Border_flowersTeacup: return 135;
- case NS_ooxml::LN_Value_ST_Border_flowersTiny: return 136;
- case NS_ooxml::LN_Value_ST_Border_gems: return 137;
- case NS_ooxml::LN_Value_ST_Border_gingerbreadMan: return 138;
- case NS_ooxml::LN_Value_ST_Border_gradient: return 139;
- case NS_ooxml::LN_Value_ST_Border_handmade1: return 140;
- case NS_ooxml::LN_Value_ST_Border_handmade2: return 141;
- case NS_ooxml::LN_Value_ST_Border_heartBalloon: return 142;
- case NS_ooxml::LN_Value_ST_Border_heartGray: return 143;
- case NS_ooxml::LN_Value_ST_Border_hearts: return 144;
- case NS_ooxml::LN_Value_ST_Border_heebieJeebies: return 145;
- case NS_ooxml::LN_Value_ST_Border_holly: return 146;
- case NS_ooxml::LN_Value_ST_Border_houseFunky: return 147;
- case NS_ooxml::LN_Value_ST_Border_hypnotic: return 148;
- case NS_ooxml::LN_Value_ST_Border_iceCreamCones: return 149;
- case NS_ooxml::LN_Value_ST_Border_lightBulb: return 150;
- case NS_ooxml::LN_Value_ST_Border_lightning1: return 151;
- case NS_ooxml::LN_Value_ST_Border_lightning2: return 152;
- case NS_ooxml::LN_Value_ST_Border_mapPins: return 153;
- case NS_ooxml::LN_Value_ST_Border_mapleLeaf: return 154;
- case NS_ooxml::LN_Value_ST_Border_mapleMuffins: return 155;
- case NS_ooxml::LN_Value_ST_Border_marquee: return 156;
- case NS_ooxml::LN_Value_ST_Border_marqueeToothed: return 157;
- case NS_ooxml::LN_Value_ST_Border_moons: return 158;
- case NS_ooxml::LN_Value_ST_Border_mosaic: return 159;
- case NS_ooxml::LN_Value_ST_Border_musicNotes: return 160;
- case NS_ooxml::LN_Value_ST_Border_northwest: return 161;
- case NS_ooxml::LN_Value_ST_Border_ovals: return 162;
- case NS_ooxml::LN_Value_ST_Border_packages: return 163;
- case NS_ooxml::LN_Value_ST_Border_palmsBlack: return 164;
- case NS_ooxml::LN_Value_ST_Border_palmsColor: return 165;
- case NS_ooxml::LN_Value_ST_Border_paperClips: return 166;
- case NS_ooxml::LN_Value_ST_Border_papyrus: return 167;
- case NS_ooxml::LN_Value_ST_Border_partyFavor: return 168;
- case NS_ooxml::LN_Value_ST_Border_partyGlass: return 169;
- case NS_ooxml::LN_Value_ST_Border_pencils: return 170;
- case NS_ooxml::LN_Value_ST_Border_people: return 171;
- case NS_ooxml::LN_Value_ST_Border_peopleWaving: return 172;
- case NS_ooxml::LN_Value_ST_Border_peopleHats: return 173;
- case NS_ooxml::LN_Value_ST_Border_poinsettias: return 174;
- case NS_ooxml::LN_Value_ST_Border_postageStamp: return 175;
- case NS_ooxml::LN_Value_ST_Border_pumpkin1: return 176;
- case NS_ooxml::LN_Value_ST_Border_pushPinNote2: return 177;
- case NS_ooxml::LN_Value_ST_Border_pushPinNote1: return 178;
- case NS_ooxml::LN_Value_ST_Border_pyramids: return 179;
- case NS_ooxml::LN_Value_ST_Border_pyramidsAbove: return 180;
- case NS_ooxml::LN_Value_ST_Border_quadrants: return 181;
- case NS_ooxml::LN_Value_ST_Border_rings: return 182;
- case NS_ooxml::LN_Value_ST_Border_safari: return 183;
- case NS_ooxml::LN_Value_ST_Border_sawtooth: return 184;
- case NS_ooxml::LN_Value_ST_Border_sawtoothGray: return 185;
- case NS_ooxml::LN_Value_ST_Border_scaredCat: return 186;
- case NS_ooxml::LN_Value_ST_Border_seattle: return 187;
- case NS_ooxml::LN_Value_ST_Border_shadowedSquares: return 188;
- case NS_ooxml::LN_Value_ST_Border_sharksTeeth: return 189;
- case NS_ooxml::LN_Value_ST_Border_shorebirdTracks: return 190;
- case NS_ooxml::LN_Value_ST_Border_skyrocket: return 191;
- case NS_ooxml::LN_Value_ST_Border_snowflakeFancy: return 192;
- case NS_ooxml::LN_Value_ST_Border_snowflakes: return 193;
- case NS_ooxml::LN_Value_ST_Border_sombrero: return 194;
- case NS_ooxml::LN_Value_ST_Border_southwest: return 195;
- case NS_ooxml::LN_Value_ST_Border_stars: return 196;
- case NS_ooxml::LN_Value_ST_Border_starsTop: return 197;
- case NS_ooxml::LN_Value_ST_Border_stars3d: return 198;
- case NS_ooxml::LN_Value_ST_Border_starsBlack: return 199;
- case NS_ooxml::LN_Value_ST_Border_starsShadowed: return 200;
- case NS_ooxml::LN_Value_ST_Border_sun: return 201;
- case NS_ooxml::LN_Value_ST_Border_swirligig: return 202;
- case NS_ooxml::LN_Value_ST_Border_tornPaper: return 203;
- case NS_ooxml::LN_Value_ST_Border_tornPaperBlack: return 204;
- case NS_ooxml::LN_Value_ST_Border_trees: return 205;
- case NS_ooxml::LN_Value_ST_Border_triangleParty: return 206;
- case NS_ooxml::LN_Value_ST_Border_triangles: return 207;
- case NS_ooxml::LN_Value_ST_Border_tribal1: return 208;
- case NS_ooxml::LN_Value_ST_Border_tribal2: return 209;
- case NS_ooxml::LN_Value_ST_Border_tribal3: return 210;
- case NS_ooxml::LN_Value_ST_Border_tribal4: return 211;
- case NS_ooxml::LN_Value_ST_Border_tribal5: return 212;
- case NS_ooxml::LN_Value_ST_Border_tribal6: return 213;
- case NS_ooxml::LN_Value_ST_Border_twistedLines1: return 214;
- case NS_ooxml::LN_Value_ST_Border_twistedLines2: return 215;
- case NS_ooxml::LN_Value_ST_Border_vine: return 216;
- case NS_ooxml::LN_Value_ST_Border_waveline: return 217;
- case NS_ooxml::LN_Value_ST_Border_weavingAngles: return 218;
- case NS_ooxml::LN_Value_ST_Border_weavingBraid: return 219;
- case NS_ooxml::LN_Value_ST_Border_weavingRibbon: return 220;
- case NS_ooxml::LN_Value_ST_Border_weavingStrips: return 221;
- case NS_ooxml::LN_Value_ST_Border_whiteFlowers: return 222;
- case NS_ooxml::LN_Value_ST_Border_woodwork: return 223;
- case NS_ooxml::LN_Value_ST_Border_xIllusions: return 224;
- case NS_ooxml::LN_Value_ST_Border_zanyTriangles: return 225;
- case NS_ooxml::LN_Value_ST_Border_zigZag: return 226;
- case NS_ooxml::LN_Value_ST_Border_zigZagStitch: return 227;
- default: break;
- }
- return 0;
-}
-
-void MakeBorderLine( sal_Int32 nLineThickness, sal_Int32 nLineToken,
- sal_Int32 nLineColor,
- table::BorderLine2& rToFill, bool bIsOOXML )
-{
- static const Color aBorderDefColor[] =
- {
- // The first item means automatic color (COL_AUTO), but we
- // do not use it anyway (see the next statement) .-)
- // See also GetLineIndex in sw/source/filter/ww8/ww8par6.cxx
- COL_AUTO, COL_BLACK, COL_LIGHTBLUE, COL_LIGHTCYAN, COL_LIGHTGREEN,
- COL_LIGHTMAGENTA, COL_LIGHTRED, COL_YELLOW, COL_WHITE, COL_BLUE,
- COL_CYAN, COL_GREEN, COL_MAGENTA, COL_RED, COL_BROWN, COL_GRAY,
- COL_LIGHTGRAY
- };
- if(!bIsOOXML && sal::static_int_cast<sal_uInt32>(nLineColor) < SAL_N_ELEMENTS(aBorderDefColor))
- nLineColor = sal_Int32(aBorderDefColor[nLineColor]);
- //no auto color for borders
- if (nLineColor == sal_Int32(COL_AUTO))
- nLineColor = sal_Int32(COL_BLACK);
-
- sal_Int32 nLineType = lcl_convertBorderStyleFromToken(nLineToken);
-
- // Map to our border types, we should use of one equal line
- // thickness, or one of smaller thickness. If too small we
- // can make the deficit up in additional white space or
- // object size
- SvxBorderLineStyle const nLineStyle(
- ::editeng::ConvertBorderStyleFromWord(nLineType));
- rToFill.LineStyle = static_cast<sal_Int16>(nLineStyle);
- double const fConverted( (SvxBorderLineStyle::NONE == nLineStyle) ? 0.0 :
- ::editeng::ConvertBorderWidthFromWord(nLineStyle, nLineThickness,
- nLineType));
- rToFill.LineWidth = convertTwipToMM100(fConverted);
- rToFill.Color = nLineColor;
-}
-
-namespace {
-void lcl_SwapQuotesInField(OUString &rFmt)
-{
- //Swap unescaped " and ' with ' and "
- sal_Int32 nLen = rFmt.getLength();
- OUStringBuffer aBuffer( rFmt );
- const sal_Unicode* pFmt = rFmt.getStr();
- for (sal_Int32 nI = 0; nI < nLen; ++nI)
- {
- if ((pFmt[nI] == '\"') && (!nI || pFmt[nI-1] != '\\'))
- aBuffer[nI] = '\'';
- else if ((pFmt[nI] == '\'') && (!nI || pFmt[nI-1] != '\\'))
- aBuffer[nI] = '\"';
- }
- rFmt = aBuffer.makeStringAndClear();
-}
-bool lcl_IsNotAM(std::u16string_view rFmt, sal_Int32 nPos)
-{
- return (
- (nPos == static_cast<sal_Int32>(rFmt.size()) - 1) ||
- (
- (rFmt[nPos+1] != 'M') &&
- (rFmt[nPos+1] != 'm')
- )
- );
-}
-bool IsPreviousAM(std::u16string_view rParams, sal_Int32 nPos)
-{
- return nPos >= 2 && o3tl::matchIgnoreAsciiCase(rParams, u"am", nPos - 2);
-}
-bool IsNextPM(std::u16string_view rParams, sal_Int32 nPos)
-{
- return o3tl::make_unsigned(nPos + 2) < rParams.size() && o3tl::matchIgnoreAsciiCase(rParams, u"pm", nPos + 1);
-}
-}
-
-// See also sw::ms::MSDateTimeFormatToSwFormat
-OUString ConvertMSFormatStringToSO(
- const OUString& rFormat, lang::Locale& rLocale, bool bHijri)
-{
- OUString sFormat(rFormat);
- lcl_SwapQuotesInField(sFormat);
-
- //#102782#, #102815#, #108341# & #111944# have to work at the same time :-)
- bool bForceJapanese(false);
- bool bForceNatNum(false);
- const sal_Int32 nLen = sFormat.getLength();
- sal_Int32 nI = 0;
- sal_Int32 nAddedChars = 0;
-// const sal_Unicode* pFormat = sFormat.getStr();
- OUStringBuffer aNewFormat( sFormat );
- while (nI < nLen)
- {
- if (sFormat[nI] == '\\')
- ++nI;
- else if (sFormat[nI] == '\"')
- {
- ++nI;
- //While not at the end and not at an unescaped end quote
- while ((nI < nLen) && ((sFormat[nI] != '\"') && (sFormat[nI-1] != '\\')))
- ++nI;
- }
- else //normal unquoted section
- {
- sal_Unicode nChar = sFormat[nI];
- if (nChar == 'O')
- {
- aNewFormat[nI + nAddedChars] = 'M';
- bForceNatNum = true;
- }
- else if (nChar == 'o')
- {
- aNewFormat[nI + nAddedChars] = 'm';
- bForceNatNum = true;
- }
- else if ((nChar == 'A') && lcl_IsNotAM(sFormat, nI))
- {
- aNewFormat[nI + nAddedChars] = 'D';
- bForceNatNum = true;
- }
- else if ((nChar == 'g') || (nChar == 'G'))
- bForceJapanese = true;
- else if ((nChar == 'a') && lcl_IsNotAM(sFormat, nI))
- bForceJapanese = true;
- else if (nChar == 'E')
- {
- if ((nI != nLen-1) && (sFormat[nI+1] == 'E'))
- {
- //todo: this cannot be the right way to replace a part of the string!
- aNewFormat[nI + nAddedChars] = 'Y';
- aNewFormat[nI + nAddedChars + 1] = 'Y';
- aNewFormat.insert(nI + nAddedChars + 2, "YY");
- nAddedChars += 2;
- ++nI;
- }
- bForceJapanese = true;
- }
- else if (nChar == 'e')
- {
- if ((nI != nLen-1) && (sFormat[nI+1] == 'e'))
- {
- //todo: this cannot be the right way to replace a part of the string!
- aNewFormat[nI + nAddedChars] = 'y';
- aNewFormat[nI + nAddedChars + 1] = 'y';
- aNewFormat.insert(nI + nAddedChars + 2, "yy");
- nAddedChars += 2;
- ++nI;
- }
- bForceJapanese = true;
- }
- else if (nChar == '/' && !(IsPreviousAM(sFormat, nI) && IsNextPM(sFormat, nI)))
- {
- // MM We have to escape '/' in case it's used as a char
- //todo: this cannot be the right way to replace a part of the string!
- aNewFormat[nI + nAddedChars] = '\\';
- aNewFormat.insert(nI + nAddedChars + 1, "/");
- ++nAddedChars;
- ++nI;
- }
- }
- ++nI;
- }
-
- if (bForceNatNum)
- bForceJapanese = true;
-
- if (bForceJapanese)
- {
- rLocale.Language = "ja";
- rLocale.Country = "JP";
- }
-
- if (bForceNatNum)
- {
- aNewFormat.insert( 0, "[NatNum1][$-411]");
- }
-
- if (bHijri)
- {
- aNewFormat.insert( 0, "[~hijri]");
- }
- return aNewFormat.makeStringAndClear();
-
-}
-
-sal_Int32 convertTwipToMM100(sal_Int32 _t)
-{
- // It appears that MSO handles large twip values specially, probably legacy 16bit handling,
- // anything that's bigger than 32767 appears to be simply ignored.
- if( _t >= 0x8000 )
- return 0;
- return ::convertTwipToMm100( _t );
-}
-
-sal_Int32 convertTwipToMM100WithoutLimit(sal_Int32 _t)
-{
- return ::convertTwipToMm100(_t);
-}
-
-double convertTwipToMM100Double(sal_Int32 _t)
-{
- // It appears that MSO handles large twip values specially, probably legacy 16bit handling,
- // anything that's bigger than 32767 appears to be simply ignored.
- if( _t >= 0x8000 )
- return 0.0;
- return o3tl::convert<double>(_t, o3tl::Length::twip, o3tl::Length::mm100);
-}
-
-sal_uInt32 convertTwipToMM100Unsigned(sal_Int32 _t)
-{
- if( _t < 0 )
- return 0;
- return convertTwipToMM100( _t );
-}
-
-text::RubyAdjust convertRubyAlign( sal_Int32 nIntValue )
-{
- text::RubyAdjust rubyAdjust = text::RubyAdjust_LEFT;
- switch( nIntValue )
- {
- case NS_ooxml::LN_Value_ST_RubyAlign_center:
- case NS_ooxml::LN_Value_ST_RubyAlign_rightVertical:
- rubyAdjust = text::RubyAdjust_CENTER;
- break;
- case NS_ooxml::LN_Value_ST_RubyAlign_distributeLetter:
- rubyAdjust = text::RubyAdjust_BLOCK;
- break;
- case NS_ooxml::LN_Value_ST_RubyAlign_distributeSpace:
- rubyAdjust = text::RubyAdjust_INDENT_BLOCK;
- break;
- case NS_ooxml::LN_Value_ST_RubyAlign_left:
- rubyAdjust = text::RubyAdjust_LEFT;
- break;
- case NS_ooxml::LN_Value_ST_RubyAlign_right:
- rubyAdjust = text::RubyAdjust_RIGHT;
- break;
- }
- return rubyAdjust;
-}
-
-sal_Int16 convertTableJustification( sal_Int32 nIntValue )
-{
- sal_Int16 nOrient = text::HoriOrientation::LEFT_AND_WIDTH;
- switch( nIntValue )
- {
- case NS_ooxml::LN_Value_ST_Jc_center:
- nOrient = text::HoriOrientation::CENTER;
- break;
- case NS_ooxml::LN_Value_ST_Jc_right:
- case NS_ooxml::LN_Value_ST_Jc_end:
- nOrient = text::HoriOrientation::RIGHT;
- break;
- case NS_ooxml::LN_Value_ST_Jc_left:
- case NS_ooxml::LN_Value_ST_Jc_start:
- //no break
- default:;
-
- }
- return nOrient;
-}
-
-// Return the suggested default if the given format has no known conversion
-sal_Int16 ConvertNumberingType(const sal_Int32 nFmt, const sal_Int16 nDefault)
-{
- sal_Int16 nRet;
- switch(nFmt)
- {
- case NS_ooxml::LN_Value_ST_NumberFormat_decimal:
- nRet = style::NumberingType::ARABIC;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_upperRoman:
- nRet = style::NumberingType::ROMAN_UPPER;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_lowerRoman:
- nRet = style::NumberingType::ROMAN_LOWER;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_ordinal:
- nRet = style::NumberingType::TEXT_NUMBER;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_bullet:
- nRet = style::NumberingType::CHAR_SPECIAL;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_none:
- nRet = style::NumberingType::NUMBER_NONE;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_upperLetter:
- nRet = style::NumberingType::CHARS_UPPER_LETTER_N;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_lowerLetter:
- nRet = style::NumberingType::CHARS_LOWER_LETTER_N;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_iroha:
- nRet = style::NumberingType::IROHA_HALFWIDTH_JA;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_irohaFullWidth:
- nRet = style::NumberingType::IROHA_FULLWIDTH_JA;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_aiueo:
- nRet = style::NumberingType::AIU_HALFWIDTH_JA;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_aiueoFullWidth:
- nRet = style::NumberingType::AIU_FULLWIDTH_JA;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_hebrew2:
- nRet = style::NumberingType::CHARS_HEBREW;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_thaiLetters:
- nRet = style::NumberingType::CHARS_THAI;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_russianLower:
- nRet = style::NumberingType::CHARS_CYRILLIC_LOWER_LETTER_RU;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_russianUpper:
- nRet = style::NumberingType::CHARS_CYRILLIC_UPPER_LETTER_RU;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedCircleChinese:
- case NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedCircle:
- case NS_ooxml::LN_Value_ST_NumberFormat_ideographEnclosedCircle:
- nRet = style::NumberingType::CIRCLE_NUMBER;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_ideographTraditional:
- nRet = style::NumberingType::TIAN_GAN_ZH;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_ideographZodiac:
- nRet = style::NumberingType::DI_ZI_ZH;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_ganada:
- nRet = style::NumberingType::HANGUL_SYLLABLE_KO;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_chosung:
- nRet = style::NumberingType::HANGUL_JAMO_KO;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_koreanLegal:
- nRet = style::NumberingType::NUMBER_LEGAL_KO;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_koreanDigital:
- nRet = style::NumberingType::NUMBER_DIGITAL_KO;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_koreanCounting:
- nRet = style::NumberingType::NUMBER_HANGUL_KO;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_koreanDigital2:
- nRet = style::NumberingType::NUMBER_DIGITAL2_KO;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_ideographLegalTraditional:
- nRet = style::NumberingType::NUMBER_UPPER_ZH_TW;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_arabicAlpha:
- nRet = style::NumberingType::CHARS_ARABIC;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_arabicAbjad:
- nRet = style::NumberingType::CHARS_ARABIC_ABJAD;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_hindiVowels:
- nRet = style::NumberingType::CHARS_NEPALI;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_japaneseLegal:
- nRet = style::NumberingType::NUMBER_TRADITIONAL_JA;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_chineseCounting:
- case NS_ooxml::LN_Value_ST_NumberFormat_japaneseCounting:
- case NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseCounting:
- case NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseCountingThousand:
- case NS_ooxml::LN_Value_ST_NumberFormat_ideographDigital:
- case NS_ooxml::LN_Value_ST_NumberFormat_chineseCountingThousand:
- nRet = style::NumberingType::NUMBER_LOWER_ZH;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_chineseLegalSimplified:
- nRet = style::NumberingType::NUMBER_UPPER_ZH;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_hebrew1:
- //91726
- nRet = style::NumberingType::NUMBER_HEBREW;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_decimalFullWidth:
- case NS_ooxml::LN_Value_ST_NumberFormat_decimalFullWidth2:
- nRet = style::NumberingType::FULLWIDTH_ARABIC;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_cardinalText:
- nRet = style::NumberingType::TEXT_CARDINAL;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_ordinalText:
- nRet = style::NumberingType::TEXT_ORDINAL;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_chicago:
- nRet = style::NumberingType::SYMBOL_CHICAGO;
- break;
- case NS_ooxml::LN_Value_ST_NumberFormat_decimalZero:
- nRet = style::NumberingType::ARABIC_ZERO;
- break;
- default: nRet = nDefault;
- }
-/* TODO: Lots of additional values are available - some are supported in the I18 framework
- NS_ooxml::LN_Value_ST_NumberFormat_hex = 91685;
- NS_ooxml::LN_Value_ST_NumberFormat_decimalHalfWidth = 91692;
- NS_ooxml::LN_Value_ST_NumberFormat_japaneseDigitalTenThousand = 91694;
- NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedFullstop = 91703;
- NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedParen = 91704;
- NS_ooxml::LN_Value_ST_NumberFormat_ideographZodiacTraditional = 91709;
- NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseDigital = 91713;
- NS_ooxml::LN_Value_ST_NumberFormat_vietnameseCounting = 91721;
- NS_ooxml::LN_Value_ST_NumberFormat_numberInDash = 91725;
- NS_ooxml::LN_Value_ST_NumberFormat_hindiConsonants = 91731;
- NS_ooxml::LN_Value_ST_NumberFormat_hindiNumbers = 91732;
- NS_ooxml::LN_Value_ST_NumberFormat_hindiCounting = 91733;
- NS_ooxml::LN_Value_ST_NumberFormat_thaiNumbers = 91735;
- NS_ooxml::LN_Value_ST_NumberFormat_thaiCounting = 91736;*/
- return nRet;
-}
-
-sal_Int16 ConvertCustomNumberFormat(std::u16string_view rFormat)
-{
- sal_Int16 nRet = -1;
-
- if (rFormat == u"001, 002, 003, ...")
- {
- nRet = style::NumberingType::ARABIC_ZERO3;
- }
- else if (rFormat == u"0001, 0002, 0003, ...")
- {
- nRet = style::NumberingType::ARABIC_ZERO4;
- }
- else if (rFormat == u"00001, 00002, 00003, ...")
- {
- nRet = style::NumberingType::ARABIC_ZERO5;
- }
-
- return nRet;
-}
-
-util::DateTime ConvertDateStringToDateTime( std::u16string_view rDateTime )
-{
- util::DateTime aDateTime;
- //xsd::DateTime in the format [-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm] example: 2008-01-21T10:42:00Z
- //OUString getToken( sal_Int32 token, sal_Unicode cTok, sal_Int32& index ) const
- sal_Int32 nIndex = 0;
- std::u16string_view sDate = o3tl::getToken(rDateTime, 0, 'T', nIndex );
- // HACK: this is broken according to the spec, but MSOffice always treats the time as local,
- // and writes it as Z (=UTC+0)
- std::u16string_view sTime = o3tl::getToken(rDateTime, 0, 'Z', nIndex );
- nIndex = 0;
- aDateTime.Year = sal_uInt16( o3tl::toInt32(o3tl::getToken(sDate, 0, '-', nIndex )) );
- aDateTime.Month = sal_uInt16( o3tl::toInt32(o3tl::getToken(sDate, 0, '-', nIndex )) );
- if (nIndex != -1)
- aDateTime.Day = sal_uInt16( o3tl::toInt32(sDate.substr( nIndex )) );
-
- nIndex = 0;
- aDateTime.Hours = sal_uInt16( o3tl::toInt32(o3tl::getToken(sTime, 0, ':', nIndex )) );
- aDateTime.Minutes = sal_uInt16( o3tl::toInt32(o3tl::getToken(sTime, 0, ':', nIndex )) );
- if (nIndex != -1)
- aDateTime.Seconds = sal_uInt16( o3tl::toInt32(sTime.substr( nIndex )) );
-
- return aDateTime;
-}
-
-
-} //namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/ConversionHelper.hxx b/writerfilter/source/dmapper/ConversionHelper.hxx
deleted file mode 100644
index c14c8033ea58..000000000000
--- a/writerfilter/source/dmapper/ConversionHelper.hxx
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <sal/types.h>
-#include <rtl/ustring.hxx>
-#include <com/sun/star/util/DateTime.hpp>
-#include <com/sun/star/style/NumberingType.hpp>
-#include <com/sun/star/table/BorderLine2.hpp>
-#include <com/sun/star/text/RubyAdjust.hpp>
-
-namespace com::sun::star{
- namespace lang{
- struct Locale;
- }
- namespace table{
- struct BorderLine2;
- }
-}
-
-namespace writerfilter::dmapper::ConversionHelper{
-
- // create a border line and return the distance value
- void MakeBorderLine(sal_Int32 nLineThickness,
- sal_Int32 nLineType,
- sal_Int32 nLineColor,
- css::table::BorderLine2& rToFill,
- bool bIsOOXML);
- //convert the number format string form MS format to SO format
- OUString ConvertMSFormatStringToSO(const OUString& rFormat, css::lang::Locale& rLocale, bool bHijri);
- // export just for test
- SAL_DLLPUBLIC_EXPORT sal_Int32 convertTwipToMM100(sal_Int32 _t);
- sal_Int32 convertTwipToMM100WithoutLimit(sal_Int32 _t);
- double convertTwipToMM100Double(sal_Int32 _t);
- SAL_DLLPUBLIC_EXPORT sal_uInt32 convertTwipToMM100Unsigned(sal_Int32 _t);
- sal_Int16 convertTableJustification( sal_Int32 nIntValue );
- css::text::RubyAdjust convertRubyAlign( sal_Int32 nIntValue );
- sal_Int16 ConvertNumberingType(const sal_Int32 nFmt, const sal_Int16 nDefault = css::style::NumberingType::ARABIC);
- sal_Int16 ConvertCustomNumberFormat(std::u16string_view rFormat);
-
- css::util::DateTime ConvertDateStringToDateTime(std::u16string_view rDateTime);
-} // namespace writerfilter::dmapper::ConversionHelper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DocumentProtection.cxx b/writerfilter/source/dmapper/DocumentProtection.cxx
deleted file mode 100644
index dddf964c4022..000000000000
--- a/writerfilter/source/dmapper/DocumentProtection.cxx
+++ /dev/null
@@ -1,239 +0,0 @@
-/* -*- 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/.
- *
- * 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 "DocumentProtection.hxx"
-#include "TagLogger.hxx"
-#include <vector>
-#include <comphelper/sequence.hxx>
-
-using namespace com::sun::star;
-
-namespace writerfilter::dmapper
-{
-DocumentProtection::DocumentProtection()
- : LoggedProperties("DocumentProtection")
- , m_nEdit(
- NS_ooxml::
- LN_Value_doc_ST_DocProtect_none) // Specifies that no editing restrictions have been applied to the document
- , m_bProtectForm(false)
- , m_bRedlineProtection(false)
- , m_bReadOnly(false)
- , m_bEnforcement(false)
- , m_bFormatting(false)
- , m_nCryptProviderType(NS_ooxml::LN_Value_doc_ST_CryptProv_rsaAES)
- , m_sCryptAlgorithmClass("hash")
- , m_sCryptAlgorithmType("typeAny")
- , m_CryptSpinCount(0)
-{
-}
-
-DocumentProtection::~DocumentProtection() {}
-
-void DocumentProtection::lcl_attribute(Id nName, Value& val)
-{
- int nIntValue = val.getInt();
- OUString sStringValue = val.getString();
-
- switch (nName)
- {
- case NS_ooxml::LN_CT_DocProtect_edit: // 92037
- m_nEdit = nIntValue;
- // multiple DocProtect_edits should not exist. If they do, last one wins
- m_bRedlineProtection = false;
- m_bProtectForm = false;
- m_bReadOnly = false;
- switch (nIntValue)
- {
- case NS_ooxml::LN_Value_doc_ST_DocProtect_trackedChanges:
- {
- m_bRedlineProtection = true;
- m_sRedlineProtectionKey = m_sHash;
- break;
- }
- case NS_ooxml::LN_Value_doc_ST_DocProtect_forms:
- m_bProtectForm = true;
- break;
- case NS_ooxml::LN_Value_doc_ST_DocProtect_readOnly:
- m_bReadOnly = true;
- break;
- }
- break;
- case NS_ooxml::LN_CT_DocProtect_enforcement: // 92039
- m_bEnforcement = (nIntValue != 0);
- break;
- case NS_ooxml::LN_CT_DocProtect_formatting: // 92038
- m_bFormatting = (nIntValue != 0);
- break;
- case NS_ooxml::LN_AG_Password_cryptProviderType: // 92025
- m_nCryptProviderType = nIntValue;
- break;
- case NS_ooxml::LN_AG_Password_cryptAlgorithmClass: // 92026
- if (nIntValue == NS_ooxml::LN_Value_doc_ST_AlgClass_hash) // 92023
- m_sCryptAlgorithmClass = "hash";
- break;
- case NS_ooxml::LN_AG_Password_cryptAlgorithmType: // 92027
- if (nIntValue == NS_ooxml::LN_Value_doc_ST_AlgType_typeAny) // 92024
- m_sCryptAlgorithmType = "typeAny";
- break;
- case NS_ooxml::LN_AG_Password_cryptAlgorithmSid: // 92028
- m_sCryptAlgorithmSid = sStringValue;
- break;
- case NS_ooxml::LN_AG_Password_cryptSpinCount: // 92029
- m_CryptSpinCount = nIntValue;
- break;
- case NS_ooxml::LN_AG_Password_hash: // 92035
- m_sHash = sStringValue;
- break;
- case NS_ooxml::LN_AG_Password_salt: // 92036
- m_sSalt = sStringValue;
- break;
- default:
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- }
- }
-}
-
-void DocumentProtection::lcl_sprm(Sprm& /*rSprm*/) {}
-
-uno::Sequence<beans::PropertyValue> DocumentProtection::toSequence() const
-{
- std::vector<beans::PropertyValue> documentProtection;
-
- if (enabled())
- {
- // w:edit
- {
- beans::PropertyValue aValue;
- aValue.Name = "edit";
-
- switch (m_nEdit)
- {
- case NS_ooxml::LN_Value_doc_ST_DocProtect_none:
- aValue.Value <<= OUString("none");
- break;
- case NS_ooxml::LN_Value_doc_ST_DocProtect_readOnly:
- aValue.Value <<= OUString("readOnly");
- break;
- case NS_ooxml::LN_Value_doc_ST_DocProtect_comments:
- aValue.Value <<= OUString("comments");
- break;
- case NS_ooxml::LN_Value_doc_ST_DocProtect_trackedChanges:
- aValue.Value <<= OUString("trackedChanges");
- break;
- case NS_ooxml::LN_Value_doc_ST_DocProtect_forms:
- aValue.Value <<= OUString("forms");
- break;
- default:
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- }
- }
-
- documentProtection.push_back(aValue);
- }
-
- // w:enforcement
- if (m_bEnforcement)
- {
- beans::PropertyValue aValue;
- aValue.Name = "enforcement";
- aValue.Value <<= OUString("1");
- documentProtection.push_back(aValue);
- }
-
- // w:formatting
- if (m_bFormatting)
- {
- beans::PropertyValue aValue;
- aValue.Name = "formatting";
- aValue.Value <<= OUString("1");
- documentProtection.push_back(aValue);
- }
-
- // w:cryptProviderType
- {
- beans::PropertyValue aValue;
- aValue.Name = "cryptProviderType";
- if (m_nCryptProviderType == NS_ooxml::LN_Value_doc_ST_CryptProv_rsaAES)
- aValue.Value <<= OUString("rsaAES");
- else if (m_nCryptProviderType == NS_ooxml::LN_Value_doc_ST_CryptProv_rsaFull)
- aValue.Value <<= OUString("rsaFull");
- documentProtection.push_back(aValue);
- }
-
- // w:cryptAlgorithmClass
- {
- beans::PropertyValue aValue;
- aValue.Name = "cryptAlgorithmClass";
- aValue.Value <<= m_sCryptAlgorithmClass;
- documentProtection.push_back(aValue);
- }
-
- // w:cryptAlgorithmType
- {
- beans::PropertyValue aValue;
- aValue.Name = "cryptAlgorithmType";
- aValue.Value <<= m_sCryptAlgorithmType;
- documentProtection.push_back(aValue);
- }
-
- // w:cryptAlgorithmSid
- {
- beans::PropertyValue aValue;
- aValue.Name = "cryptAlgorithmSid";
- aValue.Value <<= m_sCryptAlgorithmSid;
- documentProtection.push_back(aValue);
- }
-
- // w:cryptSpinCount
- {
- beans::PropertyValue aValue;
- aValue.Name = "cryptSpinCount";
- aValue.Value <<= OUString::number(m_CryptSpinCount);
- documentProtection.push_back(aValue);
- }
-
- // w:hash
- {
- beans::PropertyValue aValue;
- aValue.Name = "hash";
- aValue.Value <<= m_sHash;
- documentProtection.push_back(aValue);
- }
-
- // w:salt
- {
- beans::PropertyValue aValue;
- aValue.Name = "salt";
- aValue.Value <<= m_sSalt;
- documentProtection.push_back(aValue);
- }
- }
-
- return comphelper::containerToSequence(documentProtection);
-}
-
-} //namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DocumentProtection.hxx b/writerfilter/source/dmapper/DocumentProtection.hxx
deleted file mode 100644
index 2ec0f3f21c41..000000000000
--- a/writerfilter/source/dmapper/DocumentProtection.hxx
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include "LoggedResources.hxx"
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <ooxml/resourceids.hxx>
-
-namespace writerfilter::dmapper
-{
-/** Document protection restrictions
- *
- * This element specifies the set of document protection restrictions which have been applied to the contents of a
- * WordprocessingML document.These restrictions should be enforced by applications editing this document
- * when the enforcement attribute is turned on, and ignored(but persisted) otherwise.Document protection is a
- * set of restrictions used to prevent unintentional changes to all or part of a WordprocessingML document.
- */
-class DocumentProtection : public LoggedProperties
-{
-private:
- /** Document Editing Restrictions
- *
- * Possible values:
- * - NS_ooxml::LN_Value_doc_ST_DocProtect_none
- * - NS_ooxml::LN_Value_doc_ST_DocProtect_readOnly
- * - NS_ooxml::LN_Value_doc_ST_DocProtect_comments
- * - NS_ooxml::LN_Value_doc_ST_DocProtect_trackedChanges
- * - NS_ooxml::LN_Value_doc_ST_DocProtect_forms
- */
- sal_Int32 m_nEdit;
- bool m_bProtectForm;
- bool m_bRedlineProtection;
- OUString m_sRedlineProtectionKey;
- bool m_bReadOnly;
- bool m_bEnforcement;
- bool m_bFormatting;
-
- /** Provider type
- *
- * Possible values:
- * "rsaAES" - NS_ooxml::LN_Value_doc_ST_CryptProv_rsaAES
- * "rsaFull" - NS_ooxml::LN_Value_doc_ST_CryptProv_rsaFull
- */
- sal_Int32 m_nCryptProviderType;
- OUString m_sCryptAlgorithmClass;
- OUString m_sCryptAlgorithmType;
- OUString m_sCryptAlgorithmSid;
- sal_Int32 m_CryptSpinCount;
- OUString m_sHash;
- OUString m_sSalt;
-
- virtual void lcl_attribute(Id Name, Value& val) override;
- virtual void lcl_sprm(Sprm& sprm) override;
-
- bool enabled() const { return !isNone(); }
- bool isNone() const { return m_nEdit == NS_ooxml::LN_Value_doc_ST_DocProtect_none; };
-
-public:
- DocumentProtection();
- virtual ~DocumentProtection() override;
-
- css::uno::Sequence<css::beans::PropertyValue> toSequence() const;
-
- bool getProtectForm() const { return m_bProtectForm; }
- bool getRedlineProtection() const { return m_bRedlineProtection; }
- bool getReadOnly() const { return m_bReadOnly; }
- bool getEnforcement() const { return m_bEnforcement; }
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
deleted file mode 100644
index 22a2a17045c0..000000000000
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ /dev/null
@@ -1,5049 +0,0 @@
-/* -*- 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/.
- *
- * 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 "BorderHandler.hxx"
-#include "PageBordersHandler.hxx"
-
-#include "util.hxx"
-#include "SdtHelper.hxx"
-#include "TagLogger.hxx"
-#include "TDefTableHandler.hxx"
-#include "DomainMapper_Impl.hxx"
-#include "ConversionHelper.hxx"
-#include "ModelEventListener.hxx"
-#include "MeasureHandler.hxx"
-#include <i18nlangtag/languagetag.hxx>
-#include <i18nutil/paper.hxx>
-#include <ooxml/resourceids.hxx>
-#include <oox/token/tokens.hxx>
-#include <oox/drawingml/drawingmltypes.hxx>
-
-#include <com/sun/star/awt/Gradient2.hpp>
-#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
-#include <com/sun/star/document/XOOXMLDocumentPropertiesImporter.hpp>
-#include <com/sun/star/drawing/FillStyle.hpp>
-#include <com/sun/star/drawing/TextVerticalAdjust.hpp>
-#include <com/sun/star/table/BorderLineStyle.hpp>
-#include <com/sun/star/table/ShadowFormat.hpp>
-#include <com/sun/star/text/HoriOrientation.hpp>
-#include <com/sun/star/text/RelOrientation.hpp>
-#include <com/sun/star/text/VertOrientation.hpp>
-#include <com/sun/star/text/WrapTextMode.hpp>
-#include <com/sun/star/text/SizeType.hpp>
-#include <com/sun/star/text/XEndnotesSupplier.hpp>
-#include <com/sun/star/text/XFootnotesSupplier.hpp>
-#include <com/sun/star/text/XLineNumberingProperties.hpp>
-#include <com/sun/star/awt/FontRelief.hpp>
-#include <com/sun/star/awt/FontWeight.hpp>
-#include <com/sun/star/awt/FontUnderline.hpp>
-#include <com/sun/star/awt/FontStrikeout.hpp>
-#include <com/sun/star/awt/FontSlant.hpp>
-#include <com/sun/star/document/XEventBroadcaster.hpp>
-#include <com/sun/star/style/ParagraphAdjust.hpp>
-#include <com/sun/star/style/BreakType.hpp>
-#include <com/sun/star/style/CaseMap.hpp>
-#include <com/sun/star/style/LineSpacing.hpp>
-#include <com/sun/star/style/LineSpacingMode.hpp>
-#include <com/sun/star/text/FootnoteNumbering.hpp>
-#include <com/sun/star/text/TextGridMode.hpp>
-#include <com/sun/star/text/XDocumentIndexesSupplier.hpp>
-#include <com/sun/star/text/XTextFieldsSupplier.hpp>
-#include <com/sun/star/text/WritingMode.hpp>
-#include <com/sun/star/text/WritingMode2.hpp>
-#include <com/sun/star/text/XFootnote.hpp>
-#include <com/sun/star/text/XTextColumns.hpp>
-#include <com/sun/star/text/RubyPosition.hpp>
-#include <com/sun/star/uno/XComponentContext.hpp>
-#include <com/sun/star/text/FontEmphasis.hpp>
-#include <com/sun/star/awt/CharSet.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/util/XComplexColor.hpp>
-#include <comphelper/types.hxx>
-#include <comphelper/storagehelper.hxx>
-#include <comphelper/sequence.hxx>
-#include <editeng/escapementitem.hxx>
-#include <filter/msfilter/util.hxx>
-#include <sfx2/DocumentMetadataAccess.hxx>
-#include <unotools/localedatawrapper.hxx>
-#include <unotools/mediadescriptor.hxx>
-
-#include "TextEffectsHandler.hxx"
-#include "ThemeColorHandler.hxx"
-#include "CellColorHandler.hxx"
-#include "SectionColumnHandler.hxx"
-#include "GraphicHelpers.hxx"
-#include <dmapper/GraphicZOrderHelper.hxx>
-#include <comphelper/diagnose_ex.hxx>
-#include <sal/log.hxx>
-#include <tools/UnitConversion.hxx>
-
-using namespace ::com::sun::star;
-using namespace oox;
-
-namespace writerfilter::dmapper{
-
-struct
-{
- sal_Int32 h;
- bool orient;
- sal_Int32 w;
-} CT_PageSz;
-
-
-DomainMapper::DomainMapper( const uno::Reference< uno::XComponentContext >& xContext,
- uno::Reference<io::XInputStream> const& xInputStream,
- uno::Reference<lang::XComponent> const& xModel,
- bool bRepairStorage,
- SourceDocumentType eDocumentType,
- utl::MediaDescriptor const & rMediaDesc) :
- LoggedProperties("DomainMapper"),
- LoggedTable("DomainMapper"),
- LoggedStream("DomainMapper"),
- m_pImpl(new DomainMapper_Impl(*this, xContext, xModel, eDocumentType, rMediaDesc)),
- mbIsSplitPara(false),
- mbHasControls(false),
- mbWasShapeInPara(false)
-{
- if (m_pImpl->IsNewDoc())
- {
- // #i24363# tab stops relative to indent
- m_pImpl->SetDocumentSettingsProperty(
- getPropertyName(PROP_TABS_RELATIVE_TO_INDENT),
- uno::Any(false));
- m_pImpl->SetDocumentSettingsProperty(
- getPropertyName(PROP_SURROUND_TEXT_WRAP_SMALL),
- uno::Any(true));
- m_pImpl->SetDocumentSettingsProperty(
- getPropertyName(PROP_APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING),
- uno::Any(true));
-
- // Don't load the default style definitions to avoid weird mix
- m_pImpl->SetDocumentSettingsProperty("StylesNoDefault", uno::Any(true));
- m_pImpl->SetDocumentSettingsProperty("MsWordCompTrailingBlanks", uno::Any(true));
- m_pImpl->SetDocumentSettingsProperty("HeaderSpacingBelowLastPara",
- uno::Any(true));
- m_pImpl->SetDocumentSettingsProperty("FrameAutowidthWithMorePara", uno::Any(true));
- m_pImpl->SetDocumentSettingsProperty("FootnoteInColumnToPageEnd", uno::Any(true));
- m_pImpl->SetDocumentSettingsProperty("TabAtLeftIndentForParagraphsInList", uno::Any(true));
- m_pImpl->SetDocumentSettingsProperty(u"NoGapAfterNoteNumber"_ustr, uno::Any(true));
-
- // Enable only for new documents, since pasting from clipboard can influence existing doc
- m_pImpl->SetDocumentSettingsProperty("NoNumberingShowFollowBy", uno::Any(true));
- }
-
- // Initialize RDF metadata, to be able to add statements during the import.
- try
- {
- uno::Reference<rdf::XDocumentMetadataAccess> xDocumentMetadataAccess(xModel, uno::UNO_QUERY_THROW);
- uno::Reference<embed::XStorage> xStorage = comphelper::OStorageHelper::GetTemporaryStorage();
- OUString aBaseURL = rMediaDesc.getUnpackedValueOrDefault("URL", OUString());
- const uno::Reference<frame::XModel> xModel_(xModel,
- uno::UNO_QUERY_THROW);
- const uno::Reference<rdf::XURI> xBaseURI(sfx2::createBaseURI(xContext, xModel_, aBaseURL, u""));
- const uno::Reference<task::XInteractionHandler> xHandler;
- xDocumentMetadataAccess->loadMetadataFromStorage(xStorage, xBaseURI, xHandler);
- }
- catch (const uno::Exception&)
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter", "failed to initialize RDF metadata");
- }
-
- if (eDocumentType == SourceDocumentType::OOXML) {
- // tdf#108350
- // In Word since version 2007, the default document font is Calibri 11 pt.
- // If a DOCX document doesn't contain font information, we should assume
- // the intended font to provide best layout match.
- try
- {
- uno::Reference< beans::XPropertySet > xDefProps(GetTextFactory()->createInstance("com.sun.star.text.Defaults"),
- uno::UNO_QUERY_THROW);
- xDefProps->setPropertyValue(getPropertyName(PROP_CHAR_FONT_NAME), css::uno::Any(OUString("Calibri")));
- xDefProps->setPropertyValue(getPropertyName(PROP_CHAR_HEIGHT), css::uno::Any(double(11)));
- }
- catch (const uno::Exception&)
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter", "failed to initialize default font");
- }
- }
-
- //import document properties
- try
- {
- m_pImpl->m_xDocumentStorage = comphelper::OStorageHelper::GetStorageOfFormatFromInputStream(
- OFOPXML_STORAGE_FORMAT_STRING, xInputStream, xContext, bRepairStorage);
-
- uno::Reference< uno::XInterface > xTemp = xContext->getServiceManager()->createInstanceWithContext(
- "com.sun.star.document.OOXMLDocumentPropertiesImporter",
- xContext);
-
- uno::Reference< document::XOOXMLDocumentPropertiesImporter > xImporter( xTemp, uno::UNO_QUERY_THROW );
- uno::Reference< document::XDocumentPropertiesSupplier > xPropSupplier( xModel, uno::UNO_QUERY_THROW);
- xImporter->importProperties(m_pImpl->m_xDocumentStorage,
- xPropSupplier->getDocumentProperties());
- }
- catch( const uno::Exception& ) {}
-}
-
-void DomainMapper::setDocumentReference(writerfilter::ooxml::OOXMLDocument* pDocument)
-{
- m_pImpl->setDocumentReference(pDocument);
-}
-
-DomainMapper::~DomainMapper()
-{
- try
- {
- // Remove temporary footnotes and endnotes
- m_pImpl->RemoveTemporaryFootOrEndnotes();
-
- uno::Reference< text::XDocumentIndexesSupplier> xIndexesSupplier( m_pImpl->GetTextDocument(), uno::UNO_QUERY );
- sal_Int32 nIndexes = 0;
- if( xIndexesSupplier.is() )
- {
- uno::Reference< container::XIndexAccess > xIndexes = xIndexesSupplier->getDocumentIndexes();
- nIndexes = xIndexes->getCount();
- }
- // If we have page references, those need updating as well, similar to the indexes.
- uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(m_pImpl->GetTextDocument(), uno::UNO_QUERY);
- if(xTextFieldsSupplier.is())
- {
- uno::Reference<container::XEnumeration> xEnumeration = xTextFieldsSupplier->getTextFields()->createEnumeration();
- while(xEnumeration->hasMoreElements())
- {
- ++nIndexes;
- xEnumeration->nextElement();
- }
- }
-
- mbHasControls |= m_pImpl->m_pSdtHelper->hasElements();
- if ( nIndexes || mbHasControls )
- {
- //index update has to wait until first view is created
- uno::Reference< document::XEventBroadcaster > xBroadcaster(xIndexesSupplier, uno::UNO_QUERY);
- if (xBroadcaster.is())
- xBroadcaster->addEventListener(uno::Reference< document::XEventListener >(new ModelEventListener(nIndexes, mbHasControls)));
- }
-
-
- // Apply the document settings for both DOCX and RTF after everything else
- m_pImpl->GetSettingsTable()->ApplyProperties( m_pImpl->GetTextDocument( ) );
-
- // now that importing is finished, re-enable default styles for any that were never defined/imported.
- m_pImpl->SetDocumentSettingsProperty("StylesNoDefault", uno::Any(false));
-
- // Grab-bag handling
- comphelper::SequenceAsHashMap aProperties;
-
- // Add the saved w:themeFontLang setting
- aProperties["ThemeFontLangProps"] <<= m_pImpl->GetSettingsTable()->GetThemeFontLangProperties();
-
- // Add the saved compat settings
- aProperties["CompatSettings"] <<= m_pImpl->GetSettingsTable()->GetCompatSettings();
-
- // Add the saved DocumentProtection settings
- aProperties["DocumentProtection"] <<= m_pImpl->GetSettingsTable()->GetDocumentProtectionSettings();
-
- // Add the saved w:doNotHyphenateCaps setting
- aProperties["NoHyphenateCaps"] <<= m_pImpl->GetSettingsTable()->GetNoHyphenateCaps();
-
- uno::Reference<beans::XPropertySet> xDocProps(m_pImpl->GetTextDocument(), uno::UNO_QUERY);
- if (xDocProps.is())
- {
- comphelper::SequenceAsHashMap aGrabBag(xDocProps->getPropertyValue("InteropGrabBag"));
- aGrabBag.update(aProperties);
- xDocProps->setPropertyValue("InteropGrabBag", uno::Any(aGrabBag.getAsConstPropertyValueList()));
- }
-
- // tdf#138782: for docs created in MS Word 2010 and older (compatibilityMode <= 14)
- m_pImpl->SetDocumentSettingsProperty(
- "AddFrameOffsets",
- uno::Any(14 >= m_pImpl->GetSettingsTable()->GetWordCompatibilityMode()));
- }
- catch( const uno::Exception& ) {}
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endDocument();
-#endif
-}
-
-void DomainMapper::lcl_attribute(Id nName, Value & val)
-{
- if (m_pImpl->hasTableManager() && m_pImpl->getTableManager().attribute(nName, val))
- return;
-
- static const int nSingleLineSpacing = 240;
- sal_Int32 nIntValue = val.getInt();
- OUString sStringValue = val.getString();
-
- SectionPropertyMap * pSectionContext = m_pImpl->GetSectionContext();
- switch( nName )
- {
- case NS_ooxml::LN_CT_Lvl_start:
- break;
- case NS_ooxml::LN_CT_Lvl_numFmt:
- break;
- case NS_ooxml::LN_CT_Lvl_isLgl:
- break;
- case NS_ooxml::LN_CT_Lvl_legacy:
- break;
- case NS_ooxml::LN_CT_AbstractNum_nsid:
- break;
- case NS_ooxml::LN_CT_AbstractNum_tmpl:
- break;
- case NS_ooxml::LN_CT_Border_sz:
- break;
- case NS_ooxml::LN_CT_Border_val:
- break;
- case NS_ooxml::LN_CT_Border_space:
- break;
- case NS_ooxml::LN_CT_Border_shadow:
- break;
- case NS_ooxml::LN_CT_Border_frame:
- break;
- case NS_ooxml::LN_headerr:
- break;
- case NS_ooxml::LN_footerr:
- break;
- case NS_ooxml::LN_endnote:
- break;
- case NS_ooxml::LN_CT_Bookmark_name:
- m_pImpl->SetBookmarkName( sStringValue );
- break;
- case NS_ooxml::LN_CT_MarkupRangeBookmark_id:
- // add a bookmark range -- this remembers a bookmark starting here
- // or, if the bookmark was already started or, if the bookmark was
- // already started before, writes out the bookmark
- m_pImpl->StartOrEndBookmark( sStringValue );
- break;
- case NS_ooxml::LN_CT_MarkupRange_displacedByCustomXml:
- break;
- case NS_ooxml::LN_NUMBERING:
- break;
- case NS_ooxml::LN_FONTTABLE:
- break;
- case NS_ooxml::LN_STYLESHEET:
- break;
-
- case NS_ooxml::LN_CT_Sym_char:
- m_pImpl->SetSymbolChar(nIntValue);
- break;
- case NS_ooxml::LN_CT_Sym_font:
- m_pImpl->SetSymbolFont(sStringValue);
- break;
- case NS_ooxml::LN_CT_Underline_val:
- if (m_pImpl->GetTopContext())
- handleUnderlineType(nIntValue, m_pImpl->GetTopContext());
- break;
- case NS_ooxml::LN_CT_Underline_color:
- if (m_pImpl->GetTopContext())
- {
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_UNDERLINE_HAS_COLOR, uno::Any( true ) );
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_UNDERLINE_COLOR, uno::Any( nIntValue ) );
- }
- break;
- case NS_ooxml::LN_CT_Underline_themeColor:
- case NS_ooxml::LN_CT_Underline_themeTint:
- case NS_ooxml::LN_CT_Underline_themeShade:
- if (m_pImpl->GetTopContext())
- {
- uno::Reference<util::XComplexColor> xComplexColor;
- model::ComplexColor aComplexColor;
-
- PropertyMapPtr pTopContext = m_pImpl->GetTopContext();
- std::optional<PropertyMap::Property> aValue;
- if (pTopContext && (aValue = pTopContext->getProperty(PROP_CHAR_UNDERLINE_COMPLEX_COLOR)))
- {
- aValue->second >>= xComplexColor;
- if (xComplexColor.is())
- aComplexColor = model::color::getFromXComplexColor(xComplexColor);
- }
-
- if (nName == NS_ooxml::LN_CT_Underline_themeColor)
- {
- auto eThemeColorType = TDefTableHandler::getThemeColorTypeIndex(nIntValue);
- aComplexColor.setThemeColor(eThemeColorType);
- }
- else if (nName == NS_ooxml::LN_CT_Underline_themeTint)
- {
- if (nIntValue > 0)
- {
- sal_Int16 nTransformedValue = sal_Int16((255.0 - nIntValue) * 10000.0 / 255.0);
- aComplexColor.addTransformation({model::TransformationType::Tint, sal_Int16(nTransformedValue)});
- }
- }
- else if (nName == NS_ooxml::LN_CT_Underline_themeShade)
- {
- if (nIntValue > 0)
- {
- sal_Int16 nTransformedValue = sal_Int16((255.0 - nIntValue) * 10000.0 / 255.0);
- aComplexColor.addTransformation({model::TransformationType::Shade, sal_Int16(nTransformedValue)});
- }
- }
- xComplexColor = model::color::createXComplexColor(aComplexColor);
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_UNDERLINE_COMPLEX_COLOR, uno::Any(xComplexColor));
- }
- break;
-
- case NS_ooxml::LN_CT_TabStop_val:
- if (sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_ST_TabJc_clear)
- {
- m_pImpl->m_aCurrentTabStop.bDeleted = true;
- }
- else
- {
- m_pImpl->m_aCurrentTabStop.bDeleted = false;
- m_pImpl->m_aCurrentTabStop.Alignment = getTabAlignFromValue(nIntValue);
- }
- break;
- case NS_ooxml::LN_CT_TabStop_leader:
- m_pImpl->m_aCurrentTabStop.FillChar = getFillCharFromValue(nIntValue);
- break;
- case NS_ooxml::LN_CT_TabStop_pos:
- m_pImpl->m_aCurrentTabStop.Position = ConversionHelper::convertTwipToMM100(nIntValue);
- break;
-
- case NS_ooxml::LN_CT_Fonts_ascii:
- if (m_pImpl->GetTopContext())
- {
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_FONT_NAME, uno::Any( sStringValue ));
- }
- break;
- case NS_ooxml::LN_CT_Fonts_asciiTheme:
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "asciiTheme", ThemeHandler::getStringForTheme(nIntValue));
- if (m_pImpl->GetTopContext())
- {
- // note: overwrite Fonts_ascii with Fonts_asciiTheme *even if*
- // theme font is empty - this is apparently what Word 2013 does
- uno::Any aPropValue( m_pImpl->getFontNameForTheme( nIntValue ) );
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_FONT_NAME, aPropValue );
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_FONT_NAME_ASCII, aPropValue, true, CHAR_GRAB_BAG );
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_NAME_ASCII, uno::Any( ThemeHandler::getStringForTheme(nIntValue) ), true, CHAR_GRAB_BAG);
- }
- break;
- case NS_ooxml::LN_CT_Fonts_hAnsi:
- break;//unsupported
- case NS_ooxml::LN_CT_Fonts_hAnsiTheme:
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "hAnsiTheme", ThemeHandler::getStringForTheme(nIntValue));
- if (m_pImpl->GetTopContext())
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_NAME_H_ANSI, uno::Any( ThemeHandler::getStringForTheme(nIntValue) ), true, CHAR_GRAB_BAG);
- break;
- case NS_ooxml::LN_CT_Fonts_eastAsia:
- if (m_pImpl->GetTopContext())
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_FONT_NAME_ASIAN, uno::Any( sStringValue ));
- break;
- case NS_ooxml::LN_CT_Fonts_eastAsiaTheme:
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "eastAsiaTheme", ThemeHandler::getStringForTheme(nIntValue));
- if (m_pImpl->GetTopContext())
- {
- uno::Any aPropValue( m_pImpl->getFontNameForTheme( nIntValue ) );
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_FONT_NAME_ASIAN, aPropValue );
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_FONT_NAME_EAST_ASIA, aPropValue, true, CHAR_GRAB_BAG );
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_NAME_EAST_ASIA, uno::Any( ThemeHandler::getStringForTheme(nIntValue) ), true, CHAR_GRAB_BAG);
- }
- break;
- case NS_ooxml::LN_CT_Fonts_cs:
- if (m_pImpl->GetTopContext())
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_FONT_NAME_COMPLEX, uno::Any( sStringValue ));
- break;
- case NS_ooxml::LN_CT_Fonts_cstheme:
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "cstheme", ThemeHandler::getStringForTheme(nIntValue));
- if (m_pImpl->GetTopContext())
- {
- uno::Any aPropValue( m_pImpl->getFontNameForTheme( nIntValue ) );
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_FONT_NAME_COMPLEX, aPropValue );
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_FONT_NAME_CS, aPropValue, true, CHAR_GRAB_BAG );
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_NAME_CS, uno::Any( ThemeHandler::getStringForTheme(nIntValue) ), true, CHAR_GRAB_BAG);
- }
- break;
- case NS_ooxml::LN_CT_Spacing_before:
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "before", OUString::number(nIntValue));
- if (m_pImpl->GetTopContext())
- // Don't overwrite NS_ooxml::LN_CT_Spacing_beforeAutospacing.
- m_pImpl->GetTopContext()->Insert(
- PROP_PARA_TOP_MARGIN,
- uno::Any(static_cast<sal_Int32>(convertTwipToMm100(nIntValue))), false);
- break;
- case NS_ooxml::LN_CT_Spacing_beforeLines:
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "beforeLines", OUString::number(nIntValue));
- // We would need to make sure that this doesn't overwrite any
- // NS_ooxml::LN_CT_Spacing_before in parent styles before style
- // sheet support can be enabled.
- if (m_pImpl->GetTopContext() && !IsStyleSheetImport())
- m_pImpl->GetTopContext()->Insert(PROP_PARA_TOP_MARGIN, uno::Any(ConversionHelper::convertTwipToMM100(nIntValue * nSingleLineSpacing / 100)), false);
- break;
- case NS_ooxml::LN_CT_Spacing_after:
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "after", OUString::number(nIntValue));
- if (m_pImpl->GetTopContext())
- {
- // Don't overwrite NS_ooxml::LN_CT_Spacing_afterAutospacing.
- m_pImpl->GetTopContext()->Insert(PROP_PARA_BOTTOM_MARGIN, uno::Any( ConversionHelper::convertTwipToMM100( nIntValue ) ), false);
-
- uno::Any aContextualSpacingFromStyle = m_pImpl->GetPropertyFromParaStyleSheet(PROP_PARA_CONTEXT_MARGIN);
- if (aContextualSpacingFromStyle.hasValue())
- // Setting "after" spacing means Writer doesn't inherit
- // contextual spacing anymore from style, but Word does.
- m_pImpl->GetTopContext()->Insert(PROP_PARA_CONTEXT_MARGIN, aContextualSpacingFromStyle);
- }
- break;
- case NS_ooxml::LN_CT_Spacing_afterLines:
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "afterLines", OUString::number(nIntValue));
- // We would need to make sure that this doesn't overwrite any
- // NS_ooxml::LN_CT_Spacing_after in parent styles before style
- // sheet support can be enabled.
- if (m_pImpl->GetTopContext() && !IsStyleSheetImport())
- m_pImpl->GetTopContext()->Insert(PROP_PARA_BOTTOM_MARGIN, uno::Any(ConversionHelper::convertTwipToMM100(nIntValue * nSingleLineSpacing / 100)), false);
- break;
- case NS_ooxml::LN_CT_Spacing_line: //91434
- case NS_ooxml::LN_CT_Spacing_lineRule: //91435
- {
- style::LineSpacing aSpacing;
- PropertyMapPtr pTopContext = m_pImpl->GetTopContext();
- std::optional<PropertyMap::Property> aLineSpacingVal;
- if (pTopContext && (aLineSpacingVal = pTopContext->getProperty(PROP_PARA_LINE_SPACING)) )
- {
- aLineSpacingVal->second >>= aSpacing;
- }
- else
- {
- //default to single line spacing
- aSpacing.Mode = style::LineSpacingMode::FIX;
- aSpacing.Height = sal_Int16(ConversionHelper::convertTwipToMM100( nSingleLineSpacing ));
- }
- if( nName == NS_ooxml::LN_CT_Spacing_line )
- {
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "line", OUString::number(nIntValue));
- //now set the value depending on the Mode
- if( aSpacing.Mode == style::LineSpacingMode::PROP )
- aSpacing.Height = sal_Int16(nIntValue * 100 / nSingleLineSpacing );
- else
- aSpacing.Height = sal_Int16(ConversionHelper::convertTwipToMM100( nIntValue ));
- }
- else //NS_ooxml::LN_CT_Spacing_lineRule:
- {
- // exactly, atLeast, auto
- if( sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_doc_ST_LineSpacingRule_auto)
- {
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "lineRule", "auto");
- if (aSpacing.Height >= 0)
- {
- aSpacing.Mode = style::LineSpacingMode::PROP;
- //reinterpret the already set value
- aSpacing.Height = sal_Int16( aSpacing.Height * 100 / ConversionHelper::convertTwipToMM100( nSingleLineSpacing ));
- }
- else
- {
- // Negative value still means a positive height,
- // just the mode is "exact".
- aSpacing.Mode = style::LineSpacingMode::FIX;
- aSpacing.Height *= -1;
- }
- }
- else if( sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_doc_ST_LineSpacingRule_atLeast)
- {
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "lineRule", "atLeast");
- aSpacing.Mode = style::LineSpacingMode::MINIMUM;
- }
- else // NS_ooxml::LN_Value_doc_ST_LineSpacingRule_exact
- {
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "lineRule", "exact");
- aSpacing.Mode = style::LineSpacingMode::FIX;
- }
- }
- if (pTopContext)
- pTopContext->Insert(PROP_PARA_LINE_SPACING, uno::Any( aSpacing ));
- }
- break;
- case NS_ooxml::LN_CT_Ind_start:
- case NS_ooxml::LN_CT_Ind_left:
- if (m_pImpl->GetTopContext())
- {
- // Word inherits FirstLineIndent property of the numbering, even if ParaLeftMargin is set, Writer does not.
- // So copy it explicitly, if necessary.
- sal_Int32 nFirstLineIndent = m_pImpl->getCurrentNumberingProperty("FirstLineIndent");
- sal_Int32 nIndentAt = m_pImpl->getCurrentNumberingProperty("IndentAt");
-
- sal_Int32 nParaLeftMargin = ConversionHelper::convertTwipToMM100(nIntValue);
- if (nParaLeftMargin != 0 && nIndentAt == nParaLeftMargin)
- // Avoid direct left margin when it's the same as from the
- // numbering.
- break;
-
- if (nFirstLineIndent != 0)
- m_pImpl->GetTopContext()->Insert(PROP_PARA_FIRST_LINE_INDENT, uno::Any(nFirstLineIndent), /*bOverwrite=*/false);
-
- m_pImpl->GetTopContext()->Insert(PROP_PARA_LEFT_MARGIN,
- uno::Any(nParaLeftMargin));
- }
- break;
- case NS_ooxml::LN_CT_Ind_end:
- case NS_ooxml::LN_CT_Ind_right:
- if (m_pImpl->GetTopContext())
- {
- // Word inherits FirstLineIndent/ParaLeftMargin property of the numbering, even if ParaRightMargin is set, Writer does not.
- // So copy it explicitly, if necessary.
- sal_Int32 nFirstLineIndent = m_pImpl->getCurrentNumberingProperty("FirstLineIndent");
- sal_Int32 nParaLeftMargin = m_pImpl->getCurrentNumberingProperty("IndentAt");
-
- if (nFirstLineIndent != 0)
- m_pImpl->GetTopContext()->Insert(PROP_PARA_FIRST_LINE_INDENT, uno::Any(nFirstLineIndent), /*bOverwrite=*/false);
- if (nParaLeftMargin != 0)
- m_pImpl->GetTopContext()->Insert(PROP_PARA_LEFT_MARGIN, uno::Any(nParaLeftMargin), /*bOverwrite=*/false);
-
- m_pImpl->GetTopContext()->Insert(
- PROP_PARA_RIGHT_MARGIN, uno::Any( ConversionHelper::convertTwipToMM100(nIntValue ) ));
- }
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "right", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Ind_hanging:
- if (m_pImpl->GetTopContext())
- {
- sal_Int32 nValue = ConversionHelper::convertTwipToMM100( nIntValue );
- m_pImpl->GetTopContext()->Insert(
- PROP_PARA_FIRST_LINE_INDENT, uno::Any( - nValue ));
-
- // See above, need to inherit left margin from list style when first is set.
- sal_Int32 nParaLeftMargin = m_pImpl->getCurrentNumberingProperty("IndentAt");
- if (nParaLeftMargin != 0)
- m_pImpl->GetTopContext()->Insert(PROP_PARA_LEFT_MARGIN, uno::Any(nParaLeftMargin), /*bOverwrite=*/false);
- }
- break;
- case NS_ooxml::LN_CT_Ind_firstLine:
- if (m_pImpl->GetTopContext())
- {
- sal_Int32 nFirstLineIndent
- = m_pImpl->getCurrentNumberingProperty("FirstLineIndent");
- sal_Int32 nParaFirstLineIndent = ConversionHelper::convertTwipToMM100(nIntValue);
- if (nParaFirstLineIndent != 0 && nFirstLineIndent == nParaFirstLineIndent)
- // Avoid direct first margin when it's the same as from the
- // numbering.
- break;
- m_pImpl->GetTopContext()->Insert(PROP_PARA_FIRST_LINE_INDENT,
- uno::Any(nParaFirstLineIndent));
- }
- break;
- case NS_ooxml::LN_CT_Ind_rightChars:
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "rightChars", OUString::number(nIntValue));
- break;
-
- case NS_ooxml::LN_CT_EastAsianLayout_id:
- break;
- case NS_ooxml::LN_CT_EastAsianLayout_combine:
- if (m_pImpl->GetTopContext())
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_COMBINE_IS_ON, uno::Any ( nIntValue != 0 ));
- break;
- case NS_ooxml::LN_CT_EastAsianLayout_combineBrackets:
- if (m_pImpl->GetTopContext())
- {
- OUString sCombinePrefix = getBracketStringFromEnum(nIntValue);
- OUString sCombineSuffix = getBracketStringFromEnum(nIntValue, false);
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_COMBINE_PREFIX, uno::Any ( sCombinePrefix ));
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_COMBINE_SUFFIX, uno::Any ( sCombineSuffix ));
- }
- break;
- case NS_ooxml::LN_CT_EastAsianLayout_vert:
- if (m_pImpl->GetTopContext())
- {
- sal_Int16 nRotationAngle = (nIntValue ? 900 : 0);
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_ROTATION, uno::Any ( nRotationAngle ));
- }
- break;
- case NS_ooxml::LN_CT_EastAsianLayout_vertCompress:
- if (m_pImpl->GetTopContext())
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_ROTATION_IS_FIT_TO_LINE, uno::Any ( nIntValue != 0 ));
- break;
-
- case NS_ooxml::LN_CT_PageSz_code:
- break;
- case NS_ooxml::LN_CT_PageSz_h:
- {
- sal_Int32 nHeight = ConversionHelper::convertTwipToMM100WithoutLimit(nIntValue);
- CT_PageSz.h = PaperInfo::sloppyFitPageDimension(nHeight);
- }
- break;
- case NS_ooxml::LN_CT_PageSz_orient:
- CT_PageSz.orient = (nIntValue != NS_ooxml::LN_Value_ST_PageOrientation_portrait);
- break;
- case NS_ooxml::LN_CT_PageSz_w:
- {
- sal_Int32 nWidth = ConversionHelper::convertTwipToMM100WithoutLimit(nIntValue);
- CT_PageSz.w = PaperInfo::sloppyFitPageDimension(nWidth);
- }
- break;
-
- case NS_ooxml::LN_CT_PageMar_top:
- m_pImpl->SetPageMarginTwip( PAGE_MAR_TOP, nIntValue );
- break;
- case NS_ooxml::LN_CT_PageMar_right:
- m_pImpl->SetPageMarginTwip( PAGE_MAR_RIGHT, nIntValue );
- break;
- case NS_ooxml::LN_CT_PageMar_bottom:
- m_pImpl->SetPageMarginTwip( PAGE_MAR_BOTTOM, nIntValue );
- break;
- case NS_ooxml::LN_CT_PageMar_left:
- m_pImpl->SetPageMarginTwip( PAGE_MAR_LEFT, nIntValue );
- break;
- case NS_ooxml::LN_CT_PageMar_header:
- m_pImpl->SetPageMarginTwip( PAGE_MAR_HEADER, nIntValue );
- break;
- case NS_ooxml::LN_CT_PageMar_footer:
- m_pImpl->SetPageMarginTwip( PAGE_MAR_FOOTER, nIntValue );
- break;
- case NS_ooxml::LN_CT_PageMar_gutter:
- m_pImpl->SetPageMarginTwip( PAGE_MAR_GUTTER, nIntValue );
- break;
- case NS_ooxml::LN_CT_PaperSource_first:
- m_pImpl->SetPaperSource(PAPER_SOURCE_FIRST, sStringValue.toInt32());
- break;
- case NS_ooxml::LN_CT_PaperSource_other:
- m_pImpl->SetPaperSource(PAPER_SOURCE_OTHER, sStringValue.toInt32());
- break;
- case NS_ooxml::LN_CT_Language_val: //90314
- case NS_ooxml::LN_CT_Language_eastAsia: //90315
- case NS_ooxml::LN_CT_Language_bidi: //90316
- {
- // store decimal symbol associated to the language of the document
- if ( m_pImpl->IsDocDefaultsImport() && ( nName == NS_ooxml::LN_CT_Language_val ) )
- {
- LanguageTag aLanguageTag( sStringValue );
- LocaleDataWrapper aLocaleWrapper( std::move(aLanguageTag) );
- if ( aLocaleWrapper.getNumDecimalSep() == "," )
- m_pImpl->SetIsDecimalComma();
-
- }
- if (nName == NS_ooxml::LN_CT_Language_eastAsia)
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "eastAsia", sStringValue);
- else if (nName == NS_ooxml::LN_CT_Language_val)
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "val", sStringValue);
- else if (nName == NS_ooxml::LN_CT_Language_bidi)
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "bidi", sStringValue);
- lang::Locale aLocale;
- if (sStringValue.getLength() <= 3 && sStringValue.getLength() >= 1)
- {
- // Cheesy Google Docs is known to tag language-only even for
- // "en" or others that need some region to distinguish language
- // variants for spell-checker and hyphenation. Obtain our known
- // fallback to clarify and match. The original value/context is
- // unknown anyway.
- LanguageTag aLanguageTag( sStringValue);
- aLanguageTag.makeFallback();
- if (aLanguageTag.getLanguage() == sStringValue)
- aLocale = aLanguageTag.getLocale();
- else
- {
- // Do not fallback for an unknown language, which usually
- // results in "en-US", or any other non-matching case.
- aLocale = LanguageTag::convertToLocale( sStringValue);
- }
- }
- else
- {
- aLocale = LanguageTag::convertToLocale( sStringValue);
- }
- if (m_pImpl->GetTopContext())
- m_pImpl->GetTopContext()->Insert(NS_ooxml::LN_CT_Language_val== nName ? PROP_CHAR_LOCALE :
- NS_ooxml::LN_CT_Language_eastAsia == nName ? PROP_CHAR_LOCALE_ASIAN : PROP_CHAR_LOCALE_COMPLEX,
- uno::Any( aLocale ) );
- }
- break;
- // See SwWW8ImplReader::GetParagraphAutoSpace() on why these are 100 and 280
- case NS_ooxml::LN_CT_Spacing_beforeAutospacing:
- {
- sal_Int32 default_spacing = -1;
- if (nIntValue)
- {
- m_pImpl->SetParaAutoBefore(true);
-
- default_spacing = 100;
- if (!m_pImpl->GetSettingsTable()->GetDoNotUseHTMLParagraphAutoSpacing())
- {
- // 49 is just the old value that should be removed, once the
- // root cause in SwTabFrm::MakeAll() is fixed.
- if (m_pImpl->GetSettingsTable()->GetView() == NS_ooxml::LN_Value_doc_ST_View_web)
- default_spacing = 49;
- else
- default_spacing = 280;
- }
- // required at export (here mainly for StyleSheets) to determine if the setting has changed from grab_bag
- m_pImpl->GetTopContext()->Insert(PROP_PARA_TOP_MARGIN, uno::Any(ConversionHelper::convertTwipToMM100(default_spacing)));
- }
- m_pImpl->GetTopContext()->Insert( PROP_PARA_TOP_MARGIN_BEFORE_AUTO_SPACING, uno::Any( ConversionHelper::convertTwipToMM100(default_spacing) ),true, PARA_GRAB_BAG );
- }
- break;
- case NS_ooxml::LN_CT_Spacing_afterAutospacing:
- {
- sal_Int32 default_spacing = -1;
- if (nIntValue)
- {
- default_spacing = 100;
- if (!m_pImpl->GetSettingsTable()->GetDoNotUseHTMLParagraphAutoSpacing())
- {
- if (m_pImpl->GetSettingsTable()->GetView() == NS_ooxml::LN_Value_doc_ST_View_web)
- default_spacing = 49;
- else
- default_spacing = 280;
- }
- m_pImpl->GetTopContext()->Insert(PROP_PARA_BOTTOM_MARGIN, uno::Any(ConversionHelper::convertTwipToMM100(default_spacing)));
- }
- m_pImpl->GetTopContext()->Insert( PROP_PARA_BOTTOM_MARGIN_AFTER_AUTO_SPACING, uno::Any( ConversionHelper::convertTwipToMM100(default_spacing) ),true, PARA_GRAB_BAG );
- }
- break;
- case NS_ooxml::LN_CT_SmartTagRun_uri:
- m_pImpl->getSmartTagHandler().setURI(val.getString());
- break;
- case NS_ooxml::LN_CT_SmartTagRun_element:
- m_pImpl->getSmartTagHandler().setElement(val.getString());
- break;
- case NS_ooxml::LN_CT_Br_type:
- // Handled in the OOXMLBreakHandler dtor.
- break;
- case NS_ooxml::LN_CT_Br_clear:
- m_pImpl->HandleLineBreakClear(val.getInt());
- break;
- case NS_ooxml::LN_CT_Fonts_hint :
- /* assigns script type to ambiguous characters, values can be:
- NS_ooxml::LN_Value_ST_Hint_default
- NS_ooxml::LN_Value_ST_Hint_eastAsia
- NS_ooxml::LN_Value_ST_Hint_cs
- */
- //TODO: unsupported?
- break;
- case NS_ooxml::LN_CT_TblBorders_right:
- case NS_ooxml::LN_CT_TblBorders_top:
- case NS_ooxml::LN_CT_TblBorders_left:
- case NS_ooxml::LN_CT_TblBorders_bottom:
- //todo: handle cell mar
- break;
- case NS_ooxml::LN_blip: // contains the binary graphic
- case NS_ooxml::LN_shape:
- {
- //looks a bit like a hack - and it is. The graphic import is split into the inline_inline part and
- //afterwards the adding of the binary data.
- m_pImpl->m_eGraphicImportType = IMPORT_AS_DETECTED_INLINE; // really ???
- m_pImpl->GetGraphicImport()->attribute(nName, val);
- m_pImpl->ImportGraphic(val.getProperties());
- }
- break;
- case NS_ooxml::LN_Value_math_ST_Jc_centerGroup:
- case NS_ooxml::LN_Value_math_ST_Jc_center:
- m_pImpl->appendStarMath(val);
- m_pImpl->adjustLastPara(sal_Int8(style::ParagraphAdjust::ParagraphAdjust_CENTER));
- break;
- case NS_ooxml::LN_Value_math_ST_Jc_left:
- m_pImpl->appendStarMath(val);
- m_pImpl->adjustLastPara(sal_Int8(style::ParagraphAdjust::ParagraphAdjust_LEFT));
- break;
- case NS_ooxml::LN_Value_math_ST_Jc_right:
- m_pImpl->appendStarMath(val);
- m_pImpl->adjustLastPara(sal_Int8(style::ParagraphAdjust::ParagraphAdjust_RIGHT));
- break;
- case NS_ooxml::LN_starmath:
- m_pImpl->appendStarMath(val);
- break;
- case NS_ooxml::LN_CT_FramePr_dropCap:
- case NS_ooxml::LN_CT_FramePr_lines:
- case NS_ooxml::LN_CT_FramePr_hAnchor:
- case NS_ooxml::LN_CT_FramePr_vAnchor:
- case NS_ooxml::LN_CT_FramePr_x:
- case NS_ooxml::LN_CT_FramePr_xAlign:
- case NS_ooxml::LN_CT_FramePr_y:
- case NS_ooxml::LN_CT_FramePr_yAlign:
- case NS_ooxml::LN_CT_FramePr_hRule:
- case NS_ooxml::LN_CT_FramePr_w:
- case NS_ooxml::LN_CT_FramePr_h:
- case NS_ooxml::LN_CT_FramePr_wrap:
- case NS_ooxml::LN_CT_FramePr_hSpace:
- case NS_ooxml::LN_CT_FramePr_vSpace:
- {
- ParagraphPropertiesPropertyMap* pParaProperties = nullptr;
- // handle frame properties at styles
- if( m_pImpl->GetTopContextType() == CONTEXT_STYLESHEET )
- pParaProperties = dynamic_cast< ParagraphPropertiesPropertyMap*>( m_pImpl->GetTopContextOfType( CONTEXT_STYLESHEET ).get() );
- else
- pParaProperties = dynamic_cast< ParagraphPropertiesPropertyMap*>( m_pImpl->GetTopContextOfType( CONTEXT_PARAGRAPH ).get() );
-
- if( pParaProperties )
- {
- switch( nName )
- {
- case NS_ooxml::LN_CT_FramePr_dropCap:
- pParaProperties->props().SetDropCap( nIntValue );
- break;
- case NS_ooxml::LN_CT_FramePr_lines:
- pParaProperties->props().SetLines( nIntValue );
- break;
- case NS_ooxml::LN_CT_FramePr_hAnchor:
- switch(nIntValue)
- {
- case NS_ooxml::LN_Value_doc_ST_HAnchor_text: //relative to column
- nIntValue = text::RelOrientation::FRAME; break;
- case NS_ooxml::LN_Value_doc_ST_HAnchor_margin: nIntValue = text::RelOrientation::PAGE_PRINT_AREA; break;
- case NS_ooxml::LN_Value_doc_ST_HAnchor_page: nIntValue = text::RelOrientation::PAGE_FRAME; break;
- default:;
- }
- pParaProperties->props().SethAnchor( nIntValue );
- break;
- case NS_ooxml::LN_CT_FramePr_vAnchor:
- switch(nIntValue)
- {
- case NS_ooxml::LN_Value_doc_ST_VAnchor_text: //relative to paragraph
- nIntValue = text::RelOrientation::FRAME; break;
- case NS_ooxml::LN_Value_doc_ST_VAnchor_margin:nIntValue = text::RelOrientation::PAGE_PRINT_AREA ; break;
- case NS_ooxml::LN_Value_doc_ST_VAnchor_page: nIntValue = text::RelOrientation::PAGE_FRAME; break;
- default:;
- }
- pParaProperties->props().SetvAnchor( nIntValue );
- break;
- case NS_ooxml::LN_CT_FramePr_x:
- pParaProperties->props().Setx(
- ConversionHelper::convertTwipToMM100(nIntValue ));
- pParaProperties->props().SetxAlign( text::HoriOrientation::NONE );
- break;
- case NS_ooxml::LN_CT_FramePr_xAlign:
- switch( nIntValue )
- {
- case NS_ooxml::LN_Value_doc_ST_XAlign_center : nIntValue = text::HoriOrientation::CENTER; break;
- case NS_ooxml::LN_Value_doc_ST_XAlign_right : nIntValue = text::HoriOrientation::RIGHT; break;
- case NS_ooxml::LN_Value_doc_ST_XAlign_inside : nIntValue = text::HoriOrientation::INSIDE; break;
- case NS_ooxml::LN_Value_doc_ST_XAlign_outside : nIntValue = text::HoriOrientation::OUTSIDE; break;
- case NS_ooxml::LN_Value_doc_ST_XAlign_left : nIntValue = text::HoriOrientation::LEFT; break;
- default: nIntValue = text::HoriOrientation::NONE;
- }
- pParaProperties->props().SetxAlign( nIntValue );
- break;
- case NS_ooxml::LN_CT_FramePr_y:
- pParaProperties->props().Sety(
- ConversionHelper::convertTwipToMM100(nIntValue ));
- pParaProperties->props().SetyAlign( text::VertOrientation::NONE );
- break;
- case NS_ooxml::LN_CT_FramePr_yAlign:
- switch( nIntValue )
- {
- case NS_ooxml::LN_Value_doc_ST_YAlign_top :
- case NS_ooxml::LN_Value_doc_ST_YAlign_inside :nIntValue = text::VertOrientation::TOP; break;
- case NS_ooxml::LN_Value_doc_ST_YAlign_center :nIntValue = text::VertOrientation::CENTER;break;
- case NS_ooxml::LN_Value_doc_ST_YAlign_bottom :
- case NS_ooxml::LN_Value_doc_ST_YAlign_outside :nIntValue = text::VertOrientation::BOTTOM;break;
- case NS_ooxml::LN_Value_doc_ST_YAlign_inline :
- {
- // HACK: This is for bnc#780851, where a table has one cell that has w:framePr,
- // which causes that paragraph to be converted to a text frame, and the original
- // paragraph object no longer exists, which makes table creation fail and furthermore
- // it would be missing in the table layout anyway. So actually no letting that paragraph
- // be a text frame "fixes" it. I'm not sure what "inline" is supposed to mean in practice
- // anyway, so as long as this doesn't cause trouble elsewhere ...
- PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH);
- if( pContext )
- {
- ParagraphPropertyMap* pParaContext = dynamic_cast< ParagraphPropertyMap* >( pContext.get() );
- if (pParaContext)
- pParaContext->props().SetFrameMode(false);
- }
- nIntValue = text::VertOrientation::NONE;
- break;
- }
- default:
- nIntValue = text::VertOrientation::NONE;
- break;
- }
- pParaProperties->props().SetyAlign( nIntValue );
- break;
- case NS_ooxml::LN_CT_FramePr_hRule:
- switch( nIntValue )
- {
- case NS_ooxml::LN_Value_doc_ST_HeightRule_exact:
- nIntValue = text::SizeType::FIX;
- break;
- case NS_ooxml::LN_Value_doc_ST_HeightRule_atLeast:
- nIntValue = text::SizeType::MIN;
- break;
- case NS_ooxml::LN_Value_doc_ST_HeightRule_auto:
- //no break;
- default:;
- nIntValue = text::SizeType::VARIABLE;
- }
- pParaProperties->props().SethRule( nIntValue );
- break;
- case NS_ooxml::LN_CT_FramePr_wrap:
- {
- //should be either LN_Value_doc_ST_Wrap_notBeside or LN_Value_doc_ST_Wrap_around or LN_Value_doc_ST_Wrap_auto
- OSL_ENSURE( sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_doc_ST_Wrap_around ||
- sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_doc_ST_Wrap_notBeside ||
- sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_doc_ST_Wrap_through ||
- sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_doc_ST_Wrap_none ||
- sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_doc_ST_Wrap_auto,
- "wrap not around, not_Beside, through, none or auto?");
- if( sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_doc_ST_Wrap_through ||
- sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_doc_ST_Wrap_auto )
- pParaProperties->props().SetWrap ( text::WrapTextMode_DYNAMIC ) ;
- else if (sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_doc_ST_Wrap_around)
- pParaProperties->props().SetWrap(text::WrapTextMode_PARALLEL);
- else if (sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_doc_ST_Wrap_none)
- pParaProperties->props().SetWrap ( text::WrapTextMode_THROUGH ) ;
- else
- pParaProperties->props().SetWrap ( text::WrapTextMode_NONE ) ;
- }
- break;
- case NS_ooxml::LN_CT_FramePr_w:
- pParaProperties->props().Setw(
- ConversionHelper::convertTwipToMM100(nIntValue));
- break;
- case NS_ooxml::LN_CT_FramePr_h:
- pParaProperties->props().Seth(
- ConversionHelper::convertTwipToMM100(nIntValue));
- break;
- case NS_ooxml::LN_CT_FramePr_hSpace:
- pParaProperties->props().SethSpace(
- ConversionHelper::convertTwipToMM100(nIntValue ));
- break;
- case NS_ooxml::LN_CT_FramePr_vSpace:
- pParaProperties->props().SetvSpace(
- ConversionHelper::convertTwipToMM100(nIntValue ));
- break;
- default:;
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_TrackChange_author:
- m_pImpl->SetCurrentRedlineAuthor( sStringValue );
- break;
- case NS_ooxml::LN_CT_TrackChange_date:
- m_pImpl->SetCurrentRedlineDate( sStringValue );
- break;
- case NS_ooxml::LN_CT_Markup_id:
- m_pImpl->SetCurrentRedlineId( nIntValue );
- break;
- case NS_ooxml::LN_EG_RangeMarkupElements_commentRangeStart:
- m_pImpl->AddAnnotationPosition( true, nIntValue );
- break;
- case NS_ooxml::LN_EG_RangeMarkupElements_commentRangeEnd:
- m_pImpl->AddAnnotationPosition( false, nIntValue );
- break;
- case NS_ooxml::LN_CT_Comment_initials:
- m_pImpl->SetCurrentRedlineInitials(sStringValue);
- break;
- case NS_ooxml::LN_token:
- m_pImpl->SetCurrentRedlineToken( nIntValue );
- break;
- case NS_ooxml::LN_CT_LineNumber_start:
- case NS_ooxml::LN_CT_LineNumber_distance:
- case NS_ooxml::LN_CT_LineNumber_countBy:
- case NS_ooxml::LN_CT_LineNumber_restart:
- {
- //line numbering in Writer is a global document setting
- //in Word is a section setting
- //if line numbering is switched on anywhere in the document it's set at the global settings
- LineNumberSettings aSettings = m_pImpl->GetLineNumberSettings();
- switch( nName )
- {
- case NS_ooxml::LN_CT_LineNumber_countBy:
- aSettings.nInterval = nIntValue;
- OSL_ENSURE(pSectionContext, "SectionContext unavailable!");
- if( pSectionContext )
- pSectionContext->SetLnnMod( nIntValue );
- break;
- case NS_ooxml::LN_CT_LineNumber_start:
- OSL_ENSURE(pSectionContext, "SectionContext unavailable!");
- if( pSectionContext )
- pSectionContext->SetLnnMin( nIntValue );
- break;
- case NS_ooxml::LN_CT_LineNumber_distance:
- aSettings.nDistance = ConversionHelper::convertTwipToMM100( nIntValue );
- OSL_ENSURE(pSectionContext, "SectionContext unavailable!");
- if( pSectionContext )
- pSectionContext->SetdxaLnn( nIntValue );
- break;
- case NS_ooxml::LN_CT_LineNumber_restart:
- aSettings.bRestartAtEachPage = nIntValue == NS_ooxml::LN_Value_ST_LineNumberRestart_newPage;
- OSL_ENSURE(pSectionContext, "SectionContext unavailable!");
- if( pSectionContext )
- pSectionContext->SetLnc( nIntValue );
- break;
- default:;
- }
- m_pImpl->SetLineNumberSettings( aSettings );
- }
- break;
- case NS_ooxml::LN_CT_FtnEdnRef_customMarkFollows:
- m_pImpl->StartCustomFootnote(m_pImpl->GetTopContext());
- break;
- case NS_ooxml::LN_CT_FtnEdnRef_id:
- // footnote or endnote reference id - not needed
- break;
- case NS_ooxml::LN_CT_DocGrid_linePitch:
- {
- //see SwWW8ImplReader::SetDocumentGrid
- OSL_ENSURE(pSectionContext, "SectionContext unavailable!");
- if(pSectionContext)
- {
- pSectionContext->SetGridLinePitch( ConversionHelper::convertTwipToMM100( nIntValue ) );
- }
- }
- break;
- case NS_ooxml::LN_CT_DocGrid_charSpace:
- {
- OSL_ENSURE(pSectionContext, "SectionContext unavailable!");
- if(pSectionContext)
- {
- pSectionContext->SetDxtCharSpace( nIntValue );
- }
- }
- break;
- case NS_ooxml::LN_CT_DocGrid_type:
- {
- if (pSectionContext != nullptr)
- {
- switch( nIntValue )
- {
- case NS_ooxml::LN_Value_doc_ST_DocGrid_default:
- pSectionContext->SetGridType(text::TextGridMode::NONE);
- break;
- case NS_ooxml::LN_Value_doc_ST_DocGrid_lines:
- pSectionContext->SetGridType(text::TextGridMode::LINES);
- break;
- case NS_ooxml::LN_Value_doc_ST_DocGrid_linesAndChars:
- pSectionContext->SetGridType(text::TextGridMode::LINES_AND_CHARS);
- pSectionContext->SetGridSnapToChars( false );
- break;
- case NS_ooxml::LN_Value_doc_ST_DocGrid_snapToChars:
- pSectionContext->SetGridType(text::TextGridMode::LINES_AND_CHARS);
- pSectionContext->SetGridSnapToChars( true );
- break;
- default :
- OSL_FAIL("unknown SwTextGrid value");
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_SdtBlock_sdtContent:
- case NS_ooxml::LN_CT_SdtRun_sdtContent:
- {
- m_pImpl->m_pSdtHelper->SetSdtType(nName);
-
- if (m_pImpl->m_pSdtHelper->getControlType() == SdtControlType::unknown)
- {
- // Still not determined content type? and it is even not unsupported? Then it is plain text field
- m_pImpl->m_pSdtHelper->setControlType(SdtControlType::plainText);
- }
- if (nName == NS_ooxml::LN_CT_SdtRun_sdtContent)
- {
- if (m_pImpl->GetSdtStarts().empty() && m_pImpl->m_pSdtHelper->hasUnusedText())
- {
- // A non-inline SDT is already started, first convert that to a field and only
- // then map the inline SDT to a content control.
- if (m_pImpl->m_pSdtHelper->getControlType() == SdtControlType::plainText)
- {
- m_pImpl->m_pSdtHelper->createPlainTextControl();
- }
- }
-
- PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH);
- if (pContext && m_pImpl->isBreakDeferred(PAGE_BREAK))
- {
- if (!m_pImpl->GetFootnoteContext() && !m_pImpl->IsInShape()
- && !m_pImpl->IsInComments())
- {
- if (m_pImpl->GetIsFirstParagraphInSection() || !m_pImpl->IsFirstRun())
- {
- m_pImpl->m_bIsSplitPara = true;
- finishParagraph();
- lcl_startParagraphGroup();
- }
- else // IsFirstRun
- {
- if (GetSettingsTable()->GetWordCompatibilityMode() > 14)
- {
- pContext->Insert(PROP_PARA_TOP_MARGIN, uno::Any(sal_uInt32(0)));
- }
- }
-
- pContext->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_PAGE_BEFORE));
- m_pImpl->clearDeferredBreaks();
- }
- }
- else if (pContext && m_pImpl->isBreakDeferred(COLUMN_BREAK))
- {
- if (m_pImpl->GetIsFirstParagraphInSection() || !m_pImpl->IsFirstRun())
- {
- mbIsSplitPara = true;
- m_pImpl->m_bIsSplitPara = true;
- finishParagraph();
- lcl_startParagraphGroup();
- }
- else // IsFirstRun
- {
- if (GetSettingsTable()->GetWordCompatibilityMode() > 14)
- {
- pContext->Insert(PROP_PARA_TOP_MARGIN, uno::Any(sal_uInt32(0)));
- }
- }
-
- pContext->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_COLUMN_BEFORE));
- m_pImpl->clearDeferredBreaks();
- }
-
- m_pImpl->m_pSdtHelper->setControlType(SdtControlType::richText);
- m_pImpl->PushSdt();
- break;
- }
- m_pImpl->SetSdt(true);
- }
- break;
- case NS_ooxml::LN_CT_SdtBlock_sdtEndContent:
- case NS_ooxml::LN_CT_SdtRun_sdtEndContent:
- if (nName == NS_ooxml::LN_CT_SdtRun_sdtEndContent)
- {
- // Inline SDT.
- switch (m_pImpl->m_pSdtHelper->getControlType())
- {
- case SdtControlType::richText:
- case SdtControlType::plainText:
- case SdtControlType::checkBox:
- case SdtControlType::dropDown:
- case SdtControlType::comboBox:
- case SdtControlType::picture:
- case SdtControlType::datePicker:
- m_pImpl->PopSdt();
- break;
- default:
- break;
- }
- }
-
- m_pImpl->SetSdt(false);
-
- // It's not possible to insert the relevant property to the character context here:
- // the previous, already sent character context may be still active, so the property would be lost.
- if (m_pImpl->m_pSdtHelper->isOutsideAParagraph())
- m_pImpl->setParaSdtEndDeferred(true);
- else
- m_pImpl->setSdtEndDeferred(true);
-
- switch (m_pImpl->m_pSdtHelper->getControlType())
- {
- case SdtControlType::dropDown:
- case SdtControlType::comboBox:
- m_pImpl->m_pSdtHelper->createDropDownControl();
- break;
- case SdtControlType::plainText:
- m_pImpl->m_pSdtHelper->createPlainTextControl();
- break;
- case SdtControlType::datePicker:
- m_pImpl->m_pSdtHelper->createDateContentControl();
- break;
- case SdtControlType::unknown:
- default:;
- }
- break;
- case NS_ooxml::LN_CT_SdtListItem_displayText:
- m_pImpl->m_pSdtHelper->getDropDownDisplayTexts().push_back(sStringValue);
- break;
- case NS_ooxml::LN_CT_SdtListItem_value:
- m_pImpl->m_pSdtHelper->getDropDownItems().push_back(sStringValue);
- break;
- case NS_ooxml::LN_CT_SdtDate_fullDate:
- m_pImpl->m_pSdtHelper->getDate().append(sStringValue);
- break;
- case NS_ooxml::LN_CT_Background_color:
- if (m_pImpl->GetSettingsTable()->GetDisplayBackgroundShape())
- m_pImpl->m_oBackgroundColor = nIntValue;
- break;
- case NS_ooxml::LN_CT_PageNumber_start:
- if (pSectionContext != nullptr && !m_pImpl->IsAltChunk())
- pSectionContext->SetPageNumber(nIntValue);
- break;
- case NS_ooxml::LN_CT_PageNumber_fmt:
- if (pSectionContext)
- {
- sal_Int16 nNumberType = ConversionHelper::ConvertNumberingType(nIntValue, -1);
- if (nNumberType != -1)
- pSectionContext->SetPageNumberType(nNumberType);
- }
- break;
- case NS_ooxml::LN_CT_FtnEdn_type:
- // This is the "separator" footnote, ignore its linebreaks/text.
- if (static_cast<sal_uInt32>(nIntValue) == NS_ooxml::LN_Value_doc_ST_FtnEdn_separator)
- m_pImpl->SetSkipFootnoteState( SkipFootnoteSeparator::ON );
- else
- m_pImpl->SetSkipFootnoteState( SkipFootnoteSeparator::OFF );
- break;
- case NS_ooxml::LN_CT_FtnEdn_id:
- {
- SkipFootnoteSeparator eSkip = m_pImpl->GetSkipFootnoteState();
- if ( eSkip == SkipFootnoteSeparator::ON )
- m_pImpl->SetSkipFootnoteState( SkipFootnoteSeparator::SKIPPING );
- else if ( eSkip == SkipFootnoteSeparator::SKIPPING )
- m_pImpl->SetSkipFootnoteState( SkipFootnoteSeparator::OFF );
- }
- break;
- case NS_ooxml::LN_CT_DataBinding_prefixMappings:
- m_pImpl->m_pSdtHelper->setDataBindingPrefixMapping(sStringValue);
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_DataBinding_prefixMappings", sStringValue);
- break;
- case NS_ooxml::LN_CT_DataBinding_xpath:
- m_pImpl->m_pSdtHelper->setDataBindingXPath(sStringValue);
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_DataBinding_xpath", sStringValue);
- break;
- case NS_ooxml::LN_CT_DataBinding_storeItemID:
- m_pImpl->m_pSdtHelper->setDataBindingStoreItemID(sStringValue);
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_DataBinding_storeItemID", sStringValue);
- break;
- case NS_ooxml::LN_CT_SdtPlaceholder_docPart_val:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_SdtPlaceholder_docPart_val", sStringValue);
- m_pImpl->m_pSdtHelper->SetPlaceholderDocPart(sStringValue);
- break;
- case NS_ooxml::LN_CT_SdtColor_val:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_SdtColor_val", sStringValue);
- m_pImpl->m_pSdtHelper->SetColor(sStringValue);
- break;
- case NS_ooxml::LN_CT_SdtAppearance_val:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_SdtAppearance_val", sStringValue);
- m_pImpl->m_pSdtHelper->SetAppearance(sStringValue);
- break;
- case NS_ooxml::LN_CT_SdtText_multiLine:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_SdtText_multiLine", sStringValue);
- break;
- case NS_ooxml::LN_CT_PTab_leader:
- case NS_ooxml::LN_CT_PTab_relativeTo:
- break;
- case NS_ooxml::LN_CT_PTab_alignment:
- m_pImpl->HandlePTab(nIntValue);
- break;
- case NS_ooxml::LN_CT_Cnf_lastRowLastColumn:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "lastRowLastColumn", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Cnf_lastRowFirstColumn:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "lastRowFirstColumn", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Cnf_firstRowLastColumn:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "firstRowLastColumn", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Cnf_oddHBand:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "oddHBand", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Cnf_firstRowFirstColumn:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "firstRowFirstColumn", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Cnf_evenVBand:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "evenVBand", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Cnf_evenHBand:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "evenHBand", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Cnf_lastColumn:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "lastColumn", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Cnf_firstColumn:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "firstColumn", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Cnf_oddVBand:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "oddVBand", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Cnf_lastRow:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "lastRow", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Cnf_firstRow:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "firstRow", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Cnf_val:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "val", sStringValue);
- break;
- case NS_ooxml::LN_CT_DocPartName_val:
- {
- m_sGlossaryEntryName = sStringValue;
- break;
- }
- case NS_ooxml::LN_CT_DocPartGallery_val:
- {
- const OUString& sGlossaryEntryGallery = sStringValue;
- if(m_pImpl->GetTopContext())
- {
- OUString sName = sGlossaryEntryGallery + ":" + m_sGlossaryEntryName;
- // Add glossary entry name as a first paragraph in section
- m_pImpl->appendTextPortion(sName, m_pImpl->GetTopContext());
- }
- break;
- }
- case NS_ooxml::LN_CT_PermStart_ed:
- {
- m_pImpl->setPermissionRangeEd(sStringValue);
- break;
- }
- case NS_ooxml::LN_CT_PermStart_edGrp:
- {
- m_pImpl->setPermissionRangeEdGrp(sStringValue);
- break;
- }
- case NS_ooxml::LN_CT_PermStart_id:
- {
- m_pImpl->startOrEndPermissionRange(nIntValue);
- break;
- }
- case NS_ooxml::LN_CT_PermEnd_id:
- {
- m_pImpl->startOrEndPermissionRange(nIntValue);
- break;
- }
- case NS_ooxml::LN_CT_NumFmt_val:
- {
- try
- {
- uno::Reference<beans::XPropertySet> xFtnEdnSettings;
- if (m_pImpl->IsInFootnoteProperties())
- {
- uno::Reference<text::XFootnotesSupplier> xFootnotesSupplier(
- m_pImpl->GetTextDocument(), uno::UNO_QUERY);
- if (xFootnotesSupplier.is())
- xFtnEdnSettings = xFootnotesSupplier->getFootnoteSettings();
- }
- else
- {
- uno::Reference<text::XEndnotesSupplier> xEndnotesSupplier(
- m_pImpl->GetTextDocument(), uno::UNO_QUERY);
- if (xEndnotesSupplier.is())
- xFtnEdnSettings = xEndnotesSupplier->getEndnoteSettings();
- }
- if (xFtnEdnSettings.is())
- {
- sal_Int16 nNumType = ConversionHelper::ConvertNumberingType(nIntValue);
- xFtnEdnSettings->setPropertyValue(getPropertyName(PROP_NUMBERING_TYPE),
- uno::Any(nNumType));
- }
- }
- catch (const uno::Exception&)
- {
- }
- }
- break;
- case NS_ooxml::LN_CT_AltChunk:
- {
- m_pImpl->HandleAltChunk(sStringValue);
- }
- break;
- case NS_ooxml::LN_AG_Parids_paraId:
- if (ParagraphPropertyMap* pParaContext
- = dynamic_cast<ParagraphPropertyMap*>(m_pImpl->GetTopContext().get()))
- {
- pParaContext->props().SetParaId(sStringValue);
- }
- break;
- case NS_ooxml::LN_OfficeArtExtension_Decorative_val:
- m_pImpl->GetGraphicImport()->attribute(nName, val);
- break;
- default:
- SAL_WARN("writerfilter", "DomainMapper::lcl_attribute: unhandled token: " << nName);
- }
-}
-
-void DomainMapper::lcl_sprm(Sprm & rSprm)
-{
- if (!m_pImpl->hasTableManager() || !m_pImpl->getTableManager().sprm(rSprm))
- sprmWithProps(rSprm, m_pImpl->GetTopContext());
-}
-
-// In rtl-paragraphs the meaning of left/right are to be exchanged
-static bool ExchangeLeftRight(const PropertyMapPtr& rContext, DomainMapper_Impl& rImpl)
-{
- bool bExchangeLeftRight = false;
- sal_Int32 aAdjust;
- uno::Any aPropPara = rImpl.GetAnyProperty(PROP_WRITING_MODE, rContext);
- if( (aPropPara >>= aAdjust) && aAdjust == text::WritingMode2::RL_TB )
- bExchangeLeftRight = true;
- return bExchangeLeftRight;
-}
-
-void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext )
-{
- // These SPRM's are not specific to any section, so it's expected that there is no context yet.
- switch (rSprm.getId())
- {
- case NS_ooxml::LN_background_background:
- {
- // if a VML background has been defined, it was imported into a shape to hold the properties
- uno::Reference<drawing::XShape> xFill(m_pImpl->PopPendingShape());
- if (xFill.is())
- {
- assert(!m_pImpl->GetTopContext());
- assert(m_pImpl->GetIsFirstParagraphInShape());
- assert(mbWasShapeInPara);
- assert(m_pImpl->GetIsFirstParagraphInSection());
- assert(m_pImpl->IsOutsideAParagraph());
- if (m_pImpl->GetSettingsTable()->GetDisplayBackgroundShape())
- {
- // apply the XATTR_FILL attributes to the default page style
- const uno::Reference<beans::XPropertySet> xFillPropertySet(xFill, uno::UNO_QUERY);
- const uno::Reference<beans::XPropertySetInfo> xFillInfo
- = xFillPropertySet->getPropertySetInfo();
- uno::Reference<beans::XPropertySet> xPS(
- m_pImpl->GetPageStyles()->getByName("Standard"), uno::UNO_QUERY_THROW);
- for (const beans::Property& rProp : xPS->getPropertySetInfo()->getProperties())
- {
- if (rProp.Name == "FillComplexColor" || rProp.Name == "FillGradientName"
- || rProp.Name == "FillGradientStepCount"
- || rProp.Name == "FillTransparenceGradientName"
- || rProp.Name == "FillBitmapURL" || rProp.Name == "FillColor2")
- {
- // silence exceptions for unsupported stuff when applying to page style
- continue;
- }
- if (!rProp.Name.startsWith("Fill"))
- continue;
-
- if (!xFillInfo->hasPropertyByName(rProp.Name))
- continue;
-
- try
- {
- const uno::Any aFillValue = xFillPropertySet->getPropertyValue(rProp.Name);
- xPS->setPropertyValue(rProp.Name, aFillValue);
- }
- catch (uno::Exception&)
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter", "Exception setting page background fill");
- }
- }
-
- m_pImpl->m_bCopyStandardPageStyleFill = true;
- }
-
- // The background was unhelpfully imported into the text body: remove it
- uno::Reference<lang::XComponent> xComponent(xFill, uno::UNO_QUERY_THROW);
- xComponent->dispose();
-
- m_pImpl->SetIsFirstParagraphInShape(false);
- mbWasShapeInPara = false;
- }
- return;
- }
- default:
- break;
- }
-
- OSL_ENSURE(rContext, "PropertyMap has to be valid!");
- if(!rContext)
- return ;
-
- sal_uInt32 nSprmId = rSprm.getId();
- //needed for page properties
- SectionPropertyMap * pSectionContext = m_pImpl->GetSectionContext();
- Value::Pointer_t pValue = rSprm.getValue();
- sal_Int32 nIntValue = pValue->getInt();
- const OUString sStringValue = pValue->getString();
-
- switch(nSprmId)
- {
- case NS_ooxml::LN_CT_PPrBase_jc:
- {
- bool bExchangeLeftRight = !IsRTFImport() && !m_pImpl->IsInComments() && ExchangeLeftRight(rContext, *m_pImpl);
- handleParaJustification(nIntValue, rContext, bExchangeLeftRight);
- break;
- }
- case NS_ooxml::LN_CT_PPrBase_keepLines:
- rContext->Insert(PROP_PARA_SPLIT, uno::Any(nIntValue == 0));
- break;
- case NS_ooxml::LN_CT_PPrBase_keepNext:
- rContext->Insert(PROP_PARA_KEEP_TOGETHER, uno::Any( nIntValue != 0 ) );
- break;
- case NS_ooxml::LN_CT_PPrBase_pageBreakBefore:
- rContext->Insert(PROP_BREAK_TYPE, uno::Any(nIntValue ? style::BreakType_PAGE_BEFORE : style::BreakType_NONE), /*bOverwrite=*/bool(nIntValue));
- break;
- case NS_ooxml::LN_CT_NumPr_ilvl:
- if (nIntValue < 0 || 10 <= nIntValue)
- {
- SAL_INFO("writerfilter",
- "unsupported numbering level " << nIntValue);
- break;
- }
- if( IsStyleSheetImport() )
- {
- //style sheets cannot have a numbering rule attached
- StyleSheetPropertyMap* pStyleSheetPropertyMap = dynamic_cast< StyleSheetPropertyMap* >( rContext.get() );
- if (pStyleSheetPropertyMap)
- pStyleSheetPropertyMap->SetListLevel( static_cast<sal_Int16>(nIntValue) );
- }
- // 0-8 are the 9 levels that Microsoft supports. (LO supports 10 levels).
- // 9 indicates "no numbering", for which LO has no corresponding concept,
- // and so it will be treated as the 10th level.
- // finishParagraph() will convert the 9 into "no numbering" for direct formatting.
- // (Styles only use this PROP for round-tripping and UI, but cannot trust it for import)
- if (!IsStyleSheetImport() || nIntValue != 9)
- rContext->Insert(PROP_NUMBERING_LEVEL, uno::Any(static_cast<sal_Int16>(nIntValue)));
- break;
- case NS_ooxml::LN_CT_NumPr_numId:
- {
- //convert the ListTable entry to a NumberingRules property and apply it
- ListsManager::Pointer pListTable = m_pImpl->GetListTable();
- ListDef::Pointer pList = pListTable->GetList( nIntValue );
- if( IsStyleSheetImport() )
- {
- //style sheets cannot have a numbering rule attached
- StyleSheetPropertyMap* pStyleSheetPropertyMap = dynamic_cast< StyleSheetPropertyMap* >( rContext.get() );
- if (pStyleSheetPropertyMap)
- pStyleSheetPropertyMap->props().SetListId( nIntValue );
- }
- if( pList )
- {
- if( !IsStyleSheetImport() )
- {
- uno::Any aRules( pList->GetNumberingRules( ) );
- rContext->Insert( PROP_NUMBERING_RULES, aRules );
- rContext->Erase( PROP_NUMBERING_STYLE_NAME);
- PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH);
- if (pContext)
- {
- assert(dynamic_cast<ParagraphPropertyMap*>(pContext.get()));
- static_cast<ParagraphPropertyMap*>(pContext.get())->props().SetListId(pList->GetId());
- }
-
- // Indentation can came from:
- // 1) Paragraph style's numbering's indentation: the current non-style numId has priority over it.
- // 2) Numbering's indentation: Writer handles that natively, so it should not be set on rContext.
- // 3) Paragraph style's indentation: ditto.
- // 4) Direct paragraph formatting: that will came later.
- // So no situation where keeping indentation at this point would make sense -> erase.
- rContext->Erase(PROP_PARA_FIRST_LINE_INDENT);
- rContext->Erase(PROP_PARA_LEFT_MARGIN);
- rContext->Erase(PROP_PARA_RIGHT_MARGIN);
- }
- }
- else
- {
- if( !IsStyleSheetImport() )
- {
- // eg. disabled numbering using non-existent numId "0"
- rContext->Insert( PROP_NUMBERING_STYLE_NAME, uno::Any( OUString() ) );
- // disable inheritance of indentation of parent styles
- rContext->Insert( PROP_PARA_LEFT_MARGIN, uno::Any( sal_Int32(0) ), /*bOverwrite=*/false);
- rContext->Insert( PROP_PARA_FIRST_LINE_INDENT,
- uno::Any( sal_Int32(0) ), /*bOverwrite=*/false);
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_PPrBase_suppressLineNumbers:
- rContext->Insert(PROP_PARA_LINE_NUMBER_COUNT, uno::Any( nIntValue == 0 ) );
- break;
- case NS_ooxml::LN_inTbl:
- break;
- case NS_ooxml::LN_tblDepth:
- //not handled via sprm but via text( 0x07 )
- break;
- case NS_ooxml::LN_CT_FramePr_w:
- break;
- case NS_ooxml::LN_CT_FramePr_wrap:
- break;
-
- case NS_ooxml::LN_CT_PrBase_pBdr: //paragraph border
- resolveSprmProps(*this, rSprm);
- break;
- case NS_ooxml::LN_CT_PBdr_top:
- case NS_ooxml::LN_CT_PBdr_left:
- case NS_ooxml::LN_CT_PBdr_bottom:
- case NS_ooxml::LN_CT_PBdr_right:
- case NS_ooxml::LN_CT_PBdr_between:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- auto pBorderHandler = std::make_shared<BorderHandler>( true );
- pProperties->resolve(*pBorderHandler);
- PropertyIds eBorderId = PropertyIds::INVALID;
- PropertyIds eBorderComplexColorId = PropertyIds::INVALID;
- PropertyIds eBorderDistId = PropertyIds::INVALID;
- switch( nSprmId )
- {
- case NS_ooxml::LN_CT_PBdr_top:
- eBorderId = PROP_TOP_BORDER;
- eBorderComplexColorId = PROP_BORDER_TOP_COMPLEX_COLOR;
- eBorderDistId = PROP_TOP_BORDER_DISTANCE;
- break;
- case NS_ooxml::LN_CT_PBdr_left:
- eBorderId = PROP_LEFT_BORDER;
- eBorderComplexColorId = PROP_BORDER_LEFT_COMPLEX_COLOR;
- eBorderDistId = PROP_LEFT_BORDER_DISTANCE;
- break;
- case NS_ooxml::LN_CT_PBdr_bottom:
- eBorderId = PROP_BOTTOM_BORDER;
- eBorderComplexColorId = PROP_BORDER_BOTTOM_COMPLEX_COLOR;
- eBorderDistId = PROP_BOTTOM_BORDER_DISTANCE;
- break;
- case NS_ooxml::LN_CT_PBdr_right:
- eBorderId = PROP_RIGHT_BORDER;
- eBorderComplexColorId = PROP_BORDER_RIGHT_COMPLEX_COLOR;
- eBorderDistId = PROP_RIGHT_BORDER_DISTANCE;
- break;
- case NS_ooxml::LN_CT_PBdr_between:
- if (m_pImpl->handlePreviousParagraphBorderInBetween())
- {
- // If previous paragraph also had border in between property
- // then it is possible to emulate this border as top border
- // for current paragraph
- eBorderId = PROP_TOP_BORDER;
- eBorderComplexColorId = PROP_BORDER_TOP_COMPLEX_COLOR;
- eBorderDistId = PROP_TOP_BORDER_DISTANCE;
- }
- // Since there are borders in between, each paragraph will have own borders. No more joining
- rContext->Insert(PROP_PARA_CONNECT_BORDERS, uno::Any(false));
- break;
- default:;
- }
-
- if (eBorderId != PropertyIds::INVALID)
- {
- rContext->Insert(eBorderId, uno::Any(pBorderHandler->getBorderLine()));
- }
- if (eBorderComplexColorId != PropertyIds::INVALID)
- {
- auto aComplexColor = pBorderHandler->getComplexColor();
- auto xComplexColor = model::color::createXComplexColor(aComplexColor);
- rContext->Insert(eBorderComplexColorId, uno::Any(xComplexColor));
- }
- if (eBorderDistId != PropertyIds::INVALID)
- {
- rContext->Insert(eBorderDistId, uno::Any(pBorderHandler->getLineDistance()));
- }
- if ( nSprmId == NS_ooxml::LN_CT_PBdr_right )
- {
- table::ShadowFormat aFormat;
- // Word only allows shadows on visible borders
- if ( pBorderHandler->getShadow() && pBorderHandler->getBorderLine().LineStyle != table::BorderLineStyle::NONE )
- aFormat = writerfilter::dmapper::PropertyMap::getShadowFromBorder(pBorderHandler->getBorderLine());
- rContext->Insert(PROP_PARA_SHADOW_FORMAT, uno::Any(aFormat));
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_PBdr_bar:
- break;
- case NS_ooxml::LN_CT_PPrBase_suppressAutoHyphens:
- rContext->Insert(PROP_PARA_IS_HYPHENATION, uno::Any( nIntValue == 0 ));
- break;
- case NS_ooxml::LN_CT_FramePr_h:
- break;
- case NS_ooxml::LN_CT_PrBase_shd:
- {
- //contains fore color, back color and shadow percentage, results in a brush
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- auto pCellColorHandler = std::make_shared<CellColorHandler>();
- pCellColorHandler->setOutputFormat( CellColorHandler::Paragraph );
- bool bEnableTempGrabBag = !pCellColorHandler->isInteropGrabBagEnabled();
- if( bEnableTempGrabBag )
- pCellColorHandler->enableInteropGrabBag( "TempShdPropsGrabBag" );
-
- pProperties->resolve(*pCellColorHandler);
- rContext->InsertProps(pCellColorHandler->getProperties().get());
-
- rContext->Insert(PROP_CHAR_THEME_FILL, pCellColorHandler->getInteropGrabBag().Value, true, PARA_GRAB_BAG);
- if(bEnableTempGrabBag)
- pCellColorHandler->disableInteropGrabBag();
- }
- }
- break;
- case NS_ooxml::LN_CT_FramePr_vSpace:
- break; // sprmPDyaFromText
- case NS_ooxml::LN_CT_FramePr_hSpace:
- break; // sprmPDxaFromText
- case NS_ooxml::LN_CT_FramePr_anchorLock:
- break;
- case NS_ooxml::LN_CT_PPrBase_widowControl:
- {
- uno::Any aVal( uno::Any( sal_Int8(nIntValue ? 2 : 0 )));
- rContext->Insert( PROP_PARA_WIDOWS, aVal );
- rContext->Insert( PROP_PARA_ORPHANS, aVal );
- }
- break; // sprmPFWidowControl
- case NS_ooxml::LN_CT_PPrBase_overflowPunct:
- rContext->Insert(PROP_PARA_IS_HANGING_PUNCTUATION, uno::Any( nIntValue == 0 ));
- break;
- case NS_ooxml::LN_CT_PPrBase_topLinePunct:
- break;
- case NS_ooxml::LN_CT_PPrBase_autoSpaceDE:
- break;
- case NS_ooxml::LN_CT_PPrBase_autoSpaceDN:
- break;
- case NS_ooxml::LN_CT_PPrBase_textAlignment:
- {
- sal_Int16 nAlignment = 0;
- switch (nIntValue)
- {
- case NS_ooxml::LN_Value_doc_ST_TextAlignment_top:
- nAlignment = 2;
- break;
- case NS_ooxml::LN_Value_doc_ST_TextAlignment_center:
- nAlignment = 3;
- break;
- case NS_ooxml::LN_Value_doc_ST_TextAlignment_baseline:
- nAlignment = 1;
- break;
- case NS_ooxml::LN_Value_doc_ST_TextAlignment_bottom:
- nAlignment = 4;
- break;
- case NS_ooxml::LN_Value_doc_ST_TextAlignment_auto:
- default:
- break;
- }
- rContext->Insert( PROP_PARA_VERT_ALIGNMENT, uno::Any( nAlignment) );
- }
- break;
- case NS_ooxml::LN_CT_PPrBase_textDirection:
- {
- switch (nIntValue)
- {
- case NS_ooxml::LN_Value_ST_TextDirection_tbRl: // ~ vert="eaVert"
- {
- m_pImpl->SetFrameDirection(text::WritingMode2::TB_RL);
- break;
- }
- case NS_ooxml::LN_Value_ST_TextDirection_btLr: // ~ vert="vert270"
- {
- m_pImpl->SetFrameDirection(text::WritingMode2::BT_LR);
- break;
- }
- case NS_ooxml::LN_Value_ST_TextDirection_lrTbV:
- {
- // East Asian character rotation is not implemented in LO, use ordinary LR_TB instead.
- m_pImpl->SetFrameDirection(text::WritingMode2::LR_TB);
- break;
- }
- case NS_ooxml::LN_Value_ST_TextDirection_tbRlV: // ~ vert="vert"
- {
- m_pImpl->SetFrameDirection(text::WritingMode2::TB_RL90);
- break;
- }
- case NS_ooxml::LN_Value_ST_TextDirection_lrTb:
- // default in LO. Do not overwrite RL_TB set by bidi.
- break;
- case NS_ooxml::LN_Value_ST_TextDirection_tbLrV: // ~ vert="mongolianVert"
- {
- m_pImpl->SetFrameDirection(text::WritingMode2::TB_LR);
- break;
- }
- default:
- SAL_WARN("writerfilter", "DomainMapper::sprmWithProps: unhandled textDirection");
- }
- }
- break;
- case NS_ooxml::LN_CT_PPrBase_outlineLvl:
- {
- if (nIntValue < WW_OUTLINE_MIN || nIntValue > WW_OUTLINE_MAX)
- break; // invalid value is ignored by MS Word
-
- if( IsStyleSheetImport() )
- {
- StyleSheetPropertyMap* pStyleSheetPropertyMap = dynamic_cast< StyleSheetPropertyMap* >( rContext.get() );
- if (pStyleSheetPropertyMap)
- pStyleSheetPropertyMap->SetOutlineLevel(nIntValue);
- }
- else
- {
- // convert MS body level (9) to LO body level (0) and equivalent outline levels
- sal_Int16 nLvl = nIntValue == WW_OUTLINE_MAX ? 0 : nIntValue + 1;
- rContext->Insert(PROP_OUTLINE_LEVEL, uno::Any ( nLvl ));
- }
- }
- break;
- case NS_ooxml::LN_CT_PPrBase_bidi:
- {
- // Four situations to handle:
- // 1.) bidi same as previous setting: no adjust change
- // 2.) no previous adjust: set appropriate default for this bidi
- // 3.) previous adjust and bidi different from previous: swap adjusts
- // 4.) previous adjust and no previous bidi: RTL swaps adjust
-
- const sal_Int16 nWritingMode = nIntValue ? text::WritingMode2::RL_TB : text::WritingMode2::LR_TB;
- sal_Int16 nParentBidi = -1;
- m_pImpl->GetPropertyFromParaStyleSheet(PROP_WRITING_MODE) >>= nParentBidi;
- // Paragraph justification reverses its meaning in an RTL context.
- // 1. Only make adjustments if the BiDi changes.
- if (nParentBidi != nWritingMode && !IsRTFImport() && !m_pImpl->IsInComments())
- {
- style::ParagraphAdjust eAdjust = style::ParagraphAdjust(-1);
- // 2. no adjust property exists yet
- if ( !(m_pImpl->GetAnyProperty(PROP_PARA_ADJUST, rContext) >>= eAdjust) )
- {
- // RTL defaults to right adjust
- eAdjust = nIntValue ? style::ParagraphAdjust_RIGHT : style::ParagraphAdjust_LEFT;
- rContext->Insert(PROP_PARA_ADJUST, uno::Any( eAdjust ), /*bOverwrite=*/false);
- }
- // 3,4. existing adjust: if RTL, then swap. If LTR, but previous was RTL, also swap.
- else if ( nIntValue || nParentBidi == sal_Int16(text::WritingMode2::RL_TB) )
- {
- if ( eAdjust == style::ParagraphAdjust_RIGHT )
- rContext->Insert(PROP_PARA_ADJUST, uno::Any( style::ParagraphAdjust_LEFT ));
- else if ( eAdjust == style::ParagraphAdjust_LEFT )
- rContext->Insert(PROP_PARA_ADJUST, uno::Any( style::ParagraphAdjust_RIGHT ));
- }
- }
- rContext->Insert(PROP_WRITING_MODE, uno::Any( nWritingMode ));
- }
-
- break;
- case NS_ooxml::LN_EG_SectPrContents_bidi:
- if (pSectionContext != nullptr)
- {
- const sal_Int16 writingMode = (nIntValue != 0) ? sal_Int16(text::WritingMode2::RL_TB) : sal_Int16(text::WritingMode2::LR_TB);
- pSectionContext->Insert(PROP_WRITING_MODE, uno::Any(writingMode));
- }
- break;
- case NS_ooxml::LN_EG_SectPrContents_rtlGutter:
- if (pSectionContext != nullptr)
- {
- bool bRtlGutter = nIntValue != 0;
- pSectionContext->Insert(PROP_RTL_GUTTER, uno::Any(bRtlGutter));
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_highlight:
- {
- // MS Word completely ignores character highlighting in character styles.
- if ( IsStyleSheetImport() )
- {
- const StyleSheetEntryPtr pCurrStyle = GetStyleSheetTable()->GetCurrentEntry();
- if ( pCurrStyle && pCurrStyle->m_nStyleTypeCode == STYLE_TYPE_CHAR )
- break;
- }
-
- PropertyIds ePropertyId = m_pImpl->IsInComments() ? PROP_CHAR_BACK_COLOR : PROP_CHAR_HIGHLIGHT;
-
- // OOXML import uses an ID
- if( IsOOXMLImport() )
- {
- sal_Int32 nColor = 0;
- if( getColorFromId(nIntValue, nColor) )
- rContext->Insert(ePropertyId, uno::Any(nColor));
- }
- // RTF import uses the actual color value
- else if( IsRTFImport() )
- {
- rContext->Insert(ePropertyId, uno::Any(nIntValue));
- }
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_em:
- rContext->Insert(PROP_CHAR_EMPHASIS, uno::Any ( getEmphasisValue (nIntValue)));
- break;
- case NS_ooxml::LN_EG_RPrBase_emboss:
- case NS_ooxml::LN_EG_RPrBase_b:
- case NS_ooxml::LN_EG_RPrBase_bCs:
- case NS_ooxml::LN_EG_RPrBase_i:
- case NS_ooxml::LN_EG_RPrBase_iCs:
- case NS_ooxml::LN_EG_RPrBase_strike:
- case NS_ooxml::LN_EG_RPrBase_dstrike:
- case NS_ooxml::LN_EG_RPrBase_outline:
- case NS_ooxml::LN_EG_RPrBase_shadow:
- case NS_ooxml::LN_EG_RPrBase_caps:
- case NS_ooxml::LN_EG_RPrBase_smallCaps:
- case NS_ooxml::LN_EG_RPrBase_vanish:
- case NS_ooxml::LN_EG_RPrBase_webHidden:
- {
- PropertyIds ePropertyId = PROP_CHAR_WEIGHT; //initialized to prevent warning!
- switch( nSprmId )
- {
- case NS_ooxml::LN_EG_RPrBase_b:
- case NS_ooxml::LN_EG_RPrBase_bCs:
- ePropertyId = nSprmId != NS_ooxml::LN_EG_RPrBase_bCs ? PROP_CHAR_WEIGHT : PROP_CHAR_WEIGHT_COMPLEX;
- break;
- case NS_ooxml::LN_EG_RPrBase_i:
- case NS_ooxml::LN_EG_RPrBase_iCs:
- ePropertyId = nSprmId == NS_ooxml::LN_EG_RPrBase_i ? PROP_CHAR_POSTURE : PROP_CHAR_POSTURE_COMPLEX;
- break;
- case NS_ooxml::LN_EG_RPrBase_strike:
- case NS_ooxml::LN_EG_RPrBase_dstrike:
- ePropertyId = PROP_CHAR_STRIKEOUT;
- break;
- case NS_ooxml::LN_EG_RPrBase_outline:
- ePropertyId = PROP_CHAR_CONTOURED;
- break;
- case NS_ooxml::LN_EG_RPrBase_shadow:
- ePropertyId = PROP_CHAR_SHADOWED;
- break;
- case NS_ooxml::LN_EG_RPrBase_caps:
- case NS_ooxml::LN_EG_RPrBase_smallCaps:
- ePropertyId = PROP_CHAR_CASE_MAP;
- break;
- case NS_ooxml::LN_EG_RPrBase_vanish:
- case NS_ooxml::LN_EG_RPrBase_webHidden:
- ePropertyId = PROP_CHAR_HIDDEN;
- break;
- case NS_ooxml::LN_EG_RPrBase_emboss:
- ePropertyId = PROP_CHAR_RELIEF;
- break;
- }
- //expected: 0,1,128,129
- if(nIntValue != 128) //inherited from paragraph - ignore
- {
- if( nIntValue == 129) //inverted style sheet value
- {
- //get value from style sheet and invert it
- sal_Int16 nStyleValue = 0;
- uno::Any aStyleVal = m_pImpl->GetPropertyFromParaStyleSheet(ePropertyId);
- if( !aStyleVal.hasValue() )
- {
- nIntValue = NS_ooxml::LN_EG_RPrBase_smallCaps == nSprmId ?
- 4 : 1;
- }
- else if(aStyleVal.getValueTypeClass() == uno::TypeClass_FLOAT )
- {
- double fDoubleValue = 0;
- //only in case of awt::FontWeight
- aStyleVal >>= fDoubleValue;
- nIntValue = fDoubleValue > 100. ? 0 : 1;
- }
- else if((aStyleVal >>= nStyleValue) ||
- (nStyleValue = static_cast<sal_Int16>(comphelper::getEnumAsINT32(aStyleVal))) >= 0 )
- {
- nIntValue = NS_ooxml::LN_EG_RPrBase_smallCaps == nSprmId ?
- nStyleValue ? 0 : 4 :
- nStyleValue ? 0 : 1;
- }
- else
- {
- OSL_FAIL( "what type was it");
- }
- }
-
- switch( nSprmId )
- {
- case NS_ooxml::LN_EG_RPrBase_b:
- case NS_ooxml::LN_EG_RPrBase_bCs:
- {
- uno::Any aBold( uno::Any( nIntValue ? awt::FontWeight::BOLD : awt::FontWeight::NORMAL ) );
-
- rContext->Insert(ePropertyId, aBold );
- if( nSprmId != NS_ooxml::LN_EG_RPrBase_bCs )
- rContext->Insert(PROP_CHAR_WEIGHT_ASIAN, aBold );
-
- if (nSprmId == NS_ooxml::LN_EG_RPrBase_b)
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "b", OUString::number(nIntValue));
- else if (nSprmId == NS_ooxml::LN_EG_RPrBase_bCs)
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "bCs", OUString::number(nIntValue));
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_i:
- case NS_ooxml::LN_EG_RPrBase_iCs:
- {
- uno::Any aPosture( uno::Any( nIntValue ? awt::FontSlant_ITALIC : awt::FontSlant_NONE ) );
- rContext->Insert( ePropertyId, aPosture );
- if (nSprmId != NS_ooxml::LN_EG_RPrBase_iCs)
- rContext->Insert(PROP_CHAR_POSTURE_ASIAN, aPosture );
- if (nSprmId == NS_ooxml::LN_EG_RPrBase_i)
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "i", OUString::number(nIntValue));
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_strike:
- {
- const auto eStrike
- = nIntValue ? awt::FontStrikeout::SINGLE : awt::FontStrikeout::NONE;
- const bool bOverwrite(nIntValue);
- rContext->Insert(ePropertyId, uno::Any(eStrike), bOverwrite);
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_dstrike:
- {
- const auto eStrike
- = nIntValue ? awt::FontStrikeout::DOUBLE : awt::FontStrikeout::NONE;
- const bool bOverwrite(nIntValue);
- rContext->Insert(ePropertyId, uno::Any(eStrike), bOverwrite);
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_outline:
- case NS_ooxml::LN_EG_RPrBase_shadow:
- case NS_ooxml::LN_EG_RPrBase_vanish:
- case NS_ooxml::LN_EG_RPrBase_webHidden:
- rContext->Insert(ePropertyId, uno::Any( nIntValue != 0 ));
- break;
- case NS_ooxml::LN_EG_RPrBase_smallCaps:
- // If smallcaps would be just disabled and another casemap is already inserted, don't do anything.
- if (nIntValue || !rContext->isSet(ePropertyId) )
- rContext->Insert(ePropertyId, uno::Any( nIntValue ? style::CaseMap::SMALLCAPS : style::CaseMap::NONE));
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "smallCaps", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_EG_RPrBase_caps:
- rContext->Insert(ePropertyId,
- uno::Any( nIntValue ? style::CaseMap::UPPERCASE : style::CaseMap::NONE));
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "caps", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_EG_RPrBase_emboss:
- rContext->Insert(ePropertyId,
- uno::Any( nIntValue ? awt::FontRelief::EMBOSSED : awt::FontRelief::NONE ));
- break;
-
- }
- }
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_sz:
- case NS_ooxml::LN_EG_RPrBase_szCs:
- {
- //multiples of half points (12pt == 24)
- double fVal = double(nIntValue) / 2.;
- uno::Any aVal( fVal );
- if( NS_ooxml::LN_EG_RPrBase_szCs == nSprmId )
- {
- rContext->Insert( PROP_CHAR_HEIGHT_COMPLEX, aVal );
- }
- else
- {
- const RubyInfo &aInfo = m_pImpl->GetRubyInfo();
- if (aInfo.nSprmId == NS_ooxml::LN_CT_Ruby_rt && aInfo.nHps > 0 )
- {
- fVal = double(aInfo.nHps) / 2.;
- aVal <<= fVal;
- }
- else if (aInfo.nSprmId == NS_ooxml::LN_CT_Ruby_rubyBase && aInfo.nHpsBaseText > 0 )
- {
- fVal = double(aInfo.nHpsBaseText) / 2.;
- aVal <<= fVal;
- }
- //Asian get the same value as Western
- rContext->Insert( PROP_CHAR_HEIGHT, aVal );
- rContext->Insert( PROP_CHAR_HEIGHT_ASIAN, aVal );
- }
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, (nSprmId == NS_ooxml::LN_EG_RPrBase_sz ? OUString("sz") : OUString("szCs")), OUString::number(nIntValue));
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_position:
- // The spec says 0 is the same as the lack of the value, so don't parse that.
- if ( nIntValue )
- {
- if (!IsStyleSheetImport() && !IsNumberingImport())
- m_pImpl->deferCharacterProperty( nSprmId, uno::Any( nIntValue ));
- else if (!m_pImpl->IsDocDefaultsImport())
- {
- // For some undocumented reason, MS Word seems to ignore this in docDefaults
-
- const StyleSheetEntryPtr pCurrStyle = GetStyleSheetTable()->GetCurrentEntry();
- if (pCurrStyle && pCurrStyle->m_nStyleTypeCode == STYLE_TYPE_PARA && nIntValue < 0)
- {
- m_pImpl->deferCharacterProperty(nSprmId, uno::Any(nIntValue));
- break;
- }
-
- // DON'T FIXME: Truly calculating this for Character Styles will be tricky,
- // because it depends on the final fontsize - regardless of
- // where it is set. So at the style level,
- // the escapement value would need to be grabbagged.
- // At appendText time the final fontsize needs to be determined, and then
- // the escapement can be calculated from the grabbag'd half-point value
- // and directly applied. Yuck.
- // It seems best to just treat charstyle escapement like
- // pre-commit e70df84352d3670508a4666c97df44f82c1ce934
- // which just assigned default values and ignored the actual/given escapement.
- sal_Int16 nEscapement = nIntValue > 0 ? DFLT_ESC_AUTO_SUPER : DFLT_ESC_AUTO_SUB;
- sal_Int8 nProp = DFLT_ESC_PROP;
- rContext->Insert(PROP_CHAR_ESCAPEMENT, uno::Any( nEscapement ) );
- rContext->Insert(PROP_CHAR_ESCAPEMENT_HEIGHT, uno::Any( nProp ) );
- }
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_spacing:
- {
- //Kerning half point values
- //TODO: there are two kerning values -
- // in ww8par6.cxx NS_sprm::LN_CHpsKern is used as boolean AutoKerning
- sal_Int16 nResult = static_cast<sal_Int16>(ConversionHelper::convertTwipToMM100(nIntValue));
- if (m_pImpl->IsInComments())
- {
- nResult = static_cast<sal_Int16>(nIntValue);
- }
- rContext->Insert(PROP_CHAR_CHAR_KERNING, uno::Any(nResult));
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "spacing", OUString::number(nIntValue));
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_kern: // auto kerning is bound to a minimum font size in Word - but not in Writer :-(
- rContext->Insert(PROP_CHAR_AUTO_KERNING, uno::Any( nIntValue != 0 ) );
- break;
- case NS_ooxml::LN_EG_RPrBase_w:
- // ST_TextScale must fall between 1% and 600% according to spec, otherwise resets to 100% according to experience
- if ((1 <= nIntValue) && (nIntValue <= 600))
- {
- rContext->Insert(PROP_CHAR_SCALE_WIDTH,
- uno::Any( sal_Int16(nIntValue) ));
- }
- else
- {
- rContext->Insert(PROP_CHAR_SCALE_WIDTH,
- uno::Any( sal_Int16(100) ));
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_imprint:
- // FontRelief: NONE, EMBOSSED, ENGRAVED
- rContext->Insert(PROP_CHAR_RELIEF,
- uno::Any( nIntValue ? awt::FontRelief::ENGRAVED : awt::FontRelief::NONE ));
- break;
- case NS_ooxml::LN_EG_RPrBase_effect:
- // The file-format has many character animations. We have only
- // one, so we use it always. Suboptimal solution though.
- if (nIntValue != NS_ooxml::LN_Value_ST_TextEffect_none)
- rContext->Insert(PROP_CHAR_FLASH, uno::Any( true ));
- else
- rContext->Insert(PROP_CHAR_FLASH, uno::Any( false ));
- break;
- case NS_ooxml::LN_EG_RPrBase_rtl:
- break;
- case NS_ooxml::LN_EG_RPrBase_shd:
- {
- //contains fore color, back color and shadow percentage, results in a brush
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- auto pCellColorHandler = std::make_shared<CellColorHandler>();
- pCellColorHandler->setOutputFormat( CellColorHandler::Character );
- pProperties->resolve(*pCellColorHandler);
- rContext->InsertProps(pCellColorHandler->getProperties().get());
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_SHADING_MARKER, uno::Any(true), true, CHAR_GRAB_BAG );
-
- // EditEng doesn't have a corresponding property for Shading Value, so eliminate it.
- if (m_pImpl->IsInComments())
- rContext->Erase(PROP_CHAR_SHADING_VALUE);
- }
- break;
- }
- case NS_ooxml::LN_EG_SectPrContents_type:
- /* break type
- 0 - No break
- 1 - New Column
- 2 - New page
- 3 - Even page
- 4 - odd page
- */
- OSL_ENSURE(pSectionContext, "SectionContext unavailable!");
- if(pSectionContext)
- {
- //continuous break only allowed if it is not the only section break
- SectionPropertyMap* pLastContext = m_pImpl->GetLastSectionContext();
- if ( nIntValue != NS_ooxml::LN_Value_ST_SectionMark_continuous || pLastContext || m_pImpl->GetParaSectpr() )
- pSectionContext->SetBreakType( nIntValue );
- }
- break;
- case NS_ooxml::LN_EG_SectPrContents_titlePg:
- {
- OSL_ENSURE(pSectionContext, "SectionContext unavailable!");
- if(pSectionContext)
- pSectionContext->SetTitlePage( nIntValue > 0 );//section has title page
- }
- break;
- case 165:
- {
- //page height, rounded to default values, default: 0x3dc0 twip
- sal_Int32 nHeight = ConversionHelper::convertTwipToMM100( nIntValue );
- rContext->Insert( PROP_HEIGHT, uno::Any( PaperInfo::sloppyFitPageDimension( nHeight ) ) );
- }
- break;
- case NS_ooxml::LN_EG_SectPrContents_textDirection:
- {
- sal_Int16 nDirection = text::WritingMode2::LR_TB;
- switch( nIntValue )
- {
- // East Asian 270deg rotation in lrTbV is not implemented in LO
- case NS_ooxml::LN_Value_ST_TextDirection_lrTb:
- case NS_ooxml::LN_Value_ST_TextDirection_lrTbV:
- nDirection = text::WritingMode2::LR_TB; // =0
- break;
- case NS_ooxml::LN_Value_ST_TextDirection_tbRl:
- nDirection = text::WritingMode2::TB_RL; // =2
- break;
- // Word does not write btLr in sections, but LO would be able to use it.
- case NS_ooxml::LN_Value_ST_TextDirection_btLr:
- nDirection = text::WritingMode2::BT_LR; // =5
- break;
- // Word maps mongolian direction to tbRlV in sections in file save, as of Aug 2022.
- // From point of OOXML standard it would be tbLrV. Since tbRlV is currently not
- // implemented in LO for text direction in page styles, we follow Word here.
- case NS_ooxml::LN_Value_ST_TextDirection_tbRlV:
- case NS_ooxml::LN_Value_ST_TextDirection_tbLrV:
- nDirection = text::WritingMode2::TB_LR; // =3
- break;
- default:;
- }
-
- PropertyMap * pTargetContext = rContext.get();
-
- if (pSectionContext)
- {
- pTargetContext = pSectionContext;
- }
-
- pTargetContext->Insert(PROP_WRITING_MODE, uno::Any( sal_Int16(nDirection) ) );
- }
- break; // sprmSTextFlow
- // the following are not part of the official documentation
- case NS_ooxml::LN_CT_Tabs_tab:
- resolveSprmProps(*this, rSprm);
- m_pImpl->IncorporateTabStop(m_pImpl->m_aCurrentTabStop);
- m_pImpl->m_aCurrentTabStop = DeletableTabStop();
- break;
- case NS_ooxml::LN_CT_PPrBase_tabs:
- {
- // Initialize tab stop vector from style sheet
- // fdo#81033: for RTF, a tab stop is inherited from the style if it
- // is also applied to the paragraph directly, and cleared if it is
- // not applied to the paragraph directly => don't InitTabStopFromStyle
- if ( !IsRTFImport() )
- {
- uno::Any aValue = m_pImpl->GetPropertyFromParaStyleSheet(PROP_PARA_TAB_STOPS);
- uno::Sequence< style::TabStop > aStyleTabStops;
- if(aValue >>= aStyleTabStops)
- {
- m_pImpl->InitTabStopFromStyle( aStyleTabStops );
- }
- }
- resolveSprmProps(*this, rSprm);
- rContext->Insert(PROP_PARA_TAB_STOPS, uno::Any( m_pImpl->GetCurrentTabStopAndClear()));
- }
- break;
-
- case NS_ooxml::LN_CT_DocDefaults_pPrDefault:
- case NS_ooxml::LN_CT_DocDefaults_rPrDefault:
- GetStyleSheetTable()->sprm( rSprm );
- break;
- case NS_ooxml::LN_EG_RPrBase_bdr:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- auto pBorderHandler = std::make_shared<BorderHandler>( true );
- pProperties->resolve(*pBorderHandler);
-
- rContext->Insert( PROP_CHAR_TOP_BORDER, uno::Any( pBorderHandler->getBorderLine()));
- rContext->Insert( PROP_CHAR_BOTTOM_BORDER, uno::Any( pBorderHandler->getBorderLine()));
- rContext->Insert( PROP_CHAR_LEFT_BORDER, uno::Any( pBorderHandler->getBorderLine()));
- rContext->Insert( PROP_CHAR_RIGHT_BORDER, uno::Any( pBorderHandler->getBorderLine()));
-
- rContext->Insert( PROP_CHAR_TOP_BORDER_DISTANCE, uno::Any( pBorderHandler->getLineDistance()));
- rContext->Insert( PROP_CHAR_BOTTOM_BORDER_DISTANCE, uno::Any( pBorderHandler->getLineDistance()));
- rContext->Insert( PROP_CHAR_LEFT_BORDER_DISTANCE, uno::Any( pBorderHandler->getLineDistance()));
- rContext->Insert( PROP_CHAR_RIGHT_BORDER_DISTANCE, uno::Any( pBorderHandler->getLineDistance()));
-
- auto xComplexColor = model::color::createXComplexColor(pBorderHandler->getComplexColor());
-
- rContext->Insert( PROP_CHAR_BORDER_TOP_COMPLEX_COLOR, uno::Any(xComplexColor));
- rContext->Insert( PROP_CHAR_BORDER_BOTTOM_COMPLEX_COLOR, uno::Any(xComplexColor));
- rContext->Insert( PROP_CHAR_BORDER_LEFT_COMPLEX_COLOR, uno::Any(xComplexColor));
- rContext->Insert( PROP_CHAR_BORDER_RIGHT_COMPLEX_COLOR, uno::Any(xComplexColor));
-
- table::ShadowFormat aFormat;
- // Word only allows shadows on visible borders
- if ( pBorderHandler->getShadow() && pBorderHandler->getBorderLine().LineStyle != table::BorderLineStyle::NONE )
- aFormat = writerfilter::dmapper::PropertyMap::getShadowFromBorder(pBorderHandler->getBorderLine());
- rContext->Insert(PROP_CHAR_SHADOW_FORMAT, uno::Any(aFormat));
- }
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_color:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- auto pThemeColorHandler = std::make_shared<ThemeColorHandler>();
- pProperties->resolve(*pThemeColorHandler);
-
- uno::Any aThemeColorName(TDefTableHandler::getThemeColorTypeString(pThemeColorHandler->mnIndex));
- uno::Any aThemeColorTint(OUString::number(pThemeColorHandler->mnTint, 16));
- uno::Any aThemeColorShade(OUString::number(pThemeColorHandler->mnShade, 16));
-
- if (m_pImpl->GetTopContext())
- {
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_COLOR, uno::Any(pThemeColorHandler->mnColor));
-
- auto eType = TDefTableHandler::getThemeColorTypeIndex(pThemeColorHandler->mnIndex);
- if (eType != model::ThemeColorType::Unknown)
- {
-
- model::ComplexColor aComplexColor;
- aComplexColor.setThemeColor(eType);
-
- auto eUsage = TDefTableHandler::getThemeColorUsage(pThemeColorHandler->mnIndex);
- aComplexColor.setThemeColorUsage(eUsage);
-
- if (pThemeColorHandler->mnTint > 0 )
- {
- sal_Int16 nTint = sal_Int16((255 - pThemeColorHandler->mnTint) * 10000 / 255);
- aComplexColor.addTransformation({model::TransformationType::Tint, nTint});
- }
- if (pThemeColorHandler->mnShade > 0)
- {
- sal_Int16 nShade = sal_Int16((255 - pThemeColorHandler->mnShade) * 10000 / 255);
- aComplexColor.addTransformation({model::TransformationType::Shade, nShade});
- }
-
- auto xComplexColor = model::color::createXComplexColor(aComplexColor);
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_COMPLEX_COLOR, uno::Any(xComplexColor));
- }
-
- uno::Any aColorAny(msfilter::util::ConvertColorOU(Color(ColorTransparency, pThemeColorHandler->mnColor)));
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_ORIGINAL_COLOR, aColorAny, true, CHAR_GRAB_BAG);
-
- if (pThemeColorHandler->mnIndex >= 0)
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_COLOR, aThemeColorName, true, CHAR_GRAB_BAG);
-
- if (pThemeColorHandler->mnTint > 0)
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_COLOR_TINT, aThemeColorTint, true, CHAR_GRAB_BAG);
-
- if (pThemeColorHandler->mnShade > 0)
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_COLOR_SHADE, aThemeColorShade, true, CHAR_GRAB_BAG);
- }
- {
- if (pThemeColorHandler->mnIndex >= 0)
- {
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "themeColor", aThemeColorName.get<OUString>());
- if (pThemeColorHandler->mnTint > 0)
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "themeTint", aThemeColorTint.get<OUString>());
- if (pThemeColorHandler->mnShade > 0)
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "themeShade", aThemeColorShade.get<OUString>());
- }
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "color", m_pImpl->m_aSubInteropGrabBag);
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_PPr_sectPr:
- case NS_ooxml::LN_EG_RPrBase_rFonts:
- case NS_ooxml::LN_EG_RPrBase_eastAsianLayout:
- case NS_ooxml::LN_EG_RPrBase_u:
- case NS_ooxml::LN_EG_RPrBase_lang:
- case NS_ooxml::LN_CT_PPrBase_spacing:
- case NS_ooxml::LN_CT_PPrBase_ind:
- case NS_ooxml::LN_CT_RPrDefault_rPr:
- case NS_ooxml::LN_CT_PPrDefault_pPr:
- case NS_ooxml::LN_CT_Style_pPr:
- case NS_ooxml::LN_CT_Style_rPr:
- case NS_ooxml::LN_CT_PPr_rPr:
- case NS_ooxml::LN_CT_PPrBase_numPr:
- {
- if (nSprmId == NS_ooxml::LN_CT_PPr_sectPr)
- m_pImpl->SetParaSectpr(true);
- resolveSprmProps(*this, rSprm);
- if (nSprmId == NS_ooxml::LN_CT_PPrBase_spacing)
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "spacing", m_pImpl->m_aSubInteropGrabBag);
- else if (nSprmId == NS_ooxml::LN_EG_RPrBase_rFonts)
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "rFonts", m_pImpl->m_aSubInteropGrabBag);
- else if (nSprmId == NS_ooxml::LN_EG_RPrBase_lang)
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "lang", m_pImpl->m_aSubInteropGrabBag);
- else if (nSprmId == NS_ooxml::LN_CT_PPrBase_ind)
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ind", m_pImpl->m_aSubInteropGrabBag);
- }
- break;
- case NS_ooxml::LN_CT_PPrBase_wordWrap:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "wordWrap", "");
- break;
- case NS_ooxml::LN_EG_SectPrContents_footnotePr:
- case NS_ooxml::LN_EG_SectPrContents_endnotePr:
- m_pImpl->SetInFootnoteProperties( NS_ooxml::LN_EG_SectPrContents_footnotePr == nSprmId );
- resolveSprmProps(*this, rSprm);
- break;
- case NS_ooxml::LN_EG_SectPrContents_lnNumType:
- {
- resolveSprmProps(*this, rSprm);
- LineNumberSettings aSettings = m_pImpl->GetLineNumberSettings();
- m_pImpl->SetLineNumberSettings( aSettings );
- //apply settings at XLineNumberingProperties
- try
- {
- uno::Reference< text::XLineNumberingProperties > xLineNumberingProperties( m_pImpl->GetTextDocument(), uno::UNO_QUERY_THROW );
- uno::Reference< beans::XPropertySet > xLineNumberingPropSet = xLineNumberingProperties->getLineNumberingProperties();
- if( aSettings.nInterval == 0 )
- xLineNumberingPropSet->setPropertyValue(getPropertyName( PROP_IS_ON ), uno::Any(false) );
- else
- {
- xLineNumberingPropSet->setPropertyValue(getPropertyName( PROP_IS_ON ), uno::Any(true) );
- if( aSettings.nInterval )
- xLineNumberingPropSet->setPropertyValue(getPropertyName( PROP_INTERVAL ), uno::Any(static_cast<sal_Int16>(aSettings.nInterval)) );
- if( aSettings.nDistance != -1 )
- xLineNumberingPropSet->setPropertyValue(getPropertyName( PROP_DISTANCE ), uno::Any(aSettings.nDistance) );
- else
- {
- // set Auto value (0.5 cm)
- xLineNumberingPropSet->setPropertyValue(getPropertyName( PROP_DISTANCE ), uno::Any(static_cast<sal_Int32>(500)) );
- if( pSectionContext )
- pSectionContext->SetdxaLnn( static_cast<sal_Int32>(283) );
- }
- xLineNumberingPropSet->setPropertyValue(getPropertyName( PROP_RESTART_AT_EACH_PAGE ), uno::Any(aSettings.bRestartAtEachPage) );
- }
- }
- catch( const uno::Exception& )
- {
- }
-
- }
- break;
- case NS_ooxml::LN_CT_PPrBase_framePr:
- {
- PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH);
- if( pContext )
- {
- // If there is a deferred page break applied to this framed paragraph,
- // create a dummy paragraph without extra properties,
- // so that the anchored frame will be on the correct page (similar to shapes).
- if (pContext->isSet(PROP_BREAK_TYPE))
- {
- pContext->Erase(PROP_BREAK_TYPE);
-
- lcl_startParagraphGroup();
- m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_PAGE_BEFORE));
- lcl_startCharacterGroup();
- sal_Unicode const sBreak[] = { 0x0d };
- lcl_utext(sBreak, 1);
- lcl_endCharacterGroup();
- lcl_endParagraphGroup();
- }
-
- ParagraphPropertyMap* pParaContext = dynamic_cast< ParagraphPropertyMap* >( pContext.get() );
- if (pParaContext)
- pParaContext->props().SetFrameMode();
-
- if (!IsInHeaderFooter())
- m_pImpl->m_bIsActualParagraphFramed = true;
- }
- else
- {
- //TODO: What about style sheet import of frame properties
- }
- m_pImpl->NewFrameDirection();
- resolveSprmProps(*this, rSprm);
- }
- break;
- case NS_ooxml::LN_EG_SectPrContents_pgSz:
- {
- PaperInfo aLetter(PAPER_LETTER);
- CT_PageSz.w = aLetter.getWidth();
- CT_PageSz.h = aLetter.getHeight();
- }
- CT_PageSz.orient = false;
- resolveSprmProps(*this, rSprm);
- OSL_ENSURE(pSectionContext, "SectionContext unavailable!");
- if(pSectionContext)
- {
- if (!m_pImpl->IsAltChunk())
- {
- pSectionContext->Insert(PROP_HEIGHT, uno::Any(CT_PageSz.h));
- }
- pSectionContext->Insert( PROP_IS_LANDSCAPE, uno::Any( CT_PageSz.orient ));
- if (!m_pImpl->IsAltChunk())
- {
- pSectionContext->Insert(PROP_WIDTH, uno::Any(CT_PageSz.w));
- }
- }
- break;
-
- case NS_ooxml::LN_EG_SectPrContents_pgMar:
- m_pImpl->InitPageMargins();
- resolveSprmProps(*this, rSprm);
- OSL_ENSURE(pSectionContext, "SectionContext unavailable!");
- if(pSectionContext)
- {
- const PageMar& rPageMar = m_pImpl->GetPageMargins();
- pSectionContext->SetTopMargin( rPageMar.top );
- pSectionContext->SetRightMargin( rPageMar.right );
- pSectionContext->SetBottomMargin( rPageMar.bottom );
- pSectionContext->SetLeftMargin( rPageMar.left );
- pSectionContext->SetHeaderTop( rPageMar.header );
- pSectionContext->SetHeaderBottom( rPageMar.footer );
- pSectionContext->SetGutterMargin(rPageMar.gutter);
- }
- break;
- case NS_ooxml::LN_EG_SectPrContents_paperSrc:
- m_pImpl->InitPaperSource();
- resolveSprmProps(*this, rSprm);
- OSL_ENSURE(pSectionContext, "SectionContext unavailable!");
- if(pSectionContext)
- {
- const PaperSource& rPaperSource = m_pImpl->GetPaperSource();
- pSectionContext->SetPaperSource( rPaperSource.first, rPaperSource.other );
- }
- break;
- case NS_ooxml::LN_EG_SectPrContents_cols:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
-
- tools::SvRef< SectionColumnHandler > pSectHdl( new SectionColumnHandler );
- pProperties->resolve(*pSectHdl);
- if(pSectionContext && !m_pImpl->isInIndexContext())
- {
- sal_Int16 nColumnCount = pSectHdl->GetNum() == 1 ? 0 : pSectHdl->GetNum();
- if( pSectHdl->IsEqualWidth() )
- {
- pSectionContext->SetEvenlySpaced( true );
- pSectionContext->SetColumnCount( nColumnCount );
- pSectionContext->SetColumnDistance( pSectHdl->GetSpace() );
- pSectionContext->SetSeparatorLine( pSectHdl->IsSeparator() );
- }
- else if( !pSectHdl->GetColumns().empty() )
- {
- pSectionContext->SetEvenlySpaced( false );
- pSectionContext->SetColumnDistance( pSectHdl->GetSpace() );
- nColumnCount = pSectHdl->GetColumns().size();
- pSectionContext->SetColumnCount( nColumnCount == 1 ? 0 : nColumnCount );
- std::vector<Column_>::const_iterator tmpIter = pSectHdl->GetColumns().begin();
- for (; tmpIter != pSectHdl->GetColumns().end(); ++tmpIter)
- {
- pSectionContext->AppendColumnWidth( tmpIter->nWidth );
- if ((tmpIter != pSectHdl->GetColumns().end() - 1) || (tmpIter->nSpace > 0))
- pSectionContext->AppendColumnSpacing( tmpIter->nSpace );
- }
- pSectionContext->SetSeparatorLine( pSectHdl->IsSeparator() );
- }
- else if( nColumnCount )
- {
- pSectionContext->SetColumnCount( nColumnCount );
- pSectionContext->SetColumnDistance( pSectHdl->GetSpace() );
- pSectionContext->SetSeparatorLine( pSectHdl->IsSeparator() );
- }
- }
-
- else if ( pSectionContext )
- {
- FieldContextPtr pContext = m_pImpl->GetTopFieldContext();
- uno::Reference< beans::XPropertySet > xTOC = pContext->GetTOC();
- if( xTOC.is() )
- {
- uno::Reference<text::XTextColumns> xTextColumns;
- xTOC->getPropertyValue(getPropertyName( PROP_TEXT_COLUMNS )) >>= xTextColumns;
- if (xTextColumns.is())
- {
- uno::Reference< beans::XPropertySet > xColumnPropSet( xTextColumns, uno::UNO_QUERY_THROW );
- xColumnPropSet->setPropertyValue( getPropertyName( PROP_AUTOMATIC_DISTANCE ), uno::Any( pSectHdl->GetSpace() ));
- xTOC->setPropertyValue( getPropertyName( PROP_TEXT_COLUMNS ), uno::Any( xTextColumns ) );
- }
- }
- }
- }
- }
- break;
- case NS_ooxml::LN_EG_SectPrContents_docGrid:
- resolveSprmProps(*this, rSprm);
- break;
- case NS_ooxml::LN_EG_SectPrContents_pgBorders:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties && pSectionContext )
- {
- tools::SvRef< PageBordersHandler > pHandler( new PageBordersHandler );
- pProperties->resolve( *pHandler );
-
- // Set the borders to the context and apply them to the styles
- pHandler->SetBorders( pSectionContext );
- }
- }
- break;
-
- case NS_ooxml::LN_CT_PPrBase_snapToGrid:
- if (!IsStyleSheetImport()||!m_pImpl->isInteropGrabBagEnabled())
- {
- rContext->Insert( PROP_SNAP_TO_GRID, uno::Any(bool(nIntValue)));
- }
- else
- {
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "snapToGrid", OUString::number(nIntValue));
- }
- break;
- case NS_ooxml::LN_CT_PPrBase_pStyle:
- {
- StyleSheetTablePtr pStyleTable = m_pImpl->GetStyleSheetTable();
- const OUString sConvertedStyleName = pStyleTable->ConvertStyleName( sStringValue, true );
- m_pImpl->SetCurrentParaStyleName( sConvertedStyleName );
- if (m_pImpl->GetTopContext() && m_pImpl->GetTopContextType() != CONTEXT_SECTION)
- m_pImpl->GetTopContext()->Insert( PROP_PARA_STYLE_NAME, uno::Any( sConvertedStyleName ));
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_rStyle:
- {
- OUString sConvertedName( m_pImpl->GetStyleSheetTable()->ConvertStyleName( sStringValue, true ) );
- if (m_pImpl->CheckFootnoteStyle() && m_pImpl->GetFootnoteContext())
- m_pImpl->SetHasFootnoteStyle(m_pImpl->GetFootnoteContext()->GetFootnoteStyle() == sConvertedName);
-
- // First check if the style exists in the document.
- StyleSheetEntryPtr pEntry = m_pImpl->GetStyleSheetTable( )->FindStyleSheetByConvertedStyleName( sConvertedName );
- bool bExists = pEntry && ( pEntry->m_nStyleTypeCode == STYLE_TYPE_CHAR );
- // Add the property if the style exists, but do not add it elements in TOC:
- // they will receive later another style references from TOC
- if ( bExists && m_pImpl->GetTopContext() && !m_pImpl->IsInTOC())
- m_pImpl->GetTopContext()->Insert( PROP_CHAR_STYLE_NAME, uno::Any( sConvertedName ) );
- }
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblCellMar: //cell margins
- {
- resolveSprmProps(*this, rSprm);//contains LN_CT_TblCellMar_top, LN_CT_TblCellMar_left, LN_CT_TblCellMar_bottom, LN_CT_TblCellMar_right
- }
- break;
- case NS_ooxml::LN_CT_TblCellMar_top:
- case NS_ooxml::LN_CT_TblCellMar_start:
- case NS_ooxml::LN_CT_TblCellMar_left:
- case NS_ooxml::LN_CT_TblCellMar_bottom:
- case NS_ooxml::LN_CT_TblCellMar_end:
- case NS_ooxml::LN_CT_TblCellMar_right:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- MeasureHandlerPtr pMeasureHandler( new MeasureHandler );
- pProperties->resolve(*pMeasureHandler);
- sal_Int32 nMeasureValue = pMeasureHandler->getMeasureValue();
- PropertyIds eId = META_PROP_CELL_MAR_TOP;
- bool rtl = false; // TODO
- switch(nSprmId)
- {
- case NS_ooxml::LN_CT_TblCellMar_top:
- break;
- case NS_ooxml::LN_CT_TblCellMar_start:
- eId = rtl ? META_PROP_CELL_MAR_RIGHT : META_PROP_CELL_MAR_LEFT;
- break;
- case NS_ooxml::LN_CT_TblCellMar_left:
- eId = META_PROP_CELL_MAR_LEFT;
- break;
- case NS_ooxml::LN_CT_TblCellMar_bottom:
- eId = META_PROP_CELL_MAR_BOTTOM;
- break;
- case NS_ooxml::LN_CT_TblCellMar_end:
- eId = rtl ? META_PROP_CELL_MAR_LEFT : META_PROP_CELL_MAR_RIGHT;
- break;
- case NS_ooxml::LN_CT_TblCellMar_right:
- eId = META_PROP_CELL_MAR_RIGHT;
- break;
- default:;
- }
- rContext->Insert( eId, uno::Any(nMeasureValue), false);
- }
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_noProof: // no grammar and spell checking, unsupported
- break;
- case NS_ooxml::LN_anchor_anchor: // at_character drawing
- case NS_ooxml::LN_inline_inline: // as_character drawing
- {
- if ( m_pImpl->IsDiscardHeaderFooter() )
- break;
- //tdf112342: Break before images as well, if there are page break
- if (m_pImpl->isBreakDeferred(BreakType::PAGE_BREAK)
- && nSprmId == NS_ooxml::LN_inline_inline && !m_pImpl->IsInShape())
- {
- if (m_pImpl->GetIsFirstParagraphInSection() || !m_pImpl->IsFirstRun())
- {
- m_pImpl->m_bIsSplitPara = true;
- finishParagraph();
- lcl_startParagraphGroup();
- }
- else
- {
- m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH)
- ->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_PAGE_BEFORE));
- m_pImpl->clearDeferredBreak(PAGE_BREAK);
- }
- }
-
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- m_pImpl->m_eGraphicImportType =
- (NS_ooxml::LN_anchor_anchor ==
- sal::static_int_cast<Id>(nSprmId)) ?
- IMPORT_AS_DETECTED_ANCHOR :
- IMPORT_AS_DETECTED_INLINE;
- GraphicImportPtr pGraphicImport = m_pImpl->GetGraphicImport();
- pProperties->resolve(*pGraphicImport);
- m_pImpl->ImportGraphic(pProperties);
- if( !pGraphicImport->IsGraphic() )
- {
- m_pImpl->ResetGraphicImport();
- // todo: It's a shape, now start shape import
- }
- }
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_vertAlign:
- {
- sal_Int16 nEscapement = 0;
- sal_Int8 nProp = DFLT_ESC_PROP;
- if ( sStringValue == "superscript" )
- nEscapement = DFLT_ESC_AUTO_SUPER;
- else if ( sStringValue == "subscript" )
- nEscapement = DFLT_ESC_AUTO_SUB;
- else
- nProp = 100;
-
- rContext->Insert(PROP_CHAR_ESCAPEMENT, uno::Any( nEscapement ) );
- rContext->Insert(PROP_CHAR_ESCAPEMENT_HEIGHT, uno::Any( nProp ) );
- }
- break;
- case NS_ooxml::LN_CT_FtnProps_pos:
- //footnotes in word can be at page end or beneath text - writer supports only the first
- //endnotes in word can be at section end or document end - writer supports only the latter
- // -> so this property can be ignored
- break;
- case NS_ooxml::LN_CT_FtnProps_numFmt:
- case NS_ooxml::LN_CT_EdnProps_numFmt:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- pProperties->resolve(*this);
- }
- }
- break;
- case NS_ooxml::LN_EG_FtnEdnNumProps_numStart:
- case NS_ooxml::LN_EG_FtnEdnNumProps_numRestart:
- {
- try
- {
- uno::Reference< beans::XPropertySet > xFtnEdnSettings;
- if( m_pImpl->IsInFootnoteProperties() )
- {
- uno::Reference< text::XFootnotesSupplier> xFootnotesSupplier( m_pImpl->GetTextDocument(), uno::UNO_QUERY );
- if (xFootnotesSupplier.is())
- xFtnEdnSettings = xFootnotesSupplier->getFootnoteSettings();
- }
- else
- {
- uno::Reference< text::XEndnotesSupplier> xEndnotesSupplier( m_pImpl->GetTextDocument(), uno::UNO_QUERY );
- if (xEndnotesSupplier.is())
- xFtnEdnSettings = xEndnotesSupplier->getEndnoteSettings();
- }
- if( NS_ooxml::LN_EG_FtnEdnNumProps_numStart == nSprmId && xFtnEdnSettings.is())
- {
- xFtnEdnSettings->setPropertyValue(
- getPropertyName( PROP_START_AT),
- uno::Any( sal_Int16( nIntValue - 1 )));
- }
- else if( NS_ooxml::LN_EG_FtnEdnNumProps_numRestart == nSprmId && xFtnEdnSettings.is())
- {
- sal_Int16 nFootnoteCounting = 0;
- switch (nIntValue)
- {
- case NS_ooxml::LN_Value_ST_RestartNumber_continuous: nFootnoteCounting = text::FootnoteNumbering::PER_DOCUMENT; break;
- case NS_ooxml::LN_Value_ST_RestartNumber_eachPage: nFootnoteCounting = text::FootnoteNumbering::PER_PAGE; break;
- case NS_ooxml::LN_Value_ST_RestartNumber_eachSect: nFootnoteCounting = text::FootnoteNumbering::PER_CHAPTER; break;
- default: break;
- }
- xFtnEdnSettings->setPropertyValue(
- getPropertyName( PROP_FOOTNOTE_COUNTING ),
- uno::Any( nFootnoteCounting ));
- }
- else if (xFtnEdnSettings.is())
- {
- sal_Int16 nNumType = ConversionHelper::ConvertNumberingType( nIntValue );
- xFtnEdnSettings->setPropertyValue(
- getPropertyName( PROP_NUMBERING_TYPE),
- uno::Any( nNumType ));
- }
- }
- catch( const uno::Exception& )
- {
- }
- }
- break;
- case NS_ooxml::LN_EG_RangeMarkupElements_moveFromRangeStart:
- m_pImpl->SetMoveBookmark(/*bIsFrom=*/true);
- if (m_pImpl->hasTableManager())
- m_pImpl->getTableManager().setMoved( getPropertyName(PROP_TABLE_ROW_DELETE) );
- break;
- case NS_ooxml::LN_EG_RangeMarkupElements_moveToRangeStart:
- m_pImpl->SetMoveBookmark(/*bIsFrom=*/false);
- if (m_pImpl->hasTableManager())
- m_pImpl->getTableManager().setMoved( getPropertyName(PROP_TABLE_ROW_INSERT) );
- break;
- case NS_ooxml::LN_EG_RangeMarkupElements_moveFromRangeEnd:
- case NS_ooxml::LN_EG_RangeMarkupElements_moveToRangeEnd:
- if (m_pImpl->hasTableManager())
- m_pImpl->getTableManager().setMoved( OUString() );
- break;
- case NS_ooxml::LN_CT_ParaRPr_moveFrom:
- case NS_ooxml::LN_CT_ParaRPr_moveTo:
- m_pImpl->StartParaMarkerMove( );
- break;
- case NS_ooxml::LN_paratrackchange:
- m_pImpl->StartParaMarkerChange( );
- [[fallthrough]];
- case NS_ooxml::LN_CT_PPr_pPrChange:
- case NS_ooxml::LN_CT_ParaRPr_rPrChange:
- case NS_ooxml::LN_trackchange:
- case NS_ooxml::LN_EG_RPrContent_rPrChange:
- case NS_ooxml::LN_EG_RangeMarkupElements_customXmlDelRangeStart:
- case NS_ooxml::LN_EG_RangeMarkupElements_customXmlDelRangeEnd:
- case NS_ooxml::LN_EG_RangeMarkupElements_customXmlMoveFromRangeStart:
- case NS_ooxml::LN_EG_RangeMarkupElements_customXmlMoveFromRangeEnd:
- case NS_ooxml::LN_EG_RangeMarkupElements_customXmlMoveToRangeStart:
- case NS_ooxml::LN_EG_RangeMarkupElements_customXmlMoveToRangeEnd:
- {
- HandleRedline( rSprm );
- }
- break;
- case NS_ooxml::LN_endtrackchange:
- m_pImpl->RemoveTopRedline();
- break;
- case NS_ooxml::LN_CT_RPrChange_rPr:
- {
- // Push all the current 'Character' properties to the stack, so that we don't store them
- // as 'tracked changes' by mistake
- m_pImpl->PushProperties(CONTEXT_CHARACTER);
-
- // Resolve all the properties that are under the 'rPrChange'->'rPr' XML node
- resolveSprmProps(*this, rSprm );
-
- // Get all the properties that were processed in the 'rPrChange'->'rPr' XML node
- uno::Sequence< beans::PropertyValue > currentRedlineRevertProperties = m_pImpl->GetTopContext()->GetPropertyValues();
-
- // Pop back out the character properties that were on the run
- m_pImpl->PopProperties(CONTEXT_CHARACTER);
-
- // Store these properties in the current redline object (do it after the PopProperties() above, since
- // otherwise it'd be stored in the content dropped there).
- m_pImpl->SetCurrentRedlineRevertProperties( currentRedlineRevertProperties );
- }
- break;
- case NS_ooxml::LN_CT_PPrChange_pPr:
- {
- // Push all the current 'Paragraph' properties to the stack, so that we don't store them
- // as 'tracked changes' by mistake
- m_pImpl->PushProperties(CONTEXT_PARAGRAPH);
-
- // Resolve all the properties that are under the 'pPrChange'->'pPr' XML node
- resolveSprmProps(*this, rSprm );
-
- // Get all the properties that were processed in the 'pPrChange'->'pPr' XML node
- uno::Sequence< beans::PropertyValue > currentRedlineRevertProperties = m_pImpl->GetTopContext()->GetPropertyValues();
-
- // Pop back out the character properties that were on the run
- m_pImpl->PopProperties(CONTEXT_PARAGRAPH);
-
- // Store these properties in the current redline object (do it after the PopProperties() above, since
- // otherwise it'd be stored in the content dropped there).
- m_pImpl->SetCurrentRedlineRevertProperties( currentRedlineRevertProperties );
- }
- break;
- case NS_ooxml::LN_object:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- auto pOLEHandler = std::make_shared<OLEHandler>(*this);
- pProperties->resolve(*pOLEHandler);
- if ( pOLEHandler->isOLEObject( ) )
- {
- OUString sStreamName = pOLEHandler->copyOLEOStream( m_pImpl->GetTextDocument() );
- if( !sStreamName.isEmpty() )
- {
- m_pImpl->appendOLE( sStreamName, pOLEHandler );
- }
- }
- }
- }
- break;
- case NS_ooxml::LN_EG_HdrFtrReferences_headerReference: // header reference - not needed
- case NS_ooxml::LN_EG_HdrFtrReferences_footerReference: // footer reference - not needed
- break;
- case NS_ooxml::LN_EG_RPrBase_snapToGrid: // "Use document grid settings for inter-paragraph spacing"
- break;
- case NS_ooxml::LN_CT_PPrBase_contextualSpacing:
- rContext->Insert(PROP_PARA_CONTEXT_MARGIN, uno::Any( nIntValue != 0 ));
- break;
- case NS_ooxml::LN_CT_PPrBase_mirrorIndents: // mirrorIndents
- rContext->Insert(PROP_MIRROR_INDENTS, uno::Any( nIntValue != 0 ), true, PARA_GRAB_BAG);
- break;
- case NS_ooxml::LN_EG_SectPrContents_formProt: //section protection
- {
- if( pSectionContext )
- pSectionContext->Insert( PROP_IS_PROTECTED, uno::Any( bool(nIntValue) ) );
- }
- break;
- case NS_ooxml::LN_EG_SectPrContents_vAlign:
- {
- OSL_ENSURE(pSectionContext, "SectionContext unavailable!");
- if( pSectionContext )
- {
- drawing::TextVerticalAdjust nVA = drawing::TextVerticalAdjust_TOP;
- switch( nIntValue )
- {
- case NS_ooxml::LN_Value_ST_VerticalJc_center: //92367
- nVA = drawing::TextVerticalAdjust_CENTER;
- break;
- case NS_ooxml::LN_Value_ST_VerticalJc_both: //92368 - justify
- nVA = drawing::TextVerticalAdjust_BLOCK;
- break;
- case NS_ooxml::LN_Value_ST_VerticalJc_bottom: //92369
- nVA = drawing::TextVerticalAdjust_BOTTOM;
- break;
- default:
- break;
- }
- pSectionContext->Insert( PROP_TEXT_VERTICAL_ADJUST, uno::Any( nVA ), true, PARA_GRAB_BAG );
- }
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_fitText:
- break;
- case NS_ooxml::LN_ffdata:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- FFDataHandler::Pointer_t pFFDataHandler(new FFDataHandler());
-
- pProperties->resolve(*pFFDataHandler);
- m_pImpl->SetFieldFFData(pFFDataHandler);
- }
- }
- break;
- case NS_ooxml::LN_CT_SdtPr_comboBox:
- {
- m_pImpl->m_pSdtHelper->setControlType(SdtControlType::comboBox);
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_CT_SdtPr_dropDownList:
- {
- m_pImpl->m_pSdtHelper->setControlType(SdtControlType::dropDown);
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_CT_SdtDropDownList_listItem:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
-
- size_t nDropDownDisplayTexts = m_pImpl->m_pSdtHelper->getDropDownDisplayTexts().size();
- size_t nDropDownItems = m_pImpl->m_pSdtHelper->getDropDownItems().size();
-
- if (pProperties)
- pProperties->resolve(*this);
-
- if (m_pImpl->m_pSdtHelper->getDropDownDisplayTexts().size() != nDropDownDisplayTexts + 1)
- {
- // w:displayText="..." is optional, add empty value if it was not provided.
- m_pImpl->m_pSdtHelper->getDropDownDisplayTexts().emplace_back();
- }
- if (m_pImpl->m_pSdtHelper->getDropDownItems().size() != nDropDownItems + 1)
- {
- // w:value="..." is optional, add empty value if it was not provided.
- m_pImpl->m_pSdtHelper->getDropDownItems().emplace_back();
- }
- }
- break;
- case NS_ooxml::LN_CT_SdtPr_placeholder:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- pProperties->resolve(*this);
- }
- break;
- break;
- case NS_ooxml::LN_CT_SdtPr_date:
- {
- m_pImpl->m_pSdtHelper->setControlType(SdtControlType::datePicker);
- resolveSprmProps(*this, rSprm);
- m_pImpl->m_pSdtHelper->setFieldStartRange(GetCurrentTextRange()->getEnd());
- }
- break;
- case NS_ooxml::LN_CT_SdtDate_dateFormat:
- {
- m_pImpl->m_pSdtHelper->getDateFormat().append(sStringValue);
- }
- break;
- case NS_ooxml::LN_CT_SdtDate_storeMappedDataAs:
- {
- }
- break;
- case NS_ooxml::LN_CT_SdtDate_calendar:
- {
- }
- break;
- case NS_ooxml::LN_CT_SdtDate_lid:
- {
- m_pImpl->m_pSdtHelper->getLocale().append(sStringValue);
- }
- break;
- case NS_ooxml::LN_CT_SdtPr_text:
- {
- m_pImpl->m_pSdtHelper->setControlType(SdtControlType::plainText);
- if (m_pImpl->m_pSdtHelper->GetSdtType() == NS_ooxml::LN_CT_SdtRun_sdtContent)
- {
- m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear();
- break;
- }
- enableInteropGrabBag("ooxml:CT_SdtPr_text");
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- pProperties->resolve(*this);
- m_pImpl->m_pSdtHelper->appendToInteropGrabBag(getInteropGrabBag());
- m_pImpl->disableInteropGrabBag();
- }
- break;
- case NS_ooxml::LN_CT_SdtPr_dataBinding:
- case NS_ooxml::LN_CT_SdtPr_equation:
- case NS_ooxml::LN_CT_SdtPr_checkbox:
- case NS_ooxml::LN_CT_SdtPr_docPartObj:
- case NS_ooxml::LN_CT_SdtPr_docPartList:
- case NS_ooxml::LN_CT_SdtPr_picture:
- case NS_ooxml::LN_CT_SdtPr_citation:
- case NS_ooxml::LN_CT_SdtPr_group:
- case NS_ooxml::LN_CT_SdtPr_id:
- case NS_ooxml::LN_CT_SdtPr_alias:
- case NS_ooxml::LN_CT_SdtPlaceholder_docPart:
- case NS_ooxml::LN_CT_SdtPr_showingPlcHdr:
- case NS_ooxml::LN_CT_SdtPr_color:
- case NS_ooxml::LN_CT_SdtPr_appearance:
- case NS_ooxml::LN_CT_SdtPr_tag:
- case NS_ooxml::LN_CT_SdtPr_tabIndex:
- case NS_ooxml::LN_CT_SdtPr_lock:
- {
- if (!m_pImpl->GetSdtStarts().empty())
- {
- if (nSprmId == NS_ooxml::LN_CT_SdtPr_showingPlcHdr)
- {
- if (nIntValue)
- m_pImpl->m_pSdtHelper->SetShowingPlcHdr();
- }
-
- if (nSprmId == NS_ooxml::LN_CT_SdtPr_color)
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- pProperties->resolve(*this);
- }
- break;
- }
-
- if (nSprmId == NS_ooxml::LN_CT_SdtPr_appearance)
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- pProperties->resolve(*this);
- }
- break;
- }
-
- if (nSprmId == NS_ooxml::LN_CT_SdtPr_alias)
- {
- m_pImpl->m_pSdtHelper->SetAlias(sStringValue);
- break;
- }
-
- if (nSprmId == NS_ooxml::LN_CT_SdtPr_tag)
- {
- m_pImpl->m_pSdtHelper->SetTag(sStringValue);
- break;
- }
-
- if (nSprmId == NS_ooxml::LN_CT_SdtPr_id)
- {
- m_pImpl->m_pSdtHelper->SetId(nIntValue);
- break;
- }
-
- if (nSprmId == NS_ooxml::LN_CT_SdtPr_tabIndex)
- {
- m_pImpl->m_pSdtHelper->SetTabIndex(nIntValue);
- break;
- }
-
- if (nSprmId == NS_ooxml::LN_CT_SdtPr_lock)
- {
- m_pImpl->m_pSdtHelper->SetLock(sStringValue);
- break;
- }
-
- if (nSprmId == NS_ooxml::LN_CT_SdtPr_checkbox)
- {
- m_pImpl->m_pSdtHelper->setControlType(SdtControlType::checkBox);
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- pProperties->resolve(*this);
- }
- break;
- }
- else if (nSprmId == NS_ooxml::LN_CT_SdtPr_picture)
- {
- m_pImpl->m_pSdtHelper->setControlType(SdtControlType::picture);
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- pProperties->resolve(*this);
- }
- break;
- }
- else if (nSprmId == NS_ooxml::LN_CT_SdtPr_date)
- {
- m_pImpl->m_pSdtHelper->setControlType(SdtControlType::datePicker);
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- pProperties->resolve(*this);
- }
- break;
- }
- }
-
- // this is an unsupported SDT property, create a grab bag for it
- OUString sName;
- switch (nSprmId)
- {
- case NS_ooxml::LN_CT_SdtPr_dataBinding: sName = "ooxml:CT_SdtPr_dataBinding"; break;
- case NS_ooxml::LN_CT_SdtPr_equation: sName = "ooxml:CT_SdtPr_equation"; break;
- case NS_ooxml::LN_CT_SdtPr_checkbox: sName = "ooxml:CT_SdtPr_checkbox"; break;
- case NS_ooxml::LN_CT_SdtPr_docPartObj: sName = "ooxml:CT_SdtPr_docPartObj"; break;
- case NS_ooxml::LN_CT_SdtPr_docPartList: sName = "ooxml:CT_SdtPr_docPartList"; break;
- case NS_ooxml::LN_CT_SdtPr_picture: sName = "ooxml:CT_SdtPr_picture"; break;
- case NS_ooxml::LN_CT_SdtPr_citation: sName = "ooxml:CT_SdtPr_citation"; break;
- case NS_ooxml::LN_CT_SdtPr_group: sName = "ooxml:CT_SdtPr_group"; break;
- case NS_ooxml::LN_CT_SdtPr_id: sName = "ooxml:CT_SdtPr_id"; break;
- case NS_ooxml::LN_CT_SdtPr_alias: sName = "ooxml:CT_SdtPr_alias"; break;
- case NS_ooxml::LN_CT_SdtPr_tag: sName = "ooxml:CT_SdtPr_tag"; break;
- case NS_ooxml::LN_CT_SdtPr_tabIndex: sName = "ooxml:CT_SdtPr_tabIndex"; break;
- case NS_ooxml::LN_CT_SdtPr_lock: sName = "ooxml:CT_SdtPr_lock"; break;
- case NS_ooxml::LN_CT_SdtPlaceholder_docPart: sName = "ooxml:CT_SdtPlaceholder_docPart"; break;
- case NS_ooxml::LN_CT_SdtPr_showingPlcHdr: sName = "ooxml:CT_SdtPr_showingPlcHdr"; break;
- case NS_ooxml::LN_CT_SdtPr_color: sName = "ooxml:CT_SdtPr_color"; break;
- case NS_ooxml::LN_CT_SdtPr_appearance: sName = "ooxml:CT_SdtPr_appearance"; break;
- default: assert(false);
- };
- if (
- nSprmId == NS_ooxml::LN_CT_SdtPr_checkbox ||
- nSprmId == NS_ooxml::LN_CT_SdtPr_docPartObj ||
- nSprmId == NS_ooxml::LN_CT_SdtPr_docPartList ||
- nSprmId == NS_ooxml::LN_CT_SdtPr_picture ||
- nSprmId == NS_ooxml::LN_CT_SdtPr_citation)
- {
- m_pImpl->m_pSdtHelper->setControlType(SdtControlType::unsupported);
- }
- enableInteropGrabBag(sName);
-
- // process subitems
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- pProperties->resolve(*this);
-
- if (nSprmId == NS_ooxml::LN_CT_SdtPr_alias || nSprmId == NS_ooxml::LN_CT_SdtPr_tag
- || nSprmId == NS_ooxml::LN_CT_SdtPr_lock)
- {
- // Grabbag string values
- beans::PropertyValue aValue;
- aValue.Name = sName;
- aValue.Value <<= sStringValue;
- m_pImpl->m_pSdtHelper->appendToInteropGrabBag(aValue);
- }
- else if (nSprmId == NS_ooxml::LN_CT_SdtPr_showingPlcHdr)
- {
- // Grabbag boolean values
- beans::PropertyValue aValue;
- aValue.Name = sName;
- aValue.Value <<= bool(nIntValue);
- m_pImpl->m_pSdtHelper->appendToInteropGrabBag(aValue);
- }
- else if (nSprmId == NS_ooxml::LN_CT_SdtPr_id || nSprmId == NS_ooxml::LN_CT_SdtPr_tabIndex)
- {
- // Grabbag integer values
- beans::PropertyValue aValue;
- aValue.Name = sName;
- aValue.Value <<= nIntValue;
- m_pImpl->m_pSdtHelper->appendToInteropGrabBag(aValue);
- }
- else
- m_pImpl->m_pSdtHelper->appendToInteropGrabBag(getInteropGrabBag());
- m_pImpl->m_pSdtHelper->setOutsideAParagraph(m_pImpl->IsOutsideAParagraph());
- m_pImpl->disableInteropGrabBag();
- }
- break;
- case NS_ooxml::LN_CT_SdtCheckbox_checked:
- if (!m_pImpl->GetSdtStarts().empty())
- {
- // nIntValue is not just 0 or 1, because we're in the w14 namespace's ST_OnOff.
- if (nIntValue == NS_ooxml::LN_ST_OnOff_true || nIntValue == NS_ooxml::LN_ST_OnOff_1)
- {
- m_pImpl->m_pSdtHelper->SetChecked();
- }
- }
- else
- {
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_SdtCheckbox_checked",
- TextEffectsHandler::getOnOffString(nIntValue));
- }
- break;
- case NS_ooxml::LN_CT_SdtCheckbox_checkedState:
- if (!m_pImpl->GetSdtStarts().empty())
- {
- m_pImpl->m_pSdtHelper->SetCheckedState(OUString(sal_Unicode(sStringValue.toInt32(16))));
- }
- else
- {
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_SdtCheckbox_checkedState",
- sStringValue);
- }
- break;
- case NS_ooxml::LN_CT_SdtCheckbox_uncheckedState:
- if (!m_pImpl->GetSdtStarts().empty())
- {
- m_pImpl->m_pSdtHelper->SetUncheckedState(
- OUString(sal_Unicode(sStringValue.toInt32(16))));
- }
- else
- {
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag,
- "ooxml:CT_SdtCheckbox_uncheckedState", sStringValue);
- }
- break;
- case NS_ooxml::LN_CT_SdtDocPart_docPartGallery:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_SdtDocPart_docPartGallery", sStringValue);
- break;
- case NS_ooxml::LN_CT_SdtDocPart_docPartCategory:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_SdtDocPart_docPartCategory", sStringValue);
- break;
- case NS_ooxml::LN_CT_SdtDocPart_docPartUnique:
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_SdtDocPart_docPartUnique", sStringValue);
- break;
- case NS_ooxml::LN_EG_SectPrContents_pgNumType:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- pProperties->resolve(*this);
- }
- }
- break;
- case NS_ooxml::LN_tblStart:
- {
- /*
- * Hack for Importing Section Properties
- * LO is not able to import section properties if first element in the
- * section is a table. So in case first element is a table add a dummy para
- * and remove it again when lcl_endSectionGroup is called
- */
- if (m_pImpl->m_StreamStateStack.top().nTableDepth == 0
- && m_pImpl->GetIsFirstParagraphInSection()
- && !m_pImpl->GetIsDummyParaAddedForTableInSection() && !m_pImpl->GetIsTextFrameInserted()
- && !m_pImpl->GetIsPreviousParagraphFramed() && !IsInHeaderFooter())
- {
- m_pImpl->AddDummyParaForTableInSection();
- }
-
- // if first paragraph style in table has break-before-page, transfer that setting to the table itself.
- if (m_pImpl->m_StreamStateStack.top().nTableDepth == 0)
- {
- const uno::Any aBreakType(style::BreakType_PAGE_BEFORE);
- const PropertyMapPtr pParagraphProps = m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH);
- if( pParagraphProps && pParagraphProps->isSet(PROP_PARA_STYLE_NAME) )
- {
- StyleSheetEntryPtr pStyle;
- OUString sStyleName;
- pParagraphProps->getProperty(PROP_PARA_STYLE_NAME)->second >>= sStyleName;
- if( !sStyleName.isEmpty() && GetStyleSheetTable() )
- pStyle = GetStyleSheetTable()->FindStyleSheetByConvertedStyleName( sStyleName );
-
- if( pStyle && pStyle->m_pProperties
- && pStyle->m_pProperties->isSet(PROP_BREAK_TYPE)
- && pStyle->m_pProperties->getProperty(PROP_BREAK_TYPE)->second == aBreakType )
- {
- pParagraphProps->Insert(PROP_BREAK_TYPE, aBreakType);
- }
- }
- }
-
- m_pImpl->m_StreamStateStack.top().nTableDepth++;
- }
- break;
- case NS_ooxml::LN_tblEnd:
- m_pImpl->m_StreamStateStack.top().nTableDepth--;
- break;
- case NS_ooxml::LN_tcStart:
- m_pImpl->m_StreamStateStack.top().nTableCellDepth++;
- break;
- case NS_ooxml::LN_tcEnd:
- m_pImpl->m_StreamStateStack.top().nTableCellDepth--;
- break;
- case NS_ooxml::LN_glow_glow:
- case NS_ooxml::LN_shadow_shadow:
- case NS_ooxml::LN_reflection_reflection:
- case NS_ooxml::LN_textOutline_textOutline:
- case NS_ooxml::LN_textFill_textFill:
- case NS_ooxml::LN_scene3d_scene3d:
- case NS_ooxml::LN_props3d_props3d:
- case NS_ooxml::LN_ligatures_ligatures:
- case NS_ooxml::LN_numForm_numForm:
- case NS_ooxml::LN_numSpacing_numSpacing:
- case NS_ooxml::LN_stylisticSets_stylisticSets:
- case NS_ooxml::LN_cntxtAlts_cntxtAlts:
- {
- tools::SvRef<TextEffectsHandler> pTextEffectsHandlerPtr( new TextEffectsHandler(nSprmId) );
- std::optional<PropertyIds> aPropertyId = pTextEffectsHandlerPtr->getGrabBagPropertyId();
- if(aPropertyId)
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- pProperties->resolve(*pTextEffectsHandlerPtr);
-
- beans::PropertyValue aGrabBag = pTextEffectsHandlerPtr->getInteropGrabBag();
- rContext->Insert(*aPropertyId, uno::Any(aGrabBag), true, CHAR_GRAB_BAG);
-
- sal_Int16 nTransparency = TextEffectsHandler::GetTextFillSolidFillAlpha(aGrabBag);
- if (nTransparency != 0)
- {
- rContext->Insert(PROP_CHAR_TRANSPARENCE, uno::Any(nTransparency));
- }
- }
- else if (nSprmId == NS_ooxml::LN_cntxtAlts_cntxtAlts)
- {
- pTextEffectsHandlerPtr->lcl_sprm(rSprm);
- beans::PropertyValue aGrabBag = pTextEffectsHandlerPtr->getInteropGrabBag();
- rContext->Insert(*aPropertyId, uno::Any(aGrabBag), true, CHAR_GRAB_BAG);
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_SdtPr_rPr:
- {
- // Make sure properties from a previous SDT are not merged with the current ones.
- m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear();
- }
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblLook:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- pProperties->resolve(*this);
- m_pImpl->getTableManager().finishTableLook();
- }
- }
- break;
- case NS_ooxml::LN_CT_TrPrBase_cnfStyle:
- {
- m_pImpl->enableInteropGrabBag("cnfStyle");
- resolveSprmProps(*this, rSprm);
-
- TablePropertyMapPtr pPropMap(new TablePropertyMap());
- pPropMap->Insert(PROP_ROW_CNF_STYLE, uno::Any(comphelper::containerToSequence(m_pImpl->m_aInteropGrabBag)), true, ROW_GRAB_BAG);
- m_pImpl->getTableManager().insertRowProps(pPropMap);
-
- m_pImpl->disableInteropGrabBag();
- }
- break;
- case NS_ooxml::LN_CT_TcPrBase_cnfStyle:
- {
- m_pImpl->enableInteropGrabBag("cnfStyle");
- resolveSprmProps(*this, rSprm);
-
- TablePropertyMapPtr pPropMap(new TablePropertyMap());
- pPropMap->Insert(PROP_CELL_CNF_STYLE, uno::Any(comphelper::containerToSequence(m_pImpl->m_aInteropGrabBag)), true, CELL_GRAB_BAG);
- m_pImpl->getTableManager().cellProps(pPropMap);
-
- m_pImpl->disableInteropGrabBag();
- }
- break;
- case NS_ooxml::LN_CT_PPrBase_cnfStyle:
- {
- m_pImpl->enableInteropGrabBag("cnfStyle");
- resolveSprmProps(*this, rSprm);
- rContext->Insert(PROP_PARA_CNF_STYLE, uno::Any(comphelper::containerToSequence(m_pImpl->m_aInteropGrabBag)), true, PARA_GRAB_BAG);
- m_pImpl->disableInteropGrabBag();
- }
- break;
- case NS_ooxml::LN_EG_RunInnerContent_sym:
- {
- resolveSprmProps(*this, rSprm);
- SymbolData aSymbolData = m_pImpl->GetSymbolData();
- uno::Any aVal( aSymbolData.sFont );
- auto xFootnote = rContext->GetFootnote();
- if (!xFootnote.is() && m_pImpl->IsInCustomFootnote())
- xFootnote = m_pImpl->GetFootnoteContext()->GetFootnote();
- if (xFootnote.is())
- {
- // DOCX can have different labels for the footnote reference and the footnote area.
- // This skips the one from the footnote area and just uses the reference one.
- if (!m_pImpl->IsInFootOrEndnote())
- {
- auto xAnchorRange = xFootnote->getAnchor();
- auto xAnchorCursor(xAnchorRange->getText()->createTextCursorByRange(xAnchorRange));
-
- // append a dummy character, so the following properties will be set as
- // as SwpHints::SwTextAttr instead of the SwAttrSet of the paragraph,
- // which would be removed by SwXText::Impl::finishOrAppendParagraph
- xAnchorCursor->collapseToEnd();
- uno::Reference<text::XTextRange> xHackRange(xAnchorCursor, uno::UNO_QUERY);
- xHackRange->setString("x");
-
- uno::Reference<beans::XPropertySet> xAnchorProps(xAnchorRange, uno::UNO_QUERY);
- xAnchorProps->setPropertyValue(getPropertyName(PROP_CHAR_FONT_NAME), aVal);
- xAnchorProps->setPropertyValue(getPropertyName(PROP_CHAR_FONT_NAME_ASIAN), aVal);
- xAnchorProps->setPropertyValue(getPropertyName(PROP_CHAR_FONT_NAME_COMPLEX), aVal);
- xAnchorProps->setPropertyValue(getPropertyName(PROP_CHAR_FONT_CHAR_SET), uno::Any(awt::CharSet::SYMBOL));
-
- // remove the dummy char
- xHackRange->setString("");
-
- OUString sLabel = xFootnote->getLabel() + OUStringChar(aSymbolData.cSymbol);
- xFootnote->setLabel(sLabel);
- }
- }
- else //it's a _real_ symbol
- {
- rContext->Insert(PROP_CHAR_FONT_NAME, aVal);
- rContext->Insert(PROP_CHAR_FONT_NAME_ASIAN, aVal);
- rContext->Insert(PROP_CHAR_FONT_NAME_COMPLEX, aVal);
- rContext->Insert(PROP_CHAR_FONT_CHAR_SET, uno::Any(awt::CharSet::SYMBOL));
- utext(&(aSymbolData.cSymbol), 1);
- }
- }
- break;
- case NS_ooxml::LN_EG_RunInnerContent_ruby:
- {
- RubyInfo aInfo ;
- m_pImpl->SetRubyInfo(aInfo);
- }
- break;
- case NS_ooxml::LN_CT_RubyPr:
- case NS_ooxml::LN_CT_Ruby_rt:
- case NS_ooxml::LN_CT_Ruby_rubyBase:
- {
- m_pImpl->SetRubySprmId(nSprmId);
- if (nSprmId == NS_ooxml::LN_CT_RubyPr)
- {
- resolveSprmProps(*this, rSprm);
- }
- }
- break;
- case NS_ooxml::LN_EG_RubyContent_r:
- {
- const RubyInfo & aInfo = m_pImpl->GetRubyInfo();
- if (aInfo.nSprmId == NS_ooxml::LN_CT_Ruby_rubyBase)
- {
- rContext->Insert(PROP_RUBY_TEXT, uno::Any(aInfo.sRubyText));
- rContext->Insert(PROP_RUBY_STYLE, uno::Any(aInfo.sRubyStyle));
- rContext->Insert(PROP_RUBY_ADJUST, uno::Any(static_cast<sal_Int16>(ConversionHelper::convertRubyAlign(aInfo.nRubyAlign))));
- if ( aInfo.nRubyAlign == NS_ooxml::LN_Value_ST_RubyAlign_rightVertical )
- rContext->Insert(PROP_RUBY_POSITION, uno::Any(css::text::RubyPosition::INTER_CHARACTER));
-
- m_pImpl->SetRubySprmId(0);
- }
- }
- break;
- case NS_ooxml::LN_CT_RubyPr_rubyAlign:
- case NS_ooxml::LN_CT_RubyPr_hps:
- case NS_ooxml::LN_CT_RubyPr_hpsBaseText:
- {
- RubyInfo aInfo = m_pImpl->GetRubyInfo();
- switch(nSprmId)
- {
- case NS_ooxml::LN_CT_RubyPr_rubyAlign:
- aInfo.nRubyAlign = nIntValue;
- break;
- case NS_ooxml::LN_CT_RubyPr_hps:
- aInfo.nHps= nIntValue;
- break;
- case NS_ooxml::LN_CT_RubyPr_hpsBaseText:
- aInfo.nHpsBaseText = nIntValue;
- break;
- }
- m_pImpl->SetRubyInfo(aInfo);
- }
- break;
- case NS_ooxml::LN_CT_SmartTagRun_smartTagPr:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties && m_pImpl->GetTopContextType() == CONTEXT_PARAGRAPH)
- pProperties->resolve(m_pImpl->getSmartTagHandler());
- }
- break;
- case NS_ooxml::LN_CT_DocPartPr_name:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_CT_DocPartPr_category:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_CT_DocPartCategory_gallery:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_EG_RunInnerContent_instrText:
- {
- m_pImpl->SetIsTextDeleted(false);
- }
- break;
- case NS_ooxml::LN_EG_RunInnerContent_delText:
- case NS_ooxml::LN_EG_RunInnerContent_delInstrText:
- {
- m_pImpl->SetIsTextDeleted(true);
- }
- break;
- default:
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("unhandled");
- TagLogger::getInstance().attribute("id", nSprmId);
- TagLogger::getInstance().attribute("name", rSprm.getName());
- TagLogger::getInstance().endElement();
-#endif
- }
- }
-}
-
-void DomainMapper::ProcessDeferredStyleCharacterProperties()
-{
- assert(m_pImpl->GetTopContextType() == CONTEXT_STYLESHEET);
- m_pImpl->processDeferredCharacterProperties(false);
-}
-
-void DomainMapper::processDeferredCharacterProperties(
- const std::map<sal_Int32, uno::Any>& deferredCharacterProperties, bool bCharContext)
-{
- if (bCharContext)
- {
- assert(m_pImpl->GetTopContextType() == CONTEXT_CHARACTER);
- }
- PropertyMapPtr rContext = m_pImpl->GetTopContext();
- for( const auto& rProp : deferredCharacterProperties )
- {
- sal_Int32 Id = rProp.first;
- sal_Int32 nIntValue = 0;
- OUString sStringValue;
- rProp.second >>= nIntValue;
- rProp.second >>= sStringValue;
- switch( Id )
- {
- case NS_ooxml::LN_EG_RPrBase_position:
- {
- double nEscapement = 0;
- sal_Int8 nProp = 0;
- if ( nIntValue )
- {
- nProp = 100;
- double fFontSize = 0;
- m_pImpl->GetAnyProperty(PROP_CHAR_HEIGHT, rContext) >>= fFontSize;
- if ( fFontSize )
- // nIntValue is in half-points, fontsize is in points, escapement is a percentage.
- nEscapement = round( nIntValue/2.0 / fFontSize * 100 );
- else
- nEscapement = nIntValue > 0 ? DFLT_ESC_SUPER : DFLT_ESC_SUB;
- }
- if ( nEscapement > MAX_ESC_POS )
- nEscapement = MAX_ESC_POS;
- else if ( nEscapement < -MAX_ESC_POS )
- nEscapement = -MAX_ESC_POS;
-
- rContext->Insert(PROP_CHAR_ESCAPEMENT, uno::Any( sal_Int16(nEscapement) ) );
- rContext->Insert(PROP_CHAR_ESCAPEMENT_HEIGHT, uno::Any( nProp ) );
- }
- break;
- default:
- SAL_WARN( "writerfilter", "Unhandled property in processDeferredCharacterProperty()" );
- break;
- }
- }
-}
-
-void DomainMapper::lcl_entry(const writerfilter::Reference<Properties>::Pointer_t& ref)
-{
- ref->resolve(*this);
-}
-
-void DomainMapper::data(const sal_uInt8* /*buf*/, size_t /*len*/)
-{
-}
-
-void DomainMapper::lcl_startSectionGroup()
-{
- if (!m_pImpl->isInIndexContext() && !m_pImpl->isInBibliographyContext())
- {
- m_pImpl->PushProperties(CONTEXT_SECTION);
- }
- m_pImpl->SetIsFirstParagraphInSection(true);
- m_pImpl->SetIsFirstParagraphInSectionAfterRedline(true);
-}
-
-void DomainMapper::lcl_endSectionGroup()
-{
- if (m_pImpl->isInIndexContext() || m_pImpl->isInBibliographyContext())
- return;
-
- m_pImpl->CheckUnregisteredFrameConversion();
- m_pImpl->ExecuteFrameConversion();
- // When pasting, it's fine to not have any paragraph inside the document at all.
- if (m_pImpl->GetIsFirstParagraphInSection() && m_pImpl->IsNewDoc())
- {
- // This section has no paragraph at all (e.g. they are all actually in a frame).
- // If this section has a page break, there would be nothing to apply to the page
- // style, so force a dummy paragraph.
- lcl_startParagraphGroup();
- lcl_startCharacterGroup();
- sal_Unicode const sBreak[] = { 0x0d };
- lcl_utext(sBreak, 1);
- lcl_endCharacterGroup();
- lcl_endParagraphGroup();
- }
- PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_SECTION);
- SectionPropertyMap* pSectionContext = dynamic_cast< SectionPropertyMap* >( pContext.get() );
- OSL_ENSURE(pSectionContext, "SectionContext unavailable!");
- if(pSectionContext)
- {
- pSectionContext->CloseSectionGroup( *m_pImpl );
- // Remove the dummy paragraph if added for
- // handling the section properties if section starts with a table
- // tdf#135786: Added annotation condition
- if (m_pImpl->GetIsDummyParaAddedForTableInSection() && (m_pImpl->GetAnnotationId() < 0))
- m_pImpl->RemoveDummyParaForTableInSection();
- }
- m_pImpl->SetIsTextFrameInserted( false );
- m_pImpl->PopProperties(CONTEXT_SECTION);
-}
-
-void DomainMapper::lcl_startParagraphGroup()
-{
- if (m_pImpl->hasTableManager())
- m_pImpl->getTableManager().startParagraphGroup();
- /*
- * Add new para properties only if paragraph is not split
- * or the top context is not of paragraph properties
- * Set mbIsSplitPara to false as it has been handled
- */
- if (!mbIsSplitPara)
- m_pImpl->PushProperties(CONTEXT_PARAGRAPH);
- mbIsSplitPara = false;
- if (m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH) != m_pImpl->GetTopContext())
- m_pImpl->PushProperties(CONTEXT_PARAGRAPH);
-
- if (!m_pImpl->IsInShape() && !m_pImpl->IsInComments())
- {
- if (m_pImpl->GetTopContext())
- {
- const OUString& sDefaultParaStyle = m_pImpl->GetDefaultParaStyleName();
- auto pContext = static_cast<ParagraphPropertyMap*>(m_pImpl->GetTopContext().get());
- m_pImpl->GetTopContext()->Insert( PROP_PARA_STYLE_NAME, uno::Any( sDefaultParaStyle ) );
- m_pImpl->SetCurrentParaStyleName( sDefaultParaStyle );
-
- if (m_pImpl->isBreakDeferred(PAGE_BREAK))
- {
- m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_PAGE_BEFORE));
-
- // With a w:br at the start of a paragraph, compat14 apparently doesn't apply.
- // It works to insert a zero margin before importing paragraph properties because
- // TopMargin typically imports without overwrite any existing value. Very handy.
- pContext->Insert(PROP_PARA_TOP_MARGIN, uno::Any(sal_uInt32(0)));
- }
- else if (m_pImpl->isBreakDeferred(COLUMN_BREAK))
- {
- m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_COLUMN_BEFORE));
-
- if (GetSettingsTable()->GetWordCompatibilityMode() > 14)
- {
- pContext->Insert(PROP_PARA_TOP_MARGIN, uno::Any(sal_uInt32(0)));
- }
- }
-
- mbWasShapeInPara = false;
- }
- m_pImpl->clearDeferredBreaks();
- }
-
- if (m_pImpl->isParaSdtEndDeferred() && m_pImpl->GetTopContext())
- m_pImpl->GetTopContext()->Insert(PROP_PARA_SDT_END_BEFORE, uno::Any(true), true, PARA_GRAB_BAG);
- m_pImpl->setParaSdtEndDeferred(false);
-
- m_pImpl->SetIsFirstRun(true);
- m_pImpl->SetIsOutsideAParagraph(false);
-}
-
-void DomainMapper::lcl_endParagraphGroup()
-{
- if (m_pImpl->isBreakDeferred(LINE_BREAK))
- {
- if (m_pImpl->GetIsLastParagraphInSection())
- m_pImpl->clearDeferredBreak(LINE_BREAK);
-
- while (m_pImpl->isBreakDeferred(LINE_BREAK))
- {
- m_pImpl->clearDeferredBreak(LINE_BREAK);
- m_pImpl->appendTextPortion("\n", m_pImpl->GetTopContext());
- }
- }
-
- m_pImpl->PopProperties(CONTEXT_PARAGRAPH);
- if (m_pImpl->hasTableManager())
- m_pImpl->getTableManager().endParagraphGroup();
- //frame conversion has to be executed after table conversion
- m_pImpl->ExecuteFrameConversion();
- m_pImpl->SetIsOutsideAParagraph(true);
-}
-
-void DomainMapper::markLastParagraphInSection( )
-{
- m_pImpl->SetIsLastParagraphInSection( true );
-}
-
-void DomainMapper::markLastSectionGroup( )
-{
- m_pImpl->SetIsLastSectionGroup( true );
-}
-
-void DomainMapper::lcl_startShape(uno::Reference<drawing::XShape> const& xShape)
-{
- assert(xShape.is());
-
- m_pImpl->AttachTextBoxContentToShape(xShape);
- if (m_pImpl->GetTopContext())
- {
- // If there is a deferred page break, handle it now, so that the
- // started shape will be on the correct page.
- if (m_pImpl->isBreakDeferred(PAGE_BREAK))
- {
- m_pImpl->clearDeferredBreak(PAGE_BREAK);
- lcl_startCharacterGroup();
- sal_Unicode const sBreak[] = { 0x0d };
- lcl_utext(sBreak, 1);
- lcl_endCharacterGroup();
- lcl_endParagraphGroup();
- lcl_startParagraphGroup();
- m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_PAGE_BEFORE));
- }
- m_pImpl->PushShapeContext( xShape );
- lcl_startParagraphGroup();
- }
- else
- {
- // No context? Then this image should not appear directly inside the
- // document, just save it for later usage.
- m_pImpl->PushPendingShape(xShape);
- }
-
- m_pImpl->SetIsFirstParagraphInShape(true);
- mbWasShapeInPara = true;
-}
-
-void DomainMapper::lcl_endShape( )
-{
- if (!m_pImpl->GetTopContext())
- return;
-
- // End the current table, if there are any. Otherwise the unavoidable
- // empty paragraph at the end of the shape text will cause problems: if
- // the shape text ends with a table, the extra paragraph will be
- // handled as an additional row of the ending table.
- if (m_pImpl->hasTableManager())
- m_pImpl->getTableManager().endTable();
-
- lcl_endParagraphGroup();
- m_pImpl->PopShapeContext( );
- // A shape is always inside a paragraph (anchored or inline).
- m_pImpl->SetIsOutsideAParagraph(false);
-}
-
-void DomainMapper::lcl_startTextBoxContent()
-{
- m_pImpl->PushTextBoxContent();
-}
-
-void DomainMapper::lcl_endTextBoxContent()
-{
- m_pImpl->PopTextBoxContent();
-}
-
-void DomainMapper::PushStyleSheetProperties( const PropertyMapPtr& pStyleProperties, bool bAffectTableMngr )
-{
- m_pImpl->PushStyleProperties( pStyleProperties );
- if ( bAffectTableMngr )
- m_pImpl->getTableManager( ).SetStyleProperties( pStyleProperties );
-}
-
-void DomainMapper::PopStyleSheetProperties( bool bAffectTableMngr )
-{
- m_pImpl->PopProperties( CONTEXT_STYLESHEET );
- if ( bAffectTableMngr )
- {
- PropertyMapPtr emptyPtr;
- m_pImpl->getTableManager( ).SetStyleProperties( emptyPtr );
- }
-}
-
-void DomainMapper::PushListProperties( const ::tools::SvRef<PropertyMap>& pListProperties )
-{
- m_pImpl->PushListProperties( pListProperties );
-}
-
-void DomainMapper::PopListProperties()
-{
- m_pImpl->PopProperties( CONTEXT_LIST );
-}
-
-void DomainMapper::lcl_startCharacterGroup()
-{
- m_pImpl->PushProperties(CONTEXT_CHARACTER);
- if (m_pImpl->isSdtEndDeferred())
- {
- // Fields have an empty character group before the real one, so don't
- // call setSdtEndDeferred(false) here, that will happen only in lcl_utext().
- m_pImpl->GetTopContext()->Insert(PROP_SDT_END_BEFORE, uno::Any(true), true, CHAR_GRAB_BAG);
- }
-}
-
-void DomainMapper::lcl_endCharacterGroup()
-{
- if (m_pImpl->CheckFootnoteStyle())
- {
- m_pImpl->SetCheckFootnoteStyle(m_pImpl->IsInCustomFootnote());
- m_pImpl->SetHasFootnoteStyle(false);
- }
- m_pImpl->PopProperties(CONTEXT_CHARACTER);
-}
-
-//copied from rtfsprm
-/// Is it problematic to deduplicate this SPRM?
-static bool isSPRMDeduplicateDenylist(PropertyIds nId, PropertyMapPtr pContext)
-{
- switch (nId)
- {
- // See the NS_ooxml::LN_CT_PPrBase_tabs handler in DomainMapper,
- // deduplication is explicitly not wanted for these tokens.
- case PROP_PARA_TAB_STOPS:
- case PROP_PARA_LINE_SPACING:
- return true;
- case PROP_TOP_BORDER:
- case PROP_LEFT_BORDER:
- case PROP_BOTTOM_BORDER:
- case PROP_RIGHT_BORDER:
- case META_PROP_HORIZONTAL_BORDER:
- case META_PROP_VERTICAL_BORDER:
- return true;
- // Removing \fi and \li if the style has the same value would mean taking these values from
- // \ls, while deduplication would be done to take the values from the style.
- case PROP_PARA_FIRST_LINE_INDENT:
- case PROP_PARA_LEFT_MARGIN:
- return pContext && pContext->getProperty(PROP_NUMBERING_RULES);
-
- default:
- return false;
- }
-}
-
-void DomainMapper::lcl_text(const sal_uInt8 * data_, size_t len)
-{
- //TODO: Determine the right text encoding (FIB?)
- OUString sText( reinterpret_cast<const char*>(data_), len, RTL_TEXTENCODING_MS_1252 );
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("text");
- TagLogger::getInstance().chars(sText);
- TagLogger::getInstance().endElement();
-#endif
-
- try
- {
- if(len == 1)
- {
- switch(*data_)
- {
- case 0x02: return; //footnote character
- case 0x08: // Lock field if in field context
- if (m_pImpl->IsOpenField())
- m_pImpl->SetFieldLocked();
- return;
- case 0x0c: //page break
- // page breaks aren't supported in footnotes and endnotes
- if (!m_pImpl->IsInFootOrEndnote())
- m_pImpl->deferBreak(PAGE_BREAK);
- return;
- case 0x0e: //column break
- m_pImpl->deferBreak(COLUMN_BREAK);
- return;
- case 0x0a: //line break
- if (m_pImpl->GetIsLastParagraphInSection())
- {
- m_pImpl->deferBreak(LINE_BREAK);
- return;
- }
- break;
- case 0x07:
- m_pImpl->getTableManager().text(data_, len);
- return;
- case 0x0d:
- {
- assert(!"paragraph break is handled by utext() now");
- return;
- }
- case cFieldStart:
- m_pImpl->PushFieldContext();
- return;
- case cFieldSep:
- // delimiter not necessarily available
- // appears only if field contains further content
- m_pImpl->CloseFieldCommand();
- return;
- case cFieldEnd:
- m_pImpl->PopFieldContext();
- return;
- default:
- break;
- }
- }
-
- // GetTopContext() is changed by inserted breaks, but we want to keep the current context
- PropertyMapPtr pContext = m_pImpl->GetTopContext();
-
- while (m_pImpl->isBreakDeferred(LINE_BREAK))
- {
- m_pImpl->clearDeferredBreak(LINE_BREAK);
- m_pImpl->appendTextPortion("\n", pContext);
- }
-
- if (!m_pImpl->GetFootnoteContext() && !m_pImpl->IsInShape() && !m_pImpl->IsInComments())
- {
- if (m_pImpl->isBreakDeferred(PAGE_BREAK))
- m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_PAGE_BEFORE));
- else if (m_pImpl->isBreakDeferred(COLUMN_BREAK))
- m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_COLUMN_BEFORE));
- m_pImpl->clearDeferredBreaks();
- }
-
- if (pContext && pContext->GetFootnote().is() && m_pImpl->IsInCustomFootnote())
- {
- pContext->GetFootnote()->setLabel(sText);
- m_pImpl->EndCustomFootnote();
- //otherwise ignore sText
- }
- else if (m_pImpl->IsOpenFieldCommand() && !m_pImpl->IsForceGenericFields())
- {
- m_pImpl->AppendFieldCommand(sText);
- }
- else if( m_pImpl->IsOpenField() && m_pImpl->IsFieldResultAsString())
- /*depending on the success of the field insert operation this result will be
- set at the field or directly inserted into the text*/
- m_pImpl->AppendFieldResult(sText);
- else
- {
- if (pContext == nullptr)
- pContext = new PropertyMap();
-
- if (sText == "\n")
- {
- m_pImpl->HandleLineBreak(pContext);
- }
- else
- {
- m_pImpl->appendTextPortion(sText, pContext);
- }
- }
- }
- catch( const uno::RuntimeException& )
- {
- TOOLS_WARN_EXCEPTION("writerfilter", "");
- }
-}
-
-void DomainMapper::lcl_positionOffset(const OUString& rText, bool bVertical)
-{
- if (bVertical)
- m_pImpl->m_aPositionOffsets.second = rText;
- else
- m_pImpl->m_aPositionOffsets.first = rText;
-}
-
-awt::Point DomainMapper::getPositionOffset()
-{
- awt::Point aRet;
- aRet.X = oox::drawingml::convertEmuToHmm(m_pImpl->m_aPositionOffsets.first.toInt32());
- aRet.Y = oox::drawingml::convertEmuToHmm(m_pImpl->m_aPositionOffsets.second.toInt32());
- return aRet;
-}
-
-void DomainMapper::lcl_align(const OUString& rText, bool bVertical)
-{
- if (bVertical)
- m_pImpl->m_aAligns.second = rText;
- else
- m_pImpl->m_aAligns.first = rText;
-}
-
-void DomainMapper::lcl_positivePercentage(const OUString& rText)
-{
- m_pImpl->m_aPositivePercentages.push(rText);
-}
-
-void DomainMapper::lcl_checkId(const sal_Int32 nId)
-{
- if (m_pImpl->IsInFootnote())
- {
- m_pImpl->m_aFootnoteIds.push_back(nId);
- // keep only the first real footnote
- if (m_pImpl->GetFootnoteCount() == -1 && m_pImpl->m_aFootnoteIds.size() == 2)
- m_pImpl->m_aFootnoteIds.pop_front();
- }
- else
- {
- m_pImpl->m_aEndnoteIds.push_back(nId);
- // keep only the first real endnote
- if (m_pImpl->GetEndnoteCount() == -1 && m_pImpl->m_aEndnoteIds.size() == 2)
- m_pImpl->m_aEndnoteIds.pop_front();
- }
-}
-
-void DomainMapper::ResetStyleProperties()
-{
- PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH);
- if (IsRTFImport() && pContext)
- {
- //reset paragraph style properties not repeated at the paragraph
- std::optional<PropertyMap::Property> paraStyleName = pContext->getProperty(PROP_PARA_STYLE_NAME);
- if (paraStyleName.has_value()) {
- OUString uStyleName;
- paraStyleName->second >>= uStyleName;
- StyleSheetEntryPtr pStyleSheet = m_pImpl->GetStyleSheetTable()->FindStyleSheetByConvertedStyleName(uStyleName);
- if (pStyleSheet != nullptr)
- {
- std::vector< PropertyIds > stylePropertyIds = pStyleSheet->m_pProperties->GetPropertyIds();
- std::vector< PropertyIds >::iterator stylePropertyIdsIt = stylePropertyIds.begin();
- while (stylePropertyIdsIt != stylePropertyIds.end())
- {
- PropertyIds ePropertyId = *stylePropertyIdsIt;
- std::optional< PropertyMap::Property > styleProperty = pStyleSheet->m_pProperties->getProperty(ePropertyId);
- std::optional< PropertyMap::Property > paragraphProperty = pContext->getProperty(ePropertyId);
- if (paragraphProperty.has_value()) {
- if (paragraphProperty->second == styleProperty->second &&
- !isSPRMDeduplicateDenylist(ePropertyId, pContext))
- {
- pContext->Erase(ePropertyId);
- }
- }
- else
- {
- switch (ePropertyId)
- {
- case PROP_PARA_LEFT_MARGIN:
- if (!pContext->getProperty(PROP_NUMBERING_RULES))
- {
- pContext->Insert(ePropertyId, uno::Any(0l));
- }
- break;
- case PROP_PARA_RIGHT_MARGIN:
- pContext->Insert(ePropertyId, uno::Any(0l));
- break;
- case PROP_PARA_LAST_LINE_ADJUST:
- case PROP_PARA_ADJUST:
- pContext->Insert(ePropertyId, uno::Any(style::ParagraphAdjust_LEFT));
- break;
- case PROP_PARA_TAB_STOPS:
- pContext->Insert(ePropertyId, uno::Any(uno::Sequence< style::TabStop >()));
- break;
- case PROP_FILL_STYLE:
- pContext->Insert(ePropertyId, uno::Any(drawing::FillStyle_NONE));
- break;
- case PROP_FILL_COLOR:
- pContext->Insert(ePropertyId, uno::Any(sal_Int32(COL_TRANSPARENT)));
- break;
- case INVALID:
- default:
- break;
- }
- }
- ++stylePropertyIdsIt;
- }
- }
- }
- }
-}
-
-void DomainMapper::lcl_utext(const sal_Unicode *const data_, size_t len)
-{
- // All these fixed values are defined as static const sal_Unicode codepoints in the fast parser,
- // like uFtnEdnRef = 0x2, uFtnEdnSep = 0x3, ... and have a len of 1, if they aren't valid unicode.
-
- OUString const sText(data_, len);
- const RubyInfo & aInfo = m_pImpl->GetRubyInfo();
- if (aInfo.nSprmId == NS_ooxml::LN_CT_Ruby_rt)
- {
- PropertyMapPtr pContext = m_pImpl->GetTopContext();
- PropertyValueVector_t aProps = comphelper::sequenceToContainer< PropertyValueVector_t >(pContext->GetPropertyValues());
- OUString sStyle = getOrCreateCharStyle(aProps, /*bAlwaysCreate=*/false);
- m_pImpl->SetRubyText(sText,sStyle);
- return;
- }
-
- if (len == 1)
- {
- if (sText[0] == 0x0d)
- {
- ResetStyleProperties();
- }
-
- // preload all footnotes in separated footnotes
- if (sText[0] == 0x5)
- {
- if (m_pImpl->IsInFootnote())
- {
- if (m_pImpl->GetFootnoteCount() > -1)
- {
- m_pImpl->PopFootOrEndnote();
- m_pImpl->PushFootOrEndnote(/*bIsFootnote=*/true);
- }
- m_pImpl->IncrementFootnoteCount();
- }
- else
- {
- if (m_pImpl->GetEndnoteCount() > -1)
- {
- m_pImpl->PopFootOrEndnote();
- m_pImpl->PushFootOrEndnote(/*bIsFootnote=*/false);
- }
- m_pImpl->IncrementEndnoteCount();
- }
- }
-
- // If the footnote contains a Footnote Reference Mark, it can't be a custom footnote
- // ******
- // This code block is wrong, as it should also be in m_pImpl->IsInFootOrEndnote().
- // The main problem is that
- //
- // assert(len != 1 || sText[0] != 0x2)
- //
- // is triggered by the unit test SwLayoutWriter::testForcepoint75, so all these pseudo
- // value handling is broken.
- // But this is just a symptom, as I guess it's possible to generate broken DOCX documents,
- // which might be problematic, triggering *funny* code paths left and right.
- // ******
- if (sText[0] == 0x2)
- {
- m_pImpl->EndCustomFootnote();
- return;
- }
-
- if (m_pImpl->IsInCustomFootnote())
- {
- if (sText[0] != 0xd && sText[0] != 0x3)
- {
- // DOCX can have different labels for the footnote reference and the footnote area.
- // This skips the one from the footnote area and just uses the reference one.
- if (!m_pImpl->IsInFootOrEndnote())
- {
- if (PropertyMapPtr pFootnoteContext = m_pImpl->GetFootnoteContext())
- {
- auto xFootnote = pFootnoteContext->GetFootnote();
- xFootnote->setLabel(xFootnote->getLabel() + sText);
- }
- }
- return;
- }
- else
- m_pImpl->SetHasFootnoteStyle(true);
- }
- }
-
- if (m_pImpl->isSdtEndDeferred())
- {
- // In case we have a field context, then save the property there, so
- // SDT's ending right before a field start are handled as well.
- PropertyMapPtr pContext = m_pImpl->GetTopContext();
- if (m_pImpl->IsOpenField())
- pContext = m_pImpl->GetTopFieldContext()->getProperties();
- pContext->Insert(PROP_SDT_END_BEFORE, uno::Any(true), true, CHAR_GRAB_BAG);
- m_pImpl->setSdtEndDeferred(false);
- }
-
- bool bNewLine = len == 1 && (sText[0] == 0x0d || sText[0] == 0x07);
- if (m_pImpl->GetSdtStarts().empty()
- && (m_pImpl->m_pSdtHelper->getControlType() == SdtControlType::dropDown
- || m_pImpl->m_pSdtHelper->getControlType() == SdtControlType::comboBox))
- {
- // Block, cell or row SDT.
- if (bNewLine)
- // Dropdown control has single-line texts, so in case of newline, create the control.
- m_pImpl->m_pSdtHelper->createDropDownControl();
- else
- {
- m_pImpl->m_pSdtHelper->getSdtTexts().append(sText);
- return;
- }
- }
- else if (m_pImpl->m_pSdtHelper->getControlType() == SdtControlType::datePicker)
- {
- if (IsInHeaderFooter() && m_pImpl->IsDiscardHeaderFooter())
- {
- m_pImpl->m_pSdtHelper->getDateFormat().truncate();
- m_pImpl->m_pSdtHelper->getLocale().truncate();
- return;
- }
- }
- else if (m_pImpl->m_pSdtHelper->GetSdtType() != NS_ooxml::LN_CT_SdtRun_sdtContent && m_pImpl->m_pSdtHelper->getControlType() == SdtControlType::plainText)
- {
- if (bNewLine)
- {
- m_pImpl->m_pSdtHelper->createPlainTextControl();
- finishParagraph();
- return;
- }
- }
- else if (!m_pImpl->m_pSdtHelper->isInteropGrabBagEmpty())
- {
- // there are unsupported SDT properties in the document
- // save them in the paragraph interop grab bag
- if (m_pImpl->IsDiscardHeaderFooter())
- {
- // Unless we're supposed to ignore this header/footer.
- m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear();
- return;
- }
- if((m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_checkbox") ||
- m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_text") ||
- m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_dataBinding") ||
- m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_citation") ||
- (m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_id") &&
- m_pImpl->m_pSdtHelper->getInteropGrabBagSize() == 1)) && !m_pImpl->m_pSdtHelper->isOutsideAParagraph())
- {
- PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_CHARACTER);
-
- if (m_pImpl->IsOpenField())
- // We have a field, insert the SDT properties to the field's grab-bag, so they won't be lost.
- pContext = m_pImpl->GetTopFieldContext()->getProperties();
-
- uno::Sequence<beans::PropertyValue> aGrabBag = m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear();
- if (m_pImpl->GetSdtStarts().empty()
- || (m_pImpl->m_pSdtHelper->getControlType() != SdtControlType::dropDown
- && m_pImpl->m_pSdtHelper->getControlType() != SdtControlType::comboBox))
- {
- pContext->Insert(PROP_SDTPR, uno::Any(aGrabBag), true, CHAR_GRAB_BAG);
- }
- }
- else
- {
- uno::Sequence<beans::PropertyValue> aGrabBag = m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear();
- if (m_pImpl->GetSdtStarts().empty()
- || (m_pImpl->m_pSdtHelper->getControlType() != SdtControlType::dropDown
- && m_pImpl->m_pSdtHelper->getControlType() != SdtControlType::comboBox
- && m_pImpl->m_pSdtHelper->getControlType() != SdtControlType::richText))
- {
- m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH)->Insert(PROP_SDTPR,
- uno::Any(aGrabBag), true, PARA_GRAB_BAG);
- }
- }
- }
- else if (len == 1 && sText[0] == 0x03)
- {
- // This is the uFtnEdnSep, remember that the document has a separator.
- m_pImpl->m_bHasFtnSep = true;
- return;
- }
- else if (len == 1 && sText[0] == '\r')
- {
- // Clear "last" one linebreak at end of section
- if (m_pImpl->GetIsLastParagraphInSection() && m_pImpl->isBreakDeferred(LINE_BREAK))
- m_pImpl->clearDeferredBreak(LINE_BREAK);
- // And emit all other linebreaks
- while (m_pImpl->isBreakDeferred(LINE_BREAK))
- {
- m_pImpl->clearDeferredBreak(LINE_BREAK);
- m_pImpl->appendTextPortion("\n", m_pImpl->GetTopContext());
- }
- }
- else if (len == 1 && sText[0] == '\t' )
- {
- if (m_pImpl->m_StreamStateStack.top().bCheckFirstFootnoteTab && m_pImpl->IsInFootOrEndnote())
- {
- // Allow MSO to emulate LO footnote text starting at left margin - only meaningful with hanging indent
- m_pImpl->m_StreamStateStack.top().bCheckFirstFootnoteTab = false;
- sal_Int32 nFirstLineIndent = 0;
- m_pImpl->GetAnyProperty(PROP_PARA_FIRST_LINE_INDENT, m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH)) >>= nFirstLineIndent;
- if ( nFirstLineIndent < 0 )
- {
- return;
- }
- }
- }
- if (!m_pImpl->hasTableManager())
- return;
-
- SkipFootnoteSeparator eSkip = m_pImpl->GetSkipFootnoteState();
- if ( eSkip == SkipFootnoteSeparator::ON || eSkip == SkipFootnoteSeparator::SKIPPING )
- {
- m_pImpl->SetSkipFootnoteState( SkipFootnoteSeparator::SKIPPING );
- return;
- }
-
- try
- {
- while (m_pImpl->isBreakDeferred(LINE_BREAK))
- {
- m_pImpl->clearDeferredBreak(LINE_BREAK);
- m_pImpl->appendTextPortion("\n", m_pImpl->GetTopContext());
- }
-
- m_pImpl->getTableManager().utext(data_, len);
-
- if (bNewLine)
- {
- const bool bSingleParagraph = m_pImpl->GetIsFirstParagraphInSection() && m_pImpl->GetIsLastParagraphInSection();
- const bool bSingleParagraphAfterRedline = m_pImpl->GetIsFirstParagraphInSection(/*bAfterRedline=*/true) &&
- m_pImpl->GetIsLastParagraphInSection();
- PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH);
- if (!m_pImpl->GetFootnoteContext() && !m_pImpl->IsInShape() && !m_pImpl->IsInComments())
- {
- if (m_pImpl->isBreakDeferred(PAGE_BREAK))
- {
- assert(pContext); // can't have deferred break without
- if (m_pImpl->GetSettingsTable()->GetSplitPgBreakAndParaMark())
- {
- if ( m_pImpl->GetIsFirstParagraphInSection() || !m_pImpl->IsFirstRun() )
- {
- m_pImpl->m_bIsSplitPara = true;
- finishParagraph();
- lcl_startParagraphGroup();
- }
- else // IsFirstRun
- {
- if (GetSettingsTable()->GetWordCompatibilityMode() > 14)
- {
- pContext->Insert(PROP_PARA_TOP_MARGIN, uno::Any(sal_uInt32(0)));
- }
- }
-
- pContext->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_PAGE_BEFORE));
- m_pImpl->clearDeferredBreaks();
- }
- }
- else if (m_pImpl->isBreakDeferred(COLUMN_BREAK))
- {
- assert(pContext); // can't have deferred break without
- if ( m_pImpl->GetIsFirstParagraphInSection() || !m_pImpl->IsFirstRun() )
- {
- mbIsSplitPara = true;
- m_pImpl->m_bIsSplitPara = true;
- finishParagraph();
- lcl_startParagraphGroup();
- }
- else // IsFirstRun
- {
- if (GetSettingsTable()->GetWordCompatibilityMode() > 14)
- {
- pContext->Insert(PROP_PARA_TOP_MARGIN, uno::Any(sal_uInt32(0)));
- }
- }
-
- pContext->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_COLUMN_BEFORE));
- m_pImpl->clearDeferredBreaks();
- }
- }
-
- // If the paragraph contains only the section properties and it has
- // no runs, we should not create a paragraph for it in Writer, unless that would remove the whole section.
- // Also do not remove here column breaks: they are treated in a different way and place.
- bool bIsColumnBreak = false;
- if (pContext && pContext->isSet(PROP_BREAK_TYPE))
- {
- const uno::Any aBreakType = pContext->getProperty(PROP_BREAK_TYPE)->second;
- bIsColumnBreak =
- aBreakType == style::BreakType_COLUMN_BEFORE ||
- aBreakType == style::BreakType_COLUMN_AFTER ||
- aBreakType == style::BreakType_COLUMN_BOTH;
- }
-
- bool bRemove = (!m_pImpl->GetParaChanged() && m_pImpl->GetRemoveThisPara()) ||
- (!m_pImpl->GetParaChanged() && m_pImpl->GetParaSectpr()
- && !bSingleParagraphAfterRedline
- && !bIsColumnBreak
- && !m_pImpl->GetIsLastSectionGroup() // testContSectionPageBreak
- && !m_pImpl->GetParaHadField()
- && !m_pImpl->GetIsPreviousParagraphFramed()
- && !m_pImpl->HasTopAnchoredObjects()
- && !m_pImpl->IsParaWithInlineObject());
-
- const bool bNoNumbering = bRemove || (!m_pImpl->GetParaChanged() && m_pImpl->GetParaSectpr() && bSingleParagraph);
- PropertyMapPtr xContext = bNoNumbering ? m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH) : PropertyMapPtr();
- if (xContext)
- {
- // tdf#97417 delete numbering of the paragraph
- // it will be deleted anyway, and the numbering would be copied
- // to the next paragraph in sw SplitNode and then be applied to
- // every following paragraph
- xContext->Erase(PROP_NUMBERING_RULES);
- static_cast<ParagraphPropertyMap*>(xContext.get())->props().SetListId(-1);;
- xContext->Erase(PROP_NUMBERING_LEVEL);
- }
- finishParagraph(bRemove, bNoNumbering);
-
- m_pImpl->SetParaSectpr(false);
- }
- else
- {
- // GetTopContext() is changed by inserted breaks, but we want to keep the current context
- PropertyMapPtr pContext = m_pImpl->GetTopContext();
- if (!m_pImpl->GetFootnoteContext() && !m_pImpl->IsInShape() && !m_pImpl->IsInComments())
- {
- auto pPara = static_cast<ParagraphPropertyMap*>(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH).get());
- if (m_pImpl->isBreakDeferred(PAGE_BREAK))
- {
- /* If PAGEBREAK appears in first paragraph of the section or
- * after first run of any paragraph then need to split paragraph
- * to handle it properly.
- */
- if (m_pImpl->GetIsFirstParagraphInSection() || !m_pImpl->IsFirstRun())
- {
- m_pImpl->m_bIsSplitPara = true;
- finishParagraph();
- lcl_startParagraphGroup();
- }
- else // IsFirstRun
- {
- if (GetSettingsTable()->GetWordCompatibilityMode() > 14)
- {
- pPara->Insert(PROP_PARA_TOP_MARGIN, uno::Any(sal_uInt32(0)), true);
- }
- }
- m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_PAGE_BEFORE));
- }
- else if (m_pImpl->isBreakDeferred(COLUMN_BREAK))
- {
- if (m_pImpl->GetIsFirstParagraphInSection() || !m_pImpl->IsFirstRun() || mbWasShapeInPara)
- {
- mbIsSplitPara = true;
- m_pImpl->m_bIsSplitPara = true;
- finishParagraph();
- lcl_startParagraphGroup();
- }
- else // IsFirstRun
- {
- if (GetSettingsTable()->GetWordCompatibilityMode() > 14)
- {
- pPara->Insert(PROP_PARA_TOP_MARGIN, uno::Any(sal_uInt32(0)));
- }
- }
- m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::Any(style::BreakType_COLUMN_BEFORE));
- }
- m_pImpl->clearDeferredBreaks();
- }
-
- bool bInSdtBlockText
- = m_pImpl->m_pSdtHelper->GetSdtType() == NS_ooxml::LN_CT_SdtBlock_sdtContent
- && m_pImpl->m_pSdtHelper->getControlType() == SdtControlType::plainText;
- if (pContext && pContext->GetFootnote().is())
- {
- pContext->GetFootnote()->setLabel( sText );
- // tdf#141548 don't lose footnote/endnote text of the run with uFtnEdnRef
- // (i.e. when footnoteRef/endnoteRef is followed by some text in the same run)
- m_pImpl->appendTextPortion( sText, pContext );
- }
- else if (m_pImpl->IsOpenFieldCommand() && !m_pImpl->IsForceGenericFields())
- {
- if (bInSdtBlockText)
- {
- if (m_pImpl->m_pSdtHelper->hasUnusedText())
- m_pImpl->m_pSdtHelper->createPlainTextControl();
- else if (!m_pImpl->m_pSdtHelper->isFieldStartRangeSet())
- m_pImpl->m_pSdtHelper->setFieldStartRange(GetCurrentTextRange()->getEnd());
- }
- m_pImpl->AppendFieldCommand(sText);
- }
- else if( m_pImpl->IsOpenField() && m_pImpl->IsFieldResultAsString())
- {
- if (bInSdtBlockText)
- {
- if (m_pImpl->m_pSdtHelper->hasUnusedText())
- m_pImpl->m_pSdtHelper->createPlainTextControl();
- else if (!m_pImpl->m_pSdtHelper->isFieldStartRangeSet())
- m_pImpl->m_pSdtHelper->setFieldStartRange(GetCurrentTextRange()->getEnd());
- }
- /*depending on the success of the field insert operation this result will be
- set at the field or directly inserted into the text*/
- m_pImpl->AppendFieldResult(sText);
- }
- else
- {
- if (pContext == nullptr)
- pContext = new PropertyMap();
-
- if (bInSdtBlockText && !m_pImpl->m_pSdtHelper->hasUnusedText())
- m_pImpl->m_pSdtHelper->setFieldStartRange(GetCurrentTextRange()->getEnd());
-
- m_pImpl->appendTextPortion( sText, pContext );
-
- if (bInSdtBlockText && !sText.isEmpty())
- m_pImpl->m_pSdtHelper->setHasUnusedText(true);
- }
-
- }
- m_pImpl->SetIsFirstRun(false);
- }
- catch( const uno::RuntimeException& )
- {
- }
-}
-
-void DomainMapper::lcl_props(const writerfilter::Reference<Properties>::Pointer_t& ref)
-{
- ref->resolve(*this);
-}
-
-void DomainMapper::lcl_table(Id name, const writerfilter::Reference<Table>::Pointer_t& ref)
-{
- m_pImpl->SetAnyTableImport(true);
- switch(name)
- {
- case NS_ooxml::LN_FONTTABLE:
-
- // create a font table object that listens to the attributes
- // each entry call inserts a new font entry
- ref->resolve( *m_pImpl->GetFontTable() );
- break;
- case NS_ooxml::LN_STYLESHEET:
- //same as above to import style sheets
- m_pImpl->SetStyleSheetImport( true );
- ref->resolve( *m_pImpl->GetStyleSheetTable() );
- m_pImpl->GetStyleSheetTable()->ApplyStyleSheets(m_pImpl->GetFontTable());
- m_pImpl->SetStyleSheetImport( false );
- break;
- case NS_ooxml::LN_NUMBERING:
- {
- m_pImpl->SetNumberingImport(true);
- //the same for list tables
- ref->resolve( *m_pImpl->GetListTable() );
- m_pImpl->GetListTable( )->CreateNumberingRules( );
- m_pImpl->SetNumberingImport(false);
- }
- break;
- case NS_ooxml::LN_settings_settings:
- ref->resolve ( *m_pImpl->GetSettingsTable() );
- m_pImpl->ApplySettingsTable();
- break;
- default:
- OSL_FAIL( "which table is to be filled here?");
- }
- m_pImpl->SetAnyTableImport(false);
-}
-
-void DomainMapper::lcl_substream(Id rName, const writerfilter::Reference<Stream>::Pointer_t& ref)
-{
- m_pImpl->substream(rName, ref);
-}
-
-void DomainMapper::lcl_startGlossaryEntry()
-{
- uno::Reference< text::XTextRange > xTextRange = GetCurrentTextRange();
- m_pImpl->setGlossaryEntryStart(xTextRange);
-}
-
-void DomainMapper::lcl_endGlossaryEntry()
-{
- m_pImpl->appendGlossaryEntry();
-}
-
-void DomainMapper::handleUnderlineType(const Id nId, const ::tools::SvRef<PropertyMap>& rContext)
-{
- sal_Int16 nUnderline = awt::FontUnderline::NONE;
-
- switch (nId)
- {
- case NS_ooxml::LN_Value_ST_Underline_none:
- nUnderline = awt::FontUnderline::NONE;
- break;
- case NS_ooxml::LN_Value_ST_Underline_words:
- rContext->Insert(PROP_CHAR_WORD_MODE, uno::Any(true));
- [[fallthrough]];
- case NS_ooxml::LN_Value_ST_Underline_single:
- nUnderline = awt::FontUnderline::SINGLE;
- break;
- case NS_ooxml::LN_Value_ST_Underline_double:
- nUnderline = awt::FontUnderline::DOUBLE;
- break;
- case NS_ooxml::LN_Value_ST_Underline_dotted:
- nUnderline = awt::FontUnderline::DOTTED;
- break;
- case NS_ooxml::LN_Value_ST_Underline_dash:
- nUnderline = awt::FontUnderline::DASH;
- break;
- case NS_ooxml::LN_Value_ST_Underline_dotDash:
- nUnderline = awt::FontUnderline::DASHDOT;
- break;
- case NS_ooxml::LN_Value_ST_Underline_dotDotDash:
- nUnderline = awt::FontUnderline::DASHDOTDOT;
- break;
- case NS_ooxml::LN_Value_ST_Underline_thick:
- nUnderline = awt::FontUnderline::BOLD;
- break;
- case NS_ooxml::LN_Value_ST_Underline_wave:
- nUnderline = awt::FontUnderline::WAVE;
- break;
- case NS_ooxml::LN_Value_ST_Underline_dottedHeavy:
- nUnderline = awt::FontUnderline::BOLDDOTTED;
- break;
- case NS_ooxml::LN_Value_ST_Underline_dashedHeavy:
- nUnderline = awt::FontUnderline::BOLDDASH;
- break;
- case NS_ooxml::LN_Value_ST_Underline_dashLong:
- nUnderline = awt::FontUnderline::LONGDASH;
- break;
- case NS_ooxml::LN_Value_ST_Underline_dashLongHeavy:
- nUnderline = awt::FontUnderline::BOLDLONGDASH;
- break;
- case NS_ooxml::LN_Value_ST_Underline_dashDotHeavy:
- nUnderline = awt::FontUnderline::BOLDDASHDOT;
- break;
- case NS_ooxml::LN_Value_ST_Underline_dashDotDotHeavy:
- nUnderline = awt::FontUnderline::BOLDDASHDOTDOT;
- break;
- case NS_ooxml::LN_Value_ST_Underline_wavyHeavy:
- nUnderline = awt::FontUnderline::BOLDWAVE;
- break;
- case NS_ooxml::LN_Value_ST_Underline_wavyDouble:
- nUnderline = awt::FontUnderline::DOUBLEWAVE;
- break;
- }
- rContext->Insert(PROP_CHAR_UNDERLINE, uno::Any(nUnderline));
-}
-
-void DomainMapper::handleParaJustification(const sal_Int32 nIntValue, const ::tools::SvRef<PropertyMap>& rContext, const bool bExchangeLeftRight)
-{
- style::ParagraphAdjust nAdjust = style::ParagraphAdjust_LEFT;
- style::ParagraphAdjust nLastLineAdjust = style::ParagraphAdjust_LEFT;
- OUString aStringValue = "left";
- switch(nIntValue)
- {
- case NS_ooxml::LN_Value_ST_Jc_center:
- nAdjust = style::ParagraphAdjust_CENTER;
- aStringValue = "center";
- break;
- case NS_ooxml::LN_Value_ST_Jc_right:
- case NS_ooxml::LN_Value_ST_Jc_end:
- nAdjust = bExchangeLeftRight ? style::ParagraphAdjust_LEFT : style::ParagraphAdjust_RIGHT;
- aStringValue = "right";
- break;
- case NS_ooxml::LN_Value_ST_Jc_distribute:
- nLastLineAdjust = style::ParagraphAdjust_BLOCK;
- [[fallthrough]];
- case NS_ooxml::LN_Value_ST_Jc_both:
- nAdjust = style::ParagraphAdjust_BLOCK;
- aStringValue = "both";
- break;
- case NS_ooxml::LN_Value_ST_Jc_left:
- case NS_ooxml::LN_Value_ST_Jc_start:
- default:
- nAdjust = bExchangeLeftRight ? style::ParagraphAdjust_RIGHT : style::ParagraphAdjust_LEFT;
- break;
- }
- rContext->Insert( PROP_PARA_ADJUST, uno::Any( nAdjust ) );
- rContext->Insert( PROP_PARA_LAST_LINE_ADJUST, uno::Any( nLastLineAdjust ) );
- m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "jc", aStringValue);
-}
-
-bool DomainMapper::getColorFromId(const Id nId, sal_Int32 &nColor)
-{
- nColor = 0;
- if ((nId < NS_ooxml::LN_Value_ST_HighlightColor_black) || (nId > NS_ooxml::LN_Value_ST_HighlightColor_none))
- return false;
-
- switch (nId)
- {
- case NS_ooxml::LN_Value_ST_HighlightColor_black: nColor=0x000000; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_blue: nColor=0x0000ff; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_cyan: nColor=0x00ffff; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_green: nColor=0x00ff00; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_magenta: nColor=0xff00ff; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_red: nColor=0xff0000; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_yellow: nColor=0xffff00; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_white: nColor=0xffffff; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_darkBlue: nColor=0x000080; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_darkCyan: nColor=0x008080; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_darkGreen: nColor=0x008000; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_darkMagenta: nColor=0x800080; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_darkRed: nColor=0x800000; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_darkYellow: nColor=0x808000; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_darkGray: nColor=0x808080; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_lightGray: nColor=0xC0C0C0; break;
- case NS_ooxml::LN_Value_ST_HighlightColor_none: nColor=0xFFFFFFFF; break; //COL_AUTO
- default:
- return false;
- }
- return true;
-}
-
-sal_Int16 DomainMapper::getEmphasisValue(const sal_Int32 nIntValue)
-{
- switch (nIntValue)
- {
- case NS_ooxml::LN_Value_ST_Em_dot:
- return text::FontEmphasis::DOT_ABOVE;
- case NS_ooxml::LN_Value_ST_Em_comma:
- return text::FontEmphasis::ACCENT_ABOVE;
- case NS_ooxml::LN_Value_ST_Em_circle:
- return text::FontEmphasis::CIRCLE_ABOVE;
- case NS_ooxml::LN_Value_ST_Em_underDot:
- return text::FontEmphasis::DOT_BELOW;
- default:
- return text::FontEmphasis::NONE;
- }
-}
-
-OUString DomainMapper::getBracketStringFromEnum(const sal_Int32 nIntValue, const bool bIsPrefix)
-{
- switch(nIntValue)
- {
- case NS_ooxml::LN_Value_ST_CombineBrackets_round:
- if (bIsPrefix)
- return "(";
- return ")";
-
- case NS_ooxml::LN_Value_ST_CombineBrackets_square:
- if (bIsPrefix)
- return "[";
- return "]";
-
- case NS_ooxml::LN_Value_ST_CombineBrackets_angle:
- if (bIsPrefix)
- return "<";
- return ">";
-
- case NS_ooxml::LN_Value_ST_CombineBrackets_curly:
- if (bIsPrefix)
- return "{";
- return "}";
-
- case NS_ooxml::LN_Value_ST_CombineBrackets_none:
- default:
- return OUString();
- }
-}
-
-style::TabAlign DomainMapper::getTabAlignFromValue(const sal_Int32 nIntValue)
-{
- switch (nIntValue)
- {
- case NS_ooxml::LN_Value_ST_TabJc_start:
- case NS_ooxml::LN_Value_ST_TabJc_left:
- case NS_ooxml::LN_Value_ST_TabJc_bar: // bar not supported
- case NS_ooxml::LN_Value_ST_TabJc_num: // num not supported
- return style::TabAlign_LEFT;
- case NS_ooxml::LN_Value_ST_TabJc_center:
- return style::TabAlign_CENTER;
- case NS_ooxml::LN_Value_ST_TabJc_end:
- case NS_ooxml::LN_Value_ST_TabJc_right:
- return style::TabAlign_RIGHT;
- case NS_ooxml::LN_Value_ST_TabJc_decimal:
- return style::TabAlign_DECIMAL;
- }
- return style::TabAlign_LEFT;
-}
-
-sal_Unicode DomainMapper::getFillCharFromValue(const sal_Int32 nIntValue)
-{
- switch (nIntValue)
- {
- case NS_ooxml::LN_Value_ST_TabTlc_dot:
- return u'.';
- case NS_ooxml::LN_Value_ST_TabTlc_hyphen:
- return u'-';
- case NS_ooxml::LN_Value_ST_TabTlc_underscore:
- case NS_ooxml::LN_Value_ST_TabTlc_heavy: // FIXME ???
- return u'_';
- case NS_ooxml::LN_Value_ST_TabTlc_middleDot: // middleDot
- return u'\x00b7';
- case NS_ooxml::LN_Value_ST_TabTlc_none:
- default:
- return u' '; // blank space
- }
-}
-
-bool DomainMapper::IsOOXMLImport() const
-{
- return m_pImpl->IsOOXMLImport();
-}
-
-bool DomainMapper::IsRTFImport() const
-{
- return m_pImpl->IsRTFImport();
-}
-
-uno::Reference < lang::XMultiServiceFactory > const & DomainMapper::GetTextFactory() const
-{
- return m_pImpl->GetTextFactory();
-}
-
-uno::Reference< text::XTextRange > DomainMapper::GetCurrentTextRange()
-{
- if (m_pImpl->HasTopText())
- return m_pImpl->GetTopTextAppend()->getEnd();
- return m_pImpl->m_xInsertTextRange;
-}
-
-OUString DomainMapper::getOrCreateCharStyle( PropertyValueVector_t& rCharProperties, bool bAlwaysCreate )
-{
- StyleSheetTablePtr pStyleSheets = m_pImpl->GetStyleSheetTable();
- return pStyleSheets->getOrCreateCharStyle( rCharProperties, bAlwaysCreate );
-}
-
-StyleSheetTablePtr const & DomainMapper::GetStyleSheetTable( )
-{
- return m_pImpl->GetStyleSheetTable( );
-}
-
-SettingsTablePtr const & DomainMapper::GetSettingsTable()
-{
- return m_pImpl->GetSettingsTable();
-}
-
-GraphicZOrderHelper& DomainMapper::graphicZOrderHelper()
-{
- if (m_zOrderHelper == nullptr)
- m_zOrderHelper.reset( new GraphicZOrderHelper );
- return *m_zOrderHelper;
-}
-
-uno::Reference<drawing::XShape> DomainMapper::PopPendingShape()
-{
- return m_pImpl->PopPendingShape();
-}
-
-bool DomainMapper::IsInHeaderFooter() const
-{
- return m_pImpl->IsInHeaderFooter();
-}
-
-bool DomainMapper::IsInShape() const { return m_pImpl->IsInShape(); }
-
-bool DomainMapper::IsInTable() const
-{
- return m_pImpl->hasTableManager() && m_pImpl->getTableManager().isInCell();
-}
-
-OUString DomainMapper::GetListStyleName(sal_Int32 nListId) const
-{
- return m_pImpl->GetListStyleName( nListId );
-}
-
-void DomainMapper::ValidateListLevel(const OUString& sStyleIdentifierD)
-{
- m_pImpl->ValidateListLevel(sStyleIdentifierD);
-}
-
-void DomainMapper::SetDocDefaultsImport(bool bSet)
-{
- m_pImpl->SetDocDefaultsImport(bSet);
-}
-
-bool DomainMapper::IsStyleSheetImport() const
-{
- return m_pImpl->IsStyleSheetImport();
-}
-
-bool DomainMapper::IsNumberingImport() const
-{
- return m_pImpl->IsNumberingImport();
-}
-
-void DomainMapper::enableInteropGrabBag(const OUString& aName)
-{
- m_pImpl->m_aInteropGrabBagName = aName;
-}
-
-beans::PropertyValue DomainMapper::getInteropGrabBag()
-{
- beans::PropertyValue aRet;
- aRet.Name = m_pImpl->m_aInteropGrabBagName;
- aRet.Value <<= comphelper::containerToSequence(m_pImpl->m_aInteropGrabBag);
-
- m_pImpl->m_aInteropGrabBag.clear();
- m_pImpl->m_aInteropGrabBagName.clear();
- return aRet;
-}
-
-void DomainMapper::HandleRedline( Sprm& rSprm )
-{
- sal_uInt32 nSprmId = rSprm.getId();
-
- m_pImpl->AddNewRedline( nSprmId );
-
- if (nSprmId == NS_ooxml::LN_CT_PPr_pPrChange)
- {
- m_pImpl->SetCurrentRedlineToken(XML_ParagraphFormat);
- }
- else if (nSprmId == NS_ooxml::LN_CT_TrPr_ins)
- {
- m_pImpl->SetCurrentRedlineToken(XML_tableRowInsert);
- }
- else if (nSprmId == NS_ooxml::LN_CT_TrPr_del)
- {
- m_pImpl->SetCurrentRedlineToken(XML_tableRowDelete);
- }
- else if (nSprmId == NS_ooxml::LN_CT_TcPrBase_cellIns)
- {
- m_pImpl->SetCurrentRedlineToken(XML_tableCellInsert);
- }
- else if (nSprmId == NS_ooxml::LN_CT_TcPrBase_cellDel)
- {
- m_pImpl->SetCurrentRedlineToken(XML_tableCellDelete);
- }
-
- resolveSprmProps(*this, rSprm );
- // now the properties author, date and id should be available
- sal_Int32 nToken = m_pImpl->GetCurrentRedlineToken();
- switch( nToken & 0xffff )
- {
- case XML_mod:
- case XML_ins:
- case XML_del:
- case XML_moveTo:
- case XML_moveFrom:
- case XML_ParagraphFormat:
- case XML_tableRowInsert:
- case XML_tableRowDelete:
- case XML_tableCellInsert:
- case XML_tableCellDelete:
- break;
- default: OSL_FAIL( "redline token other than mod, ins, del, moveTo, moveFrom or table row" ); break;
- }
- m_pImpl->EndParaMarkerChange( );
- m_pImpl->SetCurrentRedlineIsRead();
-}
-
-void DomainMapper::finishParagraph(const bool bRemove, const bool bNoNumbering)
-{
- if (m_pImpl->m_pSdtHelper->getControlType() == SdtControlType::datePicker)
- m_pImpl->m_pSdtHelper->createDateContentControl();
- m_pImpl->finishParagraph(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH), bRemove, bNoNumbering);
- if (bRemove || mbIsLastPara)
- m_pImpl->RemoveLastParagraph();
- mbIsLastPara = false; // handle other subdocuments
-}
-
-void DomainMapper::commentProps(const OUString& sId, const CommentProperties& rProps)
-{
- m_pImpl->commentProps(sId, rProps);
-}
-
-css::uno::Reference<css::container::XNameContainer> const & DomainMapper::GetCharacterStyles()
-{
- return m_pImpl->GetCharacterStyles();
-}
-
-OUString DomainMapper::GetUnusedCharacterStyleName()
-{
- return m_pImpl->GetUnusedCharacterStyleName();
-}
-
-} //namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DomainMapper.hxx b/writerfilter/source/dmapper/DomainMapper.hxx
deleted file mode 100644
index 9d9771e640f5..000000000000
--- a/writerfilter/source/dmapper/DomainMapper.hxx
+++ /dev/null
@@ -1,199 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <dmapper/DomainMapperFactory.hxx>
-#include "LoggedResources.hxx"
-#include "PropertyMap.hxx"
-#include "SettingsTable.hxx"
-#include <com/sun/star/lang/XComponent.hpp>
-#include <com/sun/star/style/TabAlign.hpp>
-
-#include <map>
-#include <vector>
-#include <memory>
-
-namespace com::sun::star{
- namespace beans{
- struct PropertyValue;
- }
- namespace io{
- class XInputStream;
- }
- namespace uno{
- class XComponentContext;
- }
- namespace lang{
- class XMultiServiceFactory;
- }
- namespace text{
- class XTextRange;
- }
-}
-
-namespace utl
-{
-class MediaDescriptor;
-}
-
-typedef std::vector<css::beans::PropertyValue> PropertyValueVector_t;
-
-namespace writerfilter::dmapper
-{
-
-class PropertyMap;
-class DomainMapper_Impl;
-class ListsManager;
-class StyleSheetTable;
-class GraphicZOrderHelper;
-
-typedef tools::SvRef<StyleSheetTable> StyleSheetTablePtr;
-
-class DomainMapper : public LoggedProperties, public LoggedTable,
- public BinaryObj, public LoggedStream
-{
- std::unique_ptr<DomainMapper_Impl> m_pImpl;
-
-public:
- DomainMapper(const css::uno::Reference<css::uno::XComponentContext>& xContext,
- css::uno::Reference<css::io::XInputStream> const& xInputStream,
- css::uno::Reference<css::lang::XComponent> const& xModel,
- bool bRepairStorage,
- SourceDocumentType eDocumentType,
- utl::MediaDescriptor const & rMediaDesc);
- virtual ~DomainMapper() override;
-
- virtual void setDocumentReference(writerfilter::ooxml::OOXMLDocument* pDocument) override;
-
- // Stream
- virtual void markLastParagraphInSection() override;
- virtual void markLastParagraph() override { mbIsLastPara = true; }
- virtual void markLastSectionGroup() override;
-
- // BinaryObj
- virtual void data(const sal_uInt8* buf, size_t len) override;
-
- void sprmWithProps( Sprm& sprm, const PropertyMapPtr& pContext );
-
- void PushStyleSheetProperties( const PropertyMapPtr& pStyleProperties, bool bAffectTableMngr = false );
- void PopStyleSheetProperties( bool bAffectTableMngr = false );
-
- void PushListProperties( const ::tools::SvRef<PropertyMap>& pListProperties );
- void PopListProperties();
- OUString GetListStyleName(sal_Int32 nListId) const;
- void ValidateListLevel(const OUString& sStyleIdentifierD);
-
- bool IsOOXMLImport() const;
- bool IsRTFImport() const;
- css::uno::Reference<css::lang::XMultiServiceFactory> const & GetTextFactory() const;
- css::uno::Reference<css::text::XTextRange> GetCurrentTextRange();
-
- OUString getOrCreateCharStyle( PropertyValueVector_t& rCharProperties, bool bAlwaysCreate );
- StyleSheetTablePtr const & GetStyleSheetTable( );
- SettingsTablePtr const & GetSettingsTable();
- GraphicZOrderHelper& graphicZOrderHelper();
-
- /// Return the first from the pending (not inserted to the document) shapes, if there are any.
- css::uno::Reference<css::drawing::XShape> PopPendingShape();
-
- bool IsInHeaderFooter() const;
- bool IsInTable() const;
- void SetDocDefaultsImport(bool bSet);
- bool IsStyleSheetImport() const;
- bool IsNumberingImport() const;
- bool IsInShape() const;
-
- void hasControls( const bool bSet ) { mbHasControls = bSet; }
-
- /**
- @see DomainMapper_Impl::processDeferredCharacterProperties()
- */
- void processDeferredCharacterProperties(
- const std::map<sal_Int32, css::uno::Any>& rDeferredCharacterProperties,
- bool bCharContext = true);
-
- void ProcessDeferredStyleCharacterProperties();
-
- /// Enable storing of seen tokens in a named grab bag.
- void enableInteropGrabBag(const OUString& aName);
- /// Get the stored tokens and clear the internal storage.
- css::beans::PropertyValue getInteropGrabBag();
-
- void HandleRedline( Sprm& rSprm );
-
- virtual void commentProps(const OUString& sId, const CommentProperties& rProps) override;
-
- css::uno::Reference<css::container::XNameContainer> const & GetCharacterStyles();
- OUString GetUnusedCharacterStyleName();
-
-private:
- // Stream
- virtual void lcl_startSectionGroup() override;
- virtual void lcl_endSectionGroup() override;
- virtual void lcl_startParagraphGroup() override;
- virtual void lcl_endParagraphGroup() override;
- virtual void lcl_startCharacterGroup() override;
- virtual void lcl_endCharacterGroup() override;
- virtual void lcl_startShape(css::uno::Reference<css::drawing::XShape> const& xShape) override;
- virtual void lcl_endShape( ) override;
- virtual void lcl_startTextBoxContent() override;
- virtual void lcl_endTextBoxContent() override;
- virtual void lcl_text(const sal_uInt8 * data, size_t len) override;
- virtual void lcl_utext(const sal_Unicode * data, size_t len) override;
- virtual void lcl_positionOffset(const OUString& rText, bool bVertical) override;
- virtual css::awt::Point getPositionOffset() override;
- virtual void lcl_align(const OUString& rText, bool bVertical) override;
- virtual void lcl_positivePercentage(const OUString& rText) override;
- virtual void lcl_props(const writerfilter::Reference<Properties>::Pointer_t& ref) override;
- virtual void lcl_table(Id name,
- const writerfilter::Reference<Table>::Pointer_t& ref) override;
- virtual void lcl_substream(Id name,
- const writerfilter::Reference<Stream>::Pointer_t& ref) override;
- virtual void lcl_startGlossaryEntry() override;
- virtual void lcl_endGlossaryEntry() override;
- virtual void lcl_checkId(const sal_Int32 nId) override;
-
- // Properties
- virtual void lcl_attribute(Id Name, Value & val) override;
- virtual void lcl_sprm(Sprm & sprm) override;
-
- // Table
- virtual void lcl_entry(const writerfilter::Reference<Properties>::Pointer_t& ref) override;
-
- void ResetStyleProperties();
- void finishParagraph(const bool bRemove = false, const bool bNoNumbering = false);
-
- static void handleUnderlineType(const Id nId, const ::tools::SvRef<PropertyMap>& rContext);
- void handleParaJustification(const sal_Int32 nIntValue, const ::tools::SvRef<PropertyMap>& rContext, const bool bExchangeLeftRight);
- static bool getColorFromId(const Id, sal_Int32 &nColor);
- static sal_Int16 getEmphasisValue(const sal_Int32 nIntValue);
- static OUString getBracketStringFromEnum(const sal_Int32 nIntValue, const bool bIsPrefix = true);
- static css::style::TabAlign getTabAlignFromValue(const sal_Int32 nIntValue);
- static sal_Unicode getFillCharFromValue(const sal_Int32 nIntValue);
- bool mbIsSplitPara;
- bool mbHasControls;
- bool mbWasShapeInPara;
- bool mbIsLastPara = false;
- std::unique_ptr< GraphicZOrderHelper > m_zOrderHelper;
- OUString m_sGlossaryEntryName;
-};
-
-} // namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
deleted file mode 100644
index 422d643cb7ba..000000000000
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx
+++ /dev/null
@@ -1,1778 +0,0 @@
-/* -*- 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/.
- *
- * 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 <sal/config.h>
-
-#include <string_view>
-
-#include "DomainMapperTableHandler.hxx"
-#include "DomainMapper_Impl.hxx"
-#include "StyleSheetTable.hxx"
-
-#include <com/sun/star/beans/TolerantPropertySetResultType.hpp>
-#include <com/sun/star/beans/XTolerantMultiPropertySet.hpp>
-#include <com/sun/star/style/ParagraphAdjust.hpp>
-#include <com/sun/star/table/TableBorderDistances.hpp>
-#include <com/sun/star/table/TableBorder.hpp>
-#include <com/sun/star/table/BorderLine2.hpp>
-#include <com/sun/star/table/BorderLineStyle.hpp>
-#include <com/sun/star/table/XCellRange.hpp>
-#include <com/sun/star/text/HoriOrientation.hpp>
-#include <com/sun/star/text/SizeType.hpp>
-#include <com/sun/star/text/TextContentAnchorType.hpp>
-#include <com/sun/star/text/WritingMode2.hpp>
-#include <com/sun/star/text/XTextField.hpp>
-#include <com/sun/star/text/XTextRangeCompare.hpp>
-#include <com/sun/star/text/RelOrientation.hpp>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/beans/XPropertyState.hpp>
-#include <com/sun/star/container/XEnumeration.hpp>
-#include <com/sun/star/container/XEnumerationAccess.hpp>
-#include <com/sun/star/drawing/FillStyle.hpp>
-#include "TablePositionHandler.hxx"
-#include "TagLogger.hxx"
-#include "util.hxx"
-#include <osl/diagnose.h>
-#include <sal/log.hxx>
-#include <comphelper/diagnose_ex.hxx>
-#include <comphelper/sequence.hxx>
-#include <comphelper/propertyvalue.hxx>
-#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
-#include <com/sun/star/style/BreakType.hpp>
-#include <officecfg/Office/Writer.hxx>
-
-#ifdef DBG_UTIL
-#include "PropertyMapHelper.hxx"
-#include <rtl/ustring.hxx>
-#include <utility>
-#endif
-
-namespace writerfilter::dmapper {
-
-using namespace ::com::sun::star;
-
-#define DEF_BORDER_DIST 190 //0,19cm
-#define CNF_FIRST_ROW 0x800
-#define CNF_LAST_ROW 0x400
-#define CNF_FIRST_COLUMN 0x200
-#define CNF_LAST_COLUMN 0x100
-#define CNF_ODD_VBAND 0x080
-#define CNF_EVEN_VBAND 0x040
-#define CNF_ODD_HBAND 0x020
-#define CNF_EVEN_HBAND 0x010
-#define CNF_FIRST_ROW_LAST_COLUMN 0x008
-#define CNF_FIRST_ROW_FIRST_COLUMN 0x004
-#define CNF_LAST_ROW_LAST_COLUMN 0x002
-#define CNF_LAST_ROW_FIRST_COLUMN 0x001
-#define CNF_ALL 0xFFF
-
-// total number of table columns
-#define MAXTABLECELLS 63
-
-DomainMapperTableHandler::DomainMapperTableHandler(
- css::uno::Reference<css::text::XTextAppendAndConvert> xText,
- DomainMapper_Impl& rDMapper_Impl)
- : m_xText(std::move(xText)),
- m_rDMapper_Impl( rDMapper_Impl )
-{
-}
-
-DomainMapperTableHandler::~DomainMapperTableHandler()
-{
-}
-
-void DomainMapperTableHandler::startTable(const TablePropertyMapPtr& pProps)
-{
- m_aTableProperties = pProps;
- m_aTableRanges.clear();
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablehandler.table");
-
- if (pProps)
- pProps->dumpXml();
-#endif
-}
-
-static void lcl_mergeBorder( PropertyIds nId, const PropertyMapPtr& pOrig, const PropertyMapPtr& pDest )
-{
- std::optional<PropertyMap::Property> pOrigVal = pOrig->getProperty(nId);
-
- if ( pOrigVal )
- {
- pDest->Insert( nId, pOrigVal->second, false );
- }
-}
-
-static void lcl_computeCellBorders( const PropertyMapPtr& pTableBorders, const PropertyMapPtr& pCellProps,
- sal_uInt32 nCell, sal_uInt32 nFirstCell, sal_uInt32 nLastCell, sal_Int32 nRow, bool bIsEndRow, bool bMergedVertically )
-{
- const bool bIsStartCol = nCell == nFirstCell;
- const bool bIsEndCol = nCell == nLastCell;
- std::optional<PropertyMap::Property> pVerticalVal = pCellProps->getProperty(META_PROP_VERTICAL_BORDER);
- std::optional<PropertyMap::Property> pHorizontalVal = pCellProps->getProperty(META_PROP_HORIZONTAL_BORDER);
-
- // Handle the vertical and horizontal borders
- uno::Any aVertProp;
- if ( !pVerticalVal)
- {
- pVerticalVal = pTableBorders->getProperty(META_PROP_VERTICAL_BORDER);
- if ( pVerticalVal )
- aVertProp = pVerticalVal->second;
- }
- else
- {
- aVertProp = pVerticalVal->second;
- pCellProps->Erase( pVerticalVal->first );
- }
-
- uno::Any aHorizProp;
- if ( !pHorizontalVal )
- {
- pHorizontalVal = pTableBorders->getProperty(META_PROP_HORIZONTAL_BORDER);
- if ( pHorizontalVal )
- aHorizProp = pHorizontalVal->second;
- }
- else
- {
- aHorizProp = pHorizontalVal->second;
- pCellProps->Erase( pHorizontalVal->first );
- }
-
- if ( bIsStartCol )
- lcl_mergeBorder( PROP_LEFT_BORDER, pTableBorders, pCellProps );
-
- if ( bIsEndCol )
- lcl_mergeBorder( PROP_RIGHT_BORDER, pTableBorders, pCellProps );
-
- // <w:insideV> counts if there are multiple cells in this row.
- if ( pVerticalVal )
- {
- if ( !bIsEndCol && nCell >= nFirstCell )
- pCellProps->Insert( PROP_RIGHT_BORDER, aVertProp, false );
- if ( !bIsStartCol && nCell <= nLastCell )
- pCellProps->Insert( PROP_LEFT_BORDER, aVertProp, false );
- }
-
- if ( nRow == 0 )
- {
- lcl_mergeBorder( PROP_TOP_BORDER, pTableBorders, pCellProps );
- if ( pHorizontalVal && !bMergedVertically )
- pCellProps->Insert( PROP_BOTTOM_BORDER, aHorizProp, false );
- }
-
- if ( bMergedVertically )
- lcl_mergeBorder( PROP_BOTTOM_BORDER, pTableBorders, pCellProps );
-
- if ( bIsEndRow )
- {
- lcl_mergeBorder( PROP_BOTTOM_BORDER, pTableBorders, pCellProps );
- if ( pHorizontalVal )
- pCellProps->Insert( PROP_TOP_BORDER, aHorizProp, false );
- }
-
- if ( nRow > 0 && !bIsEndRow )
- {
- if ( pHorizontalVal )
- {
- pCellProps->Insert( PROP_TOP_BORDER, aHorizProp, false );
- pCellProps->Insert( PROP_BOTTOM_BORDER, aHorizProp, false );
- }
- }
-}
-
-#ifdef DBG_UTIL
-
-static void lcl_debug_BorderLine(table::BorderLine const & rLine)
-{
- TagLogger::getInstance().startElement("BorderLine");
- TagLogger::getInstance().attribute("Color", rLine.Color);
- TagLogger::getInstance().attribute("InnerLineWidth", rLine.InnerLineWidth);
- TagLogger::getInstance().attribute("OuterLineWidth", rLine.OuterLineWidth);
- TagLogger::getInstance().attribute("LineDistance", rLine.LineDistance);
- TagLogger::getInstance().endElement();
-}
-
-static void lcl_debug_TableBorder(table::TableBorder const & rBorder)
-{
- TagLogger::getInstance().startElement("TableBorder");
- lcl_debug_BorderLine(rBorder.TopLine);
- TagLogger::getInstance().attribute("IsTopLineValid", sal_uInt32(rBorder.IsTopLineValid));
- lcl_debug_BorderLine(rBorder.BottomLine);
- TagLogger::getInstance().attribute("IsBottomLineValid", sal_uInt32(rBorder.IsBottomLineValid));
- lcl_debug_BorderLine(rBorder.LeftLine);
- TagLogger::getInstance().attribute("IsLeftLineValid", sal_uInt32(rBorder.IsLeftLineValid));
- lcl_debug_BorderLine(rBorder.RightLine);
- TagLogger::getInstance().attribute("IsRightLineValid", sal_uInt32(rBorder.IsRightLineValid));
- lcl_debug_BorderLine(rBorder.VerticalLine);
- TagLogger::getInstance().attribute("IsVerticalLineValid", sal_uInt32(rBorder.IsVerticalLineValid));
- lcl_debug_BorderLine(rBorder.HorizontalLine);
- TagLogger::getInstance().attribute("IsHorizontalLineValid", sal_uInt32(rBorder.IsHorizontalLineValid));
- TagLogger::getInstance().attribute("Distance", rBorder.Distance);
- TagLogger::getInstance().attribute("IsDistanceValid", sal_uInt32(rBorder.IsDistanceValid));
- TagLogger::getInstance().endElement();
-}
-#endif
-
-struct TableInfo
-{
- sal_Int32 nLeftBorderDistance;
- sal_Int32 nRightBorderDistance;
- sal_Int32 nTopBorderDistance;
- sal_Int32 nBottomBorderDistance;
- sal_Int32 nTblLook;
- sal_Int32 nNestLevel;
- PropertyMapPtr pTableDefaults;
- PropertyMapPtr pTableBorders;
- TableStyleSheetEntry* pTableStyle;
- css::beans::PropertyValues aTableProperties;
- std::vector< PropertyIds > aTablePropertyIds;
-
- TableInfo()
- : nLeftBorderDistance(DEF_BORDER_DIST)
- , nRightBorderDistance(DEF_BORDER_DIST)
- , nTopBorderDistance(0)
- , nBottomBorderDistance(0)
- , nTblLook(0x4a0)
- , nNestLevel(0)
- , pTableDefaults(new PropertyMap)
- , pTableBorders(new PropertyMap)
- , pTableStyle(nullptr)
- {
- }
-
-};
-
-namespace
-{
-
-bool lcl_extractTableBorderProperty(const PropertyMapPtr& pTableProperties, const PropertyIds nId, TableInfo const & rInfo, table::BorderLine2& rLine)
-{
- if (!pTableProperties)
- return false;
-
- const std::optional<PropertyMap::Property> aTblBorder = pTableProperties->getProperty(nId);
- if( aTblBorder )
- {
- OSL_VERIFY(aTblBorder->second >>= rLine);
-
- rInfo.pTableBorders->Insert( nId, uno::Any( rLine ) );
- rInfo.pTableDefaults->Erase( nId );
-
- return true;
- }
-
- return false;
-}
-
-void lcl_extractHoriOrient(std::vector<beans::PropertyValue>& rFrameProperties, sal_Int32& nHoriOrient)
-{
- // Shifts the frame left by the given value.
- for (const beans::PropertyValue & rFrameProperty : rFrameProperties)
- {
- if (rFrameProperty.Name == "HoriOrient")
- {
- sal_Int32 nValue = rFrameProperty.Value.get<sal_Int32>();
- if (nValue != text::HoriOrientation::NONE)
- nHoriOrient = nValue;
- return;
- }
- }
-}
-
-void lcl_DecrementHoriOrientPosition(std::vector<beans::PropertyValue>& rFrameProperties, sal_Int32 nAmount)
-{
- // Shifts the frame left by the given value.
- for (beans::PropertyValue & rPropertyValue : rFrameProperties)
- {
- if (rPropertyValue.Name == "HoriOrientPosition")
- {
- sal_Int32 nValue = rPropertyValue.Value.get<sal_Int32>();
- nValue -= nAmount;
- rPropertyValue.Value <<= nValue;
- return;
- }
- }
-}
-
-void lcl_adjustBorderDistance(TableInfo& rInfo, const table::BorderLine2& rLeftBorder,
- const table::BorderLine2& rRightBorder)
-{
- // MS Word appears to do these things to adjust the cell horizontal area:
- //
- // bll = left borderline width
- // blr = right borderline width
- // cea = cell's edit area rectangle
- // cea_w = cea width
- // cml = cell's left margin (padding) defined in cell settings
- // cmr = cell's right margin (padding) defined in cell settings
- // cw = cell width (distance between middles of left borderline and right borderline)
- // pad_l = actual cea left padding = (its left pos relative to middle of bll)
- // pad_r = actual cea right padding = abs (its right pos relative to middle of blr)
- //
- // pad_l = max(bll/2, cml) -> cea does not overlap left borderline
- // cea_w = cw-max(pad_l+blr/2, cml+cmr) -> cea does not overlap right borderline
- // pad_r = max(pad_l+blr/2, cml+cmr) - pad_l
- //
- // It means that e.g. for border widths of 6 pt (~2.12 mm), left margin 0 mm, and right margin
- // 2 mm, actual left and right margins will (unexpectedly) coincide with inner edges of cell's
- // borderlines - the right margin won't create spacing between right of edit rectangle and the
- // inner edge of right borderline.
-
- const sal_Int32 nActualL
- = std::max<sal_Int32>(rLeftBorder.LineWidth / 2, rInfo.nLeftBorderDistance);
- const sal_Int32 nActualR
- = std::max<sal_Int32>(nActualL + rRightBorder.LineWidth / 2,
- rInfo.nLeftBorderDistance + rInfo.nRightBorderDistance)
- - nActualL;
- rInfo.nLeftBorderDistance = nActualL;
- rInfo.nRightBorderDistance = nActualR;
-}
-
-}
-
-TableStyleSheetEntry * DomainMapperTableHandler::endTableGetTableStyle(TableInfo & rInfo,
- std::vector<beans::PropertyValue>& rFrameProperties,
- bool bConvertToFloatingInFootnote)
-{
- // will receive the table style if any
- TableStyleSheetEntry* pTableStyle = nullptr;
-
- if( m_aTableProperties )
- {
- //create properties from the table attributes
- sal_Int32 nLeftMargin = 0;
-
- comphelper::SequenceAsHashMap aGrabBag;
-
- if (bConvertToFloatingInFootnote)
- {
- // define empty "TablePosition" to avoid export temporary floating
- aGrabBag["TablePosition"] = uno::Any();
- }
-
- std::optional<PropertyMap::Property> aTableStyleVal = m_aTableProperties->getProperty(META_PROP_TABLE_STYLE_NAME);
- if(aTableStyleVal)
- {
- // Apply table style properties recursively
- OUString sTableStyleName;
- aTableStyleVal->second >>= sTableStyleName;
- StyleSheetTablePtr pStyleSheetTable = m_rDMapper_Impl.GetStyleSheetTable();
- const StyleSheetEntryPtr pStyleSheet = pStyleSheetTable->FindStyleSheetByISTD( sTableStyleName );
- pTableStyle = dynamic_cast<TableStyleSheetEntry*>( pStyleSheet.get( ) );
- m_aTableProperties->Erase( aTableStyleVal->first );
-
- aGrabBag["TableStyleName"] <<= sTableStyleName;
-
- if( pStyleSheet )
- {
- // First get the style properties, then the table ones
- PropertyMapPtr pTableProps( m_aTableProperties.get() );
-
- m_aTableProperties = TablePropertyMapPtr(new TablePropertyMap);
-
- PropertyMapPtr pMergedProperties = pStyleSheet->GetMergedInheritedProperties(pStyleSheetTable);
-
- table::BorderLine2 aBorderLine;
- TableInfo rStyleInfo;
- if (lcl_extractTableBorderProperty(pMergedProperties, PROP_TOP_BORDER, rStyleInfo, aBorderLine))
- {
- aGrabBag["TableStyleTopBorder"] <<= aBorderLine;
- }
- if (lcl_extractTableBorderProperty(pMergedProperties, PROP_BOTTOM_BORDER, rStyleInfo, aBorderLine))
- {
- aGrabBag["TableStyleBottomBorder"] <<= aBorderLine;
- }
- if (lcl_extractTableBorderProperty(pMergedProperties, PROP_LEFT_BORDER, rStyleInfo, aBorderLine))
- {
- aGrabBag["TableStyleLeftBorder"] <<= aBorderLine;
- }
- if (lcl_extractTableBorderProperty(pMergedProperties, PROP_RIGHT_BORDER, rStyleInfo, aBorderLine))
- {
- aGrabBag["TableStyleRightBorder"] <<= aBorderLine;
- }
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("mergedProps");
- if (pMergedProperties)
- pMergedProperties->dumpXml();
- TagLogger::getInstance().endElement();
-#endif
-
- m_aTableProperties->InsertProps(pMergedProperties);
- m_aTableProperties->InsertProps(pTableProps);
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("TableProperties");
- m_aTableProperties->dumpXml();
- TagLogger::getInstance().endElement();
-#endif
- if (pTableStyle)
- {
- // apply tblHeader setting of the table style
- PropertyMapPtr pHeaderStyleProps = pTableStyle->GetProperties(CNF_FIRST_ROW);
- if ( pHeaderStyleProps->getProperty(PROP_HEADER_ROW_COUNT) )
- m_aTableProperties->Insert(PROP_HEADER_ROW_COUNT, uno::Any( sal_Int32(1)), false);
- }
- }
- }
-
- // This is the one preserving just all the table look attributes.
- std::optional<PropertyMap::Property> oTableLook = m_aTableProperties->getProperty(META_PROP_TABLE_LOOK);
- if (oTableLook)
- {
- aGrabBag["TableStyleLook"] = oTableLook->second;
- m_aTableProperties->Erase(oTableLook->first);
- }
-
- // This is just the "val" attribute's numeric value.
- const std::optional<PropertyMap::Property> aTblLook = m_aTableProperties->getProperty(PROP_TBL_LOOK);
- if(aTblLook)
- {
- aTblLook->second >>= rInfo.nTblLook;
- m_aTableProperties->Erase( aTblLook->first );
- }
-
- // apply cell margin settings of the table style
- const std::optional<PropertyMap::Property> oLeftMargin = m_aTableProperties->getProperty(META_PROP_CELL_MAR_LEFT);
- if (oLeftMargin)
- {
- oLeftMargin->second >>= rInfo.nLeftBorderDistance;
- m_aTableProperties->Erase(oLeftMargin->first);
- }
- const std::optional<PropertyMap::Property> oRightMargin = m_aTableProperties->getProperty(META_PROP_CELL_MAR_RIGHT);
- if (oRightMargin)
- {
- oRightMargin->second >>= rInfo.nRightBorderDistance;
- m_aTableProperties->Erase(oRightMargin->first);
- }
- const std::optional<PropertyMap::Property> oTopMargin = m_aTableProperties->getProperty(META_PROP_CELL_MAR_TOP);
- if (oTopMargin)
- {
- oTopMargin->second >>= rInfo.nTopBorderDistance;
- m_aTableProperties->Erase(oTopMargin->first);
- }
- const std::optional<PropertyMap::Property> oBottomMargin = m_aTableProperties->getProperty(META_PROP_CELL_MAR_BOTTOM);
- if (oBottomMargin)
- {
- oBottomMargin->second >>= rInfo.nBottomBorderDistance;
- m_aTableProperties->Erase(oBottomMargin->first);
- }
-
- // Set the table default attributes for the cells
- rInfo.pTableDefaults->InsertProps(m_aTableProperties.get());
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("TableDefaults");
- rInfo.pTableDefaults->dumpXml();
- TagLogger::getInstance().endElement();
-#endif
-
- if (!aGrabBag.empty())
- {
- m_aTableProperties->Insert( PROP_TABLE_INTEROP_GRAB_BAG, uno::Any( aGrabBag.getAsConstPropertyValueList() ) );
- }
-
- std::optional<PropertyMap::Property> oLeftMarginFromStyle = m_aTableProperties->getProperty(PROP_LEFT_MARGIN);
- if (oLeftMarginFromStyle)
- {
- oLeftMarginFromStyle->second >>= nLeftMargin;
- // don't need to erase, we will push back the adjusted value
- // of this (or the direct formatting, if that exists) later
- }
- m_aTableProperties->getValue( TablePropertyMap::LEFT_MARGIN, nLeftMargin );
-
- m_aTableProperties->getValue( TablePropertyMap::CELL_MAR_LEFT,
- rInfo.nLeftBorderDistance );
- m_aTableProperties->getValue( TablePropertyMap::CELL_MAR_RIGHT,
- rInfo.nRightBorderDistance );
- m_aTableProperties->getValue( TablePropertyMap::CELL_MAR_TOP,
- rInfo.nTopBorderDistance );
- m_aTableProperties->getValue( TablePropertyMap::CELL_MAR_BOTTOM,
- rInfo.nBottomBorderDistance );
-
- table::TableBorderDistances aDistances;
- aDistances.IsTopDistanceValid =
- aDistances.IsBottomDistanceValid =
- aDistances.IsLeftDistanceValid =
- aDistances.IsRightDistanceValid = true;
- aDistances.TopDistance = static_cast<sal_Int16>( rInfo.nTopBorderDistance );
- aDistances.BottomDistance = static_cast<sal_Int16>( rInfo.nBottomBorderDistance );
- aDistances.LeftDistance = static_cast<sal_Int16>( rInfo.nLeftBorderDistance );
- aDistances.RightDistance = static_cast<sal_Int16>( rInfo.nRightBorderDistance );
-
- m_aTableProperties->Insert( PROP_TABLE_BORDER_DISTANCES, uno::Any( aDistances ) );
-
- sal_Int32 nMode = m_rDMapper_Impl.GetSettingsTable()->GetWordCompatibilityMode();
- if (!rFrameProperties.empty() && nMode < 15)
- lcl_DecrementHoriOrientPosition(rFrameProperties, rInfo.nLeftBorderDistance);
-
- // Set table above/bottom spacing to 0.
- m_aTableProperties->Insert( PROP_TOP_MARGIN, uno::Any( sal_Int32( 0 ) ) );
- m_aTableProperties->Insert( PROP_BOTTOM_MARGIN, uno::Any( sal_Int32( 0 ) ) );
-
- //table border settings
- table::TableBorder aTableBorder;
- table::BorderLine2 aBorderLine, aLeftBorder, aRightBorder;
-
- if (lcl_extractTableBorderProperty(m_aTableProperties.get(), PROP_TOP_BORDER, rInfo, aBorderLine))
- {
- aTableBorder.TopLine = aBorderLine;
- aTableBorder.IsTopLineValid = true;
- }
- if (lcl_extractTableBorderProperty(m_aTableProperties.get(), PROP_BOTTOM_BORDER, rInfo, aBorderLine))
- {
- aTableBorder.BottomLine = aBorderLine;
- aTableBorder.IsBottomLineValid = true;
- }
- if (lcl_extractTableBorderProperty(m_aTableProperties.get(), PROP_LEFT_BORDER, rInfo, aLeftBorder))
- {
- aTableBorder.LeftLine = aLeftBorder;
- aTableBorder.IsLeftLineValid = true;
- }
- if (lcl_extractTableBorderProperty(m_aTableProperties.get(), PROP_RIGHT_BORDER, rInfo,
- aRightBorder))
- {
- aTableBorder.RightLine = aRightBorder;
- aTableBorder.IsRightLineValid = true;
- }
- if (lcl_extractTableBorderProperty(m_aTableProperties.get(), META_PROP_HORIZONTAL_BORDER, rInfo, aBorderLine))
- {
- aTableBorder.HorizontalLine = aBorderLine;
- aTableBorder.IsHorizontalLineValid = true;
- }
- if (lcl_extractTableBorderProperty(m_aTableProperties.get(), META_PROP_VERTICAL_BORDER, rInfo, aBorderLine))
- {
- aTableBorder.VerticalLine = aBorderLine;
- aTableBorder.IsVerticalLineValid = true;
- }
-
- aTableBorder.Distance = 0;
- aTableBorder.IsDistanceValid = false;
-
- m_aTableProperties->Insert( PROP_TABLE_BORDER, uno::Any( aTableBorder ) );
-
-#ifdef DBG_UTIL
- lcl_debug_TableBorder(aTableBorder);
-#endif
-
- // Table position in Office is computed in 2 different ways :
- // - top level tables: the goal is to have in-cell text starting at table indent pos (tblInd),
- // so table's position depends on table's cells margin
- // - nested tables: the goal is to have left-most border starting at table_indent pos
-
- // Only top level table position depends on border width of Column A.
- if ( !m_aCellProperties.empty() && !m_aCellProperties[0].empty() )
- {
- // aLeftBorder already contains tblBorder; overwrite if cell is different.
- std::optional<PropertyMap::Property> aCellBorder
- = m_aCellProperties[0][0]->getProperty(PROP_LEFT_BORDER);
- if ( aCellBorder )
- aCellBorder->second >>= aLeftBorder;
- aCellBorder = m_aCellProperties[0][0]->getProperty(PROP_RIGHT_BORDER);
- if (aCellBorder)
- aCellBorder->second >>= aRightBorder;
- }
- if (rInfo.nNestLevel == 1 && aLeftBorder.LineWidth && !rFrameProperties.empty())
- {
- lcl_DecrementHoriOrientPosition(rFrameProperties, aLeftBorder.LineWidth * 0.5);
- }
- lcl_adjustBorderDistance(rInfo, aLeftBorder, aRightBorder);
-
- // tdf#106742: since MS Word 2013 (compatibilityMode >= 15), top-level tables are handled the same as nested tables;
- // the default behavior when DOCX doesn't define "compatibilityMode" option is to add the cell spacing
-
- if (0 < nMode && nMode <= 14 && rInfo.nNestLevel == 1)
- {
- const sal_Int32 nAdjustedMargin = nLeftMargin - rInfo.nLeftBorderDistance;
- m_aTableProperties->Insert( PROP_LEFT_MARGIN, uno::Any( nAdjustedMargin ) );
- }
- else
- {
- // Writer starts a table in the middle of the border.
- // Word starts a table at the left edge of the border,
- // so emulate that by adding the half the width. (also see docxattributeoutput)
- if ( rInfo.nNestLevel > 1 && nLeftMargin < 0 )
- nLeftMargin = 0;
- const sal_Int32 nAdjustedMargin = nLeftMargin + (aLeftBorder.LineWidth / 2);
- m_aTableProperties->Insert( PROP_LEFT_MARGIN, uno::Any( nAdjustedMargin ) );
- }
-
- sal_Int32 nTableWidth = 0;
- sal_Int32 nTableWidthType = text::SizeType::FIX;
- m_aTableProperties->getValue( TablePropertyMap::TABLE_WIDTH, nTableWidth );
- m_aTableProperties->getValue( TablePropertyMap::TABLE_WIDTH_TYPE, nTableWidthType );
- if( nTableWidthType == text::SizeType::FIX )
- {
- if( nTableWidth > 0 )
- m_aTableProperties->Insert( PROP_WIDTH, uno::Any( nTableWidth ));
- else
- {
- // tdf#109524: If there is no width for the table, make it simply 100% by default.
- // TODO: use cell contents to evaluate width (according to ECMA-376-1:2016 17.18.87)
- nTableWidth = 100;
- nTableWidthType = text::SizeType::VARIABLE;
- }
- }
- if (nTableWidthType != text::SizeType::FIX)
- {
- m_aTableProperties->Insert( PROP_RELATIVE_WIDTH, uno::Any( sal_Int16( nTableWidth ) ) );
- m_aTableProperties->Insert( PROP_IS_WIDTH_RELATIVE, uno::Any( true ) );
- }
-
- sal_Int32 nHoriOrient = text::HoriOrientation::LEFT_AND_WIDTH;
- // Fetch Horizontal Orientation in rFrameProperties if not set in m_aTableProperties
- if ( !m_aTableProperties->getValue( TablePropertyMap::HORI_ORIENT, nHoriOrient ) )
- lcl_extractHoriOrient( rFrameProperties, nHoriOrient );
- m_aTableProperties->Insert( PROP_HORI_ORIENT, uno::Any( sal_Int16(nHoriOrient) ) );
- //fill default value - if not available
- m_aTableProperties->Insert( PROP_HEADER_ROW_COUNT, uno::Any( sal_Int32(0)), false);
- m_aTableProperties->Insert(PROP_WRITING_MODE,
- uno::Any(sal_Int16(text::WritingMode2::CONTEXT)),
- /*bOverWrite=*/false);
-
- // if table is only a single row, and row is set as don't split, set the same value for the whole table.
- if( m_aRowProperties.size() == 1 && m_aRowProperties[0] )
- {
- std::optional<PropertyMap::Property> oSplitAllowed = m_aRowProperties[0]->getProperty(PROP_IS_SPLIT_ALLOWED);
- if( oSplitAllowed )
- {
- bool bRowCanSplit = true;
- oSplitAllowed->second >>= bRowCanSplit;
- if( !bRowCanSplit )
- m_aTableProperties->Insert( PROP_SPLIT, uno::Any(bRowCanSplit) );
- }
- }
-
- rInfo.aTableProperties = m_aTableProperties->GetPropertyValues();
- rInfo.aTablePropertyIds = m_aTableProperties->GetPropertyIds();
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("debug.tableprops");
- m_aTableProperties->dumpXml();
- TagLogger::getInstance().endElement();
-#endif
-
- }
-
- return pTableStyle;
-}
-
-CellPropertyValuesSeq_t DomainMapperTableHandler::endTableGetCellProperties(TableInfo & rInfo, std::vector<HorizontallyMergedCell>& rMerges)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("getCellProperties");
-#endif
-
- CellPropertyValuesSeq_t aCellProperties( m_aCellProperties.size() );
-
- if ( m_aCellProperties.empty() )
- {
- #ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
- #endif
- return aCellProperties;
- }
- // std::vector< std::vector<PropertyMapPtr> > m_aCellProperties
- PropertyMapVector2::const_iterator aRowOfCellsIterator = m_aCellProperties.begin();
- PropertyMapVector2::const_iterator aRowOfCellsIteratorEnd = m_aCellProperties.end();
- PropertyMapVector2::const_iterator aLastRowIterator = m_aCellProperties.end() - 1;
- sal_Int32 nRow = 0;
-
- css::uno::Sequence<css::beans::PropertyValues>* pCellProperties = aCellProperties.getArray();
- PropertyMapVector1::const_iterator aRowIter = m_aRowProperties.begin();
- while( aRowOfCellsIterator != aRowOfCellsIteratorEnd )
- {
- //aRowOfCellsIterator points to a vector of PropertyMapPtr
- PropertyMapVector1::const_iterator aCellIterator = aRowOfCellsIterator->begin();
- PropertyMapVector1::const_iterator aCellIteratorEnd = aRowOfCellsIterator->end();
-
- sal_Int32 nRowStyleMask = 0;
-
- if (aRowOfCellsIterator==m_aCellProperties.begin())
- {
- if(rInfo.nTblLook&0x20)
- nRowStyleMask |= CNF_FIRST_ROW; // first row style used
- }
- else if (aRowOfCellsIterator==aLastRowIterator)
- {
- if(rInfo.nTblLook&0x40)
- nRowStyleMask |= CNF_LAST_ROW; // last row style used
- }
- else if (*aRowIter && (*aRowIter)->isSet(PROP_TBL_HEADER))
- nRowStyleMask |= CNF_FIRST_ROW; // table header implies first row
- if(!nRowStyleMask) // if no row style used yet
- {
- // banding used only if not first and or last row style used
- if(!(rInfo.nTblLook&0x200))
- { // hbanding used
- int n = nRow + 1;
- if(rInfo.nTblLook&0x20)
- n++;
- if(n & 1)
- nRowStyleMask = CNF_ODD_HBAND;
- else
- nRowStyleMask = CNF_EVEN_HBAND;
- }
- }
-
- // Note that this is intentionally called "cell" and not "column".
- // Don't make the mistake that all cell x's will be in the same column.
- // Merged cells (grid span) in a row will affect the actual column. (fake cells were added to handle gridBefore/After)
- sal_Int32 nCell = 0;
- pCellProperties[nRow].realloc( aRowOfCellsIterator->size() );
- beans::PropertyValues* pSingleCellProperties = pCellProperties[nRow].getArray();
-
- while( aCellIterator != aCellIteratorEnd )
- {
- PropertyMapPtr pAllCellProps( new PropertyMap );
-
- PropertyMapVector1::const_iterator aLastCellIterator = aRowOfCellsIterator->end() - 1;
- bool bIsEndCol = aCellIterator == aLastCellIterator;
- bool bIsEndRow = aRowOfCellsIterator == aLastRowIterator;
-
- //aCellIterator points to a PropertyMapPtr;
- if( *aCellIterator )
- {
- // remove directly applied insideV/H borders since they are meaningless without a context (tdf#82177)
- (*aCellIterator)->Erase(META_PROP_VERTICAL_BORDER);
- (*aCellIterator)->Erase(META_PROP_HORIZONTAL_BORDER);
-
- pAllCellProps->InsertProps(rInfo.pTableDefaults);
-
- sal_Int32 nCellStyleMask = 0;
- if (aCellIterator==aRowOfCellsIterator->begin())
- {
- if(rInfo.nTblLook&0x80)
- nCellStyleMask = CNF_FIRST_COLUMN; // first col style used
- }
- else if (bIsEndCol)
- {
- if(rInfo.nTblLook&0x100)
- nCellStyleMask = CNF_LAST_COLUMN; // last col style used
- }
- if(!nCellStyleMask) // if no cell style is used yet
- {
- if(!(rInfo.nTblLook&0x400))
- { // vbanding used
- int n = nCell + 1;
- if(rInfo.nTblLook&0x80)
- n++;
- if(n & 1)
- nCellStyleMask = CNF_ODD_VBAND;
- else
- nCellStyleMask = CNF_EVEN_VBAND;
- }
- }
- sal_Int32 nCnfStyleMask = nCellStyleMask + nRowStyleMask;
- if(nCnfStyleMask == CNF_FIRST_COLUMN + CNF_FIRST_ROW)
- nCnfStyleMask |= CNF_FIRST_ROW_FIRST_COLUMN;
- else if(nCnfStyleMask == CNF_FIRST_COLUMN + CNF_LAST_ROW)
- nCnfStyleMask |= CNF_LAST_ROW_FIRST_COLUMN;
- else if(nCnfStyleMask == CNF_LAST_COLUMN + CNF_FIRST_ROW)
- nCnfStyleMask |= CNF_FIRST_ROW_LAST_COLUMN;
- else if(nCnfStyleMask == CNF_LAST_COLUMN + CNF_LAST_ROW)
- nCnfStyleMask |= CNF_LAST_ROW_LAST_COLUMN;
-
- if ( rInfo.pTableStyle )
- {
- PropertyMapPtr pStyleProps = rInfo.pTableStyle->GetProperties( nCnfStyleMask );
-
- // Check if we need to clean up some empty border definitions to match what Word does.
- static const PropertyIds pBorders[] =
- {
- PROP_TOP_BORDER, PROP_LEFT_BORDER, PROP_BOTTOM_BORDER, PROP_RIGHT_BORDER
- };
- for (const PropertyIds& rBorder : pBorders)
- {
- std::optional<PropertyMap::Property> oStyleCellBorder = pStyleProps->getProperty(rBorder);
- std::optional<PropertyMap::Property> oDirectCellBorder = (*aCellIterator)->getProperty(rBorder);
- if (oStyleCellBorder && oDirectCellBorder)
- {
- // We have a cell border from the table style and as direct formatting as well.
- table::BorderLine2 aStyleCellBorder = oStyleCellBorder->second.get<table::BorderLine2>();
- table::BorderLine2 aDirectCellBorder = oDirectCellBorder->second.get<table::BorderLine2>();
- if (aStyleCellBorder.LineStyle != table::BorderLineStyle::NONE && aDirectCellBorder.LineStyle == table::BorderLineStyle::NONE)
- {
- // The style one would be visible, but then cleared away as direct formatting.
- // Delete both, so that table formatting can become visible.
- pStyleProps->Erase(rBorder);
- (*aCellIterator)->Erase(rBorder);
- }
- else
- {
- std::optional<PropertyMap::Property> oTableBorder = rInfo.pTableBorders->getProperty(rBorder);
- if (oTableBorder)
- {
- table::BorderLine2 aTableBorder = oTableBorder->second.get<table::BorderLine2>();
- // Both style and direct formatting says that the cell has no border.
- bool bNoCellBorder = aStyleCellBorder.LineStyle == table::BorderLineStyle::NONE && aDirectCellBorder.LineStyle == table::BorderLineStyle::NONE;
- if (aTableBorder.LineStyle != table::BorderLineStyle::NONE && bNoCellBorder)
- {
- // But at a table-level, there is a border, then again delete both cell properties.
- pStyleProps->Erase(rBorder);
- (*aCellIterator)->Erase(rBorder);
- }
- }
- }
- }
- }
-
- pAllCellProps->InsertProps( pStyleProps );
- }
-
- // Remove properties from style/row that aren't allowed in cells
- pAllCellProps->Erase( PROP_HEADER_ROW_COUNT );
- pAllCellProps->Erase( PROP_TBL_HEADER );
-
- // Then add the cell properties
- pAllCellProps->InsertProps(*aCellIterator);
- std::swap(*(*aCellIterator), *pAllCellProps );
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("cell");
- TagLogger::getInstance().attribute("cell", nCell);
- TagLogger::getInstance().attribute("row", nRow);
-#endif
-
- // Do not apply horizontal and vertical borders to a one cell table.
- if (m_aCellProperties.size() <= 1 && aRowOfCellsIterator->size() <= 1)
- {
- rInfo.pTableBorders->Erase(META_PROP_HORIZONTAL_BORDER);
- rInfo.pTableBorders->Erase(META_PROP_VERTICAL_BORDER);
- }
- // Do not apply vertical borders to a one column table.
- else if (m_aCellProperties.size() > 1 && aRowOfCellsIterator->size() <= 1)
- {
- bool isOneCol = true;
- for (size_t i = nRow; i < m_aCellProperties.size(); i++)
- {
- if (m_aCellProperties[i].size() > 1)
- {
- isOneCol = false;
- break;
- }
- }
- if (isOneCol)
- rInfo.pTableBorders->Erase(META_PROP_VERTICAL_BORDER);
- }
- // Do not apply horizontal borders to a one row table.
- else if (m_aCellProperties.size() == 1 && aRowOfCellsIterator->size() > 1)
- {
- rInfo.pTableBorders->Erase(META_PROP_HORIZONTAL_BORDER);
- }
-
- // tdf#129452 Checking if current cell is vertically merged with all the other cells below to the bottom.
- // This must be done in order to apply the bottom border of the table to the first cell in a vertical merge.
- std::optional<PropertyMap::Property> oProp = m_aCellProperties[nRow][nCell]->getProperty(PROP_VERTICAL_MERGE);
- bool bMergedVertically = oProp && oProp->second.get<bool>(); // starting cell
- if ( bMergedVertically )
- {
- const sal_uInt32 nColumn = m_rDMapper_Impl.getTableManager().findColumn(nRow, nCell);
- sal_Int32 nLastMergedRow = 0;
- for (size_t i = nRow + 1; bMergedVertically && i < m_aCellProperties.size(); i++)
- {
- const sal_uInt32 nColumnCell = m_rDMapper_Impl.getTableManager().findColumnCell(i, nColumn);
- if ( m_aCellProperties[i].size() > sal::static_int_cast<std::size_t>(nColumnCell) )
- {
- oProp = m_aCellProperties[i][nColumnCell]->getProperty(PROP_VERTICAL_MERGE);
- bMergedVertically = oProp && !oProp->second.get<bool>(); //continuing cell
- if ( bMergedVertically )
- nLastMergedRow = i;
- }
- else
- bMergedVertically = false;
- }
-
- // Only consider the bottom border setting from the last merged cell.
- // Note: in MSO, left/right apply per-unmerged-row. Can't do that in LO, so just using the top cell's borders should be fine.
- if ( nRow < nLastMergedRow )
- {
- (*aCellIterator)->Erase(PROP_BOTTOM_BORDER);
- const sal_uInt32 nColumnCell = m_rDMapper_Impl.getTableManager().findColumnCell(nLastMergedRow, nColumn);
- lcl_mergeBorder( PROP_BOTTOM_BORDER, m_aCellProperties[nLastMergedRow][nColumnCell], *aCellIterator );
- }
- }
-
- const sal_uInt32 nFirstCell = m_rDMapper_Impl.getTableManager().getGridBefore(nRow);
- const sal_uInt32 nLastCell = m_aCellProperties[nRow].size() - m_rDMapper_Impl.getTableManager().getGridAfter(nRow) - 1;
- lcl_computeCellBorders( rInfo.pTableBorders, *aCellIterator, nCell, nFirstCell, nLastCell, nRow, bIsEndRow, bMergedVertically );
-
- //now set the default left+right border distance TODO: there's an sprm containing the default distance!
- aCellIterator->get()->Insert( PROP_LEFT_BORDER_DISTANCE,
- uno::Any(rInfo.nLeftBorderDistance ), false);
- aCellIterator->get()->Insert( PROP_RIGHT_BORDER_DISTANCE,
- uno::Any(rInfo.nRightBorderDistance ), false);
- aCellIterator->get()->Insert( PROP_TOP_BORDER_DISTANCE,
- uno::Any(rInfo.nTopBorderDistance ), false);
- aCellIterator->get()->Insert( PROP_BOTTOM_BORDER_DISTANCE,
- uno::Any(rInfo.nBottomBorderDistance ), false);
-
- // Horizontal merge is not a UNO property, extract that info here to rMerges, and then remove it from the map.
- const std::optional<PropertyMap::Property> aHorizontalMergeVal = (*aCellIterator)->getProperty(PROP_HORIZONTAL_MERGE);
- if (aHorizontalMergeVal)
- {
- if (aHorizontalMergeVal->second.get<bool>())
- {
- // first cell in a merge
- HorizontallyMergedCell aMerge(nRow, nCell);
- rMerges.push_back(aMerge);
- }
- else if (!rMerges.empty())
- {
- // resuming an earlier merge
- HorizontallyMergedCell& rMerge = rMerges.back();
- rMerge.m_nLastRow = nRow;
- rMerge.m_nLastCol = nCell;
- }
- (*aCellIterator)->Erase(PROP_HORIZONTAL_MERGE);
- }
- pSingleCellProperties[nCell] = (*aCellIterator)->GetPropertyValues();
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
- }
- ++nCell;
- ++aCellIterator;
- }
- ++nRow;
- ++aRowOfCellsIterator;
- ++aRowIter;
- }
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-
- return aCellProperties;
-}
-
-/// Do all cells in this row have a CellHideMark property?
-static bool lcl_hideMarks(PropertyMapVector1& rCellProperties)
-{
- for (const PropertyMapPtr & p : rCellProperties)
- {
- // if anything is vertically merged, the row must not be set to fixed
- // as Writer's layout doesn't handle that well
- if (!p->isSet(PROP_CELL_HIDE_MARK) || p->isSet(PROP_VERTICAL_MERGE))
- return false;
- }
- return true;
-}
-
-/// Are all cells in this row empty?
-static bool lcl_emptyRow(std::vector<RowSequence_t>& rTableRanges, sal_Int32 nRow)
-{
- if (nRow >= static_cast<sal_Int32>(rTableRanges.size()))
- {
- SAL_WARN("writerfilter.dmapper", "m_aCellProperties not in sync with rTableRanges?");
- return false;
- }
-
- const RowSequence_t rRowSeq = rTableRanges[nRow];
- if (!rRowSeq.hasElements())
- {
- SAL_WARN("writerfilter.dmapper", "m_aCellProperties not in sync with rTableRanges?");
- return false;
- }
-
- if (!rRowSeq[0][0].is())
- {
- // This can happen when we can't import the table, e.g. we're inside a
- // comment.
- SAL_WARN("writerfilter.dmapper", "rRowSeq[0][0] is an empty reference");
- return false;
- }
-
- uno::Reference<text::XTextRangeCompare> xTextRangeCompare(rRowSeq[0][0]->getText(), uno::UNO_QUERY);
- try
- {
- // See SwXText::Impl::ConvertCell(), we need to compare the start of
- // the start and the end of the end. However for our text ranges, only
- // the starts are set, so compareRegionStarts() does what we need.
- bool bRangesAreNotEqual = std::any_of(rRowSeq.begin(), rRowSeq.end(),
- [&xTextRangeCompare](const CellSequence_t& rCellSeq) {
- return xTextRangeCompare->compareRegionStarts(rCellSeq[0], rCellSeq[1]) != 0; });
- if (bRangesAreNotEqual)
- return false;
- }
- catch (const lang::IllegalArgumentException&)
- {
- TOOLS_WARN_EXCEPTION( "writerfilter.dmapper", "compareRegionStarts() failed");
- return false;
- }
- return true;
-}
-
-css::uno::Sequence<css::beans::PropertyValues> DomainMapperTableHandler::endTableGetRowProperties()
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("getRowProperties");
-#endif
-
- css::uno::Sequence<css::beans::PropertyValues> aRowProperties( m_aRowProperties.size() );
- auto aRowPropertiesRange = asNonConstRange(aRowProperties);
- sal_Int32 nRow = 0;
- for( const auto& rRow : m_aRowProperties )
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("rowProps.row");
-#endif
- if (rRow)
- {
- //set default to 'break across pages"
- rRow->Insert( PROP_IS_SPLIT_ALLOWED, uno::Any(true ), false );
- // tblHeader is only our property, remove before the property map hits UNO
- rRow->Erase(PROP_TBL_HEADER);
-
- if (lcl_hideMarks(m_aCellProperties[nRow]) && lcl_emptyRow(m_aTableRanges, nRow))
- {
- // We have CellHideMark on all cells, and also all cells are empty:
- // Force the row height to be exactly as specified, and not just as the minimum suggestion.
- rRow->Insert(PROP_SIZE_TYPE, uno::Any(text::SizeType::FIX));
- }
-
- aRowPropertiesRange[nRow] = rRow->GetPropertyValues();
-#ifdef DBG_UTIL
- rRow->dumpXml();
- lcl_DumpPropertyValues(aRowProperties[nRow]);
-#endif
- }
- ++nRow;
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
- }
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-
- return aRowProperties;
-}
-
-static bool isAbsent(const std::vector<beans::PropertyValue>& propvals, const OUString& name)
-{
- return std::find_if(propvals.begin(), propvals.end(),
- [&name](const beans::PropertyValue& propval)
- { return propval.Name == name; })
- == propvals.end();
-}
-
-// table style has got bigger precedence than docDefault style,
-// but lower precedence than the paragraph styles and direct paragraph formatting
-void DomainMapperTableHandler::ApplyParagraphPropertiesFromTableStyle(TableParagraph rParaProp, std::vector< PropertyIds > aAllTableParaProperties, const css::beans::PropertyValues rCellProperties)
-{
- // Setting paragraph or character properties using setPropertyValue may have unwanted
- // side effects; e.g., setting a paragraph's font size can reset font size in a runs
- // of the paragraph, which have own formatting, which should have highest precedence.
- // Thus we have to collect property values, construct an autostyle, and assign it to
- // the paragraph, to avoid such side effects.
-
- // 1. Collect all the table-style-defined properties, that aren't overridden by the
- // paragraph style or direct formatting
- std::vector<beans::PropertyValue> aProps;
- std::optional<OUString> oParagraphText;
-
- for( auto const& eId : aAllTableParaProperties )
- {
- // apply paragraph and character properties of the table style on table paragraphs
- // if there is no direct paragraph formatting
- bool bSetDirectlyInParaLevel = rParaProp.m_pPropertyMap->isSet(eId);
- if ( !bSetDirectlyInParaLevel || isCharacterProperty(eId) )
- {
- if ( (eId == PROP_PARA_LEFT_MARGIN || eId == PROP_PARA_FIRST_LINE_INDENT) &&
- rParaProp.m_pPropertyMap->isSet(PROP_NUMBERING_RULES) )
- {
- // indentation of direct numbering has bigger precedence, than table style
- continue;
- }
-
- OUString sPropertyName = getPropertyName(eId);
-
- auto pCellProp = std::find_if(rCellProperties.begin(), rCellProperties.end(),
- [&](const beans::PropertyValue& rProp) { return rProp.Name == sPropertyName; });
- // this cell applies the table style property
- if (pCellProp != rCellProperties.end())
- {
- if (bSetDirectlyInParaLevel) // it is a character property set directly in the paragraph
- {
- if (!oParagraphText) // do it only once
- {
- uno::Reference<text::XParagraphCursor> xParagraph(
- rParaProp.m_rEndParagraph->getText()->createTextCursorByRange(rParaProp.m_rEndParagraph), uno::UNO_QUERY_THROW );
- // select paragraph
- xParagraph->gotoStartOfParagraph( true );
- oParagraphText = xParagraph->getString();
- }
- // don't overwrite empty paragraph with table style, if it has a direct paragraph formatting
- if (oParagraphText->isEmpty())
- continue;
- }
- // handle paragraph background color defined in CellColorHandler
- if (eId == PROP_FILL_COLOR)
- {
- auto pFillStyleProp = std::find_if(rCellProperties.begin(), rCellProperties.end(),
- [](const beans::PropertyValue& rProp) { return rProp.Name == "FillStyle"; });
- if ( pFillStyleProp == rCellProperties.end() ||
- pFillStyleProp->Value != uno::Any(drawing::FillStyle_SOLID) )
- {
- // FillStyle_NONE, skip table style usage for paragraph background color
- continue;
- }
- }
- OUString sParaStyleName;
- rParaProp.m_rPropertySet->getPropertyValue("ParaStyleName") >>= sParaStyleName;
- bool bDocDefault;
- uno::Any aParaStyle = m_rDMapper_Impl.GetPropertyFromStyleSheet(eId,
- m_rDMapper_Impl.GetStyleSheetTable()->FindStyleSheetByConvertedStyleName(sParaStyleName),
- true, true, &bDocDefault);
- // A very strange compatibility rule says that the DEFAULT style's specified fontsize of 11 or 12
- // or a specified left justify will always be overridden by the table-style.
- // Normally this rule is applied, so always do this unless a compatSetting indicates otherwise.
- bool bCompatOverride = false;
- if ( (eId == PROP_CHAR_HEIGHT || eId == PROP_PARA_ADJUST) && sParaStyleName == m_rDMapper_Impl.GetDefaultParaStyleName() )
- {
- if ( eId == PROP_CHAR_HEIGHT )
- bCompatOverride = aParaStyle == uno::Any(double(11)) || aParaStyle == uno::Any(double(12));
- else if ( eId == PROP_PARA_ADJUST )
- {
- style::ParagraphAdjust eAdjust(style::ParagraphAdjust_CENTER);
- aParaStyle >>= eAdjust;
- bCompatOverride = eAdjust == style::ParagraphAdjust_LEFT;
- }
-
- // The wording is confusing here. Normally, the paragraph style DOES override the table-style.
- // But for these two special situations, do not override the table-style. So the default is false.
- // If false, then "CompatOverride" the normal behaviour, and apply the table-style's value.
- bCompatOverride &= !m_rDMapper_Impl.GetSettingsTable()->
- GetCompatSettingHasAndValue(u"overrideTableStyleFontSizeAndJustification").second;
- }
-
- // use table style when no paragraph style setting or a docDefault value is applied instead of it
- if (!aParaStyle.hasValue() || bDocDefault || bCompatOverride) try
- {
- // apply style setting when the paragraph doesn't modify it
- aProps.push_back(comphelper::makePropertyValue(sPropertyName, pCellProp->Value));
- if (eId == PROP_FILL_COLOR)
- {
- // we need this for complete import of table-style based paragraph background color
- aProps.push_back(comphelper::makePropertyValue("FillStyle", uno::Any(drawing::FillStyle_SOLID)));
- }
- }
- catch ( const uno::Exception & )
- {
- TOOLS_INFO_EXCEPTION("writerfilter.dmapper", "Exception during table style correction");
- }
- }
- }
- }
-
- if (!aProps.empty())
- {
- // 2. Get all properties directly defined in the paragraph
- uno::Reference<beans::XPropertySetInfo> xPropSetInfo(
- rParaProp.m_rPropertySet->getPropertySetInfo(), uno::UNO_SET_THROW);
- auto props = xPropSetInfo->getProperties();
- uno::Sequence<OUString> propNames(props.getLength());
- std::transform(props.begin(), props.end(), propNames.getArray(),
- [](const beans::Property& prop) { return prop.Name; });
- uno::Reference<beans::XTolerantMultiPropertySet> xTolPara(rParaProp.m_rPropertySet,
- uno::UNO_QUERY_THROW);
- // getDirectPropertyValuesTolerant requires a sorted sequence.
- // Let's hope XPropertySetInfo::getProperties returns a sorted sequence.
- for (auto& val : xTolPara->getDirectPropertyValuesTolerant(propNames))
- {
- // 3. Add them to aProps, unless such properties are already there
- // (which means, that 'val' comes from docDefault)
- if (val.Result == beans::TolerantPropertySetResultType::SUCCESS
- && val.State == beans::PropertyState_DIRECT_VALUE
- && isAbsent(aProps, val.Name))
- {
- aProps.push_back(comphelper::makePropertyValue(val.Name, val.Value));
- }
- }
-
- // 4. Create an autostyle, and assign it to the paragraph. The hidden ParaAutoStyleDef
- // property is handled in SwXTextCursor::setPropertyValue.
- uno::Reference<beans::XPropertySet> xCursorProps(
- rParaProp.m_rEndParagraph->getText()->createTextCursorByRange(
- rParaProp.m_rEndParagraph),
- uno::UNO_QUERY_THROW);
- xCursorProps->setPropertyValue("ParaAutoStyleDef",
- uno::Any(comphelper::containerToSequence(aProps)));
- }
-}
-
-// convert formula range identifier ABOVE, BELOW, LEFT and RIGHT
-static void lcl_convertFormulaRanges(const uno::Reference<text::XTextTable> & xTable)
-{
- uno::Reference<table::XCellRange> xCellRange(xTable, uno::UNO_QUERY_THROW);
- uno::Reference<container::XIndexAccess> xTableRows(xTable->getRows(), uno::UNO_QUERY_THROW);
- sal_Int32 nRows = xTableRows->getCount();
- for (sal_Int32 nRow = 0; nRow < nRows; ++nRow)
- {
- for (sal_Int16 nCol = 0; nCol < MAXTABLECELLS; ++nCol)
- {
- try
- {
- uno::Reference<beans::XPropertySet> xCellProperties(xCellRange->getCellByPosition(nCol, nRow), uno::UNO_QUERY_THROW);
- uno::Sequence<beans::PropertyValue> aCellGrabBag;
- xCellProperties->getPropertyValue("CellInteropGrabBag") >>= aCellGrabBag;
- OUString sFormula;
- bool bReplace = false;
- for (const auto& rProp : aCellGrabBag)
- {
- if ( rProp.Name == "CellFormulaConverted" )
- {
- rProp.Value >>= sFormula;
- struct RangeDirection
- {
- OUString m_sName;
- sal_Int16 m_nCol;
- sal_Int16 m_nRow;
- };
- static const RangeDirection pDirections[] =
- {
- { OUString(" LEFT "), -1, 0},
- { OUString(" RIGHT "), 1, 0},
- { OUString(" ABOVE "), 0, -1},
- { OUString(" BELOW "), 0, 1 }
- };
- for (const RangeDirection& rRange : pDirections)
- {
- if ( sFormula.indexOf(rRange.m_sName) > -1 )
- {
- // range starts at the first cell above/below/left/right, but ends at the
- // table border or at the first non-value cell after a value cell
- bool bFoundFirst = false;
- OUString sNextCell;
- OUString sLastCell;
- OUString sLastValueCell;
- // walk through the cells of the range
- try
- {
- sal_Int32 nCell = 0;
- while (++nCell)
- {
- uno::Reference<beans::XPropertySet> xCell(
- xCellRange->getCellByPosition(nCol + nCell * rRange.m_nCol, nRow + nCell * rRange.m_nRow),
- uno::UNO_QUERY_THROW);
- // empty cell or cell with text content is end of the range
- uno::Reference<text::XText> xText(xCell, uno::UNO_QUERY_THROW);
- sLastCell = xCell->getPropertyValue("CellName").get<OUString>();
- if (sNextCell.isEmpty())
- sNextCell = sLastCell;
-
- // accept numbers with comma and percent
- OUString sCellText = xText->getString().replace(',', '.');
- if (sCellText.endsWith("%"))
- sCellText = sCellText.copy(0, sCellText.getLength()-1);
-
- rtl_math_ConversionStatus eConversionStatus;
- sal_Int32 nParsedEnd;
- rtl::math::stringToDouble(sCellText, '.', ',', &eConversionStatus, &nParsedEnd);
- if ( eConversionStatus != rtl_math_ConversionStatus_Ok || nParsedEnd == 0 )
- {
- if ( !bFoundFirst )
- {
- // still search value cells
- continue;
- }
- else
- {
- // end of range
- break;
- }
- }
- sLastValueCell = sLastCell;
- bFoundFirst = true;
- }
- }
- catch ( const lang::IndexOutOfBoundsException & )
- {
- }
-
- if ( !sNextCell.isEmpty() )
- {
- OUString sRange = "<" + sNextCell + ":" +
- ( sLastValueCell.isEmpty() ? sLastCell : sLastValueCell ) + ">";
- sFormula = sFormula.replaceAll(rRange.m_sName, sRange);
- bReplace = true;
- }
- }
- }
-
- // update formula field
- if (bReplace)
- {
- uno::Reference<text::XText> xCell(xCellRange->getCellByPosition(nCol, nRow), uno::UNO_QUERY);
- uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xCell, uno::UNO_QUERY);
- uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration();
- uno::Reference<container::XEnumerationAccess> xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY);
- uno::Reference<container::XEnumeration> xRunEnum = xRunEnumAccess->createEnumeration();
- while ( xRunEnum->hasMoreElements() )
- {
- uno::Reference<text::XTextRange> xRun(xRunEnum->nextElement(), uno::UNO_QUERY);
- uno::Reference< beans::XPropertySet > xRunProperties( xRun, uno::UNO_QUERY_THROW );
- if ( xRunProperties->getPropertyValue("TextPortionType") == uno::Any(OUString("TextField")) )
- {
- uno::Reference<text::XTextField> const xField(xRunProperties->getPropertyValue("TextField").get<uno::Reference<text::XTextField>>());
- uno::Reference< beans::XPropertySet > xFieldProperties( xField, uno::UNO_QUERY_THROW );
- // cell can contain multiple text fields, but only one is handled now (~formula cell)
- if ( rProp.Value != xFieldProperties->getPropertyValue("Content") )
- continue;
- xFieldProperties->setPropertyValue("Content", uno::Any(sFormula));
- // update grab bag
- auto aGrabBag = comphelper::sequenceToContainer< std::vector<beans::PropertyValue> >(aCellGrabBag);
- beans::PropertyValue aValue;
- aValue.Name = "CellFormulaConverted";
- aValue.Value <<= sFormula;
- aGrabBag.push_back(aValue);
- xCellProperties->setPropertyValue("CellInteropGrabBag", uno::Any(comphelper::containerToSequence(aGrabBag)));
- }
- }
- }
- }
- }
- }
- catch ( const lang::IndexOutOfBoundsException & )
- {
- // jump to next table row
- break;
- }
- }
- }
-}
-
-void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablehandler.endTable");
-#endif
-
- // If we want to make this table a floating one.
- std::vector<beans::PropertyValue> aFrameProperties = comphelper::sequenceToContainer<std::vector<beans::PropertyValue> >
- (m_rDMapper_Impl.getTableManager().getCurrentTablePosition());
- TableInfo aTableInfo;
- aTableInfo.nNestLevel = nestedTableLevel;
-
- // non-floating tables need floating in footnotes and endnotes, because
- // Writer core cannot handle (i.e. save in ODT, copy, edit etc.) them otherwise
- bool bConvertToFloating = aFrameProperties.empty() &&
- nestedTableLevel <= 1 &&
- m_rDMapper_Impl.IsInFootOrEndnote();
- bool bFloating = !aFrameProperties.empty() || bConvertToFloating;
-
- aTableInfo.pTableStyle = endTableGetTableStyle(aTableInfo, aFrameProperties, bConvertToFloating);
- // expands to uno::Sequence< Sequence< beans::PropertyValues > >
-
- std::vector<HorizontallyMergedCell> aMerges;
- CellPropertyValuesSeq_t aCellProperties = endTableGetCellProperties(aTableInfo, aMerges);
-
- css::uno::Sequence<css::beans::PropertyValues> aRowProperties = endTableGetRowProperties();
-
-#ifdef DBG_UTIL
- lcl_DumpPropertyValueSeq(aRowProperties);
-#endif
-
- if (!m_aTableRanges.empty())
- {
- uno::Reference<text::XTextRange> xStart;
- uno::Reference<text::XTextRange> xEnd;
-
- // fill empty frame properties to create an invisible frame around the table:
- // hide frame borders and zero inner and outer frame margins
- if (bConvertToFloating)
- DomainMapper_Impl::fillEmptyFrameProperties(aFrameProperties, true);
-
- // OOXML table style may contain paragraph properties, apply these on cell paragraphs
- if ( m_aTableRanges[0].hasElements() && m_aTableRanges[0][0].hasElements() )
- {
- // collect all paragraph properties used in table styles
- PropertyMapPtr pAllTableProps( new PropertyMap );
- pAllTableProps->InsertProps(aTableInfo.pTableDefaults);
- if ( aTableInfo.pTableStyle )
- pAllTableProps->InsertProps(aTableInfo.pTableStyle->GetProperties( CNF_ALL ));
- for (const auto& eId : pAllTableProps->GetPropertyIds())
- {
- if ( !isParagraphProperty(eId) && !isCharacterProperty(eId) )
- pAllTableProps->Erase(eId);
- }
- std::vector< PropertyIds > aAllTableParaProperties = pAllTableProps->GetPropertyIds();
-
- if ( !aAllTableParaProperties.empty() )
- {
- TableParagraphVectorPtr pTableParagraphs = m_rDMapper_Impl.getTableManager().getCurrentParagraphs();
- for (size_t nRow = 0; nRow < m_aTableRanges.size(); ++nRow)
- {
- // Note that this is "cell" since you must not treat it as "column".
- for (size_t nCell = 0; nCell < m_aTableRanges[nRow].size(); ++nCell)
- {
- auto rStartPara = m_aTableRanges[nRow][nCell][0];
- if (!rStartPara.is())
- continue;
- auto rEndPara = m_aTableRanges[nRow][nCell][1];
- uno::Reference<text::XTextRangeCompare> xTextRangeCompare(rStartPara->getText(), uno::UNO_QUERY);
- bool bApply = false;
- // search paragraphs of the cell
- std::vector<TableParagraph>::iterator aIt = pTableParagraphs->begin();
- while ( aIt != pTableParagraphs->end() ) try
- {
- if (!bApply && xTextRangeCompare->compareRegionStarts(rStartPara, aIt->m_rStartParagraph) == 0)
- bApply = true;
- if (bApply)
- {
- bool bEndOfApply = (xTextRangeCompare->compareRegionEnds(rEndPara, aIt->m_rEndParagraph) == 0);
- // tdf#153891 handle missing cell properties (exception in style handling?)
- if ( nCell < sal::static_int_cast<std::size_t>(aCellProperties[nRow].getLength()) )
- ApplyParagraphPropertiesFromTableStyle(*aIt, aAllTableParaProperties, aCellProperties[nRow][nCell]);
- // erase processed paragraph from list of pending paragraphs
- aIt = pTableParagraphs->erase(aIt);
- if (bEndOfApply)
- break;
- }
- else
- ++aIt;
- }
- catch( const lang::IllegalArgumentException & )
- {
- // skip compareRegion with nested tables
- ++aIt;
- }
- }
- }
- }
- }
-
- // Additional checks: if we can do this.
- if (bFloating && m_aTableRanges[0].hasElements() && m_aTableRanges[0][0].hasElements())
- {
- xStart = m_aTableRanges[0][0][0];
- uno::Sequence< uno::Sequence< uno::Reference<text::XTextRange> > >& rLastRow = m_aTableRanges[m_aTableRanges.size() - 1];
- if (rLastRow.hasElements())
- {
- const uno::Sequence< uno::Reference<text::XTextRange> >& rLastCell = rLastRow[rLastRow.getLength() - 1];
- xEnd = rLastCell[1];
- }
- }
- uno::Reference<text::XTextTable> xTable;
- try
- {
- if (m_xText.is())
- {
- xTable = m_xText->convertToTable(comphelper::containerToSequence(m_aTableRanges), aCellProperties, aRowProperties, aTableInfo.aTableProperties);
-
- if (xTable.is())
- {
- if (!aMerges.empty())
- {
- static const std::vector<std::u16string_view> aBorderNames
- = { u"TopBorder", u"LeftBorder", u"BottomBorder", u"RightBorder" };
-
- // Perform horizontal merges in reverse order, so the fact that merging changes the position of cells won't cause a problem for us.
- for (std::vector<HorizontallyMergedCell>::reverse_iterator it = aMerges.rbegin(); it != aMerges.rend(); ++it)
- {
- uno::Reference<table::XCellRange> xCellRange(xTable, uno::UNO_QUERY_THROW);
- uno::Reference<beans::XPropertySet> xFirstCell(
- xCellRange->getCellByPosition(it->m_nFirstCol, it->m_nFirstRow),
- uno::UNO_QUERY_THROW);
- OUString aFirst
- = xFirstCell->getPropertyValue("CellName").get<OUString>();
- // tdf#105852: Only try to merge if m_nLastCol is set (i.e. there were some merge continuation cells)
- if (it->m_nLastCol != -1)
- {
- // Save border properties of the first cell
- // before merge.
- table::BorderLine2 aBorderValues[4];
- for (size_t i = 0; i < aBorderNames.size(); ++i)
- xFirstCell->getPropertyValue(OUString(aBorderNames[i]))
- >>= aBorderValues[i];
-
- uno::Reference<beans::XPropertySet> xLastCell(
- xCellRange->getCellByPosition(it->m_nLastCol, it->m_nLastRow),
- uno::UNO_QUERY_THROW);
- OUString aLast
- = xLastCell->getPropertyValue("CellName").get<OUString>();
-
- uno::Reference<text::XTextTableCursor> xCursor = xTable->createCursorByCellName(aFirst);
- xCursor->gotoCellByName(aLast, true);
-
- xCursor->mergeRange();
-
- // Handle conflicting properties: mergeRange()
- // takes the last cell, Word takes the first
- // cell.
- for (size_t i = 0; i < aBorderNames.size(); ++i)
- {
- if (aBorderValues[i].LineStyle != table::BorderLineStyle::NONE)
- xFirstCell->setPropertyValue(
- OUString(aBorderNames[i]), uno::Any(aBorderValues[i]));
- }
- }
- }
- }
-
- // convert special range IDs ABOVE, BELOW, LEFT and RIGHT
- lcl_convertFormulaRanges(xTable);
- }
- }
- }
- catch ( const lang::IllegalArgumentException & )
- {
- TOOLS_INFO_EXCEPTION("writerfilter.dmapper", "Conversion to table error");
-#ifdef DBG_UTIL
- TagLogger::getInstance().chars(std::string("failed to import table!"));
-#endif
- }
- catch ( const uno::Exception & )
- {
- TOOLS_INFO_EXCEPTION("writerfilter.dmapper", "Exception during table creation");
- }
-
- // If we have a table with a start and an end position, we should make it a floating one.
- if (xTable.is() && xStart.is() && xEnd.is())
- {
- uno::Reference<beans::XPropertySet> xTableProperties(xTable, uno::UNO_QUERY);
- bool bIsRelative = false;
- xTableProperties->getPropertyValue("IsWidthRelative") >>= bIsRelative;
- if (!bIsRelative)
- {
- beans::PropertyValue aValue;
- aValue.Name = "Width";
- aValue.Value = xTableProperties->getPropertyValue("Width");
- aFrameProperties.push_back(aValue);
- }
- else
- {
- beans::PropertyValue aValue;
- aValue.Name = "FrameWidthPercent";
- aValue.Value = xTableProperties->getPropertyValue("RelativeWidth");
- aFrameProperties.push_back(aValue);
-
- // Applying the relative width to the frame, needs to have the table width to be 100% of the frame width
- xTableProperties->setPropertyValue("RelativeWidth", uno::Any(sal_Int16(100)));
- }
-
- // A non-zero left margin would move the table out of the frame, move the frame itself instead.
- xTableProperties->setPropertyValue("LeftMargin", uno::Any(sal_Int32(0)));
-
- style::BreakType eBreakType{};
- xTableProperties->getPropertyValue("BreakType") >>= eBreakType;
- if (eBreakType != style::BreakType_NONE)
- {
- // A break before the table was requested. Reset that break here, since the table
- // will be at the start of the fly frame, not in the body frame.
- xTableProperties->setPropertyValue("BreakType", uno::Any(style::BreakType_NONE));
- }
-
- if (nestedTableLevel >= 2 || m_rDMapper_Impl.IsInHeaderFooter())
- {
- // Floating tables inside a table always stay inside the cell.
- // Also extend the header/footer area if needed, so an in-header floating table
- // typically doesn't overlap with body test.
- bool bIsFollowingTextFlow = true;
-
- sal_Int16 nVertOrientRelation{};
- auto it = std::find_if(aFrameProperties.begin(), aFrameProperties.end(),
- [](const beans::PropertyValue& rPropertyValue) -> bool
- { return rPropertyValue.Name == "VertOrientRelation"; });
- if (it != aFrameProperties.end())
- {
- it->Value >>= nVertOrientRelation;
- if (nVertOrientRelation == text::RelOrientation::PAGE_FRAME)
- {
- // If vertical relation is page, follow-text-flow is not useful and causes
- // unwanted wrap of body text around in-header floating table, so avoid it.
- bIsFollowingTextFlow = false;
- }
- }
-
- aFrameProperties.push_back(
- comphelper::makePropertyValue("IsFollowingTextFlow", bIsFollowingTextFlow));
- }
-
- // A text frame created for floating tables is always allowed to split.
- aFrameProperties.push_back(comphelper::makePropertyValue("IsSplitAllowed", true));
-
- sal_Int32 nTableWidth = 0;
- m_aTableProperties->getValue(TablePropertyMap::TABLE_WIDTH, nTableWidth);
- sal_Int32 nTableWidthType = text::SizeType::FIX;
- m_aTableProperties->getValue(TablePropertyMap::TABLE_WIDTH_TYPE, nTableWidthType);
- // m_xText points to the body text, get the current xText from m_rDMapper_Impl, in case e.g. we would be in a header.
- uno::Reference<text::XTextAppendAndConvert> xTextAppendAndConvert(m_rDMapper_Impl.GetTopTextAppend(), uno::UNO_QUERY);
- uno::Reference<beans::XPropertySet> xFrameAnchor;
-
- // Writer layout has problems with redlines on floating table rows in footnotes, avoid
- // them.
- bool bInFootnote = m_rDMapper_Impl.IsInFootOrEndnote();
- bool bRecordChanges = m_rDMapper_Impl.GetSettingsTable()->GetRecordChanges();
- if (xTextAppendAndConvert.is() && !(bInFootnote && bRecordChanges))
- {
- std::deque<css::uno::Any> aFramedRedlines = m_rDMapper_Impl.m_aStoredRedlines[StoredRedlines::FRAME];
- std::vector<sal_Int32> redPos, redLen;
- std::vector<OUString> redCell;
- std::vector<OUString> redTable;
- BeforeConvertToTextFrame(aFramedRedlines, redPos, redLen, redCell, redTable);
-
- uno::Reference<text::XTextContent> xContent = xTextAppendAndConvert->convertToTextFrame(xStart, xEnd, comphelper::containerToSequence(aFrameProperties));
- xFrameAnchor.set(xContent->getAnchor(), uno::UNO_QUERY);
-
- bool bConvertToFloatingInFootnote = false;
- if (xContent.is() && xContent->getAnchor().is())
- {
- uno::Reference<lang::XServiceInfo> xText(xContent->getAnchor()->getText(), uno::UNO_QUERY);
- if (xText.is())
- {
- bConvertToFloatingInFootnote = xText->supportsService("com.sun.star.text.Footnote");
- }
- }
-
- // paragraph of the anchoring point of the floating table needs zero top and bottom
- // margins, if the table was a not floating table in the footnote, otherwise
- // docDefault margins could result bigger vertical spaces around the table
- if ( bConvertToFloatingInFootnote && xContent.is() )
- {
- uno::Reference<beans::XPropertySet> xParagraph(
- xContent->getAnchor(), uno::UNO_QUERY);
- if ( xParagraph.is() )
- {
- xParagraph->setPropertyValue("ParaTopMargin",
- uno::Any(static_cast<sal_Int32>(0)));
- xParagraph->setPropertyValue("ParaBottomMargin",
- uno::Any(static_cast<sal_Int32>(0)));
- }
- }
-
- if (xContent.is())
- {
- // By the time the frame is created, the anchor's paragraph marker character
- // properties are already imported. Check if we need to disable "vanish", that
- // would lead to a hidden floating table in Writer, but it does not in Word.
- uno::Reference<beans::XPropertySet> xParagraph(xContent->getAnchor(),
- uno::UNO_QUERY);
- if (xParagraph.is())
- {
- bool bCharHidden{};
- xParagraph->getPropertyValue("CharHidden") >>= bCharHidden;
- if (bCharHidden)
- {
- xParagraph->setPropertyValue("CharHidden", uno::Any(false));
- }
- }
- }
-
- AfterConvertToTextFrame(m_rDMapper_Impl, aFramedRedlines, redPos, redLen, redCell, redTable);
- }
-
- if (xFrameAnchor.is() && eBreakType != style::BreakType_NONE)
- {
- // A break before the table was requested. Restore that on the anchor.
- xFrameAnchor->setPropertyValue("BreakType", uno::Any(eBreakType));
- }
- }
- }
-
- m_aTableProperties.clear();
- m_aCellProperties.clear();
- m_aRowProperties.clear();
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
- TagLogger::getInstance().endElement();
-#endif
-}
-
-void DomainMapperTableHandler::startRow(const TablePropertyMapPtr& pProps)
-{
- m_aRowProperties.push_back( pProps.get() );
- m_aCellProperties.emplace_back( );
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("table.row");
- if (pProps != nullptr)
- pProps->dumpXml();
-#endif
-
- m_aRowRanges.clear();
-}
-
-void DomainMapperTableHandler::endRow()
-{
- m_aTableRanges.push_back(comphelper::containerToSequence(m_aRowRanges));
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-}
-
-void DomainMapperTableHandler::startCell(const css::uno::Reference< css::text::XTextRange > & start,
- const TablePropertyMapPtr& pProps )
-{
- sal_uInt32 nRow = m_aRowProperties.size();
- if ( pProps )
- m_aCellProperties[nRow - 1].push_back( pProps.get() );
- else
- {
- // Adding an empty cell properties map to be able to get
- // the table defaults properties
- TablePropertyMapPtr pEmptyProps( new TablePropertyMap( ) );
- m_aCellProperties[nRow - 1].push_back( pEmptyProps.get() );
- }
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("table.cell");
- TagLogger::getInstance().startElement("table.cell.start");
- TagLogger::getInstance().chars(XTextRangeToString(start));
- TagLogger::getInstance().endElement();
- if (pProps)
- pProps->printProperties();
-#endif
-
- //add a new 'row' of properties
- m_aCellRange.clear();
- uno::Reference<text::XTextRange> xStart;
- if (start)
- xStart = start->getStart();
- m_aCellRange.push_back(xStart);
-}
-
-void DomainMapperTableHandler::endCell(const css::uno::Reference< css::text::XTextRange > & end)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("table.cell.end");
- TagLogger::getInstance().chars(XTextRangeToString(end));
- TagLogger::getInstance().endElement();
- TagLogger::getInstance().endElement();
-#endif
-
- uno::Reference<text::XTextRange> xEnd;
- if (end)
- xEnd = end->getEnd();
- m_aCellRange.push_back(xEnd);
- m_aRowRanges.push_back(comphelper::containerToSequence(m_aCellRange));
-}
-
-DomainMapper_Impl& DomainMapperTableHandler::getDomainMapperImpl()
-{
- return m_rDMapper_Impl;
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx
deleted file mode 100644
index 376a6d366688..000000000000
--- a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx
+++ /dev/null
@@ -1,121 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include "PropertyMap.hxx"
-#include <vector>
-
-#include <com/sun/star/text/XTextAppendAndConvert.hpp>
-
-namespace writerfilter::dmapper {
-
-typedef css::uno::Sequence< css::uno::Reference< css::text::XTextRange > > CellSequence_t;
-typedef css::uno::Sequence<CellSequence_t> RowSequence_t;
-
-typedef css::uno::Sequence< css::uno::Sequence<css::beans::PropertyValues> > CellPropertyValuesSeq_t;
-
-typedef std::vector<PropertyMapPtr> PropertyMapVector1;
-typedef std::vector<PropertyMapVector1> PropertyMapVector2;
-
-class DomainMapper_Impl;
-class TableStyleSheetEntry;
-struct TableInfo;
-
-/// A horizontally merged cell is in fact a range of cells till its merge is performed.
-struct HorizontallyMergedCell
-{
- sal_Int32 m_nFirstRow;
- sal_Int32 m_nFirstCol;
- sal_Int32 m_nLastRow;
- sal_Int32 m_nLastCol;
- HorizontallyMergedCell(sal_Int32 nFirstRow, sal_Int32 nFirstCol)
- : m_nFirstRow(nFirstRow)
- , m_nFirstCol(nFirstCol)
- , m_nLastRow(nFirstRow)
- , m_nLastCol(-1)
- {
- }
-};
-
-/// Class to handle events generated by TableManager::resolveCurrentTable().
-class DomainMapperTableHandler final : public virtual SvRefBase
-{
- css::uno::Reference<css::text::XTextAppendAndConvert> m_xText;
- DomainMapper_Impl& m_rDMapper_Impl;
- std::vector< css::uno::Reference<css::text::XTextRange> > m_aCellRange;
- std::vector<CellSequence_t> m_aRowRanges;
- std::vector<RowSequence_t> m_aTableRanges;
-
- // properties
- PropertyMapVector2 m_aCellProperties;
- PropertyMapVector1 m_aRowProperties;
- TablePropertyMapPtr m_aTableProperties;
-
- TableStyleSheetEntry * endTableGetTableStyle(TableInfo & rInfo,
- std::vector<css::beans::PropertyValue>& rFrameProperties,
- bool bConvertToFloating);
- CellPropertyValuesSeq_t endTableGetCellProperties(TableInfo & rInfo, std::vector<HorizontallyMergedCell>& rMerges);
- css::uno::Sequence<css::beans::PropertyValues> endTableGetRowProperties();
-
-public:
- typedef tools::SvRef<DomainMapperTableHandler> Pointer_t;
-
- DomainMapperTableHandler(css::uno::Reference<css::text::XTextAppendAndConvert> xText,
- DomainMapper_Impl& rDMapper_Impl);
- ~DomainMapperTableHandler() override;
-
- /**
- Handle start of table.
-
- @param pProps properties of the table
- */
- void startTable(const TablePropertyMapPtr& pProps);
-
- void ApplyParagraphPropertiesFromTableStyle(TableParagraph rParaProp, std::vector< PropertyIds > aAllTableProperties, const css::beans::PropertyValues rCellProperties);
-
- /// Handle end of table.
- void endTable(unsigned int nestedTableLevel);
- /**
- Handle start of row.
-
- @param pProps properties of the row
- */
- void startRow(const TablePropertyMapPtr& pProps);
- /// Handle end of row.
- void endRow();
- /**
- Handle start of cell.
-
- @param rT start handle of the cell
- @param pProps properties of the cell
- */
- void startCell(const css::uno::Reference< css::text::XTextRange > & start, const TablePropertyMapPtr& pProps);
- /**
- Handle end of cell.
-
- @param rT end handle of cell
- */
- void endCell(const css::uno::Reference< css::text::XTextRange > & end);
-
- DomainMapper_Impl& getDomainMapperImpl();
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.cxx b/writerfilter/source/dmapper/DomainMapperTableManager.cxx
deleted file mode 100644
index 2bbdfe86540e..000000000000
--- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx
+++ /dev/null
@@ -1,864 +0,0 @@
-/* -*- 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/.
- *
- * 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 <optional>
-#include "DomainMapperTableManager.hxx"
-#include "ConversionHelper.hxx"
-#include "MeasureHandler.hxx"
-#include "TagLogger.hxx"
-#include <com/sun/star/text/SizeType.hpp>
-#include <com/sun/star/text/TableColumnSeparator.hpp>
-#include <com/sun/star/text/WritingMode2.hpp>
-#include <o3tl/numeric.hxx>
-#include <o3tl/safeint.hxx>
-#include <ooxml/resourceids.hxx>
-#include <rtl/math.hxx>
-#include <sal/log.hxx>
-#include <numeric>
-#include "TrackChangesHandler.hxx"
-#include <oox/token/tokens.hxx>
-
-namespace writerfilter::dmapper {
-
-using namespace ::com::sun::star;
-
-DomainMapperTableManager::DomainMapperTableManager() :
- m_nRow(0),
- m_nGridSpan(1),
- m_nHeaderRepeat(0),
- m_nTableWidth(0),
- m_bIsInShape(false),
- m_bPushCurrentWidth(false),
- m_bTableSizeTypeInserted(false),
- m_nLayoutType(0),
- m_pTablePropsHandler(new TablePropertiesHandler())
-{
- m_pTablePropsHandler->SetTableManager( this );
-}
-
-
-DomainMapperTableManager::~DomainMapperTableManager()
-{
-}
-
-bool DomainMapperTableManager::attribute(Id nName, Value const & rValue)
-{
- bool bRet = true;
-
- switch (nName)
- {
- case NS_ooxml::LN_CT_TblLook_val:
- {
- TablePropertyMapPtr pPropMap(new TablePropertyMap());
- pPropMap->Insert(PROP_TBL_LOOK, uno::Any(sal_Int32(rValue.getInt())));
- insertTableProps(pPropMap);
- m_aTableLook["val"] <<= static_cast<sal_Int32>(rValue.getInt());
- }
- break;
- case NS_ooxml::LN_CT_TblLook_noVBand:
- m_aTableLook["noVBand"] <<= static_cast<sal_Int32>(rValue.getInt());
- break;
- case NS_ooxml::LN_CT_TblLook_noHBand:
- m_aTableLook["noHBand"] <<= static_cast<sal_Int32>(rValue.getInt());
- break;
- case NS_ooxml::LN_CT_TblLook_lastColumn:
- m_aTableLook["lastColumn"] <<= static_cast<sal_Int32>(rValue.getInt());
- break;
- case NS_ooxml::LN_CT_TblLook_lastRow:
- m_aTableLook["lastRow"] <<= static_cast<sal_Int32>(rValue.getInt());
- break;
- case NS_ooxml::LN_CT_TblLook_firstColumn:
- m_aTableLook["firstColumn"] <<= static_cast<sal_Int32>(rValue.getInt());
- break;
- case NS_ooxml::LN_CT_TblLook_firstRow:
- m_aTableLook["firstRow"] <<= static_cast<sal_Int32>(rValue.getInt());
- break;
- default:
- bRet = false;
- }
-
- return bRet;
-}
-
-void DomainMapperTableManager::finishTableLook()
-{
- TablePropertyMapPtr pPropMap(new TablePropertyMap());
- pPropMap->Insert(META_PROP_TABLE_LOOK, uno::Any(m_aTableLook.getAsConstPropertyValueList()));
- m_aTableLook.clear();
- insertTableProps(pPropMap);
-}
-
-bool DomainMapperTableManager::sprm(Sprm & rSprm)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablemanager.sprm");
- std::string sSprm = rSprm.toString();
- TagLogger::getInstance().chars(sSprm);
- TagLogger::getInstance().endElement();
-#endif
- bool bRet = TableManager::sprm(rSprm);
- if( !bRet )
- {
- bRet = m_pTablePropsHandler->sprm( rSprm );
- }
-
- if ( !bRet )
- {
- bRet = true;
- sal_uInt32 nSprmId = rSprm.getId();
- Value::Pointer_t pValue = rSprm.getValue();
- sal_Int32 nIntValue = (pValue ? pValue->getInt() : 0);
- switch ( nSprmId )
- {
- case NS_ooxml::LN_CT_TblPrBase_tblW:
- case NS_ooxml::LN_CT_TblPrBase_tblInd:
- {
- //contains unit and value
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- MeasureHandlerPtr pMeasureHandler( new MeasureHandler );
- pProperties->resolve(*pMeasureHandler);
- TablePropertyMapPtr pPropMap( new TablePropertyMap );
- if (nSprmId == sal_uInt32(NS_ooxml::LN_CT_TblPrBase_tblInd))
- {
- pPropMap->setValue( TablePropertyMap::LEFT_MARGIN, pMeasureHandler->getMeasureValue() );
- }
- else
- {
- m_nTableWidth = pMeasureHandler->getMeasureValue();
- if( m_nTableWidth )
- {
- pPropMap->setValue( TablePropertyMap::TABLE_WIDTH_TYPE, text::SizeType::FIX );
- pPropMap->setValue( TablePropertyMap::TABLE_WIDTH, m_nTableWidth );
- m_bTableSizeTypeInserted = true;
- }
- else if( sal::static_int_cast<Id>(pMeasureHandler->getUnit()) == NS_ooxml::LN_Value_ST_TblWidth_pct )
- {
- sal_Int32 nPercent = pMeasureHandler->getValue() / 50;
- if(nPercent > 100)
- nPercent = 100;
- pPropMap->setValue( TablePropertyMap::TABLE_WIDTH_TYPE, text::SizeType::VARIABLE );
- pPropMap->setValue( TablePropertyMap::TABLE_WIDTH, nPercent );
- m_bTableSizeTypeInserted = true;
- }
- else if( sal::static_int_cast<Id>(pMeasureHandler->getUnit()) == NS_ooxml::LN_Value_ST_TblWidth_auto )
- {
- /*
- This attribute specifies the width type of table. This is used as part of the table layout
- algorithm specified by the tblLayout element.(See 17.4.64 and 17.4.65 of the ISO/IEC 29500-1:2011.)
- If this value is 'auto', the table layout has to use the preferred widths on the table items to generate
- the final sizing of the table, but then must use the contents of each cell to determine final column widths.
- (See 17.18.87 of the ISO/IEC 29500-1:2011.)
- */
- IntVectorPtr pCellWidths = getCurrentCellWidths();
- // Check whether all cells have fixed widths in the given row of table.
- bool bFixed = std::find(pCellWidths->begin(), pCellWidths->end(), -1) == pCellWidths->end();
- if (!bFixed)
- {
- // Set the width type of table with 'Auto' and set the width value to 0 (as per grid values)
- pPropMap->setValue( TablePropertyMap::TABLE_WIDTH_TYPE, text::SizeType::VARIABLE );
- pPropMap->setValue( TablePropertyMap::TABLE_WIDTH, 0 );
- m_bTableSizeTypeInserted = true;
- }
- else if (getTableDepth() > 1)
- {
- // tdf#131819 limiting the fix for nested tables temporarily
- // TODO revert the fix for tdf#104876 and reopen it
- m_bTableSizeTypeInserted = true;
- }
- }
- }
-#ifdef DBG_UTIL
- pPropMap->dumpXml();
-#endif
- insertTableProps(pPropMap);
- }
- }
- break;
- case NS_ooxml::LN_CT_TrPrBase_tblHeader:
- // if nIntValue == 1 then the row is a repeated header line
- // to prevent later rows from increasing the repeating m_nHeaderRepeat is set to NULL when repeating stops
- if( nIntValue > 0 && m_nHeaderRepeat == static_cast<int>(m_nRow) )
- {
- TablePropertyMapPtr pPropMap( new TablePropertyMap );
-
- // FIXME: DOCX tables with more than 10 repeating header lines imported
- // without repeating header lines to mimic an MSO workaround for its usability bug.
- // Explanation: it's very hard to set and modify repeating header rows in Word,
- // often resulting tables with a special workaround: setting all table rows as
- // repeating header, because exceeding the pages by "unlimited" header rows turns off the
- // table headers automatically in MSO. 10-row limit is a reasonable temporary limit
- // to handle DOCX tables with "unlimited" repeating header, till the same "turn off
- // exceeding header" feature is ready (see tdf#88496).
-#define HEADER_ROW_LIMIT_FOR_MSO_WORKAROUND 10
- if ( m_nHeaderRepeat == HEADER_ROW_LIMIT_FOR_MSO_WORKAROUND )
- {
- m_nHeaderRepeat = -1;
- pPropMap->Insert( PROP_HEADER_ROW_COUNT, uno::Any(sal_Int32(0)));
- }
- else
- {
- ++m_nHeaderRepeat;
- pPropMap->Insert( PROP_HEADER_ROW_COUNT, uno::Any( m_nHeaderRepeat ));
- }
- insertTableProps(pPropMap);
- }
- else
- {
- if ( nIntValue == 0 && m_nRow == 0 )
- {
- // explicit tblHeader=0 in the first row must overwrite table style
- TablePropertyMapPtr pPropMap( new TablePropertyMap );
- pPropMap->Insert( PROP_HEADER_ROW_COUNT, uno::Any(sal_Int32(0)));
- insertTableProps(pPropMap);
- }
- m_nHeaderRepeat = -1;
- }
- if (nIntValue)
- {
- // Store the info that this is a header, we'll need that when we apply table styles.
- TablePropertyMapPtr pPropMap( new TablePropertyMap );
- pPropMap->Insert( PROP_TBL_HEADER, uno::Any(nIntValue));
- insertRowProps(pPropMap);
- }
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblStyle: //table style name
- {
- TablePropertyMapPtr pPropMap( new TablePropertyMap );
- pPropMap->Insert( META_PROP_TABLE_STYLE_NAME, uno::Any( pValue->getString() ));
- insertTableProps(pPropMap);
- }
- break;
- case NS_ooxml::LN_CT_TblGridBase_gridCol:
- {
- if (nIntValue == -1)
- getCurrentGrid()->clear();
- else
- getCurrentGrid()->push_back( nIntValue );
- }
- break;
- case NS_ooxml::LN_CT_TcPrBase_vMerge : //vertical merge
- {
- // values can be: LN_Value_ST_Merge_restart, LN_Value_ST_Merge_continue, in reality the second one is a 0
- TablePropertyMapPtr pMergeProps( new TablePropertyMap );
- pMergeProps->Insert( PROP_VERTICAL_MERGE, uno::Any( sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_ST_Merge_restart ) );
- cellProps( pMergeProps);
- }
- break;
- case NS_ooxml::LN_CT_TcPrBase_hMerge:
- {
- // values can be: LN_Value_ST_Merge_restart, LN_Value_ST_Merge_continue, in reality the second one is a 0
- TablePropertyMapPtr pMergeProps(new TablePropertyMap());
- pMergeProps->Insert(PROP_HORIZONTAL_MERGE, uno::Any( sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_ST_Merge_restart ));
- cellProps(pMergeProps);
- }
- break;
- case NS_ooxml::LN_CT_TcPrBase_gridSpan: //number of grid positions spanned by this cell
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablemanager.GridSpan");
- TagLogger::getInstance().attribute("gridSpan", nIntValue);
- TagLogger::getInstance().endElement();
-#endif
- m_nGridSpan = nIntValue;
- }
- break;
- case NS_ooxml::LN_CT_TcPrBase_textDirection:
- {
- TablePropertyMapPtr pPropMap( new TablePropertyMap );
- bool bInsertCellProps = true;
- switch ( nIntValue )
- {
- case NS_ooxml::LN_Value_ST_TextDirection_tbRl:
- // Binary filter takes BiDirection into account ( but I have no idea about that here )
- // or even what it is. But... here's where to handle it if it becomes an issue
- pPropMap->Insert( PROP_FRM_DIRECTION, uno::Any( text::WritingMode2::TB_RL ));
- SAL_INFO( "writerfilter", "Have inserted textDirection " << nIntValue );
- break;
- case NS_ooxml::LN_Value_ST_TextDirection_btLr:
- pPropMap->Insert( PROP_FRM_DIRECTION, uno::Any( text::WritingMode2::BT_LR ));
- break;
- case NS_ooxml::LN_Value_ST_TextDirection_lrTbV:
- pPropMap->Insert( PROP_FRM_DIRECTION, uno::Any( text::WritingMode2::LR_TB ));
- break;
- case NS_ooxml::LN_Value_ST_TextDirection_tbRlV:
- pPropMap->Insert( PROP_FRM_DIRECTION, uno::Any( text::WritingMode2::TB_RL ));
- break;
- case NS_ooxml::LN_Value_ST_TextDirection_lrTb:
- case NS_ooxml::LN_Value_ST_TextDirection_tbLrV:
- default:
- // Ignore - we can't handle these
- bInsertCellProps = false;
- break;
- }
- if ( bInsertCellProps )
- cellProps( pPropMap );
- break;
- }
- case NS_ooxml::LN_CT_TcPrBase_tcW:
- {
- // Contains unit and value, but unit is not interesting for
- // us, later we'll just distribute these values in a
- // 0..10000 scale.
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- MeasureHandlerPtr pMeasureHandler(new MeasureHandler());
- pProperties->resolve(*pMeasureHandler);
- if (sal::static_int_cast<Id>(pMeasureHandler->getUnit()) == NS_ooxml::LN_Value_ST_TblWidth_auto)
- getCurrentCellWidths()->push_back(sal_Int32(-1));
- else
- // store the original value to limit rounding mistakes, if it's there in a recognized measure (twip)
- getCurrentCellWidths()->push_back(pMeasureHandler->getMeasureValue() ? pMeasureHandler->getValue() : sal_Int32(0));
- if (getTableDepthDifference())
- m_bPushCurrentWidth = true;
- }
- }
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblpPr:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- // Ignore <w:tblpPr> in shape text, those tables should be always non-floating ones.
- if (!m_bIsInShape && pProperties)
- {
- TablePositionHandlerPtr pHandler = m_aTmpPosition.back();
- if ( !pHandler )
- {
- m_aTmpPosition.pop_back();
- pHandler = new TablePositionHandler;
- m_aTmpPosition.push_back( pHandler );
- }
- pProperties->resolve(*m_aTmpPosition.back());
- }
- }
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblOverlap:
- if (!m_aTmpPosition.empty() && m_aTmpPosition.back())
- {
- m_aTmpPosition.back()->setTableOverlap(nIntValue);
- }
- break;
- case NS_ooxml::LN_CT_TrPrBase_gridBefore:
- setCurrentGridBefore( nIntValue );
- break;
- case NS_ooxml::LN_CT_TrPrBase_gridAfter:
- setCurrentGridAfter( nIntValue );
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblCaption:
- // To-Do: Not yet preserved
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblDescription:
- // To-Do: Not yet preserved
- break;
- case NS_ooxml::LN_CT_TrPrBase_tblCellSpacing:
- // To-Do: Not yet preserved
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblCellSpacing:
- // To-Do: Not yet preserved
- break;
- case NS_ooxml::LN_CT_TblPrBase_bidiVisual:
- {
- TablePropertyMapPtr pPropMap(new TablePropertyMap());
- pPropMap->Insert(PROP_WRITING_MODE, uno::Any(sal_Int16(nIntValue ? text::WritingMode2::RL_TB : text::WritingMode2::LR_TB)));
- insertTableProps(pPropMap);
- break;
- }
- default:
- bRet = false;
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- }
- }
- return bRet;
-}
-
-DomainMapperTableManager::IntVectorPtr const & DomainMapperTableManager::getCurrentGrid( )
-{
- if (m_aTableGrid.empty())
- throw std::out_of_range("no current grid");
- return m_aTableGrid.back( );
-}
-
-DomainMapperTableManager::IntVectorPtr const & DomainMapperTableManager::getCurrentCellWidths( )
-{
- return m_aCellWidths.back( );
-}
-
-uno::Sequence<beans::PropertyValue> DomainMapperTableManager::getCurrentTablePosition( )
-{
- if ( !m_aTablePositions.empty( ) && m_aTablePositions.back() )
- return m_aTablePositions.back( )->getTablePosition();
- else
- return uno::Sequence< beans::PropertyValue >();
-}
-
-TablePositionHandler* DomainMapperTableManager::getCurrentTableRealPosition()
-{
- if ( !m_aTablePositions.empty( ) && m_aTablePositions.back() )
- return m_aTablePositions.back().get();
- else
- return nullptr;
-}
-
-const TableParagraphVectorPtr & DomainMapperTableManager::getCurrentParagraphs( )
-{
- return m_aParagraphsToEndTable.top( );
-}
-
-void DomainMapperTableManager::setIsInShape(bool bIsInShape)
-{
- m_bIsInShape = bIsInShape;
-}
-
-void DomainMapperTableManager::startLevel( )
-{
- TableManager::startLevel( );
-
- // If requested, pop the value that was pushed too early.
- std::optional<sal_Int32> oCurrentWidth;
- if (m_bPushCurrentWidth && !m_aCellWidths.empty() && !m_aCellWidths.back()->empty())
- {
- oCurrentWidth = m_aCellWidths.back()->back();
- m_aCellWidths.back()->pop_back();
- }
- std::optional<TableParagraph> oParagraph;
- if (getTableDepthDifference() > 0 && !m_aParagraphsToEndTable.empty() && !m_aParagraphsToEndTable.top()->empty())
- {
- oParagraph = m_aParagraphsToEndTable.top()->back();
- m_aParagraphsToEndTable.top()->pop_back();
- }
-
- IntVectorPtr pNewGrid = std::make_shared<std::vector<sal_Int32>>();
- IntVectorPtr pNewCellWidths = std::make_shared<std::vector<sal_Int32>>();
- TablePositionHandlerPtr pNewPositionHandler;
- m_aTableGrid.push_back( pNewGrid );
- m_aCellWidths.push_back( pNewCellWidths );
- m_aTablePositions.push_back( pNewPositionHandler );
- // empty name will be replaced by the table style name, if it exists
- m_aTableStyleNames.push_back( OUString() );
- m_aMoved.push_back( OUString() );
-
- TablePositionHandlerPtr pTmpPosition;
- TablePropertyMapPtr pTmpProperties( new TablePropertyMap( ) );
- m_aTmpPosition.push_back( pTmpPosition );
- m_aTmpTableProperties.push_back( pTmpProperties );
- m_nCell.push_back( 0 );
- m_nTableWidth = 0;
- m_nLayoutType = 0;
- TableParagraphVectorPtr pNewParagraphs = std::make_shared<std::vector<TableParagraph>>();
- m_aParagraphsToEndTable.push( pNewParagraphs );
-
- // And push it back to the right level.
- if (oCurrentWidth)
- m_aCellWidths.back()->push_back(*oCurrentWidth);
- if (oParagraph)
- m_aParagraphsToEndTable.top()->push_back(*oParagraph);
-}
-
-void DomainMapperTableManager::endLevel( )
-{
- if (m_aTableGrid.empty())
- {
- SAL_WARN("writerfilter.dmapper", "Table stack is empty");
- return;
- }
-
- m_aTableGrid.pop_back( );
-
- // Do the same trick as in startLevel(): pop the value that was pushed too early.
- std::optional<sal_Int32> oCurrentWidth;
- if (m_bPushCurrentWidth && !m_aCellWidths.empty() && !m_aCellWidths.back()->empty())
- oCurrentWidth = m_aCellWidths.back()->back();
- m_aCellWidths.pop_back( );
- // And push it back to the right level.
- if (oCurrentWidth && !m_aCellWidths.empty() && !m_aCellWidths.back()->empty())
- m_aCellWidths.back()->push_back(*oCurrentWidth);
-
- m_nCell.pop_back( );
- m_nTableWidth = 0;
- m_nLayoutType = 0;
-
- m_aTmpPosition.pop_back( );
- m_aTmpTableProperties.pop_back( );
-
- TableManager::endLevel( );
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("dmappertablemanager.endLevel");
- PropertyMapPtr pProps = getTableProps().get();
- if (pProps)
- getTableProps()->dumpXml();
-
- TagLogger::getInstance().endElement();
-#endif
-
- // Pop back the table position after endLevel as it's used
- // in the endTable method called in endLevel.
- m_aTablePositions.pop_back();
- m_aTableStyleNames.pop_back();
- m_aMoved.pop_back( );
-
- std::optional<TableParagraph> oParagraph;
- if (getTableDepthDifference() < 0 && !m_aParagraphsToEndTable.top()->empty())
- oParagraph = m_aParagraphsToEndTable.top()->back();
- m_aParagraphsToEndTable.pop();
- if (oParagraph && m_aParagraphsToEndTable.size())
- m_aParagraphsToEndTable.top()->push_back(*oParagraph);
-}
-
-void DomainMapperTableManager::endOfCellAction()
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("endOFCellAction");
-#endif
-
- if ( !isInTable() )
- throw std::out_of_range("cell without a table");
- if ( m_nGridSpan > 1 )
- setCurrentGridSpan( m_nGridSpan );
- m_nGridSpan = 1;
- ++m_nCell.back( );
-}
-
-bool DomainMapperTableManager::shouldInsertRow(IntVectorPtr pCellWidths, IntVectorPtr pTableGrid, size_t nGrids, bool& rIsIncompleteGrid)
-{
- if (pCellWidths->empty())
- return false;
- if (m_nLayoutType == NS_ooxml::LN_Value_doc_ST_TblLayout_fixed)
- return true;
- if (pCellWidths->size() == nGrids)
- return true;
- rIsIncompleteGrid = true;
- return nGrids > pTableGrid->size();
-}
-
-void DomainMapperTableManager::endOfRowAction()
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("endOfRowAction");
-#endif
-
- // Compare the table position and style with the previous ones. We may need to split
- // into two tables if those are different. We surely don't want to do anything
- // if we don't have any row yet.
- if (m_aTmpPosition.empty())
- throw std::out_of_range("row without a position");
- TablePositionHandlerPtr pTmpPosition = m_aTmpPosition.back();
- TablePropertyMapPtr pTablePropMap = m_aTmpTableProperties.back( );
- TablePositionHandlerPtr pCurrentPosition = m_aTablePositions.back();
- bool bSamePosition = ( pTmpPosition == pCurrentPosition ) ||
- ( pTmpPosition && pCurrentPosition && *pTmpPosition == *pCurrentPosition );
- bool bIsSetTableStyle = pTablePropMap->isSet(META_PROP_TABLE_STYLE_NAME);
- OUString sTableStyleName;
- bool bSameTableStyle = ( !bIsSetTableStyle && m_aTableStyleNames.back().isEmpty()) ||
- ( bIsSetTableStyle &&
- (pTablePropMap->getProperty(META_PROP_TABLE_STYLE_NAME)->second >>= sTableStyleName) &&
- sTableStyleName == m_aTableStyleNames.back() );
- if ( (!bSamePosition || !bSameTableStyle) && m_nRow > 0 )
- {
- // Save the grid infos to have them survive the end/start level
- IntVectorPtr pTmpTableGrid = m_aTableGrid.back();
- IntVectorPtr pTmpCellWidths = m_aCellWidths.back();
- sal_uInt32 nTmpCell = m_nCell.back();
- TableParagraphVectorPtr pTableParagraphs = getCurrentParagraphs();
-
- // endLevel and startLevel are taking care of the non finished row
- // to carry it over to the next table
- setKeepUnfinishedRow( true );
- endLevel();
- setKeepUnfinishedRow( false );
- startLevel();
-
- m_aTableGrid.pop_back();
- m_aCellWidths.pop_back();
- m_nCell.pop_back();
- m_aTableGrid.push_back(pTmpTableGrid);
- m_aCellWidths.push_back(pTmpCellWidths);
- m_nCell.push_back(nTmpCell);
- m_aParagraphsToEndTable.pop( );
- m_aParagraphsToEndTable.push( pTableParagraphs );
- }
- // save table style in the first row for comparison
- if ( m_nRow == 0 && pTablePropMap->isSet(META_PROP_TABLE_STYLE_NAME) )
- {
- pTablePropMap->getProperty(META_PROP_TABLE_STYLE_NAME)->second >>= sTableStyleName;
- m_aTableStyleNames.pop_back();
- m_aTableStyleNames.push_back( sTableStyleName );
- }
-
- // Push the tmp position now that we compared it
- m_aTablePositions.pop_back();
- m_aTablePositions.push_back( pTmpPosition );
- m_aTmpPosition.back().clear( );
-
-
- IntVectorPtr pTableGrid = getCurrentGrid( );
- IntVectorPtr pCellWidths = getCurrentCellWidths( );
- if(!m_nTableWidth && !pTableGrid->empty())
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tableWidth");
-#endif
-
- for( const auto& rCell : *pTableGrid )
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("col");
- TagLogger::getInstance().attribute("width", rCell);
- TagLogger::getInstance().endElement();
-#endif
-
- m_nTableWidth = o3tl::saturating_add(m_nTableWidth, rCell);
- }
- if (m_nTableWidth)
- // convert sum of grid twip values to 1/100 mm with rounding up to avoid table width loss
- m_nTableWidth = static_cast<sal_Int32>(ceil(ConversionHelper::convertTwipToMM100Double(m_nTableWidth)));
-
- if (m_nTableWidth > 0 && !m_bTableSizeTypeInserted)
- {
- TablePropertyMapPtr pPropMap( new TablePropertyMap );
- pPropMap->setValue( TablePropertyMap::TABLE_WIDTH, m_nTableWidth );
- insertTableProps(pPropMap);
- }
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
- }
-
- std::vector<sal_uInt32> rCurrentSpans = getCurrentGridSpans();
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("gridSpans");
- {
- for (const auto& rGridSpan : rCurrentSpans)
- {
- TagLogger::getInstance().startElement("gridSpan");
- TagLogger::getInstance().attribute("span", rGridSpan);
- TagLogger::getInstance().endElement();
- }
- }
- TagLogger::getInstance().endElement();
-#endif
-
- //calculate number of used grids - it has to match the size of m_aTableGrid
- size_t nGrids = std::accumulate(rCurrentSpans.begin(), rCurrentSpans.end(), sal::static_int_cast<size_t>(0));
-
- // sj: the grid is having no units... it is containing only relative values.
- // a table with a grid of "1:2:1" looks identical as if the table is having
- // a grid of "20:40:20" and it doesn't have to do something with the tableWidth
- // -> so we have get the sum of each grid entry for the fullWidthRelative:
- int nFullWidthRelative = 0;
- for (int i : (*pTableGrid))
- nFullWidthRelative = o3tl::saturating_add(nFullWidthRelative, i);
-
- bool bIsIncompleteGrid = false;
- if( pTableGrid->size() == nGrids && m_nCell.back( ) > 0 )
- {
- /*
- * If table width property set earlier is smaller than the current table width,
- * then replace the TABLE_WIDTH property, set earlier.
- */
- sal_Int32 nTableWidth(0);
- sal_Int32 nTableWidthType(text::SizeType::VARIABLE);
- pTablePropMap->getValue(TablePropertyMap::TABLE_WIDTH, nTableWidth);
- pTablePropMap->getValue(TablePropertyMap::TABLE_WIDTH_TYPE, nTableWidthType);
- if ((nTableWidthType == text::SizeType::FIX) && (nTableWidth < m_nTableWidth))
- {
- pTablePropMap->setValue(TablePropertyMap::TABLE_WIDTH, m_nTableWidth);
- }
- if (nTableWidthType == text::SizeType::VARIABLE )
- {
- if(nTableWidth > 100 || nTableWidth <= 0)
- {
- if(getTableDepth() > 1 && !m_bTableSizeTypeInserted)
- {
- pTablePropMap->setValue(TablePropertyMap::TABLE_WIDTH, sal_Int32(100));
- pTablePropMap->setValue(TablePropertyMap::TABLE_WIDTH_TYPE, text::SizeType::VARIABLE);
- }
- else
- {
- pTablePropMap->setValue(TablePropertyMap::TABLE_WIDTH, m_nTableWidth);
- pTablePropMap->setValue(TablePropertyMap::TABLE_WIDTH_TYPE, text::SizeType::FIX);
- }
- }
- }
- uno::Sequence< text::TableColumnSeparator > aSeparators( getCurrentGridBefore() + m_nCell.back() - 1 );
- text::TableColumnSeparator* pSeparators = aSeparators.getArray();
- double nLastRelPos = 0.0;
- sal_uInt32 nBorderGridIndex = 0;
-
- size_t nWidthsBound = getCurrentGridBefore() + m_nCell.back() - 1;
- if (nWidthsBound)
- {
- ::std::vector< sal_uInt32 >::const_iterator aSpansIter = rCurrentSpans.begin();
- for( size_t nBorder = 0; nBorder < nWidthsBound; ++nBorder )
- {
- double nRelPos, fGridWidth = 0.;
- for ( sal_Int32 nGridCount = *aSpansIter; nGridCount > 0; --nGridCount )
- fGridWidth += (*pTableGrid)[nBorderGridIndex++];
-
- if (fGridWidth == 0.)
- {
- // allow nFullWidthRelative here, with a sane 0.0 result
- nRelPos = 0.;
- }
- else
- {
- if (nFullWidthRelative == 0)
- throw o3tl::divide_by_zero();
-
- nRelPos = (fGridWidth * 10000) / nFullWidthRelative;
- }
-
- pSeparators[nBorder].Position = rtl::math::round(nRelPos + nLastRelPos);
- pSeparators[nBorder].IsVisible = true;
- nLastRelPos = nLastRelPos + nRelPos;
- ++aSpansIter;
- }
- }
- TablePropertyMapPtr pPropMap( new TablePropertyMap );
- pPropMap->Insert( PROP_TABLE_COLUMN_SEPARATORS, uno::Any( aSeparators ) );
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("rowProperties");
- pPropMap->dumpXml();
- TagLogger::getInstance().endElement();
-#endif
-
- // set row insertion/deletion at tracked drag & drop of tables
- OUString aMoved = getMoved();
- if ( !aMoved.isEmpty() )
- {
- auto pTrackChangesHandler = std::make_shared<TrackChangesHandler>(
- aMoved == getPropertyName( PROP_TABLE_ROW_DELETE )
- ? oox::XML_tableRowDelete
- : oox::XML_tableRowInsert );
- uno::Sequence<beans::PropertyValue> aTableRedlineProperties = pTrackChangesHandler->getRedlineProperties();
- pPropMap->Insert( PROP_TABLE_REDLINE_PARAMS , uno::Any( aTableRedlineProperties ));
- }
-
- insertRowProps(pPropMap);
- }
- else if (shouldInsertRow(pCellWidths, pTableGrid, nGrids, bIsIncompleteGrid))
- {
- // If we're here, then the number of cells does not equal to the amount
- // defined by the grid, even after taking care of
- // gridSpan/gridBefore/gridAfter. Handle this by ignoring the grid and
- // providing the separators based on the provided cell widths, as long
- // as we have a fixed layout;
- // On the other hand even if the layout is not fixed, but the cell widths
- // provided equal the total number of cells, and there are no after/before cells
- // then use the cell widths to calculate the column separators.
- // Also handle autofit tables with incomplete grids, when rows can have
- // different widths and last cells can be wider, than their values.
- uno::Sequence< text::TableColumnSeparator > aSeparators(pCellWidths->size() - 1);
- text::TableColumnSeparator* pSeparators = aSeparators.getArray();
- sal_Int16 nSum = 0;
- sal_uInt32 nPos = 0;
-
- if (bIsIncompleteGrid)
- nFullWidthRelative = 0;
-
- // Avoid divide by zero (if there's no grid, position using cell widths).
- if( nFullWidthRelative == 0 )
- for (size_t i = 0; i < pCellWidths->size(); ++i)
- nFullWidthRelative += (*pCellWidths)[i];
-
- if (bIsIncompleteGrid)
- {
- /*
- * If table width property set earlier is smaller than the current table row width,
- * then replace the TABLE_WIDTH property, set earlier.
- */
- sal_Int32 nFullWidth = static_cast<sal_Int32>(ceil(ConversionHelper::convertTwipToMM100Double(nFullWidthRelative)));
- sal_Int32 nTableWidth(0);
- sal_Int32 nTableWidthType(text::SizeType::VARIABLE);
- pTablePropMap->getValue(TablePropertyMap::TABLE_WIDTH, nTableWidth);
- pTablePropMap->getValue(TablePropertyMap::TABLE_WIDTH_TYPE, nTableWidthType);
- if (nTableWidth < nFullWidth)
- {
- pTablePropMap->setValue(TablePropertyMap::TABLE_WIDTH, nFullWidth);
- }
- }
-
- size_t nWidthsBound = pCellWidths->size() - 1;
- if (nWidthsBound)
- {
- // At incomplete table grids, last cell width can be smaller, than its final width.
- // Correct it based on the last but one column width and their span values.
- if ( bIsIncompleteGrid && rCurrentSpans.size()-1 == nWidthsBound )
- {
- auto aSpansIter = std::next(rCurrentSpans.begin(), nWidthsBound - 1);
- sal_Int32 nFixLastCellWidth = (*pCellWidths)[nWidthsBound-1] / *aSpansIter * *std::next(aSpansIter);
- if (nFixLastCellWidth > (*pCellWidths)[nWidthsBound])
- nFullWidthRelative += nFixLastCellWidth - (*pCellWidths)[nWidthsBound];
- }
-
- // tdf#131203 handle missing w:tblGrid
- if (nFullWidthRelative > 0)
- {
- for (size_t i = 0; i < nWidthsBound; ++i)
- {
- nSum += (*pCellWidths)[i];
- pSeparators[nPos].Position = (nSum * 10000) / nFullWidthRelative; // Relative position
- pSeparators[nPos].IsVisible = true;
- nPos++;
- }
- }
- }
-
- TablePropertyMapPtr pPropMap( new TablePropertyMap );
- pPropMap->Insert( PROP_TABLE_COLUMN_SEPARATORS, uno::Any( aSeparators ) );
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("rowProperties");
- pPropMap->dumpXml();
- TagLogger::getInstance().endElement();
-#endif
- insertRowProps(pPropMap);
- }
-
- // Now that potentially opened table is closed, save the table properties
- TableManager::insertTableProps(pTablePropMap);
-
- m_aTmpTableProperties.pop_back();
- TablePropertyMapPtr pEmptyTableProps( new TablePropertyMap() );
- m_aTmpTableProperties.push_back( pEmptyTableProps );
-
- ++m_nRow;
- m_nCell.back( ) = 0;
- getCurrentGrid()->clear();
- pCellWidths->clear();
-
- m_bTableSizeTypeInserted = false;
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-}
-
-void DomainMapperTableManager::clearData()
-{
- m_nRow = m_nHeaderRepeat = m_nTableWidth = m_nLayoutType = 0;
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.hxx b/writerfilter/source/dmapper/DomainMapperTableManager.hxx
deleted file mode 100644
index 6b5cee85743f..000000000000
--- a/writerfilter/source/dmapper/DomainMapperTableManager.hxx
+++ /dev/null
@@ -1,172 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include "TablePropertiesHandler.hxx"
-#include "TablePositionHandler.hxx"
-
-#include "TableManager.hxx"
-#include "PropertyMap.hxx"
-#include <vector>
-#include <memory>
-#include <comphelper/sequenceashashmap.hxx>
-
-namespace writerfilter::dmapper {
-
-class DomainMapper;
-
-class DomainMapperTableManager : public TableManager
-{
- typedef std::shared_ptr< std::vector<sal_Int32> > IntVectorPtr;
-
- sal_uInt32 m_nRow;
- ::std::vector< sal_uInt32 > m_nCell;
- sal_uInt32 m_nGridSpan;
- sal_Int32 m_nHeaderRepeat; //counter of repeated headers - if == -1 then the repeating stops
- sal_Int32 m_nTableWidth; //might be set directly or has to be calculated from the column positions
- /// Are we in a shape (text append stack is not empty) or in the body document?
- bool m_bIsInShape;
- std::vector< OUString > m_aTableStyleNames;
- /// Moved table (in moveRangeFromStart...moveRangeFromEnd or moveRangeToStart...moveRangeToEnd)
- std::vector< OUString > m_aMoved;
- /// Grab-bag of table look attributes for preserving.
- comphelper::SequenceAsHashMap m_aTableLook;
- std::vector< TablePositionHandlerPtr > m_aTablePositions;
- std::vector< TablePositionHandlerPtr > m_aTmpPosition; ///< Temporarily stores the position to compare it later
- std::vector< TablePropertyMapPtr > m_aTmpTableProperties; ///< Temporarily stores the table properties until end of row
-
- ::std::vector< IntVectorPtr > m_aTableGrid;
- /// If this is true, then we pushed a width before the next level started, and that should be carried over when starting the next level.
- bool m_bPushCurrentWidth;
- /// Individual table cell width values, used only in case the number of cells doesn't match the table grid.
- ::std::vector< IntVectorPtr > m_aCellWidths;
- /// Remember if table width was already set, when we lack a w:tblW, it should be set manually at the end.
- bool m_bTableSizeTypeInserted;
- /// Table layout algorithm, IOW if we should consider fixed column width or not.
- sal_uInt32 m_nLayoutType;
- /// Collected table paragraphs for table style handling
- std::stack< TableParagraphVectorPtr > m_aParagraphsToEndTable;
-
- std::unique_ptr<TablePropertiesHandler> m_pTablePropsHandler;
- PropertyMapPtr m_pStyleProps;
-
- bool shouldInsertRow(IntVectorPtr pCellWidths, IntVectorPtr pTableGrid, size_t nGrids, bool& rIsIncompleteGrid);
-
- virtual void clearData() override;
-
-public:
-
- DomainMapperTableManager();
- virtual ~DomainMapperTableManager() override;
-
- // use this method to avoid adding the properties for the table
- // but in the provided properties map.
- void SetStyleProperties(const PropertyMapPtr& pProperties) { m_pStyleProps = pProperties; };
-
- virtual bool sprm(Sprm & rSprm) override;
- bool attribute(Id nName, Value const & val);
-
- virtual void startLevel( ) override;
- virtual void endLevel( ) override;
-
- virtual void endOfCellAction() override;
- virtual void endOfRowAction() override;
-
- IntVectorPtr const & getCurrentGrid( );
- IntVectorPtr const & getCurrentCellWidths( );
- const TableParagraphVectorPtr & getCurrentParagraphs( );
-
- /// Turn the attributes collected so far in m_aTableLook into a property and clear the container.
- void finishTableLook();
- css::uno::Sequence<css::beans::PropertyValue> getCurrentTablePosition();
- TablePositionHandler* getCurrentTableRealPosition();
-
- virtual void cellProps(const TablePropertyMapPtr& pProps) override
- {
- if ( m_pStyleProps )
- m_pStyleProps->InsertProps(pProps.get());
- else
- TableManager::cellProps( pProps );
- };
-
- virtual void insertRowProps(const TablePropertyMapPtr& pProps) override
- {
- if ( m_pStyleProps )
- m_pStyleProps->InsertProps(pProps.get());
- else
- TableManager::insertRowProps( pProps );
- };
-
- virtual void insertTableProps(const TablePropertyMapPtr& pProps) override
- {
- if ( m_pStyleProps )
- m_pStyleProps->InsertProps(pProps.get());
- else
- m_aTmpTableProperties.back()->InsertProps(pProps.get());
- };
-
- void SetLayoutType(sal_uInt32 nLayoutType)
- {
- m_nLayoutType = nLayoutType;
- }
-
- using TableManager::isInCell;
-
- void setIsInShape(bool bIsInShape);
-
- // moveFromRangeStart and moveToRangeStart are there
- // in the first paragraph in the first cell of the
- // table moved by drag & drop with track changes, but
- // moveFromRangeEnd and moveToRangeEnd follow the
- // table element w:tbl in the same level (not in paragraph).
- // (Special indexing is related to the load of the tables:
- // first-level tables handled by two levels during the
- // import, to support table join etc. In the first cell,
- // setMoved() writes the first level from these two levels
- // i.e. second startLevel() hasn't been called, yet.)
- // TODO: check drag & drop of only a part of the tables.
- void setMoved(OUString sMoved)
- {
- if ( m_aMoved.empty() )
- return;
-
- if ( !sMoved.isEmpty() )
- m_aMoved[m_aMoved.size() - 1] = sMoved;
- else if ( m_aMoved.size() >= 2 )
- // next table rows weren't moved
- m_aMoved[m_aMoved.size() - 2] = "";
- else
- m_aMoved[m_aMoved.size() - 1] = "";
- }
-
- OUString getMoved() const
- {
- if ( m_aMoved.size() >= 2 && !m_aMoved[m_aMoved.size() - 2].isEmpty() )
- return m_aMoved[m_aMoved.size() - 2];
- else if ( !m_aMoved.empty() )
- return m_aMoved[m_aMoved.size() -1 ];
-
- return OUString();
- }
-
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
deleted file mode 100644
index 4fdacfb2f944..000000000000
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ /dev/null
@@ -1,9924 +0,0 @@
-/* -*- 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/.
- *
- * 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 <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/document/XDocumentProperties.hpp>
-#include <com/sun/star/xml/sax/SAXException.hpp>
-#include <ooxml/resourceids.hxx>
-#include "DomainMapper_Impl.hxx"
-#include "ConversionHelper.hxx"
-#include "SdtHelper.hxx"
-#include "DomainMapperTableHandler.hxx"
-#include "TagLogger.hxx"
-#include <com/sun/star/uno/XComponentContext.hpp>
-#include <com/sun/star/graphic/XGraphic.hpp>
-#include <com/sun/star/beans/PropertyAttribute.hpp>
-#include <com/sun/star/beans/XPropertyState.hpp>
-#include <com/sun/star/container/XNamed.hpp>
-#include <com/sun/star/document/PrinterIndependentLayout.hpp>
-#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
-#include <com/sun/star/embed/XEmbeddedObject.hpp>
-#include <com/sun/star/i18n/NumberFormatMapper.hpp>
-#include <com/sun/star/i18n/NumberFormatIndex.hpp>
-#include <com/sun/star/lang/XServiceInfo.hpp>
-#include <com/sun/star/style/CaseMap.hpp>
-#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
-#include <com/sun/star/style/LineNumberPosition.hpp>
-#include <com/sun/star/style/LineSpacing.hpp>
-#include <com/sun/star/style/LineSpacingMode.hpp>
-#include <com/sun/star/text/ChapterFormat.hpp>
-#include <com/sun/star/text/FilenameDisplayFormat.hpp>
-#include <com/sun/star/text/SetVariableType.hpp>
-#include <com/sun/star/text/XDocumentIndex.hpp>
-#include <com/sun/star/text/XDocumentIndexesSupplier.hpp>
-#include <com/sun/star/text/XFootnote.hpp>
-#include <com/sun/star/text/XEndnotesSupplier.hpp>
-#include <com/sun/star/text/XFootnotesSupplier.hpp>
-#include <com/sun/star/text/XLineNumberingProperties.hpp>
-#include <com/sun/star/style/XStyle.hpp>
-#include <com/sun/star/text/LabelFollow.hpp>
-#include <com/sun/star/text/PageNumberType.hpp>
-#include <com/sun/star/text/HoriOrientation.hpp>
-#include <com/sun/star/text/VertOrientation.hpp>
-#include <com/sun/star/text/ReferenceFieldPart.hpp>
-#include <com/sun/star/text/RelOrientation.hpp>
-#include <com/sun/star/text/ReferenceFieldSource.hpp>
-#include <com/sun/star/text/SizeType.hpp>
-#include <com/sun/star/text/TextContentAnchorType.hpp>
-#include <com/sun/star/text/WrapTextMode.hpp>
-#include <com/sun/star/text/XChapterNumberingSupplier.hpp>
-#include <com/sun/star/text/XDependentTextField.hpp>
-#include <com/sun/star/text/XParagraphCursor.hpp>
-#include <com/sun/star/text/XRedline.hpp>
-#include <com/sun/star/text/XTextFieldsSupplier.hpp>
-#include <com/sun/star/text/XTextFrame.hpp>
-#include <com/sun/star/text/XTextTable.hpp>
-#include <com/sun/star/text/RubyPosition.hpp>
-#include <com/sun/star/text/XTextRangeCompare.hpp>
-#include <com/sun/star/style/DropCapFormat.hpp>
-#include <com/sun/star/util/NumberFormatter.hpp>
-#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
-#include <com/sun/star/util/XNumberFormatter.hpp>
-#include <com/sun/star/document/XViewDataSupplier.hpp>
-#include <com/sun/star/container/XIndexContainer.hpp>
-#include <com/sun/star/text/ControlCharacter.hpp>
-#include <com/sun/star/text/XTextColumns.hpp>
-#include <com/sun/star/awt/CharSet.hpp>
-#include <com/sun/star/awt/FontRelief.hpp>
-#include <com/sun/star/awt/FontSlant.hpp>
-#include <com/sun/star/awt/FontStrikeout.hpp>
-#include <com/sun/star/awt/FontWeight.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/embed/XHierarchicalStorageAccess.hpp>
-#include <com/sun/star/embed/ElementModes.hpp>
-#include <com/sun/star/document/XImporter.hpp>
-#include <com/sun/star/document/XFilter.hpp>
-#include <comphelper/indexedpropertyvalues.hxx>
-#include <editeng/flditem.hxx>
-#include <editeng/unotext.hxx>
-#include <o3tl/deleter.hxx>
-#include <o3tl/safeint.hxx>
-#include <o3tl/temporary.hxx>
-#include <oox/mathml/imexport.hxx>
-#include <utility>
-#include <xmloff/odffields.hxx>
-#include <rtl/uri.hxx>
-#include <unotools/ucbstreamhelper.hxx>
-#include <unotools/streamwrap.hxx>
-#include <comphelper/scopeguard.hxx>
-#include <comphelper/string.hxx>
-
-#include <dmapper/GraphicZOrderHelper.hxx>
-
-#include <oox/token/tokens.hxx>
-
-#include <cmath>
-#include <optional>
-#include <map>
-#include <tuple>
-#include <unordered_map>
-#include <regex>
-#include <algorithm>
-
-#include <officecfg/Office/Common.hxx>
-#include <filter/msfilter/util.hxx>
-#include <filter/msfilter/ww8fields.hxx>
-#include <comphelper/sequence.hxx>
-#include <comphelper/propertyvalue.hxx>
-#include <comphelper/propertysequence.hxx>
-#include <unotools/mediadescriptor.hxx>
-#include <comphelper/diagnose_ex.hxx>
-#include <sal/log.hxx>
-#include <o3tl/string_view.hxx>
-#include <com/sun/star/drawing/FillStyle.hpp>
-
-#include <unicode/errorcode.h>
-#include <unicode/regex.h>
-
-#define REFFLDFLAG_STYLE_FROM_BOTTOM 0xc100
-#define REFFLDFLAG_STYLE_HIDE_NON_NUMERICAL 0xc200
-
-using namespace ::com::sun::star;
-using namespace oox;
-namespace writerfilter::dmapper{
-
-//line numbering for header/footer
-static void lcl_linenumberingHeaderFooter( const uno::Reference<container::XNameContainer>& xStyles, const OUString& rname, DomainMapper_Impl* dmapper )
-{
- const StyleSheetEntryPtr pEntry = dmapper->GetStyleSheetTable()->FindStyleSheetByISTD( rname );
- if (!pEntry)
- return;
- const StyleSheetPropertyMap* pStyleSheetProperties = pEntry->m_pProperties.get();
- if ( !pStyleSheetProperties )
- return;
- sal_Int32 nListId = pStyleSheetProperties->props().GetListId();
- if( xStyles.is() )
- {
- if( xStyles->hasByName( rname ) )
- {
- uno::Reference< style::XStyle > xStyle;
- xStyles->getByName( rname ) >>= xStyle;
- if( !xStyle.is() )
- return;
- uno::Reference<beans::XPropertySet> xPropertySet( xStyle, uno::UNO_QUERY );
- xPropertySet->setPropertyValue( getPropertyName( PROP_PARA_LINE_NUMBER_COUNT ), uno::Any( nListId >= 0 ) );
- }
- }
-}
-
-// Populate Dropdown Field properties from FFData structure
-static void lcl_handleDropdownField( const uno::Reference< beans::XPropertySet >& rxFieldProps, const FFDataHandler::Pointer_t& pFFDataHandler )
-{
- if ( !rxFieldProps.is() )
- return;
-
- if ( !pFFDataHandler->getName().isEmpty() )
- rxFieldProps->setPropertyValue( "Name", uno::Any( pFFDataHandler->getName() ) );
-
- const FFDataHandler::DropDownEntries_t& rEntries = pFFDataHandler->getDropDownEntries();
- uno::Sequence< OUString > sItems( rEntries.size() );
- ::std::copy( rEntries.begin(), rEntries.end(), sItems.getArray());
- if ( sItems.hasElements() )
- rxFieldProps->setPropertyValue( "Items", uno::Any( sItems ) );
-
- sal_Int32 nResult = pFFDataHandler->getDropDownResult().toInt32();
- if (nResult > 0 && o3tl::make_unsigned(nResult) < sItems.size())
- rxFieldProps->setPropertyValue("SelectedItem", uno::Any(sItems[nResult]));
- if ( !pFFDataHandler->getHelpText().isEmpty() )
- rxFieldProps->setPropertyValue( "Help", uno::Any( pFFDataHandler->getHelpText() ) );
-}
-
-static void lcl_handleTextField( const uno::Reference< beans::XPropertySet >& rxFieldProps, const FFDataHandler::Pointer_t& pFFDataHandler )
-{
- if ( rxFieldProps.is() && pFFDataHandler )
- {
- rxFieldProps->setPropertyValue
- (getPropertyName(PROP_HINT),
- uno::Any(pFFDataHandler->getStatusText()));
- rxFieldProps->setPropertyValue
- (getPropertyName(PROP_HELP),
- uno::Any(pFFDataHandler->getHelpText()));
- rxFieldProps->setPropertyValue
- (getPropertyName(PROP_CONTENT),
- uno::Any(pFFDataHandler->getTextDefault()));
- }
-}
-
-/**
- Very similar to DomainMapper_Impl::GetPropertyFromStyleSheet
- It is focused on paragraph properties search in current & parent stylesheet entries.
- But it will not take into account properties with listid: these are "list paragraph styles" and
- not used in some cases.
-*/
-static uno::Any lcl_GetPropertyFromParaStyleSheetNoNum(PropertyIds eId, StyleSheetEntryPtr pEntry, const StyleSheetTablePtr& rStyleSheet)
-{
- while (pEntry)
- {
- if (pEntry->m_pProperties)
- {
- std::optional<PropertyMap::Property> aProperty =
- pEntry->m_pProperties->getProperty(eId);
- if (aProperty)
- {
- if (pEntry->m_pProperties->props().GetListId())
- // It is a paragraph style with list. Paragraph list styles are not taken into account
- return uno::Any();
- else
- return aProperty->second;
- }
- }
- //search until the property is set or no parent is available
- StyleSheetEntryPtr pNewEntry;
- if (!pEntry->m_sBaseStyleIdentifier.isEmpty())
- pNewEntry = rStyleSheet->FindStyleSheetByISTD(pEntry->m_sBaseStyleIdentifier);
-
- SAL_WARN_IF(pEntry == pNewEntry, "writerfilter.dmapper", "circular loop in style hierarchy?");
-
- if (pEntry == pNewEntry) //fdo#49587
- break;
-
- pEntry = pNewEntry;
- }
- return uno::Any();
-}
-
-
-namespace {
-
-struct FieldConversion
-{
- const char* cFieldServiceName;
- FieldId eFieldId;
-};
-
-}
-
-typedef std::unordered_map<OUString, FieldConversion> FieldConversionMap_t;
-
-/// Gives access to the parent field context of the topmost one, if there is any.
-static FieldContextPtr GetParentFieldContext(const std::deque<FieldContextPtr>& rFieldStack)
-{
- if (rFieldStack.size() < 2)
- {
- return nullptr;
- }
-
- return rFieldStack[rFieldStack.size() - 2];
-}
-
-/// Decides if the pInner field inside pOuter is allowed in Writer core, depending on their type.
-static bool IsFieldNestingAllowed(const FieldContextPtr& pOuter, const FieldContextPtr& pInner)
-{
- if (!pInner->GetFieldId())
- {
- return true;
- }
-
- std::optional<FieldId> oOuterFieldId = pOuter->GetFieldId();
- if (!oOuterFieldId)
- {
- OUString aCommand = pOuter->GetCommand();
-
- // Ignore leading space before the field name, but don't accept IFF when we check for IF.
- while (aCommand.getLength() > 3 && aCommand[0] == ' ')
- aCommand = aCommand.subView(1);
-
- if (aCommand.startsWith("IF "))
- {
- // This will be FIELD_IF once the command is closed.
- oOuterFieldId = FIELD_IF;
- }
- }
-
- if (!oOuterFieldId)
- {
- return true;
- }
-
- switch (*oOuterFieldId)
- {
- case FIELD_IF:
- {
- switch (*pInner->GetFieldId())
- {
- case FIELD_DOCVARIABLE:
- case FIELD_FORMTEXT:
- case FIELD_FORMULA:
- case FIELD_IF:
- case FIELD_MERGEFIELD:
- case FIELD_REF:
- case FIELD_PAGE:
- case FIELD_NUMPAGES:
- {
- // LO does not currently know how to evaluate these as conditions or results
- return false;
- }
- default:
- break;
- }
- break;
- }
- default:
- break;
- }
-
- return true;
-}
-
-DomainMapper_Impl::DomainMapper_Impl(
- DomainMapper& rDMapper,
- uno::Reference<uno::XComponentContext> xContext,
- uno::Reference<lang::XComponent> const& xModel,
- SourceDocumentType eDocumentType,
- utl::MediaDescriptor const & rMediaDesc) :
- m_eDocumentType( eDocumentType ),
- m_rDMapper( rDMapper ),
- m_pOOXMLDocument(nullptr),
- m_xTextDocument( xModel, uno::UNO_QUERY ),
- m_xTextFactory( xModel, uno::UNO_QUERY ),
- m_xComponentContext(std::move( xContext )),
- m_bForceGenericFields(officecfg::Office::Common::Filter::Microsoft::Import::ForceImportWWFieldsAsGenericFields::get()),
- m_bIsDecimalComma( false ),
- m_bIsFirstSection( true ),
- m_bStartTOC(false),
- m_bStartTOCHeaderFooter(false),
- m_bStartedTOC(false),
- m_bStartIndex(false),
- m_bStartBibliography(false),
- m_nStartGenericField(0),
- m_bTextDeleted(false),
- m_nLastRedlineMovedID(1),
- m_sCurrentPermId(0),
- m_bFrameDirectionSet(false),
- m_bInDocDefaultsImport(false),
- m_bInStyleSheetImport( false ),
- m_bInNumberingImport(false),
- m_bInAnyTableImport( false ),
- m_bDiscardHeaderFooter( false ),
- m_eSkipFootnoteState(SkipFootnoteSeparator::OFF),
- m_nFootnotes(-1),
- m_nEndnotes(-1),
- m_nFirstFootnoteIndex(-1),
- m_nFirstEndnoteIndex(-1),
- m_bLineNumberingSet( false ),
- m_bIsParaMarkerChange( false ),
- m_bIsParaMarkerMove( false ),
- m_bRedlineImageInPreviousRun( false ),
- m_bDummyParaAddedForTableInSection( false ),
- m_bIsLastSectionGroup( false ),
- m_bUsingEnhancedFields( false ),
- m_nAnnotationId( -1 ),
- m_aSmartTagHandler(m_xComponentContext, m_xTextDocument),
- m_xInsertTextRange(rMediaDesc.getUnpackedValueOrDefault("TextInsertModeRange", uno::Reference<text::XTextRange>())),
- m_xAltChunkStartingRange(rMediaDesc.getUnpackedValueOrDefault("AltChunkStartingRange", uno::Reference<text::XTextRange>())),
- m_bIsNewDoc(!rMediaDesc.getUnpackedValueOrDefault("InsertMode", false)),
- m_bIsAltChunk(rMediaDesc.getUnpackedValueOrDefault("AltChunkMode", false)),
- m_bIsReadGlossaries(rMediaDesc.getUnpackedValueOrDefault("ReadGlossaries", false)),
- m_bHasFtnSep(false),
- m_bIsSplitPara(false),
- m_bIsActualParagraphFramed( false ),
- m_bSaxError(false)
-{
- m_StreamStateStack.emplace(); // add state for document body
- m_aBaseUrl = rMediaDesc.getUnpackedValueOrDefault(
- utl::MediaDescriptor::PROP_DOCUMENTBASEURL, OUString());
- if (m_aBaseUrl.isEmpty()) {
- m_aBaseUrl = rMediaDesc.getUnpackedValueOrDefault(
- utl::MediaDescriptor::PROP_URL, OUString());
- }
-
- appendTableManager( );
- GetBodyText();
- if (!m_bIsNewDoc && !m_xBodyText)
- {
- throw uno::Exception("failed to find body text of the insert position", nullptr);
- }
-
- uno::Reference< text::XTextAppend > xBodyTextAppend( m_xBodyText, uno::UNO_QUERY );
- m_aTextAppendStack.push(TextAppendContext(xBodyTextAppend,
- m_bIsNewDoc ? uno::Reference<text::XTextCursor>() : m_xBodyText->createTextCursorByRange(m_xInsertTextRange)));
-
- //todo: does it makes sense to set the body text as static text interface?
- uno::Reference< text::XTextAppendAndConvert > xBodyTextAppendAndConvert( m_xBodyText, uno::UNO_QUERY );
- m_pTableHandler = new DomainMapperTableHandler(xBodyTextAppendAndConvert, *this);
- getTableManager( ).setHandler(m_pTableHandler);
-
- getTableManager( ).startLevel();
- m_bUsingEnhancedFields = !comphelper::IsFuzzing() && officecfg::Office::Common::Filter::Microsoft::Import::ImportWWFieldsAsEnhancedFields::get();
-
- m_pSdtHelper = new SdtHelper(*this, m_xComponentContext);
-
- m_aRedlines.push(std::vector<RedlineParamsPtr>());
-
- if (m_bIsAltChunk)
- {
- m_bIsFirstSection = false;
- }
-}
-
-
-DomainMapper_Impl::~DomainMapper_Impl()
-{
- assert(!m_StreamStateStack.empty());
- ChainTextFrames();
- // Don't remove last paragraph when pasting, sw expects that empty paragraph.
- if (m_bIsNewDoc)
- {
- RemoveLastParagraph();
- suppress_fun_call_w_exception(GetStyleSheetTable()->ApplyClonedTOCStyles());
- }
- if (hasTableManager())
- {
- getTableManager().endLevel();
- popTableManager();
- }
-}
-
-writerfilter::ooxml::OOXMLDocument* DomainMapper_Impl::getDocumentReference() const
-{
- return m_pOOXMLDocument;
-}
-
-uno::Reference< container::XNameContainer > const & DomainMapper_Impl::GetPageStyles()
-{
- if(!m_xPageStyles1.is())
- {
- uno::Reference< style::XStyleFamiliesSupplier > xSupplier( m_xTextDocument, uno::UNO_QUERY );
- if (xSupplier.is())
- xSupplier->getStyleFamilies()->getByName("PageStyles") >>= m_xPageStyles1;
- }
- return m_xPageStyles1;
-}
-
-OUString DomainMapper_Impl::GetUnusedPageStyleName()
-{
- static const char DEFAULT_STYLE[] = "Converted";
- if (!m_xNextUnusedPageStyleNo)
- {
- const uno::Sequence< OUString > aPageStyleNames = GetPageStyles()->getElementNames();
- sal_Int32 nMaxIndex = 0;
- // find the highest number x in each style with the name "DEFAULT_STYLE+x" and
- // return an incremented name
-
- for ( const auto& rStyleName : aPageStyleNames )
- {
- if ( rStyleName.startsWith( DEFAULT_STYLE ) )
- {
- sal_Int32 nIndex = o3tl::toInt32(rStyleName.subView( strlen( DEFAULT_STYLE ) ));
- if ( nIndex > nMaxIndex )
- nMaxIndex = nIndex;
- }
- }
- m_xNextUnusedPageStyleNo = nMaxIndex + 1;
- }
-
- OUString sPageStyleName = DEFAULT_STYLE + OUString::number( *m_xNextUnusedPageStyleNo );
- *m_xNextUnusedPageStyleNo = *m_xNextUnusedPageStyleNo + 1;
- return sPageStyleName;
-}
-
-uno::Reference< container::XNameContainer > const & DomainMapper_Impl::GetCharacterStyles()
-{
- if(!m_xCharacterStyles.is())
- {
- uno::Reference< style::XStyleFamiliesSupplier > xSupplier( m_xTextDocument, uno::UNO_QUERY );
- if (xSupplier.is())
- xSupplier->getStyleFamilies()->getByName("CharacterStyles") >>= m_xCharacterStyles;
- }
- return m_xCharacterStyles;
-}
-
-uno::Reference<container::XNameContainer> const& DomainMapper_Impl::GetParagraphStyles()
-{
- if (!m_xParagraphStyles.is())
- {
- uno::Reference<style::XStyleFamiliesSupplier> xSupplier(m_xTextDocument, uno::UNO_QUERY);
- if (xSupplier.is())
- xSupplier->getStyleFamilies()->getByName("ParagraphStyles") >>= m_xParagraphStyles;
- }
- return m_xParagraphStyles;
-}
-
-OUString DomainMapper_Impl::GetUnusedCharacterStyleName()
-{
- static const char cListLabel[] = "ListLabel ";
- if (!m_xNextUnusedCharacterStyleNo)
- {
- //search for all character styles with the name sListLabel + <index>
- const uno::Sequence< OUString > aCharacterStyleNames = GetCharacterStyles()->getElementNames();
- sal_Int32 nMaxIndex = 0;
- for ( const auto& rStyleName : aCharacterStyleNames )
- {
- OUString sSuffix;
- if ( rStyleName.startsWith( cListLabel, &sSuffix ) )
- {
- sal_Int32 nSuffix = sSuffix.toInt32();
- if( nSuffix > 0 && nSuffix > nMaxIndex )
- nMaxIndex = nSuffix;
- }
- }
- m_xNextUnusedCharacterStyleNo = nMaxIndex + 1;
- }
-
- OUString sPageStyleName = cListLabel + OUString::number( *m_xNextUnusedCharacterStyleNo );
- *m_xNextUnusedCharacterStyleNo = *m_xNextUnusedCharacterStyleNo + 1;
- return sPageStyleName;
-}
-
-uno::Reference< text::XText > const & DomainMapper_Impl::GetBodyText()
-{
- if(!m_xBodyText.is())
- {
- if (m_xInsertTextRange.is())
- m_xBodyText = m_xInsertTextRange->getText();
- else if (m_xTextDocument.is())
- m_xBodyText = m_xTextDocument->getText();
- }
- return m_xBodyText;
-}
-
-
-uno::Reference< beans::XPropertySet > const & DomainMapper_Impl::GetDocumentSettings()
-{
- if( !m_xDocumentSettings.is() && m_xTextFactory.is())
- {
- m_xDocumentSettings.set( m_xTextFactory->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY );
- }
- return m_xDocumentSettings;
-}
-
-
-void DomainMapper_Impl::SetDocumentSettingsProperty( const OUString& rPropName, const uno::Any& rValue )
-{
- uno::Reference< beans::XPropertySet > xSettings = GetDocumentSettings();
- if( xSettings.is() )
- {
- try
- {
- xSettings->setPropertyValue( rPropName, rValue );
- }
- catch( const uno::Exception& )
- {
- }
- }
-}
-
-namespace
-{
-void CopyPageDescNameToNextParagraph(const uno::Reference<lang::XComponent>& xParagraph,
- const uno::Reference<text::XTextCursor>& xCursor)
-{
- // First check if xParagraph has a non-empty page style name to copy from.
- uno::Reference<beans::XPropertySet> xParagraphProps(xParagraph, uno::UNO_QUERY);
- if (!xParagraphProps.is())
- {
- return;
- }
-
- uno::Any aPageDescName = xParagraphProps->getPropertyValue("PageDescName");
- OUString sPageDescName;
- aPageDescName >>= sPageDescName;
- if (sPageDescName.isEmpty())
- {
- return;
- }
-
- // If so, search for the next paragraph.
- uno::Reference<text::XParagraphCursor> xParaCursor(xCursor, uno::UNO_QUERY);
- if (!xParaCursor.is())
- {
- return;
- }
-
- // Create a range till the next paragraph and then enumerate on the range.
- if (!xParaCursor->gotoNextParagraph(/*bExpand=*/true))
- {
- return;
- }
-
- uno::Reference<container::XEnumerationAccess> xEnumerationAccess(xParaCursor, uno::UNO_QUERY);
- if (!xEnumerationAccess.is())
- {
- return;
- }
-
- uno::Reference<container::XEnumeration> xEnumeration = xEnumerationAccess->createEnumeration();
- if (!xEnumeration.is())
- {
- return;
- }
-
- xEnumeration->nextElement();
- if (!xEnumeration->hasMoreElements())
- {
- return;
- }
-
- // We found a next item in the enumeration: it's usually a paragraph, but may be a table as
- // well.
- uno::Reference<beans::XPropertySet> xNextParagraph(xEnumeration->nextElement(), uno::UNO_QUERY);
- if (!xNextParagraph.is())
- {
- return;
- }
-
- // See if there is page style set already: if so, don't touch it.
- OUString sNextPageDescName;
- xNextParagraph->getPropertyValue("PageDescName") >>= sNextPageDescName;
- if (!sNextPageDescName.isEmpty())
- {
- return;
- }
-
- // Finally copy it over, so it's not lost.
- xNextParagraph->setPropertyValue("PageDescName", aPageDescName);
-}
-}
-
-void DomainMapper_Impl::RemoveDummyParaForTableInSection()
-{
- SetIsDummyParaAddedForTableInSection(false);
- PropertyMapPtr pContext = GetTopContextOfType(CONTEXT_SECTION);
- SectionPropertyMap* pSectionContext = dynamic_cast< SectionPropertyMap* >( pContext.get() );
- if (!pSectionContext)
- return;
-
- if (m_aTextAppendStack.empty())
- return;
- uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if (!xTextAppend.is())
- return;
-
- uno::Reference< text::XTextCursor > xCursor = xTextAppend->createTextCursorByRange(pSectionContext->GetStartingRange());
-
- // Remove the extra NumPicBullets from the document,
- // which get attached to the first paragraph in the
- // document
- ListsManager::Pointer pListTable = GetListTable();
- pListTable->DisposeNumPicBullets();
-
- uno::Reference<container::XEnumerationAccess> xEnumerationAccess(xCursor, uno::UNO_QUERY);
- if (xEnumerationAccess.is() && m_aTextAppendStack.size() == 1 )
- {
- uno::Reference<container::XEnumeration> xEnumeration = xEnumerationAccess->createEnumeration();
- uno::Reference<lang::XComponent> xParagraph(xEnumeration->nextElement(), uno::UNO_QUERY);
- // Make sure no page breaks are lost.
- CopyPageDescNameToNextParagraph(xParagraph, xCursor);
- xParagraph->dispose();
- }
-}
-void DomainMapper_Impl::AddDummyParaForTableInSection()
-{
- // Shapes and textboxes can't have sections.
- if (IsInShape() || m_StreamStateStack.top().bIsInTextBox)
- return;
-
- if (!m_aTextAppendStack.empty())
- {
- uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if (xTextAppend.is())
- {
- xTextAppend->finishParagraph( uno::Sequence< beans::PropertyValue >() );
- SetIsDummyParaAddedForTableInSection(true);
- }
- }
-}
-
- static OUString lcl_FindLastBookmark(const uno::Reference<text::XTextCursor>& xCursor,
- bool bAlreadyExpanded)
- {
- OUString sName;
- if (!xCursor.is())
- return sName;
-
- // Select 1 previous element
- if (!bAlreadyExpanded)
- xCursor->goLeft(1, true);
- comphelper::ScopeGuard unselectGuard(
- [xCursor, bAlreadyExpanded]()
- {
- if (!bAlreadyExpanded)
- xCursor->goRight(1, true);
- });
-
- uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xCursor, uno::UNO_QUERY);
- if (!xParaEnumAccess.is())
- return sName;
-
- // Iterate through selection paragraphs
- uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration();
- if (!xParaEnum->hasMoreElements())
- return sName;
-
- // Iterate through first para portions
- uno::Reference<container::XEnumerationAccess> xRunEnumAccess(xParaEnum->nextElement(),
- uno::UNO_QUERY_THROW);
- uno::Reference<container::XEnumeration> xRunEnum = xRunEnumAccess->createEnumeration();
- while (xRunEnum->hasMoreElements())
- {
- uno::Reference<beans::XPropertySet> xProps(xRunEnum->nextElement(), uno::UNO_QUERY_THROW);
- uno::Any aType(xProps->getPropertyValue("TextPortionType"));
- OUString sType;
- aType >>= sType;
- if (sType == "Bookmark")
- {
- uno::Reference<container::XNamed> xBookmark(xProps->getPropertyValue("Bookmark"),
- uno::UNO_QUERY_THROW);
- sName = xBookmark->getName();
- // Do not stop the scan here. Maybe there are 2 bookmarks?
- }
- }
-
- return sName;
- }
-
-static void reanchorObjects(const uno::Reference<uno::XInterface>& xFrom,
- const uno::Reference<text::XTextRange>& xTo,
- const uno::Reference<drawing::XDrawPage>& xDrawPage)
-{
- std::vector<uno::Reference<text::XTextContent>> aShapes;
- bool bFastPathDone = false;
- if (uno::Reference<beans::XPropertySet> xProps{ xFrom, uno::UNO_QUERY })
- {
- try
- {
- // See SwXParagraph::Impl::GetPropertyValues_Impl
- uno::Sequence<uno::Reference<text::XTextContent>> aSeq;
- xProps->getPropertyValue(u"OOXMLImport_AnchoredShapes"_ustr) >>= aSeq;
- aShapes.insert(aShapes.end(), aSeq.begin(), aSeq.end());
- bFastPathDone = true;
- }
- catch (const uno::Exception&)
- {
- }
- }
-
- if (!bFastPathDone)
- {
- // Can this happen? Fallback to slow DrawPage iteration and range comparison
- uno::Reference<text::XTextRange> xRange(xFrom, uno::UNO_QUERY_THROW);
- uno::Reference<text::XTextRangeCompare> xCompare(xRange->getText(), uno::UNO_QUERY_THROW);
-
- const sal_Int32 count = xDrawPage->getCount();
- for (sal_Int32 i = 0; i < count; ++i)
- {
- try
- {
- uno::Reference<text::XTextContent> xShape(xDrawPage->getByIndex(i),
- uno::UNO_QUERY_THROW);
- uno::Reference<text::XTextRange> xAnchor(xShape->getAnchor(), uno::UNO_SET_THROW);
- if (xCompare->compareRegionStarts(xAnchor, xRange) <= 0
- && xCompare->compareRegionEnds(xAnchor, xRange) >= 0)
- {
- aShapes.push_back(xShape);
- }
- }
- catch (const uno::Exception&)
- {
- // Can happen e.g. in compareRegion*, when the shape is in a header,
- // and paragraph in body
- }
- }
- }
-
- for (const auto& xShape : aShapes)
- xShape->attach(xTo);
-}
-
-void DomainMapper_Impl::RemoveLastParagraph( )
-{
- if (m_bDiscardHeaderFooter)
- return;
-
- if (m_aTextAppendStack.empty())
- return;
-
- uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if (!xTextAppend.is())
- return;
-
- if (hasTableManager() && getTableManager().getCurrentTablePosition().getLength() != 0)
- {
- // If we have an open floating table, then don't remove this paragraph, since that'll be the
- // anchor of the floating table. Otherwise we would lose the table.
- return;
- }
-
- try
- {
- uno::Reference< text::XTextCursor > xCursor;
- if (m_bIsNewDoc)
- {
- xCursor = xTextAppend->createTextCursor();
- xCursor->gotoEnd(false);
- }
- else
- xCursor.set(m_aTextAppendStack.top().xCursor, uno::UNO_SET_THROW);
-
- // Keep the character properties of the last but one paragraph, even if
- // it's empty. This works for headers/footers, and maybe in other cases
- // as well, but surely not in textboxes.
- // fdo#58327: also do this at the end of the document: when pasting,
- // a table before the cursor position would be deleted
- bool const bEndOfDocument(m_aTextAppendStack.size() == 1);
-
- uno::Reference<lang::XComponent> xParagraph;
- if (IsInHeaderFooter() || bEndOfDocument)
- {
- if (uno::Reference<container::XEnumerationAccess> xEA{ xCursor, uno::UNO_QUERY })
- {
- xParagraph.set(xEA->createEnumeration()->nextElement(), uno::UNO_QUERY);
- }
- }
-
- xCursor->goLeft(1, true);
- // If this is a text on a shape, possibly the text has the trailing
- // newline removed already. RTF may also not have the trailing newline.
- if (!(xCursor->getString() == SAL_NEWLINE_STRING ||
- // tdf#105444 comments need an exception, if SAL_NEWLINE_STRING defined as "\r\n"
- (sizeof(SAL_NEWLINE_STRING) - 1 == 2 && xCursor->getString() == "\n")))
- return;
-
- uno::Reference<beans::XPropertySet> xDocProps(GetTextDocument(), uno::UNO_QUERY_THROW);
- static constexpr OUString RecordChanges(u"RecordChanges"_ustr);
-
- comphelper::ScopeGuard redlineRestore(
- [xDocProps, aPreviousValue = xDocProps->getPropertyValue(RecordChanges)]()
- { xDocProps->setPropertyValue(RecordChanges, aPreviousValue); });
-
- // disable redlining, otherwise we might end up with an unwanted recorded operations
- xDocProps->setPropertyValue(RecordChanges, uno::Any(false));
-
- if (xParagraph)
- {
- // move all anchored objects to the previous paragraph
- uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(GetTextDocument(),
- uno::UNO_QUERY_THROW);
- auto xDrawPage = xDrawPageSupplier->getDrawPage();
- if (xDrawPage && xDrawPage->hasElements())
- {
- // Cursor already spans two paragraphs
- uno::Reference<container::XEnumerationAccess> xEA(xCursor,
- uno::UNO_QUERY_THROW);
- auto xEnumeration = xEA->createEnumeration();
- uno::Reference<text::XTextRange> xPrevParagraph(xEnumeration->nextElement(),
- uno::UNO_QUERY_THROW);
- reanchorObjects(xParagraph, xPrevParagraph, xDrawPage);
- }
-
- xParagraph->dispose();
- }
- else
- {
- // Try to find and remember last bookmark in document: it potentially
- // can be deleted by xCursor->setString() but not by xParagraph->dispose()
- OUString sLastBookmarkName;
- if (bEndOfDocument)
- sLastBookmarkName = lcl_FindLastBookmark(xCursor, true);
-
- // The cursor already selects across the paragraph break
- // delete
- xCursor->setString(OUString());
-
- // call to xCursor->setString possibly did remove final bookmark
- // from previous paragraph. We need to restore it, if there was any.
- if (sLastBookmarkName.getLength())
- {
- OUString sBookmarkNameAfterRemoval = lcl_FindLastBookmark(xCursor, false);
- if (sBookmarkNameAfterRemoval.isEmpty())
- {
- // Yes, it was removed. Restore
- uno::Reference<text::XTextContent> xBookmark(
- m_xTextFactory->createInstance("com.sun.star.text.Bookmark"),
- uno::UNO_QUERY_THROW);
-
- uno::Reference<container::XNamed> xBkmNamed(xBookmark,
- uno::UNO_QUERY_THROW);
- xBkmNamed->setName(sLastBookmarkName);
- xTextAppend->insertTextContent(xCursor, xBookmark, !xCursor->isCollapsed());
- }
- }
- }
- }
- catch( const uno::Exception& )
- {
- }
-}
-
-
-void DomainMapper_Impl::SetIsLastSectionGroup( bool bIsLast )
-{
- m_bIsLastSectionGroup = bIsLast;
-}
-
-void DomainMapper_Impl::SetIsLastParagraphInSection( bool bIsLast )
-{
- m_StreamStateStack.top().bIsLastParaInSection = bIsLast;
-}
-
-
-void DomainMapper_Impl::SetIsFirstParagraphInSection( bool bIsFirst )
-{
- m_StreamStateStack.top().bIsFirstParaInSection = bIsFirst;
-}
-
-void DomainMapper_Impl::SetIsFirstParagraphInSectionAfterRedline( bool bIsFirstAfterRedline )
-{
- m_StreamStateStack.top().bIsFirstParaInSectionAfterRedline = bIsFirstAfterRedline;
-}
-
-bool DomainMapper_Impl::GetIsFirstParagraphInSection( bool bAfterRedline ) const
-{
- // Anchored objects may include multiple paragraphs,
- // and none of them should be considered the first para in section.
- return (bAfterRedline
- ? m_StreamStateStack.top().bIsFirstParaInSectionAfterRedline
- : m_StreamStateStack.top().bIsFirstParaInSection)
- && !IsInShape()
- && !IsInComments()
- && !IsInFootOrEndnote();
-}
-
-void DomainMapper_Impl::SetIsFirstParagraphInShape(bool bIsFirst)
-{
- m_StreamStateStack.top().bIsFirstParaInShape = bIsFirst;
-}
-
-void DomainMapper_Impl::SetIsDummyParaAddedForTableInSection( bool bIsAdded )
-{
- m_bDummyParaAddedForTableInSection = bIsAdded;
-}
-
-
-void DomainMapper_Impl::SetIsTextFrameInserted( bool bIsInserted )
-{
- m_StreamStateStack.top().bTextFrameInserted = bIsInserted;
-}
-
-void DomainMapper_Impl::SetParaSectpr(bool bParaSectpr)
-{
- m_StreamStateStack.top().bParaSectpr = bParaSectpr;
-}
-
-void DomainMapper_Impl::SetSdt(bool bSdt)
-{
- m_StreamStateStack.top().bSdt = bSdt;
-
- if (m_StreamStateStack.top().bSdt && !m_aTextAppendStack.empty())
- {
- m_StreamStateStack.top().xSdtEntryStart = GetTopTextAppend()->getEnd();
- }
- else
- {
- m_StreamStateStack.top().xSdtEntryStart.clear();
- }
-}
-
-void DomainMapper_Impl::PushSdt()
-{
- if (m_aTextAppendStack.empty())
- {
- return;
- }
-
- uno::Reference<text::XTextAppend> xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if (!xTextAppend.is())
- {
- return;
- }
-
- // This may delete text, so call it early, before we would set our start position, which may be
- // invalidated by a delete.
- MergeAtContentImageRedlineWithNext(xTextAppend);
-
- uno::Reference<text::XText> xText = xTextAppend->getText();
- if (!xText.is())
- {
- return;
- }
-
- uno::Reference<text::XTextCursor> xCursor
- = xText->createTextCursorByRange(xTextAppend->getEnd());
- // Offset so the cursor is not adjusted as we import the SDT's content.
- bool bStart = !xCursor->goLeft(1, /*bExpand=*/false);
- m_xSdtStarts.push({bStart, OUString(), xCursor->getStart()});
-}
-
-const std::stack<BookmarkInsertPosition>& DomainMapper_Impl::GetSdtStarts() const
-{
- return m_xSdtStarts;
-}
-
-void DomainMapper_Impl::PopSdt()
-{
- if (m_xSdtStarts.empty())
- {
- return;
- }
-
- BookmarkInsertPosition aPosition = m_xSdtStarts.top();
- m_xSdtStarts.pop();
- uno::Reference<text::XTextRange> xStart = aPosition.m_xTextRange;
- uno::Reference<text::XTextRange> xEnd = GetTopTextAppend()->getEnd();
- uno::Reference<text::XText> xText = xEnd->getText();
-
- uno::Reference<text::XTextCursor> xCursor;
- try
- {
- xCursor = xText->createTextCursorByRange(xStart);
- }
- catch (const uno::RuntimeException&)
- {
- TOOLS_WARN_EXCEPTION("writerfilter", "DomainMapper_Impl::DomainMapper_Impl::PopSdt: createTextCursorByRange() failed");
- // We redline form controls and that gets us confused when
- // we process the SDT around the placeholder. What seems to
- // happen is we lose the text-range when we pop the SDT position.
- // Here, we reset the text-range when we fail to create the
- // cursor from the top SDT position.
- if (m_aTextAppendStack.empty())
- {
- return;
- }
-
- uno::Reference<text::XTextAppend> xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if (!xTextAppend.is())
- {
- return;
- }
-
- uno::Reference<text::XText> xText2 = xTextAppend->getText();
- if (!xText2.is())
- {
- return;
- }
-
- // Reset to the start.
- xCursor = xText2->createTextCursorByRange(xTextAppend->getStart());
- }
-
- if (!xCursor)
- {
- SAL_WARN("writerfilter.dmapper", "DomainMapper_Impl::PopSdt: no start position");
- return;
- }
-
- if (aPosition.m_bIsStartOfText)
- {
- // Go to the start of the end's paragraph. This helps in case
- // DomainMapper_Impl::AddDummyParaForTableInSection() would make our range multi-paragraph,
- // while the intention is to keep start/end inside the same paragraph for run SDTs.
- uno::Reference<text::XParagraphCursor> xParagraphCursor(xCursor, uno::UNO_QUERY);
- if (xParagraphCursor.is()
- && m_pSdtHelper->GetSdtType() == NS_ooxml::LN_CT_SdtRun_sdtContent)
- {
- xCursor->gotoRange(xEnd, /*bExpand=*/false);
- xParagraphCursor->gotoStartOfParagraph(/*bExpand=*/false);
- }
- }
- else
- {
- // Undo the goLeft() in DomainMapper_Impl::PushSdt();
- xCursor->goRight(1, /*bExpand=*/false);
- }
- xCursor->gotoRange(xEnd, /*bExpand=*/true);
-
- std::optional<OUString> oData = m_pSdtHelper->getValueFromDataBinding();
- if (oData.has_value())
- {
- // Data binding has a value for us, prefer that over the in-document value.
- xCursor->setString(*oData);
-
- // Such value is always a plain text string, remove the char style of the placeholder.
- uno::Reference<beans::XPropertyState> xPropertyState(xCursor, uno::UNO_QUERY);
- if (xPropertyState.is())
- {
- xPropertyState->setPropertyToDefault("CharStyleName");
- }
- }
-
- uno::Reference<text::XTextContent> xContentControl(
- m_xTextFactory->createInstance("com.sun.star.text.ContentControl"), uno::UNO_QUERY);
- uno::Reference<beans::XPropertySet> xContentControlProps(xContentControl, uno::UNO_QUERY);
- if (m_pSdtHelper->GetShowingPlcHdr())
- {
- xContentControlProps->setPropertyValue("ShowingPlaceHolder",
- uno::Any(m_pSdtHelper->GetShowingPlcHdr()));
- }
-
- if (!m_pSdtHelper->GetPlaceholderDocPart().isEmpty())
- {
- xContentControlProps->setPropertyValue("PlaceholderDocPart",
- uno::Any(m_pSdtHelper->GetPlaceholderDocPart()));
- }
-
- if (!m_pSdtHelper->GetDataBindingPrefixMapping().isEmpty())
- {
- xContentControlProps->setPropertyValue("DataBindingPrefixMappings",
- uno::Any(m_pSdtHelper->GetDataBindingPrefixMapping()));
- }
- if (!m_pSdtHelper->GetDataBindingXPath().isEmpty())
- {
- xContentControlProps->setPropertyValue("DataBindingXpath",
- uno::Any(m_pSdtHelper->GetDataBindingXPath()));
- }
- if (!m_pSdtHelper->GetDataBindingStoreItemID().isEmpty())
- {
- xContentControlProps->setPropertyValue("DataBindingStoreItemID",
- uno::Any(m_pSdtHelper->GetDataBindingStoreItemID()));
- }
-
- if (!m_pSdtHelper->GetColor().isEmpty())
- {
- xContentControlProps->setPropertyValue("Color",
- uno::Any(m_pSdtHelper->GetColor()));
- }
-
- if (!m_pSdtHelper->GetAppearance().isEmpty())
- {
- xContentControlProps->setPropertyValue("Appearance",
- uno::Any(m_pSdtHelper->GetAppearance()));
- }
-
- if (!m_pSdtHelper->GetAlias().isEmpty())
- {
- xContentControlProps->setPropertyValue("Alias",
- uno::Any(m_pSdtHelper->GetAlias()));
- }
-
- if (!m_pSdtHelper->GetTag().isEmpty())
- {
- xContentControlProps->setPropertyValue("Tag",
- uno::Any(m_pSdtHelper->GetTag()));
- }
-
- if (m_pSdtHelper->GetId())
- {
- xContentControlProps->setPropertyValue("Id", uno::Any(m_pSdtHelper->GetId()));
- }
-
- if (m_pSdtHelper->GetTabIndex())
- {
- xContentControlProps->setPropertyValue("TabIndex", uno::Any(m_pSdtHelper->GetTabIndex()));
- }
-
- if (!m_pSdtHelper->GetLock().isEmpty())
- {
- xContentControlProps->setPropertyValue("Lock", uno::Any(m_pSdtHelper->GetLock()));
- }
-
- if (m_pSdtHelper->getControlType() == SdtControlType::checkBox)
- {
- xContentControlProps->setPropertyValue("Checkbox", uno::Any(true));
-
- xContentControlProps->setPropertyValue("Checked", uno::Any(m_pSdtHelper->GetChecked()));
-
- xContentControlProps->setPropertyValue("CheckedState",
- uno::Any(m_pSdtHelper->GetCheckedState()));
-
- xContentControlProps->setPropertyValue("UncheckedState",
- uno::Any(m_pSdtHelper->GetUncheckedState()));
- }
-
- if (m_pSdtHelper->getControlType() == SdtControlType::dropDown
- || m_pSdtHelper->getControlType() == SdtControlType::comboBox)
- {
- std::vector<OUString>& rDisplayTexts = m_pSdtHelper->getDropDownDisplayTexts();
- std::vector<OUString>& rValues = m_pSdtHelper->getDropDownItems();
- if (rDisplayTexts.size() == rValues.size())
- {
- uno::Sequence<beans::PropertyValues> aItems(rValues.size());
- beans::PropertyValues* pItems = aItems.getArray();
- for (size_t i = 0; i < rValues.size(); ++i)
- {
- pItems[i] = {
- comphelper::makePropertyValue("DisplayText", rDisplayTexts[i]),
- comphelper::makePropertyValue("Value", rValues[i])
- };
- }
- xContentControlProps->setPropertyValue("ListItems", uno::Any(aItems));
- if (m_pSdtHelper->getControlType() == SdtControlType::dropDown)
- {
- xContentControlProps->setPropertyValue("DropDown", uno::Any(true));
- }
- else
- {
- xContentControlProps->setPropertyValue("ComboBox", uno::Any(true));
- }
- }
- }
-
- if (m_pSdtHelper->getControlType() == SdtControlType::picture)
- {
- xContentControlProps->setPropertyValue("Picture", uno::Any(true));
- }
-
- bool bDateFromDataBinding = false;
- if (m_pSdtHelper->getControlType() == SdtControlType::datePicker)
- {
- xContentControlProps->setPropertyValue("Date", uno::Any(true));
- OUString aDateFormat = m_pSdtHelper->getDateFormat().makeStringAndClear();
- xContentControlProps->setPropertyValue("DateFormat",
- uno::Any(aDateFormat.replaceAll("'", "\"")));
- xContentControlProps->setPropertyValue("DateLanguage",
- uno::Any(m_pSdtHelper->getLocale().makeStringAndClear()));
- OUString aCurrentDate = m_pSdtHelper->getDate().makeStringAndClear();
- if (oData.has_value())
- {
- aCurrentDate = *oData;
- bDateFromDataBinding = true;
- }
- xContentControlProps->setPropertyValue("CurrentDate",
- uno::Any(aCurrentDate));
- }
-
- if (m_pSdtHelper->getControlType() == SdtControlType::plainText)
- {
- xContentControlProps->setPropertyValue("PlainText", uno::Any(true));
- }
-
- xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true);
-
- if (bDateFromDataBinding)
- {
- OUString aDateString;
- xContentControlProps->getPropertyValue("DateString") >>= aDateString;
- xCursor->setString(aDateString);
- }
-
- m_pSdtHelper->clear();
-}
-
-void DomainMapper_Impl::PushProperties(ContextType eId)
-{
- PropertyMapPtr pInsert(eId == CONTEXT_SECTION ?
- (new SectionPropertyMap( m_bIsFirstSection )) :
- eId == CONTEXT_PARAGRAPH ? new ParagraphPropertyMap : new PropertyMap);
- if(eId == CONTEXT_SECTION)
- {
- if( m_bIsFirstSection )
- m_bIsFirstSection = false;
- // beginning with the second section group a section has to be inserted
- // into the document
- SectionPropertyMap* pSectionContext_ = dynamic_cast< SectionPropertyMap* >( pInsert.get() );
- if (!m_aTextAppendStack.empty())
- {
- uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if (xTextAppend.is() && pSectionContext_)
- pSectionContext_->SetStart( xTextAppend->getEnd() );
- }
- }
- if(eId == CONTEXT_PARAGRAPH && m_bIsSplitPara)
- {
- // Some paragraph properties only apply at the beginning of the paragraph - apply only once.
- if (!IsFirstRun())
- {
- auto pParaContext = static_cast<ParagraphPropertyMap*>(GetTopContextOfType(eId).get());
- pParaContext->props().SetListId(-1);
- pParaContext->Erase(PROP_NUMBERING_RULES); // only true with column, not page break
- pParaContext->Erase(PROP_NUMBERING_LEVEL);
- pParaContext->Erase(PROP_NUMBERING_TYPE);
- pParaContext->Erase(PROP_START_WITH);
-
- pParaContext->Insert(PROP_PARA_TOP_MARGIN, uno::Any(sal_uInt32(0)));
- pParaContext->Erase(PROP_PARA_TOP_MARGIN_BEFORE_AUTO_SPACING);
- pParaContext->Insert(PROP_PARA_FIRST_LINE_INDENT, uno::Any(sal_uInt32(0)));
- }
-
- m_aPropertyStacks[eId].push( GetTopContextOfType(eId));
- m_bIsSplitPara = false;
- }
- else
- {
- m_aPropertyStacks[eId].push( pInsert );
- }
- m_aContextStack.push(eId);
-
- m_pTopContext = m_aPropertyStacks[eId].top();
-}
-
-
-void DomainMapper_Impl::PushStyleProperties( const PropertyMapPtr& pStyleProperties )
-{
- m_aPropertyStacks[CONTEXT_STYLESHEET].push( pStyleProperties );
- m_aContextStack.push(CONTEXT_STYLESHEET);
-
- m_pTopContext = m_aPropertyStacks[CONTEXT_STYLESHEET].top();
-}
-
-
-void DomainMapper_Impl::PushListProperties(const PropertyMapPtr& pListProperties)
-{
- m_aPropertyStacks[CONTEXT_LIST].push( pListProperties );
- m_aContextStack.push(CONTEXT_LIST);
- m_pTopContext = m_aPropertyStacks[CONTEXT_LIST].top();
-}
-
-
-void DomainMapper_Impl::PopProperties(ContextType eId)
-{
- OSL_ENSURE(!m_aPropertyStacks[eId].empty(), "section stack already empty");
- if ( m_aPropertyStacks[eId].empty() )
- return;
-
- if ( eId == CONTEXT_SECTION )
- {
- if (m_aPropertyStacks[eId].size() == 1) // tdf#112202 only top level !!!
- {
- m_pLastSectionContext = dynamic_cast< SectionPropertyMap* >( m_aPropertyStacks[eId].top().get() );
- assert(m_pLastSectionContext);
- }
- }
- else if (eId == CONTEXT_CHARACTER)
- {
- m_pLastCharacterContext = m_aPropertyStacks[eId].top();
- // Sadly an assert about deferredCharacterProperties being empty is not possible
- // here, because appendTextPortion() may not be called for every character section.
- m_StreamStateStack.top().deferredCharacterProperties.clear();
- }
-
- if (!IsInFootOrEndnote() && IsInCustomFootnote() && !m_aPropertyStacks[eId].empty())
- {
- PropertyMapPtr pRet = m_aPropertyStacks[eId].top();
- if (pRet->GetFootnote().is() && m_pFootnoteContext.is())
- EndCustomFootnote();
- }
-
- m_aPropertyStacks[eId].pop();
- m_aContextStack.pop();
- if(!m_aContextStack.empty() && !m_aPropertyStacks[m_aContextStack.top()].empty())
-
- m_pTopContext = m_aPropertyStacks[m_aContextStack.top()].top();
- else
- {
- // OSL_ENSURE(eId == CONTEXT_SECTION, "this should happen at a section context end");
- m_pTopContext.clear();
- }
-}
-
-
-PropertyMapPtr DomainMapper_Impl::GetTopContextOfType(ContextType eId)
-{
- PropertyMapPtr pRet;
- if(!m_aPropertyStacks[eId].empty())
- pRet = m_aPropertyStacks[eId].top();
- return pRet;
-}
-
-bool DomainMapper_Impl::HasTopText() const
-{
- return !m_aTextAppendStack.empty();
-}
-
-uno::Reference< text::XTextAppend > const & DomainMapper_Impl::GetTopTextAppend()
-{
- OSL_ENSURE(!m_aTextAppendStack.empty(), "text append stack is empty" );
- return m_aTextAppendStack.top().xTextAppend;
-}
-
-FieldContextPtr const & DomainMapper_Impl::GetTopFieldContext()
-{
- SAL_WARN_IF(m_aFieldStack.empty(), "writerfilter.dmapper", "Field stack is empty");
- return m_aFieldStack.back();
-}
-
-bool DomainMapper_Impl::HasTopAnchoredObjects() const
-{
- return !m_aTextAppendStack.empty() && !m_aTextAppendStack.top().m_aAnchoredObjects.empty();
-}
-
-void DomainMapper_Impl::InitTabStopFromStyle( const uno::Sequence< style::TabStop >& rInitTabStops )
-{
- OSL_ENSURE(m_aCurrentTabStops.empty(), "tab stops already initialized");
- for( const auto& rTabStop : rInitTabStops)
- {
- m_aCurrentTabStops.emplace_back(rTabStop);
- }
-}
-
-void DomainMapper_Impl::IncorporateTabStop( const DeletableTabStop & rTabStop )
-{
- sal_Int32 nConverted = rTabStop.Position;
- auto aIt = std::find_if(m_aCurrentTabStops.begin(), m_aCurrentTabStops.end(),
- [&nConverted](const DeletableTabStop& rCurrentTabStop) { return rCurrentTabStop.Position == nConverted; });
- if( aIt != m_aCurrentTabStops.end() )
- {
- if( rTabStop.bDeleted )
- m_aCurrentTabStops.erase( aIt );
- else
- *aIt = rTabStop;
- }
- else
- m_aCurrentTabStops.push_back( rTabStop );
-}
-
-
-uno::Sequence< style::TabStop > DomainMapper_Impl::GetCurrentTabStopAndClear()
-{
- std::vector<style::TabStop> aRet;
- for (const DeletableTabStop& rStop : m_aCurrentTabStops)
- {
- if (!rStop.bDeleted)
- aRet.push_back(rStop);
- }
- m_aCurrentTabStops.clear();
- return comphelper::containerToSequence(aRet);
-}
-
-OUString DomainMapper_Impl::GetCurrentParaStyleName()
-{
- OUString sName;
- // use saved currParaStyleName as a fallback, in case no particular para style name applied.
- // tdf#134784 except in the case of first paragraph of shapes to avoid bad fallback.
- // TODO fix this "highly inaccurate" m_sCurrentParaStyleName
- if ( !IsInShape() )
- sName = m_StreamStateStack.top().sCurrentParaStyleName;
-
- PropertyMapPtr pParaContext = GetTopContextOfType(CONTEXT_PARAGRAPH);
- if ( pParaContext && pParaContext->isSet(PROP_PARA_STYLE_NAME) )
- pParaContext->getProperty(PROP_PARA_STYLE_NAME)->second >>= sName;
-
- // In rare situations the name might still be blank, so use the default style,
- // despite documentation that states, "If this attribute is not specified for any style,
- // then no properties shall be applied to objects of the specified type."
- // Word, however, assigns "Normal" style even in these situations.
- if ( !m_bInStyleSheetImport && sName.isEmpty() )
- sName = GetDefaultParaStyleName();
-
- return sName;
-}
-
-OUString DomainMapper_Impl::GetDefaultParaStyleName()
-{
- // After import the default style won't change and is frequently requested: cache the LO style name.
- // TODO assert !InStyleSheetImport? This function really only makes sense once import is finished anyway.
- if ( m_sDefaultParaStyleName.isEmpty() )
- {
- const StyleSheetEntryPtr pEntry = GetStyleSheetTable()->FindDefaultParaStyle();
- if ( pEntry && !pEntry->m_sConvertedStyleName.isEmpty() )
- {
- if ( !m_bInStyleSheetImport )
- m_sDefaultParaStyleName = pEntry->m_sConvertedStyleName;
- return pEntry->m_sConvertedStyleName;
- }
- else
- return "Standard";
- }
- return m_sDefaultParaStyleName;
-}
-
-uno::Any DomainMapper_Impl::GetPropertyFromStyleSheet(PropertyIds eId, StyleSheetEntryPtr pEntry, const bool bDocDefaults, const bool bPara, bool* pIsDocDefault)
-{
- while(pEntry)
- {
- if(pEntry->m_pProperties)
- {
- std::optional<PropertyMap::Property> aProperty =
- pEntry->m_pProperties->getProperty(eId);
- if( aProperty )
- {
- if (pIsDocDefault)
- *pIsDocDefault = pEntry->m_pProperties->isDocDefault(eId);
-
- return aProperty->second;
- }
- }
- //search until the property is set or no parent is available
- StyleSheetEntryPtr pNewEntry;
- if ( !pEntry->m_sBaseStyleIdentifier.isEmpty() )
- pNewEntry = GetStyleSheetTable()->FindStyleSheetByISTD(pEntry->m_sBaseStyleIdentifier);
-
- SAL_WARN_IF( pEntry == pNewEntry, "writerfilter.dmapper", "circular loop in style hierarchy?");
-
- if (pEntry == pNewEntry) //fdo#49587
- break;
-
- pEntry = pNewEntry;
- }
- // not found in style, try the document's DocDefault properties
- if ( bDocDefaults && bPara )
- {
- const PropertyMapPtr& pDefaultParaProps = GetStyleSheetTable()->GetDefaultParaProps();
- if ( pDefaultParaProps )
- {
- std::optional<PropertyMap::Property> aProperty = pDefaultParaProps->getProperty(eId);
- if ( aProperty )
- {
- if (pIsDocDefault)
- *pIsDocDefault = true;
-
- return aProperty->second;
- }
- }
- }
- if ( bDocDefaults && isCharacterProperty(eId) )
- {
- const PropertyMapPtr& pDefaultCharProps = GetStyleSheetTable()->GetDefaultCharProps();
- if ( pDefaultCharProps )
- {
- std::optional<PropertyMap::Property> aProperty = pDefaultCharProps->getProperty(eId);
- if ( aProperty )
- {
- if (pIsDocDefault)
- *pIsDocDefault = true;
-
- return aProperty->second;
- }
- }
- }
-
- if (pIsDocDefault)
- *pIsDocDefault = false;
-
- return uno::Any();
-}
-
-uno::Any DomainMapper_Impl::GetPropertyFromParaStyleSheet(PropertyIds eId)
-{
- StyleSheetEntryPtr pEntry;
- if ( m_bInStyleSheetImport )
- pEntry = GetStyleSheetTable()->GetCurrentEntry();
- else
- pEntry = GetStyleSheetTable()->FindStyleSheetByConvertedStyleName(GetCurrentParaStyleName());
- return GetPropertyFromStyleSheet(eId, pEntry, /*bDocDefaults=*/true, /*bPara=*/true);
-}
-
-uno::Any DomainMapper_Impl::GetPropertyFromCharStyleSheet(PropertyIds eId, const PropertyMapPtr& rContext)
-{
- if ( m_bInStyleSheetImport || eId == PROP_CHAR_STYLE_NAME || !isCharacterProperty(eId) )
- return uno::Any();
-
- StyleSheetEntryPtr pEntry;
- OUString sCharStyleName;
- if ( GetAnyProperty(PROP_CHAR_STYLE_NAME, rContext) >>= sCharStyleName )
- pEntry = GetStyleSheetTable()->FindStyleSheetByConvertedStyleName(sCharStyleName);
- return GetPropertyFromStyleSheet(eId, pEntry, /*bDocDefaults=*/false, /*bPara=*/false);
-}
-
-uno::Any DomainMapper_Impl::GetAnyProperty(PropertyIds eId, const PropertyMapPtr& rContext)
-{
- // first look in directly applied attributes
- if ( rContext )
- {
- std::optional<PropertyMap::Property> aProperty = rContext->getProperty(eId);
- if ( aProperty )
- return aProperty->second;
- }
-
- // then look whether it was directly applied as a paragraph property
- PropertyMapPtr pParaContext = GetTopContextOfType(CONTEXT_PARAGRAPH);
- if (pParaContext && rContext != pParaContext)
- {
- std::optional<PropertyMap::Property> aProperty = pParaContext->getProperty(eId);
- if (aProperty)
- return aProperty->second;
- }
-
- // then look whether it was inherited from a directly applied character style
- if ( eId != PROP_CHAR_STYLE_NAME && isCharacterProperty(eId) )
- {
- uno::Any aRet = GetPropertyFromCharStyleSheet(eId, rContext);
- if ( aRet.hasValue() )
- return aRet;
- }
-
- // then look in current paragraph style, and docDefaults
- return GetPropertyFromParaStyleSheet(eId);
-}
-
-OUString DomainMapper_Impl::GetListStyleName(sal_Int32 nListId)
-{
- auto const pList(GetListTable()->GetList( nListId ));
- return pList ? pList->GetStyleName() : OUString();
-}
-
-ListsManager::Pointer const & DomainMapper_Impl::GetListTable()
-{
- if(!m_pListTable)
- m_pListTable =
- new ListsManager( m_rDMapper, m_xTextFactory );
- return m_pListTable;
-}
-
-
-void DomainMapper_Impl::deferBreak( BreakType deferredBreakType)
-{
- assert(!m_StreamStateStack.empty());
- switch (deferredBreakType)
- {
- case LINE_BREAK:
- m_StreamStateStack.top().nLineBreaksDeferred++;
- break;
- case COLUMN_BREAK:
- m_StreamStateStack.top().bIsColumnBreakDeferred = true;
- break;
- case PAGE_BREAK:
- // See SwWW8ImplReader::HandlePageBreakChar(), page break should be
- // ignored inside tables.
- if (0 < m_StreamStateStack.top().nTableDepth)
- return;
-
- m_StreamStateStack.top().bIsPageBreakDeferred = true;
- break;
- default:
- return;
- }
-}
-
-bool DomainMapper_Impl::isBreakDeferred( BreakType deferredBreakType )
-{
- assert(!m_StreamStateStack.empty());
- switch (deferredBreakType)
- {
- case LINE_BREAK:
- return 0 < m_StreamStateStack.top().nLineBreaksDeferred;
- case COLUMN_BREAK:
- return m_StreamStateStack.top().bIsColumnBreakDeferred;
- case PAGE_BREAK:
- return m_StreamStateStack.top().bIsPageBreakDeferred;
- default:
- return false;
- }
-}
-
-void DomainMapper_Impl::clearDeferredBreak(BreakType deferredBreakType)
-{
- assert(!m_StreamStateStack.empty());
- switch (deferredBreakType)
- {
- case LINE_BREAK:
- assert(0 < m_StreamStateStack.top().nLineBreaksDeferred);
- m_StreamStateStack.top().nLineBreaksDeferred--;
- break;
- case COLUMN_BREAK:
- m_StreamStateStack.top().bIsColumnBreakDeferred = false;
- break;
- case PAGE_BREAK:
- m_StreamStateStack.top().bIsPageBreakDeferred = false;
- break;
- default:
- break;
- }
-}
-
-void DomainMapper_Impl::clearDeferredBreaks()
-{
- assert(!m_StreamStateStack.empty());
- m_StreamStateStack.top().nLineBreaksDeferred = 0;
- m_StreamStateStack.top().bIsColumnBreakDeferred = false;
- m_StreamStateStack.top().bIsPageBreakDeferred = false;
-}
-
-void DomainMapper_Impl::setSdtEndDeferred(bool bSdtEndDeferred)
-{
- m_StreamStateStack.top().bSdtEndDeferred = bSdtEndDeferred;
-}
-
-bool DomainMapper_Impl::isSdtEndDeferred() const
-{
- return m_StreamStateStack.top().bSdtEndDeferred;
-}
-
-void DomainMapper_Impl::setParaSdtEndDeferred(bool bParaSdtEndDeferred)
-{
- m_StreamStateStack.top().bParaSdtEndDeferred = bParaSdtEndDeferred;
-}
-
-bool DomainMapper_Impl::isParaSdtEndDeferred() const
-{
- return m_StreamStateStack.top().bParaSdtEndDeferred;
-}
-
-static void lcl_MoveBorderPropertiesToFrame(std::vector<beans::PropertyValue>& rFrameProperties,
- uno::Reference<text::XTextRange> const& xStartTextRange,
- uno::Reference<text::XTextRange> const& xEndTextRange,
- bool bIsRTFImport)
-{
- try
- {
- if (!xStartTextRange.is()) //rhbz#1077780
- return;
- uno::Reference<text::XTextCursor> xRangeCursor = xStartTextRange->getText()->createTextCursorByRange( xStartTextRange );
- xRangeCursor->gotoRange( xEndTextRange, true );
-
- uno::Reference<beans::XPropertySet> xTextRangeProperties(xRangeCursor, uno::UNO_QUERY);
- if(!xTextRangeProperties.is())
- return ;
-
- static PropertyIds const aBorderProperties[] =
- {
- PROP_LEFT_BORDER,
- PROP_RIGHT_BORDER,
- PROP_TOP_BORDER,
- PROP_BOTTOM_BORDER,
- PROP_LEFT_BORDER_DISTANCE,
- PROP_RIGHT_BORDER_DISTANCE,
- PROP_TOP_BORDER_DISTANCE,
- PROP_BOTTOM_BORDER_DISTANCE
- };
-
- // The frame width specified does not include border spacing,
- // so the frame needs to be increased by the left/right para border spacing amount
- sal_Int32 nWidth = 0;
- sal_Int32 nIndexOfWidthProperty = -1;
- sal_Int16 nType = text::SizeType::FIX;
- for (size_t i = 0; nType == text::SizeType::FIX && i < rFrameProperties.size(); ++i)
- {
- if (rFrameProperties[i].Name == "WidthType")
- rFrameProperties[i].Value >>= nType;
- else if (rFrameProperties[i].Name == "Width")
- nIndexOfWidthProperty = i;
- }
- if (nIndexOfWidthProperty > -1 && nType == text::SizeType::FIX)
- rFrameProperties[nIndexOfWidthProperty].Value >>= nWidth;
-
- for( size_t nProperty = 0; nProperty < SAL_N_ELEMENTS( aBorderProperties ); ++nProperty)
- {
- const OUString & sPropertyName = getPropertyName(aBorderProperties[nProperty]);
- beans::PropertyValue aValue;
- aValue.Name = sPropertyName;
- aValue.Value = xTextRangeProperties->getPropertyValue(sPropertyName);
- if( nProperty < 4 )
- {
- xTextRangeProperties->setPropertyValue( sPropertyName, uno::Any(table::BorderLine2()));
- if (!aValue.Value.hasValue())
- aValue.Value <<= table::BorderLine2();
- }
- else // border spacing
- {
- sal_Int32 nDistance = 0;
- aValue.Value >>= nDistance;
-
- // left4/right5 need to be duplicated because of INVERT_BORDER_SPACING (DOCX only)
- // Do not duplicate the top6/bottom7 border spacing.
- if (nProperty > 5 || bIsRTFImport)
- aValue.Value <<= sal_Int32(0);
-
- // frames need to be increased by the left/right para border spacing amount
- // This is needed for RTF as well, but that requires other export/import fixes.
- if (!bIsRTFImport && nProperty < 6 && nWidth && nDistance)
- {
- nWidth += nDistance;
- rFrameProperties[nIndexOfWidthProperty].Value <<= nWidth;
- }
- }
- if (aValue.Value.hasValue())
- rFrameProperties.push_back(aValue);
- }
- }
- catch( const uno::Exception& )
- {
- }
-}
-
-
-static void lcl_AddRange(
- ParagraphPropertiesPtr const & pToBeSavedProperties,
- uno::Reference< text::XTextAppend > const& xTextAppend,
- TextAppendContext const & rAppendContext)
-{
- uno::Reference<text::XParagraphCursor> xParaCursor(
- xTextAppend->createTextCursorByRange( rAppendContext.xInsertPosition.is() ? rAppendContext.xInsertPosition : xTextAppend->getEnd()), uno::UNO_QUERY_THROW );
- pToBeSavedProperties->SetEndingRange(xParaCursor->getStart());
- xParaCursor->gotoStartOfParagraph( false );
-
- pToBeSavedProperties->SetStartingRange(xParaCursor->getStart());
-}
-
-
-//define some default frame width - 0cm ATM: this allow the frame to be wrapped around the text
-constexpr sal_Int32 DEFAULT_FRAME_MIN_WIDTH = 0;
-constexpr sal_Int32 DEFAULT_FRAME_MIN_HEIGHT = 0;
-constexpr sal_Int32 DEFAULT_VALUE = 0;
-
-std::vector<css::beans::PropertyValue>
-DomainMapper_Impl::MakeFrameProperties(const ParagraphProperties& rProps)
-{
- std::vector<beans::PropertyValue> aFrameProperties;
-
- try
- {
- // A paragraph's properties come from direct formatting or somewhere in the style hierarchy
- std::vector<const ParagraphProperties*> vProps;
- vProps.emplace_back(&rProps);
- sal_Int8 nSafetyLimit = 16;
- StyleSheetEntryPtr pStyle
- = GetStyleSheetTable()->FindStyleSheetByConvertedStyleName(rProps.GetParaStyleName());
- while (nSafetyLimit-- && pStyle && pStyle->m_pProperties)
- {
- vProps.emplace_back(&pStyle->m_pProperties->props());
- assert(pStyle->m_sBaseStyleIdentifier != pStyle->m_sStyleName);
- if (pStyle->m_sBaseStyleIdentifier.isEmpty())
- break;
- pStyle = GetStyleSheetTable()->FindStyleSheetByISTD(pStyle->m_sBaseStyleIdentifier);
- }
- SAL_WARN_IF(!nSafetyLimit, "writerfilter.dmapper", "Inheritance loop likely: early exit");
-
-
- sal_Int32 nWidth = -1;
- for (const auto pProp : vProps)
- {
- if (pProp->Getw() < 0)
- continue;
- nWidth = pProp->Getw();
- break;
- }
- bool bAutoWidth = nWidth < 1;
- if (bAutoWidth)
- nWidth = DEFAULT_FRAME_MIN_WIDTH;
- aFrameProperties.push_back(
- comphelper::makePropertyValue(getPropertyName(PROP_WIDTH), nWidth));
- aFrameProperties.push_back(
- comphelper::makePropertyValue(getPropertyName(PROP_WIDTH_TYPE),
- bAutoWidth ? text::SizeType::MIN : text::SizeType::FIX));
-
- bool bValidH = false;
- sal_Int32 nHeight = DEFAULT_FRAME_MIN_HEIGHT;
- for (const auto pProp : vProps)
- {
- if (pProp->Geth() < 0)
- continue;
- nHeight = pProp->Geth();
- bValidH = true;
- break;
- }
- aFrameProperties.push_back(
- comphelper::makePropertyValue(getPropertyName(PROP_HEIGHT), nHeight));
-
- sal_Int16 nhRule = -1;
- for (const auto pProp : vProps)
- {
- if (pProp->GethRule() < 0)
- continue;
- nhRule = pProp->GethRule();
- break;
- }
- if (nhRule < 0)
- {
- if (bValidH && nHeight)
- {
- // [MS-OE376] Word uses a default value of "atLeast" for
- // this attribute when the value of the h attribute is not 0.
- nhRule = text::SizeType::MIN;
- }
- else
- {
- nhRule = text::SizeType::VARIABLE;
- }
- }
- aFrameProperties.push_back(
- comphelper::makePropertyValue(getPropertyName(PROP_SIZE_TYPE), nhRule));
-
- bool bValidX = false;
- sal_Int32 nX = DEFAULT_VALUE;
- for (const auto pProp : vProps)
- {
- bValidX = pProp->IsxValid();
- if (!bValidX)
- continue;
- nX = pProp->Getx();
- break;
- }
- aFrameProperties.push_back(
- comphelper::makePropertyValue(getPropertyName(PROP_HORI_ORIENT_POSITION), nX));
-
- sal_Int16 nHoriOrient = text::HoriOrientation::NONE;
- for (const auto pProp : vProps)
- {
- if (pProp->GetxAlign() < 0)
- continue;
- nHoriOrient = pProp->GetxAlign();
- break;
- }
- aFrameProperties.push_back(
- comphelper::makePropertyValue(getPropertyName(PROP_HORI_ORIENT), nHoriOrient));
-
- //Default the anchor in case FramePr_hAnchor is missing ECMA 17.3.1.11
- sal_Int16 nHAnchor = text::RelOrientation::FRAME; // 'text'
- for (const auto pProp : vProps)
- {
- if (pProp->GethAnchor() < 0)
- continue;
- nHAnchor = pProp->GethAnchor();
- break;
- }
- aFrameProperties.push_back(
- comphelper::makePropertyValue(getPropertyName(PROP_HORI_ORIENT_RELATION), nHAnchor));
-
- bool bValidY = false;
- sal_Int32 nY = DEFAULT_VALUE;
- for (const auto pProp : vProps)
- {
- bValidY = pProp->IsyValid();
- if (!bValidY)
- continue;
- nY = pProp->Gety();
- break;
- }
- aFrameProperties.push_back(
- comphelper::makePropertyValue(getPropertyName(PROP_VERT_ORIENT_POSITION), nY));
-
- sal_Int16 nVertOrient = text::VertOrientation::NONE;
- // Testing indicates that yAlign should be ignored if there is any specified w:y
- if (!bValidY)
- {
- for (const auto pProp : vProps)
- {
- if (pProp->GetyAlign() < 0)
- continue;
- nVertOrient = pProp->GetyAlign();
- break;
- }
- }
-
- // Default the anchor in case FramePr_vAnchor is missing.
- // ECMA 17.3.1.11 says "page",
- // but errata documentation MS-OE376 2.1.48 Section 2.3.1.11 says "text"
- // while actual testing usually indicates "margin" tdf#157572 tdf#112287
- sal_Int16 nVAnchor = text::RelOrientation::PAGE_PRINT_AREA; // 'margin'
- if (!nY && (bValidY || nVertOrient == text::VertOrientation::NONE))
- {
- // special cases? "auto" position defaults to "paragraph" based on testing when w:y=0
- nVAnchor = text::RelOrientation::FRAME; // 'text'
- }
- for (const auto pProp : vProps)
- {
- if (pProp->GetvAnchor() < 0)
- continue;
- nVAnchor = pProp->GetvAnchor();
- // vAlign is ignored if vAnchor is set to 'text'
- if (nVAnchor == text::RelOrientation::FRAME)
- nVertOrient = text::VertOrientation::NONE;
- break;
- }
- aFrameProperties.push_back(
- comphelper::makePropertyValue(getPropertyName(PROP_VERT_ORIENT_RELATION), nVAnchor));
- aFrameProperties.push_back(
- comphelper::makePropertyValue(getPropertyName(PROP_VERT_ORIENT), nVertOrient));
-
- text::WrapTextMode nWrap = text::WrapTextMode_NONE;
- for (const auto pProp : vProps)
- {
- if (pProp->GetWrap() == text::WrapTextMode::WrapTextMode_MAKE_FIXED_SIZE)
- continue;
- nWrap = pProp->GetWrap();
- break;
- }
- aFrameProperties.push_back(
- comphelper::makePropertyValue(getPropertyName(PROP_SURROUND), nWrap));
-
- sal_Int32 nRightDist = 0;
- sal_Int32 nLeftDist = 0;
- for (const auto pProp : vProps)
- {
- if (pProp->GethSpace() < 0)
- continue;
- nLeftDist = nRightDist = pProp->GethSpace();
- break;
- }
- aFrameProperties.push_back(comphelper::makePropertyValue(
- getPropertyName(PROP_LEFT_MARGIN),
- nHoriOrient == text::HoriOrientation::LEFT ? 0 : nLeftDist));
- aFrameProperties.push_back(comphelper::makePropertyValue(
- getPropertyName(PROP_RIGHT_MARGIN),
- nHoriOrient == text::HoriOrientation::RIGHT ? 0 : nRightDist));
-
- sal_Int32 nBottomDist = 0;
- sal_Int32 nTopDist = 0;
- for (const auto pProp : vProps)
- {
- if (pProp->GetvSpace() < 0)
- continue;
- nTopDist = nBottomDist = pProp->GetvSpace();
- break;
- }
- aFrameProperties.push_back(comphelper::makePropertyValue(
- getPropertyName(PROP_TOP_MARGIN),
- nVertOrient == text::VertOrientation::TOP ? 0 : nTopDist));
- aFrameProperties.push_back(comphelper::makePropertyValue(
- getPropertyName(PROP_BOTTOM_MARGIN),
- nVertOrient == text::VertOrientation::BOTTOM ? 0 : nBottomDist));
- }
- catch (const uno::Exception&)
- {
- }
-
- return aFrameProperties;
-}
-
-void DomainMapper_Impl::CheckUnregisteredFrameConversion(bool bPreventOverlap)
-{
- if (m_aTextAppendStack.empty())
- return;
- TextAppendContext& rAppendContext = m_aTextAppendStack.top();
- // n#779642: ignore fly frame inside table as it could lead to messy situations
- if (!rAppendContext.pLastParagraphProperties)
- return;
- if (!rAppendContext.pLastParagraphProperties->IsFrameMode())
- return;
- if (!hasTableManager())
- return;
- if (getTableManager().isInTable())
- return;
-
- std::vector<beans::PropertyValue> aFrameProperties
- = MakeFrameProperties(*rAppendContext.pLastParagraphProperties);
-
- if (const std::optional<sal_Int16> nDirection = PopFrameDirection())
- {
- aFrameProperties.push_back(
- comphelper::makePropertyValue(getPropertyName(PROP_FRM_DIRECTION), *nDirection));
- }
-
- if (bPreventOverlap)
- aFrameProperties.push_back(comphelper::makePropertyValue("AllowOverlap", uno::Any(false)));
-
- // If there is no fill, the Word default is 100% transparency.
- // Otherwise CellColorHandler has priority, and this setting
- // will be ignored.
- aFrameProperties.push_back(comphelper::makePropertyValue(
- getPropertyName(PROP_BACK_COLOR_TRANSPARENCY), sal_Int32(100)));
-
- uno::Sequence<beans::PropertyValue> aGrabBag(comphelper::InitPropertySequence(
- { { "ParaFrameProperties", uno::Any(true) } }));
- aFrameProperties.push_back(comphelper::makePropertyValue("FrameInteropGrabBag", aGrabBag));
-
- lcl_MoveBorderPropertiesToFrame(aFrameProperties,
- rAppendContext.pLastParagraphProperties->GetStartingRange(),
- rAppendContext.pLastParagraphProperties->GetEndingRange(),
- IsRTFImport());
-
- //frame conversion has to be executed after table conversion, not now
- RegisterFrameConversion(rAppendContext.pLastParagraphProperties->GetStartingRange(),
- rAppendContext.pLastParagraphProperties->GetEndingRange(),
- std::move(aFrameProperties));
-}
-
-/// Check if the style or its parent has a list id, recursively.
-static sal_Int32 lcl_getListId(const StyleSheetEntryPtr& rEntry, const StyleSheetTablePtr& rStyleTable, bool & rNumberingFromBaseStyle)
-{
- const StyleSheetPropertyMap* pEntryProperties = rEntry->m_pProperties.get();
- if (!pEntryProperties)
- return -1;
-
- sal_Int32 nListId = pEntryProperties->props().GetListId();
- // The style itself has a list id.
- if (nListId >= 0)
- return nListId;
-
- // The style has no parent.
- if (rEntry->m_sBaseStyleIdentifier.isEmpty())
- return -1;
-
- const StyleSheetEntryPtr pParent = rStyleTable->FindStyleSheetByISTD(rEntry->m_sBaseStyleIdentifier);
- // No such parent style or loop in the style hierarchy.
- if (!pParent || pParent == rEntry)
- return -1;
-
- rNumberingFromBaseStyle = true;
-
- return lcl_getListId(pParent, rStyleTable, rNumberingFromBaseStyle);
-}
-
-/// Return the paragraph's list level (from styles, unless pParacontext is provided).
-/// -1 indicates the level is not set anywhere. [In that case, with a numId, use 0 (level 1)]
-/// 9 indicates that numbering should be at body level (aka disabled) - rarely used by MSWord.
-/// 0-8 are the nine valid numbering levels.
-sal_Int16 DomainMapper_Impl::GetListLevel(const StyleSheetEntryPtr& pEntry,
- const PropertyMapPtr& pParaContext)
-{
- sal_Int16 nListLevel = -1;
- if (pParaContext)
- {
- // Deliberately ignore inherited PROP_NUMBERING_LEVEL. Only trust StyleSheetEntry for that.
- std::optional<PropertyMap::Property> aLvl = pParaContext->getProperty(PROP_NUMBERING_LEVEL);
- if (aLvl)
- aLvl->second >>= nListLevel;
-
- if (nListLevel != -1)
- return nListLevel;
- }
-
- if (!pEntry)
- return -1;
-
- const StyleSheetPropertyMap* pEntryProperties = pEntry->m_pProperties.get();
- if (!pEntryProperties)
- return -1;
-
- nListLevel = pEntryProperties->GetListLevel();
- // The style itself has a list level.
- if (nListLevel >= 0)
- return nListLevel;
-
- // The style has no parent.
- if (pEntry->m_sBaseStyleIdentifier.isEmpty())
- return -1;
-
- const StyleSheetEntryPtr pParent = GetStyleSheetTable()->FindStyleSheetByISTD(pEntry->m_sBaseStyleIdentifier);
- // No such parent style or loop in the style hierarchy.
- if (!pParent || pParent == pEntry)
- return -1;
-
- return GetListLevel(pParent);
-}
-
-void DomainMapper_Impl::ValidateListLevel(const OUString& sStyleIdentifierD)
-{
- StyleSheetEntryPtr pMyStyle = GetStyleSheetTable()->FindStyleSheetByISTD(sStyleIdentifierD);
- if (!pMyStyle)
- return;
-
- sal_Int8 nListLevel = GetListLevel(pMyStyle);
- if (nListLevel < 0 || nListLevel >= WW_OUTLINE_MAX)
- return;
-
- bool bDummy = false;
- sal_Int16 nListId = lcl_getListId(pMyStyle, GetStyleSheetTable(), bDummy);
- if (nListId < 1)
- return;
-
- auto const pList(GetListTable()->GetList(nListId));
- if (!pList)
- return;
-
- auto pLevel = pList->GetLevel(nListLevel);
- if (!pLevel && pList->GetAbstractDefinition())
- pLevel = pList->GetAbstractDefinition()->GetLevel(nListLevel);
- if (!pLevel)
- return;
-
- if (!pLevel->GetParaStyle())
- {
- // First come, first served, and it hasn't been claimed yet, so claim it now.
- pLevel->SetParaStyle(pMyStyle);
- }
- else if (pLevel->GetParaStyle() != pMyStyle)
- {
- // This level is already used by another style, so prevent numbering via this style
- // by setting to body level (9).
- pMyStyle->m_pProperties->SetListLevel(WW_OUTLINE_MAX);
- // WARNING: PROP_NUMBERING_LEVEL is now out of sync with GetListLevel()
- }
-}
-
-void DomainMapper_Impl::finishParagraph( const PropertyMapPtr& pPropertyMap, const bool bRemove, const bool bNoNumbering )
-{
- if (m_bDiscardHeaderFooter)
- return;
-
- if (!m_aFieldStack.empty())
- {
- FieldContextPtr pFieldContext = m_aFieldStack.back();
- if (pFieldContext && !pFieldContext->IsCommandCompleted())
- {
- std::vector<OUString> aCommandParts = pFieldContext->GetCommandParts();
- if (!aCommandParts.empty() && aCommandParts[0] == "IF")
- {
- // Conditional text field conditions don't support linebreaks in Writer.
- return;
- }
- }
-
- if (pFieldContext && pFieldContext->IsCommandCompleted())
- {
- if (pFieldContext->GetFieldId() == FIELD_IF)
- {
- // Conditional text fields can't contain newlines, finish the paragraph later.
- FieldParagraph aFinish{pPropertyMap, bRemove};
- pFieldContext->GetParagraphsToFinish().push_back(aFinish);
- return;
- }
- }
- }
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("finishParagraph");
-#endif
-
- ParagraphPropertyMap* pParaContext = dynamic_cast< ParagraphPropertyMap* >( pPropertyMap.get() );
- if (m_aTextAppendStack.empty())
- return;
- TextAppendContext& rAppendContext = m_aTextAppendStack.top();
- uno::Reference< text::XTextAppend > xTextAppend(rAppendContext.xTextAppend);
-#ifdef DBG_UTIL
- TagLogger::getInstance().attribute("isTextAppend", sal_uInt32(xTextAppend.is()));
-#endif
-
- const StyleSheetEntryPtr pEntry = GetStyleSheetTable()->FindStyleSheetByConvertedStyleName( GetCurrentParaStyleName() );
- SAL_WARN_IF(!pEntry, "writerfilter.dmapper", "no style sheet found");
- const StyleSheetPropertyMap* pStyleSheetProperties = pEntry ? pEntry->m_pProperties.get() : nullptr;
- sal_Int32 nListId = pParaContext ? pParaContext->props().GetListId() : -1;
- bool isNumberingViaStyle(false);
- bool isNumberingViaRule = nListId > -1;
- if ( !bRemove && pStyleSheetProperties && pParaContext )
- {
- if (!pEntry || pEntry->m_nStyleTypeCode != StyleType::STYLE_TYPE_PARA) {
- // We could not resolve paragraph style or it is not a paragraph style
- // Remove this style reference, otherwise it will cause exceptions during further
- // processing and not all paragraph styles will be initialized.
- SAL_WARN("writerfilter.dmapper", "Paragraph style is incorrect. Ignored");
- pParaContext->Erase(PROP_PARA_STYLE_NAME);
- }
-
- bool bNumberingFromBaseStyle = false;
- if (!isNumberingViaRule)
- nListId = lcl_getListId(pEntry, GetStyleSheetTable(), bNumberingFromBaseStyle);
-
- //apply numbering level/style to paragraph if it was set at the style, but only if the paragraph itself
- //does not specify the numbering
- sal_Int16 nListLevel = GetListLevel(pEntry, pParaContext);
- // Undefined listLevel with a valid numId is treated as a first level numbering.
- if (nListLevel == -1 && nListId > (IsOOXMLImport() ? 0 : -1))
- nListLevel = 0;
-
- if (!bNoNumbering && nListLevel >= 0 && nListLevel < 9)
- pParaContext->Insert( PROP_NUMBERING_LEVEL, uno::Any(nListLevel), false );
-
- auto const pList(GetListTable()->GetList(nListId));
- if (pList && !pParaContext->isSet(PROP_NUMBERING_STYLE_NAME))
- {
- // ListLevel 9 means Body Level/no numbering.
- if (bNoNumbering || nListLevel == 9)
- {
- pParaContext->Insert(PROP_NUMBERING_STYLE_NAME, uno::Any(OUString()), true);
- pParaContext->Erase(PROP_NUMBERING_LEVEL);
- }
- else if ( !isNumberingViaRule )
- {
- isNumberingViaStyle = true;
- // Since LO7.0/tdf#131321 fixed the loss of numbering in styles, this OUGHT to be obsolete,
- // but now other new/critical LO7.0 code expects it, and perhaps some corner cases still need it as well.
- pParaContext->Insert(PROP_NUMBERING_STYLE_NAME, uno::Any(pList->GetStyleName()), true);
- }
- else
- {
- // we have direct numbering, as well as paragraph-style numbering.
- // Apply the style if it uses the same list as the direct numbering,
- // otherwise the directly-applied-to-paragraph status will be lost,
- // and the priority of the numbering-style-indents will be lowered. tdf#133000
- bool bDummy;
- if (nListId == lcl_getListId(pEntry, GetStyleSheetTable(), bDummy))
- pParaContext->Insert( PROP_NUMBERING_STYLE_NAME, uno::Any(pList->GetStyleName()), true );
- }
- }
-
- if ( isNumberingViaStyle )
- {
- // When numbering is defined by the paragraph style, then the para-style indents have priority.
- // But since import has just copied para-style's PROP_NUMBERING_STYLE_NAME directly onto the paragraph,
- // the numbering indents now have the priority.
- // So now import must also copy the para-style indents directly onto the paragraph to compensate.
- std::optional<PropertyMap::Property> oProperty;
- const StyleSheetEntryPtr pParent = (!pEntry->m_sBaseStyleIdentifier.isEmpty()) ? GetStyleSheetTable()->FindStyleSheetByISTD(pEntry->m_sBaseStyleIdentifier) : nullptr;
- const StyleSheetPropertyMap* pParentProperties = pParent ? pParent->m_pProperties.get() : nullptr;
- if (!pEntry->m_sBaseStyleIdentifier.isEmpty())
- {
- oProperty = pStyleSheetProperties->getProperty(PROP_PARA_FIRST_LINE_INDENT);
- if ( oProperty
- // If the numbering comes from a base style, indent of the base style has also priority.
- || (bNumberingFromBaseStyle && pParentProperties && (oProperty = pParentProperties->getProperty(PROP_PARA_FIRST_LINE_INDENT))) )
- pParaContext->Insert(PROP_PARA_FIRST_LINE_INDENT, oProperty->second, /*bOverwrite=*/false);
- }
- oProperty = pStyleSheetProperties->getProperty(PROP_PARA_LEFT_MARGIN);
- if ( oProperty
- || (bNumberingFromBaseStyle && pParentProperties && (oProperty = pParentProperties->getProperty(PROP_PARA_LEFT_MARGIN))) )
- pParaContext->Insert(PROP_PARA_LEFT_MARGIN, oProperty->second, /*bOverwrite=*/false);
-
- // We're inheriting properties from a numbering style. Make sure a possible right margin is inherited from the base style.
- sal_Int32 nParaRightMargin;
- if ( pParentProperties && (oProperty = pParentProperties->getProperty(PROP_PARA_RIGHT_MARGIN)) && (nParaRightMargin = oProperty->second.get<sal_Int32>()) != 0 )
- {
- // If we're setting the right margin, we should set the first / left margin as well from the numbering style.
- const sal_Int32 nFirstLineIndent = getNumberingProperty(nListId, nListLevel, "FirstLineIndent");
- const sal_Int32 nParaLeftMargin = getNumberingProperty(nListId, nListLevel, "IndentAt");
- if (nFirstLineIndent != 0)
- pParaContext->Insert(PROP_PARA_FIRST_LINE_INDENT, uno::Any(nFirstLineIndent), /*bOverwrite=*/false);
- if (nParaLeftMargin != 0)
- pParaContext->Insert(PROP_PARA_LEFT_MARGIN, uno::Any(nParaLeftMargin), /*bOverwrite=*/false);
-
- // Override right margin value with value from current style, if any
- if (pStyleSheetProperties && pStyleSheetProperties->isSet(PROP_PARA_RIGHT_MARGIN))
- nParaRightMargin = pStyleSheetProperties->getProperty(PROP_PARA_RIGHT_MARGIN)->second.get<sal_Int32>();
-
- pParaContext->Insert(PROP_PARA_RIGHT_MARGIN, uno::Any(nParaRightMargin), /*bOverwrite=*/false);
- }
- }
- // Paragraph style based right paragraph indentation affects not paragraph style based lists in DOCX.
- // Apply it as direct formatting, also left and first line indentation of numbering to keep them.
- else if (isNumberingViaRule)
- {
- uno::Any aRightMargin = GetPropertyFromParaStyleSheet(PROP_PARA_RIGHT_MARGIN);
- if ( aRightMargin != uno::Any() )
- {
- pParaContext->Insert(PROP_PARA_RIGHT_MARGIN, aRightMargin, /*bOverwrite=*/false);
-
- const sal_Int32 nFirstLineIndent = getNumberingProperty(nListId, nListLevel, "FirstLineIndent");
- const sal_Int32 nParaLeftMargin = getNumberingProperty(nListId, nListLevel, "IndentAt");
- if (nFirstLineIndent != 0)
- pParaContext->Insert(PROP_PARA_FIRST_LINE_INDENT, uno::Any(nFirstLineIndent), /*bOverwrite=*/false);
- if (nParaLeftMargin != 0)
- pParaContext->Insert(PROP_PARA_LEFT_MARGIN, uno::Any(nParaLeftMargin), /*bOverwrite=*/false);
- }
- }
-
- if (nListId == 0 && !pList)
- {
- // listid = 0 and no list definition is used in DOCX to stop numbering
- // defined somewhere in parent styles
- // And here we should explicitly set left margin and first-line margin.
- // They can be taken from referred style, but not from styles with listid!
- uno::Any aProp = lcl_GetPropertyFromParaStyleSheetNoNum(PROP_PARA_FIRST_LINE_INDENT, pEntry, m_pStyleSheetTable);
- if (aProp.hasValue())
- pParaContext->Insert(PROP_PARA_FIRST_LINE_INDENT, aProp, false);
- else
- pParaContext->Insert(PROP_PARA_FIRST_LINE_INDENT, uno::Any(sal_uInt32(0)), false);
-
- aProp = lcl_GetPropertyFromParaStyleSheetNoNum(PROP_PARA_LEFT_MARGIN, pEntry, m_pStyleSheetTable);
- if (aProp.hasValue())
- pParaContext->Insert(PROP_PARA_LEFT_MARGIN, aProp, false);
- else
- pParaContext->Insert(PROP_PARA_LEFT_MARGIN, uno::Any(sal_uInt32(0)), false);
- }
- }
-
- // apply AutoSpacing: it has priority over all other margin settings
- // (note that numbering with autoSpacing is handled separately later on)
- const bool bAllowAdjustments = !GetSettingsTable()->GetDoNotUseHTMLParagraphAutoSpacing();
- sal_Int32 nBeforeAutospacing = -1;
- bool bIsAutoSet = pParaContext && pParaContext->isSet(PROP_PARA_TOP_MARGIN_BEFORE_AUTO_SPACING);
- const bool bNoTopmargin = pParaContext && !pParaContext->isSet(PROP_PARA_TOP_MARGIN);
- // apply INHERITED autospacing only if top margin is not set
- if ( bIsAutoSet || bNoTopmargin )
- {
- GetAnyProperty(PROP_PARA_TOP_MARGIN_BEFORE_AUTO_SPACING, pPropertyMap) >>= nBeforeAutospacing;
- // tdf#137655 only w:beforeAutospacing=0 was specified, but not PARA_TOP_MARGIN
- // (see default_spacing = -1 in processing of LN_CT_Spacing_beforeAutospacing)
- if ( bNoTopmargin && nBeforeAutospacing == ConversionHelper::convertTwipToMM100(-1) )
- {
- sal_Int32 nStyleAuto = -1;
- GetPropertyFromParaStyleSheet(PROP_PARA_TOP_MARGIN_BEFORE_AUTO_SPACING) >>= nStyleAuto;
- if (nStyleAuto > 0)
- nBeforeAutospacing = 0;
- }
- }
- if ( nBeforeAutospacing > -1 && pParaContext )
- {
- if (bAllowAdjustments)
- {
- if ( GetIsFirstParagraphInShape() ||
- (GetIsFirstParagraphInSection() && GetSectionContext() && GetSectionContext()->IsFirstSection()) ||
- (m_StreamStateStack.top().bFirstParagraphInCell
- && 0 < m_StreamStateStack.top().nTableDepth
- && m_StreamStateStack.top().nTableDepth == m_StreamStateStack.top().nTableCellDepth))
- {
- // export requires grabbag to match top_margin, so keep them in sync
- if (nBeforeAutospacing && bIsAutoSet)
- pParaContext->Insert( PROP_PARA_TOP_MARGIN_BEFORE_AUTO_SPACING, uno::Any( sal_Int32(0) ),true, PARA_GRAB_BAG );
- nBeforeAutospacing = 0;
- }
- }
- pParaContext->Insert(PROP_PARA_TOP_MARGIN, uno::Any(nBeforeAutospacing));
- }
-
- sal_Int32 nAfterAutospacing = -1;
- bIsAutoSet = pParaContext && pParaContext->isSet(PROP_PARA_BOTTOM_MARGIN_AFTER_AUTO_SPACING);
- const bool bNoBottomMargin = pParaContext && !pParaContext->isSet(PROP_PARA_BOTTOM_MARGIN);
- bool bAppliedBottomAutospacing = false;
- if (bIsAutoSet || bNoBottomMargin)
- {
- GetAnyProperty(PROP_PARA_BOTTOM_MARGIN_AFTER_AUTO_SPACING, pPropertyMap) >>= nAfterAutospacing;
- if (bNoBottomMargin && nAfterAutospacing == ConversionHelper::convertTwipToMM100(-1))
- {
- sal_Int32 nStyleAuto = -1;
- GetPropertyFromParaStyleSheet(PROP_PARA_BOTTOM_MARGIN_AFTER_AUTO_SPACING) >>= nStyleAuto;
- if (nStyleAuto > 0)
- nAfterAutospacing = 0;
- }
- }
- if ( nAfterAutospacing > -1 && pParaContext )
- {
- pParaContext->Insert(PROP_PARA_BOTTOM_MARGIN, uno::Any(nAfterAutospacing));
- bAppliedBottomAutospacing = bAllowAdjustments;
- }
-
- // tell TableManager to reset the bottom margin if it determines that this is the cell's last paragraph.
- if ( hasTableManager() && getTableManager().isInCell() )
- getTableManager().setCellLastParaAfterAutospacing(bAppliedBottomAutospacing);
-
- if (xTextAppend.is() && pParaContext && hasTableManager() && !getTableManager().isIgnore())
- {
- try
- {
- /*the following combinations of previous and current frame settings can occur:
- (1) - no old frame and no current frame -> no special action
- (2) - no old frame and current DropCap -> save DropCap for later use, don't call finishParagraph
- remove character properties of the DropCap?
- (3) - no old frame and current Frame -> save Frame for later use
- (4) - old DropCap and no current frame -> add DropCap to the properties of the finished paragraph, delete previous setting
- (5) - old DropCap and current frame -> add DropCap to the properties of the finished paragraph, save current frame settings
- (6) - old Frame and new DropCap -> add old Frame, save DropCap for later use
- (7) - old Frame and new same Frame -> continue
- (8) - old Frame and new different Frame -> add old Frame, save new Frame for later use
- (9) - old Frame and no current frame -> add old Frame, delete previous settings
-
- old _and_ new DropCap must not occur
- */
-
- // The paragraph style is vital to knowing all the frame properties.
- std::optional<PropertyMap::Property> aParaStyle
- = pPropertyMap->getProperty(PROP_PARA_STYLE_NAME);
- if (aParaStyle)
- {
- OUString sName;
- aParaStyle->second >>= sName;
- pParaContext->props().SetParaStyleName(sName);
- }
-
- bool bIsDropCap =
- pParaContext->props().IsFrameMode() &&
- sal::static_int_cast<Id>(pParaContext->props().GetDropCap()) != NS_ooxml::LN_Value_doc_ST_DropCap_none;
-
- style::DropCapFormat aDrop;
- ParagraphPropertiesPtr pToBeSavedProperties;
- bool bKeepLastParagraphProperties = false;
- if( bIsDropCap )
- {
- uno::Reference<text::XParagraphCursor> xParaCursor(
- xTextAppend->createTextCursorByRange(xTextAppend->getEnd()), uno::UNO_QUERY_THROW);
- //select paragraph
- xParaCursor->gotoStartOfParagraph( true );
- uno::Reference< beans::XPropertyState > xParaProperties( xParaCursor, uno::UNO_QUERY_THROW );
- xParaProperties->setPropertyToDefault(getPropertyName(PROP_CHAR_ESCAPEMENT));
- xParaProperties->setPropertyToDefault(getPropertyName(PROP_CHAR_HEIGHT));
- //handles (2) and part of (6)
- pToBeSavedProperties = new ParagraphProperties(pParaContext->props());
- sal_Int32 nCount = xParaCursor->getString().getLength();
- pToBeSavedProperties->SetDropCapLength(nCount > 0 && nCount < 255 ? static_cast<sal_Int8>(nCount) : 1);
- }
- if( rAppendContext.pLastParagraphProperties )
- {
- if( sal::static_int_cast<Id>(rAppendContext.pLastParagraphProperties->GetDropCap()) != NS_ooxml::LN_Value_doc_ST_DropCap_none)
- {
- //handles (4) and part of (5)
- //create a DropCap property, add it to the property sequence of finishParagraph
- sal_Int32 nLines = rAppendContext.pLastParagraphProperties->GetLines();
- aDrop.Lines = nLines > 0 && nLines < SAL_MAX_INT8 ? static_cast<sal_Int8>(nLines) : 2;
- aDrop.Count = rAppendContext.pLastParagraphProperties->GetDropCapLength();
- sal_Int32 nHSpace = rAppendContext.pLastParagraphProperties->GethSpace();
- aDrop.Distance = nHSpace > 0 && nHSpace < SAL_MAX_INT16 ? static_cast<sal_Int16>(nHSpace) : 0;
- //completes (5)
- if( pParaContext->props().IsFrameMode() )
- pToBeSavedProperties = new ParagraphProperties(pParaContext->props());
- }
- else
- {
- const bool bIsFrameMode(pParaContext->props().IsFrameMode());
- std::vector<beans::PropertyValue> aCurrFrameProperties;
- std::vector<beans::PropertyValue> aPrevFrameProperties;
- if (bIsFrameMode)
- {
- aCurrFrameProperties = MakeFrameProperties(pParaContext->props());
- aPrevFrameProperties
- = MakeFrameProperties(*rAppendContext.pLastParagraphProperties);
- }
-
- if (bIsFrameMode && aPrevFrameProperties == aCurrFrameProperties)
- {
- //handles (7)
- rAppendContext.pLastParagraphProperties->SetEndingRange(
- rAppendContext.xInsertPosition.is() ? rAppendContext.xInsertPosition
- : xTextAppend->getEnd());
- bKeepLastParagraphProperties = true;
- }
- else
- {
- // handles (8)(9) and completes (6)
-
- // RTF has an \overlap flag (which we ignore so far)
- // but DOCX has nothing like that for framePr
- // Always allow overlap in the RTF case - so there can be no regression.
-
- // In MSO UI, there is no setting for AllowOverlap for this kind of frame.
- // Although they CAN overlap with other anchored things,
- // they do not _easily_ overlap with other framePr's,
- // so when one frame follows another (8), don't let the first be overlapped.
- bool bPreventOverlap = !IsRTFImport() && bIsFrameMode && !bIsDropCap;
-
- // Preventing overlap is emulation - so deny overlap as little as possible.
- sal_Int16 nVertOrient = text::VertOrientation::NONE;
- sal_Int16 nVertOrientRelation = text::RelOrientation::FRAME;
- sal_Int32 nCurrVertPos = 0;
- sal_Int32 nPrevVertPos = 0;
- for (size_t i = 0; bPreventOverlap && i < aCurrFrameProperties.size(); ++i)
- {
- if (aCurrFrameProperties[i].Name == "VertOrientRelation")
- {
- aCurrFrameProperties[i].Value >>= nVertOrientRelation;
- if (nVertOrientRelation != text::RelOrientation::FRAME)
- bPreventOverlap = false;
- }
- else if (aCurrFrameProperties[i].Name == "VertOrient")
- {
- aCurrFrameProperties[i].Value >>= nVertOrient;
- if (nVertOrient != text::VertOrientation::NONE)
- bPreventOverlap = false;
- }
- else if (aCurrFrameProperties[i].Name == "VertOrientPosition")
- {
- aCurrFrameProperties[i].Value >>= nCurrVertPos;
- // arbitrary value. Assume it must be less than 1st line height
- if (nCurrVertPos > 20 || nCurrVertPos < -20)
- bPreventOverlap = false;
- }
- }
- for (size_t i = 0; bPreventOverlap && i < aPrevFrameProperties.size(); ++i)
- {
- if (aPrevFrameProperties[i].Name == "VertOrientRelation")
- {
- aPrevFrameProperties[i].Value >>= nVertOrientRelation;
- if (nVertOrientRelation != text::RelOrientation::FRAME)
- bPreventOverlap = false;
- }
- else if (aPrevFrameProperties[i].Name == "VertOrient")
- {
- aPrevFrameProperties[i].Value >>= nVertOrient;
- if (nVertOrient != text::VertOrientation::NONE)
- bPreventOverlap = false;
- }
- else if (aPrevFrameProperties[i].Name == "VertOrientPosition")
- {
- aPrevFrameProperties[i].Value >>= nPrevVertPos;
- if (nPrevVertPos != nCurrVertPos)
- bPreventOverlap = false;
- }
- }
-
- CheckUnregisteredFrameConversion(bPreventOverlap);
-
- // If different frame properties are set on this paragraph, keep them.
- if (!bIsDropCap && bIsFrameMode)
- {
- pToBeSavedProperties = new ParagraphProperties(pParaContext->props());
- lcl_AddRange(pToBeSavedProperties, xTextAppend, rAppendContext);
- }
- }
- }
- }
- else
- {
- // (1) doesn't need handling
-
- if( !bIsDropCap && pParaContext->props().IsFrameMode() )
- {
- pToBeSavedProperties = new ParagraphProperties(pParaContext->props());
- lcl_AddRange(pToBeSavedProperties, xTextAppend, rAppendContext);
- }
- }
- applyToggleAttributes(pPropertyMap); // for paragraph marker formatting
- std::vector<beans::PropertyValue> aProperties;
- if (pPropertyMap)
- {
- aProperties = comphelper::sequenceToContainer< std::vector<beans::PropertyValue> >(pPropertyMap->GetPropertyValues());
-
- // tdf#64222 filter out the "paragraph marker" formatting and
- // set it as a separate paragraph property, not a empty hint at
- // end of paragraph
- std::vector<beans::NamedValue> charProperties;
- for (auto it = aProperties.begin(); it != aProperties.end(); )
- {
- // this condition isn't ideal but as it happens all
- // RES_CHRATR_* have names that start with "Char"
- if (it->Name.startsWith("Char"))
- {
- charProperties.emplace_back(it->Name, it->Value);
- // as testN793262 demonstrates, font size in rPr must
- // affect the paragraph size => also insert empty hint!
-// it = aProperties.erase(it);
- }
- ++it;
- }
- if (!charProperties.empty())
- {
- aProperties.push_back(beans::PropertyValue("ListAutoFormat",
- 0, uno::Any(comphelper::containerToSequence(charProperties)), beans::PropertyState_DIRECT_VALUE));
- }
- }
- if( !bIsDropCap )
- {
- if( aDrop.Lines > 1 )
- {
- beans::PropertyValue aValue;
- aValue.Name = getPropertyName(PROP_DROP_CAP_FORMAT);
- aValue.Value <<= aDrop;
- aProperties.push_back(aValue);
- }
- uno::Reference< text::XTextRange > xTextRange;
- if (rAppendContext.xInsertPosition.is())
- {
- xTextRange = xTextAppend->finishParagraphInsert( comphelper::containerToSequence(aProperties), rAppendContext.xInsertPosition );
- rAppendContext.xCursor->gotoNextParagraph(false);
- if (rAppendContext.pLastParagraphProperties)
- rAppendContext.pLastParagraphProperties->SetEndingRange(xTextRange->getEnd());
- }
- else
- {
- uno::Reference<text::XTextCursor> xCursor;
- if (m_StreamStateStack.top().bParaHadField
- && !IsInComments() && !m_xTOCMarkerCursor.is())
- {
- // Workaround to make sure char props of the field are not lost.
- // Not relevant for editeng-based comments.
- // Not relevant for fields inside a TOC field.
- xCursor = xTextAppend->getText()->createTextCursor();
- if (xCursor.is())
- xCursor->gotoEnd(false);
- PropertyMapPtr pEmpty(new PropertyMap());
- appendTextPortion("X", pEmpty);
- }
-
- // Check if top / bottom margin has to be updated, now that we know the numbering status of both the previous and
- // the current text node.
- auto itNumberingRules = std::find_if(aProperties.begin(), aProperties.end(), [](const beans::PropertyValue& rValue)
- {
- return rValue.Name == "NumberingRules";
- });
-
- assert( isNumberingViaRule == (itNumberingRules != aProperties.end()) );
- isNumberingViaRule = (itNumberingRules != aProperties.end());
- if (m_StreamStateStack.top().xPreviousParagraph.is()
- && (isNumberingViaRule || isNumberingViaStyle))
- {
- // This textnode has numbering. Look up the numbering style name of the current and previous paragraph.
- OUString aCurrentNumberingName;
- OUString aPreviousNumberingName;
- if (isNumberingViaRule)
- {
- assert(itNumberingRules != aProperties.end() && "by definition itNumberingRules is valid if isNumberingViaRule is true");
- uno::Reference<container::XNamed> xCurrentNumberingRules(itNumberingRules->Value, uno::UNO_QUERY);
- if (xCurrentNumberingRules.is())
- aCurrentNumberingName = xCurrentNumberingRules->getName();
- try
- {
- uno::Reference<container::XNamed> xPreviousNumberingRules(
- m_StreamStateStack.top().xPreviousParagraph->getPropertyValue("NumberingRules"),
- uno::UNO_QUERY_THROW);
- aPreviousNumberingName = xPreviousNumberingRules->getName();
- }
- catch (const uno::Exception&)
- {
- TOOLS_WARN_EXCEPTION("writerfilter", "DomainMapper_Impl::finishParagraph NumberingRules");
- }
- }
- else if (m_StreamStateStack.top().xPreviousParagraph->getPropertySetInfo()->hasPropertyByName("NumberingStyleName")
- // don't update before tables
- && (m_StreamStateStack.top().nTableDepth == 0
- || !m_StreamStateStack.top().bFirstParagraphInCell))
- {
- aCurrentNumberingName = GetListStyleName(nListId);
- m_StreamStateStack.top().xPreviousParagraph->getPropertyValue("NumberingStyleName") >>= aPreviousNumberingName;
- }
-
- // tdf#133363: remove extra auto space even for mixed list styles
- if (!aPreviousNumberingName.isEmpty()
- && (aCurrentNumberingName == aPreviousNumberingName
- || !isNumberingViaRule))
- {
- uno::Sequence<beans::PropertyValue> aPrevPropertiesSeq;
- m_StreamStateStack.top().xPreviousParagraph->getPropertyValue("ParaInteropGrabBag") >>= aPrevPropertiesSeq;
- const auto & rPrevProperties = aPrevPropertiesSeq;
- bool bParaAutoBefore = m_StreamStateStack.top().bParaAutoBefore
- || std::any_of(rPrevProperties.begin(), rPrevProperties.end(), [](const beans::PropertyValue& rValue)
- {
- return rValue.Name == "ParaTopMarginBeforeAutoSpacing";
- });
- // if style based spacing was set to auto in the previous paragraph, style of the actual paragraph must be the same
- if (bParaAutoBefore && !m_StreamStateStack.top().bParaAutoBefore
- && m_StreamStateStack.top().xPreviousParagraph->getPropertySetInfo()->hasPropertyByName("ParaStyleName"))
- {
- auto itParaStyle = std::find_if(aProperties.begin(), aProperties.end(), [](const beans::PropertyValue& rValue)
- {
- return rValue.Name == "ParaStyleName";
- });
- bParaAutoBefore = itParaStyle != aProperties.end() &&
- m_StreamStateStack.top().xPreviousParagraph->getPropertyValue("ParaStyleName") == itParaStyle->Value;
- }
- // There was a previous textnode and it had the same numbering.
- if (bParaAutoBefore)
- {
- // This before spacing is set to auto, set before space to 0.
- auto itParaTopMargin = std::find_if(aProperties.begin(), aProperties.end(), [](const beans::PropertyValue& rValue)
- {
- return rValue.Name == "ParaTopMargin";
- });
- if (itParaTopMargin != aProperties.end())
- itParaTopMargin->Value <<= static_cast<sal_Int32>(0);
- else
- aProperties.push_back(comphelper::makePropertyValue("ParaTopMargin", static_cast<sal_Int32>(0)));
- }
-
- bool bPrevParaAutoAfter = std::any_of(rPrevProperties.begin(), rPrevProperties.end(), [](const beans::PropertyValue& rValue)
- {
- return rValue.Name == "ParaBottomMarginAfterAutoSpacing";
- });
- if (bPrevParaAutoAfter)
- {
- // Previous after spacing is set to auto, set previous after space to 0.
- m_StreamStateStack.top().xPreviousParagraph->setPropertyValue("ParaBottomMargin", uno::Any(static_cast<sal_Int32>(0)));
- }
- }
- }
-
- // apply redlines for inline images
- if (IsParaWithInlineObject())
- {
- for (const auto& rAnchored : rAppendContext.m_aAnchoredObjects)
- {
- // process only inline objects with redlining
- if (!rAnchored.m_xRedlineForInline)
- continue;
-
- // select the inline image and set its redline
- auto xAnchorRange = rAnchored.m_xAnchoredObject->getAnchor();
- uno::Reference< text::XTextCursor > xCursorOnImage =
- xAnchorRange->getText()->createTextCursorByRange(xAnchorRange);
- xCursorOnImage->goRight(1, true);
- CreateRedline( xCursorOnImage, rAnchored.m_xRedlineForInline );
- }
- }
-
- xTextRange = xTextAppend->finishParagraph( comphelper::containerToSequence(aProperties) );
- m_StreamStateStack.top().xPreviousParagraph.set(xTextRange, uno::UNO_QUERY);
-
- if (m_StreamStateStack.top().xPreviousParagraph.is() && // null for SvxUnoTextBase
- (isNumberingViaStyle || isNumberingViaRule))
- {
- assert(pParaContext);
- if (ListDef::Pointer const& pList = m_pListTable->GetList(nListId))
- { // styles could refer to non-existing lists...
- AbstractListDef::Pointer const& pAbsList =
- pList->GetAbstractDefinition();
- if (pAbsList &&
- // SvxUnoTextRange doesn't have ListId
- m_StreamStateStack.top().xPreviousParagraph->getPropertySetInfo()->hasPropertyByName("ListId"))
- {
- OUString paraId;
- m_StreamStateStack.top().xPreviousParagraph->getPropertyValue("ListId") >>= paraId;
- if (!paraId.isEmpty()) // must be on some list?
- {
- OUString const listId = pAbsList->MapListId(paraId);
- if (listId != paraId)
- {
- m_StreamStateStack.top().xPreviousParagraph->setPropertyValue("ListId", uno::Any(listId));
- }
- }
- }
-
- sal_Int16 nCurrentLevel = GetListLevel(pEntry, pPropertyMap);
- if (nCurrentLevel == -1)
- nCurrentLevel = 0;
-
- const ListLevel::Pointer pListLevel = pList->GetLevel(nCurrentLevel);
- if (pListLevel)
- {
- sal_Int16 nOverrideLevel = pListLevel->GetStartOverride();
- if (nOverrideLevel != -1 && m_aListOverrideApplied.find(nListId) == m_aListOverrideApplied.end())
- {
- // Apply override: we have override instruction for this level
- // And this was not done for this list before: we can do this only once on first occurrence
- // of list with override
- // TODO: Not tested variant with different levels override in different lists.
- // Probably m_aListOverrideApplied as a set of overridden listids is not sufficient
- // and we need to register level overrides separately.
- m_StreamStateStack.top().xPreviousParagraph->setPropertyValue("ParaIsNumberingRestart", uno::Any(true));
- m_StreamStateStack.top().xPreviousParagraph->setPropertyValue("NumberingStartValue", uno::Any(nOverrideLevel));
- m_aListOverrideApplied.insert(nListId);
- }
- }
- }
- }
-
- if (!rAppendContext.m_aAnchoredObjects.empty() && !IsInHeaderFooter())
- {
- // Remember what objects are anchored to this paragraph.
- // That list is only used for Word compat purposes, and
- // it is only relevant for body text.
- AnchoredObjectsInfo aInfo;
- aInfo.m_xParagraph = xTextRange;
- aInfo.m_aAnchoredObjects = rAppendContext.m_aAnchoredObjects;
- m_aAnchoredObjectAnchors.push_back(aInfo);
- rAppendContext.m_aAnchoredObjects.clear();
- }
-
- if (xCursor.is())
- {
- xCursor->goLeft(1, true);
- xCursor->setString(OUString());
- }
- }
- getTableManager( ).handle(xTextRange);
- m_aSmartTagHandler.handle(xTextRange);
-
- if (xTextRange.is())
- {
- // Get the end of paragraph character inserted
- uno::Reference< text::XTextCursor > xCur = xTextRange->getText( )->createTextCursor( );
- if (rAppendContext.xInsertPosition.is())
- xCur->gotoRange( rAppendContext.xInsertPosition, false );
- else
- xCur->gotoEnd( false );
-
- // tdf#77417 trim right white spaces in table cells in 2010 compatibility mode
- sal_Int32 nMode = GetSettingsTable()->GetWordCompatibilityMode();
- if (0 < m_StreamStateStack.top().nTableDepth && 0 < nMode && nMode <= 14)
- {
- // skip new line
- xCur->goLeft(1, false);
- while ( xCur->goLeft(1, true) )
- {
- OUString sChar = xCur->getString();
- if ( sChar == " " || sChar == "\t" || sChar == OUStringChar(u'\x00A0') )
- xCur->setString("");
- else
- break;
- }
-
- if (rAppendContext.xInsertPosition.is())
- xCur->gotoRange(rAppendContext.xInsertPosition, false);
- else
- xCur->gotoEnd(false);
- }
-
- xCur->goLeft( 1 , true );
- // Extend the redline ranges for empty paragraphs
- if (!m_StreamStateStack.top().bParaChanged && m_previousRedline)
- CreateRedline( xCur, m_previousRedline );
- CheckParaMarkerRedline( xCur );
- }
-
- css::uno::Reference<css::beans::XPropertySet> xParaProps(xTextRange, uno::UNO_QUERY);
-
- // table style precedence and not hidden shapes anchored to hidden empty table paragraphs
- if (xParaProps && !IsInComments()
- && (0 < m_StreamStateStack.top().nTableDepth
- || !m_aAnchoredObjectAnchors.empty()))
- {
- // table style has got bigger precedence than docDefault style
- // collect these pending paragraph properties to process in endTable()
- uno::Reference<text::XTextCursor> xCur = xTextRange->getText( )->createTextCursor( );
- xCur->gotoEnd(false);
- xCur->goLeft(1, false);
- uno::Reference<text::XTextCursor> xCur2 = xTextRange->getText()->createTextCursorByRange(xCur);
- uno::Reference<text::XParagraphCursor> xParaCursor(xCur2, uno::UNO_QUERY_THROW);
- xParaCursor->gotoStartOfParagraph(false);
- if (0 < m_StreamStateStack.top().nTableDepth)
- {
- TableParagraph aPending{xParaCursor, xCur, pParaContext, xParaProps};
- getTableManager().getCurrentParagraphs()->push_back(aPending);
- }
-
- // hidden empty paragraph with a not hidden shape, set as not hidden
- std::optional<PropertyMap::Property> pHidden;
- if ( !m_aAnchoredObjectAnchors.empty() && (pHidden = pParaContext->getProperty(PROP_CHAR_HIDDEN)) )
- {
- bool bIsHidden = {}; // -Werror=maybe-uninitialized
- pHidden->second >>= bIsHidden;
- if (bIsHidden)
- {
- bIsHidden = false;
- pHidden = GetTopContext()->getProperty(PROP_CHAR_HIDDEN);
- if (pHidden)
- pHidden->second >>= bIsHidden;
- if (!bIsHidden)
- {
- uno::Reference<text::XTextCursor> xCur3 = xTextRange->getText()->createTextCursorByRange(xParaCursor);
- xCur3->goRight(1, true);
- if (xCur3->getString() == SAL_NEWLINE_STRING)
- {
- uno::Reference< beans::XPropertySet > xProp( xCur3, uno::UNO_QUERY );
- xProp->setPropertyValue(getPropertyName(PROP_CHAR_HIDDEN), uno::Any(false));
- }
- }
- }
- }
- }
-
- // tdf#118521 set paragraph top or bottom margin based on the paragraph style
- // if we already set the other margin with direct formatting
- if (xParaProps)
- {
- const bool bTopSet = pParaContext->isSet(PROP_PARA_TOP_MARGIN);
- const bool bBottomSet = pParaContext->isSet(PROP_PARA_BOTTOM_MARGIN);
- const bool bContextSet = pParaContext->isSet(PROP_PARA_CONTEXT_MARGIN);
- if ( bTopSet != bBottomSet || bBottomSet != bContextSet )
- {
-
- if ( !bTopSet )
- {
- uno::Any aMargin = GetPropertyFromParaStyleSheet(PROP_PARA_TOP_MARGIN);
- if ( aMargin != uno::Any() )
- xParaProps->setPropertyValue("ParaTopMargin", aMargin);
- }
- if ( !bBottomSet )
- {
- uno::Any aMargin = GetPropertyFromParaStyleSheet(PROP_PARA_BOTTOM_MARGIN);
- if ( aMargin != uno::Any() )
- xParaProps->setPropertyValue("ParaBottomMargin", aMargin);
- }
- if ( !bContextSet )
- {
- uno::Any aMargin = GetPropertyFromParaStyleSheet(PROP_PARA_CONTEXT_MARGIN);
- if ( aMargin != uno::Any() )
- xParaProps->setPropertyValue("ParaContextMargin", aMargin);
- }
- }
- }
-
- // Left, Right, and Hanging settings are also grouped. Ensure that all or none are set.
- if (xParaProps)
- {
- const bool bLeftSet = pParaContext->isSet(PROP_PARA_LEFT_MARGIN);
- const bool bRightSet = pParaContext->isSet(PROP_PARA_RIGHT_MARGIN);
- const bool bFirstSet = pParaContext->isSet(PROP_PARA_FIRST_LINE_INDENT);
- if (bLeftSet != bRightSet || bRightSet != bFirstSet)
- {
- if ( !bLeftSet )
- {
- uno::Any aMargin = GetPropertyFromParaStyleSheet(PROP_PARA_LEFT_MARGIN);
- if ( aMargin != uno::Any() )
- xParaProps->setPropertyValue("ParaLeftMargin", aMargin);
- else if (isNumberingViaStyle)
- {
- const sal_Int32 nParaLeftMargin = getNumberingProperty(nListId, GetListLevel(pEntry, pPropertyMap), "IndentAt");
- if (nParaLeftMargin != 0)
- xParaProps->setPropertyValue("ParaLeftMargin", uno::Any(nParaLeftMargin));
- }
- }
- if ( !bRightSet )
- {
- uno::Any aMargin = GetPropertyFromParaStyleSheet(PROP_PARA_RIGHT_MARGIN);
- if ( aMargin != uno::Any() )
- xParaProps->setPropertyValue("ParaRightMargin", aMargin);
- }
- if ( !bFirstSet )
- {
- uno::Any aMargin = GetPropertyFromParaStyleSheet(PROP_PARA_FIRST_LINE_INDENT);
- if ( aMargin != uno::Any() )
- xParaProps->setPropertyValue("ParaFirstLineIndent", aMargin);
- else if (isNumberingViaStyle)
- {
- const sal_Int32 nFirstLineIndent = getNumberingProperty(nListId, GetListLevel(pEntry, pPropertyMap), "FirstLineIndent");
- if (nFirstLineIndent != 0)
- xParaProps->setPropertyValue("ParaFirstLineIndent", uno::Any(nFirstLineIndent));
- }
- }
- }
- }
- }
- if( !bKeepLastParagraphProperties )
- rAppendContext.pLastParagraphProperties = pToBeSavedProperties;
- }
- catch(const lang::IllegalArgumentException&)
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "DomainMapper_Impl::finishParagraph" );
- }
- catch(const uno::Exception&)
- {
- TOOLS_WARN_EXCEPTION( "writerfilter.dmapper", "finishParagraph()" );
- }
-
- }
-
- bool bIgnoreFrameState = IsInHeaderFooter();
- if( (!bIgnoreFrameState && pParaContext && pParaContext->props().IsFrameMode()) || (bIgnoreFrameState && GetIsPreviousParagraphFramed()) )
- SetIsPreviousParagraphFramed(true);
- else
- SetIsPreviousParagraphFramed(false);
-
- m_StreamStateStack.top().bRemoveThisParagraph = false;
- if( !IsInHeaderFooter() && !IsInShape()
- && (!pParaContext || !pParaContext->props().IsFrameMode()) )
- { // If the paragraph is in a frame, shape or header/footer, it's not a paragraph of the section itself.
- SetIsFirstParagraphInSection(false);
- // don't count an empty deleted paragraph as first paragraph in section to avoid of
- // the deletion of the next empty paragraph later, resulting loss of the associated page break
- if (!m_previousRedline || m_StreamStateStack.top().bParaChanged)
- {
- SetIsFirstParagraphInSectionAfterRedline(false);
- SetIsLastParagraphInSection(false);
- }
- }
- m_previousRedline.clear();
- m_StreamStateStack.top().bParaChanged = false;
-
- if (IsInComments() && pParaContext)
- {
- if (const OUString sParaId = pParaContext->props().GetParaId(); !sParaId.isEmpty())
- {
- if (const auto& item = m_aCommentProps.find(sParaId); item != m_aCommentProps.end())
- {
- m_bAnnotationResolved = item->second.bDone;
- m_sAnnotationParent = item->second.sParaIdParent;
- }
- m_sAnnotationImportedParaId = sParaId;
- }
- }
-
- if (m_StreamStateStack.top().bIsFirstParaInShape)
- m_StreamStateStack.top().bIsFirstParaInShape = false;
-
- if (pParaContext)
- {
- // Reset the frame properties for the next paragraph
- pParaContext->props().ResetFrameProperties();
- }
-
- SetIsOutsideAParagraph(true);
- m_StreamStateStack.top().bParaHadField = false;
-
- // don't overwrite m_bFirstParagraphInCell in table separator nodes
- // and in text boxes anchored to the first paragraph of table cells
- if (0 < m_StreamStateStack.top().nTableDepth
- && m_StreamStateStack.top().nTableDepth == m_StreamStateStack.top().nTableCellDepth
- && !IsInShape() && !IsInComments())
- {
- m_StreamStateStack.top().bFirstParagraphInCell = false;
- }
-
- m_StreamStateStack.top().bParaAutoBefore = false;
- m_StreamStateStack.top().bParaWithInlineObject = false;
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-
-}
-
-// TODO this does not yet take table styles into account
-void DomainMapper_Impl::applyToggleAttributes(const PropertyMapPtr& pPropertyMap)
-{
- std::optional<PropertyMap::Property> charStyleProperty = pPropertyMap->getProperty(PROP_CHAR_STYLE_NAME);
- if (charStyleProperty.has_value())
- {
- OUString sCharStyleName;
- charStyleProperty->second >>= sCharStyleName;
- float fCharStyleBold = css::awt::FontWeight::NORMAL;
- float fCharStyleBoldComplex = css::awt::FontWeight::NORMAL;
- css::awt::FontSlant eCharStylePosture = css::awt::FontSlant_NONE;
- css::awt::FontSlant eCharStylePostureComplex = css::awt::FontSlant_NONE;
- sal_Int16 nCharStyleCaseMap = css::style::CaseMap::NONE;
- sal_Int16 nCharStyleRelief = css::awt::FontRelief::NONE;
- bool bCharStyleContoured = false;//Outline;
- bool bCharStyleShadowed = false;
- sal_Int16 nCharStyleStrikeThrough = awt::FontStrikeout::NONE;
- bool bCharStyleHidden = false;
-
- uno::Reference<beans::XPropertySet> xCharStylePropertySet = GetCharacterStyles()->getByName(sCharStyleName).get<uno::Reference<beans::XPropertySet>>();
- xCharStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_WEIGHT)) >>= fCharStyleBold;
- xCharStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_WEIGHT_COMPLEX)) >>= fCharStyleBoldComplex;
- xCharStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_POSTURE)) >>= eCharStylePosture;
- xCharStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_POSTURE_COMPLEX)) >>= eCharStylePostureComplex;
- xCharStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_CASE_MAP)) >>= nCharStyleCaseMap;
- xCharStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_RELIEF)) >>= nCharStyleRelief;
- xCharStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_CONTOURED)) >>= bCharStyleContoured;
- xCharStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_SHADOWED)) >>= bCharStyleShadowed;
- xCharStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_STRIKEOUT)) >>= nCharStyleStrikeThrough;
- xCharStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_HIDDEN)) >>= bCharStyleHidden;
- if (fCharStyleBold > css::awt::FontWeight::NORMAL || eCharStylePosture != css::awt::FontSlant_NONE|| nCharStyleCaseMap != css::style::CaseMap::NONE ||
- nCharStyleRelief != css::awt::FontRelief::NONE || bCharStyleContoured || bCharStyleShadowed ||
- nCharStyleStrikeThrough == awt::FontStrikeout::SINGLE || bCharStyleHidden)
- {
- uno::Reference<beans::XPropertySet> const xParaStylePropertySet =
- GetParagraphStyles()->getByName(m_StreamStateStack.top().sCurrentParaStyleName).get<uno::Reference<beans::XPropertySet>>();
- float fParaStyleBold = css::awt::FontWeight::NORMAL;
- float fParaStyleBoldComplex = css::awt::FontWeight::NORMAL;
- css::awt::FontSlant eParaStylePosture = css::awt::FontSlant_NONE;
- css::awt::FontSlant eParaStylePostureComplex = css::awt::FontSlant_NONE;
- sal_Int16 nParaStyleCaseMap = css::style::CaseMap::NONE;
- sal_Int16 nParaStyleRelief = css::awt::FontRelief::NONE;
- bool bParaStyleContoured = false;
- bool bParaStyleShadowed = false;
- sal_Int16 nParaStyleStrikeThrough = awt::FontStrikeout::NONE;
- bool bParaStyleHidden = false;
- xParaStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_WEIGHT)) >>= fParaStyleBold;
- xParaStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_WEIGHT_COMPLEX)) >>= fParaStyleBoldComplex;
- xParaStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_POSTURE)) >>= eParaStylePosture;
- xParaStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_POSTURE_COMPLEX)) >>= eParaStylePostureComplex;
- xParaStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_CASE_MAP)) >>= nParaStyleCaseMap;
- xParaStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_RELIEF)) >>= nParaStyleRelief;
- xParaStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_SHADOWED)) >>= bParaStyleShadowed;
- xParaStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_CONTOURED)) >>= bParaStyleContoured;
- xParaStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_STRIKEOUT)) >>= nParaStyleStrikeThrough;
- xParaStylePropertySet->getPropertyValue(getPropertyName(PROP_CHAR_HIDDEN)) >>= bParaStyleHidden;
- if (fCharStyleBold > css::awt::FontWeight::NORMAL && fParaStyleBold > css::awt::FontWeight::NORMAL)
- {
- std::optional<PropertyMap::Property> charBoldProperty = pPropertyMap->getProperty(PROP_CHAR_WEIGHT);
- if (!charBoldProperty.has_value())
- {
- pPropertyMap->Insert(PROP_CHAR_WEIGHT, uno::Any(css::awt::FontWeight::NORMAL));
- }
- }
- if (fCharStyleBoldComplex > css::awt::FontWeight::NORMAL && fParaStyleBoldComplex > css::awt::FontWeight::NORMAL)
- {
- std::optional<PropertyMap::Property> charBoldPropertyComplex = pPropertyMap->getProperty(PROP_CHAR_WEIGHT_COMPLEX);
- if (!charBoldPropertyComplex.has_value())
- {
- pPropertyMap->Insert(PROP_CHAR_WEIGHT_COMPLEX, uno::Any(css::awt::FontWeight::NORMAL));
- pPropertyMap->Insert(PROP_CHAR_WEIGHT_ASIAN, uno::Any(css::awt::FontWeight::NORMAL));
- }
- }
- if (eCharStylePosture != css::awt::FontSlant_NONE && eParaStylePosture != css::awt::FontSlant_NONE)
- {
- std::optional<PropertyMap::Property> charItalicProperty = pPropertyMap->getProperty(PROP_CHAR_POSTURE);
- if (!charItalicProperty.has_value())
- {
- pPropertyMap->Insert(PROP_CHAR_POSTURE, uno::Any(css::awt::FontSlant_NONE));
- }
- }
- if (eCharStylePostureComplex != css::awt::FontSlant_NONE && eParaStylePostureComplex != css::awt::FontSlant_NONE)
- {
- std::optional<PropertyMap::Property> charItalicPropertyComplex = pPropertyMap->getProperty(PROP_CHAR_POSTURE_COMPLEX);
- if (!charItalicPropertyComplex.has_value())
- {
- pPropertyMap->Insert(PROP_CHAR_POSTURE_COMPLEX, uno::Any(css::awt::FontSlant_NONE));
- pPropertyMap->Insert(PROP_CHAR_POSTURE_ASIAN, uno::Any(css::awt::FontSlant_NONE));
- }
- }
- if (nCharStyleCaseMap == nParaStyleCaseMap && nCharStyleCaseMap != css::style::CaseMap::NONE)
- {
- std::optional<PropertyMap::Property> charCaseMap = pPropertyMap->getProperty(PROP_CHAR_CASE_MAP);
- if (!charCaseMap.has_value())
- {
- pPropertyMap->Insert(PROP_CHAR_CASE_MAP, uno::Any(css::style::CaseMap::NONE));
- }
- }
- if (nParaStyleRelief != css::awt::FontRelief::NONE && nCharStyleRelief == nParaStyleRelief)
- {
- std::optional<PropertyMap::Property> charRelief = pPropertyMap->getProperty(PROP_CHAR_RELIEF);
- if (!charRelief.has_value())
- {
- pPropertyMap->Insert(PROP_CHAR_RELIEF, uno::Any(css::awt::FontRelief::NONE));
- }
- }
- if (bParaStyleContoured && bCharStyleContoured)
- {
- std::optional<PropertyMap::Property> charContoured = pPropertyMap->getProperty(PROP_CHAR_CONTOURED);
- if (!charContoured.has_value())
- {
- pPropertyMap->Insert(PROP_CHAR_CONTOURED, uno::Any(false));
- }
- }
- if (bParaStyleShadowed && bCharStyleShadowed)
- {
- std::optional<PropertyMap::Property> charShadow = pPropertyMap->getProperty(PROP_CHAR_SHADOWED);
- if (!charShadow.has_value())
- {
- pPropertyMap->Insert(PROP_CHAR_SHADOWED, uno::Any(false));
- }
- }
- if (nParaStyleStrikeThrough == css::awt::FontStrikeout::SINGLE && nParaStyleStrikeThrough == nCharStyleStrikeThrough)
- {
- std::optional<PropertyMap::Property> charStrikeThrough = pPropertyMap->getProperty(PROP_CHAR_STRIKEOUT);
- if (!charStrikeThrough.has_value())
- {
- pPropertyMap->Insert(PROP_CHAR_STRIKEOUT, uno::Any(css::awt::FontStrikeout::NONE));
- }
- }
- if (bParaStyleHidden && bCharStyleHidden)
- {
- std::optional<PropertyMap::Property> charHidden = pPropertyMap->getProperty(PROP_CHAR_HIDDEN);
- if (!charHidden.has_value())
- {
- pPropertyMap->Insert(PROP_CHAR_HIDDEN, uno::Any(false));
- }
- }
- }
- }
-}
-
-void DomainMapper_Impl::MergeAtContentImageRedlineWithNext(const css::uno::Reference<css::text::XTextAppend>& xTextAppend)
-{
- // remove workaround for change tracked images, if they are part of a redline,
- // i.e. if the next run is a tracked change with the same type, author and date,
- // as in the change tracking of the image.
- if ( m_bRedlineImageInPreviousRun )
- {
- auto pCurrentRedline = m_aRedlines.top().size() > 0
- ? m_aRedlines.top().back()
- : GetTopContextOfType(CONTEXT_CHARACTER) &&
- GetTopContextOfType(CONTEXT_CHARACTER)->Redlines().size() > 0
- ? GetTopContextOfType(CONTEXT_CHARACTER)->Redlines().back()
- : nullptr;
- if ( m_previousRedline && pCurrentRedline &&
- // same redline
- (m_previousRedline->m_nToken & 0xffff) == (pCurrentRedline->m_nToken & 0xffff) &&
- m_previousRedline->m_sAuthor == pCurrentRedline->m_sAuthor &&
- m_previousRedline->m_sDate == pCurrentRedline->m_sDate )
- {
- uno::Reference< text::XTextCursor > xCursor = xTextAppend->getEnd()->getText( )->createTextCursor( );
- assert(xCursor.is());
- xCursor->gotoEnd(false);
- xCursor->goLeft(2, true);
- if ( xCursor->getString() == u"​​" )
- {
- xCursor->goRight(1, true);
- xCursor->setString("");
- xCursor->gotoEnd(false);
- xCursor->goLeft(1, true);
- xCursor->setString("");
- }
- }
-
- m_bRedlineImageInPreviousRun = false;
- }
-}
-
- void DomainMapper_Impl::appendTextPortion( const OUString& rString, const PropertyMapPtr& pPropertyMap )
-{
- if (m_bDiscardHeaderFooter)
- return;
-
- if (m_aTextAppendStack.empty())
- return;
- // Before placing call to processDeferredCharacterProperties(), TopContextType should be CONTEXT_CHARACTER
- // processDeferredCharacterProperties() invokes only if character inserted
- if (pPropertyMap == m_pTopContext
- && !m_StreamStateStack.top().deferredCharacterProperties.empty()
- && (GetTopContextType() == CONTEXT_CHARACTER))
- {
- processDeferredCharacterProperties();
- }
- uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if (!xTextAppend.is() || !hasTableManager() || getTableManager().isIgnore())
- return;
-
- try
- {
- applyToggleAttributes(pPropertyMap);
- // If we are in comments, then disable CharGrabBag, comment text doesn't support that.
- uno::Sequence<beans::PropertyValue> aValues = pPropertyMap->GetPropertyValues(/*bCharGrabBag=*/!IsInComments());
-
- if (IsInTOC() || m_bStartIndex || m_bStartBibliography)
- for( auto& rValue : asNonConstRange(aValues) )
- {
- if (rValue.Name == "CharHidden")
- rValue.Value <<= false;
- }
-
- MergeAtContentImageRedlineWithNext(xTextAppend);
-
- uno::Reference< text::XTextRange > xTextRange;
- if (m_aTextAppendStack.top().xInsertPosition.is())
- {
- xTextRange = xTextAppend->insertTextPortion(rString, aValues, m_aTextAppendStack.top().xInsertPosition);
- m_aTextAppendStack.top().xCursor->gotoRange(xTextRange->getEnd(), true);
- }
- else
- {
- if (IsInTOC() || m_bStartIndex || m_bStartBibliography || m_nStartGenericField != 0)
- {
- if (IsInHeaderFooter() && !m_bStartTOCHeaderFooter)
- {
- xTextRange = xTextAppend->appendTextPortion(rString, aValues);
- }
- else
- {
- m_bStartedTOC = true;
- uno::Reference< text::XTextCursor > xTOCTextCursor = xTextAppend->getEnd()->getText( )->createTextCursor( );
- assert(xTOCTextCursor.is());
- xTOCTextCursor->gotoEnd(false);
- if (m_nStartGenericField != 0)
- {
- xTOCTextCursor->goLeft(1, false);
- }
- if (IsInComments())
- xTextRange = xTextAppend->finishParagraphInsert(aValues, xTOCTextCursor);
- else
- xTextRange = xTextAppend->insertTextPortion(rString, aValues, xTOCTextCursor);
- SAL_WARN_IF(!xTextRange.is(), "writerfilter.dmapper", "insertTextPortion failed");
- if (!xTextRange.is())
- throw uno::Exception("insertTextPortion failed", nullptr);
- m_StreamStateStack.top().bTextInserted = true;
- xTOCTextCursor->gotoRange(xTextRange->getEnd(), true);
- if (m_nStartGenericField == 0)
- {
- m_aTextAppendStack.push(TextAppendContext(xTextAppend, xTOCTextCursor));
- }
- }
- }
- else
- {
- if (IsOpenField() && GetTopFieldContext()->GetFieldId() == FIELD_HYPERLINK)
- {
- // It is content of hyperlink field. We need to create and remember
- // character style for later applying to hyperlink
- PropertyValueVector_t aProps = comphelper::sequenceToContainer< PropertyValueVector_t >(GetTopContext()->GetPropertyValues());
- OUString sHyperlinkStyleName = GetStyleSheetTable()->getOrCreateCharStyle(aProps, /*bAlwaysCreate=*/false);
- GetTopFieldContext()->SetHyperlinkStyle(sHyperlinkStyleName);
- }
-
-#if !defined(MACOSX) // TODO: check layout differences and support all platforms, if needed
- sal_Int32 nPos = 0;
- OUString sFontName;
- OUString sDoubleSpace(" ");
- PropertyMapPtr pContext = GetTopContextOfType(CONTEXT_CHARACTER);
- // tdf#123703 workaround for longer space sequences of the old or compatible RTF documents
- if (GetSettingsTable()->GetLongerSpaceSequence() && !IsOpenFieldCommand() && (nPos = rString.indexOf(sDoubleSpace)) != -1 &&
- // monospaced fonts have no longer space sequences, regardless of \fprq2 (not monospaced) font setting
- // fix for the base monospaced font Courier
- (!pContext || !pContext->isSet(PROP_CHAR_FONT_NAME) ||
- ((pContext->getProperty(PROP_CHAR_FONT_NAME)->second >>= sFontName) && sFontName.indexOf("Courier") == -1)))
- {
- // an RTF space character is longer by an extra six-em-space in an old-style RTF space sequence,
- // insert them to keep RTF document layout formatted by consecutive spaces
- const sal_Unicode aExtraSpace[5] = { 0x2006, 0x20, 0x2006, 0x20, 0 };
- const sal_Unicode aExtraSpace2[4] = { 0x20, 0x2006, 0x20, 0 };
- xTextRange = xTextAppend->appendTextPortion(rString.replaceAll(sDoubleSpace, aExtraSpace, nPos)
- .replaceAll(sDoubleSpace, aExtraSpace2, nPos), aValues);
- }
- else
-#endif
- xTextRange = xTextAppend->appendTextPortion(rString, aValues);
- }
- }
-
- // reset moveFrom/moveTo data of non-terminating runs of the paragraph
- if ( m_pParaMarkerRedlineMove )
- {
- m_pParaMarkerRedlineMove.clear();
- }
- CheckRedline( xTextRange );
- m_StreamStateStack.top().bParaChanged = true;
-
- //getTableManager( ).handle(xTextRange);
- }
- catch(const lang::IllegalArgumentException&)
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "DomainMapper_Impl::appendTextPortion" );
- }
- catch(const uno::Exception&)
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "DomainMapper_Impl::appendTextPortion" );
- }
-}
-
-void DomainMapper_Impl::appendTextContent(
- const uno::Reference< text::XTextContent >& xContent,
- const uno::Sequence< beans::PropertyValue >& xPropertyValues
- )
-{
- SAL_WARN_IF(m_aTextAppendStack.empty(), "writerfilter.dmapper", "no text append stack");
- if (m_aTextAppendStack.empty())
- return;
- uno::Reference< text::XTextAppendAndConvert > xTextAppendAndConvert( m_aTextAppendStack.top().xTextAppend, uno::UNO_QUERY );
- OSL_ENSURE( xTextAppendAndConvert.is(), "trying to append a text content without XTextAppendAndConvert" );
- if (!xTextAppendAndConvert.is() || !hasTableManager() || getTableManager().isIgnore())
- return;
-
- try
- {
- if (m_aTextAppendStack.top().xInsertPosition.is())
- xTextAppendAndConvert->insertTextContentWithProperties( xContent, xPropertyValues, m_aTextAppendStack.top().xInsertPosition );
- else
- xTextAppendAndConvert->appendTextContent( xContent, xPropertyValues );
- }
- catch(const lang::IllegalArgumentException&)
- {
- }
- catch(const uno::Exception&)
- {
- }
-}
-
-void DomainMapper_Impl::appendOLE( const OUString& rStreamName, const std::shared_ptr<OLEHandler>& pOLEHandler )
-{
- try
- {
- uno::Reference< text::XTextContent > xOLE( m_xTextFactory->createInstance("com.sun.star.text.TextEmbeddedObject"), uno::UNO_QUERY_THROW );
- uno::Reference< beans::XPropertySet > xOLEProperties(xOLE, uno::UNO_QUERY_THROW);
-
- OUString aCLSID = pOLEHandler->getCLSID();
- if (aCLSID.isEmpty())
- xOLEProperties->setPropertyValue(getPropertyName( PROP_STREAM_NAME ),
- uno::Any( rStreamName ));
- else
- xOLEProperties->setPropertyValue("CLSID", uno::Any(aCLSID));
-
- OUString aDrawAspect = pOLEHandler->GetDrawAspect();
- if(!aDrawAspect.isEmpty())
- xOLEProperties->setPropertyValue("DrawAspect", uno::Any(aDrawAspect));
-
- awt::Size aSize = pOLEHandler->getSize();
- if( !aSize.Width )
- aSize.Width = 1000;
- if( !aSize.Height )
- aSize.Height = 1000;
- xOLEProperties->setPropertyValue(getPropertyName( PROP_WIDTH ),
- uno::Any(aSize.Width));
- xOLEProperties->setPropertyValue(getPropertyName( PROP_HEIGHT ),
- uno::Any(aSize.Height));
-
- OUString aVisAreaWidth = pOLEHandler->GetVisAreaWidth();
- if(!aVisAreaWidth.isEmpty())
- xOLEProperties->setPropertyValue("VisibleAreaWidth", uno::Any(aVisAreaWidth));
-
- OUString aVisAreaHeight = pOLEHandler->GetVisAreaHeight();
- if(!aVisAreaHeight.isEmpty())
- xOLEProperties->setPropertyValue("VisibleAreaHeight", uno::Any(aVisAreaHeight));
-
- uno::Reference< graphic::XGraphic > xGraphic = pOLEHandler->getReplacement();
- xOLEProperties->setPropertyValue(getPropertyName( PROP_GRAPHIC ),
- uno::Any(xGraphic));
- uno::Reference<beans::XPropertySet> xReplacementProperties(pOLEHandler->getShape(), uno::UNO_QUERY);
- if (xReplacementProperties.is())
- {
- table::BorderLine2 aBorderProps;
- xReplacementProperties->getPropertyValue("LineColor") >>= aBorderProps.Color;
- xReplacementProperties->getPropertyValue("LineWidth") >>= aBorderProps.LineWidth;
- xReplacementProperties->getPropertyValue("LineStyle") >>= aBorderProps.LineStyle;
-
- if (aBorderProps.LineStyle) // Set line props only if LineStyle is set
- {
- xOLEProperties->setPropertyValue("RightBorder", uno::Any(aBorderProps));
- xOLEProperties->setPropertyValue("TopBorder", uno::Any(aBorderProps));
- xOLEProperties->setPropertyValue("LeftBorder", uno::Any(aBorderProps));
- xOLEProperties->setPropertyValue("BottomBorder", uno::Any(aBorderProps));
- }
- OUString pProperties[] = {
- "AnchorType",
- "Surround",
- "SurroundContour",
- "HoriOrient",
- "HoriOrientPosition",
- "VertOrient",
- "VertOrientPosition",
- "VertOrientRelation",
- "HoriOrientRelation",
- "LeftMargin",
- "RightMargin",
- "TopMargin",
- "BottomMargin"
- };
- for (const OUString& s : pProperties)
- {
- const uno::Any aVal = xReplacementProperties->getPropertyValue(s);
- xOLEProperties->setPropertyValue(s, aVal);
- }
-
- if (xReplacementProperties->getPropertyValue("FillStyle").get<css::drawing::FillStyle>()
- != css::drawing::FillStyle::FillStyle_NONE) // Apply fill props if style is set
- {
- xOLEProperties->setPropertyValue(
- "FillStyle", xReplacementProperties->getPropertyValue("FillStyle"));
- xOLEProperties->setPropertyValue(
- "FillColor", xReplacementProperties->getPropertyValue("FillColor"));
- xOLEProperties->setPropertyValue(
- "FillColor2", xReplacementProperties->getPropertyValue("FillColor2"));
- }
- }
- else
- // mimic the treatment of graphics here... it seems anchoring as character
- // gives a better ( visually ) result
- xOLEProperties->setPropertyValue(getPropertyName( PROP_ANCHOR_TYPE ), uno::Any( text::TextContentAnchorType_AS_CHARACTER ) );
- // remove ( if valid ) associated shape ( used for graphic replacement )
- SAL_WARN_IF(m_aAnchoredStack.empty(), "writerfilter.dmapper", "no anchor stack");
- if (!m_aAnchoredStack.empty())
- m_aAnchoredStack.top( ).bToRemove = true;
- RemoveLastParagraph();
- SAL_WARN_IF(m_aTextAppendStack.empty(), "writerfilter.dmapper", "no text stack");
- if (!m_aTextAppendStack.empty())
- m_aTextAppendStack.pop();
-
- appendTextContent( xOLE, uno::Sequence< beans::PropertyValue >() );
-
- if (!aCLSID.isEmpty())
- pOLEHandler->importStream(m_xComponentContext, GetTextDocument(), xOLE);
-
- }
- catch( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "in creation of OLE object" );
- }
-
-}
-
-void DomainMapper_Impl::appendStarMath( const Value& val )
-{
- uno::Reference< embed::XEmbeddedObject > formula;
- val.getAny() >>= formula;
- if( !formula.is() )
- return;
-
- try
- {
- uno::Reference< text::XTextContent > xStarMath( m_xTextFactory->createInstance("com.sun.star.text.TextEmbeddedObject"), uno::UNO_QUERY_THROW );
- uno::Reference< beans::XPropertySet > xStarMathProperties(xStarMath, uno::UNO_QUERY_THROW);
-
- xStarMathProperties->setPropertyValue(getPropertyName( PROP_EMBEDDED_OBJECT ),
- val.getAny());
- // tdf#66405: set zero margins for embedded object
- xStarMathProperties->setPropertyValue(getPropertyName( PROP_LEFT_MARGIN ),
- uno::Any(sal_Int32(0)));
- xStarMathProperties->setPropertyValue(getPropertyName( PROP_RIGHT_MARGIN ),
- uno::Any(sal_Int32(0)));
- xStarMathProperties->setPropertyValue(getPropertyName( PROP_TOP_MARGIN ),
- uno::Any(sal_Int32(0)));
- xStarMathProperties->setPropertyValue(getPropertyName( PROP_BOTTOM_MARGIN ),
- uno::Any(sal_Int32(0)));
-
- uno::Reference< uno::XInterface > xInterface( formula->getComponent(), uno::UNO_QUERY );
- // set zero margins for object's component
- uno::Reference< beans::XPropertySet > xComponentProperties( xInterface, uno::UNO_QUERY_THROW );
- xComponentProperties->setPropertyValue(getPropertyName( PROP_LEFT_MARGIN ),
- uno::Any(sal_Int32(0)));
- xComponentProperties->setPropertyValue(getPropertyName( PROP_RIGHT_MARGIN ),
- uno::Any(sal_Int32(0)));
- xComponentProperties->setPropertyValue(getPropertyName( PROP_TOP_MARGIN ),
- uno::Any(sal_Int32(0)));
- xComponentProperties->setPropertyValue(getPropertyName( PROP_BOTTOM_MARGIN ),
- uno::Any(sal_Int32(0)));
- Size size( 1000, 1000 );
- if( oox::FormulaImExportBase* formulaimport = dynamic_cast< oox::FormulaImExportBase* >( xInterface.get()))
- size = formulaimport->getFormulaSize();
- xStarMathProperties->setPropertyValue(getPropertyName( PROP_WIDTH ),
- uno::Any( sal_Int32(size.Width())));
- xStarMathProperties->setPropertyValue(getPropertyName( PROP_HEIGHT ),
- uno::Any( sal_Int32(size.Height())));
- xStarMathProperties->setPropertyValue(getPropertyName(PROP_ANCHOR_TYPE),
- uno::Any(text::TextContentAnchorType_AS_CHARACTER));
- // mimic the treatment of graphics here... it seems anchoring as character
- // gives a better ( visually ) result
- appendTextContent(xStarMath, uno::Sequence<beans::PropertyValue>());
- }
- catch( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "in creation of StarMath object" );
- }
-}
-
-void DomainMapper_Impl::adjustLastPara(sal_Int8 nAlign)
-{
- PropertyMapPtr pLastPara = GetTopContextOfType(dmapper::CONTEXT_PARAGRAPH);
- pLastPara->Insert(PROP_PARA_ADJUST, uno::Any(nAlign), true);
-}
-
-static void checkAndAddPropVal(const OUString& prop, const css::uno::Any& val,
- std::vector<OUString>& props, std::vector<css::uno::Any>& values)
-{
- // Avoid well-known reasons for exceptions when setting property values
- if (!val.hasValue())
- return;
- if (prop == "CharStyleName" || prop == "DropCapCharStyleName")
- if (OUString val_string; (val >>= val_string) && val_string.isEmpty())
- return;
-
- props.push_back(prop);
- values.push_back(val);
-}
-
-static uno::Reference<lang::XComponent>
-getParagraphOfRange(const css::uno::Reference<css::text::XTextRange>& xRange)
-{
- uno::Reference<container::XEnumerationAccess> xEA{ xRange, uno::UNO_QUERY_THROW };
- return { xEA->createEnumeration()->nextElement(), uno::UNO_QUERY_THROW };
-}
-
-static void copyAllProps(const css::uno::Reference<css::uno::XInterface>& from,
- const css::uno::Reference<css::uno::XInterface>& to)
-{
- css::uno::Reference<css::beans::XPropertySet> xFromProps(from, css::uno::UNO_QUERY_THROW);
- css::uno::Reference<css::beans::XPropertySetInfo> xFromInfo(xFromProps->getPropertySetInfo(),
- css::uno::UNO_SET_THROW);
- css::uno::Sequence<css::beans::Property> rawProps(xFromInfo->getProperties());
- std::vector<OUString> props;
- props.reserve(rawProps.getLength());
- for (const auto& prop : rawProps)
- if ((prop.Attributes & css::beans::PropertyAttribute::READONLY) == 0)
- props.push_back(prop.Name);
-
- if (css::uno::Reference<css::beans::XPropertyState> xFromState{ from, css::uno::UNO_QUERY })
- {
- const auto propsSeq = comphelper::containerToSequence(props);
- const auto statesSeq = xFromState->getPropertyStates(propsSeq);
- assert(propsSeq.getLength() == statesSeq.getLength());
- for (sal_Int32 i = 0; i < propsSeq.getLength(); ++i)
- if (statesSeq[i] != css::beans::PropertyState_DIRECT_VALUE)
- std::erase(props, propsSeq[i]);
- }
-
- std::vector<css::uno::Any> values;
- values.reserve(props.size());
- if (css::uno::Reference<css::beans::XMultiPropertySet> xFromMulti{ xFromProps,
- css::uno::UNO_QUERY })
- {
- const auto propsSeq = comphelper::containerToSequence(props);
- const auto valuesSeq = xFromMulti->getPropertyValues(propsSeq);
- assert(propsSeq.getLength() == valuesSeq.getLength());
- props.clear();
- for (size_t i = 0; i < propsSeq.size(); ++i)
- checkAndAddPropVal(propsSeq[i], valuesSeq[i], props, values);
- }
- else
- {
- std::vector<OUString> filtered_props;
- filtered_props.reserve(props.size());
- for (const auto& prop : props)
- checkAndAddPropVal(prop, xFromProps->getPropertyValue(prop), filtered_props, values);
- filtered_props.swap(props);
- }
- assert(props.size() == values.size());
-
- css::uno::Reference<css::beans::XPropertySet> xToProps(to, css::uno::UNO_QUERY_THROW);
- if (css::uno::Reference<css::beans::XMultiPropertySet> xToMulti{ xToProps,
- css::uno::UNO_QUERY })
- {
- try
- {
- xToMulti->setPropertyValues(comphelper::containerToSequence(props),
- comphelper::containerToSequence(values));
- return;
- }
- catch (css::uno::Exception&)
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter.dmapper");
- }
- // Fallback to property-by-property iteration
- }
-
- for (size_t i = 0; i < props.size(); ++i)
- {
- try
- {
- xToProps->setPropertyValue(props[i], values[i]);
- }
- catch (css::uno::Exception&)
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter.dmapper");
- }
- }
-}
-
-uno::Reference< beans::XPropertySet > DomainMapper_Impl::appendTextSectionAfter(
- uno::Reference< text::XTextRange > const & xBefore )
-{
- uno::Reference< beans::XPropertySet > xRet;
- if (m_aTextAppendStack.empty())
- return xRet;
- uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if(xTextAppend.is())
- {
- try
- {
- uno::Reference< text::XParagraphCursor > xCursor(
- xTextAppend->createTextCursorByRange( xBefore ), uno::UNO_QUERY_THROW);
- //the cursor has been moved to the end of the paragraph because of the appendTextPortion() calls
- xCursor->gotoStartOfParagraph( false );
- if (m_aTextAppendStack.top().xInsertPosition.is())
- xCursor->gotoRange( m_aTextAppendStack.top().xInsertPosition, true );
- else
- xCursor->gotoEnd( true );
- // The paragraph after this new section is already inserted. The previous node may be a
- // table; then trying to go left would skip the whole table. Split the trailing
- // paragraph; let the section span over the first of the two resulting paragraphs;
- // destroy the last section's paragraph afterwards.
- xTextAppend->insertControlCharacter(
- xCursor->getEnd(), css::text::ControlCharacter::PARAGRAPH_BREAK, false);
- auto xNewPara = getParagraphOfRange(xCursor->getEnd());
- xCursor->gotoPreviousParagraph(true);
- auto xEndPara = getParagraphOfRange(xCursor->getEnd());
- // xEndPara may already have properties (like page break); make sure to apply them
- // to the newly appended paragraph, which will be kept in the end.
- copyAllProps(xEndPara, xNewPara);
-
- uno::Reference< text::XTextContent > xSection( m_xTextFactory->createInstance("com.sun.star.text.TextSection"), uno::UNO_QUERY_THROW );
- xSection->attach(xCursor);
-
- // Remove the extra paragraph (last inside the section)
- xEndPara->dispose();
-
- xRet.set(xSection, uno::UNO_QUERY );
- }
- catch(const uno::Exception&)
- {
- }
-
- }
-
- return xRet;
-}
-
-void DomainMapper_Impl::appendGlossaryEntry()
-{
- appendTextSectionAfter(m_xGlossaryEntryStart);
-}
-
-void DomainMapper_Impl::fillEmptyFrameProperties(std::vector<beans::PropertyValue>& rFrameProperties, bool bSetAnchorToChar)
-{
- if (bSetAnchorToChar)
- rFrameProperties.push_back(comphelper::makePropertyValue(getPropertyName(PROP_ANCHOR_TYPE), text::TextContentAnchorType_AS_CHARACTER));
-
- uno::Any aEmptyBorder{table::BorderLine2()};
- static const std::vector<PropertyIds> aBorderIds
- = { PROP_BOTTOM_BORDER, PROP_LEFT_BORDER, PROP_RIGHT_BORDER, PROP_TOP_BORDER };
- for (size_t i = 0; i < aBorderIds.size(); ++i)
- rFrameProperties.push_back(comphelper::makePropertyValue(getPropertyName(aBorderIds[i]), aEmptyBorder));
-
- static const std::vector<PropertyIds> aMarginIds
- = { PROP_BOTTOM_MARGIN, PROP_BOTTOM_BORDER_DISTANCE,
- PROP_LEFT_MARGIN, PROP_LEFT_BORDER_DISTANCE,
- PROP_RIGHT_MARGIN, PROP_RIGHT_BORDER_DISTANCE,
- PROP_TOP_MARGIN, PROP_TOP_BORDER_DISTANCE };
- for (size_t i = 0; i < aMarginIds.size(); ++i)
- rFrameProperties.push_back(comphelper::makePropertyValue(getPropertyName(aMarginIds[i]), static_cast<sal_Int32>(0)));
-}
-
-bool DomainMapper_Impl::IsInTOC() const
-{
- if (IsInHeaderFooter())
- return m_bStartTOCHeaderFooter;
- else
- return m_bStartTOC;
-}
-
-void DomainMapper_Impl::ConvertHeaderFooterToTextFrame(bool bDynamicHeightTop, bool bDynamicHeightBottom)
-{
- while (!m_aHeaderFooterTextAppendStack.empty())
- {
- auto& [aTextAppendContext, ePagePartType] = m_aHeaderFooterTextAppendStack.top();
- if ((ePagePartType == PagePartType::Header && !bDynamicHeightTop) || (ePagePartType == PagePartType::Footer && !bDynamicHeightBottom))
- {
- uno::Reference< text::XTextAppend > xTextAppend = aTextAppendContext.xTextAppend;
- uno::Reference< text::XTextCursor > xCursor = xTextAppend->createTextCursor();
- uno::Reference< text::XTextRange > xRangeStart, xRangeEnd;
-
- xRangeStart = xCursor->getStart();
- xCursor->gotoEnd(false);
- xRangeEnd = xCursor->getStart();
-
- std::vector<beans::PropertyValue> aFrameProperties
- {
- comphelper::makePropertyValue("TextWrap", css::text::WrapTextMode_THROUGH),
- comphelper::makePropertyValue(getPropertyName(PROP_HORI_ORIENT), text::HoriOrientation::LEFT),
- comphelper::makePropertyValue(getPropertyName(PROP_OPAQUE), false),
- comphelper::makePropertyValue(getPropertyName(PROP_WIDTH_TYPE), text::SizeType::MIN),
- comphelper::makePropertyValue(getPropertyName(PROP_SIZE_TYPE), text::SizeType::MIN),
- // tdf#143384 If the header/footer started with a table, convertToTextFrame could not
- // convert the table, because it used createTextCursor() -which ignore tables-
- // to set the conversion range.
- // This dummy property is set to make convertToTextFrame to use another CreateTextCursor
- // method that can be parameterized to not ignore tables.
- comphelper::makePropertyValue(getPropertyName(PROP_CURSOR_NOT_IGNORE_TABLES_IN_HF), true)
- };
-
- fillEmptyFrameProperties(aFrameProperties, false);
-
- // If it is a footer, then orient the frame to the bottom
- if (ePagePartType == PagePartType::Footer)
- {
- aFrameProperties.push_back(comphelper::makePropertyValue(getPropertyName(PROP_VERT_ORIENT), text::VertOrientation::BOTTOM));
- }
- uno::Reference<text::XTextAppendAndConvert> xBodyText(xRangeStart->getText(), uno::UNO_QUERY);
- xBodyText->convertToTextFrame(xTextAppend, xRangeEnd, comphelper::containerToSequence(aFrameProperties));
- }
- m_aHeaderFooterTextAppendStack.pop();
- }
-}
-
-namespace
-{
-// Determines if the XText content is empty (no text, no shapes, no tables)
-bool isContentEmpty(uno::Reference<text::XText> const& xText)
-{
- if (!xText.is())
- return true; // no XText means it's empty
-
- uno::Reference<css::lang::XServiceInfo> xTextServiceInfo(xText, uno::UNO_QUERY);
- if (xTextServiceInfo && xTextServiceInfo->getImplementationName() == "SwXHeadFootText")
- return false;
-
- uno::Reference<container::XEnumerationAccess> xEnumAccess(xText->getText(), uno::UNO_QUERY);
- uno::Reference<container::XEnumeration> xEnum = xEnumAccess->createEnumeration();
- while (xEnum->hasMoreElements())
- {
- auto xObject = xEnum->nextElement();
- uno::Reference<text::XTextTable> const xTextTable(xObject, uno::UNO_QUERY);
- if (xTextTable.is())
- return false;
-
- uno::Reference<text::XTextRange> const xParagraph(xObject, uno::UNO_QUERY);
- if (xParagraph.is() && !xParagraph->getString().isEmpty())
- return false;
- }
- return true;
-}
-
-} // end anonymous namespace
-
-void DomainMapper_Impl::PushPageHeaderFooter(PagePartType ePagePartType, PageType eType)
-{
- bool bHeader = ePagePartType == PagePartType::Header;
-
- const PropertyIds ePropIsOn = bHeader ? PROP_HEADER_IS_ON: PROP_FOOTER_IS_ON;
- const PropertyIds ePropShared = bHeader ? PROP_HEADER_IS_SHARED: PROP_FOOTER_IS_SHARED;
- const PropertyIds ePropTextLeft = bHeader ? PROP_HEADER_TEXT_LEFT: PROP_FOOTER_TEXT_LEFT;
- const PropertyIds ePropTextFirst = bHeader ? PROP_HEADER_TEXT_FIRST: PROP_FOOTER_TEXT_FIRST;
- const PropertyIds ePropTextRight = bHeader ? PROP_HEADER_TEXT: PROP_FOOTER_TEXT;
-
- m_bDiscardHeaderFooter = true;
- m_StreamStateStack.top().eSubstreamType = bHeader ? SubstreamType::Header : SubstreamType::Footer;
-
- //get the section context
- SectionPropertyMap* pSectionContext = GetSectionContext();;
- if (!pSectionContext)
- return;
-
- if (!m_bIsNewDoc)
- return; // TODO sw cannot Undo insert header/footer without crashing
-
- uno::Reference<beans::XPropertySet> xPageStyle = pSectionContext->GetPageStyle(*this);
- if (!xPageStyle.is())
- return;
-
- bool bEvenAndOdd = GetSettingsTable()->GetEvenAndOddHeaders();
-
- try
- {
- // Turn on the headers
- xPageStyle->setPropertyValue(getPropertyName(ePropIsOn), uno::Any(true));
-
- // Set both sharing left and first to off so we can import the content regardless of what value
- // the "titlePage" or "evenAndOdd" flags are set (which decide what the sharing is set to in the document).
- xPageStyle->setPropertyValue(getPropertyName(ePropShared), uno::Any(false));
- xPageStyle->setPropertyValue(getPropertyName(PROP_FIRST_IS_SHARED), uno::Any(false));
-
- if (eType == PageType::LEFT)
- {
- if (bHeader)
- {
- pSectionContext->m_bLeftHeader = true;
- pSectionContext->m_bHadLeftHeader = true;
- }
- else
- pSectionContext->m_bLeftFooter = true;
-
- prepareHeaderFooterContent(xPageStyle, ePagePartType, ePropTextLeft, bEvenAndOdd);
- }
- else if (eType == PageType::FIRST)
- {
- if (bHeader)
- {
- pSectionContext->m_bFirstHeader = true;
- pSectionContext->m_bHadFirstHeader = true;
- }
- else
- pSectionContext->m_bFirstFooter = true;
-
- prepareHeaderFooterContent(xPageStyle, ePagePartType, ePropTextFirst, true);
- }
- else
- {
- if (bHeader)
- {
- pSectionContext->m_bRightHeader = true;
- pSectionContext->m_bHadRightHeader = true;
- }
- else
- pSectionContext->m_bRightFooter = true;
-
- prepareHeaderFooterContent(xPageStyle, ePagePartType, ePropTextRight, true);
- }
-
- m_bDiscardHeaderFooter = false; // set only on success!
- }
- catch( const uno::Exception& )
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter.dmapper");
- }
-}
-
-/** Prepares the header/footer text content by first removing the existing
- * content and adding it to the text append stack. */
-void DomainMapper_Impl::prepareHeaderFooterContent(uno::Reference<beans::XPropertySet> const& xPageStyle,
- PagePartType ePagePartType, PropertyIds ePropertyID,
- bool bAppendToHeaderAndFooterTextStack)
-{
- uno::Reference<text::XText> xText;
- xPageStyle->getPropertyValue(getPropertyName(ePropertyID)) >>= xText;
-
- //remove the existing content first
- SectionPropertyMap::removeXTextContent(xText);
-
- auto xTextCursor = m_bIsNewDoc ? uno::Reference<text::XTextCursor>() : xText->createTextCursorByRange(xText->getStart());
- uno::Reference<text::XTextAppend> xTextAppend(xText, uno::UNO_QUERY_THROW);
- m_aTextAppendStack.push(TextAppendContext(xTextAppend, xTextCursor));
- if (bAppendToHeaderAndFooterTextStack)
- m_aHeaderFooterTextAppendStack.push(std::make_pair(TextAppendContext(xTextAppend, xTextCursor), ePagePartType));
-}
-
-bool DomainMapper_Impl::SeenHeaderFooter(PagePartType const partType, PageType const pageType) const
-{
- return m_HeaderFooterSeen.find({partType, pageType}) != m_HeaderFooterSeen.end();
-}
-
-/** Checks if the header and footer content on the text appended stack is empty.
- */
-void DomainMapper_Impl::checkIfHeaderFooterIsEmpty(PagePartType ePagePartType, PageType eType)
-{
- if (m_bDiscardHeaderFooter)
- return;
-
- if (m_aTextAppendStack.empty())
- return;
-
- SectionPropertyMap* pSectionContext = GetSectionContext();
- if (!pSectionContext)
- return;
-
- bool bHeader = ePagePartType == PagePartType::Header;
-
- uno::Reference<beans::XPropertySet> xPageStyle(pSectionContext->GetPageStyle(*this));
-
- if (!xPageStyle.is())
- return;
-
- bool bEmpty = isContentEmpty(m_aTextAppendStack.top().xTextAppend);
-
- if (eType == PageType::FIRST && bEmpty)
- {
- if (bHeader)
- pSectionContext->m_bFirstHeader = false;
- else
- pSectionContext->m_bFirstFooter = false;
- }
- else if (eType == PageType::LEFT && bEmpty)
- {
- if (bHeader)
- pSectionContext->m_bLeftHeader = false;
- else
- pSectionContext->m_bLeftFooter = false;
- }
- else if (eType == PageType::RIGHT && bEmpty)
- {
- if (bHeader)
- pSectionContext->m_bRightHeader = false;
- else
- pSectionContext->m_bRightFooter = false;
- }
-}
-
-void DomainMapper_Impl::PopPageHeaderFooter(PagePartType ePagePartType, PageType eType)
-{
- //header and footer always have an empty paragraph at the end
- //this has to be removed
- RemoveLastParagraph();
-
- checkIfHeaderFooterIsEmpty(ePagePartType, eType);
-
- // clear the "Link To Previous" flag so that the header/footer
- // content is not copied from the previous section
- SectionPropertyMap* pSectionContext = GetSectionContext();
- if (pSectionContext)
- {
- pSectionContext->clearHeaderFooterLinkToPrevious(ePagePartType, eType);
- m_HeaderFooterSeen.emplace(ePagePartType, eType);
- }
-
- if (!m_aTextAppendStack.empty())
- {
- if (!m_bDiscardHeaderFooter)
- {
- m_aTextAppendStack.pop();
- }
- m_bDiscardHeaderFooter = false;
- }
-}
-
-void DomainMapper_Impl::PushFootOrEndnote( bool bIsFootnote )
-{
- SAL_WARN_IF(m_StreamStateStack.top().eSubstreamType != SubstreamType::Body, "writerfilter.dmapper", "PushFootOrEndnote() is called from another foot or endnote");
- m_StreamStateStack.top().eSubstreamType = bIsFootnote ? SubstreamType::Footnote : SubstreamType::Endnote;
- m_StreamStateStack.top().bCheckFirstFootnoteTab = true;
- try
- {
- // Redlines outside the footnote should not affect footnote content
- m_aRedlines.push(std::vector< RedlineParamsPtr >());
-
- // IMHO character styles from footnote labels should be ignored in the edit view of Writer.
- // This adds a hack on top of the following hack to save the style name in the context.
- PropertyMapPtr pTopContext = GetTopContext();
- OUString sFootnoteCharStyleName;
- std::optional< PropertyMap::Property > aProp = pTopContext->getProperty(PROP_CHAR_STYLE_NAME);
- if (aProp)
- aProp->second >>= sFootnoteCharStyleName;
-
- // Remove style reference, if any. This reference did appear here as a side effect of tdf#43017
- // Seems it is not required by LO, but causes side effects during editing. So remove it
- // for footnotes/endnotes to restore original LO behavior here.
- pTopContext->Erase(PROP_CHAR_STYLE_NAME);
-
- uno::Reference< text::XText > xFootnoteText;
- if (GetTextFactory().is())
- xFootnoteText.set( GetTextFactory()->createInstance(
- bIsFootnote ?
- OUString( "com.sun.star.text.Footnote" ) : OUString( "com.sun.star.text.Endnote" )),
- uno::UNO_QUERY_THROW );
- uno::Reference< text::XFootnote > xFootnote( xFootnoteText, uno::UNO_QUERY_THROW );
- pTopContext->SetFootnote(xFootnote, sFootnoteCharStyleName);
- uno::Sequence< beans::PropertyValue > aFontProperties;
- if (GetTopContextOfType(CONTEXT_CHARACTER))
- aFontProperties = GetTopContextOfType(CONTEXT_CHARACTER)->GetPropertyValues();
- appendTextContent( uno::Reference< text::XTextContent >( xFootnoteText, uno::UNO_QUERY_THROW ), aFontProperties );
- m_aTextAppendStack.push(TextAppendContext(uno::Reference< text::XTextAppend >( xFootnoteText, uno::UNO_QUERY_THROW ),
- xFootnoteText->createTextCursorByRange(xFootnoteText->getStart())));
-
- // Redlines for the footnote anchor in the main text content
- std::vector< RedlineParamsPtr > aFootnoteRedline = std::move(m_aRedlines.top());
- m_aRedlines.pop();
- CheckRedline( xFootnote->getAnchor( ) );
- m_aRedlines.push( aFootnoteRedline );
-
- // Try scanning for custom footnote labels
- if (!sFootnoteCharStyleName.isEmpty())
- StartCustomFootnote(pTopContext);
- else
- EndCustomFootnote();
- }
- catch( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION("writerfilter.dmapper", "PushFootOrEndnote");
- }
-}
-
-void DomainMapper_Impl::CreateRedline(uno::Reference<text::XTextRange> const& xRange,
- const RedlineParamsPtr& pRedline)
-{
- if ( !pRedline )
- return;
-
- bool bRedlineMoved = false;
- try
- {
- OUString sType;
- switch ( pRedline->m_nToken & 0xffff )
- {
- case XML_mod:
- sType = getPropertyName( PROP_FORMAT );
- break;
- case XML_moveTo:
- bRedlineMoved = true;
- m_pParaMarkerRedlineMove = pRedline.get();
- [[fallthrough]];
- case XML_ins:
- sType = getPropertyName( PROP_INSERT );
- break;
- case XML_moveFrom:
- bRedlineMoved = true;
- m_pParaMarkerRedlineMove = pRedline.get();
- [[fallthrough]];
- case XML_del:
- sType = getPropertyName( PROP_DELETE );
- break;
- case XML_ParagraphFormat:
- sType = getPropertyName( PROP_PARAGRAPH_FORMAT );
- break;
- default:
- throw lang::IllegalArgumentException("illegal redline token type", nullptr, 0);
- }
- beans::PropertyValues aRedlineProperties( 4 );
- beans::PropertyValue * pRedlineProperties = aRedlineProperties.getArray( );
- pRedlineProperties[0].Name = getPropertyName( PROP_REDLINE_AUTHOR );
- pRedlineProperties[0].Value <<= pRedline->m_sAuthor;
- pRedlineProperties[1].Name = getPropertyName( PROP_REDLINE_DATE_TIME );
- util::DateTime aDateTime = ConversionHelper::ConvertDateStringToDateTime( pRedline->m_sDate );
- // tdf#146171 import not specified w:date (or specified as zero date "0-00-00")
- // as Epoch time to avoid of losing change tracking data during ODF roundtrip
- if ( aDateTime.Year == 0 && aDateTime.Month == 0 && aDateTime.Day == 0 )
- {
- aDateTime.Year = 1970;
- aDateTime.Month = 1;
- aDateTime.Day = 1;
- }
- pRedlineProperties[1].Value <<= aDateTime;
- pRedlineProperties[2].Name = getPropertyName( PROP_REDLINE_REVERT_PROPERTIES );
- pRedlineProperties[2].Value <<= pRedline->m_aRevertProperties;
-
- sal_uInt32 nRedlineMovedID = 0;
- if (bRedlineMoved)
- {
- if (!m_sCurrentBkmkId.isEmpty())
- {
- nRedlineMovedID = 1;
- BookmarkMap_t::iterator aBookmarkIter = m_aBookmarkMap.find(m_sCurrentBkmkId);
- if (aBookmarkIter != m_aBookmarkMap.end())
- {
- OUString sMoveID = aBookmarkIter->second.m_sBookmarkName;
- auto aIter = m_aRedlineMoveIDs.end();
-
- if (sMoveID.indexOf("__RefMoveFrom__") >= 0)
- {
- aIter = std::find(m_aRedlineMoveIDs.begin(), m_aRedlineMoveIDs.end(),
- sMoveID.subView(15));
- }
- else if (sMoveID.indexOf("__RefMoveTo__") >= 0)
- {
- aIter = std::find(m_aRedlineMoveIDs.begin(), m_aRedlineMoveIDs.end(),
- sMoveID.subView(13));
- };
-
- if (aIter != m_aRedlineMoveIDs.end())
- {
- nRedlineMovedID = aIter - m_aRedlineMoveIDs.begin() + 2;
- m_nLastRedlineMovedID = nRedlineMovedID;
- }
- }
- }
- else
- nRedlineMovedID = m_nLastRedlineMovedID;
- }
- pRedlineProperties[3].Name = "RedlineMoved";
- pRedlineProperties[3].Value <<= nRedlineMovedID;
-
- if (!m_bIsActualParagraphFramed)
- {
- uno::Reference < text::XRedline > xRedline( xRange, uno::UNO_QUERY_THROW );
- xRedline->makeRedline( sType, aRedlineProperties );
- }
- // store frame and (possible floating) table redline data for restoring them after frame conversion
- enum StoredRedlines eType;
- if (m_bIsActualParagraphFramed || 0 < m_StreamStateStack.top().nTableDepth)
- eType = StoredRedlines::FRAME;
- else if (IsInFootOrEndnote())
- eType = IsInFootnote() ? StoredRedlines::FOOTNOTE : StoredRedlines::ENDNOTE;
- else
- eType = StoredRedlines::NONE;
-
- if (eType != StoredRedlines::NONE)
- {
- m_aStoredRedlines[eType].emplace_back(xRange);
- m_aStoredRedlines[eType].emplace_back(sType);
- m_aStoredRedlines[eType].emplace_back(aRedlineProperties);
- }
- }
- catch( const uno::Exception & )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "in makeRedline" );
- }
-}
-
-void DomainMapper_Impl::CheckParaMarkerRedline( uno::Reference< text::XTextRange > const& xRange )
-{
- if ( m_pParaMarkerRedline )
- {
- CreateRedline( xRange, m_pParaMarkerRedline );
- if ( m_pParaMarkerRedline )
- {
- m_pParaMarkerRedline.clear();
- m_currentRedline.clear();
- }
- }
- else if ( m_pParaMarkerRedlineMove && m_bIsParaMarkerMove )
- {
- // terminating moveFrom/moveTo redline removes also the paragraph mark
- CreateRedline( xRange, m_pParaMarkerRedlineMove );
- }
- if ( m_pParaMarkerRedlineMove )
- {
- m_pParaMarkerRedlineMove.clear();
- EndParaMarkerMove();
- }
-}
-
-void DomainMapper_Impl::CheckRedline( uno::Reference< text::XTextRange > const& xRange )
-{
- // Writer core "officially" does not like overlapping redlines, and its UNO interface is stupid enough
- // to not prevent that. However, in practice in fact everything appears to work fine (except for the debug warnings
- // about redline table corruption, which may possibly be harmless in reality). So leave this as it is, since this
- // is a better representation of how the changes happened. If this will ever become a problem, overlapping redlines
- // will need to be merged into one, just like doing the changes in the UI does, which will lose some information
- // (and so if that happens, it may be better to fix Writer).
- // Create the redlines here from lowest (formats) to highest (inserts/removals) priority, since the last one is
- // what Writer presents graphically, so this will show deletes as deleted text and not as just formatted text being there.
- bool bUsedRange = m_aRedlines.top().size() > 0 || (GetTopContextOfType(CONTEXT_CHARACTER) &&
- GetTopContextOfType(CONTEXT_CHARACTER)->Redlines().size() > 0);
-
- // only export ParagraphFormat, when there is no other redline in the same text portion to avoid missing redline compression,
- // but always export the first ParagraphFormat redline in a paragraph to keep the paragraph style change data for rejection
- if ((!bUsedRange || !m_StreamStateStack.top().bParaChanged)
- && GetTopContextOfType(CONTEXT_PARAGRAPH))
- {
- std::vector<RedlineParamsPtr>& avRedLines = GetTopContextOfType(CONTEXT_PARAGRAPH)->Redlines();
- for( const auto& rRedline : avRedLines )
- CreateRedline( xRange, rRedline );
- }
- if( GetTopContextOfType(CONTEXT_CHARACTER) )
- {
- std::vector<RedlineParamsPtr>& avRedLines = GetTopContextOfType(CONTEXT_CHARACTER)->Redlines();
- for( const auto& rRedline : avRedLines )
- CreateRedline( xRange, rRedline );
- }
- for (const auto& rRedline : m_aRedlines.top() )
- CreateRedline( xRange, rRedline );
-}
-
-void DomainMapper_Impl::StartParaMarkerChange( )
-{
- m_bIsParaMarkerChange = true;
-}
-
-void DomainMapper_Impl::EndParaMarkerChange( )
-{
- m_bIsParaMarkerChange = false;
- m_previousRedline = m_currentRedline;
- m_currentRedline.clear();
-}
-
-void DomainMapper_Impl::StartParaMarkerMove( )
-{
- m_bIsParaMarkerMove = true;
-}
-
-void DomainMapper_Impl::EndParaMarkerMove( )
-{
- m_bIsParaMarkerMove = false;
-}
-
-void DomainMapper_Impl::StartCustomFootnote(const PropertyMapPtr pContext)
-{
- if (pContext == m_pFootnoteContext)
- return;
-
- assert(pContext->GetFootnote().is());
- m_StreamStateStack.top().bHasFootnoteStyle = true;
- m_StreamStateStack.top().bCheckFootnoteStyle = !pContext->GetFootnoteStyle().isEmpty();
- m_pFootnoteContext = pContext;
-}
-
-void DomainMapper_Impl::EndCustomFootnote()
-{
- m_StreamStateStack.top().bHasFootnoteStyle = false;
- m_StreamStateStack.top().bCheckFootnoteStyle = false;
-}
-
-void DomainMapper_Impl::PushAnnotation()
-{
- try
- {
- m_StreamStateStack.top().eSubstreamType = SubstreamType::Annotation;
- if (!GetTextFactory().is())
- return;
- m_xAnnotationField.set( GetTextFactory()->createInstance( "com.sun.star.text.TextField.Annotation" ),
- uno::UNO_QUERY_THROW );
- uno::Reference< text::XText > xAnnotationText;
- m_xAnnotationField->getPropertyValue("TextRange") >>= xAnnotationText;
- m_aTextAppendStack.push(TextAppendContext(uno::Reference< text::XTextAppend >( xAnnotationText, uno::UNO_QUERY_THROW ),
- m_bIsNewDoc ? uno::Reference<text::XTextCursor>() : xAnnotationText->createTextCursorByRange(xAnnotationText->getStart())));
- }
- catch( const uno::Exception&)
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter.dmapper");
- }
-}
-
-static void lcl_CopyRedlines(
- uno::Reference< text::XText > const& xSrc,
- std::deque<css::uno::Any>& rRedlines,
- std::vector<sal_Int32>& redPos,
- std::vector<sal_Int32>& redLen,
- sal_Int32& redIdx)
-{
- redIdx = -1;
- for( size_t i = 0; i < rRedlines.size(); i+=3)
- {
- uno::Reference< text::XTextRange > xRange;
- rRedlines[i] >>= xRange;
-
- // is this a redline of the temporary footnote?
- uno::Reference<text::XTextCursor> xRangeCursor;
- try
- {
- xRangeCursor = xSrc->createTextCursorByRange( xRange );
- }
- catch( const uno::Exception& )
- {
- }
- if (xRangeCursor.is())
- {
- redIdx = i;
- sal_Int32 nLen = xRange->getString().getLength();
- redLen.push_back(nLen);
- xRangeCursor->gotoRange(xSrc->getStart(), true);
- redPos.push_back(xRangeCursor->getString().getLength() - nLen);
- }
- else
- {
- // we have already found all redlines of the footnote,
- // skip checking the redlines of the other footnotes
- if (redIdx > -1)
- break;
- // failed createTextCursorByRange(), for example, table inside the frame
- redLen.push_back(-1);
- redPos.push_back(-1);
- }
- }
-}
-
-static void lcl_PasteRedlines(
- uno::Reference< text::XText > const& xDest,
- std::deque<css::uno::Any>& rRedlines,
- std::vector<sal_Int32>& redPos,
- std::vector<sal_Int32>& redLen,
- sal_Int32 redIdx)
-{
- // create redlines in the copied footnote
- for( size_t i = 0; redIdx > -1 && i <= sal::static_int_cast<size_t>(redIdx); i+=3)
- {
- OUString sType;
- beans::PropertyValues aRedlineProperties( 3 );
- // skip failed createTextCursorByRange()
- if (redPos[i/3] == -1)
- continue;
- rRedlines[i+1] >>= sType;
- rRedlines[i+2] >>= aRedlineProperties;
- uno::Reference< text::XTextCursor > xCrsr = xDest->getText()->createTextCursor();
- xCrsr->goRight(redPos[i/3], false);
- xCrsr->goRight(redLen[i/3], true);
- uno::Reference < text::XRedline > xRedline( xCrsr, uno::UNO_QUERY_THROW );
- try {
- xRedline->makeRedline( sType, aRedlineProperties );
- }
- catch(const uno::Exception&)
- {
- // ignore (footnotes of tracked deletions)
- }
- }
-}
-
-bool DomainMapper_Impl::CopyTemporaryNotes(
- uno::Reference< text::XFootnote > xNoteSrc,
- uno::Reference< text::XFootnote > xNoteDest )
-{
- if (!m_bSaxError && xNoteSrc != xNoteDest)
- {
- uno::Reference< text::XText > xSrc( xNoteSrc, uno::UNO_QUERY_THROW );
- uno::Reference< text::XText > xDest( xNoteDest, uno::UNO_QUERY_THROW );
- uno::Reference< text::XTextCopy > xTxt, xTxt2;
- xTxt.set( xSrc, uno::UNO_QUERY_THROW );
- xTxt2.set( xDest, uno::UNO_QUERY_THROW );
- xTxt2->copyText( xTxt );
-
- // copy its redlines
- std::vector<sal_Int32> redPos, redLen;
- sal_Int32 redIdx;
- enum StoredRedlines eType = IsInFootnote() ? StoredRedlines::FOOTNOTE : StoredRedlines::ENDNOTE;
- lcl_CopyRedlines(xSrc, m_aStoredRedlines[eType], redPos, redLen, redIdx);
- lcl_PasteRedlines(xDest, m_aStoredRedlines[eType], redPos, redLen, redIdx);
-
- // remove processed redlines
- for( size_t i = 0; redIdx > -1 && i <= sal::static_int_cast<size_t>(redIdx) + 2; i++)
- m_aStoredRedlines[eType].pop_front();
-
- return true;
- }
-
- return false;
-}
-
-void DomainMapper_Impl::RemoveTemporaryFootOrEndnotes()
-{
- uno::Reference< text::XFootnotesSupplier> xFootnotesSupplier( GetTextDocument(), uno::UNO_QUERY );
- uno::Reference< text::XEndnotesSupplier> xEndnotesSupplier( GetTextDocument(), uno::UNO_QUERY );
- uno::Reference< text::XFootnote > xNote;
- if (GetFootnoteCount() > 0)
- {
- auto xFootnotes = xFootnotesSupplier->getFootnotes();
- if ( m_nFirstFootnoteIndex > 0 )
- {
- uno::Reference< text::XFootnote > xFirstNote;
- xFootnotes->getByIndex(0) >>= xFirstNote;
- uno::Reference< text::XText > xText( xFirstNote, uno::UNO_QUERY_THROW );
- xText->setString("");
- xFootnotes->getByIndex(m_nFirstFootnoteIndex) >>= xNote;
- CopyTemporaryNotes(xNote, xFirstNote);
- }
- for (sal_Int32 i = GetFootnoteCount(); i > 0; --i)
- {
- xFootnotes->getByIndex(i) >>= xNote;
- xNote->getAnchor()->setString("");
- }
- }
- if (GetEndnoteCount() > 0)
- {
- auto xEndnotes = xEndnotesSupplier->getEndnotes();
- if ( m_nFirstEndnoteIndex > 0 )
- {
- uno::Reference< text::XFootnote > xFirstNote;
- xEndnotes->getByIndex(0) >>= xFirstNote;
- uno::Reference< text::XText > xText( xFirstNote, uno::UNO_QUERY_THROW );
- xText->setString("");
- xEndnotes->getByIndex(m_nFirstEndnoteIndex) >>= xNote;
- CopyTemporaryNotes(xNote, xFirstNote);
- }
- for (sal_Int32 i = GetEndnoteCount(); i > 0; --i)
- {
- xEndnotes->getByIndex(i) >>= xNote;
- xNote->getAnchor()->setString("");
- }
- }
-}
-
-static void lcl_convertToNoteIndices(std::deque<sal_Int32>& rNoteIds, sal_Int32& rFirstNoteIndex)
-{
- // rNoteIds contains XML footnote identifiers in the loaded order of the footnotes
- // (the same order as in footnotes.xml), i.e. it maps temporary footnote positions to the
- // identifiers. For example: Ids[0] = 100; Ids[1] = -1, Ids[2] = 5.
- // To copy the footnotes in their final place, create an array, which map the (normalized)
- // footnote identifiers to the temporary footnote positions. Using the previous example,
- // Pos[0] = 1; Pos[1] = 2; Pos[2] = 0 (where [0], [1], [2] are the normalized
- // -1, 5 and 100 identifiers).
- std::deque<sal_Int32> aSortedIds = rNoteIds;
- std::sort(aSortedIds.begin(), aSortedIds.end());
- std::map<sal_Int32, size_t> aMapIds;
- // normalize footnote identifiers to 0, 1, 2 ...
- for (size_t i = 0; i < aSortedIds.size(); ++i)
- aMapIds[aSortedIds[i]] = i;
- // reusing rNoteIds, create the Pos array to map normalized identifiers to the loaded positions
- std::deque<sal_Int32> aOrigNoteIds = rNoteIds;
- for (size_t i = 0; i < rNoteIds.size(); ++i)
- rNoteIds[aMapIds[aOrigNoteIds[i]]] = i;
- rFirstNoteIndex = rNoteIds.front();
- rNoteIds.pop_front();
-}
-
-void DomainMapper_Impl::PopFootOrEndnote()
-{
- // content of the footnotes were inserted after the first footnote in temporary footnotes,
- // restore the content of the actual footnote by copying its content from the first
- // (remaining) temporary footnote and remove the temporary footnote.
- uno::Reference< text::XFootnotesSupplier> xFootnotesSupplier( GetTextDocument(), uno::UNO_QUERY );
- uno::Reference< text::XEndnotesSupplier> xEndnotesSupplier( GetTextDocument(), uno::UNO_QUERY );
- bool bCopied = false;
- if ( IsInFootOrEndnote() && ( ( IsInFootnote() && GetFootnoteCount() > -1 && xFootnotesSupplier.is() ) ||
- ( !IsInFootnote() && GetEndnoteCount() > -1 && xEndnotesSupplier.is() ) ) )
- {
- uno::Reference< text::XFootnote > xNoteFirst, xNoteLast;
- auto xFootnotes = xFootnotesSupplier->getFootnotes();
- auto xEndnotes = xEndnotesSupplier->getEndnotes();
- if ( ( ( IsInFootnote() && xFootnotes->getCount() > 1 &&
- ( xFootnotes->getByIndex(xFootnotes->getCount()-1) >>= xNoteLast ) ) ||
- ( !IsInFootnote() && xEndnotes->getCount() > 1 &&
- ( xEndnotes->getByIndex(xEndnotes->getCount()-1) >>= xNoteLast ) )
- ) && xNoteLast->getLabel().isEmpty() )
- {
- // copy content of the next temporary footnote
- try
- {
- if ( IsInFootnote() && !m_aFootnoteIds.empty() )
- {
- if ( m_nFirstFootnoteIndex == -1 )
- lcl_convertToNoteIndices(m_aFootnoteIds, m_nFirstFootnoteIndex);
- if (m_aFootnoteIds.empty()) // lcl_convertToNoteIndices pops m_aFootnoteIds
- m_bSaxError = true;
- else
- {
- xFootnotes->getByIndex(m_aFootnoteIds.front()) >>= xNoteFirst;
- m_aFootnoteIds.pop_front();
- }
- }
- else if ( !IsInFootnote() && !m_aEndnoteIds.empty() )
- {
- if ( m_nFirstEndnoteIndex == -1 )
- lcl_convertToNoteIndices(m_aEndnoteIds, m_nFirstEndnoteIndex);
- if (m_aEndnoteIds.empty()) // lcl_convertToNoteIndices pops m_aEndnoteIds
- m_bSaxError = true;
- else
- {
- xEndnotes->getByIndex(m_aEndnoteIds.front()) >>= xNoteFirst;
- m_aEndnoteIds.pop_front();
- }
- }
- else
- m_bSaxError = true;
- }
- catch (uno::Exception const&)
- {
- TOOLS_WARN_EXCEPTION("writerfilter.dmapper", "Cannot insert footnote/endnote");
- m_bSaxError = true;
- }
-
- bCopied = CopyTemporaryNotes(xNoteFirst, xNoteLast);
- }
- }
-
- if (!IsRTFImport() && !bCopied)
- RemoveLastParagraph();
-
- if (!m_aTextAppendStack.empty())
- m_aTextAppendStack.pop();
-
- if (m_aRedlines.size() == 1)
- {
- SAL_WARN("writerfilter.dmapper", "PopFootOrEndnote() is called without PushFootOrEndnote()?");
- return;
- }
- m_aRedlines.pop();
- m_eSkipFootnoteState = SkipFootnoteSeparator::OFF;
- m_pFootnoteContext = nullptr;
-}
-
-void DomainMapper_Impl::PopAnnotation()
-{
- RemoveLastParagraph();
-
- m_aTextAppendStack.pop();
-
- try
- {
- if (m_bAnnotationResolved)
- m_xAnnotationField->setPropertyValue("Resolved", uno::Any(true));
-
- m_xAnnotationField->setPropertyValue("ParaIdParent", uno::Any(m_sAnnotationParent));
- m_xAnnotationField->setPropertyValue("ParaId", uno::Any(m_sAnnotationImportedParaId));
-
- // See if the annotation will be a single position or a range.
- if (m_nAnnotationId == -1 || !m_aAnnotationPositions[m_nAnnotationId].m_xStart.is() || !m_aAnnotationPositions[m_nAnnotationId].m_xEnd.is())
- {
- uno::Sequence< beans::PropertyValue > aEmptyProperties;
- uno::Reference< text::XTextContent > xContent( m_xAnnotationField, uno::UNO_QUERY_THROW );
- appendTextContent( xContent, aEmptyProperties );
- CheckRedline( xContent->getAnchor( ) );
- }
- else
- {
- AnnotationPosition& aAnnotationPosition = m_aAnnotationPositions[m_nAnnotationId];
- // Create a range that points to the annotation start/end.
- uno::Reference<text::XText> const xText = aAnnotationPosition.m_xStart->getText();
- uno::Reference<text::XTextCursor> const xCursor = xText->createTextCursorByRange(aAnnotationPosition.m_xStart);
-
- bool bMarker = false;
- uno::Reference<text::XTextRangeCompare> xTextRangeCompare(xText, uno::UNO_QUERY);
- if (xTextRangeCompare->compareRegionStarts(aAnnotationPosition.m_xStart, aAnnotationPosition.m_xEnd) == 0)
- {
- // Insert a marker so that comment around an anchored image is not collapsed during
- // insertion.
- xText->insertString(xCursor, "x", false);
- bMarker = true;
- }
-
- xCursor->gotoRange(aAnnotationPosition.m_xEnd, true);
- uno::Reference<text::XTextRange> const xTextRange(xCursor, uno::UNO_QUERY_THROW);
-
- // Attach the annotation to the range.
- uno::Reference<text::XTextAppend> const xTextAppend = m_aTextAppendStack.top().xTextAppend;
- xTextAppend->insertTextContent(xTextRange, uno::Reference<text::XTextContent>(m_xAnnotationField, uno::UNO_QUERY_THROW), !xCursor->isCollapsed());
-
- if (bMarker)
- {
- // Remove the marker.
- xCursor->goLeft(1, true);
- xCursor->setString(OUString());
- }
- }
- m_aAnnotationPositions.erase( m_nAnnotationId );
- }
- catch (uno::Exception const&)
- {
- TOOLS_WARN_EXCEPTION("writerfilter.dmapper", "Cannot insert annotation field");
- }
-
- m_xAnnotationField.clear();
- m_sAnnotationParent.clear();
- m_sAnnotationImportedParaId.clear();
- m_nAnnotationId = -1;
- m_bAnnotationResolved = false;
-}
-
-void DomainMapper_Impl::PushPendingShape( const uno::Reference< drawing::XShape > & xShape )
-{
- m_aPendingShapes.push_back(xShape);
-}
-
-uno::Reference<drawing::XShape> DomainMapper_Impl::PopPendingShape()
-{
- uno::Reference<drawing::XShape> xRet;
- if (!m_aPendingShapes.empty())
- {
- xRet = m_aPendingShapes.front();
- m_aPendingShapes.pop_front();
- }
- return xRet;
-}
-
-void DomainMapper_Impl::PushShapeContext( const uno::Reference< drawing::XShape > & xShape )
-{
- // Append these early, so the context and the table manager stack will be
- // in sync, even if the text append stack is empty.
- appendTableManager();
- appendTableHandler();
- getTableManager().startLevel();
-
- if (m_aTextAppendStack.empty())
- return;
- uno::Reference<text::XTextAppend> xTextAppend = m_aTextAppendStack.top().xTextAppend;
-
- try
- {
- uno::Reference< lang::XServiceInfo > xSInfo( xShape, uno::UNO_QUERY_THROW );
- if (xSInfo->supportsService("com.sun.star.drawing.GroupShape"))
- {
- // Textboxes in shapes do not support styles, so check saved style information and apply properties directly to the child shapes.
- const uno::Reference<drawing::XShapes> xShapes(xShape, uno::UNO_QUERY);
- const sal_uInt32 nShapeCount = xShapes.is() ? xShapes->getCount() : 0;
- for ( sal_uInt32 i = 0; i < nShapeCount; ++i )
- {
- try
- {
- uno::Reference<text::XTextRange> xFrame(xShapes->getByIndex(i), uno::UNO_QUERY);
- uno::Reference<beans::XPropertySet> xFramePropertySet;
- if (xFrame)
- xFramePropertySet.set(xFrame, uno::UNO_QUERY_THROW);
- uno::Reference<beans::XPropertySet> xShapePropertySet(xShapes->getByIndex(i), uno::UNO_QUERY_THROW);
-
- comphelper::SequenceAsHashMap aGrabBag( xShapePropertySet->getPropertyValue("CharInteropGrabBag") );
-
- // only VML import has checked for style. Don't apply default parastyle properties to other imported shapes
- // - except for fontsize - to maintain compatibility with previous versions of LibreOffice.
- const bool bOnlyApplyCharHeight = !aGrabBag["mso-pStyle"].hasValue();
-
- OUString sStyleName;
- aGrabBag["mso-pStyle"] >>= sStyleName;
- StyleSheetEntryPtr pEntry = GetStyleSheetTable()->FindStyleSheetByISTD( sStyleName );
- if ( !pEntry )
- {
- // Use default style even in ambiguous cases (where multiple styles were defined) since MOST styles inherit
- // MOST of their properties from the default style. In the ambiguous case, we have to accept some kind of compromise
- // and the default paragraph style ought to be the safest one... (compared to DocDefaults or program defaults)
- pEntry = GetStyleSheetTable()->FindStyleSheetByConvertedStyleName( GetDefaultParaStyleName() );
- }
- if ( pEntry )
- {
- // The Ids here come from oox/source/vml/vmltextbox.cxx.
- // It probably could safely expand to all Ids that shapes support.
- const PropertyIds eIds[] = {
- PROP_CHAR_HEIGHT,
- PROP_CHAR_FONT_NAME,
- PROP_CHAR_WEIGHT,
- PROP_CHAR_CHAR_KERNING,
- PROP_CHAR_COLOR,
- PROP_PARA_ADJUST
- };
- const uno::Reference<beans::XPropertyState> xShapePropertyState(xShapePropertySet, uno::UNO_QUERY_THROW);
- for ( const auto& eId : eIds )
- {
- try
- {
- if ( bOnlyApplyCharHeight && eId != PROP_CHAR_HEIGHT )
- continue;
-
- const OUString & sPropName = getPropertyName(eId);
- if ( beans::PropertyState_DEFAULT_VALUE == xShapePropertyState->getPropertyState(sPropName) )
- {
- const uno::Any aProp = GetPropertyFromStyleSheet(eId, pEntry, /*bDocDefaults=*/true, /*bPara=*/true);
- if (aProp.hasValue())
- {
- if (xFrame)
- xFramePropertySet->setPropertyValue(sPropName, aProp);
- else
- xShapePropertySet->setPropertyValue(sPropName, aProp);
- }
- }
- }
- catch (const uno::Exception&)
- {
- TOOLS_WARN_EXCEPTION( "writerfilter.dmapper", "PushShapeContext() text stylesheet property exception" );
- }
- }
- }
- }
- catch (const uno::Exception&)
- {
- TOOLS_WARN_EXCEPTION( "writerfilter.dmapper", "PushShapeContext()" );
- }
- }
-
- // A GroupShape doesn't implement text::XTextRange, but appending
- // an empty reference to the stacks still makes sense, because this
- // way bToRemove can be set, and we won't end up with duplicated
- // shapes for OLE objects.
- m_aTextAppendStack.push(TextAppendContext(uno::Reference<text::XTextAppend>(xShape, uno::UNO_QUERY), uno::Reference<text::XTextCursor>()));
- uno::Reference<text::XTextContent> xTxtContent(xShape, uno::UNO_QUERY);
- m_aAnchoredStack.push(AnchoredContext(xTxtContent));
- }
- else if (xSInfo->supportsService("com.sun.star.drawing.OLE2Shape"))
- {
- // OLE2Shape from oox should be converted to a TextEmbeddedObject for sw.
- m_aTextAppendStack.push(TextAppendContext(uno::Reference<text::XTextAppend>(xShape, uno::UNO_QUERY), uno::Reference<text::XTextCursor>()));
- uno::Reference<text::XTextContent> xTextContent(xShape, uno::UNO_QUERY);
- m_aAnchoredStack.push(AnchoredContext(xTextContent));
- uno::Reference<beans::XPropertySet> xShapePropertySet(xShape, uno::UNO_QUERY);
-
- m_StreamStateStack.top().xEmbedded.set(m_xTextFactory->createInstance("com.sun.star.text.TextEmbeddedObject"), uno::UNO_QUERY_THROW);
- uno::Reference<beans::XPropertySet> xEmbeddedProperties(m_StreamStateStack.top().xEmbedded, uno::UNO_QUERY_THROW);
- xEmbeddedProperties->setPropertyValue(getPropertyName(PROP_EMBEDDED_OBJECT), xShapePropertySet->getPropertyValue(getPropertyName(PROP_EMBEDDED_OBJECT)));
- xEmbeddedProperties->setPropertyValue(getPropertyName(PROP_ANCHOR_TYPE), uno::Any(text::TextContentAnchorType_AS_CHARACTER));
- // So that the original bitmap-only shape will be replaced by the embedded object.
- m_aAnchoredStack.top().bToRemove = true;
- m_aTextAppendStack.pop();
- appendTextContent(m_StreamStateStack.top().xEmbedded, uno::Sequence<beans::PropertyValue>());
- }
- else
- {
- uno::Reference<text::XTextRange> xShapeTextRange(xShape, uno::UNO_QUERY_THROW);
- // Add the shape to the text append stack
- uno::Reference<text::XTextAppend> xShapeTextAppend(xShape, uno::UNO_QUERY_THROW);
- uno::Reference<text::XTextCursor> xTextCursor;
- if (!m_bIsNewDoc)
- {
- xTextCursor = xShapeTextRange->getText()->createTextCursorByRange(
- xShapeTextRange->getStart());
- }
- TextAppendContext aContext(xShapeTextAppend, xTextCursor);
- m_aTextAppendStack.push(aContext);
-
- // Add the shape to the anchored objects stack
- uno::Reference< text::XTextContent > xTxtContent( xShape, uno::UNO_QUERY_THROW );
- m_aAnchoredStack.push( AnchoredContext(xTxtContent) );
-
- uno::Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY_THROW );
-#ifdef DBG_UTIL
- TagLogger::getInstance().unoPropertySet(xProps);
-#endif
- text::TextContentAnchorType nAnchorType(text::TextContentAnchorType_AT_PARAGRAPH);
- xProps->getPropertyValue(getPropertyName( PROP_ANCHOR_TYPE )) >>= nAnchorType;
- bool checkZOrderStatus = false;
- if (xSInfo->supportsService("com.sun.star.text.TextFrame"))
- {
- SetIsTextFrameInserted(true);
- // Extract the special "btLr text frame" mode, requested by oox, if needed.
- // Extract vml ZOrder from FrameInteropGrabBag
- uno::Reference<beans::XPropertySet> xShapePropertySet(xShape, uno::UNO_QUERY);
- uno::Sequence<beans::PropertyValue> aGrabBag;
- xShapePropertySet->getPropertyValue("FrameInteropGrabBag") >>= aGrabBag;
-
- for (const auto& rProp : aGrabBag)
- {
- if (rProp.Name == "VML-Z-ORDER")
- {
- GraphicZOrderHelper& rZOrderHelper = m_rDMapper.graphicZOrderHelper();
- sal_Int64 zOrder(0);
- rProp.Value >>= zOrder;
- GraphicZOrderHelper::adjustRelativeHeight(zOrder, /*IsZIndex=*/true,
- zOrder < 0, IsInHeaderFooter());
- xShapePropertySet->setPropertyValue("ZOrder",
- uno::Any(rZOrderHelper.findZOrder(zOrder, /*LastDuplicateWins*/true)));
- rZOrderHelper.addItem(xShapePropertySet, zOrder);
- xShapePropertySet->setPropertyValue(getPropertyName( PROP_OPAQUE ), uno::Any( zOrder >= 0 ) );
- checkZOrderStatus = true;
- }
- else if ( rProp.Name == "TxbxHasLink" )
- {
- //Chaining of textboxes will happen in ~DomainMapper_Impl
- //i.e when all the textboxes are read and all its attributes
- //have been set ( basically the Name/LinkedDisplayName )
- //which is set in Graphic Import.
- m_vTextFramesForChaining.push_back(xShape);
- }
- }
-
- uno::Reference<text::XTextContent> xTextContent(xShape, uno::UNO_QUERY_THROW);
- uno::Reference<text::XTextRange> xTextRange(xTextAppend->createTextCursorByRange(xTextAppend->getEnd()), uno::UNO_QUERY_THROW);
- xTextAppend->insertTextContent(xTextRange, xTextContent, false);
-
- uno::Reference<beans::XPropertySet> xPropertySet(xTextContent, uno::UNO_QUERY);
- // we need to re-set this value to xTextContent, then only values are preserved.
- xPropertySet->setPropertyValue("FrameInteropGrabBag",uno::Any(aGrabBag));
- }
- else if (nAnchorType == text::TextContentAnchorType_AS_CHARACTER)
- {
- // Fix spacing for as-character objects. If the paragraph has CT_Spacing_after set,
- // it needs to be set on the object too, as that's what object placement code uses.
- PropertyMapPtr paragraphContext = GetTopContextOfType( CONTEXT_PARAGRAPH );
- std::optional<PropertyMap::Property> aPropMargin = paragraphContext->getProperty(PROP_PARA_BOTTOM_MARGIN);
- if(aPropMargin)
- xProps->setPropertyValue( getPropertyName( PROP_BOTTOM_MARGIN ), aPropMargin->second );
- }
- else
- {
- uno::Reference<beans::XPropertySet> xShapePropertySet(xShape, uno::UNO_QUERY);
- uno::Sequence<beans::PropertyValue> aGrabBag;
- xShapePropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBag;
- for (const auto& rProp : aGrabBag)
- {
- if (rProp.Name == "VML-Z-ORDER")
- {
- GraphicZOrderHelper& rZOrderHelper = m_rDMapper.graphicZOrderHelper();
- sal_Int64 zOrder(0);
- rProp.Value >>= zOrder;
- GraphicZOrderHelper::adjustRelativeHeight(zOrder, /*IsZIndex=*/true,
- zOrder < 0, IsInHeaderFooter());
- xShapePropertySet->setPropertyValue("ZOrder",
- uno::Any(rZOrderHelper.findZOrder(zOrder, /*LastDuplicateWins*/true)));
- rZOrderHelper.addItem(xShapePropertySet, zOrder);
- xShapePropertySet->setPropertyValue(getPropertyName( PROP_OPAQUE ), uno::Any( zOrder >= 0 ) );
- checkZOrderStatus = true;
- }
- else if ( rProp.Name == "TxbxHasLink" )
- {
- //Chaining of textboxes will happen in ~DomainMapper_Impl
- //i.e when all the textboxes are read and all its attributes
- //have been set ( basically the Name/LinkedDisplayName )
- //which is set in Graphic Import.
- m_vTextFramesForChaining.push_back(xShape);
- }
- }
-
- if(IsSdtEndBefore())
- {
- uno::Reference< beans::XPropertySetInfo > xPropSetInfo;
- if(xShapePropertySet.is())
- {
- xPropSetInfo = xShapePropertySet->getPropertySetInfo();
- if (xPropSetInfo.is() && xPropSetInfo->hasPropertyByName("InteropGrabBag"))
- {
- uno::Sequence<beans::PropertyValue> aShapeGrabBag( comphelper::InitPropertySequence({
- { "SdtEndBefore", uno::Any(true) }
- }));
- xShapePropertySet->setPropertyValue("InteropGrabBag",uno::Any(aShapeGrabBag));
- }
- }
- }
- }
- if (!IsInHeaderFooter() && !checkZOrderStatus)
- xProps->setPropertyValue(
- getPropertyName( PROP_OPAQUE ),
- uno::Any( true ) );
- }
- m_StreamStateStack.top().bParaChanged = true;
- getTableManager().setIsInShape(true);
- }
- catch ( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION("writerfilter.dmapper", "Exception when adding shape");
- }
-}
-/*
- * Updating chart height and width after reading the actual values from wp:extent
-*/
-void DomainMapper_Impl::UpdateEmbeddedShapeProps(const uno::Reference< drawing::XShape > & xShape)
-{
- if (!xShape.is())
- return;
-
- uno::Reference<beans::XPropertySet> const xEmbeddedProperties(m_StreamStateStack.top().xEmbedded, uno::UNO_QUERY_THROW);
- awt::Size aSize = xShape->getSize( );
- xEmbeddedProperties->setPropertyValue(getPropertyName(PROP_WIDTH), uno::Any(sal_Int32(aSize.Width)));
- xEmbeddedProperties->setPropertyValue(getPropertyName(PROP_HEIGHT), uno::Any(sal_Int32(aSize.Height)));
- uno::Reference<beans::XPropertySet> const xShapeProps(xShape, uno::UNO_QUERY);
- // tdf#130782 copy a11y related properties
- xEmbeddedProperties->setPropertyValue(getPropertyName(PROP_DESCRIPTION),
- xShapeProps->getPropertyValue(getPropertyName(PROP_DESCRIPTION)));
- xEmbeddedProperties->setPropertyValue(getPropertyName(PROP_TITLE),
- xShapeProps->getPropertyValue(getPropertyName(PROP_TITLE)));
- uno::Reference<container::XNamed> const xEmbedName(m_StreamStateStack.top().xEmbedded, uno::UNO_QUERY);
- uno::Reference<container::XNamed> const xShapeName(xShape, uno::UNO_QUERY);
- OUString const name(xShapeName->getName());
- if (!name.isEmpty()) // setting empty name will throw
- {
- try
- {
- xEmbedName->setName(name);
- }
- catch (uno::RuntimeException const&)
- {
- // ignore - document may contain duplicates (testchartoleobjectembeddings.docx)
- }
- }
-}
-
-void DomainMapper_Impl::PopShapeContext()
-{
- if (hasTableManager())
- {
- getTableManager().endLevel();
- popTableManager();
- }
- if ( m_aAnchoredStack.empty() )
- return;
-
- // For OLE object replacement shape, the text append context was already removed
- // or the OLE object couldn't be inserted.
- if ( !m_aAnchoredStack.top().bToRemove )
- {
- RemoveLastParagraph();
- if (!m_aTextAppendStack.empty())
- m_aTextAppendStack.pop();
- }
-
- uno::Reference< text::XTextContent > xObj = m_aAnchoredStack.top( ).xTextContent;
- try
- {
- appendTextContent( xObj, uno::Sequence< beans::PropertyValue >() );
- }
- catch ( const uno::RuntimeException& )
- {
- // this is normal: the shape is already attached
- }
-
- const uno::Reference<drawing::XShape> xShape( xObj, uno::UNO_QUERY_THROW );
- // Remove the shape if required (most likely replacement shape for OLE object)
- // or anchored to a discarded header or footer
- if ( m_aAnchoredStack.top().bToRemove || m_bDiscardHeaderFooter )
- {
- try
- {
- uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(m_xTextDocument, uno::UNO_QUERY_THROW);
- uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage();
- if ( xDrawPage.is() )
- xDrawPage->remove( xShape );
- }
- catch( const uno::Exception& )
- {
- }
- }
-
- // Relative width calculations deferred until section's margins are defined.
- // Being cautious: only deferring undefined/minimum-width shapes in order to avoid causing potential regressions
- css::awt::Size aShapeSize;
- try
- {
- aShapeSize = xShape->getSize();
- }
- catch (const css::uno::RuntimeException& e)
- {
- // May happen e.g. when text frame has no frame format
- // See sw/qa/extras/ooxmlimport/data/n779627.docx
- SAL_WARN("writerfilter.dmapper", "getSize failed. " << e.Message);
- }
- if( aShapeSize.Width <= 2 )
- {
- const uno::Reference<beans::XPropertySet> xShapePropertySet( xShape, uno::UNO_QUERY );
- SectionPropertyMap* pSectionContext = GetSectionContext();
- if ( pSectionContext && (!hasTableManager() || !getTableManager().isInTable()) &&
- xShapePropertySet->getPropertySetInfo()->hasPropertyByName(getPropertyName(PROP_RELATIVE_WIDTH)) )
- {
- pSectionContext->addRelativeWidthShape(xShape);
- }
- }
-
- m_aAnchoredStack.pop();
-}
-
-bool DomainMapper_Impl::IsSdtEndBefore()
-{
- bool bIsSdtEndBefore = false;
- PropertyMapPtr pContext = GetTopContextOfType(CONTEXT_CHARACTER);
- if(pContext)
- {
- const uno::Sequence< beans::PropertyValue > currentCharProps = pContext->GetPropertyValues();
- for (const auto& rCurrentCharProp : currentCharProps)
- {
- if (rCurrentCharProp.Name == "CharInteropGrabBag")
- {
- uno::Sequence<beans::PropertyValue> aCharGrabBag;
- rCurrentCharProp.Value >>= aCharGrabBag;
- for (const auto& rProp : aCharGrabBag)
- {
- if(rProp.Name == "SdtEndBefore")
- {
- rProp.Value >>= bIsSdtEndBefore;
- }
- }
- }
- }
- }
- return bIsSdtEndBefore;
-}
-
-bool DomainMapper_Impl::IsDiscardHeaderFooter() const
-{
- return m_bDiscardHeaderFooter;
-}
-
-// called from TableManager::closeCell()
-void DomainMapper_Impl::ClearPreviousParagraph()
-{
- // in table cells, set bottom auto margin of last paragraph to 0, except in paragraphs with numbering
- if ((m_StreamStateStack.top().nTableDepth == (m_StreamStateStack.top().nTableCellDepth + 1))
- && m_StreamStateStack.top().xPreviousParagraph.is()
- && hasTableManager() && getTableManager().isCellLastParaAfterAutospacing())
- {
- uno::Reference<container::XNamed> xPreviousNumberingRules(m_StreamStateStack.top().xPreviousParagraph->getPropertyValue("NumberingRules"), uno::UNO_QUERY);
- if ( !xPreviousNumberingRules.is() || xPreviousNumberingRules->getName().isEmpty() )
- m_StreamStateStack.top().xPreviousParagraph->setPropertyValue("ParaBottomMargin", uno::Any(static_cast<sal_Int32>(0)));
- }
-
- m_StreamStateStack.top().xPreviousParagraph.clear();
-
- // next table paragraph will be first paragraph in a cell
- m_StreamStateStack.top().bFirstParagraphInCell = true;
-}
-
-void DomainMapper_Impl::HandleAltChunk(const OUString& rStreamName)
-{
- try
- {
- // Create the import filter.
- uno::Reference<lang::XMultiServiceFactory> xMultiServiceFactory(
- comphelper::getProcessServiceFactory());
- uno::Reference<uno::XInterface> xDocxFilter
- = xMultiServiceFactory->createInstance("com.sun.star.comp.Writer.WriterFilter");
-
- // Set the target document.
- uno::Reference<document::XImporter> xImporter(xDocxFilter, uno::UNO_QUERY);
- xImporter->setTargetDocument(m_xTextDocument);
-
- // Set the import parameters.
- uno::Reference<embed::XHierarchicalStorageAccess> xStorageAccess(m_xDocumentStorage,
- uno::UNO_QUERY);
- if (!xStorageAccess.is())
- {
- return;
- }
- // Turn the ZIP stream into a seekable one, as the importer only works with such streams.
- uno::Reference<io::XStream> xStream = xStorageAccess->openStreamElementByHierarchicalName(
- rStreamName, embed::ElementModes::READ);
- std::unique_ptr<SvStream> pStream = utl::UcbStreamHelper::CreateStream(xStream, true);
- SvMemoryStream aMemory;
- aMemory.WriteStream(*pStream);
- uno::Reference<io::XStream> xInputStream = new utl::OStreamWrapper(aMemory);
- // Not handling AltChunk during paste for now.
- uno::Reference<text::XTextRange> xInsertTextRange = GetCurrentXText()->getEnd();
- uno::Reference<text::XTextRange> xSectionStartingRange;
- SectionPropertyMap* pSectionContext = GetSectionContext();
- if (pSectionContext)
- {
- xSectionStartingRange = pSectionContext->GetStartingRange();
- }
- uno::Sequence<beans::PropertyValue> aDescriptor(comphelper::InitPropertySequence({
- { "InputStream", uno::Any(xInputStream) },
- { "InsertMode", uno::Any(true) },
- { "TextInsertModeRange", uno::Any(xInsertTextRange) },
- { "AltChunkMode", uno::Any(true) },
- { "AltChunkStartingRange", uno::Any(xSectionStartingRange) },
- }));
-
- // Do the actual import.
- uno::Reference<document::XFilter> xFilter(xDocxFilter, uno::UNO_QUERY);
- xFilter->filter(aDescriptor);
- }
- catch (const uno::Exception& rException)
- {
- SAL_WARN("writerfilter", "DomainMapper_Impl::HandleAltChunk: failed to handle alt chunk: "
- << rException.Message);
- }
-}
-
-void DomainMapper_Impl::HandlePTab(sal_Int32 nAlignment)
-{
- // We only handle the case when the line already has content, so the left-aligned ptab is
- // equivalent to a line break.
- if (nAlignment != NS_ooxml::LN_Value_ST_PTabAlignment_left)
- {
- return;
- }
-
- if (m_aTextAppendStack.empty())
- {
- return;
- }
-
- uno::Reference<text::XTextAppend> xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if (!xTextAppend.is())
- {
- return;
- }
-
- uno::Reference<css::text::XTextRange> xInsertPosition
- = m_aTextAppendStack.top().xInsertPosition;
- if (!xInsertPosition.is())
- {
- xInsertPosition = xTextAppend->getEnd();
- }
- uno::Reference<text::XTextCursor> xCursor
- = xTextAppend->createTextCursorByRange(xInsertPosition);
-
- // Assume that we just inserted a tab character.
- xCursor->goLeft(1, true);
- if (xCursor->getString() != "\t")
- {
- return;
- }
-
- // Assume that there is some content before the tab character.
- uno::Reference<text::XParagraphCursor> xParagraphCursor(xCursor, uno::UNO_QUERY);
- if (!xParagraphCursor.is())
- {
- return;
- }
-
- xCursor->collapseToStart();
- xParagraphCursor->gotoStartOfParagraph(true);
- if (xCursor->isCollapsed())
- {
- return;
- }
-
- // Then select the tab again and replace with a line break.
- xCursor->collapseToEnd();
- xCursor->goRight(1, true);
- xTextAppend->insertControlCharacter(xCursor, text::ControlCharacter::LINE_BREAK, true);
-}
-
-void DomainMapper_Impl::HandleLineBreakClear(sal_Int32 nClear)
-{
- switch (nClear)
- {
- case NS_ooxml::LN_Value_ST_BrClear_left:
- // SwLineBreakClear::LEFT
- m_StreamStateStack.top().oLineBreakClear = 1;
- break;
- case NS_ooxml::LN_Value_ST_BrClear_right:
- // SwLineBreakClear::RIGHT
- m_StreamStateStack.top().oLineBreakClear = 2;
- break;
- case NS_ooxml::LN_Value_ST_BrClear_all:
- // SwLineBreakClear::ALL
- m_StreamStateStack.top().oLineBreakClear = 3;
- break;
- }
-}
-
-void DomainMapper_Impl::HandleLineBreak(const PropertyMapPtr& pPropertyMap)
-{
- if (!m_StreamStateStack.top().oLineBreakClear.has_value())
- {
- appendTextPortion("\n", pPropertyMap);
- return;
- }
-
- if (GetTextFactory().is())
- {
- uno::Reference<text::XTextContent> xLineBreak(
- GetTextFactory()->createInstance("com.sun.star.text.LineBreak"), uno::UNO_QUERY);
- uno::Reference<beans::XPropertySet> xLineBreakProps(xLineBreak, uno::UNO_QUERY);
- xLineBreakProps->setPropertyValue("Clear", uno::Any(*m_StreamStateStack.top().oLineBreakClear));
- appendTextContent(xLineBreak, pPropertyMap->GetPropertyValues());
- }
- m_StreamStateStack.top().oLineBreakClear.reset();
-}
-
-static sal_Int16 lcl_ParseNumberingType( std::u16string_view rCommand )
-{
- sal_Int16 nRet = style::NumberingType::PAGE_DESCRIPTOR;
-
- // The command looks like: " PAGE \* Arabic "
- // tdf#132185: but may as well be "PAGE \* Arabic"
- OUString sNumber;
- constexpr OUString rSeparator(u"\\* "_ustr);
- if (size_t nStartIndex = rCommand.find(rSeparator); nStartIndex != std::u16string_view::npos)
- {
- sal_Int32 nStartIndex2 = nStartIndex + rSeparator.getLength();
- sNumber = o3tl::getToken(rCommand, 0, ' ', nStartIndex2);
- }
-
- if( !sNumber.isEmpty() )
- {
- //todo: might make sense to hash this list, too
- struct NumberingPairs
- {
- const char* cWordName;
- sal_Int16 nType;
- };
- static const NumberingPairs aNumberingPairs[] =
- {
- {"Arabic", style::NumberingType::ARABIC}
- ,{"ROMAN", style::NumberingType::ROMAN_UPPER}
- ,{"roman", style::NumberingType::ROMAN_LOWER}
- ,{"ALPHABETIC", style::NumberingType::CHARS_UPPER_LETTER}
- ,{"alphabetic", style::NumberingType::CHARS_LOWER_LETTER}
- ,{"CircleNum", style::NumberingType::CIRCLE_NUMBER}
- ,{"ThaiArabic", style::NumberingType::CHARS_THAI}
- ,{"ThaiCardText", style::NumberingType::CHARS_THAI}
- ,{"ThaiLetter", style::NumberingType::CHARS_THAI}
-// ,{"SBCHAR", style::NumberingType::}
-// ,{"DBCHAR", style::NumberingType::}
-// ,{"DBNUM1", style::NumberingType::}
-// ,{"DBNUM2", style::NumberingType::}
-// ,{"DBNUM3", style::NumberingType::}
-// ,{"DBNUM4", style::NumberingType::}
- ,{"Aiueo", style::NumberingType::AIU_FULLWIDTH_JA}
- ,{"Iroha", style::NumberingType::IROHA_FULLWIDTH_JA}
-// ,{"ZODIAC1", style::NumberingType::}
-// ,{"ZODIAC2", style::NumberingType::}
-// ,{"ZODIAC3", style::NumberingType::}
-// ,{"CHINESENUM1", style::NumberingType::}
-// ,{"CHINESENUM2", style::NumberingType::}
-// ,{"CHINESENUM3", style::NumberingType::}
- ,{"ArabicAlpha", style::NumberingType::CHARS_ARABIC}
- ,{"ArabicAbjad", style::NumberingType::FULLWIDTH_ARABIC}
- ,{"Ganada", style::NumberingType::HANGUL_JAMO_KO}
- ,{"Chosung", style::NumberingType::HANGUL_SYLLABLE_KO}
- ,{"KoreanCounting", style::NumberingType::NUMBER_HANGUL_KO}
- ,{"KoreanLegal", style::NumberingType::NUMBER_LEGAL_KO}
- ,{"KoreanDigital", style::NumberingType::NUMBER_DIGITAL_KO}
- ,{"KoreanDigital2", style::NumberingType::NUMBER_DIGITAL2_KO}
-/* possible values:
-style::NumberingType::
-
- CHARS_UPPER_LETTER_N
- CHARS_LOWER_LETTER_N
- TRANSLITERATION
- NATIVE_NUMBERING
- CIRCLE_NUMBER
- NUMBER_LOWER_ZH
- NUMBER_UPPER_ZH
- NUMBER_UPPER_ZH_TW
- TIAN_GAN_ZH
- DI_ZI_ZH
- NUMBER_TRADITIONAL_JA
- AIU_HALFWIDTH_JA
- IROHA_HALFWIDTH_JA
- NUMBER_UPPER_KO
- NUMBER_HANGUL_KO
- HANGUL_JAMO_KO
- HANGUL_SYLLABLE_KO
- HANGUL_CIRCLED_JAMO_KO
- HANGUL_CIRCLED_SYLLABLE_KO
- CHARS_HEBREW
- CHARS_NEPALI
- CHARS_KHMER
- CHARS_LAO
- CHARS_TIBETAN
- CHARS_CYRILLIC_UPPER_LETTER_BG
- CHARS_CYRILLIC_LOWER_LETTER_BG
- CHARS_CYRILLIC_UPPER_LETTER_N_BG
- CHARS_CYRILLIC_LOWER_LETTER_N_BG
- CHARS_CYRILLIC_UPPER_LETTER_RU
- CHARS_CYRILLIC_LOWER_LETTER_RU
- CHARS_CYRILLIC_UPPER_LETTER_N_RU
- CHARS_CYRILLIC_LOWER_LETTER_N_RU
- CHARS_CYRILLIC_UPPER_LETTER_SR
- CHARS_CYRILLIC_LOWER_LETTER_SR
- CHARS_CYRILLIC_UPPER_LETTER_N_SR
- CHARS_CYRILLIC_LOWER_LETTER_N_SR
- CHARS_CYRILLIC_UPPER_LETTER_UK
- CHARS_CYRILLIC_LOWER_LETTER_UK
- CHARS_CYRILLIC_UPPER_LETTER_N_UK
- CHARS_CYRILLIC_LOWER_LETTER_N_UK*/
-
- };
- for(const NumberingPairs& rNumberingPair : aNumberingPairs)
- {
- if( /*sCommand*/sNumber.equalsAscii(rNumberingPair.cWordName ))
- {
- nRet = rNumberingPair.nType;
- break;
- }
- }
-
- }
- return nRet;
-}
-
-
-static OUString lcl_ParseFormat( const OUString& rCommand )
-{
- // The command looks like: " DATE \@"dd MMMM yyyy" or "09/02/2014"
- OUString command;
- sal_Int32 delimPos = rCommand.indexOf("\\@");
- if (delimPos != -1)
- {
- // Remove whitespace permitted by standard between \@ and "
- const sal_Int32 nQuoteIndex = rCommand.indexOf('\"');
- if (nQuoteIndex != -1)
- {
- sal_Int32 wsChars = nQuoteIndex - delimPos - 2;
- command = rCommand.replaceAt(delimPos+2, wsChars, u"");
- }
- else
- {
- // turn date \@ MM into date \@"MM"
- command = OUString::Concat(rCommand.subView(0, delimPos + 2)) + "\"" + o3tl::trim(rCommand.subView(delimPos + 2)) + "\"";
- }
- return OUString(msfilter::util::findQuotedText(command, u"\\@\"", '\"'));
- }
-
- return OUString();
-}
-/*-------------------------------------------------------------------------
-extract a parameter (with or without quotes) between the command and the following backslash
- -----------------------------------------------------------------------*/
-static OUString lcl_ExtractToken(std::u16string_view rCommand,
- size_t & rIndex, bool & rHaveToken, bool & rIsSwitch)
-{
- rHaveToken = false;
- rIsSwitch = false;
-
- OUStringBuffer token;
- bool bQuoted(false);
- for (; rIndex < rCommand.size(); ++rIndex)
- {
- sal_Unicode const currentChar(rCommand[rIndex]);
- switch (currentChar)
- {
- case '\\':
- {
- if (rIndex == rCommand.size() - 1)
- {
- SAL_INFO("writerfilter.dmapper", "field: trailing escape");
- ++rIndex;
- return OUString();
- }
- sal_Unicode const nextChar(rCommand[rIndex+1]);
- if (bQuoted || '\\' == nextChar)
- {
- ++rIndex; // read 2 chars
- token.append(nextChar);
- }
- else // field switch (case insensitive)
- {
- rHaveToken = true;
- if (token.isEmpty())
- {
- rIsSwitch = true;
- rIndex += 2; // read 2 chars
- return OUString(rCommand.substr(rIndex - 2, 2)).toAsciiUpperCase();
- }
- else
- { // leave rIndex, read it again next time
- return token.makeStringAndClear();
- }
- }
- }
- break;
- case '\"':
- if (bQuoted || !token.isEmpty())
- {
- rHaveToken = true;
- if (bQuoted)
- {
- ++rIndex;
- }
- return token.makeStringAndClear();
- }
- else
- {
- bQuoted = true;
- }
- break;
- case ' ':
- if (bQuoted)
- {
- token.append(' ');
- }
- else
- {
- if (!token.isEmpty())
- {
- rHaveToken = true;
- ++rIndex;
- return token.makeStringAndClear();
- }
- }
- break;
- case '=':
- if (token.isEmpty())
- {
- rHaveToken = true;
- ++rIndex;
- return "FORMULA";
- }
- else
- token.append('=');
- break;
- default:
- token.append(currentChar);
- break;
- }
- }
- assert(rIndex == rCommand.size());
- if (bQuoted)
- {
- // MS Word allows this, so just emit a debug message
- SAL_INFO("writerfilter.dmapper",
- "field argument with unterminated quote");
- }
- rHaveToken = !token.isEmpty();
- return token.makeStringAndClear();
-}
-
-std::tuple<OUString, std::vector<OUString>, std::vector<OUString> > splitFieldCommand(std::u16string_view rCommand)
-{
- OUString sType;
- std::vector<OUString> arguments;
- std::vector<OUString> switches;
- size_t nStartIndex(0);
- // tdf#54584: Field may be prepended by a backslash
- // This is not an escapement, but already escaped literal "\"
- // MS Word allows this, so just skip it
- if ((rCommand.size() >= nStartIndex + 2) &&
- (rCommand[nStartIndex] == L'\\') &&
- (rCommand[nStartIndex + 1] != L'\\') &&
- (rCommand[nStartIndex + 1] != L' '))
- {
- ++nStartIndex;
- }
-
- do
- {
- bool bHaveToken;
- bool bIsSwitch;
- OUString const token =
- lcl_ExtractToken(rCommand, nStartIndex, bHaveToken, bIsSwitch);
- assert(nStartIndex <= rCommand.size());
- if (bHaveToken)
- {
- if (sType.isEmpty())
- {
- sType = token.toAsciiUpperCase();
- }
- else if (bIsSwitch || !switches.empty())
- {
- switches.push_back(token);
- }
- else
- {
- arguments.push_back(token);
- }
- }
- } while (nStartIndex < rCommand.size());
-
- return std::make_tuple(sType, arguments, switches);
-}
-
-static OUString lcl_ExtractVariableAndHint( std::u16string_view rCommand, OUString& rHint )
-{
- // the first word after "ASK " is the variable
- // the text after the variable and before a '\' is the hint
- // if no hint is set the variable is used as hint
- // the quotes of the hint have to be removed
- size_t nIndex = rCommand.find( ' ', 2); //find last space after 'ASK'
- if (nIndex == std::u16string_view::npos)
- return OUString();
- while (nIndex < rCommand.size() && rCommand[nIndex] == ' ')
- ++nIndex;
- std::u16string_view sShortCommand( rCommand.substr( nIndex ) ); //cut off the " ASK "
-
- sShortCommand = o3tl::getToken(sShortCommand, 0, '\\');
- sal_Int32 nIndex2 = 0;
- std::u16string_view sRet = o3tl::getToken(sShortCommand, 0, ' ', nIndex2);
- if( nIndex2 > 0)
- rHint = sShortCommand.substr( nIndex2 );
- if( rHint.isEmpty() )
- rHint = sRet;
- return OUString(sRet);
-}
-
-static size_t nextCode(std::u16string_view rCommand, size_t pos)
-{
- bool inQuotes = false;
- for (; pos < rCommand.size(); ++pos)
- {
- switch (rCommand[pos])
- {
- case '"':
- inQuotes = !inQuotes;
- break;
- case '\\':
- ++pos;
- if (!inQuotes)
- return pos;
- break;
- }
- }
- return std::u16string_view::npos;
-}
-
-// Returns the position of the field code
-static size_t findCode(std::u16string_view rCommand, sal_Unicode cSwitch)
-{
- for (size_t i = nextCode(rCommand, 0); i < rCommand.size(); i = nextCode(rCommand, i))
- if (rCommand[i] == cSwitch)
- return i;
-
- return std::u16string_view::npos;
-}
-
-static bool lcl_FindInCommand(
- std::u16string_view rCommand,
- sal_Unicode cSwitch,
- OUString& rValue )
-{
- if (size_t i = findCode(rCommand, cSwitch); i < rCommand.size())
- {
- ++i;
- size_t next = nextCode(rCommand, i);
- if (next < rCommand.size())
- --next; // get back before the next '\\'
- rValue = o3tl::trim(rCommand.substr(i, next - i));
- return true;
- }
-
- return false;
-}
-
-static OUString lcl_trim(std::u16string_view sValue)
-{
- // it seems, all kind of quotation marks are allowed around index type identifiers
- // TODO apply this on bookmarks, too, if needed
- return OUString(o3tl::trim(sValue)).replaceAll("\"","").replaceAll(u"“", "").replaceAll(u"”", "");
-}
-
-/*-------------------------------------------------------------------------
- extract the number format from the command and apply the resulting number
- format to the XPropertySet
- -----------------------------------------------------------------------*/
-void DomainMapper_Impl::SetNumberFormat( const OUString& rCommand,
- uno::Reference< beans::XPropertySet > const& xPropertySet,
- bool const bDetectFormat)
-{
- OUString sFormatString = lcl_ParseFormat( rCommand );
- // find \h - hijri/luna calendar todo: what about saka/era calendar?
- bool bHijri = 0 < rCommand.indexOf("\\h ");
- lang::Locale aUSLocale;
- aUSLocale.Language = "en";
- aUSLocale.Country = "US";
-
- lang::Locale aCurrentLocale;
- GetAnyProperty(PROP_CHAR_LOCALE, GetTopContext()) >>= aCurrentLocale;
-
- if (sFormatString.isEmpty())
- {
- // No format specified. MS Word uses different formats depending on w:lang,
- // "M/d/yyyy h:mm:ss AM/PM" for en-US, and "dd/MM/yyyy hh:mm:ss AM/PM" for en-GB.
- // ALSO SEE: ww8par5's GetWordDefaultDateStringAsUS.
- sal_Int32 nPos = rCommand.indexOf(" \\");
- OUString sCommand = nPos == -1 ? rCommand.trim()
- : OUString(o3tl::trim(rCommand.subView(0, nPos)));
- if (sCommand == "CREATEDATE" || sCommand == "PRINTDATE" || sCommand == "SAVEDATE")
- {
- try
- {
- css::uno::Reference<css::i18n::XNumberFormatCode> const& xNumberFormatCode =
- i18n::NumberFormatMapper::create(m_xComponentContext);
- sFormatString = xNumberFormatCode->getFormatCode(
- css::i18n::NumberFormatIndex::DATE_SYSTEM_SHORT, aCurrentLocale).Code;
- nPos = sFormatString.indexOf("YYYY");
- if (nPos == -1)
- sFormatString = sFormatString.replaceFirst("YY", "YYYY");
- if (aCurrentLocale == aUSLocale)
- sFormatString += " h:mm:ss AM/PM";
- else
- sFormatString += " hh:mm:ss AM/PM";
- }
- catch(const uno::Exception&)
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter.dmapper");
- }
- }
- }
- OUString sFormat = ConversionHelper::ConvertMSFormatStringToSO( sFormatString, aCurrentLocale, bHijri);
- //get the number formatter and convert the string to a format value
- try
- {
- sal_Int32 nKey = 0;
- uno::Reference< util::XNumberFormatsSupplier > xNumberSupplier( m_xTextDocument, uno::UNO_QUERY_THROW );
- if( bDetectFormat )
- {
- uno::Reference< util::XNumberFormatter> xFormatter(util::NumberFormatter::create(m_xComponentContext), uno::UNO_QUERY_THROW);
- xFormatter->attachNumberFormatsSupplier( xNumberSupplier );
- nKey = xFormatter->detectNumberFormat( 0, rCommand );
- }
- else
- {
- nKey = xNumberSupplier->getNumberFormats()->addNewConverted( sFormat, aUSLocale, aCurrentLocale );
- }
- xPropertySet->setPropertyValue(
- getPropertyName(PROP_NUMBER_FORMAT),
- uno::Any( nKey ));
- }
- catch(const uno::Exception&)
- {
- }
-}
-
-static uno::Any lcl_getGrabBagValue( const uno::Sequence<beans::PropertyValue>& grabBag, OUString const & name )
-{
- auto pProp = std::find_if(grabBag.begin(), grabBag.end(),
- [&name](const beans::PropertyValue& rProp) { return rProp.Name == name; });
- if (pProp != grabBag.end())
- return pProp->Value;
- return uno::Any();
-}
-
-//Link the text frames.
-void DomainMapper_Impl::ChainTextFrames()
-{
- //can't link textboxes if there are not even two of them...
- if( 2 > m_vTextFramesForChaining.size() )
- return ;
-
- struct TextFramesForChaining {
- css::uno::Reference< css::drawing::XShape > xShape;
- sal_Int32 nId;
- sal_Int32 nSeq;
- OUString s_mso_next_textbox;
- OUString shapeName;
- TextFramesForChaining() : nId(0), nSeq(0) {}
- } ;
- typedef std::map <OUString, TextFramesForChaining> ChainMap;
-
- try
- {
- ChainMap aTextFramesForChainingHelper;
- ::std::vector<TextFramesForChaining> chainingWPS;
- OUString sChainNextName("ChainNextName");
-
- //learn about ALL of the textboxes and their chaining values first - because frames are processed in no specific order.
- for( const auto& rTextFrame : m_vTextFramesForChaining )
- {
- uno::Reference<text::XTextContent> xTextContent(rTextFrame, uno::UNO_QUERY_THROW);
- uno::Reference<beans::XPropertySet> xPropertySet(xTextContent, uno::UNO_QUERY);
- uno::Reference<beans::XPropertySetInfo> xPropertySetInfo;
- if( xPropertySet.is() )
- xPropertySetInfo = xPropertySet->getPropertySetInfo();
- uno::Sequence<beans::PropertyValue> aGrabBag;
- uno::Reference<lang::XServiceInfo> xServiceInfo(xPropertySet, uno::UNO_QUERY);
-
- TextFramesForChaining aChainStruct;
- OUString sShapeName;
- OUString sLinkChainName;
-
- //The chaining name and the shape name CAN be different in .docx.
- //MUST use LinkDisplayName/ChainName as the shape name for establishing links.
- if ( xServiceInfo->supportsService("com.sun.star.text.TextFrame") )
- {
- xPropertySet->getPropertyValue("FrameInteropGrabBag") >>= aGrabBag;
- xPropertySet->getPropertyValue("LinkDisplayName") >>= sShapeName;
- }
- else
- {
- xPropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBag;
- xPropertySet->getPropertyValue("ChainName") >>= sShapeName;
- }
-
- lcl_getGrabBagValue( aGrabBag, "Txbx-Id") >>= aChainStruct.nId;
- lcl_getGrabBagValue( aGrabBag, "Txbx-Seq") >>= aChainStruct.nSeq;
- lcl_getGrabBagValue( aGrabBag, "LinkChainName") >>= sLinkChainName;
- lcl_getGrabBagValue( aGrabBag, "mso-next-textbox") >>= aChainStruct.s_mso_next_textbox;
-
- //Sometimes the shape names have not been imported. If not, we may have a fallback name.
- //Set name later, only if required for linking.
- aChainStruct.shapeName = sShapeName;
-
- if (!sLinkChainName.isEmpty())
- {
- aChainStruct.xShape = rTextFrame;
- aTextFramesForChainingHelper[sLinkChainName] = aChainStruct;
- }
- if (aChainStruct.s_mso_next_textbox.isEmpty())
- { // no VML chaining => try to chain DrawingML via IDs
- aChainStruct.xShape = rTextFrame;
- if (!sLinkChainName.isEmpty())
- { // for member of group shapes, TestTdf73499
- aChainStruct.shapeName = sLinkChainName;
- }
- chainingWPS.emplace_back(aChainStruct);
- }
- }
-
- //if mso-next-textbox tags are provided, create those vml-style links first. Afterwards we will make dml-style id/seq links.
- for (auto& msoItem : aTextFramesForChainingHelper)
- {
- //if no mso-next-textbox, we are done.
- //if it points to itself, we are done.
- if( !msoItem.second.s_mso_next_textbox.isEmpty()
- && msoItem.second.s_mso_next_textbox != msoItem.first )
- {
- ChainMap::iterator nextFinder=aTextFramesForChainingHelper.find(msoItem.second.s_mso_next_textbox);
- if( nextFinder != aTextFramesForChainingHelper.end() )
- {
- //if the frames have no name yet, then set them. LinkDisplayName / ChainName are read-only.
- if (msoItem.second.shapeName.isEmpty())
- {
- uno::Reference< container::XNamed > xNamed( msoItem.second.xShape, uno::UNO_QUERY );
- if ( xNamed.is() )
- {
- xNamed->setName( msoItem.first );
- msoItem.second.shapeName = msoItem.first;
- }
- }
- if (nextFinder->second.shapeName.isEmpty())
- {
- uno::Reference< container::XNamed > xNamed( nextFinder->second.xShape, uno::UNO_QUERY );
- if ( xNamed.is() )
- {
- xNamed->setName( nextFinder->first );
- nextFinder->second.shapeName = msoItem.first;
- }
- }
-
- uno::Reference<text::XTextContent> xTextContent(msoItem.second.xShape, uno::UNO_QUERY_THROW);
- uno::Reference<beans::XPropertySet> xPropertySet(xTextContent, uno::UNO_QUERY);
-
- //The reverse chaining happens automatically, so only one direction needs to be set
- xPropertySet->setPropertyValue(sChainNextName, uno::Any(nextFinder->second.shapeName));
-
- //the last item in an mso-next-textbox chain is indistinguishable from id/seq items. Now that it is handled, remove it.
- if( nextFinder->second.s_mso_next_textbox.isEmpty() )
- aTextFramesForChainingHelper.erase(nextFinder->first);
- }
- }
- }
-
- //TODO: Perhaps allow reverse sequences when mso-layout-flow-alt = "bottom-to-top"
- const sal_Int32 nDirection = 1;
-
- //Finally - go through and attach the chains based on matching ID and incremented sequence number (dml-style).
- for (const auto& rOuter : chainingWPS)
- {
- for (const auto& rInner : chainingWPS)
- {
- if (rInner.nId == rOuter.nId)
- {
- if (rInner.nSeq == (rOuter.nSeq + nDirection))
- {
- uno::Reference<text::XTextContent> const xTextContent(rOuter.xShape, uno::UNO_QUERY_THROW);
- uno::Reference<beans::XPropertySet> xPropertySet(xTextContent, uno::UNO_QUERY);
-
- //The reverse chaining happens automatically, so only one direction needs to be set
- xPropertySet->setPropertyValue(sChainNextName, uno::Any(rInner.shapeName));
- break ; //there cannot be more than one next frame
- }
- }
- }
- }
- m_vTextFramesForChaining.clear(); //clear the vector
- }
- catch (const uno::Exception&)
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter.dmapper");
- }
-}
-
-void DomainMapper_Impl::PushTextBoxContent()
-{
- if (m_StreamStateStack.top().bIsInTextBox)
- return;
-
- try
- {
- uno::Reference<text::XTextFrame> xTBoxFrame(
- m_xTextFactory->createInstance("com.sun.star.text.TextFrame"), uno::UNO_QUERY_THROW);
- uno::Reference<container::XNamed>(xTBoxFrame, uno::UNO_QUERY_THROW)
- ->setName("textbox" + OUString::number(m_xPendingTextBoxFrames.size() + 1));
- uno::Reference<text::XTextAppendAndConvert>(m_aTextAppendStack.top().xTextAppend,
- uno::UNO_QUERY_THROW)
- ->appendTextContent(xTBoxFrame, beans::PropertyValues());
- m_xPendingTextBoxFrames.push(xTBoxFrame);
-
- m_aTextAppendStack.push(TextAppendContext(uno::Reference<text::XTextAppend>(xTBoxFrame, uno::UNO_QUERY_THROW), {}));
- m_StreamStateStack.top().bIsInTextBox = true;
-
- appendTableManager();
- appendTableHandler();
- getTableManager().startLevel();
- }
- catch (uno::Exception& e)
- {
- SAL_WARN("writerfilter.dmapper", "Exception during creating textbox (" + e.Message + ")!");
- }
-}
-
-void DomainMapper_Impl::PopTextBoxContent()
-{
- if (!m_StreamStateStack.top().bIsInTextBox || m_xPendingTextBoxFrames.empty())
- return;
-
- if (uno::Reference<text::XTextFrame>(m_aTextAppendStack.top().xTextAppend, uno::UNO_QUERY).is())
- {
- if (hasTableManager())
- {
- getTableManager().endLevel();
- popTableManager();
- }
- RemoveLastParagraph();
-
- m_aTextAppendStack.pop();
- m_StreamStateStack.top().bIsInTextBox = false;
- }
-}
-
-void DomainMapper_Impl::AttachTextBoxContentToShape(css::uno::Reference<css::drawing::XShape> xShape)
-{
- // Without textbox or shape pointless to continue
- if (m_xPendingTextBoxFrames.empty() || !xShape)
- return;
-
- uno::Reference< drawing::XShapes >xGroup(xShape, uno::UNO_QUERY);
- uno::Reference< beans::XPropertySet >xProps(xShape, uno::UNO_QUERY);
-
- // If this is a group go inside
- if (xGroup)
- for (sal_Int32 i = 0; i < xGroup->getCount(); ++i)
- AttachTextBoxContentToShape(
- uno::Reference<drawing::XShape>(xGroup->getByIndex(i), uno::UNO_QUERY));
-
- // if this shape has to be a textbox, attach the frame
- if (!xProps->getPropertyValue("TextBox").get<bool>())
- return;
-
- // if this is a textbox there must be a waiting frame
- auto xTextBox = m_xPendingTextBoxFrames.front();
- if (!xTextBox)
- return;
-
- // Pop the pending frames
- m_xPendingTextBoxFrames.pop();
-
- // Attach the textbox to the shape
- try
- {
- xProps->setPropertyValue("TextBoxContent", uno::Any(xTextBox));
- }
- catch (...)
- {
- SAL_WARN("writerfilter.dmapper", "Exception while trying to attach textboxes!");
- return;
- }
-
- // If attaching is successful, then do the linking
- try
- {
- // Get the name of the textbox
- OUString sTextBoxName;
- uno::Reference<container::XNamed> xName(xTextBox, uno::UNO_QUERY);
- if (xName && !xName->getName().isEmpty())
- sTextBoxName = xName->getName();
-
- // Try to get the grabbag
- uno::Sequence<beans::PropertyValue> aOldGrabBagSeq;
- if (xProps->getPropertySetInfo()->hasPropertyByName("InteropGrabBag"))
- xProps->getPropertyValue("InteropGrabBag") >>= aOldGrabBagSeq;
-
- // If the grabbag successfully get...
- if (!aOldGrabBagSeq.hasElements())
- return;
-
- // Check for the existing linking information
- bool bSuccess = false;
- beans::PropertyValues aNewGrabBagSeq;
- const auto& aHasLink = lcl_getGrabBagValue(aOldGrabBagSeq, "TxbxHasLink");
-
- // If there must be a link, do it
- if (aHasLink.hasValue() && aHasLink.get<bool>())
- {
- auto aLinkProp = comphelper::makePropertyValue("LinkChainName", sTextBoxName);
- for (sal_uInt32 i = 0; i < aOldGrabBagSeq.size(); ++i)
- {
- aNewGrabBagSeq.realloc(i + 1);
- // If this is the link name replace it
- if (!aOldGrabBagSeq[i].Name.isEmpty() && !aLinkProp.Name.isEmpty()
- && (aOldGrabBagSeq[i].Name == aLinkProp.Name))
- {
- aNewGrabBagSeq.getArray()[i] = aLinkProp;
- bSuccess = true;
- }
- // else copy
- else
- aNewGrabBagSeq.getArray()[i] = aOldGrabBagSeq[i];
- }
-
- // If there was no replacement, append the linking data
- if (!bSuccess)
- {
- aNewGrabBagSeq.realloc(aNewGrabBagSeq.size() + 1);
- aNewGrabBagSeq.getArray()[aNewGrabBagSeq.size() - 1] = aLinkProp;
- bSuccess = true;
- }
- }
-
- // If the linking changed the grabbag, apply the modifications
- if (aNewGrabBagSeq.hasElements() && bSuccess)
- {
- xProps->setPropertyValue("InteropGrabBag", uno::Any(aNewGrabBagSeq));
- m_vTextFramesForChaining.push_back(xShape);
- }
- }
- catch (...)
- {
- SAL_WARN("writerfilter.dmapper", "Exception while trying to link textboxes!");
- }
-}
-
-uno::Reference<beans::XPropertySet> DomainMapper_Impl::FindOrCreateFieldMaster(const char* pFieldMasterService, const OUString& rFieldMasterName)
-{
- // query master, create if not available
- uno::Reference< text::XTextFieldsSupplier > xFieldsSupplier( GetTextDocument(), uno::UNO_QUERY_THROW );
- uno::Reference< container::XNameAccess > xFieldMasterAccess = xFieldsSupplier->getTextFieldMasters();
- uno::Reference< beans::XPropertySet > xMaster;
- OUString sFieldMasterService( OUString::createFromAscii(pFieldMasterService) );
- OUStringBuffer aFieldMasterName;
- OUString sDatabaseDataSourceName = GetSettingsTable()->GetCurrentDatabaseDataSource();
- bool bIsMergeField = sFieldMasterService.endsWith("Database");
- aFieldMasterName.appendAscii( pFieldMasterService );
- aFieldMasterName.append('.');
- if ( bIsMergeField && !sDatabaseDataSourceName.isEmpty() )
- {
- aFieldMasterName.append(sDatabaseDataSourceName + ".");
- }
- aFieldMasterName.append(rFieldMasterName);
- OUString sFieldMasterName = aFieldMasterName.makeStringAndClear();
- if(xFieldMasterAccess->hasByName(sFieldMasterName))
- {
- //get the master
- xMaster.set(xFieldMasterAccess->getByName(sFieldMasterName), uno::UNO_QUERY_THROW);
- }
- else if( m_xTextFactory.is() )
- {
- //create the master
- xMaster.set( m_xTextFactory->createInstance(sFieldMasterService), uno::UNO_QUERY_THROW);
- if ( !bIsMergeField || sDatabaseDataSourceName.isEmpty() )
- {
- //set the master's name
- xMaster->setPropertyValue(
- getPropertyName(PROP_NAME),
- uno::Any(rFieldMasterName));
- } else {
- // set database data, based on the "databasename.tablename" of sDatabaseDataSourceName
- xMaster->setPropertyValue(
- getPropertyName(PROP_DATABASE_NAME),
- uno::Any(sDatabaseDataSourceName.copy(0, sDatabaseDataSourceName.indexOf('.'))));
- xMaster->setPropertyValue(
- getPropertyName(PROP_COMMAND_TYPE),
- uno::Any(sal_Int32(0)));
- xMaster->setPropertyValue(
- getPropertyName(PROP_DATATABLE_NAME),
- uno::Any(sDatabaseDataSourceName.copy(sDatabaseDataSourceName.indexOf('.') + 1)));
- xMaster->setPropertyValue(
- getPropertyName(PROP_DATACOLUMN_NAME),
- uno::Any(rFieldMasterName));
- }
- }
- return xMaster;
-}
-
-void DomainMapper_Impl::PushFieldContext()
-{
- m_StreamStateStack.top().bParaHadField = true;
- if(m_bDiscardHeaderFooter)
- return;
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("pushFieldContext");
-#endif
-
- uno::Reference<text::XTextCursor> xCrsr;
- if (!m_aTextAppendStack.empty())
- {
- uno::Reference<text::XTextAppend> xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if (xTextAppend.is())
- xCrsr = xTextAppend->createTextCursorByRange(
- m_aTextAppendStack.top().xInsertPosition.is()
- ? m_aTextAppendStack.top().xInsertPosition
- : xTextAppend->getEnd());
- }
-
- uno::Reference< text::XTextRange > xStart;
- if (xCrsr.is())
- xStart = xCrsr->getStart();
- m_aFieldStack.push_back(new FieldContext(xStart));
-}
-/*-------------------------------------------------------------------------
-//the current field context waits for the completion of the command
- -----------------------------------------------------------------------*/
-bool DomainMapper_Impl::IsOpenFieldCommand() const
-{
- return !m_aFieldStack.empty() && !m_aFieldStack.back()->IsCommandCompleted();
-}
-/*-------------------------------------------------------------------------
-//the current field context waits for the completion of the command
- -----------------------------------------------------------------------*/
-bool DomainMapper_Impl::IsOpenField() const
-{
- return !m_aFieldStack.empty();
-}
-
-// Mark top field context as containing a fixed field
-void DomainMapper_Impl::SetFieldLocked()
-{
- if (IsOpenField())
- m_aFieldStack.back()->SetFieldLocked();
-}
-
-
-FieldContext::FieldContext(uno::Reference< text::XTextRange > xStart)
- : m_bFieldCommandCompleted(false)
- , m_xStartRange(std::move( xStart ))
- , m_bFieldLocked( false )
- , m_bCommandType(false)
-{
- m_pProperties = new PropertyMap();
-}
-
-
-FieldContext::~FieldContext()
-{
-}
-
-void FieldContext::SetTextField(uno::Reference<text::XTextField> const& xTextField)
-{
-#ifndef NDEBUG
- if (xTextField.is())
- {
- uno::Reference<lang::XServiceInfo> const xServiceInfo(xTextField, uno::UNO_QUERY);
- assert(xServiceInfo.is());
- // those must be set by SetFormField()
- assert(!xServiceInfo->supportsService("com.sun.star.text.Fieldmark")
- && !xServiceInfo->supportsService("com.sun.star.text.FormFieldmark"));
- }
-#endif
- m_xTextField = xTextField;
-}
-
-void FieldContext::CacheVariableValue(const uno::Any& rAny)
-{
- rAny >>= m_sVariableValue;
-}
-
-void FieldContext::AppendCommand(std::u16string_view rPart)
-{
- m_sCommand[m_bCommandType] += rPart;
-}
-
-::std::vector<OUString> FieldContext::GetCommandParts() const
-{
- ::std::vector<OUString> aResult;
- sal_Int32 nIndex = 0;
- bool bInString = false;
- OUString sPart;
- while (nIndex != -1)
- {
- OUString sToken = GetCommand().getToken(0, ' ', nIndex);
- bool bInStringNext = bInString;
-
- if (sToken.isEmpty())
- continue;
-
- if (sToken[0] == '"')
- {
- bInStringNext = true;
- sToken = sToken.copy(1);
- }
- if (sToken.endsWith("\""))
- {
- bInStringNext = false;
- sToken = sToken.copy(0, sToken.getLength() - 1);
- }
-
- if (bInString)
- {
- sPart += " " + sToken;
- if (!bInStringNext)
- {
- aResult.push_back(sPart);
- }
- }
- else
- {
- if (bInStringNext)
- {
- sPart = sToken;
- }
- else
- {
- aResult.push_back(sToken);
- }
- }
-
- bInString = bInStringNext;
- }
-
- return aResult;
-}
-
-/*-------------------------------------------------------------------------
-//collect the pieces of the command
- -----------------------------------------------------------------------*/
-void DomainMapper_Impl::AppendFieldCommand(OUString const & rPartOfCommand)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("appendFieldCommand");
- TagLogger::getInstance().chars(rPartOfCommand);
- TagLogger::getInstance().endElement();
-#endif
-
- FieldContextPtr pContext = m_aFieldStack.back();
- OSL_ENSURE( pContext, "no field context available");
- if( pContext )
- {
- // Set command line type: normal or deleted
- pContext->SetCommandType(m_bTextDeleted);
- pContext->AppendCommand( rPartOfCommand );
- }
-}
-
-
-typedef std::multimap < sal_Int32, OUString > TOCStyleMap;
-
-
-static ww::eField GetWW8FieldId(OUString const& rType)
-{
- std::unordered_map<OUString, ww::eField> mapID
- {
- {"ADDRESSBLOCK", ww::eADDRESSBLOCK},
- {"ADVANCE", ww::eADVANCE},
- {"ASK", ww::eASK},
- {"AUTONUM", ww::eAUTONUM},
- {"AUTONUMLGL", ww::eAUTONUMLGL},
- {"AUTONUMOUT", ww::eAUTONUMOUT},
- {"AUTOTEXT", ww::eAUTOTEXT},
- {"AUTOTEXTLIST", ww::eAUTOTEXTLIST},
- {"AUTHOR", ww::eAUTHOR},
- {"BARCODE", ww::eBARCODE},
- {"BIDIOUTLINE", ww::eBIDIOUTLINE},
- {"DATE", ww::eDATE},
- {"COMMENTS", ww::eCOMMENTS},
- {"COMPARE", ww::eCOMPARE},
- {"CONTROL", ww::eCONTROL},
- {"CREATEDATE", ww::eCREATEDATE},
- {"DATABASE", ww::eDATABASE},
- {"DDEAUTOREF", ww::eDDEAUTOREF},
- {"DDEREF", ww::eDDEREF},
- {"DOCPROPERTY", ww::eDOCPROPERTY},
- {"DOCVARIABLE", ww::eDOCVARIABLE},
- {"EDITTIME", ww::eEDITTIME},
- {"EMBED", ww::eEMBED},
- {"EQ", ww::eEQ},
- {"FILLIN", ww::eFILLIN},
- {"FILENAME", ww::eFILENAME},
- {"FILESIZE", ww::eFILESIZE},
- {"FOOTREF", ww::eFOOTREF},
-// {"FORMULA", ww::},
- {"FORMCHECKBOX", ww::eFORMCHECKBOX},
- {"FORMDROPDOWN", ww::eFORMDROPDOWN},
- {"FORMTEXT", ww::eFORMTEXT},
- {"GLOSSREF", ww::eGLOSSREF},
- {"GOTOBUTTON", ww::eGOTOBUTTON},
- {"GREETINGLINE", ww::eGREETINGLINE},
- {"HTMLCONTROL", ww::eHTMLCONTROL},
- {"HYPERLINK", ww::eHYPERLINK},
- {"IF", ww::eIF},
- {"INFO", ww::eINFO},
- {"INCLUDEPICTURE", ww::eINCLUDEPICTURE},
- {"INCLUDETEXT", ww::eINCLUDETEXT},
- {"INCLUDETIFF", ww::eINCLUDETIFF},
- {"KEYWORDS", ww::eKEYWORDS},
- {"LASTSAVEDBY", ww::eLASTSAVEDBY},
- {"LINK", ww::eLINK},
- {"LISTNUM", ww::eLISTNUM},
- {"MACRO", ww::eMACRO},
- {"MACROBUTTON", ww::eMACROBUTTON},
- {"MERGEDATA", ww::eMERGEDATA},
- {"MERGEFIELD", ww::eMERGEFIELD},
- {"MERGEINC", ww::eMERGEINC},
- {"MERGEREC", ww::eMERGEREC},
- {"MERGESEQ", ww::eMERGESEQ},
- {"NEXT", ww::eNEXT},
- {"NEXTIF", ww::eNEXTIF},
- {"NOTEREF", ww::eNOTEREF},
- {"PAGE", ww::ePAGE},
- {"PAGEREF", ww::ePAGEREF},
- {"PLUGIN", ww::ePLUGIN},
- {"PRINT", ww::ePRINT},
- {"PRINTDATE", ww::ePRINTDATE},
- {"PRIVATE", ww::ePRIVATE},
- {"QUOTE", ww::eQUOTE},
- {"RD", ww::eRD},
- {"REF", ww::eREF},
- {"REVNUM", ww::eREVNUM},
- {"SAVEDATE", ww::eSAVEDATE},
- {"SECTION", ww::eSECTION},
- {"SECTIONPAGES", ww::eSECTIONPAGES},
- {"SEQ", ww::eSEQ},
- {"SET", ww::eSET},
- {"SKIPIF", ww::eSKIPIF},
- {"STYLEREF", ww::eSTYLEREF},
- {"SUBSCRIBER", ww::eSUBSCRIBER},
- {"SUBJECT", ww::eSUBJECT},
- {"SYMBOL", ww::eSYMBOL},
- {"TA", ww::eTA},
- {"TEMPLATE", ww::eTEMPLATE},
- {"TIME", ww::eTIME},
- {"TITLE", ww::eTITLE},
- {"TOA", ww::eTOA},
- {"USERINITIALS", ww::eUSERINITIALS},
- {"USERADDRESS", ww::eUSERADDRESS},
- {"USERNAME", ww::eUSERNAME},
-
- {"TOC", ww::eTOC},
- {"TC", ww::eTC},
- {"NUMCHARS", ww::eNUMCHARS},
- {"NUMWORDS", ww::eNUMWORDS},
- {"NUMPAGES", ww::eNUMPAGES},
- {"INDEX", ww::eINDEX},
- {"XE", ww::eXE},
- {"BIBLIOGRAPHY", ww::eBIBLIOGRAPHY},
- {"CITATION", ww::eCITATION},
- };
- auto const it = mapID.find(rType);
- return (it == mapID.end()) ? ww::eNONE : it->second;
-}
-
-static const FieldConversionMap_t & lcl_GetFieldConversion()
-{
- static const FieldConversionMap_t aFieldConversionMap
- {
-// {"ADDRESSBLOCK", {"", FIELD_ADDRESSBLOCK }},
-// {"ADVANCE", {"", FIELD_ADVANCE }},
- {"ASK", {"SetExpression", FIELD_ASK }},
- {"AUTONUM", {"SetExpression", FIELD_AUTONUM }},
- {"AUTONUMLGL", {"SetExpression", FIELD_AUTONUMLGL }},
- {"AUTONUMOUT", {"SetExpression", FIELD_AUTONUMOUT }},
- {"AUTHOR", {"DocInfo.CreateAuthor", FIELD_AUTHOR }},
- {"DATE", {"DateTime", FIELD_DATE }},
- {"COMMENTS", {"DocInfo.Description", FIELD_COMMENTS }},
- {"CREATEDATE", {"DocInfo.CreateDateTime", FIELD_CREATEDATE }},
- {"DOCPROPERTY", {"", FIELD_DOCPROPERTY }},
- {"DOCVARIABLE", {"User", FIELD_DOCVARIABLE }},
- {"EDITTIME", {"DocInfo.EditTime", FIELD_EDITTIME }},
- {"EQ", {"", FIELD_EQ }},
- {"FILLIN", {"Input", FIELD_FILLIN }},
- {"FILENAME", {"FileName", FIELD_FILENAME }},
-// {"FILESIZE", {"", FIELD_FILESIZE }},
- {"FORMULA", {"TableFormula", FIELD_FORMULA }},
- {"FORMCHECKBOX", {"", FIELD_FORMCHECKBOX }},
- {"FORMDROPDOWN", {"DropDown", FIELD_FORMDROPDOWN }},
- {"FORMTEXT", {"Input", FIELD_FORMTEXT }},
- {"GOTOBUTTON", {"", FIELD_GOTOBUTTON }},
- {"HYPERLINK", {"", FIELD_HYPERLINK }},
- {"IF", {"ConditionalText", FIELD_IF }},
-// {"INFO", {"", FIELD_INFO }},
- {"INCLUDEPICTURE", {"", FIELD_INCLUDEPICTURE}},
- {"KEYWORDS", {"DocInfo.KeyWords", FIELD_KEYWORDS }},
- {"LASTSAVEDBY", {"DocInfo.ChangeAuthor", FIELD_LASTSAVEDBY }},
- {"MACROBUTTON", {"Macro", FIELD_MACROBUTTON }},
- {"MERGEFIELD", {"Database", FIELD_MERGEFIELD }},
- {"MERGEREC", {"DatabaseNumberOfSet", FIELD_MERGEREC }},
-// {"MERGESEQ", {"", FIELD_MERGESEQ }},
- {"NEXT", {"DatabaseNextSet", FIELD_NEXT }},
- {"NEXTIF", {"DatabaseNextSet", FIELD_NEXTIF }},
- {"PAGE", {"PageNumber", FIELD_PAGE }},
- {"PAGEREF", {"GetReference", FIELD_PAGEREF }},
- {"PRINTDATE", {"DocInfo.PrintDateTime", FIELD_PRINTDATE }},
- {"REF", {"GetReference", FIELD_REF }},
- {"REVNUM", {"DocInfo.Revision", FIELD_REVNUM }},
- {"SAVEDATE", {"DocInfo.ChangeDateTime", FIELD_SAVEDATE }},
-// {"SECTION", {"", FIELD_SECTION }},
-// {"SECTIONPAGES", {"", FIELD_SECTIONPAGES }},
- {"SEQ", {"SetExpression", FIELD_SEQ }},
- {"SET", {"SetExpression", FIELD_SET }},
-// {"SKIPIF", {"", FIELD_SKIPIF }},
- {"STYLEREF", {"GetReference", FIELD_STYLEREF }},
- {"SUBJECT", {"DocInfo.Subject", FIELD_SUBJECT }},
- {"SYMBOL", {"", FIELD_SYMBOL }},
- {"TEMPLATE", {"TemplateName", FIELD_TEMPLATE }},
- {"TIME", {"DateTime", FIELD_TIME }},
- {"TITLE", {"DocInfo.Title", FIELD_TITLE }},
- {"USERINITIALS", {"Author", FIELD_USERINITIALS }},
-// {"USERADDRESS", {"", FIELD_USERADDRESS }},
- {"USERNAME", {"Author", FIELD_USERNAME }},
-
-
- {"TOC", {"com.sun.star.text.ContentIndex", FIELD_TOC }},
- {"TC", {"com.sun.star.text.ContentIndexMark", FIELD_TC }},
- {"NUMCHARS", {"CharacterCount", FIELD_NUMCHARS }},
- {"NUMWORDS", {"WordCount", FIELD_NUMWORDS }},
- {"NUMPAGES", {"PageCount", FIELD_NUMPAGES }},
- {"INDEX", {"com.sun.star.text.DocumentIndex", FIELD_INDEX }},
- {"XE", {"com.sun.star.text.DocumentIndexMark", FIELD_XE }},
- {"BIBLIOGRAPHY",{"com.sun.star.text.Bibliography", FIELD_BIBLIOGRAPHY }},
- {"CITATION", {"com.sun.star.text.TextField.Bibliography",FIELD_CITATION }},
- };
-
- return aFieldConversionMap;
-}
-
-static const FieldConversionMap_t & lcl_GetEnhancedFieldConversion()
-{
- static const FieldConversionMap_t aEnhancedFieldConversionMap =
- {
- {"FORMCHECKBOX", {"FormFieldmark", FIELD_FORMCHECKBOX}},
- {"FORMDROPDOWN", {"FormFieldmark", FIELD_FORMDROPDOWN}},
- {"FORMTEXT", {"Fieldmark", FIELD_FORMTEXT}},
- };
-
- return aEnhancedFieldConversionMap;
-}
-
-void DomainMapper_Impl::handleFieldSet
- (const FieldContextPtr& pContext,
- uno::Reference< uno::XInterface > const & xFieldInterface,
- uno::Reference< beans::XPropertySet > const& xFieldProperties)
-{
- OUString sVariable, sHint;
-
- sVariable = lcl_ExtractVariableAndHint(pContext->GetCommand(), sHint);
-
- // remove surrounding "" if exists
- if(sHint.getLength() >= 2)
- {
- std::u16string_view sTmp = o3tl::trim(sHint);
- if (o3tl::starts_with(sTmp, u"\"") && o3tl::ends_with(sTmp, u"\""))
- {
- sHint = sTmp.substr(1, sTmp.size() - 2);
- }
- }
-
- // determine field master name
- uno::Reference< beans::XPropertySet > xMaster =
- FindOrCreateFieldMaster
- ("com.sun.star.text.FieldMaster.SetExpression", sVariable);
-
- // a set field is a string
- xMaster->setPropertyValue(getPropertyName(PROP_SUB_TYPE), uno::Any(text::SetVariableType::STRING));
-
- // attach the master to the field
- uno::Reference< text::XDependentTextField > xDependentField
- ( xFieldInterface, uno::UNO_QUERY_THROW );
- xDependentField->attachTextFieldMaster( xMaster );
-
- uno::Any aAnyHint(sHint);
- xFieldProperties->setPropertyValue(getPropertyName(PROP_HINT), aAnyHint);
- xFieldProperties->setPropertyValue(getPropertyName(PROP_CONTENT), aAnyHint);
- xFieldProperties->setPropertyValue(getPropertyName(PROP_SUB_TYPE), uno::Any(text::SetVariableType::STRING));
-
- // Mimic MS Word behavior (hide the SET)
- xFieldProperties->setPropertyValue(getPropertyName(PROP_IS_VISIBLE), uno::Any(false));
-}
-
-void DomainMapper_Impl::handleFieldAsk
- (const FieldContextPtr& pContext,
- uno::Reference< uno::XInterface > & xFieldInterface,
- uno::Reference< beans::XPropertySet > const& xFieldProperties)
-{
- //doesn the command contain a variable name?
- OUString sVariable, sHint;
-
- sVariable = lcl_ExtractVariableAndHint( pContext->GetCommand(),
- sHint );
- if(!sVariable.isEmpty())
- {
- // determine field master name
- uno::Reference< beans::XPropertySet > xMaster =
- FindOrCreateFieldMaster
- ("com.sun.star.text.FieldMaster.SetExpression", sVariable );
- // An ASK field is always a string of characters
- xMaster->setPropertyValue(getPropertyName(PROP_SUB_TYPE), uno::Any(text::SetVariableType::STRING));
-
- // attach the master to the field
- uno::Reference< text::XDependentTextField > xDependentField
- ( xFieldInterface, uno::UNO_QUERY_THROW );
- xDependentField->attachTextFieldMaster( xMaster );
-
- // set input flag at the field
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_IS_INPUT), uno::Any( true ));
- // set the prompt
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_HINT),
- uno::Any( sHint ));
- xFieldProperties->setPropertyValue(getPropertyName(PROP_SUB_TYPE), uno::Any(text::SetVariableType::STRING));
- // The ASK has no field value to display
- xFieldProperties->setPropertyValue(getPropertyName(PROP_IS_VISIBLE), uno::Any(false));
- }
- else
- {
- //don't insert the field
- //todo: maybe import a 'normal' input field here?
- xFieldInterface = nullptr;
- }
-}
-
-/**
- * Converts a Microsoft Word field formula into LibreOffice syntax
- * @param input The Microsoft Word field formula, with no leading '=' sign
- * @return An equivalent LibreOffice field formula
- */
-OUString DomainMapper_Impl::convertFieldFormula(const OUString& input) {
-
- if (!m_pSettingsTable)
- {
- return input;
- }
-
- OUString listSeparator = m_pSettingsTable->GetListSeparator();
-
- /* Replace logical condition functions with LO equivalent operators */
- OUString changed = input.replaceAll(" <> ", " NEQ ");
- changed = changed.replaceAll(" <= ", " LEQ ");
- changed = changed.replaceAll(" >= ", " GEQ ");
- changed = changed.replaceAll(" = " , " EQ ");
- changed = changed.replaceAll(" < " , " L ");
- changed = changed.replaceAll(" > " , " G ");
-
- changed = changed.replaceAll("<>", " NEQ ");
- changed = changed.replaceAll("<=", " LEQ ");
- changed = changed.replaceAll(">=", " GEQ ");
- changed = changed.replaceAll("=" , " EQ ");
- changed = changed.replaceAll("<" , " L ");
- changed = changed.replaceAll(">" , " G ");
-
- /* Replace function calls with infix keywords for AND(), OR(), and ROUND(). Nothing needs to be
- * done for NOT(). This simple regex will work properly with most common cases. However, it may
- * not work correctly when the arguments are nested subcalls to other functions, like
- * ROUND(MIN(1,2),MAX(3,4)). See TDF#134765. */
- icu::ErrorCode status;
- icu::UnicodeString usInput(changed.getStr());
- const uint32_t rMatcherFlags = UREGEX_CASE_INSENSITIVE;
- OUString regex = "\\b(AND|OR|ROUND)\\s*\\(\\s*([^" + listSeparator + "]+)\\s*" + listSeparator + "\\s*([^)]+)\\s*\\)";
- icu::UnicodeString usRegex(regex.getStr());
- icu::RegexMatcher rmatch1(usRegex, usInput, rMatcherFlags, status);
- usInput = rmatch1.replaceAll(icu::UnicodeString("(($2) $1 ($3))"), status);
-
- /* Assumes any remaining list separators separate arguments to functions that accept lists
- * (SUM, MIN, MAX, MEAN, etc.) */
- usInput.findAndReplace(icu::UnicodeString(listSeparator.getStr()), "|");
-
- /* Surround single cell references with angle brackets.
- * If there is ever added a function name that ends with a digit, this regex will need to be revisited. */
- icu::RegexMatcher rmatch2("\\b([A-Z]{1,3}[0-9]+)\\b(?![(])", usInput, rMatcherFlags, status);
- usInput = rmatch2.replaceAll(icu::UnicodeString("<$1>"), status);
-
- /* Cell references must be upper case
- * TODO: convert reference to other tables, e.g. SUM(Table1 A1:B2), where "Table1" is a bookmark of the table,
- * TODO: also column range A:A */
- icu::RegexMatcher rmatch3("(<[a-z]{1,3}[0-9]+>|\\b(above|below|left|right)\\b)", usInput, rMatcherFlags, status);
- icu::UnicodeString replacedCellRefs;
- while (rmatch3.find(status) && status.isSuccess()) {
- rmatch3.appendReplacement(replacedCellRefs, rmatch3.group(status).toUpper(), status);
- }
- rmatch3.appendTail(replacedCellRefs);
-
- /* Fix up cell ranges */
- icu::RegexMatcher rmatch4("<([A-Z]{1,3}[0-9]+)>:<([A-Z]{1,3}[0-9]+)>", replacedCellRefs, rMatcherFlags, status);
- usInput = rmatch4.replaceAll(icu::UnicodeString("<$1:$2>"), status);
-
- /* Fix up user defined names */
- icu::RegexMatcher rmatch5("\\bDEFINED\\s*\\(<([A-Z]+[0-9]+)>\\)", usInput, rMatcherFlags, status);
- usInput = rmatch5.replaceAll(icu::UnicodeString("DEFINED($1)"), status);
-
- /* Prepare replace of ABOVE/BELOW/LEFT/RIGHT by adding spaces around them */
- icu::RegexMatcher rmatch6("\\b(ABOVE|BELOW|LEFT|RIGHT)\\b", usInput, rMatcherFlags, status);
- usInput = rmatch6.replaceAll(icu::UnicodeString(" $1 "), status);
-
- /* DOCX allows to set decimal symbol independently from the locale of the document, so if
- * needed, convert decimal comma to get working formula in a document language (locale),
- * which doesn't use decimal comma */
- if ( m_pSettingsTable->GetDecimalSymbol() == "," && !m_bIsDecimalComma )
- {
- icu::RegexMatcher rmatch7("\\b([0-9]+),([0-9]+([eE][-]?[0-9]+)?)\\b", usInput, rMatcherFlags, status);
- usInput = rmatch7.replaceAll(icu::UnicodeString("$1.$2"), status);
- }
-
- return OUString(usInput.getTerminatedBuffer());
-}
-
-void DomainMapper_Impl::handleFieldFormula
- (const FieldContextPtr& pContext,
- uno::Reference< beans::XPropertySet > const& xFieldProperties)
-{
- OUString command = pContext->GetCommand().trim();
-
- // Remove number formatting from \# to end of command
- // TODO: handle custom number formatting
- sal_Int32 delimPos = command.indexOf("\\#");
- if (delimPos != -1)
- {
- command = command.replaceAt(delimPos, command.getLength() - delimPos, u"").trim();
- }
-
- // command must contains = and at least another char
- if (command.getLength() < 2)
- return;
-
- // we don't copy the = symbol from the command
- OUString formula = convertFieldFormula(command.copy(1));
-
- xFieldProperties->setPropertyValue(getPropertyName(PROP_CONTENT), uno::Any(formula));
- xFieldProperties->setPropertyValue(getPropertyName(PROP_NUMBER_FORMAT), uno::Any(sal_Int32(0)));
- xFieldProperties->setPropertyValue("IsShowFormula", uno::Any(false));
-
- // grab-bag the original and converted formula
- if (hasTableManager())
- {
- TablePropertyMapPtr pPropMap(new TablePropertyMap());
- pPropMap->Insert(PROP_CELL_FORMULA, uno::Any(command.copy(1)), true, CELL_GRAB_BAG);
- pPropMap->Insert(PROP_CELL_FORMULA_CONVERTED, uno::Any(formula), true, CELL_GRAB_BAG);
- getTableManager().cellProps(pPropMap);
- }
-}
-
-void DomainMapper_Impl::handleRubyEQField( const FieldContextPtr& pContext)
-{
- const OUString & rCommand(pContext->GetCommand());
- sal_Int32 nIndex = 0, nEnd = 0;
- RubyInfo aInfo ;
- nIndex = rCommand.indexOf("\\* jc" );
- if (nIndex != -1)
- {
- nIndex += 5;
- sal_uInt32 nJc = o3tl::toInt32(o3tl::getToken(rCommand, 0, ' ',nIndex));
- const sal_Int32 aRubyAlignValues[] =
- {
- NS_ooxml::LN_Value_ST_RubyAlign_center,
- NS_ooxml::LN_Value_ST_RubyAlign_distributeLetter,
- NS_ooxml::LN_Value_ST_RubyAlign_distributeSpace,
- NS_ooxml::LN_Value_ST_RubyAlign_left,
- NS_ooxml::LN_Value_ST_RubyAlign_right,
- NS_ooxml::LN_Value_ST_RubyAlign_rightVertical,
- };
- aInfo.nRubyAlign = aRubyAlignValues[(nJc<SAL_N_ELEMENTS(aRubyAlignValues))?nJc:0];
- }
-
- // we don't parse or use the font field in rCommand
-
- nIndex = rCommand.indexOf("\\* hps" );
- if (nIndex != -1)
- {
- nIndex += 6;
- aInfo.nHps = o3tl::toInt32(o3tl::getToken(rCommand, 0, ' ',nIndex));
- }
-
- nIndex = rCommand.indexOf("\\o");
- if (nIndex == -1)
- return;
- nIndex = rCommand.indexOf('(', nIndex);
- if (nIndex == -1)
- return;
- nEnd = rCommand.lastIndexOf(')');
- if (nEnd == -1)
- return;
- if (nEnd <= nIndex)
- return;
-
- std::u16string_view sRubyParts = rCommand.subView(nIndex+1,nEnd-nIndex-1);
- nIndex = 0;
- std::u16string_view sPart1 = o3tl::getToken(sRubyParts, 0, ',', nIndex);
- std::u16string_view sPart2 = o3tl::getToken(sRubyParts, 0, ',', nIndex);
- size_t nIndex2 = 0;
- size_t nEnd2 = 0;
- if ((nIndex2 = sPart1.find('(')) != std::u16string_view::npos && (nEnd2 = sPart1.rfind(')')) != std::u16string_view::npos && nEnd2 > nIndex2)
- {
- aInfo.sRubyText = sPart1.substr(nIndex2+1,nEnd2-nIndex2-1);
- }
-
- PropertyMapPtr pRubyContext(new PropertyMap());
- pRubyContext->InsertProps(GetTopContext());
- if (aInfo.nHps > 0)
- {
- double fVal = double(aInfo.nHps) / 2.;
- uno::Any aVal( fVal );
-
- pRubyContext->Insert(PROP_CHAR_HEIGHT, aVal);
- pRubyContext->Insert(PROP_CHAR_HEIGHT_ASIAN, aVal);
- }
- PropertyValueVector_t aProps = comphelper::sequenceToContainer< PropertyValueVector_t >(pRubyContext->GetPropertyValues());
- aInfo.sRubyStyle = m_rDMapper.getOrCreateCharStyle(aProps, /*bAlwaysCreate=*/false);
- PropertyMapPtr pCharContext(new PropertyMap());
- if (m_pLastCharacterContext)
- pCharContext->InsertProps(m_pLastCharacterContext);
- pCharContext->InsertProps(pContext->getProperties());
- pCharContext->Insert(PROP_RUBY_TEXT, uno::Any( aInfo.sRubyText ) );
- pCharContext->Insert(PROP_RUBY_ADJUST, uno::Any(static_cast<sal_Int16>(ConversionHelper::convertRubyAlign(aInfo.nRubyAlign))));
- if ( aInfo.nRubyAlign == NS_ooxml::LN_Value_ST_RubyAlign_rightVertical )
- pCharContext->Insert(PROP_RUBY_POSITION, uno::Any(css::text::RubyPosition::INTER_CHARACTER));
- pCharContext->Insert(PROP_RUBY_STYLE, uno::Any(aInfo.sRubyStyle));
- appendTextPortion(OUString(sPart2), pCharContext);
-
-}
-
-void DomainMapper_Impl::handleAutoNum
- (const FieldContextPtr& pContext,
- uno::Reference< uno::XInterface > const & xFieldInterface,
- uno::Reference< beans::XPropertySet > const& xFieldProperties)
-{
- //create a sequence field master "AutoNr"
- uno::Reference< beans::XPropertySet > xMaster =
- FindOrCreateFieldMaster
- ("com.sun.star.text.FieldMaster.SetExpression",
- "AutoNr");
-
- xMaster->setPropertyValue( getPropertyName(PROP_SUB_TYPE),
- uno::Any(text::SetVariableType::SEQUENCE));
-
- //apply the numbering type
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_NUMBERING_TYPE),
- uno::Any( lcl_ParseNumberingType(pContext->GetCommand()) ));
- // attach the master to the field
- uno::Reference< text::XDependentTextField > xDependentField
- ( xFieldInterface, uno::UNO_QUERY_THROW );
- xDependentField->attachTextFieldMaster( xMaster );
-}
-
-void DomainMapper_Impl::handleAuthor
- (std::u16string_view,
- uno::Reference< beans::XPropertySet > const& xFieldProperties,
- FieldId eFieldId )
-{
- if (eFieldId == FIELD_USERNAME)
- xFieldProperties->setPropertyValue
- ( getPropertyName(PROP_FULL_NAME), uno::Any( true ));
-
- // Always set as FIXED b/c MS Word only updates these fields via user intervention (F9)
- // AUTHOR of course never changes and USERNAME is easily mis-used as an original author field.
- // Additionally, this was forced as fixed if any special case-formatting was provided.
- {
- xFieldProperties->setPropertyValue(
- getPropertyName( PROP_IS_FIXED ),
- uno::Any( true ));
- //PROP_CURRENT_PRESENTATION is set later anyway
- }
-}
-
- void DomainMapper_Impl::handleDocProperty
- (const FieldContextPtr& pContext,
- OUString const& rFirstParam,
- uno::Reference< uno::XInterface > & xFieldInterface)
-{
- //some docproperties should be imported as document statistic fields, some as DocInfo fields
- //others should be user fields
- if (rFirstParam.isEmpty())
- return;
-
- constexpr sal_uInt8 SET_ARABIC = 0x01;
- constexpr sal_uInt8 SET_DATE = 0x04;
- struct DocPropertyMap
- {
- const char* pDocPropertyName;
- const char* pServiceName;
- sal_uInt8 nFlags;
- };
- static const DocPropertyMap aDocProperties[] =
- {
- {"CreateTime", "DocInfo.CreateDateTime", SET_DATE},
- {"Characters", "CharacterCount", SET_ARABIC},
- {"Comments", "DocInfo.Description", 0},
- {"Keywords", "DocInfo.KeyWords", 0},
- {"LastPrinted", "DocInfo.PrintDateTime", 0},
- {"LastSavedBy", "DocInfo.ChangeAuthor", 0},
- {"LastSavedTime", "DocInfo.ChangeDateTime", SET_DATE},
- {"Paragraphs", "ParagraphCount", SET_ARABIC},
- {"RevisionNumber", "DocInfo.Revision", 0},
- {"Subject", "DocInfo.Subject", 0},
- {"Template", "TemplateName", 0},
- {"Title", "DocInfo.Title", 0},
- {"TotalEditingTime", "DocInfo.EditTime", 0},
- {"Words", "WordCount", SET_ARABIC}
-
- //other available DocProperties:
- //Bytes, Category, CharactersWithSpaces, Company
- //HyperlinkBase,
- //Lines, Manager, NameofApplication, ODMADocId, Pages,
- //Security,
- };
- uno::Reference<document::XDocumentPropertiesSupplier> xDocumentPropertiesSupplier(m_xTextDocument, uno::UNO_QUERY);
- uno::Reference<document::XDocumentProperties> xDocumentProperties = xDocumentPropertiesSupplier->getDocumentProperties();
- uno::Reference<beans::XPropertySet> xUserDefinedProps(xDocumentProperties->getUserDefinedProperties(), uno::UNO_QUERY_THROW);
- uno::Reference<beans::XPropertySetInfo> xPropertySetInfo = xUserDefinedProps->getPropertySetInfo();
- //search for a field mapping
- OUString sFieldServiceName;
- size_t nMap = 0;
- if (!xPropertySetInfo->hasPropertyByName(rFirstParam))
- {
- for( ; nMap < SAL_N_ELEMENTS(aDocProperties); ++nMap )
- {
- if (rFirstParam.equalsAscii(aDocProperties[nMap].pDocPropertyName))
- {
- sFieldServiceName = OUString::createFromAscii(aDocProperties[nMap].pServiceName);
- break;
- }
- }
- }
- else
- pContext->CacheVariableValue(xUserDefinedProps->getPropertyValue(rFirstParam));
-
- OUString sServiceName("com.sun.star.text.TextField.");
- bool bIsCustomField = false;
- if(sFieldServiceName.isEmpty())
- {
- //create a custom property field
- sServiceName += "DocInfo.Custom";
- bIsCustomField = true;
- }
- else
- {
- sServiceName += sFieldServiceName;
- }
- if (m_xTextFactory.is())
- xFieldInterface = m_xTextFactory->createInstance(sServiceName);
- uno::Reference<beans::XPropertySet> xFieldProperties( xFieldInterface, uno::UNO_QUERY_THROW);
- if( bIsCustomField )
- {
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_NAME), uno::Any(rFirstParam));
- pContext->SetCustomField( xFieldProperties );
- }
- else
- {
- if(0 != (aDocProperties[nMap].nFlags & SET_ARABIC))
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_NUMBERING_TYPE),
- uno::Any( style::NumberingType::ARABIC ));
- else if(0 != (aDocProperties[nMap].nFlags & SET_DATE))
- {
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_IS_DATE),
- uno::Any( true ));
- SetNumberFormat( pContext->GetCommand(), xFieldProperties );
- }
- }
-}
-
-static uno::Sequence< beans::PropertyValues > lcl_createTOXLevelHyperlinks( bool bHyperlinks, const OUString& sChapterNoSeparator,
- const uno::Sequence< beans::PropertyValues >& aLevel, const std::optional<style::TabStop> numtab)
-{
- //create a copy of the level and add new entries
-
- std::vector<css::beans::PropertyValues> aNewLevel;
- aNewLevel.reserve(aLevel.getLength() + 5); // at most 5 added items
-
- static constexpr OUString tokType(u"TokenType"_ustr);
- static constexpr OUString tokHStart(u"TokenHyperlinkStart"_ustr);
- static constexpr OUString tokHEnd(u"TokenHyperlinkEnd"_ustr);
- static constexpr OUStringLiteral tokPNum(u"TokenPageNumber");
- static constexpr OUStringLiteral tokENum(u"TokenEntryNumber");
-
- if (bHyperlinks)
- aNewLevel.push_back({ comphelper::makePropertyValue(tokType, tokHStart) });
-
- for (const auto& item : aLevel)
- {
- OUString tokenType;
- if (auto it = std::find_if(item.begin(), item.end(),
- [](const auto& p) { return p.Name == tokType; });
- it != item.end())
- it->Value >>= tokenType;
-
- if (bHyperlinks && (tokenType == tokHStart || tokenType == tokHEnd))
- continue; // We add hyperlink ourselves, so just skip existing hyperlink start / end
-
- if (!sChapterNoSeparator.isEmpty() && tokenType == tokPNum)
- {
- // This is an existing page number token; insert the chapter and separator before it
- aNewLevel.push_back(
- { comphelper::makePropertyValue(tokType, OUString("TokenChapterInfo")),
- comphelper::makePropertyValue("ChapterFormat", text::ChapterFormat::NUMBER) });
- aNewLevel.push_back({ comphelper::makePropertyValue(tokType, OUString("TokenText")),
- comphelper::makePropertyValue("Text", sChapterNoSeparator) });
- }
-
- aNewLevel.push_back(item);
-
- if (numtab && tokenType == tokENum)
- {
- // There is a fixed tab stop position needed in the level after the numbering
- aNewLevel.push_back(
- { comphelper::makePropertyValue(tokType, OUString("TokenTabStop")),
- comphelper::makePropertyValue("TabStopPosition", numtab->Position) });
- }
- }
-
- if (bHyperlinks)
- aNewLevel.push_back({ comphelper::makePropertyValue(tokType, tokHEnd) });
-
- return comphelper::containerToSequence(aNewLevel);
-}
-
-/// Returns title of the TOC placed in paragraph(s) before TOC field inside STD-frame
-OUString DomainMapper_Impl::extractTocTitle()
-{
- if (!m_StreamStateStack.top().xSdtEntryStart.is())
- return OUString();
-
- uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if(!xTextAppend.is())
- return OUString();
-
- // try-catch was added in the same way as inside appendTextSectionAfter()
- try
- {
- uno::Reference<text::XParagraphCursor> const xCursor(
- xTextAppend->createTextCursorByRange(m_StreamStateStack.top().xSdtEntryStart), uno::UNO_QUERY_THROW);
- if (!xCursor.is())
- return OUString();
-
- //the cursor has been moved to the end of the paragraph because of the appendTextPortion() calls
- xCursor->gotoStartOfParagraph( false );
- if (m_aTextAppendStack.top().xInsertPosition.is())
- xCursor->gotoRange( m_aTextAppendStack.top().xInsertPosition, true );
- else
- xCursor->gotoEnd( true );
-
- // the paragraph after this new section might have been already inserted
- OUString sResult = xCursor->getString();
- if (sResult.endsWith(SAL_NEWLINE_STRING))
- sResult = sResult.copy(0, sResult.getLength() - SAL_N_ELEMENTS(SAL_NEWLINE_STRING) + 1);
-
- return sResult;
- }
- catch(const uno::Exception&)
- {
- }
-
- return OUString();
-}
-
-css::uno::Reference<css::beans::XPropertySet>
-DomainMapper_Impl::StartIndexSectionChecked(const OUString& sServiceName)
-{
- if (m_StreamStateStack.top().bParaChanged)
- {
- finishParagraph(GetTopContextOfType(CONTEXT_PARAGRAPH), false); // resets bParaChanged
- PopProperties(CONTEXT_PARAGRAPH);
- PushProperties(CONTEXT_PARAGRAPH);
- SetIsFirstRun(true);
- // The first paragraph of the index that is continuation of just finished one needs to be
- // removed when finished (unless more content will arrive, which will set bParaChanged)
- m_StreamStateStack.top().bRemoveThisParagraph = true;
- }
- const auto& xTextAppend = GetTopTextAppend();
- const auto xTextRange = xTextAppend->getEnd();
- const auto xRet = createSectionForRange(xTextRange, xTextRange, sServiceName, false);
- if (!m_aTextAppendStack.top().xInsertPosition)
- {
- try
- {
- m_bStartedTOC = true;
- uno::Reference<text::XTextCursor> xTOCTextCursor
- = xTextRange->getText()->createTextCursor();
- assert(xTOCTextCursor.is());
- xTOCTextCursor->gotoEnd(false);
- m_aTextAppendStack.push(TextAppendContext(xTextAppend, xTOCTextCursor));
- }
- catch (const uno::Exception&)
- {
- TOOLS_WARN_EXCEPTION("writerfilter.dmapper",
- "DomainMapper_Impl::StartIndexSectionChecked:");
- }
- }
- return xRet;
-}
-
-/**
- This is a heuristic to find Word's w:styleId value from localised style name.
- It's not clear how exactly it works, but apparently Word stores into
- w:styleId some filtered representation of the localised style name.
- Tragically there are references to the localised style name itself in TOC
- fields.
- Hopefully this works and a complete map of >100 built-in style names
- localised to all languages isn't needed.
-*/
-static auto FilterChars(std::u16string_view const& rStyleName) -> OUString
-{
- return msfilter::util::CreateDOCXStyleId(rStyleName);
-}
-
-static OUString UnquoteFieldText(std::u16string_view s)
-{
- OUStringBuffer result(s.size());
- for (size_t i = 0; i < s.size(); ++i)
- {
- switch (s[i])
- {
- case '"':
- continue;
- case '\\':
- if (i < s.size() - 1)
- ++i;
- [[fallthrough]];
- default:
- result.append(s[i]);
- }
- }
- return result.makeStringAndClear();
-}
-
-OUString DomainMapper_Impl::ConvertTOCStyleName(OUString const& rTOCStyleName)
-{
- assert(!rTOCStyleName.isEmpty());
- if (auto const pStyle = GetStyleSheetTable()->FindStyleSheetByISTD(rTOCStyleName))
- { // theoretical case: what OOXML says
- return pStyle->m_sStyleName;
- }
- auto const pStyle = GetStyleSheetTable()->FindStyleSheetByISTD(FilterChars(rTOCStyleName));
- if (pStyle && m_bIsNewDoc)
- { // practical case: Word wrote i18n name to TOC field, but it doesn't
- // exist in styles.xml; tdf#153083 clone it for best roundtrip
- SAL_INFO("writerfilter.dmapper", "cloning TOC paragraph style (presumed built-in) " << rTOCStyleName << " from " << pStyle->m_sStyleName);
- return GetStyleSheetTable()->CloneTOCStyle(GetFontTable(), pStyle, rTOCStyleName);
- }
- else
- {
- return GetStyleSheetTable()->ConvertStyleName(rTOCStyleName);
- }
-}
-
-void DomainMapper_Impl::handleToc
- (const FieldContextPtr& pContext,
- const OUString & sTOCServiceName)
-{
- OUString sValue;
- if (IsInHeaderFooter())
- m_bStartTOCHeaderFooter = true;
- bool bTableOfFigures = false;
- bool bHyperlinks = false;
- bool bFromOutline = false;
- bool bFromEntries = false;
- bool bHideTabLeaderPageNumbers = false ;
- bool bIsTabEntry = false ;
- bool bNewLine = false ;
- bool bParagraphOutlineLevel = false;
-
- sal_Int16 nMaxLevel = 10;
- OUString sTemplate;
- OUString sChapterNoSeparator;
- OUString sFigureSequence;
- OUString aBookmarkName;
-
-// \a Builds a table of figures but does not include the captions's label and number
- if( lcl_FindInCommand( pContext->GetCommand(), 'a', sValue ))
- { //make it a table of figures
- bTableOfFigures = true;
- }
-// \b Uses a bookmark to specify area of document from which to build table of contents
- if( lcl_FindInCommand( pContext->GetCommand(), 'b', sValue ))
- {
- aBookmarkName = sValue.trim().replaceAll("\"","");
- }
- if( lcl_FindInCommand( pContext->GetCommand(), 'c', sValue ))
-// \c Builds a table of figures of the given label
- {
- //todo: sValue contains the label's name
- bTableOfFigures = true;
- sFigureSequence = sValue.trim();
- sFigureSequence = sFigureSequence.replaceAll("\"", "").replaceAll("'","");
- }
-// \d Defines the separator between sequence and page numbers
- if( lcl_FindInCommand( pContext->GetCommand(), 'd', sValue ))
- {
- //todo: insert the chapter number into each level and insert the separator additionally
- sChapterNoSeparator = UnquoteFieldText(sValue);
- }
-// \f Builds a table of contents using TC entries instead of outline levels
- if( lcl_FindInCommand( pContext->GetCommand(), 'f', sValue ))
- {
- //todo: sValue can contain a TOC entry identifier - use unclear
- bFromEntries = true;
- }
-// \h Hyperlinks the entries and page numbers within the table of contents
- if( lcl_FindInCommand( pContext->GetCommand(), 'h', sValue ))
- {
- //todo: make all entries to hyperlinks
- bHyperlinks = true;
- }
-// \l Defines the TC entries field level used to build a table of contents
-// if( lcl_FindInCommand( pContext->GetCommand(), 'l', sValue ))
-// {
- //todo: entries can only be included completely
-// }
-// \n Builds a table of contents or a range of entries, such as 1-9 in a table of contents without page numbers
-// if( lcl_FindInCommand( pContext->GetCommand(), 'n', sValue ))
-// {
- //todo: what does the description mean?
-// }
-// \o Builds a table of contents by using outline levels instead of TC entries
- if( lcl_FindInCommand( pContext->GetCommand(), 'o', sValue ))
- {
- bFromOutline = true;
- if (sValue.isEmpty())
- nMaxLevel = WW_OUTLINE_MAX;
- else
- {
- sal_Int32 nIndex = 0;
- o3tl::getToken(sValue, 0, '-', nIndex );
- nMaxLevel = static_cast<sal_Int16>(nIndex != -1 ? o3tl::toInt32(sValue.subView(nIndex)) : 0);
- }
- }
-// \p Defines the separator between the table entry and its page number
-// \s Builds a table of contents by using a sequence type
-// \t Builds a table of contents by using style names other than the standard outline styles
- if( lcl_FindInCommand( pContext->GetCommand(), 't', sValue ))
- {
- OUString sToken = sValue.getToken(1, '"');
- sTemplate = sToken.isEmpty() ? sValue : sToken;
- }
-// \u Builds a table of contents by using the applied paragraph outline level
- if( lcl_FindInCommand( pContext->GetCommand(), 'u', sValue ))
- {
- bFromOutline = true;
- bParagraphOutlineLevel = true;
- //todo: what doesn 'the applied paragraph outline level' refer to?
- }
-// \w Preserve tab characters within table entries
- if( lcl_FindInCommand( pContext->GetCommand(), 'w', sValue ))
- {
- bIsTabEntry = true ;
- }
-// \x Preserve newline characters within table entries
- if( lcl_FindInCommand( pContext->GetCommand(), 'x', sValue ))
- {
- bNewLine = true ;
- }
-// \z Hides page numbers within the table of contents when shown in Web Layout View
- if( lcl_FindInCommand( pContext->GetCommand(), 'z', sValue ))
- {
- bHideTabLeaderPageNumbers = true ;
- }
-
- //if there's no option then it should be created from outline
- if( !bFromOutline && !bFromEntries && sTemplate.isEmpty() )
- bFromOutline = true;
-
- const OUString aTocTitle = extractTocTitle();
-
- uno::Reference<beans::XPropertySet> xTOC;
-
- if (m_xTextFactory.is() && ! m_aTextAppendStack.empty())
- {
- const auto& xTextAppend = GetTopTextAppend();
- if (aTocTitle.isEmpty() || bTableOfFigures)
- {
- // reset marker of the TOC title
- m_StreamStateStack.top().xSdtEntryStart.clear();
-
- // Create section before setting m_bStartTOC: finishing paragraph
- // inside StartIndexSectionChecked could do the wrong thing otherwise
- xTOC = StartIndexSectionChecked(bTableOfFigures ? "com.sun.star.text.IllustrationsIndex"
- : sTOCServiceName);
-
- const auto xTextCursor = xTextAppend->getText()->createTextCursor();
- if (xTextCursor)
- xTextCursor->gotoEnd(false);
- m_xTOCMarkerCursor = xTextCursor;
- }
- else
- {
- // create TOC section
- css::uno::Reference<css::text::XTextRange> xTextRangeEndOfTocHeader = GetTopTextAppend()->getEnd();
- xTOC = createSectionForRange(m_StreamStateStack.top().xSdtEntryStart, xTextRangeEndOfTocHeader, sTOCServiceName, false);
-
- // init [xTOCMarkerCursor]
- uno::Reference< text::XText > xText = xTextAppend->getText();
- m_xTOCMarkerCursor = xText->createTextCursor();
-
- // create header of the TOC with the TOC title inside
- createSectionForRange(m_StreamStateStack.top().xSdtEntryStart, xTextRangeEndOfTocHeader, "com.sun.star.text.IndexHeaderSection", true);
- }
- }
-
- m_bStartTOC = true;
- pContext->SetTOC(xTOC);
- m_StreamStateStack.top().bParaHadField = false;
-
- if (!xTOC)
- return;
-
- xTOC->setPropertyValue(getPropertyName( PROP_TITLE ), uno::Any(aTocTitle));
-
- if (!aBookmarkName.isEmpty())
- xTOC->setPropertyValue(getPropertyName(PROP_TOC_BOOKMARK), uno::Any(aBookmarkName));
- if (!bTableOfFigures)
- {
- xTOC->setPropertyValue( getPropertyName( PROP_LEVEL ), uno::Any( nMaxLevel ) );
- xTOC->setPropertyValue( getPropertyName( PROP_CREATE_FROM_OUTLINE ), uno::Any( bFromOutline ));
- xTOC->setPropertyValue( getPropertyName( PROP_CREATE_FROM_MARKS ), uno::Any( bFromEntries ));
- xTOC->setPropertyValue( getPropertyName( PROP_HIDE_TAB_LEADER_AND_PAGE_NUMBERS ), uno::Any( bHideTabLeaderPageNumbers ));
- xTOC->setPropertyValue( getPropertyName( PROP_TAB_IN_TOC ), uno::Any( bIsTabEntry ));
- xTOC->setPropertyValue( getPropertyName( PROP_TOC_NEW_LINE ), uno::Any( bNewLine ));
- xTOC->setPropertyValue( getPropertyName( PROP_TOC_PARAGRAPH_OUTLINE_LEVEL ), uno::Any( bParagraphOutlineLevel ));
- if( !sTemplate.isEmpty() )
- {
- //the string contains comma separated the names and related levels
- //like: "Heading 1,1,Heading 2,2"
- TOCStyleMap aMap;
- sal_Int32 nLevel;
- sal_Int32 nPosition = 0;
- auto const tsep(sTemplate.indexOf(',') != -1 ? ',' : ';');
- while( nPosition >= 0)
- {
- OUString sStyleName = sTemplate.getToken(0, tsep, nPosition);
- //empty tokens should be skipped
- while( sStyleName.isEmpty() && nPosition > 0 )
- sStyleName = sTemplate.getToken(0, tsep, nPosition);
- nLevel = o3tl::toInt32(o3tl::getToken(sTemplate, 0, tsep, nPosition ));
- if( !nLevel )
- nLevel = 1;
- if( !sStyleName.isEmpty() )
- aMap.emplace(nLevel, sStyleName);
- }
- uno::Reference< container::XIndexReplace> xParaStyles;
- xTOC->getPropertyValue(getPropertyName(PROP_LEVEL_PARAGRAPH_STYLES)) >>= xParaStyles;
- for( nLevel = 1; nLevel < 10; ++nLevel)
- {
- sal_Int32 nLevelCount = aMap.count( nLevel );
- if( nLevelCount )
- {
- TOCStyleMap::iterator aTOCStyleIter = aMap.find( nLevel );
-
- uno::Sequence< OUString> aStyles( nLevelCount );
- for ( auto& rStyle : asNonConstRange(aStyles) )
- {
- // tdf#153083 must map w:styleId to w:name
- rStyle = ConvertTOCStyleName(aTOCStyleIter->second);
- ++aTOCStyleIter;
- }
- xParaStyles->replaceByIndex(nLevel - 1, uno::Any(aStyles));
- }
- }
- xTOC->setPropertyValue(getPropertyName(PROP_CREATE_FROM_LEVEL_PARAGRAPH_STYLES), uno::Any( true ));
-
- }
-
- uno::Reference<container::XIndexAccess> xChapterNumberingRules;
- if (auto xSupplier = GetTextDocument().query<text::XChapterNumberingSupplier>())
- xChapterNumberingRules = xSupplier->getChapterNumberingRules();
- uno::Reference<container::XNameContainer> xStyles;
- if (auto xStylesSupplier = GetTextDocument().query<style::XStyleFamiliesSupplier>())
- {
- auto xStyleFamilies = xStylesSupplier->getStyleFamilies();
- xStyleFamilies->getByName(getPropertyName(PROP_PARAGRAPH_STYLES)) >>= xStyles;
- }
-
- uno::Reference< container::XIndexReplace> xLevelFormats;
- xTOC->getPropertyValue(getPropertyName(PROP_LEVEL_FORMAT)) >>= xLevelFormats;
- sal_Int32 nLevelCount = xLevelFormats->getCount();
- //start with level 1, 0 is the header level
- for( sal_Int32 nLevel = 1; nLevel < nLevelCount; ++nLevel)
- {
- uno::Sequence< beans::PropertyValues > aLevel;
- xLevelFormats->getByIndex( nLevel ) >>= aLevel;
-
- // Get the tab stops coming from the styles; store to the level definitions
- std::optional<style::TabStop> numTab;
- if (xChapterNumberingRules && xStyles)
- {
- // This relies on the chapter numbering rules already defined
- // (see ListDef::CreateNumberingRules)
- uno::Sequence<beans::PropertyValue> props;
- xChapterNumberingRules->getByIndex(nLevel - 1) >>= props;
- bool bHasNumbering = false;
- bool bUseTabStop = false;
- for (const auto& propval : props)
- {
- // We rely on PositionAndSpaceMode being always equal to LABEL_ALIGNMENT,
- // because ListDef::CreateNumberingRules doesn't create legacy lists
- if (propval.Name == "NumberingType")
- bHasNumbering = propval.Value != style::NumberingType::NUMBER_NONE;
- else if (propval.Name == "LabelFollowedBy")
- bUseTabStop = propval.Value == text::LabelFollow::LISTTAB;
- // Do not use FirstLineIndent property from the rules, because it is unreliable
- }
- if (bHasNumbering && bUseTabStop)
- {
- OUString style;
- xTOC->getPropertyValue("ParaStyleLevel" + OUString::number(nLevel)) >>= style;
- uno::Reference<beans::XPropertySet> xStyle;
- if (xStyles->getByName(style) >>= xStyle)
- {
- if (uno::Reference<beans::XPropertyState> xPropState{ xStyle,
- uno::UNO_QUERY })
- {
- if (xPropState->getPropertyState("ParaTabStops")
- == beans::PropertyState_DIRECT_VALUE)
- {
- if (uno::Sequence<style::TabStop> tabStops;
- xStyle->getPropertyValue("ParaTabStops") >>= tabStops)
- {
- // If the style only has one tab stop, Word uses it for
- // page number, and generates the other from defaults
- if (tabStops.getLength() > 1)
- numTab = tabStops[0];
- }
- }
- }
- }
- if (!numTab)
- {
- // Generate the default position.
- // Word uses multiples of 440 twips for default chapter number tab stops
- numTab.emplace();
- numTab->Position
- = o3tl::convert(440 * nLevel, o3tl::Length::twip, o3tl::Length::mm100);
- }
- }
- }
-
- uno::Sequence< beans::PropertyValues > aNewLevel = lcl_createTOXLevelHyperlinks(
- bHyperlinks, sChapterNoSeparator,
- aLevel, numTab);
- xLevelFormats->replaceByIndex( nLevel, uno::Any( aNewLevel ) );
- }
- }
- else // if (bTableOfFigures)
- {
- if (!sFigureSequence.isEmpty())
- xTOC->setPropertyValue(getPropertyName(PROP_LABEL_CATEGORY),
- uno::Any(sFigureSequence));
-
- if (!sTemplate.isEmpty())
- {
- OUString const sConvertedStyleName(ConvertTOCStyleName(sTemplate));
- xTOC->setPropertyValue("CreateFromParagraphStyle", uno::Any(sConvertedStyleName));
- }
-
- if ( bHyperlinks )
- {
- uno::Reference< container::XIndexReplace> xLevelFormats;
- xTOC->getPropertyValue(getPropertyName(PROP_LEVEL_FORMAT)) >>= xLevelFormats;
- uno::Sequence< beans::PropertyValues > aLevel;
- xLevelFormats->getByIndex( 1 ) >>= aLevel;
-
- uno::Sequence< beans::PropertyValues > aNewLevel = lcl_createTOXLevelHyperlinks(
- bHyperlinks, sChapterNoSeparator,
- aLevel, {});
- xLevelFormats->replaceByIndex( 1, uno::Any( aNewLevel ) );
- }
- }
-}
-
-uno::Reference<beans::XPropertySet> DomainMapper_Impl::createSectionForRange(
- uno::Reference< css::text::XTextRange > xStart,
- uno::Reference< css::text::XTextRange > xEnd,
- const OUString & sObjectType,
- bool stepLeft)
-{
- if (!xStart.is())
- return uno::Reference<beans::XPropertySet>();
- if (!xEnd.is())
- return uno::Reference<beans::XPropertySet>();
-
- uno::Reference< beans::XPropertySet > xRet;
- if (m_aTextAppendStack.empty())
- return xRet;
- uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if(xTextAppend.is())
- {
- try
- {
- uno::Reference< text::XParagraphCursor > xCursor(
- xTextAppend->createTextCursorByRange( xStart ), uno::UNO_QUERY_THROW);
- //the cursor has been moved to the end of the paragraph because of the appendTextPortion() calls
- xCursor->gotoStartOfParagraph( false );
- xCursor->gotoRange( xEnd, true );
- //the paragraph after this new section is already inserted
- if (stepLeft)
- xCursor->goLeft(1, true);
- uno::Reference< text::XTextContent > xSection( m_xTextFactory->createInstance(sObjectType), uno::UNO_QUERY_THROW );
- try
- {
- xSection->attach( uno::Reference< text::XTextRange >( xCursor, uno::UNO_QUERY_THROW) );
- }
- catch(const uno::Exception&)
- {
- }
- xRet.set(xSection, uno::UNO_QUERY );
- }
- catch(const uno::Exception&)
- {
- }
- }
-
- return xRet;
-}
-
-void DomainMapper_Impl::handleBibliography
- (const FieldContextPtr& pContext,
- const OUString & sTOCServiceName)
-{
- if (m_aTextAppendStack.empty())
- {
- // tdf#130214: a workaround to avoid crash on import errors
- SAL_WARN("writerfilter.dmapper", "no text append stack");
- return;
- }
- // Create section before setting m_bStartTOC and m_bStartBibliography: finishing paragraph
- // inside StartIndexSectionChecked could do the wrong thing otherwise
- const auto xTOC = StartIndexSectionChecked(sTOCServiceName);
- m_bStartTOC = true;
- m_bStartBibliography = true;
-
- if (xTOC.is())
- xTOC->setPropertyValue(getPropertyName( PROP_TITLE ), uno::Any(OUString()));
-
- pContext->SetTOC( xTOC );
- m_StreamStateStack.top().bParaHadField = false;
-
- uno::Reference< text::XTextContent > xToInsert( xTOC, uno::UNO_QUERY );
- appendTextContent(xToInsert, uno::Sequence< beans::PropertyValue >() );
-}
-
-void DomainMapper_Impl::handleIndex
- (const FieldContextPtr& pContext,
- const OUString & sTOCServiceName)
-{
- // only UserIndex can handle user index defined by \f
- // e.g. INDEX \f "user-index-id"
- OUString sUserIndex;
- if ( lcl_FindInCommand( pContext->GetCommand(), 'f', sUserIndex ) )
- sUserIndex = lcl_trim(sUserIndex);
-
- // Create section before setting m_bStartTOC and m_bStartIndex: finishing paragraph
- // inside StartIndexSectionChecked could do the wrong thing otherwise
- const auto xTOC = StartIndexSectionChecked( sUserIndex.isEmpty()
- ? sTOCServiceName
- : "com.sun.star.text.UserIndex");
-
- m_bStartTOC = true;
- m_bStartIndex = true;
- OUString sValue;
- if (xTOC.is())
- {
- xTOC->setPropertyValue(getPropertyName( PROP_TITLE ), uno::Any(OUString()));
-
- if( lcl_FindInCommand( pContext->GetCommand(), 'r', sValue ))
- {
- xTOC->setPropertyValue("IsCommaSeparated", uno::Any(true));
- }
- if( lcl_FindInCommand( pContext->GetCommand(), 'h', sValue ))
- {
- xTOC->setPropertyValue("UseAlphabeticalSeparators", uno::Any(true));
- }
- if( !sUserIndex.isEmpty() )
- {
- xTOC->setPropertyValue("UserIndexName", uno::Any(sUserIndex));
- }
- }
- pContext->SetTOC( xTOC );
- m_StreamStateStack.top().bParaHadField = false;
-
- uno::Reference< text::XTextContent > xToInsert( xTOC, uno::UNO_QUERY );
- appendTextContent(xToInsert, uno::Sequence< beans::PropertyValue >() );
-
- if( lcl_FindInCommand( pContext->GetCommand(), 'c', sValue ))
- {
- sValue = sValue.replaceAll("\"", "");
- uno::Reference<text::XTextColumns> xTextColumns;
- if (xTOC.is())
- {
- xTOC->getPropertyValue(getPropertyName( PROP_TEXT_COLUMNS )) >>= xTextColumns;
- }
- if (xTextColumns.is())
- {
- xTextColumns->setColumnCount( sValue.toInt32() );
- xTOC->setPropertyValue( getPropertyName( PROP_TEXT_COLUMNS ), uno::Any( xTextColumns ) );
- }
- }
-}
-
-static auto InsertFieldmark(std::stack<TextAppendContext> & rTextAppendStack,
- uno::Reference<text::XFormField> const& xFormField,
- uno::Reference<text::XTextRange> const& xStartRange,
- std::optional<FieldId> const oFieldId) -> void
-{
- uno::Reference<text::XTextContent> const xTextContent(xFormField, uno::UNO_QUERY_THROW);
- uno::Reference<text::XTextAppend> const& xTextAppend(rTextAppendStack.top().xTextAppend);
- uno::Reference<text::XTextCursor> const xCursor =
- xTextAppend->createTextCursorByRange(xStartRange);
- if (rTextAppendStack.top().xInsertPosition.is())
- {
- uno::Reference<text::XTextRangeCompare> const xCompare(
- rTextAppendStack.top().xTextAppend,
- uno::UNO_QUERY);
- if (xCompare->compareRegionStarts(xStartRange, rTextAppendStack.top().xInsertPosition) < 0)
- {
- SAL_WARN("writerfilter.dmapper", "invalid field mark positions");
- assert(false);
- }
- xCursor->gotoRange(rTextAppendStack.top().xInsertPosition, true);
- }
- else
- {
- xCursor->gotoEnd(true);
- }
- xTextAppend->insertTextContent(xCursor, xTextContent, true);
- if (oFieldId
- && (oFieldId == FIELD_FORMCHECKBOX || oFieldId == FIELD_FORMDROPDOWN))
- {
- return; // only a single CH_TXT_ATR_FORMELEMENT!
- }
- // problem: the fieldmark must be inserted in CloseFieldCommand(), because
- // attach() takes 2 positions, not 3!
- // FAIL: AppendTextNode() ignores the content index!
- // plan B: insert a spurious paragraph break now and join
- // it in PopFieldContext()!
- xCursor->gotoRange(xTextContent->getAnchor()->getEnd(), false);
- xCursor->goLeft(1, false); // skip CH_TXT_ATR_FIELDEND
- xTextAppend->insertControlCharacter(xCursor, text::ControlCharacter::PARAGRAPH_BREAK, false);
- xCursor->goLeft(1, false); // back to previous paragraph
- rTextAppendStack.push(TextAppendContext(xTextAppend, xCursor));
-}
-
-static auto PopFieldmark(std::stack<TextAppendContext> & rTextAppendStack,
- uno::Reference<text::XTextCursor> const& xCursor,
- std::optional<FieldId> const oFieldId) -> void
-{
- if (oFieldId
- && (oFieldId == FIELD_FORMCHECKBOX || oFieldId == FIELD_FORMDROPDOWN))
- {
- return; // only a single CH_TXT_ATR_FORMELEMENT!
- }
- xCursor->gotoRange(rTextAppendStack.top().xInsertPosition, false);
- xCursor->goRight(1, true);
- xCursor->setString(OUString()); // undo SplitNode from CloseFieldCommand()
- // note: paragraph properties will be overwritten
- // by finishParagraph() anyway so ignore here
- rTextAppendStack.pop();
-}
-
-void DomainMapper_Impl::CloseFieldCommand()
-{
- if(m_bDiscardHeaderFooter)
- return;
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("closeFieldCommand");
-#endif
-
- FieldContextPtr pContext;
- if(!m_aFieldStack.empty())
- pContext = m_aFieldStack.back();
- OSL_ENSURE( pContext, "no field context available");
- if( !pContext )
- return;
-
- pContext->m_bSetUserFieldContent = false;
- pContext->m_bSetCitation = false;
- pContext->m_bSetDateValue = false;
- // tdf#124472: If the normal command line is not empty, use it,
- // otherwise, the last active row is evaluated.
- if (!pContext->GetCommandIsEmpty(false))
- pContext->SetCommandType(false);
-
- const FieldConversionMap_t& aFieldConversionMap = lcl_GetFieldConversion();
-
- try
- {
- uno::Reference< uno::XInterface > xFieldInterface;
-
- const auto& [sType, vArguments, vSwitches]{ splitFieldCommand(pContext->GetCommand()) };
- (void)vSwitches;
- OUString const sFirstParam(vArguments.empty() ? OUString() : vArguments.front());
-
- // apply character properties to the form control
- if (!m_aTextAppendStack.empty() && m_pLastCharacterContext)
- {
- uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if (xTextAppend.is())
- {
- uno::Reference< text::XTextCursor > xCrsr = xTextAppend->getText()->createTextCursor();
- if (xCrsr.is())
- {
- xCrsr->gotoEnd(false);
- uno::Reference< beans::XPropertySet > xProp( xCrsr, uno::UNO_QUERY );
- for (auto& rPropValue : m_pLastCharacterContext->GetPropertyValues(false))
- {
- try
- {
- xProp->setPropertyValue(rPropValue.Name, rPropValue.Value);
- }
- catch(uno::Exception&)
- {
- TOOLS_WARN_EXCEPTION( "writerfilter.dmapper", "Unknown Field PropVal");
- }
- }
- }
- }
- }
-
- FieldConversionMap_t::const_iterator const aIt = aFieldConversionMap.find(sType);
- if (aIt != aFieldConversionMap.end()
- && (!m_bForceGenericFields
- // these need to convert ffData to properties...
- || (aIt->second.eFieldId == FIELD_FORMCHECKBOX)
- || (aIt->second.eFieldId == FIELD_FORMDROPDOWN)
- || (aIt->second.eFieldId == FIELD_FORMTEXT)))
- {
- pContext->SetFieldId(aIt->second.eFieldId);
- bool bCreateEnhancedField = false;
- uno::Reference< beans::XPropertySet > xFieldProperties;
- bool bCreateField = true;
- switch (aIt->second.eFieldId)
- {
- case FIELD_HYPERLINK:
- case FIELD_DOCPROPERTY:
- case FIELD_TOC:
- case FIELD_INDEX:
- case FIELD_XE:
- case FIELD_BIBLIOGRAPHY:
- case FIELD_CITATION:
- case FIELD_TC:
- case FIELD_EQ:
- case FIELD_INCLUDEPICTURE:
- case FIELD_SYMBOL:
- case FIELD_GOTOBUTTON:
- bCreateField = false;
- break;
- case FIELD_FORMCHECKBOX :
- case FIELD_FORMTEXT :
- case FIELD_FORMDROPDOWN :
- {
- // If we use 'enhanced' fields then FIELD_FORMCHECKBOX,
- // FIELD_FORMTEXT & FIELD_FORMDROPDOWN are treated specially
- if ( m_bUsingEnhancedFields )
- {
- bCreateField = false;
- bCreateEnhancedField = true;
- }
- // for non enhanced fields checkboxes are displayed
- // as an awt control not a field
- else if ( aIt->second.eFieldId == FIELD_FORMCHECKBOX )
- bCreateField = false;
- break;
- }
- default:
- {
- FieldContextPtr pOuter = GetParentFieldContext(m_aFieldStack);
- if (pOuter)
- {
- if (!IsFieldNestingAllowed(pOuter, m_aFieldStack.back()))
- {
- // Parent field can't host this child field: don't create a child field
- // in this case.
- bCreateField = false;
- }
- }
- break;
- }
- }
- if (IsInTOC() && (aIt->second.eFieldId == FIELD_PAGEREF))
- {
- bCreateField = false;
- }
-
- if( bCreateField || bCreateEnhancedField )
- {
- //add the service prefix
- OUString sServiceName("com.sun.star.text.");
- if ( bCreateEnhancedField )
- {
- const FieldConversionMap_t& aEnhancedFieldConversionMap = lcl_GetEnhancedFieldConversion();
- FieldConversionMap_t::const_iterator aEnhancedIt =
- aEnhancedFieldConversionMap.find(sType);
- if ( aEnhancedIt != aEnhancedFieldConversionMap.end())
- sServiceName += OUString::createFromAscii(aEnhancedIt->second.cFieldServiceName );
- }
- else
- {
- sServiceName += "TextField." + OUString::createFromAscii(aIt->second.cFieldServiceName );
- }
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("fieldService");
- TagLogger::getInstance().chars(sServiceName);
- TagLogger::getInstance().endElement();
-#endif
-
- if (m_xTextFactory.is())
- {
- xFieldInterface = m_xTextFactory->createInstance(sServiceName);
- xFieldProperties.set( xFieldInterface, uno::UNO_QUERY_THROW);
- }
- }
- switch( aIt->second.eFieldId )
- {
- case FIELD_ADDRESSBLOCK: break;
- case FIELD_ADVANCE : break;
- case FIELD_ASK :
- handleFieldAsk(pContext, xFieldInterface, xFieldProperties);
- break;
- case FIELD_AUTONUM :
- case FIELD_AUTONUMLGL :
- case FIELD_AUTONUMOUT :
- handleAutoNum(pContext, xFieldInterface, xFieldProperties);
- break;
- case FIELD_AUTHOR :
- case FIELD_USERNAME :
- case FIELD_USERINITIALS :
- handleAuthor(sFirstParam,
- xFieldProperties,
- aIt->second.eFieldId);
- break;
- case FIELD_DATE:
- if (xFieldProperties.is())
- {
- // Get field fixed property from the context handler
- if (pContext->IsFieldLocked())
- {
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_IS_FIXED),
- uno::Any( true ));
- pContext->m_bSetDateValue = true;
- }
- else
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_IS_FIXED),
- uno::Any( false ));
-
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_IS_DATE),
- uno::Any( true ));
- SetNumberFormat( pContext->GetCommand(), xFieldProperties );
- }
- break;
- case FIELD_COMMENTS :
- {
- // OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" COMMENTS") );
- // A parameter with COMMENTS shouldn't set fixed
- // ( or at least the binary filter doesn't )
- // If we set fixed then we won't export a field cmd.
- // Additionally the para in COMMENTS is more like an
- // instruction to set the document property comments
- // with the param ( e.g. each COMMENT with a param will
- // overwrite the Comments document property
- // #TODO implement the above too
- xFieldProperties->setPropertyValue(
- getPropertyName( PROP_IS_FIXED ), uno::Any( false ));
- //PROP_CURRENT_PRESENTATION is set later anyway
- }
- break;
- case FIELD_CREATEDATE :
- case FIELD_PRINTDATE:
- case FIELD_SAVEDATE:
- {
- if (pContext->IsFieldLocked())
- {
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_IS_FIXED), uno::Any( true ));
- }
- xFieldProperties->setPropertyValue(
- getPropertyName( PROP_IS_DATE ), uno::Any( true ));
- SetNumberFormat( pContext->GetCommand(), xFieldProperties );
- }
- break;
- case FIELD_DOCPROPERTY :
- handleDocProperty(pContext, sFirstParam,
- xFieldInterface);
- break;
- case FIELD_DOCVARIABLE :
- {
- if (bCreateField)
- {
- //create a user field and type
- uno::Reference<beans::XPropertySet> xMaster = FindOrCreateFieldMaster(
- "com.sun.star.text.FieldMaster.User", sFirstParam);
- uno::Reference<text::XDependentTextField> xDependentField(
- xFieldInterface, uno::UNO_QUERY_THROW);
- xDependentField->attachTextFieldMaster(xMaster);
- pContext->m_bSetUserFieldContent = true;
- }
- }
- break;
- case FIELD_EDITTIME :
- //it's a numbering type, no number format! SetNumberFormat( pContext->GetCommand(), xFieldProperties );
- break;
- case FIELD_EQ:
- {
- OUString aCommand = pContext->GetCommand().trim();
-
- msfilter::util::EquationResult aResult(msfilter::util::ParseCombinedChars(aCommand));
- if (!aResult.sType.isEmpty() && m_xTextFactory.is())
- {
- xFieldInterface = m_xTextFactory->createInstance("com.sun.star.text.TextField." + aResult.sType);
- xFieldProperties =
- uno::Reference< beans::XPropertySet >( xFieldInterface,
- uno::UNO_QUERY_THROW);
- xFieldProperties->setPropertyValue(getPropertyName(PROP_CONTENT), uno::Any(aResult.sResult));
- }
- else
- {
- //merge Read_SubF_Ruby into filter/.../util.cxx and reuse that ?
- sal_Int32 nSpaceIndex = aCommand.indexOf(' ');
- if(nSpaceIndex > 0)
- aCommand = o3tl::trim(aCommand.subView(nSpaceIndex));
- if (aCommand.startsWith("\\s"))
- {
- aCommand = aCommand.copy(2);
- if (aCommand.startsWith("\\do"))
- {
- aCommand = aCommand.copy(3);
- sal_Int32 nStartIndex = aCommand.indexOf('(');
- sal_Int32 nEndIndex = aCommand.indexOf(')');
- if (nStartIndex > 0 && nEndIndex > 0)
- {
- // nDown is the requested "lower by" value in points.
- sal_Int32 nDown = o3tl::toInt32(aCommand.subView(0, nStartIndex));
- OUString aContent = aCommand.copy(nStartIndex + 1, nEndIndex - nStartIndex - 1);
- PropertyMapPtr pCharContext = GetTopContext();
- // dHeight is the font size of the current style.
- double dHeight = 0;
- if ((GetPropertyFromParaStyleSheet(PROP_CHAR_HEIGHT) >>= dHeight) && dHeight != 0)
- // Character escapement should be given in negative percents for subscripts.
- pCharContext->Insert(PROP_CHAR_ESCAPEMENT, uno::Any( sal_Int16(- 100 * nDown / dHeight) ) );
- appendTextPortion(aContent, pCharContext);
- }
- }
- }
- else if (aCommand.startsWith("\\* jc"))
- {
- handleRubyEQField(pContext);
- }
- }
- }
- break;
- case FIELD_FILLIN :
- if (xFieldProperties.is())
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_HINT), uno::Any( pContext->GetCommand().getToken(1, '\"')));
- break;
- case FIELD_FILENAME:
- {
- sal_Int32 nNumberingTypeIndex = pContext->GetCommand().indexOf("\\p");
- if (xFieldProperties.is())
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_FILE_FORMAT),
- uno::Any( nNumberingTypeIndex > 0 ? text::FilenameDisplayFormat::FULL : text::FilenameDisplayFormat::NAME_AND_EXT ));
- }
- break;
- case FIELD_FILESIZE : break;
- case FIELD_FORMULA :
- if (bCreateField)
- {
- handleFieldFormula(pContext, xFieldProperties);
- }
- break;
- case FIELD_FORMCHECKBOX :
- case FIELD_FORMDROPDOWN :
- case FIELD_FORMTEXT :
- {
- if (bCreateEnhancedField)
- {
- FFDataHandler::Pointer_t
- pFFDataHandler(pContext->getFFDataHandler());
- FormControlHelper::Pointer_t
- pFormControlHelper(new FormControlHelper
- (m_bUsingEnhancedFields ? aIt->second.eFieldId : FIELD_FORMCHECKBOX,
-
- m_xTextDocument, pFFDataHandler));
- pContext->setFormControlHelper(pFormControlHelper);
- uno::Reference< text::XFormField > xFormField( xFieldInterface, uno::UNO_QUERY );
- uno::Reference< container::XNamed > xNamed( xFormField, uno::UNO_QUERY );
- if ( xNamed.is() )
- {
- if ( pFFDataHandler && !pFFDataHandler->getName().isEmpty() )
- xNamed->setName( pFFDataHandler->getName() );
- pContext->SetFormField( xFormField );
- }
- InsertFieldmark(m_aTextAppendStack,
- xFormField, pContext->GetStartRange(),
- pContext->GetFieldId());
- }
- else
- {
- if ( aIt->second.eFieldId == FIELD_FORMDROPDOWN )
- lcl_handleDropdownField( xFieldProperties, pContext->getFFDataHandler() );
- else
- lcl_handleTextField( xFieldProperties, pContext->getFFDataHandler() );
- }
- }
- break;
- case FIELD_GOTOBUTTON : break;
- case FIELD_HYPERLINK:
- {
- ::std::vector<OUString> aParts = pContext->GetCommandParts();
-
- // Syntax is either:
- // HYPERLINK "" \l "link"
- // or
- // HYPERLINK \l "link"
- // Make sure "HYPERLINK" doesn't end up as part of link in the second case.
- if (!aParts.empty() && aParts[0] == "HYPERLINK")
- aParts.erase(aParts.begin());
-
- ::std::vector<OUString>::const_iterator aItEnd = aParts.end();
- ::std::vector<OUString>::const_iterator aPartIt = aParts.begin();
-
- OUString sURL;
- OUString sTarget;
-
- while (aPartIt != aItEnd)
- {
- if ( *aPartIt == "\\l" )
- {
- ++aPartIt;
-
- if (aPartIt == aItEnd)
- break;
-
- sURL += "#" + *aPartIt;
- }
- else if (*aPartIt == "\\m" || *aPartIt == "\\n" || *aPartIt == "\\h")
- {
- }
- else if ( *aPartIt == "\\o" || *aPartIt == "\\t" )
- {
- ++aPartIt;
-
- if (aPartIt == aItEnd)
- break;
-
- sTarget = *aPartIt;
- }
- else
- {
- sURL = *aPartIt;
- }
-
- ++aPartIt;
- }
-
- if (!sURL.isEmpty())
- {
- if (sURL.startsWith("file:///"))
- {
- // file:///absolute\\path\\to\\file => invalid file URI (Writer cannot open)
- // convert all double backslashes to slashes:
- sURL = sURL.replaceAll("\\\\", "/");
-
- // file:///absolute\path\to\file => invalid file URI (Writer cannot open)
- // convert all backslashes to slashes:
- sURL = sURL.replace('\\', '/');
- }
- // Try to make absolute any relative URLs, except
- // for relative same-document URLs that only contain
- // a fragment part:
- else if (!sURL.startsWith("#")) {
- try {
- sURL = rtl::Uri::convertRelToAbs(
- m_aBaseUrl, sURL);
- } catch (rtl::MalformedUriException & e) {
- SAL_WARN(
- "writerfilter.dmapper",
- "MalformedUriException "
- << e.getMessage());
- }
- }
- pContext->SetHyperlinkURL(sURL);
- }
-
- if (!sTarget.isEmpty())
- pContext->SetHyperlinkTarget(sTarget);
- }
- break;
- case FIELD_IF:
- {
- if (vArguments.size() < 3)
- {
- SAL_WARN("writerfilter.dmapper", "IF field requires at least 3 parameters!");
- break;
- }
-
- if (xFieldProperties.is())
- {
- // Following code assumes that last argument in field is false value
- // before it - true value and everything before them is a condition
- OUString sCondition;
- size_t i = 0;
- while (i < vArguments.size() - 2) {
- if (!sCondition.isEmpty())
- sCondition += " ";
- sCondition += vArguments[i++];
- }
-
- xFieldProperties->setPropertyValue(
- "TrueContent", uno::Any(vArguments[vArguments.size() - 2]));
- xFieldProperties->setPropertyValue(
- "FalseContent", uno::Any(vArguments[vArguments.size() - 1]));
- xFieldProperties->setPropertyValue(
- "Condition", uno::Any(sCondition));
- }
- }
- break;
- case FIELD_INFO : break;
- case FIELD_INCLUDEPICTURE: break;
- case FIELD_KEYWORDS :
- {
- if (!sFirstParam.isEmpty())
- {
- xFieldProperties->setPropertyValue(
- getPropertyName( PROP_IS_FIXED ), uno::Any( true ));
- //PROP_CURRENT_PRESENTATION is set later anyway
- }
- }
- break;
- case FIELD_LASTSAVEDBY :
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_IS_FIXED), uno::Any(true));
- break;
- case FIELD_MACROBUTTON:
- {
- if (xFieldProperties.is())
- {
- sal_Int32 nIndex = sizeof(" MACROBUTTON ");
- OUString sCommand = pContext->GetCommand();
-
- //extract macro name
- if (sCommand.getLength() >= nIndex)
- {
- OUString sMacro = sCommand.getToken(0, ' ', nIndex);
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_MACRO_NAME), uno::Any( sMacro ));
- }
-
- //extract quick help text
- if (sCommand.getLength() > nIndex + 1)
- {
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_HINT),
- uno::Any( sCommand.copy( nIndex )));
- }
- }
- }
- break;
- case FIELD_MERGEFIELD :
- {
- //todo: create a database field and fieldmaster pointing to a column, only
- //create a user field and type
- uno::Reference< beans::XPropertySet > xMaster =
- FindOrCreateFieldMaster("com.sun.star.text.FieldMaster.Database", sFirstParam);
-
-// xFieldProperties->setPropertyValue(
-// "FieldCode",
-// uno::makeAny( pContext->GetCommand().copy( nIndex + 1 )));
- uno::Reference< text::XDependentTextField > xDependentField( xFieldInterface, uno::UNO_QUERY_THROW );
- xDependentField->attachTextFieldMaster( xMaster );
- }
- break;
- case FIELD_MERGEREC : break;
- case FIELD_MERGESEQ : break;
- case FIELD_NEXT : break;
- case FIELD_NEXTIF : break;
- case FIELD_PAGE :
- if (xFieldProperties.is())
- {
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_NUMBERING_TYPE),
- uno::Any( lcl_ParseNumberingType(pContext->GetCommand()) ));
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_SUB_TYPE),
- uno::Any( text::PageNumberType_CURRENT ));
- }
-
- break;
- case FIELD_PAGEREF:
- case FIELD_REF:
- case FIELD_STYLEREF:
- if (xFieldProperties.is() && !IsInTOC())
- {
- bool bPageRef = aIt->second.eFieldId == FIELD_PAGEREF;
- bool bStyleRef = aIt->second.eFieldId == FIELD_STYLEREF;
-
- // Do we need a GetReference (default) or a GetExpression field?
- uno::Reference< text::XTextFieldsSupplier > xFieldsSupplier( GetTextDocument(), uno::UNO_QUERY );
- uno::Reference< container::XNameAccess > xFieldMasterAccess = xFieldsSupplier->getTextFieldMasters();
-
- if (!xFieldMasterAccess->hasByName(
- "com.sun.star.text.FieldMaster.SetExpression."
- + sFirstParam))
- {
- if (bStyleRef)
- {
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_REFERENCE_FIELD_SOURCE),
- uno::Any(sal_Int16(text::ReferenceFieldSource::STYLE)));
-
- OUString sStyleSheetName
- = GetStyleSheetTable()->ConvertStyleName(sFirstParam, true);
-
- uno::Any aStyleDisplayName;
-
- uno::Reference<style::XStyleFamiliesSupplier> xStylesSupplier(
- GetTextDocument(), uno::UNO_QUERY_THROW);
- uno::Reference<container::XNameAccess> xStyleFamilies
- = xStylesSupplier->getStyleFamilies();
- uno::Reference<container::XNameAccess> xStyles;
- xStyleFamilies->getByName(getPropertyName(PROP_PARAGRAPH_STYLES))
- >>= xStyles;
- uno::Reference<css::beans::XPropertySet> xStyle;
-
- try
- {
- xStyles->getByName(sStyleSheetName) >>= xStyle;
- aStyleDisplayName = xStyle->getPropertyValue("DisplayName");
- }
- catch (css::container::NoSuchElementException)
- {
- aStyleDisplayName <<= sStyleSheetName;
- }
-
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_SOURCE_NAME), aStyleDisplayName);
-
- sal_uInt16 nFlags = 0;
- OUString sValue;
- if( lcl_FindInCommand( pContext->GetCommand(), 'l', sValue ))
- {
- //search-below-first
- nFlags |= REFFLDFLAG_STYLE_FROM_BOTTOM;
- }
- if( lcl_FindInCommand( pContext->GetCommand(), 't', sValue ))
- {
- //suppress-nondelimiter
- nFlags |= REFFLDFLAG_STYLE_HIDE_NON_NUMERICAL;
- }
- xFieldProperties->setPropertyValue(
- getPropertyName( PROP_REFERENCE_FIELD_FLAGS ), uno::Any(nFlags) );
- }
- else
- {
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_REFERENCE_FIELD_SOURCE),
- uno::Any( sal_Int16(text::ReferenceFieldSource::BOOKMARK)) );
-
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_SOURCE_NAME),
- uno::Any(sFirstParam));
- }
-
- sal_Int16 nFieldPart = (bPageRef ? text::ReferenceFieldPart::PAGE : text::ReferenceFieldPart::TEXT);
- OUString sValue;
- if( lcl_FindInCommand( pContext->GetCommand(), 'p', sValue ))
- {
- //above-below
- nFieldPart = text::ReferenceFieldPart::UP_DOWN;
- }
- else if( lcl_FindInCommand( pContext->GetCommand(), 'r', sValue ))
- {
- //number
- nFieldPart = text::ReferenceFieldPart::NUMBER;
- }
- else if( lcl_FindInCommand( pContext->GetCommand(), 'n', sValue ))
- {
- //number-no-context
- nFieldPart = text::ReferenceFieldPart::NUMBER_NO_CONTEXT;
- }
- else if( lcl_FindInCommand( pContext->GetCommand(), 'w', sValue ))
- {
- //number-full-context
- nFieldPart = text::ReferenceFieldPart::NUMBER_FULL_CONTEXT;
- }
- xFieldProperties->setPropertyValue(
- getPropertyName( PROP_REFERENCE_FIELD_PART ), uno::Any( nFieldPart ));
- }
- else if( m_xTextFactory.is() )
- {
- xFieldInterface = m_xTextFactory->createInstance("com.sun.star.text.TextField.GetExpression");
- xFieldProperties.set(xFieldInterface, uno::UNO_QUERY);
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_CONTENT),
- uno::Any(sFirstParam));
- xFieldProperties->setPropertyValue(getPropertyName(PROP_SUB_TYPE), uno::Any(text::SetVariableType::STRING));
- }
- }
- break;
- case FIELD_REVNUM : break;
- case FIELD_SECTION : break;
- case FIELD_SECTIONPAGES : break;
- case FIELD_SEQ :
- {
- // command looks like: " SEQ Table \* ARABIC "
- OUString sCmd(pContext->GetCommand());
- // find the sequence name, e.g. "SEQ"
- std::u16string_view sSeqName = msfilter::util::findQuotedText(sCmd, u"SEQ ", '\\');
- sSeqName = o3tl::trim(sSeqName);
-
- // create a sequence field master using the sequence name
- uno::Reference< beans::XPropertySet > xMaster = FindOrCreateFieldMaster(
- "com.sun.star.text.FieldMaster.SetExpression",
- OUString(sSeqName));
-
- xMaster->setPropertyValue(
- getPropertyName(PROP_SUB_TYPE),
- uno::Any(text::SetVariableType::SEQUENCE));
-
- // apply the numbering type
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_NUMBERING_TYPE),
- uno::Any( lcl_ParseNumberingType(pContext->GetCommand()) ));
-
- // attach the master to the field
- uno::Reference< text::XDependentTextField > xDependentField( xFieldInterface, uno::UNO_QUERY_THROW );
- xDependentField->attachTextFieldMaster( xMaster );
-
- OUString sFormula = OUString::Concat(sSeqName) + "+1";
- OUString sValue;
- if( lcl_FindInCommand( pContext->GetCommand(), 'c', sValue ))
- {
- sFormula = sSeqName;
- }
- else if( lcl_FindInCommand( pContext->GetCommand(), 'r', sValue ))
- {
- sFormula = sValue;
- }
- // TODO \s isn't handled, but the spec isn't easy to understand without
- // an example for this one.
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_CONTENT),
- uno::Any(sFormula));
-
- // Take care of the numeric formatting definition, default is Arabic
- sal_Int16 nNumberingType = lcl_ParseNumberingType(pContext->GetCommand());
- if (nNumberingType == style::NumberingType::PAGE_DESCRIPTOR)
- nNumberingType = style::NumberingType::ARABIC;
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_NUMBERING_TYPE),
- uno::Any(nNumberingType));
- }
- break;
- case FIELD_SET :
- handleFieldSet(pContext, xFieldInterface, xFieldProperties);
- break;
- case FIELD_SKIPIF : break;
- case FIELD_SUBJECT :
- {
- if (!sFirstParam.isEmpty())
- {
- xFieldProperties->setPropertyValue(
- getPropertyName( PROP_IS_FIXED ), uno::Any( true ));
- //PROP_CURRENT_PRESENTATION is set later anyway
- }
- }
- break;
- case FIELD_SYMBOL:
- {
- uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend;
- OUString sSymbol( sal_Unicode( sFirstParam.startsWithIgnoreAsciiCase("0x") ? o3tl::toUInt32(sFirstParam.subView(2),16) : sFirstParam.toUInt32() ) );
- OUString sFont;
- bool bHasFont = lcl_FindInCommand( pContext->GetCommand(), 'f', sFont);
- if ( bHasFont )
- {
- sFont = sFont.trim();
- if (sFont.startsWith("\""))
- sFont = sFont.copy(1);
- if (sFont.endsWith("\""))
- sFont = sFont.copy(0,sFont.getLength()-1);
- }
-
-
-
- if (xTextAppend.is())
- {
- uno::Reference< text::XText > xText = xTextAppend->getText();
- uno::Reference< text::XTextCursor > xCrsr = xText->createTextCursor();
- if (xCrsr.is())
- {
- xCrsr->gotoEnd(false);
- xText->insertString(xCrsr, sSymbol, true);
- uno::Reference< beans::XPropertySet > xProp( xCrsr, uno::UNO_QUERY );
- xProp->setPropertyValue(getPropertyName(PROP_CHAR_FONT_CHAR_SET), uno::Any(awt::CharSet::SYMBOL));
- if(bHasFont)
- {
- uno::Any aVal( sFont );
- xProp->setPropertyValue(getPropertyName(PROP_CHAR_FONT_NAME), aVal);
- xProp->setPropertyValue(getPropertyName(PROP_CHAR_FONT_NAME_ASIAN), aVal);
- xProp->setPropertyValue(getPropertyName(PROP_CHAR_FONT_NAME_COMPLEX), aVal);
-
- }
- }
- }
- }
- break;
- case FIELD_TEMPLATE: break;
- case FIELD_TIME :
- {
- if (pContext->IsFieldLocked())
- {
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_IS_FIXED),
- uno::Any( true ));
- pContext->m_bSetDateValue = true;
- }
- SetNumberFormat( pContext->GetCommand(), xFieldProperties );
- }
- break;
- case FIELD_TITLE :
- {
- if (!sFirstParam.isEmpty())
- {
- xFieldProperties->setPropertyValue(
- getPropertyName( PROP_IS_FIXED ), uno::Any( true ));
- //PROP_CURRENT_PRESENTATION is set later anyway
- }
- }
- break;
- case FIELD_USERADDRESS : //todo: user address collects street, city ...
- break;
- case FIELD_INDEX:
- handleIndex(pContext,
- OUString::createFromAscii(aIt->second.cFieldServiceName));
- break;
- case FIELD_BIBLIOGRAPHY:
- handleBibliography(pContext,
- OUString::createFromAscii(aIt->second.cFieldServiceName));
- break;
- case FIELD_TOC:
- handleToc(pContext,
- OUString::createFromAscii(aIt->second.cFieldServiceName));
- break;
- case FIELD_XE:
- {
- if( !m_xTextFactory.is() )
- break;
-
- // only UserIndexMark can handle user index types defined by \f
- // e.g. XE "text" \f "user-index-id"
- OUString sUserIndex;
- OUString sFieldServiceName =
- lcl_FindInCommand( pContext->GetCommand(), 'f', sUserIndex )
- ? "com.sun.star.text.UserIndexMark"
- : OUString::createFromAscii(aIt->second.cFieldServiceName);
- uno::Reference< beans::XPropertySet > xTC(
- m_xTextFactory->createInstance(sFieldServiceName),
- uno::UNO_QUERY_THROW);
-
- if (!sFirstParam.isEmpty())
- {
- xTC->setPropertyValue(sUserIndex.isEmpty()
- ? OUString("PrimaryKey")
- : OUString("AlternativeText"),
- uno::Any(sFirstParam));
- }
-
- sUserIndex = lcl_trim(sUserIndex);
- if (!sUserIndex.isEmpty())
- {
- xTC->setPropertyValue("UserIndexName",
- uno::Any(sUserIndex));
- }
- uno::Reference< text::XTextContent > xToInsert( xTC, uno::UNO_QUERY );
- uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if (xTextAppend.is())
- {
- uno::Reference< text::XText > xText = xTextAppend->getText();
- uno::Reference< text::XTextCursor > xCrsr = xText->createTextCursor();
- if (xCrsr.is())
- {
- xCrsr->gotoEnd(false);
- xText->insertTextContent(uno::Reference< text::XTextRange >( xCrsr, uno::UNO_QUERY_THROW ), xToInsert, false);
- }
- }
- }
- break;
- case FIELD_CITATION:
- {
- if( !m_xTextFactory.is() )
- break;
-
- xFieldInterface = m_xTextFactory->createInstance(
- OUString::createFromAscii(aIt->second.cFieldServiceName));
- uno::Reference< beans::XPropertySet > xTC(xFieldInterface,
- uno::UNO_QUERY_THROW);
- OUString sCmd(pContext->GetCommand());//sCmd is the entire instrText including the index e.g. CITATION Kra06 \l 1033
- if( !sCmd.isEmpty()){
- uno::Sequence<beans::PropertyValue> aValues( comphelper::InitPropertySequence({
- { "Identifier", uno::Any(sCmd) }
- }));
- xTC->setPropertyValue("Fields", uno::Any(aValues));
- }
- uno::Reference< text::XTextContent > xToInsert( xTC, uno::UNO_QUERY );
-
- uno::Sequence<beans::PropertyValue> aValues
- = m_aFieldStack.back()->getProperties()->GetPropertyValues();
- appendTextContent(xToInsert, aValues);
- pContext->m_bSetCitation = true;
- }
- break;
-
- case FIELD_TC :
- {
- if( !m_xTextFactory.is() )
- break;
-
- uno::Reference< beans::XPropertySet > xTC(
- m_xTextFactory->createInstance(
- OUString::createFromAscii(aIt->second.cFieldServiceName)),
- uno::UNO_QUERY_THROW);
- if (!sFirstParam.isEmpty())
- {
- xTC->setPropertyValue(getPropertyName(PROP_ALTERNATIVE_TEXT),
- uno::Any(sFirstParam));
- }
- OUString sValue;
- // \f TC entry in doc with multiple tables
-// if( lcl_FindInCommand( pContext->GetCommand(), 'f', sValue ))
-// {
- // todo: unsupported
-// }
- if( lcl_FindInCommand( pContext->GetCommand(), 'l', sValue ))
- // \l Outline Level
- {
- sal_Int32 nLevel = sValue.toInt32();
- if( !sValue.isEmpty() && nLevel >= 0 && nLevel <= 10 )
- xTC->setPropertyValue(getPropertyName(PROP_LEVEL), uno::Any( static_cast<sal_Int16>(nLevel) ));
- }
-// if( lcl_FindInCommand( pContext->GetCommand(), 'n', sValue ))
-// \n Suppress page numbers
-// {
- //todo: unsupported feature
-// }
- pContext->SetTC( xTC );
- }
- break;
- case FIELD_NUMCHARS:
- case FIELD_NUMWORDS:
- case FIELD_NUMPAGES:
- if (xFieldProperties.is())
- xFieldProperties->setPropertyValue(
- getPropertyName(PROP_NUMBERING_TYPE),
- uno::Any( lcl_ParseNumberingType(pContext->GetCommand()) ));
- break;
- }
-
- if (!bCreateEnhancedField)
- {
- pContext->SetTextField( uno::Reference<text::XTextField>(xFieldInterface, uno::UNO_QUERY) );
- }
- }
- else
- {
- /* Unsupported fields will be handled here for docx file.
- * To handle unsupported fields used fieldmark API.
- */
- OUString aCode( pContext->GetCommand().trim() );
- // Don't waste resources on wrapping shapes inside a fieldmark.
- if (sType != "SHAPE" && m_xTextFactory.is() && !m_aTextAppendStack.empty())
- {
- xFieldInterface = m_xTextFactory->createInstance("com.sun.star.text.Fieldmark");
-
- uno::Reference<text::XFormField> const xFormField(xFieldInterface, uno::UNO_QUERY);
- InsertFieldmark(m_aTextAppendStack, xFormField, pContext->GetStartRange(),
- pContext->GetFieldId());
- xFormField->setFieldType(ODF_UNHANDLED);
- ++m_nStartGenericField;
- pContext->SetFormField( xFormField );
- uno::Reference<container::XNameContainer> const xNameCont(xFormField->getParameters());
- // note: setting the code to empty string is *required* in
- // m_bForceGenericFields mode, or the export will write
- // the ODF_UNHANDLED string!
- assert(!m_bForceGenericFields || aCode.isEmpty());
- xNameCont->insertByName(ODF_CODE_PARAM, uno::Any(aCode));
- ww::eField const id(GetWW8FieldId(sType));
- if (id != ww::eNONE)
- { // tdf#129247 tdf#134264 set WW8 id for WW8 export
- xNameCont->insertByName(ODF_ID_PARAM, uno::Any(OUString::number(id)));
- }
- }
- else
- m_StreamStateStack.top().bParaHadField = false;
- }
- }
- catch( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter.dmapper", "Exception in CloseFieldCommand()" );
- }
- pContext->SetCommandCompleted();
-}
-/*-------------------------------------------------------------------------
-//the _current_ fields require a string type result while TOCs accept richt results
- -----------------------------------------------------------------------*/
-bool DomainMapper_Impl::IsFieldResultAsString()
-{
- bool bRet = false;
- OSL_ENSURE( !m_aFieldStack.empty(), "field stack empty?");
- FieldContextPtr pContext = m_aFieldStack.back();
- OSL_ENSURE( pContext, "no field context available");
- if( pContext )
- {
- bRet = pContext->GetTextField().is()
- || pContext->GetFieldId() == FIELD_FORMDROPDOWN
- || pContext->GetFieldId() == FIELD_FILLIN;
- }
-
- if (!bRet)
- {
- FieldContextPtr pOuter = GetParentFieldContext(m_aFieldStack);
- if (pOuter)
- {
- if (!IsFieldNestingAllowed(pOuter, m_aFieldStack.back()))
- {
- // If nesting is not allowed, then the result can only be a string.
- bRet = true;
- }
- }
- }
- return bRet;
-}
-
-void DomainMapper_Impl::AppendFieldResult(std::u16string_view rString)
-{
- assert(!m_aFieldStack.empty());
- FieldContextPtr pContext = m_aFieldStack.back();
- SAL_WARN_IF(!pContext, "writerfilter.dmapper", "no field context");
- if (!pContext)
- return;
-
- FieldContextPtr pOuter = GetParentFieldContext(m_aFieldStack);
- if (pOuter)
- {
- if (!IsFieldNestingAllowed(pOuter, pContext))
- {
- if (pOuter->IsCommandCompleted())
- {
- // Child can't host the field result, forward to parent's result.
- pOuter->AppendResult(rString);
- }
- return;
- }
- }
-
- pContext->AppendResult(rString);
-}
-
-// Calculates css::DateTime based on ddddd.sssss since 1899-12-30
-static util::DateTime lcl_dateTimeFromSerial(const double& dSerial)
-{
- DateTime d(Date(30, 12, 1899));
- d.AddTime(dSerial);
- return d.GetUNODateTime();
-}
-
-void DomainMapper_Impl::SetFieldResult(OUString const& rResult)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("setFieldResult");
- TagLogger::getInstance().chars(rResult);
-#endif
-
- FieldContextPtr pContext = m_aFieldStack.back();
- OSL_ENSURE( pContext, "no field context available");
-
- if (m_aFieldStack.size() > 1)
- {
- // This is a nested field. See if the parent supports nesting on the Writer side.
- FieldContextPtr pParentContext = m_aFieldStack[m_aFieldStack.size() - 2];
- if (pParentContext)
- {
- std::vector<OUString> aParentParts = pParentContext->GetCommandParts();
- // Conditional text fields don't support nesting in Writer.
- if (!aParentParts.empty() && aParentParts[0] == "IF")
- {
- return;
- }
- }
- }
-
- if( !pContext )
- return;
-
- uno::Reference<text::XTextField> xTextField = pContext->GetTextField();
- try
- {
- OSL_ENSURE( xTextField.is()
- //||m_xTOC.is() ||m_xTC.is()
- //||m_sHyperlinkURL.getLength()
- , "DomainMapper_Impl::SetFieldResult: field not created" );
- if(xTextField.is())
- {
- try
- {
- if (pContext->m_bSetUserFieldContent)
- {
- // user field content has to be set at the field master
- uno::Reference< text::XDependentTextField > xDependentField( xTextField, uno::UNO_QUERY_THROW );
- xDependentField->getTextFieldMaster()->setPropertyValue(
- getPropertyName(PROP_CONTENT),
- uno::Any( rResult ));
- }
- else if (pContext->m_bSetCitation)
- {
-
- uno::Reference< beans::XPropertySet > xFieldProperties( xTextField, uno::UNO_QUERY_THROW);
- // In case of SetExpression, the field result contains the content of the variable.
- uno::Reference<lang::XServiceInfo> xServiceInfo(xTextField, uno::UNO_QUERY);
-
- bool bIsSetbiblio = xServiceInfo->supportsService("com.sun.star.text.TextField.Bibliography");
- if( bIsSetbiblio )
- {
- uno::Any aProperty = xFieldProperties->getPropertyValue("Fields");
- uno::Sequence<beans::PropertyValue> aValues ;
- aProperty >>= aValues;
- beans::PropertyValue propertyVal;
- sal_Int32 nTitleFoundIndex = -1;
- for (sal_Int32 i = 0; i < aValues.getLength(); ++i)
- {
- propertyVal = aValues[i];
- if (propertyVal.Name == "Title")
- {
- nTitleFoundIndex = i;
- break;
- }
- }
- if (nTitleFoundIndex != -1)
- {
- OUString titleStr;
- uno::Any aValue(propertyVal.Value);
- aValue >>= titleStr;
- titleStr += rResult;
- propertyVal.Value <<= titleStr;
- aValues.getArray()[nTitleFoundIndex] = propertyVal;
- }
- else
- {
- aValues.realloc(aValues.getLength() + 1);
- propertyVal.Name = "Title";
- propertyVal.Value <<= rResult;
- aValues.getArray()[aValues.getLength() - 1] = propertyVal;
- }
- xFieldProperties->setPropertyValue("Fields",
- uno::Any(aValues));
- }
- }
- else if (pContext->m_bSetDateValue)
- {
- uno::Reference< util::XNumberFormatsSupplier > xNumberSupplier( m_xTextDocument, uno::UNO_QUERY_THROW );
-
- uno::Reference<util::XNumberFormatter> xFormatter(util::NumberFormatter::create(m_xComponentContext), uno::UNO_QUERY_THROW);
- xFormatter->attachNumberFormatsSupplier( xNumberSupplier );
- sal_Int32 nKey = 0;
-
- uno::Reference< beans::XPropertySet > xFieldProperties( xTextField, uno::UNO_QUERY_THROW);
-
- xFieldProperties->getPropertyValue( "NumberFormat" ) >>= nKey;
- xFieldProperties->setPropertyValue(
- "DateTimeValue",
- uno::Any( lcl_dateTimeFromSerial( xFormatter->convertStringToNumber( nKey, rResult ) ) ) );
- }
- else
- {
- uno::Reference< beans::XPropertySet > xFieldProperties( xTextField, uno::UNO_QUERY_THROW);
- // In case of SetExpression, and Input fields the field result contains the content of the variable.
- uno::Reference<lang::XServiceInfo> xServiceInfo(xTextField, uno::UNO_QUERY);
- // there are fields with a content property, which aren't working correctly with
- // a generalized try catch of the content, property, so just restrict content
- // handling to these explicit services.
- const bool bHasContent = xServiceInfo->supportsService("com.sun.star.text.TextField.SetExpression") ||
- xServiceInfo->supportsService("com.sun.star.text.TextField.Input");
- // If we already have content set, then use the current presentation
- OUString sValue;
- if (bHasContent)
- {
- // this will throw for field types without Content
- uno::Any aValue(xFieldProperties->getPropertyValue(
- getPropertyName(PROP_CONTENT)));
- aValue >>= sValue;
- }
- xFieldProperties->setPropertyValue(
- getPropertyName(bHasContent && sValue.isEmpty()? PROP_CONTENT : PROP_CURRENT_PRESENTATION),
- uno::Any( rResult ));
-
- // LO always automatically updates a DocInfo field from the File-Properties-Custom Prop
- // while MS Word requires the user to manually refresh the field (with F9).
- // In other words, Word lets the field to be out of sync with the controlling variable.
- // Marking as FIXEDFLD solves the automatic replacement problem, but of course prevents
- // Writer from making any changes, even on an F9 refresh.
- OUString sVariable = pContext->GetVariableValue();
- if (rResult.getLength() != sVariable.getLength())
- {
- sal_Int32 nLen = sVariable.indexOf('\x0');
- if (nLen >= 0)
- sVariable = sVariable.copy(0, nLen);
- }
- bool bCustomFixedField = rResult != sVariable &&
- xServiceInfo->supportsService("com.sun.star.text.TextField.DocInfo.Custom");
-
- if (bCustomFixedField || xServiceInfo->supportsService(
- "com.sun.star.text.TextField.DocInfo.CreateDateTime"))
- {
- // Creation time is const, don't try to update it.
- xFieldProperties->setPropertyValue("IsFixed", uno::Any(true));
- }
- }
- }
- catch( const beans::UnknownPropertyException& )
- {
- //some fields don't have a CurrentPresentation (DateTime)
- }
- }
- }
- catch (const uno::Exception&)
- {
- TOOLS_WARN_EXCEPTION("writerfilter.dmapper", "DomainMapper_Impl::SetFieldResult");
- }
-}
-
-void DomainMapper_Impl::SetFieldFFData(const FFDataHandler::Pointer_t& pFFDataHandler)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("setFieldFFData");
-#endif
-
- if (!m_aFieldStack.empty())
- {
- FieldContextPtr pContext = m_aFieldStack.back();
- if (pContext)
- {
- pContext->setFFDataHandler(pFFDataHandler);
- }
- }
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-}
-
-void DomainMapper_Impl::PopFieldContext()
-{
- if(m_bDiscardHeaderFooter)
- return;
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("popFieldContext");
-#endif
-
- if (m_aFieldStack.empty())
- return;
-
- FieldContextPtr pContext = m_aFieldStack.back();
- OSL_ENSURE( pContext, "no field context available");
- if( pContext )
- {
- if( !pContext->IsCommandCompleted() )
- CloseFieldCommand();
-
- if (!pContext->GetResult().isEmpty())
- {
- uno::Reference< beans::XPropertySet > xFieldProperties = pContext->GetCustomField();
- if(xFieldProperties.is())
- SetNumberFormat( pContext->GetResult(), xFieldProperties, true );
- SetFieldResult( pContext->GetResult() );
- }
-
- //insert the field, TC or TOC
- uno::Reference< text::XTextAppend > xTextAppend;
- if (!m_aTextAppendStack.empty())
- xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if(xTextAppend.is())
- {
- try
- {
- uno::Reference< text::XTextContent > xToInsert( pContext->GetTOC(), uno::UNO_QUERY );
- if( xToInsert.is() )
- {
- if (m_bStartedTOC || m_bStartIndex || m_bStartBibliography)
- {
- // inside SDT, last empty paragraph is also part of index
- if (!m_StreamStateStack.top().bParaChanged && !m_StreamStateStack.top().xSdtEntryStart)
- {
- // End of index is the first item on a new paragraph - this paragraph
- // should not be part of index
- auto xCursor
- = xTextAppend->createTextCursorByRange(
- m_aTextAppendStack.top().xInsertPosition.is()
- ? m_aTextAppendStack.top().xInsertPosition
- : xTextAppend->getEnd());
- xCursor->goLeft(1, true);
- // delete
- xCursor->setString(OUString());
- // But a new paragraph should be started after the index instead
- if (m_bIsNewDoc) // this check - see testTdf129402
- { // where finishParagraph inserts between 2 EndNode
- xTextAppend->finishParagraph(css::beans::PropertyValues());
- }
- else
- {
- xTextAppend->finishParagraphInsert(css::beans::PropertyValues(),
- m_aTextAppendStack.top().xInsertPosition);
- }
- }
- m_bStartedTOC = false;
- m_aTextAppendStack.pop();
- m_StreamStateStack.top().bTextInserted = false;
- m_StreamStateStack.top().bParaChanged = true; // the paragraph must stay anyway
- }
- m_bStartTOC = false;
- m_bStartIndex = false;
- m_bStartBibliography = false;
- if (IsInHeaderFooter() && m_bStartTOCHeaderFooter)
- m_bStartTOCHeaderFooter = false;
- }
- else
- {
- xToInsert.set(pContext->GetTC(), uno::UNO_QUERY);
- if (!xToInsert.is() && !IsInTOC() && !m_bStartIndex && !m_bStartBibliography)
- xToInsert = pContext->GetTextField();
- if (xToInsert.is() && !IsInTOC() && !m_bStartIndex && !m_bStartBibliography)
- {
- PropertyMap aMap;
- // Character properties of the field show up here the
- // last (always empty) run. Inherit character
- // properties from there.
- // Also merge in the properties from the field context,
- // e.g. SdtEndBefore.
- if (m_pLastCharacterContext)
- aMap.InsertProps(m_pLastCharacterContext);
- aMap.InsertProps(m_aFieldStack.back()->getProperties());
- appendTextContent(xToInsert, aMap.GetPropertyValues());
- CheckRedline( xToInsert->getAnchor( ) );
- }
- else
- {
- uno::Reference< text::XTextCursor > xCrsr = xTextAppend->createTextCursorByRange(pContext->GetStartRange());
- FormControlHelper::Pointer_t pFormControlHelper(pContext->getFormControlHelper());
- if (pFormControlHelper)
- {
- // xCrsr may be empty e.g. when pContext->GetStartRange() is outside of
- // xTextAppend, like when a field started in a parent paragraph is being
- // closed inside an anchored text box. It could be possible to throw an
- // exception here, and abort import, but Word tolerates such invalid
- // input, so it makes sense to do the same (tdf#152200)
- if (xCrsr.is())
- {
- uno::Reference< text::XFormField > xFormField(pContext->GetFormField());
- if (pFormControlHelper->hasFFDataHandler())
- {
- xToInsert.set(xFormField, uno::UNO_QUERY);
- if (xFormField.is() && xToInsert.is())
- {
- PopFieldmark(m_aTextAppendStack, xCrsr,
- pContext->GetFieldId());
- pFormControlHelper->processField(xFormField);
- }
- else
- {
- pFormControlHelper->insertControl(xCrsr);
- }
- }
- else
- {
- PopFieldmark(m_aTextAppendStack, xCrsr,
- pContext->GetFieldId());
- uno::Reference<lang::XComponent>(xFormField, uno::UNO_QUERY_THROW)->dispose(); // presumably invalid?
- }
- }
- }
- else if (!pContext->GetHyperlinkURL().isEmpty() && xCrsr.is())
- {
- if (m_aTextAppendStack.top().xInsertPosition.is())
- {
- xCrsr->gotoRange(m_aTextAppendStack.top().xInsertPosition, true);
- }
- else
- {
- xCrsr->gotoEnd(true);
- }
-
- // Draw components (like comments) need hyperlinks set differently
- SvxUnoTextRangeBase* pDrawText = dynamic_cast<SvxUnoTextRangeBase*>(xCrsr.get());
- if ( pDrawText )
- pDrawText->attachField( std::make_unique<SvxURLField>(pContext->GetHyperlinkURL(), xCrsr->getString(), SvxURLFormat::AppDefault) );
- else
- {
- uno::Reference< beans::XPropertySet > xCrsrProperties( xCrsr, uno::UNO_QUERY_THROW );
- xCrsrProperties->setPropertyValue(getPropertyName(PROP_HYPER_LINK_U_R_L), uno::
- Any(pContext->GetHyperlinkURL()));
-
- if (!pContext->GetHyperlinkTarget().isEmpty())
- xCrsrProperties->setPropertyValue("HyperLinkTarget", uno::Any(pContext->GetHyperlinkTarget()));
-
- if (IsInTOC())
- {
- OUString sDisplayName("Index Link");
- xCrsrProperties->setPropertyValue("VisitedCharStyleName",uno::Any(sDisplayName));
- xCrsrProperties->setPropertyValue("UnvisitedCharStyleName",uno::Any(sDisplayName));
- }
- else if (!pContext->GetHyperlinkStyle().isEmpty())
- {
- uno::Any aAny = xCrsrProperties->getPropertyValue("CharStyleName");
- OUString charStyle;
- if (css::uno::fromAny(aAny, &charStyle))
- {
- if (!charStyle.isEmpty() && charStyle.equalsIgnoreAsciiCase("Internet Link"))
- {
- xCrsrProperties->setPropertyValue("CharStyleName", uno::Any(OUString("Default Style")));
- }
- else
- {
- xCrsrProperties->setPropertyValue("VisitedCharStyleName", uno::Any(pContext->GetHyperlinkStyle()));
- xCrsrProperties->setPropertyValue("UnvisitedCharStyleName", uno::Any(pContext->GetHyperlinkStyle()));
-
- }
- }
- }
- }
- }
- else if (m_nStartGenericField != 0)
- {
- --m_nStartGenericField;
- PopFieldmark(m_aTextAppendStack, xCrsr, pContext->GetFieldId());
- if (m_StreamStateStack.top().bTextInserted)
- {
- m_StreamStateStack.top().bTextInserted = false;
- }
- }
- }
- }
- }
- catch(const lang::IllegalArgumentException&)
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "PopFieldContext()" );
- }
- catch(const uno::Exception&)
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "PopFieldContext()" );
- }
- }
-
- //TOCs have to include all the imported content
- }
-
- std::vector<FieldParagraph> aParagraphsToFinish;
- if (pContext)
- {
- aParagraphsToFinish = pContext->GetParagraphsToFinish();
- }
-
- //remove the field context
- m_aFieldStack.pop_back();
-
- // Finish the paragraph(s) now that the field is closed.
- for (const auto& rFinish : aParagraphsToFinish)
- {
- finishParagraph(rFinish.m_pPropertyMap, rFinish.m_bRemove);
- }
-}
-
-
-void DomainMapper_Impl::SetBookmarkName( const OUString& rBookmarkName )
-{
- BookmarkMap_t::iterator aBookmarkIter = m_aBookmarkMap.find( m_sCurrentBkmkId );
- if( aBookmarkIter != m_aBookmarkMap.end() )
- {
- // fields are internal bookmarks: consume redundant "normal" bookmark
- if ( IsOpenField() )
- {
- FFDataHandler::Pointer_t pFFDataHandler(GetTopFieldContext()->getFFDataHandler());
- if (pFFDataHandler && pFFDataHandler->getName() == rBookmarkName)
- {
- // HACK: At the END marker, StartOrEndBookmark will START
- // a bookmark which will eventually be abandoned, not created.
- m_aBookmarkMap.erase(aBookmarkIter);
- return;
- }
- }
-
- if ((m_sCurrentBkmkPrefix == "__RefMoveFrom__"
- || m_sCurrentBkmkPrefix == "__RefMoveTo__")
- && std::find(m_aRedlineMoveIDs.begin(), m_aRedlineMoveIDs.end(), rBookmarkName)
- == m_aRedlineMoveIDs.end())
- {
- m_aRedlineMoveIDs.push_back(rBookmarkName);
- }
-
- aBookmarkIter->second.m_sBookmarkName = m_sCurrentBkmkPrefix + rBookmarkName;
- m_sCurrentBkmkPrefix.clear();
- }
- else
- {
- m_sCurrentBkmkName = rBookmarkName;
- m_sCurrentBkmkPrefix.clear();
- }
-}
-
-// This method was used as-is for DomainMapper_Impl::startOrEndPermissionRange() implementation.
-void DomainMapper_Impl::StartOrEndBookmark( const OUString& rId )
-{
- /*
- * Add the dummy paragraph to handle section properties
- * iff the first element in the section is a table. If the dummy para is not added yet, then add it;
- * So bookmark is not attached to the wrong paragraph.
- */
- if (hasTableManager() && getTableManager().isInCell()
- && m_StreamStateStack.top().nTableDepth == 0
- && GetIsFirstParagraphInSection()
- && !GetIsDummyParaAddedForTableInSection() && !GetIsTextFrameInserted())
- {
- AddDummyParaForTableInSection();
- }
-
- bool bIsAfterDummyPara = GetIsDummyParaAddedForTableInSection() && GetIsFirstParagraphInSection();
- if (m_aTextAppendStack.empty())
- return;
- uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend;
- BookmarkMap_t::iterator aBookmarkIter = m_aBookmarkMap.find( rId );
- //is the bookmark name already registered?
- try
- {
- if( aBookmarkIter != m_aBookmarkMap.end() )
- {
- if (m_xTextFactory.is())
- {
- uno::Reference< text::XTextContent > xBookmark( m_xTextFactory->createInstance( "com.sun.star.text.Bookmark" ), uno::UNO_QUERY_THROW );
- uno::Reference< text::XTextCursor > xCursor;
- uno::Reference< text::XText > xText = aBookmarkIter->second.m_xTextRange->getText();
- if( aBookmarkIter->second.m_bIsStartOfText && !bIsAfterDummyPara)
- {
- xCursor = xText->createTextCursorByRange( xText->getStart() );
- }
- else
- {
- xCursor = xText->createTextCursorByRange( aBookmarkIter->second.m_xTextRange );
- }
- if (!aBookmarkIter->second.m_bIsStartOfText)
- {
- xCursor->goRight( 1, false );
- }
-
- xCursor->gotoRange( xTextAppend->getEnd(), true );
- // A Paragraph was recently finished, and a new Paragraph has not been started as yet
- // then move the bookmark-End to the earlier paragraph
- if (IsOutsideAParagraph())
- {
- // keep bookmark range, if it doesn't exceed cell boundary
- uno::Reference< text::XTextRange > xStart = xCursor->getStart();
- xCursor->goLeft( 1, false );
- if (m_StreamStateStack.top().nTableDepth == 0
- || !m_StreamStateStack.top().bFirstParagraphInCell)
- {
- xCursor->gotoRange(xStart, true );
- }
- }
- uno::Reference< container::XNamed > xBkmNamed( xBookmark, uno::UNO_QUERY_THROW );
- SAL_WARN_IF(aBookmarkIter->second.m_sBookmarkName.isEmpty(), "writerfilter.dmapper", "anonymous bookmark");
- //todo: make sure the name is not used already!
- xBkmNamed->setName( aBookmarkIter->second.m_sBookmarkName );
- xTextAppend->insertTextContent( uno::Reference< text::XTextRange >( xCursor, uno::UNO_QUERY_THROW), xBookmark, !xCursor->isCollapsed() );
- }
- m_aBookmarkMap.erase( aBookmarkIter );
- m_sCurrentBkmkId.clear();
- }
- else
- {
- //otherwise insert a text range as marker
- bool bIsStart = true;
- uno::Reference< text::XTextRange > xCurrent;
- if (xTextAppend.is())
- {
- uno::Reference<text::XTextCursor> const xCursor =
- xTextAppend->createTextCursorByRange(
- m_aTextAppendStack.top().xInsertPosition.is()
- ? m_aTextAppendStack.top().xInsertPosition
- : xTextAppend->getEnd() );
-
- if (!xCursor)
- return;
-
- if (!bIsAfterDummyPara)
- bIsStart = !xCursor->goLeft(1, false);
- xCurrent = xCursor->getStart();
- }
- m_sCurrentBkmkId = rId;
- m_aBookmarkMap.emplace( rId, BookmarkInsertPosition( bIsStart, m_sCurrentBkmkName, xCurrent ) );
- m_sCurrentBkmkName.clear();
- }
- }
- catch( const uno::Exception& )
- {
- //TODO: What happens to bookmarks where start and end are at different XText objects?
- }
-}
-
-void DomainMapper_Impl::SetMoveBookmark( bool bIsFrom )
-{
- static constexpr OUStringLiteral MoveFrom_Bookmark_NamePrefix = u"__RefMoveFrom__";
- static constexpr OUStringLiteral MoveTo_Bookmark_NamePrefix = u"__RefMoveTo__";
- if ( bIsFrom )
- m_sCurrentBkmkPrefix = MoveFrom_Bookmark_NamePrefix;
- else
- m_sCurrentBkmkPrefix = MoveTo_Bookmark_NamePrefix;
-}
-
-void DomainMapper_Impl::setPermissionRangeEd(const OUString& user)
-{
- PermMap_t::iterator aPremIter = m_aPermMap.find(m_sCurrentPermId);
- if (aPremIter != m_aPermMap.end())
- aPremIter->second.m_Ed = user;
- else
- m_sCurrentPermEd = user;
-}
-
-void DomainMapper_Impl::setPermissionRangeEdGrp(const OUString& group)
-{
- PermMap_t::iterator aPremIter = m_aPermMap.find(m_sCurrentPermId);
- if (aPremIter != m_aPermMap.end())
- aPremIter->second.m_EdGrp = group;
- else
- m_sCurrentPermEdGrp = group;
-}
-
-// This method is based on implementation from DomainMapper_Impl::StartOrEndBookmark()
-void DomainMapper_Impl::startOrEndPermissionRange(sal_Int32 permissinId)
-{
- /*
- * Add the dummy paragraph to handle section properties
- * if the first element in the section is a table. If the dummy para is not added yet, then add it;
- * So permission is not attached to the wrong paragraph.
- */
- if (getTableManager().isInCell()
- && m_StreamStateStack.top().nTableDepth == 0 && GetIsFirstParagraphInSection()
- && !GetIsDummyParaAddedForTableInSection() && !GetIsTextFrameInserted())
- {
- AddDummyParaForTableInSection();
- }
-
- if (m_aTextAppendStack.empty())
- return;
-
- const bool bIsAfterDummyPara = GetIsDummyParaAddedForTableInSection() && GetIsFirstParagraphInSection();
-
- uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend;
- PermMap_t::iterator aPermIter = m_aPermMap.find(permissinId);
-
- //is the bookmark name already registered?
- try
- {
- if (aPermIter == m_aPermMap.end())
- {
- //otherwise insert a text range as marker
- bool bIsStart = true;
- uno::Reference< text::XTextRange > xCurrent;
- if (xTextAppend.is())
- {
- uno::Reference< text::XTextCursor > xCursor = xTextAppend->createTextCursorByRange(xTextAppend->getEnd());
-
- if (!bIsAfterDummyPara)
- bIsStart = !xCursor->goLeft(1, false);
- xCurrent = xCursor->getStart();
- }
-
- // register the start of the new permission
- m_sCurrentPermId = permissinId;
- m_aPermMap.emplace(permissinId, PermInsertPosition(bIsStart, permissinId, m_sCurrentPermEd, m_sCurrentPermEdGrp, xCurrent));
-
- // clean up
- m_sCurrentPermEd.clear();
- m_sCurrentPermEdGrp.clear();
- }
- else
- {
- if (m_xTextFactory.is())
- {
- uno::Reference< text::XTextCursor > xCursor;
- uno::Reference< text::XText > xText = aPermIter->second.m_xTextRange->getText();
- if (aPermIter->second.m_bIsStartOfText && !bIsAfterDummyPara)
- {
- xCursor = xText->createTextCursorByRange(xText->getStart());
- }
- else
- {
- xCursor = xText->createTextCursorByRange(aPermIter->second.m_xTextRange);
- }
- if (!aPermIter->second.m_bIsStartOfText)
- {
- xCursor->goRight(1, false);
- }
-
- xCursor->gotoRange(xTextAppend->getEnd(), true);
- // A Paragraph was recently finished, and a new Paragraph has not been started as yet
- // then move the bookmark-End to the earlier paragraph
- if (IsOutsideAParagraph())
- {
- xCursor->goLeft(1, false);
- }
-
- // create a new bookmark using specific bookmark name pattern for permissions
- uno::Reference< text::XTextContent > xPerm(m_xTextFactory->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY_THROW);
- uno::Reference< container::XNamed > xPermNamed(xPerm, uno::UNO_QUERY_THROW);
- xPermNamed->setName(aPermIter->second.createBookmarkName());
-
- // add new bookmark
- const bool bAbsorb = !xCursor->isCollapsed();
- uno::Reference< text::XTextRange > xCurrent(xCursor, uno::UNO_QUERY_THROW);
- xTextAppend->insertTextContent(xCurrent, xPerm, bAbsorb);
- }
-
- // remove processed permission
- m_aPermMap.erase(aPermIter);
-
- // clean up
- m_sCurrentPermId = 0;
- m_sCurrentPermEd.clear();
- m_sCurrentPermEdGrp.clear();
- }
- }
- catch (const uno::Exception&)
- {
- //TODO: What happens to bookmarks where start and end are at different XText objects?
- }
-}
-
-void DomainMapper_Impl::AddAnnotationPosition(
- const bool bStart,
- const sal_Int32 nAnnotationId)
-{
- if (m_aTextAppendStack.empty())
- return;
-
- // Create a cursor, pointing to the current position.
- uno::Reference<text::XTextAppend> xTextAppend = m_aTextAppendStack.top().xTextAppend;
- uno::Reference<text::XTextRange> xCurrent;
- if (xTextAppend.is())
- {
- uno::Reference<text::XTextCursor> xCursor;
- if (m_bIsNewDoc)
- xCursor = xTextAppend->createTextCursorByRange(xTextAppend->getEnd());
- else
- xCursor = m_aTextAppendStack.top().xCursor;
- if (xCursor.is())
- xCurrent = xCursor->getStart();
- }
-
- // And save it, to be used by PopAnnotation() later.
- AnnotationPosition& aAnnotationPosition = m_aAnnotationPositions[ nAnnotationId ];
- if (bStart)
- {
- aAnnotationPosition.m_xStart = xCurrent;
- }
- else
- {
- aAnnotationPosition.m_xEnd = xCurrent;
- }
- m_aAnnotationPositions[ nAnnotationId ] = aAnnotationPosition;
-}
-
-GraphicImportPtr const & DomainMapper_Impl::GetGraphicImport()
-{
- if(!m_pGraphicImport)
- {
- m_pGraphicImport = new GraphicImport(m_xComponentContext, m_xTextFactory, m_rDMapper, m_eGraphicImportType, m_aPositionOffsets, m_aAligns, m_aPositivePercentages);
- }
- return m_pGraphicImport;
-}
-/*-------------------------------------------------------------------------
- reset graphic import if the last import resulted in a shape, not a graphic
- -----------------------------------------------------------------------*/
-void DomainMapper_Impl::ResetGraphicImport()
-{
- m_pGraphicImport.clear();
-}
-
-
-void DomainMapper_Impl::ImportGraphic(const writerfilter::Reference<Properties>::Pointer_t& ref)
-{
- GetGraphicImport();
- if (m_eGraphicImportType != IMPORT_AS_DETECTED_INLINE && m_eGraphicImportType != IMPORT_AS_DETECTED_ANCHOR)
- { // this appears impossible?
- //create the graphic
- ref->resolve( *m_pGraphicImport );
- }
-
- //insert it into the document at the current cursor position
-
- uno::Reference<text::XTextContent> xTextContent
- (m_pGraphicImport->GetGraphicObject());
-
- // In case the SDT starts with the text portion of the graphic, then set the SDT properties here.
- bool bHasGrabBag = false;
- uno::Reference<beans::XPropertySet> xPropertySet(xTextContent, uno::UNO_QUERY);
- if (xPropertySet.is())
- {
- uno::Reference<beans::XPropertySetInfo> xPropertySetInfo = xPropertySet->getPropertySetInfo();
- bHasGrabBag = xPropertySetInfo->hasPropertyByName("FrameInteropGrabBag");
- // In case we're outside a paragraph, then the SDT properties are stored in the paragraph grab-bag, not the frame one.
- if (!m_pSdtHelper->isInteropGrabBagEmpty() && bHasGrabBag && !m_pSdtHelper->isOutsideAParagraph())
- {
- comphelper::SequenceAsHashMap aFrameGrabBag(xPropertySet->getPropertyValue("FrameInteropGrabBag"));
- aFrameGrabBag["SdtPr"] <<= m_pSdtHelper->getInteropGrabBagAndClear();
- xPropertySet->setPropertyValue("FrameInteropGrabBag", uno::Any(aFrameGrabBag.getAsConstPropertyValueList()));
- }
- }
-
- /* Set "SdtEndBefore" property on Drawing.
- * It is required in a case when Drawing appears immediately after first run i.e.
- * there is no text/space/tab in between two runs.
- * In this case "SdtEndBefore" property needs to be set on Drawing.
- */
- if(IsSdtEndBefore())
- {
- if(xPropertySet.is() && bHasGrabBag)
- {
- uno::Sequence<beans::PropertyValue> aFrameGrabBag( comphelper::InitPropertySequence({
- { "SdtEndBefore", uno::Any(true) }
- }));
- xPropertySet->setPropertyValue("FrameInteropGrabBag",uno::Any(aFrameGrabBag));
- }
- }
-
-
- // Update the shape properties if it is embedded object.
- if (m_StreamStateStack.top().xEmbedded.is())
- {
- if (m_pGraphicImport->GetXShapeObject())
- m_pGraphicImport->GetXShapeObject()->setPosition(
- m_pGraphicImport->GetGraphicObjectPosition());
-
- uno::Reference<drawing::XShape> xShape = m_pGraphicImport->GetXShapeObject();
- UpdateEmbeddedShapeProps(xShape);
- if (m_eGraphicImportType == IMPORT_AS_DETECTED_ANCHOR)
- {
- uno::Reference<beans::XPropertySet> const xEmbeddedProps(m_StreamStateStack.top().xEmbedded, uno::UNO_QUERY);
- xEmbeddedProps->setPropertyValue("AnchorType", uno::Any(text::TextContentAnchorType_AT_CHARACTER));
- xEmbeddedProps->setPropertyValue("IsFollowingTextFlow", uno::Any(m_pGraphicImport->GetLayoutInCell()));
- uno::Reference<beans::XPropertySet> xShapeProps(xShape, uno::UNO_QUERY);
- xEmbeddedProps->setPropertyValue("HoriOrient", xShapeProps->getPropertyValue("HoriOrient"));
- xEmbeddedProps->setPropertyValue("HoriOrientPosition", xShapeProps->getPropertyValue("HoriOrientPosition"));
- xEmbeddedProps->setPropertyValue("HoriOrientRelation", xShapeProps->getPropertyValue("HoriOrientRelation"));
- xEmbeddedProps->setPropertyValue("VertOrient", xShapeProps->getPropertyValue("VertOrient"));
- xEmbeddedProps->setPropertyValue("VertOrientPosition", xShapeProps->getPropertyValue("VertOrientPosition"));
- xEmbeddedProps->setPropertyValue("VertOrientRelation", xShapeProps->getPropertyValue("VertOrientRelation"));
- //tdf123873 fix missing textwrap import
- xEmbeddedProps->setPropertyValue("TextWrap", xShapeProps->getPropertyValue("TextWrap"));
-
- // GraphicZOrderHelper::findZOrder() was called already, so can just copy it over.
- xEmbeddedProps->setPropertyValue("ZOrder", xShapeProps->getPropertyValue("ZOrder"));
- }
- }
- //insert it into the document at the current cursor position
- OSL_ENSURE( xTextContent.is(), "DomainMapper_Impl::ImportGraphic");
- if( xTextContent.is())
- {
- bool bAppend = true;
- // workaround for images anchored to characters: add ZWSPs around the anchoring point
- if (m_eGraphicImportType != IMPORT_AS_DETECTED_INLINE && !m_aRedlines.top().empty())
- {
- uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend;
- if(xTextAppend.is())
- {
- try
- {
- uno::Reference< text::XText > xText = xTextAppend->getText();
- uno::Reference< text::XTextCursor > xCrsr = xText->createTextCursor();
- xCrsr->gotoEnd(false);
- PropertyMapPtr pEmpty(new PropertyMap());
- appendTextPortion(u"​"_ustr, pEmpty);
- appendTextContent( xTextContent, uno::Sequence< beans::PropertyValue >() );
- bAppend = false;
- xCrsr->gotoEnd(false);
- appendTextPortion(u"​"_ustr, pEmpty);
-
- m_bRedlineImageInPreviousRun = true;
- m_previousRedline = m_currentRedline;
- }
- catch( const uno::Exception& )
- {
- }
- }
- }
-
- if ( bAppend )
- appendTextContent( xTextContent, uno::Sequence< beans::PropertyValue >() );
-
- if (m_eGraphicImportType == IMPORT_AS_DETECTED_ANCHOR && !m_aTextAppendStack.empty())
- {
- // Remember this object is anchored to the current paragraph.
- AnchoredObjectInfo aInfo;
- aInfo.m_xAnchoredObject = xTextContent;
- if (m_pGraphicImport)
- {
- // We still have the graphic import around, remember the original margin, so later
- // SectionPropertyMap::HandleIncreasedAnchoredObjectSpacing() can use it.
- aInfo.m_nLeftMargin = m_pGraphicImport->GetLeftMarginOrig();
- }
- m_aTextAppendStack.top().m_aAnchoredObjects.push_back(aInfo);
- }
- else if (m_eGraphicImportType == IMPORT_AS_DETECTED_INLINE)
- {
- m_StreamStateStack.top().bParaWithInlineObject = true;
-
- // store inline images with track changes, because the anchor point
- // to set redlining is not available yet
- if (!m_aTextAppendStack.empty() && !m_aRedlines.top().empty() )
- {
- // Remember this object is anchored to the current paragraph.
- AnchoredObjectInfo aInfo;
- aInfo.m_xAnchoredObject = xTextContent;
- aInfo.m_xRedlineForInline = m_aRedlines.top().back();
- m_aTextAppendStack.top().m_aAnchoredObjects.push_back(aInfo);
- }
-
- }
- }
-
- // Clear the reference, so in case the embedded object is inside a
- // TextFrame, we won't try to resize it (to match the size of the
- // TextFrame) here.
- m_StreamStateStack.top().xEmbedded.clear();
- m_pGraphicImport.clear();
-}
-
-
-void DomainMapper_Impl::SetLineNumbering( sal_Int32 nLnnMod, sal_uInt32 nLnc, sal_Int32 ndxaLnn )
-{
- if( !m_bLineNumberingSet )
- {
- try
- {
- uno::Reference< text::XLineNumberingProperties > xLineProperties( m_xTextDocument, uno::UNO_QUERY_THROW );
- uno::Reference< beans::XPropertySet > xProperties = xLineProperties->getLineNumberingProperties();
- uno::Any aTrue( uno::Any( true ));
- xProperties->setPropertyValue( getPropertyName( PROP_IS_ON ), aTrue);
- xProperties->setPropertyValue( getPropertyName( PROP_COUNT_EMPTY_LINES ), aTrue );
- xProperties->setPropertyValue( getPropertyName( PROP_COUNT_LINES_IN_FRAMES ), uno::Any( false ) );
- xProperties->setPropertyValue( getPropertyName( PROP_INTERVAL ), uno::Any( static_cast< sal_Int16 >( nLnnMod )));
- xProperties->setPropertyValue( getPropertyName( PROP_DISTANCE ), uno::Any( ConversionHelper::convertTwipToMM100(ndxaLnn) ));
- xProperties->setPropertyValue( getPropertyName( PROP_NUMBER_POSITION ), uno::Any( style::LineNumberPosition::LEFT));
- xProperties->setPropertyValue( getPropertyName( PROP_NUMBERING_TYPE ), uno::Any( style::NumberingType::ARABIC));
- xProperties->setPropertyValue( getPropertyName( PROP_RESTART_AT_EACH_PAGE ), uno::Any( nLnc == NS_ooxml::LN_Value_ST_LineNumberRestart_newPage ));
- }
- catch( const uno::Exception& )
- {}
- }
- m_bLineNumberingSet = true;
- uno::Reference< style::XStyleFamiliesSupplier > xStylesSupplier( GetTextDocument(), uno::UNO_QUERY_THROW );
- uno::Reference< container::XNameAccess > xStyleFamilies = xStylesSupplier->getStyleFamilies();
- uno::Reference<container::XNameContainer> xStyles;
- xStyleFamilies->getByName(getPropertyName( PROP_PARAGRAPH_STYLES )) >>= xStyles;
- lcl_linenumberingHeaderFooter( xStyles, "Header", this );
- lcl_linenumberingHeaderFooter( xStyles, "Footer", this );
-}
-
-
-void DomainMapper_Impl::SetPageMarginTwip( PageMarElement eElement, sal_Int32 nValue )
-{
- nValue = ConversionHelper::convertTwipToMM100(nValue);
- switch(eElement)
- {
- case PAGE_MAR_TOP : m_aPageMargins.top = nValue; break;
- case PAGE_MAR_RIGHT : m_aPageMargins.right = nValue; break;
- case PAGE_MAR_BOTTOM : m_aPageMargins.bottom = nValue; break;
- case PAGE_MAR_LEFT : m_aPageMargins.left = nValue; break;
- case PAGE_MAR_HEADER : m_aPageMargins.header = nValue; break;
- case PAGE_MAR_FOOTER : m_aPageMargins.footer = nValue; break;
- case PAGE_MAR_GUTTER:
- m_aPageMargins.gutter = nValue;
- break;
- }
-}
-
-void DomainMapper_Impl::SetPaperSource(PaperSourceElement eElement, sal_Int32 nValue)
-{
- if(eElement == PAPER_SOURCE_FIRST)
- m_aPaperSource.first = nValue;
- else
- m_aPaperSource.other = nValue;
-}
-
-
-PageMar::PageMar()
- : top(ConversionHelper::convertTwipToMM100( sal_Int32(1440)))
- // This is strange, the RTF spec says it's 1800, but it's clearly 1440 in Word
- // OOXML seems not to specify a default value
- , right(ConversionHelper::convertTwipToMM100( sal_Int32(1440)))
- , bottom(top)
- , left(right)
- , header(ConversionHelper::convertTwipToMM100(sal_Int32(720)))
- , footer(header)
- , gutter(0)
-{
-}
-
-
-void DomainMapper_Impl::RegisterFrameConversion(
- uno::Reference< text::XTextRange > const& xFrameStartRange,
- uno::Reference< text::XTextRange > const& xFrameEndRange,
- std::vector<beans::PropertyValue>&& rFrameProperties
- )
-{
- OSL_ENSURE(
- m_aFrameProperties.empty() && !m_xFrameStartRange.is() && !m_xFrameEndRange.is(),
- "frame properties not removed");
- m_aFrameProperties = std::move(rFrameProperties);
- m_xFrameStartRange = xFrameStartRange;
- m_xFrameEndRange = xFrameEndRange;
-}
-
-
-void DomainMapper_Impl::ExecuteFrameConversion()
-{
- if( m_xFrameStartRange.is() && m_xFrameEndRange.is() && !m_bDiscardHeaderFooter )
- {
- std::vector<sal_Int32> redPos, redLen;
- try
- {
- uno::Reference< text::XTextAppendAndConvert > xTextAppendAndConvert( GetTopTextAppend(), uno::UNO_QUERY_THROW );
- // convert redline ranges to cursor movement and character length
- sal_Int32 redIdx;
- lcl_CopyRedlines(GetTopTextAppend(), m_aStoredRedlines[StoredRedlines::FRAME], redPos, redLen, redIdx);
-
- const uno::Reference< text::XTextContent >& xTextContent = xTextAppendAndConvert->convertToTextFrame(
- m_xFrameStartRange,
- m_xFrameEndRange,
- comphelper::containerToSequence(m_aFrameProperties) );
-
- uno::Reference< text::XText > xDest( xTextContent, uno::UNO_QUERY_THROW );
- lcl_PasteRedlines(xDest, m_aStoredRedlines[StoredRedlines::FRAME], redPos, redLen, redIdx);
- }
- catch( const uno::Exception&)
- {
- DBG_UNHANDLED_EXCEPTION( "writerfilter.dmapper", "Exception caught when converting to frame");
- }
-
- m_bIsActualParagraphFramed = false;
-
- if (redPos.size() == m_aStoredRedlines[StoredRedlines::FRAME].size()/3)
- {
- for( sal_Int32 i = m_aStoredRedlines[StoredRedlines::FRAME].size() - 1; i >= 0; --i)
- {
- // keep redlines of floating tables to process them in CloseSectionGroup()
- if ( redPos[i/3] != -1 )
- {
- m_aStoredRedlines[StoredRedlines::FRAME].erase(m_aStoredRedlines[StoredRedlines::FRAME].begin() + i);
- }
- }
- }
- else
- m_aStoredRedlines[StoredRedlines::FRAME].clear();
- }
- m_xFrameStartRange = nullptr;
- m_xFrameEndRange = nullptr;
- m_aFrameProperties.clear();
-}
-
-void DomainMapper_Impl::AddNewRedline( sal_uInt32 sprmId )
-{
- RedlineParamsPtr pNew( new RedlineParams );
- pNew->m_nToken = XML_mod;
- if ( !m_bIsParaMarkerChange )
- {
- // <w:rPrChange> applies to the whole <w:r>, <w:pPrChange> applies to the whole <w:p>,
- // so keep those two in CONTEXT_CHARACTERS and CONTEXT_PARAGRAPH, which will take
- // care of their scope (i.e. when they should be used and discarded).
- // Let's keep the rest the same way they used to be handled (explicitly dropped
- // from a global stack by endtrackchange), but quite possibly they should not be handled
- // that way either (I don't know).
- if( sprmId == NS_ooxml::LN_EG_RPrContent_rPrChange )
- GetTopContextOfType( CONTEXT_CHARACTER )->Redlines().push_back( pNew );
- else if( sprmId == NS_ooxml::LN_CT_PPr_pPrChange )
- GetTopContextOfType( CONTEXT_PARAGRAPH )->Redlines().push_back( pNew );
- else if( sprmId != NS_ooxml::LN_CT_ParaRPr_rPrChange )
- m_aRedlines.top().push_back( pNew );
- }
- else
- {
- m_pParaMarkerRedline = pNew;
- }
- // Newly read data will go into this redline.
- m_currentRedline = pNew;
-}
-
-void DomainMapper_Impl::SetCurrentRedlineIsRead()
-{
- m_currentRedline.clear();
-}
-
-sal_Int32 DomainMapper_Impl::GetCurrentRedlineToken( ) const
-{
- assert(m_currentRedline);
- return m_currentRedline->m_nToken;
-}
-
-void DomainMapper_Impl::SetCurrentRedlineAuthor( const OUString& sAuthor )
-{
- if (!m_xAnnotationField.is())
- {
- if (m_currentRedline)
- m_currentRedline->m_sAuthor = sAuthor;
- else
- SAL_INFO("writerfilter.dmapper", "numberingChange not implemented");
- }
- else
- m_xAnnotationField->setPropertyValue("Author", uno::Any(sAuthor));
-}
-
-void DomainMapper_Impl::SetCurrentRedlineInitials( const OUString& sInitials )
-{
- if (m_xAnnotationField.is())
- m_xAnnotationField->setPropertyValue("Initials", uno::Any(sInitials));
-}
-
-void DomainMapper_Impl::SetCurrentRedlineDate( const OUString& sDate )
-{
- if (!m_xAnnotationField.is())
- {
- if (m_currentRedline)
- m_currentRedline->m_sDate = sDate;
- else
- SAL_INFO("writerfilter.dmapper", "numberingChange not implemented");
- }
- else
- m_xAnnotationField->setPropertyValue("DateTimeValue", uno::Any(ConversionHelper::ConvertDateStringToDateTime(sDate)));
-}
-
-void DomainMapper_Impl::SetCurrentRedlineId( sal_Int32 sId )
-{
- if (m_xAnnotationField.is())
- {
- m_nAnnotationId = sId;
- }
- else
- {
- // This should be an assert, but somebody had the smart idea to reuse this function also for comments and whatnot,
- // and in some cases the id is actually not handled, which may be in fact a bug.
- if( !m_currentRedline)
- SAL_INFO("writerfilter.dmapper", "no current redline");
- }
-}
-
-void DomainMapper_Impl::SetCurrentRedlineToken( sal_Int32 nToken )
-{
- assert(m_currentRedline);
- m_currentRedline->m_nToken = nToken;
-}
-
-void DomainMapper_Impl::SetCurrentRedlineRevertProperties( const uno::Sequence<beans::PropertyValue>& aProperties )
-{
- assert(m_currentRedline);
- m_currentRedline->m_aRevertProperties = aProperties;
-}
-
-
-// This removes only the last redline stored here, those stored in contexts are automatically removed when
-// the context is destroyed.
-void DomainMapper_Impl::RemoveTopRedline( )
-{
- if (m_aRedlines.top().empty())
- {
- if (GetFootnoteCount() > -1 || GetEndnoteCount() > -1)
- return;
- SAL_WARN("writerfilter.dmapper", "RemoveTopRedline called with empty stack");
- throw uno::Exception("RemoveTopRedline failed", nullptr);
- }
- m_aRedlines.top().pop_back( );
- m_currentRedline.clear();
-}
-
-void DomainMapper_Impl::ApplySettingsTable()
-{
- if (!(m_pSettingsTable && m_xTextFactory.is()))
- return;
-
- try
- {
- uno::Reference< beans::XPropertySet > xTextDefaults(m_xTextFactory->createInstance("com.sun.star.text.Defaults"), uno::UNO_QUERY_THROW );
- sal_Int32 nDefTab = m_pSettingsTable->GetDefaultTabStop();
- xTextDefaults->setPropertyValue( getPropertyName( PROP_TAB_STOP_DISTANCE ), uno::Any(nDefTab) );
- if (m_pSettingsTable->GetLinkStyles())
- {
- // If linked styles are enabled, set paragraph defaults from Word's default template
- xTextDefaults->setPropertyValue(getPropertyName(PROP_PARA_BOTTOM_MARGIN), uno::Any(ConversionHelper::convertTwipToMM100(200)));
- style::LineSpacing aSpacing;
- aSpacing.Mode = style::LineSpacingMode::PROP;
- aSpacing.Height = sal_Int16(115);
- xTextDefaults->setPropertyValue(getPropertyName(PROP_PARA_LINE_SPACING), uno::Any(aSpacing));
- }
-
- if (m_pSettingsTable->GetZoomFactor() || m_pSettingsTable->GetView())
- {
- std::vector<beans::PropertyValue> aViewProps;
- if (m_pSettingsTable->GetZoomFactor())
- {
- aViewProps.emplace_back("ZoomFactor", -1, uno::Any(m_pSettingsTable->GetZoomFactor()), beans::PropertyState_DIRECT_VALUE);
- aViewProps.emplace_back("VisibleBottom", -1, uno::Any(sal_Int32(0)), beans::PropertyState_DIRECT_VALUE);
- aViewProps.emplace_back("ZoomType", -1,
- uno::Any(m_pSettingsTable->GetZoomType()),
- beans::PropertyState_DIRECT_VALUE);
- }
- rtl::Reference< comphelper::IndexedPropertyValuesContainer > xBox = new comphelper::IndexedPropertyValuesContainer();
- xBox->insertByIndex(sal_Int32(0), uno::Any(comphelper::containerToSequence(aViewProps)));
- uno::Reference<document::XViewDataSupplier> xViewDataSupplier(m_xTextDocument, uno::UNO_QUERY);
- xViewDataSupplier->setViewData(xBox);
- }
-
- uno::Reference< beans::XPropertySet > xSettings(m_xTextFactory->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY);
-
- if (m_pSettingsTable->GetDoNotExpandShiftReturn())
- xSettings->setPropertyValue( "DoNotJustifyLinesWithManualBreak", uno::Any(true) );
- // new paragraph justification has been introduced in version 15,
- // breaking text layout interoperability: new line shrinking needs less space
- // i.e. it typesets the same text with less lines and pages.
- if (m_pSettingsTable->GetWordCompatibilityMode() >= 15)
- xSettings->setPropertyValue("JustifyLinesWithShrinking", uno::Any( true ));
- if (m_pSettingsTable->GetUsePrinterMetrics())
- xSettings->setPropertyValue("PrinterIndependentLayout", uno::Any(document::PrinterIndependentLayout::DISABLED));
- if( m_pSettingsTable->GetEmbedTrueTypeFonts())
- xSettings->setPropertyValue( getPropertyName( PROP_EMBED_FONTS ), uno::Any(true) );
- if( m_pSettingsTable->GetEmbedSystemFonts())
- xSettings->setPropertyValue( getPropertyName( PROP_EMBED_SYSTEM_FONTS ), uno::Any(true) );
- xSettings->setPropertyValue("AddParaTableSpacing", uno::Any(m_pSettingsTable->GetDoNotUseHTMLParagraphAutoSpacing()));
- if (m_pSettingsTable->GetNoLeading())
- {
- xSettings->setPropertyValue("AddExternalLeading", uno::Any(!m_pSettingsTable->GetNoLeading()));
- }
- if( m_pSettingsTable->GetProtectForm() )
- xSettings->setPropertyValue("ProtectForm", uno::Any( true ));
- if( m_pSettingsTable->GetReadOnly() )
- xSettings->setPropertyValue("LoadReadonly", uno::Any( true ));
- if (m_pSettingsTable->GetGutterAtTop())
- {
- xSettings->setPropertyValue("GutterAtTop", uno::Any(true));
- }
- uno::Sequence<beans::PropertyValue> aWriteProtection
- = m_pSettingsTable->GetWriteProtectionSettings();
- if (aWriteProtection.hasElements())
- xSettings->setPropertyValue("ModifyPasswordInfo", uno::Any(aWriteProtection));
- }
- catch(const uno::Exception&)
- {
- }
-}
-
-SectionPropertyMap * DomainMapper_Impl::GetSectionContext()
-{
- SectionPropertyMap* pSectionContext = nullptr;
- //the section context is not available before the first call of startSectionGroup()
- if( !IsAnyTableImport() )
- {
- PropertyMapPtr pContext = GetTopContextOfType(CONTEXT_SECTION);
- pSectionContext = dynamic_cast< SectionPropertyMap* >( pContext.get() );
- }
-
- return pSectionContext;
-}
-
-void DomainMapper_Impl::deferCharacterProperty(sal_Int32 id, const css::uno::Any& value)
-{
- m_StreamStateStack.top().deferredCharacterProperties[ id ] = value;
-}
-
-void DomainMapper_Impl::processDeferredCharacterProperties(bool bCharContext)
-{
- // Actually process in DomainMapper, so that it's the same source file like normal processing.
- if (!m_StreamStateStack.top().deferredCharacterProperties.empty())
- {
- m_rDMapper.processDeferredCharacterProperties(m_StreamStateStack.top().deferredCharacterProperties, bCharContext);
- m_StreamStateStack.top().deferredCharacterProperties.clear();
- }
-}
-
-sal_Int32 DomainMapper_Impl::getNumberingProperty(const sal_Int32 nListId, sal_Int32 nNumberingLevel, const OUString& aProp)
-{
- sal_Int32 nRet = 0;
- if ( nListId < 0 )
- return nRet;
-
- try
- {
- if (nNumberingLevel < 0) // It seems it's valid to omit numbering level, and in that case it means zero.
- nNumberingLevel = 0;
-
- auto const pList(GetListTable()->GetList(nListId));
- assert(pList);
- const OUString aListName = pList->GetStyleName();
- const uno::Reference< style::XStyleFamiliesSupplier > xStylesSupplier(GetTextDocument(), uno::UNO_QUERY_THROW);
- const uno::Reference< container::XNameAccess > xStyleFamilies = xStylesSupplier->getStyleFamilies();
- uno::Reference<container::XNameAccess> xNumberingStyles;
- xStyleFamilies->getByName("NumberingStyles") >>= xNumberingStyles;
- const uno::Reference<beans::XPropertySet> xStyle(xNumberingStyles->getByName(aListName), uno::UNO_QUERY);
- const uno::Reference<container::XIndexAccess> xNumberingRules(xStyle->getPropertyValue("NumberingRules"), uno::UNO_QUERY);
- if (xNumberingRules.is())
- {
- uno::Sequence<beans::PropertyValue> aProps;
- xNumberingRules->getByIndex(nNumberingLevel) >>= aProps;
- auto pProp = std::find_if(std::cbegin(aProps), std::cend(aProps),
- [&aProp](const beans::PropertyValue& rProp) { return rProp.Name == aProp; });
- if (pProp != std::cend(aProps))
- pProp->Value >>= nRet;
- }
- }
- catch( const uno::Exception& )
- {
- // This can happen when the doc contains some hand-crafted invalid list level.
- }
-
- return nRet;
-}
-
-sal_Int32 DomainMapper_Impl::getCurrentNumberingProperty(const OUString& aProp)
-{
- sal_Int32 nRet = 0;
-
- std::optional<PropertyMap::Property> pProp = m_pTopContext->getProperty(PROP_NUMBERING_RULES);
- uno::Reference<container::XIndexAccess> xNumberingRules;
- if (pProp)
- xNumberingRules.set(pProp->second, uno::UNO_QUERY);
- pProp = m_pTopContext->getProperty(PROP_NUMBERING_LEVEL);
- // Default numbering level is the first one.
- sal_Int32 nNumberingLevel = 0;
- if (pProp)
- pProp->second >>= nNumberingLevel;
- if (xNumberingRules.is())
- {
- uno::Sequence<beans::PropertyValue> aProps;
- xNumberingRules->getByIndex(nNumberingLevel) >>= aProps;
- auto pPropVal = std::find_if(std::cbegin(aProps), std::cend(aProps),
- [&aProp](const beans::PropertyValue& rProp) { return rProp.Name == aProp; });
- if (pPropVal != std::cend(aProps))
- pPropVal->Value >>= nRet;
- }
-
- return nRet;
-}
-
-
-void DomainMapper_Impl::enableInteropGrabBag(const OUString& aName)
-{
- m_aInteropGrabBagName = aName;
-}
-
-void DomainMapper_Impl::disableInteropGrabBag()
-{
- m_aInteropGrabBagName.clear();
- m_aInteropGrabBag.clear();
- m_aSubInteropGrabBag.clear();
-}
-
-bool DomainMapper_Impl::isInteropGrabBagEnabled() const
-{
- return !(m_aInteropGrabBagName.isEmpty());
-}
-
-void DomainMapper_Impl::appendGrabBag(std::vector<beans::PropertyValue>& rInteropGrabBag, const OUString& aKey, const OUString& aValue)
-{
- if (m_aInteropGrabBagName.isEmpty())
- return;
- beans::PropertyValue aProperty;
- aProperty.Name = aKey;
- aProperty.Value <<= aValue;
- rInteropGrabBag.push_back(aProperty);
-}
-
-void DomainMapper_Impl::appendGrabBag(std::vector<beans::PropertyValue>& rInteropGrabBag, const OUString& aKey, std::vector<beans::PropertyValue>& rValue)
-{
- if (m_aInteropGrabBagName.isEmpty())
- return;
- beans::PropertyValue aProperty;
- aProperty.Name = aKey;
- aProperty.Value <<= comphelper::containerToSequence(rValue);
- rValue.clear();
- rInteropGrabBag.push_back(aProperty);
-}
-
-void DomainMapper_Impl::substream(Id rName,
- ::writerfilter::Reference<Stream>::Pointer_t const& ref)
-{
-#ifndef NDEBUG
- size_t contextSize(m_aContextStack.size());
- size_t propSize[NUMBER_OF_CONTEXTS];
- for (int i = 0; i < NUMBER_OF_CONTEXTS; ++i) {
- propSize[i] = m_aPropertyStacks[i].size();
- }
-#endif
-
- //finalize any waiting frames before starting alternate streams
- CheckUnregisteredFrameConversion();
- ExecuteFrameConversion();
-
- appendTableManager();
- // Appending a TableManager resets its TableHandler, so we need to append
- // that as well, or tables won't be imported properly in headers/footers.
- appendTableHandler();
- getTableManager().startLevel();
-
- // Save "has footnote" state, which is specific to a section in the body
- // text, so state from substreams is not relevant.
- m_StreamStateStack.emplace();
-
- //import of page header/footer
- //Ensure that only one header/footer per section is pushed
-
- switch( rName )
- {
- case NS_ooxml::LN_headerl:
- PushPageHeaderFooter(PagePartType::Header, PageType::LEFT);
- break;
- case NS_ooxml::LN_headerr:
- PushPageHeaderFooter(PagePartType::Header, PageType::RIGHT);
- break;
- case NS_ooxml::LN_headerf:
- PushPageHeaderFooter(PagePartType::Header, PageType::FIRST);
- break;
- case NS_ooxml::LN_footerl:
- PushPageHeaderFooter(PagePartType::Footer, PageType::LEFT);
- break;
- case NS_ooxml::LN_footerr:
- PushPageHeaderFooter(PagePartType::Footer, PageType::RIGHT);
- break;
- case NS_ooxml::LN_footerf:
- PushPageHeaderFooter(PagePartType::Footer, PageType::FIRST);
- break;
- case NS_ooxml::LN_footnote:
- case NS_ooxml::LN_endnote:
- PushFootOrEndnote( NS_ooxml::LN_footnote == rName );
- break;
- case NS_ooxml::LN_annotation :
- PushAnnotation();
- break;
- default:
- assert(false); // unexpected?
- }
-
- assert(m_StreamStateStack.top().eSubstreamType != SubstreamType::Body);
-
- try
- {
- ref->resolve(m_rDMapper);
- }
- catch (xml::sax::SAXException const&)
- {
- m_bSaxError = true;
- throw;
- }
-
- switch( rName )
- {
- case NS_ooxml::LN_headerl:
- PopPageHeaderFooter(PagePartType::Header, PageType::LEFT);
- break;
- case NS_ooxml::LN_footerl:
- PopPageHeaderFooter(PagePartType::Footer, PageType::LEFT);
- break;
- case NS_ooxml::LN_headerr:
- PopPageHeaderFooter(PagePartType::Header, PageType::RIGHT);
- break;
- case NS_ooxml::LN_footerr:
- PopPageHeaderFooter(PagePartType::Footer, PageType::RIGHT);
- break;
- case NS_ooxml::LN_headerf:
- PopPageHeaderFooter(PagePartType::Header, PageType::FIRST);
- break;
- case NS_ooxml::LN_footerf:
- PopPageHeaderFooter(PagePartType::Footer, PageType::FIRST);
- break;
- case NS_ooxml::LN_footnote:
- case NS_ooxml::LN_endnote:
- PopFootOrEndnote();
- break;
- case NS_ooxml::LN_annotation :
- PopAnnotation();
- break;
- }
-
- m_StreamStateStack.pop();
- assert(!m_StreamStateStack.empty());
-
- getTableManager().endLevel();
- popTableManager();
-
- switch(rName)
- {
- case NS_ooxml::LN_footnote:
- case NS_ooxml::LN_endnote:
- m_StreamStateStack.top().bHasFtn = true;
- break;
- }
-
- // check that stacks are the same as before substream
- assert(m_aContextStack.size() == contextSize);
- for (int i = 0; i < NUMBER_OF_CONTEXTS; ++i) {
- assert(m_aPropertyStacks[i].size() == propSize[i]);
- }
-}
-
-void DomainMapper_Impl::commentProps(const OUString& sId, const CommentProperties& rProps)
-{
- m_aCommentProps[sId] = rProps;
-}
-
-
-bool DomainMapper_Impl::handlePreviousParagraphBorderInBetween() const
-{
- if (!m_StreamStateStack.top().xPreviousParagraph.is())
- return false;
-
- // Connected borders ("ParaIsConnectBorder") are always on by default
- // and never changed by DomainMapper. Except one case when border in
- // between is used. So this is not the best, but easiest way to check
- // is previous paragraph has border in between.
- bool bConnectBorders = true;
- m_StreamStateStack.top().xPreviousParagraph->getPropertyValue(getPropertyName(PROP_PARA_CONNECT_BORDERS)) >>= bConnectBorders;
-
- if (bConnectBorders)
- return false;
-
- // Previous paragraph has border in between. Current one also has (since this
- // method is called). So current paragraph will get border above, but
- // also need to ensure, that no unexpected bottom border are remaining in previous
- // paragraph: since ParaIsConnectBorder=false it will be displayed in unexpected way.
- m_StreamStateStack.top().xPreviousParagraph->setPropertyValue(getPropertyName(PROP_BOTTOM_BORDER), uno::Any(table::BorderLine2()));
-
- return true;
-}
-
-OUString DomainMapper_Impl::getFontNameForTheme(const Id id)
-{
- auto const& pHandler = getThemeHandler();
- if (pHandler)
- return pHandler->getFontNameForTheme(id);
- return OUString();
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
deleted file mode 100644
index 94ab42de3f98..000000000000
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ /dev/null
@@ -1,1258 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <com/sun/star/text/XParagraphCursor.hpp>
-#include <com/sun/star/text/XTextDocument.hpp>
-#include <com/sun/star/text/XTextCursor.hpp>
-#include <com/sun/star/text/XTextAppend.hpp>
-#include <com/sun/star/text/XTextFrame.hpp>
-#include <com/sun/star/style/TabStop.hpp>
-#include <com/sun/star/container/XNameContainer.hpp>
-#include <com/sun/star/embed/XStorage.hpp>
-#include <queue>
-#include <stack>
-#include <string_view>
-#include <o3tl/sorted_vector.hxx>
-#include <unordered_map>
-#include <utility>
-#include <vector>
-#include <optional>
-
-#include <ooxml/OOXMLDocument.hxx>
-
-#include <dmapper/CommentProperties.hxx>
-
-#include "DomainMapper.hxx"
-#include "DomainMapperTableManager.hxx"
-#include "DomainMapperTableHandler.hxx"
-#include "PropertyMap.hxx"
-#include "FontTable.hxx"
-#include "NumberingManager.hxx"
-#include "StyleSheetTable.hxx"
-#include "SettingsTable.hxx"
-#include "ThemeHandler.hxx"
-#include "GraphicImport.hxx"
-#include "OLEHandler.hxx"
-#include "FFDataHandler.hxx"
-#include "SmartTagHandler.hxx"
-#include "FormControlHelper.hxx"
-#include <map>
-
-namespace com::sun::star{
- namespace awt{
- struct Size;
- }
- namespace lang{
- class XMultiServiceFactory;
- struct Locale;
- }
- namespace text
- {
- class XTextField;
- class XTextFrame;
- class XFormField;
- }
- namespace beans{ class XPropertySet;}
-}
-
-namespace writerfilter::ooxml {
- class OOXMLDocument;
-}
-
-namespace writerfilter::dmapper {
-
-class SdtHelper;
-
-struct PageMar
-{
- sal_Int32 top;
- sal_Int32 right;
- sal_Int32 bottom;
- sal_Int32 left;
- sal_Int32 header;
- sal_Int32 footer;
- sal_Int32 gutter;
- public:
- PageMar();
-};
-enum PageMarElement
-{
- PAGE_MAR_TOP,
- PAGE_MAR_RIGHT,
- PAGE_MAR_BOTTOM,
- PAGE_MAR_LEFT,
- PAGE_MAR_HEADER,
- PAGE_MAR_FOOTER,
- PAGE_MAR_GUTTER
-};
-
-struct PaperSource
-{
- sal_Int32 first;
- sal_Int32 other;
- public:
- PaperSource() :
- first(0),
- other(0)
- {}
-};
-
-enum PaperSourceElement
-{
- PAPER_SOURCE_FIRST,
- PAPER_SOURCE_OTHER,
-};
-
-/// property stack element
-enum ContextType
-{
- CONTEXT_SECTION,
- CONTEXT_PARAGRAPH,
- CONTEXT_CHARACTER,
- CONTEXT_STYLESHEET,
- CONTEXT_LIST
-};
-enum { NUMBER_OF_CONTEXTS = CONTEXT_LIST + 1 };
-
-enum BreakType
-{
- PAGE_BREAK,
- COLUMN_BREAK,
- LINE_BREAK
-};
-
-/**
- * Two special footnotes are a separator line, and a continuation line.
- * In MSOffice, these can contain text as well, but LO doesn't implement this
- * rarely used feature, so the separator text needs to be skipped. (tdf#123262)
- * Three-way logic is needed because there is no guaranteed on-off event.
- * OFF == not in footnote separator
- * ON == in footnote separator
- * SKIPPING == ON status has been recognized.
- */
-enum class SkipFootnoteSeparator
-{
- OFF,
- ON,
- SKIPPING
-};
-
-// type of stored redlines
-enum StoredRedlines
-{
- FRAME = 0,
- FOOTNOTE,
- ENDNOTE,
- NONE
-};
-
-struct RubyInfo
-{
- OUString sRubyText;
- OUString sRubyStyle;
- sal_uInt32 nSprmId;
- sal_uInt32 nRubyAlign;
- sal_uInt32 nHps;
- sal_uInt32 nHpsBaseText;
-
- RubyInfo():
- nSprmId(0),
- nRubyAlign(0),
- nHps(0),
- nHpsBaseText(0)
- {
- }
-};
-
-enum class SubstreamType
-{
- Body,
- Header,
- Footer,
- Footnote,
- Endnote,
- Annotation,
-};
-
-/**
- * Storage for state that is relevant outside a header/footer, but not inside it.
- *
- * In case some state of DomainMapper_Impl should be reset before handling the
- * header/footer and should be restored once handling of header/footer is done,
- * then you can use this class to do so.
- *
- * note: presumably more state should be moved here.
- */
-struct SubstreamContext
-{
- SubstreamType eSubstreamType = SubstreamType::Body;
- bool bTextInserted = false;
- /**
- * This contains the raw table depth. nTableDepth > 0 is the same as
- * getTableManager().isInTable(), unless we're in the first paragraph of a
- * table, or first paragraph after a table, as the table manager is only
- * updated once we ended the paragraph (and know if the para has the
- * inTbl SPRM or not).
- */
- sal_Int32 nTableDepth = 0;
- // deferred breaks need to be saved for RTF, also for DOCX annotations
- bool bIsColumnBreakDeferred = false;
- bool bIsPageBreakDeferred = false;
- sal_Int32 nLineBreaksDeferred = 0;
- /// Current paragraph had at least one field in it.
- bool bParaHadField = false;
- /// Current paragraph in a table is first paragraph of a cell
- bool bFirstParagraphInCell = true;
- /// If the current paragraph has any runs.
- bool bParaChanged = false;
- bool bIsFirstParaInSectionAfterRedline = true;
- bool bIsFirstParaInSection = true;
- bool bIsLastParaInSection = false;
- /// If the current paragraph contains section property definitions.
- bool bParaSectpr = false;
- bool bIsPreviousParagraphFramed = false;
- /// Current paragraph had at least one inline object in it.
- bool bParaWithInlineObject = false;
- /// This is a continuation of already finished paragraph - e.g., first in an index section
- bool bRemoveThisParagraph = false;
- bool bIsFirstParaInShape = false;
- /// If the current section has footnotes.
- bool bHasFtn = false;
- css::uno::Reference<css::beans::XPropertySet> xPreviousParagraph;
- /// Current paragraph has automatic before spacing.
- bool bParaAutoBefore = false;
- /// Raw table cell depth.
- sal_Int32 nTableCellDepth = 0;
- /// If the next tab should be ignored, used for footnotes.
- bool bCheckFirstFootnoteTab = false;
- std::optional<sal_Int16> oLineBreakClear;
- bool bIsInTextBox = false;
- css::uno::Reference<css::text::XTextContent> xEmbedded;
- /// If we want to set "sdt end" on the next character context.
- bool bSdtEndDeferred = false;
- /// If we want to set "paragraph sdt end" on the next paragraph context.
- bool bParaSdtEndDeferred = false;
- /// If the current paragraph is inside a structured document element.
- bool bSdt = false;
- css::uno::Reference<css::text::XTextRange> xSdtEntryStart;
- OUString sCurrentParaStyleName; ///< highly inaccurate. Overwritten by "overlapping" paragraphs like flys.
- bool bHasFootnoteStyle = false;
- bool bCheckFootnoteStyle = false;
- bool bIsInFootnoteProperties = false;
- RubyInfo aRubyInfo;
- bool bTextFrameInserted = false;
- bool bIsFirstRun = false;
- bool bIsOutsideAParagraph = true;
- std::map<sal_Int32, css::uno::Any> deferredCharacterProperties;
-};
-
-/// Information about a paragraph to be finished after a field end.
-struct FieldParagraph
-{
- PropertyMapPtr m_pPropertyMap;
- bool m_bRemove = false;
-};
-
-/// field stack element
-class FieldContext : public virtual SvRefBase
-{
- bool m_bFieldCommandCompleted;
- css::uno::Reference<css::text::XTextRange> m_xStartRange;
-
- // Two command string:
- // 0: Normal, inserted command line
- // 1: Deleted command line
- OUString m_sCommand[2];
- OUString m_sResult;
- OUString m_sVariableValue;
- std::optional<FieldId> m_eFieldId;
- bool m_bFieldLocked;
- // Current command line type: normal or deleted
- bool m_bCommandType;
-public:
- bool m_bSetUserFieldContent = false;
- bool m_bSetCitation = false;
- bool m_bSetDateValue = false;
-private:
-
- css::uno::Reference<css::text::XTextField> m_xTextField;
- css::uno::Reference<css::text::XFormField> m_xFormField;
- css::uno::Reference<css::beans::XPropertySet> m_xTOC;
- css::uno::Reference<css::beans::XPropertySet> m_xTC; // TOX entry
- css::uno::Reference<css::beans::XPropertySet> m_xCustomField;
-
- OUString m_sHyperlinkURL;
- /// A frame for the hyperlink when one exists.
- OUString m_sHyperlinkTarget;
- OUString m_sHyperlinkStyle;
-
- FFDataHandler::Pointer_t m_pFFDataHandler;
- FormControlHelper::Pointer_t m_pFormControlHelper;
- /// (Character) properties of the field itself.
- PropertyMapPtr m_pProperties;
-
- std::vector<FieldParagraph> m_aParagraphsToFinish;
-
-public:
- explicit FieldContext(css::uno::Reference<css::text::XTextRange> xStart);
- ~FieldContext() override;
-
- const css::uno::Reference<css::text::XTextRange>& GetStartRange() const { return m_xStartRange; }
-
- void AppendCommand(std::u16string_view rPart);
- const OUString& GetCommand() const {return m_sCommand[m_bCommandType]; }
- bool GetCommandIsEmpty(bool bType) const { return m_sCommand[bType].isEmpty(); }
- void SetCommandType(bool cType) { m_bCommandType = cType; }
-
- void SetFieldId(FieldId eFieldId ) { m_eFieldId = eFieldId; }
- std::optional<FieldId> const & GetFieldId() const { return m_eFieldId; }
-
- void AppendResult(std::u16string_view rResult) { m_sResult += rResult; }
- const OUString& GetResult() const { return m_sResult; }
-
- void CacheVariableValue(const css::uno::Any& rAny);
- const OUString& GetVariableValue() { return m_sVariableValue; }
-
- void SetCommandCompleted() { m_bFieldCommandCompleted = true; }
- bool IsCommandCompleted() const { return m_bFieldCommandCompleted; }
-
- void SetFieldLocked() { m_bFieldLocked = true; }
- bool IsFieldLocked() const { return m_bFieldLocked; }
-
- const css::uno::Reference<css::beans::XPropertySet>& GetCustomField() const { return m_xCustomField; }
- void SetCustomField(css::uno::Reference<css::beans::XPropertySet> const& xCustomField) { m_xCustomField = xCustomField; }
- const css::uno::Reference<css::text::XTextField>& GetTextField() const { return m_xTextField;}
- void SetTextField(css::uno::Reference<css::text::XTextField> const& xTextField);
- const css::uno::Reference<css::text::XFormField>& GetFormField() const { return m_xFormField;}
- void SetFormField(css::uno::Reference<css::text::XFormField> const& xFormField) { m_xFormField = xFormField;}
-
- void SetTOC(css::uno::Reference<css::beans::XPropertySet> const& xTOC) { m_xTOC = xTOC; }
- const css::uno::Reference<css::beans::XPropertySet>& GetTOC() const { return m_xTOC; }
-
- void SetTC(css::uno::Reference<css::beans::XPropertySet> const& xTC) { m_xTC = xTC; }
- const css::uno::Reference<css::beans::XPropertySet>& GetTC() const { return m_xTC; }
-
- void SetHyperlinkURL( const OUString& rURL ) { m_sHyperlinkURL = rURL; }
- const OUString& GetHyperlinkURL() const { return m_sHyperlinkURL; }
- void SetHyperlinkTarget(const OUString& rTarget) { m_sHyperlinkTarget = rTarget; }
- const OUString& GetHyperlinkTarget() const { return m_sHyperlinkTarget; }
- void SetHyperlinkStyle(const OUString& rStyle) { m_sHyperlinkStyle = rStyle; }
- const OUString& GetHyperlinkStyle() const { return m_sHyperlinkStyle; }
-
- void setFFDataHandler(const FFDataHandler::Pointer_t& pFFDataHandler) { m_pFFDataHandler = pFFDataHandler; }
- const FFDataHandler::Pointer_t& getFFDataHandler() const { return m_pFFDataHandler; }
-
- void setFormControlHelper(const FormControlHelper::Pointer_t& pFormControlHelper) { m_pFormControlHelper = pFormControlHelper; }
- const FormControlHelper::Pointer_t& getFormControlHelper() const { return m_pFormControlHelper; }
- const PropertyMapPtr& getProperties() const { return m_pProperties; }
-
- ::std::vector<OUString> GetCommandParts() const;
-
- std::vector<FieldParagraph>& GetParagraphsToFinish() { return m_aParagraphsToFinish; }
-};
-
-struct AnchoredContext
-{
- css::uno::Reference<css::text::XTextContent> xTextContent;
- bool bToRemove;
-
- explicit AnchoredContext(css::uno::Reference<css::text::XTextContent> xContent)
- : xTextContent(std::move(xContent)), bToRemove(false)
- {
- }
-};
-
-typedef tools::SvRef<FieldContext> FieldContextPtr;
-
-/*-------------------------------------------------------------------------
- extended tab stop struct
- -----------------------------------------------------------------------*/
-struct DeletableTabStop : public css::style::TabStop
-{
- bool bDeleted;
- explicit DeletableTabStop()
- : bDeleted(false)
- {
- FillChar = ' '; // same default as SvxXMLTabStopContext_Impl
- }
- DeletableTabStop(const css::style::TabStop& rTabStop)
- : TabStop(rTabStop),
- bDeleted(false)
- {
- }
-};
-/// helper to remember bookmark start position
-struct BookmarkInsertPosition
-{
- bool m_bIsStartOfText;
- OUString m_sBookmarkName;
- css::uno::Reference<css::text::XTextRange> m_xTextRange;
- BookmarkInsertPosition(bool bIsStartOfText, OUString rName, css::uno::Reference<css::text::XTextRange> xTextRange):
- m_bIsStartOfText( bIsStartOfText ),
- m_sBookmarkName(std::move( rName )),
- m_xTextRange(std::move( xTextRange ))
- {}
-};
-
-struct PermInsertPosition
-{
- bool m_bIsStartOfText;
- sal_Int32 m_Id;
- OUString m_Ed;
- OUString m_EdGrp;
-
- css::uno::Reference<css::text::XTextRange> m_xTextRange;
-
- PermInsertPosition(bool bIsStartOfText, sal_Int32 id, OUString ed, OUString edGrp, css::uno::Reference<css::text::XTextRange> xTextRange)
- : m_bIsStartOfText(bIsStartOfText)
- , m_Id(id)
- , m_Ed(std::move(ed))
- , m_EdGrp(std::move(edGrp))
- , m_xTextRange(std::move(xTextRange))
- {}
-
- OUString createBookmarkName() const
- {
- OUString bookmarkName;
-
- assert((!m_Ed.isEmpty()) || (!m_EdGrp.isEmpty()));
-
- if (m_Ed.isEmpty())
- {
- bookmarkName += "permission-for-group:" +
- OUString::number(m_Id) +
- ":" +
- m_EdGrp;
- }
- else
- {
- bookmarkName += "permission-for-user:" +
- OUString::number(m_Id) +
- ":" +
- m_Ed;
- }
-
- //todo: make sure the name is not used already!
- return bookmarkName;
- }
-};
-
-/// Stores the start/end positions of an annotation before its insertion.
-struct AnnotationPosition
-{
- css::uno::Reference<css::text::XTextRange> m_xStart;
- css::uno::Reference<css::text::XTextRange> m_xEnd;
-};
-
-struct LineNumberSettings
-{
- sal_Int32 nDistance;
- sal_Int32 nInterval;
- bool bRestartAtEachPage;
- LineNumberSettings() :
- nDistance(-1)
- ,nInterval(0)
- ,bRestartAtEachPage(true)
- {}
-
-};
-
-/// Stores original/in-file-format info about a single anchored object.
-struct AnchoredObjectInfo
-{
- css::uno::Reference<css::text::XTextContent> m_xAnchoredObject;
- sal_Int32 m_nLeftMargin = 0;
- RedlineParamsPtr m_xRedlineForInline;
-};
-
-/// Stores info about objects anchored to a given paragraph.
-struct AnchoredObjectsInfo
-{
- css::uno::Reference<css::text::XTextRange> m_xParagraph;
- std::vector<AnchoredObjectInfo> m_aAnchoredObjects;
-};
-
-struct TextAppendContext
-{
- css::uno::Reference<css::text::XTextAppend> xTextAppend;
- css::uno::Reference<css::text::XParagraphCursor> xCursor;
- css::uno::Reference<css::text::XTextRange> xInsertPosition;
- ParagraphPropertiesPtr pLastParagraphProperties;
-
- /**
- * Objects anchored to the current paragraph, may affect the paragraph
- * spacing.
- */
- std::vector<AnchoredObjectInfo> m_aAnchoredObjects;
-
- TextAppendContext(css::uno::Reference<css::text::XTextAppend> const& i_xAppend,
- css::uno::Reference<css::text::XTextCursor> const& i_xCursor)
- : xTextAppend(i_xAppend)
- , xCursor(i_xCursor, css::uno::UNO_QUERY)
- , xInsertPosition(xCursor)
- {}
-};
-
-struct SymbolData
-{
- sal_Unicode cSymbol;
- OUString sFont;
- SymbolData():
- cSymbol(),
- sFont()
- { }
-};
-
-class DomainMapper;
-class DomainMapper_Impl final
-{
-public:
- typedef std::map < OUString, BookmarkInsertPosition > BookmarkMap_t;
- typedef std::map < sal_Int32, PermInsertPosition > PermMap_t;
-
-private:
- SourceDocumentType m_eDocumentType;
- DomainMapper& m_rDMapper;
- writerfilter::ooxml::OOXMLDocument* m_pOOXMLDocument;
- OUString m_aBaseUrl;
- css::uno::Reference<css::text::XTextDocument> m_xTextDocument;
- css::uno::Reference<css::beans::XPropertySet> m_xDocumentSettings;
- css::uno::Reference<css::lang::XMultiServiceFactory> m_xTextFactory;
- css::uno::Reference<css::uno::XComponentContext> m_xComponentContext;
- css::uno::Reference<css::container::XNameContainer> m_xPageStyles1;
- // cache next available number, expensive to repeatedly compute
- std::optional<int> m_xNextUnusedPageStyleNo;
- css::uno::Reference<css::container::XNameContainer> m_xCharacterStyles;
- css::uno::Reference<css::container::XNameContainer> m_xParagraphStyles;
-
- // cache next available number, expensive to repeatedly compute
- std::optional<int> m_xNextUnusedCharacterStyleNo;
- css::uno::Reference<css::text::XText> m_xBodyText;
-
- std::stack<TextAppendContext> m_aTextAppendStack;
- std::stack<AnchoredContext> m_aAnchoredStack;
-public: // DomainMapper needs it
- std::stack<SubstreamContext> m_StreamStateStack;
-private:
- std::stack<std::pair<TextAppendContext, PagePartType>> m_aHeaderFooterTextAppendStack;
-
- std::deque<FieldContextPtr> m_aFieldStack;
- bool m_bForceGenericFields;
- /// Type of decimal symbol associated to the document language in Writer locale definition
- bool m_bIsDecimalComma;
- bool m_bIsFirstSection;
- bool m_bStartTOC;
- bool m_bStartTOCHeaderFooter;
- /// If we got any text that is the pre-rendered result of the TOC field.
- bool m_bStartedTOC;
- bool m_bStartIndex;
- bool m_bStartBibliography;
- unsigned int m_nStartGenericField;
- bool m_bTextDeleted;
- LineNumberSettings m_aLineNumberSettings;
-
- std::vector<OUString> m_aRedlineMoveIDs;
- // Remember the last used redline MoveID. To avoid regression, because of wrong docx export
- sal_uInt32 m_nLastRedlineMovedID;
-
- BookmarkMap_t m_aBookmarkMap;
- OUString m_sCurrentBkmkId;
- OUString m_sCurrentBkmkName;
- OUString m_sCurrentBkmkPrefix;
-
- PermMap_t m_aPermMap;
- sal_Int32 m_sCurrentPermId;
- OUString m_sCurrentPermEd;
- OUString m_sCurrentPermEdGrp;
-
- PageMar m_aPageMargins;
- PaperSource m_aPaperSource;
- SymbolData m_aSymbolData;
-
- // TableManagers are stacked: one for each stream to avoid any confusion
- std::stack< tools::SvRef< DomainMapperTableManager > > m_aTableManagers;
- tools::SvRef<DomainMapperTableHandler> m_pTableHandler;
- // List of document lists overrides. They are applied only once on first occurrence in document
- o3tl::sorted_vector<sal_Int32> m_aListOverrideApplied;
-
- //each context needs a stack of currently used attributes
- std::stack<PropertyMapPtr> m_aPropertyStacks[NUMBER_OF_CONTEXTS];
- std::stack<ContextType> m_aContextStack;
- std::queue<std::optional<sal_Int16>> m_aFrameDirectionQueue;
- bool m_bFrameDirectionSet;
- FontTablePtr m_pFontTable;
- ListsManager::Pointer m_pListTable;
- std::deque< css::uno::Reference<css::drawing::XShape> > m_aPendingShapes;
- StyleSheetTablePtr m_pStyleSheetTable;
- SettingsTablePtr m_pSettingsTable;
- GraphicImportPtr m_pGraphicImport;
-
- std::unique_ptr<ThemeHandler> m_pThemeHandler;
-
- PropertyMapPtr m_pTopContext;
- tools::SvRef<SectionPropertyMap> m_pLastSectionContext;
- PropertyMapPtr m_pLastCharacterContext;
-
- ::std::vector<DeletableTabStop> m_aCurrentTabStops;
- OUString m_sDefaultParaStyleName; //caches the ConvertedStyleName of the default paragraph style
- bool m_bInDocDefaultsImport;
- bool m_bInStyleSheetImport; //in import of fonts, styles, lists or lfos
- bool m_bInNumberingImport; //in import of numbering (i.e. numbering.xml)
- bool m_bInAnyTableImport; //in import of fonts, styles, lists or lfos
- bool m_bDiscardHeaderFooter;
- PropertyMapPtr m_pFootnoteContext;
- /// Skip paragraphs from the <w:separator/> footnote
- SkipFootnoteSeparator m_eSkipFootnoteState;
- /// preload footnotes and endnotes
- sal_Int32 m_nFootnotes; // footnote count
- sal_Int32 m_nEndnotes; // endnote count
- // these are the real first notes, use their content in the first notes
- sal_Int32 m_nFirstFootnoteIndex;
- sal_Int32 m_nFirstEndnoteIndex;
-
- bool m_bLineNumberingSet;
-
- //registered frame properties
- std::vector<css::beans::PropertyValue> m_aFrameProperties;
- css::uno::Reference<css::text::XTextRange> m_xFrameStartRange;
- css::uno::Reference<css::text::XTextRange> m_xFrameEndRange;
-
- // Redline stack
- std::stack< std::vector< RedlineParamsPtr > > m_aRedlines;
- // The redline currently read, may be also stored by a context instead of m_aRedlines.
- RedlineParamsPtr m_currentRedline;
- RedlineParamsPtr m_previousRedline;
- RedlineParamsPtr m_pParaMarkerRedline;
- bool m_bIsParaMarkerChange;
- bool m_bIsParaMarkerMove;
- // redline data of the terminating run, if it's a moveFrom deletion or a moveTo insertion
- RedlineParamsPtr m_pParaMarkerRedlineMove;
- // This is for removing workaround (double ZWSPs around the anchoring point) for track
- // changed images anchored *to* character, if it's followed by a redline text run immediately.
- // (In that case, the image is part of a tracked text range, no need for the dummy
- // text ZWSPs to keep the change tracking of the image in Writer.)
- bool m_bRedlineImageInPreviousRun;
-
- bool m_bDummyParaAddedForTableInSection;
- bool m_bIsLastSectionGroup;
- bool m_bUsingEnhancedFields;
-
- css::uno::Reference< css::text::XTextCursor > m_xTOCMarkerCursor;
-
- ::std::set<::std::pair<PagePartType, PageType>> m_HeaderFooterSeen;
-
- //annotation import
- css::uno::Reference< css::beans::XPropertySet > m_xAnnotationField;
- sal_Int32 m_nAnnotationId;
- bool m_bAnnotationResolved = false;
- OUString m_sAnnotationParent;
- OUString m_sAnnotationImportedParaId;
- std::unordered_map< sal_Int32, AnnotationPosition > m_aAnnotationPositions;
-
- void SetNumberFormat(const OUString& rCommand, css::uno::Reference<css::beans::XPropertySet> const& xPropertySet, bool bDetectFormat = false);
- /// @throws css::uno::Exception
- css::uno::Reference<css::beans::XPropertySet> FindOrCreateFieldMaster(const char* pFieldMasterService, const OUString& rFieldMasterName);
- css::uno::Reference<css::beans::XPropertySet> const & GetDocumentSettings();
-
- SmartTagHandler m_aSmartTagHandler;
-
- css::uno::Reference<css::text::XTextRange> m_xGlossaryEntryStart;
- std::stack<BookmarkInsertPosition> m_xSdtStarts;
-
- std::queue< css::uno::Reference< css::text::XTextFrame > > m_xPendingTextBoxFrames;
-
-public:
- css::uno::Reference<css::text::XTextRange> m_xInsertTextRange;
- css::uno::Reference<css::text::XTextRange> m_xAltChunkStartingRange;
- std::deque<sal_Int32> m_aFootnoteIds;
- std::deque<sal_Int32> m_aEndnoteIds;
-
-private:
- bool m_bIsNewDoc;
- bool m_bIsAltChunk = false;
- bool m_bIsReadGlossaries;
-
-public:
- DomainMapper_Impl(
- DomainMapper& rDMapper,
- css::uno::Reference < css::uno::XComponentContext > xContext,
- css::uno::Reference< css::lang::XComponent > const& xModel,
- SourceDocumentType eDocumentType,
- utl::MediaDescriptor const & rMediaDesc);
- ~DomainMapper_Impl();
-
- void setDocumentReference(writerfilter::ooxml::OOXMLDocument* pDocument) { if (!m_pOOXMLDocument) m_pOOXMLDocument = pDocument; };
- writerfilter::ooxml::OOXMLDocument* getDocumentReference() const;
-
- SectionPropertyMap* GetLastSectionContext( )
- {
- return m_pLastSectionContext.get( );
- }
-
- css::uno::Reference<css::container::XNameContainer> const & GetPageStyles();
- OUString GetUnusedPageStyleName();
- css::uno::Reference<css::container::XNameContainer> const & GetCharacterStyles();
- css::uno::Reference<css::container::XNameContainer> const& GetParagraphStyles();
- OUString GetUnusedCharacterStyleName();
- css::uno::Reference<css::text::XText> const & GetBodyText();
- const css::uno::Reference<css::lang::XMultiServiceFactory>& GetTextFactory() const
- {
- return m_xTextFactory;
- }
- const css::uno::Reference<css::text::XTextDocument>& GetTextDocument() const
- {
- return m_xTextDocument;
- }
- void SetDocumentSettingsProperty( const OUString& rPropName, const css::uno::Any& rValue );
-
- void CreateRedline(css::uno::Reference<css::text::XTextRange> const& xRange, const RedlineParamsPtr& pRedline);
-
- void CheckParaMarkerRedline(css::uno::Reference<css::text::XTextRange> const& xRange);
-
- void CheckRedline(css::uno::Reference<css::text::XTextRange> const& xRange);
-
- void StartParaMarkerChange( );
- void EndParaMarkerChange( );
- void StartParaMarkerMove( );
- void EndParaMarkerMove( );
- void ChainTextFrames();
-
- void PushTextBoxContent();
- void PopTextBoxContent();
- void AttachTextBoxContentToShape(css::uno::Reference<css::drawing::XShape> xShape);
-
- void RemoveDummyParaForTableInSection();
- void AddDummyParaForTableInSection();
- void RemoveLastParagraph();
-
- void checkIfHeaderFooterIsEmpty(PagePartType ePagePartType, PageType eType);
- void prepareHeaderFooterContent(css::uno::Reference<css::beans::XPropertySet> const& xPageStyle,
- PagePartType ePagePartType, PropertyIds eID,
- bool bAppendToHeaderAndFooterTextStack);
-
- void SetIsDecimalComma() { m_bIsDecimalComma = true; };
- void SetIsLastParagraphInSection( bool bIsLast );
- bool GetIsLastParagraphInSection() const { return m_StreamStateStack.top().bIsLastParaInSection; }
- void SetRubySprmId(sal_uInt32 const nSprmId) { m_StreamStateStack.top().aRubyInfo.nSprmId = nSprmId; }
- void SetRubyText( OUString const &sText, OUString const &sStyle) {
- m_StreamStateStack.top().aRubyInfo.sRubyText = sText;
- m_StreamStateStack.top().aRubyInfo.sRubyStyle = sStyle;
- }
- const RubyInfo & GetRubyInfo() const { return m_StreamStateStack.top().aRubyInfo; }
- void SetRubyInfo(const RubyInfo & rInfo) { m_StreamStateStack.top().aRubyInfo = rInfo; }
-
- void SetIsLastSectionGroup( bool bIsLast );
- bool GetIsLastSectionGroup() const { return m_bIsLastSectionGroup;}
- void SetIsFirstParagraphInSection( bool bIsFirst );
- void SetIsFirstParagraphInSectionAfterRedline( bool bIsFirstAfterRedline );
- bool GetIsFirstParagraphInSection( bool bAfterRedline = false ) const;
- void SetIsFirstParagraphInShape(bool bIsFirst);
- bool GetIsFirstParagraphInShape() const { return m_StreamStateStack.top().bIsFirstParaInShape; }
- void SetIsDummyParaAddedForTableInSection( bool bIsAdded );
- bool GetIsDummyParaAddedForTableInSection() const { return m_bDummyParaAddedForTableInSection;}
-
- /// Track if a textframe has been inserted into this section
- void SetIsTextFrameInserted( bool bIsInserted );
- bool GetIsTextFrameInserted() const { return m_StreamStateStack.top().bTextFrameInserted; }
- void SetIsTextDeleted(bool bIsTextDeleted) { m_bTextDeleted = bIsTextDeleted; }
-
- void SetIsPreviousParagraphFramed(bool const bIsFramed)
- { m_StreamStateStack.top().bIsPreviousParagraphFramed = bIsFramed; }
- bool GetIsPreviousParagraphFramed() const { return m_StreamStateStack.top().bIsPreviousParagraphFramed; }
- void SetParaSectpr(bool bParaSectpr);
- bool GetParaSectpr() const { return m_StreamStateStack.top().bParaSectpr; }
-
- void SetSymbolChar( sal_Int32 nSymbol) { m_aSymbolData.cSymbol = sal_Unicode(nSymbol); }
- void SetSymbolFont( OUString const &rName ) { m_aSymbolData.sFont = rName; }
- const SymbolData & GetSymbolData() const { return m_aSymbolData;}
-
- void SetSdt(bool bSdt);
-
- void PushSdt();
- void PopSdt();
- /// Gives access to the currently open run/inline SDTs.
- const std::stack<BookmarkInsertPosition>& GetSdtStarts() const;
-
-
- bool GetParaChanged() const { return m_StreamStateStack.top().bParaChanged; }
- bool GetParaHadField() const { return m_StreamStateStack.top().bParaHadField; }
- bool GetRemoveThisPara() const { return m_StreamStateStack.top().bRemoveThisParagraph; }
-
- void deferBreak( BreakType deferredBreakType );
- bool isBreakDeferred( BreakType deferredBreakType );
- void clearDeferredBreaks();
- void clearDeferredBreak(BreakType deferredBreakType);
-
- void setSdtEndDeferred(bool bSdtEndDeferred);
- bool isSdtEndDeferred() const;
- void setParaSdtEndDeferred(bool bParaSdtEndDeferred);
- bool isParaSdtEndDeferred() const;
-
- void finishParagraph( const PropertyMapPtr& pPropertyMap, const bool bRemove = false, const bool bNoNumbering = false);
- void applyToggleAttributes( const PropertyMapPtr& pPropertyMap );
- void MergeAtContentImageRedlineWithNext(const css::uno::Reference<css::text::XTextAppend>& xTextAppend);
- void appendTextPortion( const OUString& rString, const PropertyMapPtr& pPropertyMap );
- void appendTextContent(const css::uno::Reference<css::text::XTextContent>&, const css::uno::Sequence<css::beans::PropertyValue>&);
- void appendOLE( const OUString& rStreamName, const std::shared_ptr<OLEHandler>& pOleHandler );
- void appendStarMath( const Value& v);
- void adjustLastPara(sal_Int8 nAlign);
- css::uno::Reference<css::beans::XPropertySet> appendTextSectionAfter(css::uno::Reference<css::text::XTextRange> const & xBefore);
-
- /// AutoText import: each entry is placed in the separate section
- void appendGlossaryEntry();
- /// Remember where entry was started
- void setGlossaryEntryStart( css::uno::Reference<css::text::XTextRange> const & xStart )
- {
- m_xGlossaryEntryStart = xStart;
- }
-
- // push the new properties onto the stack and make it the 'current' property map
- void PushProperties(ContextType eId);
- void PushStyleProperties(const PropertyMapPtr& pStyleProperties);
- void PushListProperties(const PropertyMapPtr& pListProperties);
- void PopProperties(ContextType eId);
-
- ContextType GetTopContextType() const { return m_aContextStack.top(); }
- const PropertyMapPtr& GetTopContext() const
- {
- return m_pTopContext;
- }
- PropertyMapPtr GetTopContextOfType(ContextType eId);
-
- bool HasTopText() const;
- css::uno::Reference<css::text::XTextAppend> const & GetTopTextAppend();
- FieldContextPtr const & GetTopFieldContext();
-
- bool HasTopAnchoredObjects() const;
-
- FontTablePtr const & GetFontTable()
- {
- if(!m_pFontTable)
- m_pFontTable = new FontTable();
- return m_pFontTable;
- }
- StyleSheetTablePtr const & GetStyleSheetTable()
- {
- if(!m_pStyleSheetTable)
- m_pStyleSheetTable = new StyleSheetTable( m_rDMapper, m_xTextDocument, m_bIsNewDoc );
- return m_pStyleSheetTable;
- }
- OUString GetListStyleName(sal_Int32 nListId);
- ListsManager::Pointer const & GetListTable();
-
- std::unique_ptr<ThemeHandler> const& getThemeHandler()
- {
- if (!m_pThemeHandler && m_pOOXMLDocument && m_pOOXMLDocument->getTheme())
- {
- m_pThemeHandler = std::make_unique<ThemeHandler>(m_pOOXMLDocument->getTheme(), GetSettingsTable()->GetThemeFontLangProperties());
- }
- return m_pThemeHandler;
- }
-
- SettingsTablePtr const & GetSettingsTable()
- {
- if( !m_pSettingsTable )
- m_pSettingsTable = new SettingsTable(m_rDMapper);
- return m_pSettingsTable;
- }
-
- GraphicImportPtr const & GetGraphicImport();
- void ResetGraphicImport();
- // this method deletes the current m_pGraphicImport after import
- void ImportGraphic(const writerfilter::Reference<Properties>::Pointer_t&);
-
- void InitTabStopFromStyle(const css::uno::Sequence<css::style::TabStop>& rInitTabStops);
- void IncorporateTabStop( const DeletableTabStop &aTabStop );
- css::uno::Sequence<css::style::TabStop> GetCurrentTabStopAndClear();
-
- void SetCurrentParaStyleName(const OUString& rString) { m_StreamStateStack.top().sCurrentParaStyleName = rString; }
- OUString GetCurrentParaStyleName();
- OUString GetDefaultParaStyleName();
-
- // specified style - including inherited properties. Indicate whether paragraph defaults should be checked.
- css::uno::Any GetPropertyFromStyleSheet(PropertyIds eId, StyleSheetEntryPtr pEntry, const bool bDocDefaults, const bool bPara, bool* bIsDocDefault = nullptr);
- // current paragraph style - including inherited properties
- css::uno::Any GetPropertyFromParaStyleSheet(PropertyIds eId);
- // context's character style - including inherited properties
- css::uno::Any GetPropertyFromCharStyleSheet(PropertyIds eId, const PropertyMapPtr& rContext);
- // get property first from the given context, or secondly via inheritance from styles/docDefaults
- css::uno::Any GetAnyProperty(PropertyIds eId, const PropertyMapPtr& rContext);
- void SetDocDefaultsImport( bool bSet ) { m_bInDocDefaultsImport = bSet;}
- bool IsDocDefaultsImport()const { return m_bInDocDefaultsImport;}
- void SetStyleSheetImport( bool bSet ) { m_bInStyleSheetImport = bSet;}
- bool IsStyleSheetImport()const { return m_bInStyleSheetImport;}
- void SetNumberingImport( bool bSet ) { m_bInNumberingImport = bSet;}
- bool IsNumberingImport() const { return m_bInNumberingImport;}
- void SetAnyTableImport( bool bSet ) { m_bInAnyTableImport = bSet;}
- bool IsAnyTableImport()const { return m_bInAnyTableImport;}
- bool IsInShape()const { return m_aAnchoredStack.size() > 0;}
-
- void PushShapeContext(const css::uno::Reference<css::drawing::XShape>& xShape);
- void PopShapeContext();
- void UpdateEmbeddedShapeProps(const css::uno::Reference<css::drawing::XShape>& xShape);
- /// Add a pending shape: it's currently inserted into the document, but it should be removed before the import finishes.
- void PushPendingShape(const css::uno::Reference<css::drawing::XShape>& xShape);
- /// Get the first pending shape, if there are any.
- css::uno::Reference<css::drawing::XShape> PopPendingShape();
-
- void PopPageHeaderFooter(PagePartType ePagePartType, PageType eType);
- bool IsInHeaderFooter() const { auto const type(m_StreamStateStack.top().eSubstreamType); return type == SubstreamType::Header || type == SubstreamType::Footer; }
- void ConvertHeaderFooterToTextFrame(bool, bool);
- static void fillEmptyFrameProperties(std::vector<css::beans::PropertyValue>& rFrameProperties, bool bSetAnchorToChar);
-
- bool IsInTOC() const;
-
- void PushFootOrEndnote( bool bIsFootnote );
- void PopFootOrEndnote();
- bool IsInFootOrEndnote() const { auto const type(m_StreamStateStack.top().eSubstreamType); return type == SubstreamType::Footnote || type == SubstreamType::Endnote; }
- bool IsInFootnote() const { return m_StreamStateStack.top().eSubstreamType == SubstreamType::Footnote; }
-
- void StartCustomFootnote(const PropertyMapPtr pContext);
- void EndCustomFootnote();
- bool IsInCustomFootnote() const { return m_StreamStateStack.top().bHasFootnoteStyle; }
- bool CheckFootnoteStyle() const { return m_StreamStateStack.top().bCheckFootnoteStyle; }
- void SetHasFootnoteStyle(bool const bVal) { m_StreamStateStack.top().bHasFootnoteStyle = bVal; }
- void SetCheckFootnoteStyle(bool const bVal) { m_StreamStateStack.top().bCheckFootnoteStyle = bVal; }
-
- const PropertyMapPtr& GetFootnoteContext() const { return m_pFootnoteContext; }
-
- SkipFootnoteSeparator GetSkipFootnoteState() const { return m_eSkipFootnoteState; }
- void SetSkipFootnoteState(SkipFootnoteSeparator eId) { m_eSkipFootnoteState = eId; }
- sal_Int32 GetFootnoteCount() const { return m_nFootnotes; }
- void IncrementFootnoteCount() { ++m_nFootnotes; }
- sal_Int32 GetEndnoteCount() const { return m_nEndnotes; }
- void IncrementEndnoteCount() { ++m_nEndnotes; }
- bool CopyTemporaryNotes(
- css::uno::Reference< css::text::XFootnote > xNoteSrc,
- css::uno::Reference< css::text::XFootnote > xNoteDest );
- void RemoveTemporaryFootOrEndnotes();
-
- void PushAnnotation();
- void PopAnnotation();
- sal_Int32 GetAnnotationId() { return m_nAnnotationId; }
-
- /// A field context starts with a cFieldStart.
- void PushFieldContext();
- //the current field context waits for the completion of the command
- bool IsOpenFieldCommand() const;
- bool IsOpenField() const;
- //mark field in current context as locked (fixed)
- void SetFieldLocked();
- //collect the pieces of the command
- void AppendFieldCommand(OUString const & rPartOfCommand);
- void handleRubyEQField( const FieldContextPtr& pContext);
- void handleFieldSet
- (const FieldContextPtr& pContext,
- css::uno::Reference< css::uno::XInterface > const & xFieldInterface,
- css::uno::Reference< css::beans::XPropertySet > const& xFieldProperties);
- void handleFieldAsk
- (const FieldContextPtr& pContext,
- css::uno::Reference< css::uno::XInterface > & xFieldInterface,
- css::uno::Reference< css::beans::XPropertySet > const& xFieldProperties);
- OUString convertFieldFormula(const OUString& input);
- void handleFieldFormula
- (const FieldContextPtr& pContext,
- css::uno::Reference< css::beans::XPropertySet > const& xFieldProperties);
- void handleAutoNum
- (const FieldContextPtr& pContext,
- css::uno::Reference< css::uno::XInterface > const & xFieldInterface,
- css::uno::Reference< css::beans::XPropertySet > const& xFieldProperties);
- static void handleAuthor
- (std::u16string_view rFirstParam,
- css::uno::Reference< css::beans::XPropertySet > const& xFieldProperties,
- FieldId eFieldId);
- void handleDocProperty
- (const FieldContextPtr& pContext,
- OUString const& rFirstParam,
- css::uno::Reference< css::uno::XInterface > & xFieldInterface);
- void handleToc
- (const FieldContextPtr& pContext,
- const OUString & sTOCServiceName);
- void handleIndex
- (const FieldContextPtr& pContext,
- const OUString & sTOCServiceName);
-
- void handleBibliography
- (const FieldContextPtr& pContext,
- const OUString & sTOCServiceName);
- /// The field command has to be closed (cFieldSep appeared).
- void CloseFieldCommand();
- //the _current_ fields require a string type result while TOCs accept richt results
- bool IsFieldResultAsString();
- void AppendFieldResult(std::u16string_view rResult);
- //apply the result text to the related field
- void SetFieldResult(OUString const& rResult);
- // set FFData of top field context
- void SetFieldFFData( const FFDataHandler::Pointer_t& pFFDataHandler );
- /// The end of field is reached (cFieldEnd appeared) - the command might still be open.
- void PopFieldContext();
-
- /// Returns title of the TOC placed in paragraph(s) before TOC field inside STD-frame
- OUString extractTocTitle();
- css::uno::Reference<css::beans::XPropertySet> createSectionForRange(css::uno::Reference< css::text::XTextRange > xStart, css::uno::Reference< css::text::XTextRange > xEnd, const OUString & sObjectType, bool stepLeft);
-
- void SetBookmarkName( const OUString& rBookmarkName );
- void StartOrEndBookmark( const OUString& rId );
-
- void SetMoveBookmark( bool IsFrom );
-
- void setPermissionRangeEd(const OUString& user);
- void setPermissionRangeEdGrp(const OUString& group);
- void startOrEndPermissionRange(sal_Int32 permissinId);
-
- void AddAnnotationPosition(
- const bool bStart,
- const sal_Int32 nAnnotationId );
-
- bool hasTableManager() const
- {
- return !m_aTableManagers.empty();
- }
-
- DomainMapperTableManager& getTableManager()
- {
- return *m_aTableManagers.top();
- }
-
- void appendTableManager( )
- {
- tools::SvRef<DomainMapperTableManager> pMngr(new DomainMapperTableManager());
- m_aTableManagers.push( pMngr );
- }
-
- void appendTableHandler( )
- {
- if (m_pTableHandler)
- m_aTableManagers.top()->setHandler(m_pTableHandler);
- }
-
- void popTableManager( )
- {
- if (hasTableManager())
- m_aTableManagers.pop();
- }
-
- void SetLineNumbering( sal_Int32 nLnnMod, sal_uInt32 nLnc, sal_Int32 ndxaLnn );
- bool IsLineNumberingSet() const {return m_bLineNumberingSet;}
-
- DeletableTabStop m_aCurrentTabStop;
-
- bool IsOOXMLImport() const { return m_eDocumentType == SourceDocumentType::OOXML; }
-
- bool IsRTFImport() const { return m_eDocumentType == SourceDocumentType::RTF; }
-
- void InitPageMargins() { m_aPageMargins = PageMar(); }
- void SetPageMarginTwip( PageMarElement eElement, sal_Int32 nValue );
- const PageMar& GetPageMargins() const {return m_aPageMargins;}
-
- void InitPaperSource() { m_aPaperSource = PaperSource(); }
- void SetPaperSource( PaperSourceElement eElement, sal_Int32 nValue );
- const PaperSource& GetPaperSource() {return m_aPaperSource;}
-
- const LineNumberSettings& GetLineNumberSettings() const { return m_aLineNumberSettings;}
- void SetLineNumberSettings(const LineNumberSettings& rSet) { m_aLineNumberSettings = rSet;}
-
- void SetInFootnoteProperties(bool const bSet) { m_StreamStateStack.top().bIsInFootnoteProperties = bSet; }
- bool IsInFootnoteProperties() const { return m_StreamStateStack.top().bIsInFootnoteProperties; }
-
- bool IsInComments() const { return m_StreamStateStack.top().eSubstreamType == SubstreamType::Annotation; };
-
- std::vector<css::beans::PropertyValue> MakeFrameProperties(const ParagraphProperties& rProps);
- void CheckUnregisteredFrameConversion(bool bPreventOverlap = false);
-
- void RegisterFrameConversion(css::uno::Reference<css::text::XTextRange> const& xFrameStartRange,
- css::uno::Reference<css::text::XTextRange> const& xFrameEndRange,
- std::vector<css::beans::PropertyValue>&& aFrameProperties);
- void ExecuteFrameConversion();
-
- void AddNewRedline( sal_uInt32 sprmId );
-
- sal_Int32 GetCurrentRedlineToken( ) const;
- void SetCurrentRedlineAuthor( const OUString& sAuthor );
- void SetCurrentRedlineDate( const OUString& sDate );
- void SetCurrentRedlineId( sal_Int32 nId );
- void SetCurrentRedlineToken( sal_Int32 nToken );
- void SetCurrentRedlineRevertProperties( const css::uno::Sequence<css::beans::PropertyValue>& aProperties );
- void SetCurrentRedlineIsRead();
- void RemoveTopRedline( );
- void SetCurrentRedlineInitials( const OUString& sInitials );
- bool IsFirstRun() const { return m_StreamStateStack.top().bIsFirstRun; }
- void SetIsFirstRun(bool const bval) { m_StreamStateStack.top().bIsFirstRun = bval; }
- bool IsOutsideAParagraph() const { return m_StreamStateStack.top().bIsOutsideAParagraph; }
- void SetIsOutsideAParagraph(bool const bval) { m_StreamStateStack.top().bIsOutsideAParagraph = bval; }
-
- void ApplySettingsTable();
-
- css::uno::Reference<css::text::XTextAppend> GetCurrentXText() {
- return m_aTextAppendStack.empty() ? nullptr : m_aTextAppendStack.top().xTextAppend;
- }
-
- void NewFrameDirection() {
- m_aFrameDirectionQueue.push(std::nullopt);
- m_bFrameDirectionSet = false;
- }
- void SetFrameDirection(sal_Int16 nDirection) {
- if (!m_bFrameDirectionSet && !m_aFrameDirectionQueue.empty()) {
- m_aFrameDirectionQueue.back() = nDirection;
- m_bFrameDirectionSet = true;
- }
- }
- std::optional<sal_Int16> PopFrameDirection() {
- if (m_aFrameDirectionQueue.empty())
- return {};
- const std::optional<sal_Int16> nDirection = m_aFrameDirectionQueue.front();
- m_aFrameDirectionQueue.pop();
- return nDirection;
- }
-
- SectionPropertyMap * GetSectionContext();
-
- sal_Int16 GetListLevel(const StyleSheetEntryPtr& pEntry, const PropertyMapPtr& pParaContext = nullptr);
- void ValidateListLevel(const OUString& sStyleIdentifierD);
-
- /**
- Used for attributes/sprms which cannot be evaluated immediately (e.g. they depend
- on another one that comes in the same CONTEXT_CHARACTER). The property will be processed
- again in DomainMapper::processDeferredCharacterProperties().
- */
- void deferCharacterProperty(sal_Int32 id, const css::uno::Any& value);
- /**
- Processes properties deferred using deferCharacterProperty(). To be called whenever the top
- CONTEXT_CHARACTER is going to be used (e.g. by appendText()).
- */
- void processDeferredCharacterProperties(bool bCharContext = true);
-
- sal_Int32 getNumberingProperty(const sal_Int32 nListId, sal_Int32 nListLevel, const OUString& aProp);
- /// Get a property of the current numbering style's current level.
- sal_Int32 getCurrentNumberingProperty(const OUString& aProp);
-
- /// If we're importing into a new document, or just pasting to an existing one.
- bool IsNewDoc() const { return m_bIsNewDoc;}
-
- bool IsAltChunk() const { return m_bIsAltChunk;}
-
- /// If we're importing autotext.
- bool IsReadGlossaries() const { return m_bIsReadGlossaries;}
-
- tools::SvRef<SdtHelper> m_pSdtHelper;
-
- /// Document background color, applied to every page style.
- std::optional<sal_Int32> m_oBackgroundColor;
- bool m_bCopyStandardPageStyleFill = false;
-
- /// If the current section has a footnote separator.
- bool m_bHasFtnSep;
-
- /// Paragraphs with anchored objects in the current section.
- std::vector<AnchoredObjectsInfo> m_aAnchoredObjectAnchors;
-
- /// Append a property to a sub-grabbag if necessary (e.g. 'lineRule', 'auto')
- void appendGrabBag(std::vector<css::beans::PropertyValue>& rInteropGrabBag, const OUString& aKey, const OUString& aValue);
- void appendGrabBag(std::vector<css::beans::PropertyValue>& rInteropGrabBag, const OUString& aKey, std::vector<css::beans::PropertyValue>& rValue);
-
- /// Enable, disable and check status of grabbags
- void enableInteropGrabBag(const OUString& aName);
- void disableInteropGrabBag();
- bool isInteropGrabBagEnabled() const;
-
- /// Name of m_aInteropGrabBag.
- OUString m_aInteropGrabBagName;
-
- /// A toplevel dmapper grabbag, like 'pPr'.
- std::vector<css::beans::PropertyValue> m_aInteropGrabBag;
-
- /// A sub-grabbag of m_aInteropGrabBag, like 'spacing'.
- std::vector<css::beans::PropertyValue> m_aSubInteropGrabBag;
-
- /// ST_PositionOffset values we received
- std::pair<OUString, OUString> m_aPositionOffsets;
- /// ST_AlignH/V values we received
- std::pair<OUString, OUString> m_aAligns;
- /// ST_PositivePercentage values we received
- std::queue<OUString> m_aPositivePercentages;
- enum GraphicImportType m_eGraphicImportType = {};
- bool isInIndexContext() const { return m_bStartIndex;}
- bool isInBibliographyContext() const { return m_bStartBibliography;}
- SmartTagHandler& getSmartTagHandler() { return m_aSmartTagHandler; }
-
- void substream(Id rName, ::writerfilter::Reference<Stream>::Pointer_t const& ref);
-
- /// If the document needs to split paragraph.
- bool m_bIsSplitPara;
-
- /// Check if "SdtEndBefore" property is set
- bool IsSdtEndBefore();
-
- bool IsDiscardHeaderFooter() const;
-
- bool IsForceGenericFields() const { return m_bForceGenericFields; }
-
- void SetParaAutoBefore(bool const bParaAutoBefore) { m_StreamStateStack.top().bParaAutoBefore = bParaAutoBefore; }
-
- /// Forget about the previous paragraph, as it's not inside the same
- /// start/end node.
- void ClearPreviousParagraph();
-
- /// Check if previous paragraph has borders in between and do the border magic to it if so
- bool handlePreviousParagraphBorderInBetween() const;
-
- /// Handle redline text portions in a frame, footnotes and redlines:
- /// store their data, and create them after frame creation or footnote/endnote copying
- bool m_bIsActualParagraphFramed;
- std::deque<css::uno::Any> m_aStoredRedlines[StoredRedlines::NONE];
-
- bool IsParaWithInlineObject() const { return m_StreamStateStack.top().bParaWithInlineObject; }
-
- bool SeenHeaderFooter(PagePartType, PageType) const;
-
- css::uno::Reference< css::embed::XStorage > m_xDocumentStorage;
-
- /// Handles <w:altChunk>.
- void HandleAltChunk(const OUString& rStreamName);
-
- /// Handles <w:ptab>.
- void HandlePTab(sal_Int32 nAlignment);
-
- /// Handles <w:br w:clear="...">.
- void HandleLineBreakClear(sal_Int32 nClear);
-
- /// Handles <w:br>.
- void HandleLineBreak(const PropertyMapPtr& pPropertyMap);
-
- void commentProps(const OUString& sId, const CommentProperties& rProps);
-
- OUString ConvertTOCStyleName(OUString const&);
-
- OUString getFontNameForTheme(const Id id);
-
-private:
- void PushPageHeaderFooter(PagePartType ePagePartType, PageType eType);
- // Start a new index section; if needed, finish current paragraph
- css::uno::Reference<css::beans::XPropertySet> StartIndexSectionChecked(const OUString& sServiceName);
- std::vector<css::uno::Reference< css::drawing::XShape > > m_vTextFramesForChaining ;
- /// SAXException was seen so document will be abandoned
- bool m_bSaxError;
-
- std::unordered_map<OUString, CommentProperties> m_aCommentProps;
-};
-
-} //namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/FFDataHandler.cxx b/writerfilter/source/dmapper/FFDataHandler.cxx
deleted file mode 100644
index 507327cf8333..000000000000
--- a/writerfilter/source/dmapper/FFDataHandler.cxx
+++ /dev/null
@@ -1,190 +0,0 @@
-/* -*- 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/.
- *
- * 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 "FFDataHandler.hxx"
-#include "TagLogger.hxx"
-
-#include <ooxml/resourceids.hxx>
-
-namespace writerfilter::dmapper {
-
-/************************
- * class: FFDataHandler *
- ************************/
-
-FFDataHandler::FFDataHandler() :
-LoggedProperties("FFDataHandler"),
-m_nCheckboxHeight(0),
-m_bCheckboxAutoHeight(false),
-m_nCheckboxChecked(-1),
-m_nCheckboxDefault(-1),
-m_nTextMaxLength(0)
-{
-}
-
-
-FFDataHandler::~FFDataHandler()
-{
-}
-
-
-bool FFDataHandler::getCheckboxChecked() const
-{
- if (m_nCheckboxChecked != -1)
- return m_nCheckboxChecked;
- else if (m_nCheckboxDefault != -1)
- return m_nCheckboxDefault;
- else
- return false;
-}
-
-
-void FFDataHandler::lcl_sprm(Sprm & r_Sprm)
-{
- switch(r_Sprm.getId())
- {
- case NS_ooxml::LN_CT_FFData_name:
- {
- m_sName = r_Sprm.getValue()->getString();
- }
- break;
- case NS_ooxml::LN_CT_FFData_helpText:
- {
- resolveSprm(r_Sprm);
- }
- break;
- case NS_ooxml::LN_CT_FFData_statusText:
- {
- resolveSprm(r_Sprm);
- }
- break;
- case NS_ooxml::LN_CT_FFData_entryMacro:
- {
- m_sEntryMacro = r_Sprm.getValue()->getString();
- }
- break;
- case NS_ooxml::LN_CT_FFData_exitMacro:
- {
- m_sExitMacro = r_Sprm.getValue()->getString();
- }
- break;
- case NS_ooxml::LN_CT_FFCheckBox_size:
- {
- m_nCheckboxHeight = r_Sprm.getValue()->getInt();
- }
- break;
- case NS_ooxml::LN_CT_FFCheckBox_sizeAuto:
- {
- m_bCheckboxAutoHeight = r_Sprm.getValue()->getInt();
- }
- break;
- case NS_ooxml::LN_CT_FFCheckBox_checked:
- {
- m_nCheckboxChecked = r_Sprm.getValue()->getInt();
- }
- break;
- case NS_ooxml::LN_CT_FFCheckBox_default:
- {
- m_nCheckboxDefault = r_Sprm.getValue()->getInt();
- }
- break;
- case NS_ooxml::LN_CT_FFData_checkBox:
- {
- resolveSprm(r_Sprm);
- }
- break;
- case NS_ooxml::LN_CT_FFDDList_result:
- {
- m_sDropDownResult = r_Sprm.getValue()->getString();
- }
- break;
- case NS_ooxml::LN_CT_FFDDList_listEntry:
- {
- m_DropDownEntries.push_back(r_Sprm.getValue()->getString());
- }
- break;
- case NS_ooxml::LN_CT_FFData_ddList:
- {
- resolveSprm(r_Sprm);
- }
- break;
- case NS_ooxml::LN_CT_FFTextInput_type:
- {
- m_sTextType = r_Sprm.getValue()->getString();
- }
- break;
- case NS_ooxml::LN_CT_FFTextInput_default:
- {
- m_sTextDefault = r_Sprm.getValue()->getString();
- }
- break;
- case NS_ooxml::LN_CT_FFTextInput_maxLength:
- {
- m_nTextMaxLength = r_Sprm.getValue()->getInt();
- }
- break;
- case NS_ooxml::LN_CT_FFTextInput_format:
- {
- m_sTextFormat = r_Sprm.getValue()->getString();
- }
- break;
- case NS_ooxml::LN_CT_FFData_textInput:
- {
- resolveSprm(r_Sprm);
- }
- break;
- default:
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- break;
- }
-}
-
-void FFDataHandler::resolveSprm(Sprm & r_Sprm)
-{
- writerfilter::Reference<Properties>::Pointer_t pProperties = r_Sprm.getProps();
- if( pProperties)
- pProperties->resolve(*this);
-}
-
-void FFDataHandler::lcl_attribute(Id name, Value & val)
-{
- switch (name)
- {
- case NS_ooxml::LN_CT_FFHelpText_val:
- {
- m_sHelpText = val.getString();
- }
- break;
- case NS_ooxml::LN_CT_FFStatusText_val:
- {
- m_sStatusText = val.getString();
- }
- break;
- default:
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- break;
- }
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/FFDataHandler.hxx b/writerfilter/source/dmapper/FFDataHandler.hxx
deleted file mode 100644
index f8a88f5c9d6b..000000000000
--- a/writerfilter/source/dmapper/FFDataHandler.hxx
+++ /dev/null
@@ -1,99 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-#include "LoggedResources.hxx"
-#include <rtl/ustring.hxx>
-#include <vector>
-namespace writerfilter::dmapper
-{
-class FFDataHandler : public LoggedProperties
-{
-public:
- // typedefs
- typedef ::tools::SvRef<FFDataHandler> Pointer_t;
- typedef ::std::vector<OUString> DropDownEntries_t;
-
- // constructor
- FFDataHandler();
- // destructor
- virtual ~FFDataHandler() override;
-
- // member: name
- const OUString& getName() const { return m_sName; }
-
- // member: helpText
- const OUString& getHelpText() const { return m_sHelpText; }
-
- // member: statusText
- const OUString& getStatusText() const { return m_sStatusText; }
-
- const OUString& getEntryMacro() const { return m_sEntryMacro; }
- const OUString& getExitMacro() const { return m_sExitMacro; }
-
- // member: checkboxHeight
- sal_uInt32 getCheckboxHeight() const { return m_nCheckboxHeight; }
-
- // member: checkboxAutoHeight
- bool getCheckboxAutoHeight() const { return m_bCheckboxAutoHeight; }
-
- // member: checkboxChecked or checkboxDefault (if the previous is not set)
- bool getCheckboxChecked() const;
-
- // member: dropDownResult
- const OUString& getDropDownResult() const { return m_sDropDownResult; }
-
- // member: dropDownEntries
- const DropDownEntries_t& getDropDownEntries() const { return m_DropDownEntries; }
-
- // member: textDefault
- const OUString& getTextDefault() const { return m_sTextDefault; }
-
- const OUString& getTextType() const { return m_sTextType; }
- const OUString& getTextFormat() const { return m_sTextFormat; }
- sal_uInt16 getTextMaxLength() const { return m_nTextMaxLength; }
-
- // sprm
- void resolveSprm(Sprm& r_sprm);
-
-private:
- OUString m_sName;
- OUString m_sHelpText;
- OUString m_sStatusText;
- OUString m_sEntryMacro;
- OUString m_sExitMacro;
- sal_uInt32 m_nCheckboxHeight;
- bool m_bCheckboxAutoHeight;
- int m_nCheckboxChecked;
- int m_nCheckboxDefault;
- OUString m_sDropDownResult;
- DropDownEntries_t m_DropDownEntries;
- OUString m_sTextDefault;
- OUString m_sTextType;
- OUString m_sTextFormat;
- sal_uInt16 m_nTextMaxLength;
-
- // sprm
- void lcl_sprm(Sprm& r_sprm) override;
-
- // attribute
- void lcl_attribute(Id name, Value& val) override;
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/FieldTypes.hxx b/writerfilter/source/dmapper/FieldTypes.hxx
deleted file mode 100644
index 144d1efe1370..000000000000
--- a/writerfilter/source/dmapper/FieldTypes.hxx
+++ /dev/null
@@ -1,306 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-namespace writerfilter::dmapper {
-
-enum FieldId
-{
- /* ADDRESSBLOCK \d \* MERGEFORMAT -> Addressblock completely unsupported*/
- FIELD_ADDRESSBLOCK
- /* ADVANCE \d downvalue \l leftvalue \r rightvalue \u upvalue \x xvalue \y yvalue -> unsupported*/
- ,FIELD_ADVANCE
- /* ASK bookmarkname "hint" \d defaultanswer \o \* MERGEFORMAT ->
- the hint is not always quoted, inputfield with default answer, prompt before merge (\o)
- */
- ,FIELD_ASK
- /* AUTONUM \* Numberingswitch ->
- mapped to sequence field "AutoNr"
- */
- ,FIELD_AUTONUM
- /* AUTONUMLGL \* Numberingswitch ->
- mapped to sequence field "AutoNr"
- */
- ,FIELD_AUTONUMLGL
- /* AUTONUMOUT \* Numberingswitch ->
- mapped to sequence field "AutoNr"
- */
- ,FIELD_AUTONUMOUT
- /* AUTHOR NewAuthor \* defaultswitch \* MERGEFORMAT ->
- mapped to sequence field "AutoNr"
- */
- ,FIELD_AUTHOR
- /* COMMENTS "comment" \* MERGEFORMAT ->
- Docinfo-Comments
- */
- ,FIELD_COMMENTS
- /* CREATEDATE \h \* MERGEFORMAT ->
- docinfo-created-date
- */
- ,FIELD_CREATEDATE
- /* DATE \@ "number format" \s \* MERGEFORMAT ->
- ww8filterimprovement: multiple languages now supported
- */
- ,FIELD_DATE
- /* DOCPROPERTY propertyname \* MERGEFORMAT ->
- ww8filterimprovement: some fields imported as functionally equivalent fields if possible,
- the others imported as UserField
- */
- ,FIELD_DOCPROPERTY
- /* DOCVARIABLE Name \* MERGEFORMAT ->
- ww8filterimprovement: now imported as user fields
- */
- ,FIELD_DOCVARIABLE
- /* EDITTIME \# "displayformat" \* Numberingswitch \* MERGEFORMAT ->
- DocInfo-Modified-Date
- ww8filterimprovement: multiple languages now supported
- */
- ,FIELD_EDITTIME
- ,FIELD_EQ
- /* FILLIN "text to fill in" \d defaultanswer \o \* MERGEFORMAT ->
- Function-InputField
- */
- ,FIELD_FILLIN
- /* FILENAME \p \* * MERGEFORMAT ->
- file name (\p with path)
- */
- ,FIELD_FILENAME
- /* FILESIZE \* NumberingType \* MERGEFORMAT ->
- not imported in old ww8 filter, see lcl_ParseNumberingType
- todo find alternative field
- */
- ,FIELD_FILESIZE
- /* =formula \# "number format"
- todo find alternative field
- */
- ,FIELD_FORMULA
- /* FORMCHECKBOX */
- ,FIELD_FORMCHECKBOX
- /* FORMDROPDOWN */
- ,FIELD_FORMDROPDOWN
- /* FORMTEXT */
- ,FIELD_FORMTEXT
- /* GOTOBUTTON text \* MERGEFORMAT ->
- not imported in old ww8 filter
- todo find alternative field
- */
- ,FIELD_GOTOBUTTON
- /* HYPERLINK "link" \* MERGEFORMAT ->
- not imported in old ww8 filter
- ww8filterimprovement: now imported as hyperlink
- */
- ,FIELD_HYPERLINK
- /* IF condition "then text" "else text" ->
- not imported in old ww8 filter
- ww8filterimprovement: now imported
- todo: condition, if text, else text still missing
- */
- ,FIELD_IF
- /* INFO NameOfInfo \* MERGEFORMAT -> old
- todo: filter imports wrong?
- */
- ,FIELD_INFO
- /* INCLUDEPICTURE path \* MERGEFORMAT->
- old filter imports an embedded picture
- */
- ,FIELD_INCLUDEPICTURE
- /* KEYWORDS keyword \* defaultswitch \* Numberingswitch \* MERGEFORMAT ->
- DocInfo Keywords
- */
- ,FIELD_KEYWORDS
- /* LASTSAVEDBY \* MERGEFORMAT ->
- DocInfo-Modified-Author
- */
- ,FIELD_LASTSAVEDBY
- /* MACROBUTTON MacroName quick help text ->
- Macro field
- */
- ,FIELD_MACROBUTTON
- /* MERGEFIELD ColumName \b prefix \f suffix \* MERGEFORMAT ->
- ww8filterimprovement: column-only API now supported
- */
- ,FIELD_MERGEFIELD
- /* MERGEREC \* MERGEFORMAT ->
- RecordNumber field, maybe without db name
- todo: currently unchecked
- */
- ,FIELD_MERGEREC
- /* MERGESEQ \* MERGEFORMAT ->
- not imported in old ww8 filter
- ww8filterimprovement: now imported
- todo: currently unchecked
- */
- ,FIELD_MERGESEQ
- /* NEXT text ->
- Next record
- todo: currently unchecked
- */
- ,FIELD_NEXT
- /* NEXTIF condition
- todo: condition not imported
- */
- ,FIELD_NEXTIF
- /* PAGE \* Numberingswitch \* MERGEFORMAT ->
- see lcl_ParseNumberingType
- */
- ,FIELD_PAGE
- ,FIELD_PAGEREF
- ,FIELD_PRINTDATE
- /* REF targetbkm \f \* MERGEFORMAT ->
- imports a ShowVariable (bookmarkname)?
- \h hyperlink to paragraph
- \p relative to para above/below
- \f reference number
- \d separator number separator
- \n paragraph number
- \r paragraph number in relative context
- \t suppress non delimiters
- \w paragraph number in full context
- \* Upper/Lower...
- */
- ,FIELD_REF
- /* REVNUM \* Numberingswitch \* MERGEFORMAT ->
- DocInfo-revision number
- */
- ,FIELD_REVNUM
- /* SAVEDATE \@ "NumberFormat"\* MERGEFORMAT ->
- DocInfo-modified-date
- */
- ,FIELD_SAVEDATE
- /* SECTION \* NumberFormat \* MERGEFORMAT ->
- not imported in old ww8 filter see lcl_ParseNumberingType
- todo: find alternative
- */
- ,FIELD_SECTION
- /* SECTIONPAGES \* NumberFormat \* MERGEFORMAT ->
- not imported in old ww8 filter see lcl_ParseNumberingType
- todo: find alternative
- */
- ,FIELD_SECTIONPAGES
- /* SEQ sequencename \h \c \n \r \s \* MERGEFORMAT ->
- number range name:sequencename value:sequencename+1
- todo: only partially implemented, switches unsupported
- */
- ,FIELD_SEQ
- /* SET bookmarkname newtext \* MERGEFORMAT ->
- SetVariable bookmarkname = newtext
- todo: not implemented yet
- */
- ,FIELD_SET
- /* SKIPIF condition \* MERGEFORMAT ->
- ??
- todo: not implemented yet
- */
- ,FIELD_SKIPIF
- /* STYLEREF stylename \* MERGEFORMAT ->
- implemented using GetReference, but some switches are not implemented yet
- \l isn't implemented
- \t isn't implemented
- */
- ,FIELD_STYLEREF
- /* SUBJECT subject \* Defaultswitch \* MERGEFORMAT ->
- DocInfo - subject
- */
- ,FIELD_SUBJECT
- /* SYMBOL symbolnumber \* MERGEFORMAT ->
- inserts a special char (symbolnumber)
- todo: find alternative
- */
- ,FIELD_SYMBOL
- /* TEMPLATE \* Defaultswitch \* MERGEFORMAT
- TemplateName field
- */
- ,FIELD_TEMPLATE
- /* TIME \@ "number format" \* MERGEFORMAT
- ww8filterimprovement: multiple languages now supported
- */
- ,FIELD_TIME
- /* TITLE \* Defaultswitch \* MERGEFORMAT ->
- DocInfo-title
- */
- ,FIELD_TITLE
- /* USERINITIALS newinitials \* MERGEFORMAT ->
- ExtendedUser field (SHORTCUT)
- */
- ,FIELD_USERINITIALS
- /* USERADDRESS \* MERGEFORMAT ->
- not imported in old ww8 filter
- todo: find alternative
- */
- ,FIELD_USERADDRESS
- /* USERNAME newusername \* MERGEFORMAT ->
- not imported in old ww8 filter
- todo: import as extended user field(s)
- */
- ,FIELD_USERNAME
- /*
- TOC options:
- \a Builds a table of figures but does not include the captions's label and number
- \b Uses a bookmark to specify area of document from which to build table of contents
- \c Builds a table of figures of the given label
- \d Defines the separator between sequence and page numbers
- \f Builds a table of contents using TC entries instead of outline levels
- \h Hyperlinks the entries and page numbers within the table of contents
- \l Defines the TC entries field level used to build a table of contents
- \n Builds a table of contents or a range of entries, such as 1-9, in a table of contents without page numbers
- \o Builds a table of contents by using outline levels instead of TC entries
- \p Defines the separator between the table entry and its page number
- \s Builds a table of contents by using a sequence type
- \t Builds a table of contents by using style names other than the standard outline styles
- \u Builds a table of contents by using the applied paragraph outline level
- \w Preserve tab characters within table entries
- \x Preserve newline characters within table entries
- \z Hides page numbers within the table of contents when shown in Web Layout View
- */
- ,FIELD_TOC
- /*
- TOC entry: text
- \f TC entry in doc with multiple tables
- \l Outline Level
- \n Suppress page numbers
- example: TOC "EntryText \f \l 2 \n
- */
- ,FIELD_TC
- /* document statistic - number of characters
- */
- ,FIELD_NUMCHARS
- /* document statistic - number of words
- */
- ,FIELD_NUMWORDS
- /* document statistic - number of pages
- */
- ,FIELD_NUMPAGES
- /* Document alphabetical index
- */
- ,FIELD_INDEX
- /* Document alphabetical index marks
- */
- ,FIELD_XE
- /**
- * Bibliography
- */
- ,FIELD_BIBLIOGRAPHY
- /* Citation
- */
- ,FIELD_CITATION
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/FontTable.cxx b/writerfilter/source/dmapper/FontTable.cxx
deleted file mode 100644
index c64276585a5d..000000000000
--- a/writerfilter/source/dmapper/FontTable.cxx
+++ /dev/null
@@ -1,299 +0,0 @@
-/* -*- 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/.
- *
- * 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 "FontTable.hxx"
-#include <o3tl/deleter.hxx>
-#include <ooxml/resourceids.hxx>
-#include <utility>
-#include <vector>
-#include <sal/log.hxx>
-#include <rtl/tencinfo.h>
-#include <vcl/embeddedfontshelper.hxx>
-#include <unotools/fontdefs.hxx>
-
-using namespace com::sun::star;
-
-namespace writerfilter::dmapper
-{
-
-struct FontTable_Impl
-{
- std::unique_ptr<EmbeddedFontsHelper, o3tl::default_delete<EmbeddedFontsHelper>> xEmbeddedFontHelper;
- std::vector< FontEntry::Pointer_t > aFontEntries;
- FontEntry::Pointer_t pCurrentEntry;
- FontTable_Impl() {}
-};
-
-FontTable::FontTable()
-: LoggedProperties("FontTable")
-, LoggedTable("FontTable")
-, LoggedStream("FontTable")
-, m_pImpl( new FontTable_Impl )
-{
-}
-
-FontTable::~FontTable()
-{
-}
-
-void FontTable::lcl_attribute(Id Name, Value & val)
-{
- SAL_WARN_IF( !m_pImpl->pCurrentEntry, "writerfilter.dmapper", "current entry has to be set here" );
- if(!m_pImpl->pCurrentEntry)
- return ;
- int nIntValue = val.getInt();
- OUString sValue = val.getString();
- switch(Name)
- {
- case NS_ooxml::LN_CT_Pitch_val:
- if (static_cast<Id>(nIntValue) == NS_ooxml::LN_Value_ST_Pitch_fixed)
- ;
- else if (static_cast<Id>(nIntValue) == NS_ooxml::LN_Value_ST_Pitch_variable)
- ;
- else if (static_cast<Id>(nIntValue) == NS_ooxml::LN_Value_ST_Pitch_default)
- ;
- else
- SAL_WARN("writerfilter.dmapper", "FontTable::lcl_attribute: unhandled NS_ooxml::CT_Pitch_val: " << nIntValue);
- break;
- case NS_ooxml::LN_CT_Font_name:
- m_pImpl->pCurrentEntry->sFontName = sValue;
- break;
- case NS_ooxml::LN_CT_Charset_val:
- // w:characterSet has higher priority, set only if that one is not set
- if( m_pImpl->pCurrentEntry->nTextEncoding == RTL_TEXTENCODING_DONTKNOW )
- {
- m_pImpl->pCurrentEntry->nTextEncoding = rtl_getTextEncodingFromWindowsCharset( nIntValue );
- if( IsOpenSymbol( m_pImpl->pCurrentEntry->sFontName ))
- m_pImpl->pCurrentEntry->nTextEncoding = RTL_TEXTENCODING_SYMBOL;
- }
- break;
- case NS_ooxml::LN_CT_Charset_characterSet:
- {
- OString tmp;
- sValue.convertToString( &tmp, RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS );
- m_pImpl->pCurrentEntry->nTextEncoding = rtl_getTextEncodingFromMimeCharset( tmp.getStr() );
- // Older LO versions used to write incorrect character set for OpenSymbol, fix.
- if( IsOpenSymbol( m_pImpl->pCurrentEntry->sFontName ))
- m_pImpl->pCurrentEntry->nTextEncoding = RTL_TEXTENCODING_SYMBOL;
- break;
- }
- default: ;
- }
-}
-
-void FontTable::lcl_sprm(Sprm& rSprm)
-{
- SAL_WARN_IF( !m_pImpl->pCurrentEntry, "writerfilter.dmapper", "current entry has to be set here" );
- if(!m_pImpl->pCurrentEntry)
- return ;
- sal_uInt32 nSprmId = rSprm.getId();
-
- switch(nSprmId)
- {
- case NS_ooxml::LN_CT_Font_charset:
- case NS_ooxml::LN_CT_Font_pitch:
- resolveSprm( rSprm );
- break;
- case NS_ooxml::LN_CT_Font_embedRegular:
- case NS_ooxml::LN_CT_Font_embedBold:
- case NS_ooxml::LN_CT_Font_embedItalic:
- case NS_ooxml::LN_CT_Font_embedBoldItalic:
- {
- writerfilter::Reference< Properties >::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- EmbeddedFontHandler handler(*this, m_pImpl->pCurrentEntry->sFontName,
- nSprmId == NS_ooxml::LN_CT_Font_embedRegular ? u""
- : nSprmId == NS_ooxml::LN_CT_Font_embedBold ? u"b"
- : nSprmId == NS_ooxml::LN_CT_Font_embedItalic ? u"i"
- : /*NS_ooxml::LN_CT_Font_embedBoldItalic*/ u"bi" );
- pProperties->resolve( handler );
- }
- break;
- }
- case NS_ooxml::LN_CT_Font_altName:
- break;
- case NS_ooxml::LN_CT_Font_panose1:
- break;
- case NS_ooxml::LN_CT_Font_family:
- break;
- case NS_ooxml::LN_CT_Font_sig:
- break;
- case NS_ooxml::LN_CT_Font_notTrueType:
- break;
- default:
- SAL_WARN("writerfilter.dmapper", "FontTable::lcl_sprm: unhandled token: " << nSprmId);
- break;
- }
-}
-
-void FontTable::resolveSprm(Sprm & r_Sprm)
-{
- writerfilter::Reference<Properties>::Pointer_t pProperties = r_Sprm.getProps();
- if( pProperties )
- pProperties->resolve(*this);
-}
-
-void FontTable::lcl_entry(const writerfilter::Reference<Properties>::Pointer_t& ref)
-{
- //create a new font entry
- SAL_WARN_IF( m_pImpl->pCurrentEntry, "writerfilter.dmapper", "current entry has to be NULL here" );
- m_pImpl->pCurrentEntry = new FontEntry;
- ref->resolve(*this);
- //append it to the table
- m_pImpl->aFontEntries.push_back( m_pImpl->pCurrentEntry );
- m_pImpl->pCurrentEntry.clear();
-}
-
-void FontTable::lcl_startSectionGroup()
-{
-}
-
-void FontTable::lcl_endSectionGroup()
-{
-}
-
-void FontTable::lcl_startParagraphGroup()
-{
-}
-
-void FontTable::lcl_endParagraphGroup()
-{
-}
-
-void FontTable::lcl_startCharacterGroup()
-{
-}
-
-void FontTable::lcl_endCharacterGroup()
-{
-}
-
-void FontTable::lcl_text(const sal_uInt8*, size_t )
-{
-}
-
-void FontTable::lcl_utext(const sal_Unicode*, size_t)
-{
-}
-
-void FontTable::lcl_props(const writerfilter::Reference<Properties>::Pointer_t&)
-{
-}
-
-void FontTable::lcl_table(Id, const writerfilter::Reference<Table>::Pointer_t&)
-{
-}
-
-void FontTable::lcl_substream(Id, const writerfilter::Reference<Stream>::Pointer_t&)
-{
-}
-
-void FontTable::lcl_startShape(uno::Reference<drawing::XShape> const&)
-{
-}
-
-void FontTable::lcl_endShape( )
-{
-}
-
-FontEntry::Pointer_t FontTable::getFontEntry(sal_uInt32 nIndex)
-{
- return (m_pImpl->aFontEntries.size() > nIndex)
- ? m_pImpl->aFontEntries[nIndex]
- : FontEntry::Pointer_t();
-}
-
-sal_uInt32 FontTable::size()
-{
- return m_pImpl->aFontEntries.size();
-}
-
-void FontTable::addEmbeddedFont(const css::uno::Reference<css::io::XInputStream>& stream,
- const OUString& fontName, std::u16string_view extra,
- std::vector<unsigned char> const & key)
-{
- if (!m_pImpl->xEmbeddedFontHelper)
- m_pImpl->xEmbeddedFontHelper.reset(new EmbeddedFontsHelper);
- m_pImpl->xEmbeddedFontHelper->addEmbeddedFont(stream, fontName, extra, key);
-}
-
-EmbeddedFontHandler::EmbeddedFontHandler(FontTable& rFontTable, OUString _fontName, std::u16string_view style )
-: LoggedProperties("EmbeddedFontHandler")
-, m_fontTable( rFontTable )
-, m_fontName(std::move( _fontName ))
-, m_style( style )
-{
-}
-
-EmbeddedFontHandler::~EmbeddedFontHandler()
-{
- if( !m_inputStream.is())
- return;
- std::vector< unsigned char > key( 32 );
- if( !m_fontKey.isEmpty())
- { // key for unobfuscating
- // 1 3 5 7 10 2 5 7 20 2 5 7 9 1 3 5
- // {62E79491-959F-41E9-B76B-6B32631DEA5C}
- static const int pos[ 16 ] = { 35, 33, 31, 29, 27, 25, 22, 20, 17, 15, 12, 10, 7, 5, 3, 1 };
- for( int i = 0;
- i < 16;
- ++i )
- {
- int v1 = m_fontKey[ pos[ i ]];
- int v2 = m_fontKey[ pos[ i ] + 1 ];
- assert(( v1 >= '0' && v1 <= '9' ) || ( v1 >= 'A' && v1 <= 'F' ));
- assert(( v2 >= '0' && v2 <= '9' ) || ( v2 >= 'A' && v2 <= 'F' ));
- int val = ( v1 - ( v1 <= '9' ? '0' : 'A' - 10 )) * 16 + v2 - ( v2 <= '9' ? '0' : 'A' - 10 );
- key[ i ] = val;
- key[ i + 16 ] = val;
- }
- }
- m_fontTable.addEmbeddedFont( m_inputStream, m_fontName, m_style, key );
- m_inputStream->closeInput();
-}
-
-void EmbeddedFontHandler::lcl_attribute( Id name, Value& val )
-{
- switch( name )
- {
- case NS_ooxml::LN_CT_FontRel_fontKey:
- m_fontKey = val.getString();
- break;
- case NS_ooxml::LN_CT_Rel_id:
- break;
- case NS_ooxml::LN_CT_FontRel_subsetted:
- break; // TODO? Let's just ignore this for now and hope
- // it doesn't break anything.
- case NS_ooxml::LN_inputstream: // the actual font data as stream
- val.getAny() >>= m_inputStream;
- break;
- default:
- break;
- }
-}
-
-void EmbeddedFontHandler::lcl_sprm( Sprm& )
-{
-}
-
-
-}//namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/FontTable.hxx b/writerfilter/source/dmapper/FontTable.hxx
deleted file mode 100644
index 092affebe871..000000000000
--- a/writerfilter/source/dmapper/FontTable.hxx
+++ /dev/null
@@ -1,106 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include <memory>
-#include <vector>
-#include "LoggedResources.hxx"
-#include <com/sun/star/io/XInputStream.hpp>
-
-namespace writerfilter::dmapper
-{
-
-struct FontTable_Impl;
-struct FontEntry : public virtual SvRefBase
-{
- typedef tools::SvRef<FontEntry> Pointer_t;
-
- OUString sFontName;
- sal_Int32 nTextEncoding;
- FontEntry() :
- nTextEncoding( RTL_TEXTENCODING_DONTKNOW )
- {}
-};
-
-class FontTable : public LoggedProperties, public LoggedTable
- /*,public BinaryObj*/, public LoggedStream
-{
- std::unique_ptr<FontTable_Impl> m_pImpl;
-
- public:
- FontTable();
- virtual ~FontTable() override;
-
- sal_uInt32 size();
- FontEntry::Pointer_t getFontEntry(sal_uInt32 nIndex);
-
- void addEmbeddedFont(const css::uno::Reference<css::io::XInputStream>& stream,
- const OUString& fontName, std::u16string_view extra,
- std::vector<unsigned char> const & key);
-
- private:
- // Properties
- virtual void lcl_attribute(Id Name, Value & val) override;
- virtual void lcl_sprm(Sprm & sprm) override;
- void resolveSprm(Sprm & r_sprm);
-
- // Table
- virtual void lcl_entry(const writerfilter::Reference<Properties>::Pointer_t& ref) override;
-
- // Stream
- virtual void lcl_startSectionGroup() override;
- virtual void lcl_endSectionGroup() override;
- virtual void lcl_startParagraphGroup() override;
- virtual void lcl_endParagraphGroup() override;
- virtual void lcl_startCharacterGroup() override;
- virtual void lcl_endCharacterGroup() override;
- virtual void lcl_text(const sal_uInt8 * data, size_t len) override;
- virtual void lcl_utext(const sal_Unicode * data, size_t len) override;
- virtual void lcl_props(const writerfilter::Reference<Properties>::Pointer_t& ref) override;
- virtual void lcl_table(Id name,
- const writerfilter::Reference<Table>::Pointer_t& ref) override;
- virtual void lcl_substream(Id name,
- const writerfilter::Reference<Stream>::Pointer_t& ref) override;
- virtual void lcl_startShape(css::uno::Reference<css::drawing::XShape> const& xShape) override;
- virtual void lcl_endShape( ) override;
- virtual void lcl_startTextBoxContent() override {};
- virtual void lcl_endTextBoxContent() override {};
-};
-typedef tools::SvRef< FontTable > FontTablePtr;
-
-class EmbeddedFontHandler : public LoggedProperties
-{
-public:
- EmbeddedFontHandler(FontTable& rFontTable, OUString fontName, std::u16string_view style);
- virtual ~EmbeddedFontHandler() override;
-private:
- virtual void lcl_attribute( Id name, Value& val ) override;
- virtual void lcl_sprm( Sprm& rSprm ) override;
- FontTable& m_fontTable;
- OUString m_fontName;
- std::u16string_view m_style;
- OUString m_fontKey;
- css::uno::Reference<css::io::XInputStream> m_inputStream;
-};
-
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/FormControlHelper.cxx b/writerfilter/source/dmapper/FormControlHelper.cxx
deleted file mode 100644
index 40f5d703815e..000000000000
--- a/writerfilter/source/dmapper/FormControlHelper.cxx
+++ /dev/null
@@ -1,379 +0,0 @@
-/* -*- 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/.
- *
- * 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 <math.h>
-
-#include <com/sun/star/awt/XControlModel.hpp>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/container/XIndexContainer.hpp>
-#include <com/sun/star/container/XNamed.hpp>
-#include <com/sun/star/drawing/XControlShape.hpp>
-#include <com/sun/star/drawing/XDrawPage.hpp>
-#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
-#include <com/sun/star/form/XForm.hpp>
-#include <com/sun/star/form/XFormComponent.hpp>
-#include <com/sun/star/form/XFormsSupplier.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/text/TextContentAnchorType.hpp>
-#include <com/sun/star/text/VertOrientation.hpp>
-#include <com/sun/star/uno/Any.hxx>
-
-#include <o3tl/safeint.hxx>
-
-#include "FormControlHelper.hxx"
-#include <utility>
-#include <xmloff/odffields.hxx>
-#include <comphelper/sequence.hxx>
-#include <comphelper/diagnose_ex.hxx>
-
-namespace writerfilter::dmapper {
-
-using namespace ::com::sun::star;
-
-struct FormControlHelper::FormControlHelper_Impl : public virtual SvRefBase
-{
- FieldId m_eFieldId;
- awt::Size aSize;
- uno::Reference<drawing::XDrawPage> rDrawPage;
- uno::Reference<form::XForm> rForm;
- uno::Reference<form::XFormComponent> rFormComponent;
- uno::Reference<lang::XMultiServiceFactory> rServiceFactory;
- uno::Reference<text::XTextDocument> rTextDocument;
-
- uno::Reference<drawing::XDrawPage> const & getDrawPage();
- uno::Reference<lang::XMultiServiceFactory> const & getServiceFactory();
- uno::Reference<form::XForm> const & getForm();
- uno::Reference<container::XIndexContainer> getFormComps();
-};
-
-uno::Reference<drawing::XDrawPage> const & FormControlHelper::FormControlHelper_Impl::getDrawPage()
-{
- if (! rDrawPage.is())
- {
- uno::Reference<drawing::XDrawPageSupplier>
- xDrawPageSupplier(rTextDocument, uno::UNO_QUERY);
- if (xDrawPageSupplier.is())
- rDrawPage = xDrawPageSupplier->getDrawPage();
- }
-
- return rDrawPage;
-}
-
-uno::Reference<lang::XMultiServiceFactory> const & FormControlHelper::FormControlHelper_Impl::getServiceFactory()
-{
- if (! rServiceFactory.is())
- rServiceFactory.set(rTextDocument, uno::UNO_QUERY);
-
- return rServiceFactory;
-}
-
-uno::Reference<form::XForm> const & FormControlHelper::FormControlHelper_Impl::getForm()
-{
- if (! rForm.is())
- {
- uno::Reference<form::XFormsSupplier> xFormsSupplier(getDrawPage(), uno::UNO_QUERY);
-
- if (xFormsSupplier.is())
- {
- uno::Reference<container::XNameContainer> xFormsNamedContainer(xFormsSupplier->getForms());
- static constexpr OUString sDOCXForm = u"DOCX-Standard"_ustr;
-
- OUString sFormName(sDOCXForm);
- sal_uInt16 nUnique = 0;
-
- while (xFormsNamedContainer->hasByName(sFormName))
- {
- ++nUnique;
- sFormName = sDOCXForm + OUString::number(nUnique);
- }
-
- uno::Reference<uno::XInterface> xForm(getServiceFactory()->createInstance("com.sun.star.form.component.Form"));
- if (xForm.is())
- {
- uno::Reference<beans::XPropertySet>
- xFormProperties(xForm, uno::UNO_QUERY);
- uno::Any aAny(sFormName);
- xFormProperties->setPropertyValue("Name", aAny);
- }
-
- rForm.set(xForm, uno::UNO_QUERY);
-
- uno::Reference<container::XIndexContainer> xForms(xFormsNamedContainer, uno::UNO_QUERY);
- uno::Any aAny(xForm);
- xForms->insertByIndex(xForms->getCount(), aAny);
- }
- }
-
- return rForm;
-}
-
-uno::Reference<container::XIndexContainer> FormControlHelper::FormControlHelper_Impl::getFormComps()
-{
- uno::Reference<container::XIndexContainer> xIndexContainer(getForm(), uno::UNO_QUERY);
-
- return xIndexContainer;
-}
-
-FormControlHelper::FormControlHelper(FieldId eFieldId,
- uno::Reference<text::XTextDocument> const& xTextDocument,
- FFDataHandler::Pointer_t pFFData)
- : m_pFFData(std::move(pFFData)), m_pImpl(new FormControlHelper_Impl)
-{
- m_pImpl->m_eFieldId = eFieldId;
- m_pImpl->rTextDocument = xTextDocument;
-}
-
-FormControlHelper::~FormControlHelper()
-{
-}
-
-bool FormControlHelper::createCheckbox(uno::Reference<text::XTextRange> const& xTextRange,
- const OUString & rControlName)
-{
- if ( !m_pFFData )
- return false;
- uno::Reference<lang::XMultiServiceFactory>
- xServiceFactory(m_pImpl->getServiceFactory());
-
- if (! xServiceFactory.is())
- return false;
-
- uno::Reference<uno::XInterface> xInterface = xServiceFactory->createInstance("com.sun.star.form.component.CheckBox");
-
- if (!xInterface.is())
- return false;
-
- m_pImpl->rFormComponent.set(xInterface, uno::UNO_QUERY);
- if (!m_pImpl->rFormComponent.is())
- return false;
-
- uno::Reference<beans::XPropertySet> xPropSet(xInterface, uno::UNO_QUERY);
-
- sal_uInt32 nCheckBoxHeight = 16 * m_pFFData->getCheckboxHeight();
-
- if (m_pFFData->getCheckboxAutoHeight())
- {
- uno::Reference<beans::XPropertySet> xTextRangeProps(xTextRange, uno::UNO_QUERY);
-
- try
- {
- float fCheckBoxHeight = 0.0;
- xTextRangeProps->getPropertyValue("CharHeight") >>= fCheckBoxHeight;
- nCheckBoxHeight = static_cast<sal_uInt32>(floor(fCheckBoxHeight * 35.3));
- }
- catch (beans::UnknownPropertyException &)
- {
- }
- }
-
- m_pImpl->aSize.Width = nCheckBoxHeight;
- m_pImpl->aSize.Height = m_pImpl->aSize.Width;
-
- if (!m_pFFData->getStatusText().isEmpty())
- {
- xPropSet->setPropertyValue("HelpText", uno::Any(m_pFFData->getStatusText()));
- }
-
- xPropSet->setPropertyValue("DefaultState", uno::Any(m_pFFData->getCheckboxChecked()));
-
- if (!m_pFFData->getHelpText().isEmpty())
- {
- xPropSet->setPropertyValue("HelpF1Text", uno::Any(m_pFFData->getHelpText()));
- }
-
- xPropSet->setPropertyValue("Name", uno::Any(rControlName));
-
- return true;
-}
-
-void FormControlHelper::processField(uno::Reference<text::XFormField> const& xFormField)
-{
- // Set field type first before adding parameters.
- if (m_pImpl->m_eFieldId == FIELD_FORMTEXT )
- {
- xFormField->setFieldType(ODF_FORMTEXT);
- }
- else if (m_pImpl->m_eFieldId == FIELD_FORMCHECKBOX )
- {
- xFormField->setFieldType(ODF_FORMCHECKBOX);
- }
- else if (m_pImpl->m_eFieldId == FIELD_FORMDROPDOWN )
- {
- xFormField->setFieldType(ODF_FORMDROPDOWN);
- }
-
- uno::Reference<container::XNameContainer> xNameCont = xFormField->getParameters();
- uno::Reference<container::XNamed> xNamed( xFormField, uno::UNO_QUERY );
- if ( !(m_pFFData && xNamed.is() && xNameCont.is()) )
- return;
-
- OUString sTmp = m_pFFData->getEntryMacro();
- if ( !sTmp.isEmpty() )
- xNameCont->insertByName( "EntryMacro", uno::Any(sTmp) );
- sTmp = m_pFFData->getExitMacro();
- if ( !sTmp.isEmpty() )
- xNameCont->insertByName( "ExitMacro", uno::Any(sTmp) );
-
- sTmp = m_pFFData->getHelpText();
- if ( !sTmp.isEmpty() )
- xNameCont->insertByName( "Help", uno::Any(sTmp) );
-
- sTmp = m_pFFData->getStatusText();
- if ( !sTmp.isEmpty() )
- xNameCont->insertByName( "Hint", uno::Any(sTmp) );
-
- if (m_pImpl->m_eFieldId == FIELD_FORMTEXT )
- {
- sTmp = m_pFFData->getName();
- try
- {
- if ( !sTmp.isEmpty() )
- xNamed->setName( sTmp );
- }
- catch ( uno::Exception& )
- {
- TOOLS_INFO_EXCEPTION("writerfilter", "Set Formfield name failed");
- }
-
- sTmp = m_pFFData->getTextType();
- if ( !sTmp.isEmpty() )
- xNameCont->insertByName( "Type", uno::Any(sTmp) );
-
- const sal_uInt16 nMaxLength = m_pFFData->getTextMaxLength();
- if ( nMaxLength )
- {
- xNameCont->insertByName( "MaxLength", uno::Any(nMaxLength) );
- }
-
- sTmp = m_pFFData->getTextDefault();
- if ( !sTmp.isEmpty() )
- xNameCont->insertByName( "Content", uno::Any(sTmp) );
-
- sTmp = m_pFFData->getTextFormat();
- if ( !sTmp.isEmpty() )
- xNameCont->insertByName( "Format", uno::Any(sTmp) );
- }
- else if (m_pImpl->m_eFieldId == FIELD_FORMCHECKBOX )
- {
- uno::Reference<beans::XPropertySet> xPropSet(xFormField, uno::UNO_QUERY);
- uno::Any aAny;
- aAny <<= m_pFFData->getCheckboxChecked();
- if ( xPropSet.is() )
- xPropSet->setPropertyValue("Checked", aAny);
- }
- else if (m_pImpl->m_eFieldId == FIELD_FORMDROPDOWN )
- {
- const FFDataHandler::DropDownEntries_t& rEntries = m_pFFData->getDropDownEntries();
- if (!rEntries.empty())
- {
- if ( xNameCont->hasByName(ODF_FORMDROPDOWN_LISTENTRY) )
- xNameCont->replaceByName(ODF_FORMDROPDOWN_LISTENTRY, uno::Any(comphelper::containerToSequence(rEntries)));
- else
- xNameCont->insertByName(ODF_FORMDROPDOWN_LISTENTRY, uno::Any(comphelper::containerToSequence(rEntries)));
-
- sal_Int32 nResult = m_pFFData->getDropDownResult().toInt32();
- // 0 is valid, but also how toInt32 reports parse error, but it's a sensible default...
- if (0 <= nResult && o3tl::make_unsigned(nResult) < rEntries.size())
- {
- if ( xNameCont->hasByName(ODF_FORMDROPDOWN_RESULT) )
- xNameCont->replaceByName(ODF_FORMDROPDOWN_RESULT, uno::Any( nResult ) );
- else
- xNameCont->insertByName(ODF_FORMDROPDOWN_RESULT, uno::Any( nResult ) );
- }
- }
- }
-}
-
-void FormControlHelper::insertControl(uno::Reference<text::XTextRange> const& xTextRange)
-{
- bool bCreated = false;
- if ( !m_pFFData )
- return;
- uno::Reference<container::XNameContainer> xFormCompsByName(m_pImpl->getForm(), uno::UNO_QUERY);
- uno::Reference<container::XIndexContainer> xFormComps(m_pImpl->getFormComps());
- if (! xFormComps.is())
- return;
-
- sal_Int32 nControl = 0;
- bool bDone = false;
- OUString sControlName;
-
- do
- {
- OUString sTmp = "Control" + OUString::number(nControl);
-
- nControl++;
- if (! xFormCompsByName->hasByName(sTmp))
- {
- sControlName = sTmp;
- bDone = true;
- }
- }
- while (! bDone);
-
- switch (m_pImpl->m_eFieldId)
- {
- case FIELD_FORMCHECKBOX:
- bCreated = createCheckbox(xTextRange, sControlName);
- break;
- default:
- break;
- }
-
- if (!bCreated)
- return;
-
- uno::Any aAny(m_pImpl->rFormComponent);
- xFormComps->insertByIndex(xFormComps->getCount(), aAny);
-
- if (! m_pImpl->getServiceFactory().is())
- return;
-
- uno::Reference<uno::XInterface> xInterface = m_pImpl->getServiceFactory()->createInstance("com.sun.star.drawing.ControlShape");
-
- if (! xInterface.is())
- return;
-
- uno::Reference<drawing::XShape> xShape(xInterface, uno::UNO_QUERY);
-
- if (! xShape.is())
- return;
-
- xShape->setSize(m_pImpl->aSize);
-
- uno::Reference<beans::XPropertySet> xShapeProps(xShape, uno::UNO_QUERY);
-
- sal_uInt16 nTmp = sal_uInt16(text::TextContentAnchorType_AS_CHARACTER);
- xShapeProps->setPropertyValue("AnchorType", uno::Any(sal_uInt16(nTmp)));
-
- nTmp = text::VertOrientation::CENTER;
- xShapeProps->setPropertyValue("VertOrient", uno::Any(sal_uInt16(nTmp)));
-
- xShapeProps->setPropertyValue("TextRange", uno::Any(xTextRange));
-
- uno::Reference<drawing::XControlShape> xControlShape(xShape, uno::UNO_QUERY);
- uno::Reference<awt::XControlModel> xControlModel(m_pImpl->rFormComponent, uno::UNO_QUERY);
- xControlShape->setControl(xControlModel);
-
- m_pImpl->getDrawPage()->add(xShape);
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/FormControlHelper.hxx b/writerfilter/source/dmapper/FormControlHelper.hxx
deleted file mode 100644
index 326637f85f78..000000000000
--- a/writerfilter/source/dmapper/FormControlHelper.hxx
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include "FFDataHandler.hxx"
-#include <com/sun/star/text/XTextDocument.hpp>
-#include <com/sun/star/text/XFormField.hpp>
-#include <com/sun/star/uno/Reference.hxx>
-#include "FieldTypes.hxx"
-
-namespace writerfilter::dmapper
-{
-class FormControlHelper : public virtual SvRefBase
-{
-public:
- typedef tools::SvRef<FormControlHelper> Pointer_t;
- FormControlHelper(FieldId eFieldId,
- css::uno::Reference<css::text::XTextDocument> const& rTextDocument,
- FFDataHandler::Pointer_t pFFData);
- ~FormControlHelper() override;
-
- void insertControl(css::uno::Reference<css::text::XTextRange> const& xTextRange);
- void processField(css::uno::Reference<css::text::XFormField> const& xFormField);
- bool hasFFDataHandler() const { return (m_pFFData != nullptr); }
-
-private:
- FFDataHandler::Pointer_t m_pFFData;
- struct FormControlHelper_Impl;
- tools::SvRef<FormControlHelper_Impl> m_pImpl;
-
- bool createCheckbox(css::uno::Reference<css::text::XTextRange> const& xTextRange,
- const OUString& rControlName);
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/GraphicHelpers.cxx b/writerfilter/source/dmapper/GraphicHelpers.cxx
deleted file mode 100644
index 32e13b04bec8..000000000000
--- a/writerfilter/source/dmapper/GraphicHelpers.cxx
+++ /dev/null
@@ -1,434 +0,0 @@
-/* -*- 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/.
- *
- * 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 "GraphicHelpers.hxx"
-#include "TagLogger.hxx"
-#include <dmapper/GraphicZOrderHelper.hxx>
-#include "PropertyIds.hxx"
-
-#include <ooxml/resourceids.hxx>
-
-#include <com/sun/star/text/HoriOrientation.hpp>
-#include <com/sun/star/text/VertOrientation.hpp>
-#include <com/sun/star/text/RelOrientation.hpp>
-
-#include <oox/drawingml/drawingmltypes.hxx>
-#include <sal/log.hxx>
-#include <svx/dialmgr.hxx>
-#include <svx/strings.hrc>
-#include <comphelper/diagnose_ex.hxx>
-
-#include <iostream>
-
-namespace writerfilter::dmapper {
-
-using namespace com::sun::star;
-
-PositionHandler::PositionHandler( std::pair<OUString, OUString>& rPositionOffsets, std::pair<OUString, OUString>& rAligns ) :
-LoggedProperties("PositionHandler"),
-m_nOrient(text::VertOrientation::NONE),
-m_nRelation(text::RelOrientation::FRAME),
-m_nPosition(0),
-m_rPositionOffsets(rPositionOffsets),
-m_rAligns(rAligns)
-{
-}
-
-PositionHandler::~PositionHandler( )
-{
-}
-
-void PositionHandler::lcl_attribute( Id aName, Value& rVal )
-{
- sal_Int32 nIntValue = rVal.getInt( );
- switch ( aName )
- {
- case NS_ooxml::LN_CT_PosV_relativeFrom:
- {
- switch ( nIntValue )
- {
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromV_margin:
- m_nRelation = text::RelOrientation::PAGE_PRINT_AREA;
- break;
-
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromV_page:
- m_nRelation = text::RelOrientation::PAGE_FRAME;
- break;
-
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromV_topMargin:
- m_nRelation = text::RelOrientation::PAGE_PRINT_AREA_TOP;
- break;
-
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromV_bottomMargin:
- m_nRelation = text::RelOrientation::PAGE_PRINT_AREA_BOTTOM;
- break;
-
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromV_paragraph:
- m_nRelation = text::RelOrientation::FRAME;
- break;
-
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromV_line:
- m_nRelation = text::RelOrientation::TEXT_LINE;
- break;
-
- // TODO There are some other unhandled values
- default:
- SAL_WARN("writerfilter", "unhandled case (" << nIntValue << ") in NS_ooxml::LN_CT_PosV_relativeFrom");
- }
- }
- break;
-
- case NS_ooxml::LN_CT_PosH_relativeFrom:
- {
- switch ( nIntValue )
- {
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromH_margin:
- m_nRelation = text::RelOrientation::PAGE_PRINT_AREA;
- break;
-
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromH_page:
- m_nRelation = text::RelOrientation::PAGE_FRAME;
- break;
-
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromH_insideMargin:
- m_nRelation = text::RelOrientation::PAGE_FRAME;
- m_bPageToggle = true;
- break;
-
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromH_column:
- m_nRelation = text::RelOrientation::FRAME;
- break;
-
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromH_character:
- m_nRelation = text::RelOrientation::CHAR;
- break;
-
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromH_leftMargin:
- m_nRelation = text::RelOrientation::PAGE_LEFT;
- break;
-
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromH_rightMargin:
- m_nRelation = text::RelOrientation::PAGE_RIGHT;
- break;
-
- // TODO There are some other unhandled values
- default:
- SAL_WARN("writerfilter", "unhandled case (" << nIntValue << ") in NS_ooxml::LN_CT_PosH_relativeFrom");
- }
- }
- break;
- default:
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- break;
- }
-}
-
-void PositionHandler::lcl_sprm(Sprm& rSprm)
-{
- sal_uInt32 nSprmId = rSprm.getId();
-
- switch (nSprmId)
- {
- case NS_ooxml::LN_CT_PosH_posOffset:
- m_nPosition = oox::drawingml::convertEmuToHmm(m_rPositionOffsets.first.toInt32());
- m_rPositionOffsets.first.clear();
- break;
- case NS_ooxml::LN_CT_PosV_posOffset:
- m_nPosition = oox::drawingml::convertEmuToHmm(m_rPositionOffsets.second.toInt32());
- m_rPositionOffsets.second.clear();
- break;
- case NS_ooxml::LN_CT_PosH_align:
- {
- OUString& rAlign = m_rAligns.first;
- if (rAlign == "left")
- m_nOrient = text::HoriOrientation::LEFT;
- else if (rAlign == "right")
- m_nOrient = text::HoriOrientation::RIGHT;
- else if (rAlign == "center")
- m_nOrient = text::HoriOrientation::CENTER;
- else if (rAlign == "inside")
- m_nOrient = text::HoriOrientation::INSIDE;
- else if (rAlign == "outside")
- m_nOrient = text::HoriOrientation::OUTSIDE;
- rAlign.clear();
- break;
- }
- case NS_ooxml::LN_CT_PosV_align:
- {
- OUString& rAlign = m_rAligns.second;
- if (rAlign == "top")
- m_nOrient = text::VertOrientation::TOP;
- else if (rAlign == "bottom")
- m_nOrient = text::VertOrientation::BOTTOM;
- else if (rAlign == "center")
- m_nOrient = text::VertOrientation::CENTER;
- else if (rAlign == "inside" && m_nRelation == text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)
- m_nOrient = text::VertOrientation::TOP;
- else if (rAlign == "outside" && m_nRelation == text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)
- m_nOrient = text::VertOrientation::BOTTOM;
- rAlign.clear();
- break;
- }
- }
-}
-
-sal_Int16 PositionHandler::orientation() const
-{
- if( m_nRelation == text::RelOrientation::TEXT_LINE )
- { // It appears that to 'line of text' alignment is backwards to other alignments,
- // 'top' meaning putting on top of the line instead of having top at the line.
- if( m_nOrient == text::VertOrientation::TOP )
- return text::VertOrientation::BOTTOM;
- else if( m_nOrient == text::VertOrientation::BOTTOM )
- return text::VertOrientation::TOP;
- }
- return m_nOrient;
-}
-
-WrapHandler::WrapHandler( ) :
-LoggedProperties("WrapHandler"),
- m_nType( 0 ),
- m_nSide( 0 )
-{
-}
-
-WrapHandler::~WrapHandler( )
-{
-}
-
-void WrapHandler::lcl_attribute( Id aName, Value& rVal )
-{
- switch ( aName )
- {
- case NS_ooxml::LN_CT_Wrap_type:
- m_nType = sal_Int32( rVal.getInt( ) );
- break;
- case NS_ooxml::LN_CT_Wrap_side:
- m_nSide = sal_Int32( rVal.getInt( ) );
- break;
- default:;
- }
-}
-
-void WrapHandler::lcl_sprm( Sprm& )
-{
-}
-
-text::WrapTextMode WrapHandler::getWrapMode( ) const
-{
- // The wrap values do not map directly to our wrap mode,
- // e.g. none in .docx actually means through in LO.
- text::WrapTextMode nMode = text::WrapTextMode_THROUGH;
-
- switch ( m_nType )
- {
- case NS_ooxml::LN_Value_vml_wordprocessingDrawing_ST_WrapType_square:
- // through and tight are somewhat complicated, approximate
- case NS_ooxml::LN_Value_vml_wordprocessingDrawing_ST_WrapType_tight:
- case NS_ooxml::LN_Value_vml_wordprocessingDrawing_ST_WrapType_through:
- {
- switch ( m_nSide )
- {
- case NS_ooxml::LN_Value_vml_wordprocessingDrawing_ST_WrapSide_left:
- nMode = text::WrapTextMode_LEFT;
- break;
- case NS_ooxml::LN_Value_vml_wordprocessingDrawing_ST_WrapSide_right:
- nMode = text::WrapTextMode_RIGHT;
- break;
- default:
- nMode = text::WrapTextMode_PARALLEL;
- }
- }
- break;
- case NS_ooxml::LN_Value_vml_wordprocessingDrawing_ST_WrapType_topAndBottom:
- nMode = text::WrapTextMode_NONE;
- break;
- case NS_ooxml::LN_Value_vml_wordprocessingDrawing_ST_WrapType_none:
- default:
- nMode = text::WrapTextMode_THROUGH;
- }
-
- return nMode;
-}
-
-
-void GraphicZOrderHelper::addItem(uno::Reference<beans::XPropertySet> const& props,
- sal_Int64 const relativeHeight)
-{
- m_items[ relativeHeight ] = props;
-}
-
-void GraphicZOrderHelper::adjustRelativeHeight(sal_Int64& rRelativeHeight, bool bIsZIndex,
- bool bIsBehindText, bool bIsInHeader)
-{
- // zOrder can be defined either by z-index (VML) or by relativeHeight (DML).
- // z-index indicates background with a negative value,
- // while relativeHeight indicates background with behindDoc = true.
- //
- // In general, all z-index-defined shapes appear on top of relativeHeight graphics
- // regardless of the value.
-
- // priority order
- // above text: positive sal_Int32 z-index (opaque/in front of text)
- // relativeHeight (represented here as a negative sal_Int32, but still opaque)
- // behind body: negative sal_Int32 z-index (!opaque/in the background)
- // behindText relativeHeight
- // (in header) positive z-index
- // (in header) relativeHeight
- // (in header) negative z-index
- // (in header) behindText
-
- const sal_Int64 nMaxUnsignedInt32 = SAL_MAX_UINT32;
- if (!bIsInHeader)
- {
- if (bIsZIndex)
- {
- // this number is already fine
- // positive values are the only positive values coming into zOrder,
- // and negative values will be !opaque (below text)
- }
- else if (!bIsBehindText)
- {
- assert (rRelativeHeight < 0);
- // this number is already fine - will be above text, but relativeHeight is negative
- }
- else
- {
- // reduce to negative level 1 to force below a negative z-index
- rRelativeHeight -= nMaxUnsignedInt32;
- }
- }
- else // bIsInHeader
- {
- if (bIsZIndex && !bIsBehindText)
- rRelativeHeight -= nMaxUnsignedInt32 * 2; // reduce to negative level 2
- else if (!bIsBehindText)
- rRelativeHeight -= nMaxUnsignedInt32 * 3; // reduce to negative level 3
- else if (bIsZIndex)
- rRelativeHeight -= nMaxUnsignedInt32 * 4; // reduce to negative level 4
- else
- rRelativeHeight -= nMaxUnsignedInt32 * 5; // reduce to negative level 5
- }
-}
-
-// The relativeHeight value in .docx is an arbitrary number, where only the relative ordering matters.
-// But in Writer, the z-order is index in 0..(numitems-1) range, so whenever a new item needs to be
-// added in the proper z-order, it is necessary to find the proper index.
-
-// The key to this function is that later on, when setPropertyValue("ZOrder", <returned sal_Int32>),
-// SW also automatically increments ALL zOrders >= the one returned for this fly.
-// Thus, getProperty PROP_Z_ORDER for relativeHeight "x" can return different values for itemZOrder.
-sal_Int32 GraphicZOrderHelper::findZOrder(sal_Int64 relativeHeight, bool bOldStyle)
-{
- // std::map is iterated sorted by key
- auto it = std::find_if(m_items.cbegin(), m_items.cend(),
- [relativeHeight, bOldStyle](const Items::value_type& rItem) {
- // Old-style ordering differs in what should happen when there is already an item with the same z-order:
- // we belong under it in case of new-style, but we belong above it in case of old-style.
- return bOldStyle ? (rItem.first > relativeHeight) : (rItem.first >= relativeHeight);
- }
- );
- sal_Int32 itemZOrderOffset(0); // before the item
- if( it == m_items.end()) // we're topmost
- {
- if( m_items.empty())
- return 0; // the lowest
- --it;
- itemZOrderOffset = 1; // after the topmost
-
- // Check if this shape has a textbox. If so, the textbox will have its own ZOrder, so
- // suggest a larger offset.
- bool bTextBox = false;
- uno::Reference<beans::XPropertySet> xShape = it->second;
- uno::Reference<beans::XPropertySetInfo> xInfo = xShape->getPropertySetInfo();
- if (xInfo->hasPropertyByName("TextBox"))
- {
- xShape->getPropertyValue("TextBox") >>= bTextBox;
- }
- if (bTextBox)
- {
- ++itemZOrderOffset;
- }
- }
- // SwXFrame::getPropertyValue throws uno::RuntimeException
- // when its GetFrameFormat() returns nullptr
- try {
- sal_Int32 itemZOrder(0);
- if( it->second->getPropertyValue(getPropertyName( PROP_Z_ORDER )) >>= itemZOrder )
- return itemZOrder + itemZOrderOffset;
- }
- catch (const uno::RuntimeException&) {
- TOOLS_WARN_EXCEPTION("writerfilter", "Exception when getting item z-order");
- }
- SAL_WARN( "writerfilter", "findZOrder() didn't find item z-order" );
- return 0; // this should not(?) happen
-}
-
-ExtentHandler::ExtentHandler()
-{
-}
-
-ExtentHandler::~ExtentHandler()
-{
-}
-
-void ExtentHandler::attribute(Id nName, Value & rValue)
-{
- sal_Int32 nIntValue = rValue.getInt();
- switch (nName)
- {
- case NS_ooxml::LN_CT_PositiveSize2D_cx:
- {
- m_Extent.Width = nIntValue;
- }
- break;
- case NS_ooxml::LN_CT_PositiveSize2D_cy:
- {
- m_Extent.Height = nIntValue;
- }
- break;
- default:
- break;
- }
-}
-
-void ExtentHandler::sprm(Sprm & rSprm)
-{
- sal_uInt32 nSprmId = rSprm.getId();
- switch(nSprmId)
- {
- case NS_ooxml::LN_CT_Inline_extent:
- case NS_ooxml::LN_CT_Anchor_extent:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- pProperties->resolve(*this);
- }
- }
- break;
- default:
- break;
- }
-}
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/GraphicHelpers.hxx b/writerfilter/source/dmapper/GraphicHelpers.hxx
deleted file mode 100644
index 21eb65f88402..000000000000
--- a/writerfilter/source/dmapper/GraphicHelpers.hxx
+++ /dev/null
@@ -1,82 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include "LoggedResources.hxx"
-#include <com/sun/star/text/WrapTextMode.hpp>
-
-#include <utility>
-
-namespace writerfilter::dmapper
-{
-class PositionHandler : public LoggedProperties
-{
-public:
- PositionHandler(std::pair<OUString, OUString>& rPositionOffsets,
- std::pair<OUString, OUString>& rAligns);
- virtual ~PositionHandler() override;
- sal_Int16 orientation() const;
- sal_Int16 relation() const { return m_nRelation; }
- sal_Int32 position() const { return m_nPosition; }
- bool GetPageToggle() const { return m_bPageToggle; }
-
-private:
- virtual void lcl_attribute(Id aName, Value& rVal) override;
- virtual void lcl_sprm(Sprm& rSprm) override;
- sal_Int16 m_nOrient;
- sal_Int16 m_nRelation;
- sal_Int32 m_nPosition;
- std::pair<OUString, OUString>& m_rPositionOffsets;
- std::pair<OUString, OUString>& m_rAligns;
- bool m_bPageToggle = false;
-};
-
-class WrapHandler : public LoggedProperties
-{
-public:
- WrapHandler();
- virtual ~WrapHandler() override;
-
- css::text::WrapTextMode getWrapMode() const;
-
-private:
- virtual void lcl_attribute(Id aName, Value& rVal) override;
- virtual void lcl_sprm(Sprm& rSprm) override;
-
- sal_Int32 m_nType;
- sal_Int32 m_nSide;
-};
-
-class ExtentHandler : public Properties
-{
- css::awt::Size m_Extent; // width and height in EMU
-
-public:
- typedef ::tools::SvRef<ExtentHandler> Pointer_t;
- explicit ExtentHandler();
- virtual ~ExtentHandler() override;
-
- virtual void attribute(Id nName, Value& rValue) override;
- virtual void sprm(Sprm& rSprm) override;
- css::awt::Size getExtent() const { return m_Extent; }
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/GraphicImport.cxx b/writerfilter/source/dmapper/GraphicImport.cxx
deleted file mode 100644
index 2df2569530a1..000000000000
--- a/writerfilter/source/dmapper/GraphicImport.cxx
+++ /dev/null
@@ -1,2118 +0,0 @@
-/* -*- 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/.
- *
- * 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 <string.h>
-
-#include <com/sun/star/awt/Size.hpp>
-#include <com/sun/star/container/XNamed.hpp>
-#include <com/sun/star/drawing/ColorMode.hpp>
-#include <com/sun/star/drawing/PointSequenceSequence.hpp>
-#include <com/sun/star/drawing/XShape.hpp>
-#include <com/sun/star/drawing/LineStyle.hpp>
-#include <com/sun/star/graphic/XGraphic.hpp>
-#include <com/sun/star/graphic/GraphicProvider.hpp>
-#include <com/sun/star/graphic/XGraphicProvider.hpp>
-#include <com/sun/star/io/BufferSizeExceededException.hpp>
-#include <com/sun/star/io/XInputStream.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/lang/XServiceInfo.hpp>
-#include <com/sun/star/table/BorderLine2.hpp>
-#include <com/sun/star/text/GraphicCrop.hpp>
-#include <com/sun/star/text/HoriOrientation.hpp>
-#include <com/sun/star/text/RelOrientation.hpp>
-#include <com/sun/star/text/TextContentAnchorType.hpp>
-#include <com/sun/star/text/VertOrientation.hpp>
-#include <com/sun/star/text/WrapTextMode.hpp>
-#include <com/sun/star/text/XTextContent.hpp>
-#include <com/sun/star/uno/XComponentContext.hpp>
-#include <com/sun/star/table/ShadowFormat.hpp>
-
-#include <svx/svditer.hxx>
-#include <svx/svdobj.hxx>
-#include <svx/svdogrp.hxx>
-#include <svx/svdtrans.hxx>
-#include <svx/unoapi.hxx>
-#include <cppuhelper/implbase.hxx>
-#include <rtl/ustrbuf.hxx>
-#include <sal/log.hxx>
-#include <rtl/math.hxx>
-#include <comphelper/diagnose_ex.hxx>
-#include <comphelper/propertyvalue.hxx>
-#include <comphelper/string.hxx>
-#include <comphelper/sequenceashashmap.hxx>
-#include <comphelper/sequence.hxx>
-#include <oox/drawingml/drawingmltypes.hxx>
-
-#include "DomainMapper.hxx"
-#include <dmapper/GraphicZOrderHelper.hxx>
-#include <ooxml/resourceids.hxx>
-
-#include "ConversionHelper.hxx"
-#include "GraphicHelpers.hxx"
-#include "GraphicImport.hxx"
-#include "PropertyMap.hxx"
-#include "TagLogger.hxx"
-#include "WrapPolygonHandler.hxx"
-#include "util.hxx"
-
-#include <comphelper/propertysequence.hxx>
-#include <algorithm>
-#include <basegfx/matrix/b2dhommatrixtools.hxx>
-#include <basegfx/matrix/b2dhommatrix.hxx>
-#include <basegfx/range/b2drange.hxx>
-#include <basegfx/numeric/ftools.hxx>
-#include <basegfx/polygon/b2dpolypolygontools.hxx>
-#include <basegfx/polygon/b2dpolypolygon.hxx>
-#include <o3tl/unit_conversion.hxx>
-#include <oox/export/drawingml.hxx>
-#include <utility>
-
-using namespace css;
-
-namespace
-{
-bool isTopGroupObj(const uno::Reference<drawing::XShape>& xShape)
-{
- SdrObject* pObject = SdrObject::getSdrObjectFromXShape(xShape);
- if (!pObject)
- return false;
-
- if (pObject->getParentSdrObjectFromSdrObject())
- return false;
-
- return pObject->IsGroupObject();
-}
-}
-
-namespace writerfilter::dmapper
-{
-
-namespace {
-
-class XInputStreamHelper : public cppu::WeakImplHelper<io::XInputStream>
-{
- const sal_uInt8* m_pBuffer;
- const sal_Int32 m_nLength;
- sal_Int32 m_nPosition;
-public:
- XInputStreamHelper(const sal_uInt8* buf, size_t len);
-
- virtual ::sal_Int32 SAL_CALL readBytes( uno::Sequence< ::sal_Int8 >& aData, ::sal_Int32 nBytesToRead ) override;
- virtual ::sal_Int32 SAL_CALL readSomeBytes( uno::Sequence< ::sal_Int8 >& aData, ::sal_Int32 nMaxBytesToRead ) override;
- virtual void SAL_CALL skipBytes( ::sal_Int32 nBytesToSkip ) override;
- virtual ::sal_Int32 SAL_CALL available( ) override;
- virtual void SAL_CALL closeInput( ) override;
-};
-
-}
-
-XInputStreamHelper::XInputStreamHelper(const sal_uInt8* buf, size_t len) :
- m_pBuffer( buf ),
- m_nLength( len ),
- m_nPosition( 0 )
-{
-}
-
-sal_Int32 XInputStreamHelper::readBytes( uno::Sequence<sal_Int8>& aData, sal_Int32 nBytesToRead )
-{
- return readSomeBytes( aData, nBytesToRead );
-}
-
-sal_Int32 XInputStreamHelper::readSomeBytes( uno::Sequence<sal_Int8>& aData, sal_Int32 nMaxBytesToRead )
-{
- sal_Int32 nRet = 0;
- if( nMaxBytesToRead > 0 )
- {
- if( nMaxBytesToRead > m_nLength - m_nPosition )
- nRet = m_nLength - m_nPosition;
- else
- nRet = nMaxBytesToRead;
- aData.realloc( nRet );
- sal_Int8* pData = aData.getArray();
- if( nRet )
- {
- memcpy( pData, m_pBuffer + m_nPosition, nRet );
- m_nPosition += nRet;
- }
- }
- return nRet;
-}
-
-
-void XInputStreamHelper::skipBytes( sal_Int32 nBytesToSkip )
-{
- if( nBytesToSkip < 0 || m_nPosition + nBytesToSkip > m_nLength)
- throw io::BufferSizeExceededException();
- m_nPosition += nBytesToSkip;
-}
-
-
-sal_Int32 XInputStreamHelper::available( )
-{
- return m_nLength - m_nPosition;
-}
-
-
-void XInputStreamHelper::closeInput( )
-{
-}
-
-namespace {
-
-struct GraphicBorderLine
-{
- sal_Int32 nLineWidth;
- bool bHasShadow;
-
- GraphicBorderLine() :
- nLineWidth(0)
- ,bHasShadow(false)
- {}
-
- bool isEmpty() const
- {
- return nLineWidth == 0 && !bHasShadow;
- }
-
-};
-
-}
-
-class GraphicImport_Impl
-{
-private:
- sal_Int32 m_nXSize;
- bool m_bXSizeValid;
- sal_Int32 m_nYSize;
- bool m_bYSizeValid;
-
-public:
- GraphicImportType & m_rGraphicImportType;
- DomainMapper& m_rDomainMapper;
-
- sal_Int32 m_nLeftPosition;
- sal_Int32 m_nTopPosition;
-
- bool m_bUseSimplePos;
- std::optional<sal_Int64> m_oZOrder;
-
- sal_Int16 m_nHoriOrient;
- sal_Int16 m_nHoriRelation;
- bool m_bPageToggle = false;
- sal_Int16 m_nVertOrient;
- sal_Int16 m_nVertRelation;
- text::WrapTextMode m_nWrap;
- bool m_bLayoutInCell;
- bool m_bCompatForcedLayoutInCell;
- bool m_bAllowOverlap = true;
-
- // Opaque means not in the background (but instead, the graphic will be over top of the text)
- // This flag holds where LO will ACTUALLY put the graphic
- bool m_bOpaque;
- // BehindDoc means in the background. This flag says the graphic REQUESTED to be behind the text
- bool m_bBehindDoc;
-
- bool m_bContour;
- bool m_bContourOutside;
- WrapPolygon::Pointer_t mpWrapPolygon;
-
- sal_Int32 m_nLeftMargin;
- sal_Int32 m_nLeftMarginOrig = 0;
- sal_Int32 m_nRightMargin;
- sal_Int32 m_nTopMargin;
- sal_Int32 m_nBottomMargin;
-
- bool m_bShadow;
- sal_Int32 m_nShadowXDistance;
- sal_Int32 m_nShadowYDistance;
- sal_Int32 m_nShadowColor;
- sal_Int32 m_nShadowTransparence;
-
- sal_Int32 m_nContrast;
- sal_Int32 m_nBrightness;
-
- static constexpr sal_Int32 nFillColor = 0xffffffff;
-
- drawing::ColorMode m_eColorMode;
-
- GraphicBorderLine m_aBorders[4];
-
- bool m_bIsGraphic;
-
- bool m_bSizeProtected;
- bool m_bPositionProtected;
- bool m_bHidden;
- bool m_bDecorative = false;
-
- sal_Int32 m_nShapeOptionType;
-
- OUString m_sName;
- OUString m_sAlternativeText;
- OUString m_title;
- OUString m_sHyperlinkURL;
- std::pair<OUString, OUString>& m_rPositionOffsets;
- std::pair<OUString, OUString>& m_rAligns;
- std::queue<OUString>& m_rPositivePercentages;
- OUString m_sAnchorId;
- comphelper::SequenceAsHashMap m_aInteropGrabBag;
- std::optional<sal_Int32> m_oEffectExtentLeft;
- std::optional<sal_Int32> m_oEffectExtentTop;
- std::optional<sal_Int32> m_oEffectExtentRight;
- std::optional<sal_Int32> m_oEffectExtentBottom;
- std::optional<text::GraphicCrop> m_oCrop;
-
- GraphicImport_Impl(GraphicImportType & rImportType, DomainMapper& rDMapper,
- std::pair<OUString, OUString>& rPositionOffsets,
- std::pair<OUString, OUString>& rAligns,
- std::queue<OUString>& rPositivePercentages)
- : m_nXSize(0)
- ,m_bXSizeValid(false)
- ,m_nYSize(0)
- ,m_bYSizeValid(false)
- ,m_rGraphicImportType(rImportType)
- ,m_rDomainMapper( rDMapper )
- ,m_nLeftPosition(0)
- ,m_nTopPosition(0)
- ,m_bUseSimplePos(false)
- ,m_nHoriOrient( text::HoriOrientation::NONE )
- ,m_nHoriRelation( text::RelOrientation::FRAME )
- ,m_nVertOrient( text::VertOrientation::NONE )
- ,m_nVertRelation( text::RelOrientation::FRAME )
- ,m_nWrap(text::WrapTextMode_NONE)
- ,m_bLayoutInCell(true)
- ,m_bCompatForcedLayoutInCell(false)
- ,m_bOpaque( !rDMapper.IsInHeaderFooter() )
- ,m_bBehindDoc(false)
- ,m_bContour(false)
- ,m_bContourOutside(true)
- ,m_nLeftMargin(319)
- ,m_nRightMargin(319)
- ,m_nTopMargin(0)
- ,m_nBottomMargin(0)
- ,m_bShadow(false)
- ,m_nShadowXDistance(0)
- ,m_nShadowYDistance(0)
- ,m_nShadowColor(0)
- ,m_nShadowTransparence(0)
- ,m_nContrast(0)
- ,m_nBrightness(0)
- ,m_eColorMode( drawing::ColorMode_STANDARD )
- ,m_bIsGraphic(false)
- ,m_bSizeProtected(false)
- ,m_bPositionProtected(false)
- ,m_bHidden(false)
- ,m_nShapeOptionType(0)
- ,m_rPositionOffsets(rPositionOffsets)
- ,m_rAligns(rAligns)
- ,m_rPositivePercentages(rPositivePercentages)
- {
- }
-
- void setXSize(sal_Int32 _nXSize)
- {
- m_nXSize = _nXSize;
- m_bXSizeValid = true;
- }
-
- sal_uInt32 getXSize() const
- {
- return m_nXSize;
- }
-
- bool isXSizeValid() const
- {
- return m_bXSizeValid;
- }
-
- void setYSize(sal_Int32 _nYSize)
- {
- m_nYSize = _nYSize;
- m_bYSizeValid = true;
- }
-
- sal_uInt32 getYSize() const
- {
- return m_nYSize;
- }
-
- bool isYSizeValid() const
- {
- return m_bYSizeValid;
- }
-
- void applyMargins(const uno::Reference< beans::XPropertySet >& xGraphicObjectProperties) const
- {
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_LEFT_MARGIN ), uno::Any(m_nLeftMargin));
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_RIGHT_MARGIN ), uno::Any(m_nRightMargin));
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_TOP_MARGIN ), uno::Any(m_nTopMargin));
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_BOTTOM_MARGIN ), uno::Any(m_nBottomMargin));
- }
-
- void applyPosition(const uno::Reference< beans::XPropertySet >& xGraphicObjectProperties) const
- {
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_HORI_ORIENT ),
- uno::Any(m_nHoriOrient));
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_VERT_ORIENT ),
- uno::Any(m_nVertOrient));
- }
-
- void applyRelativePosition(const uno::Reference< beans::XPropertySet >& xGraphicObjectProperties, bool bRelativeOnly = false) const
- {
- if (!bRelativeOnly)
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_HORI_ORIENT_POSITION),
- uno::Any(m_nLeftPosition));
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_HORI_ORIENT_RELATION ),
- uno::Any(m_nHoriRelation));
- xGraphicObjectProperties->setPropertyValue(getPropertyName(PROP_PAGE_TOGGLE),
- uno::Any(m_bPageToggle));
- if (!bRelativeOnly)
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_VERT_ORIENT_POSITION),
- uno::Any(m_nTopPosition));
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_VERT_ORIENT_RELATION ),
- uno::Any(m_nVertRelation));
- }
-
- void applyZOrder(uno::Reference<beans::XPropertySet> const & xGraphicObjectProperties) const
- {
- std::optional<sal_Int64> oZOrder = m_oZOrder;
- if (m_rGraphicImportType == GraphicImportType::IMPORT_AS_DETECTED_INLINE
- && !m_rDomainMapper.IsInShape())
- {
- oZOrder = SAL_MIN_INT64;
- }
- else if (!oZOrder)
- return;
- else
- {
- const bool bBehindText = m_bBehindDoc && !m_bOpaque;
- GraphicZOrderHelper::adjustRelativeHeight(*oZOrder, /*IsZIndex=*/false, bBehindText,
- m_rDomainMapper.IsInHeaderFooter());
- }
-
- // TODO: it is possible that RTF has been wrong all along as well. Always true here?
- const bool bLastDuplicateWins(!m_rDomainMapper.IsRTFImport()
- || m_rGraphicImportType == GraphicImportType::IMPORT_AS_DETECTED_INLINE);
-
- GraphicZOrderHelper& rZOrderHelper = m_rDomainMapper.graphicZOrderHelper();
- xGraphicObjectProperties->setPropertyValue(getPropertyName(PROP_Z_ORDER),
- uno::Any(rZOrderHelper.findZOrder(*oZOrder, bLastDuplicateWins)));
- rZOrderHelper.addItem(xGraphicObjectProperties, *oZOrder);
- }
-
- void applyName(uno::Reference<beans::XPropertySet> const & xGraphicObjectProperties) const
- {
- try
- {
- if (!m_sName.isEmpty())
- {
- uno::Reference<container::XNamed> const xNamed(xGraphicObjectProperties, uno::UNO_QUERY_THROW);
- xNamed->setName(m_sName);
- }
- // else: name is automatically generated by SwDoc::MakeFlySection_()
-
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_DESCRIPTION ),
- uno::Any( m_sAlternativeText ));
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_TITLE ),
- uno::Any( m_title ));
- }
- catch( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION("writerfilter", "failed");
- }
- }
-
- void applyHyperlink(uno::Reference<beans::XPropertySet> const & xShapeProps, bool bIsShape)
- {
- // Graphic objects have a different hyperlink prop than shapes
- auto aHyperlinkProp = bIsShape ? PROP_HYPERLINK : PROP_HYPER_LINK_U_R_L;
- if (!m_sHyperlinkURL.isEmpty())
- {
- xShapeProps->setPropertyValue(
- getPropertyName(aHyperlinkProp), uno::Any(m_sHyperlinkURL));
- }
- }
-
- /// Getter for m_aInteropGrabBag, but also merges in the values from other members if they are set.
- comphelper::SequenceAsHashMap const & getInteropGrabBag()
- {
- comphelper::SequenceAsHashMap aEffectExtent;
- if (m_oEffectExtentLeft)
- aEffectExtent["l"] <<= *m_oEffectExtentLeft;
- if (m_oEffectExtentTop)
- aEffectExtent["t"] <<= *m_oEffectExtentTop;
- if (m_oEffectExtentRight)
- aEffectExtent["r"] <<= *m_oEffectExtentRight;
- if (m_oEffectExtentBottom)
- aEffectExtent["b"] <<= *m_oEffectExtentBottom;
- if (!aEffectExtent.empty())
- m_aInteropGrabBag["CT_EffectExtent"] <<= aEffectExtent.getAsConstPropertyValueList();
- return m_aInteropGrabBag;
- }
-};
-
-GraphicImport::GraphicImport(uno::Reference<uno::XComponentContext> xComponentContext,
- uno::Reference<lang::XMultiServiceFactory> xTextFactory,
- DomainMapper& rDMapper,
- GraphicImportType & rImportType,
- std::pair<OUString, OUString>& rPositionOffsets,
- std::pair<OUString, OUString>& rAligns,
- std::queue<OUString>& rPositivePercentages)
-: LoggedProperties("GraphicImport")
-, LoggedTable("GraphicImport")
-, LoggedStream("GraphicImport")
-, m_pImpl(new GraphicImport_Impl(rImportType, rDMapper, rPositionOffsets, rAligns, rPositivePercentages))
-, m_xComponentContext(std::move(xComponentContext))
-, m_xTextFactory(std::move(xTextFactory))
-{
-}
-
-GraphicImport::~GraphicImport()
-{
-}
-
-com::sun::star::awt::Point GraphicImport::GetGraphicObjectPosition() const
-{
- return (com::sun::star::awt::Point(m_pImpl->m_nLeftPosition, m_pImpl->m_nTopPosition));
-}
-
-bool GraphicImport::GetLayoutInCell() const
-{
- return m_pImpl->m_bLayoutInCell;
-}
-
-void GraphicImport::handleWrapTextValue(sal_uInt32 nVal)
-{
- switch (nVal)
- {
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_WrapText_bothSides:
- m_pImpl->m_nWrap = text::WrapTextMode_PARALLEL;
- break;
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_WrapText_left:
- m_pImpl->m_nWrap = text::WrapTextMode_LEFT;
- break;
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_WrapText_right:
- m_pImpl->m_nWrap = text::WrapTextMode_RIGHT;
- break;
- case NS_ooxml::LN_Value_wordprocessingDrawing_ST_WrapText_largest:
- m_pImpl->m_nWrap = text::WrapTextMode_DYNAMIC;
- break;
- default:;
- }
-}
-
-void GraphicImport::putPropertyToFrameGrabBag( const OUString& sPropertyName, const uno::Any& aPropertyValue )
-{
- beans::PropertyValue aProperty;
- aProperty.Name = sPropertyName;
- aProperty.Value = aPropertyValue;
-
- if (!m_xShape.is())
- return;
-
- uno::Reference< beans::XPropertySet > xSet(m_xShape, uno::UNO_QUERY_THROW);
-
- uno::Reference< beans::XPropertySetInfo > xSetInfo(xSet->getPropertySetInfo());
- if (!xSetInfo.is())
- return;
-
- OUString aGrabBagPropName;
- uno::Reference<lang::XServiceInfo> xServiceInfo(m_xShape, uno::UNO_QUERY_THROW);
- if (xServiceInfo->supportsService("com.sun.star.text.TextFrame"))
- aGrabBagPropName = "FrameInteropGrabBag";
- else
- aGrabBagPropName = "InteropGrabBag";
-
- if (xSetInfo->hasPropertyByName(aGrabBagPropName))
- {
- //Add pProperty to the end of the Sequence for aGrabBagPropName
- uno::Sequence<beans::PropertyValue> aTmp;
- xSet->getPropertyValue(aGrabBagPropName) >>= aTmp;
- std::vector<beans::PropertyValue> aGrabBag(comphelper::sequenceToContainer<std::vector<beans::PropertyValue> >(aTmp));
- aGrabBag.push_back(aProperty);
-
- xSet->setPropertyValue(aGrabBagPropName, uno::Any(comphelper::containerToSequence(aGrabBag)));
- }
-}
-
-static bool lcl_bHasGroupSlantedChild(const SdrObject* pObj)
-{
- // Returns true, if a child object differs more than 0.02deg from horizontal or vertical.
- // Because lines sometimes are imported as customshapes, a horizontal or vertical line
- // might not have exactly 0, 90, 180, or 270 degree as rotate angle.
- if (!pObj)
- return false;
- if (!pObj->IsGroupObject())
- return false;
- SdrObjList* pSubList = pObj->GetSubList();
- if (!pSubList)
- return false;
- SdrObjListIter aIterator(pSubList, SdrIterMode::DeepNoGroups);
- while (aIterator.IsMore())
- {
- const SdrObject* pSubObj = aIterator.Next();
- const Degree100 nRotateAngle = NormAngle36000(pSubObj->GetRotateAngle());
- const sal_uInt16 nRot = nRotateAngle.get();
- if ((3 < nRot && nRot < 8997) || (9003 < nRot && nRot < 17997)
- || (18003 < nRot && nRot < 26997) || (27003 < nRot && nRot < 35997))
- return true;
- }
- return false;
-}
-
-void GraphicImport::lcl_correctWord2007EffectExtent(const sal_Int32 nMSOAngle)
-{
- // Word versions older than 14 do not swap width and height (see lcl_doMSOWidthHeightSwap)
- // and therefore generate different effectExtent. We correct them here.
- sal_Int16 nAngleDeg = (nMSOAngle / 60000) % 180;
- if (nAngleDeg < 45 || nAngleDeg >= 135)
- return;
-
- sal_Int32 nDiff = o3tl::convert(
- (double(m_pImpl->getXSize()) - double(m_pImpl->getYSize())) / 2.0,
- o3tl::Length::mm100, o3tl::Length::emu);
- if (m_pImpl->m_oEffectExtentLeft)
- *m_pImpl->m_oEffectExtentLeft += nDiff;
- if (m_pImpl->m_oEffectExtentRight)
- *m_pImpl->m_oEffectExtentRight += nDiff;
- if (m_pImpl->m_oEffectExtentTop)
- *m_pImpl->m_oEffectExtentTop -= nDiff;
- if (m_pImpl->m_oEffectExtentBottom)
- *m_pImpl->m_oEffectExtentBottom -= nDiff;
-}
-
-static void lcl_doMSOWidthHeightSwap(awt::Point& rLeftTop, awt::Size& rSize,
- const sal_Int32 nMSOAngle)
-{
- if (nMSOAngle == 0)
- return;
- // convert nMSOAngle to degree in [0°,180°[
- sal_Int16 nAngleDeg = (nMSOAngle / 60000) % 180;
- if (nAngleDeg >= 45 && nAngleDeg < 135)
- {
- // keep center of rectangle given in rLeftTop and rSize
- sal_Int32 aTemp = rSize.Width - rSize.Height;
- rLeftTop.X += aTemp / 2;
- rLeftTop.Y -= aTemp / 2;
- std::swap(rSize.Width, rSize.Height);
- }
- return;
-}
-
-void GraphicImport::lcl_expandRectangleByEffectExtent(awt::Point& rLeftTop, awt::Size& rSize)
-{
- sal_Int32 nEffectExtent = (m_pImpl->m_oEffectExtentLeft)
- ? oox::drawingml::convertEmuToHmm(*m_pImpl->m_oEffectExtentLeft)
- : 0;
- rLeftTop.X -= nEffectExtent;
- rSize.Width += nEffectExtent;
- nEffectExtent = (m_pImpl->m_oEffectExtentRight)
- ? oox::drawingml::convertEmuToHmm(*m_pImpl->m_oEffectExtentRight)
- : 0;
- rSize.Width += nEffectExtent;
- nEffectExtent = (m_pImpl->m_oEffectExtentTop)
- ? oox::drawingml::convertEmuToHmm(*m_pImpl->m_oEffectExtentTop)
- : 0;
- rLeftTop.Y -= nEffectExtent;
- rSize.Height += nEffectExtent;
- nEffectExtent = (m_pImpl->m_oEffectExtentBottom)
- ? oox::drawingml::convertEmuToHmm(*m_pImpl->m_oEffectExtentBottom)
- : 0;
- rSize.Height += nEffectExtent;
-}
-
-void GraphicImport::lcl_attribute(Id nName, Value& rValue)
-{
- sal_Int32 nIntValue = rValue.getInt();
- switch( nName )
- {
- case NS_ooxml::LN_OfficeArtExtension_Decorative_val:
- m_pImpl->m_bDecorative = true;
- break;
- case NS_ooxml::LN_CT_Hyperlink_URL:
- m_pImpl->m_sHyperlinkURL = rValue.getString();
- break;
- case NS_ooxml::LN_blip: //the binary graphic data in a shape
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rValue.getProperties();
- if( pProperties )
- {
- pProperties->resolve(*this);
- }
- }
- break;
- case NS_ooxml::LN_payload :
- {
- writerfilter::Reference<BinaryObj>::Pointer_t pPictureData = rValue.getBinary();
- if( pPictureData )
- pPictureData->resolve(*this);
- }
- break;
-
- //border properties
- case NS_ooxml::LN_CT_Border_sz:
- m_pImpl->m_aBorders[BORDER_TOP].nLineWidth = nIntValue;
- break;
- case NS_ooxml::LN_CT_Border_val:
- //graphic borders don't support different line types
- break;
- case NS_ooxml::LN_CT_Border_space:
- break;
- case NS_ooxml::LN_CT_Border_shadow:
- m_pImpl->m_aBorders[BORDER_TOP].bHasShadow = nIntValue != 0;
- break;
- case NS_ooxml::LN_CT_Border_frame:
- break;
- case NS_ooxml::LN_CT_PositiveSize2D_cx:
- case NS_ooxml::LN_CT_PositiveSize2D_cy:
- {
- sal_Int32 nDim = oox::drawingml::convertEmuToHmm(nIntValue);
- // drawingML equivalent of oox::vml::ShapeType::getAbsRectangle():
- // make sure a shape isn't hidden implicitly just because it has
- // zero height or width.
- if (nDim == 0)
- nDim = 1;
-
- if( nName == NS_ooxml::LN_CT_PositiveSize2D_cx )
- m_pImpl->setXSize(nDim);
- else
- m_pImpl->setYSize(nDim);
- }
- break;
- case NS_ooxml::LN_CT_EffectExtent_l:
- m_pImpl->m_oEffectExtentLeft = nIntValue;
- break;
- case NS_ooxml::LN_CT_EffectExtent_t:
- m_pImpl->m_oEffectExtentTop = nIntValue;
- break;
- case NS_ooxml::LN_CT_EffectExtent_r:
- m_pImpl->m_oEffectExtentRight = nIntValue;
- break;
- case NS_ooxml::LN_CT_EffectExtent_b:
- m_pImpl->m_oEffectExtentBottom = nIntValue;
- break;
- case NS_ooxml::LN_CT_NonVisualDrawingProps_id:
- //id of the object - ignored
- break;
- case NS_ooxml::LN_CT_NonVisualDrawingProps_name:
- //name of the object
- m_pImpl->m_sName = rValue.getString();
- break;
- case NS_ooxml::LN_CT_NonVisualDrawingProps_descr:
- //alternative text
- m_pImpl->m_sAlternativeText = rValue.getString();
- break;
- case NS_ooxml::LN_CT_NonVisualDrawingProps_title:
- //alternative text
- m_pImpl->m_title = rValue.getString();
- break;
- case NS_ooxml::LN_CT_NonVisualDrawingProps_hidden:
- m_pImpl->m_bHidden = (nIntValue == 1);
- break;
- case NS_ooxml::LN_CT_GraphicalObjectFrameLocking_noChangeAspect:
- //disallow aspect ratio change - ignored
- break;
- case NS_ooxml::LN_CT_GraphicalObjectFrameLocking_noMove:
- m_pImpl->m_bPositionProtected = true;
- break;
- case NS_ooxml::LN_CT_GraphicalObjectFrameLocking_noResize:
- m_pImpl->m_bSizeProtected = true;
- break;
- case NS_ooxml::LN_CT_Anchor_distT:
- case NS_ooxml::LN_CT_Anchor_distB:
- case NS_ooxml::LN_CT_Anchor_distL:
- case NS_ooxml::LN_CT_Anchor_distR:
- {
- m_pImpl->m_nShapeOptionType = nName;
- ProcessShapeOptions(rValue);
- }
- break;
- case NS_ooxml::LN_CT_Anchor_simplePos_attr:
- m_pImpl->m_bUseSimplePos = nIntValue > 0;
- break;
- case NS_ooxml::LN_CT_Anchor_relativeHeight: // unsigned content
- {
- // undocumented - based on testing: both 0 and 1 are equivalent to the maximum 503316479
- const sal_Int32 nMaxAllowed = 0x1DFFFFFF;
- if (nIntValue < 2 || nIntValue > nMaxAllowed)
- m_pImpl->m_oZOrder = nMaxAllowed;
- else
- m_pImpl->m_oZOrder = nIntValue;
-
- // all relativeHeight objects (i.e. DOCX graphics that use GraphicImport),
- // no matter how high their value, are below the lowest z-index shape (in same layer)
- // so emulate that by pretending that they are below text (in the hell-layer).
- // Please be assured that this does not actually place it in the hell-layer.
- m_pImpl->m_oZOrder = *m_pImpl->m_oZOrder - (nMaxAllowed + 1);
- }
- break;
- case NS_ooxml::LN_CT_Anchor_behindDoc:
- if (nIntValue > 0)
- {
- m_pImpl->m_bOpaque = false;
- m_pImpl->m_bBehindDoc = true;
- }
- break;
- case NS_ooxml::LN_CT_Anchor_locked:
- break;
- case NS_ooxml::LN_CT_Anchor_layoutInCell:
- // Starting in MSO 2013, anchors are ALWAYS considered to be laid out in table cell.
- m_pImpl->m_bCompatForcedLayoutInCell = !nIntValue
- && m_pImpl->m_rDomainMapper.GetSettingsTable()->GetWordCompatibilityMode() > 14
- && m_pImpl->m_rDomainMapper.IsInTable();
- m_pImpl->m_bLayoutInCell = m_pImpl->m_bCompatForcedLayoutInCell || nIntValue;
- break;
- case NS_ooxml::LN_CT_Anchor_hidden:
- break;
- case NS_ooxml::LN_CT_Anchor_allowOverlap:
- m_pImpl->m_bAllowOverlap = nIntValue != 0;
- break;
- case NS_ooxml::LN_CT_Anchor_wp14_anchorId:
- case NS_ooxml::LN_CT_Inline_wp14_anchorId:
- {
- OUStringBuffer aBuffer = OUString::number(nIntValue, 16);
- OUStringBuffer aString;
- comphelper::string::padToLength(aString, 8 - aBuffer.getLength(), '0');
- aString.append(aBuffer.getStr());
- m_pImpl->m_sAnchorId = aString.makeStringAndClear().toAsciiUpperCase();
- }
- break;
- case NS_ooxml::LN_CT_Point2D_x:
- m_pImpl->m_nLeftPosition = ConversionHelper::convertTwipToMM100(nIntValue);
- m_pImpl->m_nHoriRelation = text::RelOrientation::PAGE_FRAME;
- m_pImpl->m_nHoriOrient = text::HoriOrientation::NONE;
- break;
- case NS_ooxml::LN_CT_Point2D_y:
- m_pImpl->m_nTopPosition = ConversionHelper::convertTwipToMM100(nIntValue);
- m_pImpl->m_nVertRelation = text::RelOrientation::PAGE_FRAME;
- m_pImpl->m_nVertOrient = text::VertOrientation::NONE;
- break;
- case NS_ooxml::LN_CT_WrapTight_wrapText:
- m_pImpl->m_bContour = true;
- m_pImpl->m_bContourOutside = true;
-
- handleWrapTextValue(rValue.getInt());
-
- break;
- case NS_ooxml::LN_CT_WrapThrough_wrapText:
- m_pImpl->m_bContour = true;
- m_pImpl->m_bContourOutside = false;
-
- handleWrapTextValue(rValue.getInt());
-
- break;
- case NS_ooxml::LN_CT_WrapSquare_wrapText:
- handleWrapTextValue(rValue.getInt());
- break;
- case NS_ooxml::LN_CT_BlipFillProperties_srcRect:
- m_pImpl->m_oCrop.emplace(rValue.getAny().get<text::GraphicCrop>());
- break;
- case NS_ooxml::LN_shape:
- {
- uno::Reference< drawing::XShape> xShape;
- rValue.getAny( ) >>= xShape;
- if ( xShape.is( ) )
- {
- // Is it a graphic image
- bool bUseShape = true;
- try
- {
- uno::Reference< beans::XPropertySet > xShapeProps
- ( xShape, uno::UNO_QUERY_THROW );
-
- uno::Reference<graphic::XGraphic> xGraphic;
- xShapeProps->getPropertyValue("Graphic") >>= xGraphic;
-
- sal_Int32 nRotation = 0;
- xShapeProps->getPropertyValue("RotateAngle") >>= nRotation;
-
- css::beans::PropertyValues aGrabBag;
- xShapeProps->getPropertyValue("InteropGrabBag") >>= aGrabBag;
- // if the shape contains effects in the grab bag, we should not transform it
- // in a XTextContent so those effects can be preserved
- bool bContainsEffects = std::any_of(std::cbegin(aGrabBag), std::cend(aGrabBag), [](const auto& rProp) {
- return rProp.Name == "EffectProperties"
- || rProp.Name == "3DEffectProperties"
- || rProp.Name == "ArtisticEffectProperties";
- });
-
- xShapeProps->getPropertyValue("Shadow") >>= m_pImpl->m_bShadow;
- if (m_pImpl->m_bShadow)
- {
- xShapeProps->getPropertyValue("ShadowXDistance") >>= m_pImpl->m_nShadowXDistance;
- xShapeProps->getPropertyValue("ShadowYDistance") >>= m_pImpl->m_nShadowYDistance;
- xShapeProps->getPropertyValue("ShadowColor") >>= m_pImpl->m_nShadowColor;
- xShapeProps->getPropertyValue("ShadowTransparence") >>= m_pImpl->m_nShadowTransparence;
- }
-
- xShapeProps->getPropertyValue("GraphicColorMode") >>= m_pImpl->m_eColorMode;
- xShapeProps->getPropertyValue("AdjustLuminance") >>= m_pImpl->m_nBrightness;
- xShapeProps->getPropertyValue("AdjustContrast") >>= m_pImpl->m_nContrast;
-
- // fdo#70457: transform XShape into a SwXTextGraphicObject only if there's no rotation
- if ( nRotation == 0 && !bContainsEffects )
- m_xGraphicObject = createGraphicObject( xGraphic, xShapeProps );
-
- bUseShape = !m_xGraphicObject.is( );
-
- if ( !bUseShape )
- {
- // Define the object size
- uno::Reference< beans::XPropertySet > xGraphProps( m_xGraphicObject,
- uno::UNO_QUERY );
- awt::Size aSize = xShape->getSize( );
- xGraphProps->setPropertyValue("Height",
- uno::Any( aSize.Height ) );
- xGraphProps->setPropertyValue("Width",
- uno::Any( aSize.Width ) );
-
- text::GraphicCrop aGraphicCrop( 0, 0, 0, 0 );
- uno::Reference< beans::XPropertySet > xSourceGraphProps( xShape, uno::UNO_QUERY );
- uno::Any aAny = xSourceGraphProps->getPropertyValue("GraphicCrop");
- if (m_pImpl->m_oCrop)
- { // RTF: RTFValue from resolvePict()
- xGraphProps->setPropertyValue("GraphicCrop",
- uno::Any(*m_pImpl->m_oCrop));
- }
- else if (aAny >>= aGraphicCrop)
- { // DOCX: imported in oox BlipFillContext
- xGraphProps->setPropertyValue("GraphicCrop",
- uno::Any( aGraphicCrop ) );
- }
-
- // We need to drop the shape here somehow
- uno::Reference< lang::XComponent > xShapeComponent( xShape, uno::UNO_QUERY );
- xShapeComponent->dispose( );
- }
- }
- catch( const beans::UnknownPropertyException & )
- {
- // It isn't a graphic image
- }
-
- if ( bUseShape )
- m_xShape = xShape;
-
- if ( m_xShape.is( ) )
- {
- uno::Reference< beans::XPropertySet > xShapeProps
- (m_xShape, uno::UNO_QUERY_THROW);
-
-
- xShapeProps->setPropertyValue
- (getPropertyName(PROP_ANCHOR_TYPE),
- uno::Any
- (text::TextContentAnchorType_AS_CHARACTER));
-
- // In Word, if a shape is anchored inline, that
- // excludes being in the background.
- xShapeProps->setPropertyValue("Opaque", uno::Any(true));
-
- uno::Reference<lang::XServiceInfo> xServiceInfo(m_xShape, uno::UNO_QUERY_THROW);
-
- // TextFrames can't be rotated. But for anything else,
- // make sure that setting size doesn't affect rotation,
- // that would not match Word's definition of rotation.
- bool bKeepRotation = false;
- if (!xServiceInfo->supportsService("com.sun.star.text.TextFrame"))
- {
- bKeepRotation = true;
- xShapeProps->setPropertyValue
- (getPropertyName(PROP_TEXT_RANGE),
- uno::Any
- (m_pImpl->m_rDomainMapper.GetCurrentTextRange()));
- }
-
- awt::Size aSize(m_xShape->getSize());
-
- // One purpose of the next part is, to set the logic rectangle of the SdrObject
- // to nXSize and nYSize from import. That doesn't work for groups or lines,
- // because they do not have a logic rectangle and m_xShape->getSize and
- // m_xShape->setSize would work on the snap rectangle. In case a shape is
- // rotated, non-uniform scaling the snap rectangle will introduce shearing on
- // the shape. In case group or line is rotated, nXSize and nYSize contain the
- // unrotated size from oox. The rotation is already incorporated into group
- // children and line points. We must not scale them to unrotated size. Exclude
- // those shapes here.
-
- // Get MSO rotation angle. GetRotateAngle from SdrObject is not suitable
- // here, because it returns the rotate angle of the first child for groups
- // and slope angle for lines, even if line or group had not been rotated.
- // Import in oox has put the rotation from oox file into InteropGrabBag.
- comphelper::SequenceAsHashMap aInteropGrabBag(xShapeProps->getPropertyValue("InteropGrabBag"));
- sal_Int32 nOOXAngle(0);
- aInteropGrabBag.getValue("mso-rotation-angle") >>= nOOXAngle; // 1/60000 deg
- // tdf#143455: A diagram is imported as group, but has no valid object list
- // and contour wrap is different to Word. As workaround diagrams are excluded
- // here in various places.
- const SdrObject* pDiagramCandidate(SdrObject::getSdrObjectFromXShape(m_xShape));
- const bool bIsDiagram(nullptr != pDiagramCandidate && pDiagramCandidate->isDiagram());
- // tdf#143476: A lockedCanvas (Word2007) is imported as group, but has not
- // got size and position. Values from m_Impl has to be used.
- bool bIsLockedCanvas(false);
- aInteropGrabBag.getValue("LockedCanvas") >>= bIsLockedCanvas;
- bool bIsWordprocessingCanvas(false);
- aInteropGrabBag.getValue("WordprocessingCanvas") >>= bIsWordprocessingCanvas;
- const bool bIsGroupOrLine = (xServiceInfo->supportsService("com.sun.star.drawing.GroupShape")
- && !bIsDiagram && !bIsLockedCanvas && !bIsWordprocessingCanvas)
- || xServiceInfo->supportsService("com.sun.star.drawing.LineShape");
- SdrObject* pShape = SdrObject::getSdrObjectFromXShape(m_xShape);
- if (!bIsGroupOrLine || (!nOOXAngle && !lcl_bHasGroupSlantedChild(pShape)))
- {
- if (m_pImpl->isXSizeValid())
- aSize.Width = m_pImpl->getXSize();
- if (m_pImpl->isYSizeValid())
- aSize.Height = m_pImpl->getYSize();
- }
-
- Degree100 nRotation;
- if (bKeepRotation)
- {
- // Use internal API, getPropertyValue("RotateAngle")
- // would use GetObjectRotation(), which is not what
- // we want.
- if (pShape)
- nRotation = pShape->GetRotateAngle();
- }
-
- // tdf#157960: SdrEdgeObj::NbcResize would reset the adjustment values of
- // connectors to default zero. Thus we do not resize in case of a group that
- // represents a Word drawing canvas.
- if (!bIsWordprocessingCanvas)
- m_xShape->setSize(aSize);
-
- if (bKeepRotation)
- {
- xShapeProps->setPropertyValue("RotateAngle", uno::Any(nRotation.get()));
- }
-
- m_pImpl->m_bIsGraphic = true;
-
- if (!m_pImpl->m_sAnchorId.isEmpty())
- {
- putPropertyToFrameGrabBag("AnchorId", uno::Any(m_pImpl->m_sAnchorId));
- }
-
- // Calculate mso unrotated rectangle and its center, needed below
- awt::Size aImportSize(m_xShape->getSize()); // here only fallback
- if (m_pImpl->isXSizeValid())
- aImportSize.Width = m_pImpl->getXSize(); // Hmm
- if (m_pImpl->isYSizeValid())
- aImportSize.Height = m_pImpl->getYSize(); // Hmm
- const awt::Point aImportPosition(GetGraphicObjectPosition()); // Hmm
- double fCentrumX = aImportPosition.X + aImportSize.Width / 2.0;
- double fCentrumY = aImportPosition.Y + aImportSize.Height / 2.0;
-
- // In case of group and lines, transformations are incorporated in the child
- // shapes or points respectively in LO. MSO has rotation as separate property.
- // The position refers to the unrotated rectangle of MSO. We need to adapt it
- // to the left-top of the transformed shape.
- awt::Size aLOSize(m_xShape->getSize()); // LO snap rectangle size in Hmm
- if (bIsGroupOrLine && !(m_pImpl->mpWrapPolygon))
- {
- // Set LO position. MSO rotation is done on shape center.
- if(pShape && pShape->IsGroupObject())
- {
- tools::Rectangle aSnapRect = pShape->GetSnapRect(); // Twips
- m_pImpl->m_nLeftPosition = ConversionHelper::convertTwipToMM100(aSnapRect.Left());
- m_pImpl->m_nTopPosition = ConversionHelper::convertTwipToMM100(aSnapRect.Top());
- aLOSize.Width = ConversionHelper::convertTwipToMM100(aSnapRect.getOpenWidth());
- aLOSize.Height = ConversionHelper::convertTwipToMM100(aSnapRect.getOpenHeight());
- }
- else
- {
- m_pImpl->m_nLeftPosition = fCentrumX - aLOSize.Width / 2.0;
- m_pImpl->m_nTopPosition = fCentrumY - aLOSize.Height / 2.0;
- }
- m_xShape->setPosition(GetGraphicObjectPosition());
- }
- // ToDo: Rotated shapes with position type "Alignment" (UI of Word) have
- // wrong position. Word aligns the unrotated logic rectangle, LO the rotated
- // snap rectangle.
-
- // Margin correction
-
- // tdf#143475: Word 2007 (vers 12) calculates effectExtent for rotated images
- // based on the unrotated image without width-height-swap. We correct this to
- // those values, which would be calculated if width-height-swap was used.
- if (m_pImpl->m_rDomainMapper.GetSettingsTable()->GetWordCompatibilityMode() < 14
- && xServiceInfo->supportsService("com.sun.star.drawing.GraphicObjectShape")
- && nOOXAngle != 0)
- {
- lcl_correctWord2007EffectExtent(nOOXAngle);
- }
-
- if (m_pImpl->m_rGraphicImportType == IMPORT_AS_DETECTED_INLINE)
- {
- if (nOOXAngle == 0)
- {
- // EffectExtent contains all needed additional space, including fat
- // stroke and shadow. Simple add it to the margins.
- sal_Int32 nEffectExtent = (m_pImpl->m_oEffectExtentLeft)
- ? oox::drawingml::convertEmuToHmm(*m_pImpl->m_oEffectExtentLeft)
- : 0;
- m_pImpl->m_nLeftMargin += nEffectExtent;
- nEffectExtent = (m_pImpl->m_oEffectExtentRight)
- ? oox::drawingml::convertEmuToHmm(*m_pImpl->m_oEffectExtentRight) : 0;
- m_pImpl->m_nRightMargin += nEffectExtent;
- nEffectExtent = (m_pImpl->m_oEffectExtentTop)
- ? oox::drawingml::convertEmuToHmm(*m_pImpl->m_oEffectExtentTop) : 0;
- m_pImpl->m_nTopMargin += nEffectExtent;
- nEffectExtent = (m_pImpl->m_oEffectExtentBottom)
- ? oox::drawingml::convertEmuToHmm(*m_pImpl->m_oEffectExtentBottom) : 0;
- m_pImpl->m_nBottomMargin += nEffectExtent;
- }
- else
- {
- // As of June 2021 LibreOffice uses an area, which is large enough to
- // contain the rotated snap rectangle. MSO uses a smaller area, so
- // that the rotated snap rectangle covers text.
- awt::Point aMSOBaseLeftTop = aImportPosition;
- awt::Size aMSOBaseSize = aImportSize;
- lcl_doMSOWidthHeightSwap(aMSOBaseLeftTop, aMSOBaseSize, nOOXAngle);
- lcl_expandRectangleByEffectExtent(aMSOBaseLeftTop, aMSOBaseSize);
-
- // Get LO SnapRect from SdrObject if possible
- awt::Rectangle aLOSnapRect;
- // For case we have no SdrObject, initialize with values from m_pImpl
- aLOSnapRect.X = m_pImpl->m_nLeftPosition;
- aLOSnapRect.Y = m_pImpl->m_nTopPosition;
- aLOSnapRect.Width = aLOSize.Width;
- aLOSnapRect.Height = aLOSize.Height;
- if (pShape)
- {
- tools::Rectangle aSnapRect = pShape->GetSnapRect(); // Twip
- aLOSnapRect.X = ConversionHelper::convertTwipToMM100(aSnapRect.Left());
- aLOSnapRect.Y = ConversionHelper::convertTwipToMM100(aSnapRect.Top());
- aLOSnapRect.Width = ConversionHelper::convertTwipToMM100(aSnapRect.getOpenWidth());
- aLOSnapRect.Height = ConversionHelper::convertTwipToMM100(aSnapRect.getOpenHeight());
- }
-
- m_pImpl->m_nLeftMargin += aLOSnapRect.X - aMSOBaseLeftTop.X;
- m_pImpl->m_nRightMargin += aMSOBaseLeftTop.X + aMSOBaseSize.Width
- - (aLOSnapRect.X + aLOSnapRect.Width);
- m_pImpl->m_nTopMargin += aLOSnapRect.Y - aMSOBaseLeftTop.Y;
- m_pImpl->m_nBottomMargin += aMSOBaseLeftTop.Y + aMSOBaseSize.Height
- - (aLOSnapRect.Y + aLOSnapRect.Height);
- // tdf#141880 LibreOffice cannot handle negative vertical margins.
- // Those cases are caught below at common place.
- }
- } // end IMPORT_AS_DETECTED_INLINE
- else if ((m_pImpl->m_nWrap == text::WrapTextMode_PARALLEL
- || m_pImpl->m_nWrap == text::WrapTextMode_DYNAMIC
- || m_pImpl->m_nWrap == text::WrapTextMode_LEFT
- || m_pImpl->m_nWrap == text::WrapTextMode_RIGHT
- || m_pImpl->m_nWrap == text::WrapTextMode_NONE)
- && !(m_pImpl->mpWrapPolygon) && !bIsDiagram && !bIsWordprocessingCanvas)
- {
- // For wrap "Square" an area is defined around which the text wraps. MSO
- // describes the area by a base rectangle and effectExtent. LO uses the
- // shape bounding box and margins. We adapt the margins to get the same
- // area as MSO.
- awt::Point aMSOBaseLeftTop = aImportPosition;
- awt::Size aMSOBaseSize = aImportSize;
- lcl_doMSOWidthHeightSwap(aMSOBaseLeftTop, aMSOBaseSize, nOOXAngle);
- lcl_expandRectangleByEffectExtent(aMSOBaseLeftTop, aMSOBaseSize);
-
- // Get LO bound rectangle from SdrObject if possible
- awt::Rectangle aLOBoundRect;
- // For case we have no SdrObject, initialize with values from m_pImpl
- aLOBoundRect.X = m_pImpl->m_nLeftPosition;
- aLOBoundRect.Y = m_pImpl->m_nTopPosition;
- aLOBoundRect.Width = aLOSize.Width;
- aLOBoundRect.Height = aLOSize.Height;
- if (pShape)
- {
- tools::Rectangle aBoundRect = pShape->GetCurrentBoundRect(); // Twip
- aLOBoundRect.X = ConversionHelper::convertTwipToMM100(aBoundRect.Left());
- aLOBoundRect.Y = ConversionHelper::convertTwipToMM100(aBoundRect.Top());
- aLOBoundRect.Width = ConversionHelper::convertTwipToMM100(aBoundRect.getOpenWidth());
- aLOBoundRect.Height = ConversionHelper::convertTwipToMM100(aBoundRect.getOpenHeight());
- }
-
- m_pImpl->m_nLeftMargin += aLOBoundRect.X - aMSOBaseLeftTop.X;
- m_pImpl->m_nRightMargin += aMSOBaseLeftTop.X + aMSOBaseSize.Width
- - (aLOBoundRect.X + aLOBoundRect.Width);
- m_pImpl->m_nTopMargin += aLOBoundRect.Y - aMSOBaseLeftTop.Y;
- m_pImpl->m_nBottomMargin += aMSOBaseLeftTop.Y + aMSOBaseSize.Height
- - (aLOBoundRect.Y + aLOBoundRect.Height);
- }
- else if (m_pImpl->mpWrapPolygon && !bIsDiagram && !bIsWordprocessingCanvas)
- {
- // Word uses a wrap polygon, LibreOffice has no explicit wrap polygon
- // but creates the wrap contour based on the shape geometry, without
- // stroke width and shadow, but with rotation and flip. The concepts
- // are not compatible. We approximate Word's rendering by setting
- // wrap margins.
-
- // Build a range from the wrap polygon from Word.
- const drawing::PointSequenceSequence aWrapPolygon
- = m_pImpl->mpWrapPolygon->getPointSequenceSequence();
- basegfx::B2DPolyPolygon aB2DWrapPolyPolygon
- = basegfx::utils::UnoPointSequenceSequenceToB2DPolyPolygon(
- aWrapPolygon);
- // Wrap polygon values are relative to 0..21600|0..21600.
- // Scale to shape size (in Hmm).
- basegfx::B2DHomMatrix aMatrix = basegfx::utils::createScaleB2DHomMatrix(
- aImportSize.Width / 21600.0, aImportSize.Height / 21600.0);
- aB2DWrapPolyPolygon.transform(aMatrix);
-
- // Shape geometry will be rotated, rotate wrap polygon too.
- if (nOOXAngle != 0)
- {
- aMatrix = basegfx::utils::createRotateAroundPoint(
- aImportSize.Width / 2.0, aImportSize.Height / 2.0,
- basegfx::deg2rad<60000>(nOOXAngle));
- aB2DWrapPolyPolygon.transform(aMatrix);
- }
- basegfx::B2DRange aB2DWrapRange = aB2DWrapPolyPolygon.getB2DRange();
-
- // Build a range from shape geometry
- basegfx::B2DRange aShapeRange;
- if (pShape)
- {
- basegfx::B2DPolyPolygon aShapePolygon = pShape->TakeXorPoly(); // Twips
- aMatrix = basegfx::utils::createScaleB2DHomMatrix(
- o3tl::convert(1.0, o3tl::Length::twip, o3tl::Length::mm100),
- o3tl::convert(1.0, o3tl::Length::twip, o3tl::Length::mm100));
- aShapePolygon.transform(aMatrix);
- // Wrap polygon treats left/top of shape as origin, shift shape polygon accordingly
- aMatrix = basegfx::utils::createTranslateB2DHomMatrix(
- -aImportPosition.X, -aImportPosition.Y);
- aShapePolygon.transform(aMatrix);
- aShapeRange = aShapePolygon.getB2DRange();
- }
- else // can this happen?
- {
- aShapeRange
- = basegfx::B2DRange(0, 0, aImportSize.Width, aImportSize.Height);
- if (nOOXAngle != 0)
- {
- aMatrix = basegfx::utils::createRotateB2DHomMatrix(
- basegfx::deg2rad<60000>(nOOXAngle));
- aShapeRange.transform(aMatrix);
- }
- }
-
- // Add difference between shape and wrap range to margin and remember
- // difference in Twips for export.
- comphelper::SequenceAsHashMap aAnchorDistDiff;
-
- const double fTopDiff = aShapeRange.getMinY() - aB2DWrapRange.getMinY();
- m_pImpl->m_nTopMargin += basegfx::fround(fTopDiff);
- aAnchorDistDiff["distTDiff"] <<= basegfx::fround(
- o3tl::convert(fTopDiff, o3tl::Length::mm100, o3tl::Length::twip));
-
- const double fBottomDiff = aB2DWrapRange.getMaxY() - aShapeRange.getMaxY();
- m_pImpl->m_nBottomMargin += basegfx::fround(fBottomDiff);
- aAnchorDistDiff["distBDiff"] <<= basegfx::fround(
- o3tl::convert(fBottomDiff, o3tl::Length::mm100, o3tl::Length::twip));
-
- const double fLeftDiff = aShapeRange.getMinX() - aB2DWrapRange.getMinX();
- m_pImpl->m_nLeftMargin += basegfx::fround(fLeftDiff);
- aAnchorDistDiff["distLDiff"] <<= basegfx::fround(
- o3tl::convert(fLeftDiff, o3tl::Length::mm100, o3tl::Length::twip));
-
- const double fRightDiff = aB2DWrapRange.getMaxX() - aShapeRange.getMaxX();
- m_pImpl->m_nRightMargin += basegfx::fround(fRightDiff);
- aAnchorDistDiff["distRDiff"] <<= basegfx::fround(
- o3tl::convert(fRightDiff, o3tl::Length::mm100, o3tl::Length::twip));
-
- m_pImpl->m_aInteropGrabBag["AnchorDistDiff"]
- <<= aAnchorDistDiff.getAsConstPropertyValueList();
-
- // FixMe: tdf#141880. LibreOffice cannot handle negative horizontal margin in contour wrap
- if (m_pImpl->m_nLeftMargin < 0)
- m_pImpl->m_nLeftMargin = 0;
- if (m_pImpl->m_nRightMargin < 0)
- m_pImpl->m_nRightMargin = 0;
- }
- else if (!bIsDiagram && !bIsWordprocessingCanvas) // text::WrapTextMode_THROUGH
- {
- // Word writes and evaluates the effectExtent in case of position
- // type 'Alignment' (UI). We move these values to margin to approximate
- // Word's rendering.
- if (m_pImpl->m_oEffectExtentLeft)
- {
- m_pImpl->m_nLeftMargin
- += oox::drawingml::convertEmuToHmm(*m_pImpl->m_oEffectExtentLeft);
- }
- if (m_pImpl->m_oEffectExtentTop)
- {
- m_pImpl->m_nTopMargin
- += oox::drawingml::convertEmuToHmm(*m_pImpl->m_oEffectExtentTop);
- }
- if (m_pImpl->m_oEffectExtentRight)
- {
- m_pImpl->m_nRightMargin
- += oox::drawingml::convertEmuToHmm(*m_pImpl->m_oEffectExtentRight);
- }
- if (m_pImpl->m_oEffectExtentBottom)
- {
- m_pImpl->m_nBottomMargin
- += oox::drawingml::convertEmuToHmm(*m_pImpl->m_oEffectExtentBottom);
- }
- }
-
- // FixMe: tdf#141880 LibreOffice cannot handle negative vertical margins
- // although they are allowed in ODF.
- if (m_pImpl->m_nTopMargin < 0)
- m_pImpl->m_nTopMargin = 0;
- if (m_pImpl->m_nBottomMargin < 0)
- m_pImpl->m_nBottomMargin = 0;
- }
-
- if (bUseShape && m_pImpl->m_rGraphicImportType == IMPORT_AS_DETECTED_ANCHOR)
- {
- // If we are here, this is a drawingML shape. For those, only dmapper (and not oox) knows the anchoring infos (just like for Writer pictures).
- // But they aren't Writer pictures, either (which are already handled above).
- uno::Reference< beans::XPropertySet > xShapeProps(m_xShape, uno::UNO_QUERY_THROW);
-
- if (m_pImpl->m_nWrap == text::WrapTextMode_THROUGH && m_pImpl->m_nHoriRelation == text::RelOrientation::FRAME)
- {
- if (m_pImpl->m_bLayoutInCell && m_pImpl->m_rDomainMapper.IsInTable()
- && (m_pImpl->m_nVertRelation == text::RelOrientation::PAGE_FRAME
- || m_pImpl->m_nVertRelation == text::RelOrientation::PAGE_PRINT_AREA))
- {
- // Impossible to be page-oriented when layout in cell.
- // Since we are turning LayoutInCell off (to simplify layout),
- // we need to set the orientation to the paragraph,
- // as MSO effectively does when it forces layoutInCell.
- // Probably also needs to happen with TEXT_LINE,
- // but MSO is really weird with vertical relation to "line"
- m_pImpl->m_nVertRelation = text::RelOrientation::FRAME;
- }
-
- // text::RelOrientation::FRAME is OOXML's "column", which behaves as if
- // layout-in-cell would be always off.
- m_pImpl->m_bLayoutInCell = false;
- }
-
- if (m_pImpl->m_nHoriRelation == text::RelOrientation::FRAME
- && m_pImpl->m_nHoriOrient > text::HoriOrientation::NONE
- && m_pImpl->m_nHoriOrient != text::HoriOrientation::CENTER
- && m_pImpl->m_nHoriOrient < text::HoriOrientation::FULL)
- {
- // before compat15, relative left/right/inside/outside honored margins.
- if (m_pImpl->m_rDomainMapper.GetSettingsTable()->GetWordCompatibilityMode() < 15)
- m_pImpl->m_nHoriRelation = text::RelOrientation::PRINT_AREA;
- }
-
- // Anchored: Word only supports at-char in that case.
- text::TextContentAnchorType eAnchorType = text::TextContentAnchorType_AT_CHARACTER;
-
- if (m_pImpl->m_bHidden)
- {
- xShapeProps->setPropertyValue("Visible", uno::Any(false));
- xShapeProps->setPropertyValue("Printable", uno::Any(false));
- }
-
- // Avoid setting AnchorType for TextBoxes till SwTextBoxHelper::syncProperty() doesn't handle transition.
- bool bTextBox = false;
- xShapeProps->getPropertyValue("TextBox") >>= bTextBox;
-
- // The positioning change caused by LayoutInCell doesn't sync well
- // in the text / frame duo. So the compatibility fix only correctly
- // positions the frame and not the text currently.
- // tdf#135943: Instead of half-fixing and making a complete mess,
- // just avoid until layout's repositioning is sync'd to the text frame.
- if (m_pImpl->m_bLayoutInCell && bTextBox)
- m_pImpl->m_bLayoutInCell = !m_pImpl->m_bCompatForcedLayoutInCell;
-
- xShapeProps->setPropertyValue("AnchorType", uno::Any(eAnchorType));
-
- if (m_pImpl->m_nVertRelation == text::RelOrientation::TEXT_LINE)
- {
- // Word's "line" is "below the bottom of the line", our TEXT_LINE is
- // "towards top, from the bottom of the line", so invert the vertical
- // position.
- awt::Point aPoint = xShape->getPosition();
- aPoint.Y *= -1;
- xShape->setPosition(aPoint);
- }
-
- if (m_pImpl->m_bLayoutInCell && bTextBox && m_pImpl->m_rDomainMapper.IsInTable()
- && m_pImpl->m_nHoriRelation == text::RelOrientation::PAGE_FRAME)
- m_pImpl->m_nHoriRelation = text::RelOrientation::FRAME;
- if(m_pImpl->m_rDomainMapper.IsInTable())
- xShapeProps->setPropertyValue(getPropertyName(PROP_FOLLOW_TEXT_FLOW),
- uno::Any(m_pImpl->m_bLayoutInCell));
- //only the position orientation is handled in applyPosition()
- m_pImpl->applyPosition(xShapeProps);
-
- uno::Reference<lang::XServiceInfo> xServiceInfo(m_xShape, uno::UNO_QUERY_THROW);
- if (xServiceInfo->supportsService("com.sun.star.drawing.GroupShape") ||
- xServiceInfo->supportsService("com.sun.star.drawing.GraphicObjectShape"))
- {
- // You would expect that position and rotation are
- // independent, but they are not. Till we are not
- // there yet to handle all scaling, translation and
- // rotation with a single transformation matrix,
- // make sure there is no graphic rotation set when we set
- // the position.
- sal_Int32 nRotation = 0;
- if (xServiceInfo->supportsService("com.sun.star.drawing.GraphicObjectShape"))
- {
- xShapeProps->getPropertyValue("RotateAngle") >>= nRotation;
- }
- if (nRotation)
- xShapeProps->setPropertyValue("RotateAngle", uno::Any(sal_Int32(0)));
-
- // Position of the groupshape should be set after children have been added.
- // Long-term we should get rid of positioning group
- // shapes, though. Do it for top-level ones with
- // absolute page position as a start.
- // fdo#80555: also set position for graphic shapes here
- if (!isTopGroupObj(m_xShape)
- || m_pImpl->m_nHoriRelation != text::RelOrientation::PAGE_FRAME
- || m_pImpl->m_nVertRelation != text::RelOrientation::PAGE_FRAME)
- m_xShape->setPosition(
- awt::Point(m_pImpl->m_nLeftPosition, m_pImpl->m_nTopPosition));
-
- if (nRotation)
- xShapeProps->setPropertyValue("RotateAngle", uno::Any(nRotation));
- }
-
-
- m_pImpl->applyRelativePosition(xShapeProps, /*bRelativeOnly=*/true);
-
- xShapeProps->setPropertyValue("SurroundContour", uno::Any(m_pImpl->m_bContour));
- xShapeProps->setPropertyValue("ContourOutside", uno::Any(m_pImpl->m_bContourOutside));
- m_pImpl->applyMargins(xShapeProps);
- xShapeProps->setPropertyValue("Opaque", uno::Any(m_pImpl->m_bOpaque));
- xShapeProps->setPropertyValue("Surround", uno::Any(static_cast<sal_Int32>(m_pImpl->m_nWrap)));
- m_pImpl->applyZOrder(xShapeProps);
- m_pImpl->applyName(xShapeProps);
- m_pImpl->applyHyperlink(xShapeProps, bUseShape);
- xShapeProps->setPropertyValue("AllowOverlap",
- uno::Any(m_pImpl->m_bAllowOverlap));
-
- // Get the grab-bag set by oox, merge with our one and then put it back.
- comphelper::SequenceAsHashMap aInteropGrabBag(xShapeProps->getPropertyValue("InteropGrabBag"));
- aInteropGrabBag.update(m_pImpl->getInteropGrabBag());
- xShapeProps->setPropertyValue("InteropGrabBag", uno::Any(aInteropGrabBag.getAsConstPropertyValueList()));
- }
- else if (bUseShape && m_pImpl->m_rGraphicImportType == IMPORT_AS_DETECTED_INLINE)
- {
- uno::Reference< beans::XPropertySet > xShapeProps(m_xShape, uno::UNO_QUERY_THROW);
- m_pImpl->applyMargins(xShapeProps);
- m_pImpl->applyZOrder(xShapeProps);
- m_pImpl->applyName(xShapeProps);
- comphelper::SequenceAsHashMap aInteropGrabBag(xShapeProps->getPropertyValue("InteropGrabBag"));
- aInteropGrabBag.update(m_pImpl->getInteropGrabBag());
- xShapeProps->setPropertyValue("InteropGrabBag", uno::Any(aInteropGrabBag.getAsConstPropertyValueList()));
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_Inline_distT:
- m_pImpl->m_nTopMargin = 0;
- break;
- case NS_ooxml::LN_CT_Inline_distB:
- m_pImpl->m_nBottomMargin = 0;
- break;
- case NS_ooxml::LN_CT_Inline_distL:
- m_pImpl->m_nLeftMargin = 0;
- break;
- case NS_ooxml::LN_CT_Inline_distR:
- m_pImpl->m_nRightMargin = 0;
- break;
- case NS_ooxml::LN_CT_GraphicalObjectData_uri:
- rValue.getString();
- //TODO: does it need to be handled?
- break;
- case NS_ooxml::LN_CT_SizeRelH_relativeFrom:
- {
- switch (nIntValue)
- {
- case NS_ooxml::LN_ST_SizeRelFromH_margin:
- if (m_xShape.is())
- {
- uno::Reference<beans::XPropertySet> xPropertySet(m_xShape, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("RelativeWidthRelation", uno::Any(text::RelOrientation::FRAME));
- }
- break;
- case NS_ooxml::LN_ST_SizeRelFromH_leftMargin:
- case NS_ooxml::LN_ST_SizeRelFromH_outsideMargin:
- if (m_xShape.is())
- {
- // Here we handle the relative size of the width of some shape.
- // The size of the shape's width is going to be relative to the size of the left margin.
- // E.g.: (left margin = 8 && relative size = 150%) -> width of some shape = 12.
- uno::Reference<beans::XPropertySet> xPropertySet(m_xShape, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("RelativeWidthRelation", uno::Any(text::RelOrientation::PAGE_LEFT));
- }
- break;
- case NS_ooxml::LN_ST_SizeRelFromH_rightMargin:
- case NS_ooxml::LN_ST_SizeRelFromH_insideMargin:
- if (m_xShape.is())
- {
- // Same as the left margin above.
- uno::Reference<beans::XPropertySet> xPropertySet(m_xShape, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("RelativeWidthRelation", uno::Any(text::RelOrientation::PAGE_RIGHT));
- }
- break;
- case NS_ooxml::LN_ST_SizeRelFromH_page:
- if (m_xShape.is())
- {
- uno::Reference<beans::XPropertySet> xPropertySet(m_xShape, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("RelativeWidthRelation", uno::Any(text::RelOrientation::PAGE_FRAME));
- }
- break;
- default:
- SAL_WARN("writerfilter", "GraphicImport::lcl_attribute: unhandled NS_ooxml::LN_CT_SizeRelH_relativeFrom value: " << nIntValue);
- break;
- }
- }
- break;
- case NS_ooxml::LN_CT_SizeRelV_relativeFrom:
- {
- switch (nIntValue)
- {
- case NS_ooxml::LN_ST_SizeRelFromV_margin:
- if (m_xShape.is())
- {
- uno::Reference<beans::XPropertySet> xPropertySet(m_xShape, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("RelativeHeightRelation", uno::Any(text::RelOrientation::FRAME));
- }
- break;
- case NS_ooxml::LN_ST_SizeRelFromV_page:
- if (m_xShape.is())
- {
- uno::Reference<beans::XPropertySet> xPropertySet(m_xShape, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("RelativeHeightRelation", uno::Any(text::RelOrientation::PAGE_FRAME));
- }
- break;
- case NS_ooxml::LN_ST_SizeRelFromV_topMargin:
- if (m_xShape.is())
- {
- uno::Reference<beans::XPropertySet> xPropertySet(m_xShape, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("RelativeHeightRelation", uno::Any(text::RelOrientation::PAGE_PRINT_AREA));
- }
- break;
- case NS_ooxml::LN_ST_SizeRelFromV_bottomMargin:
- if (m_xShape.is())
- {
- uno::Reference<beans::XPropertySet> xPropertySet(m_xShape, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("RelativeHeightRelation", uno::Any(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM));
- }
- break;
- default:
- SAL_WARN("writerfilter", "GraphicImport::lcl_attribute: unhandled NS_ooxml::LN_CT_SizeRelV_relativeFrom value: " << nIntValue);
- break;
- }
- }
- break;
- default:
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- break;
- }
-}
-
-uno::Reference<text::XTextContent> GraphicImport::GetGraphicObject()
-{
- uno::Reference<text::XTextContent> xResult;
-
- if (m_xGraphicObject.is())
- xResult = m_xGraphicObject;
- else if (m_xShape.is())
- {
- xResult.set(m_xShape, uno::UNO_QUERY_THROW);
- }
-
- return xResult;
-}
-
-
-void GraphicImport::ProcessShapeOptions(Value const & rValue)
-{
- sal_Int32 nIntValue = rValue.getInt();
- switch( m_pImpl->m_nShapeOptionType )
- {
- case NS_ooxml::LN_CT_Anchor_distL:
- m_pImpl->m_nLeftMargin = nIntValue / 360;
- m_pImpl->m_nLeftMarginOrig = m_pImpl->m_nLeftMargin;
- break;
- case NS_ooxml::LN_CT_Anchor_distT:
- //todo: changes have to be applied depending on the orientation, see SwWW8ImplReader::AdjustULWrapForWordMargins()
- m_pImpl->m_nTopMargin = nIntValue / 360;
- break;
- case NS_ooxml::LN_CT_Anchor_distR:
- //todo: changes have to be applied depending on the orientation, see SwWW8ImplReader::AdjustLRWrapForWordMargins()
- m_pImpl->m_nRightMargin = nIntValue / 360;
- break;
- case NS_ooxml::LN_CT_Anchor_distB:
- //todo: changes have to be applied depending on the orientation, see SwWW8ImplReader::AdjustULWrapForWordMargins()
- m_pImpl->m_nBottomMargin = nIntValue / 360;
- break;
- default:
- OSL_FAIL( "shape option unsupported?");
- }
-}
-
-
-void GraphicImport::lcl_sprm(Sprm& rSprm)
-{
- sal_uInt32 nSprmId = rSprm.getId();
-
- switch(nSprmId)
- {
- case NS_ooxml::LN_CT_Inline_extent:
- case NS_ooxml::LN_CT_Inline_effectExtent:
- case NS_ooxml::LN_CT_Inline_docPr:
- case NS_ooxml::LN_CT_Inline_cNvGraphicFramePr:
- case NS_ooxml::LN_CT_NonVisualGraphicFrameProperties_graphicFrameLocks:
- case NS_ooxml::LN_CT_Inline_a_graphic:
- case NS_ooxml::LN_CT_Anchor_simplePos_elem:
- case NS_ooxml::LN_CT_Anchor_extent:
- case NS_ooxml::LN_CT_Anchor_effectExtent:
- case NS_ooxml::LN_EG_WrapType_wrapSquare:
- case NS_ooxml::LN_EG_WrapType_wrapTight:
- case NS_ooxml::LN_EG_WrapType_wrapThrough:
- case NS_ooxml::LN_CT_Anchor_docPr:
- case NS_ooxml::LN_CT_NonVisualDrawingProps_extLst:
- case NS_ooxml::LN_CT_Anchor_cNvGraphicFramePr:
- case NS_ooxml::LN_CT_Anchor_a_graphic:
- case NS_ooxml::LN_CT_WrapPath_start:
- case NS_ooxml::LN_CT_WrapPath_lineTo:
- case NS_ooxml::LN_graphic_graphic:
- case NS_ooxml::LN_pic_pic:
- case NS_ooxml::LN_dgm_relIds:
- case NS_ooxml::LN_lc_lockedCanvas:
- case NS_ooxml::LN_c_chart:
- case NS_ooxml::LN_wps_wsp:
- case NS_ooxml::LN_wpg_wgp:
- case NS_ooxml::LN_sizeRelH_sizeRelH:
- case NS_ooxml::LN_sizeRelV_sizeRelV:
- case NS_ooxml::LN_hlinkClick_hlinkClick:
- case NS_ooxml::LN_wpc_wpc:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- pProperties->resolve(*this);
- }
-
- // We'll map these to PARALLEL, save the original wrap type.
- if (nSprmId == NS_ooxml::LN_EG_WrapType_wrapTight)
- m_pImpl->m_aInteropGrabBag["EG_WrapType"] <<= OUString("wrapTight");
- else if (nSprmId == NS_ooxml::LN_EG_WrapType_wrapThrough)
- m_pImpl->m_aInteropGrabBag["EG_WrapType"] <<= OUString("wrapThrough");
-
- switch (nSprmId)
- {
- case NS_ooxml::LN_EG_WrapType_wrapSquare:
- case NS_ooxml::LN_EG_WrapType_wrapThrough:
- case NS_ooxml::LN_EG_WrapType_wrapTight:
- {
- // tdf#137850: Word >= 2013 seems to ignore bBehindDoc except for wrapNone, but older versions honour it.
- if (m_pImpl->m_bBehindDoc && m_pImpl->m_rDomainMapper.GetSettingsTable()->GetWordCompatibilityMode() > 14)
- m_pImpl->m_bOpaque = !m_pImpl->m_rDomainMapper.IsInHeaderFooter();
- }
- break;
- }
-
- }
- break;
- case NS_ooxml::LN_CT_WrapTight_wrapPolygon:
- case NS_ooxml::LN_CT_WrapThrough_wrapPolygon:
- {
- WrapPolygonHandler aHandler;
-
- resolveSprmProps(aHandler, rSprm);
-
- m_pImpl->mpWrapPolygon = aHandler.getPolygon();
-
- // Save the wrap path in case we can't handle it natively: drawinglayer shapes, TextFrames.
- m_pImpl->m_aInteropGrabBag["CT_WrapPath"] <<= m_pImpl->mpWrapPolygon->getPointSequenceSequence();
- }
- break;
- case NS_ooxml::LN_CT_Anchor_positionH:
- {
- // Use a special handler for the positioning
- auto pHandler = std::make_shared<PositionHandler>( m_pImpl->m_rPositionOffsets, m_pImpl->m_rAligns );
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- pProperties->resolve( *pHandler );
- if( !m_pImpl->m_bUseSimplePos )
- {
- m_pImpl->m_nHoriRelation = pHandler->relation();
- m_pImpl->m_bPageToggle = pHandler->GetPageToggle();
- m_pImpl->m_nHoriOrient = pHandler->orientation();
- m_pImpl->m_nLeftPosition = pHandler->position();
-
- // Left adjustments: if horizontally aligned to left of margin, then remove the
- // left wrapping.
- if (m_pImpl->m_nHoriOrient == text::HoriOrientation::LEFT)
- {
- if (m_pImpl->m_nHoriRelation == text::RelOrientation::PAGE_PRINT_AREA)
- {
- m_pImpl->m_nLeftMargin = 0;
- }
- }
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_Anchor_positionV:
- {
- // Use a special handler for the positioning
- auto pHandler = std::make_shared<PositionHandler>( m_pImpl->m_rPositionOffsets, m_pImpl->m_rAligns);
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- pProperties->resolve( *pHandler );
- if( !m_pImpl->m_bUseSimplePos )
- {
- m_pImpl->m_nVertRelation = pHandler->relation();
- m_pImpl->m_nVertOrient = pHandler->orientation();
- m_pImpl->m_nTopPosition = pHandler->position();
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_SizeRelH_pctWidth:
- case NS_ooxml::LN_CT_SizeRelV_pctHeight:
- if (m_pImpl->m_rPositivePercentages.empty())
- break;
-
- if (m_xShape.is())
- {
- sal_Int16 nPositivePercentage = rtl::math::round(m_pImpl->m_rPositivePercentages.front().toDouble() / oox::drawingml::PER_PERCENT);
-
- if (nPositivePercentage)
- {
- uno::Reference<beans::XPropertySet> xPropertySet(m_xShape, uno::UNO_QUERY);
- OUString aProperty = nSprmId == NS_ooxml::LN_CT_SizeRelH_pctWidth ? OUString("RelativeWidth") : OUString("RelativeHeight");
-
- sal_Int32 nTextPreRotateAngle = 0;
- uno::Any aAny;
- if (xPropertySet->getPropertySetInfo()->hasPropertyByName(
- "CustomShapeGeometry"))
- {
- aAny = xPropertySet->getPropertyValue("CustomShapeGeometry");
- }
- comphelper::SequenceAsHashMap aCustomShapeGeometry(aAny);
- auto it = aCustomShapeGeometry.find("TextPreRotateAngle");
- if (it != aCustomShapeGeometry.end())
- {
- nTextPreRotateAngle = it->second.get<sal_Int32>();
- }
- if (nTextPreRotateAngle == 0)
- {
- xPropertySet->setPropertyValue(aProperty,
- uno::Any(nPositivePercentage));
- }
- }
- }
-
- // Make sure the token is consumed even if xShape is an empty
- // reference.
- m_pImpl->m_rPositivePercentages.pop();
- break;
- case NS_ooxml::LN_EG_WrapType_wrapNone:
- //depending on the behindDoc attribute text wraps through behind or in front of the object
- m_pImpl->m_nWrap = text::WrapTextMode_THROUGH;
-
- // Wrap though means the margins defined earlier should not be
- // respected.
- m_pImpl->m_nLeftMargin = 0;
- m_pImpl->m_nTopMargin = 0;
- m_pImpl->m_nRightMargin = 0;
- m_pImpl->m_nBottomMargin = 0;
- break;
- case NS_ooxml::LN_EG_WrapType_wrapTopAndBottom:
- // tdf#137850: Word >= 2013 seems to ignore bBehindDoc except for wrapNone, but older versions honour it.
- if (m_pImpl->m_bBehindDoc && m_pImpl->m_rDomainMapper.GetSettingsTable()->GetWordCompatibilityMode() > 14)
- m_pImpl->m_bOpaque = !m_pImpl->m_rDomainMapper.IsInHeaderFooter();
- m_pImpl->m_nWrap = text::WrapTextMode_NONE;
- break;
- case NS_ooxml::LN_CT_GraphicalObject_graphicData:
- {
- m_pImpl->m_bIsGraphic = true;
-
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_CT_NonVisualDrawingProps_a_hlinkClick:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- pProperties->resolve( *this );
- }
- break;
- default:
- SAL_WARN("writerfilter", "GraphicImport::lcl_sprm: unhandled token: " << nSprmId);
- break;
- }
-}
-
-void GraphicImport::lcl_entry(const writerfilter::Reference<Properties>::Pointer_t& /*ref*/)
-{
-}
-
-uno::Reference<text::XTextContent> GraphicImport::createGraphicObject(uno::Reference<graphic::XGraphic> const & rxGraphic,
- uno::Reference<beans::XPropertySet> const & xShapeProps)
-{
- uno::Reference<text::XTextContent> xGraphicObject;
- try
- {
- if (rxGraphic.is())
- {
- uno::Reference< beans::XPropertySet > xGraphicObjectProperties(
- m_xTextFactory->createInstance("com.sun.star.text.TextGraphicObject"),
- uno::UNO_QUERY_THROW);
- xGraphicObjectProperties->setPropertyValue(getPropertyName(PROP_GRAPHIC), uno::Any(rxGraphic));
- xGraphicObjectProperties->setPropertyValue(getPropertyName(PROP_ANCHOR_TYPE),
- uno::Any( m_pImpl->m_rGraphicImportType == IMPORT_AS_DETECTED_ANCHOR ?
- text::TextContentAnchorType_AT_CHARACTER :
- text::TextContentAnchorType_AS_CHARACTER ));
- xGraphicObject.set( xGraphicObjectProperties, uno::UNO_QUERY_THROW );
-
- //shapes have only one border
- table::BorderLine2 aBorderLine;
- GraphicBorderLine& rBorderLine = m_pImpl->m_aBorders[0];
- if (rBorderLine.isEmpty() && xShapeProps.is() && xShapeProps->getPropertyValue("LineStyle").get<drawing::LineStyle>() != drawing::LineStyle_NONE)
- {
- // In case we got no border tokens and we have the
- // original shape, then use its line properties as the
- // border.
- aBorderLine.Color = xShapeProps->getPropertyValue("LineColor").get<sal_Int32>();
- aBorderLine.LineWidth = xShapeProps->getPropertyValue("LineWidth").get<sal_Int32>();
- }
- else
- {
- aBorderLine.Color = 0;
- aBorderLine.InnerLineWidth = 0;
- aBorderLine.OuterLineWidth = static_cast<sal_Int16>(rBorderLine.nLineWidth);
- aBorderLine.LineDistance = 0;
- }
- PropertyIds const aBorderProps[] =
- {
- PROP_LEFT_BORDER,
- PROP_RIGHT_BORDER,
- PROP_TOP_BORDER,
- PROP_BOTTOM_BORDER
- };
-
- for(PropertyIds const & rBorderProp : aBorderProps)
- xGraphicObjectProperties->setPropertyValue(getPropertyName(rBorderProp), uno::Any(aBorderLine));
-
- // setting graphic object shadow properties
- if (m_pImpl->m_bShadow)
- {
- // Shadow width is approximated by average of X and Y
- table::ShadowFormat aShadow;
- sal_uInt32 nShadowColor = m_pImpl->m_nShadowColor & 0x00FFFFFF; // The shadow color we get is RGB only.
- sal_Int32 nShadowWidth = (abs(m_pImpl->m_nShadowXDistance)
- + abs(m_pImpl->m_nShadowYDistance)) / 2;
-
- aShadow.ShadowWidth = nShadowWidth;
- sal_uInt8 nShadowTransparence = float(m_pImpl->m_nShadowTransparence) * 2.55;
- nShadowColor |= (nShadowTransparence << 24); // Add transparence to the color.
- aShadow.Color = nShadowColor;
- // Distances -ve for top and right, +ve for bottom and left
- if (m_pImpl->m_nShadowXDistance > 0)
- {
- if (m_pImpl->m_nShadowYDistance > 0)
- aShadow.Location = table::ShadowLocation_BOTTOM_RIGHT;
- else
- aShadow.Location = table::ShadowLocation_TOP_RIGHT;
- }
- else
- {
- if (m_pImpl->m_nShadowYDistance > 0)
- aShadow.Location = table::ShadowLocation_BOTTOM_LEFT;
- else
- aShadow.Location = table::ShadowLocation_TOP_LEFT;
- }
-
- xGraphicObjectProperties->setPropertyValue(getPropertyName(PROP_SHADOW_FORMAT), uno::Any(aShadow));
- }
-
- // setting properties for all types
- if( m_pImpl->m_bPositionProtected )
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_POSITION_PROTECTED ),
- uno::Any(true));
- if( m_pImpl->m_bSizeProtected )
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_SIZE_PROTECTED ),
- uno::Any(true));
-
- xGraphicObjectProperties->setPropertyValue(getPropertyName(PROP_DECORATIVE), uno::Any(m_pImpl->m_bDecorative));
- sal_Int32 nWidth = - m_pImpl->m_nLeftPosition;
- if (m_pImpl->m_rGraphicImportType == IMPORT_AS_DETECTED_ANCHOR)
- {
- if (m_pImpl->m_nHoriRelation == text::RelOrientation::FRAME
- && (m_pImpl->m_nHoriOrient == text::HoriOrientation::LEFT
- || m_pImpl->m_nHoriOrient == text::HoriOrientation::RIGHT
- || m_pImpl->m_nHoriOrient == text::HoriOrientation::INSIDE
- || m_pImpl->m_nHoriOrient == text::HoriOrientation::OUTSIDE))
- {
- // before compat15, relative left/right/inside/outside honored margins.
- if (m_pImpl->m_rDomainMapper.GetSettingsTable()->GetWordCompatibilityMode() < 15)
- m_pImpl->m_nHoriRelation = text::RelOrientation::PRINT_AREA;
- }
-
- //adjust margins
- if( (m_pImpl->m_nHoriOrient == text::HoriOrientation::LEFT &&
- (m_pImpl->m_nHoriRelation == text::RelOrientation::PAGE_PRINT_AREA ||
- m_pImpl->m_nHoriRelation == text::RelOrientation::FRAME) ) ||
- (m_pImpl->m_nHoriOrient == text::HoriOrientation::INSIDE &&
- m_pImpl->m_nHoriRelation == text::RelOrientation::PAGE_PRINT_AREA ))
- m_pImpl->m_nLeftMargin = 0;
- if((m_pImpl->m_nHoriOrient == text::HoriOrientation::RIGHT &&
- (m_pImpl->m_nHoriRelation == text::RelOrientation::PAGE_PRINT_AREA ||
- m_pImpl->m_nHoriRelation == text::RelOrientation::FRAME) ) ||
- (m_pImpl->m_nHoriOrient == text::HoriOrientation::INSIDE &&
- m_pImpl->m_nHoriRelation == text::RelOrientation::PAGE_PRINT_AREA ))
- m_pImpl->m_nRightMargin = 0;
- // adjust top/bottom margins
- if( m_pImpl->m_nVertOrient == text::VertOrientation::TOP &&
- ( m_pImpl->m_nVertRelation == text::RelOrientation::PAGE_PRINT_AREA ||
- m_pImpl->m_nVertRelation == text::RelOrientation::PAGE_FRAME))
- m_pImpl->m_nTopMargin = 0;
- if( m_pImpl->m_nVertOrient == text::VertOrientation::BOTTOM &&
- ( m_pImpl->m_nVertRelation == text::RelOrientation::PAGE_PRINT_AREA ||
- m_pImpl->m_nVertRelation == text::RelOrientation::PAGE_FRAME))
- m_pImpl->m_nBottomMargin = 0;
- if( m_pImpl->m_nVertOrient == text::VertOrientation::BOTTOM &&
- m_pImpl->m_nVertRelation == text::RelOrientation::PAGE_PRINT_AREA )
- m_pImpl->m_nBottomMargin = 0;
- //adjust alignment
- if( m_pImpl->m_nHoriOrient == text::HoriOrientation::INSIDE &&
- m_pImpl->m_nHoriRelation == text::RelOrientation::PAGE_FRAME )
- {
- // convert 'left to page' to 'from left -<width> to page text area'
- m_pImpl->m_nHoriOrient = text::HoriOrientation::NONE;
- m_pImpl->m_nHoriRelation = text::RelOrientation::PAGE_PRINT_AREA;
- m_pImpl->m_nLeftPosition = - nWidth;
- }
- else if( m_pImpl->m_nHoriOrient == text::HoriOrientation::OUTSIDE &&
- m_pImpl->m_nHoriRelation == text::RelOrientation::PAGE_FRAME )
- {
- // convert 'right to page' to 'from left 0 to right page border'
- m_pImpl->m_nHoriOrient = text::HoriOrientation::NONE;
- m_pImpl->m_nHoriRelation = text::RelOrientation::PAGE_RIGHT;
- m_pImpl->m_nLeftPosition = 0;
- }
-
- if (m_pImpl->m_nVertRelation == text::RelOrientation::TEXT_LINE)
- {
- // Word's "line" is "below the bottom of the line", our TEXT_LINE is
- // "towards top, from the bottom of the line", so invert the vertical position.
- m_pImpl->m_nTopPosition *= -1;
- }
-
- m_pImpl->applyPosition(xGraphicObjectProperties);
- m_pImpl->applyRelativePosition(xGraphicObjectProperties);
- if( !m_pImpl->m_bOpaque )
- {
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_OPAQUE ), uno::Any(m_pImpl->m_bOpaque));
- }
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_SURROUND ),
- uno::Any(static_cast<sal_Int32>(m_pImpl->m_nWrap)));
- if( m_pImpl->m_rDomainMapper.IsInTable())
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_FOLLOW_TEXT_FLOW ),
- uno::Any(m_pImpl->m_bLayoutInCell));
-
- xGraphicObjectProperties->setPropertyValue(getPropertyName(PROP_ALLOW_OVERLAP),
- uno::Any(m_pImpl->m_bAllowOverlap));
-
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_SURROUND_CONTOUR ),
- uno::Any(m_pImpl->m_bContour));
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_CONTOUR_OUTSIDE ),
- uno::Any(m_pImpl->m_bContourOutside));
- m_pImpl->applyMargins(xGraphicObjectProperties);
- }
-
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_ADJUST_CONTRAST ),
- uno::Any(static_cast<sal_Int16>(m_pImpl->m_nContrast)));
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_ADJUST_LUMINANCE ),
- uno::Any(static_cast<sal_Int16>(m_pImpl->m_nBrightness)));
- if(m_pImpl->m_eColorMode != drawing::ColorMode_STANDARD)
- {
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_GRAPHIC_COLOR_MODE ),
- uno::Any(m_pImpl->m_eColorMode));
- }
-
- xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_BACK_COLOR ),
- uno::Any( GraphicImport_Impl::nFillColor ));
- m_pImpl->applyZOrder(xGraphicObjectProperties);
-
- //there seems to be no way to detect the original size via _real_ API
- uno::Reference< beans::XPropertySet > xGraphicProperties(rxGraphic, uno::UNO_QUERY_THROW);
-
- if (m_pImpl->mpWrapPolygon)
- {
- uno::Any aContourPolyPolygon;
- awt::Size aGraphicSize;
- WrapPolygon::Pointer_t pCorrected;
- xGraphicProperties->getPropertyValue(getPropertyName(PROP_SIZE100th_M_M)) >>= aGraphicSize;
- if (aGraphicSize.Width && aGraphicSize.Height)
- {
- pCorrected = m_pImpl->mpWrapPolygon->correctWordWrapPolygon(aGraphicSize);
- }
- else
- {
- xGraphicProperties->getPropertyValue(getPropertyName(PROP_SIZE_PIXEL)) >>= aGraphicSize;
- if (aGraphicSize.Width && aGraphicSize.Height)
- {
- pCorrected = m_pImpl->mpWrapPolygon->correctWordWrapPolygonPixel(aGraphicSize);
- }
- }
-
- text::GraphicCrop aGraphicCrop;
- xShapeProps->getPropertyValue("GraphicCrop") >>= aGraphicCrop;
- if (aGraphicCrop.Top != 0 || aGraphicCrop.Bottom != 0 || aGraphicCrop.Left != 0
- || aGraphicCrop.Right != 0)
- {
- // Word's wrap polygon deals with a canvas which has the size of the already
- // cropped graphic, correct our polygon to have the same render result.
- pCorrected = pCorrected->correctCrop(aGraphicSize, aGraphicCrop);
- }
-
- if (pCorrected)
- {
- aContourPolyPolygon <<= pCorrected->getPointSequenceSequence();
- xGraphicObjectProperties->setPropertyValue(getPropertyName(PROP_CONTOUR_POLY_POLYGON),
- aContourPolyPolygon);
- // We should bring it to front, even if wp:anchor's behindDoc="1",
- // because otherwise paragraph background (if set) overlaps the graphic
- // TODO: if paragraph's background becomes bottommost, then remove this hack
- xGraphicObjectProperties->setPropertyValue("Opaque", uno::Any(true));
- }
- }
-
-
- if (m_pImpl->m_rGraphicImportType == IMPORT_AS_DETECTED_INLINE
- || m_pImpl->m_rGraphicImportType == IMPORT_AS_DETECTED_ANCHOR)
- {
- if( m_pImpl->getXSize() && m_pImpl->getYSize() )
- xGraphicObjectProperties->setPropertyValue(getPropertyName(PROP_SIZE),
- uno::Any( awt::Size( m_pImpl->getXSize(), m_pImpl->getYSize() )));
- m_pImpl->applyMargins(xGraphicObjectProperties);
- m_pImpl->applyName(xGraphicObjectProperties);
- m_pImpl->applyHyperlink(xGraphicObjectProperties, false);
- }
-
- // Handle horizontal flip.
- bool bMirrored = false;
- xShapeProps->getPropertyValue("IsMirrored") >>= bMirrored;
- if (bMirrored)
- {
- xGraphicObjectProperties->setPropertyValue("HoriMirroredOnEvenPages",
- uno::Any(true));
- xGraphicObjectProperties->setPropertyValue("HoriMirroredOnOddPages",
- uno::Any(true));
- }
- }
- }
- catch( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION("writerfilter", "");
- }
- return xGraphicObject;
-}
-
-
-void GraphicImport::data(const sal_uInt8* buf, size_t len)
-{
- uno::Reference< io::XInputStream > xIStream = new XInputStreamHelper( buf, len );
- beans::PropertyValues aMediaProperties{ comphelper::makePropertyValue(
- getPropertyName(PROP_INPUT_STREAM), xIStream) };
-
- uno::Reference<beans::XPropertySet> xPropertySet;
- uno::Reference<graphic::XGraphicProvider> xGraphicProvider(graphic::GraphicProvider::create(m_xComponentContext));
- uno::Reference<graphic::XGraphic> xGraphic = xGraphicProvider->queryGraphic(aMediaProperties);
- m_xGraphicObject = createGraphicObject(xGraphic, xPropertySet);
-}
-
-
-void GraphicImport::lcl_startSectionGroup()
-{
-}
-
-
-void GraphicImport::lcl_endSectionGroup()
-{
-}
-
-
-void GraphicImport::lcl_startParagraphGroup()
-{
-}
-
-
-void GraphicImport::lcl_endParagraphGroup()
-{
-}
-
-void GraphicImport::lcl_startCharacterGroup()
-{
-}
-
-void GraphicImport::lcl_endCharacterGroup()
-{
-}
-
-void GraphicImport::lcl_text(const sal_uInt8 * /*_data*/, size_t /*len*/)
-{
-}
-
-void GraphicImport::lcl_utext(const sal_Unicode * /*_data*/, size_t /*len*/)
-{
-}
-
-void GraphicImport::lcl_props(const writerfilter::Reference<Properties>::Pointer_t& /*ref*/)
-{
-}
-
-void GraphicImport::lcl_table(Id /*name*/, const writerfilter::Reference<Table>::Pointer_t& /*ref*/)
-{
-}
-
-void GraphicImport::lcl_substream(Id /*name*/, const writerfilter::Reference<Stream>::Pointer_t& /*ref*/)
-{
-}
-
-void GraphicImport::lcl_startShape(uno::Reference<drawing::XShape> const&)
-{
-}
-
-void GraphicImport::lcl_endShape( )
-{
-}
-
-bool GraphicImport::IsGraphic() const
-{
- return m_pImpl->m_bIsGraphic;
-}
-
-sal_Int32 GraphicImport::GetLeftMarginOrig() const
-{
- return m_pImpl->m_nLeftMarginOrig;
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/GraphicImport.hxx b/writerfilter/source/dmapper/GraphicImport.hxx
deleted file mode 100644
index dae19ce85c03..000000000000
--- a/writerfilter/source/dmapper/GraphicImport.hxx
+++ /dev/null
@@ -1,140 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <queue>
-#include <memory>
-
-#include "LoggedResources.hxx"
-
-#include <com/sun/star/awt/Size.hpp>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/graphic/XGraphic.hpp>
-
-namespace com::sun::star {
- namespace uno
- {
- class XComponentContext;
- }
- namespace lang
- {
- class XMultiServiceFactory;
- }
- namespace text
- {
- class XTextContent;
- }
- namespace drawing
- {
- class XShape;
- }
- namespace beans
- {
- struct PropertyValue;
- }
-}
-
-namespace writerfilter::dmapper
-{
-class GraphicImport_Impl;
-class DomainMapper;
-
-enum GraphicImportType
-{
- IMPORT_AS_DETECTED_INLINE,
- IMPORT_AS_DETECTED_ANCHOR
-};
-
-class GraphicImport : public LoggedProperties, public LoggedTable
- ,public BinaryObj, public LoggedStream
-{
- std::unique_ptr<GraphicImport_Impl> m_pImpl;
-
- css::uno::Reference<css::uno::XComponentContext> m_xComponentContext;
- css::uno::Reference<css::lang::XMultiServiceFactory> m_xTextFactory;
-
- css::uno::Reference<css::text::XTextContent> m_xGraphicObject;
-
- css::uno::Reference<css::drawing::XShape> m_xShape;
- void ProcessShapeOptions(Value const & val);
-
- css::uno::Reference<css::text::XTextContent>
- createGraphicObject(css::uno::Reference<css::graphic::XGraphic> const & rxGraphic,
- css::uno::Reference<css::beans::XPropertySet> const & xShapeProps);
-
- void putPropertyToFrameGrabBag( const OUString& sPropertyName, const css::uno::Any& aPropertyValue );
-
-public:
- explicit GraphicImport( css::uno::Reference<css::uno::XComponentContext> xComponentContext,
- css::uno::Reference<css::lang::XMultiServiceFactory> xTextFactory,
- DomainMapper& rDomainMapper,
- GraphicImportType & rGraphicImportType,
- std::pair<OUString, OUString>& rPositionOffsets,
- std::pair<OUString, OUString>& rAligns,
- std::queue<OUString>& rPositivePercentages);
- virtual ~GraphicImport() override;
-
- // BinaryObj
- virtual void data(const sal_uInt8* buffer, size_t len) override;
-
- css::uno::Reference<css::text::XTextContent> GetGraphicObject();
- const css::uno::Reference<css::drawing::XShape>& GetXShapeObject() const { return m_xShape;}
- bool IsGraphic() const;
- sal_Int32 GetLeftMarginOrig() const;
-
- com::sun::star::awt::Point GetGraphicObjectPosition() const;
-
- bool GetLayoutInCell() const;
-
- private:
- // Properties
- virtual void lcl_attribute(Id Name, Value & val) override;
- virtual void lcl_sprm(Sprm & sprm) override;
-
- // Table
- virtual void lcl_entry(const writerfilter::Reference<Properties>::Pointer_t& ref) override;
-
- // Stream
- virtual void lcl_startSectionGroup() override;
- virtual void lcl_endSectionGroup() override;
- virtual void lcl_startParagraphGroup() override;
- virtual void lcl_endParagraphGroup() override;
- virtual void lcl_startCharacterGroup() override;
- virtual void lcl_endCharacterGroup() override;
- virtual void lcl_text(const sal_uInt8 * data, size_t len) override;
- virtual void lcl_utext(const sal_Unicode * data, size_t len) override;
- virtual void lcl_props(const writerfilter::Reference<Properties>::Pointer_t& ref) override;
- virtual void lcl_table(Id name,
- const writerfilter::Reference<Table>::Pointer_t& ref) override;
- virtual void lcl_substream(Id name, const writerfilter::Reference<Stream>::Pointer_t& ref) override;
- virtual void lcl_startShape(css::uno::Reference<css::drawing::XShape> const& xShape) override;
- virtual void lcl_startTextBoxContent() override {};
- virtual void lcl_endTextBoxContent() override {};
- virtual void lcl_endShape() override;
-
- void handleWrapTextValue(sal_uInt32 nVal);
- void lcl_expandRectangleByEffectExtent(css::awt::Point& rLeftTop, css::awt::Size& rSize);
- void lcl_correctWord2007EffectExtent(const sal_Int32 nMSOAngle);
-};
-
-typedef tools::SvRef<GraphicImport> GraphicImportPtr;
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/LatentStyleHandler.cxx b/writerfilter/source/dmapper/LatentStyleHandler.cxx
deleted file mode 100644
index bc381d21fe3e..000000000000
--- a/writerfilter/source/dmapper/LatentStyleHandler.cxx
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- 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 "LatentStyleHandler.hxx"
-#include "TagLogger.hxx"
-#include <ooxml/resourceids.hxx>
-
-namespace writerfilter::dmapper
-{
-using namespace ::com::sun::star;
-
-LatentStyleHandler::LatentStyleHandler()
- : LoggedProperties("LatentStyleHandler")
-{
-}
-
-LatentStyleHandler::~LatentStyleHandler() = default;
-
-void LatentStyleHandler::lcl_attribute(Id nId, Value& rVal)
-{
- beans::PropertyValue aValue;
- bool bFound = true;
- switch (nId)
- {
- case NS_ooxml::LN_CT_LsdException_name:
- aValue.Name = "name";
- break;
- case NS_ooxml::LN_CT_LsdException_locked:
- aValue.Name = "locked";
- break;
- case NS_ooxml::LN_CT_LsdException_uiPriority:
- aValue.Name = "uiPriority";
- break;
- case NS_ooxml::LN_CT_LsdException_semiHidden:
- aValue.Name = "semiHidden";
- break;
- case NS_ooxml::LN_CT_LsdException_unhideWhenUsed:
- aValue.Name = "unhideWhenUsed";
- break;
- case NS_ooxml::LN_CT_LsdException_qFormat:
- aValue.Name = "qFormat";
- break;
- default:
- bFound = false;
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- break;
- }
- if (bFound)
- {
- aValue.Value <<= rVal.getString();
- m_aAttributes.push_back(aValue);
- }
-}
-
-void LatentStyleHandler::lcl_sprm(Sprm& /*rSprm*/) {}
-
-const std::vector<beans::PropertyValue>& LatentStyleHandler::getAttributes() const
-{
- return m_aAttributes;
-}
-
-} // namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/LatentStyleHandler.hxx b/writerfilter/source/dmapper/LatentStyleHandler.hxx
deleted file mode 100644
index 52a4d9e7c318..000000000000
--- a/writerfilter/source/dmapper/LatentStyleHandler.hxx
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- 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/.
- */
-#pragma once
-
-#include "LoggedResources.hxx"
-#include <vector>
-#include <com/sun/star/beans/PropertyValue.hpp>
-
-namespace writerfilter::dmapper
-{
-/// Handler for a latent style (w:lsdException element)
-class LatentStyleHandler : public LoggedProperties
-{
- std::vector<css::beans::PropertyValue> m_aAttributes;
-
- // Properties
- void lcl_attribute(Id nId, Value& rVal) override;
- void lcl_sprm(Sprm& sprm) override;
-
-public:
- LatentStyleHandler();
- ~LatentStyleHandler() override;
-
- const std::vector<css::beans::PropertyValue>& getAttributes() const;
-};
-
-} // namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/LoggedResources.cxx b/writerfilter/source/dmapper/LoggedResources.cxx
deleted file mode 100644
index 05ebcd057532..000000000000
--- a/writerfilter/source/dmapper/LoggedResources.cxx
+++ /dev/null
@@ -1,401 +0,0 @@
-/* -*- 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/.
- *
- * 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 "LoggedResources.hxx"
-#include "TagLogger.hxx"
-#include <ooxml/QNameToString.hxx>
-#include <utility>
-
-using namespace ::com::sun::star;
-
-namespace writerfilter
-{
-#ifdef DBG_UTIL
-
-LoggedResourcesHelper::LoggedResourcesHelper(std::string sPrefix)
- : msPrefix(std::move(sPrefix))
-{
-}
-
-LoggedResourcesHelper::~LoggedResourcesHelper() {}
-
-void LoggedResourcesHelper::startElement(const std::string& sElement)
-{
- TagLogger::getInstance().startElement(msPrefix + "." + sElement);
-}
-
-void LoggedResourcesHelper::endElement() { TagLogger::getInstance().endElement(); }
-
-void LoggedResourcesHelper::chars(std::u16string_view rChars)
-{
- TagLogger::getInstance().chars(rChars);
-}
-
-void LoggedResourcesHelper::chars(const std::string& rChars)
-{
- TagLogger::getInstance().chars(rChars);
-}
-
-void LoggedResourcesHelper::attribute(const std::string& rName, const std::string& rValue)
-{
- TagLogger::getInstance().attribute(rName, rValue);
-}
-
-void LoggedResourcesHelper::attribute(const std::string& rName, sal_uInt32 nValue)
-{
- TagLogger::getInstance().attribute(rName, nValue);
-}
-
-#endif
-
-LoggedStream::LoggedStream(
-#ifdef DBG_UTIL
- const std::string& sPrefix)
- : mHelper(sPrefix)
-#else
- const std::string&)
-#endif
-{
-}
-
-LoggedStream::~LoggedStream() {}
-
-void LoggedStream::startSectionGroup()
-{
-#ifdef DBG_UTIL
- mHelper.startElement("section");
-#endif
-
- lcl_startSectionGroup();
-}
-
-void LoggedStream::endSectionGroup()
-{
- lcl_endSectionGroup();
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::startParagraphGroup()
-{
-#ifdef DBG_UTIL
- mHelper.startElement("paragraph");
-#endif
-
- lcl_startParagraphGroup();
-}
-
-void LoggedStream::endParagraphGroup()
-{
- lcl_endParagraphGroup();
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::startCharacterGroup()
-{
-#ifdef DBG_UTIL
- mHelper.startElement("charactergroup");
-#endif
-
- lcl_startCharacterGroup();
-}
-
-void LoggedStream::endCharacterGroup()
-{
- lcl_endCharacterGroup();
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::startShape(uno::Reference<drawing::XShape> const& xShape)
-{
-#ifdef DBG_UTIL
- mHelper.startElement("shape");
-#endif
-
- lcl_startShape(xShape);
-}
-
-void LoggedStream::endShape()
-{
- lcl_endShape();
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::startTextBoxContent() { lcl_startTextBoxContent(); }
-
-void LoggedStream::endTextBoxContent() { lcl_endTextBoxContent(); }
-
-void LoggedStream::text(const sal_uInt8* data, size_t len)
-{
-#ifdef DBG_UTIL
- mHelper.startElement("text");
-
- OUString sText(reinterpret_cast<const char*>(data), len, RTL_TEXTENCODING_MS_1252);
-
- mHelper.startElement("data");
- LoggedResourcesHelper::chars(sText);
- LoggedResourcesHelper::endElement();
-#endif
-
- lcl_text(data, len);
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::utext(const sal_Unicode* const data, size_t const len)
-{
-#ifdef DBG_UTIL
- mHelper.startElement("utext");
- mHelper.startElement("data");
-
- OUString const sText(data, len);
-
- LoggedResourcesHelper::chars(sText);
-
- LoggedResourcesHelper::endElement();
-#endif
-
- lcl_utext(data, len);
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::positionOffset(const OUString& rText, bool bVertical)
-{
-#ifdef DBG_UTIL
- mHelper.startElement("positionOffset");
- LoggedResourcesHelper::attribute("vertical", static_cast<int>(bVertical));
- LoggedResourcesHelper::chars(rText);
-#endif
-
- lcl_positionOffset(rText, bVertical);
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::align(const OUString& rText, bool bVertical)
-{
-#ifdef DBG_UTIL
- mHelper.startElement("align");
- LoggedResourcesHelper::attribute("vertical", static_cast<int>(bVertical));
- LoggedResourcesHelper::chars(rText);
-#endif
-
- lcl_align(rText, bVertical);
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::positivePercentage(const OUString& rText)
-{
-#ifdef DBG_UTIL
- mHelper.startElement("positivePercentage");
- LoggedResourcesHelper::chars(rText);
-#endif
-
- lcl_positivePercentage(rText);
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::props(const writerfilter::Reference<Properties>::Pointer_t& ref)
-{
-#ifdef DBG_UTIL
- mHelper.startElement("props");
-#endif
-
- lcl_props(ref);
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::table(Id name, const writerfilter::Reference<Table>::Pointer_t& ref)
-{
-#ifdef DBG_UTIL
- mHelper.startElement("table");
- LoggedResourcesHelper::attribute("name", QNameToString(name));
-#endif
-
- lcl_table(name, ref);
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::substream(Id name, const writerfilter::Reference<Stream>::Pointer_t& ref)
-{
-#ifdef DBG_UTIL
- mHelper.startElement("substream");
- LoggedResourcesHelper::attribute("name", QNameToString(name));
-#endif
-
- lcl_substream(name, ref);
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::info(const std::string& _info)
-{
-#ifdef DBG_UTIL
- mHelper.startElement("info");
- LoggedResourcesHelper::attribute("text", _info);
-#else
- (void)_info;
-#endif
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::startGlossaryEntry()
-{
-#ifdef DBG_UTIL
- mHelper.startElement("startGlossaryEntry");
-#endif
-
- lcl_startGlossaryEntry();
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::endGlossaryEntry()
-{
-#ifdef DBG_UTIL
- mHelper.startElement("endGlossaryEntry");
-#endif
-
- lcl_endGlossaryEntry();
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-void LoggedStream::checkId(const sal_Int32 nId)
-{
-#ifdef DBG_UTIL
- mHelper.startElement("checkId");
- LoggedResourcesHelper::chars(OUString::number(nId));
-#endif
-
- lcl_checkId(nId);
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-LoggedProperties::LoggedProperties(
-#ifdef DBG_UTIL
- const std::string& sPrefix)
- : mHelper(sPrefix)
-#else
- const std::string&)
-#endif
-{
-}
-
-LoggedProperties::~LoggedProperties() {}
-
-void LoggedProperties::attribute(Id name, Value& val)
-{
-#ifdef DBG_UTIL
- mHelper.startElement("attribute");
- LoggedResourcesHelper::attribute("name", QNameToString(name));
- LoggedResourcesHelper::attribute("value", val.toString());
- LoggedResourcesHelper::endElement();
-#endif
-
- lcl_attribute(name, val);
-}
-
-void LoggedProperties::sprm(Sprm& rSprm)
-{
-#ifdef DBG_UTIL
- mHelper.startElement("sprm");
- LoggedResourcesHelper::attribute("name", QNameToString(rSprm.getId()));
- LoggedResourcesHelper::chars(rSprm.toString());
-#endif
-
- lcl_sprm(rSprm);
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-
-LoggedTable::LoggedTable(
-#ifdef DBG_UTIL
- const std::string& sPrefix)
- : mHelper(sPrefix)
-#else
- const std::string&)
-#endif
-{
-}
-
-LoggedTable::~LoggedTable() {}
-
-void LoggedTable::entry(int pos, writerfilter::Reference<Properties>::Pointer_t ref)
-{
-#ifdef DBG_UTIL
- mHelper.startElement("entry");
- LoggedResourcesHelper::attribute("pos", pos);
-#else
- (void)pos;
-#endif
-
- lcl_entry(ref);
-
-#ifdef DBG_UTIL
- LoggedResourcesHelper::endElement();
-#endif
-}
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/LoggedResources.hxx b/writerfilter/source/dmapper/LoggedResources.hxx
deleted file mode 100644
index c0927c9130c4..000000000000
--- a/writerfilter/source/dmapper/LoggedResources.hxx
+++ /dev/null
@@ -1,147 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include <sal/config.h>
-
-#include <string_view>
-
-#include <dmapper/resourcemodel.hxx>
-
-namespace writerfilter
-{
-#ifdef DBG_UTIL
-class LoggedResourcesHelper final
-{
-public:
- explicit LoggedResourcesHelper(std::string sPrefix);
- ~LoggedResourcesHelper();
-
- void startElement(const std::string& sElement);
- static void endElement();
- static void chars(std::u16string_view rChars);
- static void chars(const std::string& rChars);
- static void attribute(const std::string& rName, const std::string& rValue);
- static void attribute(const std::string& rName, sal_uInt32 nValue);
-
-private:
- std::string msPrefix;
-};
-#endif
-
-class LoggedStream : public Stream
-{
-public:
- explicit LoggedStream(const std::string& sPrefix);
- virtual ~LoggedStream() override;
-
- void startSectionGroup() override;
- void endSectionGroup() override;
- void startParagraphGroup() override;
- void endParagraphGroup() override;
- void startCharacterGroup() override;
- void endCharacterGroup() override;
- void startShape(css::uno::Reference<css::drawing::XShape> const& xShape) override;
- void endShape() override;
- void startTextBoxContent() override;
- void endTextBoxContent() override;
- void text(const sal_uInt8* data, size_t len) override;
- void utext(const sal_Unicode* data, size_t len) override;
- void positionOffset(const OUString& rText, bool bVertical) override;
- void align(const OUString& rText, bool bVertical) override;
- void positivePercentage(const OUString& rText) override;
- void props(const writerfilter::Reference<Properties>::Pointer_t& ref) override;
- void table(Id name, const writerfilter::Reference<Table>::Pointer_t& ref) override;
- void substream(Id name, const writerfilter::Reference<Stream>::Pointer_t& ref) override;
- void info(const std::string& info) override;
- void startGlossaryEntry() override;
- void endGlossaryEntry() override;
- void checkId(const sal_Int32 nId) override;
-
- virtual void setDocumentReference(writerfilter::ooxml::OOXMLDocument* /*pDocument*/) override{};
-
-protected:
- virtual void lcl_startSectionGroup() = 0;
- virtual void lcl_endSectionGroup() = 0;
- virtual void lcl_startParagraphGroup() = 0;
- virtual void lcl_endParagraphGroup() = 0;
- virtual void lcl_startCharacterGroup() = 0;
- virtual void lcl_endCharacterGroup() = 0;
- virtual void lcl_startShape(css::uno::Reference<css::drawing::XShape> const& xShape) = 0;
- virtual void lcl_endShape() = 0;
- virtual void lcl_startTextBoxContent() = 0;
- virtual void lcl_endTextBoxContent() = 0;
- virtual void lcl_text(const sal_uInt8* data, size_t len) = 0;
- virtual void lcl_utext(const sal_Unicode* data, size_t len) = 0;
- virtual void lcl_positionOffset(const OUString& /*rText*/, bool /*bVertical*/) {}
- virtual css::awt::Point getPositionOffset() override { return css::awt::Point(); }
- virtual void lcl_align(const OUString& /*rText*/, bool /*bVertical*/) {}
- virtual void lcl_positivePercentage(const OUString& /*rText*/) {}
- virtual void lcl_props(const writerfilter::Reference<Properties>::Pointer_t& ref) = 0;
- virtual void lcl_table(Id name, const writerfilter::Reference<Table>::Pointer_t& ref) = 0;
- virtual void lcl_substream(Id name, const writerfilter::Reference<Stream>::Pointer_t& ref) = 0;
- virtual void lcl_startGlossaryEntry() {}
- virtual void lcl_endGlossaryEntry() {}
- virtual void lcl_checkId(const sal_Int32) {}
-
-private:
-#ifdef DBG_UTIL
- LoggedResourcesHelper mHelper;
-#endif
-};
-
-class LoggedProperties : public Properties
-{
-public:
- explicit LoggedProperties(const std::string& sPrefix);
- virtual ~LoggedProperties() override;
-
- void attribute(Id name, Value& val) override;
- void sprm(Sprm& sprm) override;
-
-protected:
- virtual void lcl_attribute(Id name, Value& val) = 0;
- virtual void lcl_sprm(Sprm& sprm) = 0;
-
-private:
-#ifdef DBG_UTIL
- LoggedResourcesHelper mHelper;
-#endif
-};
-
-class LoggedTable : public Table
-{
-public:
- explicit LoggedTable(const std::string& sPrefix);
- virtual ~LoggedTable() override;
-
- void entry(int pos, writerfilter::Reference<Properties>::Pointer_t ref) override;
-
-protected:
- virtual void lcl_entry(const writerfilter::Reference<Properties>::Pointer_t& ref) = 0;
-
-private:
-#ifdef DBG_UTIL
- LoggedResourcesHelper mHelper;
-#endif
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/MeasureHandler.cxx b/writerfilter/source/dmapper/MeasureHandler.cxx
deleted file mode 100644
index 5eea9a5c613b..000000000000
--- a/writerfilter/source/dmapper/MeasureHandler.cxx
+++ /dev/null
@@ -1,136 +0,0 @@
-/* -*- 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/.
- *
- * 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 "MeasureHandler.hxx"
-#include "ConversionHelper.hxx"
-#include <ooxml/resourceids.hxx>
-#include <osl/diagnose.h>
-#include <com/sun/star/text/SizeType.hpp>
-#include <comphelper/sequence.hxx>
-
-namespace writerfilter::dmapper {
-
-using namespace ::com::sun::star;
-
-
-MeasureHandler::MeasureHandler() :
-LoggedProperties("MeasureHandler"),
-m_nMeasureValue( 0 ),
-m_nUnit( -1 ),
-m_nRowHeightSizeType( text::SizeType::MIN )
-{
-}
-
-
-MeasureHandler::~MeasureHandler()
-{
-}
-
-
-void MeasureHandler::lcl_attribute(Id rName, Value & rVal)
-{
- sal_Int32 nIntValue = rVal.getInt();
- switch( rName )
- {
- case NS_ooxml::LN_CT_TblWidth_type:
- {
- //can be: NS_ooxml::LN_Value_ST_TblWidth_nil, NS_ooxml::LN_Value_ST_TblWidth_pct,
- // NS_ooxml::LN_Value_ST_TblWidth_dxa, NS_ooxml::LN_Value_ST_TblWidth_auto;
- m_nUnit = nIntValue;
-
- if (!m_aInteropGrabBagName.isEmpty())
- {
- beans::PropertyValue aValue;
- aValue.Name = "type";
- switch (nIntValue)
- {
- case NS_ooxml::LN_Value_ST_TblWidth_nil: aValue.Value <<= OUString("nil"); break;
- case NS_ooxml::LN_Value_ST_TblWidth_pct: aValue.Value <<= OUString("pct"); break;
- case NS_ooxml::LN_Value_ST_TblWidth_dxa: aValue.Value <<= OUString("dxa"); break;
- case NS_ooxml::LN_Value_ST_TblWidth_auto: aValue.Value <<= OUString("auto"); break;
- }
- m_aInteropGrabBag.push_back(aValue);
- }
- }
- break;
- case NS_ooxml::LN_CT_Height_hRule:
- {
- OUString sHeightType = rVal.getString();
- if ( sHeightType == "exact" )
- m_nRowHeightSizeType = text::SizeType::FIX;
- }
- break;
- case NS_ooxml::LN_CT_TblWidth_w:
- m_nMeasureValue = nIntValue;
- if (!m_aInteropGrabBagName.isEmpty())
- {
- beans::PropertyValue aValue;
- aValue.Name = "w";
- aValue.Value <<= nIntValue;
- m_aInteropGrabBag.push_back(aValue);
- }
- break;
- case NS_ooxml::LN_CT_Height_val: // a string value
- {
- m_nUnit = NS_ooxml::LN_Value_ST_TblWidth_dxa;
- OUString sHeight = rVal.getString();
- m_nMeasureValue = sHeight.toInt32();
- }
- break;
- default:
- OSL_FAIL( "unknown attribute");
- }
-}
-
-
-void MeasureHandler::lcl_sprm(Sprm &) {}
-
-
-sal_Int32 MeasureHandler::getMeasureValue() const
-{
- sal_Int32 nRet = 0;
- if( m_nMeasureValue != 0 && m_nUnit >= 0 )
- {
- // TODO m_nUnit 3 - twip, other values unknown :-(
- if( m_nUnit == 3 || sal::static_int_cast<Id>(m_nUnit) == NS_ooxml::LN_Value_ST_TblWidth_dxa)
- {
- nRet = ConversionHelper::convertTwipToMM100( m_nMeasureValue );
- }
- //todo: handle additional width types:
- //NS_ooxml::LN_Value_ST_TblWidth_nil, NS_ooxml::LN_Value_ST_TblWidth_pct,
- //NS_ooxml::LN_Value_ST_TblWidth_dxa, NS_ooxml::LN_Value_ST_TblWidth_auto;
- }
- return nRet;
-}
-
-void MeasureHandler::enableInteropGrabBag(const OUString& aName)
-{
- m_aInteropGrabBagName = aName;
-}
-
-beans::PropertyValue MeasureHandler::getInteropGrabBag()
-{
- beans::PropertyValue aRet;
- aRet.Name = m_aInteropGrabBagName;
- aRet.Value <<= comphelper::containerToSequence(m_aInteropGrabBag);
- return aRet;
-}
-
-} //namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/MeasureHandler.hxx b/writerfilter/source/dmapper/MeasureHandler.hxx
deleted file mode 100644
index 8a6f9639eec5..000000000000
--- a/writerfilter/source/dmapper/MeasureHandler.hxx
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include "LoggedResources.hxx"
-#include <vector>
-#include <com/sun/star/beans/PropertyValue.hpp>
-
-namespace writerfilter::dmapper
-{
-/** Handler for sprms that contain a measure and a unit
- - Left indent of tables
- - Preferred width of tables
- */
-class MeasureHandler : public LoggedProperties
-{
- sal_Int32 m_nMeasureValue;
- sal_Int32 m_nUnit;
- sal_Int16 m_nRowHeightSizeType; //table row height type
-
- OUString m_aInteropGrabBagName;
- std::vector<css::beans::PropertyValue> m_aInteropGrabBag;
-
- // Properties
- virtual void lcl_attribute(Id Name, Value& val) override;
- virtual void lcl_sprm(Sprm& sprm) override;
-
-public:
- MeasureHandler();
- virtual ~MeasureHandler() override;
-
- sal_Int32 getMeasureValue() const;
-
- sal_Int32 getValue() const { return m_nMeasureValue; }
- sal_Int32 getUnit() const { return m_nUnit; }
-
- sal_Int16 GetRowHeightSizeType() const { return m_nRowHeightSizeType; }
- void enableInteropGrabBag(const OUString& aName);
- css::beans::PropertyValue getInteropGrabBag();
-};
-typedef tools::SvRef<MeasureHandler> MeasureHandlerPtr;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/ModelEventListener.cxx b/writerfilter/source/dmapper/ModelEventListener.cxx
deleted file mode 100644
index 4df26105a37c..000000000000
--- a/writerfilter/source/dmapper/ModelEventListener.cxx
+++ /dev/null
@@ -1,117 +0,0 @@
-/* -*- 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/.
- *
- * 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 "ModelEventListener.hxx"
-#include "PropertyIds.hxx"
-#include <rtl/ustring.hxx>
-#include <com/sun/star/document/XEventBroadcaster.hpp>
-#include <com/sun/star/text/XTextFieldsSupplier.hpp>
-#include <com/sun/star/util/XRefreshable.hpp>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/text/ReferenceFieldPart.hpp>
-#include <com/sun/star/text/ReferenceFieldSource.hpp>
-#include <com/sun/star/frame/XModel.hpp>
-#include <com/sun/star/view/XFormLayerAccess.hpp>
-#include <comphelper/diagnose_ex.hxx>
-
-namespace writerfilter::dmapper {
-
-using namespace ::com::sun::star;
-
-
-ModelEventListener::ModelEventListener(bool bIndexes, bool bControls)
- : m_bIndexes(bIndexes),
- m_bControls(bControls)
-{
-}
-
-
-ModelEventListener::~ModelEventListener()
-{
-}
-
-
-void ModelEventListener::notifyEvent( const document::EventObject& rEvent )
-{
- if ( rEvent.EventName == "OnFocus" && m_bIndexes)
- {
- try
- {
- //remove listener
- uno::Reference<document::XEventBroadcaster>(rEvent.Source, uno::UNO_QUERY_THROW )->removeEventListener(
- uno::Reference<document::XEventListener>(this));
-
- // If we have PAGEREF fields, update fields as well.
- uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(rEvent.Source, uno::UNO_QUERY);
- uno::Reference<container::XEnumeration> xEnumeration = xTextFieldsSupplier->getTextFields()->createEnumeration();
- sal_Int32 nIndex = 0;
- while(xEnumeration->hasMoreElements())
- {
- try
- {
- uno::Reference<beans::XPropertySet> xPropertySet(xEnumeration->nextElement(), uno::UNO_QUERY);
- sal_Int16 nSource = 0;
- xPropertySet->getPropertyValue(getPropertyName(PROP_REFERENCE_FIELD_SOURCE)) >>= nSource;
- sal_Int16 nPart = 0;
- xPropertySet->getPropertyValue(getPropertyName(PROP_REFERENCE_FIELD_PART)) >>= nPart;
- if (nSource == text::ReferenceFieldSource::BOOKMARK && nPart == text::ReferenceFieldPart::PAGE)
- ++nIndex;
- }
- catch( const beans::UnknownPropertyException& )
- {
- // doesn't even have such a property? ignore
- }
- }
- if (nIndex)
- {
- uno::Reference<util::XRefreshable> xRefreshable(xTextFieldsSupplier->getTextFields(), uno::UNO_QUERY);
- xRefreshable->refresh();
- }
- }
- catch( const uno::Exception& )
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter", "exception while updating indexes");
- }
- }
-
- if ( rEvent.EventName == "OnFocus" && m_bControls)
- {
-
- // Form design mode is enabled by default in Writer, not in Word.
- uno::Reference<frame::XModel> xModel(rEvent.Source, uno::UNO_QUERY);
- uno::Reference<view::XFormLayerAccess> xFormLayerAccess(xModel->getCurrentController(), uno::UNO_QUERY);
- xFormLayerAccess->setFormDesignMode(false);
- }
-}
-
-
-void ModelEventListener::disposing( const lang::EventObject& rEvent )
-{
- try
- {
- uno::Reference<document::XEventBroadcaster>(rEvent.Source, uno::UNO_QUERY_THROW )->removeEventListener(
- uno::Reference<document::XEventListener>(this));
- }
- catch( const uno::Exception& )
- {
- }
-}
-
-} //namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/ModelEventListener.hxx b/writerfilter/source/dmapper/ModelEventListener.hxx
deleted file mode 100644
index 47cd94b80a82..000000000000
--- a/writerfilter/source/dmapper/ModelEventListener.hxx
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <com/sun/star/document/XEventListener.hpp>
-#include <cppuhelper/implbase.hxx>
-
-namespace writerfilter::dmapper
-{
-class ModelEventListener : public cppu::WeakImplHelper<css::document::XEventListener>
-{
- bool m_bIndexes;
- bool m_bControls;
-
-public:
- ModelEventListener(bool bIndexes, bool bControls);
- virtual ~ModelEventListener() override;
-
- virtual void SAL_CALL notifyEvent(const css::document::EventObject& Event) override;
- virtual void SAL_CALL disposing(const css::lang::EventObject& Source) override;
-};
-} //namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/NumberingManager.cxx b/writerfilter/source/dmapper/NumberingManager.cxx
deleted file mode 100644
index ec8e1be07c7f..000000000000
--- a/writerfilter/source/dmapper/NumberingManager.cxx
+++ /dev/null
@@ -1,1213 +0,0 @@
-/* -*- 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/.
- *
- * 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 <sal/config.h>
-
-#include "ConversionHelper.hxx"
-#include "NumberingManager.hxx"
-#include "StyleSheetTable.hxx"
-#include "PropertyIds.hxx"
-
-#include <ooxml/resourceids.hxx>
-
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/container/XNameContainer.hpp>
-#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
-#include <com/sun/star/style/NumberingType.hpp>
-#include <com/sun/star/text/HoriOrientation.hpp>
-#include <com/sun/star/text/PositionAndSpaceMode.hpp>
-#include <com/sun/star/text/XChapterNumberingSupplier.hpp>
-#include <com/sun/star/graphic/XGraphic.hpp>
-#include <com/sun/star/awt/XBitmap.hpp>
-
-#include <osl/diagnose.h>
-#include <rtl/ustring.hxx>
-#include <sal/log.hxx>
-#include <comphelper/diagnose_ex.hxx>
-#include <tools/UnitConversion.hxx>
-#include <comphelper/sequence.hxx>
-#include <comphelper/propertyvalue.hxx>
-#include <comphelper/string.hxx>
-#include <regex>
-#include <utility>
-
-using namespace com::sun::star;
-
-namespace writerfilter::dmapper {
-
-//--------------------------------------------------- Utility functions
-template <typename T>
-static beans::PropertyValue lcl_makePropVal(PropertyIds nNameID, T const & aValue)
-{
- return comphelper::makePropertyValue(getPropertyName(nNameID), aValue);
-}
-
-static sal_Int32 lcl_findProperty( const uno::Sequence< beans::PropertyValue >& aProps, std::u16string_view sName )
-{
- sal_Int32 i = 0;
- sal_Int32 nLen = aProps.getLength( );
- sal_Int32 nPos = -1;
-
- while ( nPos == -1 && i < nLen )
- {
- if ( aProps[i].Name == sName )
- nPos = i;
- else
- i++;
- }
-
- return nPos;
-}
-
-static void lcl_mergeProperties( const uno::Sequence< beans::PropertyValue >& aSrc,
- uno::Sequence< beans::PropertyValue >& aDst )
-{
- for ( const auto& rProp : aSrc )
- {
- // Look for the same property in aDst
- sal_Int32 nPos = lcl_findProperty( aDst, rProp.Name );
- if ( nPos >= 0 )
- {
- // Replace the property value by the one in aSrc
- aDst.getArray()[nPos] = rProp;
- }
- else
- {
- // Simply add the new value
- aDst.realloc( aDst.getLength( ) + 1 );
- aDst.getArray()[ aDst.getLength( ) - 1 ] = rProp;
- }
- }
-}
-
-//-------------------------------------------- ListLevel implementation
-void ListLevel::SetValue( Id nId, sal_Int32 nValue )
-{
- switch( nId )
- {
- case NS_ooxml::LN_CT_Lvl_start:
- m_nIStartAt = nValue;
- break;
- case NS_ooxml::LN_CT_NumLvl_startOverride:
- m_nStartOverride = nValue;
- break;
- case NS_ooxml::LN_CT_NumFmt_val:
- m_nNFC = nValue;
- break;
- case NS_ooxml::LN_CT_Lvl_isLgl:
- m_bIsLegal = true;
- break;
- case NS_ooxml::LN_CT_Lvl_legacy:
- break;
- case NS_ooxml::LN_CT_Lvl_suff:
- m_nXChFollow = nValue;
- break;
- case NS_ooxml::LN_CT_TabStop_pos:
- if (nValue < 0)
- {
- SAL_INFO("writerfilter",
- "unsupported list tab stop position " << nValue);
- }
- else
- m_nTabstop = nValue;
- break;
- default:
- OSL_FAIL( "this line should never be reached");
- }
- m_bHasValues = true;
-}
-
-void ListLevel::SetCustomNumberFormat(const OUString& rValue) { m_aCustomNumberFormat = rValue; }
-
-sal_Int16 ListLevel::GetNumberingType(sal_Int16 nDefault) const
-{
- return ConversionHelper::ConvertNumberingType(m_nNFC, nDefault);
-}
-
-bool ListLevel::HasValues() const
-{
- return m_bHasValues;
-}
-
-void ListLevel::SetParaStyle( const tools::SvRef< StyleSheetEntry >& pStyle )
-{
- if (!pStyle)
- return;
- m_pParaStyle = pStyle;
-}
-
-uno::Sequence<beans::PropertyValue> ListLevel::GetProperties(bool bDefaults)
-{
- uno::Sequence<beans::PropertyValue> aLevelProps = GetLevelProperties(bDefaults);
- if (m_pParaStyle)
- AddParaProperties( &aLevelProps );
- return aLevelProps;
-}
-
-static bool IgnoreForCharStyle(std::u16string_view aStr, const bool bIsSymbol)
-{
- //Names found in PropertyIds.cxx, Lines 56-396
- return (aStr==u"Adjust" || aStr==u"IndentAt" || aStr==u"FirstLineIndent"
- || aStr==u"FirstLineOffset" || aStr==u"LeftMargin"
- // We need font names when they are different for the bullet and for the text.
- // But leave symbols alone, we only want to keep the font style for letters and numbers.
- || (bIsSymbol && aStr==u"CharFontName")
- );
-}
-uno::Sequence< beans::PropertyValue > ListLevel::GetCharStyleProperties( )
-{
- PropertyValueVector_t rProperties;
-
- const uno::Sequence< beans::PropertyValue > vPropVals = PropertyMap::GetPropertyValues();
- const bool bIsSymbol(GetBulletChar().getLength() <= 1);
- for( const auto& rPropNal : vPropVals )
- if (! IgnoreForCharStyle(rPropNal.Name, bIsSymbol))
- rProperties.emplace_back(rPropNal.Name, 0, rPropNal.Value, beans::PropertyState_DIRECT_VALUE);
-
- return comphelper::containerToSequence(rProperties);
-}
-
-uno::Sequence<beans::PropertyValue> ListLevel::GetLevelProperties(bool bDefaults)
-{
- std::vector<beans::PropertyValue> aNumberingProperties;
-
- if (m_nIStartAt >= 0)
- aNumberingProperties.push_back(lcl_makePropVal<sal_Int16>(PROP_START_WITH, m_nIStartAt) );
- else if (bDefaults)
- aNumberingProperties.push_back(lcl_makePropVal<sal_Int16>(PROP_START_WITH, 0));
-
- sal_Int16 nNumberFormat = -1;
- if (m_nNFC == NS_ooxml::LN_Value_ST_NumberFormat_custom)
- {
- nNumberFormat = ConversionHelper::ConvertCustomNumberFormat(m_aCustomNumberFormat);
- }
- else
- {
- nNumberFormat = ConversionHelper::ConvertNumberingType(m_nNFC);
- }
- if( m_nNFC >= 0)
- {
- if (m_xGraphicBitmap.is())
- nNumberFormat = style::NumberingType::BITMAP;
- aNumberingProperties.push_back(lcl_makePropVal(PROP_NUMBERING_TYPE, nNumberFormat));
- }
-
- // todo: this is not the bullet char
- if( nNumberFormat == style::NumberingType::CHAR_SPECIAL )
- {
- if (!GetBulletChar().isEmpty())
- {
- aNumberingProperties.push_back(lcl_makePropVal(PROP_BULLET_CHAR, m_sBulletChar->copy(0, 1)));
- }
- else
- {
- // If w:lvlText's value is null - set bullet char to zero.
- aNumberingProperties.push_back(lcl_makePropVal<sal_Unicode>(PROP_BULLET_CHAR, 0));
- }
- }
- if (m_xGraphicBitmap.is())
- {
- aNumberingProperties.push_back(lcl_makePropVal(PROP_GRAPHIC_BITMAP, m_xGraphicBitmap));
- aNumberingProperties.push_back(lcl_makePropVal(PROP_GRAPHIC_SIZE, m_aGraphicSize));
- }
-
- if (m_nTabstop.has_value())
- aNumberingProperties.push_back(lcl_makePropVal(PROP_LISTTAB_STOP_POSITION, *m_nTabstop));
- else if (bDefaults)
- aNumberingProperties.push_back(lcl_makePropVal<sal_Int16>(PROP_LISTTAB_STOP_POSITION, 0));
-
- //TODO: handling of nFLegal?
- //TODO: nFNoRestart lower levels do not restart when higher levels are incremented, like:
- //1.
- //1.1
- //2.2
- //2.3
- //3.4
-
-// TODO: sRGBXchNums; array of inherited numbers
-
-// nXChFollow; following character 0 - tab, 1 - space, 2 - nothing
- if (bDefaults || m_nXChFollow != SvxNumberFormat::LISTTAB)
- aNumberingProperties.push_back(lcl_makePropVal(PROP_LEVEL_FOLLOW, m_nXChFollow));
-
- PropertyIds const aReadIds[] =
- {
- PROP_ADJUST, PROP_INDENT_AT, PROP_FIRST_LINE_INDENT,
- PROP_FIRST_LINE_OFFSET, PROP_LEFT_MARGIN
- };
- for(PropertyIds const & rReadId : aReadIds) {
- std::optional<PropertyMap::Property> aProp = getProperty(rReadId);
- if (aProp)
- aNumberingProperties.emplace_back( getPropertyName(aProp->first), 0, aProp->second, beans::PropertyState_DIRECT_VALUE );
- else if (rReadId == PROP_FIRST_LINE_INDENT && bDefaults)
- // Writer default is -360 twips, Word default seems to be 0.
- aNumberingProperties.emplace_back("FirstLineIndent", 0, uno::Any(static_cast<sal_Int32>(0)), beans::PropertyState_DIRECT_VALUE);
- else if (rReadId == PROP_INDENT_AT && bDefaults)
- // Writer default is 720 twips, Word default seems to be 0.
- aNumberingProperties.emplace_back("IndentAt", 0,
- uno::Any(static_cast<sal_Int32>(0)),
- beans::PropertyState_DIRECT_VALUE);
- }
-
- std::optional<PropertyMap::Property> aPropFont = getProperty(PROP_CHAR_FONT_NAME);
- if (aPropFont)
- aNumberingProperties.emplace_back( getPropertyName(PROP_BULLET_FONT_NAME), 0, aPropFont->second, beans::PropertyState_DIRECT_VALUE );
-
- if (m_bIsLegal)
- aNumberingProperties.push_back(lcl_makePropVal(PROP_LEVEL_IS_LEGAL, true));
-
- return comphelper::containerToSequence(aNumberingProperties);
-}
-
-// Add the properties only if they do not already exist in the sequence.
-void ListLevel::AddParaProperties( uno::Sequence< beans::PropertyValue >* props )
-{
- uno::Sequence< beans::PropertyValue >& aProps = *props;
-
- const OUString & sFirstLineIndent = getPropertyName(
- PROP_FIRST_LINE_INDENT );
- const OUString & sIndentAt = getPropertyName(
- PROP_INDENT_AT );
-
- bool hasFirstLineIndent = lcl_findProperty( aProps, sFirstLineIndent );
- bool hasIndentAt = lcl_findProperty( aProps, sIndentAt );
-
- if( hasFirstLineIndent && hasIndentAt )
- return; // has them all, nothing to add
-
- const uno::Sequence< beans::PropertyValue > aParaProps = m_pParaStyle->m_pProperties->GetPropertyValues( );
-
- // ParaFirstLineIndent -> FirstLineIndent
- // ParaLeftMargin -> IndentAt
-
- const OUString & sParaIndent = getPropertyName(
- PROP_PARA_FIRST_LINE_INDENT );
- const OUString & sParaLeftMargin = getPropertyName(
- PROP_PARA_LEFT_MARGIN );
-
- for ( const auto& rParaProp : aParaProps )
- {
- if ( !hasFirstLineIndent && rParaProp.Name == sParaIndent )
- {
- aProps.realloc( aProps.getLength() + 1 );
- auto pProps = aProps.getArray();
- pProps[aProps.getLength( ) - 1] = rParaProp;
- pProps[aProps.getLength( ) - 1].Name = sFirstLineIndent;
- }
- else if ( !hasIndentAt && rParaProp.Name == sParaLeftMargin )
- {
- aProps.realloc( aProps.getLength() + 1 );
- auto pProps = aProps.getArray();
- pProps[aProps.getLength( ) - 1] = rParaProp;
- pProps[aProps.getLength( ) - 1].Name = sIndentAt;
- }
-
- }
-}
-
-NumPicBullet::NumPicBullet()
- : m_nId(0)
-{
-}
-
-NumPicBullet::~NumPicBullet()
-{
-}
-
-void NumPicBullet::SetId(sal_Int32 nId)
-{
- m_nId = nId;
-}
-
-void NumPicBullet::SetShape(uno::Reference<drawing::XShape> const& xShape)
-{
- m_xShape = xShape;
-}
-
-
-//--------------------------------------- AbstractListDef implementation
-
-AbstractListDef::AbstractListDef( ) :
- m_nId( -1 )
-{
-}
-
-AbstractListDef::~AbstractListDef( )
-{
-}
-
-void AbstractListDef::SetValue( sal_uInt32 nSprmId )
-{
- switch( nSprmId )
- {
- case NS_ooxml::LN_CT_AbstractNum_tmpl:
- break;
- default:
- OSL_FAIL( "this line should never be reached");
- }
-}
-
-ListLevel::Pointer AbstractListDef::GetLevel( sal_uInt16 nLvl )
-{
- ListLevel::Pointer pLevel;
- if ( m_aLevels.size( ) > nLvl )
- pLevel = m_aLevels[ nLvl ];
- return pLevel;
-}
-
-void AbstractListDef::AddLevel( sal_uInt16 nLvl )
-{
- if ( nLvl >= m_aLevels.size() )
- m_aLevels.resize( nLvl+1 );
-
- if (!m_aLevels[nLvl])
- {
- m_aLevels[nLvl] = new ListLevel;
- }
-
- m_pCurrentLevel = m_aLevels[nLvl];
-}
-
-uno::Sequence<uno::Sequence<beans::PropertyValue>> AbstractListDef::GetPropertyValues(bool bDefaults)
-{
- uno::Sequence< uno::Sequence< beans::PropertyValue > > result( sal_Int32( m_aLevels.size( ) ) );
- uno::Sequence< beans::PropertyValue >* aResult = result.getArray( );
-
- int nLevels = m_aLevels.size( );
- for ( int i = 0; i < nLevels; i++ )
- {
- if (m_aLevels[i])
- aResult[i] = m_aLevels[i]->GetProperties(bDefaults);
- }
-
- return result;
-}
-
-const OUString& AbstractListDef::MapListId(OUString const& rId)
-{
- if (!m_oListId)
- {
- m_oListId = rId;
- }
- return *m_oListId;
-}
-
-//---------------------------------------------- ListDef implementation
-
-ListDef::ListDef( )
-{
-}
-
-ListDef::~ListDef( )
-{
-}
-
-const OUString & ListDef::GetStyleName(sal_Int32 const nId,
- uno::Reference<container::XNameContainer> const& xStyles)
-{
- if (xStyles.is())
- {
- OUString sStyleName = "WWNum" + OUString::number( nId );
-
- while (xStyles->hasByName(sStyleName)) // unique
- {
- sStyleName += "a";
- }
-
- m_StyleName = sStyleName;
- }
- else
- {
-// fails in rtftok test assert(!m_StyleName.isEmpty()); // must be inited first
- }
-
- return m_StyleName;
-}
-
-uno::Sequence<uno::Sequence<beans::PropertyValue>> ListDef::GetMergedPropertyValues()
-{
- if (!m_pAbstractDef)
- return uno::Sequence< uno::Sequence< beans::PropertyValue > >();
-
- // [1] Call the same method on the abstract list
- uno::Sequence<uno::Sequence<beans::PropertyValue>> aAbstract
- = m_pAbstractDef->GetPropertyValues(/*bDefaults=*/true);
- auto aAbstractRange = asNonConstRange(aAbstract);
-
- // [2] Call the upper class method
- uno::Sequence<uno::Sequence<beans::PropertyValue>> aThis
- = AbstractListDef::GetPropertyValues(/*bDefaults=*/false);
-
- // Merge the results of [2] in [1]
- sal_Int32 nThisCount = aThis.getLength( );
- sal_Int32 nAbstractCount = aAbstract.getLength( );
- for ( sal_Int32 i = 0; i < nThisCount && i < nAbstractCount; i++ )
- {
- uno::Sequence< beans::PropertyValue > level = aThis[i];
- if (level.hasElements() && GetLevel(i)->HasValues())
- {
- // If the element contains something, merge it, but ignore stub overrides.
- lcl_mergeProperties( level, aAbstractRange[i] );
- }
- }
-
- return aAbstract;
-}
-
-static uno::Reference< container::XNameContainer > lcl_getUnoNumberingStyles(
- uno::Reference<lang::XMultiServiceFactory> const& xFactory)
-{
- uno::Reference< container::XNameContainer > xStyles;
-
- try
- {
- uno::Reference< style::XStyleFamiliesSupplier > xFamilies( xFactory, uno::UNO_QUERY_THROW );
- uno::Any oFamily = xFamilies->getStyleFamilies( )->getByName("NumberingStyles");
-
- oFamily >>= xStyles;
- }
- catch ( const uno::Exception & )
- {
- }
-
- return xStyles;
-}
-
-/// Rank the list in terms of suitability for becoming the Outline numbering rule in LO.
-sal_uInt16 ListDef::GetChapterNumberingWeight() const
-{
- sal_Int16 nWeight = 0;
- const sal_Int8 nAbstLevels = m_pAbstractDef ? m_pAbstractDef->Size() : 0;
- for (sal_Int8 nLevel = 0; nLevel < nAbstLevels; ++nLevel)
- {
- const ListLevel::Pointer pAbsLevel = m_pAbstractDef->GetLevel(nLevel);
- if (!pAbsLevel)
- continue;
- const StyleSheetEntryPtr pParaStyle = pAbsLevel->GetParaStyle();
- if (!pParaStyle)
- continue;
- const StyleSheetPropertyMap& rProps = *pParaStyle->m_pProperties;
- // In LO, the level's paraStyle outlineLevel always matches this listLevel.
- // An undefined listLevel is treated as the first level.
- sal_Int8 nListLevel = std::clamp<sal_Int8>(rProps.GetListLevel(), 0, 9);
- if (nListLevel != nLevel || rProps.GetOutlineLevel() != nLevel)
- return 0;
- else if (pAbsLevel->GetNumberingType(style::NumberingType::NUMBER_NONE)
- != style::NumberingType::NUMBER_NONE)
- {
- // Arbitrarily chosen weighting factors - trying to round-trip LO choices if possible.
- // LibreOffice always saves Outline rule (usually containing heading styles) as numId 1.
- sal_uInt16 nWeightingFactor = GetId() == 1 ? 8 : 1;
- if (pParaStyle->m_sStyleIdentifierD.startsWith("Heading") )
- ++nWeightingFactor;
- nWeight += nWeightingFactor;
- }
- }
- return nWeight;
-}
-
-void ListDef::CreateNumberingRules( DomainMapper& rDMapper,
- uno::Reference<lang::XMultiServiceFactory> const& xFactory, sal_Int16 nOutline)
-{
- // Get the UNO Numbering styles
- uno::Reference< container::XNameContainer > xStyles = lcl_getUnoNumberingStyles( xFactory );
-
- // Do the whole thing
- if( !(!m_xNumRules.is() && xFactory.is() && xStyles.is( )) )
- return;
-
- try
- {
- // Create the numbering style
- if (GetId() == nOutline)
- m_StyleName = "Outline"; //SwNumRule.GetOutlineRuleName()
- else
- xStyles->insertByName(
- GetStyleName(GetId(), xStyles),
- css::uno::Any(xFactory->createInstance("com.sun.star.style.NumberingStyle")));
-
- uno::Any oStyle = xStyles->getByName(GetStyleName());
- uno::Reference< beans::XPropertySet > xStyle( oStyle, uno::UNO_QUERY_THROW );
-
- // Get the default OOo Numbering style rules
- uno::Any aRules = xStyle->getPropertyValue( getPropertyName( PROP_NUMBERING_RULES ) );
- aRules >>= m_xNumRules;
-
- uno::Sequence<uno::Sequence<beans::PropertyValue>> aProps = GetMergedPropertyValues();
-
- sal_Int32 nAbstLevels = m_pAbstractDef ? m_pAbstractDef->Size() : 0;
- sal_Int32 nLevel = 0;
- while ( nLevel < nAbstLevels )
- {
- ListLevel::Pointer pAbsLevel = m_pAbstractDef->GetLevel( nLevel );
- ListLevel::Pointer pLevel = GetLevel( nLevel );
-
- // Get the merged level properties
- auto aLvlProps = comphelper::sequenceToContainer< std::vector<beans::PropertyValue> >(aProps[nLevel]);
-
- // Get the char style
- auto aAbsCharStyleProps = pAbsLevel
- ? pAbsLevel->GetCharStyleProperties()
- : uno::Sequence<beans::PropertyValue>();
- if ( pLevel )
- {
- uno::Sequence< beans::PropertyValue >& rAbsCharStyleProps = aAbsCharStyleProps;
- uno::Sequence< beans::PropertyValue > aCharStyleProps =
- pLevel->GetCharStyleProperties( );
- uno::Sequence< beans::PropertyValue >& rCharStyleProps = aCharStyleProps;
- lcl_mergeProperties( rAbsCharStyleProps, rCharStyleProps );
- }
-
- // Change the sequence into a vector
- auto aStyleProps
- = comphelper::sequenceToContainer<PropertyValueVector_t>(aAbsCharStyleProps);
-
- //create (or find) a character style containing the character
- // attributes of the symbol and apply it to the numbering level
- OUString sStyle = rDMapper.getOrCreateCharStyle(aStyleProps, /*bAlwaysCreate=*/true);
- aLvlProps.push_back(
- comphelper::makePropertyValue(getPropertyName(PROP_CHAR_STYLE_NAME), sStyle));
-
- OUString sText = pAbsLevel
- ? pAbsLevel->GetBulletChar()
- : OUString();
- // Inherit <w:lvlText> from the abstract level in case the override would be empty.
- if (pLevel && pLevel->HasBulletChar())
- sText = pLevel->GetBulletChar( );
-
- aLvlProps.push_back(comphelper::makePropertyValue(getPropertyName(PROP_LIST_FORMAT), sText));
-
- aLvlProps.push_back(comphelper::makePropertyValue(getPropertyName(PROP_POSITION_AND_SPACE_MODE), sal_Int16(text::PositionAndSpaceMode::LABEL_ALIGNMENT)));
-
- // Replace the numbering rules for the level
- m_xNumRules->replaceByIndex(nLevel, uno::Any(comphelper::containerToSequence(aLvlProps)));
-
- // Handle the outline level here
- if (GetId() == nOutline && pAbsLevel && pAbsLevel->GetParaStyle())
- {
- uno::Reference< text::XChapterNumberingSupplier > xOutlines (
- xFactory, uno::UNO_QUERY_THROW );
- uno::Reference< container::XIndexReplace > xOutlineRules =
- xOutlines->getChapterNumberingRules( );
-
- StyleSheetEntryPtr pParaStyle = pAbsLevel->GetParaStyle( );
- pParaStyle->m_bAssignedAsChapterNumbering = true;
- aLvlProps.push_back(comphelper::makePropertyValue(getPropertyName(PROP_HEADING_STYLE_NAME), pParaStyle->m_sConvertedStyleName));
-
- xOutlineRules->replaceByIndex(nLevel, uno::Any(comphelper::containerToSequence(aLvlProps)));
- }
-
- nLevel++;
- }
-
- // Create the numbering style for these rules
- const OUString & sNumRulesName = getPropertyName( PROP_NUMBERING_RULES );
- xStyle->setPropertyValue( sNumRulesName, uno::Any( m_xNumRules ) );
- }
- catch( const lang::IllegalArgumentException& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "" );
- assert( !"Incorrect argument to UNO call" );
- }
- catch( const uno::RuntimeException& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "" );
- assert( !"Incorrect argument to UNO call" );
- }
- catch( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "" );
- }
-
-}
-
-//------------------------------------- NumberingManager implementation
-
-
-ListsManager::ListsManager(DomainMapper& rDMapper,
- uno::Reference<lang::XMultiServiceFactory> xFactory)
- : LoggedProperties("ListsManager")
- , LoggedTable("ListsManager")
- , m_rDMapper(rDMapper)
- , m_xFactory(std::move(xFactory))
-{
-}
-
-ListsManager::~ListsManager( )
-{
- DisposeNumPicBullets();
-}
-
-void ListsManager::DisposeNumPicBullets( )
-{
- uno::Reference<drawing::XShape> xShape;
- for (const auto& rNumPicBullet : m_aNumPicBullets)
- {
- xShape = rNumPicBullet->GetShape();
- if (xShape.is())
- {
- uno::Reference<lang::XComponent> xShapeComponent(xShape, uno::UNO_QUERY);
- xShapeComponent->dispose();
- }
- }
-}
-
-void ListsManager::lcl_attribute( Id nName, Value& rVal )
-{
- ListLevel::Pointer pCurrentLvl;
-
- if (nName != NS_ooxml::LN_CT_NumPicBullet_numPicBulletId)
- {
- OSL_ENSURE( m_pCurrentDefinition, "current entry has to be set here");
- if(!m_pCurrentDefinition)
- return ;
- pCurrentLvl = m_pCurrentDefinition->GetCurrentLevel( );
- }
- else
- {
- SAL_WARN_IF(!m_pCurrentNumPicBullet, "writerfilter", "current entry has to be set here");
- if (!m_pCurrentNumPicBullet)
- return;
- }
- int nIntValue = rVal.getInt();
-
-
- switch(nName)
- {
- case NS_ooxml::LN_CT_LevelText_val:
- {
- if(pCurrentLvl)
- {
- //if the BulletChar is a soft-hyphen (0xad)
- //replace it with a hard-hyphen (0x2d)
- //-> this fixes missing hyphen export in PDF etc.
- // see tdf#101626
- std::string sLevelText( rVal.getString().replace(0xad, 0x2d).toUtf8() );
-
- // DOCX level-text contains levels definition in format "%1.%2.%3"
- // we need to convert it to LO internal representation: "%1%.%2%.%3%"
- static const std::regex aTokenRegex("(%\\d)");
- sLevelText = std::regex_replace(sLevelText, aTokenRegex, "$1%");
- pCurrentLvl->SetBulletChar( OUString::fromUtf8(sLevelText) );
- }
- }
- break;
- case NS_ooxml::LN_CT_Lvl_start:
- case NS_ooxml::LN_CT_Lvl_numFmt:
- case NS_ooxml::LN_CT_NumFmt_format:
- case NS_ooxml::LN_CT_NumFmt_val:
- case NS_ooxml::LN_CT_Lvl_isLgl:
- case NS_ooxml::LN_CT_Lvl_legacy:
- if ( pCurrentLvl )
- {
- if (nName == NS_ooxml::LN_CT_NumFmt_format)
- {
- pCurrentLvl->SetCustomNumberFormat(rVal.getString());
- }
- else
- {
- pCurrentLvl->SetValue(nName, sal_Int32(nIntValue));
- }
- }
- break;
- case NS_ooxml::LN_CT_Num_numId:
- m_pCurrentDefinition->SetId( rVal.getString().toInt32( ) );
- break;
- case NS_ooxml::LN_CT_AbstractNum_nsid:
- m_pCurrentDefinition->SetId( nIntValue );
- break;
- case NS_ooxml::LN_CT_AbstractNum_tmpl:
- AbstractListDef::SetValue( nName );
- break;
- case NS_ooxml::LN_CT_NumLvl_ilvl:
- //add a new level to the level vector and make it the current one
- m_pCurrentDefinition->AddLevel(rVal.getString().toUInt32());
- break;
- case NS_ooxml::LN_CT_Lvl_ilvl:
- m_pCurrentDefinition->AddLevel(rVal.getString().toUInt32());
- break;
- case NS_ooxml::LN_CT_AbstractNum_abstractNumId:
- {
- // This one corresponds to the AbstractNum Id definition
- // The reference to the abstract num is in the sprm method
- sal_Int32 nVal = rVal.getString().toInt32();
- m_pCurrentDefinition->SetId( nVal );
- }
- break;
- case NS_ooxml::LN_CT_Ind_start:
- case NS_ooxml::LN_CT_Ind_left:
- if ( pCurrentLvl )
- pCurrentLvl->Insert(
- PROP_INDENT_AT, uno::Any( ConversionHelper::convertTwipToMM100( nIntValue ) ));
- break;
- case NS_ooxml::LN_CT_Ind_hanging:
- if ( pCurrentLvl )
- pCurrentLvl->Insert(
- PROP_FIRST_LINE_INDENT, uno::Any( - ConversionHelper::convertTwipToMM100( nIntValue ) ));
- break;
- case NS_ooxml::LN_CT_Ind_firstLine:
- if ( pCurrentLvl )
- pCurrentLvl->Insert(
- PROP_FIRST_LINE_INDENT, uno::Any( ConversionHelper::convertTwipToMM100( nIntValue ) ));
- break;
- case NS_ooxml::LN_CT_Lvl_tplc: //template code - unsupported
- case NS_ooxml::LN_CT_Lvl_tentative: //marks level as unused in the document - unsupported
- break;
- case NS_ooxml::LN_CT_TabStop_pos:
- {
- //no paragraph attributes in ListTable char style sheets
- if ( pCurrentLvl )
- pCurrentLvl->SetValue( nName,
- ConversionHelper::convertTwipToMM100( nIntValue ) );
- }
- break;
- case NS_ooxml::LN_CT_TabStop_val:
- {
- // TODO Do something of that
- }
- break;
- case NS_ooxml::LN_CT_NumPicBullet_numPicBulletId:
- m_pCurrentNumPicBullet->SetId(rVal.getString().toInt32());
- break;
- default:
- SAL_WARN("writerfilter", "ListsManager::lcl_attribute: unhandled token: " << nName);
- }
-}
-
-void ListsManager::lcl_sprm( Sprm& rSprm )
-{
- //fill the attributes of the style sheet
- sal_uInt32 nSprmId = rSprm.getId();
- if( !(m_pCurrentDefinition ||
- nSprmId == NS_ooxml::LN_CT_Numbering_abstractNum ||
- nSprmId == NS_ooxml::LN_CT_Numbering_num ||
- (nSprmId == NS_ooxml::LN_CT_NumPicBullet_pict && m_pCurrentNumPicBullet) ||
- nSprmId == NS_ooxml::LN_CT_Numbering_numPicBullet))
- return;
-
- static bool bIsStartVisited = false;
- sal_Int32 nIntValue = rSprm.getValue()->getInt();
- switch( nSprmId )
- {
- case NS_ooxml::LN_CT_Numbering_abstractNum:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if(pProperties)
- {
- //create a new Abstract list entry
- OSL_ENSURE( !m_pCurrentDefinition, "current entry has to be NULL here");
- m_pCurrentDefinition = new AbstractListDef;
- pProperties->resolve( *this );
- //append it to the table
- m_aAbstractLists.push_back( m_pCurrentDefinition );
- m_pCurrentDefinition = AbstractListDef::Pointer();
- }
- }
- break;
- case NS_ooxml::LN_CT_Numbering_num:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if(pProperties)
- {
- // Create a new list entry
- OSL_ENSURE( !m_pCurrentDefinition, "current entry has to be NULL here");
- ListDef::Pointer listDef( new ListDef );
- m_pCurrentDefinition = listDef.get();
- pProperties->resolve( *this );
- //append it to the table
- m_aLists.push_back( listDef );
-
- m_pCurrentDefinition = AbstractListDef::Pointer();
- }
- }
- break;
- case NS_ooxml::LN_CT_Numbering_numPicBullet:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- NumPicBullet::Pointer numPicBullet(new NumPicBullet());
- m_pCurrentNumPicBullet = numPicBullet;
- pProperties->resolve(*this);
- m_aNumPicBullets.push_back(numPicBullet);
- m_pCurrentNumPicBullet = NumPicBullet::Pointer();
- }
- }
- break;
- case NS_ooxml::LN_CT_NumPicBullet_pict:
- {
- uno::Reference<drawing::XShape> xShape = m_rDMapper.PopPendingShape();
-
- m_pCurrentNumPicBullet->SetShape(xShape);
- }
- break;
- case NS_ooxml::LN_CT_Lvl_lvlPicBulletId:
- if (ListLevel::Pointer pCurrentLevel = m_pCurrentDefinition->GetCurrentLevel())
- {
- uno::Reference<drawing::XShape> xShape;
- for (const auto& rNumPicBullet : m_aNumPicBullets)
- {
- if (rNumPicBullet->GetId() == nIntValue)
- {
- xShape = rNumPicBullet->GetShape();
- break;
- }
- }
- if (xShape.is())
- {
- uno::Reference<beans::XPropertySet> xPropertySet(xShape, uno::UNO_QUERY);
- try
- {
- uno::Any aAny = xPropertySet->getPropertyValue("Graphic");
- if (aAny.has<uno::Reference<graphic::XGraphic>>() && pCurrentLevel)
- {
- auto xGraphic = aAny.get<uno::Reference<graphic::XGraphic>>();
- if (xGraphic.is())
- {
- uno::Reference<awt::XBitmap> xBitmap(xGraphic, uno::UNO_QUERY);
- pCurrentLevel->SetGraphicBitmap(xBitmap);
- }
- }
- }
- catch (const beans::UnknownPropertyException&)
- {}
-
- // Respect only the aspect ratio of the picture, not its size.
- awt::Size aPrefSize = xShape->getSize();
- if ( aPrefSize.Height * aPrefSize.Width != 0 )
- {
- // See SwDefBulletConfig::InitFont(), default height is 14.
- const int nFontHeight = 14;
- // Point -> mm100.
- const int nHeight = nFontHeight * 35;
- int nWidth = (nHeight * aPrefSize.Width) / aPrefSize.Height;
-
- awt::Size aSize( o3tl::toTwips(nWidth, o3tl::Length::mm100), o3tl::toTwips(nHeight, o3tl::Length::mm100) );
- pCurrentLevel->SetGraphicSize( aSize );
- }
- else
- {
- awt::Size aSize( o3tl::toTwips(aPrefSize.Width, o3tl::Length::mm100), o3tl::toTwips(aPrefSize.Height, o3tl::Length::mm100) );
- pCurrentLevel->SetGraphicSize( aSize );
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_Num_abstractNumId:
- {
- sal_Int32 nAbstractNumId = rSprm.getValue()->getInt();
- ListDef* pListDef = dynamic_cast< ListDef* >( m_pCurrentDefinition.get( ) );
- if ( pListDef != nullptr )
- {
- // The current def should be a ListDef
- pListDef->SetAbstractDefinition(
- GetAbstractList( nAbstractNumId ) );
- }
- }
- break;
- case NS_ooxml::LN_CT_AbstractNum_multiLevelType:
- break;
- case NS_ooxml::LN_CT_AbstractNum_tmpl:
- AbstractListDef::SetValue( nSprmId );
- break;
- case NS_ooxml::LN_CT_AbstractNum_lvl:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if(pProperties)
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_CT_Lvl_start:
- if (ListLevel::Pointer pCurrentLevel = m_pCurrentDefinition->GetCurrentLevel())
- pCurrentLevel->SetValue( nSprmId, nIntValue );
- bIsStartVisited = true;
- break;
- case NS_ooxml::LN_CT_Lvl_numFmt:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- pProperties->resolve(*this);
- }
- if (ListLevel::Pointer pCurrentLevel = m_pCurrentDefinition->GetCurrentLevel())
- {
- if( !bIsStartVisited )
- {
- pCurrentLevel->SetValue( NS_ooxml::LN_CT_Lvl_start, 0 );
- bIsStartVisited = true;
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_Lvl_isLgl:
- case NS_ooxml::LN_CT_Lvl_legacy:
- if (ListLevel::Pointer pCurrentLevel = m_pCurrentDefinition->GetCurrentLevel())
- {
- pCurrentLevel->SetValue(nSprmId, nIntValue);
- }
- break;
- case NS_ooxml::LN_CT_Lvl_suff:
- {
- if (ListLevel::Pointer pCurrentLevel = m_pCurrentDefinition->GetCurrentLevel())
- {
- SvxNumberFormat::LabelFollowedBy value = SvxNumberFormat::LISTTAB;
- if( rSprm.getValue()->getString() == "tab" )
- value = SvxNumberFormat::LISTTAB;
- else if( rSprm.getValue()->getString() == "space" )
- value = SvxNumberFormat::SPACE;
- else if( rSprm.getValue()->getString() == "nothing" )
- value = SvxNumberFormat::NOTHING;
- else
- SAL_WARN( "writerfilter", "Unknown ST_LevelSuffix value "
- << rSprm.getValue()->getString());
- pCurrentLevel->SetValue( nSprmId, value );
- }
- }
- break;
- case NS_ooxml::LN_CT_Lvl_lvlText:
- case NS_ooxml::LN_CT_Lvl_rPr : //contains LN_EG_RPrBase_rFonts
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if(pProperties)
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_CT_NumLvl_lvl:
- {
- // overwrite level
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if(pProperties)
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_CT_Lvl_lvlJc:
- {
- sal_Int16 nValue = text::HoriOrientation::NONE;
- switch (nIntValue)
- {
- case NS_ooxml::LN_Value_ST_Jc_left:
- case NS_ooxml::LN_Value_ST_Jc_start:
- nValue = text::HoriOrientation::LEFT;
- break;
- case NS_ooxml::LN_Value_ST_Jc_center:
- nValue = text::HoriOrientation::CENTER;
- break;
- case NS_ooxml::LN_Value_ST_Jc_right:
- case NS_ooxml::LN_Value_ST_Jc_end:
- nValue = text::HoriOrientation::RIGHT;
- break;
- }
-
- if (nValue != text::HoriOrientation::NONE)
- {
- if (ListLevel::Pointer pLevel = m_pCurrentDefinition->GetCurrentLevel())
- {
- pLevel->Insert(
- PROP_ADJUST, uno::Any( nValue ) );
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_Lvl_pPr:
- case NS_ooxml::LN_CT_PPrBase_ind:
- {
- //todo: how to handle paragraph properties within numbering levels (except LeftIndent and FirstLineIndent)?
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if(pProperties)
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_CT_PPrBase_tabs:
- case NS_ooxml::LN_CT_Tabs_tab:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if(pProperties)
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_CT_Lvl_pStyle:
- {
- OUString sStyleName = rSprm.getValue( )->getString( );
- if (ListLevel::Pointer pLevel = m_pCurrentDefinition->GetCurrentLevel())
- {
- StyleSheetTablePtr pStylesTable = m_rDMapper.GetStyleSheetTable( );
- const StyleSheetEntryPtr pStyle = pStylesTable->FindStyleSheetByISTD( sStyleName );
- pLevel->SetParaStyle( pStyle );
- }
- }
- break;
- case NS_ooxml::LN_CT_Num_lvlOverride:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_CT_NumLvl_startOverride:
- {
- if(m_pCurrentDefinition)
- {
- if (ListLevel::Pointer pCurrentLevel = m_pCurrentDefinition->GetCurrentLevel())
- {
- pCurrentLevel->SetValue(NS_ooxml::LN_CT_NumLvl_startOverride, nIntValue);
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_AbstractNum_numStyleLink:
- {
- OUString sStyleName = rSprm.getValue( )->getString( );
- m_pCurrentDefinition->SetNumStyleLink(sStyleName);
- }
- break;
- case NS_ooxml::LN_CT_AbstractNum_styleLink:
- {
- OUString sStyleName = rSprm.getValue()->getString();
- m_pCurrentDefinition->SetStyleLink(sStyleName);
- }
- break;
- case NS_ooxml::LN_EG_RPrBase_rFonts: //contains font properties
- case NS_ooxml::LN_EG_RPrBase_color:
- case NS_ooxml::LN_EG_RPrBase_u:
- case NS_ooxml::LN_EG_RPrBase_sz:
- case NS_ooxml::LN_EG_RPrBase_lang:
- case NS_ooxml::LN_EG_RPrBase_eastAsianLayout:
- //no break!
- default:
- if (ListLevel::Pointer pCurrentLevel = m_pCurrentDefinition->GetCurrentLevel())
- {
- m_rDMapper.PushListProperties(pCurrentLevel.get());
- m_rDMapper.sprm( rSprm );
- m_rDMapper.PopListProperties();
- }
- }
-}
-
-void ListsManager::lcl_entry(const writerfilter::Reference<Properties>::Pointer_t& ref)
-{
- if( m_rDMapper.IsOOXMLImport() || m_rDMapper.IsRTFImport() )
- {
- ref->resolve(*this);
- }
- else
- {
- // Create AbstractListDef's
- OSL_ENSURE( !m_pCurrentDefinition, "current entry has to be NULL here");
- m_pCurrentDefinition = new AbstractListDef( );
- ref->resolve(*this);
- //append it to the table
- m_aAbstractLists.push_back( m_pCurrentDefinition );
- m_pCurrentDefinition = AbstractListDef::Pointer();
- }
-}
-
-AbstractListDef::Pointer ListsManager::GetAbstractList( sal_Int32 nId )
-{
- for (const auto& listDef : m_aAbstractLists)
- {
- if (listDef->GetId( ) == nId)
- {
- if (listDef->GetNumStyleLink().getLength() > 0)
- {
- // If the abstract num has a style linked, check the linked style's number id.
- StyleSheetTablePtr pStylesTable = m_rDMapper.GetStyleSheetTable( );
-
- const StyleSheetEntryPtr pStyleSheetEntry =
- pStylesTable->FindStyleSheetByISTD(listDef->GetNumStyleLink() );
-
- const StyleSheetPropertyMap* pStyleSheetProperties =
- pStyleSheetEntry ? pStyleSheetEntry->m_pProperties.get() : nullptr;
-
- if( pStyleSheetProperties && pStyleSheetProperties->props().GetListId() >= 0 )
- {
- ListDef::Pointer pList = GetList( pStyleSheetProperties->props().GetListId() );
- if ( pList!=nullptr )
- return pList->GetAbstractDefinition();
- }
-
- // In stylesheet we did not found anything useful. Try to find base abstractnum having this stylelink
- for (const auto & baseListDef : m_aAbstractLists)
- {
- if (baseListDef->GetStyleLink() == listDef->GetNumStyleLink())
- {
- return baseListDef;
- }
- }
- }
-
- // Standalone abstract list
- return listDef;
- }
- }
-
- return nullptr;
-}
-
-ListDef::Pointer ListsManager::GetList( sal_Int32 nId )
-{
- ListDef::Pointer pList;
- if (nId == -1)
- return pList;
-
- int nLen = m_aLists.size( );
- int i = 0;
- while ( !pList && i < nLen )
- {
- if ( m_aLists[i]->GetId( ) == nId )
- pList = m_aLists[i];
- i++;
- }
-
- // nId 0 is only valid for abstractNum, not numId (which has an abstract definition)
- assert(!pList || nId || !pList->GetAbstractDefinition() || m_rDMapper.IsRTFImport());
-
- return pList;
-}
-
-void ListsManager::CreateNumberingRules( )
-{
- // Try to determine which numId would best work as LO's Chapter Numbering Outline rule.
- // (The best fix for many import bugs is just to prevent ANY assignment as chapter numbering.)
- sal_Int16 nChosenAsChapterNumberingId = -1;
- sal_uInt16 nHighestWeight = 5; // arbitrarily chosen minimum threshold
- for (const auto& rList : m_aLists)
- {
- sal_uInt16 nWeight = rList->GetChapterNumberingWeight();
- if (nWeight > nHighestWeight)
- {
- nHighestWeight = nWeight;
- nChosenAsChapterNumberingId = rList->GetId();
- //Optimization: if the weight cannot be beaten anymore, then quit early
- if (nHighestWeight > 17)
- break;
- }
- }
-
- // Loop over the definitions
- for ( const auto& rList : m_aLists )
- {
- rList->CreateNumberingRules(m_rDMapper, m_xFactory, nChosenAsChapterNumberingId);
- }
- m_rDMapper.GetStyleSheetTable()->ReApplyInheritedOutlineLevelFromChapterNumbering();
- m_rDMapper.GetStyleSheetTable()->ApplyNumberingStyleNameToParaStyles();
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/NumberingManager.hxx b/writerfilter/source/dmapper/NumberingManager.hxx
deleted file mode 100644
index 64156ba60ceb..000000000000
--- a/writerfilter/source/dmapper/NumberingManager.hxx
+++ /dev/null
@@ -1,251 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include "PropertyMap.hxx"
-
-#include "DomainMapper.hxx"
-#include "LoggedResources.hxx"
-#include "StyleSheetTable.hxx"
-
-#include <editeng/numitem.hxx>
-
-#include <com/sun/star/container/XIndexReplace.hpp>
-#include <com/sun/star/awt/XBitmap.hpp>
-
-namespace writerfilter::dmapper {
-
-class DomainMapper;
-class StyleSheetEntry;
-
-
-/** Class representing the numbering level properties.
- */
-class ListLevel : public PropertyMap
-{
- sal_Int32 m_nIStartAt; //LN_CT_Lvl_start
- sal_Int32 m_nStartOverride;
- sal_Int32 m_nNFC; //LN_CT_Lvl_numFmt
- /// LN_CT_NumFmt_format, in case m_nNFC is custom.
- OUString m_aCustomNumberFormat;
- sal_Int16 m_nXChFollow; //LN_IXCHFOLLOW
- std::optional<OUString> m_sBulletChar;
- css::awt::Size m_aGraphicSize;
- css::uno::Reference<css::awt::XBitmap> m_xGraphicBitmap;
- std::optional<sal_Int32> m_nTabstop;
- tools::SvRef< StyleSheetEntry > m_pParaStyle;
- bool m_bHasValues = false;
- bool m_bIsLegal = false;
-
-public:
-
- typedef tools::SvRef< ListLevel > Pointer;
-
- ListLevel() :
- m_nIStartAt(-1)
- ,m_nStartOverride(-1)
- ,m_nNFC(-1)
- ,m_nXChFollow(SvxNumberFormat::LISTTAB)
- {}
-
- // Setters for the import
- void SetValue( Id nId, sal_Int32 nValue );
- void SetCustomNumberFormat(const OUString& rValue);
- void SetBulletChar( const OUString& sValue ) { m_sBulletChar = sValue; };
- void SetGraphicSize( const css::awt::Size& aValue ) { m_aGraphicSize = aValue; };
-
- void SetGraphicBitmap(css::uno::Reference<css::awt::XBitmap> const& xGraphicBitmap)
- { m_xGraphicBitmap = xGraphicBitmap; }
- void SetParaStyle( const tools::SvRef< StyleSheetEntry >& pStyle );
-
- // Getters
- sal_Int16 GetNumberingType(sal_Int16 nDefault) const;
- bool HasBulletChar() const { return m_sBulletChar.has_value(); };
- OUString GetBulletChar( ) const { return m_sBulletChar.has_value()? *m_sBulletChar : OUString(); };
- const tools::SvRef< StyleSheetEntry >& GetParaStyle( ) const { return m_pParaStyle; };
- sal_Int32 GetStartOverride() const { return m_nStartOverride; };
- /// Determines if SetValue() was called at least once.
- bool HasValues() const;
-
- // UNO mapping functions
- css::uno::Sequence<css::beans::PropertyValue> GetProperties(bool bDefaults);
-
- css::uno::Sequence<css::beans::PropertyValue> GetCharStyleProperties();
-private:
-
- css::uno::Sequence<css::beans::PropertyValue> GetLevelProperties(bool bDefaults);
-
- void AddParaProperties(css::uno::Sequence<css::beans::PropertyValue>* pProps);
-};
-
-/// Represents a numbering picture bullet: an id and a graphic.
-class NumPicBullet final : public virtual SvRefBase
-{
-public:
- typedef tools::SvRef<NumPicBullet> Pointer;
- NumPicBullet();
- ~NumPicBullet() override;
-
- void SetId(sal_Int32 nId);
- sal_Int32 GetId() const { return m_nId;}
- void SetShape(css::uno::Reference<css::drawing::XShape> const& xShape);
- const css::uno::Reference<css::drawing::XShape>& GetShape() const { return m_xShape; }
-private:
- sal_Int32 m_nId;
- css::uno::Reference<css::drawing::XShape> m_xShape;
-};
-
-class AbstractListDef : public virtual SvRefBase
-{
-private:
- // The ID member reflects either the abstractNumId or the numId
- // depending on the use of the class
- sal_Int32 m_nId;
-
- // Properties of each level. This can also reflect the overridden
- // levels of a numbering.
- ::std::vector< ListLevel::Pointer > m_aLevels;
-
- // Only used during the numbering import
- ListLevel::Pointer m_pCurrentLevel;
-
- // The style name linked to.
- OUString m_sNumStyleLink;
-
- // This abstract numbering is a base definition for this style
- OUString m_sStyleLink;
-
- /// list id to use for all derived numbering definitions
- std::optional<OUString> m_oListId;
-
-public:
- typedef tools::SvRef< AbstractListDef > Pointer;
-
- AbstractListDef( );
- virtual ~AbstractListDef( ) override;
-
- // Setters using during the import
- void SetId( sal_Int32 nId ) { m_nId = nId; };
- static void SetValue( sal_uInt32 nSprmId );
-
- // Accessors
- sal_Int32 GetId( ) const { return m_nId; };
-
- sal_Int16 Size( ) { return sal_Int16( m_aLevels.size( ) ); };
- ListLevel::Pointer GetLevel( sal_uInt16 nLvl );
- void AddLevel( sal_uInt16 nLvl );
-
- const ListLevel::Pointer& GetCurrentLevel( ) const { return m_pCurrentLevel; };
-
- css::uno::Sequence< css::uno::Sequence<css::beans::PropertyValue> > GetPropertyValues(bool bDefaults);
-
- void SetNumStyleLink(const OUString& sValue) { m_sNumStyleLink = sValue; };
- const OUString& GetNumStyleLink() const { return m_sNumStyleLink; };
-
- void SetStyleLink(const OUString& sValue) { m_sStyleLink = sValue; };
- const OUString& GetStyleLink() const { return m_sStyleLink; };
-
- const OUString& MapListId(OUString const& rId);
-};
-
-class ListDef : public AbstractListDef
-{
-private:
- // Pointer to the abstract numbering
- AbstractListDef::Pointer m_pAbstractDef;
-
- // Cache for the UNO numbering rules
- css::uno::Reference< css::container::XIndexReplace > m_xNumRules;
-
- /// mapped list style name
- OUString m_StyleName;
-
-public:
- typedef tools::SvRef< ListDef > Pointer;
-
- ListDef( );
- virtual ~ListDef( ) override;
-
- // Accessors
- void SetAbstractDefinition(const AbstractListDef::Pointer& pAbstract) { m_pAbstractDef = pAbstract; };
- const AbstractListDef::Pointer& GetAbstractDefinition( ) const { return m_pAbstractDef; };
-
- // Mapping functions
- const OUString & GetStyleName() const { return m_StyleName; };
- const OUString & GetStyleName(sal_Int32 nId, css::uno::Reference<css::container::XNameContainer> const& xStyles);
-
- css::uno::Sequence< css::uno::Sequence<css::beans::PropertyValue> > GetMergedPropertyValues();
-
- sal_uInt16 GetChapterNumberingWeight() const;
- void CreateNumberingRules(DomainMapper& rDMapper, css::uno::Reference<css::lang::XMultiServiceFactory> const& xFactory, sal_Int16 nOutline);
-
- const css::uno::Reference<css::container::XIndexReplace>& GetNumberingRules() const { return m_xNumRules; }
-
-};
-
-/** This class provides access to the defined numbering styles.
- */
-class ListsManager :
- public LoggedProperties,
- public LoggedTable
-{
-private:
-
- DomainMapper& m_rDMapper;
- css::uno::Reference<css::lang::XMultiServiceFactory> m_xFactory;
-
- // The numbering entries
- std::vector< NumPicBullet::Pointer > m_aNumPicBullets;
- std::vector< AbstractListDef::Pointer > m_aAbstractLists;
- std::vector< ListDef::Pointer > m_aLists;
-
-
- // These members are used for import only
- AbstractListDef::Pointer m_pCurrentDefinition;
- NumPicBullet::Pointer m_pCurrentNumPicBullet;
-
- AbstractListDef::Pointer GetAbstractList( sal_Int32 nId );
-
- // Properties
- virtual void lcl_attribute( Id nName, Value & rVal ) override;
- virtual void lcl_sprm(Sprm & sprm) override;
-
- // Table
- virtual void lcl_entry(const writerfilter::Reference<Properties>::Pointer_t& ref) override;
-
-public:
-
- ListsManager(DomainMapper& rDMapper, css::uno::Reference<css::lang::XMultiServiceFactory> xFactory);
- virtual ~ListsManager() override;
-
- typedef tools::SvRef< ListsManager > Pointer;
-
- ListDef::Pointer GetList( sal_Int32 nId );
-
- // Mapping methods
- void CreateNumberingRules( );
-
- // Dispose the NumPicBullets
- void DisposeNumPicBullets( );
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/OLEHandler.cxx b/writerfilter/source/dmapper/OLEHandler.cxx
deleted file mode 100644
index e0671c8a21b6..000000000000
--- a/writerfilter/source/dmapper/OLEHandler.cxx
+++ /dev/null
@@ -1,331 +0,0 @@
-/* -*- 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/.
- *
- * 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 "OLEHandler.hxx"
-#include "DomainMapper.hxx"
-#include "GraphicHelpers.hxx"
-
-#include <oox/ole/oleobjecthelper.hxx>
-#include <ooxml/resourceids.hxx>
-#include <rtl/ustring.hxx>
-#include <sal/log.hxx>
-#include <osl/diagnose.h>
-#include <comphelper/diagnose_ex.hxx>
-#include <unotools/mediadescriptor.hxx>
-#include <officecfg/Office/Common.hxx>
-#include <com/sun/star/container/XNameAccess.hpp>
-#include <com/sun/star/document/XEmbeddedObjectResolver.hpp>
-#include <com/sun/star/document/XEmbeddedObjectSupplier.hpp>
-#include <com/sun/star/document/XFilter.hpp>
-#include <com/sun/star/document/XImporter.hpp>
-#include <com/sun/star/drawing/XShape.hpp>
-#include <com/sun/star/graphic/XGraphic.hpp>
-#include <com/sun/star/io/XOutputStream.hpp>
-#include <com/sun/star/lang/XComponent.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/lang/XServiceInfo.hpp>
-#include <com/sun/star/text/XTextDocument.hpp>
-#include <com/sun/star/text/WrapTextMode.hpp>
-#include <com/sun/star/uno/XComponentContext.hpp>
-
-namespace writerfilter::dmapper {
-
-using namespace ::com::sun::star;
-
-
-OLEHandler::OLEHandler(DomainMapper& rDomainMapper) :
-LoggedProperties("OLEHandler"),
- m_nWrapMode(text::WrapTextMode_THROUGHT),
- m_rDomainMapper(rDomainMapper)
-{
-}
-
-
-OLEHandler::~OLEHandler()
-{
-}
-
-
-void OLEHandler::lcl_attribute(Id rName, Value & rVal)
-{
- OUString sStringValue = rVal.getString();
- switch( rName )
- {
- case NS_ooxml::LN_CT_OLEObject_Type:
- break;
- case NS_ooxml::LN_CT_OLEObject_ProgID:
- m_sProgId = sStringValue;
- break;
- case NS_ooxml::LN_CT_OLEObject_ShapeID:
- break;
- case NS_ooxml::LN_CT_OLEObject_DrawAspect:
- m_sDrawAspect = sStringValue;
- break;
- case NS_ooxml::LN_CT_OLEObject_ObjectID:
- break;
- case NS_ooxml::LN_CT_OLEObject_r_id:
- break;
- case NS_ooxml::LN_inputstream:
- rVal.getAny() >>= m_xInputStream;
- break;
- case NS_ooxml::LN_CT_Object_dxaOrig:
- m_sVisAreaWidth = sStringValue;
- break;
- case NS_ooxml::LN_CT_Object_dyaOrig:
- m_sVisAreaHeight = sStringValue;
- break;
- case NS_ooxml::LN_shape:
- {
- uno::Reference< drawing::XShape > xTempShape;
- rVal.getAny() >>= xTempShape;
-
- // Control shape is handled on a different code path
- uno::Reference< lang::XServiceInfo > xSInfo( xTempShape, uno::UNO_QUERY_THROW );
- if(xSInfo->supportsService("com.sun.star.drawing.ControlShape"))
- {
- m_rDomainMapper.hasControls(true);
- break;
- }
-
- if( xTempShape.is() )
- {
- m_xShape.set( xTempShape );
-
- // No need to set the wrapping here as it's either set in oox or will be set later
-
- // Shapes in the header or footer should be in the background, since the default is WrapTextMode_THROUGH.
- if (m_rDomainMapper.IsInHeaderFooter())
- {
- try
- {
- uno::Reference<beans::XPropertySet> xShapeProps(m_xShape, uno::UNO_QUERY);
- xShapeProps->setPropertyValue("Opaque", uno::Any(false));
- }
- catch( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION("writerfilter", "Exception in OLE Handler");
- }
- }
- }
- }
- break;
- default:
- OSL_FAIL( "unknown attribute");
- }
-}
-
-css::awt::Size OLEHandler::getSize() const
-{
- if (!m_xShape)
- return css::awt::Size();
- return m_xShape->getSize();
-}
-
-css::uno::Reference<css::graphic::XGraphic> OLEHandler::getReplacement() const
-{
- if (!m_xShape)
- return nullptr;
- uno::Reference<beans::XPropertySet> xShapeProps(m_xShape, uno::UNO_QUERY);
- css::uno::Reference<css::graphic::XGraphic> xReplacement;
- xShapeProps->getPropertyValue(getPropertyName(PROP_BITMAP)) >>= xReplacement;
- return xReplacement;
-}
-
-void OLEHandler::lcl_sprm(Sprm & rSprm)
-{
- sal_uInt32 nSprmId = rSprm.getId();
- switch( nSprmId )
- {
- case NS_ooxml::LN_OLEObject_OLEObject:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- pProperties->resolve(*this);
- }
- }
- break;
- case NS_ooxml::LN_wrap_wrap:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if ( pProperties )
- {
- tools::SvRef<WrapHandler> pHandler( new WrapHandler );
- pProperties->resolve( *pHandler );
-
- m_nWrapMode = pHandler->getWrapMode( );
-
- try
- {
- uno::Reference< beans::XPropertySet > xShapeProps( m_xShape, uno::UNO_QUERY_THROW );
-
- xShapeProps->setPropertyValue(
- getPropertyName( PROP_SURROUND ),
- uno::Any( static_cast<sal_Int32>(m_nWrapMode) ) );
-
- // Through shapes in the header or footer(that spill into the body) should be in the background.
- // It is just assumed that all shapes will spill into the body.
- if( m_rDomainMapper.IsInHeaderFooter() )
- xShapeProps->setPropertyValue("Opaque", uno::Any(m_nWrapMode != text::WrapTextMode_THROUGH));
- }
- catch( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION("writerfilter", "Exception in OLE Handler");
- }
- }
- }
- break;
- default:
- {
- OSL_FAIL( "unknown attribute");
- }
- }
-}
-
-void OLEHandler::importStream(const uno::Reference<uno::XComponentContext>& xComponentContext, const uno::Reference<text::XTextDocument>& xTextDocument, const uno::Reference<text::XTextContent>& xOLE)
-{
- OUString aFilterService;
- if (m_sProgId == "Word.Document.12")
- aFilterService = "com.sun.star.comp.Writer.WriterFilter";
- else if (m_sProgId == "Excel.Sheet.12")
- aFilterService = "com.sun.star.comp.oox.xls.ExcelFilter";
- else if (m_sProgId == "Equation.3")
- aFilterService = "com.sun.star.comp.Math.MathTypeFilter";
- else
- SAL_WARN("writerfilter", "OLEHandler::importStream: unhandled m_sProgId: " << m_sProgId);
-
- if (!m_xInputStream.is() || aFilterService.isEmpty())
- return;
-
- // Create the filter service.
- uno::Reference<uno::XInterface> xInterface = xComponentContext->getServiceManager()->createInstanceWithContext(aFilterService, xComponentContext);
-
- // Set target document.
- uno::Reference<document::XImporter> xImporter(xInterface, uno::UNO_QUERY);
- uno::Reference<document::XEmbeddedObjectSupplier> xSupplier(xOLE, uno::UNO_QUERY);
- uno::Reference<lang::XComponent> xEmbeddedObject = xSupplier->getEmbeddedObject();
- if (!xEmbeddedObject.is())
- return;
- xImporter->setTargetDocument( xEmbeddedObject );
-
- // Import the input stream.
- utl::MediaDescriptor aMediaDescriptor;
- aMediaDescriptor["InputStream"] <<= m_xInputStream;
- uno::Reference<document::XFilter> xFilter(xInterface, uno::UNO_QUERY);
- xFilter->filter(aMediaDescriptor.getAsConstPropertyValueList());
-
- // Now that the data is imported, update the (typically) changed stream name.
- uno::Reference<beans::XPropertySet> xPropertySet(xOLE, uno::UNO_QUERY);
- ::oox::ole::SaveInteropProperties(xTextDocument,
- xPropertySet->getPropertyValue("StreamName").get<OUString>(), &m_aURL,
- m_sProgId);
-}
-
-OUString OLEHandler::getCLSID() const
-{
- OUString aRet;
-
- // See officecfg/registry/data/org/openoffice/Office/Embedding.xcu.
- if (m_sProgId == "Word.Document.12")
- {
- if (officecfg::Office::Common::Filter::Microsoft::Import::WinWordToWriter::get())
- aRet = "8BC6B165-B1B2-4EDD-aa47-dae2ee689dd6";
- }
- else if (m_sProgId == "Excel.Sheet.12")
- {
- if (officecfg::Office::Common::Filter::Microsoft::Import::ExcelToCalc::get())
- aRet = "47BBB4CB-CE4C-4E80-A591-42D9AE74950F";
- }
- else if (m_sProgId == "Equation.3")
- {
- if (officecfg::Office::Common::Filter::Microsoft::Import::MathTypeToMath::get())
- aRet = "078B7ABA-54FC-457F-8551-6147E776A997";
- }
- else
- SAL_WARN("writerfilter", "OLEHandler::getCLSID: unhandled m_sProgId: " << m_sProgId);
-
- return aRet;
-}
-
-OUString const & OLEHandler::GetDrawAspect() const
-{
- return m_sDrawAspect;
-}
-
-OUString const & OLEHandler::GetVisAreaWidth() const
-{
- return m_sVisAreaWidth;
-}
-
-OUString const & OLEHandler::GetVisAreaHeight() const
-{
- return m_sVisAreaHeight;
-}
-
-OUString OLEHandler::copyOLEOStream(
- uno::Reference<text::XTextDocument> const& xTextDocument)
-{
- OUString sRet;
- if( !m_xInputStream.is( ) )
- return sRet;
- try
- {
- uno::Reference < lang::XMultiServiceFactory > xFactory(xTextDocument, uno::UNO_QUERY_THROW);
- uno::Reference< document::XEmbeddedObjectResolver > xEmbeddedResolver(
- xFactory->createInstance("com.sun.star.document.ImportEmbeddedObjectResolver"), uno::UNO_QUERY_THROW );
- //hack to work with the ImportEmbeddedObjectResolver
- static sal_Int32 nObjectCount = 100;
- uno::Reference< container::XNameAccess > xNA( xEmbeddedResolver, uno::UNO_QUERY_THROW );
- OUString aURL = "Obj" + OUString::number( nObjectCount++ );
- uno::Reference < io::XOutputStream > xOLEStream;
- if( (xNA->getByName( aURL ) >>= xOLEStream) && xOLEStream.is() )
- {
- const sal_Int32 nReadRequest = 0x1000;
- uno::Sequence< sal_Int8 > aData;
-
- while( true )
- {
- sal_Int32 nRead = m_xInputStream->readBytes( aData, nReadRequest );
- xOLEStream->writeBytes( aData );
- if( nRead < nReadRequest )
- {
- xOLEStream->closeOutput();
- break;
- }
- }
-
- ::oox::ole::SaveInteropProperties(xTextDocument, aURL, nullptr, m_sProgId);
-
- OUString aPersistName( xEmbeddedResolver->resolveEmbeddedObjectURL( aURL ) );
- sRet = aPersistName.copy( strlen("vnd.sun.star.EmbeddedObject:") );
-
- }
- uno::Reference< lang::XComponent > xComp( xEmbeddedResolver, uno::UNO_QUERY_THROW );
- xComp->dispose();
- m_aURL = aURL;
- }
- catch( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "OLEHandler::createOLEObject");
- }
- return sRet;
-}
-
-} //namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/OLEHandler.hxx b/writerfilter/source/dmapper/OLEHandler.hxx
deleted file mode 100644
index 67fed0128186..000000000000
--- a/writerfilter/source/dmapper/OLEHandler.hxx
+++ /dev/null
@@ -1,94 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include "LoggedResources.hxx"
-#include <com/sun/star/awt/Size.hpp>
-#include <com/sun/star/drawing/XShape.hpp>
-#include <com/sun/star/text/WrapTextMode.hpp>
-
-namespace com::sun::star{
- namespace graphic{
- class XGraphic;
- }
- namespace io{
- class XInputStream;
- }
- namespace text{
- class XTextContent;
- class XTextDocument;
- }
- namespace uno {
- class XComponentContext;
- }
-}
-namespace writerfilter::dmapper
-{
-class DomainMapper;
-/** Handler for OLE objects
- */
-class OLEHandler : public LoggedProperties
-{
- OUString m_sProgId;
- OUString m_sDrawAspect;
- OUString m_sVisAreaWidth;
- OUString m_sVisAreaHeight;
- /// The stream URL right after the import of the raw data.
- OUString m_aURL;
-
- css::text::WrapTextMode m_nWrapMode;
-
- css::uno::Reference<css::drawing::XShape> m_xShape;
-
- css::uno::Reference<css::io::XInputStream> m_xInputStream;
- DomainMapper& m_rDomainMapper;
-
- // Properties
- virtual void lcl_attribute(Id Name, Value & val) override;
- virtual void lcl_sprm(Sprm & sprm) override;
-
-public:
- explicit OLEHandler(DomainMapper& rDomainMapper);
- virtual ~OLEHandler() override;
-
- const css::uno::Reference<css::drawing::XShape>& getShape() const { return m_xShape; };
-
- bool isOLEObject() const { return m_xInputStream.is(); }
-
- /// In case of a valid CLSID, import the native data to the previously created empty OLE object.
- void importStream(const css::uno::Reference<css::uno::XComponentContext>& xComponentContext,
- const css::uno::Reference<css::text::XTextDocument>& xTextDocument,
- const css::uno::Reference<css::text::XTextContent>& xOLE);
-
- /// Get the CLSID of the OLE object, in case we can find one based on m_sProgId.
- OUString getCLSID() const;
-
- OUString const & GetDrawAspect() const;
- OUString const & GetVisAreaWidth() const;
- OUString const & GetVisAreaHeight() const;
-
- OUString copyOLEOStream(css::uno::Reference<css::text::XTextDocument> const& xTextDocument);
-
- css::awt::Size getSize() const;
- css::uno::Reference<css::graphic::XGraphic> getReplacement() const;
-
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/PageBordersHandler.cxx b/writerfilter/source/dmapper/PageBordersHandler.cxx
deleted file mode 100644
index 89548eb351ee..000000000000
--- a/writerfilter/source/dmapper/PageBordersHandler.cxx
+++ /dev/null
@@ -1,145 +0,0 @@
-/* -*- 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/.
- *
- * 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 "BorderHandler.hxx"
-#include "PageBordersHandler.hxx"
-
-#include <ooxml/resourceids.hxx>
-
-namespace writerfilter::dmapper {
-
-PgBorder::PgBorder( ) :
- m_nDistance( 0 ),
- m_ePos( BORDER_RIGHT ),
- m_bShadow(false)
-{
-}
-
-PageBordersHandler::PageBordersHandler( ) :
-LoggedProperties("PageBordersHandler"),
-m_eBorderApply(SectionPropertyMap::BorderApply::ToAllInSection),
-m_eOffsetFrom(SectionPropertyMap::BorderOffsetFrom::Text)
-{
-}
-
-PageBordersHandler::~PageBordersHandler( )
-{
-}
-
-void PageBordersHandler::lcl_attribute( Id eName, Value& rVal )
-{
- int nIntValue = rVal.getInt( );
- switch ( eName )
- {
- case NS_ooxml::LN_CT_PageBorders_display:
- {
- switch ( nIntValue )
- {
- default:
- case NS_ooxml::LN_Value_doc_ST_PageBorderDisplay_allPages:
- m_eBorderApply = SectionPropertyMap::BorderApply::ToAllInSection;
- break;
- case NS_ooxml::LN_Value_doc_ST_PageBorderDisplay_firstPage:
- m_eBorderApply = SectionPropertyMap::BorderApply::ToFirstPageInSection;
- break;
- case NS_ooxml::LN_Value_doc_ST_PageBorderDisplay_notFirstPage:
- m_eBorderApply = SectionPropertyMap::BorderApply::ToAllButFirstInSection;
- break;
- }
- }
- break;
- case NS_ooxml::LN_CT_PageBorders_offsetFrom:
- {
- switch ( nIntValue )
- {
- default:
- case NS_ooxml::LN_Value_doc_ST_PageBorderOffset_page:
- m_eOffsetFrom = SectionPropertyMap::BorderOffsetFrom::Edge;
- break;
- case NS_ooxml::LN_Value_doc_ST_PageBorderOffset_text:
- m_eOffsetFrom = SectionPropertyMap::BorderOffsetFrom::Text;
- break;
- }
- }
- break;
- default:;
- }
-}
-
-void PageBordersHandler::lcl_sprm( Sprm& rSprm )
-{
- switch ( rSprm.getId( ) )
- {
- case NS_ooxml::LN_CT_PageBorders_top:
- case NS_ooxml::LN_CT_PageBorders_left:
- case NS_ooxml::LN_CT_PageBorders_bottom:
- case NS_ooxml::LN_CT_PageBorders_right:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- auto pBorderHandler = std::make_shared<BorderHandler>( true );
- pProperties->resolve(*pBorderHandler);
- BorderPosition ePos = BorderPosition( 0 );
- switch( rSprm.getId( ) )
- {
- case NS_ooxml::LN_CT_PageBorders_top:
- ePos = BORDER_TOP;
- break;
- case NS_ooxml::LN_CT_PageBorders_left:
- ePos = BORDER_LEFT;
- break;
- case NS_ooxml::LN_CT_PageBorders_bottom:
- ePos = BORDER_BOTTOM;
- break;
- case NS_ooxml::LN_CT_PageBorders_right:
- ePos = BORDER_RIGHT;
- break;
- default:;
- }
-
- PgBorder aPgBorder;
- aPgBorder.m_rLine = pBorderHandler->getBorderLine( );
- aPgBorder.m_nDistance = pBorderHandler->getLineDistance( );
- aPgBorder.m_ePos = ePos;
- aPgBorder.m_bShadow = pBorderHandler->getShadow();
- if (pBorderHandler->getLineType() != NS_ooxml::LN_Value_ST_Border_none)
- {
- m_aBorders.push_back( aPgBorder );
- }
- }
- }
- break;
- default:;
- }
-}
-
-void PageBordersHandler::SetBorders( SectionPropertyMap* pSectContext )
-{
- for (const PgBorder& rBorder : m_aBorders)
- {
- pSectContext->SetBorder( rBorder.m_ePos, rBorder.m_nDistance, rBorder.m_rLine, rBorder.m_bShadow );
- }
- pSectContext->SetBorderApply(m_eBorderApply);
- pSectContext->SetBorderOffsetFrom(m_eOffsetFrom);
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/PageBordersHandler.hxx b/writerfilter/source/dmapper/PageBordersHandler.hxx
deleted file mode 100644
index 537d34b8104b..000000000000
--- a/writerfilter/source/dmapper/PageBordersHandler.hxx
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include "PropertyMap.hxx"
-
-#include "LoggedResources.hxx"
-
-#include <com/sun/star/table/BorderLine2.hpp>
-
-#include <vector>
-
-namespace writerfilter::dmapper
-{
-class PgBorder
-{
-public:
- css::table::BorderLine2 m_rLine;
- sal_Int32 m_nDistance;
- BorderPosition m_ePos;
- bool m_bShadow;
-
- PgBorder();
-};
-
-class PageBordersHandler : public LoggedProperties
-{
-private:
- // See implementation of SectionPropertyMap::ApplyBorderToPageStyles
- SectionPropertyMap::BorderApply m_eBorderApply;
- SectionPropertyMap::BorderOffsetFrom m_eOffsetFrom;
- std::vector<PgBorder> m_aBorders;
-
- // Properties
- virtual void lcl_attribute(Id eName, Value& rVal) override;
- virtual void lcl_sprm(Sprm& rSprm) override;
-
-public:
- PageBordersHandler();
- virtual ~PageBordersHandler() override;
-
- void SetBorders(SectionPropertyMap* pSectContext);
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/PropertyIds.cxx b/writerfilter/source/dmapper/PropertyIds.cxx
deleted file mode 100644
index 5aefa9d3b68b..000000000000
--- a/writerfilter/source/dmapper/PropertyIds.cxx
+++ /dev/null
@@ -1,415 +0,0 @@
-/* -*- 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/.
- *
- * 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 <rtl/ustring.hxx>
-#include "PropertyIds.hxx"
-#include <frozen/bits/defines.h>
-#include <frozen/bits/elsa_std.h>
-#include <frozen/unordered_map.h>
-
-namespace writerfilter::dmapper{
-
-namespace
-{
- constexpr auto constPropertyMap = frozen::make_unordered_map<PropertyIds, std::u16string_view>(
- {
- { PROP_CHAR_WEIGHT, u"CharWeight"},
- { PROP_CHAR_POSTURE, u"CharPosture"},
- { PROP_CHAR_STRIKEOUT, u"CharStrikeout"},
- { PROP_CHAR_CONTOURED, u"CharContoured"},
- { PROP_CHAR_SHADOWED, u"CharShadowed"},
- { PROP_CHAR_CASE_MAP, u"CharCaseMap"},
- { PROP_CHAR_COLOR, u"CharColor"},
- { PROP_CHAR_COMPLEX_COLOR, u"CharComplexColor"},
- { PROP_CHAR_RELIEF, u"CharRelief"},
- { PROP_CHAR_UNDERLINE, u"CharUnderline"},
- { PROP_CHAR_UNDERLINE_COLOR, u"CharUnderlineColor"},
- { PROP_CHAR_UNDERLINE_COMPLEX_COLOR, u"CharUnderlineComplexColor"},
- { PROP_CHAR_UNDERLINE_HAS_COLOR, u"CharUnderlineHasColor"},
- { PROP_CHAR_WORD_MODE, u"CharWordMode"},
- { PROP_CHAR_ESCAPEMENT, u"CharEscapement"},
- { PROP_CHAR_ESCAPEMENT_HEIGHT, u"CharEscapementHeight"},
- { PROP_CHAR_HEIGHT, u"CharHeight"},
- { PROP_CHAR_HEIGHT_COMPLEX, u"CharHeightComplex"},
- { PROP_CHAR_LOCALE, u"CharLocale"},
- { PROP_CHAR_LOCALE_ASIAN, u"CharLocaleAsian"},
- { PROP_CHAR_LOCALE_COMPLEX, u"CharLocaleComplex"},
- { PROP_CHAR_WEIGHT_COMPLEX, u"CharWeightComplex"},
- { PROP_CHAR_POSTURE_COMPLEX, u"CharPostureComplex"},
- { PROP_CHAR_CHAR_KERNING, u"CharKerning"},
- { PROP_CHAR_AUTO_KERNING, u"CharAutoKerning"},
- { PROP_CHAR_SCALE_WIDTH, u"CharScaleWidth"},
- { PROP_CHAR_STYLE_NAME, u"CharStyleName"},
- { PROP_CHAR_FONT_NAME, u"CharFontName"},
- { PROP_CHAR_FONT_CHAR_SET, u"CharFontCharSet"},
- { PROP_CHAR_FONT_NAME_ASIAN, u"CharFontNameAsian"},
- { PROP_CHAR_HEIGHT_ASIAN, u"CharHeightAsian"},
- { PROP_CHAR_FONT_NAME_COMPLEX, u"CharFontNameComplex"},
- { PROP_CHAR_HIDDEN, u"CharHidden"},
- { PROP_CHAR_WEIGHT_ASIAN, u"CharWeightAsian"},
- { PROP_CHAR_POSTURE_ASIAN, u"CharPostureAsian"},
- { PROP_CHAR_BACK_COLOR, u"CharBackColor"},
- { PROP_CHAR_BACKGROUND_COMPLEX_COLOR, u"CharBackgroundComplexColor"},
- { PROP_CHAR_EMPHASIS, u"CharEmphasis"},
- { PROP_CHAR_COMBINE_IS_ON, u"CharCombineIsOn"},
- { PROP_CHAR_COMBINE_PREFIX, u"CharCombinePrefix"},
- { PROP_CHAR_COMBINE_SUFFIX, u"CharCombineSuffix"},
- { PROP_CHAR_ROTATION, u"CharRotation"},
- { PROP_CHAR_ROTATION_IS_FIT_TO_LINE, u"CharRotationIsFitToLine"},
- { PROP_CHAR_FLASH, u"CharFlash"},
- { PROP_CHAR_LEFT_BORDER, u"CharLeftBorder"},
- { PROP_CHAR_RIGHT_BORDER, u"CharRightBorder"},
- { PROP_CHAR_TOP_BORDER, u"CharTopBorder"},
- { PROP_CHAR_BOTTOM_BORDER, u"CharBottomBorder"},
- { PROP_CHAR_LEFT_BORDER_DISTANCE, u"CharLeftBorderDistance"},
- { PROP_CHAR_RIGHT_BORDER_DISTANCE, u"CharRightBorderDistance"},
- { PROP_CHAR_TOP_BORDER_DISTANCE, u"CharTopBorderDistance"},
- { PROP_CHAR_BOTTOM_BORDER_DISTANCE, u"CharBottomBorderDistance"},
- { PROP_CHAR_BORDER_LEFT_COMPLEX_COLOR, u"CharLeftBorderComplexColor"},
- { PROP_CHAR_BORDER_RIGHT_COMPLEX_COLOR, u"CharRightBorderComplexColor"},
- { PROP_CHAR_BORDER_TOP_COMPLEX_COLOR, u"CharTopBorderComplexColor"},
- { PROP_CHAR_BORDER_BOTTOM_COMPLEX_COLOR, u"CharBottomBorderComplexColor"},
- { PROP_CHAR_SHADOW_FORMAT, u"CharShadowFormat"},
- { PROP_CHAR_HIGHLIGHT, u"CharHighlight"},
- { PROP_PARA_STYLE_NAME, u"ParaStyleName"},
- { PROP_PARA_ADJUST, u"ParaAdjust"},
- { PROP_PARA_VERT_ALIGNMENT, u"ParaVertAlignment"},
- { PROP_PARA_LAST_LINE_ADJUST, u"ParaLastLineAdjust"},
- { PROP_PARA_RIGHT_MARGIN, u"ParaRightMargin"},
- { PROP_PARA_LEFT_MARGIN, u"ParaLeftMargin"},
- { PROP_PARA_FIRST_LINE_INDENT, u"ParaFirstLineIndent"},
- { PROP_PARA_KEEP_TOGETHER, u"ParaKeepTogether"},
- { PROP_PARA_TOP_MARGIN, u"ParaTopMargin"},
- { PROP_PARA_TOP_MARGIN_BEFORE_AUTO_SPACING, u"ParaTopMarginBeforeAutoSpacing"},
- { PROP_PARA_BOTTOM_MARGIN_AFTER_AUTO_SPACING, u"ParaBottomMarginAfterAutoSpacing"},
- { PROP_PARA_CONTEXT_MARGIN, u"ParaContextMargin"},
- { PROP_PARA_BOTTOM_MARGIN, u"ParaBottomMargin"},
- { PROP_PARA_IS_HYPHENATION, u"ParaIsHyphenation"},
- { PROP_PARA_HYPHENATION_NO_CAPS, u"ParaHyphenationNoCaps"},
- { PROP_PARA_HYPHENATION_ZONE, u"ParaHyphenationZone"},
- { PROP_PARA_HYPHENATION_KEEP, u"ParaHyphenationKeep"},
- { PROP_PARA_HYPHENATION_KEEP_TYPE, u"ParaHyphenationKeepType"},
- { PROP_PARA_LINE_NUMBER_COUNT, u"ParaLineNumberCount"},
- { PROP_PARA_IS_HANGING_PUNCTUATION, u"ParaIsHangingPunctuation"},
- { PROP_PARA_LINE_SPACING, u"ParaLineSpacing"},
- { PROP_PARA_TAB_STOPS, u"ParaTabStops"},
- { PROP_PARA_WIDOWS, u"ParaWidows"},
- { PROP_PARA_ORPHANS, u"ParaOrphans"},
- { PROP_PARA_LINE_NUMBER_START_VALUE, u"ParaLineNumberStartValue"},
- { PROP_NUMBERING_LEVEL, u"NumberingLevel"},
- { PROP_NUMBERING_RULES, u"NumberingRules"},
- { PROP_NUMBERING_TYPE, u"NumberingType"},
- { PROP_START_WITH, u"StartWith"},
- { PROP_ADJUST, u"Adjust"},
- { PROP_PARENT_NUMBERING, u"ParentNumbering"},
- { PROP_RIGHT_MARGIN, u"RightMargin"},
- { PROP_LEFT_MARGIN, u"LeftMargin"},
- { PROP_TOP_MARGIN, u"TopMargin"},
- { PROP_BOTTOM_MARGIN, u"BottomMargin"},
- { PROP_FIRST_LINE_OFFSET, u"FirstLineOffset"},
- { PROP_LEFT_BORDER, u"LeftBorder"},
- { PROP_RIGHT_BORDER, u"RightBorder"},
- { PROP_TOP_BORDER, u"TopBorder"},
- { PROP_BOTTOM_BORDER, u"BottomBorder"},
- { PROP_BORDER_LEFT_COMPLEX_COLOR, u"LeftBorderComplexColor"},
- { PROP_BORDER_RIGHT_COMPLEX_COLOR, u"RightBorderComplexColor"},
- { PROP_BORDER_TOP_COMPLEX_COLOR, u"TopBorderComplexColor"},
- { PROP_BORDER_BOTTOM_COMPLEX_COLOR, u"BottomBorderComplexColor"},
- { PROP_TABLE_BORDER, u"TableBorder"},
- { PROP_TABLE_ROW_DELETE, u"TableRowDelete"},
- { PROP_TABLE_ROW_INSERT, u"TableRowInsert"},
- { PROP_TABLE_CELL_DELETE, u"TableCellDelete"},
- { PROP_TABLE_CELL_INSERT, u"TableCellInsert"},
- { PROP_LEFT_BORDER_DISTANCE, u"LeftBorderDistance"},
- { PROP_RIGHT_BORDER_DISTANCE, u"RightBorderDistance"},
- { PROP_TOP_BORDER_DISTANCE, u"TopBorderDistance"},
- { PROP_BOTTOM_BORDER_DISTANCE, u"BottomBorderDistance"},
- { PROP_CURRENT_PRESENTATION, u"CurrentPresentation"},
- { PROP_IS_FIXED, u"IsFixed"},
- { PROP_SUB_TYPE, u"SubType"},
- { PROP_FILE_FORMAT, u"FileFormat"},
- { PROP_HYPER_LINK_U_R_L, u"HyperLinkURL"},
- { PROP_HYPERLINK, u"Hyperlink"},
- { PROP_NUMBER_FORMAT, u"NumberFormat"},
- { PROP_NAME, u"Name"},
- { PROP_IS_INPUT, u"IsInput"},
- { PROP_HINT, u"Hint"},
- { PROP_FULL_NAME, u"FullName"},
- { PROP_DESCRIPTION, u"Description"},
- { PROP_MACRO_NAME, u"MacroName"},
- { PROP_TITLE, u"Title"},
- { PROP_CONTENT, u"Content"},
- { PROP_INPUT_STREAM, u"InputStream"},
- { PROP_GRAPHIC, u"Graphic"},
- { PROP_ANCHOR_TYPE, u"AnchorType"},
- { PROP_SIZE, u"Size"},
- { PROP_HORI_ORIENT, u"HoriOrient"},
- { PROP_HORI_ORIENT_POSITION, u"HoriOrientPosition"},
- { PROP_HORI_ORIENT_RELATION, u"HoriOrientRelation"},
- { PROP_VERT_ORIENT, u"VertOrient"},
- { PROP_VERT_ORIENT_POSITION, u"VertOrientPosition"},
- { PROP_VERT_ORIENT_RELATION, u"VertOrientRelation"},
- { PROP_SIZE100th_M_M, u"Size100thMM"},
- { PROP_SIZE_PIXEL, u"SizePixel"},
- { PROP_SURROUND, u"Surround"},
- { PROP_SURROUND_CONTOUR, u"SurroundContour"},
- { PROP_ADJUST_CONTRAST, u"AdjustContrast"},
- { PROP_ADJUST_LUMINANCE, u"AdjustLuminance"},
- { PROP_GRAPHIC_COLOR_MODE, u"GraphicColorMode"},
- { PROP_CONTOUR_OUTSIDE, u"ContourOutside"},
- { PROP_CONTOUR_POLY_POLYGON, u"ContourPolyPolygon"},
- { PROP_PAGE_TOGGLE, u"PageToggle"},
- { PROP_BACK_COLOR, u"BackColor"},
- { PROP_BACK_COMPLEX_COLOR, u"BackComplexColor"},
- { PROP_BACK_COLOR_TRANSPARENCY, u"BackColorTransparency"},
- { PROP_ALLOW_OVERLAP, u"AllowOverlap"},
- { PROP_ALTERNATIVE_TEXT, u"AlternativeText"},
- { PROP_HEADER_TEXT_LEFT, u"HeaderTextLeft"},
- { PROP_HEADER_TEXT_FIRST, u"HeaderTextFirst"},
- { PROP_HEADER_TEXT, u"HeaderText"},
- { PROP_HEADER_IS_SHARED, u"HeaderIsShared"},
- { PROP_HEADER_IS_ON, u"HeaderIsOn"},
- { PROP_FIRST_IS_SHARED, u"FirstIsShared"},
- { PROP_FOOTER_TEXT_LEFT, u"FooterTextLeft"},
- { PROP_FOOTER_TEXT_FIRST, u"FooterTextFirst"},
- { PROP_FOOTER_TEXT, u"FooterText"},
- { PROP_FOOTER_IS_SHARED, u"FooterIsShared"},
- { PROP_FOOTER_IS_ON, u"FooterIsOn"},
- { PROP_FOOTNOTE_COUNTING, u"FootnoteCounting"},
- { PROP_FOOTNOTE_LINE_ADJUST, u"FootnoteLineAdjust"},
- { PROP_WIDTH, u"Width"},
- { PROP_HEIGHT, u"Height"},
- { PROP_TEXT_COLUMNS, u"TextColumns"},
- { PROP_AUTOMATIC_DISTANCE, u"AutomaticDistance"},
- { PROP_IS_LANDSCAPE, u"IsLandscape"},
- { PROP_FIRST_PAGE, u"First Page"},
- { PROP_PAGE_DESC_NAME, u"PageDescName"},
- { PROP_PAGE_NUMBER_OFFSET, u"PageNumberOffset"},
- { PROP_BREAK_TYPE, u"BreakType"},
- { PROP_FOOTER_IS_DYNAMIC_HEIGHT, u"FooterIsDynamicHeight"},
- { PROP_FOOTER_DYNAMIC_SPACING, u"FooterDynamicSpacing"},
- { PROP_FOOTER_HEIGHT, u"FooterHeight"},
- { PROP_FOOTER_BODY_DISTANCE, u"FooterBodyDistance"},
- { PROP_HEADER_IS_DYNAMIC_HEIGHT, u"HeaderIsDynamicHeight"},
- { PROP_HEADER_DYNAMIC_SPACING, u"HeaderDynamicSpacing"},
- { PROP_HEADER_HEIGHT, u"HeaderHeight"},
- { PROP_HEADER_BODY_DISTANCE, u"HeaderBodyDistance"},
- { PROP_WRITING_MODE, u"WritingMode"},
- { PROP_GRID_MODE, u"GridMode"},
- { PROP_GRID_DISPLAY, u"GridDisplay"},
- { PROP_GRID_PRINT, u"GridPrint"},
- { PROP_GRID_LINES, u"GridLines"},
- { PROP_GRID_BASE_HEIGHT, u"GridBaseHeight"},
- { PROP_GRID_BASE_WIDTH, u"GridBaseWidth"},
- { PROP_GRID_RUBY_HEIGHT, u"GridRubyHeight"},
- { PROP_GRID_STANDARD_MODE, u"StandardPageMode"},
- { PROP_IS_ON, u"IsOn"},
- { PROP_RESTART_AT_EACH_PAGE, u"RestartAtEachPage"},
- { PROP_COUNT_EMPTY_LINES, u"CountEmptyLines"},
- { PROP_COUNT_LINES_IN_FRAMES, u"CountLinesInFrames"},
- { PROP_INTERVAL, u"Interval"},
- { PROP_DISTANCE, u"Distance"},
- { PROP_NUMBER_POSITION, u"NumberPosition"},
- { PROP_LEVEL, u"Level"},
- { PROP_LEVEL_FOLLOW, u"LabelFollowedBy"},
- { PROP_LEVEL_PARAGRAPH_STYLES, u"LevelParagraphStyles"},
- { PROP_LEVEL_FORMAT, u"LevelFormat"},
- { PROP_LEVEL_IS_LEGAL, u"IsLegal"},
- { PROP_LIST_FORMAT, u"ListFormat"},
- { PROP_TOKEN_TYPE, u"TokenType"},
- { PROP_TOKEN_HYPERLINK_START, u"TokenHyperlinkStart"},
- { PROP_TOKEN_HYPERLINK_END, u"TokenHyperlinkEnd"},
- { PROP_TOKEN_CHAPTER_INFO, u"TokenChapterInfo"},
- { PROP_CHAPTER_FORMAT, u"ChapterFormat"},
- { PROP_TOKEN_TEXT, u"TokenText"},
- { PROP_TEXT, u"Text"},
- { PROP_CREATE_FROM_OUTLINE, u"CreateFromOutline"},
- { PROP_CREATE_FROM_MARKS, u"CreateFromMarks"},
- { PROP_STANDARD, u"Standard"},
- { PROP_SPLIT, u"Split"},
- { PROP_IS_SPLIT_ALLOWED, u"IsSplitAllowed"},
- { META_PROP_VERTICAL_BORDER, u"VerticalBorder"},
- { META_PROP_HORIZONTAL_BORDER, u"HorizontalBorder"},
- { PROP_HEADER_ROW_COUNT, u"HeaderRowCount"},
- { PROP_SIZE_TYPE, u"SizeType"},
- { PROP_TABLE_COLUMN_SEPARATORS, u"TableColumnSeparators"},
- { META_PROP_TABLE_STYLE_NAME, u"TableStyleName"},
- { PROP_TABLE_REDLINE_PARAMS, u"TableRedlineParams"},
- { PROP_REDLINE_AUTHOR, u"RedlineAuthor"},
- { PROP_REDLINE_DATE_TIME, u"RedlineDateTime"},
- { PROP_REDLINE_TYPE, u"RedlineType"},
- { PROP_REDLINE_REVERT_PROPERTIES, u"RedlineRevertProperties"},
- { PROP_IS_PROTECTED, u"IsProtected"},
- { PROP_SIZE_PROTECTED, u"SizeProtected"},
- { PROP_POSITION_PROTECTED, u"PositionProtected"},
- { PROP_OPAQUE, u"Opaque"},
- { PROP_VERTICAL_MERGE, u"VerticalMerge"},
- { PROP_BULLET_CHAR, u"BulletChar"},
- { PROP_BULLET_FONT_NAME, u"BulletFontName"},
- { PROP_TABS_RELATIVE_TO_INDENT, u"TabsRelativeToIndent"},
- { PROP_CREATE_FROM_LEVEL_PARAGRAPH_STYLES, u"CreateFromLevelParagraphStyles"},
- { PROP_DROP_CAP_FORMAT, u"DropCapFormat"},
- { PROP_REFERENCE_FIELD_FLAGS, u"ReferenceFieldFlags"},
- { PROP_REFERENCE_FIELD_PART, u"ReferenceFieldPart"},
- { PROP_SOURCE_NAME, u"SourceName"},
- { PROP_REFERENCE_FIELD_SOURCE, u"ReferenceFieldSource"},
- { PROP_WIDTH_TYPE, u"WidthType"},
- { PROP_TBL_LOOK, u"TblLook"},
- { PROP_TEXT_RANGE, u"TextRange"},
- { PROP_TEXT_VERTICAL_ADJUST, u"TextVerticalAdjust"},
- { PROP_SERVICE_CHAR_STYLE, u"com.sun.star.style.CharacterStyle"},
- { PROP_SERVICE_PARA_STYLE, u"com.sun.star.style.ParagraphStyle"},
- { PROP_CHARACTER_STYLES, u"CharacterStyles"},
- { PROP_PARAGRAPH_STYLES, u"ParagraphStyles"},
- { PROP_TABLE_BORDER_DISTANCES, u"TableBorderDistances"},
- { META_PROP_CELL_MAR_TOP, u"MetaPropCellMarTop"},
- { META_PROP_CELL_MAR_BOTTOM, u"MetaPropCellMarBottom"},
- { META_PROP_CELL_MAR_LEFT, u"MetaPropCellMarLeft"},
- { META_PROP_CELL_MAR_RIGHT, u"MetaPropCellMarRight"},
- { PROP_START_AT, u"StartAt"},
- { PROP_CHAR_PROP_HEIGHT, u"CharPropHeight"},
- { PROP_CHAR_PROP_HEIGHT_ASIAN, u"CharPropHeightAsian"},
- { PROP_CHAR_PROP_HEIGHT_COMPLEX, u"CharPropHeightComplex"},
- { PROP_FORMAT, u"Format"},
- { PROP_INSERT, u"Insert"},
- { PROP_DELETE, u"Delete"},
- { PROP_PARAGRAPH_FORMAT, u"ParagraphFormat"},
- { PROP_STREAM_NAME, u"StreamName"},
- { PROP_BITMAP, u"Bitmap"},
- { PROP_IS_DATE, u"IsDate"},
- { PROP_TAB_STOP_DISTANCE, u"TabStopDistance"},
- { PROP_INDENT_AT, u"IndentAt"},
- { PROP_FIRST_LINE_INDENT, u"FirstLineIndent"},
- { PROP_NUMBERING_STYLE_NAME, u"NumberingStyleName"},
- { PROP_OUTLINE_LEVEL, u"OutlineLevel"},
- { PROP_LISTTAB_STOP_POSITION, u"ListtabStopPosition"},
- { PROP_POSITION_AND_SPACE_MODE, u"PositionAndSpaceMode"},
- { PROP_PARA_SPLIT, u"ParaSplit"},
- { PROP_HELP, u"Help"},
- { PROP_HEADING_STYLE_NAME, u"HeadingStyleName"},
- { PROP_FRM_DIRECTION, u"FRMDirection"},
- { PROP_EMBEDDED_OBJECT, u"EmbeddedObject"},
- { PROP_IS_VISIBLE, u"IsVisible"},
- { PROP_PAGE_STYLE_LAYOUT, u"PageStyleLayout"},
- { PROP_Z_ORDER, u"ZOrder"},
- { PROP_EMBED_FONTS, u"EmbedFonts"},
- { PROP_EMBED_SYSTEM_FONTS, u"EmbedSystemFonts"},
- { PROP_SHADOW_FORMAT, u"ShadowFormat"},
- { PROP_RELATIVE_WIDTH, u"RelativeWidth"},
- { PROP_IS_WIDTH_RELATIVE, u"IsWidthRelative"},
- { PROP_GRAPHIC_BITMAP, u"GraphicBitmap"},
- { PROP_GRAPHIC_SIZE, u"GraphicSize"},
- { PROP_CHAR_SHADING_VALUE, u"CharShadingValue"},
- { PROP_CHAR_SHADING_MARKER, u"CharShadingMarker"},
- { PROP_LABEL_CATEGORY, u"LabelCategory"},
- { PROP_MIRROR_INDENTS, u"MirrorIndents"},
- { PROP_SURROUND_TEXT_WRAP_SMALL, u"SurroundTextWrapSmall"},
- { PROP_PARA_SHADOW_FORMAT, u"ParaShadowFormat"},
- { PROP_FOOTNOTE_LINE_RELATIVE_WIDTH, u"FootnoteLineRelativeWidth"},
- { PROP_TBL_HEADER, u"TblHeader"},
- { PROP_CHAR_THEME_NAME_ASCII, u"CharThemeNameAscii"},
- { PROP_CHAR_THEME_NAME_CS, u"CharThemeNameCs"},
- { PROP_CHAR_THEME_NAME_H_ANSI, u"CharThemeNameHAnsi"},
- { PROP_CHAR_THEME_NAME_EAST_ASIA, u"CharThemeNameEastAsia"},
- { PROP_CHAR_THEME_FONT_NAME_ASCII, u"CharThemeFontNameAscii"},
- { PROP_CHAR_THEME_FONT_NAME_CS, u"CharThemeFontNameCs"},
- { PROP_CHAR_THEME_FONT_NAME_EAST_ASIA, u"CharThemeFontNameEastAsia"},
- { PROP_CHAR_THEME_COLOR, u"CharThemeColor"},
- { PROP_CHAR_THEME_ORIGINAL_COLOR, u"CharThemeOriginalColor"},
- { PROP_CHAR_THEME_COLOR_SHADE, u"CharThemeColorShade"},
- { PROP_CHAR_THEME_FILL, u"CharThemeFill"},
- { PROP_HORIZONTAL_MERGE, u"HorizontalMerge"},
- { PROP_HIDE_TAB_LEADER_AND_PAGE_NUMBERS, u"HideTabLeaderAndPageNumber"},
- { PROP_TAB_IN_TOC, u"TabInTOC"},
- { PROP_TOC_BOOKMARK, u"TOCBookmark"},
- { PROP_TOC_NEW_LINE, u"TOCNewLine"},
- { PROP_TOC_PARAGRAPH_OUTLINE_LEVEL, u"TOCParagraphOutlineLevel"},
- { PROP_CHAR_THEME_COLOR_TINT, u"CharThemeColorTint"},
- { PROP_CHAR_GLOW_TEXT_EFFECT, u"CharGlowTextEffect"},
- { PROP_CHAR_SHADOW_TEXT_EFFECT, u"CharShadowTextEffect"},
- { PROP_CHAR_REFLECTION_TEXT_EFFECT, u"CharReflectionTextEffect"},
- { PROP_CHAR_TEXTOUTLINE_TEXT_EFFECT, u"CharTextOutlineTextEffect"},
- { PROP_CHAR_TEXTFILL_TEXT_EFFECT, u"CharTextFillTextEffect"},
- { PROP_CHAR_SCENE3D_TEXT_EFFECT, u"CharScene3DTextEffect"},
- { PROP_CHAR_PROPS3D_TEXT_EFFECT, u"CharProps3DTextEffect"},
- { PROP_CHAR_LIGATURES_TEXT_EFFECT, u"CharLigaturesTextEffect"},
- { PROP_CHAR_NUMFORM_TEXT_EFFECT, u"CharNumFormTextEffect"},
- { PROP_CHAR_NUMSPACING_TEXT_EFFECT, u"CharNumSpacingTextEffect"},
- { PROP_CHAR_STYLISTICSETS_TEXT_EFFECT, u"CharStylisticSetsTextEffect"},
- { PROP_CHAR_CNTXTALTS_TEXT_EFFECT, u"CharCntxtAltsTextEffect"},
- { PROP_SDTPR, u"SdtPr"},
- { PROP_CELL_INTEROP_GRAB_BAG, u"CellInteropGrabBag"},
- { PROP_TABLE_INTEROP_GRAB_BAG, u"TableInteropGrabBag"},
- { PROP_APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING, u"ApplyParagraphMarkFormatToNumbering"},
- { PROP_SDT_END_BEFORE, u"SdtEndBefore"},
- { PROP_PARA_SDT_END_BEFORE, u"ParaSdtEndBefore"},
- { META_PROP_TABLE_LOOK, u"TableStyleLook"},
- { PROP_PARA_CNF_STYLE, u"ParaCnfStyle"},
- { PROP_CELL_CNF_STYLE, u"CellCnfStyle"},
- { PROP_ROW_CNF_STYLE, u"RowCnfStyle"},
- { PROP_CELL_HIDE_MARK, u"CellHideMark"},
- { PROP_FOLLOW_TEXT_FLOW, u"IsFollowingTextFlow"},
- { PROP_FILL_STYLE, u"FillStyle"},
- { PROP_FILL_COLOR, u"FillColor"},
- { PROP_FILL_COMPLEX_COLOR, u"FillComplexColor"},
- { PROP_SNAP_TO_GRID, u"SnapToGrid"},
- { PROP_GRID_SNAP_TO_CHARS, u"GridSnapToChars"},
- { PROP_RUBY_STYLE, u"RubyCharStyleName"},
- { PROP_RUBY_TEXT, u"RubyText"},
- { PROP_RUBY_ADJUST, u"RubyAdjust"},
- { PROP_RUBY_POSITION, u"RubyPosition"},
- { PROP_DATABASE_NAME, u"DataBaseName"},
- { PROP_COMMAND_TYPE, u"DataCommandType"},
- { PROP_DATATABLE_NAME, u"DataTableName"},
- { PROP_DATACOLUMN_NAME, u"DataColumnName"},
- { PROP_CHAR_TRANSPARENCE, u"CharTransparence"},
- { PROP_CELL_FORMULA, u"CellFormula"},
- { PROP_CELL_FORMULA_CONVERTED, u"CellFormulaConverted"},
- { PROP_GUTTER_MARGIN, u"GutterMargin"},
- { PROP_RTL_GUTTER, u"RtlGutter"},
- { PROP_CURSOR_NOT_IGNORE_TABLES_IN_HF, u"CursorNotIgnoreTables"},
- { PROP_PARA_CONNECT_BORDERS, u"ParaIsConnectBorder"},
- { PROP_DECORATIVE, u"Decorative"},
- { PROP_PAPER_TRAY, u"PrinterPaperTray"},
- });
-} // end anonymous ns
-
-OUString getPropertyName( PropertyIds eId )
-{
- auto iterator = constPropertyMap.find(eId);
- if (iterator != constPropertyMap.end())
- return OUString(iterator->second);
-
- return OUString();
-}
-
-bool isCharacterProperty( const PropertyIds eId )
-{
- return eId > PROP_CHARACTER_STYLES && eId < PROP_CHARACTER_END;
-}
-
-bool isParagraphProperty( const PropertyIds eId )
-{
- return (eId >= PROP_PARA_ADJUST && eId <= PROP_PARA_WIDOWS)
- || eId == PROP_FILL_COLOR
- || eId == PROP_FILL_COMPLEX_COLOR;
-}
-
-} //namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/PropertyIds.hxx b/writerfilter/source/dmapper/PropertyIds.hxx
deleted file mode 100644
index 724648683335..000000000000
--- a/writerfilter/source/dmapper/PropertyIds.hxx
+++ /dev/null
@@ -1,399 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <rtl/ustring.hxx>
-
-namespace writerfilter::dmapper{
-// Ensure that Character Properties are placed between PROP_CHARACTER_STYLES and PROP_CHARACTER_END
-enum PropertyIds
- {
- INVALID = 0
- ,PROP_ID_START = 1
- ,META_PROP_CELL_MAR_BOTTOM = PROP_ID_START
- ,META_PROP_CELL_MAR_LEFT
- ,META_PROP_CELL_MAR_RIGHT
- ,META_PROP_CELL_MAR_TOP
- ,META_PROP_HORIZONTAL_BORDER
- ,META_PROP_TABLE_STYLE_NAME
- ,META_PROP_VERTICAL_BORDER
- ,PROP_ADJUST
- ,PROP_ADJUST_CONTRAST
- ,PROP_ADJUST_LUMINANCE
- ,PROP_ALLOW_OVERLAP
- ,PROP_ALTERNATIVE_TEXT
- ,PROP_ANCHOR_TYPE
- ,PROP_AUTOMATIC_DISTANCE
- ,PROP_BACK_COLOR
- ,PROP_BACK_COMPLEX_COLOR
- ,PROP_BACK_COLOR_TRANSPARENCY
- ,PROP_BITMAP
- ,PROP_BORDER_LEFT_COMPLEX_COLOR
- ,PROP_BORDER_RIGHT_COMPLEX_COLOR
- ,PROP_BORDER_TOP_COMPLEX_COLOR
- ,PROP_BORDER_BOTTOM_COMPLEX_COLOR
- ,PROP_BOTTOM_BORDER
- ,PROP_BOTTOM_BORDER_DISTANCE
- ,PROP_BOTTOM_MARGIN
- ,PROP_BREAK_TYPE
- ,PROP_BULLET_CHAR
- ,PROP_BULLET_FONT_NAME
- ,PROP_CHAPTER_FORMAT
- ,PROP_CHARACTER_STYLES
- ,PROP_CHAR_AUTO_KERNING
- ,PROP_CHAR_BACK_COLOR
- ,PROP_CHAR_BACKGROUND_COMPLEX_COLOR
- ,PROP_CHAR_CASE_MAP
- ,PROP_CHAR_CHAR_KERNING
- ,PROP_CHAR_COLOR
- ,PROP_CHAR_COMPLEX_COLOR
- ,PROP_CHAR_COMBINE_IS_ON
- ,PROP_CHAR_COMBINE_PREFIX
- ,PROP_CHAR_COMBINE_SUFFIX
- ,PROP_CHAR_CONTOURED
- ,PROP_CHAR_LEFT_BORDER
- ,PROP_CHAR_RIGHT_BORDER
- ,PROP_CHAR_TOP_BORDER
- ,PROP_CHAR_BOTTOM_BORDER
- ,PROP_CHAR_LEFT_BORDER_DISTANCE
- ,PROP_CHAR_RIGHT_BORDER_DISTANCE
- ,PROP_CHAR_TOP_BORDER_DISTANCE
- ,PROP_CHAR_BOTTOM_BORDER_DISTANCE
- ,PROP_CHAR_BORDER_LEFT_COMPLEX_COLOR
- ,PROP_CHAR_BORDER_RIGHT_COMPLEX_COLOR
- ,PROP_CHAR_BORDER_TOP_COMPLEX_COLOR
- ,PROP_CHAR_BORDER_BOTTOM_COMPLEX_COLOR
- ,PROP_CHAR_EMPHASIS
- ,PROP_CHAR_ESCAPEMENT
- ,PROP_CHAR_ESCAPEMENT_HEIGHT
- ,PROP_CHAR_FLASH
- ,PROP_CHAR_FONT_CHAR_SET
- ,PROP_CHAR_FONT_NAME
- ,PROP_CHAR_FONT_NAME_ASIAN
- ,PROP_CHAR_FONT_NAME_COMPLEX
- ,PROP_CHAR_HEIGHT
- ,PROP_CHAR_HEIGHT_ASIAN
- ,PROP_CHAR_HEIGHT_COMPLEX
- ,PROP_CHAR_HIDDEN
- ,PROP_CHAR_HIGHLIGHT
- ,PROP_CHAR_LOCALE
- ,PROP_CHAR_LOCALE_ASIAN
- ,PROP_CHAR_LOCALE_COMPLEX
- ,PROP_CHAR_POSTURE
- ,PROP_CHAR_POSTURE_ASIAN
- ,PROP_CHAR_POSTURE_COMPLEX
- ,PROP_CHAR_PROP_HEIGHT
- ,PROP_CHAR_PROP_HEIGHT_ASIAN
- ,PROP_CHAR_PROP_HEIGHT_COMPLEX
- ,PROP_CHAR_RELIEF
- ,PROP_CHAR_ROTATION
- ,PROP_CHAR_ROTATION_IS_FIT_TO_LINE
- ,PROP_CHAR_SCALE_WIDTH
- ,PROP_CHAR_SHADOW_FORMAT
- ,PROP_CHAR_SHADING_MARKER
- ,PROP_CHAR_SHADING_VALUE
- ,PROP_CHAR_SHADOWED
- ,PROP_CHAR_STRIKEOUT
- ,PROP_CHAR_STYLE_NAME
- ,PROP_CHAR_TEXTOUTLINE_TEXT_EFFECT
- ,PROP_CHAR_TEXTFILL_TEXT_EFFECT
- ,PROP_CHAR_THEME_NAME_ASCII
- ,PROP_CHAR_THEME_NAME_CS
- ,PROP_CHAR_THEME_NAME_H_ANSI
- ,PROP_CHAR_THEME_NAME_EAST_ASIA
- ,PROP_CHAR_THEME_FONT_NAME_ASCII
- ,PROP_CHAR_THEME_FONT_NAME_CS
- ,PROP_CHAR_THEME_FONT_NAME_EAST_ASIA
- ,PROP_CHAR_THEME_COLOR
- ,PROP_CHAR_THEME_ORIGINAL_COLOR
- ,PROP_CHAR_THEME_COLOR_SHADE
- ,PROP_CHAR_THEME_FILL
- ,PROP_CHAR_THEME_COLOR_TINT
- ,PROP_CHAR_UNDERLINE
- ,PROP_CHAR_UNDERLINE_COLOR
- ,PROP_CHAR_UNDERLINE_COMPLEX_COLOR
- ,PROP_CHAR_UNDERLINE_HAS_COLOR
- ,PROP_CHAR_WEIGHT
- ,PROP_CHAR_WEIGHT_ASIAN
- ,PROP_CHAR_WEIGHT_COMPLEX
- ,PROP_CHAR_WORD_MODE
- ,PROP_CHAR_GLOW_TEXT_EFFECT
- ,PROP_CHAR_SHADOW_TEXT_EFFECT
- ,PROP_CHAR_REFLECTION_TEXT_EFFECT
- ,PROP_CHAR_SCENE3D_TEXT_EFFECT
- ,PROP_CHAR_PROPS3D_TEXT_EFFECT
- ,PROP_CHAR_LIGATURES_TEXT_EFFECT
- ,PROP_CHAR_NUMFORM_TEXT_EFFECT
- ,PROP_CHAR_NUMSPACING_TEXT_EFFECT
- ,PROP_CHAR_STYLISTICSETS_TEXT_EFFECT
- ,PROP_CHAR_CNTXTALTS_TEXT_EFFECT
- ,PROP_CHARACTER_END
- ,PROP_CONTENT = PROP_CHARACTER_END
- ,PROP_CONTOUR_OUTSIDE
- ,PROP_CONTOUR_POLY_POLYGON
- ,PROP_COUNT_EMPTY_LINES
- ,PROP_COUNT_LINES_IN_FRAMES
- ,PROP_CREATE_FROM_LEVEL_PARAGRAPH_STYLES
- ,PROP_CREATE_FROM_MARKS
- ,PROP_CREATE_FROM_OUTLINE
- ,PROP_CURRENT_PRESENTATION
- ,PROP_DECORATIVE
- ,PROP_DELETE
- ,PROP_DESCRIPTION
- ,PROP_DISTANCE
- ,PROP_DROP_CAP_FORMAT
- ,PROP_FILE_FORMAT
- ,PROP_FIRST_LINE_INDENT
- ,PROP_FIRST_LINE_OFFSET
- ,PROP_FIRST_PAGE
- ,PROP_FIRST_IS_SHARED
- ,PROP_FOOTER_BODY_DISTANCE
- ,PROP_FOOTER_DYNAMIC_SPACING
- ,PROP_FOOTER_HEIGHT
- ,PROP_FOOTER_IS_DYNAMIC_HEIGHT
- ,PROP_FOOTER_IS_ON
- ,PROP_FOOTER_IS_SHARED
- ,PROP_FOOTER_TEXT
- ,PROP_FOOTER_TEXT_LEFT
- ,PROP_FOOTER_TEXT_FIRST
- ,PROP_FOOTNOTE_COUNTING
- ,PROP_FOOTNOTE_LINE_ADJUST
- ,PROP_FORMAT
- ,PROP_FULL_NAME
- ,PROP_GRAPHIC
- ,PROP_GRAPHIC_COLOR_MODE
- ,PROP_GRID_BASE_HEIGHT
- ,PROP_GRID_BASE_WIDTH
- ,PROP_GRID_DISPLAY
- ,PROP_GRID_LINES
- ,PROP_GRID_MODE
- ,PROP_GRID_PRINT
- ,PROP_GRID_RUBY_HEIGHT
- ,PROP_HEADER_BODY_DISTANCE
- ,PROP_HEADER_DYNAMIC_SPACING
- ,PROP_HEADER_HEIGHT
- ,PROP_HEADER_IS_DYNAMIC_HEIGHT
- ,PROP_HEADER_IS_ON
- ,PROP_HEADER_IS_SHARED
- ,PROP_HEADER_ROW_COUNT
- ,PROP_HEADER_TEXT
- ,PROP_HEADER_TEXT_LEFT
- ,PROP_HEADER_TEXT_FIRST
- ,PROP_HEADING_STYLE_NAME
- ,PROP_HEIGHT
- ,PROP_HELP
- ,PROP_HINT
- ,PROP_HORI_ORIENT
- ,PROP_HORI_ORIENT_POSITION
- ,PROP_HORI_ORIENT_RELATION
- ,PROP_HYPER_LINK_U_R_L
- ,PROP_HYPERLINK
- ,PROP_INDENT_AT
- ,PROP_INPUT_STREAM
- ,PROP_INSERT
- ,PROP_INTERVAL
- ,PROP_IS_DATE
- ,PROP_IS_FIXED
- ,PROP_IS_INPUT
- ,PROP_IS_LANDSCAPE
- ,PROP_IS_ON
- ,PROP_IS_SPLIT_ALLOWED
- ,PROP_IS_VISIBLE
- ,PROP_LABEL_CATEGORY
- ,PROP_LEFT_BORDER
- ,PROP_LEFT_BORDER_DISTANCE
- ,PROP_LEFT_MARGIN
- ,PROP_LEVEL
- ,PROP_LEVEL_FOLLOW
- ,PROP_LEVEL_FORMAT
- ,PROP_LEVEL_PARAGRAPH_STYLES
- ,PROP_LEVEL_IS_LEGAL
- ,PROP_LISTTAB_STOP_POSITION
- ,PROP_LIST_FORMAT
- ,PROP_MACRO_NAME
- ,PROP_NAME
- ,PROP_NUMBERING_LEVEL
- ,PROP_NUMBERING_RULES
- ,PROP_NUMBERING_STYLE_NAME
- ,PROP_NUMBERING_TYPE
- ,PROP_NUMBER_FORMAT
- ,PROP_NUMBER_POSITION
- ,PROP_OPAQUE
- ,PROP_OUTLINE_LEVEL
- ,PROP_PAGE_DESC_NAME
- ,PROP_PAGE_NUMBER_OFFSET
- ,PROP_PAGE_TOGGLE
- ,PROP_PARAGRAPH_FORMAT
- ,PROP_PARAGRAPH_STYLES
- ,PROP_PARA_ADJUST
- ,PROP_PARA_BOTTOM_MARGIN
- ,PROP_PARA_FIRST_LINE_INDENT
- ,PROP_PARA_IS_HANGING_PUNCTUATION
- ,PROP_PARA_IS_HYPHENATION
- ,PROP_PARA_HYPHENATION_NO_CAPS
- ,PROP_PARA_HYPHENATION_ZONE
- ,PROP_PARA_HYPHENATION_KEEP
- ,PROP_PARA_HYPHENATION_KEEP_TYPE
- ,PROP_PARA_KEEP_TOGETHER
- ,PROP_PARA_LAST_LINE_ADJUST
- ,PROP_PARA_LEFT_MARGIN
- ,PROP_PARA_LINE_NUMBER_COUNT
- ,PROP_PARA_LINE_NUMBER_START_VALUE
- ,PROP_PARA_LINE_SPACING
- ,PROP_PARA_ORPHANS
- ,PROP_PARA_RIGHT_MARGIN
- ,PROP_PARA_SPLIT
- ,PROP_PARA_STYLE_NAME
- ,PROP_PARA_TAB_STOPS
- ,PROP_PARA_TOP_MARGIN
- ,PROP_PARA_VERT_ALIGNMENT
- ,PROP_PARA_WIDOWS
- ,PROP_PAPER_TRAY
- ,PROP_PARENT_NUMBERING
- ,PROP_POSITION_AND_SPACE_MODE
- ,PROP_POSITION_PROTECTED
- ,PROP_IS_PROTECTED
- ,PROP_REDLINE_AUTHOR
- ,PROP_REDLINE_DATE_TIME
- ,PROP_REDLINE_TYPE
- ,PROP_REDLINE_REVERT_PROPERTIES
- ,PROP_REFERENCE_FIELD_FLAGS
- ,PROP_REFERENCE_FIELD_PART
- ,PROP_REFERENCE_FIELD_SOURCE
- ,PROP_RESTART_AT_EACH_PAGE
- ,PROP_RIGHT_BORDER
- ,PROP_RIGHT_BORDER_DISTANCE
- ,PROP_RIGHT_MARGIN
- ,PROP_SERVICE_CHAR_STYLE
- ,PROP_SERVICE_PARA_STYLE
- ,PROP_SIZE
- ,PROP_SIZE100th_M_M
- ,PROP_SIZE_PIXEL
- ,PROP_SIZE_PROTECTED
- ,PROP_SIZE_TYPE
- ,PROP_SOURCE_NAME
- ,PROP_SPLIT
- ,PROP_STANDARD
- ,PROP_START_AT
- ,PROP_START_WITH
- ,PROP_STREAM_NAME
- ,PROP_SUB_TYPE
- ,PROP_SURROUND
- ,PROP_SURROUND_CONTOUR
- ,PROP_TABLE_BORDER
- ,PROP_TABLE_BORDER_DISTANCES
- ,PROP_TABLE_COLUMN_SEPARATORS
- ,PROP_TABLE_REDLINE_PARAMS
- ,PROP_TABLE_ROW_DELETE
- ,PROP_TABLE_ROW_INSERT
- ,PROP_TABLE_CELL_DELETE
- ,PROP_TABLE_CELL_INSERT
- ,PROP_TABS_RELATIVE_TO_INDENT
- ,PROP_TAB_STOP_DISTANCE
- ,PROP_TEXT
- ,PROP_TEXT_COLUMNS
- ,PROP_TEXT_RANGE
- ,PROP_TEXT_VERTICAL_ADJUST
- ,PROP_TITLE
- ,PROP_TOKEN_CHAPTER_INFO
- ,PROP_TOKEN_HYPERLINK_END
- ,PROP_TOKEN_HYPERLINK_START
- ,PROP_TOKEN_TEXT
- ,PROP_TOKEN_TYPE
- ,PROP_TOP_BORDER
- ,PROP_TOP_BORDER_DISTANCE
- ,PROP_TOP_MARGIN
- ,PROP_VERTICAL_MERGE
- ,PROP_GRID_STANDARD_MODE
- ,PROP_VERT_ORIENT
- ,PROP_VERT_ORIENT_POSITION
- ,PROP_VERT_ORIENT_RELATION
- ,PROP_WIDTH
- ,PROP_WIDTH_TYPE
- ,PROP_TBL_LOOK
- ,PROP_WRITING_MODE
- ,PROP_FRM_DIRECTION
- ,PROP_EMBEDDED_OBJECT
- ,PROP_PARA_CONTEXT_MARGIN
- ,PROP_PAGE_STYLE_LAYOUT
- ,PROP_Z_ORDER
- ,PROP_EMBED_FONTS
- ,PROP_EMBED_SYSTEM_FONTS
- ,PROP_SHADOW_FORMAT
- ,PROP_RELATIVE_WIDTH
- ,PROP_IS_WIDTH_RELATIVE
- ,PROP_GRAPHIC_BITMAP
- ,PROP_GRAPHIC_SIZE
- ,PROP_MIRROR_INDENTS
- ,PROP_SURROUND_TEXT_WRAP_SMALL
- ,PROP_PARA_SHADOW_FORMAT
- ,PROP_FOOTNOTE_LINE_RELATIVE_WIDTH
- ,PROP_PARA_TOP_MARGIN_BEFORE_AUTO_SPACING
- ,PROP_PARA_BOTTOM_MARGIN_AFTER_AUTO_SPACING
- ,PROP_TBL_HEADER
- ,PROP_HORIZONTAL_MERGE
- ,PROP_HIDE_TAB_LEADER_AND_PAGE_NUMBERS
- ,PROP_TAB_IN_TOC
- ,PROP_TOC_BOOKMARK
- ,PROP_TOC_NEW_LINE
- ,PROP_TOC_PARAGRAPH_OUTLINE_LEVEL
- ,PROP_SDTPR
- ,PROP_CELL_INTEROP_GRAB_BAG
- ,PROP_TABLE_INTEROP_GRAB_BAG
- ,PROP_APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING
- ,PROP_SDT_END_BEFORE
- ,PROP_PARA_SDT_END_BEFORE
- ,META_PROP_TABLE_LOOK
- ,PROP_PARA_CNF_STYLE
- ,PROP_CELL_CNF_STYLE
- ,PROP_ROW_CNF_STYLE
- ,PROP_CELL_HIDE_MARK
- ,PROP_FOLLOW_TEXT_FLOW
- ,PROP_FILL_STYLE
- ,PROP_FILL_COLOR
- ,PROP_FILL_COMPLEX_COLOR
- ,PROP_SNAP_TO_GRID
- ,PROP_GRID_SNAP_TO_CHARS
- ,PROP_RUBY_STYLE
- ,PROP_RUBY_TEXT
- ,PROP_RUBY_ADJUST
- ,PROP_RUBY_POSITION
- ,PROP_DATABASE_NAME
- ,PROP_COMMAND_TYPE
- ,PROP_DATATABLE_NAME
- ,PROP_DATACOLUMN_NAME
- ,PROP_CHAR_TRANSPARENCE
- ,PROP_CELL_FORMULA
- ,PROP_CELL_FORMULA_CONVERTED
- ,PROP_GUTTER_MARGIN
- ,PROP_RTL_GUTTER
- ,PROP_CURSOR_NOT_IGNORE_TABLES_IN_HF
- ,PROP_PARA_CONNECT_BORDERS
- };
-
-//Returns the UNO string equivalent to eId.
-OUString getPropertyName(PropertyIds eId);
-
-bool isCharacterProperty(const PropertyIds eId);
-
-bool isParagraphProperty(const PropertyIds eId);
-
-} // namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx
deleted file mode 100644
index 3e836f831e63..000000000000
--- a/writerfilter/source/dmapper/PropertyMap.cxx
+++ /dev/null
@@ -1,2170 +0,0 @@
-/* -*- 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/.
- *
- * 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 <sal/config.h>
-
-#include <string_view>
-
-#include "PropertyMap.hxx"
-#include "TagLogger.hxx"
-#include <ooxml/resourceids.hxx>
-#include "DomainMapper_Impl.hxx"
-#include "ConversionHelper.hxx"
-#include <editeng/boxitem.hxx>
-#include <i18nutil/paper.hxx>
-#include <osl/diagnose.h>
-#include <rtl/ustring.hxx>
-#include <sal/log.hxx>
-#include <com/sun/star/beans/PropertyAttribute.hpp>
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <com/sun/star/beans/XMultiPropertySet.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/table/BorderLine2.hpp>
-#include <com/sun/star/container/XEnumeration.hpp>
-#include <com/sun/star/container/XEnumerationAccess.hpp>
-#include <com/sun/star/container/XNameContainer.hpp>
-#include <com/sun/star/drawing/FillStyle.hpp>
-#include <com/sun/star/style/BreakType.hpp>
-#include <com/sun/star/style/PageStyleLayout.hpp>
-#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
-#include <com/sun/star/table/ShadowFormat.hpp>
-#include <com/sun/star/text/RelOrientation.hpp>
-#include <com/sun/star/text/HoriOrientation.hpp>
-#include <com/sun/star/text/HorizontalAdjust.hpp>
-#include <com/sun/star/text/SizeType.hpp>
-#include <com/sun/star/text/VertOrientation.hpp>
-#include <com/sun/star/text/WritingMode.hpp>
-#include <com/sun/star/text/WritingMode2.hpp>
-#include <com/sun/star/text/XRedline.hpp>
-#include <com/sun/star/text/XTextColumns.hpp>
-#include <com/sun/star/text/XText.hpp>
-#include <com/sun/star/text/XTextFrame.hpp>
-#include <com/sun/star/text/XTextTablesSupplier.hpp>
-#include <com/sun/star/text/TextGridMode.hpp>
-#include <com/sun/star/text/XTextCopy.hpp>
-#include <com/sun/star/style/VerticalAlignment.hpp>
-#include <comphelper/sequence.hxx>
-#include <comphelper/propertyvalue.hxx>
-#include <comphelper/diagnose_ex.hxx>
-#include "PropertyMapHelper.hxx"
-#include <o3tl/sorted_vector.hxx>
-#include <o3tl/unit_conversion.hxx>
-#include <utility>
-
-#include <frozen/bits/defines.h>
-#include <frozen/bits/elsa_std.h>
-#include <frozen/unordered_set.h>
-
-using namespace com::sun::star;
-
-namespace writerfilter::dmapper {
-
-uno::Sequence< beans::PropertyValue > PropertyMap::GetPropertyValues( bool bCharGrabBag )
-{
- using comphelper::makePropertyValue;
-
- if ( !m_aValues.empty() || m_vMap.empty() )
- return comphelper::containerToSequence( m_aValues );
-
- size_t nCharGrabBag = 0;
- size_t nParaGrabBag = 0;
- size_t nCellGrabBag = 0;
- size_t nRowGrabBag = 0;
-
- const PropValue* pParaStyleProp = nullptr;
- const PropValue* pCharStyleProp = nullptr;
- const PropValue* pNumRuleProp = nullptr;
-
- m_aValues.reserve( m_vMap.size() );
- for ( const auto& rPropPair : m_vMap )
- {
- if ( rPropPair.second.getGrabBagType() == CHAR_GRAB_BAG )
- nCharGrabBag++;
- else if ( rPropPair.second.getGrabBagType() == PARA_GRAB_BAG )
- nParaGrabBag++;
- else if ( rPropPair.second.getGrabBagType() == CELL_GRAB_BAG )
- nCellGrabBag++;
- else if ( rPropPair.first == PROP_CELL_INTEROP_GRAB_BAG )
- {
- uno::Sequence< beans::PropertyValue > aSeq;
- rPropPair.second.getValue() >>= aSeq;
- nCellGrabBag += aSeq.getLength();
- }
- else if ( rPropPair.second.getGrabBagType() == ROW_GRAB_BAG )
- nRowGrabBag++;
-
- if ( rPropPair.first == PROP_PARA_STYLE_NAME ) pParaStyleProp = &rPropPair.second;
- if ( rPropPair.first == PROP_CHAR_STYLE_NAME ) pCharStyleProp = &rPropPair.second;
- if ( rPropPair.first == PROP_NUMBERING_RULES ) pNumRuleProp = &rPropPair.second;
- }
-
- // Style names have to be the first elements within the property sequence
- // otherwise they will overwrite 'hard' attributes
- if ( pParaStyleProp != nullptr )
- m_aValues.push_back( makePropertyValue( getPropertyName( PROP_PARA_STYLE_NAME ), pParaStyleProp->getValue() ) );
- if ( pCharStyleProp != nullptr )
- m_aValues.push_back( makePropertyValue( getPropertyName( PROP_CHAR_STYLE_NAME ), pCharStyleProp->getValue() ) );
- if ( pNumRuleProp != nullptr )
- m_aValues.push_back( makePropertyValue(getPropertyName( PROP_NUMBERING_RULES ), pNumRuleProp->getValue() ) );
-
- // If there are any grab bag properties, we need one slot for them.
- uno::Sequence< beans::PropertyValue > aCharGrabBagValues( nCharGrabBag );
- uno::Sequence< beans::PropertyValue > aParaGrabBagValues( nParaGrabBag );
- uno::Sequence< beans::PropertyValue > aCellGrabBagValues( nCellGrabBag );
- uno::Sequence< beans::PropertyValue > aRowGrabBagValues ( nRowGrabBag );
- beans::PropertyValue* pCharGrabBagValues = aCharGrabBagValues.getArray();
- beans::PropertyValue* pParaGrabBagValues = aParaGrabBagValues.getArray();
- beans::PropertyValue* pCellGrabBagValues = aCellGrabBagValues.getArray();
- beans::PropertyValue* pRowGrabBagValues = aRowGrabBagValues.getArray();
- // Record index for the next property to be added in each grab bag.
- sal_Int32 nRowGrabBagValue = 0;
- sal_Int32 nCellGrabBagValue = 0;
- sal_Int32 nParaGrabBagValue = 0;
- sal_Int32 nCharGrabBagValue = 0;
-
- for ( const auto& rPropPair : m_vMap )
- {
- if ( rPropPair.first != PROP_PARA_STYLE_NAME &&
- rPropPair.first != PROP_CHAR_STYLE_NAME &&
- rPropPair.first != PROP_NUMBERING_RULES )
- {
- if ( rPropPair.second.getGrabBagType() == CHAR_GRAB_BAG )
- {
- if ( bCharGrabBag )
- {
- pCharGrabBagValues[nCharGrabBagValue].Name = getPropertyName( rPropPair.first );
- pCharGrabBagValues[nCharGrabBagValue].Value = rPropPair.second.getValue();
- ++nCharGrabBagValue;
- }
- }
- else if ( rPropPair.second.getGrabBagType() == PARA_GRAB_BAG )
- {
- pParaGrabBagValues[nParaGrabBagValue].Name = getPropertyName( rPropPair.first );
- pParaGrabBagValues[nParaGrabBagValue].Value = rPropPair.second.getValue();
- ++nParaGrabBagValue;
- }
- else if ( rPropPair.second.getGrabBagType() == CELL_GRAB_BAG )
- {
- pCellGrabBagValues[nCellGrabBagValue].Name = getPropertyName( rPropPair.first );
- pCellGrabBagValues[nCellGrabBagValue].Value = rPropPair.second.getValue();
- ++nCellGrabBagValue;
- }
- else if ( rPropPair.second.getGrabBagType() == ROW_GRAB_BAG )
- {
- pRowGrabBagValues[nRowGrabBagValue].Name = getPropertyName( rPropPair.first );
- pRowGrabBagValues[nRowGrabBagValue].Value = rPropPair.second.getValue();
- ++nRowGrabBagValue;
- }
- else if ( rPropPair.first == PROP_CELL_INTEROP_GRAB_BAG )
- {
- uno::Sequence< beans::PropertyValue > aSeq;
- rPropPair.second.getValue() >>= aSeq;
- std::copy(std::cbegin(aSeq), std::cend(aSeq), pCellGrabBagValues + nCellGrabBagValue);
- nCellGrabBagValue += aSeq.getLength();
- }
- else
- {
- m_aValues.push_back( makePropertyValue( getPropertyName( rPropPair.first ), rPropPair.second.getValue() ) );
- }
- }
- }
-
- if ( nCharGrabBag && bCharGrabBag )
- m_aValues.push_back( makePropertyValue( "CharInteropGrabBag", uno::Any( aCharGrabBagValues ) ) );
-
- if ( nParaGrabBag )
- m_aValues.push_back( makePropertyValue( "ParaInteropGrabBag", uno::Any( aParaGrabBagValues ) ) );
-
- if ( nCellGrabBag )
- m_aValues.push_back( makePropertyValue( "CellInteropGrabBag", uno::Any( aCellGrabBagValues ) ) );
-
- if ( nRowGrabBag )
- m_aValues.push_back( makePropertyValue( "RowInteropGrabBag", uno::Any( aRowGrabBagValues ) ) );
-
- return comphelper::containerToSequence( m_aValues );
-}
-
-std::vector< PropertyIds > PropertyMap::GetPropertyIds()
-{
- std::vector< PropertyIds > aRet;
- for ( const auto& rPropPair : m_vMap )
- aRet.push_back( rPropPair.first );
- return aRet;
-}
-
-#ifdef DBG_UTIL
-static void lcl_AnyToTag( const uno::Any& rAny )
-{
- try {
- sal_Int32 aInt = 0;
- if ( rAny >>= aInt )
- {
- TagLogger::getInstance().attribute( "value", rAny );
- }
- else
- {
- TagLogger::getInstance().attribute( "unsignedValue", 0 );
- }
-
- sal_uInt32 auInt = 0;
- rAny >>= auInt;
- TagLogger::getInstance().attribute( "unsignedValue", auInt );
-
- float aFloat = 0.0f;
- if ( rAny >>= aFloat )
- {
- TagLogger::getInstance().attribute( "floatValue", rAny );
- }
- else
- {
- TagLogger::getInstance().attribute( "unsignedValue", 0 );
- }
-
- OUString aStr;
- rAny >>= aStr;
- TagLogger::getInstance().attribute( "stringValue", aStr );
- }
- catch ( ... )
- {
- }
-}
-#endif
-
-void PropertyMap::Insert( PropertyIds eId, const uno::Any& rAny, bool bOverwrite, GrabBagType i_GrabBagType, bool bDocDefault )
-{
-#ifdef DBG_UTIL
- const OUString& rInsert = getPropertyName(eId);
-
- TagLogger::getInstance().startElement("propertyMap.insert");
- TagLogger::getInstance().attribute("name", rInsert);
- lcl_AnyToTag(rAny);
- TagLogger::getInstance().endElement();
-#endif
-
- if ( !bOverwrite )
- m_vMap.insert(std::make_pair(eId, PropValue(rAny, i_GrabBagType, bDocDefault)));
- else
- m_vMap[eId] = PropValue(rAny, i_GrabBagType);
-
- Invalidate();
-}
-
-void PropertyMap::Erase( PropertyIds eId )
-{
- // Safe call to erase, it throws no exceptions, even if eId is not in m_vMap
- m_vMap.erase(eId);
-
- Invalidate();
-}
-
-std::optional< PropertyMap::Property > PropertyMap::getProperty( PropertyIds eId ) const
-{
- std::map< PropertyIds, PropValue >::const_iterator aIter = m_vMap.find( eId );
- if ( aIter == m_vMap.end() )
- return std::optional<Property>();
- else
- return std::make_pair( eId, aIter->second.getValue() );
-}
-
-bool PropertyMap::isSet( PropertyIds eId) const
-{
- return m_vMap.find( eId ) != m_vMap.end();
-}
-
-bool PropertyMap::isDocDefault( PropertyIds eId ) const
-{
- std::map< PropertyIds, PropValue >::const_iterator aIter = m_vMap.find( eId );
- if ( aIter == m_vMap.end() )
- return false;
- else
- return aIter->second.getIsDocDefault();
-}
-
-#ifdef DBG_UTIL
-void PropertyMap::dumpXml() const
-{
- TagLogger::getInstance().startElement( "PropertyMap" );
-
- for ( const auto& rPropPair : m_vMap )
- {
- TagLogger::getInstance().startElement( "property" );
-
- TagLogger::getInstance().attribute( "name", getPropertyName( rPropPair.first ) );
-
- switch ( rPropPair.first )
- {
- case PROP_TABLE_COLUMN_SEPARATORS:
- lcl_DumpTableColumnSeparators( rPropPair.second.getValue() );
- break;
- default:
- {
- try
- {
- sal_Int32 aInt = 0;
- rPropPair.second.getValue() >>= aInt;
- TagLogger::getInstance().attribute( "value", aInt );
-
- sal_uInt32 auInt = 0;
- rPropPair.second.getValue() >>= auInt;
- TagLogger::getInstance().attribute( "unsignedValue", auInt );
-
- float aFloat = 0.0;
- rPropPair.second.getValue() >>= aFloat;
- TagLogger::getInstance().attribute( "floatValue", aFloat );
-
- rPropPair.second.getValue() >>= auInt;
- TagLogger::getInstance().attribute( "stringValue", std::u16string_view() );
- }
- catch ( ... )
- {
- }
- }
- break;
- }
-
- TagLogger::getInstance().endElement();
- }
-
- TagLogger::getInstance().endElement();
-}
-#endif
-
-void PropertyMap::InsertProps( const PropertyMapPtr& rMap, const bool bOverwrite )
-{
- if ( !rMap )
- return;
-
- for ( const auto& rPropPair : rMap->m_vMap )
- {
- if ( bOverwrite || !m_vMap.count(rPropPair.first) )
- {
- if ( !bOverwrite && !rPropPair.second.getIsDocDefault() )
- m_vMap.insert(std::make_pair(rPropPair.first, PropValue(rPropPair.second.getValue(), rPropPair.second.getGrabBagType(), true)));
- else
- m_vMap[rPropPair.first] = rPropPair.second;
- }
- }
-
- insertTableProperties( rMap.get(), bOverwrite );
-
- Invalidate();
-}
-
-void PropertyMap::insertTableProperties( const PropertyMap*, const bool )
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().element( "PropertyMap.insertTableProperties" );
-#endif
-}
-
-void PropertyMap::printProperties()
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement( "properties" );
-
- for ( const auto& rPropPair : m_vMap )
- {
- SAL_INFO( "writerfilter", getPropertyName( rPropPair.first ) );
-
- table::BorderLine2 aLine;
- sal_Int32 nColor;
- if ( rPropPair.second.getValue() >>= aLine )
- {
- TagLogger::getInstance().startElement( "borderline" );
- TagLogger::getInstance().attribute( "color", aLine.Color );
- TagLogger::getInstance().attribute( "inner", aLine.InnerLineWidth );
- TagLogger::getInstance().attribute( "outer", aLine.OuterLineWidth );
- TagLogger::getInstance().endElement();
- }
- else if ( rPropPair.second.getValue() >>= nColor )
- {
- TagLogger::getInstance().startElement( "color" );
- TagLogger::getInstance().attribute( "number", nColor );
- TagLogger::getInstance().endElement();
- }
- }
-
- TagLogger::getInstance().endElement();
-#else
- (void) this; // avoid loplugin:staticmethods
-#endif
-}
-
-SectionPropertyMap::SectionPropertyMap( bool bIsFirstSection )
- : m_bIsFirstSection( bIsFirstSection )
- , m_eBorderApply( BorderApply::ToAllInSection )
- , m_eBorderOffsetFrom( BorderOffsetFrom::Text )
- , m_bTitlePage( false )
- , m_nColumnCount( 0 )
- , m_nColumnDistance( 1249 )
- , m_bSeparatorLineIsOn( false )
- , m_bEvenlySpaced( false )
- , m_nPageNumber( -1 )
- , m_nPageNumberType( -1 )
- , m_nBreakType( -1 )
- , m_nLeftMargin( o3tl::convert(1, o3tl::Length::in, o3tl::Length::mm100) )
- , m_nRightMargin( o3tl::convert(1, o3tl::Length::in, o3tl::Length::mm100) )
- , m_nGutterMargin(0)
- , m_nTopMargin( o3tl::convert(1, o3tl::Length::in, o3tl::Length::mm100) )
- , m_nBottomMargin( o3tl::convert(1, o3tl::Length::in, o3tl::Length::mm100) )
- , m_nHeaderTop( o3tl::convert(0.5, o3tl::Length::in, o3tl::Length::mm100) )
- , m_nHeaderBottom( o3tl::convert(0.5, o3tl::Length::in, o3tl::Length::mm100) )
- , m_nGridType( 0 )
- , m_nGridLinePitch( 1 )
- , m_nDxtCharSpace( 0 )
- , m_bGridSnapToChars( true )
- , m_nLnnMod( 0 )
- , m_nLnc(NS_ooxml::LN_Value_ST_LineNumberRestart_newPage)
- , m_ndxaLnn( 0 )
- , m_nLnnMin( 0 )
- , m_nPaperSourceFirst( 0 )
- , m_nPaperSourceOther( 0 )
- , m_bDynamicHeightTop( true )
- , m_bDynamicHeightBottom( true )
-{
-#ifdef DBG_UTIL
- static sal_Int32 nNumber = 0;
- m_nDebugSectionNumber = nNumber++;
-#endif
-
- for ( sal_Int32 nBorder = 0; nBorder < 4; ++nBorder )
- {
- m_nBorderDistances[nBorder] = -1;
- m_bBorderShadows[nBorder] = false;
- }
- // todo: set defaults in ApplyPropertiesToPageStyles
- // initialize defaults
- PaperInfo aLetter( PAPER_LETTER );
- // page height, 1/100mm
- Insert( PROP_HEIGHT, uno::Any( static_cast<sal_Int32>(aLetter.getHeight()) ) );
- // page width, 1/100mm
- Insert( PROP_WIDTH, uno::Any( static_cast<sal_Int32>(aLetter.getWidth()) ) );
- // page left margin, 1/100 mm
- Insert( PROP_LEFT_MARGIN, uno::Any( sal_Int32(o3tl::convert(1, o3tl::Length::in, o3tl::Length::mm100)) ) );
- // page right margin, 1/100 mm
- Insert( PROP_RIGHT_MARGIN, uno::Any( sal_Int32(o3tl::convert(1, o3tl::Length::in, o3tl::Length::mm100)) ) );
- // page top margin, 1/100 mm
- Insert( PROP_TOP_MARGIN, uno::Any( sal_Int32(o3tl::convert(1, o3tl::Length::in, o3tl::Length::mm100)) ) );
- // page bottom margin, 1/100 mm
- Insert( PROP_BOTTOM_MARGIN, uno::Any( sal_Int32(o3tl::convert(1, o3tl::Length::in, o3tl::Length::mm100)) ) );
- // page style layout
- Insert( PROP_PAGE_STYLE_LAYOUT, uno::Any( style::PageStyleLayout_ALL ) );
- uno::Any aFalse( uno::Any( false ) );
- Insert( PROP_GRID_DISPLAY, aFalse );
- Insert( PROP_GRID_PRINT, aFalse );
- Insert( PROP_GRID_MODE, uno::Any( text::TextGridMode::NONE ) );
-
- if ( m_bIsFirstSection )
- {
- m_sPageStyleName = getPropertyName(PROP_STANDARD);
- }
-}
-
-uno::Reference<beans::XPropertySet> SectionPropertyMap::GetPageStyle(DomainMapper_Impl& rDM_Impl)
-{
- const uno::Reference< container::XNameContainer >& xPageStyles = rDM_Impl.GetPageStyles();
- const uno::Reference < lang::XMultiServiceFactory >& xTextFactory = rDM_Impl.GetTextFactory();
- uno::Reference<beans::XPropertySet> xReturnPageStyle;
- try
- {
- if (m_sPageStyleName.isEmpty() && xPageStyles.is())
- {
- assert( !rDM_Impl.IsInFootOrEndnote() && "Don't create useless page styles" );
-
- m_sPageStyleName = rDM_Impl.GetUnusedPageStyleName();
-
- m_aPageStyle.set(xTextFactory->createInstance("com.sun.star.style.PageStyle"), uno::UNO_QUERY );
- xPageStyles->insertByName(m_sPageStyleName, uno::Any(m_aPageStyle));
- }
- else if (!m_aPageStyle.is() && xPageStyles.is())
- {
- xPageStyles->getByName(m_sPageStyleName) >>= m_aPageStyle;
- }
- xReturnPageStyle = m_aPageStyle;
- }
- catch (const uno::Exception&)
- {
- DBG_UNHANDLED_EXCEPTION( "writerfilter" );
- }
-
- return xReturnPageStyle;
-}
-
-// removes the content - all the paragraphs of an input XText
-void SectionPropertyMap::removeXTextContent(uno::Reference<text::XText> const& rxText)
-{
- uno::Reference<text::XText> xText(rxText);
- if (!xText.is())
- return;
- xText->setString(OUString());
- uno::Reference<text::XParagraphAppend> const xAppend(xText, uno::UNO_QUERY_THROW);
- uno::Reference<lang::XComponent> const xParagraph(xAppend->finishParagraph(uno::Sequence<beans::PropertyValue>()), uno::UNO_QUERY_THROW);
- xParagraph->dispose();
-}
-
-/** Set the header/footer sharing as defined by titlePage and evenAndOdd flags
- * in the document and clear the content of anything not written during the import.
- */
-void SectionPropertyMap::setHeaderFooterProperties(DomainMapper_Impl& rDM_Impl)
-{
- if (!m_aPageStyle.is())
- return;
-
- bool bHasHeader = false;
- bool bHasFooter = false;
-
- const OUString& sHeaderIsOn = getPropertyName(PROP_HEADER_IS_ON);
- const OUString& sFooterIsOn = getPropertyName(PROP_FOOTER_IS_ON);
-
- m_aPageStyle->getPropertyValue(sHeaderIsOn) >>= bHasHeader;
- m_aPageStyle->getPropertyValue(sFooterIsOn) >>= bHasFooter;
-
- bool bEvenAndOdd = rDM_Impl.GetSettingsTable()->GetEvenAndOddHeaders();
-
- if (bHasHeader && !m_bLeftHeader && !bEvenAndOdd)
- {
- auto aAny = m_aPageStyle->getPropertyValue(getPropertyName(PROP_HEADER_TEXT_LEFT));
- uno::Reference<text::XText> xText(aAny, uno::UNO_QUERY);
- if (xText.is())
- SectionPropertyMap::removeXTextContent(xText);
- }
-
- if (bHasFooter && !m_bLeftFooter && !bEvenAndOdd)
- {
- auto aAny = m_aPageStyle->getPropertyValue(getPropertyName(PROP_FOOTER_TEXT_LEFT));
- uno::Reference<text::XText> xText(aAny, uno::UNO_QUERY);
- if (xText.is())
- SectionPropertyMap::removeXTextContent(xText);
- }
-
- if (bHasHeader && !m_bFirstHeader && !m_bTitlePage)
- {
- auto aAny = m_aPageStyle->getPropertyValue(getPropertyName(PROP_HEADER_TEXT_FIRST));
- uno::Reference<text::XText> xText(aAny, uno::UNO_QUERY);
- if (xText.is())
- SectionPropertyMap::removeXTextContent(xText);
- }
-
- if (bHasFooter && !m_bFirstFooter && !m_bTitlePage)
- {
- auto aAny = m_aPageStyle->getPropertyValue(getPropertyName(PROP_FOOTER_TEXT_FIRST));
- uno::Reference<text::XText> xText(aAny, uno::UNO_QUERY);
- if (xText.is())
- SectionPropertyMap::removeXTextContent(xText);
- }
-
- m_aPageStyle->setPropertyValue(getPropertyName(PROP_HEADER_IS_SHARED), uno::Any(!bEvenAndOdd));
- m_aPageStyle->setPropertyValue(getPropertyName(PROP_FOOTER_IS_SHARED), uno::Any(!bEvenAndOdd));
- m_aPageStyle->setPropertyValue(getPropertyName(PROP_FIRST_IS_SHARED), uno::Any(!m_bTitlePage));
-
- bool bHadFirstHeader = m_bHadFirstHeader && m_bTitlePage;
- if (bHasHeader && !bHadFirstHeader && !m_bHadLeftHeader && !m_bHadRightHeader && rDM_Impl.IsNewDoc())
- {
- m_aPageStyle->setPropertyValue(sHeaderIsOn, uno::Any(false));
- }
-}
-
-void SectionPropertyMap::SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const table::BorderLine2& rBorderLine, bool bShadow )
-{
- m_oBorderLines[ePos] = rBorderLine;
- m_nBorderDistances[ePos] = nLineDistance;
- m_bBorderShadows[ePos] = bShadow;
-}
-
-void SectionPropertyMap::ApplyPaperSource(DomainMapper_Impl& rDM_Impl)
-{
- uno::Reference<beans::XPropertySet> xFirst;
- // todo: negative spacing (from ww8par6.cxx)
- if (!m_sPageStyleName.isEmpty())
- {
- xFirst = GetPageStyle(rDM_Impl);
- if ( xFirst.is() )
- try
- {
- //TODO: which of the two tray values needs to be set? first/other - the interfaces requires the name of the tray!
- xFirst->setPropertyValue(getPropertyName(PROP_PAPER_TRAY),
- uno::Any(m_nPaperSourceFirst));
- }
- catch (const uno::Exception&)
- {
- TOOLS_WARN_EXCEPTION("writerfilter", "Paper source not found");
- }
- }
-}
-
-void SectionPropertyMap::ApplyBorderToPageStyles( DomainMapper_Impl& rDM_Impl,
- BorderApply /*eBorderApply*/, BorderOffsetFrom eOffsetFrom )
-{
- /*
- page border applies to:
- nIntValue & 0x07 ->
- 0 all pages in this section
- 1 first page in this section
- 2 all pages in this section but first
- 3 whole document (all sections)
- nIntValue & 0x18 -> page border depth 0 - in front 1- in back
- nIntValue & 0xe0 ->
- page border offset from:
- 0 offset from text
- 1 offset from edge of page
- */
-
- uno::Reference<beans::XPropertySet> xFirst;
- // todo: negative spacing (from ww8par6.cxx)
- if (!m_sPageStyleName.isEmpty())
- xFirst = GetPageStyle(rDM_Impl);
-
- // has to be sorted like enum BorderPosition: l-r-t-b
- const PropertyIds aBorderIds[4] =
- {
- PROP_LEFT_BORDER,
- PROP_RIGHT_BORDER,
- PROP_TOP_BORDER,
- PROP_BOTTOM_BORDER
- };
-
- const PropertyIds aBorderDistanceIds[4] =
- {
- PROP_LEFT_BORDER_DISTANCE,
- PROP_RIGHT_BORDER_DISTANCE,
- PROP_TOP_BORDER_DISTANCE,
- PROP_BOTTOM_BORDER_DISTANCE
- };
-
- const PropertyIds aMarginIds[4] =
- {
- PROP_LEFT_MARGIN,
- PROP_RIGHT_MARGIN,
- PROP_TOP_MARGIN,
- PROP_BOTTOM_MARGIN
- };
-
- for ( sal_Int32 nBorder = 0; nBorder < 4; ++nBorder )
- {
- if ( m_oBorderLines[nBorder] )
- {
- const OUString & sBorderName = getPropertyName( aBorderIds[nBorder] );
- if ( xFirst.is() )
- xFirst->setPropertyValue( sBorderName, uno::Any( *m_oBorderLines[nBorder] ) );
- }
- if ( m_nBorderDistances[nBorder] >= 0 )
- {
- sal_uInt32 nLineWidth = 0;
- if ( m_oBorderLines[nBorder] )
- nLineWidth = m_oBorderLines[nBorder]->LineWidth;
- if ( xFirst.is() )
- SetBorderDistance( xFirst, aMarginIds[nBorder], aBorderDistanceIds[nBorder],
- m_nBorderDistances[nBorder], eOffsetFrom, nLineWidth, rDM_Impl );
- }
- }
-
- if ( m_bBorderShadows[BORDER_RIGHT] )
- {
- table::ShadowFormat aFormat = getShadowFromBorder( *m_oBorderLines[BORDER_RIGHT] );
- if ( xFirst.is() )
- xFirst->setPropertyValue( getPropertyName( PROP_SHADOW_FORMAT ), uno::Any( aFormat ) );
- }
-}
-
-table::ShadowFormat PropertyMap::getShadowFromBorder( const table::BorderLine2& rBorder )
-{
- // In Word UI, shadow is a boolean property, in OOXML, it's a boolean
- // property of each 4 border type, finally in Writer the border is a
- // property of the page style, with shadow location, distance and
- // color. See SwWW8ImplReader::SetShadow().
- table::ShadowFormat aFormat;
- aFormat.Color = sal_Int32(COL_BLACK);
- aFormat.Location = table::ShadowLocation_BOTTOM_RIGHT;
- aFormat.ShadowWidth = rBorder.LineWidth;
- return aFormat;
-}
-
-void SectionPropertyMap::SetBorderDistance( const uno::Reference< beans::XPropertySet >& xStyle,
- PropertyIds eMarginId,
- PropertyIds eDistId,
- sal_Int32 nDistance,
- BorderOffsetFrom eOffsetFrom,
- sal_uInt32 nLineWidth,
- DomainMapper_Impl& rDM_Impl )
-{
- if (!xStyle.is())
- return;
- const OUString & sMarginName = getPropertyName( eMarginId );
- const OUString & sBorderDistanceName = getPropertyName( eDistId );
- uno::Any aMargin = xStyle->getPropertyValue( sMarginName );
- sal_Int32 nMargin = 0;
- aMargin >>= nMargin;
- editeng::BorderDistanceFromWord(eOffsetFrom == BorderOffsetFrom::Edge, nMargin, nDistance,
- nLineWidth);
-
- if (eOffsetFrom == BorderOffsetFrom::Edge)
- {
- uno::Any aGutterMargin = xStyle->getPropertyValue( "GutterMargin" );
- sal_Int32 nGutterMargin = 0;
- aGutterMargin >>= nGutterMargin;
-
- if (eMarginId == PROP_LEFT_MARGIN && !rDM_Impl.GetSettingsTable()->GetGutterAtTop())
- {
- nMargin -= nGutterMargin;
- nDistance += nGutterMargin;
- }
-
- if (eMarginId == PROP_TOP_MARGIN && rDM_Impl.GetSettingsTable()->GetGutterAtTop())
- {
- nMargin -= nGutterMargin;
- nDistance += nGutterMargin;
- }
- }
-
- // Change the margins with the border distance
- uno::Reference< beans::XMultiPropertySet > xMultiSet( xStyle, uno::UNO_QUERY_THROW );
- uno::Sequence<OUString> aProperties { sMarginName, sBorderDistanceName };
- uno::Sequence<uno::Any> aValues { uno::Any( nMargin ), uno::Any( nDistance ) };
- xMultiSet->setPropertyValues( aProperties, aValues );
-}
-
-void SectionPropertyMap::DontBalanceTextColumns()
-{
- try
- {
- if ( m_xColumnContainer.is() )
- m_xColumnContainer->setPropertyValue( "DontBalanceTextColumns", uno::Any( true ) );
- }
- catch ( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "SectionPropertyMap::DontBalanceTextColumns" );
- }
-}
-
-void SectionPropertyMap::ApplySectionProperties( const uno::Reference< beans::XPropertySet >& xSection, DomainMapper_Impl& /*rDM_Impl*/ )
-{
- try
- {
- if ( xSection.is() )
- {
- std::optional< PropertyMap::Property > pProp = getProperty( PROP_WRITING_MODE );
- if ( pProp )
- xSection->setPropertyValue( "WritingMode", pProp->second );
- }
- }
- catch ( uno::Exception& )
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter", "Exception in SectionPropertyMap::ApplySectionProperties");
- }
-}
-
-void SectionPropertyMap::ApplyProtectionProperties( uno::Reference< beans::XPropertySet >& xSection, DomainMapper_Impl& rDM_Impl )
-{
- try
- {
- // Word implements section protection differently than LO.
- // PROP_IS_PROTECTED only applies if global setting GetProtectForm is enabled.
- bool bIsProtected = rDM_Impl.GetSettingsTable()->GetProtectForm();
- if ( bIsProtected )
- {
- // If form protection is enabled then section protection is enabled, unless explicitly disabled
- if ( isSet(PROP_IS_PROTECTED) )
- getProperty(PROP_IS_PROTECTED)->second >>= bIsProtected;
- if ( !xSection.is() )
- xSection = rDM_Impl.appendTextSectionAfter( m_xStartingRange );
- if ( xSection.is() )
- xSection->setPropertyValue( getPropertyName(PROP_IS_PROTECTED), uno::Any(bIsProtected) );
- }
- }
- catch ( uno::Exception& )
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter", "ApplyProtectionProperties failed setting PROP_IS_PROTECTED");
- }
-}
-
-uno::Reference< text::XTextColumns > SectionPropertyMap::ApplyColumnProperties( const uno::Reference< beans::XPropertySet >& xColumnContainer,
- DomainMapper_Impl& rDM_Impl )
-{
- uno::Reference< text::XTextColumns > xColumns;
- assert( m_nColumnCount > 1 && "ApplyColumnProperties called without any columns" );
- try
- {
- const OUString & sTextColumns = getPropertyName( PROP_TEXT_COLUMNS );
- if ( xColumnContainer.is() )
- xColumnContainer->getPropertyValue( sTextColumns ) >>= xColumns;
- uno::Reference< beans::XPropertySet > xColumnPropSet( xColumns, uno::UNO_QUERY_THROW );
- if ( !m_bEvenlySpaced &&
- ( sal_Int32(m_aColWidth.size()) == m_nColumnCount ) &&
- ( (sal_Int32(m_aColDistance.size()) == m_nColumnCount - 1) || (sal_Int32(m_aColDistance.size()) == m_nColumnCount) ) )
- {
- // the column width in word is an absolute value, in OOo it's relative
- // the distances are both absolute
- sal_Int32 nColSum = 0;
- for ( sal_Int32 nCol = 0; nCol < m_nColumnCount; ++nCol )
- {
- nColSum += m_aColWidth[nCol];
- if ( nCol )
- nColSum += m_aColDistance[nCol - 1];
- }
-
- sal_Int32 nRefValue = xColumns->getReferenceValue();
- double fRel = nColSum ? double( nRefValue ) / double( nColSum ) : 0.0;
- uno::Sequence< text::TextColumn > aColumns( m_nColumnCount );
- text::TextColumn* pColumn = aColumns.getArray();
-
- nColSum = 0;
- for ( sal_Int32 nCol = 0; nCol < m_nColumnCount; ++nCol )
- {
- const double fLeft = nCol ? m_aColDistance[nCol - 1] / 2 : 0;
- pColumn[nCol].LeftMargin = fLeft;
- const double fRight = (nCol == m_nColumnCount - 1) ? 0 : m_aColDistance[nCol] / 2;
- pColumn[nCol].RightMargin = fRight;
- const double fWidth = m_aColWidth[nCol];
- pColumn[nCol].Width = (fWidth + fLeft + fRight) * fRel;
- nColSum += pColumn[nCol].Width;
- }
- if ( nColSum != nRefValue )
- pColumn[m_nColumnCount - 1].Width += (nRefValue - nColSum);
- assert( pColumn[m_nColumnCount - 1].Width >= 0 );
-
- xColumns->setColumns( aColumns );
- }
- else
- {
- xColumns->setColumnCount( m_nColumnCount );
- xColumnPropSet->setPropertyValue( getPropertyName( PROP_AUTOMATIC_DISTANCE ), uno::Any( m_nColumnDistance ) );
- }
-
- if ( m_bSeparatorLineIsOn )
- {
- xColumnPropSet->setPropertyValue( "SeparatorLineIsOn", uno::Any( true ) );
- xColumnPropSet->setPropertyValue( "SeparatorLineVerticalAlignment", uno::Any( style::VerticalAlignment_TOP ) );
- xColumnPropSet->setPropertyValue( "SeparatorLineRelativeHeight", uno::Any( static_cast<sal_Int8>(100) ) );
- xColumnPropSet->setPropertyValue( "SeparatorLineColor", uno::Any( static_cast<sal_Int32>(COL_BLACK) ) );
- // 1 twip -> 2 mm100.
- xColumnPropSet->setPropertyValue( "SeparatorLineWidth", uno::Any( static_cast<sal_Int32>(2) ) );
- }
- xColumnContainer->setPropertyValue( sTextColumns, uno::Any( xColumns ) );
- // Set the columns to be unbalanced if that compatibility option is set or this is the last section.
- m_xColumnContainer = xColumnContainer;
- if ( rDM_Impl.GetSettingsTable()->GetNoColumnBalance() || rDM_Impl.GetIsLastSectionGroup() )
- DontBalanceTextColumns();
- }
- catch ( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "SectionPropertyMap::ApplyColumnProperties" );
- }
- return xColumns;
-}
-
-bool SectionPropertyMap::HasHeader() const
-{
- bool bRet = false;
- if (m_aPageStyle.is())
- m_aPageStyle->getPropertyValue(getPropertyName(PROP_HEADER_IS_ON)) >>= bRet;
- return bRet;
-}
-
-bool SectionPropertyMap::HasFooter() const
-{
- bool bRet = false;
- if (m_aPageStyle.is())
- m_aPageStyle->getPropertyValue(getPropertyName(PROP_FOOTER_IS_ON)) >>= bRet;
- return bRet;
-}
-
-#define MIN_HEAD_FOOT_HEIGHT 100 // minimum header/footer height
-
-namespace
-{
-
-// Copy the content of the header/footer property to the target style
-void copyHeaderFooterTextProperty(const uno::Reference<beans::XPropertySet>& xSource,
- const uno::Reference<beans::XPropertySet>& xTarget,
- PropertyIds ePropId)
-{
- if (!xSource.is() || !xTarget.is())
- return;
-
- try {
- const OUString& sName = getPropertyName(ePropId);
- SAL_INFO( "writerfilter", "Copying " << sName );
- uno::Reference<text::XText> xTextTarget(xTarget->getPropertyValue(sName), uno::UNO_QUERY_THROW);
- // remove any content already present or else it can become a mess
- SectionPropertyMap::removeXTextContent(xTextTarget);
- uno::Reference<text::XTextCopy> xTextCopyTarget(xTextTarget, uno::UNO_QUERY_THROW);
- if (!xTextCopyTarget.is())
- return;
- uno::Reference<text::XTextCopy> xTextCopySource(xSource->getPropertyValue(sName), uno::UNO_QUERY_THROW);
- if (!xTextCopySource.is())
- return;
- xTextCopyTarget->copyText(xTextCopySource);
- }
- catch (const uno::Exception&)
- {
- TOOLS_INFO_EXCEPTION( "writerfilter", "An exception occurred in SectionPropertyMap::CopyHeaderFooterTextProperty( )" );
- }
-}
-
-// Copies all the header and footer content and relevant flags from the source style to the target.
-void completeCopyHeaderFooter(const uno::Reference<beans::XPropertySet>& xSourceStyle,
- const uno::Reference<beans::XPropertySet>& xTargetStyle,
- bool const bMissingHeader, bool const bMissingFooter)
-{
- if (!xSourceStyle.is() || !xTargetStyle.is())
- return;
-
- bool bSourceHasHeader = false;
- bool bSourceHasFooter = false;
- bool bSourceHeaderIsShared = true;
- bool bSourceFooterIsShared = true;
- bool bSourceFirstIsShared = true;
-
- const OUString& sHeaderIsOn = getPropertyName(PROP_HEADER_IS_ON);
- const OUString& sFooterIsOn = getPropertyName(PROP_FOOTER_IS_ON);
- const OUString& sHeaderIsShared = getPropertyName(PROP_HEADER_IS_SHARED);
- const OUString& sFooterIsShared = getPropertyName(PROP_FOOTER_IS_SHARED);
- const OUString& sFirstIsShared = getPropertyName(PROP_FIRST_IS_SHARED);
-
- xSourceStyle->getPropertyValue(sHeaderIsOn) >>= bSourceHasHeader;
- xSourceStyle->getPropertyValue(sFooterIsOn) >>= bSourceHasFooter;
- xSourceStyle->getPropertyValue(sHeaderIsShared) >>= bSourceHeaderIsShared;
- xSourceStyle->getPropertyValue(sFooterIsShared) >>= bSourceFooterIsShared;
- xSourceStyle->getPropertyValue(sFirstIsShared) >>= bSourceFirstIsShared;
-
- xTargetStyle->setPropertyValue(sHeaderIsOn, uno::Any(bSourceHasHeader));
- xTargetStyle->setPropertyValue(sFooterIsOn, uno::Any(bSourceHasFooter));
- xTargetStyle->setPropertyValue(sHeaderIsShared, uno::Any(bSourceHeaderIsShared));
- xTargetStyle->setPropertyValue(sFooterIsShared, uno::Any(bSourceFooterIsShared));
- xTargetStyle->setPropertyValue(sFirstIsShared, uno::Any(bSourceFirstIsShared));
-
- if (bSourceHasHeader)
- {
- if (!bSourceFirstIsShared)
- copyHeaderFooterTextProperty(xSourceStyle, xTargetStyle, PROP_HEADER_TEXT_FIRST);
- if (!bSourceHeaderIsShared)
- copyHeaderFooterTextProperty(xSourceStyle, xTargetStyle, PROP_HEADER_TEXT_LEFT);
- copyHeaderFooterTextProperty(xSourceStyle, xTargetStyle, PROP_HEADER_TEXT);
- }
-
- if (bSourceHasFooter)
- {
- if (!bSourceFirstIsShared)
- copyHeaderFooterTextProperty(xSourceStyle, xTargetStyle, PROP_FOOTER_TEXT_FIRST);
- if (!bSourceFooterIsShared)
- copyHeaderFooterTextProperty(xSourceStyle, xTargetStyle, PROP_FOOTER_TEXT_LEFT);
- copyHeaderFooterTextProperty(xSourceStyle, xTargetStyle, PROP_FOOTER_TEXT);
- }
- // tdf#153196 the copy is used for the first page, the source will be used
- // on subsequent pages, so clear source's first page header/footer
- if (!bSourceFirstIsShared)
- {
- xSourceStyle->setPropertyValue(sFirstIsShared, uno::Any(true));
- }
- // if there is *only* a first-footer, and no previous section from which
- // to inherit a footer, the import process has created an empty footer
- // that didn't exist in the file; remove it
- if (bSourceHasHeader && bMissingHeader)
- {
- xSourceStyle->setPropertyValue(sHeaderIsOn, uno::Any(false));
- }
- if (bSourceHasFooter && bMissingFooter)
- {
- // setting "FooterIsShared" to true here does nothing, because it causes
- // left footer to be stashed, which means it will be exported anyway
- xSourceStyle->setPropertyValue(sFooterIsOn, uno::Any(false));
- }
-}
-
-// Copy headers and footers from the previous page style.
-void copyHeaderFooter(const DomainMapper_Impl& rDM_Impl,
- const uno::Reference< beans::XPropertySet >& xPreviousStyle,
- const uno::Reference< beans::XPropertySet >& xStyle,
- bool bCopyRightHeader, bool bCopyLeftHeader, bool bCopyFirstHeader,
- bool bCopyRightFooter, bool bCopyLeftFooter, bool bCopyFirstFooter,
- bool bEvenAndOdd, bool bTitlePage)
-{
- if (!rDM_Impl.IsNewDoc())
- { // see also DomainMapper_Impl::PushPageHeaderFooter()
- return; // tdf#139737 SwUndoInserts cannot deal with new header/footer
- }
-
- if (!xPreviousStyle.is())
- return;
-
- bool bCopyHeader = bCopyRightHeader || bCopyLeftHeader || bCopyFirstHeader;
- bool bCopyFooter = bCopyRightFooter || bCopyLeftFooter || bCopyFirstFooter;
-
- if (!bCopyHeader && !bCopyFooter)
- return;
-
- bool bPreviousHasHeader = false;
- bool bPreviousHasFooter = false;
-
- bool bHasHeader = false;
- bool bHasFooter = false;
-
- const OUString& sHeaderIsOn = getPropertyName(PROP_HEADER_IS_ON);
- const OUString& sFooterIsOn = getPropertyName(PROP_FOOTER_IS_ON);
- const OUString& sHeaderIsShared = getPropertyName(PROP_HEADER_IS_SHARED);
- const OUString& sFooterIsShared = getPropertyName(PROP_FOOTER_IS_SHARED);
- const OUString& sFirstIsShared = getPropertyName(PROP_FIRST_IS_SHARED);
-
- xPreviousStyle->getPropertyValue(sHeaderIsOn) >>= bPreviousHasHeader;
- xPreviousStyle->getPropertyValue(sFooterIsOn) >>= bPreviousHasFooter;
-
- xStyle->getPropertyValue(sHeaderIsOn) >>= bHasHeader;
- xStyle->getPropertyValue(sFooterIsOn) >>= bHasFooter;
-
- xStyle->setPropertyValue(sHeaderIsOn, uno::Any(bPreviousHasHeader || bHasHeader));
- xStyle->setPropertyValue(sFooterIsOn, uno::Any(bPreviousHasFooter || bHasFooter));
- xStyle->setPropertyValue(sHeaderIsShared, uno::Any(false));
- xStyle->setPropertyValue(sFooterIsShared, uno::Any(false));
- xStyle->setPropertyValue(sFirstIsShared, uno::Any(false));
-
- if (bPreviousHasHeader && bCopyHeader)
- {
- if (bCopyRightHeader)
- copyHeaderFooterTextProperty(xPreviousStyle, xStyle, PROP_HEADER_TEXT);
- if (bCopyLeftHeader && bEvenAndOdd)
- copyHeaderFooterTextProperty(xPreviousStyle, xStyle, PROP_HEADER_TEXT_LEFT);
- if (bCopyFirstHeader && bTitlePage)
- copyHeaderFooterTextProperty(xPreviousStyle, xStyle, PROP_HEADER_TEXT_FIRST);
- }
-
- if (bPreviousHasFooter && bCopyFooter)
- {
- if (bCopyRightFooter)
- copyHeaderFooterTextProperty(xPreviousStyle, xStyle, PROP_FOOTER_TEXT);
- if (bCopyLeftFooter && bEvenAndOdd)
- copyHeaderFooterTextProperty(xPreviousStyle, xStyle, PROP_FOOTER_TEXT_LEFT);
- if (bCopyFirstFooter && bTitlePage)
- copyHeaderFooterTextProperty(xPreviousStyle, xStyle, PROP_FOOTER_TEXT_FIRST);
- }
-
- xStyle->setPropertyValue(sHeaderIsOn, uno::Any(bPreviousHasHeader || bHasHeader));
- xStyle->setPropertyValue(sFooterIsOn, uno::Any(bPreviousHasFooter || bHasFooter));
-
- xStyle->setPropertyValue(sHeaderIsShared, uno::Any(!bEvenAndOdd));
- xStyle->setPropertyValue(sFooterIsShared, uno::Any(!bEvenAndOdd));
- xStyle->setPropertyValue(sFirstIsShared, uno::Any(!bTitlePage));
-}
-
-} // end anonymous namespace
-
-
-// Copy header and footer content from the previous docx section as needed.
-//
-// Any headers and footers which were not defined in this docx section
-// should be "linked" with the corresponding header or footer from the
-// previous section. LO does not support linking of header/footer content
-// across page styles so we just copy the content from the previous section.
-void SectionPropertyMap::CopyLastHeaderFooter(DomainMapper_Impl& rDM_Impl )
-{
- SAL_INFO( "writerfilter", "START>>> SectionPropertyMap::CopyLastHeaderFooter()" );
- SectionPropertyMap* pLastContext = rDM_Impl.GetLastSectionContext();
- if (pLastContext)
- {
- uno::Reference<beans::XPropertySet> xPreviousStyle = pLastContext->GetPageStyle(rDM_Impl);
- uno::Reference<beans::XPropertySet> xStyle = GetPageStyle(rDM_Impl);
-
- bool bEvenAndOdd = rDM_Impl.GetSettingsTable()->GetEvenAndOddHeaders();
-
- copyHeaderFooter(rDM_Impl, xPreviousStyle, xStyle,
- m_bDefaultHeaderLinkToPrevious,
- m_bEvenPageHeaderLinkToPrevious,
- m_bFirstPageHeaderLinkToPrevious,
- m_bDefaultFooterLinkToPrevious,
- m_bEvenPageFooterLinkToPrevious,
- m_bFirstPageFooterLinkToPrevious,
- bEvenAndOdd, m_bTitlePage);
- }
- SAL_INFO( "writerfilter", "END>>> SectionPropertyMap::CopyLastHeaderFooter()" );
-}
-
-void SectionPropertyMap::PrepareHeaderFooterProperties()
-{
- sal_Int32 nTopMargin = m_nTopMargin;
- sal_Int32 nHeaderHeight = m_nHeaderTop;
- if (HasHeader())
- {
- nTopMargin = m_nHeaderTop;
- nHeaderHeight = m_nTopMargin - m_nHeaderTop;
-
- // minimum header height 1mm
- if ( nHeaderHeight < MIN_HEAD_FOOT_HEIGHT )
- nHeaderHeight = MIN_HEAD_FOOT_HEIGHT;
- }
-
- Insert(PROP_HEADER_IS_DYNAMIC_HEIGHT, uno::Any(m_bDynamicHeightTop));
- Insert(PROP_HEADER_DYNAMIC_SPACING, uno::Any(m_bDynamicHeightTop));
- Insert(PROP_HEADER_BODY_DISTANCE, uno::Any(nHeaderHeight - MIN_HEAD_FOOT_HEIGHT));
- Insert(PROP_HEADER_HEIGHT, uno::Any(nHeaderHeight));
- // looks like PROP_HEADER_HEIGHT = height of the header + space between the header, and the body
-
- sal_Int32 nBottomMargin = m_nBottomMargin;
- sal_Int32 nFooterHeight = m_nHeaderBottom;
- if (HasFooter())
- {
- nBottomMargin = m_nHeaderBottom;
- nFooterHeight = m_nBottomMargin - m_nHeaderBottom;
-
- // minimum footer height 1mm
- if ( nFooterHeight < MIN_HEAD_FOOT_HEIGHT )
- nFooterHeight = MIN_HEAD_FOOT_HEIGHT;
- }
-
- Insert(PROP_FOOTER_IS_DYNAMIC_HEIGHT, uno::Any(m_bDynamicHeightBottom));
- Insert(PROP_FOOTER_DYNAMIC_SPACING, uno::Any(m_bDynamicHeightBottom));
- Insert(PROP_FOOTER_BODY_DISTANCE, uno::Any(nFooterHeight - MIN_HEAD_FOOT_HEIGHT));
- Insert(PROP_FOOTER_HEIGHT, uno::Any(nFooterHeight));
-
- //now set the top/bottom margin for the follow page style
- Insert( PROP_TOP_MARGIN, uno::Any( std::max<sal_Int32>(nTopMargin, 0) ) );
- Insert( PROP_BOTTOM_MARGIN, uno::Any( std::max<sal_Int32>(nBottomMargin, 0) ) );
-}
-
-static uno::Reference< beans::XPropertySet > lcl_GetRangeProperties( bool bIsFirstSection,
- DomainMapper_Impl& rDM_Impl,
- const uno::Reference< text::XTextRange >& xStartingRange )
-{
- uno::Reference< beans::XPropertySet > xRangeProperties;
- if ( bIsFirstSection && rDM_Impl.GetBodyText().is() )
- {
- uno::Reference< container::XEnumerationAccess > xEnumAccess( rDM_Impl.GetBodyText(), uno::UNO_QUERY_THROW );
- uno::Reference< container::XEnumeration > xEnum = xEnumAccess->createEnumeration();
- xRangeProperties.set( xEnum->nextElement(), uno::UNO_QUERY_THROW );
- if ( rDM_Impl.GetIsDummyParaAddedForTableInSection() && xEnum->hasMoreElements() )
- xRangeProperties.set( xEnum->nextElement(), uno::UNO_QUERY_THROW );
- }
- else if ( xStartingRange.is() )
- xRangeProperties.set( xStartingRange, uno::UNO_QUERY_THROW );
- return xRangeProperties;
-}
-
-void SectionPropertyMap::HandleMarginsHeaderFooter(DomainMapper_Impl& rDM_Impl)
-{
- Insert( PROP_LEFT_MARGIN, uno::Any( m_nLeftMargin ) );
- Insert( PROP_RIGHT_MARGIN, uno::Any( m_nRightMargin ) );
- Insert(PROP_GUTTER_MARGIN, uno::Any(m_nGutterMargin));
-
- // w:background is applied to every page in the document
- if (!rDM_Impl.m_oBackgroundColor.has_value() && !rDM_Impl.IsRTFImport())
- {
- // DOCX has an interesting quirk, where if the fallback background color is not defined,
- // then the fill is not applied either.
-
- // Disable the imported fill from the default style
- if (rDM_Impl.m_bCopyStandardPageStyleFill && m_sPageStyleName == "Standard")
- {
- rDM_Impl.m_bCopyStandardPageStyleFill = false;
- m_aPageStyle->setPropertyValue("FillStyle", uno::Any(drawing::FillStyle_NONE));
- }
- }
- else if (rDM_Impl.m_bCopyStandardPageStyleFill) // complex fill: graphics/gradients/patterns
- {
- uno::Reference<beans::XPropertySet> xDefaultPageStyle(
- rDM_Impl.GetPageStyles()->getByName("Standard"), uno::UNO_QUERY_THROW);
- for (const beans::Property& rProp : m_aPageStyle->getPropertySetInfo()->getProperties())
- {
- try
- {
- const uno::Any aFillValue = xDefaultPageStyle->getPropertyValue(rProp.Name);
- m_aPageStyle->setPropertyValue(rProp.Name, aFillValue);
- }
- catch (uno::Exception&)
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter", "Exception setting page background fill");
- }
- }
- }
- else if (rDM_Impl.m_oBackgroundColor) // simple, solid color
- Insert( PROP_BACK_COLOR, uno::Any( *rDM_Impl.m_oBackgroundColor ) );
-
- // Check for missing footnote separator only in case there is at least
- // one footnote.
- if (rDM_Impl.m_StreamStateStack.top().bHasFtn && !rDM_Impl.m_bHasFtnSep)
- {
- // Set footnote line width to zero, document has no footnote separator.
- Insert(PROP_FOOTNOTE_LINE_RELATIVE_WIDTH, uno::Any(sal_Int32(0)));
- }
- if ( rDM_Impl.m_bHasFtnSep )
- {
- //If default paragraph style is RTL, footnote separator should be right aligned
- //and for RTL locales, LTR default paragraph style should present a left aligned footnote separator
- try
- {
- uno::Reference<style::XStyleFamiliesSupplier> xStylesSupplier(rDM_Impl.GetTextDocument(), uno::UNO_QUERY);
- if ( xStylesSupplier.is() )
- {
- uno::Reference<container::XNameAccess> xStyleFamilies = xStylesSupplier->getStyleFamilies();
- uno::Reference<container::XNameAccess> xParagraphStyles;
- if ( xStyleFamilies.is() )
- xStyleFamilies->getByName("ParagraphStyles") >>= xParagraphStyles;
- uno::Reference<beans::XPropertySet> xStandard;
- if ( xParagraphStyles.is() )
- xParagraphStyles->getByName("Standard") >>= xStandard;
- if ( xStandard.is() )
- {
- sal_Int16 aWritingMode(0);
- xStandard->getPropertyValue( getPropertyName(PROP_WRITING_MODE) ) >>= aWritingMode;
- if( aWritingMode == text::WritingMode2::RL_TB )
- Insert( PROP_FOOTNOTE_LINE_ADJUST, uno::Any( sal_Int16(text::HorizontalAdjust_RIGHT) ), false );
- else
- Insert( PROP_FOOTNOTE_LINE_ADJUST, uno::Any( sal_Int16(text::HorizontalAdjust_LEFT) ), false );
- }
- }
- }
- catch ( const uno::Exception& ) {}
- }
-
- /*** if headers/footers are available then the top/bottom margins of the
- header/footer are copied to the top/bottom margin of the page
- */
- CopyLastHeaderFooter(rDM_Impl);
- PrepareHeaderFooterProperties();
-
- // tdf#119952: If top/bottom margin was negative during docx import,
- // then the header/footer and the body could be on top of each other
- // writer is unable to display both of them in the same position, but can be simulated
- // by moving the header/footer text into a flyframe anchored to the header/footer,
- // leaving an empty dummy header/footer.
- rDM_Impl.ConvertHeaderFooterToTextFrame(m_bDynamicHeightTop, m_bDynamicHeightBottom);
-}
-
-void SectionPropertyMap::InheritOrFinalizePageStyles(DomainMapper_Impl& rDM_Impl)
-{
- // if no new styles have been created for this section, inherit from the previous section,
- // otherwise apply this section's settings to the new style.
- SectionPropertyMap* pLastContext = rDM_Impl.GetLastSectionContext();
- //tdf124637 TODO: identify and skip special sections (like footnotes/endnotes)
- if (pLastContext && m_sPageStyleName.isEmpty())
- m_sPageStyleName = pLastContext->GetPageStyleName();
- else
- {
- HandleMarginsHeaderFooter(rDM_Impl);
- GetPageStyle(rDM_Impl);
- if (rDM_Impl.IsNewDoc() && m_aPageStyle.is())
- ApplyProperties_(m_aPageStyle);
- }
-}
-
-void SectionPropertyMap::HandleIncreasedAnchoredObjectSpacing(DomainMapper_Impl& rDM_Impl)
-{
- // Ignore Word 2010 and older.
- if (rDM_Impl.GetSettingsTable()->GetWordCompatibilityMode() < 15)
- return;
-
- sal_Int32 nPageWidth = GetPageWidth();
- sal_Int32 nTextAreaWidth = nPageWidth - GetLeftMargin() - GetRightMargin();
-
- std::vector<AnchoredObjectsInfo>& rAnchoredObjectAnchors = rDM_Impl.m_aAnchoredObjectAnchors;
- for (const auto& rAnchor : rAnchoredObjectAnchors)
- {
- // Ignore this paragraph when there are not enough shapes to trigger the Word bug we
- // emulate.
- if (rAnchor.m_aAnchoredObjects.size() < 4)
- continue;
-
- // Ignore this paragraph if none of the objects are wrapped in the background.
- sal_Int32 nOpaqueCount = 0;
- for (const auto& rAnchored : rAnchor.m_aAnchoredObjects)
- {
- // Ignore inline objects stored only for redlining.
- if (rAnchored.m_xRedlineForInline)
- continue;
-
- uno::Reference<beans::XPropertySet> xShape(rAnchored.m_xAnchoredObject, uno::UNO_QUERY);
- if (!xShape.is())
- {
- continue;
- }
-
- bool bOpaque = true;
- xShape->getPropertyValue("Opaque") >>= bOpaque;
- if (!bOpaque)
- {
- ++nOpaqueCount;
- }
- }
- if (nOpaqueCount < 1)
- {
- continue;
- }
-
- // Analyze the anchored objects of this paragraph, now that we know the
- // page width.
- sal_Int32 nShapesWidth = 0;
- for (const auto& rAnchored : rAnchor.m_aAnchoredObjects)
- {
- uno::Reference<drawing::XShape> xShape(rAnchored.m_xAnchoredObject, uno::UNO_QUERY);
- if (!xShape.is())
- continue;
-
- uno::Reference<beans::XPropertySet> xPropertySet(xShape, uno::UNO_QUERY);
- if (!xPropertySet.is())
- continue;
-
- // Ignore objects with no wrapping.
- text::WrapTextMode eWrap = text::WrapTextMode_THROUGH;
- xPropertySet->getPropertyValue("Surround") >>= eWrap;
- if (eWrap == text::WrapTextMode_THROUGH)
- continue;
-
- // Use the original left margin, in case GraphicImport::lcl_sprm() reduced the doc model
- // one to 0.
- sal_Int32 nLeftMargin = rAnchored.m_nLeftMargin;
- sal_Int32 nRightMargin = 0;
- xPropertySet->getPropertyValue("RightMargin") >>= nRightMargin;
- nShapesWidth += xShape->getSize().Width + nLeftMargin + nRightMargin;
- }
-
- // Ignore cases when we have enough horizontal space for the shapes.
- if (nTextAreaWidth > nShapesWidth)
- continue;
-
- sal_Int32 nHeight = 0;
- for (const auto& rAnchored : rAnchor.m_aAnchoredObjects)
- {
- uno::Reference<drawing::XShape> xShape(rAnchored.m_xAnchoredObject, uno::UNO_QUERY);
- if (!xShape.is())
- continue;
-
- nHeight += xShape->getSize().Height;
- }
-
- uno::Reference<beans::XPropertySet> xParagraph(rAnchor.m_xParagraph, uno::UNO_QUERY);
- if (xParagraph.is())
- {
- sal_Int32 nTopMargin = 0;
- xParagraph->getPropertyValue("ParaTopMargin") >>= nTopMargin;
- // Increase top spacing of the paragraph to match Word layout
- // behavior.
- nTopMargin = std::max(nTopMargin, nHeight);
- xParagraph->setPropertyValue("ParaTopMargin", uno::Any(nTopMargin));
- }
- }
- rAnchoredObjectAnchors.clear();
-}
-
-void BeforeConvertToTextFrame(std::deque<css::uno::Any>& rFramedRedlines, std::vector<sal_Int32>& redPos, std::vector<sal_Int32>& redLen, std::vector<OUString>& redCell, std::vector<OUString>& redTable)
-{
- // convert redline ranges to cursor movement and character length
- for( size_t i = 0; i < rFramedRedlines.size(); i+=3)
- {
- uno::Reference<text::XText> xCell;
- uno::Reference< text::XTextRange > xRange;
- rFramedRedlines[i] >>= xRange;
- uno::Reference< beans::XPropertySet > xRangeProperties;
- if ( xRange.is() )
- {
- OUString sTableName;
- OUString sCellName;
- xRangeProperties.set( xRange, uno::UNO_QUERY_THROW );
- if (xRangeProperties->getPropertySetInfo()->hasPropertyByName("TextTable"))
- {
- uno::Any aTable = xRangeProperties->getPropertyValue("TextTable");
- if ( aTable != uno::Any() )
- {
- uno::Reference<text::XTextTable> xTable;
- aTable >>= xTable;
- uno::Reference<beans::XPropertySet> xTableProperties(xTable, uno::UNO_QUERY);
- xTableProperties->getPropertyValue("TableName") >>= sTableName;
- }
- if (xRangeProperties->getPropertySetInfo()->hasPropertyByName("Cell"))
- {
- uno::Any aCell = xRangeProperties->getPropertyValue("Cell");
- if ( aCell != uno::Any() )
- {
- aCell >>= xCell;
- uno::Reference<beans::XPropertySet> xCellProperties(xCell, uno::UNO_QUERY);
- xCellProperties->getPropertyValue("CellName") >>= sCellName;
- }
- }
- }
- redTable.push_back(sTableName);
- redCell.push_back(sCellName);
- bool bOk = false;
- if (!sTableName.isEmpty() && !sCellName.isEmpty())
- {
- uno::Reference<text::XTextCursor> xRangeCursor = xCell->createTextCursorByRange( xRange );
- if ( xRangeCursor.is() )
- {
- bOk = true;
- sal_Int32 nLen = xRange->getString().getLength();
- redLen.push_back(nLen);
- xRangeCursor->gotoStart(true);
- redPos.push_back(xRangeCursor->getString().getLength() - nLen);
- }
- }
- if (!bOk)
- {
- // missing cell or failed createTextCursorByRange()
- redLen.push_back(-1);
- redPos.push_back(-1);
- }
- }
- }
-}
-
-void AfterConvertToTextFrame(DomainMapper_Impl& rDM_Impl, std::deque<css::uno::Any>& aFramedRedlines, std::vector<sal_Int32>& redPos, std::vector<sal_Int32>& redLen, std::vector<OUString>& redCell, std::vector<OUString>& redTable)
-{
- uno::Reference<text::XTextTablesSupplier> xTextDocument(rDM_Impl.GetTextDocument(), uno::UNO_QUERY);
- uno::Reference<container::XNameAccess> xTables = xTextDocument->getTextTables();
- for( size_t i = 0; i < aFramedRedlines.size(); i+=3)
- {
- OUString sType;
- beans::PropertyValues aRedlineProperties( 3 );
- // skip failed createTextCursorByRange()
- if (redPos[i/3] == -1)
- continue;
- aFramedRedlines[i+1] >>= sType;
- aFramedRedlines[i+2] >>= aRedlineProperties;
- uno::Reference<text::XTextTable> xTable(xTables->getByName(redTable[i/3]), uno::UNO_QUERY);
- uno::Reference<text::XText> xCell(xTable->getCellByName(redCell[i/3]), uno::UNO_QUERY);
- uno::Reference<text::XTextCursor> xCrsr = xCell->createTextCursor();
- xCrsr->goRight(redPos[i/3], false);
- xCrsr->goRight(redLen[i/3], true);
- uno::Reference < text::XRedline > xRedline( xCrsr, uno::UNO_QUERY_THROW );
- try
- {
- xRedline->makeRedline( sType, aRedlineProperties );
- }
- catch (const uno::Exception&)
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter", "makeRedline() failed");
- }
- }
-}
-
-void SectionPropertyMap::CreateEvenOddPageStyleCopy(DomainMapper_Impl& rDM_Impl, PageBreakType eBreakType)
-{
- OUString evenOddStyleName = rDM_Impl.GetUnusedPageStyleName();
- uno::Reference<beans::XPropertySet> evenOddStyle(
- rDM_Impl.GetTextFactory()->createInstance("com.sun.star.style.PageStyle"),
- uno::UNO_QUERY);
- // Unfortunately using setParent() does not work for page styles, so make a deep copy of the page style.
- uno::Reference<beans::XPropertySet> pageProperties(m_aPageStyle);
- uno::Reference<beans::XPropertySetInfo> pagePropertiesInfo(pageProperties->getPropertySetInfo());
- const uno::Sequence<beans::Property> propertyList(pagePropertiesInfo->getProperties());
-
- // Ignore write-only properties.
- static constexpr frozen::unordered_set<std::u16string_view, 14> staticDenylist = {
- u"FooterBackGraphicURL", u"BackGraphicURL", u"HeaderBackGraphicURL",
- u"HeaderIsOn", u"FooterIsOn",
- u"HeaderIsShared", u"FooterIsShared", u"FirstIsShared",
- u"HeaderText", u"HeaderTextLeft", u"HeaderTextFirst",
- u"FooterText", u"FooterTextLeft", u"FooterTextFirst" };
-
- for (const auto& rProperty : propertyList)
- {
- if ((rProperty.Attributes & beans::PropertyAttribute::READONLY) == 0)
- {
- if (staticDenylist.find(rProperty.Name) == staticDenylist.end())
- {
- evenOddStyle->setPropertyValue(
- rProperty.Name,
- pageProperties->getPropertyValue(rProperty.Name));
- }
- }
- }
- evenOddStyle->setPropertyValue("FollowStyle", uno::Any(m_sPageStyleName));
-
- rDM_Impl.GetPageStyles()->insertByName(evenOddStyleName, uno::Any(evenOddStyle));
-
- if (rDM_Impl.IsNewDoc())
- {
- bool const bEvenAndOdd(rDM_Impl.GetSettingsTable()->GetEvenAndOddHeaders());
- completeCopyHeaderFooter(pageProperties, evenOddStyle,
- !rDM_Impl.SeenHeaderFooter(PagePartType::Header, PageType::RIGHT)
- && (!bEvenAndOdd || !rDM_Impl.SeenHeaderFooter(PagePartType::Header, PageType::LEFT)),
- !rDM_Impl.SeenHeaderFooter(PagePartType::Footer, PageType::RIGHT)
- && (!bEvenAndOdd || !rDM_Impl.SeenHeaderFooter(PagePartType::Footer, PageType::LEFT)));
- }
-
- if (eBreakType == PageBreakType::Even)
- evenOddStyle->setPropertyValue(getPropertyName(PROP_PAGE_STYLE_LAYOUT), uno::Any(style::PageStyleLayout_LEFT));
- else if (eBreakType == PageBreakType::Odd)
- evenOddStyle->setPropertyValue(getPropertyName(PROP_PAGE_STYLE_LAYOUT), uno::Any(style::PageStyleLayout_RIGHT));
-
- m_sPageStyleName = evenOddStyleName; // And use it instead of the original one (which is set as follow of this one).
-}
-
-void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
-{
- SectionPropertyMap* pPrevSection = rDM_Impl.GetLastSectionContext();
-
- // The default section type is nextPage.
- if ( m_nBreakType == -1 )
- m_nBreakType = NS_ooxml::LN_Value_ST_SectionMark_nextPage;
- else if ( m_nBreakType == NS_ooxml::LN_Value_ST_SectionMark_nextColumn )
- {
- // Word 2013+ seems to treat a section column break as a page break all the time.
- // It always acts like a page break if there are no columns, or a different number of columns.
- // Also, if this is the first section, the break type is basically irrelevant - works best as nextPage.
- if ( rDM_Impl.GetSettingsTable()->GetWordCompatibilityMode() > 14
- || !pPrevSection
- || m_nColumnCount < 2
- || m_nColumnCount != pPrevSection->ColumnCount()
- )
- {
- m_nBreakType = NS_ooxml::LN_Value_ST_SectionMark_nextPage;
- }
- }
- else if ( m_nBreakType == NS_ooxml::LN_Value_ST_SectionMark_continuous )
- {
- // if page orientation differs from previous section, it can't be treated as continuous
- if ( pPrevSection )
- {
- bool bIsLandscape = false;
- std::optional< PropertyMap::Property > pProp = getProperty( PROP_IS_LANDSCAPE );
- if ( pProp )
- pProp->second >>= bIsLandscape;
-
- bool bPrevIsLandscape = false;
- pProp = pPrevSection->getProperty( PROP_IS_LANDSCAPE );
- if ( pProp )
- pProp->second >>= bPrevIsLandscape;
-
- if ( bIsLandscape != bPrevIsLandscape )
- m_nBreakType = NS_ooxml::LN_Value_ST_SectionMark_nextPage;
- }
- }
-
- try
- {
- HandleIncreasedAnchoredObjectSpacing(rDM_Impl);
- }
- catch (const uno::Exception&)
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter", "HandleIncreasedAnchoredObjectSpacing() failed");
- }
-
- if ( m_nLnnMod )
- {
- bool bFirst = rDM_Impl.IsLineNumberingSet();
- rDM_Impl.SetLineNumbering( m_nLnnMod, m_nLnc, m_ndxaLnn );
- if ( m_nLnnMin > 0 || (bFirst && m_nLnc == NS_ooxml::LN_Value_ST_LineNumberRestart_newSection) )
- {
- //set the starting value at the beginning of the section
- try
- {
- uno::Reference< beans::XPropertySet > xRangeProperties;
- if ( m_xStartingRange.is() )
- {
- xRangeProperties.set( m_xStartingRange, uno::UNO_QUERY_THROW );
- }
- else
- {
- //set the start value at the beginning of the document
- xRangeProperties.set( rDM_Impl.GetTextDocument()->getText()->getStart(), uno::UNO_QUERY_THROW );
- }
- // Writer is 1-based, Word is 0-based.
- xRangeProperties->setPropertyValue(
- getPropertyName(PROP_PARA_LINE_NUMBER_START_VALUE),
- uno::Any(m_nLnnMin + 1));
- }
- catch ( const uno::Exception& )
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter.dmapper", "Exception in SectionPropertyMap::CloseSectionGroup");
- }
- }
- }
-
- if (m_nBreakType == NS_ooxml::LN_Value_ST_SectionMark_continuous
- && !rDM_Impl.IsInComments())
- {
- //todo: insert a section or access the already inserted section
- uno::Reference< beans::XPropertySet > xSection =
- rDM_Impl.appendTextSectionAfter( m_xStartingRange );
- if ( xSection.is() )
- {
- if ( m_nColumnCount > 1 )
- ApplyColumnProperties( xSection, rDM_Impl );
-
- ApplyProtectionProperties( xSection, rDM_Impl );
- }
-
- try
- {
- setHeaderFooterProperties(rDM_Impl);
- InheritOrFinalizePageStyles( rDM_Impl );
- ApplySectionProperties( xSection, rDM_Impl ); //depends on InheritOrFinalizePageStyles
- uno::Reference< beans::XPropertySet > xRangeProperties( lcl_GetRangeProperties( m_bIsFirstSection, rDM_Impl, m_xStartingRange ) );
- if ( m_bIsFirstSection && !m_sPageStyleName.isEmpty() && xRangeProperties.is() )
- {
- xRangeProperties->setPropertyValue(getPropertyName(PROP_PAGE_DESC_NAME), uno::Any(m_sPageStyleName));
- }
- else if ((!m_bFirstPageHeaderLinkToPrevious ||
- !m_bFirstPageFooterLinkToPrevious ||
- !m_bDefaultHeaderLinkToPrevious ||
- !m_bDefaultFooterLinkToPrevious ||
- !m_bEvenPageHeaderLinkToPrevious ||
- !m_bEvenPageFooterLinkToPrevious)
- && rDM_Impl.GetCurrentXText())
- {
- // find a node in the section that has a page break and change
- // it to apply the page style; see "nightmare scenario" in
- // wwSectionManager::InsertSegments()
- auto xTextAppend = rDM_Impl.GetCurrentXText();
- uno::Reference<container::XEnumerationAccess> const xCursor(
- xTextAppend->createTextCursorByRange(
- uno::Reference<text::XTextContent>(xSection, uno::UNO_QUERY_THROW)->getAnchor()),
- uno::UNO_QUERY_THROW);
- uno::Reference<container::XEnumeration> const xEnum(
- xCursor->createEnumeration());
- bool isFound = false;
- while (xEnum->hasMoreElements())
- {
- uno::Reference<beans::XPropertySet> xElem;
- xEnum->nextElement() >>= xElem;
- if (xElem->getPropertySetInfo()->hasPropertyByName("BreakType"))
- {
- style::BreakType eBreakType;
- if ((xElem->getPropertyValue("BreakType") >>= eBreakType) && eBreakType == style::BreakType_PAGE_BEFORE)
- {
- // tdf#112201: do *not* use m_sFirstPageStyleName here!
- xElem->setPropertyValue(getPropertyName(PROP_PAGE_DESC_NAME), uno::Any(m_sPageStyleName));
- m_aPageStyle->setPropertyValue(getPropertyName(PROP_FIRST_IS_SHARED), uno::Any(true));
- isFound = true;
- break;
- }
- }
- }
- uno::Reference<text::XParagraphCursor> const xPCursor(xCursor, uno::UNO_QUERY_THROW);
- float fCharHeight = 0;
- if (!isFound)
- { // HACK: try the last paragraph of the previous section
- xPCursor->gotoPreviousParagraph(false);
- uno::Reference<beans::XPropertySet> const xPSCursor(xCursor, uno::UNO_QUERY_THROW);
- style::BreakType eBreakType;
- if ((xPSCursor->getPropertyValue("BreakType") >>= eBreakType) && eBreakType == style::BreakType_PAGE_BEFORE)
- {
- xPSCursor->setPropertyValue(getPropertyName(PROP_PAGE_DESC_NAME), uno::Any(m_sPageStyleName));
- m_aPageStyle->setPropertyValue(getPropertyName(PROP_FIRST_IS_SHARED), uno::Any(true));
- isFound = true;
- }
- else
- {
- xPSCursor->getPropertyValue("CharHeight") >>= fCharHeight;
- }
- }
- if (!isFound && fCharHeight <= 1.0)
- {
- // If still not found, see if the last paragraph is ~invisible, and work with
- // the last-in-practice paragraph.
- xPCursor->gotoPreviousParagraph(false);
- uno::Reference<beans::XPropertySet> xPropertySet(xCursor, uno::UNO_QUERY_THROW);
- OUString aPageDescName;
- if ((xPropertySet->getPropertyValue("PageDescName") >>= aPageDescName) && !aPageDescName.isEmpty())
- {
- uno::Reference<beans::XPropertySet> xPageStyle(rDM_Impl.GetPageStyles()->getByName(aPageDescName), uno::UNO_QUERY);
- xPageStyle->setPropertyValue("FollowStyle", uno::Any(m_sPageStyleName));
- m_aPageStyle->setPropertyValue(getPropertyName(PROP_FIRST_IS_SHARED), uno::Any(true));
- }
- }
- }
- }
- catch ( const uno::Exception& )
- {
- SAL_WARN( "writerfilter", "failed to set PageDescName!" );
- }
- }
- // If the section is of type "New column" (0x01), then simply insert a column break.
- // But only if there actually are columns on the page, otherwise a column break
- // seems to be handled like a page break by MSO.
- else if (m_nBreakType == NS_ooxml::LN_Value_ST_SectionMark_nextColumn
- && m_nColumnCount > 1 && !rDM_Impl.IsInComments())
- {
- try
- {
- setHeaderFooterProperties(rDM_Impl);
- InheritOrFinalizePageStyles( rDM_Impl );
- /*TODO tdf#135343: Just inserting a column break sounds like the right idea, but the implementation is wrong.
- * Somehow, the previous column section needs to be extended to cover this new text.
- * Currently, it is completely broken, producing a no-column section that starts on a new page.
- */
- uno::Reference< beans::XPropertySet > xRangeProperties;
- if ( m_xStartingRange.is() )
- {
- xRangeProperties.set( m_xStartingRange, uno::UNO_QUERY_THROW );
- }
- else
- {
- //set the start value at the beginning of the document
- xRangeProperties.set( rDM_Impl.GetTextDocument()->getText()->getStart(), uno::UNO_QUERY_THROW );
- }
- xRangeProperties->setPropertyValue( getPropertyName( PROP_BREAK_TYPE ), uno::Any( style::BreakType_COLUMN_BEFORE ) );
- }
- catch ( const uno::Exception& ) {}
- }
- else if (!rDM_Impl.IsInComments())
- {
- uno::Reference< beans::XPropertySet > xSection;
- ApplyProtectionProperties( xSection, rDM_Impl );
-
- //get the properties and create appropriate page styles
- uno::Reference<beans::XPropertySet> xPageStyle;
- //This part certainly is not needed for footnotes, so don't create unused page styles.
- if ( !rDM_Impl.IsInFootOrEndnote() )
- {
- xPageStyle.set(GetPageStyle(rDM_Impl));
- setHeaderFooterProperties(rDM_Impl);
- HandleMarginsHeaderFooter(rDM_Impl);
- }
-
- if ( rDM_Impl.GetSettingsTable()->GetMirrorMarginSettings() )
- {
- Insert( PROP_PAGE_STYLE_LAYOUT, uno::Any( style::PageStyleLayout_MIRRORED ) );
- }
- uno::Reference< text::XTextColumns > xColumns;
- if ( m_nColumnCount > 1 )
- {
- // prefer setting column properties into a section, not a page style if at all possible.
- if ( !xSection.is() )
- xSection = rDM_Impl.appendTextSectionAfter( m_xStartingRange );
- if ( xSection.is() )
- ApplyColumnProperties(xSection, rDM_Impl);
- else if (xPageStyle.is())
- xColumns = ApplyColumnProperties(xPageStyle, rDM_Impl);
- }
-
- // these BreakTypes are effectively page-breaks: don't evenly distribute text in columns before a page break;
- if ( pPrevSection && pPrevSection->ColumnCount() )
- pPrevSection->DontBalanceTextColumns();
-
- //prepare text grid properties
- sal_Int32 nHeight = 1;
- std::optional< PropertyMap::Property > pProp = getProperty( PROP_HEIGHT );
- if ( pProp )
- pProp->second >>= nHeight;
-
- sal_Int32 nWidth = 1;
- pProp = getProperty( PROP_WIDTH );
- if ( pProp )
- pProp->second >>= nWidth;
-
- sal_Int16 nWritingMode = text::WritingMode2::LR_TB;
- pProp = getProperty( PROP_WRITING_MODE );
- if ( pProp )
- pProp->second >>= nWritingMode;
-
- sal_Int32 nTextAreaHeight = nWritingMode == text::WritingMode2::LR_TB ?
- nHeight - m_nTopMargin - m_nBottomMargin :
- nWidth - m_nLeftMargin - m_nRightMargin;
-
- sal_Int32 nGridLinePitch = m_nGridLinePitch;
- //sep.dyaLinePitch
- if ( nGridLinePitch < 1 || nGridLinePitch > 31680 )
- {
- SAL_WARN( "writerfilter", "sep.dyaLinePitch outside legal range: " << nGridLinePitch );
- nGridLinePitch = 1;
- }
-
- const sal_Int32 nGridLines = nTextAreaHeight / nGridLinePitch;
- sal_Int16 nGridType = m_nGridType;
- if ( nGridLines >= 0 && nGridLines <= SAL_MAX_INT16 )
- Insert( PROP_GRID_LINES, uno::Any( sal_Int16(nGridLines) ) );
- else
- nGridType = text::TextGridMode::NONE;
-
- // PROP_GRID_MODE
- if ( nGridType == text::TextGridMode::LINES_AND_CHARS )
- {
- if (!m_nDxtCharSpace)
- nGridType = text::TextGridMode::LINES;
- else
- Insert( PROP_GRID_SNAP_TO_CHARS, uno::Any( m_bGridSnapToChars ) );
- }
-
- Insert( PROP_GRID_MODE, uno::Any( nGridType ) );
-
- sal_Int32 nCharWidth = 423; //240 twip/ 12 pt
- const StyleSheetEntryPtr pEntry = rDM_Impl.GetStyleSheetTable()->FindStyleSheetByConvertedStyleName( u"Standard" );
- if ( pEntry )
- {
- std::optional< PropertyMap::Property > pPropHeight = pEntry->m_pProperties->getProperty( PROP_CHAR_HEIGHT_ASIAN );
- if ( pPropHeight )
- {
- double fHeight = 0;
- if ( pPropHeight->second >>= fHeight )
- nCharWidth = ConversionHelper::convertTwipToMM100( static_cast<tools::Long>(fHeight * 20.0 + 0.5) );
- }
- }
-
- //dxtCharSpace
- if ( m_nDxtCharSpace )
- {
- sal_Int32 nCharSpace = m_nDxtCharSpace;
- //main lives in top 20 bits, and is signed.
- sal_Int32 nMain = (nCharSpace & 0xFFFFF000);
- nMain /= 0x1000;
- nCharWidth += ConversionHelper::convertTwipToMM100( nMain * 20 );
-
- sal_Int32 nFraction = (nCharSpace & 0x00000FFF);
- nFraction = (nFraction * 20) / 0xFFF;
- nCharWidth += ConversionHelper::convertTwipToMM100( nFraction );
- }
-
- if ( m_nPageNumberType >= 0 )
- Insert( PROP_NUMBERING_TYPE, uno::Any( m_nPageNumberType ) );
-
- // #i119558#, force to set document as standard page mode,
- // refer to ww8 import process function "SwWW8ImplReader::SetDocumentGrid"
- try
- {
- uno::Reference< beans::XPropertySet > xDocProperties;
- xDocProperties.set( rDM_Impl.GetTextDocument(), uno::UNO_QUERY_THROW );
- Insert(PROP_GRID_STANDARD_MODE, uno::Any(true));
- xDocProperties->setPropertyValue("DefaultPageMode", uno::Any(false));
- }
- catch ( const uno::Exception& )
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter.dmapper", "Exception in SectionPropertyMap::CloseSectionGroup");
- }
-
- Insert( PROP_GRID_BASE_HEIGHT, uno::Any( nGridLinePitch ) );
- Insert( PROP_GRID_BASE_WIDTH, uno::Any( nCharWidth ) );
- Insert( PROP_GRID_RUBY_HEIGHT, uno::Any( sal_Int32( 0 ) ) );
-
- if (rDM_Impl.IsNewDoc() && xPageStyle.is())
- ApplyProperties_(xPageStyle);
-
- ApplyBorderToPageStyles( rDM_Impl, m_eBorderApply, m_eBorderOffsetFrom );
- ApplyPaperSource(rDM_Impl);
-
- try
- {
- //now apply this break at the first paragraph of this section
- uno::Reference< beans::XPropertySet > xRangeProperties( lcl_GetRangeProperties( m_bIsFirstSection, rDM_Impl, m_xStartingRange ) );
-
- // Handle page breaks with odd/even page numbering. We need to use an extra page style for setting the page style
- // to left/right, because if we set it to the normal style, we'd set it to "First Page"/"Default Style", which would
- // break them (all default pages would be only left or right).
- if (m_nBreakType == NS_ooxml::LN_Value_ST_SectionMark_evenPage)
- {
- CreateEvenOddPageStyleCopy(rDM_Impl, PageBreakType::Even);
- }
- else if (m_nBreakType == NS_ooxml::LN_Value_ST_SectionMark_oddPage)
- {
- CreateEvenOddPageStyleCopy(rDM_Impl, PageBreakType::Odd);
- }
-
- if (rDM_Impl.m_xAltChunkStartingRange.is())
- {
- xRangeProperties.set(rDM_Impl.m_xAltChunkStartingRange, uno::UNO_QUERY);
- }
- if (xRangeProperties.is() && (rDM_Impl.IsNewDoc() || rDM_Impl.IsAltChunk()))
- {
- // Avoid setting page style in case of autotext: so inserting the autotext at the
- // end of the document does not introduce an unwanted page break.
- // Also avoid setting the page style at the very beginning if it still is the default page style.
- const OUString sPageStyle = m_sPageStyleName;
- if (!rDM_Impl.IsReadGlossaries()
- && !rDM_Impl.IsInFootOrEndnote()
- && !(m_bIsFirstSection && sPageStyle == getPropertyName( PROP_STANDARD ) && m_nPageNumber < 0)
- )
- {
- xRangeProperties->setPropertyValue(
- getPropertyName( PROP_PAGE_DESC_NAME ),
- uno::Any(sPageStyle) );
- }
-
- if (0 <= m_nPageNumber)
- {
- sal_Int16 nPageNumber = static_cast< sal_Int16 >(m_nPageNumber);
- xRangeProperties->setPropertyValue(getPropertyName(PROP_PAGE_NUMBER_OFFSET),
- uno::Any(nPageNumber));
- }
- }
- }
- catch ( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "SectionPropertyMap::CloseSectionGroup" );
- }
- }
-
- // Now that the margins are known, resize relative width shapes because some shapes in LO do not support percentage-sizes
- sal_Int32 nParagraphWidth = GetPageWidth() - m_nLeftMargin - m_nRightMargin;
- if ( m_nColumnCount > 1 )
- {
- // skip custom-width columns since we don't know what column the shape is in.
- if ( !m_aColWidth.empty() )
- nParagraphWidth = 0;
- else
- nParagraphWidth = (nParagraphWidth - (m_nColumnDistance * (m_nColumnCount - 1))) / m_nColumnCount;
- }
- if ( nParagraphWidth > 0 )
- {
- const OUString & sPropRelativeWidth = getPropertyName(PROP_RELATIVE_WIDTH);
- for ( const auto& xShape : m_xRelativeWidthShapes )
- {
- const uno::Reference<beans::XPropertySet> xShapePropertySet( xShape, uno::UNO_QUERY );
- if ( xShapePropertySet->getPropertySetInfo()->hasPropertyByName(sPropRelativeWidth) )
- {
- sal_uInt16 nPercent = 0;
- try
- {
- xShapePropertySet->getPropertyValue(sPropRelativeWidth) >>= nPercent;
- }
- catch (const css::uno::RuntimeException& e)
- {
- // May happen e.g. when text frame has no frame format
- // See sw/qa/extras/ooxmlimport/data/n779627.docx
- SAL_WARN("writerfilter", "Getting relative width failed. " << e.Message);
- }
- if ( nPercent )
- {
- const sal_Int32 nWidth = nParagraphWidth * nPercent / 100;
- xShape->setSize( awt::Size( nWidth, xShape->getSize().Height ) );
- }
- }
- }
- }
- m_xRelativeWidthShapes.clear();
-
- rDM_Impl.SetIsLastSectionGroup( false );
- rDM_Impl.SetIsFirstParagraphInSection( true );
-
- if ( !rDM_Impl.IsInFootOrEndnote() && !rDM_Impl.IsInComments() )
- {
- rDM_Impl.m_StreamStateStack.top().bHasFtn = false;
- rDM_Impl.m_bHasFtnSep = false;
- }
-}
-
-// Clear the flag that says we should take the header/footer content from
-// the previous section. This should be called when we encounter a header
-// or footer definition for this section.
-void SectionPropertyMap::clearHeaderFooterLinkToPrevious(PagePartType ePartType, PageType eType)
-{
- if (ePartType == PagePartType::Header)
- {
- switch (eType)
- {
- case PageType::FIRST: m_bFirstPageHeaderLinkToPrevious = false; break;
- case PageType::LEFT: m_bEvenPageHeaderLinkToPrevious = false; break;
- case PageType::RIGHT: m_bDefaultHeaderLinkToPrevious = false; break;
- }
- }
- else if (ePartType == PagePartType::Footer)
- {
- switch (eType)
- {
- case PageType::FIRST: m_bFirstPageFooterLinkToPrevious = false; break;
- case PageType::LEFT: m_bEvenPageFooterLinkToPrevious = false; break;
- case PageType::RIGHT: m_bDefaultFooterLinkToPrevious = false; break;
- }
- }
-}
-
-namespace {
-
-class NamedPropertyValue
-{
-private:
- OUString m_aName;
-
-public:
- explicit NamedPropertyValue( OUString i_aStr )
- : m_aName(std::move( i_aStr ))
- {
- }
-
- bool operator() ( beans::PropertyValue const & aVal )
- {
- return aVal.Name == m_aName;
- }
-};
-
-}
-
-void SectionPropertyMap::ApplyProperties_( const uno::Reference< beans::XPropertySet >& xStyle )
-{
- uno::Reference< beans::XMultiPropertySet > const xMultiSet( xStyle, uno::UNO_QUERY );
-
- std::vector< OUString > vNames;
- std::vector< uno::Any > vValues;
- {
- // Convert GetPropertyValues() value into something useful
- const uno::Sequence< beans::PropertyValue > vPropVals = GetPropertyValues();
-
- //Temporarily store the items that are in grab bags
- uno::Sequence< beans::PropertyValue > vCharVals;
- uno::Sequence< beans::PropertyValue > vParaVals;
- const beans::PropertyValue* pCharGrabBag = std::find_if( vPropVals.begin(), vPropVals.end(), NamedPropertyValue( "CharInteropGrabBag" ) );
- if ( pCharGrabBag != vPropVals.end() )
- (pCharGrabBag->Value) >>= vCharVals;
- const beans::PropertyValue* pParaGrabBag = std::find_if( vPropVals.begin(), vPropVals.end(), NamedPropertyValue( "ParaInteropGrabBag" ) );
- if ( pParaGrabBag != vPropVals.end() )
- (pParaGrabBag->Value) >>= vParaVals;
-
- for ( const beans::PropertyValue* pIter = vPropVals.begin(); pIter != vPropVals.end(); ++pIter )
- {
- if ( pIter != pCharGrabBag && pIter != pParaGrabBag
- && pIter->Name != "IsProtected" //section-only property
- )
- {
- vNames.push_back( pIter->Name );
- vValues.push_back( pIter->Value );
- }
- }
- for (const beans::PropertyValue& v : vCharVals)
- {
- vNames.push_back( v.Name );
- vValues.push_back( v.Value );
- }
- for (const beans::PropertyValue& v : vParaVals)
- {
- vNames.push_back( v.Name );
- vValues.push_back( v.Value );
- }
- }
- if ( xMultiSet.is() )
- {
- try
- {
- xMultiSet->setPropertyValues( comphelper::containerToSequence( vNames ), comphelper::containerToSequence( vValues ) );
- return;
- }
- catch ( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "SectionPropertyMap::ApplyProperties_" );
- }
- }
- for ( size_t i = 0; i < vNames.size(); ++i )
- {
- try
- {
- if ( xStyle.is() )
- xStyle->setPropertyValue( vNames[i], vValues[i] );
- }
- catch ( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "SectionPropertyMap::ApplyProperties_" );
- }
- }
-}
-
-sal_Int32 SectionPropertyMap::GetPageWidth() const
-{
- return getProperty( PROP_WIDTH )->second.get<sal_Int32>();
-}
-
-StyleSheetPropertyMap::StyleSheetPropertyMap()
- : mnListLevel( -1 )
- , mnOutlineLevel( -1 )
-{
-}
-
-ParagraphProperties::ParagraphProperties()
- : m_bFrameMode( false )
- , m_nDropCap( NS_ooxml::LN_Value_doc_ST_DropCap_none )
- , m_nLines( 0 )
- , m_w( -1 )
- , m_h( -1 )
- , m_nWrap( text::WrapTextMode::WrapTextMode_MAKE_FIXED_SIZE )
- , m_hAnchor( -1 )
- , m_vAnchor( -1 )
- , m_x( -1 )
- , m_bxValid( false )
- , m_y( -1 )
- , m_byValid( false )
- , m_hSpace( -1 )
- , m_vSpace( -1 )
- , m_hRule( -1 )
- , m_xAlign( -1 )
- , m_yAlign( -1 )
- , m_nDropCapLength( 0 )
-{
-}
-
-void ParagraphProperties::ResetFrameProperties()
-{
- m_bFrameMode = false;
- m_nDropCap = NS_ooxml::LN_Value_doc_ST_DropCap_none;
- m_nLines = 0;
- m_w = -1;
- m_h = -1;
- m_nWrap = text::WrapTextMode::WrapTextMode_MAKE_FIXED_SIZE;
- m_hAnchor = -1;
- m_vAnchor = -1;
- m_x = -1;
- m_bxValid = false;
- m_y = -1;
- m_byValid = false;
- m_hSpace = -1;
- m_vSpace = -1;
- m_hRule = -1;
- m_xAlign = -1;
- m_yAlign = -1;
- m_nDropCapLength = 0;
-}
-
-bool TablePropertyMap::getValue( TablePropertyMapTarget eWhich, sal_Int32& nFill )
-{
- if ( eWhich < TablePropertyMapTarget_MAX )
- {
- if ( m_aValidValues[eWhich].bValid )
- nFill = m_aValidValues[eWhich].nValue;
- return m_aValidValues[eWhich].bValid;
- }
- else
- {
- OSL_FAIL( "invalid TablePropertyMapTarget" );
- return false;
- }
-}
-
-void TablePropertyMap::setValue( TablePropertyMapTarget eWhich, sal_Int32 nSet )
-{
- if ( eWhich < TablePropertyMapTarget_MAX )
- {
- m_aValidValues[eWhich].bValid = true;
- m_aValidValues[eWhich].nValue = nSet;
- }
- else
- OSL_FAIL( "invalid TablePropertyMapTarget" );
-}
-
-void TablePropertyMap::insertTableProperties( const PropertyMap* pMap, const bool bOverwrite )
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement( "TablePropertyMap.insertTableProperties" );
- pMap->dumpXml();
-#endif
-
- const TablePropertyMap* pSource = dynamic_cast< const TablePropertyMap* >(pMap);
- if ( pSource )
- {
- for ( sal_Int32 eTarget = TablePropertyMapTarget_START;
- eTarget < TablePropertyMapTarget_MAX; ++eTarget )
- {
- if ( pSource->m_aValidValues[eTarget].bValid && (bOverwrite || !m_aValidValues[eTarget].bValid) )
- {
- m_aValidValues[eTarget].bValid = true;
- m_aValidValues[eTarget].nValue = pSource->m_aValidValues[eTarget].nValue;
- }
- }
- }
-
-#ifdef DBG_UTIL
- dumpXml();
- TagLogger::getInstance().endElement();
-#endif
-}
-
-} // namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx
deleted file mode 100644
index 711ef47195a0..000000000000
--- a/writerfilter/source/dmapper/PropertyMap.hxx
+++ /dev/null
@@ -1,651 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <rtl/ustring.hxx>
-#include <tools/ref.hxx>
-#include <com/sun/star/uno/Sequence.hxx>
-#include <com/sun/star/text/XText.hpp>
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/table/BorderLine2.hpp>
-#include <com/sun/star/text/WrapTextMode.hpp>
-#include <com/sun/star/uno/Any.h>
-#include <com/sun/star/drawing/XShape.hpp>
-#include "PropertyIds.hxx"
-#include <memory>
-#include <optional>
-#include <map>
-#include <utility>
-#include <vector>
-#include <set>
-#include <deque>
-
-namespace com::sun::star {
- namespace beans {
- struct PropertyValue;
- }
- namespace container {
- class XNameContainer;
- }
- namespace lang {
- class XMultiServiceFactory;
- }
- namespace text {
- class XTextRange;
- class XTextColumns;
- class XFootnote;
- }
- namespace table {
- struct BorderLine2;
- struct ShadowFormat;
- }
-}
-
-namespace writerfilter::dmapper {
-
-class DomainMapper_Impl;
-struct AnchoredObjectInfo;
-
-enum BorderPosition
-{
- BORDER_LEFT,
- BORDER_RIGHT,
- BORDER_TOP,
- BORDER_BOTTOM
-};
-
-enum GrabBagType
-{
- NO_GRAB_BAG,
- ROW_GRAB_BAG,
- CELL_GRAB_BAG,
- PARA_GRAB_BAG,
- CHAR_GRAB_BAG
-};
-
-struct RedlineParams : public SvRefBase
-{
- OUString m_sAuthor;
- OUString m_sDate;
- sal_Int32 m_nToken;
-
- // This can hold properties of runs that had formatted 'track changes' properties
- css::uno::Sequence< css::beans::PropertyValue > m_aRevertProperties;
-};
-
-typedef tools::SvRef< RedlineParams > RedlineParamsPtr;
-
-class PropValue
-{
-private:
- css::uno::Any m_aValue;
- GrabBagType m_GrabBagType;
- bool m_bIsDocDefault;
-
-public:
- PropValue( css::uno::Any aValue, GrabBagType i_GrabBagType, bool bDocDefault )
- : m_aValue(std::move( aValue ))
- , m_GrabBagType( i_GrabBagType )
- , m_bIsDocDefault( bDocDefault )
- {
- }
-
- PropValue( css::uno::Any aValue, GrabBagType i_GrabBagType )
- : m_aValue(std::move( aValue ))
- , m_GrabBagType( i_GrabBagType )
- , m_bIsDocDefault( false )
- {
- }
-
- PropValue()
- : m_aValue()
- , m_GrabBagType( NO_GRAB_BAG )
- , m_bIsDocDefault( false )
- {
- }
-
- const css::uno::Any& getValue() const { return m_aValue; }
-
- GrabBagType getGrabBagType() const { return m_GrabBagType; }
-
- bool getIsDocDefault() const { return m_bIsDocDefault; }
-};
-
-class PropertyMap;
-typedef tools::SvRef< PropertyMap > PropertyMapPtr;
-
-class PropertyMap : public SvRefBase
-{
-private:
- // Cache the property values for the GetPropertyValues() call(s).
- std::vector< css::beans::PropertyValue > m_aValues;
-
- // marks context as footnote context - ::text( ) events contain either the footnote character or can be ignored
- // depending on sprmCSymbol
- css::uno::Reference< css::text::XFootnote > m_xFootnote;
- OUString m_sFootnoteCharStyleName;
- std::map< PropertyIds, PropValue > m_vMap;
- std::vector< RedlineParamsPtr > m_aRedlines;
-
-public:
- typedef std::pair< PropertyIds, css::uno::Any > Property;
-
- PropertyMap() {}
-
- // Sequence: Grab Bags: The CHAR_GRAB_BAG has Name "CharInteropGrabBag" and the PARA_GRAB_BAG has Name "ParaInteropGrabBag"
- // the contained properties are their Value.
- css::uno::Sequence< css::beans::PropertyValue > GetPropertyValues( bool bCharGrabBag = true );
-
- std::vector< PropertyIds > GetPropertyIds();
-
- // Add property, optionally overwriting existing attributes
- void Insert( PropertyIds eId, const css::uno::Any& rAny, bool bOverwrite = true, GrabBagType i_GrabBagType = NO_GRAB_BAG, bool bDocDefault = false );
-
- // Remove a named property from *this, does nothing if the property id has not been set
- void Erase( PropertyIds eId);
-
- // Imports properties from pMap (bOverwrite==false means m_bIsDocDefault=true setting)
- void InsertProps( const PropertyMapPtr& rMap, const bool bOverwrite = true );
-
- // Returns a copy of the property if it exists, .first is its PropertyIds and .second is its Value (type css::uno::Any)
- std::optional< Property > getProperty( PropertyIds eId ) const;
-
- // Has the property named been set (via Insert)?
- bool isSet( PropertyIds eId ) const;
- bool isDocDefault( PropertyIds eId ) const;
-
- const css::uno::Reference< css::text::XFootnote >& GetFootnote() const { return m_xFootnote; }
- const OUString& GetFootnoteStyle() const { return m_sFootnoteCharStyleName; }
-
- void SetFootnote(const css::uno::Reference< css::text::XFootnote >& xFootnote, const OUString& sStyleName)
- {
- m_xFootnote = xFootnote;
- m_sFootnoteCharStyleName = sStyleName;
- }
-
- virtual void insertTableProperties( const PropertyMap*, const bool bOverwrite = true );
-
- const std::vector< RedlineParamsPtr >& Redlines() const { return m_aRedlines; }
-
- std::vector< RedlineParamsPtr >& Redlines() { return m_aRedlines; }
-
- void printProperties();
-
-#ifdef DBG_UTIL
- void dumpXml() const;
-#endif
-
- static css::table::ShadowFormat getShadowFromBorder( const css::table::BorderLine2& rBorder );
-
-protected:
- void Invalidate()
- {
- if ( m_aValues.size() )
- m_aValues.clear();
- }
-};
-
-/** Type of an page, which has an effect which headers and/or footers will be used. */
-enum class PageType
-{
- FIRST,
- LEFT,
- RIGHT
-};
-
-/** Which page part we are referring to.
- * This is mainly introduced to avoid having cryptic bools as input parameter.*/
-enum class PagePartType
-{
- Header,
- Footer
-};
-
-/** A page break type to force what the next page type will be.
- * For example - the next page is forced to be even (left) or odd (right). */
-enum class PageBreakType
-{
- Even,
- Odd,
- Both
-};
-
-class SectionPropertyMap : public PropertyMap
-{
-public:
- enum class BorderApply
- {
- ToAllInSection = 0,
- ToFirstPageInSection = 1,
- ToAllButFirstInSection = 2
- };
- enum class BorderOffsetFrom
- {
- Text = 0,
- Edge = 1,
- };
-private:
-#ifdef DBG_UTIL
- sal_Int32 m_nDebugSectionNumber;
-#endif
-
- // 'temporarily' the section page settings are imported as page styles
- // empty strings mark page settings as not yet imported
-
- bool m_bIsFirstSection;
- css::uno::Reference< css::text::XTextRange > m_xStartingRange;
-
- OUString m_sPageStyleName;
- css::uno::Reference<css::beans::XPropertySet> m_aPageStyle;
-
- std::optional< css::table::BorderLine2 > m_oBorderLines[4];
- sal_Int32 m_nBorderDistances[4];
- BorderApply m_eBorderApply;
- BorderOffsetFrom m_eBorderOffsetFrom;
- bool m_bBorderShadows[4];
-
- bool m_bTitlePage;
- sal_Int16 m_nColumnCount;
- sal_Int32 m_nColumnDistance;
- css::uno::Reference< css::beans::XPropertySet > m_xColumnContainer;
- std::vector< sal_Int32 > m_aColWidth;
- std::vector< sal_Int32 > m_aColDistance;
-
- bool m_bSeparatorLineIsOn;
- bool m_bEvenlySpaced;
-
- sal_Int32 m_nPageNumber;
- // Page number type is a value from css::style::NumberingType.
- sal_Int16 m_nPageNumberType;
- sal_Int32 m_nBreakType;
-
- sal_Int32 m_nLeftMargin;
- sal_Int32 m_nRightMargin;
- sal_Int32 m_nGutterMargin;
- sal_Int32 m_nTopMargin;
- sal_Int32 m_nBottomMargin;
- sal_Int32 m_nHeaderTop;
- sal_Int32 m_nHeaderBottom;
-
- sal_Int32 m_nGridType;
- sal_Int32 m_nGridLinePitch;
- sal_Int32 m_nDxtCharSpace;
- bool m_bGridSnapToChars;
-
- // line numbering
- sal_Int32 m_nLnnMod;
- sal_uInt32 m_nLnc;
- sal_Int32 m_ndxaLnn;
- sal_Int32 m_nLnnMin;
-
- sal_Int32 m_nPaperSourceFirst;
- sal_Int32 m_nPaperSourceOther;
-
- bool m_bDynamicHeightTop;
- bool m_bDynamicHeightBottom;
-
- std::vector<css::uno::Reference<css::drawing::XShape>> m_xRelativeWidthShapes;
-
- // The "Link To Previous" flag indicates whether the header/footer
- // content should be taken from the previous section
- bool m_bDefaultHeaderLinkToPrevious = true;
- bool m_bEvenPageHeaderLinkToPrevious = true;
- bool m_bFirstPageHeaderLinkToPrevious = true;
- bool m_bDefaultFooterLinkToPrevious = true;
- bool m_bEvenPageFooterLinkToPrevious = true;
- bool m_bFirstPageFooterLinkToPrevious = true;
-
- void ApplyProperties_( const css::uno::Reference< css::beans::XPropertySet >& xStyle );
-
- void DontBalanceTextColumns();
-
- /// Apply section-specific properties: only valid to use after PageStyle has been determined by InheritOrFinalizePageStyles
- void ApplySectionProperties( const css::uno::Reference< css::beans::XPropertySet >& xSection, DomainMapper_Impl& rDM_Impl );
-
- /// Check if document is protected. If so, ensure a section exists, and apply its protected value.
- void ApplyProtectionProperties( css::uno::Reference< css::beans::XPropertySet >& xSection, DomainMapper_Impl& rDM_Impl );
-
- css::uno::Reference< css::text::XTextColumns > ApplyColumnProperties(const css::uno::Reference<css::beans::XPropertySet>& xPageStyle,
- DomainMapper_Impl& rDM_Impl);
-
- void CopyLastHeaderFooter(DomainMapper_Impl& rDM_Impl);
-
- void CreateEvenOddPageStyleCopy(DomainMapper_Impl& rDM_Impl, PageBreakType eBreakType);
-
- void PrepareHeaderFooterProperties();
-
- bool HasHeader() const;
- bool HasFooter() const;
-
- static void SetBorderDistance( const css::uno::Reference< css::beans::XPropertySet >& xStyle,
- PropertyIds eMarginId,
- PropertyIds eDistId,
- sal_Int32 nDistance,
- BorderOffsetFrom eOffsetFrom,
- sal_uInt32 nLineWidth,
- DomainMapper_Impl& rDM_Impl );
-
- /// Increases paragraph spacing according to Word 2013+ needs if necessary.
- void HandleIncreasedAnchoredObjectSpacing(DomainMapper_Impl& rDM_Impl);
-
-public:
- explicit SectionPropertyMap( bool bIsFirstSection );
-
- bool IsFirstSection() const { return m_bIsFirstSection; }
-
- void SetStart( const css::uno::Reference< css::text::XTextRange >& xRange ) { m_xStartingRange = xRange; }
-
- const css::uno::Reference< css::text::XTextRange >& GetStartingRange() const { return m_xStartingRange; }
-
- css::uno::Reference<css::beans::XPropertySet> GetPageStyle(DomainMapper_Impl& rDM_Impl);
-
- const OUString& GetPageStyleName()
- {
- return m_sPageStyleName;
- }
-
- bool getFirstPageHeader() { return m_bFirstPageHeaderLinkToPrevious; }
- bool getFirstPageFooter() { return m_bFirstPageFooterLinkToPrevious; }
-
- // @throws css::beans::UnknownPropertyException
- // @throws css::beans::PropertyVetoException
- // @throws css::lang::IllegalArgumentException
- // @throws css::lang::WrappedTargetException
- // @throws css::uno::RuntimeException
- void InheritOrFinalizePageStyles( DomainMapper_Impl& rDM_Impl );
-
- void SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const css::table::BorderLine2& rBorderLine, bool bShadow );
- void SetBorderApply( BorderApply nSet ) { m_eBorderApply = nSet; }
- void SetBorderOffsetFrom( BorderOffsetFrom nSet ) { m_eBorderOffsetFrom = nSet; }
-
- void SetColumnCount( sal_Int16 nCount ) { m_nColumnCount = nCount; }
- sal_Int16 ColumnCount() const { return m_nColumnCount; }
-
- void SetColumnDistance( sal_Int32 nDist ) { m_nColumnDistance = nDist; }
- void AppendColumnWidth( sal_Int32 nWidth ) { m_aColWidth.push_back( nWidth ); }
- void AppendColumnSpacing( sal_Int32 nDist ) { m_aColDistance.push_back( nDist ); }
-
- void SetTitlePage( bool bSet ) { m_bTitlePage = bSet; }
- void SetSeparatorLine( bool bSet ) { m_bSeparatorLineIsOn = bSet; }
- void SetEvenlySpaced( bool bSet ) { m_bEvenlySpaced = bSet; }
- void SetPageNumber( sal_Int32 nSet ) { m_nPageNumber = nSet; }
- void SetPageNumberType( sal_Int32 nSet ) { m_nPageNumberType = nSet; }
- void SetBreakType( sal_Int32 nSet ) { m_nBreakType = nSet; }
- // GetBreakType returns -1 if the breakType has not yet been identified for the section
- sal_Int32 GetBreakType() const { return m_nBreakType; }
-
- void SetLeftMargin( sal_Int32 nSet ) { m_nLeftMargin = nSet; }
- sal_Int32 GetLeftMargin() const { return m_nLeftMargin; }
- void SetRightMargin( sal_Int32 nSet ) { m_nRightMargin = nSet; }
- sal_Int32 GetRightMargin() const { return m_nRightMargin; }
- void SetTopMargin(sal_Int32 nSet) { m_bDynamicHeightTop = nSet >= 0; m_nTopMargin = std::abs(nSet); }
- void SetBottomMargin( sal_Int32 nSet ) { m_bDynamicHeightBottom = nSet >= 0; m_nBottomMargin = std::abs(nSet); }
- void SetHeaderTop( sal_Int32 nSet ) { m_nHeaderTop = nSet; }
- void SetHeaderBottom( sal_Int32 nSet ) { m_nHeaderBottom = nSet; }
- void SetGutterMargin( sal_Int32 nGutterMargin ) { m_nGutterMargin = nGutterMargin; }
- sal_Int32 GetPageWidth() const;
-
- void SetGridType( sal_Int32 nSet ) { m_nGridType = nSet; }
- void SetGridLinePitch( sal_Int32 nSet ) { m_nGridLinePitch = nSet; }
- void SetGridSnapToChars( bool bSet ) { m_bGridSnapToChars = bSet; }
- void SetDxtCharSpace( sal_Int32 nSet ) { m_nDxtCharSpace = nSet; }
-
- void SetLnnMod( sal_Int32 nValue ) { m_nLnnMod = nValue; }
- void SetLnc( sal_Int32 nValue ) { m_nLnc = nValue; }
- void SetdxaLnn( sal_Int32 nValue ) { m_ndxaLnn = nValue; }
- void SetLnnMin( sal_Int32 nValue ) { m_nLnnMin = nValue; }
-
- void SetPaperSource(sal_Int32 first, sal_Int32 other) { m_nPaperSourceFirst = first; m_nPaperSourceOther = other;}
-
- void addRelativeWidthShape( css::uno::Reference<css::drawing::XShape> xShape ) { m_xRelativeWidthShapes.push_back( xShape ); }
-
- // determine which style gets the borders
- void ApplyBorderToPageStyles( DomainMapper_Impl &rDM_Impl,
- BorderApply eBorderApply, BorderOffsetFrom eOffsetFrom );
- void ApplyPaperSource(DomainMapper_Impl& rDM_Impl);
- void CloseSectionGroup( DomainMapper_Impl& rDM_Impl );
- // Handling of margins, header and footer for any kind of sections breaks.
- void HandleMarginsHeaderFooter(DomainMapper_Impl& rDM_Impl);
- void clearHeaderFooterLinkToPrevious(PagePartType ePartType, PageType eType);
- void setHeaderFooterProperties(DomainMapper_Impl& rDM_Impl);
-
- // Which headers/footer types are used (have been imported) by the current section.
- bool m_bFirstHeader = false;
- bool m_bFirstFooter = false;
- bool m_bLeftHeader = false;
- bool m_bLeftFooter = false;
- bool m_bRightHeader = false;
- bool m_bRightFooter = false;
- bool m_bHadFirstHeader = false;
- bool m_bHadLeftHeader = false;
- bool m_bHadRightHeader = false;
-
- static void removeXTextContent(css::uno::Reference<css::text::XText> const& rxText);
-};
-
-void BeforeConvertToTextFrame(std::deque<css::uno::Any>& rFramedRedlines, std::vector<sal_Int32>& redPos, std::vector<sal_Int32>& redLen, std::vector<OUString>& redCell, std::vector<OUString>& redTable);
-
-void AfterConvertToTextFrame(DomainMapper_Impl& rDM_Impl, std::deque<css::uno::Any>& aFramedRedlines, std::vector<sal_Int32>& redPos, std::vector<sal_Int32>& redLen, std::vector<OUString>& redCell, std::vector<OUString>& redTable);
-
-class ParagraphProperties : public SvRefBase
-{
-private:
- bool m_bFrameMode;
- sal_Int32 m_nDropCap; // drop, margin ST_DropCap
- sal_Int32 m_nLines; // number of lines of the drop cap
- sal_Int32 m_w; // width
- sal_Int32 m_h; // height
- css::text::WrapTextMode m_nWrap; // from ST_Wrap around, auto, none, notBeside, through, tight
- sal_Int32 m_hAnchor; // page, from ST_HAnchor margin, page, text
- sal_Int32 m_vAnchor; // around from ST_VAnchor margin, page, text
- sal_Int32 m_x; // x-position
- bool m_bxValid;
- sal_Int32 m_y; // y-position
- bool m_byValid;
- sal_Int32 m_hSpace; // frame padding h
- sal_Int32 m_vSpace; // frame padding v
- sal_Int32 m_hRule; // from ST_HeightRule exact, atLeast, auto
- sal_Int32 m_xAlign; // from ST_XAlign center, inside, left, outside, right
- sal_Int32 m_yAlign; // from ST_YAlign bottom, center, inline, inside, outside, top
- sal_Int8 m_nDropCapLength; // number of characters
- OUString m_sParaStyleName;
- OUString m_sParaId; // [MS-DOCX] sect. 2.2.4 "p and tr Extensions"
-
- css::uno::Reference< css::text::XTextRange > m_xStartingRange; // start of a frame
- css::uno::Reference< css::text::XTextRange > m_xEndingRange; // end of the frame
- sal_Int32 m_nListId = -1;
-
-public:
- ParagraphProperties();
-
- ParagraphProperties(ParagraphProperties const &) = default;
- ParagraphProperties(ParagraphProperties &&) = default;
- ParagraphProperties & operator =(ParagraphProperties const &) = default;
- ParagraphProperties & operator =(ParagraphProperties &&) = default;
-
- sal_Int32 GetListId() const { return m_nListId; }
- void SetListId( sal_Int32 nId ) { m_nListId = nId; }
-
- bool IsFrameMode() const { return m_bFrameMode; }
- void SetFrameMode( bool set = true ) { m_bFrameMode = set; }
-
- sal_Int32 GetDropCap() const { return m_nDropCap; }
- void SetDropCap( sal_Int32 nSet ) { m_nDropCap = nSet; }
-
- sal_Int32 GetLines() const { return m_nLines; }
- void SetLines( sal_Int32 nSet ) { m_nLines = nSet; }
-
- sal_Int32 Getw() const { return m_w; }
- void Setw( sal_Int32 nSet ) { m_w = nSet; }
-
- sal_Int32 Geth() const { return m_h; }
- void Seth( sal_Int32 nSet ) { m_h = nSet; }
-
- css::text::WrapTextMode GetWrap() const { return m_nWrap; }
- void SetWrap( css::text::WrapTextMode nSet ) { m_nWrap = nSet; }
-
- sal_Int32 GethAnchor() const { return m_hAnchor; }
- void SethAnchor( sal_Int32 nSet ) { m_hAnchor = nSet; }
-
- sal_Int32 GetvAnchor() const { return m_vAnchor; }
- void SetvAnchor( sal_Int32 nSet ) { m_vAnchor = nSet; }
-
- sal_Int32 Getx() const { return m_x; }
- void Setx( sal_Int32 nSet ) { m_x = nSet; m_bxValid = true; }
- bool IsxValid() const { return m_bxValid; }
-
- sal_Int32 Gety() const { return m_y; }
- void Sety( sal_Int32 nSet ) { m_y = nSet; m_byValid = true; }
- bool IsyValid() const { return m_byValid; }
-
- void SethSpace( sal_Int32 nSet ) { m_hSpace = nSet; }
- sal_Int32 GethSpace() const { return m_hSpace; }
-
- sal_Int32 GetvSpace() const { return m_vSpace; }
- void SetvSpace( sal_Int32 nSet ) { m_vSpace = nSet; }
-
- sal_Int32 GethRule() const { return m_hRule; }
- void SethRule( sal_Int32 nSet ) { m_hRule = nSet; }
-
- sal_Int32 GetxAlign() const { return m_xAlign; }
- void SetxAlign( sal_Int32 nSet ) { m_xAlign = nSet; }
-
- sal_Int32 GetyAlign() const { return m_yAlign; }
- void SetyAlign( sal_Int32 nSet ) { m_yAlign = nSet; }
-
- sal_Int8 GetDropCapLength() const { return m_nDropCapLength; }
- void SetDropCapLength( sal_Int8 nSet ) { m_nDropCapLength = nSet; }
-
- const css::uno::Reference< css::text::XTextRange >& GetStartingRange() const { return m_xStartingRange; }
- void SetStartingRange( const css::uno::Reference< css::text::XTextRange >& xSet ) { m_xStartingRange = xSet; }
-
- const css::uno::Reference< css::text::XTextRange >& GetEndingRange() const { return m_xEndingRange; }
- void SetEndingRange( const css::uno::Reference< css::text::XTextRange >& xSet ) { m_xEndingRange = xSet; }
-
- const OUString& GetParaStyleName() const { return m_sParaStyleName; }
- void SetParaStyleName( const OUString& rSet ) { m_sParaStyleName = rSet; }
-
- const OUString& GetParaId() const { return m_sParaId; }
- void SetParaId(const OUString& rSet) { m_sParaId = rSet; }
-
- void ResetFrameProperties();
-};
-
-typedef tools::SvRef< ParagraphProperties > ParagraphPropertiesPtr;
-
-class ParagraphPropertiesPropertyMap: public PropertyMap {
-public:
- ParagraphProperties & props() { return m_props; }
-
- ParagraphProperties const & props() const { return m_props; }
-
-private:
- ParagraphProperties m_props;
-};
-
-/*-------------------------------------------------------------------------
- property map of a stylesheet
- -----------------------------------------------------------------------*/
-
-#define WW_OUTLINE_MAX sal_Int16( 9 )
-#define WW_OUTLINE_MIN sal_Int16( 0 )
-
-class StyleSheetPropertyMap
- : public ParagraphPropertiesPropertyMap
-{
-private:
- sal_Int16 mnListLevel;
- sal_Int16 mnOutlineLevel;
-
-public:
- explicit StyleSheetPropertyMap();
-
- sal_Int16 GetListLevel() const { return mnListLevel; }
- void SetListLevel( sal_Int16 nLevel ) { mnListLevel = nLevel; }
-
- sal_Int16 GetOutlineLevel() const { return mnOutlineLevel; }
- void SetOutlineLevel(sal_Int16 nLevel) { if (nLevel <= WW_OUTLINE_MAX) mnOutlineLevel = nLevel; }
-};
-
-class ParagraphPropertyMap
- : public ParagraphPropertiesPropertyMap
-{
-public:
- explicit ParagraphPropertyMap() {}
-};
-
-class TablePropertyMap
- : public PropertyMap
-{
-public:
- enum TablePropertyMapTarget
- {
- TablePropertyMapTarget_START,
- CELL_MAR_LEFT = TablePropertyMapTarget_START,
- CELL_MAR_RIGHT,
- CELL_MAR_TOP,
- CELL_MAR_BOTTOM,
- TABLE_WIDTH,
- TABLE_WIDTH_TYPE,
- LEFT_MARGIN,
- HORI_ORIENT,
- TablePropertyMapTarget_MAX
- };
-
-private:
- struct ValidValue
- {
- sal_Int32 nValue;
- bool bValid;
-
- ValidValue()
- : nValue( 0 )
- , bValid( false )
- {
- }
- };
-
- ValidValue m_aValidValues[TablePropertyMapTarget_MAX];
-
-public:
- explicit TablePropertyMap() {}
-
- bool getValue( TablePropertyMapTarget eWhich, sal_Int32& nFill );
- void setValue( TablePropertyMapTarget eWhich, sal_Int32 nSet );
-
- virtual void insertTableProperties( const PropertyMap*, const bool bOverwrite = true ) override;
-};
-
-typedef tools::SvRef< TablePropertyMap > TablePropertyMapPtr;
-
-/// Information about a paragraph to be finished after a table end.
-struct TableParagraph
-{
- css::uno::Reference<css::text::XTextRange> m_rStartParagraph;
- css::uno::Reference<css::text::XTextRange> m_rEndParagraph;
- PropertyMapPtr m_pPropertyMap;
- css::uno::Reference<css::beans::XPropertySet> m_rPropertySet;
-};
-
-typedef std::shared_ptr< std::vector<TableParagraph> > TableParagraphVectorPtr;
-
-} // namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/PropertyMapHelper.cxx b/writerfilter/source/dmapper/PropertyMapHelper.cxx
deleted file mode 100644
index a944dc147aa4..000000000000
--- a/writerfilter/source/dmapper/PropertyMapHelper.cxx
+++ /dev/null
@@ -1,98 +0,0 @@
-/* -*- 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/.
- *
- * 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 <com/sun/star/text/TableColumnSeparator.hpp>
-#include "TagLogger.hxx"
-#include "PropertyMapHelper.hxx"
-
-namespace writerfilter::dmapper
-{
-using namespace ::com::sun::star;
-
-void lcl_DumpTableColumnSeparators(const uno::Any& rTableColumnSeparators)
-{
-#ifdef DBG_UTIL
- uno::Sequence<text::TableColumnSeparator> aSeq;
- rTableColumnSeparators >>= aSeq;
-
- TagLogger::getInstance().startElement("property.TableColumnSeparators");
-
- sal_uInt32 nLength = aSeq.getLength();
- for (sal_uInt32 n = 0; n < nLength; ++n)
- {
- TagLogger::getInstance().startElement("separator");
-
- TagLogger::getInstance().attribute("position", aSeq[n].Position);
- TagLogger::getInstance().attribute("visible", sal_uInt32(aSeq[n].IsVisible));
-
- TagLogger::getInstance().endElement();
- }
-
- TagLogger::getInstance().endElement();
-#else
- (void)rTableColumnSeparators;
-#endif // DBG_UTIL
-}
-
-#ifdef DBG_UTIL
-void lcl_DumpPropertyValues(beans::PropertyValues const& rValues)
-{
- TagLogger::getInstance().startElement("propertyValues");
-
- for (beans::PropertyValue const& propVal : rValues)
- {
- TagLogger::getInstance().startElement("propertyValue");
-
- TagLogger::getInstance().attribute("name", propVal.Name);
-
- try
- {
- sal_Int32 aInt = 0;
- propVal.Value >>= aInt;
- TagLogger::getInstance().attribute("value", aInt);
- }
- catch (...)
- {
- }
-
- if (propVal.Name == "TableColumnSeparators")
- {
- lcl_DumpTableColumnSeparators(propVal.Value);
- }
-
- TagLogger::getInstance().endElement();
- }
- TagLogger::getInstance().endElement();
-}
-
-void lcl_DumpPropertyValueSeq(css::uno::Sequence<css::beans::PropertyValues> const& rPropValSeq)
-{
- TagLogger::getInstance().startElement("PropertyValueSeq");
-
- for (auto const& propVal : rPropValSeq)
- {
- lcl_DumpPropertyValues(propVal);
- }
-
- TagLogger::getInstance().endElement();
-}
-#endif // DBG_UTIL
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/PropertyMapHelper.hxx b/writerfilter/source/dmapper/PropertyMapHelper.hxx
deleted file mode 100644
index 472e1bcfa6f5..000000000000
--- a/writerfilter/source/dmapper/PropertyMapHelper.hxx
+++ /dev/null
@@ -1,34 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include <com/sun/star/beans/PropertyValues.hpp>
-
-namespace writerfilter::dmapper
-{
-void lcl_DumpTableColumnSeparators(const css::uno::Any& rTableColumnSeparators);
-#ifdef DBG_UTIL
-void lcl_DumpPropertyValues(css::beans::PropertyValues const& rValues);
-
-void lcl_DumpPropertyValueSeq(css::uno::Sequence<css::beans::PropertyValues> const& rPropValSeq);
-#endif // DBG_UTIL
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/SdtHelper.cxx b/writerfilter/source/dmapper/SdtHelper.cxx
deleted file mode 100644
index 09e7903b5f98..000000000000
--- a/writerfilter/source/dmapper/SdtHelper.cxx
+++ /dev/null
@@ -1,647 +0,0 @@
-/* -*- 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 "SdtHelper.hxx"
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/drawing/XControlShape.hpp>
-#include <com/sun/star/text/VertOrientation.hpp>
-#include <editeng/unoprnms.hxx>
-#include <sal/log.hxx>
-#include <utility>
-#include <vcl/svapp.hxx>
-#include <vcl/outdev.hxx>
-#include <comphelper/diagnose_ex.hxx>
-#include <comphelper/string.hxx>
-#include <comphelper/sequence.hxx>
-#include <xmloff/odffields.hxx>
-#include <com/sun/star/text/XTextField.hpp>
-#include "DomainMapper_Impl.hxx"
-#include "StyleSheetTable.hxx"
-#include <officecfg/Office/Writer.hxx>
-#include <com/sun/star/util/XRefreshable.hpp>
-#include <com/sun/star/text/XTextFieldsSupplier.hpp>
-#include <com/sun/star/document/XOOXMLDocumentPropertiesImporter.hpp>
-#include <ooxml/OOXMLDocument.hxx>
-#include <com/sun/star/xml/xpath/XPathAPI.hpp>
-#include <com/sun/star/xml/xpath/XPathException.hpp>
-#include <com/sun/star/xml/dom/DocumentBuilder.hpp>
-
-namespace writerfilter::dmapper
-{
-using namespace ::com::sun::star;
-using namespace ::css::xml::xpath;
-using namespace ::comphelper;
-
-/// w:sdt's w:dropDownList doesn't have width, so guess the size based on the longest string.
-static awt::Size lcl_getOptimalWidth(const StyleSheetTablePtr& pStyleSheet,
- OUString const& rDefault, std::vector<OUString>& rItems)
-{
- OUString aLongest = rDefault;
- sal_Int32 nHeight = 0;
- for (const OUString& rItem : rItems)
- if (rItem.getLength() > aLongest.getLength())
- aLongest = rItem;
-
- MapMode aMap(MapUnit::Map100thMM);
- OutputDevice* pOut = Application::GetDefaultDevice();
- pOut->Push(vcl::PushFlags::FONT | vcl::PushFlags::MAPMODE);
-
- PropertyMapPtr pDefaultCharProps = pStyleSheet->GetDefaultCharProps();
- vcl::Font aFont(pOut->GetFont());
- std::optional<PropertyMap::Property> aFontName
- = pDefaultCharProps->getProperty(PROP_CHAR_FONT_NAME);
- if (aFontName)
- aFont.SetFamilyName(aFontName->second.get<OUString>());
- std::optional<PropertyMap::Property> aHeight = pDefaultCharProps->getProperty(PROP_CHAR_HEIGHT);
- if (aHeight)
- {
- nHeight = aHeight->second.get<double>() * 35; // points -> mm100
- aFont.SetFontSize(Size(0, nHeight));
- }
- pOut->SetFont(aFont);
- pOut->SetMapMode(aMap);
- sal_Int32 nWidth = pOut->GetTextWidth(aLongest);
-
- pOut->Pop();
-
- // Border: see PDFWriterImpl::drawFieldBorder(), border size is font height / 4,
- // so additional width / height needed is height / 2.
- sal_Int32 nBorder = nHeight / 2;
-
- // Width: space for the text + the square having the dropdown arrow.
- return { nWidth + nBorder + nHeight, nHeight + nBorder };
-}
-
-SdtHelper::SdtHelper(DomainMapper_Impl& rDM_Impl,
- css::uno::Reference<css::uno::XComponentContext> xContext)
- : m_rDM_Impl(rDM_Impl)
- , m_xComponentContext(std::move(xContext))
- , m_aControlType(SdtControlType::unknown)
- , m_bHasUnusedText(false)
- , m_bHasElements(false)
- , m_bOutsideAParagraph(false)
- , m_bPropertiesXMLsLoaded(false)
-{
-}
-
-SdtHelper::~SdtHelper() = default;
-
-void SdtHelper::loadPropertiesXMLs()
-{
- // Initialize properties xml storage (m_xPropertiesXMLs)
- uno::Reference<uno::XInterface> xTemp
- = m_xComponentContext->getServiceManager()->createInstanceWithContext(
- "com.sun.star.document.OOXMLDocumentPropertiesImporter", m_xComponentContext);
- uno::Reference<document::XOOXMLDocumentPropertiesImporter> xImporter(xTemp, uno::UNO_QUERY);
- if (!xImporter.is())
- return;
-
- uno::Reference<xml::dom::XDocumentBuilder> xDomBuilder(
- xml::dom::DocumentBuilder::create(m_xComponentContext));
- if (!xDomBuilder.is())
- return;
-
- // Load core properties
- try
- {
- auto xCorePropsStream = xImporter->getCorePropertiesStream(m_rDM_Impl.m_xDocumentStorage);
- m_xPropertiesXMLs.insert(
- { OUString("{6C3C8BC8-F283-45AE-878A-BAB7291924A1}"), // hardcoded id for core props
- xDomBuilder->parse(xCorePropsStream) });
- }
- catch (const uno::Exception&)
- {
- SAL_WARN("writerfilter",
- "SdtHelper::loadPropertiesXMLs: failed loading core properties XML");
- }
-
- // Load extended properties
- try
- {
- auto xExtPropsStream
- = xImporter->getExtendedPropertiesStream(m_rDM_Impl.m_xDocumentStorage);
- m_xPropertiesXMLs.insert(
- { OUString("{6668398D-A668-4E3E-A5EB-62B293D839F1}"), // hardcoded id for extended props
- xDomBuilder->parse(xExtPropsStream) });
- }
- catch (const uno::Exception&)
- {
- SAL_WARN("writerfilter",
- "SdtHelper::loadPropertiesXMLs: failed loading extended properties XML");
- }
-
- // TODO: some other property items?
-
- // Add custom XMLs
- uno::Sequence<uno::Reference<xml::dom::XDocument>> aCustomXmls
- = m_rDM_Impl.getDocumentReference()->getCustomXmlDomList();
- uno::Sequence<uno::Reference<xml::dom::XDocument>> aCustomXmlProps
- = m_rDM_Impl.getDocumentReference()->getCustomXmlDomPropsList();
- if (aCustomXmls.getLength())
- {
- uno::Reference<XXPathAPI> xXpathAPI = XPathAPI::create(m_xComponentContext);
- xXpathAPI->registerNS("ds",
- "http://schemas.openxmlformats.org/officeDocument/2006/customXml");
- sal_Int32 nItem = 0;
- // Hereby we assume that items from getCustomXmlDomList() and getCustomXmlDomPropsList()
- // are matching each other:
- // item1.xml -> itemProps1.xml, item2.xml -> itemProps2.xml
- // This does works practically, but is it true in general?
- for (const auto& xDoc : aCustomXmls)
- {
- // Retrieve storeid from properties xml
- OUString aStoreId;
- uno::Reference<XXPathObject> xResult
- = xXpathAPI->eval(aCustomXmlProps[nItem], "string(/ds:datastoreItem/@ds:itemID)");
-
- if (xResult.is() && xResult->getString().getLength())
- {
- aStoreId = xResult->getString();
- }
- else
- {
- SAL_WARN("writerfilter",
- "SdtHelper::loadPropertiesXMLs: can't fetch storeid for custom doc!");
- }
-
- m_xPropertiesXMLs.insert({ aStoreId, xDoc });
- nItem++;
- }
- }
-
- m_bPropertiesXMLsLoaded = true;
-}
-
-static void lcl_registerNamespaces(std::u16string_view sNamespaceString,
- const uno::Reference<XXPathAPI>& xXPathAPI)
-{
- // Split namespaces and register it in XPathAPI
- auto aNamespaces = string::split(sNamespaceString, ' ');
- for (const auto& sNamespace : aNamespaces)
- {
- // Here we have just one namespace in format "xmlns:ns0='http://someurl'"
- auto aNamespace = string::split(sNamespace, '=');
- if (aNamespace.size() < 2)
- {
- SAL_WARN("writerfilter",
- "SdtHelper::getValueFromDataBinding: invalid namespace: " << sNamespace);
- continue;
- }
-
- auto aNamespaceId = string::split(aNamespace[0], ':');
- if (aNamespaceId.size() < 2)
- {
- SAL_WARN("writerfilter",
- "SdtHelper::getValueFromDataBinding: invalid namespace: " << aNamespace[0]);
- continue;
- }
-
- OUString sNamespaceURL = aNamespace[1];
- sNamespaceURL = string::strip(sNamespaceURL, ' ');
- sNamespaceURL = string::strip(sNamespaceURL, '\'');
-
- xXPathAPI->registerNS(aNamespaceId[1], sNamespaceURL);
- }
-}
-
-std::optional<OUString> SdtHelper::getValueFromDataBinding()
-{
- // No xpath - nothing to do
- if (m_sDataBindingXPath.isEmpty())
- return {};
-
- // Load properties XMLs
- if (!m_bPropertiesXMLsLoaded)
- loadPropertiesXMLs();
-
- uno::Reference<XXPathAPI> xXpathAPI = XPathAPI::create(m_xComponentContext);
-
- lcl_registerNamespaces(m_sDataBindingPrefixMapping, xXpathAPI);
-
- // Find storage by store id and eval xpath there
- const auto& aSourceIt = m_xPropertiesXMLs.find(m_sDataBindingStoreItemID);
- if (aSourceIt != m_xPropertiesXMLs.end())
- {
- try
- {
- uno::Reference<XXPathObject> xResult
- = xXpathAPI->eval(aSourceIt->second, m_sDataBindingXPath);
-
- if (xResult.is() && xResult->getNodeList() && xResult->getNodeList()->getLength()
- && xResult->getString().getLength())
- {
- return xResult->getString();
- }
- }
- catch (const XPathException& e)
- {
- // XPath failed? Log and continue with next data document
- SAL_WARN("writerfilter", "SdtHelper::failed running XPath: " << e.Message);
- }
- }
-
- // Nothing found? Try to iterate storages and eval xpath
- for (const auto& aSource : m_xPropertiesXMLs)
- {
- try
- {
- uno::Reference<XXPathObject> xResult
- = xXpathAPI->eval(aSource.second, m_sDataBindingXPath);
-
- if (xResult.is() && xResult->getNodeList() && xResult->getNodeList()->getLength()
- && xResult->getString().getLength())
- {
- return xResult->getString();
- }
- }
- catch (const XPathException& e)
- {
- // XPath failed? Log and continue with next data document
- SAL_WARN("writerfilter", "SdtHelper::failed running XPath: " << e.Message);
- }
- }
-
- // No data
- return {};
-}
-
-void SdtHelper::createDropDownControl()
-{
- assert(getControlType() == SdtControlType::dropDown
- || getControlType() == SdtControlType::comboBox);
-
- const bool bDropDown
- = officecfg::Office::Writer::Filter::Import::DOCX::ImportComboBoxAsDropDown::get();
- const OUString aDefaultText = m_aSdtTexts.makeStringAndClear();
-
- if (bDropDown)
- {
- // create field
- uno::Reference<css::text::XTextField> xControlModel(
- m_rDM_Impl.GetTextFactory()->createInstance("com.sun.star.text.TextField.DropDown"),
- uno::UNO_QUERY);
-
- const auto it = std::find_if(
- m_aDropDownItems.begin(), m_aDropDownItems.end(),
- [aDefaultText](const OUString& item) -> bool { return !item.compareTo(aDefaultText); });
-
- if (m_aDropDownItems.end() == it)
- {
- m_aDropDownItems.push_back(aDefaultText);
- }
-
- // set properties
- uno::Reference<beans::XPropertySet> xPropertySet(xControlModel, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("SelectedItem", uno::Any(aDefaultText));
- xPropertySet->setPropertyValue("Items",
- uno::Any(comphelper::containerToSequence(m_aDropDownItems)));
-
- // add it into document
- m_rDM_Impl.appendTextContent(xControlModel, uno::Sequence<beans::PropertyValue>());
-
- m_bHasElements = true;
- }
- else
- {
- // create control
- uno::Reference<awt::XControlModel> xControlModel(
- m_rDM_Impl.GetTextFactory()->createInstance("com.sun.star.form.component.ComboBox"),
- uno::UNO_QUERY);
-
- // set properties
- uno::Reference<beans::XPropertySet> xPropertySet(xControlModel, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("DefaultText", uno::Any(aDefaultText));
- xPropertySet->setPropertyValue("Dropdown", uno::Any(true));
- xPropertySet->setPropertyValue("StringItemList",
- uno::Any(comphelper::containerToSequence(m_aDropDownItems)));
-
- // add it into document
- createControlShape(
- lcl_getOptimalWidth(m_rDM_Impl.GetStyleSheetTable(), aDefaultText, m_aDropDownItems),
- xControlModel, uno::Sequence<beans::PropertyValue>());
- }
-
- // clean up
- clear();
-}
-
-void SdtHelper::createPlainTextControl()
-{
- assert(getControlType() == SdtControlType::plainText);
-
- if (!m_xFieldStartRange.is())
- return;
-
- uno::Reference<text::XTextCursor> xCrsr;
- uno::Reference<text::XText> xText;
- if (m_rDM_Impl.HasTopText())
- {
- uno::Reference<text::XTextAppend> xTextAppend = m_rDM_Impl.GetTopTextAppend();
- if (xTextAppend.is())
- {
- xText = m_rDM_Impl.GetTopTextAppend()->getEnd()->getText();
- xCrsr = xText->createTextCursorByRange(m_xFieldStartRange);
- }
- }
- if (!xCrsr.is())
- return;
-
- try
- {
- bool bIsInTable = (m_rDM_Impl.hasTableManager() && m_rDM_Impl.getTableManager().isInTable())
- != (0 < m_rDM_Impl.m_StreamStateStack.top().nTableDepth)
- && m_rDM_Impl.GetIsDummyParaAddedForTableInSection();
- if (bIsInTable)
- xCrsr->goRight(1, false);
- xCrsr->gotoEnd(true);
- }
- catch (uno::Exception&)
- {
- TOOLS_WARN_EXCEPTION("writerfilter.dmapper",
- "Cannot get the right text range for date field");
- return;
- }
-
- std::optional<OUString> oData = getValueFromDataBinding();
- if (oData.has_value())
- xCrsr->setString(*oData);
-
- uno::Reference<text::XTextContent> xContentControl(
- m_rDM_Impl.GetTextFactory()->createInstance("com.sun.star.text.ContentControl"),
- uno::UNO_QUERY);
- uno::Reference<beans::XPropertySet> xContentControlProps(xContentControl, uno::UNO_QUERY);
-
- for (const beans::PropertyValue& prop : getInteropGrabBagAndClear())
- {
- OUString sPropertyName;
- if (prop.Name == "ooxml:CT_SdtPr_showingPlcHdr")
- sPropertyName = "ShowingPlaceHolder";
- else if (prop.Name == "ooxml:CT_SdtPr_alias")
- sPropertyName = "Alias";
- else if (prop.Name == "ooxml:CT_SdtPr_tag")
- sPropertyName = "Tag";
- else if (prop.Name == "ooxml:CT_SdtPr_id")
- sPropertyName = "Id";
- else if (prop.Name == "ooxml:CT_SdtPr_tabIndex")
- sPropertyName = "TabIndex";
- else if (prop.Name == "ooxml:CT_SdtPr_lock")
- sPropertyName = "Lock";
- else if (prop.Name == "ooxml:CT_SdtPlaceholder_docPart"
- || prop.Name == "ooxml:CT_SdtPr_dataBinding" || prop.Name == "ooxml:CT_SdtPr_color"
- || prop.Name == "ooxml:CT_SdtPr_appearance" || prop.Name == "ooxml:CT_SdtPr_text")
- {
- uno::Sequence<beans::PropertyValue> aInternalGrabBag;
- prop.Value >>= aInternalGrabBag;
- for (const beans::PropertyValue& internalProp : aInternalGrabBag)
- {
- if (internalProp.Name == "ooxml:CT_SdtPlaceholder_docPart_val")
- sPropertyName = "PlaceholderDocPart";
- else if (internalProp.Name == "ooxml:CT_DataBinding_prefixMappings")
- sPropertyName = "DataBindingPrefixMappings";
- else if (internalProp.Name == "ooxml:CT_DataBinding_xpath")
- sPropertyName = "DataBindingXpath";
- else if (internalProp.Name == "ooxml:CT_DataBinding_storeItemID")
- sPropertyName = "DataBindingStoreItemID";
- else if (internalProp.Name == "ooxml:CT_SdtAppearance_val")
- sPropertyName = "Appearance";
- else if (internalProp.Name == "ooxml:CT_SdtColor_val")
- sPropertyName = "Color";
- else if (internalProp.Name == "ooxml:CT_SdtText_multiLine")
- sPropertyName = "MultiLine";
- if (!sPropertyName.isEmpty())
- {
- xContentControlProps->setPropertyValue(sPropertyName, internalProp.Value);
- }
- sPropertyName.clear();
- }
- }
-
- if (!sPropertyName.isEmpty())
- {
- xContentControlProps->setPropertyValue(sPropertyName, prop.Value);
- }
- }
-
- xContentControlProps->setPropertyValue("PlainText", uno::Any(true));
-
- xText->insertTextContent(xCrsr, xContentControl, /*bAbsorb=*/true);
-
- // clean up
- clear();
-}
-
-void SdtHelper::createDateContentControl()
-{
- if (!m_xFieldStartRange.is())
- return;
-
- uno::Reference<text::XTextCursor> xCrsr;
- if (m_rDM_Impl.HasTopText())
- {
- uno::Reference<text::XTextAppend> xTextAppend = m_rDM_Impl.GetTopTextAppend();
- if (xTextAppend.is())
- {
- xCrsr = xTextAppend->createTextCursorByRange(xTextAppend);
- }
- }
- if (!xCrsr.is())
- return;
-
- try
- {
- xCrsr->gotoRange(m_xFieldStartRange, false);
- // tdf#138093: Date selector reset, if placed inside table
- // Modified to XOR relationship and adding dummy paragraph conditions
- bool bIsInTable = (m_rDM_Impl.hasTableManager() && m_rDM_Impl.getTableManager().isInTable())
- != (0 < m_rDM_Impl.m_StreamStateStack.top().nTableDepth)
- && m_rDM_Impl.GetIsDummyParaAddedForTableInSection();
- if (bIsInTable)
- xCrsr->goRight(1, false);
- xCrsr->gotoEnd(true);
- }
- catch (uno::Exception&)
- {
- TOOLS_WARN_EXCEPTION("writerfilter.dmapper",
- "Cannot get the right text range for date field");
- return;
- }
-
- uno::Reference<uno::XInterface> xFieldInterface
- = m_rDM_Impl.GetTextFactory()->createInstance("com.sun.star.text.Fieldmark");
- uno::Reference<text::XFormField> xFormField(xFieldInterface, uno::UNO_QUERY);
- uno::Reference<text::XTextContent> xToInsert(xFormField, uno::UNO_QUERY);
- if (!(xFormField.is() && xToInsert.is()))
- return;
-
- xToInsert->attach(uno::Reference<text::XTextRange>(xCrsr, uno::UNO_QUERY_THROW));
- xFormField->setFieldType(ODF_FORMDATE);
- uno::Reference<container::XNameContainer> xNameCont = xFormField->getParameters();
- if (xNameCont.is())
- {
- OUString sDateFormat = m_sDateFormat.makeStringAndClear();
-
- // Replace quotation mark used for marking static strings in date format
- sDateFormat = sDateFormat.replaceAll("'", "\"");
- xNameCont->insertByName(ODF_FORMDATE_DATEFORMAT, uno::Any(sDateFormat));
- xNameCont->insertByName(ODF_FORMDATE_DATEFORMAT_LANGUAGE,
- uno::Any(m_sLocale.makeStringAndClear()));
- }
- OUString sFullDate = m_sDate.makeStringAndClear();
-
- std::optional<OUString> oData = getValueFromDataBinding();
- if (oData.has_value())
- sFullDate = *oData;
-
- if (!sFullDate.isEmpty())
- {
- sal_Int32 nTimeSep = sFullDate.indexOf("T");
- if (nTimeSep != -1)
- sFullDate = sFullDate.copy(0, nTimeSep);
- xNameCont->insertByName(ODF_FORMDATE_CURRENTDATE, uno::Any(sFullDate));
- }
-
- uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(m_rDM_Impl.GetTextDocument(),
- uno::UNO_QUERY);
- uno::Reference<util::XRefreshable> xRefreshable(xTextFieldsSupplier->getTextFields(),
- uno::UNO_QUERY);
- xRefreshable->refresh();
-
- // Store all unused sdt parameters from grabbag
- xNameCont->insertByName(UNO_NAME_MISC_OBJ_INTEROPGRABBAG,
- uno::Any(getInteropGrabBagAndClear()));
-
- clear();
-}
-
-void SdtHelper::createControlShape(awt::Size aSize,
- uno::Reference<awt::XControlModel> const& xControlModel,
- const uno::Sequence<beans::PropertyValue>& rGrabBag)
-{
- uno::Reference<drawing::XControlShape> xControlShape(
- m_rDM_Impl.GetTextFactory()->createInstance("com.sun.star.drawing.ControlShape"),
- uno::UNO_QUERY);
- xControlShape->setSize(aSize);
- xControlShape->setControl(xControlModel);
-
- uno::Reference<beans::XPropertySet> xPropertySet(xControlShape, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("VertOrient", uno::Any(text::VertOrientation::CENTER));
-
- if (rGrabBag.hasElements())
- xPropertySet->setPropertyValue(UNO_NAME_MISC_OBJ_INTEROPGRABBAG, uno::Any(rGrabBag));
-
- uno::Reference<text::XTextContent> xTextContent(xControlShape, uno::UNO_QUERY);
- m_rDM_Impl.appendTextContent(xTextContent, uno::Sequence<beans::PropertyValue>());
- m_bHasElements = true;
-}
-
-void SdtHelper::appendToInteropGrabBag(const beans::PropertyValue& rValue)
-{
- m_aGrabBag.push_back(rValue);
-}
-
-uno::Sequence<beans::PropertyValue> SdtHelper::getInteropGrabBagAndClear()
-{
- uno::Sequence<beans::PropertyValue> aRet = comphelper::containerToSequence(m_aGrabBag);
- m_aGrabBag.clear();
- return aRet;
-}
-
-bool SdtHelper::isInteropGrabBagEmpty() const { return m_aGrabBag.empty(); }
-
-sal_Int32 SdtHelper::getInteropGrabBagSize() const { return m_aGrabBag.size(); }
-
-bool SdtHelper::containedInInteropGrabBag(const OUString& rValueName)
-{
- return std::any_of(
- m_aGrabBag.begin(), m_aGrabBag.end(),
- [&rValueName](const beans::PropertyValue& i) { return i.Name == rValueName; });
-}
-
-void SdtHelper::SetShowingPlcHdr() { m_bShowingPlcHdr = true; }
-
-bool SdtHelper::GetShowingPlcHdr() const { return m_bShowingPlcHdr; }
-
-void SdtHelper::SetChecked() { m_bChecked = true; }
-
-bool SdtHelper::GetChecked() const { return m_bChecked; }
-
-void SdtHelper::SetCheckedState(const OUString& rCheckedState) { m_aCheckedState = rCheckedState; }
-
-const OUString& SdtHelper::GetCheckedState() const { return m_aCheckedState; }
-
-void SdtHelper::SetUncheckedState(const OUString& rUncheckedState)
-{
- m_aUncheckedState = rUncheckedState;
-}
-
-const OUString& SdtHelper::GetUncheckedState() const { return m_aUncheckedState; }
-
-void SdtHelper::clear()
-{
- m_aDropDownItems.clear();
- m_aDropDownDisplayTexts.clear();
- setControlType(SdtControlType::unknown);
- m_nSdtType = 0;
- m_sDataBindingPrefixMapping.clear();
- m_sDataBindingXPath.clear();
- m_sDataBindingStoreItemID.clear();
- m_aGrabBag.clear();
- m_bHasUnusedText = false;
- m_bShowingPlcHdr = false;
- m_bChecked = false;
- m_aCheckedState.clear();
- m_aUncheckedState.clear();
- m_aPlaceholderDocPart.clear();
- m_aColor.clear();
- m_aAlias.clear();
- m_aTag.clear();
- m_nId = 0;
- m_nTabIndex = 0;
- m_aLock.clear();
- m_xFieldStartRange.clear();
-}
-
-void SdtHelper::SetPlaceholderDocPart(const OUString& rPlaceholderDocPart)
-{
- m_aPlaceholderDocPart = rPlaceholderDocPart;
-}
-
-const OUString& SdtHelper::GetPlaceholderDocPart() const { return m_aPlaceholderDocPart; }
-
-void SdtHelper::SetColor(const OUString& rColor) { m_aColor = rColor; }
-
-const OUString& SdtHelper::GetColor() const { return m_aColor; }
-
-void SdtHelper::SetAppearance(const OUString& rAppearance) { m_aAppearance = rAppearance; }
-
-const OUString& SdtHelper::GetAppearance() const { return m_aAppearance; }
-
-void SdtHelper::SetAlias(const OUString& rAlias) { m_aAlias = rAlias; }
-
-const OUString& SdtHelper::GetAlias() const { return m_aAlias; }
-
-void SdtHelper::SetTag(const OUString& rTag) { m_aTag = rTag; }
-
-const OUString& SdtHelper::GetTag() const { return m_aTag; }
-
-void SdtHelper::SetId(sal_Int32 nId) { m_nId = nId; }
-
-sal_Int32 SdtHelper::GetId() const { return m_nId; }
-
-void SdtHelper::SetTabIndex(sal_uInt32 nTabIndex) { m_nTabIndex = nTabIndex; }
-
-sal_uInt32 SdtHelper::GetTabIndex() const { return m_nTabIndex; }
-
-void SdtHelper::SetLock(const OUString& rLock) { m_aLock = rLock; }
-
-const OUString& SdtHelper::GetLock() const { return m_aLock; }
-
-} // namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/SdtHelper.hxx b/writerfilter/source/dmapper/SdtHelper.hxx
deleted file mode 100644
index 85b95a48818b..000000000000
--- a/writerfilter/source/dmapper/SdtHelper.hxx
+++ /dev/null
@@ -1,255 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-#include <vector>
-#include <optional>
-#include <unordered_map>
-
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <com/sun/star/text/XTextRange.hpp>
-#include <com/sun/star/uno/Sequence.hxx>
-#include <com/sun/star/xml/dom/XDocument.hpp>
-
-#include <rtl/ustrbuf.hxx>
-#include <tools/ref.hxx>
-
-namespace com::sun::star
-{
-namespace uno
-{
-class XComponentContext;
-}
-namespace awt
-{
-struct Size;
-class XControlModel;
-}
-}
-
-namespace writerfilter::dmapper
-{
-class DomainMapper_Impl;
-
-enum class SdtControlType
-{
- datePicker,
- dropDown,
- plainText,
- richText,
- checkBox,
- picture,
- comboBox,
- unsupported, // Sdt block is defined, but we still do not support such type of field
- unknown
-};
-
-/**
- * Helper to create form controls from w:sdt tokens.
- *
- * w:sdt tokens can't be imported as form fields, as w:sdt supports
- * e.g. date picking as well.
- */
-class SdtHelper final : public virtual SvRefBase
-{
- DomainMapper_Impl& m_rDM_Impl;
- css::uno::Reference<css::uno::XComponentContext> m_xComponentContext;
-
- /// Items of the drop-down control: <w:listItem w:value="...">.
- std::vector<OUString> m_aDropDownItems;
- /// Display texts of a drop-down control: <w:listItem w:displayText="...">.
- std::vector<OUString> m_aDropDownDisplayTexts;
- /// Type of sdt control
- SdtControlType m_aControlType;
- sal_uInt32 m_nSdtType = 0;
- /// Pieces of the default text -- currently used only by the dropdown control.
- OUStringBuffer m_aSdtTexts;
- /// Date ISO string contained in the w:date element, used by the date control.
- OUStringBuffer m_sDate;
- /// Date format string as it comes from the ooxml document.
- OUStringBuffer m_sDateFormat;
-
- /// <w:dataBinding w:prefixMappings="">
- OUString m_sDataBindingPrefixMapping;
- /// <w:dataBinding w:xpath="">
- OUString m_sDataBindingXPath;
- /// <w:dataBinding w:storeItemID="">
- OUString m_sDataBindingStoreItemID;
-
- /// Start range of the date or plain text field
- css::uno::Reference<css::text::XTextRange> m_xFieldStartRange;
- /// Locale string as it comes from the ooxml document.
- OUStringBuffer m_sLocale;
- /// Grab bag to store unsupported SDTs, aiming to save them back on export.
- std::vector<css::beans::PropertyValue> m_aGrabBag;
- /// Has inserted texts for plain text control
- bool m_bHasUnusedText;
-
- bool m_bHasElements;
- /// The last stored SDT element is outside paragraphs.
- bool m_bOutsideAParagraph;
-
- /// Storage for all properties documents as xml::dom::XDocument for later querying xpath for data
- std::unordered_map<OUString, css::uno::Reference<css::xml::dom::XDocument>> m_xPropertiesXMLs;
-
- /// Check if m_xPropertiesXMLs is initialized and loaded (need extra flag to distinguish
- /// empty sequence from not yet initialized)
- bool m_bPropertiesXMLsLoaded;
-
- /// Current contents are placeholder text.
- bool m_bShowingPlcHdr = false;
-
- /// If this is a checkbox, is the checkbox checked?
- bool m_bChecked = false;
-
- /// If this is a checkbox, the value of a checked checkbox.
- OUString m_aCheckedState;
-
- /// If this is a checkbox, the value of an unchecked checkbox.
- OUString m_aUncheckedState;
-
- /// Create and append the drawing::XControlShape, containing the various models.
- void createControlShape(css::awt::Size aSize,
- css::uno::Reference<css::awt::XControlModel> const& xControlModel,
- const css::uno::Sequence<css::beans::PropertyValue>& rGrabBag);
-
- void loadPropertiesXMLs();
-
- /// <w:placeholder>'s <w:docPart w:val="...">.
- OUString m_aPlaceholderDocPart;
-
- /// <w:sdtPr>'s <w15:color w:val="...">.
- OUString m_aColor;
-
- /// <w:sdtPr>'s <w15:appearance w:val="...">.
- OUString m_aAppearance;
-
- /// <w:sdtPr>'s <w:alias w:val="...">.
- OUString m_aAlias;
-
- /// <w:sdtPr>'s <w:tag w:val="...">.
- OUString m_aTag;
-
- /// <w:sdtPr>'s <w:id w:val="...">.
- sal_Int32 m_nId = 0;
-
- /// <w:sdtPr>'s <w:tabIndex w:val="...">.
- sal_uInt32 m_nTabIndex = 0;
-
- /// <w:sdtPr>'s <w:lock w:val="...">.
- OUString m_aLock;
-
-public:
- explicit SdtHelper(DomainMapper_Impl& rDM_Impl,
- css::uno::Reference<css::uno::XComponentContext> xContext);
- ~SdtHelper() override;
-
- std::vector<OUString>& getDropDownItems() { return m_aDropDownItems; }
- std::vector<OUString>& getDropDownDisplayTexts() { return m_aDropDownDisplayTexts; }
- OUStringBuffer& getSdtTexts() { return m_aSdtTexts; }
-
- OUStringBuffer& getDate() { return m_sDate; }
-
- OUStringBuffer& getDateFormat() { return m_sDateFormat; }
-
- void setDataBindingPrefixMapping(const OUString& sValue)
- {
- m_sDataBindingPrefixMapping = sValue;
- }
- const OUString& GetDataBindingPrefixMapping() const { return m_sDataBindingPrefixMapping; }
-
- void setDataBindingXPath(const OUString& sValue) { m_sDataBindingXPath = sValue; }
- const OUString& GetDataBindingXPath() const { return m_sDataBindingXPath; }
-
- void setDataBindingStoreItemID(const OUString& sValue) { m_sDataBindingStoreItemID = sValue; }
- const OUString& GetDataBindingStoreItemID() const { return m_sDataBindingStoreItemID; }
-
- bool isFieldStartRangeSet() const { return m_xFieldStartRange.is(); }
- void setFieldStartRange(const css::uno::Reference<css::text::XTextRange>& xStartRange)
- {
- m_xFieldStartRange = xStartRange;
- }
-
- OUStringBuffer& getLocale() { return m_sLocale; }
- /// If createControlShape() was ever called.
- bool hasElements() const { return m_bHasElements; }
-
- void setOutsideAParagraph(bool bOutsideAParagraph)
- {
- m_bOutsideAParagraph = bOutsideAParagraph;
- }
-
- bool isOutsideAParagraph() const { return m_bOutsideAParagraph; }
-
- SdtControlType getControlType() { return m_aControlType; }
- void setControlType(SdtControlType aType) { m_aControlType = aType; }
-
- void SetSdtType(sal_uInt32 nSdtType) { m_nSdtType = nSdtType; }
- sal_uInt32 GetSdtType() const { return m_nSdtType; }
-
- /// Create drop-down control from w:sdt's w:dropDownList.
- void createDropDownControl();
- /// Create date control from w:sdt's w:date.
- void createDateContentControl();
-
- void createPlainTextControl();
-
- void appendToInteropGrabBag(const css::beans::PropertyValue& rValue);
- css::uno::Sequence<css::beans::PropertyValue> getInteropGrabBagAndClear();
- bool isInteropGrabBagEmpty() const;
- bool containedInInteropGrabBag(const OUString& rValueName);
- sal_Int32 getInteropGrabBagSize() const;
-
- void setHasUnusedText(bool bHasUnusedText) { m_bHasUnusedText = bHasUnusedText; }
- bool hasUnusedText() const { return m_bHasUnusedText; }
-
- void SetShowingPlcHdr();
- bool GetShowingPlcHdr() const;
-
- void SetChecked();
- bool GetChecked() const;
- void SetCheckedState(const OUString& rCheckedState);
- const OUString& GetCheckedState() const;
- void SetUncheckedState(const OUString& rUncheckedState);
- const OUString& GetUncheckedState() const;
-
- /// Clear all collected attributes for further reuse
- void clear();
-
- void SetPlaceholderDocPart(const OUString& rPlaceholderDocPart);
- const OUString& GetPlaceholderDocPart() const;
-
- void SetColor(const OUString& rColor);
- const OUString& GetColor() const;
-
- void SetAppearance(const OUString& rAppearance);
- const OUString& GetAppearance() const;
-
- void SetAlias(const OUString& rAlias);
- const OUString& GetAlias() const;
-
- void SetTag(const OUString& rTag);
- const OUString& GetTag() const;
-
- void SetId(sal_Int32 nId);
- sal_Int32 GetId() const;
-
- void SetTabIndex(sal_uInt32 nTabIndex);
- sal_uInt32 GetTabIndex() const;
-
- void SetLock(const OUString& rLock);
- const OUString& GetLock() const;
-
- std::optional<OUString> getValueFromDataBinding();
-};
-
-} // namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/SectionColumnHandler.cxx b/writerfilter/source/dmapper/SectionColumnHandler.cxx
deleted file mode 100644
index 9fed9c34a68e..000000000000
--- a/writerfilter/source/dmapper/SectionColumnHandler.cxx
+++ /dev/null
@@ -1,90 +0,0 @@
-/* -*- 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/.
- *
- * 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 "SectionColumnHandler.hxx"
-#include "ConversionHelper.hxx"
-#include <ooxml/resourceids.hxx>
-#include <osl/diagnose.h>
-
-namespace writerfilter::dmapper
-{
-using namespace ::com::sun::star;
-
-SectionColumnHandler::SectionColumnHandler()
- : LoggedProperties("SectionColumnHandler")
- , m_bEqualWidth(false)
- , m_nSpace(1270) // 720 twips
- , m_nNum(0)
- , m_bSep(false)
-{
- m_aTempColumn.nWidth = m_aTempColumn.nSpace = 0;
-}
-
-SectionColumnHandler::~SectionColumnHandler() {}
-
-void SectionColumnHandler::lcl_attribute(Id rName, Value& rVal)
-{
- sal_Int32 nIntValue = rVal.getInt();
- switch (rName)
- {
- case NS_ooxml::LN_CT_Columns_equalWidth:
- m_bEqualWidth = (nIntValue != 0);
- break;
- case NS_ooxml::LN_CT_Columns_space:
- m_nSpace = ConversionHelper::convertTwipToMM100(nIntValue);
- break;
- case NS_ooxml::LN_CT_Columns_num:
- m_nNum = nIntValue;
- break;
- case NS_ooxml::LN_CT_Columns_sep:
- m_bSep = (nIntValue != 0);
- break;
-
- case NS_ooxml::LN_CT_Column_w:
- m_aTempColumn.nWidth = ConversionHelper::convertTwipToMM100(nIntValue);
- break;
- case NS_ooxml::LN_CT_Column_space:
- m_aTempColumn.nSpace = ConversionHelper::convertTwipToMM100(nIntValue);
- break;
- default:
- OSL_FAIL("SectionColumnHandler: unknown attribute");
- }
-}
-
-void SectionColumnHandler::lcl_sprm(Sprm& rSprm)
-{
- switch (rSprm.getId())
- {
- case NS_ooxml::LN_CT_Columns_col:
- {
- m_aTempColumn.nWidth = m_aTempColumn.nSpace = 0;
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- pProperties->resolve(*this);
- m_aCols.push_back(m_aTempColumn);
- }
- }
- break;
- default:
- OSL_FAIL("SectionColumnHandler: unknown sprm");
- }
-}
-} //namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/SectionColumnHandler.hxx b/writerfilter/source/dmapper/SectionColumnHandler.hxx
deleted file mode 100644
index cbef67460ed7..000000000000
--- a/writerfilter/source/dmapper/SectionColumnHandler.hxx
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include "LoggedResources.hxx"
-#include <vector>
-
-namespace writerfilter::dmapper
-{
-struct Column_
-{
- sal_Int32 nWidth;
- sal_Int32 nSpace;
-};
-
-
-class SectionColumnHandler : public LoggedProperties
-{
- bool m_bEqualWidth;
- sal_Int32 m_nSpace;
- sal_Int32 m_nNum;
- bool m_bSep;
- std::vector<Column_> m_aCols;
-
- Column_ m_aTempColumn;
-
- // Properties
- virtual void lcl_attribute(Id Name, Value & val) override;
- virtual void lcl_sprm(Sprm & sprm) override;
-
-public:
- SectionColumnHandler();
- virtual ~SectionColumnHandler() override;
-
- bool IsEqualWidth() const { return m_bEqualWidth; }
- sal_Int32 GetSpace() const { return m_nSpace; }
- sal_Int32 GetNum() const { return m_nNum; }
- bool IsSeparator() const { return m_bSep; }
-
- const std::vector<Column_>& GetColumns() const { return m_aCols;}
-
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/SettingsTable.cxx b/writerfilter/source/dmapper/SettingsTable.cxx
deleted file mode 100644
index a665a01c7209..000000000000
--- a/writerfilter/source/dmapper/SettingsTable.cxx
+++ /dev/null
@@ -1,800 +0,0 @@
-/* -*- 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/.
- *
- * 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 "SettingsTable.hxx"
-#include "DocumentProtection.hxx"
-#include "TagLogger.hxx"
-#include "WriteProtection.hxx"
-
-#include <vector>
-
-#include <rtl/ustring.hxx>
-#include <sfx2/zoomitem.hxx>
-#include <com/sun/star/text/ParagraphHyphenationKeepType.hpp>
-#include <com/sun/star/text/XDependentTextField.hpp>
-#include <com/sun/star/text/XTextFieldsSupplier.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/beans/XPropertyState.hpp>
-#include <com/sun/star/container/XNameContainer.hpp>
-#include <com/sun/star/style/XStyle.hpp>
-#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
-#include <comphelper/propertysequence.hxx>
-#include <comphelper/propertyvalue.hxx>
-#include <comphelper/sequence.hxx>
-
-#include <ooxml/OOXMLPropertySet.hxx>
-#include "ConversionHelper.hxx"
-#include "DomainMapper.hxx"
-#include "util.hxx"
-
-using namespace com::sun::star;
-
-namespace writerfilter {
-namespace
-{
-/// Maps OOXML <w:zoom w:val="..."> to SvxZoomType.
-sal_Int16 lcl_GetZoomType(Id nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_Value_doc_ST_Zoom_fullPage:
- return sal_Int16(SvxZoomType::WHOLEPAGE);
- case NS_ooxml::LN_Value_doc_ST_Zoom_bestFit:
- return sal_Int16(SvxZoomType::PAGEWIDTH);
- case NS_ooxml::LN_Value_doc_ST_Zoom_textFit:
- return sal_Int16(SvxZoomType::OPTIMAL);
- }
-
- return sal_Int16(SvxZoomType::PERCENT);
-}
-}
-
-namespace dmapper
-{
-
-struct SettingsTable_Impl
-{
- int m_nDefaultTabStop;
-
- bool m_bRecordChanges;
- bool m_bShowInsDelChanges;
- bool m_bShowFormattingChanges;
- bool m_bShowMarkupChanges;
- bool m_bLinkStyles;
- sal_Int16 m_nZoomFactor;
- sal_Int16 m_nZoomType = 0;
- sal_Int32 m_nWordCompatibilityMode;
- Id m_nView;
- bool m_bEvenAndOddHeaders;
- bool m_bUsePrinterMetrics;
- bool embedTrueTypeFonts;
- bool embedSystemFonts;
- bool m_bDoNotUseHTMLParagraphAutoSpacing;
- bool m_bNoColumnBalance;
- bool m_bAutoHyphenation;
- bool m_bNoHyphenateCaps;
- sal_Int16 m_nHyphenationZone;
- bool m_bWidowControl;
- bool m_bLongerSpaceSequence;
- bool m_bSplitPgBreakAndParaMark;
- bool m_bMirrorMargin;
- bool m_bDoNotExpandShiftReturn;
- bool m_bDisplayBackgroundShape;
- bool m_bNoLeading = false;
- OUString m_sDecimalSymbol;
- OUString m_sListSeparator;
- std::vector<std::pair<OUString, OUString>> m_aDocVars;
-
- uno::Sequence<beans::PropertyValue> m_pThemeFontLangProps;
-
- std::vector<beans::PropertyValue> m_aCompatSettings;
- uno::Sequence<beans::PropertyValue> m_pCurrentCompatSetting;
- OUString m_aCurrentCompatSettingName;
- OUString m_aCurrentCompatSettingUri;
- OUString m_aCurrentCompatSettingValue;
- OUString m_sCurrentDatabaseDataSource;
-
- std::shared_ptr<DocumentProtection> m_pDocumentProtection;
- std::shared_ptr<WriteProtection> m_pWriteProtection;
- bool m_bGutterAtTop = false;
- bool m_bDoNotBreakWrappedTables = false;
- bool m_bAllowTextAfterFloatingTableBreak = false;
-
- SettingsTable_Impl() :
- m_nDefaultTabStop( 720 ) //default is 1/2 in
- , m_bRecordChanges(false)
- , m_bShowInsDelChanges(true)
- , m_bShowFormattingChanges(false)
- , m_bShowMarkupChanges(true)
- , m_bLinkStyles(false)
- , m_nZoomFactor(0)
- , m_nWordCompatibilityMode(-1)
- , m_nView(0)
- , m_bEvenAndOddHeaders(false)
- , m_bUsePrinterMetrics(false)
- , embedTrueTypeFonts(false)
- , embedSystemFonts(false)
- , m_bDoNotUseHTMLParagraphAutoSpacing(false)
- , m_bNoColumnBalance(false)
- , m_bAutoHyphenation(false)
- , m_bNoHyphenateCaps(false)
- , m_nHyphenationZone(0)
- , m_bWidowControl(false)
- , m_bLongerSpaceSequence(false)
- , m_bSplitPgBreakAndParaMark(false)
- , m_bMirrorMargin(false)
- , m_bDoNotExpandShiftReturn(false)
- , m_bDisplayBackgroundShape(false)
- , m_sDecimalSymbol(".")
- , m_sListSeparator(",")
- , m_pThemeFontLangProps(3)
- , m_pCurrentCompatSetting(3)
- {}
-};
-
-SettingsTable::SettingsTable(const DomainMapper& rDomainMapper)
-: LoggedProperties("SettingsTable")
-, LoggedTable("SettingsTable")
-, m_pImpl( new SettingsTable_Impl )
-{
- if (rDomainMapper.IsRTFImport())
- {
- // HTML paragraph auto-spacing is opt-in for RTF, opt-out for OOXML.
- m_pImpl->m_bDoNotUseHTMLParagraphAutoSpacing = true;
- // Longer space sequence is opt-in for RTF, and not in OOXML.
- m_pImpl->m_bLongerSpaceSequence = true;
- m_pImpl->m_bDoNotBreakWrappedTables = true;
- }
- m_pImpl->m_pDocumentProtection = std::make_shared<DocumentProtection>();
- m_pImpl->m_pWriteProtection = std::make_shared<WriteProtection>();
-}
-
-SettingsTable::~SettingsTable()
-{
-}
-
-void SettingsTable::lcl_attribute(Id nName, Value & val)
-{
- int nIntValue = val.getInt();
- OUString sStringValue = val.getString();
-
- switch(nName)
- {
- case NS_ooxml::LN_CT_Zoom_percent:
- m_pImpl->m_nZoomFactor = nIntValue;
- break;
- case NS_ooxml::LN_CT_Zoom_val:
- m_pImpl->m_nZoomType = lcl_GetZoomType(nIntValue);
- break;
- case NS_ooxml::LN_CT_Language_val:
- m_pImpl->m_pThemeFontLangProps.getArray()[0]
- = comphelper::makePropertyValue("val", sStringValue);
- break;
- case NS_ooxml::LN_CT_Language_eastAsia:
- m_pImpl->m_pThemeFontLangProps.getArray()[1]
- = comphelper::makePropertyValue("eastAsia", sStringValue);
- break;
- case NS_ooxml::LN_CT_Language_bidi:
- m_pImpl->m_pThemeFontLangProps.getArray()[2]
- = comphelper::makePropertyValue("bidi", sStringValue);
- break;
- case NS_ooxml::LN_CT_View_val:
- m_pImpl->m_nView = nIntValue;
- break;
- case NS_ooxml::LN_CT_DocVar_name:
- m_pImpl->m_aDocVars.back().first = sStringValue;
- break;
- case NS_ooxml::LN_CT_DocVar_val:
- m_pImpl->m_aDocVars.back().second = sStringValue;
- break;
- case NS_ooxml::LN_CT_CompatSetting_name:
- m_pImpl->m_aCurrentCompatSettingName = sStringValue;
- m_pImpl->m_pCurrentCompatSetting.getArray()[0]
- = comphelper::makePropertyValue("name", sStringValue);
- break;
- case NS_ooxml::LN_CT_CompatSetting_uri:
- m_pImpl->m_aCurrentCompatSettingUri = sStringValue;
- m_pImpl->m_pCurrentCompatSetting.getArray()[1]
- = comphelper::makePropertyValue("uri", sStringValue);
- break;
- case NS_ooxml::LN_CT_CompatSetting_val:
- m_pImpl->m_aCurrentCompatSettingValue = sStringValue;
- m_pImpl->m_pCurrentCompatSetting.getArray()[2]
- = comphelper::makePropertyValue("val", sStringValue);
- break;
- case NS_ooxml::LN_CT_TrackChangesView_insDel:
- m_pImpl->m_bShowInsDelChanges = (nIntValue != 0);
- break;
- case NS_ooxml::LN_CT_TrackChangesView_formatting:
- m_pImpl->m_bShowFormattingChanges = (nIntValue != 0);
- break;
- case NS_ooxml::LN_CT_TrackChangesView_markup:
- m_pImpl->m_bShowMarkupChanges = (nIntValue != 0);
- break;
- default:
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- }
- }
-}
-
-void SettingsTable::lcl_sprm(Sprm& rSprm)
-{
- sal_uInt32 nSprmId = rSprm.getId();
-
- Value::Pointer_t pValue = rSprm.getValue();
- sal_Int32 nIntValue = pValue->getInt();
-
- switch(nSprmId)
- {
- case NS_ooxml::LN_CT_Settings_zoom: // 92469;
- case NS_ooxml::LN_CT_Settings_proofState: // 92489;
- case NS_ooxml::LN_CT_Settings_attachedTemplate: // 92491;
- case NS_ooxml::LN_CT_Settings_hdrShapeDefaults: // 92544;
- case NS_ooxml::LN_CT_Settings_footnotePr: // 92545;
- case NS_ooxml::LN_CT_Settings_endnotePr: // 92546;
- case NS_ooxml::LN_CT_Settings_compat: // 92547;
- case NS_ooxml::LN_CT_Settings_themeFontLang: // 92552;
- case NS_ooxml::LN_CT_Settings_shapeDefaults: // 92560;
- case NS_ooxml::LN_CT_Settings_view:
- //PropertySetValues - need to be resolved
- {
- resolveSprmProps(*this, rSprm);
- }
- break;
- case NS_ooxml::LN_CT_Settings_stylePaneFormatFilter: // 92493;
- break;
- case NS_ooxml::LN_CT_Settings_defaultTabStop: // 92505;
- m_pImpl->m_nDefaultTabStop = nIntValue;
- break;
- case NS_ooxml::LN_CT_Settings_linkStyles: // 92663;
- m_pImpl->m_bLinkStyles = nIntValue;
- break;
- case NS_ooxml::LN_CT_Settings_evenAndOddHeaders:
- m_pImpl->m_bEvenAndOddHeaders = nIntValue;
- break;
- case NS_ooxml::LN_CT_Settings_noPunctuationKerning: // 92526;
- break;
- case NS_ooxml::LN_CT_Settings_characterSpacingControl: // 92527;
- // doNotCompress, compressPunctuation, compressPunctuationAndJapaneseKana
- break;
- case NS_ooxml::LN_CT_Settings_doNotIncludeSubdocsInStats: // 92554; // Do Not Include Content in Text Boxes, Footnotes, and Endnotes in Document Statistics)
- break;
- case NS_ooxml::LN_CT_Settings_decimalSymbol: // 92562;
- m_pImpl->m_sDecimalSymbol = pValue->getString();
- break;
- case NS_ooxml::LN_CT_Settings_listSeparator: // 92563;
- m_pImpl->m_sListSeparator = pValue->getString();
- break;
- case NS_ooxml::LN_CT_Settings_rsids: // 92549; revision save Ids - probably not necessary
- break;
- case NS_ooxml::LN_CT_Settings_hyphenationZone: // 92508;
- m_pImpl->m_nHyphenationZone = nIntValue;
- break;
- case NS_ooxml::LN_CT_Compat_useFELayout: // 92422;
- // useFELayout (Do Not Bypass East Asian/Complex Script Layout Code - support of old versions of Word - ignored)
- break;
- case NS_ooxml::LN_CT_Settings_trackRevisions:
- {
- m_pImpl->m_bRecordChanges = bool(rSprm.getValue( )->getInt( ) );
- }
- break;
- case NS_ooxml::LN_CT_Settings_revisionView:
- resolveSprmProps(*this, rSprm);
- break;
- case NS_ooxml::LN_CT_Settings_documentProtection:
- resolveSprmProps(*(m_pImpl->m_pDocumentProtection), rSprm);
- break;
- case NS_ooxml::LN_CT_Settings_writeProtection:
- resolveSprmProps(*(m_pImpl->m_pWriteProtection), rSprm);
- break;
- case NS_ooxml::LN_CT_Compat_usePrinterMetrics:
- m_pImpl->m_bUsePrinterMetrics = nIntValue;
- break;
- case NS_ooxml::LN_CT_Settings_embedTrueTypeFonts:
- m_pImpl->embedTrueTypeFonts = nIntValue != 0;
- break;
- case NS_ooxml::LN_CT_Settings_embedSystemFonts:
- m_pImpl->embedSystemFonts = nIntValue != 0;
- break;
- case NS_ooxml::LN_CT_Compat_doNotUseHTMLParagraphAutoSpacing:
- m_pImpl->m_bDoNotUseHTMLParagraphAutoSpacing = nIntValue;
- break;
- case NS_ooxml::LN_CT_Compat_splitPgBreakAndParaMark:
- m_pImpl->m_bSplitPgBreakAndParaMark = nIntValue;
- break;
- case NS_ooxml::LN_CT_Settings_mirrorMargins:
- m_pImpl->m_bMirrorMargin = nIntValue;
- break;
- case NS_ooxml::LN_CT_Settings_mailMerge:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_CT_MailMerge_query:
- {
- // try to get the "database.table" name from the query saved previously
- OUString sVal = pValue->getString();
- if ( sVal.endsWith("$") && sVal.indexOf(".dbo.") > 0 )
- {
- sal_Int32 nSpace = sVal.lastIndexOf(' ');
- sal_Int32 nDbo = sVal.lastIndexOf(".dbo.");
- if ( nSpace > 0 && nSpace < nDbo - 1 )
- {
- m_pImpl->m_sCurrentDatabaseDataSource = OUString::Concat(sVal.subView(nSpace + 1, nDbo - nSpace - 1)) +
- sVal.subView(nDbo + 4, sVal.getLength() - nDbo - 5);
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_Compat_compatSetting:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- pProperties->resolve(*this);
-
- beans::PropertyValue aValue;
- aValue.Name = "compatSetting";
- aValue.Value <<= m_pImpl->m_pCurrentCompatSetting;
- m_pImpl->m_aCompatSettings.push_back(aValue);
-
- OString aCompatSettingValue = rtl::OUStringToOString(
- m_pImpl->m_aCurrentCompatSettingValue, RTL_TEXTENCODING_UTF8);
- if (m_pImpl->m_aCurrentCompatSettingName == "allowTextAfterFloatingTableBreak"
- && m_pImpl->m_aCurrentCompatSettingUri == "http://schemas.microsoft.com/office/word"
- && ooxml::GetBooleanValue(aCompatSettingValue))
- {
- m_pImpl->m_bAllowTextAfterFloatingTableBreak = true;
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_Settings_docVars:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- pProperties->resolve(*this);
- }
- }
- break;
- case NS_ooxml::LN_CT_DocVar:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- m_pImpl->m_aDocVars.push_back(std::make_pair(OUString(), OUString()));
- pProperties->resolve(*this);
- }
- }
- break;
- case NS_ooxml::LN_CT_Compat_noColumnBalance:
- m_pImpl->m_bNoColumnBalance = nIntValue;
- break;
- case NS_ooxml::LN_CT_Settings_autoHyphenation:
- m_pImpl->m_bAutoHyphenation = nIntValue;
- break;
- case NS_ooxml::LN_CT_Settings_doNotHyphenateCaps:
- m_pImpl->m_bNoHyphenateCaps = nIntValue;
- break;
- case NS_ooxml::LN_CT_Settings_widowControl:
- m_pImpl->m_bWidowControl = nIntValue;
- break;
- case NS_ooxml::LN_CT_Settings_longerSpaceSequence:
- m_pImpl->m_bLongerSpaceSequence = nIntValue;
- break;
- case NS_ooxml::LN_CT_Compat_doNotExpandShiftReturn:
- m_pImpl->m_bDoNotExpandShiftReturn = true;
- break;
- case NS_ooxml::LN_CT_Settings_displayBackgroundShape:
- m_pImpl->m_bDisplayBackgroundShape = nIntValue;
- break;
- case NS_ooxml::LN_CT_Compat_noLeading:
- m_pImpl->m_bNoLeading = nIntValue != 0;
- break;
- case NS_ooxml::LN_CT_Settings_gutterAtTop:
- m_pImpl->m_bGutterAtTop = nIntValue != 0;
- break;
- case NS_ooxml::LN_CT_Compat_doNotBreakWrappedTables:
- m_pImpl->m_bDoNotBreakWrappedTables = nIntValue != 0;
- break;
- default:
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- }
- }
-}
-
-void SettingsTable::lcl_entry(const writerfilter::Reference<Properties>::Pointer_t& ref)
-{
- ref->resolve(*this);
-}
-
-//returns default TabStop in 1/100th mm
-int SettingsTable::GetDefaultTabStop() const
-{
- return ConversionHelper::convertTwipToMM100( m_pImpl->m_nDefaultTabStop );
-}
-
-bool SettingsTable::GetLinkStyles() const
-{
- return m_pImpl->m_bLinkStyles;
-}
-
-sal_Int16 SettingsTable::GetZoomFactor() const
-{
- return m_pImpl->m_nZoomFactor;
-}
-
-sal_Int16 SettingsTable::GetZoomType() const { return m_pImpl->m_nZoomType; }
-
-Id SettingsTable::GetView() const
-{
- return m_pImpl->m_nView;
-}
-
-bool SettingsTable::GetUsePrinterMetrics() const
-{
- return m_pImpl->m_bUsePrinterMetrics;
-}
-
-bool SettingsTable::GetEvenAndOddHeaders() const
-{
- return m_pImpl->m_bEvenAndOddHeaders;
-}
-
-bool SettingsTable::GetEmbedTrueTypeFonts() const
-{
- return m_pImpl->embedTrueTypeFonts;
-}
-
-bool SettingsTable::GetEmbedSystemFonts() const
-{
- return m_pImpl->embedSystemFonts;
-}
-
-bool SettingsTable::GetDoNotUseHTMLParagraphAutoSpacing() const
-{
- return m_pImpl->m_bDoNotUseHTMLParagraphAutoSpacing;
-}
-
-bool SettingsTable::GetNoColumnBalance() const
-{
- return m_pImpl->m_bNoColumnBalance;
-}
-
-bool SettingsTable::GetSplitPgBreakAndParaMark() const
-{
- return m_pImpl->m_bSplitPgBreakAndParaMark;
-}
-
-bool SettingsTable::GetMirrorMarginSettings() const
-{
- return m_pImpl->m_bMirrorMargin;
-}
-
-bool SettingsTable::GetDisplayBackgroundShape() const
-{
- return m_pImpl->m_bDisplayBackgroundShape;
-}
-
-bool SettingsTable::GetDoNotExpandShiftReturn() const
-{
- return m_pImpl->m_bDoNotExpandShiftReturn;
-}
-
-bool SettingsTable::GetProtectForm() const
-{
- return m_pImpl->m_pDocumentProtection->getProtectForm()
- && m_pImpl->m_pDocumentProtection->getEnforcement();
-}
-
-bool SettingsTable::GetReadOnly() const
-{
- return m_pImpl->m_pWriteProtection->getRecommended()
- || (m_pImpl->m_pDocumentProtection->getReadOnly()
- && m_pImpl->m_pDocumentProtection->getEnforcement());
-}
-
-bool SettingsTable::GetNoHyphenateCaps() const
-{
- return m_pImpl->m_bNoHyphenateCaps;
-}
-
-sal_Int16 SettingsTable::GetHyphenationZone() const
-{
- return m_pImpl->m_nHyphenationZone;
-}
-
-const OUString & SettingsTable::GetDecimalSymbol() const
-{
- return m_pImpl->m_sDecimalSymbol;
-}
-
-const OUString & SettingsTable::GetListSeparator() const
-{
- return m_pImpl->m_sListSeparator;
-}
-
-
-uno::Sequence<beans::PropertyValue> const & SettingsTable::GetThemeFontLangProperties() const
-{
- return m_pImpl->m_pThemeFontLangProps;
-}
-
-uno::Sequence<beans::PropertyValue> SettingsTable::GetCompatSettings() const
-{
- if ( GetWordCompatibilityMode() == -1 )
- {
- // the default value for an undefined compatibilityMode is 12 (Word 2007)
- uno::Sequence<beans::PropertyValue> aCompatSetting( comphelper::InitPropertySequence({
- { "name", uno::Any(OUString("compatibilityMode")) },
- { "uri", uno::Any(OUString("http://schemas.microsoft.com/office/word")) },
- { "val", uno::Any(OUString("12")) } //12: Use word processing features specified in ECMA-376. This is the default.
- }));
-
- beans::PropertyValue aValue;
- aValue.Name = "compatSetting";
- aValue.Value <<= aCompatSetting;
-
- m_pImpl->m_aCompatSettings.push_back(aValue);
- }
-
- return comphelper::containerToSequence(m_pImpl->m_aCompatSettings);
-}
-
-uno::Sequence<beans::PropertyValue> SettingsTable::GetDocumentProtectionSettings() const
-{
- return m_pImpl->m_pDocumentProtection->toSequence();
-}
-
-uno::Sequence<beans::PropertyValue> SettingsTable::GetWriteProtectionSettings() const
-{
- return m_pImpl->m_pWriteProtection->toSequence();
-}
-
-const OUString & SettingsTable::GetCurrentDatabaseDataSource() const
-{
- return m_pImpl->m_sCurrentDatabaseDataSource;
-}
-
-static bool lcl_isDefault(const uno::Reference<beans::XPropertyState>& xPropertyState, const OUString& rPropertyName)
-{
- return xPropertyState->getPropertyState(rPropertyName) == beans::PropertyState_DEFAULT_VALUE;
-}
-
-void SettingsTable::ApplyProperties(uno::Reference<text::XTextDocument> const& xDoc)
-{
- uno::Reference< beans::XPropertySet> xDocProps( xDoc, uno::UNO_QUERY );
- uno::Reference<lang::XMultiServiceFactory> xTextFactory(xDoc, uno::UNO_QUERY_THROW);
- uno::Reference<beans::XPropertySet> xDocumentSettings(xTextFactory->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY_THROW);
-
- // Shared between DOCX and RTF, unconditional flags.
- xDocumentSettings->setPropertyValue("TableRowKeep", uno::Any(true));
- xDocumentSettings->setPropertyValue("AddVerticalFrameOffsets", uno::Any(true));
-
- if (GetWordCompatibilityMode() <= 14)
- {
- xDocumentSettings->setPropertyValue("MsWordCompMinLineHeightByFly", uno::Any(true));
- xDocumentSettings->setPropertyValue("TabOverMargin", uno::Any(true));
- }
-
- // Show changes value
- if (xDocProps.is())
- {
- bool bHideChanges = !m_pImpl->m_bShowInsDelChanges || !m_pImpl->m_bShowMarkupChanges;
- xDocProps->setPropertyValue("ShowChanges", uno::Any( !bHideChanges || m_pImpl->m_bShowFormattingChanges ) );
- }
-
- // Record changes value
- if (xDocProps.is())
- {
- xDocProps->setPropertyValue("RecordChanges", uno::Any( m_pImpl->m_bRecordChanges ) );
- // Password protected Record changes
- if (m_pImpl->m_bRecordChanges && m_pImpl->m_pDocumentProtection->getRedlineProtection()
- && m_pImpl->m_pDocumentProtection->getEnforcement())
- {
- // use dummy protection key to forbid disabling of Record changes without a notice
- // (extending the recent GrabBag support) TODO support password verification...
- css::uno::Sequence<sal_Int8> aDummyKey { 1 };
- xDocProps->setPropertyValue("RedlineProtectionKey", uno::Any( aDummyKey ));
- }
- }
-
- // Create or overwrite DocVars based on found in settings
- if (m_pImpl->m_aDocVars.size())
- {
- uno::Reference< text::XTextFieldsSupplier > xFieldsSupplier(xDoc, uno::UNO_QUERY_THROW);
- uno::Reference< container::XNameAccess > xFieldMasterAccess = xFieldsSupplier->getTextFieldMasters();
- for (const auto& docVar : m_pImpl->m_aDocVars)
- {
- uno::Reference< beans::XPropertySet > xMaster;
- OUString sFieldMasterService("com.sun.star.text.FieldMaster.User." + docVar.first);
-
- // Find or create Field Master
- if (xFieldMasterAccess->hasByName(sFieldMasterService))
- {
- xMaster.set(xFieldMasterAccess->getByName(sFieldMasterService), uno::UNO_QUERY_THROW);
- }
- else
- {
- xMaster.set(xTextFactory->createInstance("com.sun.star.text.FieldMaster.User"), uno::UNO_QUERY_THROW);
- xMaster->setPropertyValue(getPropertyName(PROP_NAME), uno::Any(docVar.first));
- uno::Reference<text::XDependentTextField> xField(
- xTextFactory->createInstance("com.sun.star.text.TextField.User"),
- uno::UNO_QUERY);
- xField->attachTextFieldMaster(xMaster);
- }
-
- xMaster->setPropertyValue(getPropertyName(PROP_CONTENT), uno::Any(docVar.second));
- }
- }
-
- if (m_pImpl->m_bDoNotBreakWrappedTables)
- {
- // Map <w:doNotBreakWrappedTables> to the DoNotBreakWrappedTables compat flag.
- xDocumentSettings->setPropertyValue("DoNotBreakWrappedTables", uno::Any(true));
- }
-
- if (m_pImpl->m_bAllowTextAfterFloatingTableBreak)
- {
- xDocumentSettings->setPropertyValue("AllowTextAfterFloatingTableBreak", uno::Any(true));
- }
-
- // Auto hyphenation: turns on hyphenation by default, <w:suppressAutoHyphens/> may still disable it at a paragraph level.
- // Situation is similar for RTF_WIDOWCTRL, which turns on widow / orphan control by default.
- if (!(m_pImpl->m_bAutoHyphenation || m_pImpl->m_bNoHyphenateCaps || m_pImpl->m_bWidowControl))
- return;
-
- uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(xDoc, uno::UNO_QUERY);
- if (!xStyleFamiliesSupplier.is())
- return;
-
- uno::Reference<container::XNameAccess> xStyleFamilies = xStyleFamiliesSupplier->getStyleFamilies();
- uno::Reference<container::XNameContainer> xParagraphStyles = xStyleFamilies->getByName("ParagraphStyles").get< uno::Reference<container::XNameContainer> >();
- uno::Reference<style::XStyle> xDefault = xParagraphStyles->getByName("Standard").get< uno::Reference<style::XStyle> >();
- uno::Reference<beans::XPropertyState> xPropertyState(xDefault, uno::UNO_QUERY);
- if (m_pImpl->m_bAutoHyphenation && lcl_isDefault(xPropertyState, "ParaIsHyphenation"))
- {
- uno::Reference<beans::XPropertySet> xPropertySet(xDefault, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("ParaIsHyphenation", uno::Any(true));
- }
- if (m_pImpl->m_bNoHyphenateCaps)
- {
- uno::Reference<beans::XPropertySet> xPropertySet(xDefault, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("ParaHyphenationNoCaps", uno::Any(true));
- }
- if (m_pImpl->m_nHyphenationZone)
- {
- uno::Reference<beans::XPropertySet> xPropertySet(xDefault, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("ParaHyphenationZone", uno::Any(GetHyphenationZone()));
- }
- if (m_pImpl->m_bWidowControl && lcl_isDefault(xPropertyState, "ParaWidows") && lcl_isDefault(xPropertyState, "ParaOrphans"))
- {
- uno::Reference<beans::XPropertySet> xPropertySet(xDefault, uno::UNO_QUERY);
- uno::Any aAny(static_cast<sal_Int8>(2));
- xPropertySet->setPropertyValue("ParaWidows", aAny);
- xPropertySet->setPropertyValue("ParaOrphans", aAny);
- }
-
- std::pair<bool, bool> aAllow = GetCompatSettingHasAndValue(u"allowHyphenationAtTrackBottom");
- std::pair<bool, bool> aUse = GetCompatSettingHasAndValue(u"useWord2013TrackBottomHyphenation");
- // if allowHyphenationAtTrackBottom is not true and useWord2013TrackBottomHyphenation is
- // not present or it is true, set ParaHyphenationKeep to COLUMN
- if ( !aAllow.second && ( !aUse.first || aUse.second ) )
- {
- uno::Reference<beans::XPropertySet> xPropertySet(xDefault, uno::UNO_QUERY);
- xPropertySet->setPropertyValue("ParaHyphenationKeep", uno::Any(true));
- xPropertySet->setPropertyValue("ParaHyphenationKeepType", uno::Any(text::ParagraphHyphenationKeepType::COLUMN));
- }
-}
-
-std::pair<bool, bool> SettingsTable::GetCompatSettingHasAndValue( std::u16string_view sCompatName ) const
-{
- bool bHas = false;
- bool bRet = false;
- for (const auto& rProp : m_pImpl->m_aCompatSettings)
- {
- if (rProp.Name == "compatSetting") //always true
- {
- css::uno::Sequence<css::beans::PropertyValue> aCurrentCompatSettings;
- rProp.Value >>= aCurrentCompatSettings;
-
- OUString sName;
- aCurrentCompatSettings[0].Value >>= sName;
- if ( sName != sCompatName )
- continue;
-
- OUString sUri;
- aCurrentCompatSettings[1].Value >>= sUri;
- if ( sUri != "http://schemas.microsoft.com/office/word" )
- continue;
-
- OUString sVal;
- aCurrentCompatSettings[2].Value >>= sVal;
- // if repeated, what happens? Last one wins
- bRet = sVal.toBoolean();
- bHas = true;
- }
- }
-
- return std::pair<bool, bool>(bHas, bRet);
-}
-
-//Keep this function in-sync with the one in sw/.../docxattributeoutput.cxx
-sal_Int32 SettingsTable::GetWordCompatibilityMode() const
-{
- if ( m_pImpl->m_nWordCompatibilityMode != -1 )
- return m_pImpl->m_nWordCompatibilityMode;
-
- for (const auto& rProp : m_pImpl->m_aCompatSettings)
- {
- if (rProp.Name == "compatSetting") //always true
- {
- css::uno::Sequence<css::beans::PropertyValue> aCurrentCompatSettings;
- rProp.Value >>= aCurrentCompatSettings;
-
- OUString sName;
- aCurrentCompatSettings[0].Value >>= sName;
- if ( sName != "compatibilityMode" )
- continue;
-
- OUString sUri;
- aCurrentCompatSettings[1].Value >>= sUri;
- if ( sUri != "http://schemas.microsoft.com/office/word" )
- continue;
-
- OUString sVal;
- aCurrentCompatSettings[2].Value >>= sVal;
- const sal_Int32 nValidMode = sVal.toInt32();
- // if repeated, highest mode wins in MS Word. 11 is the first valid mode.
- if ( nValidMode > 10 && nValidMode > m_pImpl->m_nWordCompatibilityMode )
- m_pImpl->m_nWordCompatibilityMode = nValidMode;
- }
- }
-
- return m_pImpl->m_nWordCompatibilityMode;
-}
-
-bool SettingsTable::GetLongerSpaceSequence() const
-{
- return m_pImpl->m_bLongerSpaceSequence;
-}
-
-bool SettingsTable::GetNoLeading() const
-{
- return m_pImpl->m_bNoLeading;
-}
-
-bool SettingsTable::GetGutterAtTop() const { return m_pImpl->m_bGutterAtTop; }
-
-bool SettingsTable::GetRecordChanges() const { return m_pImpl->m_bRecordChanges; }
-
-}//namespace dmapper
-} //namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/SettingsTable.hxx b/writerfilter/source/dmapper/SettingsTable.hxx
deleted file mode 100644
index f5ccb1bec96e..000000000000
--- a/writerfilter/source/dmapper/SettingsTable.hxx
+++ /dev/null
@@ -1,113 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include "LoggedResources.hxx"
-#include <com/sun/star/text/XTextDocument.hpp>
-#include <memory>
-
-namespace com::sun::star::lang
-{
-class XMultiServiceFactory;
-struct Locale;
-}
-
-namespace writerfilter::dmapper
-{
-class DomainMapper;
-
-struct SettingsTable_Impl;
-
-class SettingsTable : public LoggedProperties, public LoggedTable
-{
- std::unique_ptr<SettingsTable_Impl> m_pImpl;
-
-public:
- SettingsTable(const DomainMapper& rDomainMapper);
- virtual ~SettingsTable() override;
-
- //returns default TabStop in 1/100th mm
- int GetDefaultTabStop() const;
-
- /// Automatically update styles from document template?
- bool GetLinkStyles() const;
-
- /// What's the zoom factor set in percents?
- sal_Int16 GetZoomFactor() const;
-
- /// Gets the type of the zoom.
- sal_Int16 GetZoomType() const;
-
- /// What's the requested view? E.g. "web".
- Id GetView() const;
-
- bool GetEvenAndOddHeaders() const;
-
- bool GetUsePrinterMetrics() const;
-
- bool GetEmbedTrueTypeFonts() const;
- bool GetEmbedSystemFonts() const;
-
- bool GetDoNotUseHTMLParagraphAutoSpacing() const;
- bool GetSplitPgBreakAndParaMark() const;
- bool GetMirrorMarginSettings() const;
- bool GetDisplayBackgroundShape() const;
- bool GetDoNotExpandShiftReturn() const;
- bool GetNoColumnBalance() const;
- bool GetProtectForm() const;
- bool GetReadOnly() const;
- bool GetLongerSpaceSequence() const;
- bool GetNoLeading() const;
- bool GetNoHyphenateCaps() const;
- sal_Int16 GetHyphenationZone() const;
-
- const OUString& GetDecimalSymbol() const;
- const OUString& GetListSeparator() const;
-
- css::uno::Sequence<css::beans::PropertyValue> const& GetThemeFontLangProperties() const;
-
- css::uno::Sequence<css::beans::PropertyValue> GetCompatSettings() const;
-
- css::uno::Sequence<css::beans::PropertyValue> GetDocumentProtectionSettings() const;
-
- css::uno::Sequence<css::beans::PropertyValue> GetWriteProtectionSettings() const;
-
- void ApplyProperties(css::uno::Reference<css::text::XTextDocument> const& xDoc);
-
- std::pair<bool, bool> GetCompatSettingHasAndValue(std::u16string_view sCompatName) const;
- sal_Int32 GetWordCompatibilityMode() const;
-
- const OUString& GetCurrentDatabaseDataSource() const;
- bool GetGutterAtTop() const;
-
- bool GetRecordChanges() const;
-
-private:
- // Properties
- virtual void lcl_attribute(Id Name, Value& val) override;
- virtual void lcl_sprm(Sprm& sprm) override;
-
- // Table
- virtual void lcl_entry(const writerfilter::Reference<Properties>::Pointer_t& ref) override;
-};
-typedef tools::SvRef<SettingsTable> SettingsTablePtr;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/SmartTagHandler.cxx b/writerfilter/source/dmapper/SmartTagHandler.cxx
deleted file mode 100644
index c92fa7c44be5..000000000000
--- a/writerfilter/source/dmapper/SmartTagHandler.cxx
+++ /dev/null
@@ -1,127 +0,0 @@
-/* -*- 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 "SmartTagHandler.hxx"
-
-#include <com/sun/star/rdf/Literal.hpp>
-#include <com/sun/star/rdf/URI.hpp>
-#include <com/sun/star/rdf/XDocumentMetadataAccess.hpp>
-#include <com/sun/star/text/XTextDocument.hpp>
-#include <com/sun/star/text/XTextRange.hpp>
-
-#include <ooxml/resourceids.hxx>
-
-#include <sal/log.hxx>
-
-namespace
-{
-OUString lcl_getTypePath(OUString& rType)
-{
- OUString aRet;
- if (rType.startsWith("urn:bails"))
- {
- rType = "urn:bails";
- aRet = "tscp/bails.rdf";
- }
- return aRet;
-}
-}
-
-namespace writerfilter::dmapper
-{
-using namespace ::com::sun::star;
-
-SmartTagHandler::SmartTagHandler(uno::Reference<uno::XComponentContext> xComponentContext,
- const uno::Reference<text::XTextDocument>& xTextDocument)
- : LoggedProperties("SmartTagHandler")
- , m_xComponentContext(std::move(xComponentContext))
- , m_xDocumentMetadataAccess(xTextDocument, uno::UNO_QUERY)
-{
-}
-
-SmartTagHandler::~SmartTagHandler() = default;
-
-void SmartTagHandler::lcl_attribute(Id nId, Value& rValue)
-{
- switch (nId)
- {
- case NS_ooxml::LN_CT_Attr_name:
- m_aAttributes.emplace_back(rValue.getString(), OUString());
- break;
- case NS_ooxml::LN_CT_Attr_val:
- if (!m_aAttributes.empty())
- m_aAttributes.back().second = rValue.getString();
- break;
- default:
- SAL_WARN("writerfilter", "SmartTagHandler::lcl_attribute: unhandled attribute "
- << nId << " (string value: '" << rValue.getString()
- << "')");
- break;
- }
-}
-
-void SmartTagHandler::lcl_sprm(Sprm& rSprm)
-{
- switch (rSprm.getId())
- {
- case NS_ooxml::LN_CT_SmartTagPr_attr:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- pProperties->resolve(*this);
- break;
- }
- }
-}
-
-void SmartTagHandler::setURI(const OUString& rURI) { m_aURI = rURI; }
-
-void SmartTagHandler::setElement(const OUString& rElement) { m_aElement = rElement; }
-
-void SmartTagHandler::handle(const uno::Reference<text::XTextRange>& xParagraph)
-{
- if (m_aURI.isEmpty() || m_aElement.isEmpty() || m_aAttributes.empty())
- return;
-
- uno::Reference<rdf::XResource> xSubject(xParagraph, uno::UNO_QUERY);
-
- for (const std::pair<OUString, OUString>& rAttribute : m_aAttributes)
- {
- OUString aTypeNS = rAttribute.first;
- OUString aMetadataFilePath = lcl_getTypePath(aTypeNS);
- if (aMetadataFilePath.isEmpty())
- continue;
-
- uno::Reference<rdf::XURI> xType = rdf::URI::create(m_xComponentContext, aTypeNS);
- uno::Sequence<uno::Reference<rdf::XURI>> aGraphNames
- = m_xDocumentMetadataAccess->getMetadataGraphsWithType(xType);
- uno::Reference<rdf::XURI> xGraphName;
- if (aGraphNames.hasElements())
- xGraphName = aGraphNames[0];
- else
- {
- uno::Sequence<uno::Reference<rdf::XURI>> xTypes = { xType };
- xGraphName = m_xDocumentMetadataAccess->addMetadataFile(aMetadataFilePath, xTypes);
- }
- uno::Reference<rdf::XNamedGraph> xGraph
- = m_xDocumentMetadataAccess->getRDFRepository()->getGraph(xGraphName);
- uno::Reference<rdf::XURI> xKey = rdf::URI::create(m_xComponentContext, rAttribute.first);
- uno::Reference<rdf::XLiteral> xValue
- = rdf::Literal::create(m_xComponentContext, rAttribute.second);
- xGraph->addStatement(xSubject, xKey, xValue);
- }
-
- m_aURI.clear();
- m_aElement.clear();
- m_aAttributes.clear();
-}
-
-} // namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/SmartTagHandler.hxx b/writerfilter/source/dmapper/SmartTagHandler.hxx
deleted file mode 100644
index 7999b9dcc22a..000000000000
--- a/writerfilter/source/dmapper/SmartTagHandler.hxx
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- 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/.
- */
-#pragma once
-
-#include <vector>
-
-#include "LoggedResources.hxx"
-
-namespace com::sun::star
-{
-namespace rdf
-{
-class XDocumentMetadataAccess;
-}
-namespace text
-{
-class XTextDocument;
-class XTextRange;
-}
-namespace uno
-{
-class XComponentContext;
-}
-}
-
-namespace writerfilter::dmapper
-{
-/// Handler for smart tags, i.e. <w:smartTag> and below.
-class SmartTagHandler : public LoggedProperties
-{
- css::uno::Reference<css::uno::XComponentContext> m_xComponentContext;
- css::uno::Reference<css::rdf::XDocumentMetadataAccess> m_xDocumentMetadataAccess;
- OUString m_aURI;
- OUString m_aElement;
- std::vector<std::pair<OUString, OUString>> m_aAttributes;
-
-public:
- SmartTagHandler(css::uno::Reference<css::uno::XComponentContext> xComponentContext,
- const css::uno::Reference<css::text::XTextDocument>& xTextDocument);
- ~SmartTagHandler() override;
-
- void lcl_attribute(Id nId, Value& rValue) override;
- void lcl_sprm(Sprm& rSprm) override;
-
- void setURI(const OUString& rURI);
- void setElement(const OUString& rElement);
-
- /// Set m_aAttributes as RDF statements on xParagraph.
- void handle(const css::uno::Reference<css::text::XTextRange>& xParagraph);
-};
-
-} // namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/StyleSheetTable.cxx b/writerfilter/source/dmapper/StyleSheetTable.cxx
deleted file mode 100644
index 1b5633b009fd..000000000000
--- a/writerfilter/source/dmapper/StyleSheetTable.cxx
+++ /dev/null
@@ -1,1830 +0,0 @@
-/* -*- 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/.
- *
- * 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 "StyleSheetTable.hxx"
-#include "util.hxx"
-#include "ConversionHelper.hxx"
-#include "TblStylePrHandler.hxx"
-#include "TagLogger.hxx"
-#include "BorderHandler.hxx"
-#include "LatentStyleHandler.hxx"
-#include <ooxml/resourceids.hxx>
-#include <utility>
-#include <vector>
-#include <iterator>
-#include <com/sun/star/beans/XMultiPropertySet.hpp>
-#include <com/sun/star/beans/XPropertyState.hpp>
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <com/sun/star/container/XEnumerationAccess.hpp>
-#include <com/sun/star/container/XNameContainer.hpp>
-#include <com/sun/star/container/XIndexReplace.hpp>
-#include <com/sun/star/lang/XServiceInfo.hpp>
-#include <com/sun/star/text/XTextDocument.hpp>
-#include <com/sun/star/text/XTextFramesSupplier.hpp>
-#include <com/sun/star/text/XTextTable.hpp>
-#include <com/sun/star/style/NumberingType.hpp>
-#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
-#include <com/sun/star/style/XStyle.hpp>
-#include <com/sun/star/style/ParagraphAdjust.hpp>
-#include <com/sun/star/text/WritingMode.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <map>
-#include <osl/diagnose.h>
-#include <rtl/ustrbuf.hxx>
-#include <sal/log.hxx>
-#include <comphelper/propertyvalue.hxx>
-#include <comphelper/string.hxx>
-#include <comphelper/sequence.hxx>
-#include <comphelper/diagnose_ex.hxx>
-#include <o3tl/sorted_vector.hxx>
-
-using namespace ::com::sun::star;
-
-namespace writerfilter::dmapper
-{
-
-StyleSheetEntry::StyleSheetEntry() :
- m_bIsDefaultStyle(false)
- ,m_bAssignedAsChapterNumbering(false)
- ,m_bInvalidHeight(false)
- ,m_bHasUPE(false)
- ,m_nStyleTypeCode(STYLE_TYPE_UNKNOWN)
- ,m_pProperties(new StyleSheetPropertyMap)
- ,m_bAutoRedefine(false)
-{
-}
-
-StyleSheetEntry::~StyleSheetEntry()
-{
-}
-
-TableStyleSheetEntry::TableStyleSheetEntry( StyleSheetEntry const & rEntry )
-{
- m_bIsDefaultStyle = rEntry.m_bIsDefaultStyle;
- m_bInvalidHeight = rEntry.m_bInvalidHeight;
- m_bHasUPE = rEntry.m_bHasUPE;
- m_nStyleTypeCode = STYLE_TYPE_TABLE;
- m_sBaseStyleIdentifier = rEntry.m_sBaseStyleIdentifier;
- m_sNextStyleIdentifier = rEntry.m_sNextStyleIdentifier;
- m_sLinkStyleIdentifier = rEntry.m_sLinkStyleIdentifier;
- m_sStyleName = rEntry.m_sStyleName;
- m_sStyleIdentifierD = rEntry.m_sStyleIdentifierD;
-}
-
-TableStyleSheetEntry::~TableStyleSheetEntry( )
-{
-}
-
-void TableStyleSheetEntry::AddTblStylePr( TblStyleType nType, const PropertyMapPtr& pProps )
-{
- static const int nTypesProps = 4;
- static const TblStyleType pTypesToFix[nTypesProps] =
- {
- TBL_STYLE_FIRSTROW,
- TBL_STYLE_LASTROW,
- TBL_STYLE_FIRSTCOL,
- TBL_STYLE_LASTCOL
- };
-
- static const PropertyIds pPropsToCheck[nTypesProps] =
- {
- PROP_BOTTOM_BORDER,
- PROP_TOP_BORDER,
- PROP_RIGHT_BORDER,
- PROP_LEFT_BORDER
- };
-
- for (int i=0; i < nTypesProps; ++i )
- {
- if ( nType == pTypesToFix[i] )
- {
- PropertyIds nChecked = pPropsToCheck[i];
- std::optional<PropertyMap::Property> pChecked = pProps->getProperty(nChecked);
-
- PropertyIds nInsideProp = ( i < 2 ) ? META_PROP_HORIZONTAL_BORDER : META_PROP_VERTICAL_BORDER;
- std::optional<PropertyMap::Property> pInside = pProps->getProperty(nInsideProp);
-
- if ( pChecked && pInside )
- {
- // In this case, remove the inside border
- pProps->Erase( nInsideProp );
- }
-
- break;
- }
- }
-
- // Append the tblStylePr
- m_aStyles[nType] = pProps;
-}
-
-PropertyMapPtr TableStyleSheetEntry::GetProperties( sal_Int32 nMask )
-{
- PropertyMapPtr pProps( new PropertyMap );
-
- // And finally get the mask ones
- pProps->InsertProps(GetLocalPropertiesFromMask(nMask));
-
- return pProps;
-}
-
-beans::PropertyValues StyleSheetEntry::GetInteropGrabBagSeq() const
-{
- return comphelper::containerToSequence(m_aInteropGrabBag);
-}
-
-beans::PropertyValue StyleSheetEntry::GetInteropGrabBag()
-{
- beans::PropertyValue aRet;
- aRet.Name = m_sStyleIdentifierD;
-
- beans::PropertyValues aSeq = GetInteropGrabBagSeq();
- aRet.Value <<= aSeq;
- return aRet;
-}
-
-void StyleSheetEntry::AppendInteropGrabBag(const beans::PropertyValue& rValue)
-{
- m_aInteropGrabBag.push_back(rValue);
-}
-
-PropertyMapPtr StyleSheetEntry::GetMergedInheritedProperties(const StyleSheetTablePtr& pStyleSheetTable)
-{
- PropertyMapPtr pRet;
- if ( pStyleSheetTable && !m_sBaseStyleIdentifier.isEmpty() && m_sBaseStyleIdentifier != m_sStyleIdentifierD )
- {
- const StyleSheetEntryPtr pParentStyleSheet = pStyleSheetTable->FindStyleSheetByISTD(m_sBaseStyleIdentifier);
- if ( pParentStyleSheet )
- pRet = pParentStyleSheet->GetMergedInheritedProperties(pStyleSheetTable);
- }
-
- if ( !pRet )
- pRet = new PropertyMap;
-
- pRet->InsertProps(m_pProperties.get());
-
- return pRet;
-}
-
-static void lcl_mergeProps( const PropertyMapPtr& pToFill, const PropertyMapPtr& pToAdd, TblStyleType nStyleId )
-{
- static const PropertyIds pPropsToCheck[] =
- {
- PROP_BOTTOM_BORDER,
- PROP_TOP_BORDER,
- PROP_RIGHT_BORDER,
- PROP_LEFT_BORDER,
- };
-
- bool pRemoveInside[] =
- {
- ( nStyleId == TBL_STYLE_FIRSTROW ),
- ( nStyleId == TBL_STYLE_LASTROW ),
- ( nStyleId == TBL_STYLE_LASTCOL ),
- ( nStyleId == TBL_STYLE_FIRSTCOL )
- };
-
- for ( unsigned i = 0 ; i != SAL_N_ELEMENTS(pPropsToCheck); i++ )
- {
- PropertyIds nId = pPropsToCheck[i];
- std::optional<PropertyMap::Property> pProp = pToAdd->getProperty(nId);
-
- if ( pProp )
- {
- if ( pRemoveInside[i] )
- {
- // Remove the insideH and insideV depending on the cell pos
- PropertyIds nInsideProp = ( i < 2 ) ? META_PROP_HORIZONTAL_BORDER : META_PROP_VERTICAL_BORDER;
- pToFill->Erase(nInsideProp);
- }
- }
- }
-
- pToFill->InsertProps(pToAdd);
-}
-
-PropertyMapPtr TableStyleSheetEntry::GetLocalPropertiesFromMask( sal_Int32 nMask )
-{
- // Order from right to left
- struct TblStyleTypeAndMask {
- sal_Int32 mask;
- TblStyleType type;
- };
-
- static const TblStyleTypeAndMask aOrderedStyleTable[] =
- {
- { 0x010, TBL_STYLE_BAND2HORZ },
- { 0x020, TBL_STYLE_BAND1HORZ },
- { 0x040, TBL_STYLE_BAND2VERT },
- { 0x080, TBL_STYLE_BAND1VERT },
- { 0x100, TBL_STYLE_LASTCOL },
- { 0x200, TBL_STYLE_FIRSTCOL },
- { 0x400, TBL_STYLE_LASTROW },
- { 0x800, TBL_STYLE_FIRSTROW },
- { 0x001, TBL_STYLE_SWCELL },
- { 0x002, TBL_STYLE_SECELL },
- { 0x004, TBL_STYLE_NWCELL },
- { 0x008, TBL_STYLE_NECELL }
- };
-
- // Get the properties applying according to the mask
- PropertyMapPtr pProps( new PropertyMap( ) );
- for (const TblStyleTypeAndMask & i : aOrderedStyleTable)
- {
- TblStylePrs::iterator pIt = m_aStyles.find( i.type );
- if ( ( nMask & i.mask ) && ( pIt != m_aStyles.end( ) ) )
- lcl_mergeProps( pProps, pIt->second, i.type );
- }
- return pProps;
-}
-
-namespace {
-
-struct ListCharStylePropertyMap_t
-{
- OUString sCharStyleName;
- PropertyValueVector_t aPropertyValues;
-
- ListCharStylePropertyMap_t(OUString _sCharStyleName, PropertyValueVector_t&& rPropertyValues):
- sCharStyleName(std::move( _sCharStyleName )),
- aPropertyValues( std::move(rPropertyValues) )
- {}
-};
-
-}
-
-struct StyleSheetTable_Impl
-{
- DomainMapper& m_rDMapper;
- uno::Reference< text::XTextDocument> m_xTextDocument;
- uno::Reference< beans::XPropertySet> m_xTextDefaults;
- std::vector< StyleSheetEntryPtr > m_aStyleSheetEntries;
- std::map< OUString, StyleSheetEntryPtr > m_aStyleSheetEntriesMap;
- std::map<OUString, OUString> m_ClonedTOCStylesMap;
- StyleSheetEntryPtr m_pCurrentEntry;
- PropertyMapPtr m_pDefaultParaProps, m_pDefaultCharProps;
- OUString m_sDefaultParaStyleName; //WW8 name
- std::vector< ListCharStylePropertyMap_t > m_aListCharStylePropertyVector;
- bool m_bHasImportedDefaultParaProps;
- bool m_bIsNewDoc;
-
- StyleSheetTable_Impl(DomainMapper& rDMapper, uno::Reference< text::XTextDocument> xTextDocument, bool bIsNewDoc);
-
- OUString HasListCharStyle( const PropertyValueVector_t& rCharProperties );
-
- /// Appends the given key-value pair to the list of latent style properties of the current entry.
- void AppendLatentStyleProperty(const OUString& aName, Value const & rValue);
- /// Sets all properties of xStyle back to default.
- static void SetPropertiesToDefault(const uno::Reference<style::XStyle>& xStyle);
- void ApplyClonedTOCStylesToXText(uno::Reference<text::XText> const& xText);
-};
-
-
-StyleSheetTable_Impl::StyleSheetTable_Impl(DomainMapper& rDMapper,
- uno::Reference< text::XTextDocument> xTextDocument,
- bool const bIsNewDoc)
- : m_rDMapper( rDMapper ),
- m_xTextDocument(std::move( xTextDocument )),
- m_pDefaultParaProps(new PropertyMap),
- m_pDefaultCharProps(new PropertyMap),
- m_sDefaultParaStyleName("Normal"),
- m_bHasImportedDefaultParaProps(false),
- m_bIsNewDoc(bIsNewDoc)
-{
- //set font height default to 10pt
- uno::Any aVal( 10.0 );
- m_pDefaultCharProps->Insert( PROP_CHAR_HEIGHT, aVal );
- m_pDefaultCharProps->Insert( PROP_CHAR_HEIGHT_ASIAN, aVal );
- m_pDefaultCharProps->Insert( PROP_CHAR_HEIGHT_COMPLEX, aVal );
-
- // See SwDoc::RemoveAllFormatLanguageDependencies(), internal filters
- // disable kerning by default, do the same here.
- m_pDefaultCharProps->Insert(PROP_CHAR_AUTO_KERNING, uno::Any(false));
-}
-
-
-OUString StyleSheetTable_Impl::HasListCharStyle( const PropertyValueVector_t& rPropValues )
-{
- for( const auto& rListVector : m_aListCharStylePropertyVector )
- {
- const auto& rPropertyValues = rListVector.aPropertyValues;
- //if size is identical
- if( rPropertyValues.size() == rPropValues.size() )
- {
- bool bBreak = false;
- //then search for all contained properties
- for( const auto& rPropVal1 : rPropValues)
- {
- //find the property
- auto aListIter = std::find_if(rPropertyValues.begin(), rPropertyValues.end(),
- [&rPropVal1](const css::beans::PropertyValue& rPropVal2) { return rPropVal2.Name == rPropVal1.Name; });
- //set break flag if property hasn't been found
- bBreak = (aListIter == rPropertyValues.end()) || (aListIter->Value != rPropVal1.Value);
- if( bBreak )
- break;
- }
- if( !bBreak )
- return rListVector.sCharStyleName;
- }
- }
- return OUString();
-}
-
-void StyleSheetTable_Impl::AppendLatentStyleProperty(const OUString& aName, Value const & rValue)
-{
- beans::PropertyValue aValue;
- aValue.Name = aName;
- aValue.Value <<= rValue.getString();
- m_pCurrentEntry->m_aLatentStyles.push_back(aValue);
-}
-
-void StyleSheetTable_Impl::SetPropertiesToDefault(const uno::Reference<style::XStyle>& xStyle)
-{
- // See if the existing style has any non-default properties. If so, reset them back to default.
- uno::Reference<beans::XPropertySet> xPropertySet(xStyle, uno::UNO_QUERY);
- uno::Reference<beans::XPropertySetInfo> xPropertySetInfo = xPropertySet->getPropertySetInfo();
- const uno::Sequence<beans::Property> aProperties = xPropertySetInfo->getProperties();
- std::vector<OUString> aPropertyNames;
- aPropertyNames.reserve(aProperties.getLength());
- std::transform(aProperties.begin(), aProperties.end(), std::back_inserter(aPropertyNames),
- [](const beans::Property& rProp) { return rProp.Name; });
-
- uno::Reference<beans::XPropertyState> xPropertyState(xStyle, uno::UNO_QUERY);
- uno::Sequence<beans::PropertyState> aStates = xPropertyState->getPropertyStates(comphelper::containerToSequence(aPropertyNames));
- for (sal_Int32 i = 0; i < aStates.getLength(); ++i)
- {
- if (aStates[i] == beans::PropertyState_DIRECT_VALUE)
- {
- try
- {
- xPropertyState->setPropertyToDefault(aPropertyNames[i]);
- }
- catch(const uno::Exception&)
- {
- TOOLS_INFO_EXCEPTION("writerfilter", "setPropertyToDefault(" << aPropertyNames[i] << ") failed");
- }
- }
- }
-}
-
-StyleSheetTable::StyleSheetTable(DomainMapper& rDMapper,
- uno::Reference< text::XTextDocument> const& xTextDocument,
- bool const bIsNewDoc)
-: LoggedProperties("StyleSheetTable")
-, LoggedTable("StyleSheetTable")
-, m_pImpl( new StyleSheetTable_Impl(rDMapper, xTextDocument, bIsNewDoc) )
-{
-}
-
-
-StyleSheetTable::~StyleSheetTable()
-{
-}
-
-void StyleSheetTable::SetDefaultParaProps(PropertyIds eId, const css::uno::Any& rAny)
-{
- m_pImpl->m_pDefaultParaProps->Insert(eId, rAny, /*bOverwrite=*/false, NO_GRAB_BAG, /*bDocDefault=*/true);
-}
-
-PropertyMapPtr const & StyleSheetTable::GetDefaultParaProps() const
-{
- return m_pImpl->m_pDefaultParaProps;
-}
-
-PropertyMapPtr const & StyleSheetTable::GetDefaultCharProps() const
-{
- return m_pImpl->m_pDefaultCharProps;
-}
-
-void StyleSheetTable::lcl_attribute(Id Name, Value & val)
-{
- OSL_ENSURE( m_pImpl->m_pCurrentEntry, "current entry has to be set here");
- if(!m_pImpl->m_pCurrentEntry)
- return ;
- int nIntValue = val.getInt();
- OUString sValue = val.getString();
-
- // The default type is paragraph, and it needs to be processed first,
- // because the NS_ooxml::LN_CT_Style_type handling may set m_pImpl->m_pCurrentEntry
- // to point to a different object.
- if( m_pImpl->m_pCurrentEntry->m_nStyleTypeCode == STYLE_TYPE_UNKNOWN )
- {
- if( Name != NS_ooxml::LN_CT_Style_type )
- m_pImpl->m_pCurrentEntry->m_nStyleTypeCode = STYLE_TYPE_PARA;
- }
- switch(Name)
- {
- case NS_ooxml::LN_CT_Style_type:
- {
- SAL_WARN_IF( m_pImpl->m_pCurrentEntry->m_nStyleTypeCode != STYLE_TYPE_UNKNOWN,
- "writerfilter", "Style type needs to be processed first" );
- StyleType nType(STYLE_TYPE_UNKNOWN);
- switch (nIntValue)
- {
- case NS_ooxml::LN_Value_ST_StyleType_paragraph:
- nType = STYLE_TYPE_PARA;
- break;
- case NS_ooxml::LN_Value_ST_StyleType_character:
- nType = STYLE_TYPE_CHAR;
- break;
- case NS_ooxml::LN_Value_ST_StyleType_table:
- nType = STYLE_TYPE_TABLE;
- break;
- case NS_ooxml::LN_Value_ST_StyleType_numbering:
- nType = STYLE_TYPE_LIST;
- break;
- default:
- SAL_WARN("writerfilter", "unknown LN_CT_Style_type " << nType);
- [[fallthrough]];
- case 0: // explicit unknown set by tokenizer
- break;
-
- }
- if ( nType == STYLE_TYPE_TABLE )
- {
- StyleSheetEntryPtr pEntry = m_pImpl->m_pCurrentEntry;
- tools::SvRef<TableStyleSheetEntry> pTableEntry( new TableStyleSheetEntry( *pEntry ) );
- m_pImpl->m_pCurrentEntry = pTableEntry.get();
- }
- else
- m_pImpl->m_pCurrentEntry->m_nStyleTypeCode = nType;
- }
- break;
- case NS_ooxml::LN_CT_Style_default:
- m_pImpl->m_pCurrentEntry->m_bIsDefaultStyle = (nIntValue != 0);
-
- if (m_pImpl->m_pCurrentEntry->m_nStyleTypeCode != STYLE_TYPE_UNKNOWN)
- {
- // "If this attribute is specified by multiple styles, then the last instance shall be used."
- if (m_pImpl->m_pCurrentEntry->m_bIsDefaultStyle
- && m_pImpl->m_pCurrentEntry->m_nStyleTypeCode == STYLE_TYPE_PARA
- && !m_pImpl->m_pCurrentEntry->m_sStyleIdentifierD.isEmpty())
- {
- m_pImpl->m_sDefaultParaStyleName = m_pImpl->m_pCurrentEntry->m_sStyleIdentifierD;
- }
-
- beans::PropertyValue aValue;
- aValue.Name = "default";
- aValue.Value <<= m_pImpl->m_pCurrentEntry->m_bIsDefaultStyle;
- m_pImpl->m_pCurrentEntry->AppendInteropGrabBag(aValue);
- }
- break;
- case NS_ooxml::LN_CT_Style_customStyle:
- if (m_pImpl->m_pCurrentEntry->m_nStyleTypeCode != STYLE_TYPE_UNKNOWN)
- {
- beans::PropertyValue aValue;
- aValue.Name = "customStyle";
- aValue.Value <<= (nIntValue != 0);
- m_pImpl->m_pCurrentEntry->AppendInteropGrabBag(aValue);
- }
- break;
- case NS_ooxml::LN_CT_Style_styleId:
- m_pImpl->m_pCurrentEntry->m_sStyleIdentifierD = sValue;
- if(m_pImpl->m_pCurrentEntry->m_nStyleTypeCode == STYLE_TYPE_TABLE)
- {
- TableStyleSheetEntry* pTableEntry = static_cast<TableStyleSheetEntry *>(m_pImpl->m_pCurrentEntry.get());
- beans::PropertyValue aValue;
- aValue.Name = "styleId";
- aValue.Value <<= sValue;
- pTableEntry->AppendInteropGrabBag(aValue);
- }
- break;
- case NS_ooxml::LN_CT_TblWidth_w:
- break;
- case NS_ooxml::LN_CT_TblWidth_type:
- break;
- case NS_ooxml::LN_CT_LatentStyles_defQFormat:
- m_pImpl->AppendLatentStyleProperty("defQFormat", val);
- break;
- case NS_ooxml::LN_CT_LatentStyles_defUnhideWhenUsed:
- m_pImpl->AppendLatentStyleProperty("defUnhideWhenUsed", val);
- break;
- case NS_ooxml::LN_CT_LatentStyles_defSemiHidden:
- m_pImpl->AppendLatentStyleProperty("defSemiHidden", val);
- break;
- case NS_ooxml::LN_CT_LatentStyles_count:
- m_pImpl->AppendLatentStyleProperty("count", val);
- break;
- case NS_ooxml::LN_CT_LatentStyles_defUIPriority:
- m_pImpl->AppendLatentStyleProperty("defUIPriority", val);
- break;
- case NS_ooxml::LN_CT_LatentStyles_defLockedState:
- m_pImpl->AppendLatentStyleProperty("defLockedState", val);
- break;
- default:
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- }
- break;
- }
-}
-
-
-void StyleSheetTable::lcl_sprm(Sprm & rSprm)
-{
- sal_uInt32 nSprmId = rSprm.getId();
- Value::Pointer_t pValue = rSprm.getValue();
- sal_Int32 nIntValue = pValue ? pValue->getInt() : 0;
- OUString sStringValue = pValue ? pValue->getString() : OUString();
-
- switch(nSprmId)
- {
- case NS_ooxml::LN_CT_Style_name:
- //this is only a UI name!
- m_pImpl->m_pCurrentEntry->m_sStyleName = sStringValue;
- if(m_pImpl->m_pCurrentEntry->m_nStyleTypeCode == STYLE_TYPE_TABLE)
- {
- TableStyleSheetEntry* pTableEntry = static_cast<TableStyleSheetEntry *>(m_pImpl->m_pCurrentEntry.get());
- beans::PropertyValue aValue;
- aValue.Name = "name";
- aValue.Value <<= sStringValue;
- pTableEntry->AppendInteropGrabBag(aValue);
- }
- break;
- case NS_ooxml::LN_CT_Style_basedOn:
- m_pImpl->m_pCurrentEntry->m_sBaseStyleIdentifier = sStringValue;
- if(m_pImpl->m_pCurrentEntry->m_nStyleTypeCode == STYLE_TYPE_TABLE)
- {
- TableStyleSheetEntry* pTableEntry = static_cast<TableStyleSheetEntry *>(m_pImpl->m_pCurrentEntry.get());
- beans::PropertyValue aValue;
- aValue.Name = "basedOn";
- aValue.Value <<= sStringValue;
- pTableEntry->AppendInteropGrabBag(aValue);
- }
- break;
- case NS_ooxml::LN_CT_Style_link:
- m_pImpl->m_pCurrentEntry->m_sLinkStyleIdentifier = sStringValue;
- break;
- case NS_ooxml::LN_CT_Style_next:
- m_pImpl->m_pCurrentEntry->m_sNextStyleIdentifier = sStringValue;
- break;
- case NS_ooxml::LN_CT_Style_aliases:
- case NS_ooxml::LN_CT_Style_hidden:
- case NS_ooxml::LN_CT_Style_personal:
- case NS_ooxml::LN_CT_Style_personalCompose:
- case NS_ooxml::LN_CT_Style_personalReply:
- break;
- case NS_ooxml::LN_CT_Style_autoRedefine:
- m_pImpl->m_pCurrentEntry->m_bAutoRedefine = nIntValue;
- break;
- case NS_ooxml::LN_CT_Style_tcPr:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties && m_pImpl->m_pCurrentEntry->m_nStyleTypeCode == STYLE_TYPE_TABLE)
- {
- auto pTblStylePrHandler = std::make_shared<TblStylePrHandler>(m_pImpl->m_rDMapper);
- pProperties->resolve(*pTblStylePrHandler);
- StyleSheetEntry* pEntry = m_pImpl->m_pCurrentEntry.get();
- TableStyleSheetEntry& rTableEntry = dynamic_cast<TableStyleSheetEntry&>(*pEntry);
- rTableEntry.AppendInteropGrabBag(pTblStylePrHandler->getInteropGrabBag("tcPr"));
-
- // This is a <w:tcPr> directly under <w:style>, so it affects the whole table.
- rTableEntry.m_pProperties->InsertProps(pTblStylePrHandler->getProperties());
- }
- }
- break;
- case NS_ooxml::LN_CT_Style_trPr:
- break;
- case NS_ooxml::LN_CT_Style_rsid:
- case NS_ooxml::LN_CT_Style_qFormat:
- case NS_ooxml::LN_CT_Style_semiHidden:
- case NS_ooxml::LN_CT_Style_unhideWhenUsed:
- case NS_ooxml::LN_CT_Style_uiPriority:
- case NS_ooxml::LN_CT_Style_locked:
- if (m_pImpl->m_pCurrentEntry->m_nStyleTypeCode != STYLE_TYPE_UNKNOWN)
- {
- StyleSheetEntryPtr pEntry = m_pImpl->m_pCurrentEntry;
- beans::PropertyValue aValue;
- switch (nSprmId)
- {
- case NS_ooxml::LN_CT_Style_rsid:
- {
- // We want the rsid as a hex string, but always with the length of 8.
- OUStringBuffer aBuf = OUString::number(nIntValue, 16);
- OUStringBuffer aStr;
- comphelper::string::padToLength(aStr, 8 - aBuf.getLength(), '0');
- aStr.append(aBuf.getStr());
-
- aValue.Name = "rsid";
- aValue.Value <<= aStr.makeStringAndClear();
- }
- break;
- case NS_ooxml::LN_CT_Style_qFormat:
- aValue.Name = "qFormat";
- break;
- case NS_ooxml::LN_CT_Style_semiHidden:
- aValue.Name = "semiHidden";
- break;
- case NS_ooxml::LN_CT_Style_unhideWhenUsed:
- aValue.Name = "unhideWhenUsed";
- break;
- case NS_ooxml::LN_CT_Style_uiPriority:
- {
- aValue.Name = "uiPriority";
- aValue.Value <<= OUString::number(nIntValue);
- }
- break;
- case NS_ooxml::LN_CT_Style_locked:
- aValue.Name = "locked";
- break;
- }
- pEntry->AppendInteropGrabBag(aValue);
- }
- break;
- case NS_ooxml::LN_CT_Style_tblPr: //contains table properties
- case NS_ooxml::LN_CT_Style_tblStylePr: //contains to table properties
- case NS_ooxml::LN_CT_TblPrBase_tblInd: //table properties - at least width value and type
- case NS_ooxml::LN_EG_RPrBase_rFonts: //table fonts
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- auto pTblStylePrHandler = std::make_shared<TblStylePrHandler>( m_pImpl->m_rDMapper );
- pProperties->resolve( *pTblStylePrHandler );
-
- // Add the properties to the table style
- TblStyleType nType = pTblStylePrHandler->getType( );
- PropertyMapPtr pProps = pTblStylePrHandler->getProperties( );
- StyleSheetEntry * pEntry = m_pImpl->m_pCurrentEntry.get();
-
- TableStyleSheetEntry * pTableEntry = dynamic_cast<TableStyleSheetEntry*>( pEntry );
- if (nType == TBL_STYLE_UNKNOWN)
- {
- pEntry->m_pProperties->InsertProps(pProps);
- }
- else
- {
- if (pTableEntry != nullptr)
- pTableEntry->AddTblStylePr( nType, pProps );
- }
-
- if (nSprmId == NS_ooxml::LN_CT_Style_tblPr)
- {
- if (pTableEntry != nullptr)
- pTableEntry->AppendInteropGrabBag(pTblStylePrHandler->getInteropGrabBag("tblPr"));
- }
- else if (nSprmId == NS_ooxml::LN_CT_Style_tblStylePr)
- {
- pTblStylePrHandler->appendInteropGrabBag("type", pTblStylePrHandler->getTypeString());
- if (pTableEntry != nullptr)
- pTableEntry->AppendInteropGrabBag(pTblStylePrHandler->getInteropGrabBag("tblStylePr"));
- }
- }
- break;
- }
- case NS_ooxml::LN_CT_PPrDefault_pPr:
- case NS_ooxml::LN_CT_DocDefaults_pPrDefault:
- if (nSprmId == NS_ooxml::LN_CT_DocDefaults_pPrDefault)
- m_pImpl->m_rDMapper.SetDocDefaultsImport(true);
-
- m_pImpl->m_rDMapper.PushStyleSheetProperties( m_pImpl->m_pDefaultParaProps );
- resolveSprmProps( m_pImpl->m_rDMapper, rSprm );
- if ( nSprmId == NS_ooxml::LN_CT_DocDefaults_pPrDefault && m_pImpl->m_pDefaultParaProps &&
- !m_pImpl->m_pDefaultParaProps->isSet( PROP_PARA_TOP_MARGIN ) )
- {
- SetDefaultParaProps( PROP_PARA_TOP_MARGIN, uno::Any( sal_Int32(0) ) );
- }
- m_pImpl->m_rDMapper.PopStyleSheetProperties();
- applyDefaults( true );
- m_pImpl->m_bHasImportedDefaultParaProps = true;
- if (nSprmId == NS_ooxml::LN_CT_DocDefaults_pPrDefault)
- m_pImpl->m_rDMapper.SetDocDefaultsImport(false);
- break;
- case NS_ooxml::LN_CT_RPrDefault_rPr:
- case NS_ooxml::LN_CT_DocDefaults_rPrDefault:
- if (nSprmId == NS_ooxml::LN_CT_DocDefaults_rPrDefault)
- m_pImpl->m_rDMapper.SetDocDefaultsImport(true);
-
- m_pImpl->m_rDMapper.PushStyleSheetProperties( m_pImpl->m_pDefaultCharProps );
- resolveSprmProps( m_pImpl->m_rDMapper, rSprm );
- m_pImpl->m_rDMapper.PopStyleSheetProperties();
- applyDefaults( false );
- if (nSprmId == NS_ooxml::LN_CT_DocDefaults_rPrDefault)
- m_pImpl->m_rDMapper.SetDocDefaultsImport(false);
- break;
- case NS_ooxml::LN_CT_TblPrBase_jc: //table alignment - row properties!
- m_pImpl->m_pCurrentEntry->m_pProperties->Insert( PROP_HORI_ORIENT,
- uno::Any( ConversionHelper::convertTableJustification( nIntValue )));
- break;
- case NS_ooxml::LN_CT_TrPrBase_jc: //table alignment - row properties!
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblBorders: //table borders, might be defined in table style
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- auto pBorderHandler = std::make_shared<BorderHandler>(m_pImpl->m_rDMapper.IsOOXMLImport());
- pProperties->resolve(*pBorderHandler);
- m_pImpl->m_pCurrentEntry->m_pProperties->InsertProps(
- pBorderHandler->getProperties());
- }
- }
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblStyleRowBandSize:
- case NS_ooxml::LN_CT_TblPrBase_tblStyleColBandSize:
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblCellMar:
- //no cell margins in styles
- break;
- case NS_ooxml::LN_CT_LatentStyles_lsdException:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- tools::SvRef<LatentStyleHandler> pLatentStyleHandler(new LatentStyleHandler());
- pProperties->resolve(*pLatentStyleHandler);
- beans::PropertyValue aValue;
- aValue.Name = "lsdException";
- aValue.Value <<= comphelper::containerToSequence(pLatentStyleHandler->getAttributes());
- m_pImpl->m_pCurrentEntry->m_aLsdExceptions.push_back(aValue);
- }
- }
- break;
- case NS_ooxml::LN_CT_Style_pPr:
- // no break
- case NS_ooxml::LN_CT_Style_rPr:
- // no break
- default:
- {
- if (!m_pImpl->m_pCurrentEntry)
- break;
-
- tools::SvRef<TablePropertiesHandler> pTblHandler(new TablePropertiesHandler());
- pTblHandler->SetProperties( m_pImpl->m_pCurrentEntry->m_pProperties.get() );
- if ( !pTblHandler->sprm( rSprm ) )
- {
- m_pImpl->m_rDMapper.PushStyleSheetProperties( m_pImpl->m_pCurrentEntry->m_pProperties.get() );
-
- PropertyMapPtr pProps(new PropertyMap());
- if (m_pImpl->m_pCurrentEntry->m_nStyleTypeCode == STYLE_TYPE_TABLE)
- {
- if (nSprmId == NS_ooxml::LN_CT_Style_pPr)
- m_pImpl->m_rDMapper.enableInteropGrabBag("pPr");
- else if (nSprmId == NS_ooxml::LN_CT_Style_rPr)
- m_pImpl->m_rDMapper.enableInteropGrabBag("rPr");
- }
- m_pImpl->m_rDMapper.sprmWithProps( rSprm, pProps );
- if (m_pImpl->m_pCurrentEntry->m_nStyleTypeCode == STYLE_TYPE_TABLE)
- {
- if (nSprmId == NS_ooxml::LN_CT_Style_pPr || nSprmId == NS_ooxml::LN_CT_Style_rPr)
- {
- TableStyleSheetEntry* pTableEntry = static_cast<TableStyleSheetEntry *>(m_pImpl->m_pCurrentEntry.get());
- pTableEntry->AppendInteropGrabBag(m_pImpl->m_rDMapper.getInteropGrabBag());
- }
- }
-
- m_pImpl->m_pCurrentEntry->m_pProperties->InsertProps(pProps);
-
- m_pImpl->m_rDMapper.PopStyleSheetProperties( );
- }
- }
- break;
-}
-}
-
-
-void StyleSheetTable::lcl_entry(const writerfilter::Reference<Properties>::Pointer_t& ref)
-{
- //create a new style entry
- OSL_ENSURE( !m_pImpl->m_pCurrentEntry, "current entry has to be NULL here");
- m_pImpl->m_pCurrentEntry = StyleSheetEntryPtr(new StyleSheetEntry);
- m_pImpl->m_rDMapper.PushStyleSheetProperties( m_pImpl->m_pCurrentEntry->m_pProperties.get() );
- ref->resolve(*this);
- m_pImpl->m_rDMapper.ProcessDeferredStyleCharacterProperties();
- //append it to the table
- m_pImpl->m_rDMapper.PopStyleSheetProperties();
- if( !m_pImpl->m_rDMapper.IsOOXMLImport() || !m_pImpl->m_pCurrentEntry->m_sStyleName.isEmpty())
- {
- m_pImpl->m_pCurrentEntry->m_sConvertedStyleName = ConvertStyleName( m_pImpl->m_pCurrentEntry->m_sStyleName );
- m_pImpl->m_aStyleSheetEntries.push_back( m_pImpl->m_pCurrentEntry );
- m_pImpl->m_aStyleSheetEntriesMap.emplace( m_pImpl->m_pCurrentEntry->m_sStyleIdentifierD, m_pImpl->m_pCurrentEntry );
- }
- else
- {
- //TODO: this entry contains the default settings - they have to be added to the settings
- }
-
- if (!m_pImpl->m_pCurrentEntry->m_aLatentStyles.empty())
- {
- // We have latent styles for this entry, then process them.
- std::vector<beans::PropertyValue>& rLatentStyles = m_pImpl->m_pCurrentEntry->m_aLatentStyles;
-
- if (!m_pImpl->m_pCurrentEntry->m_aLsdExceptions.empty())
- {
- std::vector<beans::PropertyValue>& rLsdExceptions = m_pImpl->m_pCurrentEntry->m_aLsdExceptions;
- beans::PropertyValue aValue;
- aValue.Name = "lsdExceptions";
- aValue.Value <<= comphelper::containerToSequence(rLsdExceptions);
- rLatentStyles.push_back(aValue);
- }
-
- uno::Sequence<beans::PropertyValue> aLatentStyles( comphelper::containerToSequence(rLatentStyles) );
-
- // We can put all latent style info directly to the document interop
- // grab bag, as we can be sure that only a single style entry has
- // latent style info.
- uno::Reference<beans::XPropertySet> xPropertySet(m_pImpl->m_xTextDocument, uno::UNO_QUERY);
- auto aGrabBag = comphelper::sequenceToContainer< std::vector<beans::PropertyValue> >(xPropertySet->getPropertyValue("InteropGrabBag").get< uno::Sequence<beans::PropertyValue> >());
- beans::PropertyValue aValue;
- aValue.Name = "latentStyles";
- aValue.Value <<= aLatentStyles;
- aGrabBag.push_back(aValue);
- xPropertySet->setPropertyValue("InteropGrabBag", uno::Any(comphelper::containerToSequence(aGrabBag)));
- }
-
- m_pImpl->m_pCurrentEntry = StyleSheetEntryPtr();
-}
-/*-------------------------------------------------------------------------
- sorting helper
- -----------------------------------------------------------------------*/
-namespace {
-
-class PropValVector
-{
- std::vector<beans::PropertyValue> m_aValues;
-public:
- PropValVector(){}
-
- void Insert(const beans::PropertyValue& rVal);
- uno::Sequence< uno::Any > getValues();
- uno::Sequence< OUString > getNames();
- const std::vector<beans::PropertyValue>& getProperties() const { return m_aValues; };
-};
-
-}
-
-void PropValVector::Insert(const beans::PropertyValue& rVal)
-{
- auto aIt = std::find_if(m_aValues.begin(), m_aValues.end(),
- [&rVal](beans::PropertyValue& rPropVal) { return rPropVal.Name > rVal.Name; });
- if (aIt != m_aValues.end())
- {
- m_aValues.insert( aIt, rVal );
- return;
- }
- m_aValues.push_back(rVal);
-}
-
-uno::Sequence< uno::Any > PropValVector::getValues()
-{
- std::vector<uno::Any> aRet;
- std::transform(m_aValues.begin(), m_aValues.end(), std::back_inserter(aRet),
- [](const beans::PropertyValue& rValue) -> const uno::Any& { return rValue.Value; });
- return comphelper::containerToSequence(aRet);
-}
-
-uno::Sequence< OUString > PropValVector::getNames()
-{
- std::vector<OUString> aRet;
- std::transform(m_aValues.begin(), m_aValues.end(), std::back_inserter(aRet),
- [](const beans::PropertyValue& rValue) -> const OUString& { return rValue.Name; });
- return comphelper::containerToSequence(aRet);
-}
-
-void StyleSheetTable::ApplyNumberingStyleNameToParaStyles()
-{
- try
- {
- uno::Reference< style::XStyleFamiliesSupplier > xStylesSupplier( m_pImpl->m_xTextDocument, uno::UNO_QUERY_THROW );
- uno::Reference< lang::XMultiServiceFactory > xDocFactory( m_pImpl->m_xTextDocument, uno::UNO_QUERY_THROW );
- uno::Reference< container::XNameAccess > xStyleFamilies = xStylesSupplier->getStyleFamilies();
- uno::Reference<container::XNameContainer> xParaStyles;
- xStyleFamilies->getByName(getPropertyName( PROP_PARAGRAPH_STYLES )) >>= xParaStyles;
-
- if ( !xParaStyles.is() )
- return;
-
- for ( const auto& pEntry : m_pImpl->m_aStyleSheetEntries )
- {
- StyleSheetPropertyMap* pStyleSheetProperties = nullptr;
- if ( pEntry->m_nStyleTypeCode == STYLE_TYPE_PARA && (pStyleSheetProperties = pEntry->m_pProperties.get()) )
- {
- // ListId 0 means turn off numbering - to cancel inheritance - so make sure that can be set.
- if (pStyleSheetProperties->props().GetListId() > -1)
- {
- uno::Reference< style::XStyle > xStyle;
- xParaStyles->getByName( ConvertStyleName(pEntry->m_sStyleName) ) >>= xStyle;
-
- if ( !xStyle.is() )
- break;
-
- uno::Reference<beans::XPropertySet> xPropertySet( xStyle, uno::UNO_QUERY_THROW );
- const OUString sNumberingStyleName = m_pImpl->m_rDMapper.GetListStyleName( pStyleSheetProperties->props().GetListId() );
- if ( !sNumberingStyleName.isEmpty()
- || !pStyleSheetProperties->props().GetListId() )
- xPropertySet->setPropertyValue( getPropertyName(PROP_NUMBERING_STYLE_NAME), uno::Any(sNumberingStyleName) );
-
- // Word 2010+ (not Word 2003, and Word 2007 is completely broken)
- // does something rather strange. It does not allow two paragraph styles
- // to share the same listLevel on a numbering rule.
- // Consider this style to just be body level if already used previously.
- m_pImpl->m_rDMapper.ValidateListLevel(pEntry->m_sStyleIdentifierD);
- }
- }
- }
- }
- catch( const uno::Exception& )
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter", "Failed applying numbering style name to Paragraph styles");
- }
-}
-
-/* Counteract the destructive tendencies of LibreOffice's Chapter Numbering
- *
- * Any assignment to Chapter Numbering will erase the numbering-like properties of inherited styles.
- * So go through the list of styles and any that inherit from a Chapter Numbering style
- * should have the Outline Level reapplied.
- */
-void StyleSheetTable::ReApplyInheritedOutlineLevelFromChapterNumbering()
-{
- try
- {
- uno::Reference< style::XStyleFamiliesSupplier > xStylesSupplier(m_pImpl->m_xTextDocument, uno::UNO_QUERY_THROW);
- uno::Reference< lang::XMultiServiceFactory > xDocFactory(m_pImpl->m_xTextDocument, uno::UNO_QUERY_THROW);
- uno::Reference< container::XNameAccess > xStyleFamilies = xStylesSupplier->getStyleFamilies();
- uno::Reference<container::XNameContainer> xParaStyles;
- xStyleFamilies->getByName(getPropertyName(PROP_PARAGRAPH_STYLES)) >>= xParaStyles;
-
- if (!xParaStyles.is())
- return;
-
- for (const auto& pEntry : m_pImpl->m_aStyleSheetEntries)
- {
- if (pEntry->m_nStyleTypeCode != STYLE_TYPE_PARA || pEntry->m_sBaseStyleIdentifier.isEmpty())
- continue;
-
- StyleSheetEntryPtr pParent = FindStyleSheetByISTD(pEntry->m_sBaseStyleIdentifier);
- if (!pParent || !pParent->m_bAssignedAsChapterNumbering)
- continue;
-
- uno::Reference< style::XStyle > xStyle;
- xParaStyles->getByName(pEntry->m_sConvertedStyleName) >>= xStyle;
- if (!xStyle.is())
- continue;
-
- uno::Reference<beans::XPropertySet> xPropertySet(xStyle, uno::UNO_QUERY_THROW);
- const sal_Int16 nListId = pEntry->m_pProperties->props().GetListId();
- const OUString& sParentNumberingStyleName
- = m_pImpl->m_rDMapper.GetListStyleName(pParent->m_pProperties->props().GetListId());
- if (nListId == -1 && !sParentNumberingStyleName.isEmpty())
- {
- xPropertySet->setPropertyValue(getPropertyName(PROP_NUMBERING_STYLE_NAME),
- uno::Any(sParentNumberingStyleName));
- }
-
- sal_Int16 nOutlineLevel = pEntry->m_pProperties->GetOutlineLevel();
- if (nOutlineLevel != -1)
- continue;
-
- nOutlineLevel = pParent->m_pProperties->GetOutlineLevel();
- assert(nOutlineLevel >= WW_OUTLINE_MIN && nOutlineLevel < WW_OUTLINE_MAX);
-
- // convert MS level to LO equivalent outline level
- ++nOutlineLevel;
-
- xPropertySet->setPropertyValue(getPropertyName(PROP_OUTLINE_LEVEL), uno::Any(nOutlineLevel));
- }
- }
- catch( const uno::Exception& )
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter", "Failed applying outlineLevel to Paragraph styles");
- }
-}
-
-void StyleSheetTable_Impl::ApplyClonedTOCStylesToXText(uno::Reference<text::XText> const& xText)
-{
- uno::Reference<container::XEnumerationAccess> const xEA(xText, uno::UNO_QUERY_THROW);
- uno::Reference<container::XEnumeration> const xParaEnum(xEA->createEnumeration());
-
- while (xParaEnum->hasMoreElements())
- {
- uno::Reference<lang::XServiceInfo> const xElem(xParaEnum->nextElement(), uno::UNO_QUERY_THROW);
- if (xElem->supportsService(u"com.sun.star.text.Paragraph"_ustr))
- {
- uno::Reference<beans::XPropertySet> const xPara(xElem, uno::UNO_QUERY_THROW);
- OUString styleName;
- if (xPara->getPropertyValue(u"ParaStyleName"_ustr) >>= styleName)
- {
- auto const it(m_ClonedTOCStylesMap.find(styleName));
- if (it != m_ClonedTOCStylesMap.end())
- {
- xPara->setPropertyValue(u"ParaStyleName"_ustr, uno::Any(it->second));
- }
- }
- }
- else if (xElem->supportsService(u"com.sun.star.text.TextTable"_ustr))
- {
- uno::Reference<text::XTextTable> const xTable(xElem, uno::UNO_QUERY_THROW);
- uno::Sequence<OUString> const cells(xTable->getCellNames());
- for (OUString const& rCell : cells)
- {
- uno::Reference<text::XText> const xCell(xTable->getCellByName(rCell), uno::UNO_QUERY_THROW);
- ApplyClonedTOCStylesToXText(xCell);
- }
- }
- }
-}
-
-/**
- Replace the applied en-US Word built-in styles that were referenced from
- TOC fields (also STYLEREF and likely AUTOTEXTLIST) with the localised clones.
-
- With the style cloned, and the clone referenced, the ToX should work in
- Writer and also, when exported to DOCX, in Word.
- */
-void StyleSheetTable::ApplyClonedTOCStyles()
-{
- if (m_pImpl->m_ClonedTOCStylesMap.empty()
- || !m_pImpl->m_bIsNewDoc) // avoid modifying pre-existing content
- {
- return;
- }
- SAL_INFO("writerfilter.dmapper", "Applying cloned styles to make TOC work");
- // ignore header / footer, irrelevant for ToX
- // text frames
- uno::Reference<text::XTextFramesSupplier> const xDocTFS(m_pImpl->m_xTextDocument, uno::UNO_QUERY_THROW);
- uno::Reference<container::XEnumerationAccess> const xFrames(xDocTFS->getTextFrames(), uno::UNO_QUERY_THROW);
- uno::Reference<container::XEnumeration> const xFramesEnum(xFrames->createEnumeration());
- while (xFramesEnum->hasMoreElements())
- {
- uno::Reference<text::XText> const xFrame(xFramesEnum->nextElement(), uno::UNO_QUERY_THROW);
- m_pImpl->ApplyClonedTOCStylesToXText(xFrame);
- }
- // body
- uno::Reference<text::XText> const xBody(m_pImpl->m_xTextDocument->getText());
- m_pImpl->ApplyClonedTOCStylesToXText(xBody);
-}
-
-OUString StyleSheetTable::CloneTOCStyle(FontTablePtr const& rFontTable, StyleSheetEntryPtr const pStyle, OUString const& rNewName)
-{
- StyleSheetEntryPtr const pClone(new StyleSheetEntry(*pStyle));
- pClone->m_sStyleIdentifierD = rNewName;
- pClone->m_sStyleName = rNewName;
- pClone->m_sConvertedStyleName = ConvertStyleName(rNewName);
- m_pImpl->m_aStyleSheetEntries.push_back(pClone);
- // add it so it will be found if referenced from another TOC
- m_pImpl->m_aStyleSheetEntriesMap.emplace(rNewName, pClone);
- m_pImpl->m_ClonedTOCStylesMap.emplace(pStyle->m_sStyleName, pClone->m_sConvertedStyleName);
- std::vector<StyleSheetEntryPtr> const styles{ pClone };
- ApplyStyleSheetsImpl(rFontTable, styles);
- return pClone->m_sConvertedStyleName;
-}
-
-void StyleSheetTable::ApplyStyleSheets( const FontTablePtr& rFontTable )
-{
- return ApplyStyleSheetsImpl(rFontTable, m_pImpl->m_aStyleSheetEntries);
-}
-
-void StyleSheetTable::ApplyStyleSheetsImpl(const FontTablePtr& rFontTable, std::vector<StyleSheetEntryPtr> const& rEntries)
-{
- try
- {
- uno::Reference< style::XStyleFamiliesSupplier > xStylesSupplier( m_pImpl->m_xTextDocument, uno::UNO_QUERY_THROW );
- uno::Reference< lang::XMultiServiceFactory > xDocFactory( m_pImpl->m_xTextDocument, uno::UNO_QUERY_THROW );
- uno::Reference< container::XNameAccess > xStyleFamilies = xStylesSupplier->getStyleFamilies();
- uno::Reference<container::XNameContainer> xCharStyles;
- uno::Reference<container::XNameContainer> xParaStyles;
- uno::Reference<container::XNameContainer> xNumberingStyles;
-
- xStyleFamilies->getByName(getPropertyName( PROP_CHARACTER_STYLES )) >>= xCharStyles;
- xStyleFamilies->getByName(getPropertyName( PROP_PARAGRAPH_STYLES )) >>= xParaStyles;
- xStyleFamilies->getByName("NumberingStyles") >>= xNumberingStyles;
- if(xCharStyles.is() && xParaStyles.is())
- {
- std::vector< ::std::pair<OUString, uno::Reference<style::XStyle>> > aMissingParent;
- std::vector< ::std::pair<OUString, uno::Reference<style::XStyle>> > aMissingFollow;
- std::vector<std::pair<OUString, uno::Reference<style::XStyle>>> aMissingLink;
- std::vector<beans::PropertyValue> aTableStylesVec;
- for (auto& pEntry : rEntries)
- {
- if( pEntry->m_nStyleTypeCode == STYLE_TYPE_UNKNOWN && !pEntry->m_sStyleName.isEmpty() )
- pEntry->m_nStyleTypeCode = STYLE_TYPE_PARA; // unspecified style types are considered paragraph styles
-
- if( pEntry->m_nStyleTypeCode == STYLE_TYPE_CHAR || pEntry->m_nStyleTypeCode == STYLE_TYPE_PARA || pEntry->m_nStyleTypeCode == STYLE_TYPE_LIST )
- {
- bool bParaStyle = pEntry->m_nStyleTypeCode == STYLE_TYPE_PARA;
- bool bCharStyle = pEntry->m_nStyleTypeCode == STYLE_TYPE_CHAR;
- bool bListStyle = pEntry->m_nStyleTypeCode == STYLE_TYPE_LIST;
- bool bInsert = false;
- uno::Reference< container::XNameContainer > xStyles = bParaStyle ? xParaStyles : (bListStyle ? xNumberingStyles : xCharStyles);
- uno::Reference< style::XStyle > xStyle;
- const OUString sConvertedStyleName = ConvertStyleName( pEntry->m_sStyleName );
-
- if(xStyles->hasByName( sConvertedStyleName ))
- {
- // When pasting, don't update existing styles.
- if (!m_pImpl->m_bIsNewDoc)
- {
- continue;
- }
- xStyles->getByName( sConvertedStyleName ) >>= xStyle;
-
- {
- StyleSheetTable_Impl::SetPropertiesToDefault(xStyle);
-
- // resolve import conflicts with built-in styles (only if defaults have been defined)
- if ( m_pImpl->m_bHasImportedDefaultParaProps
- && pEntry->m_sBaseStyleIdentifier.isEmpty() //imported style has no inheritance
- && !xStyle->getParentStyle().isEmpty() ) //built-in style has a default inheritance
- {
- xStyle->setParentStyle( "" );
- }
- }
- }
- else
- {
- bInsert = true;
- xStyle.set(xDocFactory->createInstance(
- bParaStyle ?
- getPropertyName( PROP_SERVICE_PARA_STYLE ) :
- (bListStyle ? OUString("com.sun.star.style.NumberingStyle") : getPropertyName( PROP_SERVICE_CHAR_STYLE ))),
- uno::UNO_QUERY_THROW);
-
- // Numbering styles have to be inserted early, as e.g. the NumberingRules property is only available after insertion.
- if (bListStyle)
- {
- xStyles->insertByName( sConvertedStyleName, uno::Any( xStyle ) );
- xStyle.set(xStyles->getByName(sConvertedStyleName), uno::UNO_QUERY_THROW);
-
- StyleSheetPropertyMap* pPropertyMap = pEntry->m_pProperties.get();
- if (pPropertyMap && pPropertyMap->props().GetListId() == -1)
- {
- // No properties? Word default is 'none', Writer one is 'arabic', handle this.
- uno::Reference<beans::XPropertySet> xPropertySet(xStyle, uno::UNO_QUERY_THROW);
- uno::Reference<container::XIndexReplace> xNumberingRules;
- xPropertySet->getPropertyValue("NumberingRules") >>= xNumberingRules;
- uno::Reference<container::XIndexAccess> xIndexAccess(xNumberingRules, uno::UNO_QUERY_THROW);
- for (sal_Int32 i = 0; i < xIndexAccess->getCount(); ++i)
- {
- uno::Sequence< beans::PropertyValue > aLvlProps{
- comphelper::makePropertyValue(
- "NumberingType", style::NumberingType::NUMBER_NONE)
- };
- xNumberingRules->replaceByIndex(i, uno::Any(aLvlProps));
- xPropertySet->setPropertyValue("NumberingRules", uno::Any(xNumberingRules));
- }
- }
- }
- }
- if( !pEntry->m_sBaseStyleIdentifier.isEmpty() )
- {
- try
- {
- //TODO: Handle cases where a paragraph <> character style relation is needed
- StyleSheetEntryPtr pParent = FindStyleSheetByISTD( pEntry->m_sBaseStyleIdentifier );
- // Writer core doesn't support numbering styles having a parent style, it seems
- if (pParent && !bListStyle)
- {
- const OUString sParentStyleName = ConvertStyleName( pParent->m_sStyleName );
- if ( !sParentStyleName.isEmpty() && !xStyles->hasByName( sParentStyleName ) )
- aMissingParent.emplace_back( sParentStyleName, xStyle );
- else
- xStyle->setParentStyle( sParentStyleName );
- }
- }
- catch( const uno::RuntimeException& )
- {
- OSL_FAIL( "Styles parent could not be set");
- }
- }
- else if( bParaStyle )
- {
- // Paragraph styles that don't inherit from some parent need to apply the DocDefaults
- pEntry->m_pProperties->InsertProps( m_pImpl->m_pDefaultParaProps, /*bOverwrite=*/false );
-
- //now it's time to set the default parameters - for paragraph styles
- //Fonts: Western first entry in font table
- //CJK: second entry
- //CTL: third entry, if it exists
-
- sal_uInt32 nFontCount = rFontTable->size();
- if( !m_pImpl->m_rDMapper.IsOOXMLImport() && nFontCount > 2 )
- {
- uno::Any aTwoHundredFortyTwip(12.);
-
- // font size to 240 twip (12 pts) for all if not set
- pEntry->m_pProperties->Insert(PROP_CHAR_HEIGHT, aTwoHundredFortyTwip, false);
-
- // western font not already set -> apply first font
- const FontEntry::Pointer_t pWesternFontEntry(rFontTable->getFontEntry( 0 ));
- OUString sWesternFontName = pWesternFontEntry->sFontName;
- pEntry->m_pProperties->Insert(PROP_CHAR_FONT_NAME, uno::Any( sWesternFontName ), false);
-
- // CJK ... apply second font
- const FontEntry::Pointer_t pCJKFontEntry(rFontTable->getFontEntry( 2 ));
- pEntry->m_pProperties->Insert(PROP_CHAR_FONT_NAME_ASIAN, uno::Any( pCJKFontEntry->sFontName ), false);
- pEntry->m_pProperties->Insert(PROP_CHAR_HEIGHT_ASIAN, aTwoHundredFortyTwip, false);
-
- // CTL ... apply third font, if available
- if( nFontCount > 3 )
- {
- const FontEntry::Pointer_t pCTLFontEntry(rFontTable->getFontEntry( 3 ));
- pEntry->m_pProperties->Insert(PROP_CHAR_FONT_NAME_COMPLEX, uno::Any( pCTLFontEntry->sFontName ), false);
- pEntry->m_pProperties->Insert(PROP_CHAR_HEIGHT_COMPLEX, aTwoHundredFortyTwip, false);
- }
- }
- }
-
- auto aPropValues = comphelper::sequenceToContainer< std::vector<beans::PropertyValue> >(pEntry->m_pProperties->GetPropertyValues());
-
- if (bParaStyle || bCharStyle)
- {
- // delay adding LinkStyle property: all styles need to be created first
- if (!pEntry->m_sLinkStyleIdentifier.isEmpty())
- {
- StyleSheetEntryPtr pLinkStyle
- = FindStyleSheetByISTD(pEntry->m_sLinkStyleIdentifier);
- if (pLinkStyle && !pLinkStyle->m_sStyleName.isEmpty())
- aMissingLink.emplace_back(ConvertStyleName(pLinkStyle->m_sStyleName),
- xStyle);
- }
- }
-
- if( bParaStyle )
- {
- // delay adding FollowStyle property: all styles need to be created first
- if ( !pEntry->m_sNextStyleIdentifier.isEmpty() )
- {
- StyleSheetEntryPtr pFollowStyle = FindStyleSheetByISTD( pEntry->m_sNextStyleIdentifier );
- if ( pFollowStyle && !pFollowStyle->m_sStyleName.isEmpty() )
- aMissingFollow.emplace_back( ConvertStyleName( pFollowStyle->m_sStyleName ), xStyle );
- }
-
- // Set the outline levels
- StyleSheetPropertyMap* pStyleSheetProperties = pEntry ? pEntry->m_pProperties.get() : nullptr;
-
- if ( pStyleSheetProperties )
- {
- sal_Int16 nLvl = pStyleSheetProperties->GetOutlineLevel();
- // convert MS body Level (9) to LO body level (0) and equivalent outline levels
- if (nLvl != -1)
- {
- if (nLvl == WW_OUTLINE_MAX)
- nLvl = 0;
- else
- ++nLvl;
-
- beans::PropertyValue aLvlVal(getPropertyName(PROP_OUTLINE_LEVEL), 0,
- uno::Any(nLvl),
- beans::PropertyState_DIRECT_VALUE);
- aPropValues.push_back(aLvlVal);
- }
- }
-
- uno::Reference< beans::XPropertyState >xState( xStyle, uno::UNO_QUERY_THROW );
- if( sConvertedStyleName == "Contents Heading" ||
- sConvertedStyleName == "User Index Heading" ||
- sConvertedStyleName == "Index Heading" )
- {
- // remove Left/RightMargin values from TOX heading styles
- //left margin is set to NULL by default
- xState->setPropertyToDefault(getPropertyName( PROP_PARA_LEFT_MARGIN ));
- }
- else if ( sConvertedStyleName == "Text body" )
- xState->setPropertyToDefault(getPropertyName( PROP_PARA_BOTTOM_MARGIN ));
- else if ( sConvertedStyleName == "Heading 1" ||
- sConvertedStyleName == "Heading 2" ||
- sConvertedStyleName == "Heading 3" ||
- sConvertedStyleName == "Heading 4" ||
- sConvertedStyleName == "Heading 5" ||
- sConvertedStyleName == "Heading 6" ||
- sConvertedStyleName == "Heading 7" ||
- sConvertedStyleName == "Heading 8" ||
- sConvertedStyleName == "Heading 9" )
- {
- xState->setPropertyToDefault(getPropertyName( PROP_CHAR_WEIGHT ));
- xState->setPropertyToDefault(getPropertyName( PROP_CHAR_WEIGHT_ASIAN ));
- xState->setPropertyToDefault(getPropertyName( PROP_CHAR_WEIGHT_COMPLEX ));
- xState->setPropertyToDefault(getPropertyName( PROP_CHAR_POSTURE ));
- xState->setPropertyToDefault(getPropertyName( PROP_CHAR_POSTURE_ASIAN ));
- xState->setPropertyToDefault(getPropertyName( PROP_CHAR_POSTURE_COMPLEX ));
- xState->setPropertyToDefault(getPropertyName( PROP_CHAR_PROP_HEIGHT ));
- xState->setPropertyToDefault(getPropertyName( PROP_CHAR_PROP_HEIGHT_ASIAN ));
- xState->setPropertyToDefault(getPropertyName( PROP_CHAR_PROP_HEIGHT_COMPLEX));
-
- }
- }
-
- if ( !aPropValues.empty() )
- {
- PropValVector aSortedPropVals;
- for (const beans::PropertyValue& rValue : aPropValues)
- {
- // Don't add the style name properties
- bool bIsParaStyleName = rValue.Name == "ParaStyleName";
- bool bIsCharStyleName = rValue.Name == "CharStyleName";
- if ( !bIsParaStyleName && !bIsCharStyleName )
- {
- aSortedPropVals.Insert(rValue);
- }
- }
-
- try
- {
- uno::Reference< beans::XMultiPropertySet > xMultiPropertySet( xStyle, uno::UNO_QUERY_THROW);
- try
- {
- xMultiPropertySet->setPropertyValues( aSortedPropVals.getNames(), aSortedPropVals.getValues() );
- }
- catch ( const uno::Exception& )
- {
- uno::Reference<beans::XPropertySet> xPropertySet(xStyle, uno::UNO_QUERY_THROW);
- for ( const beans::PropertyValue& rValue : aSortedPropVals.getProperties() )
- {
- try
- {
- xPropertySet->setPropertyValue( rValue.Name, rValue.Value );
- }
- catch ( const uno::Exception& )
- {
- SAL_WARN( "writerfilter", "StyleSheetTable::ApplyStyleSheets could not set property " << rValue.Name );
- }
- }
- }
- // Duplicate MSWord's single footnote reference into Footnote Characters and Footnote anchor
- if( pEntry->m_sStyleName.equalsIgnoreAsciiCase("footnote reference")
- || pEntry->m_sStyleName.equalsIgnoreAsciiCase("endnote reference") )
- {
- uno::Reference< style::XStyle > xCopyStyle;
- if( pEntry->m_sStyleName.equalsIgnoreAsciiCase("footnote reference") )
- xStyles->getByName( "Footnote anchor" ) >>= xCopyStyle;
- else
- xStyles->getByName( "Endnote anchor" ) >>= xCopyStyle;
-
- xMultiPropertySet.set( xCopyStyle, uno::UNO_QUERY_THROW);
- xMultiPropertySet->setPropertyValues( aSortedPropVals.getNames(), aSortedPropVals.getValues() );
- }
- }
- catch( const lang::WrappedTargetException& rWrapped)
- {
-#ifdef DBG_UTIL
- OUString aMessage("StyleSheetTable::ApplyStyleSheets: Some style properties could not be set");
- beans::UnknownPropertyException aUnknownPropertyException;
-
- if (rWrapped.TargetException >>= aUnknownPropertyException)
- aMessage += ": " + aUnknownPropertyException.Message;
-
- SAL_WARN("writerfilter", aMessage);
-#else
- (void) rWrapped;
-#endif
- }
- catch( const uno::Exception& )
- {
- OSL_FAIL( "Some style properties could not be set");
- }
- }
- // Numbering style got inserted earlier.
- if(bInsert && !bListStyle)
- {
- const OUString sParentStyle = xStyle->getParentStyle();
- if( !sParentStyle.isEmpty() && !xStyles->hasByName( sParentStyle ) )
- aMissingParent.emplace_back( sParentStyle, xStyle );
-
- xStyles->insertByName( sConvertedStyleName, uno::Any( xStyle) );
- }
-
- beans::PropertyValues aGrabBag = pEntry->GetInteropGrabBagSeq();
- uno::Reference<beans::XPropertySet> xPropertySet(xStyle, uno::UNO_QUERY);
- if (aGrabBag.hasElements())
- {
- xPropertySet->setPropertyValue("StyleInteropGrabBag", uno::Any(aGrabBag));
- }
-
- // Only paragraph styles support automatic updates.
- if (pEntry->m_bAutoRedefine && bParaStyle)
- xPropertySet->setPropertyValue("IsAutoUpdate", uno::Any(true));
- }
- else if(pEntry->m_nStyleTypeCode == STYLE_TYPE_TABLE)
- {
- // If this is a table style, save its contents as-is for roundtrip purposes.
- TableStyleSheetEntry* pTableEntry = static_cast<TableStyleSheetEntry *>(pEntry.get());
- aTableStylesVec.push_back(pTableEntry->GetInteropGrabBag());
-
- // if DocDefaults exist, MS Word includes these in the table style definition.
- pEntry->m_pProperties->InsertProps( m_pImpl->m_pDefaultCharProps, /*bOverwrite=*/false );
- pEntry->m_pProperties->InsertProps( m_pImpl->m_pDefaultParaProps, /*bOverwrite=*/false );
- }
- }
-
- // Update the styles that were created before their parents or next-styles
- for( auto const & iter : aMissingParent )
- {
- iter.second->setParentStyle( iter.first );
- }
-
- for( auto const & iter : aMissingFollow )
- {
- try
- {
- uno::Reference<beans::XPropertySet> xPropertySet(iter.second, uno::UNO_QUERY);
- xPropertySet->setPropertyValue( "FollowStyle", uno::Any(iter.first) );
- }
- catch( uno::Exception & ) {}
- }
-
- // Update the styles that were created before their linked styles.
- for (auto const& rLinked : aMissingLink)
- {
- try
- {
- uno::Reference<beans::XPropertySet> xPropertySet(rLinked.second,
- uno::UNO_QUERY);
- xPropertySet->setPropertyValue("LinkStyle", uno::Any(rLinked.first));
- }
- catch (uno::Exception&)
- {
- TOOLS_WARN_EXCEPTION(
- "writerfilter",
- "StyleSheetTable::ApplyStyleSheets: failed to set LinkStyle");
- }
- }
-
- if (!aTableStylesVec.empty())
- {
- // If we had any table styles, add a new document-level InteropGrabBag entry for them.
- uno::Reference<beans::XPropertySet> xPropertySet(m_pImpl->m_xTextDocument, uno::UNO_QUERY);
- uno::Any aAny = xPropertySet->getPropertyValue("InteropGrabBag");
- auto aGrabBag = comphelper::sequenceToContainer< std::vector<beans::PropertyValue> >(aAny.get< uno::Sequence<beans::PropertyValue> >());
- beans::PropertyValue aValue;
- aValue.Name = "tableStyles";
- aValue.Value <<= comphelper::containerToSequence(aTableStylesVec);
- aGrabBag.push_back(aValue);
- xPropertySet->setPropertyValue("InteropGrabBag", uno::Any(comphelper::containerToSequence(aGrabBag)));
- }
- }
- }
- catch( const uno::Exception& )
- {
- DBG_UNHANDLED_EXCEPTION("writerfilter", "Styles could not be imported completely");
- }
-}
-
-
-StyleSheetEntryPtr StyleSheetTable::FindStyleSheetByISTD(const OUString& sIndex)
-{
- auto findIt = m_pImpl->m_aStyleSheetEntriesMap.find(sIndex);
- if (findIt != m_pImpl->m_aStyleSheetEntriesMap.end())
- return findIt->second;
- return StyleSheetEntryPtr();
-}
-
-
-StyleSheetEntryPtr StyleSheetTable::FindStyleSheetByConvertedStyleName(std::u16string_view sIndex)
-{
- StyleSheetEntryPtr pRet;
- for(const StyleSheetEntryPtr & rpEntry : m_pImpl->m_aStyleSheetEntries)
- {
- if( rpEntry->m_sConvertedStyleName == sIndex)
- {
- pRet = rpEntry;
- break;
- }
- }
- return pRet;
-}
-
-
-StyleSheetEntryPtr StyleSheetTable::FindDefaultParaStyle()
-{
- return FindStyleSheetByISTD( m_pImpl->m_sDefaultParaStyleName );
-}
-
-const StyleSheetEntryPtr & StyleSheetTable::GetCurrentEntry() const
-{
- return m_pImpl->m_pCurrentEntry;
-}
-
-OUString StyleSheetTable::ConvertStyleName( const OUString& rWWName, bool bExtendedSearch)
-{
- OUString sRet( rWWName );
- if( bExtendedSearch )
- {
- //search for the rWWName in the IdentifierD of the existing styles and convert the sStyleName member
- auto findIt = m_pImpl->m_aStyleSheetEntriesMap.find(rWWName);
- if (findIt != m_pImpl->m_aStyleSheetEntriesMap.end())
- {
- if (!findIt->second->m_sConvertedStyleName.isEmpty())
- return findIt->second->m_sConvertedStyleName;
- sRet = findIt->second->m_sStyleName;
- }
- }
-
- // create a map only once
- // This maps Word's special style manes to Writer's (the opposite to what MSWordStyles::GetWWId
- // and ww::GetEnglishNameFromSti do on export). The mapping gives a Writer's style name, which
- // will point to a style with specific RES_POOL* in its m_nPoolFormatId. Then on export, the
- // pool format id will map to a ww::sti enum value, and finally to a Word style name. Keep this
- // part in sync with the export functions mentioned above!
- // In addition to "standard" names, some case variations are handled here; and also there are
- // a number of strange mappings like "BodyTextIndentItalic" -> "Text body indent italic", which
- // map something unused in Word to something unused in Writer :-/
- static const std::map< OUString, OUString> StyleNameMap {
- { "Normal", "Standard" }, // RES_POOLCOLL_STANDARD
- { "heading 1", "Heading 1" }, // RES_POOLCOLL_HEADLINE1
- { "heading 2", "Heading 2" }, // RES_POOLCOLL_HEADLINE2
- { "heading 3", "Heading 3" }, // RES_POOLCOLL_HEADLINE3
- { "heading 4", "Heading 4" }, // RES_POOLCOLL_HEADLINE4
- { "heading 5", "Heading 5" }, // RES_POOLCOLL_HEADLINE5
- { "heading 6", "Heading 6" }, // RES_POOLCOLL_HEADLINE6
- { "heading 7", "Heading 7" }, // RES_POOLCOLL_HEADLINE7
- { "heading 8", "Heading 8" }, // RES_POOLCOLL_HEADLINE8
- { "heading 9", "Heading 9" }, // RES_POOLCOLL_HEADLINE9
- { "Heading 1", "Heading 1" }, // RES_POOLCOLL_HEADLINE1
- { "Heading 2", "Heading 2" }, // RES_POOLCOLL_HEADLINE2
- { "Heading 3", "Heading 3" }, // RES_POOLCOLL_HEADLINE3
- { "Heading 4", "Heading 4" }, // RES_POOLCOLL_HEADLINE4
- { "Heading 5", "Heading 5" }, // RES_POOLCOLL_HEADLINE5
- { "Heading 6", "Heading 6" }, // RES_POOLCOLL_HEADLINE6
- { "Heading 7", "Heading 7" }, // RES_POOLCOLL_HEADLINE7
- { "Heading 8", "Heading 8" }, // RES_POOLCOLL_HEADLINE8
- { "Heading 9", "Heading 9" }, // RES_POOLCOLL_HEADLINE9
- { "Index 1", "Index 1" }, // RES_POOLCOLL_TOX_IDX1
- { "Index 2", "Index 2" }, // RES_POOLCOLL_TOX_IDX2
- { "Index 3", "Index 3" }, // RES_POOLCOLL_TOX_IDX3
-// { "Index 4", "" },
-// { "Index 5", "" },
-// { "Index 6", "" },
-// { "Index 7", "" },
-// { "Index 8", "" },
-// { "Index 9", "" },
- { "TOC 1", "Contents 1" }, // RES_POOLCOLL_TOX_CNTNT1
- { "TOC 2", "Contents 2" }, // RES_POOLCOLL_TOX_CNTNT2
- { "TOC 3", "Contents 3" }, // RES_POOLCOLL_TOX_CNTNT3
- { "TOC 4", "Contents 4" }, // RES_POOLCOLL_TOX_CNTNT4
- { "TOC 5", "Contents 5" }, // RES_POOLCOLL_TOX_CNTNT5
- { "TOC 6", "Contents 6" }, // RES_POOLCOLL_TOX_CNTNT6
- { "TOC 7", "Contents 7" }, // RES_POOLCOLL_TOX_CNTNT7
- { "TOC 8", "Contents 8" }, // RES_POOLCOLL_TOX_CNTNT8
- { "TOC 9", "Contents 9" }, // RES_POOLCOLL_TOX_CNTNT9
- { "TOC Heading", "Contents Heading" }, // RES_POOLCOLL_TOX_CNTNTH
- { "TOCHeading", "Contents Heading" }, // RES_POOLCOLL_TOX_CNTNTH
- { "toc 1", "Contents 1" }, // RES_POOLCOLL_TOX_CNTNT1
- { "toc 2", "Contents 2" }, // RES_POOLCOLL_TOX_CNTNT2
- { "toc 3", "Contents 3" }, // RES_POOLCOLL_TOX_CNTNT3
- { "toc 4", "Contents 4" }, // RES_POOLCOLL_TOX_CNTNT4
- { "toc 5", "Contents 5" }, // RES_POOLCOLL_TOX_CNTNT5
- { "toc 6", "Contents 6" }, // RES_POOLCOLL_TOX_CNTNT6
- { "toc 7", "Contents 7" }, // RES_POOLCOLL_TOX_CNTNT7
- { "toc 8", "Contents 8" }, // RES_POOLCOLL_TOX_CNTNT8
- { "toc 9", "Contents 9" }, // RES_POOLCOLL_TOX_CNTNT9
- { "TOC1", "Contents 1" }, // RES_POOLCOLL_TOX_CNTNT1
- { "TOC2", "Contents 2" }, // RES_POOLCOLL_TOX_CNTNT2
- { "TOC3", "Contents 3" }, // RES_POOLCOLL_TOX_CNTNT3
- { "TOC4", "Contents 4" }, // RES_POOLCOLL_TOX_CNTNT4
- { "TOC5", "Contents 5" }, // RES_POOLCOLL_TOX_CNTNT5
- { "TOC6", "Contents 6" }, // RES_POOLCOLL_TOX_CNTNT6
- { "TOC7", "Contents 7" }, // RES_POOLCOLL_TOX_CNTNT7
- { "TOC8", "Contents 8" }, // RES_POOLCOLL_TOX_CNTNT8
- { "TOC9", "Contents 9" }, // RES_POOLCOLL_TOX_CNTNT9
-// { "Normal Indent", "" },
- { "footnote text", "Footnote" }, // RES_POOLCOLL_FOOTNOTE
- { "Footnote Text", "Footnote" }, // RES_POOLCOLL_FOOTNOTE
- { "Annotation Text", "Marginalia" }, // RES_POOLCOLL_MARGINAL
- { "Header", "Header" }, // RES_POOLCOLL_HEADER
- { "header", "Header" }, // RES_POOLCOLL_HEADER
- { "Footer", "Footer" }, // RES_POOLCOLL_FOOTER
- { "footer", "Footer" }, // RES_POOLCOLL_FOOTER
- { "Index Heading", "Index Heading" }, // RES_POOLCOLL_TOX_IDXH
- { "Caption", "Caption" }, // RES_POOLCOLL_LABEL
- { "table of figures", "Figure Index 1" }, // RES_POOLCOLL_TOX_ILLUS1
- { "Table of Figures", "Figure Index 1" }, // RES_POOLCOLL_TOX_ILLUS1
- { "Envelope Address", "Addressee" }, // RES_POOLCOLL_ENVELOPE_ADDRESS
- { "Envelope Return", "Sender" }, // RES_POOLCOLL_SEND_ADDRESS
- { "footnote reference", "Footnote Symbol" }, // RES_POOLCHR_FOOTNOTE; tdf#82173
- { "Footnote Reference", "Footnote Symbol" }, // RES_POOLCHR_FOOTNOTE; tdf#82173
-// { "Annotation Reference", "" },
- { "Line Number", "Line numbering" }, // RES_POOLCHR_LINENUM
- { "Page Number", "Page Number" }, // RES_POOLCHR_PAGENO
- { "endnote reference", "Endnote Symbol" }, // RES_POOLCHR_ENDNOTE; tdf#82173
- { "Endnote Reference", "Endnote Symbol" }, // RES_POOLCHR_ENDNOTE; tdf#82173
- { "endnote text", "Endnote" }, // RES_POOLCOLL_ENDNOTE
- { "Endnote Text", "Endnote" }, // RES_POOLCOLL_ENDNOTE
- { "Table of Authorities", "Bibliography Heading" }, // RES_POOLCOLL_TOX_AUTHORITIESH
-// { "Macro Text", "" },
-// { "TOA Heading", "" },
- { "List", "List" }, // RES_POOLCOLL_NUMBER_BULLET_BASE
-// { "List 2", "" },
-// { "List 3", "" },
-// { "List 4", "" },
-// { "List 5", "" },
- { "List Bullet", "List 1" }, // RES_POOLCOLL_BULLET_LEVEL1
- { "List Bullet 2", "List 2" }, // RES_POOLCOLL_BULLET_LEVEL2
- { "List Bullet 3", "List 3" }, // RES_POOLCOLL_BULLET_LEVEL3
- { "List Bullet 4", "List 4" }, // RES_POOLCOLL_BULLET_LEVEL4
- { "List Bullet 5", "List 5" }, // RES_POOLCOLL_BULLET_LEVEL5
- { "List Number", "Numbering 1" }, // RES_POOLCOLL_NUM_LEVEL1
- { "List Number 2", "Numbering 2" }, // RES_POOLCOLL_NUM_LEVEL2
- { "List Number 3", "Numbering 3" }, // RES_POOLCOLL_NUM_LEVEL3
- { "List Number 4", "Numbering 4" }, // RES_POOLCOLL_NUM_LEVEL4
- { "List Number 5", "Numbering 5" }, // RES_POOLCOLL_NUM_LEVEL5
- { "Title", "Title" }, // RES_POOLCOLL_DOC_TITLE
- { "Closing", "Appendix" }, // RES_POOLCOLL_DOC_APPENDIX
- { "Signature", "Signature" }, // RES_POOLCOLL_SIGNATURE
-// { "Default Paragraph Font", "" },
- { "DefaultParagraphFont", "Default Paragraph Font" },
- { "Body Text", "Text body" }, // RES_POOLCOLL_TEXT
- { "BodyText", "Text body" }, // RES_POOLCOLL_TEXT
- { "BodyTextIndentItalic", "Text body indent italic" },
- { "Body Text Indent", "Text body indent" }, // RES_POOLCOLL_TEXT_MOVE
- { "BodyTextIndent", "Text body indent" }, // RES_POOLCOLL_TEXT_MOVE
- { "BodyTextIndent2", "Text body indent2" },
- { "List Continue", "List 1 Cont." }, // RES_POOLCOLL_BULLET_NONUM1
- { "List Continue 2", "List 2 Cont." }, // RES_POOLCOLL_BULLET_NONUM2
- { "List Continue 3", "List 3 Cont." }, // RES_POOLCOLL_BULLET_NONUM3
- { "List Continue 4", "List 4 Cont." }, // RES_POOLCOLL_BULLET_NONUM4
- { "List Continue 5", "List 5 Cont." }, // RES_POOLCOLL_BULLET_NONUM5
-// { "Message Header", "" },
- { "Subtitle", "Subtitle" }, // RES_POOLCOLL_DOC_SUBTITLE
- { "Salutation", "Salutation" }, // RES_POOLCOLL_GREETING
-// { "Date", "" },
- { "Body Text First Indent", "First line indent" }, // RES_POOLCOLL_TEXT_IDENT
-// { "Body Text First Indent 2", "" },
-// { "Note Heading", "" },
-// { "Body Text 2", "" },
-// { "Body Text 3", "" },
-// { "Body Text Indent 2", "" },
-// { "Body Text Indent 3", "" },
-// { "Block Text", "" },
- { "Hyperlink", "Internet link" }, // RES_POOLCHR_INET_NORMAL
- { "FollowedHyperlink", "Visited Internet Link" }, // RES_POOLCHR_INET_VISIT
- { "Strong", "Strong Emphasis" }, // RES_POOLCHR_HTML_STRONG
- { "Emphasis", "Emphasis" }, // RES_POOLCHR_HTML_EMPHASIS
-// { "Document Map", "" },
-// { "Plain Text", "" },
- { "NoList", "No List" },
- { "AbstractHeading", "Abstract Heading" },
- { "AbstractBody", "Abstract Body" },
- { "PageNumber", "Page Number" }, // RES_POOLCHR_PAGENO
- { "TableNormal", "Normal Table" },
- { "DocumentMap", "Document Map" },
- };
-
- // find style-name using map
- if (const auto aIt = StyleNameMap.find(sRet); aIt != StyleNameMap.end())
- {
- sRet = aIt->second;
- }
- else
- {
- // Style names which should not be used without a " (user)" suffix
- static const o3tl::sorted_vector<OUString> ReservedStyleNames = [] {
- o3tl::sorted_vector<OUString> set;
- for (const auto& pair : StyleNameMap)
- set.insert(pair.second);
- return set;
- }();
- // Similar to SwStyleNameMapper convention (where a " (user)" suffix is used to
- // disambiguate user styles with reserved names in localization where respective
- // built-in styles have different UI names), we add a " (WW)" suffix here. Unlike
- // the " (user)" suffix, it is not hidden from the UI; it will be handled when
- // exported to Word formats - see MSWordStyles::BuildWwNames.
- // We can't use the " (user)" suffix, because that system is built upon the assumption
- // that UI names of respective built-in styles are different from the user style name.
- // That is not necessarily true here, since the current localization may not change
- // the UI names of built-in styles.
- if (ReservedStyleNames.find(sRet) != ReservedStyleNames.end() || sRet.endsWith(" (WW)"))
- sRet += " (WW)";
- }
-
- return sRet;
-}
-
-void StyleSheetTable::applyDefaults(bool bParaProperties)
-{
- try{
-
- if (!m_pImpl->m_bIsNewDoc)
- {
- // tdf#72942: do not corrupts original styles in master document
- // during inserting of text from second document
- return;
- }
-
- if(!m_pImpl->m_xTextDefaults.is())
- {
- m_pImpl->m_xTextDefaults.set(
- m_pImpl->m_rDMapper.GetTextFactory()->createInstance("com.sun.star.text.Defaults"),
- uno::UNO_QUERY_THROW );
- }
-
- // WARNING: these defaults only take effect IF there is a DocDefaults style section. Normally there is, but not always.
- if( bParaProperties && m_pImpl->m_pDefaultParaProps)
- {
- // tdf#87533 LO will have different defaults here, depending on the locale. Import with documented defaults
- SetDefaultParaProps(PROP_WRITING_MODE, uno::Any(sal_Int16(text::WritingMode_LR_TB)));
- SetDefaultParaProps(PROP_PARA_ADJUST, uno::Any(sal_Int16(style::ParagraphAdjust_LEFT)));
-
- // Widow/Orphan -> set both to two if not already set
- uno::Any aTwo(sal_Int8(2));
- SetDefaultParaProps(PROP_PARA_WIDOWS, aTwo);
- SetDefaultParaProps(PROP_PARA_ORPHANS, aTwo);
-
- uno::Reference<style::XStyleFamiliesSupplier> xStylesSupplier(m_pImpl->m_xTextDocument, uno::UNO_QUERY);
- uno::Reference<container::XNameAccess> xStyleFamilies = xStylesSupplier->getStyleFamilies();
- uno::Reference<container::XNameAccess> xParagraphStyles;
- xStyleFamilies->getByName("ParagraphStyles") >>= xParagraphStyles;
- uno::Reference<beans::XPropertySet> xDefault;
- // This is the built-in default style that every style inherits from
- xParagraphStyles->getByName("Paragraph style") >>= xDefault;
-
- const uno::Sequence< beans::PropertyValue > aPropValues = m_pImpl->m_pDefaultParaProps->GetPropertyValues();
- for( const auto& rPropValue : aPropValues )
- {
- try
- {
- xDefault->setPropertyValue(rPropValue.Name, rPropValue.Value);
- }
- catch( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "setPropertyValue");
- }
- }
- }
- if( !bParaProperties && m_pImpl->m_pDefaultCharProps )
- {
- // tdf#108350: Earlier in DomainMapper for DOCX, Calibri/11pt was set to match MSWord 2007+,
- // but that is valid only if DocDefaults_rPrDefault is omitted.
- // Now that DocDefaults_rPrDefault is known, the defaults should be reset to Times New Roman/10pt.
- if ( m_pImpl->m_rDMapper.IsOOXMLImport() )
- m_pImpl->m_xTextDefaults->setPropertyValue( getPropertyName(PROP_CHAR_FONT_NAME), css::uno::Any(OUString("Times New Roman")) );
-
- const uno::Sequence< beans::PropertyValue > aPropValues = m_pImpl->m_pDefaultCharProps->GetPropertyValues();
- for( const auto& rPropValue : aPropValues )
- {
- try
- {
- m_pImpl->m_xTextDefaults->setPropertyValue( rPropValue.Name, rPropValue.Value );
- }
- catch( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "exception");
- }
- }
- }
- }
- catch( const uno::Exception& )
- {
- }
-}
-
-
-OUString StyleSheetTable::getOrCreateCharStyle( PropertyValueVector_t& rCharProperties, bool bAlwaysCreate )
-{
- //find out if any of the styles already has the required properties then return its name
- OUString sListLabel = m_pImpl->HasListCharStyle(rCharProperties);
- // Don't try to reuse an existing character style if requested.
- if( !sListLabel.isEmpty() && !bAlwaysCreate)
- return sListLabel;
-
- //create a new one otherwise
- const uno::Reference< container::XNameContainer >& xCharStyles = m_pImpl->m_rDMapper.GetCharacterStyles();
- sListLabel = m_pImpl->m_rDMapper.GetUnusedCharacterStyleName();
- uno::Reference< lang::XMultiServiceFactory > xDocFactory( m_pImpl->m_xTextDocument, uno::UNO_QUERY_THROW );
- try
- {
- uno::Reference< style::XStyle > xStyle( xDocFactory->createInstance(
- getPropertyName( PROP_SERVICE_CHAR_STYLE )), uno::UNO_QUERY_THROW);
- uno::Reference< beans::XPropertySet > xStyleProps(xStyle, uno::UNO_QUERY_THROW );
- for( const auto& rCharProp : rCharProperties)
- {
- try
- {
- xStyleProps->setPropertyValue( rCharProp.Name, rCharProp.Value );
- }
- catch( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "StyleSheetTable::getOrCreateCharStyle - Style::setPropertyValue");
- }
- }
- xCharStyles->insertByName( sListLabel, uno::Any( xStyle) );
- m_pImpl->m_aListCharStylePropertyVector.emplace_back( sListLabel, std::vector(rCharProperties) );
- }
- catch( const uno::Exception& )
- {
- TOOLS_WARN_EXCEPTION( "writerfilter", "StyleSheetTable::getOrCreateCharStyle");
- }
-
- return sListLabel;
-}
-
-}//namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/StyleSheetTable.hxx b/writerfilter/source/dmapper/StyleSheetTable.hxx
deleted file mode 100644
index 2308257a32b2..000000000000
--- a/writerfilter/source/dmapper/StyleSheetTable.hxx
+++ /dev/null
@@ -1,155 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <memory>
-#include "TblStylePrHandler.hxx"
-
-#include "DomainMapper.hxx"
-#include <com/sun/star/beans/PropertyValues.hpp>
-#include "PropertyMap.hxx"
-#include "FontTable.hxx"
-#include "LoggedResources.hxx"
-
-namespace com::sun::star::text { class XTextDocument; }
-
-
-namespace writerfilter::dmapper
-{
-
-
-enum StyleType
-{
- STYLE_TYPE_UNKNOWN,
- STYLE_TYPE_PARA,
- STYLE_TYPE_CHAR,
- STYLE_TYPE_TABLE,
- STYLE_TYPE_LIST
-};
-class StyleSheetTable;
-typedef tools::SvRef<StyleSheetTable> StyleSheetTablePtr;
-
-struct StyleSheetTable_Impl;
-class StyleSheetEntry : public virtual SvRefBase
-{
- std::vector<css::beans::PropertyValue> m_aInteropGrabBag;
-public:
- OUString m_sStyleIdentifierD; // WW8 name
- bool m_bIsDefaultStyle;
- bool m_bAssignedAsChapterNumbering;
- bool m_bInvalidHeight;
- bool m_bHasUPE; //universal property expansion
- StyleType m_nStyleTypeCode; //sgc
- OUString m_sBaseStyleIdentifier;
- OUString m_sNextStyleIdentifier;
- OUString m_sLinkStyleIdentifier;
- OUString m_sStyleName;
- const tools::SvRef<StyleSheetPropertyMap> m_pProperties;
- OUString m_sConvertedStyleName;
- std::vector<css::beans::PropertyValue> m_aLatentStyles; ///< Attributes of latentStyles
- std::vector<css::beans::PropertyValue> m_aLsdExceptions; ///< List of lsdException attribute lists
- bool m_bAutoRedefine; ///< Writer calls this auto-update.
-
- void AppendInteropGrabBag(const css::beans::PropertyValue& rValue);
- css::beans::PropertyValue GetInteropGrabBag(); ///< Used for table styles, has a name.
- css::beans::PropertyValues GetInteropGrabBagSeq() const; ///< Used for existing styles, just a list of properties.
-
- // Get all properties, merged with the all of the parent's properties
- PropertyMapPtr GetMergedInheritedProperties(const StyleSheetTablePtr& pStyleSheetTable);
-
- StyleSheetEntry();
- StyleSheetEntry(StyleSheetEntry const&) = default;
- virtual ~StyleSheetEntry() override;
-};
-
-typedef tools::SvRef<StyleSheetEntry> StyleSheetEntryPtr;
-
-class DomainMapper;
-class StyleSheetTable :
- public LoggedProperties,
- public LoggedTable
-{
- std::unique_ptr<StyleSheetTable_Impl> m_pImpl;
-
-public:
- StyleSheetTable(DomainMapper& rDMapper, css::uno::Reference<css::text::XTextDocument> const& xTextDocument, bool bIsNewDoc);
- virtual ~StyleSheetTable() override;
-
- void ReApplyInheritedOutlineLevelFromChapterNumbering();
- void ApplyNumberingStyleNameToParaStyles();
- void ApplyStyleSheets( const FontTablePtr& rFontTable );
- StyleSheetEntryPtr FindStyleSheetByISTD(const OUString& sIndex);
- StyleSheetEntryPtr FindStyleSheetByConvertedStyleName(std::u16string_view rIndex);
- StyleSheetEntryPtr FindDefaultParaStyle();
-
- OUString ConvertStyleName( const OUString& rWWName, bool bExtendedSearch = false );
- OUString CloneTOCStyle(FontTablePtr const& rFontTable, StyleSheetEntryPtr const pStyle, OUString const& rName);
- void ApplyClonedTOCStyles();
-
- OUString getOrCreateCharStyle( PropertyValueVector_t& rCharProperties, bool bAlwaysCreate );
-
- void SetDefaultParaProps(PropertyIds eId, const css::uno::Any& rAny);
- PropertyMapPtr const & GetDefaultParaProps() const;
- /// Returns the default character properties.
- PropertyMapPtr const & GetDefaultCharProps() const;
-
- const StyleSheetEntryPtr & GetCurrentEntry() const;
-
-private:
- // Properties
- virtual void lcl_attribute(Id Name, Value & val) override;
- virtual void lcl_sprm(Sprm & sprm) override;
-
- // Table
- virtual void lcl_entry(const writerfilter::Reference<Properties>::Pointer_t& ref) override;
-
- void applyDefaults(bool bParaProperties);
-
- void ApplyStyleSheetsImpl(const FontTablePtr& rFontTable, std::vector<StyleSheetEntryPtr> const& rEntries);
-};
-
-
-class TableStyleSheetEntry :
- public StyleSheetEntry
-{
-public:
- // Adds a new tblStylePr to the table style entry. This method
- // fixes some possible properties conflicts, like borders ones.
- void AddTblStylePr( TblStyleType nType, const PropertyMapPtr& pProps );
-
- // Gets all the properties
- // + corresponding to the mask,
- // + from the parent styles
-
- // @param mask mask describing which properties to return
- PropertyMapPtr GetProperties( sal_Int32 nMask);
-
- TableStyleSheetEntry( StyleSheetEntry const & aEntry );
- virtual ~TableStyleSheetEntry( ) override;
-
-private:
- typedef std::map<TblStyleType, PropertyMapPtr> TblStylePrs;
- TblStylePrs m_aStyles;
- PropertyMapPtr GetLocalPropertiesFromMask( sal_Int32 nMask );
-};
-
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TDefTableHandler.cxx b/writerfilter/source/dmapper/TDefTableHandler.cxx
deleted file mode 100644
index 9626beb595bc..000000000000
--- a/writerfilter/source/dmapper/TDefTableHandler.cxx
+++ /dev/null
@@ -1,538 +0,0 @@
-/* -*- 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/.
- *
- * 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 "TDefTableHandler.hxx"
-#include "PropertyMap.hxx"
-#include "ConversionHelper.hxx"
-#include <ooxml/resourceids.hxx>
-#include <filter/msfilter/util.hxx>
-#include <tools/color.hxx>
-#include <com/sun/star/table/BorderLine2.hpp>
-#include <comphelper/sequence.hxx>
-
-namespace writerfilter::dmapper {
-
-using namespace ::com::sun::star;
-
-
-TDefTableHandler::TDefTableHandler() :
-LoggedProperties("TDefTableHandler"),
-m_nLineWidth(0),
-m_nLineType(0),
-m_nLineColor(0)
-{
-}
-
-
-TDefTableHandler::~TDefTableHandler()
-{
-}
-
-OUString TDefTableHandler::getBorderTypeString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_Value_ST_Border_nil: return "nil";
- case NS_ooxml::LN_Value_ST_Border_none: return "none";
- case NS_ooxml::LN_Value_ST_Border_single: return "single";
- case NS_ooxml::LN_Value_ST_Border_thick: return "thick";
- case NS_ooxml::LN_Value_ST_Border_double: return "double";
- case NS_ooxml::LN_Value_ST_Border_dotted: return "dotted";
- case NS_ooxml::LN_Value_ST_Border_dashed: return "dashed";
- case NS_ooxml::LN_Value_ST_Border_dotDash: return "dotDash";
- case NS_ooxml::LN_Value_ST_Border_dotDotDash: return "dotDotDash";
- case NS_ooxml::LN_Value_ST_Border_triple: return "triple";
- case NS_ooxml::LN_Value_ST_Border_thinThickSmallGap: return "thinThickSmallGap";
- case NS_ooxml::LN_Value_ST_Border_thickThinSmallGap: return "thickThinSmallGap";
- case NS_ooxml::LN_Value_ST_Border_thinThickThinSmallGap: return "thinThickThinSmallGap";
- case NS_ooxml::LN_Value_ST_Border_thinThickMediumGap: return "thinThickMediumGap";
- case NS_ooxml::LN_Value_ST_Border_thickThinMediumGap: return "thickThinMediumGap";
- case NS_ooxml::LN_Value_ST_Border_thinThickThinMediumGap: return "thinThickThinMediumGap";
- case NS_ooxml::LN_Value_ST_Border_thinThickLargeGap: return "thinThickLargeGap";
- case NS_ooxml::LN_Value_ST_Border_thickThinLargeGap: return "thickThinLargeGap";
- case NS_ooxml::LN_Value_ST_Border_thinThickThinLargeGap: return "thinThickThinLargeGap";
- case NS_ooxml::LN_Value_ST_Border_wave: return "wave";
- case NS_ooxml::LN_Value_ST_Border_doubleWave: return "doubleWave";
- case NS_ooxml::LN_Value_ST_Border_dashSmallGap: return "dashSmallGap";
- case NS_ooxml::LN_Value_ST_Border_dashDotStroked: return "dashDotStroked";
- case NS_ooxml::LN_Value_ST_Border_threeDEmboss: return "threeDEmboss";
- case NS_ooxml::LN_Value_ST_Border_threeDEngrave: return "threeDEngrave";
- case NS_ooxml::LN_Value_ST_Border_outset: return "outset";
- case NS_ooxml::LN_Value_ST_Border_inset: return "inset";
- case NS_ooxml::LN_Value_ST_Border_apples: return "apples";
- case NS_ooxml::LN_Value_ST_Border_archedScallops: return "archedScallops";
- case NS_ooxml::LN_Value_ST_Border_babyPacifier: return "babyPacifier";
- case NS_ooxml::LN_Value_ST_Border_babyRattle: return "babyRattle";
- case NS_ooxml::LN_Value_ST_Border_balloons3Colors: return "balloons3Colors";
- case NS_ooxml::LN_Value_ST_Border_balloonsHotAir: return "balloonsHotAir";
- case NS_ooxml::LN_Value_ST_Border_basicBlackDashes: return "basicBlackDashes";
- case NS_ooxml::LN_Value_ST_Border_basicBlackDots: return "basicBlackDots";
- case NS_ooxml::LN_Value_ST_Border_basicBlackSquares: return "basicBlackSquares";
- case NS_ooxml::LN_Value_ST_Border_basicThinLines: return "basicThinLines";
- case NS_ooxml::LN_Value_ST_Border_basicWhiteDashes: return "basicWhiteDashes";
- case NS_ooxml::LN_Value_ST_Border_basicWhiteDots: return "basicWhiteDots";
- case NS_ooxml::LN_Value_ST_Border_basicWhiteSquares: return "basicWhiteSquares";
- case NS_ooxml::LN_Value_ST_Border_basicWideInline: return "basicWideInline";
- case NS_ooxml::LN_Value_ST_Border_basicWideMidline: return "basicWideMidline";
- case NS_ooxml::LN_Value_ST_Border_basicWideOutline: return "basicWideOutline";
- case NS_ooxml::LN_Value_ST_Border_bats: return "bats";
- case NS_ooxml::LN_Value_ST_Border_birds: return "birds";
- case NS_ooxml::LN_Value_ST_Border_birdsFlight: return "birdsFlight";
- case NS_ooxml::LN_Value_ST_Border_cabins: return "cabins";
- case NS_ooxml::LN_Value_ST_Border_cakeSlice: return "cakeSlice";
- case NS_ooxml::LN_Value_ST_Border_candyCorn: return "candyCorn";
- case NS_ooxml::LN_Value_ST_Border_celticKnotwork: return "celticKnotwork";
- case NS_ooxml::LN_Value_ST_Border_certificateBanner: return "certificateBanner";
- case NS_ooxml::LN_Value_ST_Border_chainLink: return "chainLink";
- case NS_ooxml::LN_Value_ST_Border_champagneBottle: return "champagneBottle";
- case NS_ooxml::LN_Value_ST_Border_checkedBarBlack: return "checkedBarBlack";
- case NS_ooxml::LN_Value_ST_Border_checkedBarColor: return "checkedBarColor";
- case NS_ooxml::LN_Value_ST_Border_checkered: return "checkered";
- case NS_ooxml::LN_Value_ST_Border_christmasTree: return "christmasTree";
- case NS_ooxml::LN_Value_ST_Border_circlesLines: return "circlesLines";
- case NS_ooxml::LN_Value_ST_Border_circlesRectangles: return "circlesRectangles";
- case NS_ooxml::LN_Value_ST_Border_classicalWave: return "classicalWave";
- case NS_ooxml::LN_Value_ST_Border_clocks: return "clocks";
- case NS_ooxml::LN_Value_ST_Border_compass: return "compass";
- case NS_ooxml::LN_Value_ST_Border_confetti: return "confetti";
- case NS_ooxml::LN_Value_ST_Border_confettiGrays: return "confettiGrays";
- case NS_ooxml::LN_Value_ST_Border_confettiOutline: return "confettiOutline";
- case NS_ooxml::LN_Value_ST_Border_confettiStreamers: return "confettiStreamers";
- case NS_ooxml::LN_Value_ST_Border_confettiWhite: return "confettiWhite";
- case NS_ooxml::LN_Value_ST_Border_cornerTriangles: return "cornerTriangles";
- case NS_ooxml::LN_Value_ST_Border_couponCutoutDashes: return "couponCutoutDashes";
- case NS_ooxml::LN_Value_ST_Border_couponCutoutDots: return "couponCutoutDots";
- case NS_ooxml::LN_Value_ST_Border_crazyMaze: return "crazyMaze";
- case NS_ooxml::LN_Value_ST_Border_creaturesButterfly: return "creaturesButterfly";
- case NS_ooxml::LN_Value_ST_Border_creaturesFish: return "creaturesFish";
- case NS_ooxml::LN_Value_ST_Border_creaturesInsects: return "creaturesInsects";
- case NS_ooxml::LN_Value_ST_Border_creaturesLadyBug: return "creaturesLadyBug";
- case NS_ooxml::LN_Value_ST_Border_crossStitch: return "crossStitch";
- case NS_ooxml::LN_Value_ST_Border_cup: return "cup";
- case NS_ooxml::LN_Value_ST_Border_decoArch: return "decoArch";
- case NS_ooxml::LN_Value_ST_Border_decoArchColor: return "decoArchColor";
- case NS_ooxml::LN_Value_ST_Border_decoBlocks: return "decoBlocks";
- case NS_ooxml::LN_Value_ST_Border_diamondsGray: return "diamondsGray";
- case NS_ooxml::LN_Value_ST_Border_doubleD: return "doubleD";
- case NS_ooxml::LN_Value_ST_Border_doubleDiamonds: return "doubleDiamonds";
- case NS_ooxml::LN_Value_ST_Border_earth1: return "earth1";
- case NS_ooxml::LN_Value_ST_Border_earth2: return "earth2";
- case NS_ooxml::LN_Value_ST_Border_eclipsingSquares1: return "eclipsingSquares1";
- case NS_ooxml::LN_Value_ST_Border_eclipsingSquares2: return "eclipsingSquares2";
- case NS_ooxml::LN_Value_ST_Border_eggsBlack: return "eggsBlack";
- case NS_ooxml::LN_Value_ST_Border_fans: return "fans";
- case NS_ooxml::LN_Value_ST_Border_film: return "film";
- case NS_ooxml::LN_Value_ST_Border_firecrackers: return "firecrackers";
- case NS_ooxml::LN_Value_ST_Border_flowersBlockPrint: return "flowersBlockPrint";
- case NS_ooxml::LN_Value_ST_Border_flowersDaisies: return "flowersDaisies";
- case NS_ooxml::LN_Value_ST_Border_flowersModern1: return "flowersModern1";
- case NS_ooxml::LN_Value_ST_Border_flowersModern2: return "flowersModern2";
- case NS_ooxml::LN_Value_ST_Border_flowersPansy: return "flowersPansy";
- case NS_ooxml::LN_Value_ST_Border_flowersRedRose: return "flowersRedRose";
- case NS_ooxml::LN_Value_ST_Border_flowersRoses: return "flowersRoses";
- case NS_ooxml::LN_Value_ST_Border_flowersTeacup: return "flowersTeacup";
- case NS_ooxml::LN_Value_ST_Border_flowersTiny: return "flowersTiny";
- case NS_ooxml::LN_Value_ST_Border_gems: return "gems";
- case NS_ooxml::LN_Value_ST_Border_gingerbreadMan: return "gingerbreadMan";
- case NS_ooxml::LN_Value_ST_Border_gradient: return "gradient";
- case NS_ooxml::LN_Value_ST_Border_handmade1: return "handmade1";
- case NS_ooxml::LN_Value_ST_Border_handmade2: return "handmade2";
- case NS_ooxml::LN_Value_ST_Border_heartBalloon: return "heartBalloon";
- case NS_ooxml::LN_Value_ST_Border_heartGray: return "heartGray";
- case NS_ooxml::LN_Value_ST_Border_hearts: return "hearts";
- case NS_ooxml::LN_Value_ST_Border_heebieJeebies: return "heebieJeebies";
- case NS_ooxml::LN_Value_ST_Border_holly: return "holly";
- case NS_ooxml::LN_Value_ST_Border_houseFunky: return "houseFunky";
- case NS_ooxml::LN_Value_ST_Border_hypnotic: return "hypnotic";
- case NS_ooxml::LN_Value_ST_Border_iceCreamCones: return "iceCreamCones";
- case NS_ooxml::LN_Value_ST_Border_lightBulb: return "lightBulb";
- case NS_ooxml::LN_Value_ST_Border_lightning1: return "lightning1";
- case NS_ooxml::LN_Value_ST_Border_lightning2: return "lightning2";
- case NS_ooxml::LN_Value_ST_Border_mapPins: return "mapPins";
- case NS_ooxml::LN_Value_ST_Border_mapleLeaf: return "mapleLeaf";
- case NS_ooxml::LN_Value_ST_Border_mapleMuffins: return "mapleMuffins";
- case NS_ooxml::LN_Value_ST_Border_marquee: return "marquee";
- case NS_ooxml::LN_Value_ST_Border_marqueeToothed: return "marqueeToothed";
- case NS_ooxml::LN_Value_ST_Border_moons: return "moons";
- case NS_ooxml::LN_Value_ST_Border_mosaic: return "mosaic";
- case NS_ooxml::LN_Value_ST_Border_musicNotes: return "musicNotes";
- case NS_ooxml::LN_Value_ST_Border_northwest: return "northwest";
- case NS_ooxml::LN_Value_ST_Border_ovals: return "ovals";
- case NS_ooxml::LN_Value_ST_Border_packages: return "packages";
- case NS_ooxml::LN_Value_ST_Border_palmsBlack: return "palmsBlack";
- case NS_ooxml::LN_Value_ST_Border_palmsColor: return "palmsColor";
- case NS_ooxml::LN_Value_ST_Border_paperClips: return "paperClips";
- case NS_ooxml::LN_Value_ST_Border_papyrus: return "papyrus";
- case NS_ooxml::LN_Value_ST_Border_partyFavor: return "partyFavor";
- case NS_ooxml::LN_Value_ST_Border_partyGlass: return "partyGlass";
- case NS_ooxml::LN_Value_ST_Border_pencils: return "pencils";
- case NS_ooxml::LN_Value_ST_Border_people: return "people";
- case NS_ooxml::LN_Value_ST_Border_peopleWaving: return "peopleWaving";
- case NS_ooxml::LN_Value_ST_Border_peopleHats: return "peopleHats";
- case NS_ooxml::LN_Value_ST_Border_poinsettias: return "poinsettias";
- case NS_ooxml::LN_Value_ST_Border_postageStamp: return "postageStamp";
- case NS_ooxml::LN_Value_ST_Border_pumpkin1: return "pumpkin1";
- case NS_ooxml::LN_Value_ST_Border_pushPinNote2: return "pushPinNote2";
- case NS_ooxml::LN_Value_ST_Border_pushPinNote1: return "pushPinNote1";
- case NS_ooxml::LN_Value_ST_Border_pyramids: return "pyramids";
- case NS_ooxml::LN_Value_ST_Border_pyramidsAbove: return "pyramidsAbove";
- case NS_ooxml::LN_Value_ST_Border_quadrants: return "quadrants";
- case NS_ooxml::LN_Value_ST_Border_rings: return "rings";
- case NS_ooxml::LN_Value_ST_Border_safari: return "safari";
- case NS_ooxml::LN_Value_ST_Border_sawtooth: return "sawtooth";
- case NS_ooxml::LN_Value_ST_Border_sawtoothGray: return "sawtoothGray";
- case NS_ooxml::LN_Value_ST_Border_scaredCat: return "scaredCat";
- case NS_ooxml::LN_Value_ST_Border_seattle: return "seattle";
- case NS_ooxml::LN_Value_ST_Border_shadowedSquares: return "shadowedSquares";
- case NS_ooxml::LN_Value_ST_Border_sharksTeeth: return "sharksTeeth";
- case NS_ooxml::LN_Value_ST_Border_shorebirdTracks: return "shorebirdTracks";
- case NS_ooxml::LN_Value_ST_Border_skyrocket: return "skyrocket";
- case NS_ooxml::LN_Value_ST_Border_snowflakeFancy: return "snowflakeFancy";
- case NS_ooxml::LN_Value_ST_Border_snowflakes: return "snowflakes";
- case NS_ooxml::LN_Value_ST_Border_sombrero: return "sombrero";
- case NS_ooxml::LN_Value_ST_Border_southwest: return "southwest";
- case NS_ooxml::LN_Value_ST_Border_stars: return "stars";
- case NS_ooxml::LN_Value_ST_Border_starsTop: return "starsTop";
- case NS_ooxml::LN_Value_ST_Border_stars3d: return "stars3d";
- case NS_ooxml::LN_Value_ST_Border_starsBlack: return "starsBlack";
- case NS_ooxml::LN_Value_ST_Border_starsShadowed: return "starsShadowed";
- case NS_ooxml::LN_Value_ST_Border_sun: return "sun";
- case NS_ooxml::LN_Value_ST_Border_swirligig: return "swirligig";
- case NS_ooxml::LN_Value_ST_Border_tornPaper: return "tornPaper";
- case NS_ooxml::LN_Value_ST_Border_tornPaperBlack: return "tornPaperBlack";
- case NS_ooxml::LN_Value_ST_Border_trees: return "trees";
- case NS_ooxml::LN_Value_ST_Border_triangleParty: return "triangleParty";
- case NS_ooxml::LN_Value_ST_Border_triangles: return "triangles";
- case NS_ooxml::LN_Value_ST_Border_tribal1: return "tribal1";
- case NS_ooxml::LN_Value_ST_Border_tribal2: return "tribal2";
- case NS_ooxml::LN_Value_ST_Border_tribal3: return "tribal3";
- case NS_ooxml::LN_Value_ST_Border_tribal4: return "tribal4";
- case NS_ooxml::LN_Value_ST_Border_tribal5: return "tribal5";
- case NS_ooxml::LN_Value_ST_Border_tribal6: return "tribal6";
- case NS_ooxml::LN_Value_ST_Border_twistedLines1: return "twistedLines1";
- case NS_ooxml::LN_Value_ST_Border_twistedLines2: return "twistedLines2";
- case NS_ooxml::LN_Value_ST_Border_vine: return "vine";
- case NS_ooxml::LN_Value_ST_Border_waveline: return "waveline";
- case NS_ooxml::LN_Value_ST_Border_weavingAngles: return "weavingAngles";
- case NS_ooxml::LN_Value_ST_Border_weavingBraid: return "weavingBraid";
- case NS_ooxml::LN_Value_ST_Border_weavingRibbon: return "weavingRibbon";
- case NS_ooxml::LN_Value_ST_Border_weavingStrips: return "weavingStrips";
- case NS_ooxml::LN_Value_ST_Border_whiteFlowers: return "whiteFlowers";
- case NS_ooxml::LN_Value_ST_Border_woodwork: return "woodwork";
- case NS_ooxml::LN_Value_ST_Border_xIllusions: return "xIllusions";
- case NS_ooxml::LN_Value_ST_Border_zanyTriangles: return "zanyTriangles";
- case NS_ooxml::LN_Value_ST_Border_zigZag: return "zigZag";
- case NS_ooxml::LN_Value_ST_Border_zigZagStitch: return "zigZagStitch";
- default: break;
- }
- return OUString();
-}
-
-OUString TDefTableHandler::getThemeColorTypeString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_Value_St_ThemeColor_dark1: return "dark1";
- case NS_ooxml::LN_Value_St_ThemeColor_light1: return "light1";
- case NS_ooxml::LN_Value_St_ThemeColor_dark2: return "dark2";
- case NS_ooxml::LN_Value_St_ThemeColor_light2: return "light2";
- case NS_ooxml::LN_Value_St_ThemeColor_accent1: return "accent1";
- case NS_ooxml::LN_Value_St_ThemeColor_accent2: return "accent2";
- case NS_ooxml::LN_Value_St_ThemeColor_accent3: return "accent3";
- case NS_ooxml::LN_Value_St_ThemeColor_accent4: return "accent4";
- case NS_ooxml::LN_Value_St_ThemeColor_accent5: return "accent5";
- case NS_ooxml::LN_Value_St_ThemeColor_accent6: return "accent6";
- case NS_ooxml::LN_Value_St_ThemeColor_hyperlink: return "hyperlink";
- case NS_ooxml::LN_Value_St_ThemeColor_followedHyperlink: return "followedHyperlink";
- case NS_ooxml::LN_Value_St_ThemeColor_none: return "none";
- case NS_ooxml::LN_Value_St_ThemeColor_background1: return "background1";
- case NS_ooxml::LN_Value_St_ThemeColor_text1: return "text1";
- case NS_ooxml::LN_Value_St_ThemeColor_background2: return "background2";
- case NS_ooxml::LN_Value_St_ThemeColor_text2: return "text2";
- default: break;
- }
- return OUString();
-}
-
-model::ThemeColorType TDefTableHandler::getThemeColorTypeIndex(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_Value_St_ThemeColor_dark1:
- return model::ThemeColorType::Dark1;
- case NS_ooxml::LN_Value_St_ThemeColor_light1:
- return model::ThemeColorType::Light1;
- case NS_ooxml::LN_Value_St_ThemeColor_dark2:
- return model::ThemeColorType::Dark2;
- case NS_ooxml::LN_Value_St_ThemeColor_light2:
- return model::ThemeColorType::Light2;
- case NS_ooxml::LN_Value_St_ThemeColor_accent1:
- return model::ThemeColorType::Accent1;
- case NS_ooxml::LN_Value_St_ThemeColor_accent2:
- return model::ThemeColorType::Accent2;
- case NS_ooxml::LN_Value_St_ThemeColor_accent3:
- return model::ThemeColorType::Accent3;
- case NS_ooxml::LN_Value_St_ThemeColor_accent4:
- return model::ThemeColorType::Accent4;
- case NS_ooxml::LN_Value_St_ThemeColor_accent5:
- return model::ThemeColorType::Accent5;
- case NS_ooxml::LN_Value_St_ThemeColor_accent6:
- return model::ThemeColorType::Accent6;
- case NS_ooxml::LN_Value_St_ThemeColor_hyperlink:
- return model::ThemeColorType::Hyperlink;
- case NS_ooxml::LN_Value_St_ThemeColor_followedHyperlink:
- return model::ThemeColorType::FollowedHyperlink;
- case NS_ooxml::LN_Value_St_ThemeColor_none:
- return model::ThemeColorType::Unknown;
- case NS_ooxml::LN_Value_St_ThemeColor_background1:
- return model::ThemeColorType::Light1;
- case NS_ooxml::LN_Value_St_ThemeColor_text1:
- return model::ThemeColorType::Dark1;
- case NS_ooxml::LN_Value_St_ThemeColor_background2:
- return model::ThemeColorType::Light2;
- case NS_ooxml::LN_Value_St_ThemeColor_text2:
- return model::ThemeColorType::Dark2;
- default:
- break;
- }
- return model::ThemeColorType::Unknown;
-}
-
-model::ThemeColorUsage TDefTableHandler::getThemeColorUsage(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_Value_St_ThemeColor_background1:
- case NS_ooxml::LN_Value_St_ThemeColor_background2:
- return model::ThemeColorUsage::Background;
- case NS_ooxml::LN_Value_St_ThemeColor_text1:
- case NS_ooxml::LN_Value_St_ThemeColor_text2:
- return model::ThemeColorUsage::Text;
- default:
- break;
- }
- return model::ThemeColorUsage::Unknown;
-}
-
-void TDefTableHandler::lcl_attribute(Id rName, Value & rVal)
-{
- sal_Int32 nIntValue = rVal.getInt();
- switch( rName )
- {
- case NS_ooxml::LN_CT_Border_sz:
- // width of a single line in 1/8 pt, max of 32 pt -> twip * 5 / 2.
- m_nLineWidth = nIntValue * 5 / 2;
- appendGrabBag("sz", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Border_val:
- m_nLineType = nIntValue;
- appendGrabBag("val", TDefTableHandler::getBorderTypeString(nIntValue));
- break;
- case NS_ooxml::LN_CT_Border_color:
- appendGrabBag("color", msfilter::util::ConvertColorOU(Color(ColorTransparency,nIntValue)));
- m_nLineColor = nIntValue;
- break;
- case NS_ooxml::LN_CT_Border_space:
- appendGrabBag("space", OUString::number(nIntValue));
- break;
- case NS_ooxml::LN_CT_Border_shadow:
- //if 1 then line has shadow - unsupported
- case NS_ooxml::LN_CT_Border_frame:
- // ignored
- break;
- case NS_ooxml::LN_CT_Border_themeColor:
- appendGrabBag("themeColor", TDefTableHandler::getThemeColorTypeString(nIntValue));
- m_eThemeColorType = TDefTableHandler::getThemeColorTypeIndex(nIntValue);
- break;
- case NS_ooxml::LN_CT_Border_themeTint:
- m_nThemeTint = nIntValue;
- break;
- case NS_ooxml::LN_CT_Border_themeShade:
- m_nThemeShade = nIntValue;
- break;
- default:
- OSL_FAIL("unknown attribute");
- }
-}
-
-
-void TDefTableHandler::localResolve(Id rName, const writerfilter::Reference<Properties>::Pointer_t& pProperties)
-{
- if( !pProperties )
- return;
-
- m_nLineWidth = m_nLineType = m_nLineColor = 0;
- std::vector<beans::PropertyValue> aSavedGrabBag;
- if (!m_aInteropGrabBagName.isEmpty())
- {
- aSavedGrabBag = m_aInteropGrabBag;
- m_aInteropGrabBag.clear();
- }
- pProperties->resolve( *this );
- table::BorderLine2 aBorderLine;
- ConversionHelper::MakeBorderLine(m_nLineWidth, m_nLineType, m_nLineColor, aBorderLine, /*bIsOOXML=*/true);
- const bool rtl = false; // TODO
- switch( rName )
- {
- case NS_ooxml::LN_CT_TcBorders_top:
- m_aTopBorderLines.push_back(aBorderLine);
- if (!m_aInteropGrabBagName.isEmpty())
- aSavedGrabBag.push_back(getInteropGrabBag("top"));
- break;
- case NS_ooxml::LN_CT_TcBorders_start:
- if( rtl )
- m_aRightBorderLines.push_back(aBorderLine);
- else
- m_aLeftBorderLines.push_back(aBorderLine);
- if (!m_aInteropGrabBagName.isEmpty())
- aSavedGrabBag.push_back(getInteropGrabBag("start"));
- break;
- case NS_ooxml::LN_CT_TcBorders_left:
- m_aLeftBorderLines.push_back(aBorderLine);
- if (!m_aInteropGrabBagName.isEmpty())
- aSavedGrabBag.push_back(getInteropGrabBag("left"));
- break;
- case NS_ooxml::LN_CT_TcBorders_bottom:
- m_aBottomBorderLines.push_back(aBorderLine);
- if (!m_aInteropGrabBagName.isEmpty())
- aSavedGrabBag.push_back(getInteropGrabBag("bottom"));
- break;
- case NS_ooxml::LN_CT_TcBorders_end:
- if( rtl )
- m_aLeftBorderLines.push_back(aBorderLine);
- else
- m_aRightBorderLines.push_back(aBorderLine);
- if (!m_aInteropGrabBagName.isEmpty())
- aSavedGrabBag.push_back(getInteropGrabBag("end"));
- break;
- case NS_ooxml::LN_CT_TcBorders_right:
- m_aRightBorderLines.push_back(aBorderLine);
- if (!m_aInteropGrabBagName.isEmpty())
- aSavedGrabBag.push_back(getInteropGrabBag("right"));
- break;
- case NS_ooxml::LN_CT_TcBorders_insideH:
- m_aInsideHBorderLines.push_back(aBorderLine);
- if (!m_aInteropGrabBagName.isEmpty())
- aSavedGrabBag.push_back(getInteropGrabBag("insideH"));
- break;
- case NS_ooxml::LN_CT_TcBorders_insideV:
- m_aInsideVBorderLines.push_back(aBorderLine);
- if (!m_aInteropGrabBagName.isEmpty())
- aSavedGrabBag.push_back(getInteropGrabBag("insideV"));
- break;
- case NS_ooxml::LN_CT_TcBorders_tl2br:
- if (!m_aInteropGrabBagName.isEmpty())
- aSavedGrabBag.push_back(getInteropGrabBag("tl2br"));
- break;
- case NS_ooxml::LN_CT_TcBorders_tr2bl:
- if (!m_aInteropGrabBagName.isEmpty())
- aSavedGrabBag.push_back(getInteropGrabBag("tr2bl"));
- break;
- default:;
- }
- if (!m_aInteropGrabBagName.isEmpty())
- m_aInteropGrabBag = aSavedGrabBag;
-}
-
-
-void TDefTableHandler::lcl_sprm(Sprm & rSprm)
-{
- switch( rSprm.getId() )
- {
- case NS_ooxml::LN_CT_TcBorders_top:
- case NS_ooxml::LN_CT_TcBorders_left:
- case NS_ooxml::LN_CT_TcBorders_start:
- case NS_ooxml::LN_CT_TcBorders_bottom:
- case NS_ooxml::LN_CT_TcBorders_right:
- case NS_ooxml::LN_CT_TcBorders_end:
- case NS_ooxml::LN_CT_TcBorders_insideH:
- case NS_ooxml::LN_CT_TcBorders_insideV:
- case NS_ooxml::LN_CT_TcBorders_tl2br:
- case NS_ooxml::LN_CT_TcBorders_tr2bl:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- localResolve( rSprm.getId(), pProperties );
- }
- break;
- default:;
- }
-}
-
-void TDefTableHandler::fillCellProperties( const ::tools::SvRef< TablePropertyMap >& pCellProperties ) const
-{
- if( !m_aTopBorderLines.empty() )
- pCellProperties->Insert( PROP_TOP_BORDER, uno::Any( m_aTopBorderLines[0] ) );
- if( !m_aLeftBorderLines.empty() )
- pCellProperties->Insert( PROP_LEFT_BORDER, uno::Any( m_aLeftBorderLines[0] ) );
- if( !m_aBottomBorderLines.empty() )
- pCellProperties->Insert( PROP_BOTTOM_BORDER, uno::Any( m_aBottomBorderLines[0] ) );
- if( !m_aRightBorderLines.empty() )
- pCellProperties->Insert( PROP_RIGHT_BORDER, uno::Any( m_aRightBorderLines[0] ) );
- if( !m_aInsideHBorderLines.empty() )
- pCellProperties->Insert( META_PROP_HORIZONTAL_BORDER, uno::Any( m_aInsideHBorderLines[0] ) );
- if( !m_aInsideVBorderLines.empty() )
- pCellProperties->Insert( META_PROP_VERTICAL_BORDER, uno::Any( m_aInsideVBorderLines[0] ) );
-
- if (m_eThemeColorType != model::ThemeColorType::Unknown)
- {
- model::ComplexColor aComplexColor;
- aComplexColor.setThemeColor(m_eThemeColorType);
-
- if (m_nThemeTint > 0 )
- {
- sal_Int16 nTint = sal_Int16((255.0 - m_nThemeTint) * 10000.0 / 255.0);
- aComplexColor.addTransformation({model::TransformationType::Tint, nTint});
- }
- if (m_nThemeShade > 0)
- {
- sal_Int16 nShade = sal_Int16((255.0 - m_nThemeShade) * 10000.0 / 255.0);
- aComplexColor.addTransformation({model::TransformationType::Shade, nShade});
- }
- }
-}
-
-
-void TDefTableHandler::enableInteropGrabBag(const OUString& aName)
-{
- m_aInteropGrabBagName = aName;
-}
-
-beans::PropertyValue TDefTableHandler::getInteropGrabBag(const OUString& aName)
-{
- beans::PropertyValue aRet;
- if (aName.isEmpty())
- aRet.Name = m_aInteropGrabBagName;
- else
- aRet.Name = aName;
-
- aRet.Value <<= comphelper::containerToSequence(m_aInteropGrabBag);
- m_aInteropGrabBag.clear();
- return aRet;
-}
-
-void TDefTableHandler::appendGrabBag(const OUString& aKey, const OUString& aValue)
-{
- beans::PropertyValue aProperty;
- aProperty.Name = aKey;
- aProperty.Value <<= aValue;
- m_aInteropGrabBag.push_back(aProperty);
-}
-
-} //namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TDefTableHandler.hxx b/writerfilter/source/dmapper/TDefTableHandler.hxx
deleted file mode 100644
index 7b02d4ae0907..000000000000
--- a/writerfilter/source/dmapper/TDefTableHandler.hxx
+++ /dev/null
@@ -1,82 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include "LoggedResources.hxx"
-#include <vector>
-#include <docmodel/theme/ThemeColorType.hxx>
-#include <docmodel/color/ComplexColor.hxx>
-
-namespace com::sun::star{
- namespace table {
- struct BorderLine2;
- }
- namespace beans {
- struct PropertyValue;
- }
-}
-
-namespace writerfilter::dmapper
-{
-class PropertyMap;
-class TablePropertyMap;
-class TDefTableHandler : public LoggedProperties
-{
- std::vector<css::table::BorderLine2> m_aLeftBorderLines;
- std::vector<css::table::BorderLine2> m_aRightBorderLines;
- std::vector<css::table::BorderLine2> m_aTopBorderLines;
- std::vector<css::table::BorderLine2> m_aBottomBorderLines;
- std::vector<css::table::BorderLine2> m_aInsideHBorderLines;
- std::vector<css::table::BorderLine2> m_aInsideVBorderLines;
-
- //values of the current border
- sal_Int32 m_nLineWidth;
- sal_Int32 m_nLineType;
- sal_Int32 m_nLineColor;
-
- model::ThemeColorType m_eThemeColorType = model::ThemeColorType::Unknown;
- sal_Int32 m_nThemeShade = 0;
- sal_Int32 m_nThemeTint = 0;
-
- OUString m_aInteropGrabBagName;
- std::vector<css::beans::PropertyValue> m_aInteropGrabBag;
- void appendGrabBag(const OUString& aKey, const OUString& aValue);
-
- void localResolve(Id Name, const writerfilter::Reference<Properties>::Pointer_t& pProperties);
-
- // Properties
- virtual void lcl_attribute(Id Name, Value & val) override;
- virtual void lcl_sprm(Sprm & sprm) override;
-
-public:
- TDefTableHandler();
- virtual ~TDefTableHandler() override;
-
- void fillCellProperties( const ::tools::SvRef< TablePropertyMap >& pCellProperties) const;
- void enableInteropGrabBag(const OUString& aName);
- css::beans::PropertyValue getInteropGrabBag(const OUString& aName = OUString());
-
- static OUString getBorderTypeString(sal_Int32 nType);
- static OUString getThemeColorTypeString(sal_Int32 nType);
- static model::ThemeColorType getThemeColorTypeIndex(sal_Int32 nType);
- static model::ThemeColorUsage getThemeColorUsage(sal_Int32 nType);
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TableData.hxx b/writerfilter/source/dmapper/TableData.hxx
deleted file mode 100644
index ded929696e5a..000000000000
--- a/writerfilter/source/dmapper/TableData.hxx
+++ /dev/null
@@ -1,419 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include <com/sun/star/text/XTextRange.hpp>
-
-#include "PropertyMap.hxx"
-
-#include <utility>
-#include <vector>
-
-namespace writerfilter::dmapper
-{
-
-/**
- Class containing the data to describe a table cell.
- */
-class CellData final : public virtual SvRefBase
-{
- /**
- Handle to start of cell.
- */
- css::uno::Reference<css::text::XTextRange> mStart;
-
- /**
- Handle to end of cell.
- */
- css::uno::Reference<css::text::XTextRange> mEnd;
-
- /**
- Pointer to properties of cell.
- */
- TablePropertyMapPtr mpProps;
-
- bool mbOpen;
-
- sal_uInt32 m_nGridSpan; ///< number of grid columns in the parent table's table grid which this cell defines
-
-public:
- typedef tools::SvRef<CellData> Pointer_t;
-
- CellData(css::uno::Reference<css::text::XTextRange> const & start, TablePropertyMapPtr pProps)
- : mStart(start), mEnd(start), mpProps(std::move(pProps)), mbOpen(true)
- , m_nGridSpan(1)
- {
- }
-
- /**
- Set the end handle of a cell.
-
- @param end the end handle of the cell
- */
- void setEnd(css::uno::Reference<css::text::XTextRange> const & end) { mEnd = end; mbOpen = false; }
-
- /**
- Adds properties to the cell.
-
- @param pProps the properties to add
- */
- void insertProperties(TablePropertyMapPtr pProps)
- {
- if( mpProps )
- mpProps->InsertProps(pProps.get());
- else
- mpProps = pProps;
- }
-
- /**
- Return start handle of the cell.
- */
- const css::uno::Reference<css::text::XTextRange>& getStart() const { return mStart; }
-
- /**
- Return end handle of the cell.
- */
- const css::uno::Reference<css::text::XTextRange>& getEnd() const { return mEnd; }
-
- /**
- Return properties of the cell.
- */
- const TablePropertyMapPtr& getProperties() const { return mpProps; }
-
- bool isOpen() const { return mbOpen; }
-
- sal_uInt32 getGridSpan() const { return m_nGridSpan; }
- void setGridSpan( sal_uInt32 nSpan ) { m_nGridSpan = nSpan; }
-
- void SetStart(const css::uno::Reference<css::text::XTextRange>& xStart) { mStart = xStart; }
-
- bool IsValid() const;
-};
-
-/**
- Class to handle data of a table row.
- */
-class RowData final : public virtual SvRefBase
-{
- typedef ::std::vector<CellData::Pointer_t> Cells;
-
- /**
- the cell data of the row
- */
- Cells mCells;
-
- /**
- the properties of the row
- */
- mutable TablePropertyMapPtr mpProperties;
-
- sal_uInt32 m_nGridBefore; ///< number of grid columns in the parent table's table grid which must be skipped before the contents of this table row are added to the parent table
- sal_uInt32 m_nGridAfter; ///< number of grid columns in the parent table's table grid which shall be left after the last cell in the table row
-
-public:
- typedef tools::SvRef<RowData> Pointer_t;
-
- RowData()
- : m_nGridBefore(0)
- , m_nGridAfter(0)
- {
- }
-
- RowData(const RowData& rRowData)
- : SvRefBase(), mCells(rRowData.mCells), mpProperties(rRowData.mpProperties)
- , m_nGridBefore(rRowData.m_nGridBefore)
- , m_nGridAfter(rRowData.m_nGridAfter)
- {
- }
-
- /**
- Add a cell to the row.
-
- @param start the start handle of the cell
- @param end the end handle of the cell
- @param pProps the properties of the cell
- @param bAddBefore true: add an empty cell at beginning of the row for gridBefore
- */
- void addCell(const css::uno::Reference<css::text::XTextRange>& start, const TablePropertyMapPtr& pProps, bool bAddBefore = false)
- {
- CellData::Pointer_t pCellData(new CellData(start, pProps));
- if (bAddBefore)
- {
- mCells.insert(mCells.begin(), pCellData);
- mCells[0]->setEnd(start);
- }
- else
- mCells.push_back(pCellData);
- }
-
- void endCell(const css::uno::Reference<css::text::XTextRange>& end)
- {
- if (mCells.size() > 0)
- mCells.back()->setEnd(end);
- }
-
- bool isCellOpen() const
- {
- return mCells.size() > 0 && mCells.back()->isOpen();
- }
-
- void SetCellStart(const css::uno::Reference<css::text::XTextRange>& xStart)
- {
- if (mCells.empty())
- {
- return;
- }
-
- mCells.back()->SetStart(xStart);
- }
-
- bool IsCellValid() const
- {
- return !mCells.empty() && mCells.back()->IsValid();
- }
-
- /**
- Add properties to the row.
-
- @param pProperties the properties to set
- */
- void insertProperties(TablePropertyMapPtr pProperties)
- {
- if( pProperties )
- {
- if( !mpProperties )
- mpProperties = pProperties;
- else
- mpProperties->InsertProps(pProperties.get());
- }
- }
-
- /**
- Add properties to the last cell of the row.
- */
- void insertCellProperties(const TablePropertyMapPtr& pProps)
- {
- if (!mCells.empty())
- mCells.back()->insertProperties(pProps);
- }
-
- /**
- Return number of cells in the row.
- */
- unsigned int getCellCount() const
- {
- return mCells.size();
- }
-
- /**
- Return start handle of a cell in the row.
-
- @param i index of the cell
- */
- const css::uno::Reference<css::text::XTextRange>& getCellStart(unsigned int i) const
- {
- return mCells[i]->getStart();
- }
-
- /**
- Return end handle of a cell in the row.
-
- @param i index of the cell
- */
- const css::uno::Reference<css::text::XTextRange>& getCellEnd(unsigned int i) const
- {
- return mCells[i]->getEnd();
- }
-
- /**
- Return the properties of a cell in the row.
-
- @param i index of the cell
- */
- TablePropertyMapPtr const & getCellProperties(unsigned int i) const
- {
- return mCells[i]->getProperties();
- }
-
- /**
- Return properties of the row.
- */
- const TablePropertyMapPtr& getProperties() const
- {
- return mpProperties;
- }
-
- sal_uInt32 getGridBefore() const { return m_nGridBefore; }
- void setGridBefore(sal_uInt32 nSkipGrids) { m_nGridBefore = nSkipGrids; }
- sal_uInt32 getGridAfter() const { return m_nGridAfter; }
- void setGridAfter(sal_uInt32 nSkipGrids) { m_nGridAfter = nSkipGrids; }
- sal_uInt32 getGridSpan(sal_uInt32 i) { return mCells[i]->getGridSpan(); }
- std::vector< sal_uInt32 > getGridSpans()
- {
- std::vector< sal_uInt32 > nRet;
- for (auto const& aCell: mCells)
- nRet.push_back(aCell->getGridSpan());
- return nRet;
- }
- void setCurrentGridSpan(sal_uInt32 nSpan, bool bFirstCell = false)
- {
- if ( mCells.size() )
- {
- if ( bFirstCell )
- mCells.front()->setGridSpan(nSpan);
- else
- mCells.back()->setGridSpan(nSpan);
- }
- }
-};
-
-/**
- Class that holds the data of a table.
- */
-class TableData : public virtual SvRefBase
-{
- typedef ::std::vector<RowData::Pointer_t> Rows;
-
- /**
- the data of the rows of the table
- */
- Rows mRows;
-
- /**
- pointer to the data of the current row (while building up the table data).
- */
- RowData::Pointer_t mpRow;
-
- /**
- depth of the current table in a hierarchy of tables
- */
- unsigned int mnDepth;
-
- /**
- initialize mpRow
- */
- void newRow() { mpRow = RowData::Pointer_t(new RowData()); }
-
-public:
- typedef tools::SvRef<TableData> Pointer_t;
-
- explicit TableData(unsigned int nDepth) : mnDepth(nDepth) { newRow(); }
-
- /**
- End the current row.
-
- Sets properties of the current row and pushes the row to the
- back of the rows currently contained in the table.
-
- @param pProperties properties of the row to be ended
- */
- void endRow(const TablePropertyMapPtr& pProperties)
- {
- mpRow->insertProperties(pProperties);
- mRows.push_back(mpRow);
- newRow();
- }
-
- /**
- Add a cell to the current row.
-
- @param start start handle of the cell
- @param end end handle of the cell
- @param pProps properties of the cell
- */
- void addCell(const css::uno::Reference<css::text::XTextRange>& start, const TablePropertyMapPtr& pProps)
- {
- mpRow->addCell(start, pProps);
- }
-
- /**
- End the current cell of the current row.
-
- @parm end end handle of the cell
- */
- void endCell(const css::uno::Reference<css::text::XTextRange>& end)
- {
- mpRow->endCell(end);
- }
-
- /**
- Return if the current cell of the current row is open.
- */
- bool isCellOpen() const
- {
- return mpRow->isCellOpen();
- }
-
- void SetCellStart(const css::uno::Reference<css::text::XTextRange>& xStart)
- {
- mpRow->SetCellStart(xStart);
- }
-
- bool IsCellValid() const
- {
- return mpRow->IsCellValid();
- }
-
- /**
- Insert properties to the current cell of the current row.
-
- @param pProps the properties to add
- */
- void insertCellProperties(const TablePropertyMapPtr& pProps)
- {
- mpRow->insertCellProperties(pProps);
- }
-
- /**
- Return number of rows in the table.
- */
- unsigned int getRowCount() const
- {
- return mRows.size();
- }
-
- /**
- Return depth of table in surrounding table hierarchy.
- */
- unsigned int getDepth() const
- {
- return mnDepth;
- }
-
- /**
- Return row data of a certain row.
-
- @param i index of the row
- */
- RowData::Pointer_t const & getRow(unsigned int i) const
- {
- return mRows[i];
- }
-
- const RowData::Pointer_t& getCurrentRow() const
- {
- return mpRow;
- }
-};
-
-}
-
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TableManager.cxx b/writerfilter/source/dmapper/TableManager.cxx
deleted file mode 100644
index 6a0c70a39f52..000000000000
--- a/writerfilter/source/dmapper/TableManager.cxx
+++ /dev/null
@@ -1,686 +0,0 @@
-/* -*- 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/.
- *
- * 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 "TableManager.hxx"
-#include <ooxml/resourceids.hxx>
-#include "TagLogger.hxx"
-#include "DomainMapperTableHandler.hxx"
-#include "DomainMapper_Impl.hxx"
-#include "util.hxx"
-
-#include <comphelper/diagnose_ex.hxx>
-
-using namespace com::sun::star;
-
-namespace writerfilter::dmapper
-{
-void TableManager::clearData() {}
-
-void TableManager::openCell(const css::uno::Reference<css::text::XTextRange>& rHandle,
- const TablePropertyMapPtr& pProps)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablemanager.openCell");
- TagLogger::getInstance().chars(XTextRangeToString(rHandle));
- TagLogger::getInstance().endElement();
-#endif
-
- if (!mTableDataStack.empty())
- {
- TableData::Pointer_t pTableData = mTableDataStack.back();
-
- pTableData->addCell(rHandle, pProps);
- }
-}
-
-bool TableManager::isIgnore() const { return isRowEnd(); }
-
-sal_uInt32 TableManager::getGridBefore(sal_uInt32 nRow)
-{
- if (!isInTable())
- {
- SAL_WARN("writerfilter", "TableManager::getGridBefore called while not in table");
- return 0;
- }
- if (nRow >= mTableDataStack.back()->getRowCount())
- return 0;
- return mTableDataStack.back()->getRow(nRow)->getGridBefore();
-}
-
-sal_uInt32 TableManager::getCurrentGridBefore()
-{
- return mTableDataStack.back()->getCurrentRow()->getGridBefore();
-}
-
-void TableManager::setCurrentGridBefore(sal_uInt32 nSkipGrids)
-{
- mTableDataStack.back()->getCurrentRow()->setGridBefore(nSkipGrids);
-}
-
-sal_uInt32 TableManager::getGridAfter(sal_uInt32 nRow)
-{
- if (!isInTable())
- {
- SAL_WARN("writerfilter", "TableManager::getGridAfter called while not in table");
- return 0;
- }
- if (nRow >= mTableDataStack.back()->getRowCount())
- return 0;
- return mTableDataStack.back()->getRow(nRow)->getGridAfter();
-}
-
-void TableManager::setCurrentGridAfter(sal_uInt32 nSkipGrids)
-{
- assert(isInTable());
- mTableDataStack.back()->getCurrentRow()->setGridAfter(nSkipGrids);
-}
-
-std::vector<sal_uInt32> TableManager::getCurrentGridSpans()
-{
- return mTableDataStack.back()->getCurrentRow()->getGridSpans();
-}
-
-void TableManager::setCurrentGridSpan(sal_uInt32 nGridSpan, bool bFirstCell)
-{
- mTableDataStack.back()->getCurrentRow()->setCurrentGridSpan(nGridSpan, bFirstCell);
-}
-
-sal_uInt32 TableManager::findColumn(const sal_uInt32 nRow, const sal_uInt32 nCell)
-{
- if (nRow >= mTableDataStack.back()->getRowCount())
- return SAL_MAX_UINT32;
-
- RowData::Pointer_t pRow = mTableDataStack.back()->getRow(nRow);
- if (!pRow || nCell < pRow->getGridBefore()
- || nCell >= pRow->getCellCount() - pRow->getGridAfter())
- {
- return SAL_MAX_UINT32;
- }
-
- // The gridSpans provide a one-based index, so add up all the spans of the PREVIOUS columns,
- // and that result will provide the first possible zero-based number for the desired column.
- sal_uInt32 nColumn = 0;
- for (sal_uInt32 n = 0; n < nCell; ++n)
- nColumn += pRow->getGridSpan(n);
- return nColumn;
-}
-
-sal_uInt32 TableManager::findColumnCell(const sal_uInt32 nRow, const sal_uInt32 nCol)
-{
- if (nRow >= mTableDataStack.back()->getRowCount())
- return SAL_MAX_UINT32;
-
- RowData::Pointer_t pRow = mTableDataStack.back()->getRow(nRow);
- if (!pRow || nCol < pRow->getGridBefore())
- return SAL_MAX_UINT32;
-
- sal_uInt32 nCell = 0;
- sal_uInt32 nGrids = 0;
- // The gridSpans give us a one-based index, but requested column is zero-based - so keep that in mind.
- const sal_uInt32 nMaxCell = pRow->getCellCount() - pRow->getGridAfter() - 1;
- for (const auto& rSpan : pRow->getGridSpans())
- {
- nGrids += rSpan;
- if (nCol < nGrids)
- return nCell;
-
- ++nCell;
- if (nCell > nMaxCell)
- break;
- }
- return SAL_MAX_UINT32; // must be in gridAfter or invalid column request
-}
-
-void TableManager::endOfRowAction() {}
-
-void TableManager::endOfCellAction() {}
-
-void TableManager::insertTableProps(const TablePropertyMapPtr& pProps)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablemanager.insertTableProps");
-#endif
-
- if (getTableProps() && getTableProps() != pProps)
- getTableProps()->InsertProps(pProps.get());
- else
- mState.setTableProps(pProps);
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-}
-
-void TableManager::insertRowProps(const TablePropertyMapPtr& pProps)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablemanager.insertRowProps");
-#endif
-
- if (getRowProps())
- getRowProps()->InsertProps(pProps.get());
- else
- mState.setRowProps(pProps);
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-}
-
-void TableManager::cellProps(const TablePropertyMapPtr& pProps)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablemanager.cellProps");
-#endif
-
- if (getCellProps())
- getCellProps()->InsertProps(pProps.get());
- else
- mState.setCellProps(pProps);
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-}
-
-void TableManager::tableExceptionProps(const TablePropertyMapPtr& pProps)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablemanager.tableExceptionProps");
-#endif
-
- if (getTableExceptionProps())
- getTableExceptionProps()->InsertProps(pProps.get());
- else
- mState.setTableExceptionProps(pProps);
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-}
-
-void TableManager::utext(const sal_Unicode* const data, std::size_t const len)
-{
- // optimization: cell/row end characters are the last characters in a run
-
- if (len > 0)
- {
- sal_Unicode const nChar = data[len - 1];
- if (nChar == 0x7)
- handle0x7();
- }
-}
-
-void TableManager::text(const sal_uInt8* data, std::size_t len)
-{
- // optimization: cell/row end characters are the last characters in a run
- if (len > 0 && data[len - 1] == 0x7)
- handle0x7();
-}
-
-void TableManager::handle0x7()
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablemanager.handle0x7");
-#endif
-
- if (mnTableDepthNew < 1)
- mnTableDepthNew = 1;
-
- if (isInCell())
- endCell();
- else
- endRow();
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-}
-
-bool TableManager::sprm(Sprm& rSprm)
-{
- bool bRet = true;
- switch (rSprm.getId())
- {
- case NS_ooxml::LN_tblDepth:
- {
- Value::Pointer_t pValue = rSprm.getValue();
-
- cellDepth(pValue->getInt());
- }
- break;
- case NS_ooxml::LN_inTbl:
- inCell();
- break;
- case NS_ooxml::LN_tblCell:
- endCell();
- break;
- case NS_ooxml::LN_tblRow:
- endRow();
- break;
- default:
- bRet = false;
- }
- return bRet;
-}
-
-void TableManager::closeCell(const css::uno::Reference<css::text::XTextRange>& rHandle)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablemanager.closeCell");
- TagLogger::getInstance().chars(XTextRangeToString(rHandle));
- TagLogger::getInstance().endElement();
-#endif
-
- if (!mTableDataStack.empty())
- {
- TableData::Pointer_t pTableData = mTableDataStack.back();
-
- pTableData->endCell(rHandle);
-
- if (mpTableDataHandler)
- mpTableDataHandler->getDomainMapperImpl().ClearPreviousParagraph();
- }
-}
-
-void TableManager::ensureOpenCell(const TablePropertyMapPtr& pProps)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablemanager.ensureOpenCell");
-#endif
-
- if (!mTableDataStack.empty())
- {
- TableData::Pointer_t pTableData = mTableDataStack.back();
-
- if (pTableData != nullptr)
- {
- if (!pTableData->isCellOpen())
- openCell(getHandle(), pProps);
- else
- pTableData->insertCellProperties(pProps);
- }
- }
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-}
-
-void TableManager::endParagraphGroup()
-{
- sal_Int32 nTableDepthDifference = mnTableDepthNew - mnTableDepth;
-
- TablePropertyMapPtr pEmptyProps;
-
- while (nTableDepthDifference > 0)
- {
- ensureOpenCell(pEmptyProps);
- startLevel();
-
- --nTableDepthDifference;
- }
- while (nTableDepthDifference < 0)
- {
- endLevel();
-
- ++nTableDepthDifference;
- }
-
- mnTableDepth = mnTableDepthNew;
-
- if (mnTableDepth <= 0)
- return;
-
- if (isRowEnd())
- {
- endOfRowAction();
- mTableDataStack.back()->endRow(getRowProps());
- mState.resetRowProps();
- }
-
- else if (isInCell())
- {
- ensureOpenCell(getCellProps());
-
- if (mState.isCellEnd())
- {
- endOfCellAction();
- closeCell(getHandle());
- }
- }
- mState.resetCellProps();
-}
-
-void TableManager::startParagraphGroup()
-{
- mState.resetCellSpecifics();
- mnTableDepthNew = 0;
-}
-
-void TableManager::resolveCurrentTable()
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablemanager.resolveCurrentTable");
-#endif
-
- if (mpTableDataHandler != nullptr)
- {
- try
- {
- TableData::Pointer_t pTableData = mTableDataStack.back();
-
- unsigned int nRows = pTableData->getRowCount();
-
- mpTableDataHandler->startTable(getTableProps());
-
- for (unsigned int nRow = 0; nRow < nRows; ++nRow)
- {
- RowData::Pointer_t pRowData = pTableData->getRow(nRow);
-
- unsigned int nCells = pRowData->getCellCount();
-
- mpTableDataHandler->startRow(pRowData->getProperties());
-
- for (unsigned int nCell = 0; nCell < nCells; ++nCell)
- {
- mpTableDataHandler->startCell(pRowData->getCellStart(nCell),
- pRowData->getCellProperties(nCell));
-
- mpTableDataHandler->endCell(pRowData->getCellEnd(nCell));
- }
-
- mpTableDataHandler->endRow();
- }
-
- mpTableDataHandler->endTable(mTableDataStack.size() - 1);
- }
- catch (css::uno::Exception const&)
- {
- TOOLS_WARN_EXCEPTION("writerfilter", "resolving of current table failed");
- }
- }
- mState.resetTableProps();
- clearData();
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-}
-
-void TableManager::endLevel()
-{
- uno::Reference<text::XTextCursor> xCursor;
- if (mpTableDataHandler != nullptr)
- {
- if (mTableDataStack.size() > 1)
- {
- // This is an inner table: create a cursor from the outer cell's start position, in case
- // that would become invalid during the current table resolution.
- TableData::Pointer_t pUpperTableData = mTableDataStack[mTableDataStack.size() - 2];
- RowData::Pointer_t pRow = pUpperTableData->getCurrentRow();
- unsigned int nCells = pRow->getCellCount();
- if (nCells > 0)
- {
- uno::Reference<text::XTextRange> xCellStart = pRow->getCellStart(nCells - 1);
- if (xCellStart.is())
- {
- try
- {
- xCursor = xCellStart->getText()->createTextCursorByRange(
- xCellStart->getStart());
- if (xCursor.is())
- {
- xCursor->goLeft(1, false);
- }
- }
- catch (const uno::RuntimeException&)
- {
- TOOLS_WARN_EXCEPTION(
- "writerfilter",
- "TableManager::endLevel: createTextCursorByRange() failed");
- }
- }
- }
- }
- resolveCurrentTable();
- }
-
- // Store the unfinished row as it will be used for the next table
- if (mbKeepUnfinishedRow)
- mpUnfinishedRow = mTableDataStack.back()->getCurrentRow();
- mState.endLevel();
- mTableDataStack.pop_back();
-
- TableData::Pointer_t pTableData;
-
- if (!mTableDataStack.empty())
- pTableData = mTableDataStack.back();
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablemanager.endLevel");
- TagLogger::getInstance().attribute("level", mTableDataStack.size());
-#endif
-
- if (pTableData != nullptr)
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().attribute("openCell", pTableData->isCellOpen() ? "yes" : "no");
-#endif
- if (pTableData->isCellOpen() && !pTableData->IsCellValid() && xCursor.is())
- {
- // The inner table is resolved and we have an outer table, but the currently opened
- // cell's start position is no longer valid. Try to move the cursor back to where it was
- // and update the cell start position accordingly.
- try
- {
- xCursor->goRight(1, false);
- pTableData->SetCellStart(xCursor->getStart());
- }
- catch (const uno::RuntimeException&)
- {
- TOOLS_WARN_EXCEPTION("writerfilter", "TableManager::endLevel: goRight() failed");
- }
- }
- }
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-}
-
-void TableManager::startLevel()
-{
-#ifdef DBG_UTIL
- TableData::Pointer_t pTableData;
-
- if (!mTableDataStack.empty())
- pTableData = mTableDataStack.back();
-
- TagLogger::getInstance().startElement("tablemanager.startLevel");
- TagLogger::getInstance().attribute("level", mTableDataStack.size());
-
- if (pTableData != nullptr)
- TagLogger::getInstance().attribute("openCell", pTableData->isCellOpen() ? "yes" : "no");
-
- TagLogger::getInstance().endElement();
-#endif
-
- TableData::Pointer_t pTableData2(new TableData(mTableDataStack.size()));
-
- // If we have an unfinished row stored here, then push it to the new TableData
- if (mpUnfinishedRow)
- {
- for (unsigned int i = 0; i < mpUnfinishedRow->getCellCount(); ++i)
- {
- pTableData2->addCell(mpUnfinishedRow->getCellStart(i),
- mpUnfinishedRow->getCellProperties(i));
- pTableData2->endCell(mpUnfinishedRow->getCellEnd(i));
- pTableData2->getCurrentRow()->setCurrentGridSpan(mpUnfinishedRow->getGridSpan(i));
- }
- pTableData2->getCurrentRow()->setGridBefore(mpUnfinishedRow->getGridBefore());
- pTableData2->getCurrentRow()->setGridAfter(mpUnfinishedRow->getGridAfter());
- mpUnfinishedRow.clear();
- }
-
- mTableDataStack.push_back(pTableData2);
- mState.startLevel();
-}
-
-bool TableManager::isInTable()
-{
- bool bInTable = false;
- if (!mTableDataStack.empty())
- bInTable = mTableDataStack.back()->getDepth() > 0;
- return bInTable;
-}
-
-void TableManager::handle(const css::uno::Reference<css::text::XTextRange>& rHandle)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablemanager.handle");
- TagLogger::getInstance().chars(XTextRangeToString(rHandle));
- TagLogger::getInstance().endElement();
-#endif
-
- setHandle(rHandle);
-}
-
-void TableManager::setHandler(const tools::SvRef<DomainMapperTableHandler>& pTableDataHandler)
-{
- mpTableDataHandler = pTableDataHandler;
-}
-
-void TableManager::endRow()
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("tablemanager.endRow");
-#endif
- TableData::Pointer_t pTableData = mTableDataStack.back();
-
- // Add borderless w:gridBefore cell(s) to the row
- sal_uInt32 nGridBefore = getCurrentGridBefore();
- if (pTableData && nGridBefore > 0 && pTableData->getCurrentRow()->getCellCount() > 0)
- {
- const css::uno::Reference<css::text::XTextRange>& xRowStart
- = pTableData->getCurrentRow()->getCellStart(0);
- if (xRowStart.is())
- {
- try
- {
- // valid TextRange for table creation (not a nested table)?
- xRowStart->getText()->createTextCursorByRange(xRowStart);
-
- for (unsigned int i = 0; i < nGridBefore; ++i)
- {
- css::table::BorderLine2 aBorderLine;
- aBorderLine.Color = 0;
- aBorderLine.InnerLineWidth = 0;
- aBorderLine.OuterLineWidth = 0;
- TablePropertyMapPtr pCellProperties(new TablePropertyMap);
- pCellProperties->Insert(PROP_TOP_BORDER, css::uno::Any(aBorderLine));
- pCellProperties->Insert(PROP_LEFT_BORDER, css::uno::Any(aBorderLine));
- pCellProperties->Insert(PROP_BOTTOM_BORDER, css::uno::Any(aBorderLine));
- pCellProperties->Insert(PROP_RIGHT_BORDER, css::uno::Any(aBorderLine));
- pTableData->getCurrentRow()->addCell(xRowStart, pCellProperties,
- /*bAddBefore=*/true);
- }
- }
- catch (css::uno::Exception const&)
- {
- // don't add gridBefore cells in not valid TextRange
- setCurrentGridBefore(0);
- setCurrentGridSpan(getCurrentGridSpans().front() + nGridBefore,
- /*bFirstCell=*/true);
- }
- }
- }
-
- setRowEnd(true);
-}
-
-void TableManager::endCell()
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("tablemanager.endCell");
-#endif
-
- setCellEnd(true);
-}
-
-void TableManager::inCell()
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("tablemanager.inCell");
-#endif
- setInCell(true);
-
- if (mnTableDepthNew < 1)
- mnTableDepthNew = 1;
-}
-
-void TableManager::cellDepth(sal_uInt32 nDepth)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("tablemanager.cellDepth");
- TagLogger::getInstance().attribute("depth", nDepth);
- TagLogger::getInstance().endElement();
-#endif
-
- mnTableDepthNew = nDepth;
-}
-
-void TableManager::setCellLastParaAfterAutospacing(bool bIsAfterAutospacing)
-{
- m_bCellLastParaAfterAutospacing = bIsAfterAutospacing;
-}
-
-TableManager::TableManager()
- : mnTableDepthNew(0)
- , mnTableDepth(0)
- , mbKeepUnfinishedRow(false)
-{
- setRowEnd(false);
- setInCell(false);
- setCellEnd(false);
- m_bCellLastParaAfterAutospacing = false;
-}
-
-TableManager::~TableManager() = default;
-
-bool CellData::IsValid() const
-{
- if (!mStart.is())
- {
- return false;
- }
-
- try
- {
- mStart->getStart();
- }
- catch (const uno::RuntimeException&)
- {
- return false;
- }
-
- return true;
-}
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TableManager.hxx b/writerfilter/source/dmapper/TableManager.hxx
deleted file mode 100644
index f98c992a3595..000000000000
--- a/writerfilter/source/dmapper/TableManager.hxx
+++ /dev/null
@@ -1,527 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include <memory>
-#include <stack>
-
-#include "PropertyMap.hxx"
-#include "TableData.hxx"
-
-#include <dmapper/resourcemodel.hxx>
-
-namespace writerfilter::dmapper
-{
-
-class DomainMapperTableHandler;
-
-/**
- The table manager.
-
- This class gets forwarded events from the tokenizer. It gathers the
- table data and after ending the table generates events for the
- table structure. The events have to be handles by a TableDataHandler.
-
- */
-class TableManager : public virtual SvRefBase
-{
- class TableManagerState final
- {
- /**
- properties of the current cell
- */
- TablePropertyMapPtr mpCellProps;
-
- /**
- properties of the current row
- */
- TablePropertyMapPtr mpRowProps;
-
- /**
- table exception properties of the current row
- */
- TablePropertyMapPtr mpTableExceptionProps;
-
- /**
- properties of the current table
- */
- std::stack<TablePropertyMapPtr> mTableProps;
-
- /**
- true if at the end of a row
- */
- bool mbRowEnd;
-
- /**
- true when in a cell
- */
- bool mbInCell;
-
- /**
- true when at the end of a cell
- */
- bool mbCellEnd;
-
- public:
- /**
- Constructor
- */
- TableManagerState()
- : mbRowEnd(false), mbInCell(false), mbCellEnd(false)
- {
- }
-
- void startLevel()
- {
- TablePropertyMapPtr pProps;
- mTableProps.push(pProps);
- }
-
- void endLevel()
- {
- mTableProps.pop();
- }
-
- /**
- Reset to initial state at beginning of row.
- */
- void resetCellSpecifics()
- {
- mbRowEnd = false;
- mbInCell = false;
- mbCellEnd = false;
- }
-
- void resetCellProps()
- {
- // copy tblPrEx table exception properties, if they exist
- if (getTableExceptionProps().is())
- {
- mpCellProps = new TablePropertyMap;
- mpCellProps->InsertProps(getTableExceptionProps().get());
- }
- else
- mpCellProps.clear();
- }
-
- void setCellProps(const TablePropertyMapPtr& pProps)
- {
- mpCellProps = pProps;
- }
-
- const TablePropertyMapPtr& getCellProps() const
- {
- return mpCellProps;
- }
-
- void resetRowProps()
- {
- // reset also table exception and
- // its copy set by the previous resetCellProps()
- mpTableExceptionProps.clear();
- resetCellProps();
- mpRowProps.clear();
- }
-
- void setRowProps(const TablePropertyMapPtr& pProps)
- {
- mpRowProps = pProps;
- }
-
- const TablePropertyMapPtr& getRowProps() const
- {
- return mpRowProps;
- }
-
- void setTableExceptionProps(const TablePropertyMapPtr& pProps)
- {
- mpTableExceptionProps = pProps;
- // set table exception properties of the first cell
- resetCellProps();
- }
-
- const TablePropertyMapPtr& getTableExceptionProps() const
- {
- return mpTableExceptionProps;
- }
-
- void resetTableProps()
- {
- if (mTableProps.size() > 0)
- mTableProps.top().clear();
- }
-
- void setTableProps(const TablePropertyMapPtr& pProps)
- {
- if (mTableProps.size() > 0)
- mTableProps.top() = pProps;
- }
-
- TablePropertyMapPtr getTableProps()
- {
- TablePropertyMapPtr pResult;
-
- if (mTableProps.size() > 0)
- pResult = mTableProps.top();
-
- return pResult;
- }
-
- void setInCell(bool bInCell)
- {
- mbInCell = bInCell;
- }
-
- bool isInCell() const
- {
- return mbInCell;
- }
-
- void setCellEnd(bool bCellEnd)
- {
- mbCellEnd = bCellEnd;
- }
-
- bool isCellEnd() const
- {
- return mbCellEnd;
- }
-
- void setRowEnd(bool bRowEnd)
- {
- mbRowEnd = bRowEnd;
- }
-
- bool isRowEnd() const
- {
- return mbRowEnd;
- }
- };
-
- /**
- handle for the current position in document
- */
- css::uno::Reference<css::text::XTextRange> mCurHandle;
-
- TableManagerState mState;
-
-protected:
- TablePropertyMapPtr const & getCellProps() const
- {
- return mState.getCellProps();
- }
-
-public:
- TablePropertyMapPtr const & getRowProps() const
- {
- return mState.getRowProps();
- }
-
- TablePropertyMapPtr const & getTableExceptionProps() const
- {
- return mState.getTableExceptionProps();
- }
-
-protected:
- void setInCell(bool bInCell)
- {
- mState.setInCell(bInCell);
- }
-
- bool isInCell() const
- {
- return mState.isInCell();
- }
-
- void setCellEnd(bool bCellEnd)
- {
- mState.setCellEnd(bCellEnd);
- }
-
- void setRowEnd(bool bRowEnd)
- {
- mState.setRowEnd(bRowEnd);
- }
-
- bool isRowEnd() const
- {
- return mState.isRowEnd();
- }
-
- TablePropertyMapPtr getTableProps()
- {
- return mState.getTableProps();
- }
-
- const css::uno::Reference<css::text::XTextRange>& getHandle() const
- {
- return mCurHandle;
- }
-
- void setHandle(const css::uno::Reference<css::text::XTextRange>& rHandle)
- {
- mCurHandle = rHandle;
- }
-
-private:
- typedef tools::SvRef< css::uno::Reference<css::text::XTextRange> > T_p;
-
- /**
- depth of the current cell
- */
- sal_uInt32 mnTableDepthNew;
-
- /**
- depth of the previous cell
- */
- sal_uInt32 mnTableDepth;
-
- /**
- stack of table data
-
- for each level of nested tables there is one frame in the stack
- */
- std::vector<TableData::Pointer_t> mTableDataStack;
- RowData::Pointer_t mpUnfinishedRow;
- bool mbKeepUnfinishedRow;
-
- bool m_bCellLastParaAfterAutospacing;
-
- /**
- handler for resolveCurrentTable
- */
- tools::SvRef<DomainMapperTableHandler> mpTableDataHandler;
-
- /**
- Set flag which indicates the current handle is in a cell.
- */
- void inCell();
-
- /**
- Set flag which indicate the current handle is at the end of a cell.
- */
- void endCell();
-
- /**
- Set the table depth of the current cell.
-
- @param nDepth the cell depth
- */
- void cellDepth(sal_uInt32 nDepth);
-
- /**
- Set flag indication the current handle is at the end of a row.
- */
- void endRow();
-
- /**
- Resolve the current table to the TableDataHandler.
- */
- void resolveCurrentTable();
-
- /**
- Open a cell at current level.
- */
-
- void openCell(const css::uno::Reference<css::text::XTextRange>& rHandle, const TablePropertyMapPtr& pProps);
-
- /**
- Close a cell at current level.
- */
- void closeCell(const css::uno::Reference<css::text::XTextRange>& rHandle);
-
- /**
- Ensure a cell is open at the current level.
- */
- void ensureOpenCell(const TablePropertyMapPtr& pProps);
-
-protected:
- /**
- Return the current table difference, i.e. 1 if we are in the first cell of a new table, etc.
- */
- sal_Int32 getTableDepthDifference() const { return mnTableDepthNew - mnTableDepth; }
-
- sal_uInt32 getTableDepth() const { return mnTableDepthNew; }
-
- /**
- Action to be carried out at the end of the last paragraph of a
- cell.
- */
- virtual void endOfCellAction();
-
- /**
- Action to be carried out at the end of the "table row"
- paragraph.
- */
- virtual void endOfRowAction();
- /** let the derived class clear their table related data
- */
- virtual void clearData();
-
- /** Should we keep the unfinished row in endLevel to initialize the table
- data in the following startLevel.
- */
- void setKeepUnfinishedRow(bool bKeep)
- {
- mbKeepUnfinishedRow = bKeep;
- }
-
-
-public:
- TableManager();
- ~TableManager();
-
- /**
- Set handler for resolveCurrentTable.
-
- @param pTableDataHandler the handler
- */
- void setHandler(const tools::SvRef<DomainMapperTableHandler>& pTableDataHandler);
-
- /**
- Set the current handle.
-
- @param rHandle the handle
- */
- void handle(const css::uno::Reference<css::text::XTextRange>& rHandle);
-
- /**
- Start a new table level.
-
- A new context is pushed onto the table data stack,
- */
- virtual void startLevel();
-
- /**
- End a table level.
-
- The current table is resolved and the context is popped from
- the stack.
- */
- virtual void endLevel();
-
- /**
- * Signal that the next paragraph definitely won't be part of any table.
- */
- void endTable()
- {
- setRowEnd(false);
- }
-
- /**
- Tells whether a table has been started or not
- */
- bool isInTable();
-
- /**
- Handle the start of a paragraph group.
- */
- void startParagraphGroup();
-
- /**
- Handle the end of a paragraph group.
- */
- void endParagraphGroup();
-
- /**
- Handle an SPRM at current handle.
-
- @param rSprm the SPRM
- */
- virtual bool sprm(Sprm & rSprm);
-
- /**
- Handle occurrence of character 0x7.
- */
- void handle0x7();
-
- /**
- Handle 8 bit text at current handle.
-
- @param data array of characters
- @param len number of characters to handle
- */
- void text(const sal_uInt8 * data, size_t len);
-
- /**
- Handle 16 bit text at current handle.
-
- @param data array of characters
- @param len number of characters to handle
- */
- void utext(const sal_Unicode * data, size_t len);
-
- /**
- Handle properties of the current cell.
-
- @param pProps the properties
- */
- virtual void cellProps(const TablePropertyMapPtr& pProps);
-
- /**
- Handle properties of the current row.
-
- @param pProps the properties
- */
- virtual void insertRowProps(const TablePropertyMapPtr& pProps);
-
- /**
- Handle table exception properties of the current row.
-
- @param pProps the properties
- */
- virtual void tableExceptionProps(const TablePropertyMapPtr& pProps);
-
- /**
- Handle properties of the current table.
-
- @param pProps the properties
- */
- virtual void insertTableProps(const TablePropertyMapPtr& pProps);
-
- /**
- Return if table manager has detected paragraph to ignore.
-
- If this function returns true the current paragraph contains
- only control information, e.g. end of row.
- */
- bool isIgnore() const;
-
- sal_uInt32 getGridBefore(sal_uInt32 nRow);
- sal_uInt32 getCurrentGridBefore();
- void setCurrentGridBefore( sal_uInt32 nSkipGrids );
- sal_uInt32 getGridAfter(sal_uInt32 nRow);
- void setCurrentGridAfter( sal_uInt32 nSkipGrids );
- std::vector<sal_uInt32> getCurrentGridSpans();
- void setCurrentGridSpan( sal_uInt32 nGridSpan, bool bFirstCell = false );
- /// Given a zero-based row/cell, return the zero-based grid it belongs to, or SAL_MAX_UINT16 for invalid.
- sal_uInt32 findColumn( const sal_uInt32 nRow, const sal_uInt32 nCell );
- /// Given a zero-based row/col, return the zero-based cell describing that grid, or SAL_MAX_UINT16 for invalid.
- sal_uInt32 findColumnCell( const sal_uInt32 nRow, const sal_uInt32 nCol );
-
- void setCellLastParaAfterAutospacing(bool bIsAfterAutospacing);
- bool isCellLastParaAfterAutospacing() const {return m_bCellLastParaAfterAutospacing;}
-};
-
-}
-
-
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TablePositionHandler.cxx b/writerfilter/source/dmapper/TablePositionHandler.cxx
deleted file mode 100644
index 62d423d29515..000000000000
--- a/writerfilter/source/dmapper/TablePositionHandler.cxx
+++ /dev/null
@@ -1,160 +0,0 @@
-/* -*- 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 "TablePositionHandler.hxx"
-#include "ConversionHelper.hxx"
-#include "TagLogger.hxx"
-#include <ooxml/resourceids.hxx>
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <com/sun/star/text/HoriOrientation.hpp>
-#include <com/sun/star/text/VertOrientation.hpp>
-#include <com/sun/star/text/RelOrientation.hpp>
-#include <comphelper/sequenceashashmap.hxx>
-
-namespace writerfilter::dmapper
-{
-using namespace ::com::sun::star;
-
-TablePositionHandler::TablePositionHandler()
- : LoggedProperties("TablePositionHandler")
-{
-}
-
-TablePositionHandler::~TablePositionHandler() = default;
-
-void TablePositionHandler::lcl_attribute(Id nId, Value& rVal)
-{
- switch (nId)
- {
- case NS_ooxml::LN_CT_TblPPr_vertAnchor:
- m_aVertAnchor = rVal.getString();
- break;
- case NS_ooxml::LN_CT_TblPPr_tblpYSpec:
- m_aYSpec = rVal.getString();
- break;
- case NS_ooxml::LN_CT_TblPPr_horzAnchor:
- m_aHorzAnchor = rVal.getString();
- break;
- case NS_ooxml::LN_CT_TblPPr_tblpXSpec:
- m_aXSpec = rVal.getString();
- break;
- case NS_ooxml::LN_CT_TblPPr_tblpY:
- m_nY = rVal.getInt();
- break;
- case NS_ooxml::LN_CT_TblPPr_tblpX:
- m_nX = rVal.getInt();
- break;
- case NS_ooxml::LN_CT_TblPPr_leftFromText:
- m_nLeftFromText = rVal.getInt();
- break;
- case NS_ooxml::LN_CT_TblPPr_rightFromText:
- m_nRightFromText = rVal.getInt();
- break;
- case NS_ooxml::LN_CT_TblPPr_topFromText:
- m_nTopFromText = rVal.getInt();
- break;
- case NS_ooxml::LN_CT_TblPPr_bottomFromText:
- m_nBottomFromText = rVal.getInt();
- break;
- default:
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- break;
- }
-}
-
-void TablePositionHandler::lcl_sprm(Sprm& /*rSprm*/) {}
-
-uno::Sequence<beans::PropertyValue> TablePositionHandler::getTablePosition() const
-{
- comphelper::SequenceAsHashMap aFrameProperties;
-
- aFrameProperties["LeftBorderDistance"] <<= sal_Int32(0);
- aFrameProperties["RightBorderDistance"] <<= sal_Int32(0);
- aFrameProperties["TopBorderDistance"] <<= sal_Int32(0);
- aFrameProperties["BottomBorderDistance"] <<= sal_Int32(0);
-
- aFrameProperties["LeftMargin"] <<= ConversionHelper::convertTwipToMM100(m_nLeftFromText);
- aFrameProperties["RightMargin"] <<= ConversionHelper::convertTwipToMM100(m_nRightFromText);
- aFrameProperties["TopMargin"] <<= ConversionHelper::convertTwipToMM100(m_nTopFromText);
- aFrameProperties["BottomMargin"] <<= ConversionHelper::convertTwipToMM100(m_nBottomFromText);
-
- table::BorderLine2 aEmptyBorder;
- aFrameProperties["TopBorder"] <<= aEmptyBorder;
- aFrameProperties["BottomBorder"] <<= aEmptyBorder;
- aFrameProperties["LeftBorder"] <<= aEmptyBorder;
- aFrameProperties["RightBorder"] <<= aEmptyBorder;
-
- // Horizontal positioning
- sal_Int16 nHoriOrient = text::HoriOrientation::NONE;
- if (m_aXSpec == "center")
- nHoriOrient = text::HoriOrientation::CENTER;
- else if (m_aXSpec == "inside")
- nHoriOrient = text::HoriOrientation::INSIDE;
- else if (m_aXSpec == "left")
- nHoriOrient = text::HoriOrientation::LEFT;
- else if (m_aXSpec == "outside")
- nHoriOrient = text::HoriOrientation::OUTSIDE;
- else if (m_aXSpec == "right")
- nHoriOrient = text::HoriOrientation::RIGHT;
-
- sal_Int16 nHoriOrientRelation;
- if (m_aHorzAnchor == "margin")
- nHoriOrientRelation = text::RelOrientation::PAGE_PRINT_AREA;
- else if (m_aHorzAnchor == "page")
- nHoriOrientRelation = text::RelOrientation::PAGE_FRAME;
- else if (m_aHorzAnchor == "text")
- nHoriOrientRelation = text::RelOrientation::FRAME;
-
- aFrameProperties["HoriOrient"] <<= nHoriOrient;
- aFrameProperties["HoriOrientRelation"] <<= nHoriOrientRelation;
- aFrameProperties["HoriOrientPosition"] <<= ConversionHelper::convertTwipToMM100(m_nX);
-
- // Vertical positioning
- sal_Int16 nVertOrient = text::VertOrientation::NONE;
- if (m_aYSpec == "bottom")
- nVertOrient = text::VertOrientation::BOTTOM;
- else if (m_aYSpec == "center")
- nVertOrient = text::VertOrientation::CENTER;
- else if (m_aYSpec == "top")
- nVertOrient = text::VertOrientation::TOP;
- // TODO There are a few cases we can't map ATM.
-
- sal_Int16 nVertOrientRelation;
- if (m_aVertAnchor == "margin")
- nVertOrientRelation = text::RelOrientation::PAGE_PRINT_AREA;
- else if (m_aVertAnchor == "page")
- nVertOrientRelation = text::RelOrientation::PAGE_FRAME;
- else if (m_aVertAnchor == "text")
- nVertOrientRelation = text::RelOrientation::FRAME;
-
- aFrameProperties["VertOrient"] <<= nVertOrient;
- aFrameProperties["VertOrientRelation"] <<= nVertOrientRelation;
- aFrameProperties["VertOrientPosition"] <<= ConversionHelper::convertTwipToMM100(m_nY);
- aFrameProperties["FillTransparence"] <<= sal_Int32(100);
-
- if (m_nTableOverlap == NS_ooxml::LN_Value_ST_TblOverlap_never)
- {
- // NS_ooxml::LN_Value_ST_TblOverlap_overlap is the default, both in OOXML and in Writer.
- aFrameProperties["AllowOverlap"] <<= false;
- }
-
- return aFrameProperties.getAsConstPropertyValueList();
-}
-
-bool TablePositionHandler::operator==(const TablePositionHandler& rHandler) const
-{
- return m_aVertAnchor == rHandler.m_aVertAnchor && m_aYSpec == rHandler.m_aYSpec
- && m_aHorzAnchor == rHandler.m_aHorzAnchor && m_aXSpec == rHandler.m_aXSpec
- && m_nY == rHandler.m_nY && m_nX == rHandler.m_nX;
-}
-
-} // namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TablePositionHandler.hxx b/writerfilter/source/dmapper/TablePositionHandler.hxx
deleted file mode 100644
index 1b9d9c808391..000000000000
--- a/writerfilter/source/dmapper/TablePositionHandler.hxx
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- 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/.
- */
-#pragma once
-
-#include "LoggedResources.hxx"
-
-namespace com::sun::star::beans
-{
-struct PropertyValue;
-}
-
-namespace writerfilter::dmapper
-{
-/// Handler for floating table positioning
-class TablePositionHandler : public LoggedProperties
-{
- OUString m_aVertAnchor{ "margin" };
- OUString m_aYSpec;
- OUString m_aHorzAnchor{ "text" };
- OUString m_aXSpec;
- sal_Int32 m_nY = 0;
- sal_Int32 m_nX = 0;
- sal_Int32 m_nLeftFromText = 0;
- sal_Int32 m_nRightFromText = 0;
- sal_Int32 m_nTopFromText = 0;
- sal_Int32 m_nBottomFromText = 0;
- Id m_nTableOverlap = 0;
-
- // Properties
- void lcl_attribute(Id nId, Value& rVal) override;
- void lcl_sprm(Sprm& sprm) override;
-
-public:
- sal_Int32 getY() const { return m_nY; }
- sal_Int32 getX() const { return m_nX; }
- sal_Int32 getLeftFromText() const { return m_nLeftFromText; }
- sal_Int32 getRightFromText() const { return m_nRightFromText; }
- sal_Int32 getTopFromText() const { return m_nTopFromText; }
- sal_Int32 getBottomFromText() const { return m_nBottomFromText; }
-
- const OUString& getVertAnchor() const { return m_aVertAnchor; }
- const OUString& getYSpec() const { return m_aYSpec; }
- const OUString& getHorzAnchor() const { return m_aHorzAnchor; }
- const OUString& getXSpec() const { return m_aXSpec; }
-
- void setTableOverlap(Id nTableOverlap) { m_nTableOverlap = nTableOverlap; }
-
- TablePositionHandler();
- ~TablePositionHandler() override;
-
- /** Compute the UNO properties for the frame containing the table based
- on the received tokens.
-
- Note that the properties will need to be adjusted with the table
- properties before actually using them.
- */
- css::uno::Sequence<css::beans::PropertyValue> getTablePosition() const;
-
- bool operator==(const TablePositionHandler& rHandler) const;
-};
-
-using TablePositionHandlerPtr = tools::SvRef<TablePositionHandler>;
-} // namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TablePropertiesHandler.cxx b/writerfilter/source/dmapper/TablePropertiesHandler.cxx
deleted file mode 100644
index 8ea3eae5c056..000000000000
--- a/writerfilter/source/dmapper/TablePropertiesHandler.cxx
+++ /dev/null
@@ -1,398 +0,0 @@
-/* -*- 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/.
- *
- * 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 <sal/config.h>
-
-#include <string_view>
-
-#include "BorderHandler.hxx"
-#include "CellColorHandler.hxx"
-#include "CellMarginHandler.hxx"
-#include "ConversionHelper.hxx"
-#include "MeasureHandler.hxx"
-#include "TrackChangesHandler.hxx"
-#include "TablePropertiesHandler.hxx"
-#include "TagLogger.hxx"
-#include "TDefTableHandler.hxx"
-#include "DomainMapperTableManager.hxx"
-
-#include <ooxml/resourceids.hxx>
-
-#include <com/sun/star/text/VertOrientation.hpp>
-#include <oox/token/tokens.hxx>
-
-using namespace com::sun::star;
-using namespace oox;
-
-namespace writerfilter::dmapper {
-
- TablePropertiesHandler::TablePropertiesHandler() :
- m_pCurrentInteropGrabBag(nullptr),
- m_pTableManager( nullptr )
- {
- }
-
- bool TablePropertiesHandler::sprm(Sprm & rSprm)
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("TablePropertiesHandler.sprm");
- TagLogger::getInstance().attribute("sprm", rSprm.toString());
-#endif
-
- bool bRet = true;
- sal_uInt32 nSprmId = rSprm.getId();
- Value::Pointer_t pValue = rSprm.getValue();
- sal_Int32 nIntValue = (pValue ? pValue->getInt() : 0);
- switch( nSprmId )
- {
- case NS_ooxml::LN_CT_TrPrBase_jc:
- case NS_ooxml::LN_CT_TblPrBase_jc:
- {
- sal_Int16 nOrient = ConversionHelper::convertTableJustification( nIntValue );
- TablePropertyMapPtr pTableMap( new TablePropertyMap );
- pTableMap->setValue( TablePropertyMap::HORI_ORIENT, nOrient );
- insertTableProps( pTableMap );
- }
- break;
- case NS_ooxml::LN_CT_TrPrBase_trHeight:
- {
- //contains unit and value
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- { //contains attributes x2902 (LN_unit) and x17e2 (LN_trleft)
- MeasureHandlerPtr pMeasureHandler( new MeasureHandler );
- pProperties->resolve(*pMeasureHandler);
- TablePropertyMapPtr pPropMap( new TablePropertyMap );
-
- pPropMap->Insert( PROP_SIZE_TYPE, uno::Any( pMeasureHandler->GetRowHeightSizeType() ), false);
- pPropMap->Insert( PROP_HEIGHT, uno::Any(pMeasureHandler->getMeasureValue() ));
-
- insertRowProps(pPropMap);
- }
- }
- break;
- case NS_ooxml::LN_CT_TrPr_ins:
- case NS_ooxml::LN_CT_TrPr_del:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- sal_Int32 nToken = sal_Int32();
- switch( nSprmId )
- {
- case NS_ooxml::LN_CT_TrPr_ins:
- nToken = XML_tableRowInsert;
- break;
- case NS_ooxml::LN_CT_TrPr_del:
- nToken = XML_tableRowDelete;
- break;
- }
- auto pTrackChangesHandler = std::make_shared<TrackChangesHandler>( nToken );
- pProperties->resolve(*pTrackChangesHandler);
- TablePropertyMapPtr pPropMap( new TablePropertyMap );
-
- // Add the 'track changes' properties to the 'table row' via UNO.
- // This way - in the SW core - when it receives this - it will create a new 'Table Redline' object for that row
- uno::Sequence<beans::PropertyValue> aTableRedlineProperties = pTrackChangesHandler->getRedlineProperties();
- pPropMap->Insert( PROP_TABLE_REDLINE_PARAMS , uno::Any( aTableRedlineProperties ));
- insertRowProps(pPropMap);
- }
- }
- break;
- case NS_ooxml::LN_CT_TcPrBase_cellIns:
- case NS_ooxml::LN_CT_TcPrBase_cellDel:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- sal_Int32 nToken;
- switch( nSprmId )
- {
- case NS_ooxml::LN_CT_TcPrBase_cellIns:
- nToken = XML_tableCellInsert;
- break;
- case NS_ooxml::LN_CT_TcPrBase_cellDel:
- nToken = XML_tableCellDelete;
- break;
- default:
- throw lang::IllegalArgumentException("illegal redline token type", nullptr, 0);
- break;
- }
- auto pTrackChangesHandler = std::make_shared<TrackChangesHandler>( nToken );
- pProperties->resolve(*pTrackChangesHandler);
- TablePropertyMapPtr pPropMap( new TablePropertyMap );
-
- // Add the 'track changes' properties to the 'table row' via UNO.
- // This way - in the SW core - when it receives this - it will create a new 'Table Redline' object for that row
- uno::Sequence<beans::PropertyValue> aTableRedlineProperties = pTrackChangesHandler->getRedlineProperties();
- pPropMap->Insert( PROP_TABLE_REDLINE_PARAMS , uno::Any( aTableRedlineProperties ));
- cellProps(pPropMap);
- }
- }
- break;
- case NS_ooxml::LN_CT_TrPrBase_cantSplit:
- {
- //row can't break across pages if nIntValue == 1
- TablePropertyMapPtr pPropMap( new TablePropertyMap );
- pPropMap->Insert( PROP_IS_SPLIT_ALLOWED, uno::Any( nIntValue != 1 ) );
- insertRowProps(pPropMap);
- }
- break;
- case NS_ooxml::LN_CT_TcPrBase_vAlign:
- {
- sal_Int16 nVertOrient = text::VertOrientation::NONE;
- switch( nIntValue )
- {
- case NS_ooxml::LN_Value_ST_VerticalJc_center: nVertOrient = text::VertOrientation::CENTER; break;
- case NS_ooxml::LN_Value_ST_VerticalJc_bottom: nVertOrient = text::VertOrientation::BOTTOM; break;
- default:;
- }
- TablePropertyMapPtr pCellPropMap( new TablePropertyMap() );
- pCellPropMap->Insert( PROP_VERT_ORIENT, uno::Any( nVertOrient ) );
- //todo: in ooxml import the value of m_ncell is wrong
- cellProps( pCellPropMap );
- if (m_pCurrentInteropGrabBag)
- {
- OUString aVertOrient;
- switch( nIntValue )
- {
- case NS_ooxml::LN_Value_ST_VerticalJc_top: aVertOrient = "top"; break;
- case NS_ooxml::LN_Value_ST_VerticalJc_center: aVertOrient = "center"; break;
- case NS_ooxml::LN_Value_ST_VerticalJc_both: aVertOrient = "both"; break;
- case NS_ooxml::LN_Value_ST_VerticalJc_bottom: aVertOrient = "bottom"; break;
- }
- if (!aVertOrient.isEmpty())
- {
- beans::PropertyValue aValue;
- aValue.Name = "vAlign";
- aValue.Value <<= aVertOrient;
- m_pCurrentInteropGrabBag->push_back(aValue);
- }
- }
- }
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblBorders: //table borders, might be defined in table style
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- auto pBorderHandler = std::make_shared<BorderHandler>(true);
- if (m_pCurrentInteropGrabBag)
- pBorderHandler->enableInteropGrabBag("tblBorders");
- pProperties->resolve(*pBorderHandler);
- if (m_pCurrentInteropGrabBag)
- m_pCurrentInteropGrabBag->push_back(pBorderHandler->getInteropGrabBag());
- TablePropertyMapPtr pTablePropMap( new TablePropertyMap );
- pTablePropMap->InsertProps(pBorderHandler->getProperties());
-
-#ifdef DBG_UTIL
- pTablePropMap->dumpXml();
-#endif
- insertTableProps( pTablePropMap );
- }
- }
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblLayout:
- {
- DomainMapperTableManager* pManager = dynamic_cast<DomainMapperTableManager*>(m_pTableManager);
- if (pManager)
- pManager->SetLayoutType(static_cast<sal_uInt32>(nIntValue));
- }
- break;
- case NS_ooxml::LN_CT_TblPrEx_tblBorders:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties)
- {
- auto pBorderHandler = std::make_shared<BorderHandler>(true);
- pProperties->resolve(*pBorderHandler);
- TablePropertyMapPtr pTablePropMap( new TablePropertyMap );
- pTablePropMap->InsertProps(pBorderHandler->getProperties());
-
-#ifdef DBG_UTIL
- pTablePropMap->dumpXml();
-#endif
- tableExceptionProps( pTablePropMap );
- }
- }
- break;
- case NS_ooxml::LN_CT_TcPrBase_tcBorders ://cell borders
- //contains CT_TcBorders_left, right, top, bottom
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- //in OOXML there's one set of borders at each cell (if there is any)
- tools::SvRef< TDefTableHandler > pTDefTableHandler( new TDefTableHandler());
- if (m_pCurrentInteropGrabBag)
- pTDefTableHandler->enableInteropGrabBag("tcBorders");
- pProperties->resolve( *pTDefTableHandler );
- if (m_pCurrentInteropGrabBag)
- m_pCurrentInteropGrabBag->push_back(pTDefTableHandler->getInteropGrabBag());
- TablePropertyMapPtr pCellPropMap( new TablePropertyMap );
- pTDefTableHandler->fillCellProperties( pCellPropMap );
- cellProps( pCellPropMap );
- }
- }
- break;
- case NS_ooxml::LN_CT_TcPrBase_tcMar:
-
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- auto pCellMarginHandler = std::make_shared<CellMarginHandler>();
- if (m_pCurrentInteropGrabBag)
- pCellMarginHandler->enableInteropGrabBag("tcMar");
- pProperties->resolve(*pCellMarginHandler);
- if (m_pCurrentInteropGrabBag)
- m_pCurrentInteropGrabBag->push_back(pCellMarginHandler->getInteropGrabBag());
- TablePropertyMapPtr pCellProperties(new TablePropertyMap);
- if (pCellMarginHandler->m_bTopMarginValid)
- pCellProperties->Insert(PROP_TOP_BORDER_DISTANCE, uno::Any(pCellMarginHandler->m_nTopMargin));
- if (pCellMarginHandler->m_bLeftMarginValid)
- pCellProperties->Insert(PROP_LEFT_BORDER_DISTANCE, uno::Any(pCellMarginHandler->m_nLeftMargin));
- if (pCellMarginHandler->m_bBottomMarginValid)
- pCellProperties->Insert(PROP_BOTTOM_BORDER_DISTANCE, uno::Any(pCellMarginHandler->m_nBottomMargin));
- if (pCellMarginHandler->m_bRightMarginValid)
- pCellProperties->Insert(PROP_RIGHT_BORDER_DISTANCE, uno::Any(pCellMarginHandler->m_nRightMargin));
- cellProps(pCellProperties);
- }
- }
- break;
-/* // tdf#123189 skip to keep MSO interoperability
- case NS_ooxml::LN_CT_TblPrBase_shd:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties.get())
- {
- std::shared_ptr<CellColorHandler> pCellColorHandler( new CellColorHandler);
- pProperties->resolve( *pCellColorHandler );
- TablePropertyMapPtr pTablePropMap( new TablePropertyMap );
- insertTableProps( pCellColorHandler->getProperties() );
- }
- }
-*/
- break;
- case NS_ooxml::LN_CT_TcPrBase_shd:
- {
- // each color sprm contains as much colors as cells are in a row
- //LN_CT_TcPrBase_shd: cell shading contains: LN_CT_Shd_val, LN_CT_Shd_fill, LN_CT_Shd_color
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- auto pCellColorHandler = std::make_shared<CellColorHandler>();
- pCellColorHandler->enableInteropGrabBag("shd"); //enable to store shd unsupported props in grab bag
- pProperties->resolve( *pCellColorHandler );
- TablePropertyMapPtr pPropertyMap = pCellColorHandler->getProperties();
- beans::PropertyValue aGrabBag = pCellColorHandler->getInteropGrabBag();
- if (m_pCurrentInteropGrabBag)
- m_pCurrentInteropGrabBag->push_back(aGrabBag);
- pPropertyMap->Insert( PROP_CELL_INTEROP_GRAB_BAG, aGrabBag.Value );
- cellProps( pPropertyMap );
- }
- }
- break;
-//OOXML table properties
- case NS_ooxml::LN_CT_TblPrBase_tblCellMar: //cell margins
- {
- //contains LN_CT_TblCellMar_top, LN_CT_TblCellMar_left, LN_CT_TblCellMar_bottom, LN_CT_TblCellMar_right
- // LN_CT_TblCellMar_start, LN_CT_TblCellMar_end
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- auto pCellMarginHandler = std::make_shared<CellMarginHandler>();
- if (m_pCurrentInteropGrabBag)
- pCellMarginHandler->enableInteropGrabBag("tblCellMar");
- pProperties->resolve( *pCellMarginHandler );
- if (m_pCurrentInteropGrabBag)
- m_pCurrentInteropGrabBag->push_back(pCellMarginHandler->getInteropGrabBag());
- TablePropertyMapPtr pMarginProps( new TablePropertyMap );
- if( pCellMarginHandler->m_bTopMarginValid )
- pMarginProps->setValue( TablePropertyMap::CELL_MAR_TOP, pCellMarginHandler->m_nTopMargin );
- if( pCellMarginHandler->m_bBottomMarginValid )
- pMarginProps->setValue( TablePropertyMap::CELL_MAR_BOTTOM, pCellMarginHandler->m_nBottomMargin );
- if( pCellMarginHandler->m_bLeftMarginValid )
- pMarginProps->setValue( TablePropertyMap::CELL_MAR_LEFT, pCellMarginHandler->m_nLeftMargin );
- if( pCellMarginHandler->m_bRightMarginValid )
- pMarginProps->setValue( TablePropertyMap::CELL_MAR_RIGHT, pCellMarginHandler->m_nRightMargin );
- insertTableProps(pMarginProps);
- }
- }
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblInd:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- {
- MeasureHandlerPtr pHandler(new MeasureHandler);
- if (m_pCurrentInteropGrabBag)
- pHandler->enableInteropGrabBag("tblInd");
- pProperties->resolve( *pHandler );
- if (m_pCurrentInteropGrabBag)
- m_pCurrentInteropGrabBag->push_back(pHandler->getInteropGrabBag());
- TablePropertyMapPtr pTblIndMap(new TablePropertyMap);
- sal_uInt32 nTblInd = pHandler->getMeasureValue();
- pTblIndMap->setValue( TablePropertyMap::LEFT_MARGIN, nTblInd);
- insertTableProps(pTblIndMap);
- }
- }
- break;
- case NS_ooxml::LN_CT_TcPrBase_hideMark:
- if (nIntValue)
- {
- TablePropertyMapPtr pPropMap(new TablePropertyMap());
- pPropMap->Insert(PROP_CELL_HIDE_MARK, uno::Any(nIntValue));
- cellProps(pPropMap);
- }
- break;
- default:
- // Not handled here, give the next handler a chance.
- bRet = false;
- // However, these logically belong here, so save the value if necessary.
- switch (nSprmId)
- {
- case NS_ooxml::LN_CT_TblPrBase_tblStyleRowBandSize:
- case NS_ooxml::LN_CT_TblPrBase_tblStyleColBandSize:
- if (m_pCurrentInteropGrabBag)
- {
- beans::PropertyValue aValue;
- aValue.Name = (nSprmId == NS_ooxml::LN_CT_TblPrBase_tblStyleRowBandSize ? std::u16string_view(u"tblStyleRowBandSize") : std::u16string_view(u"tblStyleColBandSize"));
- aValue.Value <<= nIntValue;
- m_pCurrentInteropGrabBag->push_back(aValue);
- }
- break;
- }
- break;
- }
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-
- return bRet;
- }
-
- void TablePropertiesHandler::SetInteropGrabBag(std::vector<beans::PropertyValue>& rValue)
- {
- m_pCurrentInteropGrabBag = &rValue;
- }
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TablePropertiesHandler.hxx b/writerfilter/source/dmapper/TablePropertiesHandler.hxx
deleted file mode 100644
index 9d8f90dc3925..000000000000
--- a/writerfilter/source/dmapper/TablePropertiesHandler.hxx
+++ /dev/null
@@ -1,94 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include "PropertyMap.hxx"
-
-#include "TableManager.hxx"
-#include <dmapper/resourcemodel.hxx>
-
-#include <vector>
-
-namespace writerfilter::dmapper {
-
-class DomainMapper;
-
-class TablePropertiesHandler final : public virtual SvRefBase
-{
-private:
- PropertyMapPtr m_pCurrentProperties;
- std::vector<css::beans::PropertyValue>* m_pCurrentInteropGrabBag;
- TableManager* m_pTableManager;
-
-public:
- TablePropertiesHandler();
-
- bool sprm(Sprm & sprm);
-
- void SetTableManager( TableManager* pTableManager )
- {
- m_pTableManager = pTableManager;
- }
-
- void SetProperties(const PropertyMapPtr& pProperties)
- {
- m_pCurrentProperties = pProperties;
- }
-
- void SetInteropGrabBag(std::vector<css::beans::PropertyValue>& rValue);
-
-private:
-
- void cellProps( TablePropertyMapPtr pProps )
- {
- if ( m_pTableManager )
- m_pTableManager->cellProps( pProps );
- else
- m_pCurrentProperties->InsertProps(pProps.get());
- };
-
- void insertRowProps( TablePropertyMapPtr pProps )
- {
- if ( m_pTableManager )
- m_pTableManager->insertRowProps( pProps );
- else
- m_pCurrentProperties->InsertProps(pProps.get());
- };
-
- void tableExceptionProps( TablePropertyMapPtr pProps )
- {
- if ( m_pTableManager )
- m_pTableManager->tableExceptionProps( pProps );
- else
- m_pCurrentProperties->InsertProps(pProps.get());
- };
-
- void insertTableProps( TablePropertyMapPtr pProps )
- {
- if ( m_pTableManager )
- m_pTableManager->insertTableProps( pProps );
- else
- m_pCurrentProperties->InsertProps(pProps.get());
- };
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TagLogger.cxx b/writerfilter/source/dmapper/TagLogger.cxx
deleted file mode 100644
index 7a96b4aa6041..000000000000
--- a/writerfilter/source/dmapper/TagLogger.cxx
+++ /dev/null
@@ -1,240 +0,0 @@
-/* -*- 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/.
- *
- * 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 <string.h>
-#include "TagLogger.hxx"
-#ifdef DBG_UTIL
-#include <unotools/pathoptions.hxx>
-#endif
-
-using namespace css;
-
-namespace writerfilter
-{
- TagLogger::TagLogger()
- : m_pWriter( nullptr ), m_pName( "DOMAINMAPPER" )
- {
- }
-
- TagLogger::~TagLogger()
- {
- m_pWriter = nullptr;
- m_pName = nullptr;
- }
-
-#ifdef DBG_UTIL
- void TagLogger::setFileName( const std::string & filename )
- {
- if ( m_pWriter )
- endDocument();
-
- std::string fileName;
- char * temp = getenv("TAGLOGGERTMP");
-
- if (temp != nullptr)
- fileName += temp;
- else
- fileName += SvtPathOptions().GetTempPath().toUtf8().getStr();
-
- std::string sPrefix = filename;
- size_t nLastSlash = sPrefix.find_last_of('/');
- size_t nLastBackslash = sPrefix.find_last_of('\\');
- size_t nCutPos = nLastSlash;
- if (nLastBackslash < nCutPos)
- nCutPos = nLastBackslash;
- if (nCutPos < sPrefix.size())
- sPrefix = sPrefix.substr(nCutPos + 1);
-
- fileName += "/";
- fileName += sPrefix;
- fileName += ".";
- fileName += m_pName;
- fileName += ".xml";
-
- m_pWriter = xmlNewTextWriterFilename( fileName.c_str(), 0 );
- xmlTextWriterSetIndent(m_pWriter,1);
- (void)xmlTextWriterSetIndentString(m_pWriter, BAD_CAST(" "));
- xmlTextWriterSetIndent( m_pWriter, 4 );
- }
-
- void TagLogger::startDocument()
- {
- if (!m_pWriter)
- return;
- (void)xmlTextWriterStartDocument( m_pWriter, nullptr, nullptr, nullptr );
- (void)xmlTextWriterStartElement( m_pWriter, BAD_CAST( "root" ) );
- }
-
- void TagLogger::endDocument()
- {
- if (!m_pWriter)
- return;
- (void)xmlTextWriterEndDocument( m_pWriter );
- xmlFreeTextWriter( m_pWriter );
- m_pWriter = nullptr;
- }
-
-#endif
-
- TagLogger& TagLogger::getInstance()
- {
- static TagLogger theTagLogger;
- return theTagLogger;
- }
-
-#ifdef DBG_UTIL
- void TagLogger::element(const std::string & name)
- {
- startElement(name);
- endElement();
- }
-
- void TagLogger::unoPropertySet(const uno::Reference<beans::XPropertySet>& rPropSet)
- {
- uno::Reference<beans::XPropertySetInfo> xPropSetInfo(rPropSet->getPropertySetInfo());
- const uno::Sequence<beans::Property> aProps(xPropSetInfo->getProperties());
-
- startElement( "unoPropertySet" );
-
- for (beans::Property const & prop : aProps)
- {
- startElement( "property" );
- OUString sName(prop.Name);
-
- attribute( "name", sName );
- try
- {
- attribute( "value", rPropSet->getPropertyValue( sName ) );
- }
- catch (const uno::Exception &)
- {
- startElement( "exception" );
-
- chars(std::string("getPropertyValue(\""));
- chars(sName);
- chars(std::string("\")"));
-
- endElement( );
- }
- endElement( );
- }
- endElement( );
- }
-
- void TagLogger::startElement(const std::string & name)
- {
- if (!m_pWriter)
- return;
- xmlChar* xmlName = xmlCharStrdup( name.c_str() );
- (void)xmlTextWriterStartElement( m_pWriter, xmlName );
- xmlFree( xmlName );
- }
-#endif
-
- void TagLogger::attribute(const std::string & name, const std::string & value)
- {
- if (!m_pWriter)
- return;
- xmlChar* xmlName = xmlCharStrdup( name.c_str() );
- xmlChar* xmlValue = xmlCharStrdup( value.c_str() );
- (void)xmlTextWriterWriteAttribute( m_pWriter, xmlName, xmlValue );
-
- xmlFree( xmlValue );
- xmlFree( xmlName );
- }
-
-#ifdef DBG_UTIL
- void TagLogger::attribute(const std::string & name, std::u16string_view value)
- {
- attribute( name, std::string(OUStringToOString( value, RTL_TEXTENCODING_ASCII_US )) );
- }
-
- void TagLogger::attribute(const std::string & name, sal_uInt32 value)
- {
- if (!m_pWriter)
- return;
- xmlChar* xmlName = xmlCharStrdup( name.c_str() );
- (void)xmlTextWriterWriteFormatAttribute( m_pWriter, xmlName,
- "%" SAL_PRIuUINT32, value );
- xmlFree( xmlName );
- }
-
- void TagLogger::attribute(const std::string & name, float value)
- {
- if (!m_pWriter)
- return;
- xmlChar* xmlName = xmlCharStrdup( name.c_str() );
- (void)xmlTextWriterWriteFormatAttribute( m_pWriter, xmlName,
- "%f", value );
- xmlFree( xmlName );
- }
-
- void TagLogger::attribute(const std::string & name, const uno::Any& aAny)
- {
- if (!m_pWriter)
- return;
-
- sal_Int32 nInt = 0;
- float nFloat = 0.0;
- OUString aStr;
-
- xmlChar* xmlName = xmlCharStrdup( name.c_str() );
- if ( aAny >>= nInt )
- {
- (void)xmlTextWriterWriteFormatAttribute( m_pWriter, xmlName,
- "%" SAL_PRIdINT32, nInt );
- }
- else if ( aAny >>= nFloat )
- {
- (void)xmlTextWriterWriteFormatAttribute( m_pWriter, xmlName,
- "%f", nFloat );
- }
- else if ( aAny >>= aStr )
- {
- attribute( name, aStr );
- }
- xmlFree( xmlName );
- }
-
- void TagLogger::chars(const std::string & rChars)
- {
- if (!m_pWriter)
- return;
- xmlChar* xmlChars = xmlCharStrdup( rChars.c_str() );
- (void)xmlTextWriterWriteString( m_pWriter, xmlChars );
- xmlFree( xmlChars );
- }
-
- void TagLogger::chars(std::u16string_view rChars)
- {
- chars(std::string(OUStringToOString(rChars, RTL_TEXTENCODING_ASCII_US)));
- }
-
- void TagLogger::endElement()
- {
- if (!m_pWriter)
- return;
- (void)xmlTextWriterEndElement( m_pWriter );
- }
-
-#endif
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TagLogger.hxx b/writerfilter/source/dmapper/TagLogger.hxx
deleted file mode 100644
index f6d38096255f..000000000000
--- a/writerfilter/source/dmapper/TagLogger.hxx
+++ /dev/null
@@ -1,70 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include <rtl/ustring.hxx>
-#include <tools/ref.hxx>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <string>
-#include <string_view>
-#include <type_traits>
-#include <libxml/xmlwriter.h>
-
-namespace writerfilter
-{
-
- class TagLogger
- {
- private:
- xmlTextWriterPtr m_pWriter;
- const char* m_pName;
-
- public:
- explicit TagLogger();
- ~TagLogger();
-
- static TagLogger& getInstance();
-
-#ifdef DBG_UTIL
- void setFileName(const std::string & filename);
- void startDocument();
- void endDocument();
-
- void element(const std::string & name);
- void unoPropertySet(const css::uno::Reference<css::beans::XPropertySet>& rPropSet);
- void startElement(const std::string & name);
-#endif
- void attribute(const std::string & name, const std::string & value);
-#ifdef DBG_UTIL
- void attribute(const std::string & name, std::u16string_view value);
- void attribute(const std::string & name, sal_uInt32 value);
- template<typename T> std::enable_if_t<std::is_integral_v<T>, void>
- attribute(const std::string & name, T value)
- { return attribute(name, static_cast<sal_uInt32>(value)); }
- void attribute(const std::string & name, float value);
- void attribute(const std::string & name, const css::uno::Any& aAny);
- void chars(const std::string & chars);
- void chars(std::u16string_view chars);
- void endElement();
-#endif
- };
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TblStylePrHandler.cxx b/writerfilter/source/dmapper/TblStylePrHandler.cxx
deleted file mode 100644
index 13656e169ba7..000000000000
--- a/writerfilter/source/dmapper/TblStylePrHandler.cxx
+++ /dev/null
@@ -1,259 +0,0 @@
-/* -*- 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/.
- *
- * 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 "TblStylePrHandler.hxx"
-#include "TagLogger.hxx"
-#include "CellMarginHandler.hxx"
-#include "PropertyMap.hxx"
-#include "MeasureHandler.hxx"
-#include <ooxml/resourceids.hxx>
-#include <comphelper/sequence.hxx>
-
-
-using namespace css;
-
-namespace writerfilter::dmapper {
-
-TblStylePrHandler::TblStylePrHandler( DomainMapper & rDMapper ) :
-LoggedProperties("TblStylePrHandler"),
-m_rDMapper( rDMapper ),
-m_pTablePropsHandler(new TablePropertiesHandler()),
-m_nType( TBL_STYLE_UNKNOWN ),
-m_pProperties( new PropertyMap )
-{
-}
-
-TblStylePrHandler::~TblStylePrHandler( )
-{
-}
-
-OUString TblStylePrHandler::getTypeString() const
-{
- switch (m_nType)
- {
- case TBL_STYLE_WHOLETABLE: return "wholeTable";
- case TBL_STYLE_FIRSTROW: return "firstRow";
- case TBL_STYLE_LASTROW: return "lastRow";
- case TBL_STYLE_FIRSTCOL: return "firstCol";
- case TBL_STYLE_LASTCOL: return "lastCol";
- case TBL_STYLE_BAND1VERT: return "band1Vert";
- case TBL_STYLE_BAND2VERT: return "band2Vert";
- case TBL_STYLE_BAND1HORZ: return "band1Horz";
- case TBL_STYLE_BAND2HORZ: return "band2Horz";
- case TBL_STYLE_NECELL: return "neCell";
- case TBL_STYLE_NWCELL: return "nwCell";
- case TBL_STYLE_SECELL: return "seCell";
- case TBL_STYLE_SWCELL: return "swCell";
- default: break;
- }
- return OUString();
-}
-
-void TblStylePrHandler::lcl_attribute(Id rName, Value & rVal)
-{
-
- switch ( rName )
- {
- case NS_ooxml::LN_CT_TblStyleOverrideType:
- {
- switch (rVal.getInt())
- {
- case NS_ooxml::LN_Value_ST_TblStyleOverrideType_wholeTable:
- m_nType = TBL_STYLE_WHOLETABLE;
- break;
- case NS_ooxml::LN_Value_ST_TblStyleOverrideType_firstRow:
- m_nType = TBL_STYLE_FIRSTROW;
- break;
- case NS_ooxml::LN_Value_ST_TblStyleOverrideType_lastRow:
- m_nType = TBL_STYLE_LASTROW;
- break;
- case NS_ooxml::LN_Value_ST_TblStyleOverrideType_firstCol:
- m_nType = TBL_STYLE_FIRSTCOL;
- break;
- case NS_ooxml::LN_Value_ST_TblStyleOverrideType_lastCol:
- m_nType = TBL_STYLE_LASTCOL;
- break;
- case NS_ooxml::LN_Value_ST_TblStyleOverrideType_band1Vert:
- m_nType = TBL_STYLE_BAND1VERT;
- break;
- case NS_ooxml::LN_Value_ST_TblStyleOverrideType_band2Vert:
- m_nType = TBL_STYLE_BAND2VERT;
- break;
- case NS_ooxml::LN_Value_ST_TblStyleOverrideType_band1Horz:
- m_nType = TBL_STYLE_BAND1HORZ;
- break;
- case NS_ooxml::LN_Value_ST_TblStyleOverrideType_band2Horz:
- m_nType = TBL_STYLE_BAND2HORZ;
- break;
- case NS_ooxml::LN_Value_ST_TblStyleOverrideType_neCell:
- m_nType = TBL_STYLE_NECELL;
- break;
- case NS_ooxml::LN_Value_ST_TblStyleOverrideType_nwCell:
- m_nType = TBL_STYLE_NWCELL;
- break;
- case NS_ooxml::LN_Value_ST_TblStyleOverrideType_seCell:
- m_nType = TBL_STYLE_SECELL;
- break;
- case NS_ooxml::LN_Value_ST_TblStyleOverrideType_swCell:
- m_nType = TBL_STYLE_SWCELL;
- break;
- }
- }
- break;
- }
-}
-
-void TblStylePrHandler::lcl_sprm(Sprm & rSprm)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("TblStylePrHandler.sprm");
- TagLogger::getInstance().attribute("sprm", rSprm.toString());
-#endif
-
- switch ( rSprm.getId( ) )
- {
- case NS_ooxml::LN_CT_PPrBase:
- case NS_ooxml::LN_EG_RPrBase:
- case NS_ooxml::LN_CT_TblPrBase:
- case NS_ooxml::LN_CT_TrPrBase:
- case NS_ooxml::LN_CT_TcPrBase:
- {
- std::vector<beans::PropertyValue> aSavedGrabBag;
- bool bGrabBag = rSprm.getId() == NS_ooxml::LN_CT_PPrBase ||
- rSprm.getId() == NS_ooxml::LN_EG_RPrBase ||
- rSprm.getId() == NS_ooxml::LN_CT_TblPrBase ||
- rSprm.getId() == NS_ooxml::LN_CT_TrPrBase ||
- rSprm.getId() == NS_ooxml::LN_CT_TcPrBase;
- if (bGrabBag)
- {
- std::swap(aSavedGrabBag, m_aInteropGrabBag);
- }
- resolveSprmProps( rSprm );
- if (bGrabBag)
- {
- if (rSprm.getId() == NS_ooxml::LN_CT_PPrBase)
- aSavedGrabBag.push_back(getInteropGrabBag("pPr"));
- else if (rSprm.getId() == NS_ooxml::LN_EG_RPrBase)
- aSavedGrabBag.push_back(getInteropGrabBag("rPr"));
- else if (rSprm.getId() == NS_ooxml::LN_CT_TblPrBase)
- aSavedGrabBag.push_back(getInteropGrabBag("tblPr"));
- else if (rSprm.getId() == NS_ooxml::LN_CT_TrPrBase)
- aSavedGrabBag.push_back(getInteropGrabBag("trPr"));
- else if (rSprm.getId() == NS_ooxml::LN_CT_TcPrBase)
- aSavedGrabBag.push_back(getInteropGrabBag("tcPr"));
- std::swap(m_aInteropGrabBag, aSavedGrabBag);
- }
- }
- break;
- case NS_ooxml::LN_CT_TrPrBase_tblHeader:
- {
- m_pProperties->Insert( PROP_HEADER_ROW_COUNT, uno::Any(sal_Int32(1)));
- beans::PropertyValue aValue;
- aValue.Name = "tblHeader";
- aValue.Value <<= true;
- m_aInteropGrabBag.push_back(aValue);
- }
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblInd:
- {
- //contains unit and value
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- {
- MeasureHandlerPtr pMeasureHandler( new MeasureHandler );
- pProperties->resolve(*pMeasureHandler);
- TablePropertyMapPtr pPropMap( new TablePropertyMap );
- pPropMap->setValue( TablePropertyMap::LEFT_MARGIN, pMeasureHandler->getMeasureValue() );
- m_pProperties->Insert( PROP_LEFT_MARGIN, uno::Any(pMeasureHandler->getMeasureValue()) );
- }
- }
- break;
- case NS_ooxml::LN_CT_TblPrBase_tblCellMar:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if ( pProperties )
- {
- auto pCellMarginHandler = std::make_shared<CellMarginHandler>();
- pCellMarginHandler->enableInteropGrabBag("tblCellMar");
- pProperties->resolve( *pCellMarginHandler );
- m_aInteropGrabBag.push_back(pCellMarginHandler->getInteropGrabBag());
-
- if( pCellMarginHandler->m_bTopMarginValid )
- m_pProperties->Insert( META_PROP_CELL_MAR_TOP, uno::Any(pCellMarginHandler->m_nTopMargin) );
- if( pCellMarginHandler->m_bBottomMarginValid )
- m_pProperties->Insert( META_PROP_CELL_MAR_BOTTOM, uno::Any(pCellMarginHandler->m_nBottomMargin) );
- if( pCellMarginHandler->m_bLeftMarginValid )
- m_pProperties->Insert( META_PROP_CELL_MAR_LEFT, uno::Any(pCellMarginHandler->m_nLeftMargin) );
- if( pCellMarginHandler->m_bRightMarginValid )
- m_pProperties->Insert( META_PROP_CELL_MAR_RIGHT, uno::Any(pCellMarginHandler->m_nRightMargin) );
- }
- }
- break;
- default:
- // Tables specific properties have to handled here
- m_pTablePropsHandler->SetProperties( m_pProperties );
- m_pTablePropsHandler->SetInteropGrabBag(m_aInteropGrabBag);
- bool bRet = m_pTablePropsHandler->sprm( rSprm );
-
- if ( !bRet )
- {
- // The DomainMapper can handle some of the properties
- m_rDMapper.PushStyleSheetProperties( m_pProperties, true );
- // Just pass a non-empty string, the array will have a single element anyway.
- m_rDMapper.enableInteropGrabBag("TblStylePrHandler");
- m_rDMapper.sprm( rSprm );
- uno::Sequence<beans::PropertyValue> aGrabBag = m_rDMapper.getInteropGrabBag().Value.get< uno::Sequence<beans::PropertyValue> >();
- if (aGrabBag.hasElements())
- m_aInteropGrabBag.push_back(aGrabBag[0]);
- m_rDMapper.PopStyleSheetProperties( true );
- }
- }
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-}
-
-void TblStylePrHandler::resolveSprmProps(Sprm & rSprm)
-{
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- pProperties->resolve(*this);
-}
-
-void TblStylePrHandler::appendInteropGrabBag(const OUString& aKey, const OUString& aValue)
-{
- beans::PropertyValue aProperty;
- aProperty.Name = aKey;
- aProperty.Value <<= aValue;
- m_aInteropGrabBag.push_back(aProperty);
-}
-
-beans::PropertyValue TblStylePrHandler::getInteropGrabBag(const OUString& aName)
-{
- beans::PropertyValue aRet;
- aRet.Name = aName;
-
- aRet.Value <<= comphelper::containerToSequence(m_aInteropGrabBag);
- return aRet;
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TblStylePrHandler.hxx b/writerfilter/source/dmapper/TblStylePrHandler.hxx
deleted file mode 100644
index 4be7d379a647..000000000000
--- a/writerfilter/source/dmapper/TblStylePrHandler.hxx
+++ /dev/null
@@ -1,82 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include "TablePropertiesHandler.hxx"
-
-#include "DomainMapper.hxx"
-#include "LoggedResources.hxx"
-#include <memory>
-#include <vector>
-
-namespace writerfilter::dmapper {
-
-class DomainMapper;
-
-enum TblStyleType
-{
- TBL_STYLE_UNKNOWN,
- TBL_STYLE_WHOLETABLE,
- TBL_STYLE_FIRSTROW,
- TBL_STYLE_LASTROW,
- TBL_STYLE_FIRSTCOL,
- TBL_STYLE_LASTCOL,
- TBL_STYLE_BAND1VERT,
- TBL_STYLE_BAND2VERT,
- TBL_STYLE_BAND1HORZ,
- TBL_STYLE_BAND2HORZ,
- TBL_STYLE_NECELL,
- TBL_STYLE_NWCELL,
- TBL_STYLE_SECELL,
- TBL_STYLE_SWCELL
-};
-
-class TblStylePrHandler : public LoggedProperties
-{
-private:
- DomainMapper & m_rDMapper;
- std::unique_ptr<TablePropertiesHandler> m_pTablePropsHandler;
-
- TblStyleType m_nType;
- PropertyMapPtr m_pProperties;
- std::vector<css::beans::PropertyValue> m_aInteropGrabBag;
-
- // Properties
- virtual void lcl_attribute(Id Name, Value & val) override;
- virtual void lcl_sprm(Sprm & sprm) override;
-
-public:
- explicit TblStylePrHandler( DomainMapper & rDMapper );
- virtual ~TblStylePrHandler( ) override;
-
- const PropertyMapPtr& getProperties() const { return m_pProperties; };
- TblStyleType getType() const { return m_nType; };
- OUString getTypeString() const;
- void appendInteropGrabBag(const OUString& aKey, const OUString& aValue);
- css::beans::PropertyValue getInteropGrabBag(const OUString& aName);
-
-private:
-
- void resolveSprmProps(Sprm & rSprm);
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TextEffectsHandler.cxx b/writerfilter/source/dmapper/TextEffectsHandler.cxx
deleted file mode 100644
index 35d7efbbfee2..000000000000
--- a/writerfilter/source/dmapper/TextEffectsHandler.cxx
+++ /dev/null
@@ -1,806 +0,0 @@
-/* -*- 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 <sal/config.h>
-
-#include <map>
-
-#include "TextEffectsHandler.hxx"
-
-#include <rtl/ustrbuf.hxx>
-#include <comphelper/string.hxx>
-#include <ooxml/resourceids.hxx>
-#include <comphelper/sequenceashashmap.hxx>
-#include <oox/drawingml/drawingmltypes.hxx>
-
-namespace writerfilter::dmapper
-{
-
-using namespace com::sun::star;
-
-namespace
-{
-
-OUString lclGetNameForElementId(sal_uInt32 aId)
-{
- static std::map<sal_uInt32, OUString> aIdMap;
- if(aIdMap.empty())
- {
- aIdMap[NS_ooxml::LN_EG_ColorChoice_srgbClr] = "srgbClr";
- aIdMap[NS_ooxml::LN_EG_ColorChoice_schemeClr] = "schemeClr";
- aIdMap[NS_ooxml::LN_EG_ColorTransform_tint] = "tint";
- aIdMap[NS_ooxml::LN_EG_ColorTransform_shade] = "shade";
- aIdMap[NS_ooxml::LN_EG_ColorTransform_alpha] = "alpha";
- aIdMap[NS_ooxml::LN_EG_ColorTransform_hueMod] = "hueMod";
- aIdMap[NS_ooxml::LN_EG_ColorTransform_sat] = "sat";
- aIdMap[NS_ooxml::LN_EG_ColorTransform_satOff] = "satOff";
- aIdMap[NS_ooxml::LN_EG_ColorTransform_satMod] = "satMod";
- aIdMap[NS_ooxml::LN_EG_ColorTransform_lum] = "lum";
- aIdMap[NS_ooxml::LN_EG_ColorTransform_lumOff] = "lumOff";
- aIdMap[NS_ooxml::LN_EG_ColorTransform_lumMod] = "lumMod";
- aIdMap[NS_ooxml::LN_EG_FillProperties_noFill] = "noFill";
- aIdMap[NS_ooxml::LN_EG_FillProperties_solidFill] = "solidFill";
- aIdMap[NS_ooxml::LN_EG_FillProperties_gradFill] = "gradFill";
- aIdMap[NS_ooxml::LN_CT_GradientFillProperties_gsLst] = "gsLst";
- aIdMap[NS_ooxml::LN_CT_GradientStopList_gs] = "gs";
- aIdMap[NS_ooxml::LN_CT_GradientStop_pos] = "pos";
- aIdMap[NS_ooxml::LN_EG_ShadeProperties_lin] = "lin";
- aIdMap[NS_ooxml::LN_EG_ShadeProperties_path] = "path";
- aIdMap[NS_ooxml::LN_CT_PathShadeProperties_fillToRect] = "fillToRect";
- aIdMap[NS_ooxml::LN_EG_LineDashProperties_prstDash] = "prstDash";
- aIdMap[NS_ooxml::LN_EG_LineJoinProperties_round] = "round";
- aIdMap[NS_ooxml::LN_EG_LineJoinProperties_bevel] = "bevel";
- aIdMap[NS_ooxml::LN_EG_LineJoinProperties_miter] = "miter";
- aIdMap[NS_ooxml::LN_CT_Scene3D_camera] = "camera";
- aIdMap[NS_ooxml::LN_CT_Scene3D_lightRig] = "lightRig";
- aIdMap[NS_ooxml::LN_CT_LightRig_rot] = "rot";
- aIdMap[NS_ooxml::LN_CT_Props3D_bevelT] = "bevelT";
- aIdMap[NS_ooxml::LN_CT_Props3D_bevelB] = "bevelB";
- aIdMap[NS_ooxml::LN_CT_Props3D_extrusionClr] = "extrusionClr";
- aIdMap[NS_ooxml::LN_CT_Props3D_contourClr] = "contourClr";
- aIdMap[NS_ooxml::LN_CT_StylisticSets_styleSet] = "styleSet";
- aIdMap[NS_ooxml::LN_cntxtAlts_cntxtAlts] = "cntxtAlts";
- }
- return aIdMap[aId];
-}
-
-constexpr OUString constAttributesSequenceName = u"attributes"_ustr;
-
-}
-
-OUString TextEffectsHandler::getSchemeColorValTypeString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_SchemeColorVal_bg1: return "bg1";
- case NS_ooxml::LN_ST_SchemeColorVal_tx1: return "tx1";
- case NS_ooxml::LN_ST_SchemeColorVal_bg2: return "bg2";
- case NS_ooxml::LN_ST_SchemeColorVal_tx2: return "tx2";
- case NS_ooxml::LN_ST_SchemeColorVal_accent1: return "accent1";
- case NS_ooxml::LN_ST_SchemeColorVal_accent2: return "accent2";
- case NS_ooxml::LN_ST_SchemeColorVal_accent3: return "accent3";
- case NS_ooxml::LN_ST_SchemeColorVal_accent4: return "accent4";
- case NS_ooxml::LN_ST_SchemeColorVal_accent5: return "accent5";
- case NS_ooxml::LN_ST_SchemeColorVal_accent6: return "accent6";
- case NS_ooxml::LN_ST_SchemeColorVal_hlink: return "hlink";
- case NS_ooxml::LN_ST_SchemeColorVal_folHlink: return "folHlink";
- case NS_ooxml::LN_ST_SchemeColorVal_dk1: return "dk1";
- case NS_ooxml::LN_ST_SchemeColorVal_lt1: return "lt1";
- case NS_ooxml::LN_ST_SchemeColorVal_dk2: return "dk2";
- case NS_ooxml::LN_ST_SchemeColorVal_lt2: return "lt2";
- case NS_ooxml::LN_ST_SchemeColorVal_phClr: return "phClr";
- default: break;
- }
- return OUString();
-}
-
-OUString TextEffectsHandler::getRectAlignmentString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_RectAlignment_none: return "none";
- case NS_ooxml::LN_ST_RectAlignment_tl: return "tl";
- case NS_ooxml::LN_ST_RectAlignment_t: return "t";
- case NS_ooxml::LN_ST_RectAlignment_tr: return "tr";
- case NS_ooxml::LN_ST_RectAlignment_l: return "l";
- case NS_ooxml::LN_ST_RectAlignment_ctr: return "ctr";
- case NS_ooxml::LN_ST_RectAlignment_r: return "r";
- case NS_ooxml::LN_ST_RectAlignment_bl: return "bl";
- case NS_ooxml::LN_ST_RectAlignment_b: return "b";
- case NS_ooxml::LN_ST_RectAlignment_br: return "br";
-
- default: break;
- }
- return OUString();
-}
-
-OUString TextEffectsHandler::getLineCapString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_LineCap_rnd: return "rnd";
- case NS_ooxml::LN_ST_LineCap_sq: return "sq";
- case NS_ooxml::LN_ST_LineCap_flat: return "flat";
- default: break;
- }
- return OUString();
-}
-
-OUString TextEffectsHandler::getCompoundLineString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_CompoundLine_sng: return "sng";
- case NS_ooxml::LN_ST_CompoundLine_dbl: return "dbl";
- case NS_ooxml::LN_ST_CompoundLine_thickThin: return "thickThin";
- case NS_ooxml::LN_ST_CompoundLine_thinThick: return "thinThick";
- case NS_ooxml::LN_ST_CompoundLine_tri: return "tri";
- default: break;
- }
- return OUString();
-}
-
-OUString TextEffectsHandler::getPenAlignmentString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_PenAlignment_ctr: return "ctr";
- case NS_ooxml::LN_ST_PenAlignment_in: return "in";
- default: break;
- }
- return OUString();
-}
-
-OUString TextEffectsHandler::getOnOffString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_OnOff_true: return "true";
- case NS_ooxml::LN_ST_OnOff_false: return "false";
- case NS_ooxml::LN_ST_OnOff_1: return "1";
- case NS_ooxml::LN_ST_OnOff_0: return "0";
- default: break;
- }
- return OUString();
-}
-
-OUString TextEffectsHandler::getPathShadeTypeString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_PathShadeType_shape: return "shape";
- case NS_ooxml::LN_ST_PathShadeType_circle: return "circle";
- case NS_ooxml::LN_ST_PathShadeType_rect: return "rect";
- default: break;
- }
- return OUString();
-}
-
-OUString TextEffectsHandler::getPresetLineDashValString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_PresetLineDashVal_solid: return "solid";
- case NS_ooxml::LN_ST_PresetLineDashVal_dot: return "dot";
- case NS_ooxml::LN_ST_PresetLineDashVal_sysDot: return "sysDot";
- case NS_ooxml::LN_ST_PresetLineDashVal_dash: return "dash";
- case NS_ooxml::LN_ST_PresetLineDashVal_sysDash: return "sysDash";
- case NS_ooxml::LN_ST_PresetLineDashVal_lgDash: return "lgDash";
- case NS_ooxml::LN_ST_PresetLineDashVal_dashDot: return "dashDot";
- case NS_ooxml::LN_ST_PresetLineDashVal_sysDashDot: return "sysDashDot";
- case NS_ooxml::LN_ST_PresetLineDashVal_lgDashDot: return "lgDashDot";
- case NS_ooxml::LN_ST_PresetLineDashVal_lgDashDotDot: return "lgDashDotDot";
- case NS_ooxml::LN_ST_PresetLineDashVal_sysDashDotDot: return "sysDashDotDot";
- default: break;
- }
- return OUString();
-}
-
-OUString TextEffectsHandler::getPresetCameraTypeString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_PresetCameraType_legacyObliqueTopLeft: return "legacyObliqueTopLeft";
- case NS_ooxml::LN_ST_PresetCameraType_legacyObliqueTop: return "legacyObliqueTop";
- case NS_ooxml::LN_ST_PresetCameraType_legacyObliqueTopRight: return "legacyObliqueTopRight";
- case NS_ooxml::LN_ST_PresetCameraType_legacyObliqueLeft: return "legacyObliqueLeft";
- case NS_ooxml::LN_ST_PresetCameraType_legacyObliqueFront: return "legacyObliqueFront";
- case NS_ooxml::LN_ST_PresetCameraType_legacyObliqueRight: return "legacyObliqueRight";
- case NS_ooxml::LN_ST_PresetCameraType_legacyObliqueBottomLeft: return "legacyObliqueBottomLeft";
- case NS_ooxml::LN_ST_PresetCameraType_legacyObliqueBottom: return "legacyObliqueBottom";
- case NS_ooxml::LN_ST_PresetCameraType_legacyObliqueBottomRight: return "legacyObliqueBottomRight";
- case NS_ooxml::LN_ST_PresetCameraType_legacyPerspectiveTopLeft: return "legacyPerspectiveTopLeft";
- case NS_ooxml::LN_ST_PresetCameraType_legacyPerspectiveTop: return "legacyPerspectiveTop";
- case NS_ooxml::LN_ST_PresetCameraType_legacyPerspectiveTopRight: return "legacyPerspectiveTopRight";
- case NS_ooxml::LN_ST_PresetCameraType_legacyPerspectiveLeft: return "legacyPerspectiveLeft";
- case NS_ooxml::LN_ST_PresetCameraType_legacyPerspectiveFront: return "legacyPerspectiveFront";
- case NS_ooxml::LN_ST_PresetCameraType_legacyPerspectiveRight: return "legacyPerspectiveRight";
- case NS_ooxml::LN_ST_PresetCameraType_legacyPerspectiveBottomLeft: return "legacyPerspectiveBottomLeft";
- case NS_ooxml::LN_ST_PresetCameraType_legacyPerspectiveBottom: return "legacyPerspectiveBottom";
- case NS_ooxml::LN_ST_PresetCameraType_legacyPerspectiveBottomRight: return "legacyPerspectiveBottomRight";
- case NS_ooxml::LN_ST_PresetCameraType_orthographicFront: return "orthographicFront";
- case NS_ooxml::LN_ST_PresetCameraType_isometricTopUp: return "isometricTopUp";
- case NS_ooxml::LN_ST_PresetCameraType_isometricTopDown: return "isometricTopDown";
- case NS_ooxml::LN_ST_PresetCameraType_isometricBottomUp: return "isometricBottomUp";
- case NS_ooxml::LN_ST_PresetCameraType_isometricBottomDown: return "isometricBottomDown";
- case NS_ooxml::LN_ST_PresetCameraType_isometricLeftUp: return "isometricLeftUp";
- case NS_ooxml::LN_ST_PresetCameraType_isometricLeftDown: return "isometricLeftDown";
- case NS_ooxml::LN_ST_PresetCameraType_isometricRightUp: return "isometricRightUp";
- case NS_ooxml::LN_ST_PresetCameraType_isometricRightDown: return "isometricRightDown";
- case NS_ooxml::LN_ST_PresetCameraType_isometricOffAxis1Left: return "isometricOffAxis1Left";
- case NS_ooxml::LN_ST_PresetCameraType_isometricOffAxis1Right: return "isometricOffAxis1Right";
- case NS_ooxml::LN_ST_PresetCameraType_isometricOffAxis1Top: return "isometricOffAxis1Top";
- case NS_ooxml::LN_ST_PresetCameraType_isometricOffAxis2Left: return "isometricOffAxis2Left";
- case NS_ooxml::LN_ST_PresetCameraType_isometricOffAxis2Right: return "isometricOffAxis2Right";
- case NS_ooxml::LN_ST_PresetCameraType_isometricOffAxis2Top: return "isometricOffAxis2Top";
- case NS_ooxml::LN_ST_PresetCameraType_isometricOffAxis3Left: return "isometricOffAxis3Left";
- case NS_ooxml::LN_ST_PresetCameraType_isometricOffAxis3Right: return "isometricOffAxis3Right";
- case NS_ooxml::LN_ST_PresetCameraType_isometricOffAxis3Bottom: return "isometricOffAxis3Bottom";
- case NS_ooxml::LN_ST_PresetCameraType_isometricOffAxis4Left: return "isometricOffAxis4Left";
- case NS_ooxml::LN_ST_PresetCameraType_isometricOffAxis4Right: return "isometricOffAxis4Right";
- case NS_ooxml::LN_ST_PresetCameraType_isometricOffAxis4Bottom: return "isometricOffAxis4Bottom";
- case NS_ooxml::LN_ST_PresetCameraType_obliqueTopLeft: return "obliqueTopLeft";
- case NS_ooxml::LN_ST_PresetCameraType_obliqueTop: return "obliqueTop";
- case NS_ooxml::LN_ST_PresetCameraType_obliqueTopRight: return "obliqueTopRight";
- case NS_ooxml::LN_ST_PresetCameraType_obliqueLeft: return "obliqueLeft";
- case NS_ooxml::LN_ST_PresetCameraType_obliqueRight: return "obliqueRight";
- case NS_ooxml::LN_ST_PresetCameraType_obliqueBottomLeft: return "obliqueBottomLeft";
- case NS_ooxml::LN_ST_PresetCameraType_obliqueBottom: return "obliqueBottom";
- case NS_ooxml::LN_ST_PresetCameraType_obliqueBottomRight: return "obliqueBottomRight";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveFront: return "perspectiveFront";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveLeft: return "perspectiveLeft";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveRight: return "perspectiveRight";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveAbove: return "perspectiveAbove";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveBelow: return "perspectiveBelow";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveAboveLeftFacing: return "perspectiveAboveLeftFacing";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveAboveRightFacing: return "perspectiveAboveRightFacing";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveContrastingLeftFacing: return "perspectiveContrastingLeftFacing";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveContrastingRightFacing: return "perspectiveContrastingRightFacing";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveHeroicLeftFacing: return "perspectiveHeroicLeftFacing";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveHeroicRightFacing: return "perspectiveHeroicRightFacing";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveHeroicExtremeLeftFacing: return "perspectiveHeroicExtremeLeftFacing";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveHeroicExtremeRightFacing: return "perspectiveHeroicExtremeRightFacing";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveRelaxed: return "perspectiveRelaxed";
- case NS_ooxml::LN_ST_PresetCameraType_perspectiveRelaxedModerately: return "perspectiveRelaxedModerately";
- default: break;
- }
- return OUString();
-}
-
-
-OUString TextEffectsHandler::getLightRigTypeString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_LightRigType_legacyFlat1: return "legacyFlat1";
- case NS_ooxml::LN_ST_LightRigType_legacyFlat2: return "legacyFlat2";
- case NS_ooxml::LN_ST_LightRigType_legacyFlat3: return "legacyFlat3";
- case NS_ooxml::LN_ST_LightRigType_legacyFlat4: return "legacyFlat4";
- case NS_ooxml::LN_ST_LightRigType_legacyNormal1: return "legacyNormal1";
- case NS_ooxml::LN_ST_LightRigType_legacyNormal2: return "legacyNormal2";
- case NS_ooxml::LN_ST_LightRigType_legacyNormal3: return "legacyNormal3";
- case NS_ooxml::LN_ST_LightRigType_legacyNormal4: return "legacyNormal4";
- case NS_ooxml::LN_ST_LightRigType_legacyHarsh1: return "legacyHarsh1";
- case NS_ooxml::LN_ST_LightRigType_legacyHarsh2: return "legacyHarsh2";
- case NS_ooxml::LN_ST_LightRigType_legacyHarsh3: return "legacyHarsh3";
- case NS_ooxml::LN_ST_LightRigType_legacyHarsh4: return "legacyHarsh4";
- case NS_ooxml::LN_ST_LightRigType_threePt: return "threePt";
- case NS_ooxml::LN_ST_LightRigType_balanced: return "balanced";
- case NS_ooxml::LN_ST_LightRigType_soft: return "soft";
- case NS_ooxml::LN_ST_LightRigType_harsh: return "harsh";
- case NS_ooxml::LN_ST_LightRigType_flood: return "flood";
- case NS_ooxml::LN_ST_LightRigType_contrasting: return "contrasting";
- case NS_ooxml::LN_ST_LightRigType_morning: return "morning";
- case NS_ooxml::LN_ST_LightRigType_sunrise: return "sunrise";
- case NS_ooxml::LN_ST_LightRigType_sunset: return "sunset";
- case NS_ooxml::LN_ST_LightRigType_chilly: return "chilly";
- case NS_ooxml::LN_ST_LightRigType_freezing: return "freezing";
- case NS_ooxml::LN_ST_LightRigType_flat: return "flat";
- case NS_ooxml::LN_ST_LightRigType_twoPt: return "twoPt";
- case NS_ooxml::LN_ST_LightRigType_glow: return "glow";
- case NS_ooxml::LN_ST_LightRigType_brightRoom: return "brightRoom";
- default: break;
- }
- return OUString();
-}
-
-OUString TextEffectsHandler::getLightRigDirectionString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_LightRigDirection_tl: return "tl";
- case NS_ooxml::LN_ST_LightRigDirection_t: return "t";
- case NS_ooxml::LN_ST_LightRigDirection_tr: return "tr";
- case NS_ooxml::LN_ST_LightRigDirection_l: return "l";
- case NS_ooxml::LN_ST_LightRigDirection_r: return "r";
- case NS_ooxml::LN_ST_LightRigDirection_bl: return "bl";
- case NS_ooxml::LN_ST_LightRigDirection_b: return "b";
- case NS_ooxml::LN_ST_LightRigDirection_br: return "br";
-
- default: break;
- }
- return OUString();
-}
-
-OUString TextEffectsHandler::getBevelPresetTypeString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_BevelPresetType_relaxedInset: return "relaxedInset";
- case NS_ooxml::LN_ST_BevelPresetType_circle: return "circle";
- case NS_ooxml::LN_ST_BevelPresetType_slope: return "slope";
- case NS_ooxml::LN_ST_BevelPresetType_cross: return "cross";
- case NS_ooxml::LN_ST_BevelPresetType_angle: return "angle";
- case NS_ooxml::LN_ST_BevelPresetType_softRound: return "softRound";
- case NS_ooxml::LN_ST_BevelPresetType_convex: return "convex";
- case NS_ooxml::LN_ST_BevelPresetType_coolSlant: return "coolSlant";
- case NS_ooxml::LN_ST_BevelPresetType_divot: return "divot";
- case NS_ooxml::LN_ST_BevelPresetType_riblet: return "riblet";
- case NS_ooxml::LN_ST_BevelPresetType_hardEdge: return "hardEdge";
- case NS_ooxml::LN_ST_BevelPresetType_artDeco: return "artDeco";
- default: break;
- }
- return OUString();
-}
-
-OUString TextEffectsHandler::getPresetMaterialTypeString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_PresetMaterialType_legacyMatte: return "legacyMatte";
- case NS_ooxml::LN_ST_PresetMaterialType_legacyPlastic: return "legacyPlastic";
- case NS_ooxml::LN_ST_PresetMaterialType_legacyMetal: return "legacyMetal";
- case NS_ooxml::LN_ST_PresetMaterialType_legacyWireframe: return "legacyWireframe";
- case NS_ooxml::LN_ST_PresetMaterialType_matte: return "matte";
- case NS_ooxml::LN_ST_PresetMaterialType_plastic: return "plastic";
- case NS_ooxml::LN_ST_PresetMaterialType_metal: return "metal";
- case NS_ooxml::LN_ST_PresetMaterialType_warmMatte: return "warmMatte";
- case NS_ooxml::LN_ST_PresetMaterialType_translucentPowder: return "translucentPowder";
- case NS_ooxml::LN_ST_PresetMaterialType_powder: return "powder";
- case NS_ooxml::LN_ST_PresetMaterialType_dkEdge: return "dkEdge";
- case NS_ooxml::LN_ST_PresetMaterialType_softEdge: return "softEdge";
- case NS_ooxml::LN_ST_PresetMaterialType_clear: return "clear";
- case NS_ooxml::LN_ST_PresetMaterialType_flat: return "flat";
- case NS_ooxml::LN_ST_PresetMaterialType_softmetal: return "softmetal";
- case NS_ooxml::LN_ST_PresetMaterialType_none: return "none";
- default: break;
- }
- return OUString();
-}
-
-OUString TextEffectsHandler::getLigaturesString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_Ligatures_none: return "none";
- case NS_ooxml::LN_ST_Ligatures_standard: return "standard";
- case NS_ooxml::LN_ST_Ligatures_contextual: return "contextual";
- case NS_ooxml::LN_ST_Ligatures_historical: return "historical";
- case NS_ooxml::LN_ST_Ligatures_discretional: return "discretional";
- case NS_ooxml::LN_ST_Ligatures_standardContextual: return "standardContextual";
- case NS_ooxml::LN_ST_Ligatures_standardHistorical: return "standardHistorical";
- case NS_ooxml::LN_ST_Ligatures_contextualHistorical: return "contextualHistorical";
- case NS_ooxml::LN_ST_Ligatures_standardDiscretional: return "standardDiscretional";
- case NS_ooxml::LN_ST_Ligatures_contextualDiscretional: return "contextualDiscretional";
- case NS_ooxml::LN_ST_Ligatures_historicalDiscretional: return "historicalDiscretional";
- case NS_ooxml::LN_ST_Ligatures_standardContextualHistorical: return "standardContextualHistorical";
- case NS_ooxml::LN_ST_Ligatures_standardContextualDiscretional: return "standardContextualDiscretional";
- case NS_ooxml::LN_ST_Ligatures_standardHistoricalDiscretional: return "standardHistoricalDiscretional";
- case NS_ooxml::LN_ST_Ligatures_contextualHistoricalDiscretional: return "contextualHistoricalDiscretional";
- case NS_ooxml::LN_ST_Ligatures_all: return "all";
- default: break;
- }
- return OUString();
-}
-
-OUString TextEffectsHandler::getNumFormString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_NumForm_default: return "default";
- case NS_ooxml::LN_ST_NumForm_lining: return "lining";
- case NS_ooxml::LN_ST_NumForm_oldStyle: return "oldStyle";
- default: break;
- }
- return OUString();
-}
-
-OUString TextEffectsHandler::getNumSpacingString(sal_Int32 nType)
-{
- switch (nType)
- {
- case NS_ooxml::LN_ST_NumSpacing_default: return "default";
- case NS_ooxml::LN_ST_NumSpacing_proportional: return "proportional";
- case NS_ooxml::LN_ST_NumSpacing_tabular: return "tabular";
- default: break;
- }
- return OUString();
-}
-
-void TextEffectsHandler::convertElementIdToPropertyId(sal_Int32 aElementId)
-{
- switch(aElementId)
- {
- case NS_ooxml::LN_glow_glow:
- maPropertyId = PROP_CHAR_GLOW_TEXT_EFFECT;
- maElementName = "glow";
- break;
- case NS_ooxml::LN_shadow_shadow:
- maPropertyId = PROP_CHAR_SHADOW_TEXT_EFFECT;
- maElementName = "shadow";
- break;
- case NS_ooxml::LN_reflection_reflection:
- maPropertyId = PROP_CHAR_REFLECTION_TEXT_EFFECT;
- maElementName = "reflection";
- break;
- case NS_ooxml::LN_textOutline_textOutline:
- maPropertyId = PROP_CHAR_TEXTOUTLINE_TEXT_EFFECT;
- maElementName = "textOutline";
- break;
- case NS_ooxml::LN_textFill_textFill:
- maPropertyId = PROP_CHAR_TEXTFILL_TEXT_EFFECT;
- maElementName = "textFill";
- break;
- case NS_ooxml::LN_scene3d_scene3d:
- maPropertyId = PROP_CHAR_SCENE3D_TEXT_EFFECT;
- maElementName = "scene3d";
- break;
- case NS_ooxml::LN_props3d_props3d:
- maPropertyId = PROP_CHAR_PROPS3D_TEXT_EFFECT;
- maElementName = "props3d";
- break;
- case NS_ooxml::LN_ligatures_ligatures:
- maPropertyId = PROP_CHAR_LIGATURES_TEXT_EFFECT;
- maElementName = "ligatures";
- break;
- case NS_ooxml::LN_numForm_numForm:
- maPropertyId = PROP_CHAR_NUMFORM_TEXT_EFFECT;
- maElementName = "numForm";
- break;
- case NS_ooxml::LN_numSpacing_numSpacing:
- maPropertyId = PROP_CHAR_NUMSPACING_TEXT_EFFECT;
- maElementName = "numSpacing";
- break;
- case NS_ooxml::LN_stylisticSets_stylisticSets:
- maPropertyId = PROP_CHAR_STYLISTICSETS_TEXT_EFFECT;
- maElementName = "stylisticSets";
- break;
- case NS_ooxml::LN_cntxtAlts_cntxtAlts:
- maPropertyId = PROP_CHAR_CNTXTALTS_TEXT_EFFECT;
- maElementName = "cntxtAlts";
- break;
- default:
- break;
- }
-}
-
-TextEffectsHandler::TextEffectsHandler(sal_uInt32 aElementId) :
- LoggedProperties("TextEffectsHandler")
-{
- convertElementIdToPropertyId(aElementId);
- mpGrabBagStack.reset(new oox::GrabBagStack(maElementName));
-}
-
-TextEffectsHandler::~TextEffectsHandler()
-{
-}
-
-
-void TextEffectsHandler::lcl_attribute(Id aName, Value& aValue)
-{
- if (mpGrabBagStack->getCurrentName() != constAttributesSequenceName)
- mpGrabBagStack->push(constAttributesSequenceName);
-
- switch(aName)
- {
- case NS_ooxml::LN_CT_Percentage_val:
- case NS_ooxml::LN_CT_PositiveFixedPercentage_val:
- case NS_ooxml::LN_CT_PositivePercentage_val:
- mpGrabBagStack->addInt32("val", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Glow_rad:
- mpGrabBagStack->addInt32("rad", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_SchemeColor_val:
- {
- OUString aString = getSchemeColorValTypeString(sal_Int32(aValue.getInt()));
- mpGrabBagStack->addString("val", aString);
- }
- break;
- case NS_ooxml::LN_CT_SRgbColor_val:
- {
- OUString aBuffer = OUString::number(aValue.getInt(), 16);
- OUStringBuffer aString;
- comphelper::string::padToLength(aString, 6 - aBuffer.getLength(), '0');
- aString.append(aBuffer.getStr());
- mpGrabBagStack->addString("val", aString.makeStringAndClear().toAsciiUpperCase());
- }
- break;
- case NS_ooxml::LN_CT_Shadow_blurRad:
- case NS_ooxml::LN_CT_Reflection_blurRad:
- mpGrabBagStack->addInt32("blurRad", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Reflection_stA:
- mpGrabBagStack->addInt32("stA", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Reflection_stPos:
- mpGrabBagStack->addInt32("stPos", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Reflection_endA:
- mpGrabBagStack->addInt32("endA", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Reflection_endPos:
- mpGrabBagStack->addInt32("endPos", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Shadow_dist:
- case NS_ooxml::LN_CT_Reflection_dist:
- mpGrabBagStack->addInt32("dist", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Shadow_dir:
- case NS_ooxml::LN_CT_Reflection_dir:
- mpGrabBagStack->addInt32("dir", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Reflection_fadeDir:
- mpGrabBagStack->addInt32("fadeDir", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Shadow_sx:
- case NS_ooxml::LN_CT_Reflection_sx:
- mpGrabBagStack->addInt32("sx", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Shadow_sy:
- case NS_ooxml::LN_CT_Reflection_sy:
- mpGrabBagStack->addInt32("sy", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Shadow_kx:
- case NS_ooxml::LN_CT_Reflection_kx:
- mpGrabBagStack->addInt32("kx", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Shadow_ky:
- case NS_ooxml::LN_CT_Reflection_ky:
- mpGrabBagStack->addInt32("ky", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Shadow_algn:
- case NS_ooxml::LN_CT_Reflection_algn:
- {
- uno::Any aAny(getRectAlignmentString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("algn", aAny);
- }
- break;
- case NS_ooxml::LN_CT_TextOutlineEffect_w:
- mpGrabBagStack->addInt32("w", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_TextOutlineEffect_cap:
- {
- uno::Any aAny(getLineCapString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("cap", aAny);
- }
- break;
- case NS_ooxml::LN_CT_TextOutlineEffect_cmpd:
- {
- uno::Any aAny(getCompoundLineString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("cmpd", aAny);
- }
- break;
- case NS_ooxml::LN_CT_TextOutlineEffect_algn:
- {
- uno::Any aAny(getPenAlignmentString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("algn", aAny);
- }
- break;
- case NS_ooxml::LN_CT_GradientStop_pos:
- mpGrabBagStack->addInt32("pos", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_LinearShadeProperties_ang:
- mpGrabBagStack->addInt32("ang", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_LinearShadeProperties_scaled:
- {
- uno::Any aAny(getOnOffString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("scaled", aAny);
- }
- break;
- case NS_ooxml::LN_CT_PathShadeProperties_path:
- {
- uno::Any aAny(getPathShadeTypeString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("path", aAny);
- }
- break;
- case NS_ooxml::LN_CT_RelativeRect_l:
- mpGrabBagStack->addInt32("l", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_RelativeRect_t:
- mpGrabBagStack->addInt32("t", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_RelativeRect_r:
- mpGrabBagStack->addInt32("r", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_RelativeRect_b:
- mpGrabBagStack->addInt32("b", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_PresetLineDashProperties_val:
- {
- uno::Any aAny(getPresetLineDashValString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("val", aAny);
- }
- break;
- case NS_ooxml::LN_CT_LineJoinMiterProperties_lim:
- mpGrabBagStack->addInt32("lim", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Camera_prst:
- {
- uno::Any aAny(getPresetCameraTypeString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("prst", aAny);
- }
- break;
- case NS_ooxml::LN_CT_LightRig_rig:
- {
- uno::Any aAny(getLightRigTypeString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("rig", aAny);
- }
- break;
- case NS_ooxml::LN_CT_LightRig_dir:
- {
- uno::Any aAny(getLightRigDirectionString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("dir", aAny);
- }
- break;
- case NS_ooxml::LN_CT_SphereCoords_lat:
- mpGrabBagStack->addInt32("lat", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_SphereCoords_lon:
- mpGrabBagStack->addInt32("lon", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_SphereCoords_rev:
- mpGrabBagStack->addInt32("rev", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Props3D_extrusionH:
- mpGrabBagStack->addInt32("extrusionH", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Props3D_contourW:
- mpGrabBagStack->addInt32("contourW", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Props3D_prstMaterial:
- {
- uno::Any aAny(getPresetMaterialTypeString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("prstMaterial", aAny);
- }
- break;
- case NS_ooxml::LN_CT_Bevel_w:
- mpGrabBagStack->addInt32("w", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Bevel_h:
- mpGrabBagStack->addInt32("h", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_Bevel_prst:
- {
- uno::Any aAny(getBevelPresetTypeString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("prst", aAny);
- }
- break;
- case NS_ooxml::LN_CT_Ligatures_val:
- {
- uno::Any aAny(getLigaturesString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("val", aAny);
- }
- break;
- case NS_ooxml::LN_CT_NumForm_val:
- {
- uno::Any aAny(getNumFormString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("val", aAny);
- }
- break;
- case NS_ooxml::LN_CT_NumSpacing_val:
- {
- uno::Any aAny(getNumSpacingString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("val", aAny);
- }
- break;
- case NS_ooxml::LN_CT_StyleSet_id:
- mpGrabBagStack->addInt32("id", sal_Int32(aValue.getInt()));
- break;
- case NS_ooxml::LN_CT_StyleSet_val:
- case NS_ooxml::LN_CT_OnOff_val:
- {
- uno::Any aAny(getOnOffString(sal_Int32(aValue.getInt())));
- mpGrabBagStack->appendElement("val", aAny);
- }
- break;
- default:
- break;
- }
-}
-
-void TextEffectsHandler::lcl_sprm(Sprm& rSprm)
-{
- if (mpGrabBagStack->getCurrentName() == constAttributesSequenceName)
- mpGrabBagStack->pop();
-
- sal_uInt32 nSprmId = rSprm.getId();
- OUString aElementName = lclGetNameForElementId(nSprmId);
- if(aElementName.isEmpty())
- {
- // Element is unknown -> leave.
- return;
- }
-
- mpGrabBagStack->push(aElementName);
-
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( !pProperties )
- return;
-
- pProperties->resolve( *this );
-
- if (mpGrabBagStack->getCurrentName() == constAttributesSequenceName)
- mpGrabBagStack->pop();
-
- mpGrabBagStack->pop();
-}
-
-beans::PropertyValue TextEffectsHandler::getInteropGrabBag()
-{
- beans::PropertyValue aReturn = mpGrabBagStack->getRootProperty();
- mpGrabBagStack.reset();
- return aReturn;
-}
-
-sal_uInt8 TextEffectsHandler::GetTextFillSolidFillAlpha(const css::beans::PropertyValue& rValue)
-{
- if (rValue.Name != "textFill")
- {
- return 0;
- }
-
- uno::Sequence<beans::PropertyValue> aPropertyValues;
- rValue.Value >>= aPropertyValues;
- comphelper::SequenceAsHashMap aMap(aPropertyValues);
- auto it = aMap.find("solidFill");
- if (it == aMap.end())
- {
- return 0;
- }
-
- comphelper::SequenceAsHashMap aSolidFillMap(it->second);
- it = aSolidFillMap.find("srgbClr");
- if (it == aSolidFillMap.end())
- {
- it = aSolidFillMap.find("schemeClr");
- if (it == aSolidFillMap.end())
- return 0;
- }
-
- comphelper::SequenceAsHashMap aSrgbClrMap(it->second);
- it = aSrgbClrMap.find("alpha");
- if (it == aSrgbClrMap.end())
- {
- return 0;
- }
-
- comphelper::SequenceAsHashMap aAlphaMap(it->second);
- it = aAlphaMap.find("attributes");
- if (it == aAlphaMap.end())
- {
- return 0;
- }
-
- comphelper::SequenceAsHashMap aAttributesMap(it->second);
- it = aAttributesMap.find("val");
- if (it == aAttributesMap.end())
- {
- return 0;
- }
- sal_Int32 nVal = 0;
- it->second >>= nVal;
- return nVal / oox::drawingml::PER_PERCENT;
-}
-
-} // namespace
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TextEffectsHandler.hxx b/writerfilter/source/dmapper/TextEffectsHandler.hxx
deleted file mode 100644
index 30a8435b2829..000000000000
--- a/writerfilter/source/dmapper/TextEffectsHandler.hxx
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- 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/.
- *
- */
-
-#pragma once
-
-#include "LoggedResources.hxx"
-
-#include <com/sun/star/beans/PropertyValue.hpp>
-
-#include "PropertyIds.hxx"
-
-#include <oox/helper/grabbagstack.hxx>
-
-#include <memory>
-#include <optional>
-
-namespace writerfilter::dmapper
-{
-/// Class to process all text effects like glow, textOutline, ...
-class TextEffectsHandler : public LoggedProperties
-{
-private:
- std::optional<PropertyIds> maPropertyId;
- OUString maElementName;
- std::unique_ptr<oox::GrabBagStack> mpGrabBagStack;
-
- void convertElementIdToPropertyId(sal_Int32 aElementId);
-
-public:
- explicit TextEffectsHandler(sal_uInt32 aElementId);
- virtual ~TextEffectsHandler() override;
-
- const std::optional<PropertyIds>& getGrabBagPropertyId() const { return maPropertyId; }
-
- css::beans::PropertyValue getInteropGrabBag();
-
- static OUString getSchemeColorValTypeString(sal_Int32 nType);
- static OUString getRectAlignmentString(sal_Int32 nType);
- static OUString getLineCapString(sal_Int32 nType);
- static OUString getCompoundLineString(sal_Int32 nType);
- static OUString getPenAlignmentString(sal_Int32 nType);
- static OUString getOnOffString(sal_Int32 nType);
- static OUString getPathShadeTypeString(sal_Int32 nType);
- static OUString getPresetLineDashValString(sal_Int32 nType);
- static OUString getPresetCameraTypeString(sal_Int32 nType);
- static OUString getLightRigTypeString(sal_Int32 nType);
- static OUString getLightRigDirectionString(sal_Int32 nType);
- static OUString getBevelPresetTypeString(sal_Int32 nType);
- static OUString getPresetMaterialTypeString(sal_Int32 nType);
- static OUString getLigaturesString(sal_Int32 nType);
- static OUString getNumFormString(sal_Int32 nType);
- static OUString getNumSpacingString(sal_Int32 nType);
-
- static sal_uInt8 GetTextFillSolidFillAlpha(const css::beans::PropertyValue& rValue);
-
- // LoggedProperties
- virtual void lcl_attribute(Id aName, Value& aValue) override;
- virtual void lcl_sprm(Sprm& sprm) override;
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/ThemeColorHandler.hxx b/writerfilter/source/dmapper/ThemeColorHandler.hxx
deleted file mode 100644
index 012b4ee3472f..000000000000
--- a/writerfilter/source/dmapper/ThemeColorHandler.hxx
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- 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/.
- *
- */
-
-#pragma once
-
-#include "LoggedResources.hxx"
-
-#include <com/sun/star/beans/PropertyValue.hpp>
-
-#include "PropertyIds.hxx"
-
-#include <oox/helper/grabbagstack.hxx>
-#include <docmodel/uno/UnoComplexColor.hxx>
-
-#include <memory>
-#include <optional>
-
-namespace writerfilter::dmapper
-{
-/// Class to process all text effects like glow, textOutline, ...
-class ThemeColorHandler : public LoggedProperties
-{
-public:
- sal_Int32 mnColor = 0;
- sal_Int32 mnIndex = -1;
- sal_Int32 mnTint = 0;
- sal_Int32 mnShade = 0;
-
- explicit ThemeColorHandler()
- : LoggedProperties("ThemeColorHandler")
- {
- }
-
- virtual void lcl_attribute(Id aName, Value& rValue) override
- {
- sal_Int32 nIntValue = rValue.getInt();
-
- switch (aName)
- {
- case NS_ooxml::LN_CT_Color_val:
- mnColor = nIntValue;
- break;
- case NS_ooxml::LN_CT_Color_themeColor:
- mnIndex = nIntValue;
- break;
-
- case NS_ooxml::LN_CT_Color_themeTint:
- mnTint = nIntValue;
- break;
-
- case NS_ooxml::LN_CT_Color_themeShade:
- mnShade = nIntValue;
- break;
- }
- }
-
- virtual void lcl_sprm(Sprm& /*sprm*/) override {}
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/ThemeHandler.cxx b/writerfilter/source/dmapper/ThemeHandler.cxx
deleted file mode 100644
index 1acd7073f69c..000000000000
--- a/writerfilter/source/dmapper/ThemeHandler.cxx
+++ /dev/null
@@ -1,423 +0,0 @@
-/* -*- 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 "ThemeHandler.hxx"
-#include <i18nlangtag/languagetag.hxx>
-#include <ooxml/resourceids.hxx>
-#include <docmodel/theme/Theme.hxx>
-
-using namespace com::sun::star;
-
-namespace writerfilter::dmapper
-{
-namespace
-{
-OUString fromLCIDToScriptTag(LanguageType lang)
-{
- // conversion list from:
- // http://blogs.msdn.com/b/officeinteroperability/archive/2013/04/22/office-open-xml-themes-schemes-and-fonts.aspx
- switch (static_cast<sal_uInt16>(lang))
- {
- case 0x429: // lidFarsi
- case 0x401: // lidArabic
- case 0x801: // lidIraq
- case 0xc01: // lidEgyptian
- case 0x1001: // lidLibya
- case 0x1401: // lidAlgerian
- case 0x1801: // lidMorocco
- case 0x1c01: // lidTunisia
- case 0x2001: // lidOman
- case 0x2401: // lidYemen
- case 0x2801: // lidSyria
- case 0x2c01: // lidJordan
- case 0x3001: // lidLebanon
- case 0x3401: // lidKuwait
- case 0x3801: // lidUAE
- case 0x3c01: // lidBahrain
- case 0x4001: // lidQatar
- case 0x420: // lidUrdu
- case 0x846: // lidPunjabiPakistan
- case 0x859: // lidSindhiPakistan
- case 0x45f: // lidTamazight
- case 0x460: // lidKashmiri
- case 0x463: // lidPashto
- case 0x48c: // lidDari
- return "Arab";
- case 0x42b: // lidArmenian
- return "Armn";
- case 0x445: // lidBengali
- case 0x845: // lidBengaliBangladesh
- case 0x44d: // lidAssamese
- case 0x458: // lidManipuri
- return "Beng";
- case 0x45d: // lidInuktitut
- return "Cans";
- case 0x45c: // lidCherokee
- return "Cher";
- case 0x419: // lidRussian
- case 0x402: // lidBulgarian
- case 0x281a: // lidSerbianCyrillic
- case 0x422: // lidUkranian
- case 0x819: // lidRussianMoldavia
- case 0xc1a: // lidSerbianCyrillicSerbMont
- case 0x1c1a: // lidSerbianBosniaHerzegovinaCyrillic
- case 0x201a: // lidBosnianBosniaHerzegovinaCyrillic
- case 0x301a: // lidSerbianMontenegroCyrillic
- case 0x423: // lidByelorussian
- case 0x428: // lidTajik
- case 0x82c: // lidAzeriCyrillic
- case 0x42f: // lidMacedonian
- case 0x43f: // lidKazakh
- case 0x440: // lidKyrgyz
- case 0x843: // lidUzbekCyrillic
- case 0x444: // lidTatar
- case 0x450: // lidMongolian
- case 0x46d: // lidBashkir
- case 0x485: // lidSakha
- return "Cyrl";
- case 0x439: // lidHindi
- case 0x44e: // lidMarathi
- case 0x44f: // lidSanskrit
- case 0x457: // lidKonkani
- case 0x459: // lidSindhi
- case 0x860: // lidKashmiriIndia
- case 0x461: // lidNepali
- case 0x861: // lidNepaliIndia
- return "Deva";
- case 0x45e: // lidAmharic
- case 0x473: // lidTigrignaEthiopic
- case 0x873: // lidTigrignaEritrea
- return "Ethi";
- case 0x437: // lidGeorgian
- return "Geor";
- case 0x408: // lidGreek
- return "Grek";
- case 0x447: // lidGujarati
- return "Gujr";
- case 0x446: // lidPunjabi
- return "Guru";
- case 0x412: // lidKoreanExtWansung
- return "Hang";
- case 0x804: // lidChineseSimp
- case 0x1004: // lidSingapore
- return "Hans";
- case 0x404: // lidChineseTrad
- case 0xc04: // lidHongkong
- case 0x1404: // lidMacau
- return "Hant";
- case 0x40d: // lidHebrew
- case 0x43d: // lidYiddish
- return "Hebr";
- case 0x411: // lidJapanese
- return "Jpan";
- case 0x453: // lidKhmer
- return "Khmr";
- case 0x44b: // lidKannada
- return "Knda";
- case 0x454: // lidLao
- return "Laoo";
- case 0x409: // lidAmerican
- case 0xc09: // lidAustralian
- case 0x809: // lidBritish
- case 0x1009: // lidEnglishCanadian
- case 0x403: // lidCatalan
- case 0x406: // lidDanish
- case 0x413: // lidDutch
- case 0x813: // lidDutchBelgian
- case 0x479: // lidPapiamentu
- case 0x40b: // lidFinnish
- case 0x40c: // lidFrench
- case 0xc0c: // lidFrenchCanadian
- case 0x407: // lidGerman
- case 0x807: // lidSwissGerman
- case 0xc07: // lidAustrianGerman
- case 0x1007: // lidGermanLuxembourg
- case 0x1407: // lidGermanLiechtenstein
- case 0x410: // lidItalian
- case 0x414: // lidNorskBokmal
- case 0x814: // lidNorskNynorsk
- case 0x416: // lidPortBrazil
- case 0x816: // lidPortIberian
- case 0x40a: // lidSpanish
- case 0x41d: // lidSwedish
- case 0x405: // lidCzech
- case 0x40e: // lidHungarian
- case 0x415: // lidPolish
- case 0x41f: // lidTurkish
- case 0x42d: // lidBasque
- case 0x424: // lidSlovenian
- case 0x426: // lidLatvian
- case 0x427: // lidLithuanian
- case 0x418: // lidRomanian
- case 0x818: // lidRomanianMoldavia
- case 0x241a: // lidSerbianLatin
- case 0x41a: // lidCroatian, lidCroat
- case 0x491: // lidGaelicScots
- case 0x83c: // lidGaelicIrish
- case 0x430: // lidSutu
- case 0x431: // lidTsonga
- case 0x432: // lidTswana
- case 0x433: // lidVenda
- case 0x434: // lidXhosa
- case 0x435: // lidZulu
- case 0x436: // lidAfrikaans
- case 0x425: // lidEstonian
- case 0x456: // lidGalician
- case 0x41b: // lidSlovak
- case 0x1409: // lidEnglishNewZealand
- case 0x1809: // lidEnglishIreland
- case 0x1c09: // lidEnglishSouthAfrica
- case 0x2009: // lidEnglishJamaica
- case 0x2409: // lidEnglishCaribbean
- case 0x2809: // lidEnglishBelize
- case 0x2c09: // lidEnglishTrinidad
- case 0x3009: // lidEnglishZimbabwe
- case 0x3409: // lidEnglishPhilippines
- case 0x3809: // lidEnglishIndonesia
- case 0x3c09: // lidEnglishHongKong
- case 0x4009: // lidEnglishIndia
- case 0x4409: // lidEnglishMalaysia
- case 0x4809: // lidEnglishSingapore
- case 0x80a: // lidSpanishMexican, lidMexican
- case 0xc0a: // lidSpanishModern
- case 0x100a: // lidGuatemala
- case 0x140a: // lidCostaRica
- case 0x180a: // lidPanama
- case 0x1c0a: // lidDominicanRepublic
- case 0x200a: // lidSpanishSA, lidVenezuela
- case 0x240a: // lidColombia
- case 0x280a: // lidPeru
- case 0x2c0a: // lidArgentina
- case 0x300a: // lidEcuador
- case 0x340a: // lidChile
- case 0x380a: // lidUruguay
- case 0x3c0a: // lidParguay
- case 0x400a: // lidBolivia
- case 0x440a: // lidElSalvador
- case 0x480a: // lidHonduras
- case 0x4c0a: // lidNicaragua
- case 0x500a: // lidPuertoRico
- case 0x540a: // lidSpanishUS
- case 0x80c: // lidFrenchBelgian
- case 0x100c: // lidFrenchSwiss
- case 0x140c: // lidFrenchLuxembourg
- case 0x180c: // lidFrenchMonaco
- case 0x1c0c: // lidFrenchWestIndies
- case 0x200c: // lidFrenchReunion
- case 0x240c: // lidFrenchCongoDRC, lidFrenchZaire
- case 0x280c: // lidFrenchSenegal
- case 0x2c0c: // lidFrenchCameroon
- case 0x300c: // lidFrenchCotedIvoire
- case 0x340c: // lidFrenchMali
- case 0x3c0c: // lidFrenchHaiti
- case 0x380c: // lidFrenchMorocco
- case 0x40f: // lidIcelandic
- case 0x810: // lidItalianSwiss
- case 0x417: // lidRhaetoRomanic, lidRomanic
- case 0x81a: // lidSerbianLatinSerbMont, lidCroatSerbo
- case 0x101a: // lidBosniaHerzegovina
- case 0x141a: // lidBosnianBosniaHerzegovinaLatin
- case 0x181a: // lidSerbianBosniaHerzegovinaLatin
- case 0x2c1a: // lidSerbianMontenegroLatin
- case 0x41c: // lidAlbanian
- case 0x81d: // lidSwedishFinland
- case 0x421: // lidBahasa, lidIndonesian
- case 0x42c: // lidAzeriLatin
- case 0x42e: // lidSorbian
- case 0x82e: // lidLowerSorbian
- case 0x438: // lidFaeroese
- case 0x43a: // lidMaltese
- case 0x43b: // lidSamiLappish
- case 0x83b: // lidNorthSamiSwe
- case 0xc3b: // lidNorthernSamiFi
- case 0x103b: // lidLuleSamiNor
- case 0x143b: // lidLuleSamiSwe
- case 0x183b: // lidSouthSamiNor
- case 0x1c3b: // lidSouthSamiSwe
- case 0x203b: // lidSkoltSami
- case 0x243b: // lidInariSami
- case 0x43e: // lidMalaysian
- case 0x83e: // lidMalayBrunei
- case 0x441: // lidSwahili
- case 0x442: // lidTurkmen
- case 0x443: // lidUzbekLatin
- case 0x452: // lidWelsh
- case 0x85d: // lidInuktitutLatin
- case 0x85f: // lidTamazightLatin
- case 0x462: // lidFrisian
- case 0x464: // lidFilipino
- case 0x466: // lidEdo
- case 0x467: // lidFulfulde
- case 0x468: // lidHausa
- case 0x469: // lidIbibio
- case 0x46a: // lidYoruba
- case 0x46b: // lidQuechuaBol
- case 0x86b: // lidQuechuaEcu
- case 0xc6b: // lidQuechuaPe
- case 0x46c: // lidSesothoSaLeboa
- case 0x46e: // lidLuxembourgish
- case 0x46f: // lidGreenlandic
- case 0x470: // lidIgbo
- case 0x471: // lidKanuri
- case 0x472: // lidOromo
- case 0x474: // lidGuarani
- case 0x475: // lidHawaiian
- case 0x476: // lidLatin
- case 0x477: // lidSomali
- case 0x47a: // lidMapudungun
- case 0x47c: // lidMohawk
- case 0x47e: // lidBreton
- case 0x481: // lidMaori
- case 0x482: // lidOccitan
- case 0x483: // lidCorsican
- case 0x484: // lidAlsatian
- case 0x486: // lidKiche
- case 0x487: // lidKinyarwanda
- case 0x488: // lidWolof
- return "Latn";
- case 0x44c: // lidMalayalam
- return "Mlym";
- case 0x850: // lidMongolianMongo
- return "Mong";
- case 0x455: // lidBurmese
- return "Mymr";
- case 0x448: // lidOriya
- return "Orya";
- case 0x45b: // lidSinhalese
- return "Sinh";
- case 0x45a: // lidSyriac
- return "Syrc";
- case 0x449: // lidTamil
- return "Taml";
- case 0x44a: // lidTelugu
- return "Telu";
- case 0x465: // lidMaldivian
- return "Thaa";
- case 0x41e: // lidThai
- return "Thai";
- case 0x451: // lidTibetan
- case 0x851: // lidBhutanese
- return "Tibt";
- case 0x480: // lidUighur
- return "Uigh";
- case 0x42a: // lidVietnamese
- return "Viet";
- case 0x478: // lidYi
- return "Yiii";
- default:
- return OUString();
- }
-}
-
-OUString fromLocaleToScriptTag(const OUString& sLocale)
-{
- return fromLCIDToScriptTag(LanguageTag::convertToLanguageType(sLocale));
-}
-
-OUString resolveMajorMinorTypeFace(model::FontScheme const& rFontSheme, const Id id)
-{
- switch (id)
- {
- case NS_ooxml::LN_Value_ST_Theme_majorEastAsia:
- return rFontSheme.getMajorAsian().maTypeface;
- case NS_ooxml::LN_Value_ST_Theme_majorBidi:
- return rFontSheme.getMajorComplex().maTypeface;
- case NS_ooxml::LN_Value_ST_Theme_majorAscii:
- case NS_ooxml::LN_Value_ST_Theme_majorHAnsi:
- return rFontSheme.getMajorLatin().maTypeface;
- break;
- case NS_ooxml::LN_Value_ST_Theme_minorEastAsia:
- return rFontSheme.getMinorAsian().maTypeface;
- case NS_ooxml::LN_Value_ST_Theme_minorBidi:
- return rFontSheme.getMinorComplex().maTypeface;
- case NS_ooxml::LN_Value_ST_Theme_minorAscii:
- case NS_ooxml::LN_Value_ST_Theme_minorHAnsi:
- return rFontSheme.getMinorLatin().maTypeface;
- break;
- default:
- break;
- }
- return OUString();
-}
-
-OUString resolveSupplementalFontList(model::FontScheme const& rFontSheme, const Id id,
- std::u16string_view rLangAsia, std::u16string_view rLangBidi)
-{
- switch (id)
- {
- case NS_ooxml::LN_Value_ST_Theme_majorEastAsia:
- return rFontSheme.findMajorSupplementalTypeface(rLangAsia);
- case NS_ooxml::LN_Value_ST_Theme_majorBidi:
- return rFontSheme.findMajorSupplementalTypeface(rLangBidi);
- case NS_ooxml::LN_Value_ST_Theme_minorEastAsia:
- return rFontSheme.findMinorSupplementalTypeface(rLangAsia);
- case NS_ooxml::LN_Value_ST_Theme_minorBidi:
- return rFontSheme.findMinorSupplementalTypeface(rLangBidi);
- default:
- break;
- }
- return OUString();
-}
-
-} // end anonymous namespace
-
-ThemeHandler::ThemeHandler(oox::drawingml::ThemePtr const& pTheme,
- const css::uno::Sequence<css::beans::PropertyValue>& rLangProperties)
- : mpTheme(pTheme)
-{
- for (const auto& rProperty : rLangProperties)
- {
- OUString sLocaleName;
- rProperty.Value >>= sLocaleName;
- if (rProperty.Name == "eastAsia")
- maThemeFontLangEastAsia = fromLocaleToScriptTag(sLocaleName);
- if (rProperty.Name == "bidi")
- maThemeFontLangBidi = fromLocaleToScriptTag(sLocaleName);
- }
-}
-
-OUString ThemeHandler::getStringForTheme(const Id id)
-{
- switch (id)
- {
- case NS_ooxml::LN_Value_ST_Theme_majorEastAsia:
- return "majorEastAsia";
- case NS_ooxml::LN_Value_ST_Theme_majorBidi:
- return "majorBidi";
- case NS_ooxml::LN_Value_ST_Theme_majorAscii:
- return "majorAscii";
- case NS_ooxml::LN_Value_ST_Theme_majorHAnsi:
- return "majorHAnsi";
- case NS_ooxml::LN_Value_ST_Theme_minorEastAsia:
- return "minorEastAsia";
- case NS_ooxml::LN_Value_ST_Theme_minorBidi:
- return "minorBidi";
- case NS_ooxml::LN_Value_ST_Theme_minorAscii:
- return "minorAscii";
- case NS_ooxml::LN_Value_ST_Theme_minorHAnsi:
- return "minorHAnsi";
- }
- return OUString();
-}
-
-OUString ThemeHandler::getFontNameForTheme(const Id id) const
-{
- auto pModelTheme = mpTheme->getTheme();
- model::FontScheme const& rFontScheme = pModelTheme->getFontScheme();
- OUString aSupplementalTypeFace = resolveSupplementalFontList(
- rFontScheme, id, maThemeFontLangEastAsia, maThemeFontLangBidi);
- if (!aSupplementalTypeFace.isEmpty())
- return aSupplementalTypeFace;
- OUString aTypeFace = resolveMajorMinorTypeFace(rFontScheme, id);
- return aTypeFace;
-}
-
-} //namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/ThemeHandler.hxx b/writerfilter/source/dmapper/ThemeHandler.hxx
deleted file mode 100644
index 8d7574991b29..000000000000
--- a/writerfilter/source/dmapper/ThemeHandler.hxx
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <i18nlangtag/lang.h>
-#include <memory>
-#include <oox/drawingml/theme.hxx>
-#include <ooxml/resourceids.hxx>
-
-namespace writerfilter::dmapper
-{
-class ThemeHandler
-{
-private:
- oox::drawingml::ThemePtr mpTheme;
- OUString maThemeFontLangEastAsia;
- OUString maThemeFontLangBidi;
-
-public:
- ThemeHandler(oox::drawingml::ThemePtr const& pTheme,
- const css::uno::Sequence<css::beans::PropertyValue>& rLangProperties);
- OUString getFontNameForTheme(const Id id) const;
- static OUString getStringForTheme(const Id id);
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TrackChangesHandler.cxx b/writerfilter/source/dmapper/TrackChangesHandler.cxx
deleted file mode 100644
index 47a52d6df695..000000000000
--- a/writerfilter/source/dmapper/TrackChangesHandler.cxx
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- 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 <comphelper/propertyvalue.hxx>
-#include "TrackChangesHandler.hxx"
-#include "PropertyMap.hxx"
-#include "ConversionHelper.hxx"
-#include <ooxml/resourceids.hxx>
-#include <oox/token/tokens.hxx>
-#include <osl/diagnose.h>
-
-namespace writerfilter::dmapper {
-
-using namespace ::com::sun::star;
-using namespace oox;
-
-
-TrackChangesHandler::TrackChangesHandler( sal_Int32 nToken ) :
- LoggedProperties("TrackChangesHandler"),
- m_pRedlineParams(new RedlineParams)
-{
- m_pRedlineParams->m_nToken = nToken;
-}
-
-
-TrackChangesHandler::~TrackChangesHandler()
-{
-}
-
-
-void TrackChangesHandler::lcl_attribute(Id rName, Value & rVal)
-{
- OUString sStringValue = rVal.getString();
- switch( rName )
- {
- case NS_ooxml::LN_CT_TrackChange_author:
- {
- m_pRedlineParams->m_sAuthor = sStringValue;
- }
- break;
- case NS_ooxml::LN_CT_TrackChange_date:
- {
- m_pRedlineParams->m_sDate = sStringValue;
- }
- break;
- case NS_ooxml::LN_CT_Markup_id:
- break;
- default:
- OSL_FAIL( "unknown attribute");
- }
-}
-
-uno::Sequence<beans::PropertyValue> TrackChangesHandler::getRedlineProperties() const
-{
- OUString sType;
- switch ( m_pRedlineParams->m_nToken & 0xffff )
- {
- case XML_tableRowInsert:
- sType = getPropertyName( PROP_TABLE_ROW_INSERT );
- break;
- case XML_tableRowDelete:
- sType = getPropertyName( PROP_TABLE_ROW_DELETE );
- break;
- case XML_tableCellInsert:
- sType = getPropertyName( PROP_TABLE_CELL_INSERT );
- break;
- case XML_tableCellDelete:
- sType = getPropertyName( PROP_TABLE_CELL_DELETE );
- break;
- }
- return {
- comphelper::makePropertyValue(getPropertyName(PROP_REDLINE_TYPE ), uno::Any(sType)),
- comphelper::makePropertyValue(getPropertyName(PROP_REDLINE_AUTHOR), uno::Any(m_pRedlineParams->m_sAuthor)),
- comphelper::makePropertyValue(getPropertyName(PROP_REDLINE_DATE_TIME), uno::Any(ConversionHelper::ConvertDateStringToDateTime( m_pRedlineParams->m_sDate )))
- //comphelper::makePropertyValue(getPropertyName(PROP_REDLINE_REVERT_PROPERTIES), uno::Any(pRedline->m_aRevertProperties))
- };
-}
-
-void TrackChangesHandler::lcl_sprm(Sprm &) {}
-
-} //namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/TrackChangesHandler.hxx b/writerfilter/source/dmapper/TrackChangesHandler.hxx
deleted file mode 100644
index b3417ccced1f..000000000000
--- a/writerfilter/source/dmapper/TrackChangesHandler.hxx
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- 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/.
- */
-#pragma once
-
-#include "LoggedResources.hxx"
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <dmapper/PropertyMap.hxx>
-
-namespace writerfilter::dmapper
-{
-/** Handler for sprms that contain 'track changes' attributes
- - Author
- - Date
- - ID
- (This class is based on work done in 'MeasureHandler')
- */
-class TrackChangesHandler : public LoggedProperties
-{
- RedlineParamsPtr m_pRedlineParams;
-
- // Properties
- virtual void lcl_attribute(Id Name, Value& val) override;
- virtual void lcl_sprm(Sprm& sprm) override;
-
-public:
- explicit TrackChangesHandler(sal_Int32 nToken);
- virtual ~TrackChangesHandler() override;
-
- /// Compute the UNO properties for the track changes object based on the received tokens.
- css::uno::Sequence<css::beans::PropertyValue> getRedlineProperties() const;
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/WrapPolygonHandler.cxx b/writerfilter/source/dmapper/WrapPolygonHandler.cxx
deleted file mode 100644
index 319fae5c4cb0..000000000000
--- a/writerfilter/source/dmapper/WrapPolygonHandler.cxx
+++ /dev/null
@@ -1,214 +0,0 @@
-/* -*- 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/.
- *
- * 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 <com/sun/star/drawing/PointSequence.hpp>
-#include <com/sun/star/text/GraphicCrop.hpp>
-#include <comphelper/sequence.hxx>
-#include <tools/UnitConversion.hxx>
-
-#include <ooxml/resourceids.hxx>
-
-#include "WrapPolygonHandler.hxx"
-#include "util.hxx"
-
-#include <sal/log.hxx>
-
-namespace writerfilter {
-
-using namespace com::sun::star;
-
-namespace dmapper {
-
-WrapPolygon::WrapPolygon()
-{
-}
-
-WrapPolygon::~WrapPolygon()
-{
-}
-
-void WrapPolygon::addPoint(const awt::Point & rPoint)
-{
- mPoints.push_back(rPoint);
-}
-
-WrapPolygon::Points_t::const_iterator WrapPolygon::begin() const
-{
- return mPoints.begin();
-}
-
-WrapPolygon::Points_t::const_iterator WrapPolygon::end() const
-{
- return mPoints.end();
-}
-
-WrapPolygon::Pointer_t WrapPolygon::move(const awt::Point & rPoint) const
-{
- WrapPolygon::Pointer_t pResult(new WrapPolygon);
-
- Points_t::const_iterator aIt = begin();
- Points_t::const_iterator aItEnd = end();
-
- while (aIt != aItEnd)
- {
- awt::Point aPoint(aIt->X + rPoint.X, aIt->Y + rPoint.Y);
- pResult->addPoint(aPoint);
- ++aIt;
- }
-
- return pResult;
-}
-
-WrapPolygon::Pointer_t WrapPolygon::scale(const Fraction & rFractionX, const Fraction & rFractionY) const
-{
- WrapPolygon::Pointer_t pResult(new WrapPolygon);
-
- Points_t::const_iterator aIt = begin();
- Points_t::const_iterator aItEnd = end();
-
- while (aIt != aItEnd)
- {
- awt::Point aPoint((Fraction(tools::Long(aIt->X)) * rFractionX).operator long(), (Fraction(tools::Long(aIt->Y)) * rFractionY).operator long());
- pResult->addPoint(aPoint);
- ++aIt;
- }
-
- return pResult;
-}
-
-WrapPolygon::Pointer_t WrapPolygon::correctWordWrapPolygon(const awt::Size & rSrcSize) const
-{
- WrapPolygon::Pointer_t pResult;
-
- const tools::Long nWrap100Percent = 21600;
-
- Fraction aMove(nWrap100Percent, rSrcSize.Width);
- aMove = aMove * Fraction(convertTwipToMm100(15), 1);
- awt::Point aMovePoint(aMove.operator long(), 0);
- pResult = move(aMovePoint);
-
- Fraction aScaleX = nWrap100Percent / (nWrap100Percent + aMove);
- Fraction aScaleY = nWrap100Percent / (nWrap100Percent - aMove);
- pResult = pResult->scale(aScaleX, aScaleY);
-
- Fraction aScaleSrcX(rSrcSize.Width, nWrap100Percent);
- Fraction aScaleSrcY(rSrcSize.Height, nWrap100Percent);
- pResult = pResult->scale(aScaleSrcX, aScaleSrcY);
-
- return pResult;
-}
-
-WrapPolygon::Pointer_t WrapPolygon::correctWordWrapPolygonPixel(const awt::Size & rSrcSize) const
-{
- WrapPolygon::Pointer_t pResult;
-
- /*
- * https://msdn.microsoft.com/en-us/library/ee342530.aspx
- *
- * Image wrapping polygons in Microsoft Word use a fixed coordinate space
- * that is 21600 units x 21600 units. Coordinate (0,0) is the upper left
- * corner of the image and coordinate (21600,21600) is the lower right
- * corner of the image. Microsoft Word scales the size of the wrapping
- * polygon units to fit the size of the image. The 21600 value is a legacy
- * artifact from the drawing layer of early versions of Microsoft Office.
- */
- const tools::Long nWrap100Percent = 21600;
-
- Fraction aScaleX(rSrcSize.Width, nWrap100Percent);
- Fraction aScaleY(rSrcSize.Height, nWrap100Percent);
- pResult = scale(aScaleX, aScaleY);
-
- return pResult;
-}
-
-WrapPolygon::Pointer_t WrapPolygon::correctCrop(const awt::Size& rGraphicSize,
- const text::GraphicCrop& rGraphicCrop) const
-{
- WrapPolygon::Pointer_t pResult;
-
- Fraction aScaleX(rGraphicSize.Width - rGraphicCrop.Left - rGraphicCrop.Right,
- rGraphicSize.Width);
- Fraction aScaleY(rGraphicSize.Height - rGraphicCrop.Top - rGraphicCrop.Bottom,
- rGraphicSize.Height);
- pResult = scale(aScaleX, aScaleY);
-
- awt::Point aMove(rGraphicCrop.Left, rGraphicCrop.Top);
- pResult = pResult->move(aMove);
-
- return pResult;
-}
-
-drawing::PointSequenceSequence WrapPolygon::getPointSequenceSequence() const
-{
- return { comphelper::containerToSequence(mPoints) };
-}
-
-WrapPolygonHandler::WrapPolygonHandler()
- : LoggedProperties("WrapPolygonHandler")
- , mpPolygon(new WrapPolygon)
- , mnX(0)
- , mnY(0)
-{
-}
-
-WrapPolygonHandler::~WrapPolygonHandler()
-{
-}
-
-void WrapPolygonHandler::lcl_attribute(Id Name, Value & val)
-{
- sal_Int32 nIntValue = val.getInt();
-
- switch(Name)
- {
- case NS_ooxml::LN_CT_Point2D_x:
- mnX = nIntValue;
- break;
- case NS_ooxml::LN_CT_Point2D_y:
- mnY = nIntValue;
- break;
- default:
- SAL_WARN("writerfilter", "WrapPolygonHandler::lcl_attribute: unhandled token: " << Name);
- break;
- }
-}
-
-void WrapPolygonHandler::lcl_sprm(Sprm & _sprm)
-{
- switch (_sprm.getId())
- {
- case NS_ooxml::LN_CT_WrapPath_lineTo:
- case NS_ooxml::LN_CT_WrapPath_start:
- {
- resolveSprmProps(*this, _sprm);
-
- awt::Point aPoint(mnX, mnY);
- mpPolygon->addPoint(aPoint);
- }
- break;
- default:
- SAL_WARN("writerfilter", "WrapPolygonHandler::lcl_sprm: unhandled token: " << _sprm.getId());
- break;
- }
-}
-
-
-}}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/WrapPolygonHandler.hxx b/writerfilter/source/dmapper/WrapPolygonHandler.hxx
deleted file mode 100644
index 8d3e1a3d8493..000000000000
--- a/writerfilter/source/dmapper/WrapPolygonHandler.hxx
+++ /dev/null
@@ -1,82 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include <com/sun/star/drawing/PointSequenceSequence.hpp>
-#include "LoggedResources.hxx"
-#include <tools/fract.hxx>
-#include <vector>
-
-namespace com::sun::star::text
-{
-struct GraphicCrop;
-}
-
-namespace writerfilter::dmapper
-{
-/// Handles <wp:wrapPolygon> from DOCX and the pWrapPolygonVertices shape property from RTF.
-class WrapPolygon final : public virtual SvRefBase
-{
-public:
- typedef std::vector<css::awt::Point> Points_t;
- typedef ::tools::SvRef<WrapPolygon> Pointer_t;
-
-private:
- Points_t mPoints;
-
-public:
- WrapPolygon();
- ~WrapPolygon() override;
-
- void addPoint(const css::awt::Point& rPoint);
-
- Points_t::const_iterator begin() const;
- Points_t::const_iterator end() const;
-
- WrapPolygon::Pointer_t move(const css::awt::Point& rMove) const;
- WrapPolygon::Pointer_t scale(const Fraction& rFractionX, const Fraction& rFractionY) const;
- WrapPolygon::Pointer_t correctWordWrapPolygon(const css::awt::Size& rSrcSize) const;
- WrapPolygon::Pointer_t correctWordWrapPolygonPixel(const css::awt::Size& rSrcSize) const;
- WrapPolygon::Pointer_t correctCrop(const css::awt::Size& rGraphicSize,
- const css::text::GraphicCrop& rGraphicCrop) const;
- css::drawing::PointSequenceSequence getPointSequenceSequence() const;
-};
-
-class WrapPolygonHandler : public LoggedProperties
-{
-public:
- WrapPolygonHandler();
- virtual ~WrapPolygonHandler() override;
-
- const WrapPolygon::Pointer_t& getPolygon() const { return mpPolygon; }
-
-private:
- WrapPolygon::Pointer_t mpPolygon;
-
- sal_Int32 mnX;
- sal_Int32 mnY;
-
- // Properties
- virtual void lcl_attribute(Id Name, Value& val) override;
- virtual void lcl_sprm(Sprm& sprm) override;
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/WriteProtection.cxx b/writerfilter/source/dmapper/WriteProtection.cxx
deleted file mode 100644
index c300ab09e303..000000000000
--- a/writerfilter/source/dmapper/WriteProtection.cxx
+++ /dev/null
@@ -1,140 +0,0 @@
-/* -*- 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/.
- *
- * 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 "WriteProtection.hxx"
-#include "TagLogger.hxx"
-
-#include <comphelper/propertyvalue.hxx>
-#include <ooxml/resourceids.hxx>
-
-using namespace com::sun::star;
-
-namespace writerfilter::dmapper
-{
-WriteProtection::WriteProtection()
- : LoggedProperties("WriteProtection")
- , m_nCryptProviderType(NS_ooxml::LN_Value_doc_ST_CryptProv_rsaAES)
- , m_CryptSpinCount(0)
- , m_bRecommended(false)
-{
-}
-
-WriteProtection::~WriteProtection() {}
-
-void WriteProtection::lcl_attribute(Id nName, Value& val)
-{
- int nIntValue = val.getInt();
- OUString sStringValue = val.getString();
-
- switch (nName)
- {
- case NS_ooxml::LN_AG_Password_cryptProviderType: // 92025
- m_nCryptProviderType = nIntValue;
- break;
- case NS_ooxml::LN_AG_Password_cryptAlgorithmClass: // 92026
- if (nIntValue == NS_ooxml::LN_Value_doc_ST_AlgClass_hash) // 92023
- m_sCryptAlgorithmClass = "hash";
- break;
- case NS_ooxml::LN_AG_Password_cryptAlgorithmType: // 92027
- if (nIntValue == NS_ooxml::LN_Value_doc_ST_AlgType_typeAny) // 92024
- m_sCryptAlgorithmType = "typeAny";
- break;
- case NS_ooxml::LN_AG_Password_cryptAlgorithmSid: // 92028
- {
- sal_Int32 nCryptAlgorithmSid = sStringValue.toInt32();
- switch (nCryptAlgorithmSid)
- {
- case 1:
- m_sAlgorithmName = "MD2";
- break;
- case 2:
- m_sAlgorithmName = "MD4";
- break;
- case 3:
- m_sAlgorithmName = "MD5";
- break;
- case 4:
- m_sAlgorithmName = "SHA-1";
- break;
- case 5:
- m_sAlgorithmName = "MAC";
- break;
- case 6:
- m_sAlgorithmName = "RIPEMD";
- break;
- case 7:
- m_sAlgorithmName = "RIPEMD-160";
- break;
- case 9:
- m_sAlgorithmName = "HMAC";
- break;
- case 12:
- m_sAlgorithmName = "SHA-256";
- break;
- case 13:
- m_sAlgorithmName = "SHA-384";
- break;
- case 14:
- m_sAlgorithmName = "SHA-512";
- break;
- default:; // 8, 10, 11, any other value: Undefined.
- }
- }
- break;
- case NS_ooxml::LN_AG_Password_cryptSpinCount: // 92029
- m_CryptSpinCount = nIntValue;
- break;
- case NS_ooxml::LN_AG_Password_hash: // 92035
- m_sHash = sStringValue;
- break;
- case NS_ooxml::LN_AG_Password_salt: // 92036
- m_sSalt = sStringValue;
- break;
- case NS_ooxml::LN_CT_WriteProtection_recommended:
- m_bRecommended = nIntValue;
- break;
- default:
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- }
- }
-}
-
-void WriteProtection::lcl_sprm(Sprm& /*rSprm*/) {}
-
-uno::Sequence<beans::PropertyValue> WriteProtection::toSequence() const
-{
- uno::Sequence<beans::PropertyValue> aResult;
- if (!m_sAlgorithmName.isEmpty() && !m_sSalt.isEmpty() && !m_sHash.isEmpty()
- && m_sCryptAlgorithmClass == "hash" && m_sCryptAlgorithmType == "typeAny")
- {
- aResult = { comphelper::makePropertyValue("algorithm-name", m_sAlgorithmName),
- comphelper::makePropertyValue("salt", m_sSalt),
- comphelper::makePropertyValue("iteration-count", m_CryptSpinCount),
- comphelper::makePropertyValue("hash", m_sHash) };
- }
-
- return aResult;
-}
-
-} //namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/WriteProtection.hxx b/writerfilter/source/dmapper/WriteProtection.hxx
deleted file mode 100644
index 21b420b4bcd9..000000000000
--- a/writerfilter/source/dmapper/WriteProtection.hxx
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include "LoggedResources.hxx"
-#include <com/sun/star/beans/PropertyValue.hpp>
-
-namespace writerfilter::dmapper
-{
-class WriteProtection : public LoggedProperties
-{
-private:
- /** Provider type
- *
- * Possible values:
- * "rsaAES" - NS_ooxml::LN_Value_doc_ST_CryptProv_rsaAES
- * "rsaFull" - NS_ooxml::LN_Value_doc_ST_CryptProv_rsaFull
- */
- sal_Int32 m_nCryptProviderType;
- OUString m_sCryptAlgorithmClass;
- OUString m_sCryptAlgorithmType;
- sal_Int32 m_CryptSpinCount;
- OUString m_sAlgorithmName;
- OUString m_sHash;
- OUString m_sSalt;
- bool m_bRecommended;
-
- virtual void lcl_attribute(Id Name, Value& val) override;
- virtual void lcl_sprm(Sprm& sprm) override;
-
-public:
- WriteProtection();
- virtual ~WriteProtection() override;
-
- css::uno::Sequence<css::beans::PropertyValue> toSequence() const;
-
- bool getRecommended() const { return m_bRecommended; }
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/domainmapperfactory.cxx b/writerfilter/source/dmapper/domainmapperfactory.cxx
deleted file mode 100644
index e52d5d2e8dec..000000000000
--- a/writerfilter/source/dmapper/domainmapperfactory.cxx
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- 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 "DomainMapper.hxx"
-#include "TagLogger.hxx"
-#include <unotools/mediadescriptor.hxx>
-
-namespace writerfilter::dmapper
-{
-Stream::Pointer_t
-DomainMapperFactory::createMapper(css::uno::Reference<css::uno::XComponentContext> const& xContext,
- css::uno::Reference<css::io::XInputStream> const& xInputStream,
- css::uno::Reference<css::lang::XComponent> const& xModel,
- bool bRepairStorage, SourceDocumentType eDocumentType,
- utl::MediaDescriptor const& rMediaDesc)
-{
-#ifdef DBG_UTIL
- OUString sURL
- = rMediaDesc.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_URL, OUString());
- ::std::string sURLc(OUStringToOString(sURL, RTL_TEXTENCODING_ASCII_US));
-
- if (getenv("SW_DEBUG_WRITERFILTER"))
- TagLogger::getInstance().setFileName(sURLc);
- TagLogger::getInstance().startDocument();
-#endif
-
- return { new DomainMapper(xContext, xInputStream, xModel, bRepairStorage, eDocumentType,
- rMediaDesc) };
-}
-
-} // namespace writerfilter::dmapper
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/util.cxx b/writerfilter/source/dmapper/util.cxx
deleted file mode 100644
index 3e22cbb72784..000000000000
--- a/writerfilter/source/dmapper/util.cxx
+++ /dev/null
@@ -1,70 +0,0 @@
-/* -*- 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/.
- *
- * 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 <string>
-#include "util.hxx"
-
-namespace writerfilter::dmapper
-{
-using namespace com::sun::star;
-
-std::string XTextRangeToString(uno::Reference<text::XTextRange> const& textRange)
-{
- std::string result;
-
-#ifdef DBG_UTIL
- if (textRange)
- {
- OUString aOUStr;
-
- try
- {
- aOUStr = textRange->getString();
- }
- catch (const uno::Exception& rException)
- {
- result += "(exception: ";
- result += rException.Message.toUtf8().getStr();
- result += ")";
- }
-
- OString aOStr = OUStringToOString(aOUStr, RTL_TEXTENCODING_ASCII_US);
-
- result = aOStr.getStr();
- }
- else
- {
- result = "(nil)";
- }
-#else
- (void)textRange;
-#endif
-
- return result;
-}
-
-void resolveSprmProps(Properties& rHandler, Sprm& rSprm)
-{
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties)
- pProperties->resolve(rHandler);
-}
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/util.hxx b/writerfilter/source/dmapper/util.hxx
deleted file mode 100644
index 9d172331a7ca..000000000000
--- a/writerfilter/source/dmapper/util.hxx
+++ /dev/null
@@ -1,32 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include <com/sun/star/text/XTextRange.hpp>
-#include <string>
-#include <dmapper/resourcemodel.hxx>
-
-namespace writerfilter::dmapper
-{
-std::string XTextRangeToString(css::uno::Reference<css::text::XTextRange> const& textRange);
-void resolveSprmProps(Properties& rHandler, Sprm& rSprm);
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/filter/RtfFilter.cxx b/writerfilter/source/filter/RtfFilter.cxx
deleted file mode 100644
index 8f80b85353b2..000000000000
--- a/writerfilter/source/filter/RtfFilter.cxx
+++ /dev/null
@@ -1,220 +0,0 @@
-/* -*- 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/.
- *
- * 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 <memory>
-
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/document/XExporter.hpp>
-#include <com/sun/star/document/XFilter.hpp>
-#include <com/sun/star/document/XImporter.hpp>
-#include <com/sun/star/io/WrongFormatException.hpp>
-#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
-#include <com/sun/star/lang/XInitialization.hpp>
-#include <com/sun/star/lang/XServiceInfo.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <cppuhelper/exc_hlp.hxx>
-#include <cppuhelper/supportsservice.hxx>
-#include <osl/file.hxx>
-#include <comphelper/diagnose_ex.hxx>
-#include <unotools/mediadescriptor.hxx>
-#include <unotools/streamwrap.hxx>
-#include <unotools/ucbstreamhelper.hxx>
-#include <comphelper/scopeguard.hxx>
-
-#include <dmapper/DomainMapperFactory.hxx>
-#include <rtftok/RTFDocument.hxx>
-
-using namespace ::com::sun::star;
-
-namespace
-{
-/// Invokes the RTF tokenizer + dmapper or RtfExportFilter in sw via UNO.
-class RtfFilter
- : public cppu::WeakImplHelper<document::XFilter, document::XImporter, document::XExporter,
- lang::XInitialization, lang::XServiceInfo>
-{
- uno::Reference<uno::XComponentContext> m_xContext;
- uno::Reference<lang::XComponent> m_xSrcDoc, m_xDstDoc;
-
-public:
- explicit RtfFilter(uno::Reference<uno::XComponentContext> xContext);
-
- // XFilter
- sal_Bool SAL_CALL filter(const uno::Sequence<beans::PropertyValue>& rDescriptor) override;
- void SAL_CALL cancel() override;
-
- // XImporter
- void SAL_CALL setTargetDocument(const uno::Reference<lang::XComponent>& xDoc) override;
-
- // XExporter
- void SAL_CALL setSourceDocument(const uno::Reference<lang::XComponent>& xDoc) override;
-
- // XInitialization
- void SAL_CALL initialize(const uno::Sequence<uno::Any>& rArguments) override;
-
- // XServiceInfo
- OUString SAL_CALL getImplementationName() override;
- sal_Bool SAL_CALL supportsService(const OUString& rServiceName) override;
- uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
-};
-}
-
-RtfFilter::RtfFilter(uno::Reference<uno::XComponentContext> xContext)
- : m_xContext(std::move(xContext))
-{
-}
-
-sal_Bool RtfFilter::filter(const uno::Sequence<beans::PropertyValue>& rDescriptor)
-{
- if (m_xSrcDoc.is())
- {
- uno::Reference<lang::XMultiServiceFactory> xMSF(m_xContext->getServiceManager(),
- uno::UNO_QUERY_THROW);
- uno::Reference<uno::XInterface> xIfc(
- xMSF->createInstance("com.sun.star.comp.Writer.RtfExport"), uno::UNO_SET_THROW);
- uno::Reference<document::XExporter> xExporter(xIfc, uno::UNO_QUERY_THROW);
- uno::Reference<document::XFilter> xFilter(xIfc, uno::UNO_QUERY_THROW);
- xExporter->setSourceDocument(m_xSrcDoc);
- return xFilter->filter(rDescriptor);
- }
-
- bool bResult(false);
- uno::Reference<task::XStatusIndicator> xStatusIndicator;
-
- uno::Reference<beans::XPropertySet> xDocProps;
- if (m_xDstDoc.is()) // not in cppunittest?
- {
- xDocProps.set(m_xDstDoc, uno::UNO_QUERY);
- xDocProps->setPropertyValue("UndocumentedWriterfilterHack", uno::Any(true));
- }
- comphelper::ScopeGuard g([xDocProps] {
- if (xDocProps.is()) // not in cppunittest?
- {
- // note: pStream.clear calls RemoveLastParagraph()
- xDocProps->setPropertyValue("UndocumentedWriterfilterHack", uno::Any(false));
- }
- });
-
- try
- {
- utl::MediaDescriptor aMediaDesc(rDescriptor);
- bool bRepairStorage = aMediaDesc.getUnpackedValueOrDefault("RepairPackage", false);
- bool bIsNewDoc = !aMediaDesc.getUnpackedValueOrDefault("InsertMode", false);
- uno::Reference<io::XInputStream> xInputStream;
-
- aMediaDesc.addInputStream();
- aMediaDesc[utl::MediaDescriptor::PROP_INPUTSTREAM] >>= xInputStream;
-
- // If this is set, write to this file, instead of the real document during paste.
- char* pEnv = getenv("SW_DEBUG_RTF_PASTE_TO");
- OUString aOutStr;
- if (!bIsNewDoc && pEnv
- && osl::FileBase::getFileURLFromSystemPath(OUString::fromUtf8(pEnv), aOutStr)
- == osl::FileBase::E_None)
- {
- std::unique_ptr<SvStream> pOut(
- utl::UcbStreamHelper::CreateStream(aOutStr, StreamMode::WRITE));
- std::unique_ptr<SvStream> pIn(utl::UcbStreamHelper::CreateStream(xInputStream));
- pOut->WriteStream(*pIn);
- return true;
- }
-
- // If this is set, read from this file, instead of the real clipboard during paste.
- pEnv = getenv("SW_DEBUG_RTF_PASTE_FROM");
- if (!bIsNewDoc && pEnv)
- {
- OUString aInStr;
- osl::FileBase::getFileURLFromSystemPath(OUString::fromUtf8(pEnv), aInStr);
- std::unique_ptr<SvStream> pStream
- = utl::UcbStreamHelper::CreateStream(aInStr, StreamMode::READ);
- uno::Reference<io::XStream> xStream(new utl::OStreamWrapper(std::move(pStream)));
- xInputStream.set(xStream, uno::UNO_QUERY);
- }
-
- uno::Reference<frame::XFrame> xFrame = aMediaDesc.getUnpackedValueOrDefault(
- utl::MediaDescriptor::PROP_FRAME, uno::Reference<frame::XFrame>());
-
- xStatusIndicator = aMediaDesc.getUnpackedValueOrDefault(
- utl::MediaDescriptor::PROP_STATUSINDICATOR, uno::Reference<task::XStatusIndicator>());
-
- writerfilter::Stream::Pointer_t pStream(
- writerfilter::dmapper::DomainMapperFactory::createMapper(
- m_xContext, xInputStream, m_xDstDoc, bRepairStorage,
- writerfilter::dmapper::SourceDocumentType::RTF, aMediaDesc));
- writerfilter::rtftok::RTFDocument::Pointer_t pDocument(
- writerfilter::rtftok::RTFDocumentFactory::createDocument(
- m_xContext, xInputStream, m_xDstDoc, xFrame, xStatusIndicator, aMediaDesc));
- pDocument->resolve(*pStream);
- bResult = true;
- }
- catch (const io::WrongFormatException&)
- {
- css::uno::Any anyEx = cppu::getCaughtException();
- // cannot throw WrongFormatException directly :(
- throw lang::WrappedTargetRuntimeException("", getXWeak(), anyEx);
- }
- catch (const uno::Exception&)
- {
- TOOLS_INFO_EXCEPTION("writerfilter", "Exception caught");
- }
-
- if (xStatusIndicator.is())
- xStatusIndicator->end();
- return bResult;
-}
-
-void RtfFilter::cancel() {}
-
-void RtfFilter::setSourceDocument(const uno::Reference<lang::XComponent>& xDoc)
-{
- m_xSrcDoc = xDoc;
-}
-
-void RtfFilter::setTargetDocument(const uno::Reference<lang::XComponent>& xDoc)
-{
- m_xDstDoc = xDoc;
-}
-
-void RtfFilter::initialize(const uno::Sequence<uno::Any>& /*aArguments*/)
-{
- // The DOCX exporter here extracts 'type' of the filter, ie 'Word' or
- // 'Word Template' but we don't need it for RTF.
-}
-
-OUString RtfFilter::getImplementationName() { return "com.sun.star.comp.Writer.RtfFilter"; }
-
-sal_Bool RtfFilter::supportsService(const OUString& rServiceName)
-{
- return cppu::supportsService(this, rServiceName);
-}
-
-uno::Sequence<OUString> RtfFilter::getSupportedServiceNames()
-{
- uno::Sequence<OUString> aRet = { OUString("com.sun.star.document.ImportFilter"),
- OUString("com.sun.star.document.ExportFilter") };
- return aRet;
-}
-
-extern "C" SAL_DLLPUBLIC_EXPORT uno::XInterface*
-com_sun_star_comp_Writer_RtfFilter_get_implementation(uno::XComponentContext* pComponent,
- uno::Sequence<uno::Any> const& /*rSequence*/)
-{
- return cppu::acquire(new RtfFilter(pComponent));
-}
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/filter/WriterFilter.cxx b/writerfilter/source/filter/WriterFilter.cxx
deleted file mode 100644
index 8935f462636f..000000000000
--- a/writerfilter/source/filter/WriterFilter.cxx
+++ /dev/null
@@ -1,367 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#ifdef DBG_UTIL
-#include <iostream>
-#endif
-
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/document/XExporter.hpp>
-#include <com/sun/star/document/XFilter.hpp>
-#include <com/sun/star/document/XImporter.hpp>
-#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
-#include <com/sun/star/io/WrongFormatException.hpp>
-#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
-#include <com/sun/star/lang/XInitialization.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/xml/sax/SAXParseException.hpp>
-#include <cppuhelper/exc_hlp.hxx>
-#include <cppuhelper/supportsservice.hxx>
-#include <dmapper/DomainMapperFactory.hxx>
-#include <oox/core/filterdetect.hxx>
-#include <oox/core/xmlfilterbase.hxx>
-#include <oox/helper/graphichelper.hxx>
-#include <oox/ole/olestorage.hxx>
-#include <oox/ole/vbaproject.hxx>
-#include <ooxml/OOXMLDocument.hxx>
-#include <unotools/mediadescriptor.hxx>
-#include <rtl/ref.hxx>
-#include <sal/log.hxx>
-#include <comphelper/diagnose_ex.hxx>
-#include <comphelper/scopeguard.hxx>
-
-using namespace ::com::sun::star;
-
-static OUString lcl_GetExceptionMessageRec(xml::sax::SAXException const& e);
-
-static OUString lcl_GetExceptionMessage(xml::sax::SAXException const& e)
-{
- OUString const thisMessage("SAXParseException: \"" + e.Message + "\"");
- OUString const restMessage(lcl_GetExceptionMessageRec(e));
- return restMessage + "\n" + thisMessage;
-}
-static OUString lcl_GetExceptionMessage(xml::sax::SAXParseException const& e)
-{
- OUString const thisMessage("SAXParseException: '" + e.Message + "', Stream '" + e.SystemId
- + "', Line " + OUString::number(e.LineNumber) + ", Column "
- + OUString::number(e.ColumnNumber));
- OUString const restMessage(lcl_GetExceptionMessageRec(e));
- return restMessage + "\n" + thisMessage;
-}
-
-static OUString lcl_GetExceptionMessageRec(xml::sax::SAXException const& e)
-{
- xml::sax::SAXParseException saxpe;
- if (e.WrappedException >>= saxpe)
- {
- return lcl_GetExceptionMessage(saxpe);
- }
- xml::sax::SAXException saxe;
- if (e.WrappedException >>= saxe)
- {
- return lcl_GetExceptionMessage(saxe);
- }
- uno::Exception ue;
- if (e.WrappedException >>= ue)
- {
- return ue.Message;
- }
- return {};
-}
-
-namespace
-{
-/// Common DOCX filter, calls DocxExportFilter via UNO or does the DOCX import.
-class WriterFilter
- : public cppu::WeakImplHelper<document::XFilter, document::XImporter, document::XExporter,
- lang::XInitialization, lang::XServiceInfo>
-{
- uno::Reference<uno::XComponentContext> m_xContext;
- uno::Reference<lang::XComponent> m_xSrcDoc, m_xDstDoc;
- uno::Sequence<uno::Any> m_xInitializationArguments;
-
-public:
- explicit WriterFilter(uno::Reference<uno::XComponentContext> xContext)
- : m_xContext(std::move(xContext))
- {
- }
-
- // XFilter
- sal_Bool SAL_CALL filter(const uno::Sequence<beans::PropertyValue>& rDescriptor) override;
- void SAL_CALL cancel() override;
-
- // XImporter
- void SAL_CALL setTargetDocument(const uno::Reference<lang::XComponent>& xDoc) override;
-
- // XExporter
- void SAL_CALL setSourceDocument(const uno::Reference<lang::XComponent>& xDoc) override;
-
- // XInitialization
- void SAL_CALL initialize(const uno::Sequence<uno::Any>& rArguments) override;
-
- // XServiceInfo
- OUString SAL_CALL getImplementationName() override;
- sal_Bool SAL_CALL supportsService(const OUString& rServiceName) override;
- uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
-};
-}
-
-sal_Bool WriterFilter::filter(const uno::Sequence<beans::PropertyValue>& rDescriptor)
-{
- if (m_xSrcDoc.is())
- {
- uno::Reference<lang::XMultiServiceFactory> xMSF(m_xContext->getServiceManager(),
- uno::UNO_QUERY_THROW);
- uno::Reference<uno::XInterface> xIfc;
- try
- {
- xIfc.set(xMSF->createInstance("com.sun.star.comp.Writer.DocxExport"),
- uno::UNO_SET_THROW);
- }
- catch (uno::RuntimeException&)
- {
- throw;
- }
- catch (uno::Exception& e)
- {
- uno::Any a(cppu::getCaughtException());
- throw lang::WrappedTargetRuntimeException("wrapped " + a.getValueTypeName() + ": "
- + e.Message,
- uno::Reference<uno::XInterface>(), a);
- }
-
- uno::Reference<lang::XInitialization> xInit(xIfc, uno::UNO_QUERY_THROW);
- xInit->initialize(m_xInitializationArguments);
-
- uno::Reference<document::XExporter> xExprtr(xIfc, uno::UNO_QUERY_THROW);
- uno::Reference<document::XFilter> xFltr(xIfc, uno::UNO_QUERY_THROW);
- xExprtr->setSourceDocument(m_xSrcDoc);
- return xFltr->filter(rDescriptor);
- }
- if (m_xDstDoc.is())
- {
- uno::Reference<beans::XPropertySet> const xDocProps(m_xDstDoc, uno::UNO_QUERY);
- xDocProps->setPropertyValue("UndocumentedWriterfilterHack", uno::Any(true));
- comphelper::ScopeGuard g([xDocProps] {
- xDocProps->setPropertyValue("UndocumentedWriterfilterHack", uno::Any(false));
- });
- utl::MediaDescriptor aMediaDesc(rDescriptor);
- bool bRepairStorage = aMediaDesc.getUnpackedValueOrDefault("RepairPackage", false);
- bool bSkipImages
- = aMediaDesc.getUnpackedValueOrDefault("FilterOptions", OUString()) == "SkipImages";
-
- uno::Reference<io::XInputStream> xInputStream;
- try
- {
- // use the oox.core.FilterDetect implementation to extract the decrypted ZIP package
- rtl::Reference<::oox::core::FilterDetect> xDetector(
- new ::oox::core::FilterDetect(m_xContext));
- xInputStream = xDetector->extractUnencryptedPackage(aMediaDesc);
- }
- catch (uno::Exception&)
- {
- }
-
- if (!xInputStream.is())
- return false;
-
- writerfilter::Stream::Pointer_t pStream(
- writerfilter::dmapper::DomainMapperFactory::createMapper(
- m_xContext, xInputStream, m_xDstDoc, bRepairStorage,
- writerfilter::dmapper::SourceDocumentType::OOXML, aMediaDesc));
- //create the tokenizer and domain mapper
- writerfilter::ooxml::OOXMLStream::Pointer_t pDocStream
- = writerfilter::ooxml::OOXMLDocumentFactory::createStream(m_xContext, xInputStream,
- bRepairStorage);
- uno::Reference<task::XStatusIndicator> xStatusIndicator
- = aMediaDesc.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_STATUSINDICATOR,
- uno::Reference<task::XStatusIndicator>());
- writerfilter::ooxml::OOXMLDocument::Pointer_t pDocument(
- writerfilter::ooxml::OOXMLDocumentFactory::createDocument(pDocStream, xStatusIndicator,
- bSkipImages, rDescriptor));
-
- uno::Reference<frame::XModel> xModel(m_xDstDoc, uno::UNO_QUERY_THROW);
- pDocument->setModel(xModel);
-
- uno::Reference<drawing::XDrawPageSupplier> xDrawings(m_xDstDoc, uno::UNO_QUERY_THROW);
- uno::Reference<drawing::XDrawPage> xDrawPage(xDrawings->getDrawPage(), uno::UNO_SET_THROW);
- pDocument->setDrawPage(xDrawPage);
-
- try
- {
- pDocument->resolve(*pStream);
- }
- catch (xml::sax::SAXParseException const& e)
- {
- // note: SfxObjectShell checks for WrongFormatException
- io::WrongFormatException wfe(lcl_GetExceptionMessage(e));
- throw lang::WrappedTargetRuntimeException("", getXWeak(), uno::Any(wfe));
- }
- catch (xml::sax::SAXException const& e)
- {
- // note: SfxObjectShell checks for WrongFormatException
- io::WrongFormatException wfe(lcl_GetExceptionMessage(e));
- throw lang::WrappedTargetRuntimeException("", getXWeak(), uno::Any(wfe));
- }
- catch (uno::RuntimeException const&)
- {
- throw;
- }
- catch (uno::Exception const&)
- {
- css::uno::Any anyEx = cppu::getCaughtException();
- SAL_WARN("writerfilter",
- "WriterFilter::filter(): failed with " << exceptionToString(anyEx));
- throw lang::WrappedTargetRuntimeException("", getXWeak(), anyEx);
- }
-
- // Adding some properties to the document's grab bag for interoperability purposes:
- comphelper::SequenceAsHashMap aGrabBagProperties;
-
- // Adding the saved Theme DOM
- aGrabBagProperties["OOXTheme"] <<= pDocument->getThemeDom();
-
- // Adding the saved custom xml DOM
- aGrabBagProperties["OOXCustomXml"] <<= pDocument->getCustomXmlDomList();
- aGrabBagProperties["OOXCustomXmlProps"] <<= pDocument->getCustomXmlDomPropsList();
-
- // Adding the saved Glossary Document DOM to the document's grab bag
- aGrabBagProperties["OOXGlossary"] <<= pDocument->getGlossaryDocDom();
- aGrabBagProperties["OOXGlossaryDom"] <<= pDocument->getGlossaryDomList();
-
- // Adding the saved embedding document to document's grab bag
- aGrabBagProperties["OOXEmbeddings"] <<= pDocument->getEmbeddingsList();
-
- oox::core::XmlFilterBase::putPropertiesToDocumentGrabBag(m_xDstDoc, aGrabBagProperties);
-
- writerfilter::ooxml::OOXMLStream::Pointer_t pVBAProjectStream(
- writerfilter::ooxml::OOXMLDocumentFactory::createStream(
- pDocStream, writerfilter::ooxml::OOXMLStream::VBAPROJECT));
- oox::StorageRef xVbaPrjStrg = std::make_shared<::oox::ole::OleStorage>(
- m_xContext, pVBAProjectStream->getDocumentStream(), false);
- if (xVbaPrjStrg && xVbaPrjStrg->isStorage())
- {
- ::oox::ole::VbaProject aVbaProject(m_xContext, xModel, u"Writer");
- uno::Reference<frame::XFrame> xFrame = aMediaDesc.getUnpackedValueOrDefault(
- utl::MediaDescriptor::PROP_FRAME, uno::Reference<frame::XFrame>());
-
- // if no XFrame try fallback to what we can glean from the Model
- if (!xFrame.is())
- {
- uno::Reference<frame::XController> xController = xModel->getCurrentController();
- xFrame = xController.is() ? xController->getFrame() : nullptr;
- }
-
- oox::GraphicHelper gHelper(m_xContext, xFrame, xVbaPrjStrg);
- aVbaProject.importVbaProject(*xVbaPrjStrg, gHelper);
-
- writerfilter::ooxml::OOXMLStream::Pointer_t pVBADataStream(
- writerfilter::ooxml::OOXMLDocumentFactory::createStream(
- pDocStream, writerfilter::ooxml::OOXMLStream::VBADATA));
- if (pVBADataStream)
- {
- uno::Reference<io::XInputStream> xDataStream = pVBADataStream->getDocumentStream();
- if (xDataStream.is())
- aVbaProject.importVbaData(xDataStream);
- }
- }
-
- pStream.clear();
-
- // note: pStream.clear calls RemoveLastParagraph()
-
- return true;
- }
- return false;
-}
-
-void WriterFilter::cancel() {}
-
-void WriterFilter::setTargetDocument(const uno::Reference<lang::XComponent>& xDoc)
-{
- m_xDstDoc = xDoc;
-
- // Set some compatibility options that are valid for the DOCX format
- uno::Reference<lang::XMultiServiceFactory> xFactory(xDoc, uno::UNO_QUERY);
- uno::Reference<beans::XPropertySet> xSettings(
- xFactory->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY);
-
- xSettings->setPropertyValue("UseOldNumbering", uno::Any(false));
- xSettings->setPropertyValue("IgnoreFirstLineIndentInNumbering", uno::Any(false));
- xSettings->setPropertyValue(u"NoGapAfterNoteNumber"_ustr, uno::Any(true));
- xSettings->setPropertyValue("DoNotResetParaAttrsForNumFont", uno::Any(false));
- xSettings->setPropertyValue("UseFormerLineSpacing", uno::Any(false));
- xSettings->setPropertyValue("AddParaSpacingToTableCells", uno::Any(true));
- xSettings->setPropertyValue("AddParaLineSpacingToTableCells", uno::Any(true));
- xSettings->setPropertyValue("UseFormerObjectPositioning", uno::Any(false));
- xSettings->setPropertyValue("ConsiderTextWrapOnObjPos", uno::Any(true));
- xSettings->setPropertyValue("UseFormerTextWrapping", uno::Any(false));
- xSettings->setPropertyValue("IgnoreTabsAndBlanksForLineCalculation", uno::Any(true));
- xSettings->setPropertyValue("InvertBorderSpacing", uno::Any(true));
- xSettings->setPropertyValue("CollapseEmptyCellPara", uno::Any(true));
- // tdf#142404 TabOverSpacing (new for compatibilityMode15/Word2013+) is a subset of TabOverMargin
- // (which applied to DOCX <= compatibilityMode14).
- // TabOverMargin looks at tabs beyond the normal text area,
- // while TabOverSpacing only refers to a tab beyond the paragraph margin.
- xSettings->setPropertyValue("TabOverSpacing", uno::Any(true));
- xSettings->setPropertyValue("UnbreakableNumberings", uno::Any(true));
-
- xSettings->setPropertyValue("ClippedPictures", uno::Any(true));
- xSettings->setPropertyValue("BackgroundParaOverDrawings", uno::Any(true));
- xSettings->setPropertyValue("TreatSingleColumnBreakAsPageBreak", uno::Any(true));
- xSettings->setPropertyValue("PropLineSpacingShrinksFirstLine", uno::Any(true));
- xSettings->setPropertyValue("DoNotCaptureDrawObjsOnPage", uno::Any(true));
- xSettings->setPropertyValue("DisableOffPagePositioning", uno::Any(true));
- xSettings->setPropertyValue("DropCapPunctuation", uno::Any(true));
- // rely on default for HyphenateURLs=false
- // rely on default for APPLY_TEXT_ATTR_TO_EMPTY_LINE_AT_END_OF_PARAGRAPH=true
-}
-
-void WriterFilter::setSourceDocument(const uno::Reference<lang::XComponent>& xDoc)
-{
- m_xSrcDoc = xDoc;
-}
-
-void WriterFilter::initialize(const uno::Sequence<uno::Any>& rArguments)
-{
- m_xInitializationArguments = rArguments;
-}
-
-OUString WriterFilter::getImplementationName() { return "com.sun.star.comp.Writer.WriterFilter"; }
-
-sal_Bool WriterFilter::supportsService(const OUString& rServiceName)
-{
- return cppu::supportsService(this, rServiceName);
-}
-
-uno::Sequence<OUString> WriterFilter::getSupportedServiceNames()
-{
- uno::Sequence<OUString> aRet = { OUString("com.sun.star.document.ImportFilter"),
- OUString("com.sun.star.document.ExportFilter") };
- return aRet;
-}
-
-extern "C" SAL_DLLPUBLIC_EXPORT uno::XInterface*
-com_sun_star_comp_Writer_WriterFilter_get_implementation(
- uno::XComponentContext* component, uno::Sequence<uno::Any> const& /*rSequence*/)
-{
- return cppu::acquire(new WriterFilter(component));
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/Handler.cxx b/writerfilter/source/ooxml/Handler.cxx
deleted file mode 100644
index 7cbd9b6bfdc3..000000000000
--- a/writerfilter/source/ooxml/Handler.cxx
+++ /dev/null
@@ -1,435 +0,0 @@
-/* -*- 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/.
- *
- * 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 <ooxml/resourceids.hxx>
-#include "Handler.hxx"
-
-#include <sal/log.hxx>
-
-namespace writerfilter::ooxml
-{
-
-/*
- class OOXMLFootnoteHandler
- */
-OOXMLFootnoteHandler::OOXMLFootnoteHandler(OOXMLFastContextHandler * pContext)
-: mpFastContext(pContext)
-{
-}
-
-OOXMLFootnoteHandler::~OOXMLFootnoteHandler()
-{
-}
-
-void OOXMLFootnoteHandler::attribute(Id name, Value & val)
-{
- switch (name)
- {
- case NS_ooxml::LN_CT_FtnEdnRef_id:
- mpFastContext->resolveFootnote(sal_Int32(val.getInt()));
- break;
- default:
- break;
- }
-}
-
-void OOXMLFootnoteHandler::sprm(Sprm & /*sprm*/)
-{
-}
-
-/*
- class OOXMLEndnoteHandler
- */
-OOXMLEndnoteHandler::OOXMLEndnoteHandler(OOXMLFastContextHandler * pContext)
-: mpFastContext(pContext)
-{
-}
-
-OOXMLEndnoteHandler::~OOXMLEndnoteHandler()
-{
-}
-
-void OOXMLEndnoteHandler::attribute(Id name, Value & val)
-{
- switch (name)
- {
- case NS_ooxml::LN_CT_FtnEdnRef_id:
- mpFastContext->resolveEndnote(sal_Int32(val.getInt()));
- break;
- default:
- break;
- }
-}
-
-void OOXMLEndnoteHandler::sprm(Sprm & /*sprm*/)
-{
-}
-
-/*
- class OOXMLCommentHandler
-*/
-OOXMLCommentHandler::OOXMLCommentHandler(OOXMLFastContextHandler * pContext)
-: mpFastContext(pContext)
-{
-}
-
-OOXMLCommentHandler::~OOXMLCommentHandler()
-{
-}
-
-void OOXMLCommentHandler::attribute(Id name, Value & val)
-{
- switch (name)
- {
- case NS_ooxml::LN_CT_Markup_id:
- mpFastContext->resolveComment(val.getInt());
- break;
- default:
- ;
- }
-}
-
-void OOXMLCommentHandler::sprm(Sprm & /*sprm*/)
-{
-}
-
-/*
- class OOXMLOLEHandler
-*/
-OOXMLOLEHandler::OOXMLOLEHandler(OOXMLFastContextHandler * pContext)
-: mpFastContext(pContext)
-{
-}
-
-OOXMLOLEHandler::~OOXMLOLEHandler()
-{
-}
-
-void OOXMLOLEHandler::attribute(Id name, Value & val)
-{
- switch (name)
- {
- case NS_ooxml::LN_CT_OLEObject_r_id:
- try {
- mpFastContext->resolveData(val.getString());
- }
- catch (const ::css::uno::Exception&)
- {
- // Can't resolve OLE stream
- SAL_WARN("writerfilter.ooxml", "Failed to open OLE stream!");
- }
- break;
- default:
- ;
- }
-}
-
-void OOXMLOLEHandler::sprm(Sprm & /*sprm*/)
-{
-}
-
-OOXMLEmbeddedFontHandler::OOXMLEmbeddedFontHandler(OOXMLFastContextHandler * pContext)
-: mpFastContext(pContext)
-{
-}
-
-OOXMLEmbeddedFontHandler::~OOXMLEmbeddedFontHandler()
-{
-}
-
-void OOXMLEmbeddedFontHandler::attribute(Id name, Value & val)
-{
- switch (name)
- {
- case NS_ooxml::LN_CT_Rel_id:
- mpFastContext->resolveData(val.getString());
- break;
- default:
- break;
- }
-}
-
-void OOXMLEmbeddedFontHandler::sprm(Sprm & /*sprm*/)
-{
-}
-
-/*
- class OOXMLFooterHandler
- */
-OOXMLFooterHandler::OOXMLFooterHandler(OOXMLFastContextHandler * pContext)
- : mpFastContext(pContext), mnType(0)
-{
-}
-
-void OOXMLFooterHandler::finalize()
-{
- mpFastContext->resolveFooter(mnType, msStreamId);
-}
-
-void OOXMLFooterHandler::attribute(Id name, Value & val)
-{
- switch (name)
- {
- case NS_ooxml::LN_CT_HdrFtrRef_id:
- msStreamId = val.getString();
- break;
- case NS_ooxml::LN_CT_HdrFtrRef_type:
- mnType = val.getInt();
- break;
- default:
- break;
- }
-}
-
-void OOXMLFooterHandler::sprm(Sprm & /*sprm*/)
-{
-}
-
-/*
- class OOXMLHeaderHandler
- */
-OOXMLHeaderHandler::OOXMLHeaderHandler(OOXMLFastContextHandler * pContext)
- : mpFastContext(pContext), mnType(0)
-{
-}
-
-void OOXMLHeaderHandler::finalize()
-{
- mpFastContext->resolveHeader(mnType, msStreamId);
-}
-
-void OOXMLHeaderHandler::attribute(Id name, Value & val)
-{
- switch (name)
- {
- case NS_ooxml::LN_CT_HdrFtrRef_id:
- msStreamId = val.getString();
- break;
- case NS_ooxml::LN_CT_HdrFtrRef_type:
- mnType = val.getInt();
- break;
- default:
- break;
- }
-}
-
-void OOXMLHeaderHandler::sprm(Sprm & /*sprm*/)
-{
-}
-
-/*
- class OOXMLBreakHandler
- */
-OOXMLBreakHandler::OOXMLBreakHandler(OOXMLFastContextHandler* pContext, Stream &rStream)
-: mnType(0),
- mpFastContext(pContext),
- mrStream(rStream)
-{
-}
-
-OOXMLBreakHandler::~OOXMLBreakHandler()
-{
- if (mpFastContext)
- {
- mrStream.props(mpFastContext->getPropertySet().get());
- mpFastContext->clearProps();
- }
-
- sal_uInt8 tmpBreak[1];
- switch (mnType)
- {
- case NS_ooxml::LN_Value_ST_BrType_column:
- tmpBreak[0] = 0x0E;
- break;
- case NS_ooxml::LN_Value_ST_BrType_page:
- tmpBreak[0] = 0x0C;
- break;
- case NS_ooxml::LN_Value_ST_BrType_textWrapping:
- default: // when no attribute type is present, the spec assume textWrapping
- tmpBreak[0] = 0x0A;
- break;
- }
- mrStream.text(&tmpBreak[0], 1);
-}
-
-void OOXMLBreakHandler::attribute(Id name, Value & val)
-{
- switch (name)
- {
- case NS_ooxml::LN_CT_Br_type:
- mnType = val.getInt();
- break;
- case NS_ooxml::LN_CT_Br_clear:
- break;
- default:
- break;
- }
-}
-
-void OOXMLBreakHandler::sprm(Sprm & /*sprm*/)
-{
-}
-
-/*
- class OOXMLPictureHandler
- */
-OOXMLPictureHandler::OOXMLPictureHandler(OOXMLFastContextHandler * pContext)
-: mpFastContext(pContext)
-{
-}
-
-OOXMLPictureHandler::~OOXMLPictureHandler()
-{
-}
-
-void OOXMLPictureHandler::attribute(Id name, Value & val)
-{
- if (name == NS_ooxml::LN_AG_Blob_r_embed)
- mpFastContext->resolvePicture(val.getString());
- else
- {
- writerfilter::Reference<Properties>::Pointer_t pProps
- (val.getProperties());
- if (pProps)
- pProps->resolve(*this);
- }
-}
-
-void OOXMLPictureHandler::sprm(Sprm & rSprm)
-{
- writerfilter::Reference<Properties>::Pointer_t pProps
- (rSprm.getProps());
-
- if (pProps)
- pProps->resolve(*this);
-}
-
-/**
- class OOXMLHyperlinkHandler
- */
-
-OOXMLHyperlinkHandler::OOXMLHyperlinkHandler(OOXMLFastContextHandler * pContext)
-: mpFastContext(pContext)
-{
-}
-
-OOXMLHyperlinkHandler::~OOXMLHyperlinkHandler()
-{
-}
-
-void OOXMLHyperlinkHandler::writetext()
-{
- OUString sReturn = " HYPERLINK \"" + mURL + "\"" + mFieldCode;
- mpFastContext->text(sReturn);
-}
-
-void OOXMLHyperlinkHandler::attribute(Id name, Value & val)
-{
- switch (name)
- {
- case NS_ooxml::LN_CT_Hyperlink_tgtFrame:
- mFieldCode += " \\t \"";
- mFieldCode += val.getString();
- mFieldCode += "\"";
- break;
- case NS_ooxml::LN_CT_Hyperlink_tooltip:
- mFieldCode += " \\o \"";
- mFieldCode += val.getString();
- mFieldCode += "\"";
- break;
- case NS_ooxml::LN_CT_Hyperlink_docLocation:
- break;
- case NS_ooxml::LN_CT_Hyperlink_history:
- break;
- case NS_ooxml::LN_CT_Hyperlink_anchor:
- mFieldCode += " \\l \"";
- mFieldCode += val.getString();
- mFieldCode += "\"";
- break;
- case NS_ooxml::LN_CT_Hyperlink_r_id:
- mURL = mpFastContext->getTargetForId(val.getString());
- break;
- default:
- break;
- }
-}
-
-void OOXMLHyperlinkHandler::sprm(Sprm & /*rSprm*/)
-{
-}
-
-/**
- class OOXMLHyperlinkURLHandler
- */
-
-OOXMLHyperlinkURLHandler::OOXMLHyperlinkURLHandler(OOXMLFastContextHandler * pContext)
-: mpFastContext(pContext)
-{
-}
-
-OOXMLHyperlinkURLHandler::~OOXMLHyperlinkURLHandler()
-{
- mpFastContext->clearProps();
- mpFastContext->newProperty(NS_ooxml::LN_CT_Hyperlink_URL, OOXMLValue::Pointer_t(new OOXMLStringValue(mURL)));
-}
-
-void OOXMLHyperlinkURLHandler::attribute(Id name, Value & val)
-{
- switch (name)
- {
- case NS_ooxml::LN_CT_Hyperlink_URL:
- mURL = mpFastContext->getTargetForId(val.getString());
- break;
- default:
- break;
- }
-}
-
-void OOXMLHyperlinkURLHandler::sprm(Sprm & /*rSprm*/)
-{
-}
-
-OOXMLAltChunkHandler::OOXMLAltChunkHandler(OOXMLFastContextHandler* pContext)
- : mpFastContext(pContext)
-{
-}
-
-OOXMLAltChunkHandler::~OOXMLAltChunkHandler()
-{
- mpFastContext->clearProps();
- mpFastContext->newProperty(NS_ooxml::LN_CT_AltChunk,
- OOXMLValue::Pointer_t(new OOXMLStringValue(m_aStreamName)));
-}
-
-void OOXMLAltChunkHandler::attribute(Id nName, Value& rValue)
-{
- switch (nName)
- {
- case NS_ooxml::LN_CT_AltChunk:
- m_aStreamName = mpFastContext->getTargetForId(rValue.getString());
- break;
- default:
- break;
- }
-}
-
-void OOXMLAltChunkHandler::sprm(Sprm& /*rSprm*/) {}
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/Handler.hxx b/writerfilter/source/ooxml/Handler.hxx
deleted file mode 100644
index df6673d44318..000000000000
--- a/writerfilter/source/ooxml/Handler.hxx
+++ /dev/null
@@ -1,179 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <dmapper/resourcemodel.hxx>
-#include "OOXMLFastContextHandler.hxx"
-
-namespace writerfilter::ooxml
-{
-class OOXMLFootnoteHandler : public Properties
-{
- OOXMLFastContextHandler* mpFastContext;
-
-public:
- explicit OOXMLFootnoteHandler(OOXMLFastContextHandler* pContext);
- virtual ~OOXMLFootnoteHandler() override;
-
- virtual void attribute(Id name, Value& val) override;
- virtual void sprm(Sprm& sprm) override;
-};
-
-class OOXMLEndnoteHandler : public Properties
-{
- OOXMLFastContextHandler* mpFastContext;
-
-public:
- explicit OOXMLEndnoteHandler(OOXMLFastContextHandler* pContext);
- virtual ~OOXMLEndnoteHandler() override;
-
- virtual void attribute(Id name, Value& val) override;
- virtual void sprm(Sprm& sprm) override;
-};
-
-class OOXMLFooterHandler : public Properties
-{
- OOXMLFastContextHandler* mpFastContext;
- OUString msStreamId;
- sal_Int32 mnType;
-
-public:
- explicit OOXMLFooterHandler(OOXMLFastContextHandler* pContext);
- void finalize();
- virtual void attribute(Id name, Value& val) override;
- virtual void sprm(Sprm& sprm) override;
-};
-
-class OOXMLHeaderHandler : public Properties
-{
- OOXMLFastContextHandler* mpFastContext;
- OUString msStreamId;
- sal_Int32 mnType;
-
-public:
- explicit OOXMLHeaderHandler(OOXMLFastContextHandler* pContext);
- void finalize();
- virtual void attribute(Id name, Value& val) override;
- virtual void sprm(Sprm& sprm) override;
-};
-
-class OOXMLCommentHandler : public Properties
-{
- OOXMLFastContextHandler* mpFastContext;
-
-public:
- explicit OOXMLCommentHandler(OOXMLFastContextHandler* pContext);
- virtual ~OOXMLCommentHandler() override;
- virtual void attribute(Id name, Value& val) override;
- virtual void sprm(Sprm& sprm) override;
-};
-
-class OOXMLOLEHandler : public Properties
-{
- OOXMLFastContextHandler* mpFastContext;
-
-public:
- explicit OOXMLOLEHandler(OOXMLFastContextHandler* pContext);
- virtual ~OOXMLOLEHandler() override;
-
- virtual void attribute(Id name, Value& val) override;
- virtual void sprm(Sprm& sprm) override;
-};
-
-class OOXMLEmbeddedFontHandler : public Properties
-{
- OOXMLFastContextHandler* mpFastContext;
-
-public:
- explicit OOXMLEmbeddedFontHandler(OOXMLFastContextHandler* pContext);
- virtual ~OOXMLEmbeddedFontHandler() override;
-
- virtual void attribute(Id name, Value& val) override;
- virtual void sprm(Sprm& sprm) override;
-};
-
-class OOXMLBreakHandler : public Properties
-{
- sal_Int32 mnType;
- OOXMLFastContextHandler* mpFastContext;
- Stream& mrStream;
-
-public:
- explicit OOXMLBreakHandler(OOXMLFastContextHandler* pContext, Stream& rStream);
- virtual ~OOXMLBreakHandler() override;
- virtual void attribute(Id name, Value& val) override;
- virtual void sprm(Sprm& sprm) override;
-};
-
-class OOXMLPictureHandler : public Properties
-{
- OOXMLFastContextHandler* mpFastContext;
-
-public:
- explicit OOXMLPictureHandler(OOXMLFastContextHandler* pContext);
- virtual ~OOXMLPictureHandler() override;
-
- virtual void attribute(Id name, Value& val) override;
- virtual void sprm(Sprm& sprm) override;
-};
-
-class OOXMLHyperlinkHandler : public Properties
-{
- OOXMLFastContextHandler* mpFastContext;
- OUString mFieldCode;
- OUString mURL;
-
-public:
- explicit OOXMLHyperlinkHandler(OOXMLFastContextHandler* pContext);
- virtual ~OOXMLHyperlinkHandler() override;
- void writetext();
-
- virtual void attribute(Id name, Value& val) override;
- virtual void sprm(Sprm& sprm) override;
-};
-
-class OOXMLHyperlinkURLHandler : public Properties
-{
- OOXMLFastContextHandler* mpFastContext;
- OUString mURL;
-
-public:
- explicit OOXMLHyperlinkURLHandler(OOXMLFastContextHandler* pContext);
- virtual ~OOXMLHyperlinkURLHandler() override;
-
- virtual void attribute(Id name, Value& val) override;
- virtual void sprm(Sprm& sprm) override;
-};
-
-/// Looks up the stream name for a '<w:altChunk r:id="..."/>' reference.
-class OOXMLAltChunkHandler : public Properties
-{
- OOXMLFastContextHandler* mpFastContext;
- OUString m_aStreamName;
-
-public:
- explicit OOXMLAltChunkHandler(OOXMLFastContextHandler* pContext);
- virtual ~OOXMLAltChunkHandler() override;
-
- virtual void attribute(Id name, Value& val) override;
- virtual void sprm(Sprm& sprm) override;
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLBinaryObjectReference.cxx b/writerfilter/source/ooxml/OOXMLBinaryObjectReference.cxx
deleted file mode 100644
index f33d9bed0e0e..000000000000
--- a/writerfilter/source/ooxml/OOXMLBinaryObjectReference.cxx
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- 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/.
- *
- * 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 "OOXMLBinaryObjectReference.hxx"
-#include <string.h>
-
-#include <utility>
-
-namespace writerfilter::ooxml
-{
-
-using namespace ::com::sun::star;
-
-OOXMLBinaryObjectReference::OOXMLBinaryObjectReference
-(OOXMLStream::Pointer_t pStream)
-: mpStream(std::move(pStream)), mbRead(false)
-{
-}
-
-OOXMLBinaryObjectReference::~OOXMLBinaryObjectReference()
-{
-}
-
-void OOXMLBinaryObjectReference::read()
-{
- sal_uInt32 nMaxReadBytes = 1024*1024;
- uno::Sequence<sal_Int8> aSeq(nMaxReadBytes);
- uno::Reference<io::XInputStream> xInputStream =
- mpStream->getDocumentStream();
-
- sal_uInt32 nSize = 0;
- sal_uInt32 nOldSize = 0;
- sal_uInt32 nBytesRead = 0;
-
- while ((nBytesRead = xInputStream->readSomeBytes(aSeq, nMaxReadBytes)) > 0)
- {
- nOldSize = nSize;
- nSize += nBytesRead;
- mSequence.resize(nSize);
-
- memcpy(&mSequence[nOldSize], aSeq.getArray(), nBytesRead);
- }
-
- mbRead = true;
-}
-
-void OOXMLBinaryObjectReference::resolve(BinaryObj & rHandler)
-{
- if (! mbRead)
- read();
-
- rHandler.data(reinterpret_cast<sal_uInt8 *>(mSequence.data()),
- mSequence.size());
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLBinaryObjectReference.hxx b/writerfilter/source/ooxml/OOXMLBinaryObjectReference.hxx
deleted file mode 100644
index 09502f208199..000000000000
--- a/writerfilter/source/ooxml/OOXMLBinaryObjectReference.hxx
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <dmapper/resourcemodel.hxx>
-#include <ooxml/OOXMLDocument.hxx>
-#include <vector>
-
-namespace writerfilter::ooxml
-{
-class OOXMLBinaryObjectReference : public writerfilter::Reference<BinaryObj>
-{
- OOXMLStream::Pointer_t mpStream;
- std::vector<sal_Int8> mSequence;
- bool mbRead;
-
- void read();
-
-public:
- explicit OOXMLBinaryObjectReference(OOXMLStream::Pointer_t pStream);
- virtual ~OOXMLBinaryObjectReference() override;
-
- virtual void resolve(BinaryObj& rHandler) override;
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
deleted file mode 100644
index 0530969fbccc..000000000000
--- a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
+++ /dev/null
@@ -1,911 +0,0 @@
-/* -*- 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/.
- *
- * 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 <comphelper/sequenceashashmap.hxx>
-
-#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
-#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
-#include <com/sun/star/xml/sax/SAXException.hpp>
-#include <com/sun/star/xml/dom/DocumentBuilder.hpp>
-#include <com/sun/star/graphic/GraphicMapper.hpp>
-#include <ooxml/resourceids.hxx>
-#include <oox/drawingml/theme.hxx>
-#include <oox/shape/ShapeFilterBase.hxx>
-#include "OOXMLStreamImpl.hxx"
-#include "OOXMLDocumentImpl.hxx"
-#include "OOXMLBinaryObjectReference.hxx"
-#include "OOXMLFastDocumentHandler.hxx"
-#include "OOXMLPropertySet.hxx"
-
-#include <sal/log.hxx>
-#include <comphelper/diagnose_ex.hxx>
-#include <svx/dialmgr.hxx>
-#include <svx/strings.hrc>
-#include <comphelper/sequence.hxx>
-#include <comphelper/namedvaluecollection.hxx>
-#include <cppuhelper/exc_hlp.hxx>
-#include <unotools/mediadescriptor.hxx>
-
-#include <iostream>
-#include <sfx2/objsh.hxx>
-#include <utility>
-
-// this extern variable is declared in OOXMLStreamImpl.hxx
-OUString customTarget;
-OUString embeddingsTarget;
-using namespace ::com::sun::star;
-namespace writerfilter::ooxml
-{
-
-OOXMLDocumentImpl::OOXMLDocumentImpl(OOXMLStream::Pointer_t pStream, uno::Reference<task::XStatusIndicator> xStatusIndicator, bool bSkipImages, const uno::Sequence<beans::PropertyValue>& rDescriptor)
- : mpStream(std::move(pStream))
- , mxStatusIndicator(std::move(xStatusIndicator))
- , mnXNoteId(0)
- , mbIsSubstream(false)
- , mbSkipImages(bSkipImages)
- , mnPercentSize(0)
- , mnProgressLastPos(0)
- , mnProgressCurrentPos(0)
- , mnProgressEndPos(0)
- , m_rBaseURL(utl::MediaDescriptor(rDescriptor).getUnpackedValueOrDefault("DocumentBaseURL", OUString()))
- , maMediaDescriptor(rDescriptor)
- , mxGraphicMapper(graphic::GraphicMapper::create(mpStream->getContext()))
-{
- pushShapeContext();
-}
-
-OOXMLDocumentImpl::~OOXMLDocumentImpl()
-{
-}
-
-void OOXMLDocumentImpl::resolveFastSubStream(Stream & rStreamHandler,
- OOXMLStream::StreamType_t nType)
-{
- OOXMLStream::Pointer_t pStream;
- try
- {
- pStream = OOXMLDocumentFactory::createStream(mpStream, nType);
- }
- catch (uno::Exception const&)
- {
- TOOLS_INFO_EXCEPTION("writerfilter.ooxml", "resolveFastSubStream: exception while "
- "resolving stream " << nType);
- return;
- }
- OOXMLStream::Pointer_t savedStream = mpStream;
- mpStream = pStream;
-
- uno::Reference<xml::sax::XFastParser> xParser(mpStream->getFastParser());
-
- if (xParser.is())
- {
- uno::Reference<uno::XComponentContext> xContext(mpStream->getContext());
- rtl::Reference<OOXMLFastDocumentHandler> pDocHandler =
- new OOXMLFastDocumentHandler(xContext, &rStreamHandler, this, mnXNoteId);
-
- uno::Reference<xml::sax::XFastTokenHandler> xTokenHandler(mpStream->getFastTokenHandler());
-
- xParser->setFastDocumentHandler(pDocHandler);
- xParser->setTokenHandler(xTokenHandler);
-
- uno::Reference<io::XInputStream> xInputStream = mpStream->getDocumentStream();
-
- if (xInputStream.is())
- {
- struct xml::sax::InputSource oInputSource;
- oInputSource.aInputStream = xInputStream;
- xParser->parseStream(oInputSource);
-
- xInputStream->closeInput();
- }
- }
-
- mpStream = std::move(savedStream);
-}
-
-void OOXMLDocumentImpl::resolveFastSubStreamWithId(Stream & rStream,
- const writerfilter::Reference<Stream>::Pointer_t& pStream,
- sal_uInt32 nId)
-{
- rStream.substream(nId, pStream);
-}
-
-uno::Reference<xml::dom::XDocument> OOXMLDocumentImpl::importSubStream(OOXMLStream::StreamType_t nType)
-{
- uno::Reference<xml::dom::XDocument> xRet;
-
- OOXMLStream::Pointer_t pStream;
- try
- {
- pStream = OOXMLDocumentFactory::createStream(mpStream, nType);
- }
- catch (uno::Exception const&)
- {
- TOOLS_INFO_EXCEPTION("writerfilter.ooxml", "importSubStream: exception while "
- "importing stream " << nType);
- return xRet;
- }
-
- uno::Reference<io::XInputStream> xInputStream = pStream->getDocumentStream();
- if (xInputStream.is())
- {
- try
- {
- uno::Reference<uno::XComponentContext> xContext(mpStream->getContext());
- uno::Reference<xml::dom::XDocumentBuilder> xDomBuilder(xml::dom::DocumentBuilder::create(xContext));
- xRet = xDomBuilder->parse(xInputStream);
- }
- catch (uno::Exception const&)
- {
- TOOLS_INFO_EXCEPTION("writerfilter.ooxml", "importSubStream: exception while "
- "parsing stream " << nType);
- return xRet;
- }
- }
-
- if (OOXMLStream::CUSTOMXML == nType)
- {
- importSubStreamRelations(pStream, OOXMLStream::CUSTOMXMLPROPS);
- }
- else if (OOXMLStream::CHARTS == nType)
- {
- importSubStreamRelations(pStream, OOXMLStream::EMBEDDINGS);
- }
-
- return xRet;
-}
-
-
-void OOXMLDocumentImpl::importSubStreamRelations(const OOXMLStream::Pointer_t& pStream, OOXMLStream::StreamType_t nType)
-{
- uno::Reference<xml::dom::XDocument> xRelation;
- OOXMLStream::Pointer_t cStream;
- try
- {
- cStream = OOXMLDocumentFactory::createStream(pStream, nType);
- }
- catch (uno::Exception const&)
- {
- TOOLS_WARN_EXCEPTION("writerfilter.ooxml", "importSubStreamRelations: exception while "
- "importing stream " << nType);
- return;
- }
-
- uno::Reference<io::XInputStream> xcpInputStream = cStream->getDocumentStream();
-
- if (!xcpInputStream.is())
- return;
-
- // importing itemprops files for item.xml from customXml.
- if (OOXMLStream::CUSTOMXMLPROPS == nType)
- {
- try
- {
- uno::Reference<uno::XComponentContext> xcpContext(pStream->getContext());
- uno::Reference<xml::dom::XDocumentBuilder> xDomBuilder(xml::dom::DocumentBuilder::create(xcpContext));
- xRelation = xDomBuilder->parse(xcpInputStream);
- }
- catch (uno::Exception const&)
- {
- TOOLS_WARN_EXCEPTION("writerfilter.ooxml", "importSubStream: exception while "
- "parsing stream " << nType);
- mxCustomXmlProsDom = xRelation;
- }
-
- if(xRelation.is())
- {
- mxCustomXmlProsDom = xRelation;
- }
- }
- else if(OOXMLStream::EMBEDDINGS == nType)
- {
- mxEmbeddings = xcpInputStream;
- }
- else if(OOXMLStream::CHARTS == nType)
- {
- importSubStreamRelations(cStream, OOXMLStream::EMBEDDINGS);
- }
-
-
-}
-
-void OOXMLDocumentImpl::setXNoteId(const sal_Int32 nId)
-{
- mnXNoteId = nId;
-}
-
-sal_Int32 OOXMLDocumentImpl::getXNoteId() const
-{
- return mnXNoteId;
-}
-
-const OUString & OOXMLDocumentImpl::getTarget() const
-{
- return mpStream->getTarget();
-}
-
-writerfilter::Reference<Stream>::Pointer_t
-OOXMLDocumentImpl::getSubStream(const OUString & rId)
-{
- OOXMLStream::Pointer_t pStream
- (OOXMLDocumentFactory::createStream(mpStream, rId));
-
- OOXMLDocumentImpl * pTemp;
- // Do not pass status indicator to sub-streams: they are typically marginal in size, so we just track the main document for now.
- writerfilter::Reference<Stream>::Pointer_t pRet( pTemp =
- new OOXMLDocumentImpl(std::move(pStream), uno::Reference<task::XStatusIndicator>(), mbSkipImages, maMediaDescriptor));
- pTemp->setModel(mxModel);
- pTemp->setDrawPage(mxDrawPage);
- pTemp->mbIsSubstream = true;
- return pRet;
-}
-
-writerfilter::Reference<Stream>::Pointer_t
-OOXMLDocumentImpl::getXNoteStream(OOXMLStream::StreamType_t nType, const sal_Int32 nId)
-{
- // See above, no status indicator for the note stream, either.
- OOXMLDocumentImpl * pDocument = new OOXMLDocumentImpl(OOXMLDocumentFactory::createStream(mpStream, nType),
- uno::Reference<task::XStatusIndicator>(), mbSkipImages, maMediaDescriptor);
- pDocument->setXNoteId(nId);
- pDocument->setModel(getModel());
- pDocument->setDrawPage(getDrawPage());
-
- return writerfilter::Reference<Stream>::Pointer_t(pDocument);
-}
-
-void OOXMLDocumentImpl::resolveFootnote(Stream & rStream,
- Id aType,
- const sal_Int32 nNoteId)
-{
- if (!mpXFootnoteStream)
- mpXFootnoteStream = getXNoteStream(OOXMLStream::FOOTNOTES, nNoteId);
-
- Id nId;
- switch (aType)
- {
- case NS_ooxml::LN_Value_doc_ST_FtnEdn_separator:
- case NS_ooxml::LN_Value_doc_ST_FtnEdn_continuationSeparator:
- nId = aType;
- break;
- default:
- nId = NS_ooxml::LN_footnote;
- break;
- }
-
- resolveFastSubStreamWithId(rStream, mpXFootnoteStream, nId);
-}
-
-void OOXMLDocumentImpl::resolveEndnote(Stream & rStream,
- Id aType,
- const sal_Int32 nNoteId)
-{
- if (!mpXEndnoteStream)
- mpXEndnoteStream = getXNoteStream(OOXMLStream::ENDNOTES, nNoteId);
-
- Id nId;
- switch (aType)
- {
- case NS_ooxml::LN_Value_doc_ST_FtnEdn_separator:
- case NS_ooxml::LN_Value_doc_ST_FtnEdn_continuationSeparator:
- nId = aType;
- break;
- default:
- nId = NS_ooxml::LN_endnote;
- break;
- }
-
- resolveFastSubStreamWithId(rStream, mpXEndnoteStream, nId);
-}
-
-void OOXMLDocumentImpl::resolveCommentsExtendedStream(Stream& rStream)
-{
- resolveFastSubStream(rStream, OOXMLStream::COMMENTS_EXTENDED);
-}
-
-void OOXMLDocumentImpl::resolveComment(Stream & rStream,
- const sal_Int32 nId)
-{
- if (!mbCommentsExtendedResolved)
- {
- resolveCommentsExtendedStream(rStream);
- mbCommentsExtendedResolved = true;
- }
-
- writerfilter::Reference<Stream>::Pointer_t pStream =
- getXNoteStream(OOXMLStream::COMMENTS, nId);
-
- resolveFastSubStreamWithId(rStream, pStream, NS_ooxml::LN_annotation);
-}
-
-OOXMLPropertySet * OOXMLDocumentImpl::getPicturePropSet
-(const OUString & rId)
-{
- OOXMLStream::Pointer_t xStream
- (OOXMLDocumentFactory::createStream(mpStream, rId));
-
- writerfilter::Reference<BinaryObj>::Pointer_t xPicture
- (new OOXMLBinaryObjectReference(std::move(xStream)));
-
- OOXMLValue::Pointer_t pPayloadValue(new OOXMLBinaryValue(std::move(xPicture)));
-
- OOXMLPropertySet::Pointer_t pBlipSet(new OOXMLPropertySet);
-
- pBlipSet->add(NS_ooxml::LN_payload, pPayloadValue, OOXMLProperty::ATTRIBUTE);
-
- OOXMLValue::Pointer_t pBlipValue(new OOXMLPropertySetValue(pBlipSet));
-
- OOXMLPropertySet * pProps = new OOXMLPropertySet;
-
- pProps->add(NS_ooxml::LN_blip, pBlipValue, OOXMLProperty::ATTRIBUTE);
-
- return pProps;
-}
-
-void OOXMLDocumentImpl::resolvePicture(Stream & rStream,
- const OUString & rId)
-{
- OOXMLPropertySet::Pointer_t pProps(getPicturePropSet(rId));
-
- rStream.props(pProps.get());
-}
-
-OUString OOXMLDocumentImpl::getTargetForId(const OUString & rId)
-{
- return mpStream->getTargetForId(rId);
-}
-
-void OOXMLDocumentImpl::resolveHeader(Stream & rStream,
- const sal_Int32 type,
- const OUString & rId)
-{
- writerfilter::Reference<Stream>::Pointer_t pStream =
- getSubStream(rId);
- switch (type)
- {
- case NS_ooxml::LN_Value_ST_HdrFtr_even:
- resolveFastSubStreamWithId(rStream, pStream, NS_ooxml::LN_headerl);
- break;
- case NS_ooxml::LN_Value_ST_HdrFtr_default: // here we assume that default is right, but not necessarily true :-(
- resolveFastSubStreamWithId(rStream, pStream, NS_ooxml::LN_headerr);
- break;
- case NS_ooxml::LN_Value_ST_HdrFtr_first:
- resolveFastSubStreamWithId(rStream, pStream, NS_ooxml::LN_headerf);
- break;
- default:
- break;
- }
-}
-
-void OOXMLDocumentImpl::resolveFooter(Stream & rStream,
- const sal_Int32 type,
- const OUString & rId)
-{
- writerfilter::Reference<Stream>::Pointer_t pStream =
- getSubStream(rId);
-
- switch (type)
- {
- case NS_ooxml::LN_Value_ST_HdrFtr_even:
- resolveFastSubStreamWithId(rStream, pStream, NS_ooxml::LN_footerl);
- break;
- case NS_ooxml::LN_Value_ST_HdrFtr_default: // here we assume that default is right, but not necessarily true :-(
- resolveFastSubStreamWithId(rStream, pStream, NS_ooxml::LN_footerr);
- break;
- case NS_ooxml::LN_Value_ST_HdrFtr_first:
- resolveFastSubStreamWithId(rStream, pStream, NS_ooxml::LN_footerf);
- break;
- default:
- break;
- }
-}
-
-namespace {
-// Ensures that the indicator is reset after exiting OOXMLDocumentImpl::resolve
-class StatusIndicatorGuard{
-public:
- explicit StatusIndicatorGuard(css::uno::Reference<css::task::XStatusIndicator> xStatusIndicator)
- :mxStatusIndicator(std::move(xStatusIndicator))
- {
- }
-
- ~StatusIndicatorGuard()
- {
- if (mxStatusIndicator.is())
- mxStatusIndicator->end();
- }
-
-private:
- css::uno::Reference<css::task::XStatusIndicator> mxStatusIndicator;
-};
-}
-
-void OOXMLDocumentImpl::resolve(Stream & rStream)
-{
- StatusIndicatorGuard aStatusIndicatorGuard(mxStatusIndicator);
-
- if (utl::MediaDescriptor(maMediaDescriptor).getUnpackedValueOrDefault("ReadGlossaries", false))
- {
- resolveFastSubStream(rStream, OOXMLStream::GLOSSARY);
- return;
- }
-
- uno::Reference<xml::sax::XFastParser> xParser(mpStream->getFastParser());
-
- if (mxModel.is())
- {
- uno::Reference<document::XDocumentPropertiesSupplier> xDocumentPropertiesSupplier(mxModel, uno::UNO_QUERY);
- uno::Reference<document::XDocumentProperties> xDocumentProperties = xDocumentPropertiesSupplier->getDocumentProperties();
- comphelper::SequenceAsHashMap aMap(xDocumentProperties->getDocumentStatistics());
- if (aMap.find("ParagraphCount") != aMap.end())
- {
- sal_Int32 nValue;
- if (aMap["ParagraphCount"] >>= nValue)
- {
- if (mxStatusIndicator.is())
- {
- // We want to care about the progress if we know the estimated paragraph count and we have given a status indicator as well.
- // Set the end position only here, so later it's enough to check if that is non-zero in incrementProgress().
- mnProgressEndPos = nValue;
- OUString aDocLoad(SvxResId(RID_SVXSTR_DOC_LOAD));
- mxStatusIndicator->start(aDocLoad, mnProgressEndPos);
- mnPercentSize = mnProgressEndPos / 100;
- }
- }
- }
- }
-
- if (!xParser.is())
- return;
-
- uno::Reference<uno::XComponentContext> xContext(mpStream->getContext());
-
- rStream.setDocumentReference(this);
-
- rtl::Reference<OOXMLFastDocumentHandler> pDocHandler =
- new OOXMLFastDocumentHandler(xContext, &rStream, this, mnXNoteId);
- pDocHandler->setIsSubstream( mbIsSubstream );
- uno::Reference < xml::sax::XFastTokenHandler > xTokenHandler(mpStream->getFastTokenHandler());
-
- resolveFastSubStream(rStream, OOXMLStream::SETTINGS);
- mxThemeDom = importSubStream(OOXMLStream::THEME);
- resolveFastSubStream(rStream, OOXMLStream::THEME);
- // Convert the oox::Theme to the draw page
- {
- auto pThemePtr = getTheme();
- if (pThemePtr)
- pThemePtr->addTheme(getDrawPage());
- }
- mxGlossaryDocDom = importSubStream(OOXMLStream::GLOSSARY);
- if (mxGlossaryDocDom.is())
- resolveGlossaryStream(rStream);
-
- resolveEmbeddingsStream(mpStream);
-
- // Custom xml's are handled as part of grab bag.
- resolveCustomXmlStream(rStream);
-
- resolveFastSubStream(rStream, OOXMLStream::FONTTABLE);
- resolveFastSubStream(rStream, OOXMLStream::STYLES);
- resolveFastSubStream(rStream, OOXMLStream::NUMBERING);
-
- xParser->setFastDocumentHandler( pDocHandler );
- xParser->setTokenHandler( xTokenHandler );
-
- xml::sax::InputSource aParserInput;
- aParserInput.sSystemId = mpStream->getTarget();
- aParserInput.aInputStream = mpStream->getDocumentStream();
- try
- {
- xParser->parseStream(aParserInput);
- }
- catch (xml::sax::SAXException const&)
- {
- // don't silently swallow these - handlers may not have been executed,
- // and the domain mapper is likely in an inconsistent state
- // In case user chooses to try to continue loading, don't ask again for this file
- SfxObjectShell* rShell = SfxObjectShell::GetShellFromComponent(mxModel);
- if (!rShell || !rShell->IsContinueImportOnFilterExceptions())
- throw;
- }
- catch (uno::RuntimeException const&)
- {
- throw;
- }
- // note: cannot throw anything other than SAXException out of here?
- catch (uno::Exception const&)
- {
- css::uno::Any anyEx = cppu::getCaughtException();
- SAL_WARN("writerfilter.ooxml", "OOXMLDocumentImpl::resolve(): " << exceptionToString(anyEx));
- throw lang::WrappedTargetRuntimeException("", nullptr, anyEx);
- }
- catch (...)
- {
- SAL_WARN("writerfilter.ooxml",
- "OOXMLDocumentImpl::resolve(): non-UNO exception");
- }
-}
-
-void OOXMLDocumentImpl::incrementProgress()
-{
- mnProgressCurrentPos++;
- // 1) If we know the end
- // 2) We progressed enough that updating makes sense
- // 3) We did not reach the end yet (possible in case the doc stat is misleading)
- if (mnProgressEndPos && mnProgressCurrentPos > (mnProgressLastPos + mnPercentSize) && mnProgressLastPos < mnProgressEndPos)
- {
- mnProgressLastPos = mnProgressCurrentPos;
- if (mxStatusIndicator.is())
- mxStatusIndicator->setValue(mnProgressLastPos);
- }
-}
-
-void OOXMLDocumentImpl::resolveCustomXmlStream(Stream & rStream)
-{
- // Resolving all item[n].xml files from CustomXml folder.
- uno::Reference<embed::XRelationshipAccess> xRelationshipAccess;
- xRelationshipAccess.set(dynamic_cast<OOXMLStreamImpl&>(*mpStream).accessDocumentStream(), uno::UNO_QUERY);
- if (!xRelationshipAccess.is())
- return;
-
- static const char sCustomType[] = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml";
- static const char sCustomTypeStrict[] = "http://purl.oclc.org/ooxml/officeDocument/relationships/customXml";
- bool bFound = false;
- const uno::Sequence<uno::Sequence< beans::StringPair>> aSeqs = xRelationshipAccess->getAllRelationships();
- std::vector<uno::Reference<xml::dom::XDocument>> aCustomXmlDomList;
- std::vector<uno::Reference<xml::dom::XDocument>> aCustomXmlDomPropsList;
- for (const uno::Sequence<beans::StringPair>& aSeq : aSeqs)
- {
- for (const beans::StringPair& aPair : aSeq)
- {
- // Need to resolve only customxml files from document relationships.
- // Skipping other files.
- if (aPair.Second == sCustomType ||
- aPair.Second == sCustomTypeStrict)
- bFound = true;
- else if (aPair.First == "Target" && bFound)
- {
- // Adding value to extern variable customTarget. It will be used in ooxmlstreamimpl
- // to ensure customxml target is visited in lcl_getTarget.
- customTarget = aPair.Second;
- }
- }
-
- if (bFound)
- {
- uno::Reference<xml::dom::XDocument> customXmlTemp = importSubStream(OOXMLStream::CUSTOMXML);
- // This will add all item[n].xml with its relationship file i.e itemprops.xml to
- // grabbag list.
- if (mxCustomXmlProsDom.is() && customXmlTemp.is())
- {
- aCustomXmlDomList.push_back(customXmlTemp);
- aCustomXmlDomPropsList.push_back(mxCustomXmlProsDom);
- resolveFastSubStream(rStream, OOXMLStream::CUSTOMXML);
- }
-
- bFound = false;
- }
- }
-
- mxCustomXmlDomList = comphelper::containerToSequence(aCustomXmlDomList);
- mxCustomXmlDomPropsList = comphelper::containerToSequence(aCustomXmlDomPropsList);
-}
-
-namespace
-{
-constexpr OUStringLiteral sSettingsType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings";
-constexpr OUStringLiteral sStylesType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";
-constexpr OUStringLiteral sFonttableType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable";
-constexpr OUStringLiteral sWebSettings = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings";
-constexpr OUStringLiteral sSettingsTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/settings";
-constexpr OUStringLiteral sStylesTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/styles";
-constexpr OUStringLiteral sFonttableTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/fontTable";
-constexpr OUStringLiteral sWebSettingsStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/webSettings";
-
-constexpr OUString sId = u"Id"_ustr;
-constexpr OUStringLiteral sType = u"Type";
-constexpr OUString sTarget = u"Target"_ustr;
-constexpr OUStringLiteral sTargetMode = u"TargetMode";
-constexpr OUString sContentType = u"_contentType"_ustr;
-constexpr OUStringLiteral sRelDom = u"_relDom";
-constexpr OUStringLiteral sSettingsContentType = u"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml";
-constexpr OUStringLiteral sStylesContentType = u"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml";
-constexpr OUStringLiteral sWebsettingsContentType = u"application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml";
-constexpr OUStringLiteral sFonttableContentType = u"application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml";
-}
-
-// See DocxExport::WriteGlossary
-void OOXMLDocumentImpl::resolveGlossaryStream(Stream & /*rStream*/)
-{
- OOXMLStream::Pointer_t pStream;
- try
- {
- pStream = OOXMLDocumentFactory::createStream(mpStream, OOXMLStream::GLOSSARY);
- }
- catch (uno::Exception const&)
- {
- TOOLS_INFO_EXCEPTION("writerfilter.ooxml", "resolveGlossaryStream: exception while "
- "createStream for glossary" << OOXMLStream::GLOSSARY);
- return;
- }
- uno::Reference<embed::XRelationshipAccess> xRelationshipAccess;
- xRelationshipAccess.set(dynamic_cast<OOXMLStreamImpl&>(*pStream).accessDocumentStream(), uno::UNO_QUERY);
- if (!xRelationshipAccess.is())
- return;
-
-
- const uno::Sequence< uno::Sequence< beans::StringPair > >aSeqs = xRelationshipAccess->getAllRelationships();
- std::vector< uno::Sequence<beans::NamedValue> > aGlossaryDomList;
- for (const uno::Sequence< beans::StringPair >& aSeq : aSeqs)
- {
- comphelper::NamedValueCollection aRelDefinition;
- for (const auto& [name, value] : aSeq)
- aRelDefinition.put(name, value);
-
- const OUString gType = aRelDefinition.getOrDefault(sType, OUString{});
- OOXMLStream::StreamType_t nType(OOXMLStream::UNKNOWN);
- if (gType == sSettingsType || gType == sSettingsTypeStrict)
- {
- nType = OOXMLStream::SETTINGS;
- aRelDefinition.put(sContentType, sSettingsContentType);
- }
- else if (gType == sStylesType || gType == sStylesTypeStrict)
- {
- nType = OOXMLStream::STYLES;
- aRelDefinition.put(sContentType, sStylesContentType);
- }
- else if (gType == sWebSettings || gType == sWebSettingsStrict)
- {
- nType = OOXMLStream::WEBSETTINGS;
- aRelDefinition.put(sContentType, sWebsettingsContentType);
- }
- else if (gType == sFonttableType || gType == sFonttableTypeStrict)
- {
- nType = OOXMLStream::FONTTABLE;
- aRelDefinition.put(sContentType, sFonttableContentType);
- }
- else if (aRelDefinition.getOrDefault(sTargetMode, OUString{}) != "External")
- {
- // Some internal relation, but we don't create a DOM for it here yet?
- SAL_WARN("writerfilter.ooxml", "Unknown type of glossary internal relation: "
- "Id=\"" + aRelDefinition.getOrDefault<OUString>(sId, {}) + "\" "
- "Type=\"" + gType + "\" "
- "Target=\"" + aRelDefinition.getOrDefault<OUString>(sTarget, {}) + "\"");
- continue;
- }
-
- if (nType != OOXMLStream::UNKNOWN)
- {
- try
- {
- auto gStream = OOXMLDocumentFactory::createStream(pStream, nType);
- uno::Reference xInputStream = gStream->getDocumentStream();
- uno::Reference xContext(pStream->getContext());
- uno::Reference xDomBuilder(xml::dom::DocumentBuilder::create(xContext));
- uno::Reference xDom = xDomBuilder->parse(xInputStream);
- aRelDefinition.put(sRelDom, xDom);
- }
- catch (uno::Exception const&)
- {
- TOOLS_INFO_EXCEPTION("writerfilter.ooxml", "importSubStream: exception while "
- "parsing stream of Type" << nType);
- }
- }
- aGlossaryDomList.push_back(aRelDefinition.getNamedValues());
- }
- mxGlossaryDomList = comphelper::containerToSequence(aGlossaryDomList);
-}
-
-void OOXMLDocumentImpl::resolveEmbeddingsStream(const OOXMLStream::Pointer_t& pStream)
-{
- uno::Reference<embed::XRelationshipAccess> xRelationshipAccess;
- xRelationshipAccess.set(dynamic_cast<OOXMLStreamImpl&>(*pStream).accessDocumentStream(), uno::UNO_QUERY);
- if (xRelationshipAccess.is())
- {
- static constexpr OUStringLiteral sChartType(u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart");
- static constexpr OUStringLiteral sChartTypeStrict(u"http://purl.oclc.org/ooxml/officeDocument/relationships/chart");
- static constexpr OUStringLiteral sFootersType(u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer");
- static constexpr OUStringLiteral sFootersTypeStrict(u"http://purl.oclc.org/ooxml/officeDocument/relationships/footer");
- static constexpr OUStringLiteral sHeaderType(u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/header");
- static constexpr OUStringLiteral sHeaderTypeStrict(u"http://purl.oclc.org/ooxml/officeDocument/relationships/header");
-
- bool bFound = false;
- bool bHeaderFooterFound = false;
- OOXMLStream::StreamType_t streamType = OOXMLStream::UNKNOWN;
- const uno::Sequence< uno::Sequence< beans::StringPair > >aSeqs = xRelationshipAccess->getAllRelationships();
- for (const uno::Sequence< beans::StringPair >& aSeq : aSeqs)
- {
- for (const beans::StringPair& aPair : aSeq)
- {
- if (aPair.Second == sChartType ||
- aPair.Second == sChartTypeStrict)
- {
- bFound = true;
- }
- else if(aPair.Second == sFootersType ||
- aPair.Second == sFootersTypeStrict)
- {
- bHeaderFooterFound = true;
- streamType = OOXMLStream::FOOTER;
- }
- else if(aPair.Second == sHeaderType ||
- aPair.Second == sHeaderTypeStrict)
- {
- bHeaderFooterFound = true;
- streamType = OOXMLStream::HEADER;
- }
- else if(aPair.First == "Target" && ( bFound || bHeaderFooterFound ))
- {
- // Adding value to extern variable customTarget. It will be used in ooxmlstreamimpl
- // to ensure chart.xml target is visited in lcl_getTarget.
- customTarget = aPair.Second;
- }
- }
- if( bFound || bHeaderFooterFound)
- {
- if(bFound)
- {
- importSubStreamRelations(pStream, OOXMLStream::CHARTS);
- }
- if(bHeaderFooterFound)
- {
- try
- {
- OOXMLStream::Pointer_t Stream = OOXMLDocumentFactory::createStream(pStream, streamType);
- if (Stream)
- resolveEmbeddingsStream(Stream);
- }
- catch (uno::Exception const&)
- {
- TOOLS_INFO_EXCEPTION("writerfilter.ooxml", "resolveEmbeddingsStream: can't find header/footer whilst "
- "resolving stream " << streamType);
- return;
- }
- }
-
- beans::PropertyValue embeddingsTemp;
- // This will add all .xlsx and .bin to grabbag list.
- if(bFound && mxEmbeddings.is())
- {
- embeddingsTemp.Name = embeddingsTarget;
- embeddingsTemp.Value <<= mxEmbeddings;
- m_aEmbeddings.push_back(embeddingsTemp);
- mxEmbeddings.clear();
- }
- bFound = false;
- bHeaderFooterFound = false;
- }
- }
- }
- if (!m_aEmbeddings.empty())
- mxEmbeddingsList = comphelper::containerToSequence(m_aEmbeddings);
-}
-
-uno::Reference<xml::dom::XDocument> OOXMLDocumentImpl::getGlossaryDocDom( )
-{
- return mxGlossaryDocDom;
-}
-
-uno::Sequence<uno::Sequence< beans::NamedValue> > OOXMLDocumentImpl::getGlossaryDomList()
-{
- return mxGlossaryDomList;
-}
-
-uno::Reference<io::XInputStream> OOXMLDocumentImpl::getInputStreamForId(const OUString & rId)
-{
- OOXMLStream::Pointer_t pStream(OOXMLDocumentFactory::createStream(mpStream, rId));
-
- return pStream->getDocumentStream();
-}
-
-void OOXMLDocumentImpl::setModel(uno::Reference<frame::XModel> xModel)
-{
- mxModel.set(xModel);
-}
-
-uno::Reference<frame::XModel> OOXMLDocumentImpl::getModel()
-{
- return mxModel;
-}
-
-void OOXMLDocumentImpl::setDrawPage(uno::Reference<drawing::XDrawPage> xDrawPage)
-{
- mxDrawPage.set(xDrawPage);
-}
-
-uno::Reference<drawing::XDrawPage> OOXMLDocumentImpl::getDrawPage()
-{
- return mxDrawPage;
-}
-
-const uno::Sequence<beans::PropertyValue>& OOXMLDocumentImpl::getMediaDescriptor() const
-{
- return maMediaDescriptor;
-}
-
-void OOXMLDocumentImpl::setShapeContext(const rtl::Reference<oox::shape::ShapeContextHandler>& xContext)
-{
- if (!maShapeContexts.empty())
- maShapeContexts.top() = xContext;
-}
-
-rtl::Reference<oox::shape::ShapeContextHandler> OOXMLDocumentImpl::getShapeContext( )
-{
- if (!maShapeContexts.empty())
- return maShapeContexts.top();
- else
- return {};
-}
-
-void OOXMLDocumentImpl::pushShapeContext()
-{
- maShapeContexts.push({});
-}
-
-void OOXMLDocumentImpl::popShapeContext()
-{
- if (!maShapeContexts.empty())
- maShapeContexts.pop();
-}
-
-uno::Reference<xml::dom::XDocument> OOXMLDocumentImpl::getThemeDom( )
-{
- return mxThemeDom;
-}
-
-uno::Sequence<uno::Reference<xml::dom::XDocument> > OOXMLDocumentImpl::getCustomXmlDomList( )
-{
- return mxCustomXmlDomList;
-}
-
-uno::Sequence<uno::Reference<xml::dom::XDocument> > OOXMLDocumentImpl::getCustomXmlDomPropsList( )
-{
- return mxCustomXmlDomPropsList;
-}
-
-uno::Sequence<beans::PropertyValue > OOXMLDocumentImpl::getEmbeddingsList( )
-{
- return mxEmbeddingsList;
-}
-
-const rtl::Reference<oox::shape::ShapeFilterBase>& OOXMLDocumentImpl::getShapeFilterBase()
-{
- if (!mxShapeFilterBase)
- mxShapeFilterBase = new oox::shape::ShapeFilterBase(mpStream->getContext());
- return mxShapeFilterBase;
-}
-
-const rtl::Reference<oox::drawingml::ThemeFilterBase>& OOXMLDocumentImpl::getThemeFilterBase()
-{
- if (!mxThemeFilterBase)
- mxThemeFilterBase = new oox::drawingml::ThemeFilterBase(mpStream->getContext());
- return mxThemeFilterBase;
-}
-
-OOXMLDocument *
-OOXMLDocumentFactory::createDocument
-(const OOXMLStream::Pointer_t& pStream,
- const uno::Reference<task::XStatusIndicator>& xStatusIndicator,
- bool mbSkipImages, const uno::Sequence<beans::PropertyValue>& rDescriptor)
-{
- return new OOXMLDocumentImpl(pStream, xStatusIndicator, mbSkipImages, rDescriptor);
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
deleted file mode 100644
index 87aae13ab94f..000000000000
--- a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
+++ /dev/null
@@ -1,171 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <ooxml/OOXMLDocument.hxx>
-
-#include <com/sun/star/xml/dom/XDocument.hpp>
-#include <com/sun/star/graphic/XGraphicMapper.hpp>
-
-#include <oox/drawingml/drawingmltypes.hxx>
-#include <oox/drawingml/ThemeFilterBase.hxx>
-
-#include "OOXMLPropertySet.hxx"
-
-#include <vector>
-#include <stack>
-
-namespace writerfilter::ooxml
-{
-
-class OOXMLDocumentImpl : public OOXMLDocument
-{
- OOXMLStream::Pointer_t mpStream;
- css::uno::Reference<css::task::XStatusIndicator> mxStatusIndicator;
- writerfilter::Reference<Stream>::Pointer_t mpXFootnoteStream;
- writerfilter::Reference<Stream>::Pointer_t mpXEndnoteStream;
- sal_Int32 mnXNoteId;
-
- css::uno::Reference<css::frame::XModel> mxModel;
- css::uno::Reference<css::drawing::XDrawPage> mxDrawPage;
- css::uno::Reference<css::xml::dom::XDocument> mxGlossaryDocDom;
- css::uno::Sequence < css::uno::Sequence< css::beans::NamedValue > > mxGlossaryDomList;
- /// Stack of shape contexts, 1 element for VML, 1 element / nesting level for drawingML.
- std::stack< rtl::Reference<oox::shape::ShapeContextHandler> > maShapeContexts;
- css::uno::Reference<css::xml::dom::XDocument> mxThemeDom;
- css::uno::Sequence<css::uno::Reference<css::xml::dom::XDocument> > mxCustomXmlDomList;
- css::uno::Sequence<css::uno::Reference<css::xml::dom::XDocument> > mxCustomXmlDomPropsList;
- css::uno::Reference<css::xml::dom::XDocument> mxCustomXmlProsDom;
- css::uno::Reference<css::io::XInputStream> mxEmbeddings;
- css::uno::Sequence < css::beans::PropertyValue > mxEmbeddingsList;
- std::vector<css::beans::PropertyValue> m_aEmbeddings;
- bool mbIsSubstream;
- bool mbSkipImages;
- /// How many paragraphs equal to 1 percent?
- sal_Int32 mnPercentSize;
- /// Position progress when it was last updated, possibly not after every paragraph in case of large documents.
- sal_Int32 mnProgressLastPos;
- /// Current position progress, updated after every paragraph.
- sal_Int32 mnProgressCurrentPos;
- /// End position, i.e. the estimated number of paragraphs.
- sal_Int32 mnProgressEndPos;
- /// DocumentBaseURL
- OUString m_rBaseURL;
- css::uno::Sequence<css::beans::PropertyValue> maMediaDescriptor;
- /// Graphic mapper
- css::uno::Reference<css::graphic::XGraphicMapper> mxGraphicMapper;
- // For a document there is a single theme in document.xml.rels
- // and the same is used by header and footer as well.
- oox::drawingml::ThemePtr mpTheme;
- rtl::Reference<oox::shape::ShapeFilterBase> mxShapeFilterBase;
- rtl::Reference<oox::drawingml::ThemeFilterBase> mxThemeFilterBase;
-
- bool mbCommentsExtendedResolved = false;
-
-private:
- void resolveFastSubStream(Stream & rStream,
- OOXMLStream::StreamType_t nType);
-
- static void resolveFastSubStreamWithId(Stream & rStream,
- const writerfilter::Reference<Stream>::Pointer_t& pStream,
- sal_uInt32 nId);
-
- css::uno::Reference<css::xml::dom::XDocument> importSubStream(OOXMLStream::StreamType_t nType);
-
- void importSubStreamRelations(const OOXMLStream::Pointer_t& pStream, OOXMLStream::StreamType_t nType);
-
- writerfilter::Reference<Stream>::Pointer_t
- getSubStream(const OUString & rId);
-
- writerfilter::Reference<Stream>::Pointer_t
- getXNoteStream(OOXMLStream::StreamType_t nType, const sal_Int32 nNoteId);
-
- void resolveCustomXmlStream(Stream & rStream);
- void resolveGlossaryStream(Stream & rStream);
- void resolveEmbeddingsStream(const OOXMLStream::Pointer_t& pStream);
- void resolveCommentsExtendedStream(Stream & rStream);
-
-public:
- OOXMLDocumentImpl(OOXMLStream::Pointer_t pStream, css::uno::Reference<css::task::XStatusIndicator> xStatusIndicator, bool bSkipImages, const css::uno::Sequence<css::beans::PropertyValue>& rDescriptor);
- virtual ~OOXMLDocumentImpl() override;
-
- virtual void resolve(Stream & rStream) override;
-
- virtual void resolveFootnote(Stream & rStream,
- Id aType,
- const sal_Int32 nNoteId) override;
- virtual void resolveEndnote(Stream & rStream,
- Id aType,
- const sal_Int32 nNoteId) override;
- virtual void resolveHeader(Stream & rStream,
- const sal_Int32 type,
- const OUString & rId) override;
- virtual void resolveFooter(Stream & rStream,
- const sal_Int32 type,
- const OUString & rId) override;
-
- virtual void resolveComment(Stream & rStream, const sal_Int32 nId) override;
-
- OOXMLPropertySet * getPicturePropSet(const OUString & rId);
- virtual void resolvePicture(Stream & rStream, const OUString & rId) override;
-
- virtual OUString getTargetForId(const OUString & rId) override;
-
- virtual void setModel(css::uno::Reference<css::frame::XModel> xModel) override;
- virtual css::uno::Reference<css::frame::XModel> getModel() override;
- virtual void setDrawPage(css::uno::Reference<css::drawing::XDrawPage> xDrawPage) override;
- virtual css::uno::Reference<css::drawing::XDrawPage> getDrawPage() override;
- virtual css::uno::Reference<css::io::XInputStream> getInputStreamForId(const OUString & rId) override;
- virtual void setXNoteId(const sal_Int32 nId) override;
- virtual sal_Int32 getXNoteId() const override;
- virtual const OUString & getTarget() const override;
- virtual rtl::Reference<oox::shape::ShapeContextHandler> getShapeContext( ) override;
- virtual void setShapeContext(const rtl::Reference<oox::shape::ShapeContextHandler>& xContext) override;
- virtual const oox::drawingml::ThemePtr & getTheme() const override
- {
- return mpTheme;
- }
- void pushShapeContext() override;
- void popShapeContext() override;
- virtual css::uno::Reference<css::xml::dom::XDocument> getThemeDom() override;
- virtual css::uno::Sequence<css::uno::Reference<css::xml::dom::XDocument> > getCustomXmlDomList() override;
- virtual css::uno::Sequence<css::uno::Reference<css::xml::dom::XDocument> > getCustomXmlDomPropsList() override;
- virtual css::uno::Reference<css::xml::dom::XDocument> getGlossaryDocDom() override;
- virtual css::uno::Sequence<css::uno::Sequence< css::beans::NamedValue> > getGlossaryDomList() override;
- virtual css::uno::Sequence<css::beans::PropertyValue > getEmbeddingsList() override;
-
- void incrementProgress();
- bool IsSkipImages() const { return mbSkipImages; };
- OUString const& GetDocumentBaseURL() const { return m_rBaseURL; };
- const css::uno::Sequence<css::beans::PropertyValue>& getMediaDescriptor() const;
-
- const css::uno::Reference<css::graphic::XGraphicMapper>& getGraphicMapper() const
- {
- return mxGraphicMapper;
- }
-
- void setTheme(const oox::drawingml::ThemePtr& pTheme) { mpTheme = pTheme; }
-
- const rtl::Reference<oox::shape::ShapeFilterBase> & getShapeFilterBase();
- const rtl::Reference<oox::drawingml::ThemeFilterBase> & getThemeFilterBase();
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLFactory.cxx b/writerfilter/source/ooxml/OOXMLFactory.cxx
deleted file mode 100644
index b11cf07c2900..000000000000
--- a/writerfilter/source/ooxml/OOXMLFactory.cxx
+++ /dev/null
@@ -1,179 +0,0 @@
-/* -*- 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/.
- *
- * 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 <sax/fastattribs.hxx>
-#include "OOXMLFactory.hxx"
-
-namespace writerfilter::ooxml {
-
-using namespace com::sun::star;
-
-
-OOXMLFactory_ns::~OOXMLFactory_ns()
-{
-}
-
-
-void OOXMLFactory::attributes(OOXMLFastContextHandler * pHandler,
- const uno::Reference< xml::sax::XFastAttributeList > & xAttribs)
-{
- Id nDefine = pHandler->getDefine();
- OOXMLFactory_ns::Pointer_t pFactory = getFactoryForNamespace(nDefine);
-
- if (!pFactory)
- return;
-
- sax_fastparser::FastAttributeList& rAttribs =
- sax_fastparser::castToFastAttributeList( xAttribs );
-
- const AttributeInfo *pAttr = pFactory->getAttributeInfoArray(nDefine);
- if (!pAttr)
- return;
-
- for (; pAttr->m_nToken != -1; ++pAttr)
- {
- sal_Int32 nToken = pAttr->m_nToken;
- sal_Int32 nAttrIndex = rAttribs.getAttributeIndex(nToken);
- if (nAttrIndex == -1)
- continue;
-
- Id nId = pFactory->getResourceId(nDefine, nToken);
-
- OOXMLValue::Pointer_t xValue;
- switch (pAttr->m_nResource)
- {
- case ResourceType::Boolean:
- xValue = OOXMLBooleanValue::Create(rAttribs.getAsViewByIndex(nAttrIndex));
- break;
- case ResourceType::String:
- xValue = new OOXMLStringValue(rAttribs.getValueByIndex(nAttrIndex));
- break;
- case ResourceType::Integer:
- xValue = OOXMLIntegerValue::Create(rAttribs.getAsIntegerByIndex(nAttrIndex));
- break;
- case ResourceType::Hex:
- xValue = new OOXMLHexValue(rAttribs.getAsViewByIndex(nAttrIndex));
- break;
- case ResourceType::HexColor:
- xValue = new OOXMLHexColorValue(rAttribs.getAsViewByIndex(nAttrIndex));
- break;
- case ResourceType::TwipsMeasure_asSigned:
- case ResourceType::TwipsMeasure_asZero:
- xValue = new OOXMLTwipsMeasureValue(rAttribs.getAsViewByIndex(nAttrIndex));
- if (xValue->getInt() < 0)
- {
- if (pAttr->m_nResource == ResourceType::TwipsMeasure_asZero)
- xValue = OOXMLIntegerValue::Create(0);
- }
- break;
- case ResourceType::HpsMeasure:
- xValue = new OOXMLHpsMeasureValue(rAttribs.getAsViewByIndex(nAttrIndex));
- break;
- case ResourceType::MeasurementOrPercent:
- xValue = new OOXMLMeasurementOrPercentValue(rAttribs.getAsViewByIndex(nAttrIndex));
- break;
- case ResourceType::List:
- if (sal_uInt32 nValue;
- pFactory->getListValue(pAttr->m_nRef, rAttribs.getAsViewByIndex(nAttrIndex), nValue))
- {
- xValue = OOXMLIntegerValue::Create(nValue);
- }
- break;
- default:
- break;
- }
-
- if (xValue)
- {
- pHandler->newProperty(nId, xValue);
- pFactory->attributeAction(pHandler, nToken, xValue);
- }
- }
-}
-
-uno::Reference< xml::sax::XFastContextHandler>
-OOXMLFactory::createFastChildContext(OOXMLFastContextHandler * pHandler,
- Token_t Element)
-{
- Id nDefine = pHandler->getDefine();
-
- OOXMLFactory_ns::Pointer_t pFactory = getFactoryForNamespace(nDefine);
-
- uno::Reference< xml::sax::XFastContextHandler> ret;
-
- //Avoid handling unknown tokens and recursing to death
- if ((Element & 0xffff) < oox::XML_TOKEN_COUNT)
- ret = createFastChildContextFromFactory(pHandler, pFactory, Element);
-
- return ret;
-}
-
-void OOXMLFactory::characters(OOXMLFastContextHandler * pHandler,
- const OUString & rString)
-{
- Id nDefine = pHandler->getDefine();
- OOXMLFactory_ns::Pointer_t pFactory = getFactoryForNamespace(nDefine);
-
- if (pFactory)
- {
- pFactory->charactersAction(pHandler, rString);
- }
-}
-
-void OOXMLFactory::startAction(OOXMLFastContextHandler * pHandler)
-{
- Id nDefine = pHandler->getDefine();
- OOXMLFactory_ns::Pointer_t pFactory = getFactoryForNamespace(nDefine);
-
- if (pFactory)
- {
- pFactory->startAction(pHandler);
- }
-}
-
-void OOXMLFactory::endAction(OOXMLFastContextHandler * pHandler)
-{
- Id nDefine = pHandler->getDefine();
- OOXMLFactory_ns::Pointer_t pFactory = getFactoryForNamespace(nDefine);
-
- if (pFactory)
- {
- pFactory->endAction(pHandler);
- }
-}
-
-void OOXMLFactory_ns::startAction(OOXMLFastContextHandler *)
-{
-}
-
-void OOXMLFactory_ns::endAction(OOXMLFastContextHandler *)
-{
-}
-
-void OOXMLFactory_ns::charactersAction(OOXMLFastContextHandler *, const OUString &)
-{
-}
-
-void OOXMLFactory_ns::attributeAction(OOXMLFastContextHandler *, Token_t, const OOXMLValue::Pointer_t&)
-{
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLFactory.hxx b/writerfilter/source/ooxml/OOXMLFactory.hxx
deleted file mode 100644
index 146bc5d61631..000000000000
--- a/writerfilter/source/ooxml/OOXMLFactory.hxx
+++ /dev/null
@@ -1,109 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include <dmapper/resourcemodel.hxx>
-
-#include "OOXMLFastContextHandler.hxx"
-#include "OOXMLFastContextHandlerTheme.hxx"
-
-namespace writerfilter::ooxml {
-
-enum class ResourceType {
- NoResource,
- Table,
- Stream,
- List,
- Integer,
- Properties,
- Hex,
- HexColor,
- String,
- Shape,
- Boolean,
- Value,
- XNote,
- TextTableCell,
- TextTableRow,
- TextTable,
- PropertyTable,
- Math,
- Any,
- TwipsMeasure_asSigned,
- TwipsMeasure_asZero,
- HpsMeasure,
- MeasurementOrPercent,
- CommentEx,
- Theme,
-};
-
-struct AttributeInfo
-{
- Token_t m_nToken;
- ResourceType m_nResource;
- Id m_nRef;
-};
-
-class OOXMLFactory_ns : public virtual SvRefBase {
-public:
- typedef tools::SvRef<OOXMLFactory_ns> Pointer_t;
-
- virtual void startAction(OOXMLFastContextHandler * pHandler);
- virtual void charactersAction(OOXMLFastContextHandler * pHandler, const OUString & rString);
- virtual void endAction(OOXMLFastContextHandler * pHandler);
- virtual void attributeAction(OOXMLFastContextHandler * pHandler, Token_t nToken, const OOXMLValue::Pointer_t& pValue);
-
-protected:
- virtual ~OOXMLFactory_ns() override;
-
-public:
- virtual bool getListValue(Id nId, std::string_view aValue, sal_uInt32& rOutValue) = 0;
- virtual Id getResourceId(Id nDefine, sal_Int32 nToken) = 0;
- virtual const AttributeInfo* getAttributeInfoArray(Id nId) = 0;
- virtual bool getElementId(Id nDefine, Id nId, ResourceType& rOutResource, Id& rOutElement) = 0;
-};
-
-class OOXMLFactory
-{
-public:
-
- static css::uno::Reference< css::xml::sax::XFastContextHandler> createFastChildContext(OOXMLFastContextHandler * pHandler, Token_t Element);
-
- static css::uno::Reference< css::xml::sax::XFastContextHandler> createFastChildContextFromStart(OOXMLFastContextHandler * pHandler, Token_t Element);
-
- static void attributes(OOXMLFastContextHandler * pHandler, const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs);
-
- static void characters(OOXMLFastContextHandler * pHandler, const OUString & rString);
-
- static void startAction(OOXMLFastContextHandler * pHandler);
- static void endAction(OOXMLFastContextHandler * pHandler);
-
-private:
- OOXMLFactory() = delete;
- static OOXMLFactory_ns::Pointer_t getFactoryForNamespace(Id id);
-
- static css::uno::Reference< css::xml::sax::XFastContextHandler> createFastChildContextFromFactory(OOXMLFastContextHandler * pHandler,
- const OOXMLFactory_ns::Pointer_t& pFactory, Token_t Element);
-};
-
-}
-
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
deleted file mode 100644
index a0881fb9f362..000000000000
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+++ /dev/null
@@ -1,2384 +0,0 @@
-/* -*- 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/.
- *
- * 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 <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/text/RelOrientation.hpp>
-#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
-#include <com/sun/star/xml/sax/SAXException.hpp>
-#include <ooxml/resourceids.hxx>
-#include <oox/mathml/imexport.hxx>
-#include <oox/token/namespaces.hxx>
-#include <oox/shape/ShapeFilterBase.hxx>
-#include <sal/log.hxx>
-#include <comphelper/embeddedobjectcontainer.hxx>
-#include <comphelper/propertyvalue.hxx>
-#include <cppuhelper/exc_hlp.hxx>
-#include <tools/globname.hxx>
-#include <comphelper/classids.hxx>
-#include <sfx2/sfxbasemodel.hxx>
-#include "OOXMLFastContextHandler.hxx"
-#include "OOXMLFactory.hxx"
-#include "Handler.hxx"
-#include <dmapper/CommentProperties.hxx>
-#include <dmapper/PropertyIds.hxx>
-#include <comphelper/propertysequence.hxx>
-#include <comphelper/sequenceashashmap.hxx>
-#include "OOXMLPropertySet.hxx"
-#include <dmapper/GraphicHelpers.hxx>
-
-const sal_Unicode uCR = 0xd;
-const sal_Unicode uFtnEdnRef = 0x2;
-const sal_Unicode uFtnEdnSep = 0x3;
-const sal_Unicode uFtnSep = 0x5;
-const sal_Unicode uTab = 0x9;
-const sal_Unicode uPgNum = 0x0;
-const sal_Unicode uNoBreakHyphen = 0x2011;
-const sal_Unicode uSoftHyphen = 0xAD;
-
-const sal_uInt8 cFtnEdnCont = 0x4;
-
-namespace writerfilter::ooxml
-{
-using namespace ::com::sun::star;
-using namespace oox;
-using namespace ::com::sun::star::xml::sax;
-
-/*
- class OOXMLFastContextHandler
- */
-
-OOXMLFastContextHandler::OOXMLFastContextHandler
-(uno::Reference< uno::XComponentContext > const & context)
-: mpParent(nullptr),
- mId(0),
- mnDefine(0),
- mnToken(oox::XML_TOKEN_COUNT),
- mnMathJcVal(0),
- mbIsMathPara(false),
- mpStream(nullptr),
- mnTableDepth(0),
- m_inPositionV(false),
- mbAllowInCell(true),
- mbIsVMLfound(false),
- m_xContext(context),
- m_bDiscardChildren(false),
- m_bTookChoice(false)
-{
- if (!mpParserState)
- mpParserState = new OOXMLParserState();
-
- mpParserState->incContextCount();
-}
-
-OOXMLFastContextHandler::OOXMLFastContextHandler(OOXMLFastContextHandler * pContext)
-: mpParent(pContext),
- mId(0),
- mnDefine(0),
- mnToken(oox::XML_TOKEN_COUNT),
- mnMathJcVal(pContext->mnMathJcVal),
- mbIsMathPara(pContext->mbIsMathPara),
- mpStream(pContext->mpStream),
- mpParserState(pContext->mpParserState),
- mnTableDepth(pContext->mnTableDepth),
- m_inPositionV(pContext->m_inPositionV),
- mbAllowInCell(pContext->mbAllowInCell),
- mbIsVMLfound(pContext->mbIsVMLfound),
- m_xContext(pContext->m_xContext),
- m_bDiscardChildren(pContext->m_bDiscardChildren),
- m_bTookChoice(pContext->m_bTookChoice)
-{
- if (!mpParserState)
- mpParserState = new OOXMLParserState();
-
- mpParserState->incContextCount();
-}
-
-OOXMLFastContextHandler::~OOXMLFastContextHandler()
-{
-}
-
-bool OOXMLFastContextHandler::prepareMceContext(Token_t nElement, const uno::Reference<xml::sax::XFastAttributeList>& rAttribs)
-{
- switch (oox::getBaseToken(nElement))
- {
- case XML_AlternateContent:
- {
- SavedAlternateState aState;
- aState.m_bDiscardChildren = m_bDiscardChildren;
- m_bDiscardChildren = false;
- aState.m_bTookChoice = m_bTookChoice;
- m_bTookChoice = false;
- mpParserState->getSavedAlternateStates().push_back(aState);
- }
- break;
- case XML_Choice:
- {
- OUString aRequires = rAttribs->getOptionalValue(XML_Requires);
- static const char* aFeatures[] = {
- "wps",
- "wpg",
- "w14",
- "wpc",
- };
- for (const char *p : aFeatures)
- {
- if (aRequires.equalsAscii(p))
- {
- m_bTookChoice = true;
- return false;
- }
- }
- return true;
- }
- break;
- case XML_Fallback:
- // If Choice is already taken, then let's ignore the Fallback.
- return m_bTookChoice;
- default:
- SAL_WARN("writerfilter", "OOXMLFastContextHandler::prepareMceContext: unhandled element:" << oox::getBaseToken(nElement));
- break;
- }
- return false;
-}
-
-// xml::sax::XFastContextHandler:
-void SAL_CALL OOXMLFastContextHandler::startFastElement
-(sal_Int32 Element,
- const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
-{
- // Set xml:space value early, to allow child contexts use it when dealing with strings.
- if (Attribs && Attribs->hasAttribute(oox::NMSP_xml | oox::XML_space))
- {
- mbPreserveSpace = Attribs->getValue(oox::NMSP_xml | oox::XML_space) == "preserve";
- mbPreserveSpaceSet = true;
- }
- if (Element == W_TOKEN(footnote) || Element == W_TOKEN(endnote))
- {
- // send uFtnSep to sign new footnote content, but skip footnote separators
- if (!Attribs->hasAttribute(W_TOKEN(type)) ||
- ( Attribs->getValue(W_TOKEN(type)) != "separator" &&
- Attribs->getValue(W_TOKEN(type)) != "continuationSeparator" &&
- Attribs->getValue(W_TOKEN(type)) != "continuationNotice" ))
- {
- mpParserState->setStartFootnote(true);
- }
- }
- else if (Element == (NMSP_officeMath | XML_oMathPara))
- {
- mnMathJcVal = eMathParaJc::CENTER;
- mbIsMathPara = true;
- }
- else if (Element == (NMSP_officeMath | XML_jc) && mpParent && mpParent->mpParent )
- {
- mbIsMathPara = true;
- auto aAttrLst = Attribs->getFastAttributes();
- if (aAttrLst[0].Value == "center") mpParent->mpParent->mnMathJcVal = eMathParaJc::CENTER;
- if (aAttrLst[0].Value == "left") mpParent->mpParent->mnMathJcVal = eMathParaJc::LEFT;
- if (aAttrLst[0].Value == "right") mpParent->mpParent->mnMathJcVal = eMathParaJc::RIGHT;
- }
-
- if (oox::getNamespace(Element) == NMSP_mce)
- m_bDiscardChildren = prepareMceContext(Element, Attribs);
-
- else if (!m_bDiscardChildren)
- {
- attributes(Attribs);
- lcl_startFastElement(Element, Attribs);
- }
-}
-
-void SAL_CALL OOXMLFastContextHandler::startUnknownElement
-(const OUString & /*Namespace*/, const OUString & /*Name*/,
- const uno::Reference< xml::sax::XFastAttributeList > & /*Attribs*/)
-{
-}
-
-void SAL_CALL OOXMLFastContextHandler::endFastElement(sal_Int32 Element)
-{
- if (Element == (NMSP_mce | XML_Choice) || Element == (NMSP_mce | XML_Fallback))
- m_bDiscardChildren = false;
- else if (Element == (NMSP_mce | XML_AlternateContent))
- {
- SavedAlternateState aState(mpParserState->getSavedAlternateStates().back());
- mpParserState->getSavedAlternateStates().pop_back();
- m_bDiscardChildren = aState.m_bDiscardChildren;
- m_bTookChoice = aState.m_bTookChoice;
- }
- else if (!m_bDiscardChildren)
- lcl_endFastElement(Element);
-}
-
-void OOXMLFastContextHandler::lcl_startFastElement
-(Token_t Element,
- const uno::Reference< xml::sax::XFastAttributeList > & /*Attribs*/)
-{
- OOXMLFactory::startAction(this);
- if( Element == (NMSP_dmlWordDr|XML_positionV) )
- m_inPositionV = true;
- else if( Element == (NMSP_dmlWordDr|XML_positionH) )
- m_inPositionV = false;
-}
-
-void OOXMLFastContextHandler::lcl_endFastElement
-(Token_t /*Element*/)
-{
- OOXMLFactory::endAction(this);
-}
-
-void SAL_CALL OOXMLFastContextHandler::endUnknownElement
-(const OUString & , const OUString & )
-{
-}
-
-uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
- OOXMLFastContextHandler::createFastChildContext
-(sal_Int32 Element,
- const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
-{
- uno::Reference< xml::sax::XFastContextHandler > xResult;
- if (oox::getNamespace(Element) != NMSP_mce && !m_bDiscardChildren)
- xResult.set(lcl_createFastChildContext(Element, Attribs));
- else if (oox::getNamespace(Element) == NMSP_mce)
- xResult = this;
-
- return xResult;
-}
-
-uno::Reference< xml::sax::XFastContextHandler >
- OOXMLFastContextHandler::lcl_createFastChildContext
-(Token_t Element,
- const uno::Reference< xml::sax::XFastAttributeList > & /*Attribs*/)
-{
- return OOXMLFactory::createFastChildContext(this, Element);
-}
-
-uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
-OOXMLFastContextHandler::createUnknownChildContext
-(const OUString &,
- const OUString &,
- const uno::Reference< xml::sax::XFastAttributeList > & /*Attribs*/)
-{
- return uno::Reference< xml::sax::XFastContextHandler >
- (new OOXMLFastContextHandler(*const_cast<const OOXMLFastContextHandler *>(this)));
-}
-
-void SAL_CALL OOXMLFastContextHandler::characters
-(const OUString & aChars)
-{
- lcl_characters(aChars);
-}
-
-void OOXMLFastContextHandler::lcl_characters
-(const OUString & rString)
-{
- if (!m_bDiscardChildren)
- OOXMLFactory::characters(this, rString);
-}
-
-void OOXMLFastContextHandler::setStream(Stream * pStream)
-{
- mpStream = pStream;
-}
-
-OOXMLValue::Pointer_t OOXMLFastContextHandler::getValue() const
-{
- return OOXMLValue::Pointer_t();
-}
-
-void OOXMLFastContextHandler::attributes
-(const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
-{
- OOXMLFactory::attributes(this, Attribs);
-}
-
-void OOXMLFastContextHandler::startAction()
-{
- OOXMLFactory::startAction(this);
-}
-
-void OOXMLFastContextHandler::endAction()
-{
- OOXMLFactory::endAction(this);
-}
-
-void OOXMLFastContextHandler::setId(Id rId)
-{
- mId = rId;
-}
-
-Id OOXMLFastContextHandler::getId() const
-{
- return mId;
-}
-
-void OOXMLFastContextHandler::setDefine(Id nDefine)
-{
- mnDefine = nDefine;
-}
-
-
-void OOXMLFastContextHandler::setToken(Token_t nToken)
-{
- mnToken = nToken;
-}
-
-Token_t OOXMLFastContextHandler::getToken() const
-{
- return mnToken;
-}
-
-void OOXMLFastContextHandler::sendTableDepth() const
-{
- if (mnTableDepth <= 0)
- return;
-
- OOXMLPropertySet::Pointer_t pProps(new OOXMLPropertySet);
- {
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(mnTableDepth);
- pProps->add(NS_ooxml::LN_tblDepth, pVal, OOXMLProperty::SPRM);
- }
- {
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(1);
- pProps->add(NS_ooxml::LN_inTbl, pVal, OOXMLProperty::SPRM);
- }
-
- mpStream->props(pProps.get());
-}
-
-void OOXMLFastContextHandler::setHandle()
-{
- mpParserState->setHandle();
- mpStream->info(mpParserState->getHandle());
-}
-
-void OOXMLFastContextHandler::startCharacterGroup()
-{
- if (!isForwardEvents())
- return;
-
- if (mpParserState->isInCharacterGroup())
- endCharacterGroup();
-
- if (! mpParserState->isInParagraphGroup())
- startParagraphGroup();
-
- if (! mpParserState->isInCharacterGroup())
- {
- mpStream->startCharacterGroup();
- mpParserState->setInCharacterGroup(true);
- mpParserState->resolveCharacterProperties(*mpStream);
- if (mpParserState->isStartFootnote())
- {
- mpStream->utext(&uFtnSep, 1);
- mpParserState->setStartFootnote(false);
- }
- }
-
- // tdf#108714 : if we have a postponed break information,
- // then apply it now, before any other paragraph content.
- mpParserState->resolvePostponedBreak(*mpStream);
-}
-
-void OOXMLFastContextHandler::endCharacterGroup()
-{
- if (isForwardEvents() && mpParserState->isInCharacterGroup())
- {
- mpStream->endCharacterGroup();
- mpParserState->setInCharacterGroup(false);
- }
-}
-
-void OOXMLFastContextHandler::pushBiDiEmbedLevel() {}
-
-void OOXMLFastContextHandler::popBiDiEmbedLevel() {}
-
-void OOXMLFastContextHandler::startParagraphGroup()
-{
- if (!isForwardEvents())
- return;
-
- if (mpParserState->GetFloatingTableEnded())
- {
- mpParserState->SetFloatingTableEnded(false);
- }
-
- if (mpParserState->isInParagraphGroup())
- endParagraphGroup();
-
- if (! mpParserState->isInSectionGroup())
- startSectionGroup();
-
- if ( mpParserState->isInParagraphGroup())
- return;
-
- mpStream->startParagraphGroup();
- mpParserState->setInParagraphGroup(true);
-
- if (const auto& pPropSet = getPropertySet())
- {
- OOXMLPropertySetEntryToString aHandler(NS_ooxml::LN_AG_Parids_paraId);
- pPropSet->resolve(aHandler);
- if (const OUString& sText = aHandler.getString(); !sText.isEmpty())
- {
- OOXMLStringValue::Pointer_t pVal = new OOXMLStringValue(sText);
- OOXMLPropertySet::Pointer_t pPropertySet(new OOXMLPropertySet);
- pPropertySet->add(NS_ooxml::LN_AG_Parids_paraId, pVal, OOXMLProperty::ATTRIBUTE);
- mpStream->props(pPropertySet.get());
- }
- }
-}
-
-void OOXMLFastContextHandler::endParagraphGroup()
-{
- if (isForwardEvents())
- {
- if (mpParserState->isInCharacterGroup())
- endCharacterGroup();
-
- if (mpParserState->isInParagraphGroup())
- {
- mpStream->endParagraphGroup();
- mpParserState->setInParagraphGroup(false);
- }
- }
-}
-
-void OOXMLFastContextHandler::startSdt()
-{
- OOXMLPropertySet::Pointer_t pProps(new OOXMLPropertySet);
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(1);
- pProps->add(NS_ooxml::LN_CT_SdtBlock_sdtContent, pVal, OOXMLProperty::ATTRIBUTE);
- mpStream->props(pProps.get());
-}
-
-void OOXMLFastContextHandler::endSdt()
-{
- OOXMLPropertySet::Pointer_t pProps(new OOXMLPropertySet);
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(1);
- pProps->add(NS_ooxml::LN_CT_SdtBlock_sdtEndContent, pVal, OOXMLProperty::ATTRIBUTE);
- mpStream->props(pProps.get());
-}
-
-void OOXMLFastContextHandler::startSdtRun()
-{
- OOXMLPropertySet::Pointer_t pProps(new OOXMLPropertySet);
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(1);
- pProps->add(NS_ooxml::LN_CT_SdtRun_sdtContent, pVal, OOXMLProperty::ATTRIBUTE);
- mpStream->props(pProps.get());
-}
-
-void OOXMLFastContextHandler::endSdtRun()
-{
- OOXMLPropertySet::Pointer_t pProps(new OOXMLPropertySet);
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(1);
- pProps->add(NS_ooxml::LN_CT_SdtRun_sdtEndContent, pVal, OOXMLProperty::ATTRIBUTE);
- mpStream->props(pProps.get());
-}
-
-void OOXMLFastContextHandler::startSectionGroup()
-{
- if (isForwardEvents())
- {
- if (mpParserState->isInSectionGroup())
- endSectionGroup();
-
- if (! mpParserState->isInSectionGroup())
- {
- mpStream->info(mpParserState->getHandle());
- mpStream->startSectionGroup();
- mpParserState->setInSectionGroup(true);
- }
- }
-}
-
-void OOXMLFastContextHandler::endSectionGroup()
-{
- if (isForwardEvents())
- {
- if (mpParserState->isInParagraphGroup())
- endParagraphGroup();
-
- if (mpParserState->isInSectionGroup())
- {
- mpStream->endSectionGroup();
- mpParserState->setInSectionGroup(false);
- }
- }
-}
-
-void OOXMLFastContextHandler::setLastParagraphInSection()
-{
- mpParserState->setLastParagraphInSection(true);
- mpStream->markLastParagraphInSection( );
-}
-
-void OOXMLFastContextHandler::setLastSectionGroup()
-{
- mpStream->markLastSectionGroup( );
-}
-
-void OOXMLFastContextHandler::newProperty
-(Id /*nId*/, const OOXMLValue::Pointer_t& /*pVal*/)
-{
-}
-
-void OOXMLFastContextHandler::setPropertySet
-(const OOXMLPropertySet::Pointer_t& /* pPropertySet */)
-{
-}
-
-OOXMLPropertySet::Pointer_t OOXMLFastContextHandler::getPropertySet() const
-{
- return OOXMLPropertySet::Pointer_t();
-}
-
-void OOXMLFastContextHandler::startField()
-{
- startCharacterGroup();
- if (isForwardEvents())
- mpStream->text(&cFieldStart, 1);
- endCharacterGroup();
-}
-
-void OOXMLFastContextHandler::fieldSeparator()
-{
- startCharacterGroup();
- if (isForwardEvents())
- mpStream->text(&cFieldSep, 1);
- endCharacterGroup();
-}
-
-void OOXMLFastContextHandler::endField()
-{
- startCharacterGroup();
- if (isForwardEvents())
- mpStream->text(&cFieldEnd, 1);
- endCharacterGroup();
-}
-
-void OOXMLFastContextHandler::lockField()
-{
- startCharacterGroup();
- if (isForwardEvents())
- mpStream->text(&cFieldLock, 1);
- endCharacterGroup();
-}
-
-void OOXMLFastContextHandler::ftnednref()
-{
- if (isForwardEvents())
- mpStream->utext(&uFtnEdnRef, 1);
-}
-
-void OOXMLFastContextHandler::ftnednsep()
-{
- if (isForwardEvents())
- mpStream->utext(&uFtnEdnSep, 1);
-}
-
-void OOXMLFastContextHandler::ftnedncont()
-{
- if (isForwardEvents())
- mpStream->text(&cFtnEdnCont, 1);
-}
-
-void OOXMLFastContextHandler::pgNum()
-{
- if (isForwardEvents())
- mpStream->utext(&uPgNum, 1);
-}
-
-void OOXMLFastContextHandler::tab()
-{
- if (isForwardEvents())
- mpStream->utext(&uTab, 1);
-}
-
-void OOXMLFastContextHandler::symbol()
-{
- if (isForwardEvents())
- sendPropertiesWithId(NS_ooxml::LN_EG_RunInnerContent_sym);
-}
-
-void OOXMLFastContextHandler::cr()
-{
- if (isForwardEvents())
- mpStream->utext(&uCR, 1);
-}
-
-void OOXMLFastContextHandler::noBreakHyphen()
-{
- if (isForwardEvents())
- mpStream->utext(&uNoBreakHyphen, 1);
-}
-
-void OOXMLFastContextHandler::softHyphen()
-{
- if (isForwardEvents())
- mpStream->utext(&uSoftHyphen, 1);
-}
-
-void OOXMLFastContextHandler::handleLastParagraphInSection()
-{
- if (mpParserState->isLastParagraphInSection())
- {
- mpParserState->setLastParagraphInSection(false);
- startSectionGroup();
- }
-}
-
-void OOXMLFastContextHandler::endOfParagraph()
-{
- if (! mpParserState->isInCharacterGroup())
- startCharacterGroup();
- if (isForwardEvents())
- mpStream->utext(&uCR, 1);
-
- mpParserState->getDocument()->incrementProgress();
-}
-
-void OOXMLFastContextHandler::startTxbxContent()
-{
-/*
- This usually means there are recursive <w:p> elements, and the ones
- inside and outside of w:txbxContent should not interfere (e.g.
- the lastParagraphInSection setting). So save the whole state
- and possibly start new groups for the nested content (not section
- group though, as that'd cause the txbxContent to be moved onto
- another page, I'm not sure how that should work exactly).
-*/
- mpParserState->startTxbxContent();
- startParagraphGroup();
-}
-
-void OOXMLFastContextHandler::endTxbxContent()
-{
- endParagraphGroup();
- mpParserState->endTxbxContent();
-}
-
-namespace {
-// XML schema defines white space as one of four characters:
-// #x9 (tab), #xA (line feed), #xD (carriage return), and #x20 (space)
-bool IsXMLWhitespace(sal_Unicode cChar)
-{
- return cChar == 0x9 || cChar == 0xA || cChar == 0xD || cChar == 0x20;
-}
-
-OUString TrimXMLWhitespace(const OUString & sText)
-{
- sal_Int32 nTrimmedStart = 0;
- const sal_Int32 nLen = sText.getLength();
- sal_Int32 nTrimmedEnd = nLen - 1;
- while (nTrimmedStart < nLen && IsXMLWhitespace(sText[nTrimmedStart]))
- ++nTrimmedStart;
- while (nTrimmedStart <= nTrimmedEnd && IsXMLWhitespace(sText[nTrimmedEnd]))
- --nTrimmedEnd;
- if ((nTrimmedStart == 0) && (nTrimmedEnd == nLen - 1))
- return sText;
- else if (nTrimmedStart > nTrimmedEnd)
- return OUString();
- else
- return sText.copy(nTrimmedStart, nTrimmedEnd-nTrimmedStart+1);
-}
-}
-
-void OOXMLFastContextHandler::text(const OUString & sText)
-{
- if (!isForwardEvents())
- return;
-
- // tdf#108806: CRLFs in XML were converted to \n before this point.
- // These must be converted to spaces before further processing.
- OUString sNormalizedText = sText.replaceAll("\n", " ");
- // tdf#108995: by default, leading and trailing white space is ignored;
- // tabs are converted to spaces
- if (!IsPreserveSpace())
- {
- sNormalizedText = TrimXMLWhitespace(sNormalizedText).replaceAll("\t", " ");
- }
- mpStream->utext(sNormalizedText.getStr(), sNormalizedText.getLength());
-}
-
-void OOXMLFastContextHandler::positionOffset(const OUString& rText)
-{
- if (isForwardEvents())
- mpStream->positionOffset(rText, m_inPositionV);
-}
-
-void OOXMLFastContextHandler::ignore()
-{
-}
-
-void OOXMLFastContextHandler::alignH(const OUString& rText)
-{
- if (isForwardEvents())
- mpStream->align(rText, /*bVertical=*/false);
-}
-
-void OOXMLFastContextHandler::alignV(const OUString& rText)
-{
- if (isForwardEvents())
- mpStream->align(rText, /*bVertical=*/true);
-}
-
-void OOXMLFastContextHandler::positivePercentage(const OUString& rText)
-{
- if (isForwardEvents())
- mpStream->positivePercentage(rText);
-}
-
-void OOXMLFastContextHandler::startGlossaryEntry()
-{
- if (isForwardEvents())
- mpStream->startGlossaryEntry();
-}
-
-void OOXMLFastContextHandler::endGlossaryEntry()
-{
- if (isForwardEvents())
- mpStream->endGlossaryEntry();
-}
-
-void OOXMLFastContextHandler::propagateCharacterProperties()
-{
- mpParserState->setCharacterProperties(getPropertySet());
-}
-
-void OOXMLFastContextHandler::propagateCellProperties()
-{
- mpParserState->setCellProperties(getPropertySet());
-}
-
-void OOXMLFastContextHandler::propagateRowProperties()
-{
- mpParserState->setRowProperties(getPropertySet());
-}
-
-void OOXMLFastContextHandler::propagateTableProperties()
-{
- OOXMLPropertySet::Pointer_t pProps = getPropertySet();
-
- mpParserState->setTableProperties(pProps);
-}
-
-void OOXMLFastContextHandler::sendCellProperties()
-{
- mpParserState->resolveCellProperties(*mpStream);
-}
-
-void OOXMLFastContextHandler::sendRowProperties()
-{
- mpParserState->resolveRowProperties(*mpStream);
-}
-
-void OOXMLFastContextHandler::sendTableProperties()
-{
- mpParserState->resolveTableProperties(*mpStream);
-}
-
-void OOXMLFastContextHandler::clearTableProps()
-{
- mpParserState->setTableProperties(new OOXMLPropertySet());
-}
-
-void OOXMLFastContextHandler::sendPropertiesWithId(Id nId)
-{
- OOXMLValue::Pointer_t pValue(new OOXMLPropertySetValue(getPropertySet()));
- OOXMLPropertySet::Pointer_t pPropertySet(new OOXMLPropertySet);
-
- pPropertySet->add(nId, pValue, OOXMLProperty::SPRM);
- mpStream->props(pPropertySet.get());
-}
-
-void OOXMLFastContextHandler::clearProps()
-{
- setPropertySet(new OOXMLPropertySet());
-}
-
-void OOXMLFastContextHandler::setDefaultBooleanValue()
-{
-}
-
-void OOXMLFastContextHandler::setDefaultIntegerValue()
-{
-}
-
-void OOXMLFastContextHandler::setDefaultHexValue()
-{
-}
-
-void OOXMLFastContextHandler::setDefaultStringValue()
-{
-}
-
-void OOXMLFastContextHandler::setDocument(OOXMLDocumentImpl* pDocument)
-{
- mpParserState->setDocument(pDocument);
-}
-
-OOXMLDocumentImpl* OOXMLFastContextHandler::getDocument()
-{
- return mpParserState->getDocument();
-}
-
-void OOXMLFastContextHandler::setForwardEvents(bool bForwardEvents)
-{
- mpParserState->setForwardEvents(bForwardEvents);
-}
-
-bool OOXMLFastContextHandler::isForwardEvents() const
-{
- return mpParserState->isForwardEvents();
-}
-
-void OOXMLFastContextHandler::setXNoteId(const sal_Int32 nId)
-{
- mpParserState->setXNoteId(nId);
-}
-
-void OOXMLFastContextHandler::setXNoteId(const OOXMLValue::Pointer_t& pValue)
-{
- mpParserState->setXNoteId(sal_Int32(pValue->getInt()));
-}
-
-sal_Int32 OOXMLFastContextHandler::getXNoteId() const
-{
- return mpParserState->getXNoteId();
-}
-
-void OOXMLFastContextHandler::resolveFootnote
-(const sal_Int32 nId)
-{
- mpParserState->getDocument()->resolveFootnote
- (*mpStream, 0, nId);
-}
-
-void OOXMLFastContextHandler::resolveEndnote(const sal_Int32 nId)
-{
- mpParserState->getDocument()->resolveEndnote
- (*mpStream, 0, nId);
-}
-
-void OOXMLFastContextHandler::resolveComment(const sal_Int32 nId)
-{
- mpParserState->getDocument()->resolveComment(*mpStream, nId);
-}
-
-void OOXMLFastContextHandler::resolvePicture(const OUString & rId)
-{
- mpParserState->getDocument()->resolvePicture(*mpStream, rId);
-}
-
-void OOXMLFastContextHandler::resolveHeader
-(const sal_Int32 type, const OUString & rId)
-{
- mpParserState->getDocument()->resolveHeader(*mpStream, type, rId);
-}
-
-void OOXMLFastContextHandler::resolveFooter
-(const sal_Int32 type, const OUString & rId)
-{
- mpParserState->getDocument()->resolveFooter(*mpStream, type, rId);
-}
-
-// Add the data pointed to by the reference as another property.
-void OOXMLFastContextHandler::resolveData(const OUString & rId)
-{
- OOXMLDocument * objDocument = getDocument();
- SAL_WARN_IF(!objDocument, "writerfilter", "no document to resolveData");
- if (!objDocument)
- return;
-
- uno::Reference<io::XInputStream> xInputStream
- (objDocument->getInputStreamForId(rId));
-
- OOXMLValue::Pointer_t aValue(new OOXMLInputStreamValue(xInputStream));
-
- newProperty(NS_ooxml::LN_inputstream, aValue);
-}
-
-OUString OOXMLFastContextHandler::getTargetForId
-(const OUString & rId)
-{
- return mpParserState->getDocument()->getTargetForId(rId);
-}
-
-void OOXMLFastContextHandler::sendPropertyToParent()
-{
- if (mpParent != nullptr)
- {
- OOXMLPropertySet::Pointer_t pProps(mpParent->getPropertySet());
-
- if (pProps)
- {
- pProps->add(mId, getValue(), OOXMLProperty::SPRM);
- }
- }
-}
-
-void OOXMLFastContextHandler::sendPropertiesToParent()
-{
- if (mpParent == nullptr)
- return;
-
- OOXMLPropertySet::Pointer_t pParentProps(mpParent->getPropertySet());
-
- if (!pParentProps)
- return;
-
- OOXMLPropertySet::Pointer_t pProps(getPropertySet());
-
- if (pProps)
- {
- OOXMLValue::Pointer_t pValue
- (new OOXMLPropertySetValue(getPropertySet()));
-
- pParentProps->add(getId(), pValue, OOXMLProperty::SPRM);
-
- }
-}
-
-bool OOXMLFastContextHandler::IsPreserveSpace() const
-{
- // xml:space attribute applies to all elements within the content of the element where it is specified,
- // unless overridden with another instance of the xml:space attribute
- if (mbPreserveSpaceSet)
- return mbPreserveSpace;
- if (mpParent)
- return mpParent->IsPreserveSpace();
- return false; // default value
-}
-
-/*
- class OOXMLFastContextHandlerStream
- */
-
-OOXMLFastContextHandlerStream::OOXMLFastContextHandlerStream
-(OOXMLFastContextHandler * pContext)
-: OOXMLFastContextHandler(pContext),
- mpPropertySetAttrs(new OOXMLPropertySet)
-{
-}
-
-OOXMLFastContextHandlerStream::~OOXMLFastContextHandlerStream()
-{
-}
-
-void OOXMLFastContextHandlerStream::newProperty(Id nId,
- const OOXMLValue::Pointer_t& pVal)
-{
- if (nId != 0x0)
- {
- mpPropertySetAttrs->add(nId, pVal, OOXMLProperty::ATTRIBUTE);
- }
-}
-
-void OOXMLFastContextHandlerStream::sendProperty(Id nId)
-{
- OOXMLPropertySetEntryToString aHandler(nId);
- getPropertySetAttrs()->resolve(aHandler);
- const OUString & sText = aHandler.getString();
- mpStream->utext(sText.getStr(), sText.getLength());
-}
-
-
-OOXMLPropertySet::Pointer_t OOXMLFastContextHandlerStream::getPropertySet()
- const
-{
- return getPropertySetAttrs();
-}
-
-void OOXMLFastContextHandlerStream::handleHyperlink()
-{
- OOXMLHyperlinkHandler aHyperlinkHandler(this);
- getPropertySetAttrs()->resolve(aHyperlinkHandler);
- aHyperlinkHandler.writetext();
-}
-
-/*
- class OOXMLFastContextHandlerProperties
- */
-OOXMLFastContextHandlerProperties::OOXMLFastContextHandlerProperties
-(OOXMLFastContextHandler * pContext)
-: OOXMLFastContextHandler(pContext), mpPropertySet(new OOXMLPropertySet),
- mbResolve(false)
-{
- if (pContext->getResource() == STREAM)
- mbResolve = true;
-}
-
-OOXMLFastContextHandlerProperties::~OOXMLFastContextHandlerProperties()
-{
-}
-
-void OOXMLFastContextHandlerProperties::lcl_endFastElement
-(Token_t /*Element*/)
-{
- try
- {
- endAction();
-
- if (mbResolve)
- {
- if (isForwardEvents())
- {
- mpStream->props(mpPropertySet.get());
- }
- }
- else
- {
- sendPropertiesToParent();
- }
- }
- catch (const uno::RuntimeException&)
- {
- throw;
- }
- catch (const xml::sax::SAXException&)
- {
- throw;
- }
- catch (const uno::Exception& e)
- {
- auto a = cppu::getCaughtException();
- throw lang::WrappedTargetRuntimeException(e.Message, e.Context, a);
- }
-}
-
-OOXMLValue::Pointer_t OOXMLFastContextHandlerProperties::getValue() const
-{
- return OOXMLValue::Pointer_t(new OOXMLPropertySetValue(mpPropertySet));
-}
-
-void OOXMLFastContextHandlerProperties::newProperty
-(Id nId, const OOXMLValue::Pointer_t& pVal)
-{
- if (nId != 0x0)
- {
- mpPropertySet->add(nId, pVal, OOXMLProperty::ATTRIBUTE);
- }
-}
-
-void OOXMLFastContextHandlerProperties::handleXNotes()
-{
- switch (mnToken)
- {
- case W_TOKEN(footnoteReference):
- {
- OOXMLFootnoteHandler aFootnoteHandler(this);
- mpPropertySet->resolve(aFootnoteHandler);
- }
- break;
- case W_TOKEN(endnoteReference):
- {
- OOXMLEndnoteHandler aEndnoteHandler(this);
- mpPropertySet->resolve(aEndnoteHandler);
- }
- break;
- default:
- break;
- }
-}
-
-void OOXMLFastContextHandlerProperties::handleHdrFtr()
-{
- switch (mnToken)
- {
- case W_TOKEN(footerReference):
- {
- OOXMLFooterHandler aFooterHandler(this);
- mpPropertySet->resolve(aFooterHandler);
- aFooterHandler.finalize();
- }
- break;
- case W_TOKEN(headerReference):
- {
- OOXMLHeaderHandler aHeaderHandler(this);
- mpPropertySet->resolve(aHeaderHandler);
- aHeaderHandler.finalize();
- }
- break;
- default:
- break;
- }
-}
-
-void OOXMLFastContextHandlerProperties::handleComment()
-{
- OOXMLCommentHandler aCommentHandler(this);
- getPropertySet()->resolve(aCommentHandler);
-}
-
-void OOXMLFastContextHandlerProperties::handlePicture()
-{
- OOXMLPictureHandler aPictureHandler(this);
- getPropertySet()->resolve(aPictureHandler);
-}
-
-void OOXMLFastContextHandlerProperties::handleBreak()
-{
- if(isForwardEvents())
- {
- OOXMLBreakHandler aBreakHandler(this, *mpStream);
- getPropertySet()->resolve(aBreakHandler);
- }
-}
-
-// tdf#108714 : allow <w:br> at block level (despite this is illegal according to ECMA-376-1:2016)
-void OOXMLFastContextHandlerProperties::handleOutOfOrderBreak()
-{
- if(isForwardEvents())
- {
- mpParserState->setPostponedBreak(getPropertySet());
- }
-}
-
-void OOXMLFastContextHandlerProperties::handleOLE()
-{
- OOXMLOLEHandler aOLEHandler(this);
- getPropertySet()->resolve(aOLEHandler);
-}
-
-void OOXMLFastContextHandlerProperties::handleFontRel()
-{
- OOXMLEmbeddedFontHandler handler(this);
- getPropertySet()->resolve(handler);
-}
-
-void OOXMLFastContextHandlerProperties::handleHyperlinkURL() {
- OOXMLHyperlinkURLHandler aHyperlinkURLHandler(this);
- getPropertySet()->resolve(aHyperlinkURLHandler);
-}
-
-void OOXMLFastContextHandlerProperties::handleAltChunk()
-{
- OOXMLAltChunkHandler aHandler(this);
- getPropertySet()->resolve(aHandler);
-}
-
-void OOXMLFastContextHandlerProperties::setPropertySet
-(const OOXMLPropertySet::Pointer_t& pPropertySet)
-{
- if (pPropertySet)
- mpPropertySet = pPropertySet;
-}
-
-OOXMLPropertySet::Pointer_t
-OOXMLFastContextHandlerProperties::getPropertySet() const
-{
- return mpPropertySet;
-}
-
-/*
- * class OOXMLFasContextHandlerPropertyTable
- */
-
-OOXMLFastContextHandlerPropertyTable::OOXMLFastContextHandlerPropertyTable
-(OOXMLFastContextHandler * pContext)
-: OOXMLFastContextHandlerProperties(pContext)
-{
-}
-
-OOXMLFastContextHandlerPropertyTable::~OOXMLFastContextHandlerPropertyTable()
-{
-}
-
-void OOXMLFastContextHandlerPropertyTable::lcl_endFastElement
-(Token_t /*Element*/)
-{
- OOXMLTable::ValuePointer_t pTmpVal
- (new OOXMLPropertySetValue(mpPropertySet->clone()));
-
- mTable.add(pTmpVal);
-
- writerfilter::Reference<Table>::Pointer_t pTable(mTable.clone());
-
- mpStream->table(mId, pTable);
-
- endAction();
-}
-
-/*
- class OOXMLFastContextHandlerValue
-*/
-
-OOXMLFastContextHandlerValue::OOXMLFastContextHandlerValue
-(OOXMLFastContextHandler * pContext)
-: OOXMLFastContextHandler(pContext)
-{
-}
-
-OOXMLFastContextHandlerValue::~OOXMLFastContextHandlerValue()
-{
-}
-
-void OOXMLFastContextHandlerValue::setValue(const OOXMLValue::Pointer_t& pValue)
-{
- mpValue = pValue;
-}
-
-OOXMLValue::Pointer_t OOXMLFastContextHandlerValue::getValue() const
-{
- return mpValue;
-}
-
-void OOXMLFastContextHandlerValue::lcl_endFastElement
-(Token_t /*Element*/)
-{
- sendPropertyToParent();
-
- endAction();
-}
-
-void OOXMLFastContextHandlerValue::setDefaultBooleanValue()
-{
- if (!mpValue)
- {
- OOXMLValue::Pointer_t pValue = OOXMLBooleanValue::Create(true);
- setValue(pValue);
- }
-}
-
-void OOXMLFastContextHandlerValue::setDefaultIntegerValue()
-{
- if (!mpValue)
- {
- OOXMLValue::Pointer_t pValue = OOXMLIntegerValue::Create(0);
- setValue(pValue);
- }
-}
-
-void OOXMLFastContextHandlerValue::setDefaultHexValue()
-{
- if (!mpValue)
- {
- OOXMLValue::Pointer_t pValue(new OOXMLHexValue(sal_uInt32(0)));
- setValue(pValue);
- }
-}
-
-void OOXMLFastContextHandlerValue::setDefaultStringValue()
-{
- if (!mpValue)
- {
- OOXMLValue::Pointer_t pValue(new OOXMLStringValue(OUString()));
- setValue(pValue);
- }
-}
-
-// ECMA-376-1:2016 17.3.2.8; https://www.unicode.org/reports/tr9/#Explicit_Directional_Embeddings
-void OOXMLFastContextHandlerValue::pushBiDiEmbedLevel()
-{
- const bool bRtl
- = mpValue && mpValue->getInt() == NS_ooxml::LN_Value_ST_Direction_rtl;
- OOXMLFactory::characters(this, bRtl ? u"\u202B"_ustr : u"\u202A"_ustr); // RLE / LRE
-}
-
-void OOXMLFastContextHandlerValue::popBiDiEmbedLevel()
-{
- OOXMLFactory::characters(this, u"\u202C"_ustr); // PDF (POP DIRECTIONAL FORMATTING)
-}
-
-void OOXMLFastContextHandlerValue::handleGridAfter()
-{
- if (!getValue())
- return;
-
- if (OOXMLFastContextHandler* pTableRowProperties = getParent())
- {
- if (OOXMLFastContextHandler* pTableRow = pTableRowProperties->getParent())
- // Save the value into the table row context, so it can be handled
- // right before the end of the row.
- pTableRow->setGridAfter(getValue());
- }
-}
-
-/*
- class OOXMLFastContextHandlerTable
-*/
-
-OOXMLFastContextHandlerTable::OOXMLFastContextHandlerTable
-(OOXMLFastContextHandler * pContext)
-: OOXMLFastContextHandler(pContext)
-{
-}
-
-OOXMLFastContextHandlerTable::~OOXMLFastContextHandlerTable()
-{
-}
-
-uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
-OOXMLFastContextHandlerTable::createFastChildContext
-(sal_Int32 Element,
- const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
-{
- addCurrentChild();
-
- mCurrentChild.set(OOXMLFastContextHandler::createFastChildContext(Element, Attribs));
-
- return mCurrentChild;
-}
-
-void OOXMLFastContextHandlerTable::lcl_endFastElement
-(Token_t /*Element*/)
-{
- addCurrentChild();
-
- writerfilter::Reference<Table>::Pointer_t pTable(mTable.clone());
- if (isForwardEvents() && mId != 0x0)
- {
- mpStream->table(mId, pTable);
- }
-}
-
-void OOXMLFastContextHandlerTable::addCurrentChild()
-{
- OOXMLFastContextHandler * pHandler = dynamic_cast<OOXMLFastContextHandler*>(mCurrentChild.get());
- if (pHandler != nullptr)
- {
- OOXMLValue::Pointer_t pValue(pHandler->getValue());
-
- if (pValue)
- {
- OOXMLTable::ValuePointer_t pTmpVal(pValue->clone());
- mTable.add(pTmpVal);
- }
- }
-}
-
-/*
- class OOXMLFastContextHandlerXNote
- */
-
-OOXMLFastContextHandlerXNote::OOXMLFastContextHandlerXNote
- (OOXMLFastContextHandler * pContext)
- : OOXMLFastContextHandlerProperties(pContext)
- , mbForwardEventsSaved(false)
- , mnMyXNoteId(0)
- , mnMyXNoteType(0)
-{
-}
-
-OOXMLFastContextHandlerXNote::~OOXMLFastContextHandlerXNote()
-{
-}
-
-void OOXMLFastContextHandlerXNote::lcl_startFastElement
-(Token_t /*Element*/,
- const uno::Reference< xml::sax::XFastAttributeList > & /*Attribs*/)
-{
- mbForwardEventsSaved = isForwardEvents();
-
- // If this is the note we're looking for or this is the footnote separator one.
- if (mnMyXNoteId == getXNoteId() ||
- static_cast<sal_uInt32>(mnMyXNoteType) == NS_ooxml::LN_Value_doc_ST_FtnEdn_separator ||
- mpParserState->isStartFootnote())
- setForwardEvents(true);
- else
- setForwardEvents(false);
-
- startAction();
-}
-
-void OOXMLFastContextHandlerXNote::lcl_endFastElement
-(Token_t Element)
-{
- endAction();
-
- OOXMLFastContextHandlerProperties::lcl_endFastElement(Element);
-
- setForwardEvents(mbForwardEventsSaved);
-}
-
-void OOXMLFastContextHandlerXNote::checkId(const OOXMLValue::Pointer_t& pValue)
-{
- mnMyXNoteId = sal_Int32(pValue->getInt());
- mpStream->checkId(mnMyXNoteId);
-}
-
-void OOXMLFastContextHandlerXNote::checkType(const OOXMLValue::Pointer_t& pValue)
-{
- mnMyXNoteType = pValue->getInt();
-}
-
-/*
- class OOXMLFastContextHandlerTextTableCell
- */
-
-OOXMLFastContextHandlerTextTableCell::OOXMLFastContextHandlerTextTableCell
-(OOXMLFastContextHandler * pContext)
-: OOXMLFastContextHandler(pContext)
-{
-}
-
-OOXMLFastContextHandlerTextTableCell::~OOXMLFastContextHandlerTextTableCell()
-{
-}
-
-void OOXMLFastContextHandlerTextTableCell::startCell()
-{
- if (isForwardEvents())
- {
- OOXMLPropertySet::Pointer_t pProps(new OOXMLPropertySet);
- {
- OOXMLValue::Pointer_t pVal = OOXMLBooleanValue::Create(mnTableDepth > 0);
- pProps->add(NS_ooxml::LN_tcStart, pVal, OOXMLProperty::SPRM);
- }
-
- mpStream->props(pProps.get());
- }
-}
-
-void OOXMLFastContextHandlerTextTableCell::endCell()
-{
- if (!isForwardEvents())
- return;
-
- OOXMLPropertySet::Pointer_t pProps(new OOXMLPropertySet);
- {
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(mnTableDepth);
- pProps->add(NS_ooxml::LN_tblDepth, pVal, OOXMLProperty::SPRM);
- }
- {
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(1);
- pProps->add(NS_ooxml::LN_inTbl, pVal, OOXMLProperty::SPRM);
- }
- {
- OOXMLValue::Pointer_t pVal = OOXMLBooleanValue::Create(mnTableDepth > 0);
- pProps->add(NS_ooxml::LN_tblCell, pVal, OOXMLProperty::SPRM);
- }
- {
- OOXMLValue::Pointer_t pVal = OOXMLBooleanValue::Create(mnTableDepth > 0);
- pProps->add(NS_ooxml::LN_tcEnd, pVal, OOXMLProperty::SPRM);
- }
-
- mpStream->props(pProps.get());
-}
-
-/*
- class OOXMLFastContextHandlerTextTableRow
- */
-
-OOXMLFastContextHandlerTextTableRow::OOXMLFastContextHandlerTextTableRow
-(OOXMLFastContextHandler * pContext)
-: OOXMLFastContextHandler(pContext)
-{
-}
-
-OOXMLFastContextHandlerTextTableRow::~OOXMLFastContextHandlerTextTableRow()
-{
-}
-
-void OOXMLFastContextHandlerTextTableRow::startRow()
-{
-}
-
-void OOXMLFastContextHandlerTextTableRow::endRow()
-{
- if (mpGridAfter)
- {
- // Grid after is the same as grid before, the empty cells are just
- // inserted after the real ones, not before.
- handleGridBefore(mpGridAfter);
- mpGridAfter = nullptr;
- }
-
- startParagraphGroup();
-
- if (isForwardEvents())
- {
- OOXMLPropertySet::Pointer_t pProps(new OOXMLPropertySet);
- {
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(mnTableDepth);
- pProps->add(NS_ooxml::LN_tblDepth, pVal, OOXMLProperty::SPRM);
- }
- {
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(1);
- pProps->add(NS_ooxml::LN_inTbl, pVal, OOXMLProperty::SPRM);
- }
- {
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(1);
- pProps->add(NS_ooxml::LN_tblRow, pVal, OOXMLProperty::SPRM);
- }
-
- mpStream->props(pProps.get());
- }
-
- startCharacterGroup();
-
- if (isForwardEvents())
- mpStream->utext(&uCR, 1);
-
- endCharacterGroup();
- endParagraphGroup();
-}
-
-namespace {
-OOXMLValue::Pointer_t fakeNoBorder()
-{
- OOXMLPropertySet::Pointer_t pProps( new OOXMLPropertySet );
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(0);
- pProps->add(NS_ooxml::LN_CT_Border_val, pVal, OOXMLProperty::ATTRIBUTE);
- OOXMLValue::Pointer_t pValue( new OOXMLPropertySetValue( pProps ));
- return pValue;
-}
-}
-
-// Handle w:gridBefore here by faking necessary input that'll fake cells. I'm apparently
-// not insane enough to find out how to add cells in dmapper.
-void OOXMLFastContextHandlerTextTableRow::handleGridBefore( const OOXMLValue::Pointer_t& val )
-{
- // start removing: disable for w:gridBefore
- if (!mpGridAfter)
- return;
-
- int count = val->getInt();
- for( int i = 0;
- i < count;
- ++i )
- {
- endOfParagraph();
-
- if (isForwardEvents())
- {
- // This whole part is OOXMLFastContextHandlerTextTableCell::endCell() .
- OOXMLPropertySet::Pointer_t pProps(new OOXMLPropertySet);
- {
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(mnTableDepth);
- pProps->add(NS_ooxml::LN_tblDepth, pVal, OOXMLProperty::SPRM);
- }
- {
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(1);
- pProps->add(NS_ooxml::LN_inTbl, pVal, OOXMLProperty::SPRM);
- }
- {
- OOXMLValue::Pointer_t pVal = OOXMLBooleanValue::Create(mnTableDepth > 0);
- pProps->add(NS_ooxml::LN_tblCell, pVal, OOXMLProperty::SPRM);
- }
-
- mpStream->props(pProps.get());
-
- // fake <w:tcBorders> with no border
- OOXMLPropertySet::Pointer_t pCellProps( new OOXMLPropertySet );
- {
- OOXMLPropertySet::Pointer_t pBorderProps( new OOXMLPropertySet );
- static Id borders[] = { NS_ooxml::LN_CT_TcBorders_top, NS_ooxml::LN_CT_TcBorders_bottom,
- NS_ooxml::LN_CT_TcBorders_start, NS_ooxml::LN_CT_TcBorders_end };
- for(sal_uInt32 border : borders)
- pBorderProps->add(border, fakeNoBorder(), OOXMLProperty::SPRM);
- OOXMLValue::Pointer_t pValue( new OOXMLPropertySetValue( pBorderProps ));
- pCellProps->add(NS_ooxml::LN_CT_TcPrBase_tcBorders, pValue, OOXMLProperty::SPRM);
- mpParserState->setCellProperties(pCellProps);
- }
- }
-
- sendCellProperties();
- endParagraphGroup();
- }
-}
-
-/*
- class OOXMLFastContextHandlerTextTable
- */
-
-OOXMLFastContextHandlerTextTable::OOXMLFastContextHandlerTextTable
-(OOXMLFastContextHandler * pContext)
-: OOXMLFastContextHandler(pContext)
-{
-}
-
-OOXMLFastContextHandlerTextTable::~OOXMLFastContextHandlerTextTable()
-{
- clearTableProps();
-}
-
-void OOXMLFastContextHandlerTextTable::lcl_startFastElement
-(Token_t /*Element*/,
- const uno::Reference< xml::sax::XFastAttributeList > & /*Attribs*/)
-{
- if (mpParserState->GetFloatingTableEnded())
- {
- // We're starting a new table, but the previous table was floating. Insert a dummy paragraph
- // to ensure that the floating table has a suitable anchor. The function calls here are a
- // subset of '<resource name="CT_P" resource="Stream">' in model.xml:
- startParagraphGroup();
- sendTableDepth();
- endOfParagraph();
- }
-
- mpParserState->startTable();
- mnTableDepth++;
-
- OOXMLPropertySet::Pointer_t pProps( new OOXMLPropertySet );
- {
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(mnTableDepth);
- pProps->add(NS_ooxml::LN_tblStart, pVal, OOXMLProperty::SPRM);
- }
- mpParserState->setCharacterProperties(pProps);
-
- startAction();
-}
-
-void OOXMLFastContextHandlerTextTable::lcl_endFastElement
-(Token_t /*Element*/)
-{
- endAction();
-
- OOXMLPropertySet::Pointer_t pProps( new OOXMLPropertySet );
- {
- OOXMLValue::Pointer_t pVal = OOXMLIntegerValue::Create(mnTableDepth);
- pProps->add(NS_ooxml::LN_tblEnd, pVal, OOXMLProperty::SPRM);
- }
- mpParserState->setCharacterProperties(pProps);
-
- mnTableDepth--;
-
- OOXMLPropertySet::Pointer_t pTableProps = mpParserState->GetTableProperties();
- if (pTableProps)
- {
- for (const auto& rTableProp : *pTableProps)
- {
- if (rTableProp->getId() == NS_ooxml::LN_CT_TblPrBase_tblpPr)
- {
- mpParserState->SetFloatingTableEnded(true);
- break;
- }
- }
- }
-
- mpParserState->endTable();
-}
-
-// tdf#111550
-void OOXMLFastContextHandlerTextTable::start_P_Tbl()
-{
- // Normally, when one paragraph ends, and another begins,
- // in OOXMLFactory_wml::endAction handler for <w:p>,
- // pHandler->endOfParagraph() is called, which (among other things)
- // calls TableManager::setHandle() to update current cell's starting point.
- // Then, in OOXMLFactory_wml::startAction for next <w:p>,
- // pHandler->startParagraphGroup() is called, which ends previous group,
- // and there, it pushes cells to row in TableManager::endParagraphGroup()
- // (cells have correct bounds defined by mCurHandle).
- // When a table is child of a <w:p>, that paragraph doesn't end before nested
- // paragraph begins. So, pHandler->endOfParagraph() was not (and should not be)
- // called. But as next paragraph starts, is the previous group is closed, then
- // cells will have wrong boundings. Here, we know that we *are* in paragraph
- // group, but it should not be finished.
- mpParserState->setInParagraphGroup(false);
-}
-
-/*
- class OOXMLFastContextHandlerShape
- */
-
-OOXMLFastContextHandlerShape::OOXMLFastContextHandlerShape
-(OOXMLFastContextHandler * pContext)
-: OOXMLFastContextHandlerProperties(pContext), m_bShapeSent( false ),
- m_bShapeStarted(false), m_bShapeContextPushed(false)
-{
-}
-
-OOXMLFastContextHandlerShape::~OOXMLFastContextHandlerShape()
-{
- if (m_bShapeContextPushed)
- getDocument()->popShapeContext();
-}
-
-void OOXMLFastContextHandlerShape::lcl_startFastElement
-(Token_t Element,
- const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
-{
- startAction();
-
- if (mrShapeContext.is())
- {
- if (Element == DGM_TOKEN(relIds) || Element == WPC_TOKEN(wpc))
- {
- // It is a SmartArt or a WordprocessingCanvas. Make size available for generated group.
- // Search for PropertySet in parents
- OOXMLFastContextHandler* pHandler = getParent();
- while (pHandler && pHandler->getId() != NS_ooxml::LN_anchor_anchor
- && pHandler->getId() != NS_ooxml::LN_inline_inline)
- {
- pHandler = pHandler->getParent();
- }
- // Search for extent
- if (pHandler)
- {
- if (const OOXMLPropertySet::Pointer_t pPropSet = pHandler->getPropertySet())
- {
- auto aIt = pPropSet->begin();
- auto aItEnd = pPropSet->end();
- while (aIt != aItEnd && (*aIt)->getId() != NS_ooxml::LN_CT_Inline_extent
- && (*aIt)->getId() != NS_ooxml::LN_CT_Anchor_extent)
- {
- ++aIt;
- }
- if (aIt != aItEnd)
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = (*aIt)->getProps();
- if (pProperties)
- {
- writerfilter::dmapper::ExtentHandler::Pointer_t pExtentHandler(new writerfilter::dmapper::ExtentHandler());
- pProperties->resolve(*pExtentHandler);
- mrShapeContext->setSize(pExtentHandler->getExtent());
- }
- }
- }
- }
- }
- mrShapeContext->startFastElement(Element, Attribs);
- }
-}
-
-void SAL_CALL OOXMLFastContextHandlerShape::startUnknownElement
-(const OUString & Namespace,
- const OUString & Name,
- const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
-{
- if (mrShapeContext.is())
- mrShapeContext->startUnknownElement(Namespace, Name, Attribs);
-}
-
-void OOXMLFastContextHandlerShape::setToken(Token_t nToken)
-{
- if (nToken == Token_t(NMSP_wps | XML_wsp) || nToken == Token_t(NMSP_dmlPicture | XML_pic))
- {
- // drawingML shapes are independent, <wps:bodyPr> is not parsed after
- // shape contents without pushing/popping the stack.
- m_bShapeContextPushed = true;
- getDocument()->pushShapeContext();
- }
-
- mrShapeContext = getDocument()->getShapeContext();
- if (!mrShapeContext.is())
- {
- // Define the shape context for the whole document
- mrShapeContext = new oox::shape::ShapeContextHandler(getDocument()->getShapeFilterBase());
- getDocument()->setShapeContext(mrShapeContext);
- auto pThemePtr = getDocument()->getTheme();
- if (pThemePtr)
- mrShapeContext->setTheme(pThemePtr);
- }
-
- mrShapeContext->setModel(getDocument()->getModel());
- uno::Reference<document::XDocumentPropertiesSupplier> xDocSupplier(getDocument()->getModel(), uno::UNO_QUERY_THROW);
- mrShapeContext->setDocumentProperties(xDocSupplier->getDocumentProperties());
- mrShapeContext->setDrawPage(getDocument()->getDrawPage());
- mrShapeContext->setMediaDescriptor(getDocument()->getMediaDescriptor());
-
- mrShapeContext->setRelationFragmentPath(mpParserState->getTarget());
-
- // Floating tables (table inside a textframe) have issues with fullWPG,
- // so disable the fullWPGsupport in tables until that issue is not fixed.
- mrShapeContext->setFullWPGSupport(!mnTableDepth);
-
- auto xGraphicMapper = getDocument()->getGraphicMapper();
-
- if (xGraphicMapper.is())
- mrShapeContext->setGraphicMapper(xGraphicMapper);
-
- OOXMLFastContextHandler::setToken(nToken);
-
- if (mrShapeContext.is())
- mrShapeContext->pushStartToken(nToken);
-}
-
-void OOXMLFastContextHandlerShape::sendShape( Token_t Element )
-{
- if ( !mrShapeContext.is() || m_bShapeSent )
- return;
-
- awt::Point aPosition = mpStream->getPositionOffset();
- mrShapeContext->setPosition(aPosition);
- uno::Reference<drawing::XShape> xShape(mrShapeContext->getShape());
- m_bShapeSent = true;
- if (!xShape.is())
- return;
-
- OOXMLValue::Pointer_t
- pValue(new OOXMLShapeValue(xShape));
- newProperty(NS_ooxml::LN_shape, pValue);
-
- bool bIsPicture = Element == ( NMSP_dmlPicture | XML_pic );
-
- //tdf#87569: Fix table layout with correcting anchoring
- //If anchored object is in table, Word calculates its position from cell border
- //instead of page (what is set in the sample document)
- uno::Reference<beans::XPropertySet> xShapePropSet(xShape, uno::UNO_QUERY);
- if (mnTableDepth > 0 && xShapePropSet.is() && mbIsVMLfound) //if we had a table
- {
- bool bForceShapeIntoCell = mbAllowInCell;
- // According to tdf#153909 and GraphicImport's LN_shape handling,
- // through-anchored shapes should not force the shape into the cell
- if (bForceShapeIntoCell)
- {
- text::WrapTextMode nSurround = text::WrapTextMode_NONE;
- xShapePropSet->getPropertyValue("Surround") >>= nSurround;
- sal_Int32 nHoriRelation = -1;
- xShapePropSet->getPropertyValue("HoriOrientRelation") >>= nHoriRelation;
- bForceShapeIntoCell = (nSurround != text::WrapTextMode_THROUGH)
- || (nHoriRelation != text::RelOrientation::FRAME);
- }
- xShapePropSet->setPropertyValue(dmapper::getPropertyName(dmapper::PROP_FOLLOW_TEXT_FLOW),
- uno::Any(bForceShapeIntoCell));
- }
- // Notify the dmapper that the shape is ready to use
- if ( !bIsPicture )
- {
- mpStream->startShape( xShape );
- m_bShapeStarted = true;
- }
-}
-
-bool OOXMLFastContextHandlerShape::isDMLGroupShape() const
-{
- return (mrShapeContext->getFullWPGSupport() && mrShapeContext->isWordProcessingGroupShape())
- || mrShapeContext->isWordprocessingCanvas();
-};
-
-void OOXMLFastContextHandlerShape::lcl_endFastElement
-(Token_t Element)
-{
- if (!isForwardEvents())
- return;
-
- if (mrShapeContext.is())
- {
- mrShapeContext->endFastElement(Element);
- sendShape( Element );
- }
-
- OOXMLFastContextHandlerProperties::lcl_endFastElement(Element);
-
- // Ending the shape should be the last thing to do
- bool bIsPicture = Element == ( NMSP_dmlPicture | XML_pic );
- if ( !bIsPicture && m_bShapeStarted)
- mpStream->endShape( );
-}
-
-void SAL_CALL OOXMLFastContextHandlerShape::endUnknownElement
-(const OUString & Namespace,
- const OUString & Name)
-{
- if (mrShapeContext.is())
- mrShapeContext->endUnknownElement(Namespace, Name);
-}
-
-uno::Reference< xml::sax::XFastContextHandler >
-OOXMLFastContextHandlerShape::lcl_createFastChildContext
-(Token_t Element,
- const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
-{
- // we need to share a single theme across all the shapes, but we parse it
- // in ShapeContextHandler. So if it has been parsed there, propagate it to
- // the document.
- if (mrShapeContext && mrShapeContext->getTheme() && !getDocument()->getTheme())
- {
- auto pThemePtr = mrShapeContext->getTheme();
- getDocument()->setTheme(pThemePtr);
- }
-
- uno::Reference< xml::sax::XFastContextHandler > xContextHandler;
-
- bool bGroupShape = Element == Token_t(NMSP_vml | XML_group);
- // drawingML version also counts as a group shape.
- if (!mrShapeContext->getFullWPGSupport())
- bGroupShape |= mrShapeContext->getStartToken() == Token_t(NMSP_wpg | XML_wgp);
- mbIsVMLfound = (getNamespace(Element) == NMSP_vmlOffice) || (getNamespace(Element) == NMSP_vml);
- switch (oox::getNamespace(Element))
- {
- case NMSP_doc:
- case NMSP_vmlWord:
- case NMSP_vmlOffice:
- if (!bGroupShape)
- xContextHandler.set(OOXMLFactory::createFastChildContextFromStart(this, Element));
- [[fallthrough]];
- default:
- if (!xContextHandler.is())
- {
- if (mrShapeContext.is())
- {
- uno::Reference<XFastContextHandler> pChildContext =
- mrShapeContext->createFastChildContext(Element, Attribs);
-
- rtl::Reference<OOXMLFastContextHandlerWrapper> pWrapper =
- new OOXMLFastContextHandlerWrapper(this,
- pChildContext,
- this);
-
- //tdf129888 store allowincell attribute of the VML shape
- if (Attribs->hasAttribute(NMSP_vmlOffice | XML_allowincell))
- mbAllowInCell
- = !(Attribs->getValue(NMSP_vmlOffice | XML_allowincell) == "f");
-
- if (!bGroupShape)
- {
- pWrapper->addNamespace(NMSP_doc);
- pWrapper->addNamespace(NMSP_vmlWord);
- pWrapper->addNamespace(NMSP_vmlOffice);
- pWrapper->addToken( NMSP_vml|XML_textbox );
- }
- xContextHandler.set(pWrapper);
- }
- else
- xContextHandler.set(this);
- }
- break;
- }
-
- // VML import of shape text is already handled by
- // OOXMLFastContextHandlerWrapper::lcl_createFastChildContext(), here we
- // handle the WPS import of shape text, as there the parent context is a
- // Shape one, so a different situation.
- if (Element == static_cast<sal_Int32>(NMSP_wps | XML_txbx) ||
- Element == static_cast<sal_Int32>(NMSP_wps | XML_linkedTxbx) )
- sendShape(Element);
-
- return xContextHandler;
-}
-
-uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
-OOXMLFastContextHandlerShape::createUnknownChildContext
-(const OUString & Namespace,
- const OUString & Name,
- const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
-{
- uno::Reference< xml::sax::XFastContextHandler > xResult;
-
- if (mrShapeContext.is())
- xResult.set(mrShapeContext->createUnknownChildContext
- (Namespace, Name, Attribs));
-
- return xResult;
-}
-
-void OOXMLFastContextHandlerShape::lcl_characters
-(const OUString & aChars)
-{
- if (mrShapeContext.is())
- mrShapeContext->characters(aChars);
-}
-
-/*
- class OOXMLFastContextHandlerWrapper
-*/
-
-OOXMLFastContextHandlerWrapper::OOXMLFastContextHandlerWrapper
-(OOXMLFastContextHandler * pParent,
- uno::Reference<XFastContextHandler> const & xContext,
- rtl::Reference<OOXMLFastContextHandlerShape> const & xShapeHandler)
- : OOXMLFastContextHandler(pParent),
- mxWrappedContext(xContext),
- mxShapeHandler(xShapeHandler)
-{
- setId(pParent->getId());
- setToken(pParent->getToken());
- setPropertySet(pParent->getPropertySet());
-}
-
-OOXMLFastContextHandlerWrapper::~OOXMLFastContextHandlerWrapper()
-{
-}
-
-void SAL_CALL OOXMLFastContextHandlerWrapper::startUnknownElement
-(const OUString & Namespace,
- const OUString & Name,
- const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
-{
- if (mxWrappedContext.is())
- mxWrappedContext->startUnknownElement(Namespace, Name, Attribs);
-}
-
-void SAL_CALL OOXMLFastContextHandlerWrapper::endUnknownElement
-(const OUString & Namespace,
- const OUString & Name)
-{
- if (mxWrappedContext.is())
- mxWrappedContext->endUnknownElement(Namespace, Name);
-}
-
-uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
-OOXMLFastContextHandlerWrapper::createUnknownChildContext
-(const OUString & Namespace,
- const OUString & Name,
- const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
-{
- uno::Reference< xml::sax::XFastContextHandler > xResult;
-
- if (mxWrappedContext.is())
- xResult = mxWrappedContext->createUnknownChildContext
- (Namespace, Name, Attribs);
- else
- xResult.set(this);
-
- return xResult;
-}
-
-void OOXMLFastContextHandlerWrapper::attributes
-(const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
-{
- if (mxWrappedContext.is())
- {
- OOXMLFastContextHandler * pHandler = getFastContextHandler();
- if (pHandler != nullptr)
- pHandler->attributes(Attribs);
- }
-}
-
-OOXMLFastContextHandler::ResourceEnum_t
-OOXMLFastContextHandlerWrapper::getResource() const
-{
- return UNKNOWN;
-}
-
-void OOXMLFastContextHandlerWrapper::addNamespace(Id nId)
-{
- mMyNamespaces.insert(nId);
-}
-
-void OOXMLFastContextHandlerWrapper::addToken( Token_t Token )
-{
- mMyTokens.insert( Token );
-}
-
-void OOXMLFastContextHandlerWrapper::lcl_startFastElement
-(Token_t Element,
- const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
-{
- if (mxWrappedContext.is())
- mxWrappedContext->startFastElement(Element, Attribs);
-
- if (mxShapeHandler->isDMLGroupShape()
- && (Element == Token_t(NMSP_wps | XML_txbx)
- || Element == Token_t(NMSP_wps | XML_linkedTxbx)))
- {
- mpStream->startTextBoxContent();
- }
-}
-
-void OOXMLFastContextHandlerWrapper::lcl_endFastElement
-(Token_t Element)
-{
- if (mxWrappedContext.is())
- mxWrappedContext->endFastElement(Element);
-
- if (mxShapeHandler->isDMLGroupShape()
- && (Element == Token_t(NMSP_wps | XML_txbx)
- || Element == Token_t(NMSP_wps | XML_linkedTxbx)))
- {
- mpStream->endTextBoxContent();
- }
-}
-
-uno::Reference< xml::sax::XFastContextHandler >
-OOXMLFastContextHandlerWrapper::lcl_createFastChildContext
-(Token_t Element,
- const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
-{
- uno::Reference< xml::sax::XFastContextHandler > xResult;
-
- bool bInNamespaces = mMyNamespaces.find(oox::getNamespace(Element)) != mMyNamespaces.end();
- bool bInTokens = mMyTokens.find( Element ) != mMyTokens.end( );
-
- // We have methods to _add_ individual tokens or whole namespaces to be
- // processed by writerfilter (instead of oox), but we have no method to
- // filter out a single token. Just hardwire the 'wrap' and 'signatureline' tokens
- // here until we need a more generic solution.
- bool bIsWrap = Element == static_cast<sal_Int32>(NMSP_vmlWord | XML_wrap);
- bool bIsSignatureLine = Element == static_cast<sal_Int32>(NMSP_vmlOffice | XML_signatureline);
- bool bSkipImages = getDocument()->IsSkipImages() && oox::getNamespace(Element) == NMSP_dml &&
- (oox::getBaseToken(Element) != XML_linkedTxbx) && (oox::getBaseToken(Element) != XML_txbx);
-
- if ( bInNamespaces && ((!bIsWrap && !bIsSignatureLine)
- || mxShapeHandler->isShapeSent()) )
- {
- xResult.set(OOXMLFactory::createFastChildContextFromStart(this, Element));
- }
- else if (mxWrappedContext.is() && !bSkipImages)
- {
- rtl::Reference<OOXMLFastContextHandlerWrapper> pWrapper =
- new OOXMLFastContextHandlerWrapper
- (this, mxWrappedContext->createFastChildContext(Element, Attribs),
- mxShapeHandler);
- pWrapper->mMyNamespaces = mMyNamespaces;
- pWrapper->mMyTokens = mMyTokens;
- pWrapper->setPropertySet(getPropertySet());
- xResult.set(pWrapper);
- }
- else
- {
- xResult.set(this);
- }
-
- if ( bInTokens )
- mxShapeHandler->sendShape( Element );
-
- return xResult;
-}
-
-void OOXMLFastContextHandlerWrapper::lcl_characters
-(const OUString & aChars)
-{
- if (mxWrappedContext.is())
- mxWrappedContext->characters(aChars);
-}
-
-OOXMLFastContextHandler *
-OOXMLFastContextHandlerWrapper::getFastContextHandler() const
-{
- if (mxWrappedContext.is())
- return dynamic_cast<OOXMLFastContextHandler *>(mxWrappedContext.get());
-
- return nullptr;
-}
-
-void OOXMLFastContextHandlerWrapper::newProperty
-(Id nId, const OOXMLValue::Pointer_t& pVal)
-{
- if (mxWrappedContext.is())
- {
- OOXMLFastContextHandler * pHandler = getFastContextHandler();
- if (pHandler != nullptr)
- pHandler->newProperty(nId, pVal);
- }
-}
-
-void OOXMLFastContextHandlerWrapper::setPropertySet
-(const OOXMLPropertySet::Pointer_t& pPropertySet)
-{
- if (mxWrappedContext.is())
- {
- OOXMLFastContextHandler * pHandler = getFastContextHandler();
- if (pHandler != nullptr)
- pHandler->setPropertySet(pPropertySet);
- }
-
- mpPropertySet = pPropertySet;
-}
-
-OOXMLPropertySet::Pointer_t OOXMLFastContextHandlerWrapper::getPropertySet()
- const
-{
- OOXMLPropertySet::Pointer_t pResult(mpPropertySet);
-
- if (mxWrappedContext.is())
- {
- OOXMLFastContextHandler * pHandler = getFastContextHandler();
- if (pHandler != nullptr)
- pResult = pHandler->getPropertySet();
- }
-
- return pResult;
-}
-
-std::string OOXMLFastContextHandlerWrapper::getType() const
-{
- std::string sResult = "Wrapper(";
-
- if (mxWrappedContext.is())
- {
- OOXMLFastContextHandler * pHandler = getFastContextHandler();
- if (pHandler != nullptr)
- sResult += pHandler->getType();
- }
-
- sResult += ")";
-
- return sResult;
-}
-
-void OOXMLFastContextHandlerWrapper::setId(Id rId)
-{
- OOXMLFastContextHandler::setId(rId);
-
- if (mxWrappedContext.is())
- {
- OOXMLFastContextHandler * pHandler = getFastContextHandler();
- if (pHandler != nullptr)
- pHandler->setId(rId);
- }
-}
-
-Id OOXMLFastContextHandlerWrapper::getId() const
-{
- Id nResult = OOXMLFastContextHandler::getId();
-
- if (mxWrappedContext.is())
- {
- OOXMLFastContextHandler * pHandler = getFastContextHandler();
- if (pHandler != nullptr && pHandler->getId() != 0)
- nResult = pHandler->getId();
- }
-
- return nResult;
-}
-
-void OOXMLFastContextHandlerWrapper::setToken(Token_t nToken)
-{
- OOXMLFastContextHandler::setToken(nToken);
-
- if (mxWrappedContext.is())
- {
- OOXMLFastContextHandler * pHandler = getFastContextHandler();
- if (pHandler != nullptr)
- pHandler->setToken(nToken);
- }
-}
-
-Token_t OOXMLFastContextHandlerWrapper::getToken() const
-{
- Token_t nResult = OOXMLFastContextHandler::getToken();
-
- if (mxWrappedContext.is())
- {
- OOXMLFastContextHandler * pHandler = getFastContextHandler();
- if (pHandler != nullptr)
- nResult = pHandler->getToken();
- }
-
- return nResult;
-}
-
-
-/*
- class OOXMLFastContextHandlerLinear
- */
-
-OOXMLFastContextHandlerLinear::OOXMLFastContextHandlerLinear(OOXMLFastContextHandler* pContext)
- : OOXMLFastContextHandlerProperties(pContext)
- , m_depthCount( 0 )
-{
-}
-
-void OOXMLFastContextHandlerLinear::lcl_startFastElement(Token_t Element,
- const uno::Reference< xml::sax::XFastAttributeList >& Attribs)
-{
- m_buffer.appendOpeningTag( Element, Attribs );
- ++m_depthCount;
-}
-
-void OOXMLFastContextHandlerLinear::lcl_endFastElement(Token_t Element)
-{
- m_buffer.appendClosingTag( Element );
- if( --m_depthCount == 0 )
- process();
-}
-
-uno::Reference< xml::sax::XFastContextHandler >
-OOXMLFastContextHandlerLinear::lcl_createFastChildContext(Token_t,
- const uno::Reference< xml::sax::XFastAttributeList >&)
-{
- uno::Reference< xml::sax::XFastContextHandler > xContextHandler;
- xContextHandler.set( this );
- return xContextHandler;
-}
-
-void OOXMLFastContextHandlerLinear::lcl_characters(const OUString& aChars)
-{
- m_buffer.appendCharacters( aChars );
-}
-
-/*
- class OOXMLFastContextHandlerLinear
- */
-
-OOXMLFastContextHandlerMath::OOXMLFastContextHandlerMath(OOXMLFastContextHandler* pContext)
- : OOXMLFastContextHandlerLinear(pContext)
-{
-}
-
-void OOXMLFastContextHandlerMath::process()
-{
- SvGlobalName name( SO3_SM_CLASSID );
- comphelper::EmbeddedObjectContainer container;
- OUString aName;
- uno::Sequence<beans::PropertyValue> objArgs{ comphelper::makePropertyValue(
- "DefaultParentBaseURL", getDocument()->GetDocumentBaseURL()) };
- uno::Reference<embed::XEmbeddedObject> ref =
- container.CreateEmbeddedObject(name.GetByteSequence(), objArgs, aName);
- assert(ref.is());
- if (!ref.is())
- return;
- uno::Reference< uno::XInterface > component(ref->getComponent(), uno::UNO_QUERY_THROW);
- if( oox::FormulaImExportBase* import
- = dynamic_cast< oox::FormulaImExportBase* >( component.get()))
- import->readFormulaOoxml( m_buffer );
- if (!isForwardEvents())
- return;
-
- OOXMLPropertySet::Pointer_t pProps(new OOXMLPropertySet);
- OOXMLValue::Pointer_t pVal( new OOXMLStarMathValue( ref ));
- if (mbIsMathPara)
- {
- switch (mnMathJcVal)
- {
- case eMathParaJc::CENTER:
- pProps->add(NS_ooxml::LN_Value_math_ST_Jc_centerGroup, pVal,
- OOXMLProperty::ATTRIBUTE);
- break;
- case eMathParaJc::LEFT:
- pProps->add(NS_ooxml::LN_Value_math_ST_Jc_left, pVal,
- OOXMLProperty::ATTRIBUTE);
- break;
- case eMathParaJc::RIGHT:
- pProps->add(NS_ooxml::LN_Value_math_ST_Jc_right, pVal,
- OOXMLProperty::ATTRIBUTE);
- break;
- default:
- break;
- }
- }
- else
- pProps->add(NS_ooxml::LN_starmath, pVal, OOXMLProperty::ATTRIBUTE);
- mpStream->props( pProps.get() );
-}
-
-OOXMLFastContextHandlerCommentEx::OOXMLFastContextHandlerCommentEx(
- OOXMLFastContextHandler* pContext)
- : OOXMLFastContextHandler(pContext)
-{
-}
-
-void OOXMLFastContextHandlerCommentEx::lcl_endFastElement(Token_t /*Element*/)
-{
- mpStream->commentProps(m_sParaId, { m_bDone, m_sParentId });
-}
-
-void OOXMLFastContextHandlerCommentEx::att_paraId(const OOXMLValue::Pointer_t& pValue)
-{
- m_sParaId = pValue->getString();
-}
-
-void OOXMLFastContextHandlerCommentEx::att_done(const OOXMLValue::Pointer_t& pValue)
-{
- if (pValue->getInt())
- m_bDone = true;
-}
-
-void OOXMLFastContextHandlerCommentEx::att_paraIdParent(const OOXMLValue::Pointer_t& pValue)
-{
- m_sParentId = pValue->getString();
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
deleted file mode 100644
index 4dfb05d91503..000000000000
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
+++ /dev/null
@@ -1,634 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include <set>
-#include <cppuhelper/implbase.hxx>
-#include <com/sun/star/uno/XComponentContext.hpp>
-#include <com/sun/star/xml/sax/XFastContextHandler.hpp>
-#include <oox/mathml/importutils.hxx>
-#include <rtl/ref.hxx>
-#include "OOXMLParserState.hxx"
-#include "OOXMLPropertySet.hxx"
-
-namespace writerfilter::ooxml
-{
-class OOXMLDocumentImpl;
-
-class OOXMLFastContextHandler: public ::cppu::WeakImplHelper<css::xml::sax::XFastContextHandler>
-{
-public:
- typedef tools::SvRef<OOXMLFastContextHandler> Pointer_t;
-
- enum ResourceEnum_t { UNKNOWN, STREAM, PROPERTIES, TABLE, SHAPE };
-
- explicit OOXMLFastContextHandler(css::uno::Reference< css::uno::XComponentContext > const & context);
-
- explicit OOXMLFastContextHandler(OOXMLFastContextHandler * pContext);
-
- OOXMLFastContextHandler(OOXMLFastContextHandler const &) = default;
-
- virtual ~OOXMLFastContextHandler() override;
-
- // css::xml::sax::XFastContextHandler:
- virtual void SAL_CALL startFastElement (sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList >& Attribs) override final;
-
- virtual void SAL_CALL startUnknownElement(const OUString & Namespace, const OUString & Name, const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual void SAL_CALL endFastElement(sal_Int32 Element) override;
-
- virtual void SAL_CALL endUnknownElement(const OUString & Namespace, const OUString & Name) override;
-
- virtual css::uno::Reference<css::xml::sax::XFastContextHandler> SAL_CALL createFastChildContext(sal_Int32 Element,
- const css::uno::Reference<css::xml::sax::XFastAttributeList>& Attribs) override;
-
- virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createUnknownChildContext(const OUString & Namespace, const OUString & Name,
- const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual void SAL_CALL characters(const OUString & aChars) override;
-
- // local
-
- void setStream(Stream * pStream);
-
- /**
- Return value of this context(element).
-
- @return the value
- */
- virtual OOXMLValue::Pointer_t getValue() const;
-
- /**
- Returns a string describing the type of the context.
-
- This is the name of the define normally.
-
- @return type string
- */
- virtual std::string getType() const { return "??"; }
-
- virtual ResourceEnum_t getResource() const { return STREAM; }
-
- /// @throws css::uno::RuntimeException
- /// @throws css::xml::sax::SAXException
- virtual void attributes(const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs);
-
- virtual void newProperty(Id aId, const OOXMLValue::Pointer_t& pVal);
- virtual void setPropertySet(const OOXMLPropertySet::Pointer_t& pPropertySet);
- virtual OOXMLPropertySet::Pointer_t getPropertySet() const;
-
- virtual void setToken(Token_t nToken);
- virtual Token_t getToken() const;
-
- void resolveFootnote(const sal_Int32 nId);
- void resolveEndnote(const sal_Int32 nId);
- void resolveComment(const sal_Int32 nId);
- void resolvePicture(const OUString & rId);
- void resolveHeader(const sal_Int32 type,
- const OUString & rId);
- void resolveFooter(const sal_Int32 type,
- const OUString & rId);
- void resolveData(const OUString & rId);
-
- OUString getTargetForId(const OUString & rId);
-
- void setDocument(OOXMLDocumentImpl* pDocument);
- OOXMLDocumentImpl* getDocument();
- void setXNoteId(const OOXMLValue::Pointer_t& pValue);
- void setXNoteId(const sal_Int32 nId);
- sal_Int32 getXNoteId() const;
- void setForwardEvents(bool bForwardEvents);
- bool isForwardEvents() const;
- virtual void setId(Id nId);
- virtual Id getId() const;
-
- void setDefine(Id nDefine);
- Id getDefine() const { return mnDefine;}
-
- const OOXMLParserState::Pointer_t& getParserState() const { return mpParserState;}
-
- void sendTableDepth() const;
- void setHandle();
-
- void startSectionGroup();
- void setLastParagraphInSection();
- void setLastSectionGroup();
- void endSectionGroup();
- void startParagraphGroup();
- void endParagraphGroup();
- void startCharacterGroup();
- void endCharacterGroup();
- virtual void pushBiDiEmbedLevel();
- virtual void popBiDiEmbedLevel();
- void startSdt();
- void endSdt();
- void startSdtRun();
- void endSdtRun();
-
- void startField();
- void fieldSeparator();
- void endField();
- void lockField();
- void ftnednref();
- void ftnedncont();
- void ftnednsep();
- void pgNum();
- void tab();
- void symbol();
- void cr();
- void noBreakHyphen();
- void softHyphen();
- void handleLastParagraphInSection();
- void endOfParagraph();
- void text(const OUString & sText);
- void positionOffset(const OUString & sText);
- static void ignore();
- void alignH(const OUString & sText);
- void alignV(const OUString & sText);
- void positivePercentage(const OUString& rText);
- void startGlossaryEntry();
- void endGlossaryEntry();
- void startTxbxContent();
- void endTxbxContent();
- void propagateCharacterProperties();
- void propagateTableProperties();
- void propagateRowProperties();
- void propagateCellProperties();
- void sendPropertiesWithId(Id nId);
- void sendPropertiesToParent();
- void sendCellProperties();
- void sendRowProperties();
- void sendTableProperties();
- void clearTableProps();
- void clearProps();
-
- virtual void setDefaultBooleanValue();
- virtual void setDefaultIntegerValue();
- virtual void setDefaultHexValue();
- virtual void setDefaultStringValue();
-
- void sendPropertyToParent();
- OOXMLFastContextHandler* getParent() const { return mpParent; }
- void setGridAfter(const OOXMLValue::Pointer_t& pGridAfter) { mpGridAfter = pGridAfter; }
-
-protected:
- OOXMLFastContextHandler * mpParent;
- Id mId;
- Id mnDefine;
- Token_t mnToken;
-
- // the formula insertion mode: inline/newline(left, center, right)
- sal_Int8 mnMathJcVal;
- bool mbIsMathPara;
- enum eMathParaJc
- {
- INLINE, //The equation is anchored as inline to the text
- CENTER, //The equation is center aligned
- LEFT, //The equation is left aligned
- RIGHT //The equation is right aligned
- };
- // the stream to send the stream events to.
- Stream * mpStream;
-
- // the current global parser state
- OOXMLParserState::Pointer_t mpParserState;
-
- // the table depth of this context
- unsigned int mnTableDepth;
-
- /// @throws css::uno::RuntimeException
- /// @throws css::xml::sax::SAXException
- virtual void lcl_startFastElement(Token_t Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs);
-
- /// @throws css::uno::RuntimeException
- /// @throws css::xml::sax::SAXException
- virtual void lcl_endFastElement(Token_t Element);
-
- /// @throws css::uno::RuntimeException
- /// @throws css::xml::sax::SAXException
- virtual css::uno::Reference< css::xml::sax::XFastContextHandler > lcl_createFastChildContext(Token_t Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs);
-
- /// @throws css::uno::RuntimeException
- /// @throws css::xml::sax::SAXException
- virtual void lcl_characters(const OUString & aChars);
-
- void startAction();
- void endAction();
-
- bool m_inPositionV;
- bool mbAllowInCell; // o:allowincell
- bool mbIsVMLfound;
- OOXMLValue::Pointer_t mpGridAfter;
-
-private:
- void operator =(OOXMLFastContextHandler const &) = delete;
- /// Handles AlternateContent. Returns true, if children of the current element should be ignored.
- bool prepareMceContext(Token_t nElement, const css::uno::Reference<css::xml::sax::XFastAttributeList>& Attribs);
-
- // 2.10 of XML 1.0 specification
- bool IsPreserveSpace() const;
-
- css::uno::Reference< css::uno::XComponentContext > m_xContext;
- bool m_bDiscardChildren;
- bool m_bTookChoice; ///< Did we take the Choice or want Fallback instead?
- bool mbPreserveSpace = false;
- bool mbPreserveSpaceSet = false;
-
-};
-
-class OOXMLFastContextHandlerStream : public OOXMLFastContextHandler
-{
-public:
- explicit OOXMLFastContextHandlerStream(OOXMLFastContextHandler * pContext);
- virtual ~OOXMLFastContextHandlerStream() override;
-
- virtual ResourceEnum_t getResource() const override { return STREAM; }
-
- const OOXMLPropertySet::Pointer_t& getPropertySetAttrs() const { return mpPropertySetAttrs;}
-
- virtual void newProperty(Id aId, const OOXMLValue::Pointer_t& pVal) override;
- void sendProperty(Id nId);
- virtual OOXMLPropertySet::Pointer_t getPropertySet() const override;
-
- void handleHyperlink();
-
-private:
- mutable OOXMLPropertySet::Pointer_t mpPropertySetAttrs;
-};
-
-class OOXMLFastContextHandlerProperties : public OOXMLFastContextHandler
-{
-public:
- explicit OOXMLFastContextHandlerProperties(OOXMLFastContextHandler * pContext);
- virtual ~OOXMLFastContextHandlerProperties() override;
-
- virtual OOXMLValue::Pointer_t getValue() const override;
- virtual ResourceEnum_t getResource() const override { return PROPERTIES; }
-
- virtual void newProperty(Id nId, const OOXMLValue::Pointer_t& pVal) override;
-
- void handleXNotes();
- void handleHdrFtr();
- void handleComment();
- void handlePicture();
- void handleBreak();
- void handleOutOfOrderBreak();
- void handleOLE();
- void handleFontRel();
- void handleHyperlinkURL();
- void handleAltChunk();
-
- virtual void setPropertySet(const OOXMLPropertySet::Pointer_t& pPropertySet) override;
- virtual OOXMLPropertySet::Pointer_t getPropertySet() const override;
-
-protected:
- /// the properties
- OOXMLPropertySet::Pointer_t mpPropertySet;
-
- virtual void lcl_endFastElement(Token_t Element) override;
-
-private:
-
- bool mbResolve;
-};
-
-class OOXMLFastContextHandlerPropertyTable :
- public OOXMLFastContextHandlerProperties
-{
-public:
- explicit OOXMLFastContextHandlerPropertyTable(OOXMLFastContextHandler * pContext);
- virtual ~OOXMLFastContextHandlerPropertyTable() override;
-
-private:
- OOXMLTable mTable;
-
- virtual void lcl_endFastElement(Token_t Element) override;
-};
-
-class OOXMLFastContextHandlerValue :
- public OOXMLFastContextHandler
-{
-public:
- explicit OOXMLFastContextHandlerValue(OOXMLFastContextHandler * pContext);
- virtual ~OOXMLFastContextHandlerValue() override;
-
- void setValue(const OOXMLValue::Pointer_t& pValue);
- virtual OOXMLValue::Pointer_t getValue() const override;
-
- virtual void lcl_endFastElement(Token_t Element) override;
-
- virtual std::string getType() const override { return "Value"; }
-
- virtual void setDefaultBooleanValue() override;
- virtual void setDefaultIntegerValue() override;
- virtual void setDefaultHexValue() override;
- virtual void setDefaultStringValue() override;
-
- virtual void pushBiDiEmbedLevel() override;
- virtual void popBiDiEmbedLevel() override;
-
- void handleGridAfter();
-
-private:
- OOXMLValue::Pointer_t mpValue;
-};
-
-class OOXMLFastContextHandlerTable : public OOXMLFastContextHandler
-{
-public:
- explicit OOXMLFastContextHandlerTable(OOXMLFastContextHandler * pContext);
- virtual ~OOXMLFastContextHandlerTable() override;
-
- virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext (sal_Int32 Element,
- const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
-private:
- OOXMLTable mTable;
-
- css::uno::Reference<css::xml::sax::XFastContextHandler> mCurrentChild;
-
- virtual void lcl_endFastElement(Token_t Element) override;
-
- virtual ResourceEnum_t getResource() const override { return TABLE; }
-
- virtual std::string getType() const override { return "Table"; }
-
- void addCurrentChild();
-};
-
-class OOXMLFastContextHandlerXNote : public OOXMLFastContextHandlerProperties
-{
-public:
- explicit OOXMLFastContextHandlerXNote(OOXMLFastContextHandler * pContext);
- virtual ~OOXMLFastContextHandlerXNote() override;
-
- void checkId(const OOXMLValue::Pointer_t& pValue);
-
- void checkType(const OOXMLValue::Pointer_t& pValue);
-
- virtual std::string getType() const override { return "XNote"; }
-
-private:
- bool mbForwardEventsSaved;
- sal_Int32 mnMyXNoteId;
- sal_Int32 mnMyXNoteType;
-
- virtual void lcl_startFastElement(Token_t Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual void lcl_endFastElement(Token_t Element) override;
-
- virtual ResourceEnum_t getResource() const override { return STREAM; }
-};
-
-class OOXMLFastContextHandlerTextTableCell : public OOXMLFastContextHandler
-{
-public:
- explicit OOXMLFastContextHandlerTextTableCell(OOXMLFastContextHandler * pContext);
- virtual ~OOXMLFastContextHandlerTextTableCell() override;
-
- virtual std::string getType() const override { return "TextTableCell"; }
-
- void startCell();
- void endCell();
-};
-
-class OOXMLFastContextHandlerTextTableRow : public OOXMLFastContextHandler
-{
-public:
- explicit OOXMLFastContextHandlerTextTableRow(OOXMLFastContextHandler * pContext);
- virtual ~OOXMLFastContextHandlerTextTableRow() override;
-
- virtual std::string getType() const override { return "TextTableRow"; }
-
- static void startRow();
- void endRow();
- void handleGridBefore( const OOXMLValue::Pointer_t& val );
-};
-
-class OOXMLFastContextHandlerTextTable : public OOXMLFastContextHandler
-{
-public:
- explicit OOXMLFastContextHandlerTextTable(OOXMLFastContextHandler * pContext);
-
- virtual ~OOXMLFastContextHandlerTextTable() override;
-
- virtual std::string getType() const override { return "TextTable"; }
-
- // tdf#111550
- // when <w:tbl> appears as direct child of <w:p>, we need to rearrange this paragraph
- // to merge with the table's first paragraph (that's what Word does in this case)
- void start_P_Tbl();
-protected:
- virtual void lcl_startFastElement(Token_t Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual void lcl_endFastElement(Token_t Element) override;
-};
-
-class OOXMLFastContextHandlerShape: public OOXMLFastContextHandlerProperties
-{
- bool m_bShapeSent;
- bool m_bShapeStarted;
- /// Is it necessary to pop the stack in the dtor?
- bool m_bShapeContextPushed;
- rtl::Reference<oox::shape::ShapeContextHandler> mrShapeContext;
-
-public:
- explicit OOXMLFastContextHandlerShape(OOXMLFastContextHandler * pContext);
- virtual ~OOXMLFastContextHandlerShape() override;
-
- virtual std::string getType() const override { return "Shape"; }
-
- // css::xml::sax::XFastContextHandler:
- virtual void SAL_CALL startUnknownElement (const OUString & Namespace, const OUString & Name, const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual void SAL_CALL endUnknownElement(const OUString & Namespace, const OUString & Name) override;
-
- virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createUnknownChildContext(const OUString & Namespace, const OUString & Name,
- const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual void setToken(Token_t nToken) override;
-
- virtual ResourceEnum_t getResource() const override { return SHAPE; }
-
- void sendShape( Token_t Element );
- bool isShapeSent( ) const { return m_bShapeSent; }
- bool isDMLGroupShape() const;
-
-protected:
- virtual void lcl_startFastElement(Token_t Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual void lcl_endFastElement(Token_t Element) override;
-
- virtual css::uno::Reference< css::xml::sax::XFastContextHandler > lcl_createFastChildContext (Token_t Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual void lcl_characters(const OUString & aChars) override;
-
-};
-
-/**
- OOXMLFastContextHandlerWrapper wraps an OOXMLFastContextHandler.
-
- The method calls for the interface css::xml::sax::XFastContextHandler are
- forwarded to the wrapped OOXMLFastContextHandler.
- */
-class OOXMLFastContextHandlerWrapper : public OOXMLFastContextHandler
-{
-public:
- OOXMLFastContextHandlerWrapper(OOXMLFastContextHandler * pParent,
- css::uno::Reference<css::xml::sax::XFastContextHandler> const & xContext,
- rtl::Reference<OOXMLFastContextHandlerShape> const & xShapeHandler);
- virtual ~OOXMLFastContextHandlerWrapper() override;
-
- // css::xml::sax::XFastContextHandler:
- virtual void SAL_CALL startUnknownElement(const OUString & Namespace, const OUString & Name, const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual void SAL_CALL endUnknownElement(const OUString & Namespace, const OUString & Name) override;
-
- virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createUnknownChildContext (const OUString & Namespace, const OUString & Name,
- const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual void attributes(const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual ResourceEnum_t getResource() const override;
-
- void addNamespace(Id nId);
- void addToken( Token_t Element );
-
- virtual void newProperty(Id nId, const OOXMLValue::Pointer_t& pVal) override;
- virtual void setPropertySet(const OOXMLPropertySet::Pointer_t& pPropertySet) override;
- virtual OOXMLPropertySet::Pointer_t getPropertySet() const override;
-
- virtual std::string getType() const override;
-
-protected:
- virtual void lcl_startFastElement(Token_t Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual void lcl_endFastElement(Token_t Element) override;
-
- virtual css::uno::Reference< css::xml::sax::XFastContextHandler > lcl_createFastChildContext(Token_t Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual void lcl_characters(const OUString & aChars) override;
-
- virtual void setId(Id nId) override;
- virtual Id getId() const override;
-
- virtual void setToken(Token_t nToken) override;
- virtual Token_t getToken() const override;
-
-private:
- css::uno::Reference<css::xml::sax::XFastContextHandler> mxWrappedContext;
- rtl::Reference<OOXMLFastContextHandlerShape> mxShapeHandler;
- std::set<Id> mMyNamespaces;
- std::set<Token_t> mMyTokens;
- OOXMLPropertySet::Pointer_t mpPropertySet;
-
- OOXMLFastContextHandler * getFastContextHandler() const;
-};
-
-/**
- A class that converts from XFastParser/XFastContextHandler usage to a liner XML stream of data.
-
- The purpose of this class is to convert the rather complex XFastContextHandler-based XML
- processing that requires context subclasses, callbacks, etc. into a linear stream of XML tokens
- that can be handled simply by reading the tokens one by one and directly processing them.
- See the oox::formulaimport::XmlStream class documentation for more information.
-
- Usage: Create a subclass of OOXMLFastContextHandlerLinear, reimplemented getType() to provide
- type of the subclass and process() to actually process the XML stream. Also make sure to
- add a line like the following to model.xml (for class OOXMLFastContextHandlerMath):
-
- <resource name="CT_OMath" resource="Math"/>
-
- @since 3.5
-*/
-class OOXMLFastContextHandlerLinear: public OOXMLFastContextHandlerProperties
-{
-public:
- explicit OOXMLFastContextHandlerLinear(OOXMLFastContextHandler * pContext);
- /**
- Return the type of the class, as written in model.xml .
- */
- virtual std::string getType() const override = 0;
-
-protected:
- /**
- Called when the tokens for the element, its content and sub-elements have been linearized
- and should be processed. The data member @ref buffer contains the converted data.
- */
- virtual void process() = 0;
-
- virtual void lcl_startFastElement(Token_t Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual void lcl_endFastElement(Token_t Element) override;
-
- virtual css::uno::Reference< css::xml::sax::XFastContextHandler > lcl_createFastChildContext(Token_t Element,
- const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
-
- virtual void lcl_characters(const OUString & aChars) override;
-
- // should be private, but not much point in making deep copies of it
- oox::formulaimport::XmlStreamBuilder m_buffer;
-
-private:
- int m_depthCount;
-};
-
-class OOXMLFastContextHandlerMath: public OOXMLFastContextHandlerLinear
-{
-public:
- explicit OOXMLFastContextHandlerMath(OOXMLFastContextHandler * pContext);
- virtual std::string getType() const override { return "Math"; }
-protected:
- virtual void process() override;
-};
-
-/**
- A class that reads individual w15:commentEx elements from commentsExtended stream [MS-DOCX].
-
- It is used to pre-populate the extended comment properties in domain mapper. The stream
- contains information about resolved state of the comments ("done" attribute) and the parent
- comment (the one that this comment answers to).
-
- Note that the data is linked to paraId identifiers (also introduced in [MS-DOCX]), which
- correspond to paragraphs, not directly to comment ids.
-
- @since 7.2
-*/
-class OOXMLFastContextHandlerCommentEx : public OOXMLFastContextHandler
-{
-public:
- explicit OOXMLFastContextHandlerCommentEx(OOXMLFastContextHandler* pContext);
-
- virtual std::string getType() const override { return "CommentEx"; }
- virtual void lcl_endFastElement(Token_t Element) override;
-
- void att_paraId(const OOXMLValue::Pointer_t& pValue);
- void att_done(const OOXMLValue::Pointer_t& pValue);
- void att_paraIdParent(const OOXMLValue::Pointer_t& pValue);
-
-private:
- OUString m_sParaId;
- bool m_bDone = false;
- OUString m_sParentId {};
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.cxx
deleted file mode 100644
index 0167f0416a26..000000000000
--- a/writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.cxx
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- 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 <sal/log.hxx>
-#include "OOXMLFastContextHandlerTheme.hxx"
-#include <oox/drawingml/theme.hxx>
-#include <oox/token/namespaces.hxx>
-
-using namespace ::com::sun::star;
-
-namespace writerfilter::ooxml
-{
-OOXMLFastContextHandlerTheme::OOXMLFastContextHandlerTheme(OOXMLFastContextHandler* pContext)
- : OOXMLFastContextHandler(pContext)
-{
-}
-
-uno::Reference<xml::sax::XFastContextHandler>
-OOXMLFastContextHandlerTheme::lcl_createFastChildContext(
- Token_t Element, const uno::Reference<xml::sax::XFastAttributeList>& Attribs)
-{
- if (mpThemeFragmentHandler.is())
- return mpThemeFragmentHandler->createFastChildContext(Element, Attribs);
-
- return this;
-}
-
-void OOXMLFastContextHandlerTheme::lcl_startFastElement(
- Token_t Element, const uno::Reference<xml::sax::XFastAttributeList>& Attribs)
-{
- if (!mpThemeFragmentHandler.is())
- {
- auto xThemeFilterBase = getDocument()->getThemeFilterBase();
- OUString aThemeFragmentPath
- = xThemeFilterBase->getFragmentPathFromFirstTypeFromOfficeDoc(u"theme");
- auto pThemePtr = getDocument()->getTheme();
- if (!pThemePtr)
- {
- pThemePtr = std::make_shared<oox::drawingml::Theme>();
- auto pTheme = std::make_shared<model::Theme>();
- pThemePtr->setTheme(pTheme);
- getDocument()->setTheme(pThemePtr);
- }
- mpThemeFragmentHandler = new oox::drawingml::ThemeFragmentHandler(
- *xThemeFilterBase, aThemeFragmentPath, *pThemePtr, *pThemePtr->getTheme());
- }
-
- if (mpThemeFragmentHandler.is())
- mpThemeFragmentHandler->startFastElement(Element, Attribs);
-}
-
-void OOXMLFastContextHandlerTheme::lcl_endFastElement(Token_t Element)
-{
- if (mpThemeFragmentHandler.is())
- mpThemeFragmentHandler->endFastElement(Element);
-}
-
-void OOXMLFastContextHandlerTheme::lcl_characters(const OUString& aChars)
-{
- if (mpThemeFragmentHandler.is())
- mpThemeFragmentHandler->characters(aChars);
-}
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.hxx
deleted file mode 100644
index 9622406f7867..000000000000
--- a/writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.hxx
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-#include <docmodel/theme/Theme.hxx>
-#include <cppuhelper/implbase.hxx>
-#include <com/sun/star/uno/XComponentContext.hpp>
-#include <com/sun/star/xml/sax/XFastContextHandler.hpp>
-#include <oox/mathml/importutils.hxx>
-#include <oox/drawingml/themefragmenthandler.hxx>
-#include <rtl/ref.hxx>
-#include "OOXMLParserState.hxx"
-#include "OOXMLPropertySet.hxx"
-#include "OOXMLFastContextHandler.hxx"
-
-namespace writerfilter::ooxml
-{
-class OOXMLFastContextHandlerTheme : public OOXMLFastContextHandler
-{
-private:
- rtl::Reference<oox::drawingml::ThemeFragmentHandler> mpThemeFragmentHandler;
-
-public:
- explicit OOXMLFastContextHandlerTheme(OOXMLFastContextHandler* pContext);
- std::string getType() const override { return "Theme"; }
-
-protected:
- void lcl_startFastElement(
- Token_t Element,
- const css::uno::Reference<css::xml::sax::XFastAttributeList>& Attribs) override;
- void lcl_endFastElement(Token_t Element) override;
- css::uno::Reference<css::xml::sax::XFastContextHandler> lcl_createFastChildContext(
- Token_t Element,
- const css::uno::Reference<css::xml::sax::XFastAttributeList>& Attribs) override;
- virtual void lcl_characters(const OUString& aChars) override;
-};
-
-} // end namespace writerfilter::ooxml
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx b/writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx
deleted file mode 100644
index 0e831bd35627..000000000000
--- a/writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx
+++ /dev/null
@@ -1,146 +0,0 @@
-/* -*- 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/.
- *
- * 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 "OOXMLFastDocumentHandler.hxx"
-#include "OOXMLFastContextHandler.hxx"
-#include "OOXMLFactory.hxx"
-#include <sal/log.hxx>
-#include <utility>
-
-namespace writerfilter::ooxml
-{
-using namespace ::com::sun::star;
-
-
-OOXMLFastDocumentHandler::OOXMLFastDocumentHandler(
- uno::Reference< uno::XComponentContext > context,
- Stream* pStream,
- OOXMLDocumentImpl* pDocument,
- sal_Int32 nXNoteId )
- : m_xContext(std::move(context))
- , mpStream( pStream )
- , mpDocument( pDocument )
- , mnXNoteId( nXNoteId )
-{
-}
-
-OOXMLFastDocumentHandler::~OOXMLFastDocumentHandler() {}
-
-// css::xml::sax::XFastContextHandler:
-void SAL_CALL OOXMLFastDocumentHandler::startFastElement(sal_Int32 Element
-, const uno::Reference< xml::sax::XFastAttributeList > & /*Attribs*/)
-{
- SAL_INFO("writerfilter", "start element:" << fastTokenToId(Element));
-}
-
-void SAL_CALL OOXMLFastDocumentHandler::startUnknownElement
-(const OUString & Namespace
-, const OUString & Name
-, const uno::Reference< xml::sax::XFastAttributeList > & /*Attribs*/)
-{
- SAL_INFO("writerfilter", "start unknown element:" << Namespace << ":" << Name);
-}
-
-void SAL_CALL OOXMLFastDocumentHandler::endFastElement(sal_Int32 Element)
-{
- SAL_INFO("writerfilter", "end element:" << fastTokenToId(Element));
-}
-
-void SAL_CALL OOXMLFastDocumentHandler::endUnknownElement
-(const OUString & Namespace
-, const OUString & Name)
-{
- SAL_INFO("writerfilter", "end unknown element:" << Namespace << ":" << Name);
-}
-
-rtl::Reference< OOXMLFastContextHandler > const &
-OOXMLFastDocumentHandler::getContextHandler() const
-{
- if (!mxContextHandler.is())
- {
- mxContextHandler = new OOXMLFastContextHandler(m_xContext);
- mxContextHandler->setStream(mpStream);
- mxContextHandler->setDocument(mpDocument);
- mxContextHandler->setXNoteId(mnXNoteId);
- mxContextHandler->setForwardEvents(true);
- }
-
- return mxContextHandler;
-}
-
-uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
- OOXMLFastDocumentHandler::createFastChildContext
-(::sal_Int32 Element,
- const uno::Reference< xml::sax::XFastAttributeList > & /*Attribs*/)
-{
- if ( mpStream == nullptr && mpDocument == nullptr )
- {
- // document handler has been created as unknown child - see <OOXMLFastDocumentHandler::createUnknownChildContext(..)>
- // --> do not provide a child context
- return nullptr;
- }
-
- return OOXMLFactory::createFastChildContextFromStart(getContextHandler().get(), Element);
-}
-
-uno::Reference< xml::sax::XFastContextHandler > SAL_CALL
-OOXMLFastDocumentHandler::createUnknownChildContext
-(const OUString & Namespace
-, const OUString & Name
-, const uno::Reference< xml::sax::XFastAttributeList > & /*Attribs*/)
-{
- SAL_INFO("writerfilter", "createUnknownChildContext:" << Namespace << ":"<< Name);
-
- return uno::Reference< xml::sax::XFastContextHandler >
- ( new OOXMLFastDocumentHandler( m_xContext, nullptr, nullptr, 0 ) );
-}
-
-void SAL_CALL OOXMLFastDocumentHandler::characters(const OUString & /*aChars*/)
-{
-}
-
-// css::xml::sax::XFastDocumentHandler:
-void SAL_CALL OOXMLFastDocumentHandler::startDocument()
-{
-}
-
-void SAL_CALL OOXMLFastDocumentHandler::endDocument()
-{
-}
-
-void SAL_CALL OOXMLFastDocumentHandler::processingInstruction( const OUString& /*rTarget*/, const OUString& /*rData*/ )
-{
-}
-
-void SAL_CALL OOXMLFastDocumentHandler::setDocumentLocator
-(const uno::Reference< xml::sax::XLocator > & /*xLocator*/)
-{
-}
-
-void OOXMLFastDocumentHandler::setIsSubstream( bool bSubstream )
-{
- if ( mpStream != nullptr && mpDocument != nullptr )
- {
- getContextHandler( )->getParserState( )->setInSectionGroup( bSubstream );
- }
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx b/writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx
deleted file mode 100644
index 3d28d2bd742c..000000000000
--- a/writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx
+++ /dev/null
@@ -1,90 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-
-#pragma once
-
-#include <com/sun/star/uno/XComponentContext.hpp>
-#include <cppuhelper/implbase.hxx>
-#include <com/sun/star/xml/sax/XFastDocumentHandler.hpp>
-#include <dmapper/resourcemodel.hxx>
-#include <ooxml/OOXMLDocumentImpl.hxx>
-#include <rtl/ref.hxx>
-
-namespace writerfilter::ooxml
-{
-
-class OOXMLFastContextHandler;
-
-class OOXMLFastDocumentHandler : public cppu::WeakImplHelper<css::xml::sax::XFastDocumentHandler>
-{
-public:
- OOXMLFastDocumentHandler(
- css::uno::Reference< css::uno::XComponentContext > context,
- Stream* pStream,
- OOXMLDocumentImpl* pDocument,
- sal_Int32 nXNoteId );
- virtual ~OOXMLFastDocumentHandler() override;
-
- // css::xml::sax::XFastDocumentHandler:
- virtual void SAL_CALL startDocument() override;
- virtual void SAL_CALL endDocument() override;
- virtual void SAL_CALL processingInstruction( const OUString& rTarget, const OUString& rData ) override;
- virtual void SAL_CALL setDocumentLocator
- (const css::uno::Reference< css::xml::sax::XLocator > & xLocator) override;
-
- // css::xml::sax::XFastContextHandler:
- virtual void SAL_CALL startFastElement
- (::sal_Int32 Element,
- const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
- virtual void SAL_CALL startUnknownElement
- (const OUString & Namespace,
- const OUString & Name,
- const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
- virtual void SAL_CALL endFastElement(::sal_Int32 Element) override;
- virtual void SAL_CALL endUnknownElement
- (const OUString & Namespace,
- const OUString & Name) override;
- virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL
- createFastChildContext
- (::sal_Int32 Element,
- const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
- virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL
- createUnknownChildContext
- (const OUString & Namespace,
- const OUString & Name,
- const css::uno::Reference< css::xml::sax::XFastAttributeList > & Attribs) override;
- virtual void SAL_CALL characters(const OUString & aChars) override;
-
- void setIsSubstream( bool bSubstream );
-
-private:
- OOXMLFastDocumentHandler(OOXMLFastDocumentHandler const &) = delete;
- void operator =(OOXMLFastDocumentHandler const &) = delete;
-
- css::uno::Reference< css::uno::XComponentContext > m_xContext;
-
- Stream * mpStream;
- OOXMLDocumentImpl* mpDocument;
- sal_Int32 mnXNoteId;
- mutable rtl::Reference<OOXMLFastContextHandler> mxContextHandler;
- rtl::Reference<OOXMLFastContextHandler> const & getContextHandler() const;
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLFastHelper.hxx b/writerfilter/source/ooxml/OOXMLFastHelper.hxx
deleted file mode 100644
index ecb8b6943b11..000000000000
--- a/writerfilter/source/ooxml/OOXMLFastHelper.hxx
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include "OOXMLFastContextHandler.hxx"
-
-namespace writerfilter::ooxml
-{
-
-template <class T>
-class OOXMLFastHelper
-{
-public:
- static rtl::Reference<OOXMLFastContextHandler> createAndSetParentAndDefine
- (OOXMLFastContextHandler * pHandler, sal_uInt32 nToken, Id nId, Id nDefine);
-
- static void newProperty(OOXMLFastContextHandler * pHandler,
- Id nId, sal_Int32 nValue);
-};
-
-template <class T>
-rtl::Reference<OOXMLFastContextHandler> OOXMLFastHelper<T>::createAndSetParentAndDefine (OOXMLFastContextHandler * pHandler, sal_uInt32 nToken, Id nId, Id nDefine)
-{
- rtl::Reference<OOXMLFastContextHandler> pTmp = new T(pHandler);
-
- pTmp->setToken(nToken);
- pTmp->setId(nId);
- pTmp->setDefine(nDefine);
-
- return pTmp;
-}
-
-template <class T>
-void OOXMLFastHelper<T>::newProperty(OOXMLFastContextHandler * pHandler,
- Id nId,
- sal_Int32 nVal)
-{
- OOXMLValue::Pointer_t pVal(T::Create(nVal));
-
- pHandler->newProperty(nId, pVal);
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLParserState.cxx b/writerfilter/source/ooxml/OOXMLParserState.cxx
deleted file mode 100644
index b8cc55377b5b..000000000000
--- a/writerfilter/source/ooxml/OOXMLParserState.cxx
+++ /dev/null
@@ -1,296 +0,0 @@
-/* -*- 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/.
- *
- * 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 "OOXMLParserState.hxx"
-#include "Handler.hxx"
-
-#include <sal/log.hxx>
-
-namespace writerfilter::ooxml
-{
-/*
- class OOXMLParserState
-*/
-
-OOXMLParserState::OOXMLParserState() :
- mbInSectionGroup(false),
- mbInParagraphGroup(false),
- mbInCharacterGroup(false),
- mbLastParagraphInSection(false),
- mbForwardEvents(true),
- mnContexts(0),
- mnHandle(0),
- mpDocument(nullptr),
- m_inTxbxContent(false),
- m_savedInParagraphGroup(false),
- m_savedInCharacterGroup(false),
- m_savedLastParagraphInSection(false),
- mbStartFootnote(false)
-{
-}
-
-OOXMLParserState::~OOXMLParserState()
-{
-}
-
-void OOXMLParserState::setLastParagraphInSection(bool bLastParagraphInSection)
-{
- mbLastParagraphInSection = bLastParagraphInSection;
-}
-
-
-void OOXMLParserState::setInSectionGroup(bool bInSectionGroup)
-{
- mbInSectionGroup = bInSectionGroup;
-}
-
-
-void OOXMLParserState::setInParagraphGroup(bool bInParagraphGroup)
-{
- mbInParagraphGroup = bInParagraphGroup;
-}
-
-
-void OOXMLParserState::setInCharacterGroup(bool bInCharacterGroup)
-{
- mbInCharacterGroup = bInCharacterGroup;
-}
-
-void OOXMLParserState::setForwardEvents(bool bForwardEvents)
-{
- mbForwardEvents = bForwardEvents;
-}
-
-
-std::string OOXMLParserState::getHandle() const
-{
- return std::to_string(mnHandle);
-}
-
-void OOXMLParserState::setHandle()
-{
- mnHandle = mnContexts;
-}
-
-void OOXMLParserState::setDocument(OOXMLDocumentImpl* pDocument)
-{
- mpDocument = pDocument;
-}
-
-
-void OOXMLParserState::setXNoteId(const sal_Int32 nId)
-{
- mpDocument->setXNoteId(nId);
-}
-
-sal_Int32 OOXMLParserState::getXNoteId() const
-{
- return mpDocument->getXNoteId();
-}
-
-const OUString & OOXMLParserState::getTarget() const
-{
- return mpDocument->getTarget();
-}
-
-void OOXMLParserState::resolveCharacterProperties(Stream & rStream)
-{
- if (mpCharacterProps)
- {
- rStream.props(mpCharacterProps.get());
- mpCharacterProps = new OOXMLPropertySet;
- }
-}
-
-void OOXMLParserState::setCharacterProperties(const OOXMLPropertySet::Pointer_t& pProps)
-{
- if (!mpCharacterProps)
- mpCharacterProps = pProps;
- else
- mpCharacterProps->add(pProps);
-}
-
-void OOXMLParserState::setCellProperties(const OOXMLPropertySet::Pointer_t& pProps)
-{
- if (!mCellProps.empty())
- {
- OOXMLPropertySet::Pointer_t & rCellProps = mCellProps.top();
-
- if (!rCellProps)
- rCellProps = pProps;
- else
- rCellProps->add(pProps);
- }
-}
-
-void OOXMLParserState::setRowProperties(const OOXMLPropertySet::Pointer_t& pProps)
-{
- if (!mRowProps.empty())
- {
- OOXMLPropertySet::Pointer_t & rRowProps = mRowProps.top();
-
- if (!rRowProps)
- rRowProps = pProps;
- else
- rRowProps->add(pProps);
- }
-}
-
-void OOXMLParserState::resolveCellProperties(Stream & rStream)
-{
- if (!mCellProps.empty())
- {
- OOXMLPropertySet::Pointer_t & rCellProps = mCellProps.top();
-
- if (rCellProps)
- {
- rStream.props(rCellProps.get());
- rCellProps = new OOXMLPropertySet;
- }
- }
-}
-
-void OOXMLParserState::resolveRowProperties(Stream & rStream)
-{
- if (!mRowProps.empty())
- {
- OOXMLPropertySet::Pointer_t & rRowProps = mRowProps.top();
-
- if (rRowProps)
- {
- rStream.props(rRowProps.get());
- rRowProps = new OOXMLPropertySet;
- }
- }
-}
-
-void OOXMLParserState::resolveTableProperties(Stream & rStream)
-{
- if (!mTableProps.empty())
- {
- OOXMLPropertySet::Pointer_t & rTableProps = mTableProps.top();
-
- if (rTableProps)
- {
- rStream.props(rTableProps.get());
- // Don't clean the table props to send them again for each row
- // This mimics the behaviour from RTF tokenizer.
- }
- }
-}
-
-void OOXMLParserState::setTableProperties(const OOXMLPropertySet::Pointer_t& pProps)
-{
- if (!mTableProps.empty())
- {
- OOXMLPropertySet::Pointer_t & rTableProps = mTableProps.top();
- if (!rTableProps)
- rTableProps = pProps;
- else
- rTableProps->add(pProps);
- }
-}
-
-OOXMLPropertySet::Pointer_t OOXMLParserState::GetTableProperties() const
-{
- if (mTableProps.empty())
- {
- return nullptr;
- }
-
- return mTableProps.top();
-}
-
-// tdf#108714
-void OOXMLParserState::resolvePostponedBreak(Stream & rStream)
-{
- for (const auto & rBreak: mvPostponedBreaks)
- {
- OOXMLBreakHandler aBreakHandler(nullptr, rStream);
- rBreak->resolve(aBreakHandler);
- }
- mvPostponedBreaks.clear();
-}
-
-void OOXMLParserState::setPostponedBreak(const OOXMLPropertySet::Pointer_t & pProps)
-{
- mvPostponedBreaks.push_back(pProps);
-}
-
-void OOXMLParserState::startTable()
-{
- OOXMLPropertySet::Pointer_t pCellProps;
- OOXMLPropertySet::Pointer_t pRowProps;
- OOXMLPropertySet::Pointer_t pTableProps;
-
- mCellProps.push(pCellProps);
- mRowProps.push(pRowProps);
- mTableProps.push(pTableProps);
-}
-
-void OOXMLParserState::endTable()
-{
- mCellProps.pop();
- mRowProps.pop();
- mTableProps.pop();
-}
-
-void OOXMLParserState::incContextCount()
-{
- mnContexts++;
-}
-
-void OOXMLParserState::startTxbxContent()
-{
- SAL_WARN_IF(m_inTxbxContent, "writerfilter", "Nested w:txbxContent");
-
- m_inTxbxContent = true;
- // Do not save and reset section group state, it'd cause a new page.
-// savedInSectionGroup = mbInSectionGroup;
- m_savedInParagraphGroup = mbInParagraphGroup;
- m_savedInCharacterGroup = mbInCharacterGroup;
- m_savedLastParagraphInSection = mbLastParagraphInSection;
-// mbInSectionGroup = false;
- mbInParagraphGroup = false;
- mbInCharacterGroup = false;
- mbLastParagraphInSection = false;
-}
-
-void OOXMLParserState::endTxbxContent()
-{
- if( !m_inTxbxContent )
- {
- SAL_WARN( "writerfilter", "Non-matching closing w:txbxContent" );
- return;
- }
-// mbInSectionGroup = savedInSectionGroup;
- mbInParagraphGroup = m_savedInParagraphGroup;
- mbInCharacterGroup = m_savedInCharacterGroup;
- mbLastParagraphInSection = m_savedLastParagraphInSection;
- m_inTxbxContent = false;
-}
-
-void OOXMLParserState::setStartFootnote(bool bStartFootnote)
-{
- mbStartFootnote = bStartFootnote;
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLParserState.hxx b/writerfilter/source/ooxml/OOXMLParserState.hxx
deleted file mode 100644
index 626f8cdf326c..000000000000
--- a/writerfilter/source/ooxml/OOXMLParserState.hxx
+++ /dev/null
@@ -1,130 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <stack>
-#include "OOXMLDocumentImpl.hxx"
-#include "OOXMLPropertySet.hxx"
-
-namespace writerfilter::ooxml
-{
-/**
- * Struct to store our 'alternate state'. If multiple mc:AlternateContent
- * elements arrive, then while the inner ones are active, the original state is
- * saved away, and once they inner goes out of scope, the original state is
- * restored.
- */
-struct SavedAlternateState
-{
- bool m_bDiscardChildren;
- bool m_bTookChoice; ///< Did we take the Choice or want Fallback instead?
-};
-
-class OOXMLParserState final : public virtual SvRefBase
-{
- bool mbInSectionGroup;
- bool mbInParagraphGroup;
- bool mbInCharacterGroup;
- bool mbLastParagraphInSection;
- bool mbForwardEvents;
- unsigned int mnContexts;
- unsigned int mnHandle;
- OOXMLDocumentImpl* mpDocument;
- OOXMLPropertySet::Pointer_t mpCharacterProps;
- std::stack<OOXMLPropertySet::Pointer_t> mCellProps;
- std::stack<OOXMLPropertySet::Pointer_t> mRowProps;
- std::stack<OOXMLPropertySet::Pointer_t> mTableProps;
- bool m_inTxbxContent;
- // these 4 save when inTxbxContent
- bool m_savedInParagraphGroup;
- bool m_savedInCharacterGroup;
- bool m_savedLastParagraphInSection;
- std::vector<SavedAlternateState> maSavedAlternateStates;
- std::vector<OOXMLPropertySet::Pointer_t> mvPostponedBreaks;
- bool mbStartFootnote;
- /// We just ended a floating table. Starting a paragraph or table resets this.
- bool m_bFloatingTableEnded = false;
-
-public:
- typedef tools::SvRef<OOXMLParserState> Pointer_t;
-
- OOXMLParserState();
- ~OOXMLParserState() override;
-
- bool isInSectionGroup() const { return mbInSectionGroup; }
- void setInSectionGroup(bool bInSectionGroup);
-
- void setLastParagraphInSection(bool bLastParagraphInSection);
- bool isLastParagraphInSection() const { return mbLastParagraphInSection; }
-
- std::vector<SavedAlternateState>& getSavedAlternateStates() { return maSavedAlternateStates; }
-
- bool isInParagraphGroup() const { return mbInParagraphGroup; }
- void setInParagraphGroup(bool bInParagraphGroup);
-
- bool isInCharacterGroup() const { return mbInCharacterGroup; }
- void setInCharacterGroup(bool bInCharacterGroup);
-
- void setForwardEvents(bool bForwardEvents);
- bool isForwardEvents() const { return mbForwardEvents; }
-
- std::string getHandle() const;
- void setHandle();
-
- void setDocument(OOXMLDocumentImpl* pDocument);
- OOXMLDocumentImpl* getDocument() const { return mpDocument; }
-
- void setXNoteId(const sal_Int32 rId);
- sal_Int32 getXNoteId() const;
-
- const OUString& getTarget() const;
-
- void resolveCharacterProperties(Stream& rStream);
- void setCharacterProperties(const OOXMLPropertySet::Pointer_t& pProps);
- void resolveCellProperties(Stream& rStream);
- void setCellProperties(const OOXMLPropertySet::Pointer_t& pProps);
- void resolveRowProperties(Stream& rStream);
- void setRowProperties(const OOXMLPropertySet::Pointer_t& pProps);
- void resolveTableProperties(Stream& rStream);
- void setTableProperties(const OOXMLPropertySet::Pointer_t& pProps);
- OOXMLPropertySet::Pointer_t GetTableProperties() const;
- // tdf#108714
- void resolvePostponedBreak(Stream& rStream);
- void setPostponedBreak(const OOXMLPropertySet::Pointer_t& pProps);
-
- void startTable();
- void endTable();
-
- void incContextCount();
-
- void startTxbxContent();
- void endTxbxContent();
-
- void setStartFootnote(bool bStartFootnote);
- bool isStartFootnote() const { return mbStartFootnote; }
-
- void SetFloatingTableEnded(bool bFloatingTableEnded)
- {
- m_bFloatingTableEnded = bFloatingTableEnded;
- }
- bool GetFloatingTableEnded() const { return m_bFloatingTableEnded; }
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLPropertySet.cxx b/writerfilter/source/ooxml/OOXMLPropertySet.cxx
deleted file mode 100644
index f29efe875aee..000000000000
--- a/writerfilter/source/ooxml/OOXMLPropertySet.cxx
+++ /dev/null
@@ -1,844 +0,0 @@
-/* -*- 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/.
- *
- * 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 "OOXMLPropertySet.hxx"
-#include <stdio.h>
-#include <iostream>
-#include <ooxml/QNameToString.hxx>
-#include <com/sun/star/drawing/XShape.hpp>
-#include <sax/tools/converter.hxx>
-#include <tools/color.hxx>
-#include <o3tl/string_view.hxx>
-#include <utility>
-
-namespace writerfilter::ooxml
-{
-using namespace com::sun::star;
-
-OOXMLProperty::OOXMLProperty(Id id, OOXMLValue::Pointer_t pValue,
- OOXMLProperty::Type_t eType)
- : mId(id), mpValue(std::move(pValue)), meType(eType)
-{
-}
-
-OOXMLProperty::~OOXMLProperty()
-{
-}
-
-sal_uInt32 OOXMLProperty::getId() const
-{
- return mId;
-}
-
-Value::Pointer_t OOXMLProperty::getValue()
-{
- Value::Pointer_t pResult;
-
- if (mpValue)
- pResult = Value::Pointer_t(mpValue->clone());
- else
- pResult = Value::Pointer_t(new OOXMLValue());
-
- return pResult;
-}
-
-writerfilter::Reference<Properties>::Pointer_t OOXMLProperty::getProps()
-{
- writerfilter::Reference<Properties>::Pointer_t pResult;
-
- if (mpValue)
- pResult = mpValue->getProperties();
-
- return pResult;
-}
-
-#ifdef DBG_UTIL
-std::string OOXMLProperty::getName() const
-{
- std::string sResult(QNameToString(mId));
-
- if (sResult.length() == 0)
- sResult = fastTokenToId(mId);
-
- if (sResult.length() == 0)
- {
- static char sBuffer[256];
-
- snprintf(sBuffer, sizeof(sBuffer), "%" SAL_PRIxUINT32, mId);
- sResult = sBuffer;
- }
-
- return sResult;
-}
-#endif
-
-#ifdef DBG_UTIL
-std::string OOXMLProperty::toString() const
-{
- std::string sResult = "(";
-
- sResult += getName();
- sResult += ", ";
- if (mpValue)
- sResult += mpValue->toString();
- else
- sResult +="(null)";
- sResult +=")";
-
- return sResult;
-}
-#endif
-
-void OOXMLProperty::resolve(writerfilter::Properties & rProperties)
-{
- switch (meType)
- {
- case SPRM:
- if (mId != 0x0)
- rProperties.sprm(*this);
- break;
- case ATTRIBUTE:
- rProperties.attribute(mId, *getValue());
- break;
- }
-}
-
-/*
- class OOXMLValue
-*/
-
-OOXMLValue::OOXMLValue()
-{
-}
-
-OOXMLValue::~OOXMLValue()
-{
-}
-
-int OOXMLValue::getInt() const
-{
- return 0;
-}
-
-OUString OOXMLValue::getString() const
-{
- return OUString();
-}
-
-uno::Any OOXMLValue::getAny() const
-{
- return uno::Any();
-}
-
-writerfilter::Reference<Properties>::Pointer_t OOXMLValue::getProperties()
-{
- return writerfilter::Reference<Properties>::Pointer_t();
-}
-
-writerfilter::Reference<BinaryObj>::Pointer_t OOXMLValue::getBinary()
-{
- return writerfilter::Reference<BinaryObj>::Pointer_t();
-}
-
-#ifdef DBG_UTIL
-std::string OOXMLValue::toString() const
-{
- return "OOXMLValue";
-}
-#endif
-
-OOXMLValue * OOXMLValue::clone() const
-{
- return new OOXMLValue(*this);
-}
-
-/*
- class OOXMLBinaryValue
- */
-
-OOXMLBinaryValue::OOXMLBinaryValue(OOXMLBinaryObjectReference::Pointer_t pBinaryObj)
-: mpBinaryObj(std::move(pBinaryObj))
-{
-}
-
-OOXMLBinaryValue::~OOXMLBinaryValue()
-{
-}
-
-writerfilter::Reference<BinaryObj>::Pointer_t OOXMLBinaryValue::getBinary()
-{
- return mpBinaryObj;
-}
-
-#ifdef DBG_UTIL
-std::string OOXMLBinaryValue::toString() const
-{
- return "BinaryObj";
-}
-#endif
-
-OOXMLValue * OOXMLBinaryValue::clone() const
-{
- return new OOXMLBinaryValue(mpBinaryObj);
-}
-
-/*
- class OOXMLBooleanValue
-*/
-
-bool GetBooleanValue(std::string_view pValue)
-{
- return pValue == "true"
- || pValue == "True"
- || pValue == "1"
- || pValue == "on"
- || pValue == "On";
-}
-
-OOXMLValue::Pointer_t const & OOXMLBooleanValue::Create(bool bValue)
-{
- static OOXMLValue::Pointer_t False(new OOXMLBooleanValue (false));
- static OOXMLValue::Pointer_t True(new OOXMLBooleanValue (true));
-
- return bValue ? True : False;
-}
-
-OOXMLValue::Pointer_t const & OOXMLBooleanValue::Create(std::string_view pValue)
-{
- return Create (GetBooleanValue(pValue));
-}
-
-OOXMLBooleanValue::OOXMLBooleanValue(bool bValue)
-: mbValue(bValue)
-{
-}
-
-OOXMLBooleanValue::~OOXMLBooleanValue()
-{
-}
-
-int OOXMLBooleanValue::getInt() const
-{
- return mbValue ? 1 : 0;
-}
-
-uno::Any OOXMLBooleanValue::getAny() const
-{
- return uno::Any(mbValue);
-}
-
-#ifdef DBG_UTIL
-std::string OOXMLBooleanValue::toString() const
-{
- return mbValue ? "true" : "false";
-}
-#endif
-
-OOXMLValue * OOXMLBooleanValue::clone() const
-{
- return new OOXMLBooleanValue(*this);
-}
-
-/*
- class OOXMLStringValue
-*/
-
-OOXMLStringValue::OOXMLStringValue(OUString sStr)
-: mStr(std::move(sStr))
-{
-}
-
-OOXMLStringValue::~OOXMLStringValue()
-{
-}
-
-uno::Any OOXMLStringValue::getAny() const
-{
- return uno::Any(mStr);
-}
-
-OUString OOXMLStringValue::getString() const
-{
- return mStr;
-}
-
-#ifdef DBG_UTIL
-std::string OOXMLStringValue::toString() const
-{
- return std::string(OUStringToOString(mStr, RTL_TEXTENCODING_ASCII_US));
-}
-#endif
-
-OOXMLValue * OOXMLStringValue::clone() const
-{
- return new OOXMLStringValue(*this);
-}
-
-/*
- class OOXMLInputStreamValue
- */
-OOXMLInputStreamValue::OOXMLInputStreamValue(uno::Reference<io::XInputStream> xInputStream)
-: mxInputStream(std::move(xInputStream))
-{
-}
-
-OOXMLInputStreamValue::~OOXMLInputStreamValue()
-{
-}
-
-uno::Any OOXMLInputStreamValue::getAny() const
-{
- return uno::Any(mxInputStream);
-}
-
-#ifdef DBG_UTIL
-std::string OOXMLInputStreamValue::toString() const
-{
- return "InputStream";
-}
-#endif
-
-OOXMLValue * OOXMLInputStreamValue::clone() const
-{
- return new OOXMLInputStreamValue(mxInputStream);
-}
-
-/**
- class OOXMLPropertySet
-*/
-
-OOXMLPropertySet::OOXMLPropertySet()
-{
-}
-
-OOXMLPropertySet::~OOXMLPropertySet()
-{
-}
-
-void OOXMLPropertySet::resolve(Properties & rHandler)
-{
- // The pProp->resolve(rHandler) call below can cause elements to
- // be appended to mProperties. I don't think it can cause elements
- // to be deleted. But let's check with < here just to be safe that
- // the indexing below works.
- for (size_t nIt = 0; nIt < mProperties.size(); ++nIt)
- {
- OOXMLProperty::Pointer_t pProp = mProperties[nIt];
-
- if (pProp)
- pProp->resolve(rHandler);
- }
-}
-
-OOXMLPropertySet::OOXMLProperties_t::iterator OOXMLPropertySet::begin()
-{
- return mProperties.begin();
-}
-
-OOXMLPropertySet::OOXMLProperties_t::iterator OOXMLPropertySet::end()
-{
- return mProperties.end();
-}
-
-OOXMLPropertySet::OOXMLProperties_t::const_iterator
-OOXMLPropertySet::begin() const
-{
- return mProperties.begin();
-}
-
-OOXMLPropertySet::OOXMLProperties_t::const_iterator
-OOXMLPropertySet::end() const
-{
- return mProperties.end();
-}
-
-void OOXMLPropertySet::add(const OOXMLProperty::Pointer_t& pProperty)
-{
- if (pProperty && pProperty->getId() != 0x0)
- {
- mProperties.push_back(pProperty);
- }
-}
-
-void OOXMLPropertySet::add(Id id, const OOXMLValue::Pointer_t& pValue, OOXMLProperty::Type_t eType)
-{
- OOXMLProperty::Pointer_t pProperty(new OOXMLProperty(id, pValue, eType));
- add(pProperty);
-}
-
-void OOXMLPropertySet::add(const OOXMLPropertySet::Pointer_t& pPropertySet)
-{
- const OOXMLPropertySet * pSet = pPropertySet.get();
-
- if (pSet != nullptr)
- {
- mProperties.insert( mProperties.end(), pSet->mProperties.begin(), pSet->mProperties.end() );
- }
-}
-
-OOXMLPropertySet * OOXMLPropertySet::clone() const
-{
- return new OOXMLPropertySet(*this);
-}
-
-#ifdef DBG_UTIL
-std::string OOXMLPropertySet::toString()
-{
- std::string sResult = "[";
- char sBuffer[256];
- snprintf(sBuffer, sizeof(sBuffer), "%p", this);
- sResult += sBuffer;
- sResult += ":";
-
- OOXMLProperties_t::iterator aItBegin = begin();
- OOXMLProperties_t::iterator aItEnd = end();
-
- for (OOXMLProperties_t::iterator aIt = aItBegin; aIt != aItEnd; ++aIt)
- {
- if (aIt != aItBegin)
- sResult += ", ";
-
- if (*aIt)
- sResult += (*aIt)->toString();
- else
- sResult += "0x0";
- }
-
- sResult += "]";
-
- return sResult;
-}
-#endif
-
-/*
- class OOXMLPropertySetValue
-*/
-
-OOXMLPropertySetValue::OOXMLPropertySetValue(OOXMLPropertySet::Pointer_t pPropertySet)
- : mpPropertySet(std::move(pPropertySet))
-{
-}
-
-OOXMLPropertySetValue::~OOXMLPropertySetValue()
-{
-}
-
-writerfilter::Reference<Properties>::Pointer_t OOXMLPropertySetValue::getProperties()
-{
- return writerfilter::Reference<Properties>::Pointer_t
- (mpPropertySet->clone());
-}
-
-#ifdef DBG_UTIL
-std::string OOXMLPropertySetValue::toString() const
-{
- char sBuffer[256];
-
- snprintf(sBuffer, sizeof(sBuffer), "t:%p, m:%p", this, mpPropertySet.get());
-
- return "OOXMLPropertySetValue(" + std::string(sBuffer) + ")";
-}
-#endif
-
-OOXMLValue * OOXMLPropertySetValue::clone() const
-{
- return new OOXMLPropertySetValue(*this);
-}
-
-/*
- class OOXMLIntegerValue
-*/
-
-OOXMLValue::Pointer_t OOXMLIntegerValue::Create(sal_Int32 nValue)
-{
- static OOXMLValue::Pointer_t Zero(new OOXMLIntegerValue (0));
- static OOXMLValue::Pointer_t One(new OOXMLIntegerValue (1));
- static OOXMLValue::Pointer_t Two(new OOXMLIntegerValue (2));
- static OOXMLValue::Pointer_t Three(new OOXMLIntegerValue (3));
- static OOXMLValue::Pointer_t Four(new OOXMLIntegerValue (4));
- static OOXMLValue::Pointer_t Five(new OOXMLIntegerValue (5));
- static OOXMLValue::Pointer_t Six(new OOXMLIntegerValue (6));
- static OOXMLValue::Pointer_t Seven(new OOXMLIntegerValue (7));
- static OOXMLValue::Pointer_t Eight(new OOXMLIntegerValue (8));
- static OOXMLValue::Pointer_t Nine(new OOXMLIntegerValue (9));
-
- switch (nValue) {
- case 0: return Zero;
- case 1: return One;
- case 2: return Two;
- case 3: return Three;
- case 4: return Four;
- case 5: return Five;
- case 6: return Six;
- case 7: return Seven;
- case 8: return Eight;
- case 9: return Nine;
- default: break;
- }
-
- OOXMLValue::Pointer_t value(new OOXMLIntegerValue(nValue));
-
- return value;
-}
-
-OOXMLIntegerValue::OOXMLIntegerValue(sal_Int32 nValue)
-: mnValue(nValue)
-{
-}
-
-OOXMLIntegerValue::~OOXMLIntegerValue()
-{
-}
-
-int OOXMLIntegerValue::getInt() const
-{
- return mnValue;
-}
-
-uno::Any OOXMLIntegerValue::getAny() const
-{
- return uno::Any(mnValue);
-}
-
-OOXMLValue * OOXMLIntegerValue::clone() const
-{
- return new OOXMLIntegerValue(*this);
-}
-
-#ifdef DBG_UTIL
-std::string OOXMLIntegerValue::toString() const
-{
- char buffer[256];
- snprintf(buffer, sizeof(buffer), "%" SAL_PRIdINT32, mnValue);
-
- return buffer;
-}
-#endif
-
-/*
- class OOXMLHexValue
-*/
-
-OOXMLHexValue::OOXMLHexValue(sal_uInt32 nValue)
-: mnValue(nValue)
-{
-}
-
-OOXMLHexValue::OOXMLHexValue(std::string_view pValue)
-: mnValue(o3tl::toUInt32(pValue, 16))
-{
-}
-
-OOXMLHexValue::~OOXMLHexValue()
-{
-}
-
-int OOXMLHexValue::getInt() const
-{
- return mnValue;
-}
-
-OOXMLValue * OOXMLHexValue::clone() const
-{
- return new OOXMLHexValue(*this);
-}
-
-#ifdef DBG_UTIL
-std::string OOXMLHexValue::toString() const
-{
- char buffer[256];
- snprintf(buffer, sizeof(buffer), "0x%" SAL_PRIxUINT32, mnValue);
-
- return buffer;
-}
-#endif
-
-/*
- class OOXMLHexColorValue
-*/
-OOXMLHexColorValue::OOXMLHexColorValue(std::string_view pValue)
- : OOXMLHexValue(sal_uInt32(COL_AUTO))
-{
- if (pValue == "auto")
- return;
-
- mnValue = o3tl::toUInt32(pValue, 16);
-
- // Convert hash-encoded values (like #FF0080)
- const sal_Int32 nLen = pValue.size();
- if ( !mnValue && nLen > 1 && pValue[0] == '#' )
- {
- sal_Int32 nColor(COL_AUTO);
- // Word appears to require strict 6 digit length, else it ignores it
- if ( nLen == 7 )
- {
- const OUString sHashColor(pValue.data(), nLen, RTL_TEXTENCODING_ASCII_US);
- sax::Converter::convertColor( nColor, sHashColor );
- }
- mnValue = nColor;
- }
-}
-
-// OOXMLUniversalMeasureValue
-// ECMA-376 5th ed. Part 1 , 22.9.2.15
-OOXMLUniversalMeasureValue::OOXMLUniversalMeasureValue(std::string_view pValue, sal_uInt32 npPt)
-{
- double val = o3tl::toDouble(pValue); // will ignore the trailing unit
-
- if (pValue.ends_with("pt"))
- {
- val *= npPt;
- }
- else if (pValue.ends_with("cm"))
- {
- val = o3tl::convert(val, o3tl::Length::cm, o3tl::Length::pt) * npPt;
- }
- else if (pValue.ends_with("mm"))
- {
- val = o3tl::convert(val, o3tl::Length::mm, o3tl::Length::pt) * npPt;
- }
- else if (pValue.ends_with("in"))
- {
- val = o3tl::convert(val, o3tl::Length::in, o3tl::Length::pt) * npPt;
- }
- else if (pValue.ends_with("pc") || pValue.ends_with("pi"))
- {
- val = o3tl::convert(val, o3tl::Length::pc, o3tl::Length::pt) * npPt;
- }
-
- mnValue = std::round(val);
-}
-
-OOXMLUniversalMeasureValue::~OOXMLUniversalMeasureValue()
-{
-}
-
-int OOXMLUniversalMeasureValue::getInt() const
-{
- return mnValue;
-}
-
-#ifdef DBG_UTIL
-std::string OOXMLUniversalMeasureValue::toString() const
-{
- return std::string(OString::number(mnValue));
-}
-#endif
-
-// OOXMLMeasurementOrPercentValue
-// ECMA-376 5th ed. Part 1 , 17.18.107; 17.18.11
-OOXMLMeasurementOrPercentValue::OOXMLMeasurementOrPercentValue(std::string_view pValue)
-{
- double val = o3tl::toDouble(pValue); // will ignore the trailing unit
-
- int nLen = pValue.size();
- if (nLen > 1 &&
- pValue[nLen - 1] == '%')
- {
- mnValue = static_cast<int>(val * 50);
- }
- else
- {
- mnValue = OOXMLTwipsMeasureValue(pValue).getInt();
- }
-}
-
-int OOXMLMeasurementOrPercentValue::getInt() const
-{
- return mnValue;
-}
-
-#ifdef DBG_UTIL
-std::string OOXMLMeasurementOrPercentValue::toString() const
-{
- return std::string(OString::number(mnValue));
-}
-#endif
-
-/*
- class OOXMLShapeValue
- */
-
-
-OOXMLShapeValue::OOXMLShapeValue(uno::Reference<drawing::XShape> xShape)
-: mrShape(std::move(xShape))
-{
-}
-
-OOXMLShapeValue::~OOXMLShapeValue()
-{
-}
-
-uno::Any OOXMLShapeValue::getAny() const
-{
- return uno::Any(mrShape);
-}
-
-#ifdef DBG_UTIL
-std::string OOXMLShapeValue::toString() const
-{
- return "Shape";
-}
-#endif
-
-OOXMLValue * OOXMLShapeValue::clone() const
-{
- return new OOXMLShapeValue(mrShape);
-}
-
-/*
- class OOXMLStarMathValue
- */
-
-
-OOXMLStarMathValue::OOXMLStarMathValue( uno::Reference< embed::XEmbeddedObject > c )
-: m_component(std::move(c))
-{
-}
-
-OOXMLStarMathValue::~OOXMLStarMathValue()
-{
-}
-
-uno::Any OOXMLStarMathValue::getAny() const
-{
- return uno::Any(m_component);
-}
-
-#ifdef DBG_UTIL
-std::string OOXMLStarMathValue::toString() const
-{
- return "StarMath";
-}
-#endif
-
-OOXMLValue * OOXMLStarMathValue::clone() const
-{
- return new OOXMLStarMathValue( m_component );
-}
-
-/*
- class OOXMLTableImpl
- */
-
-OOXMLTable::OOXMLTable()
-{
-}
-
-OOXMLTable::~OOXMLTable()
-{
-}
-
-
-void OOXMLTable::resolve(Table & rTable)
-{
- Table * pTable = &rTable;
-
- int nPos = 0;
-
- for (const auto& rPropSet : mPropertySets)
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties
- (rPropSet->getProperties());
-
- if (pProperties)
- pTable->entry(nPos, pProperties);
-
- ++nPos;
- }
-}
-
-void OOXMLTable::add(const ValuePointer_t& pPropertySet)
-{
- if (pPropertySet)
- mPropertySets.push_back(pPropertySet);
-}
-
-OOXMLTable * OOXMLTable::clone() const
-{
- return new OOXMLTable(*this);
-}
-
-/*
- class: OOXMLPropertySetEntryToString
-*/
-
-OOXMLPropertySetEntryToString::OOXMLPropertySetEntryToString(Id nId)
-: mnId(nId)
-{
-}
-
-OOXMLPropertySetEntryToString::~OOXMLPropertySetEntryToString()
-{
-}
-
-void OOXMLPropertySetEntryToString::sprm(Sprm & /*rSprm*/)
-{
-}
-
-void OOXMLPropertySetEntryToString::attribute(Id nId, Value & rValue)
-{
- if (nId == mnId)
- mStr = rValue.getString();
-}
-
-/*
- class: OOXMLPropertySetEntryToInteger
-*/
-
-OOXMLPropertySetEntryToInteger::OOXMLPropertySetEntryToInteger(Id nId)
-: mnId(nId), mnValue(0)
-{
-}
-
-OOXMLPropertySetEntryToInteger::~OOXMLPropertySetEntryToInteger()
-{
-}
-
-void OOXMLPropertySetEntryToInteger::sprm(Sprm & /*rSprm*/)
-{
-}
-
-void OOXMLPropertySetEntryToInteger::attribute(Id nId, Value & rValue)
-{
- if (nId == mnId)
- mnValue = rValue.getInt();
-}
-
-/*
- class: OOXMLPropertySetEntryToBool
-*/
-
-OOXMLPropertySetEntryToBool::OOXMLPropertySetEntryToBool(Id nId)
- : mnId(nId), mValue(false)
-{}
-
-OOXMLPropertySetEntryToBool::~OOXMLPropertySetEntryToBool() {}
-
-void OOXMLPropertySetEntryToBool::sprm(Sprm & /*rSprm*/) {}
-
-void OOXMLPropertySetEntryToBool::attribute(Id nId, Value & rValue)
-{
- if (nId == mnId)
- mValue = (rValue.getInt() != 0);
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLPropertySet.hxx b/writerfilter/source/ooxml/OOXMLPropertySet.hxx
deleted file mode 100644
index 465873963a78..000000000000
--- a/writerfilter/source/ooxml/OOXMLPropertySet.hxx
+++ /dev/null
@@ -1,415 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <vector>
-#include "OOXMLBinaryObjectReference.hxx"
-#include <com/sun/star/embed/XEmbeddedObject.hpp>
-#include <dmapper/resourcemodel.hxx>
-
-namespace writerfilter::ooxml
-{
-class OOXMLValue : public Value
-{
-public:
- typedef tools::SvRef<OOXMLValue> Pointer_t;
- OOXMLValue();
- virtual ~OOXMLValue() override;
-
- OOXMLValue(OOXMLValue const&) = default;
- OOXMLValue(OOXMLValue&&) = default;
- OOXMLValue& operator=(OOXMLValue const&) = default;
- OOXMLValue& operator=(OOXMLValue&&) = default;
-
- virtual int getInt() const override;
- ;
- virtual OUString getString() const override;
- virtual css::uno::Any getAny() const override;
- virtual writerfilter::Reference<Properties>::Pointer_t getProperties() override;
- virtual writerfilter::Reference<BinaryObj>::Pointer_t getBinary() override;
-#ifdef DBG_UTIL
- virtual std::string toString() const override;
-#endif
- virtual OOXMLValue* clone() const;
-};
-
-class OOXMLProperty final : public Sprm
-{
-public:
- typedef tools::SvRef<OOXMLProperty> Pointer_t;
- enum Type_t
- {
- SPRM,
- ATTRIBUTE
- };
-
-private:
- Id mId;
- mutable OOXMLValue::Pointer_t mpValue;
- Type_t meType;
-
-public:
- OOXMLProperty(Id id, OOXMLValue::Pointer_t pValue, Type_t eType);
- OOXMLProperty(const OOXMLProperty& rSprm) = delete;
- virtual ~OOXMLProperty() override;
-
- sal_uInt32 getId() const override;
- Value::Pointer_t getValue() override;
- writerfilter::Reference<Properties>::Pointer_t getProps() override;
-#ifdef DBG_UTIL
- std::string getName() const override;
- std::string toString() const override;
-#endif
- void resolve(Properties& rProperties);
-};
-
-class OOXMLBinaryValue final : public OOXMLValue
-{
- mutable OOXMLBinaryObjectReference::Pointer_t mpBinaryObj;
-
-public:
- explicit OOXMLBinaryValue(OOXMLBinaryObjectReference::Pointer_t pBinaryObj);
- virtual ~OOXMLBinaryValue() override;
-
- virtual writerfilter::Reference<BinaryObj>::Pointer_t getBinary() override;
-#ifdef DBG_UTIL
- virtual std::string toString() const override;
-#endif
- virtual OOXMLValue* clone() const override;
-};
-
-bool GetBooleanValue(std::string_view pValue);
-
-class OOXMLBooleanValue final : public OOXMLValue
-{
- bool mbValue;
- explicit OOXMLBooleanValue(bool bValue);
-
-public:
- static OOXMLValue::Pointer_t const& Create(bool bValue);
- static OOXMLValue::Pointer_t const& Create(std::string_view pValue);
-
- virtual ~OOXMLBooleanValue() override;
-
- OOXMLBooleanValue(OOXMLBooleanValue const&) = default;
- OOXMLBooleanValue(OOXMLBooleanValue&&) = default;
- OOXMLBooleanValue& operator=(OOXMLBooleanValue const&) = delete; // due to const mbValue
- OOXMLBooleanValue& operator=(OOXMLBooleanValue&&) = delete; // due to const mbValue
-
- virtual int getInt() const override;
- virtual css::uno::Any getAny() const override;
-#ifdef DBG_UTIL
- virtual std::string toString() const override;
-#endif
- virtual OOXMLValue* clone() const override;
-};
-
-class OOXMLStringValue final : public OOXMLValue
-{
- OUString mStr;
-
-public:
- explicit OOXMLStringValue(OUString sStr);
- virtual ~OOXMLStringValue() override;
-
- OOXMLStringValue(OOXMLStringValue const&) = default;
- OOXMLStringValue(OOXMLStringValue&&) = default;
- OOXMLStringValue& operator=(OOXMLStringValue const&) = delete; // due to const mStr
- OOXMLStringValue& operator=(OOXMLStringValue&&) = delete; // due to const mStr
-
- virtual css::uno::Any getAny() const override;
- virtual OUString getString() const override;
-#ifdef DBG_UTIL
- virtual std::string toString() const override;
-#endif
- virtual OOXMLValue* clone() const override;
-};
-
-class OOXMLInputStreamValue final : public OOXMLValue
-{
- css::uno::Reference<css::io::XInputStream> mxInputStream;
-
-public:
- explicit OOXMLInputStreamValue(css::uno::Reference<css::io::XInputStream> xInputStream);
- virtual ~OOXMLInputStreamValue() override;
-
- virtual css::uno::Any getAny() const override;
-#ifdef DBG_UTIL
- virtual std::string toString() const override;
-#endif
- virtual OOXMLValue* clone() const override;
-};
-
-class OOXMLPropertySet final : public writerfilter::Reference<Properties>
-{
-public:
- typedef std::vector<OOXMLProperty::Pointer_t> OOXMLProperties_t;
- typedef tools::SvRef<OOXMLPropertySet> Pointer_t;
-
-private:
- OOXMLProperties_t mProperties;
- void add(const OOXMLProperty::Pointer_t& pProperty);
-
-public:
- OOXMLPropertySet();
- virtual ~OOXMLPropertySet() override;
-
- OOXMLPropertySet(OOXMLPropertySet const&) = default;
- OOXMLPropertySet(OOXMLPropertySet&&) = default;
- OOXMLPropertySet& operator=(OOXMLPropertySet const&) = default;
- OOXMLPropertySet& operator=(OOXMLPropertySet&&) = default;
-
- void resolve(Properties& rHandler) override;
- void add(Id id, const OOXMLValue::Pointer_t& pValue, OOXMLProperty::Type_t eType);
- void add(const OOXMLPropertySet::Pointer_t& pPropertySet);
- OOXMLPropertySet* clone() const;
-
- OOXMLProperties_t::iterator begin();
- OOXMLProperties_t::iterator end();
- OOXMLProperties_t::const_iterator begin() const;
- OOXMLProperties_t::const_iterator end() const;
-
-#ifdef DBG_UTIL
- std::string toString();
-#endif
-};
-
-class OOXMLValue;
-
-class OOXMLTable final : public writerfilter::Reference<Table>
-{
-public:
- typedef tools::SvRef<OOXMLValue> ValuePointer_t;
- OOXMLTable();
- virtual ~OOXMLTable() override;
-
- OOXMLTable(OOXMLTable const&) = default;
- OOXMLTable(OOXMLTable&&) = default;
- OOXMLTable& operator=(OOXMLTable const&) = default;
- OOXMLTable& operator=(OOXMLTable&&) = default;
-
- void resolve(Table& rTable) override;
- void add(const ValuePointer_t& pPropertySet);
- OOXMLTable* clone() const;
-
-private:
- typedef std::vector<ValuePointer_t> PropertySets_t;
- PropertySets_t mPropertySets;
-};
-
-class OOXMLPropertySetValue final : public OOXMLValue
-{
- OOXMLPropertySet::Pointer_t mpPropertySet;
-
-public:
- explicit OOXMLPropertySetValue(OOXMLPropertySet::Pointer_t pPropertySet);
- virtual ~OOXMLPropertySetValue() override;
-
- OOXMLPropertySetValue(OOXMLPropertySetValue const&) = default;
- OOXMLPropertySetValue(OOXMLPropertySetValue&&) = default;
- OOXMLPropertySetValue& operator=(OOXMLPropertySetValue const&)
- = delete; // due to const mpPropertySet
- OOXMLPropertySetValue& operator=(OOXMLPropertySetValue&&)
- = delete; // due to const mpPropertySet
-
- virtual writerfilter::Reference<Properties>::Pointer_t getProperties() override;
-#ifdef DBG_UTIL
- virtual std::string toString() const override;
-#endif
- virtual OOXMLValue* clone() const override;
-};
-
-class OOXMLIntegerValue final : public OOXMLValue
-{
- sal_Int32 mnValue;
- explicit OOXMLIntegerValue(sal_Int32 nValue);
-
-public:
- static OOXMLValue::Pointer_t Create(sal_Int32 nValue);
- virtual ~OOXMLIntegerValue() override;
-
- OOXMLIntegerValue(OOXMLIntegerValue const&) = default;
- OOXMLIntegerValue(OOXMLIntegerValue&&) = default;
- OOXMLIntegerValue& operator=(OOXMLIntegerValue const&) = delete; // due to const mnValue
- OOXMLIntegerValue& operator=(OOXMLIntegerValue&&) = delete; // due to const mnValue
-
- virtual int getInt() const override;
- virtual css::uno::Any getAny() const override;
-#ifdef DBG_UTIL
- virtual std::string toString() const override;
-#endif
- virtual OOXMLValue* clone() const override;
-};
-
-class OOXMLHexValue : public OOXMLValue
-{
-protected:
- sal_uInt32 mnValue;
-
-public:
- explicit OOXMLHexValue(sal_uInt32 nValue);
- explicit OOXMLHexValue(std::string_view pValue);
- virtual ~OOXMLHexValue() override;
-
- OOXMLHexValue(OOXMLHexValue const&) = default;
- OOXMLHexValue(OOXMLHexValue&&) = default;
- OOXMLHexValue& operator=(OOXMLHexValue const&) = default;
- OOXMLHexValue& operator=(OOXMLHexValue&&) = default;
-
- virtual int getInt() const override;
-#ifdef DBG_UTIL
- virtual std::string toString() const override;
-#endif
- virtual OOXMLValue* clone() const override;
-};
-
-class OOXMLHexColorValue final : public OOXMLHexValue
-{
-public:
- explicit OOXMLHexColorValue(std::string_view pValue);
-};
-
-class OOXMLUniversalMeasureValue : public OOXMLValue
-{
-private:
- int mnValue;
-
-public:
- OOXMLUniversalMeasureValue(std::string_view pValue, sal_uInt32 npPt);
- virtual ~OOXMLUniversalMeasureValue() override;
-
- OOXMLUniversalMeasureValue(OOXMLUniversalMeasureValue const&) = default;
- OOXMLUniversalMeasureValue(OOXMLUniversalMeasureValue&&) = default;
- OOXMLUniversalMeasureValue& operator=(OOXMLUniversalMeasureValue const&) = default;
- OOXMLUniversalMeasureValue& operator=(OOXMLUniversalMeasureValue&&) = default;
-
- virtual int getInt() const override;
-#ifdef DBG_UTIL
- virtual std::string toString() const override;
-#endif
-};
-
-/// npPt is quotient defining how much units are in 1 pt
-template <sal_uInt32 npPt> class OOXMLNthPtMeasureValue final : public OOXMLUniversalMeasureValue
-{
-public:
- explicit OOXMLNthPtMeasureValue(std::string_view pValue)
- : OOXMLUniversalMeasureValue(pValue, npPt)
- {
- }
- virtual OOXMLValue* clone() const override { return new OOXMLNthPtMeasureValue<npPt>(*this); }
-};
-
-/// Handles OOXML's ST_TwipsMeasure value.
-typedef OOXMLNthPtMeasureValue<20> OOXMLTwipsMeasureValue;
-
-/// Handles OOXML's ST_HpsMeasure value.
-typedef OOXMLNthPtMeasureValue<2> OOXMLHpsMeasureValue;
-
-class OOXMLMeasurementOrPercentValue final : public OOXMLValue
-{
- int mnValue;
-
-public:
- explicit OOXMLMeasurementOrPercentValue(std::string_view pValue);
-
- virtual int getInt() const override;
- virtual OOXMLValue* clone() const override { return new OOXMLMeasurementOrPercentValue(*this); }
-#ifdef DBG_UTIL
- virtual std::string toString() const override;
-#endif
-};
-
-class OOXMLShapeValue final : public OOXMLValue
-{
- css::uno::Reference<css::drawing::XShape> mrShape;
-
-public:
- explicit OOXMLShapeValue(css::uno::Reference<css::drawing::XShape> xShape);
- virtual ~OOXMLShapeValue() override;
-
- virtual css::uno::Any getAny() const override;
-#ifdef DBG_UTIL
- virtual std::string toString() const override;
-#endif
- virtual OOXMLValue* clone() const override;
-};
-
-class OOXMLStarMathValue final : public OOXMLValue
-{
- css::uno::Reference<css::embed::XEmbeddedObject> m_component;
-
-public:
- explicit OOXMLStarMathValue(css::uno::Reference<css::embed::XEmbeddedObject> component);
- virtual ~OOXMLStarMathValue() override;
-
- virtual css::uno::Any getAny() const override;
-#ifdef DBG_UTIL
- virtual std::string toString() const override;
-#endif
- virtual OOXMLValue* clone() const override;
-};
-
-class OOXMLPropertySetEntryToString final : public Properties
-{
- Id mnId;
- OUString mStr;
-
-public:
- explicit OOXMLPropertySetEntryToString(Id nId);
- virtual ~OOXMLPropertySetEntryToString() override;
-
- virtual void sprm(Sprm& rSprm) override;
- virtual void attribute(Id nId, Value& rValue) override;
-
- const OUString& getString() const { return mStr; }
-};
-
-class OOXMLPropertySetEntryToInteger final : public Properties
-{
- Id mnId;
- int mnValue;
-
-public:
- explicit OOXMLPropertySetEntryToInteger(Id nId);
- virtual ~OOXMLPropertySetEntryToInteger() override;
-
- virtual void sprm(Sprm& rSprm) override;
- virtual void attribute(Id nId, Value& rValue) override;
-
- int getValue() const { return mnValue; }
-};
-
-class OOXMLPropertySetEntryToBool final : public Properties
-{
- Id mnId;
- bool mValue;
-
-public:
- explicit OOXMLPropertySetEntryToBool(Id nId);
- virtual ~OOXMLPropertySetEntryToBool() override;
-
- virtual void sprm(Sprm& rSprm) override;
- virtual void attribute(Id nId, Value& rValue) override;
-
- bool getValue() const { return mValue; }
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLStreamImpl.cxx b/writerfilter/source/ooxml/OOXMLStreamImpl.cxx
deleted file mode 100644
index aa2567ad53b2..000000000000
--- a/writerfilter/source/ooxml/OOXMLStreamImpl.cxx
+++ /dev/null
@@ -1,449 +0,0 @@
-/* -*- 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/.
- *
- * 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 "OOXMLStreamImpl.hxx"
-#include <oox/core/fasttokenhandler.hxx>
-
-#include <com/sun/star/embed/XHierarchicalStorageAccess.hpp>
-#include <com/sun/star/uri/UriReferenceFactory.hpp>
-#include <comphelper/storagehelper.hxx>
-#include <utility>
-
-namespace writerfilter::ooxml
-{
-
-using namespace com::sun::star;
-
-OOXMLStreamImpl::OOXMLStreamImpl
-(uno::Reference<uno::XComponentContext> const & xContext,
- uno::Reference<io::XInputStream> xStorageStream,
- StreamType_t nType, bool bRepairStorage)
-: mxContext(xContext), mxStorageStream(std::move(xStorageStream)), mnStreamType(nType)
-{
- mxStorage.set
- (comphelper::OStorageHelper::GetStorageOfFormatFromInputStream
- (OFOPXML_STORAGE_FORMAT_STRING, mxStorageStream, xContext, bRepairStorage));
- mxRelationshipAccess.set(mxStorage, uno::UNO_QUERY_THROW);
-
- init();
-}
-
-OOXMLStreamImpl::OOXMLStreamImpl
-(OOXMLStreamImpl const & rOOXMLStream, StreamType_t nStreamType)
-: mxContext(rOOXMLStream.mxContext),
- mxStorageStream(rOOXMLStream.mxStorageStream),
- mxStorage(rOOXMLStream.mxStorage),
- mnStreamType(nStreamType),
- msPath(rOOXMLStream.msPath)
-{
- mxRelationshipAccess.set(rOOXMLStream.mxDocumentStream, uno::UNO_QUERY_THROW);
-
- init();
-}
-
-OOXMLStreamImpl::OOXMLStreamImpl
-(OOXMLStreamImpl const & rOOXMLStream, OUString sId)
-: mxContext(rOOXMLStream.mxContext),
- mxStorageStream(rOOXMLStream.mxStorageStream),
- mxStorage(rOOXMLStream.mxStorage),
- mnStreamType(UNKNOWN),
- msId(std::move(sId)),
- msPath(rOOXMLStream.msPath)
-{
- mxRelationshipAccess.set(rOOXMLStream.mxDocumentStream, uno::UNO_QUERY_THROW);
-
- init();
-}
-
-OOXMLStreamImpl::~OOXMLStreamImpl()
-{
-}
-
-const OUString & OOXMLStreamImpl::getTarget() const
-{
- return msTarget;
-}
-
-bool OOXMLStreamImpl::lcl_getTarget(const uno::Reference<embed::XRelationshipAccess>&
- xRelationshipAccess,
- StreamType_t nStreamType,
- const OUString & rId,
- OUString & rDocumentTarget)
-{
- static const char sId[] = "Id";
- static const char sTarget[] = "Target";
- static const char sTargetMode[] = "TargetMode";
- static const char sExternal[] = "External";
- if (maIdCache.empty())
- {
- // Cache is empty? Then let's build it!
- const uno::Sequence< uno::Sequence<beans::StringPair> >aSeqs = xRelationshipAccess->getAllRelationships();
- for (const uno::Sequence<beans::StringPair>& rSeq : aSeqs)
- {
- OUString aId;
- OUString aTarget;
- bool bExternal = false;
- for (const beans::StringPair& rPair : rSeq)
- {
- if (rPair.First == sId)
- aId = rPair.Second;
- else if (rPair.First == sTarget)
- aTarget = rPair.Second;
- else if (rPair.First == sTargetMode && rPair.Second == sExternal)
- bExternal = true;
- }
- // Only cache external targets, internal ones are more complex (see below)
- if (bExternal || aTarget.startsWith("#"))
- maIdCache[aId] = aTarget;
- }
- }
-
- if (maIdCache.find(rId) != maIdCache.end())
- {
- rDocumentTarget = maIdCache[rId];
- return true;
- }
-
- bool bFound = false;
- static uno::Reference<uri::XUriReferenceFactory> xFac = uri::UriReferenceFactory::create(mxContext);
- // use '/' to representent the root of the zip package ( and provide a 'file' scheme to
- // keep the XUriReference implementation happy )
- // add mspath to represent the 'source' of this stream
- uno::Reference<uri::XUriReference> xBase = xFac->parse("file:///" + msPath);
-
- static const char sType[] = "Type";
- static constexpr OUStringLiteral sDocumentType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
- static constexpr OUStringLiteral sStylesType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";
- static constexpr OUStringLiteral sNumberingType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering";
- static constexpr OUStringLiteral sFonttableType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable";
- static constexpr OUStringLiteral sFootnotesType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes";
- static constexpr OUStringLiteral sEndnotesType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes";
- static constexpr OUStringLiteral sCommentsType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments";
- static constexpr OUStringLiteral sThemeType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme";
- static constexpr OUString sCustomType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml"_ustr;
- static constexpr OUStringLiteral sCustomPropsType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps";
- static constexpr OUStringLiteral sGlossaryType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/glossaryDocument";
- static constexpr OUStringLiteral sWebSettings = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings";
- static constexpr OUStringLiteral sSettingsType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings";
- static constexpr OUString sChartType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart"_ustr;
- static constexpr OUString sEmbeddingsType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"_ustr;
- static constexpr OUString sFooterType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer"_ustr;
- static constexpr OUString sHeaderType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/header"_ustr;
- static constexpr OUStringLiteral sOleObjectType = u"http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject";
- static constexpr OUString sCommentsExtendedType = u"http://schemas.microsoft.com/office/2011/relationships/commentsExtended"_ustr;
- // OOXML strict
- static constexpr OUStringLiteral sDocumentTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/officeDocument";
- static constexpr OUStringLiteral sStylesTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/styles";
- static constexpr OUStringLiteral sNumberingTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/numbering";
- static constexpr OUStringLiteral sFonttableTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/fontTable";
- static constexpr OUStringLiteral sFootnotesTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/footnotes";
- static constexpr OUStringLiteral sEndnotesTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/endnotes";
- static constexpr OUStringLiteral sCommentsTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/comments";
- static constexpr OUStringLiteral sThemeTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/theme";
- static constexpr OUStringLiteral sCustomTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/customXml";
- static constexpr OUStringLiteral sCustomPropsTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/customXmlProps";
- static constexpr OUStringLiteral sGlossaryTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/glossaryDocument";
- static constexpr OUStringLiteral sWebSettingsStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/webSettings";
- static constexpr OUStringLiteral sSettingsTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/settings";
- static constexpr OUStringLiteral sChartTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/chart";
- static constexpr OUStringLiteral sEmbeddingsTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/package";
- static constexpr OUStringLiteral sFootersTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/footer";
- static constexpr OUStringLiteral sHeaderTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/header";
- static constexpr OUStringLiteral sOleObjectTypeStrict = u"http://purl.oclc.org/ooxml/officeDocument/relationships/oleObject";
- static constexpr OUString sVBAProjectType = u"http://schemas.microsoft.com/office/2006/relationships/vbaProject"_ustr;
- static constexpr OUString sVBADataType = u"http://schemas.microsoft.com/office/2006/relationships/wordVbaData"_ustr;
-
- OUString sStreamType;
- OUString sStreamTypeStrict;
-
- switch (nStreamType)
- {
- case VBAPROJECT:
- sStreamType = sVBAProjectType;
- sStreamTypeStrict = sVBAProjectType;
- break;
- case VBADATA:
- sStreamType = sVBADataType;
- sStreamTypeStrict = sVBADataType;
- break;
- case DOCUMENT:
- sStreamType = sDocumentType;
- sStreamTypeStrict = sDocumentTypeStrict;
- break;
- case STYLES:
- sStreamType = sStylesType;
- sStreamTypeStrict = sStylesTypeStrict;
- break;
- case NUMBERING:
- sStreamType = sNumberingType;
- sStreamTypeStrict = sNumberingTypeStrict;
- break;
- case FONTTABLE:
- sStreamType = sFonttableType;
- sStreamTypeStrict = sFonttableTypeStrict;
- break;
- case FOOTNOTES:
- sStreamType = sFootnotesType;
- sStreamTypeStrict = sFootnotesTypeStrict;
- break;
- case ENDNOTES:
- sStreamType = sEndnotesType;
- sStreamTypeStrict = sEndnotesTypeStrict;
- break;
- case COMMENTS:
- sStreamType = sCommentsType;
- sStreamTypeStrict = sCommentsTypeStrict;
- break;
- case THEME:
- sStreamType = sThemeType;
- sStreamTypeStrict = sThemeTypeStrict;
- break;
- case CUSTOMXML:
- sStreamType = sCustomType;
- sStreamTypeStrict = sCustomTypeStrict;
- break;
- case CUSTOMXMLPROPS:
- sStreamType = sCustomPropsType;
- sStreamTypeStrict = sCustomPropsTypeStrict;
- break;
- case SETTINGS:
- sStreamType = sSettingsType;
- sStreamTypeStrict = sSettingsTypeStrict;
- break;
- case GLOSSARY:
- sStreamType = sGlossaryType;
- sStreamTypeStrict = sGlossaryTypeStrict;
- break;
- case WEBSETTINGS:
- sStreamType = sWebSettings;
- sStreamTypeStrict = sWebSettingsStrict;
- break;
- case CHARTS:
- sStreamType = sChartType;
- sStreamTypeStrict = sChartTypeStrict;
- break;
- case EMBEDDINGS:
- sStreamType = sEmbeddingsType;
- sStreamTypeStrict = sEmbeddingsTypeStrict;
- break;
- case FOOTER:
- sStreamType = sFooterType;
- sStreamTypeStrict = sFootersTypeStrict;
- break;
- case HEADER:
- sStreamType = sHeaderType;
- sStreamTypeStrict = sHeaderTypeStrict;
- break;
- case COMMENTS_EXTENDED:
- sStreamType = sCommentsExtendedType;
- sStreamTypeStrict = sCommentsExtendedType;
- break;
- default:
- break;
- }
-
- if (xRelationshipAccess.is())
- {
- const uno::Sequence< uno::Sequence< beans::StringPair > >aSeqs =
- xRelationshipAccess->getAllRelationships();
-
- for (const uno::Sequence< beans::StringPair > &rSeq : aSeqs)
- {
- bool bExternalTarget = false;
- OUString sMyTarget;
- for (const beans::StringPair &rPair : rSeq)
- {
- if (rPair.First == sType &&
- ( rPair.Second == sStreamType ||
- rPair.Second == sStreamTypeStrict ))
- bFound = true;
- else if(rPair.First == sType &&
- ((rPair.Second == sOleObjectType ||
- rPair.Second == sOleObjectTypeStrict) &&
- nStreamType == EMBEDDINGS))
- {
- bFound = true;
- }
- else if (rPair.First == sId &&
- rPair.Second == rId)
- bFound = true;
- else if (rPair.First == sTarget)
- {
- // checking item[n].xml is not visited already.
- if(customTarget != rPair.Second && (sStreamType == sCustomType || sStreamType == sChartType || sStreamType == sFooterType || sStreamType == sHeaderType))
- {
- bFound = false;
- }
- else
- {
- sMyTarget = rPair.Second;
- }
- }
- else if (rPair.First == sTargetMode &&
- rPair.Second == sExternal)
- bExternalTarget = true;
- }
-
- if (bFound)
- {
- if (bExternalTarget)
- rDocumentTarget = sMyTarget;
- else
- {
- // 'Target' is a relative Uri, so a 'Target=/path'
- // with a base Uri of file://base/foo will resolve to
- // file://base/word. We need something more than some
- // simple string concatenation here to handle that.
- uno::Reference<uri::XUriReference> xPart = xFac->parse(sMyTarget);
- uno::Reference<uri::XUriReference> xAbs = xFac->makeAbsolute(xBase, xPart, true, uri::RelativeUriExcessParentSegments_RETAIN);
- if (!xAbs)
- {
- //it was invalid gibberish
- bFound = false;
- }
- else
- {
- rDocumentTarget = xAbs->getPath();
- // path will start with the fragment separator. need to
- // remove that
- rDocumentTarget = rDocumentTarget.copy( 1 );
- if(sStreamType == sEmbeddingsType)
- embeddingsTarget = rDocumentTarget;
- }
- }
-
- break;
- }
- }
- }
-
- return bFound;
-}
-
-OUString OOXMLStreamImpl::getTargetForId(const OUString & rId)
-{
- OUString sTarget;
-
- uno::Reference<embed::XRelationshipAccess> xRelationshipAccess
- (mxDocumentStream, uno::UNO_QUERY_THROW);
-
- if (lcl_getTarget(xRelationshipAccess, UNKNOWN, rId, sTarget))
- return sTarget;
-
- return OUString();
-}
-
-void OOXMLStreamImpl::init()
-{
- bool bFound = lcl_getTarget(mxRelationshipAccess,
- mnStreamType, msId, msTarget);
-
- if (!bFound)
- return;
-
- sal_Int32 nLastIndex = msTarget.lastIndexOf('/');
- if (nLastIndex >= 0)
- msPath = msTarget.copy(0, nLastIndex + 1);
-
- uno::Reference<embed::XHierarchicalStorageAccess>
- xHierarchicalStorageAccess(mxStorage, uno::UNO_QUERY);
-
- if (xHierarchicalStorageAccess.is())
- {
- uno::Any aAny(xHierarchicalStorageAccess->
- openStreamElementByHierarchicalName
- (msTarget, embed::ElementModes::SEEKABLEREAD));
- aAny >>= mxDocumentStream;
- // Non-cached ID lookup works by accessing mxDocumentStream as an embed::XRelationshipAccess.
- // So when it changes, we should empty the cache.
- maIdCache.clear();
- }
-}
-
-uno::Reference<io::XInputStream> OOXMLStreamImpl::getDocumentStream()
-{
- uno::Reference<io::XInputStream> xResult;
-
- if (mxDocumentStream.is())
- xResult = mxDocumentStream->getInputStream();
-
- return xResult;
-}
-
-uno::Reference<uno::XComponentContext> OOXMLStreamImpl::getContext()
-{
- return mxContext;
-}
-
-uno::Reference <xml::sax::XFastTokenHandler> OOXMLStreamImpl::getFastTokenHandler()
-{
- if (! mxFastTokenHandler.is())
- mxFastTokenHandler.set(new oox::core::FastTokenHandler());
-
- return mxFastTokenHandler;
-}
-
-OOXMLStream::Pointer_t
-OOXMLDocumentFactory::createStream
-(const uno::Reference<uno::XComponentContext>& xContext,
- const uno::Reference<io::XInputStream>& rStream,
- bool bRepairStorage)
-{
- OOXMLStreamImpl * pStream = new OOXMLStreamImpl(xContext, rStream,
- OOXMLStream::DOCUMENT, bRepairStorage);
- return OOXMLStream::Pointer_t(pStream);
-}
-
-OOXMLStream::Pointer_t
-OOXMLDocumentFactory::createStream
-(const OOXMLStream::Pointer_t& pStream, OOXMLStream::StreamType_t nStreamType)
-{
- OOXMLStream::Pointer_t pRet;
-
- if (nStreamType != OOXMLStream::VBADATA)
- {
- if (OOXMLStreamImpl* pImpl = dynamic_cast<OOXMLStreamImpl *>(pStream.get()))
- pRet = new OOXMLStreamImpl(*pImpl, nStreamType);
- }
- else
- {
- // VBADATA is not a relation of the document, but of the VBAPROJECT stream.
- if (OOXMLStreamImpl* pImpl = dynamic_cast<OOXMLStreamImpl *>(pStream.get()))
- {
- OOXMLStreamImpl aProject(*pImpl, OOXMLStream::VBAPROJECT);
- pRet = new OOXMLStreamImpl(aProject, OOXMLStream::VBADATA);
- }
- }
-
- return pRet;
-}
-
-OOXMLStream::Pointer_t
-OOXMLDocumentFactory::createStream
-(const OOXMLStream::Pointer_t& pStream, const OUString & rId)
-{
- OOXMLStream::Pointer_t pRet;
- if (OOXMLStreamImpl* pImpl = dynamic_cast<OOXMLStreamImpl *>(pStream.get()))
- pRet = new OOXMLStreamImpl(*pImpl, rId);
- return pRet;
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLStreamImpl.hxx b/writerfilter/source/ooxml/OOXMLStreamImpl.hxx
deleted file mode 100644
index ec65290c6214..000000000000
--- a/writerfilter/source/ooxml/OOXMLStreamImpl.hxx
+++ /dev/null
@@ -1,83 +0,0 @@
-/* -*- 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/.
- *
- * 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 .
- */
-#pragma once
-
-#include <map>
-
-#include <ooxml/OOXMLDocument.hxx>
-#include <com/sun/star/embed/XRelationshipAccess.hpp>
-
-extern OUString customTarget;
-extern OUString embeddingsTarget;
-
-namespace writerfilter::ooxml
-{
-
-class OOXMLStreamImpl : public OOXMLStream
-{
- void init();
-
- css::uno::Reference<css::uno::XComponentContext> mxContext;
- css::uno::Reference<css::io::XInputStream> mxStorageStream;
- css::uno::Reference<css::embed::XStorage> mxStorage;
- css::uno::Reference<css::embed::XRelationshipAccess> mxRelationshipAccess;
- css::uno::Reference<css::io::XStream> mxDocumentStream;
- css::uno::Reference<css::xml::sax::XFastParser> mxFastParser;
- css::uno::Reference<css::xml::sax::XFastTokenHandler> mxFastTokenHandler;
-
- StreamType_t mnStreamType;
-
- OUString msId;
- OUString msPath;
- OUString msTarget;
-
- /// Cache holding an Id <-> Target map of external relations.
- std::map<OUString, OUString> maIdCache;
-
- bool lcl_getTarget(const css::uno::Reference<css::embed::XRelationshipAccess>& xRelationshipAccess,
- StreamType_t nStreamType,
- const OUString & rId,
- OUString & rDocumentTarget);
-public:
- typedef tools::SvRef<OOXMLStreamImpl> Pointer_t;
-
- OOXMLStreamImpl
- (OOXMLStreamImpl const & rStream, StreamType_t nType);
- OOXMLStreamImpl
- (css::uno::Reference<css::uno::XComponentContext> const & xContext,
- css::uno::Reference<css::io::XInputStream> xStorageStream,
- StreamType_t nType, bool bRepairStorage);
- OOXMLStreamImpl(OOXMLStreamImpl const & rStream, OUString aId);
-
- virtual ~OOXMLStreamImpl() override;
-
- virtual css::uno::Reference<css::xml::sax::XFastParser> getFastParser() override;
- virtual css::uno::Reference<css::io::XInputStream> getDocumentStream() override;
- virtual css::uno::Reference<css::uno::XComponentContext> getContext() override;
- virtual OUString getTargetForId(const OUString & rId) override;
- virtual const OUString & getTarget() const override;
-
- virtual css::uno::Reference<css::xml::sax::XFastTokenHandler> getFastTokenHandler() override;
-
- // Giving access to mxDocumentStream. It is needed by resolving custom xml to get list of customxml's used in document.
- const css::uno::Reference<css::io::XStream>& accessDocumentStream() { return mxDocumentStream;}
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/README b/writerfilter/source/ooxml/README
deleted file mode 100644
index c72b341aef65..000000000000
--- a/writerfilter/source/ooxml/README
+++ /dev/null
@@ -1,13 +0,0 @@
-= DOCX tokenizer
-
-== Coding style
-
-This directory uses the PEP 8 (see
-<http://legacy.python.org/dev/peps/pep-0008/>) coding style for Python files.
-Please run
-
-----
-pycodestyle *.py
-----
-
-before committing.
diff --git a/writerfilter/source/ooxml/factory_ns.py b/writerfilter/source/ooxml/factory_ns.py
deleted file mode 100644
index 18b07aba1c62..000000000000
--- a/writerfilter/source/ooxml/factory_ns.py
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/usr/bin/env python
-#
-# 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/.
-#
-
-from xml.dom import minidom
-import sys
-
-
-def createHeader(model, ns):
- nsToken = ns.replace('-', '_')
- print("""
-#ifndef INCLUDED_OOXML_FACTORY_%s_HXX
-#define INCLUDED_OOXML_FACTORY_%s_HXX
-#include "ooxml/OOXMLFactory.hxx"
-#include "OOXMLFactory_generated.hxx"
-#include "oox/token/namespaces.hxx"
-#include "ooxml/resourceids.hxx"
-#include "tools/ref.hxx"
-
-namespace writerfilter {
-namespace ooxml {
-
-/// @cond GENERATED
-""" % (nsToken.upper(), nsToken.upper()))
-
- print("""class OOXMLFactory_%s : public OOXMLFactory_ns
-{
-public:
- typedef tools::SvRef<OOXMLFactory_ns> Pointer_t;
-
- static Pointer_t getInstance();
-
- virtual const AttributeInfo* getAttributeInfoArray(Id nId);
- virtual bool getElementId(Id nDefine, Id nId, ResourceType& rOutResource, Id& rOutElement);
- virtual bool getListValue(Id nId, std::string_view aValue, sal_uInt32& rOutValue);
- virtual Id getResourceId(Id nDefine, sal_Int32 nToken);
-""" % nsToken)
-
- actions = []
- for nsNode in [i for i in model.getElementsByTagName("namespace") if i.getAttribute("name") == ns]:
- for resource in nsNode.getElementsByTagName("resource"):
- for action in [i.getAttribute("name") for i in resource.childNodes if i.nodeType == minidom.Node.ELEMENT_NODE and i.tagName == "action"]:
- if action != "characters" and action not in actions:
- actions.append(action)
- for action in actions:
- print(" void %sAction(OOXMLFastContextHandler* pHandler);" % action)
-
- print("""virtual void charactersAction(OOXMLFastContextHandler* pHandler, const OUString & sText);
- virtual void attributeAction(OOXMLFastContextHandler* pHandler, Token_t nToken, const OOXMLValue::Pointer_t& pValue);
-
- virtual ~OOXMLFactory_%s();
-
-protected:
- static Pointer_t m_pInstance;
-
- OOXMLFactory_%s();
-};
-""" % (nsToken, nsToken))
-
- print("""/// @endcond
-}}
-#endif //INCLUDED_OOXML_FACTORY_%s_HXX""" % nsToken.upper())
-
-
-modelPath = sys.argv[1]
-filePath = sys.argv[2]
-model = minidom.parse(modelPath)
-ns = filePath.split('OOXMLFactory_')[1].split('.hxx')[0]
-createHeader(model, ns)
-
-# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/writerfilter/source/ooxml/factoryimpl.py b/writerfilter/source/ooxml/factoryimpl.py
deleted file mode 100644
index 40618b95faca..000000000000
--- a/writerfilter/source/ooxml/factoryimpl.py
+++ /dev/null
@@ -1,214 +0,0 @@
-#!/usr/bin/env python
-#
-# 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/.
-#
-
-from xml.dom import minidom
-import sys
-
-
-def getElementsByTagNamesNS(parent, ns, names, ret=minidom.NodeList()):
- for node in parent.childNodes:
- if node.nodeType == minidom.Node.ELEMENT_NODE and node.namespaceURI == ns and node.tagName in names:
- ret.append(node)
- getElementsByTagNamesNS(node, ns, names, ret)
- return ret
-
-
-def createFastChildContextFromFactory(model):
- print("""uno::Reference<xml::sax::XFastContextHandler> OOXMLFactory::createFastChildContextFromFactory
-(OOXMLFastContextHandler* pHandler, const OOXMLFactory_ns::Pointer_t& pFactory, Token_t Element)
-{
- uno::Reference <xml::sax::XFastContextHandler> aResult;
- const Id nDefine = pHandler->getDefine();
-
- if (pFactory.get() != NULL)
- {
- ResourceType nResource;
- Id nElementId;
- if (pFactory->getElementId(nDefine, Element, nResource, nElementId))
- {
- const Id nId = pFactory->getResourceId(nDefine, Element);
-
- switch (nResource)
- {""")
- resources = [
- "List", "Integer", "Hex", "HexColor", "String",
- "TwipsMeasure_asSigned", "TwipsMeasure_asZero",
- "HpsMeasure", "Boolean", "MeasurementOrPercent",
- ]
- for resource in [r.getAttribute("resource") for r in model.getElementsByTagName("resource")]:
- if resource not in resources:
- resources.append(resource)
- print(""" case ResourceType::%s:
- aResult.set(OOXMLFastHelper<OOXMLFastContextHandler%s>::createAndSetParentAndDefine(pHandler, Element, nId, nElementId));
- break;""" % (resource, resource))
- print(""" case ResourceType::Any:
- aResult.set(createFastChildContextFromStart(pHandler, Element));
- break;
- default:
- break;
- }
-
- }
- }
-
- return aResult;
-}
-""")
-
-
-def getFactoryForNamespace(model):
- print("""OOXMLFactory_ns::Pointer_t OOXMLFactory::getFactoryForNamespace(Id nId)
-{
- OOXMLFactory_ns::Pointer_t pResult;
-
- switch (oox::getNamespace(nId))
- {""")
-
- for namespace in [ns.getAttribute("name") for ns in model.getElementsByTagName("namespace")]:
- id = namespace.replace('-', '_')
- print(""" case NN_%s:
- pResult = OOXMLFactory_%s::getInstance();
- break;""" % (id, id))
- print(""" default:
- break;
- }
-
- return pResult;
-}
-""")
-
-
-def createFastChildContextFromStart(model):
- print("""uno::Reference<xml::sax::XFastContextHandler> OOXMLFactory::createFastChildContextFromStart
-(OOXMLFastContextHandler* pHandler, Token_t Element)
-{
- uno::Reference<xml::sax::XFastContextHandler> aResult;
- OOXMLFactory_ns::Pointer_t pFactory;
-
-""")
-
- for namespace in [ns.getAttribute("name") for ns in model.getElementsByTagName("namespace")]:
- id = namespace.replace('-', '_')
- print(""" if (!aResult.is())
- {
- pFactory = getFactoryForNamespace(NN_%s);
- aResult.set(createFastChildContextFromFactory(pHandler, pFactory, Element));
- }""" % id)
-
- print("""
- return aResult;
-}
-""")
-
-
-def fastTokenToId(model):
- print("""
-std::string fastTokenToId(sal_uInt32 nToken)
-{
- std::string sResult;
-#ifdef DBG_UTIL
-
- switch (oox::getNamespace(nToken))
- {""")
-
- aliases = []
- for alias in sorted(ooxUrlAliases.values()):
- if alias not in aliases:
- aliases.append(alias)
- print(""" case oox::NMSP_%s:
- sResult += "%s:";
- break;""" % (alias, alias))
- print(""" }
-
- switch (nToken & 0xffff)
- {""")
-
- tokens = [""]
- for token in [t.getAttribute("localname") for t in getElementsByTagNamesNS(model, "http://relaxng.org/ns/structure/1.0", ["element", "attribute"])]:
- if token not in tokens:
- tokens.append(token)
- print(""" case oox::XML_%s:
- sResult += "%s";
- break;""" % (token, token))
-
- print(""" }
-#else
- (void)nToken;
-#endif
- return sResult;
-}
-""")
-
-
-def getFastParser():
- print("""uno::Reference <xml::sax::XFastParser> OOXMLStreamImpl::getFastParser()
-{
- if (!mxFastParser.is())
- {
- mxFastParser = css::xml::sax::FastParser::create(mxContext);
- // the threaded parser is about 20% slower loading writer documents
- css::uno::Reference< css::lang::XInitialization > xInit( mxFastParser, css::uno::UNO_QUERY_THROW );
- css::uno::Sequence< css::uno::Any > args{ css::uno::Any(OUString("DisableThreadedParser")) };
- xInit->initialize(args);
-""")
- for url in sorted(ooxUrlAliases.keys()):
- print(""" mxFastParser->registerNamespace("%s", oox::NMSP_%s);""" % (url, ooxUrlAliases[url]))
- print(""" }
-
- return mxFastParser;
-}
-
-/// @endcond
-}}""")
-
-
-def createImpl(model):
- print("""
-#include <com/sun/star/xml/sax/FastParser.hpp>
-#include <com/sun/star/lang/XInitialization.hpp>
-#include "ooxml/OOXMLFactory.hxx"
-#include "ooxml/OOXMLFastHelper.hxx"
-#include "ooxml/OOXMLStreamImpl.hxx"
-""")
-
- for namespace in [ns.getAttribute("name") for ns in model.getElementsByTagName("namespace")]:
- print('#include "OOXMLFactory_%s.hxx"' % namespace)
-
- print("""namespace writerfilter {
-namespace ooxml {
-
-using namespace com::sun::star;
-
-/// @cond GENERATED
-""")
-
- createFastChildContextFromFactory(model)
- getFactoryForNamespace(model)
- createFastChildContextFromStart(model)
- fastTokenToId(model)
- getFastParser()
-
-
-def parseNamespaces(fro):
- sock = open(fro)
- for i in sock.readlines():
- line = i.strip()
- alias, url = line.split(' ')[1:] # first column is ID, not interesting for us
- ooxUrlAliases[url] = alias
- sock.close()
-
-
-namespacesPath = sys.argv[1]
-ooxUrlAliases = {}
-parseNamespaces(namespacesPath)
-modelPath = sys.argv[2]
-model = minidom.parse(modelPath)
-createImpl(model)
-
-# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/writerfilter/source/ooxml/factoryimpl_ns.py b/writerfilter/source/ooxml/factoryimpl_ns.py
deleted file mode 100644
index d4d5a2f67dc6..000000000000
--- a/writerfilter/source/ooxml/factoryimpl_ns.py
+++ /dev/null
@@ -1,755 +0,0 @@
-#!/usr/bin/env python
-#
-# 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/.
-#
-
-from xml.dom import minidom
-import sys
-
-
-# factoryConstructor
-
-
-def factoryConstructor(nsLabel):
- print("""OOXMLFactory_%s::OOXMLFactory_%s()
-{
-}""" % (nsLabel, nsLabel))
- print()
-
-
-# factoryDestructor
-
-
-def factoryDestructor(nsLabel):
- print("""OOXMLFactory_%s::~OOXMLFactory_%s()
-{
-}""" % (nsLabel, nsLabel))
- print()
-
-
-# factoryGetInstance
-
-
-def factoryGetInstance(nsLabel):
- print("""OOXMLFactory_ns::Pointer_t OOXMLFactory_%s::m_pInstance;
-
-OOXMLFactory_ns::Pointer_t OOXMLFactory_%s::getInstance()
-{
- if (!m_pInstance)
- m_pInstance = new OOXMLFactory_%s();
-
- return m_pInstance;
-}""" % (nsLabel, nsLabel, nsLabel))
- print()
-
-
-# factoryAttributeToResourceMap
-
-
-def nsToLabel(nsNode):
- return nsNode.getAttribute("name").replace('-', '_')
-
-
-def getChildByName(parentNode, childName):
- elementNodes = [i for i in parentNode.childNodes if i.localName == childName]
- assert len(elementNodes) == 1
- return elementNodes[0]
-
-
-def resourceForAttribute(nsNode, attrNode):
- resourceName = ""
-
- for refNode in getChildrenByName(attrNode, "ref"):
- refName = refNode.getAttribute("name")
- for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if i.getAttribute("name") == refName]:
- resourceName = resourceNode.getAttribute("resource")
- break
- if not len(resourceName):
- for define in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == refName]:
- resourceName = resourceForAttribute(nsNode, define)
- break
- if len(resourceName):
- break
-
- if not len(resourceName):
- if len([i for i in attrNode.getElementsByTagName("data") if i.getAttribute("type") in ("base64Binary", "string")]):
- resourceName = "String"
- elif len([i for i in attrNode.getElementsByTagName("data") if i.getAttribute("type") == "boolean"]):
- resourceName = "Boolean"
- elif len([i for i in attrNode.getElementsByTagName("data") if i.getAttribute("type") in ("unsignedInt", "integer", "int")]):
- resourceName = "Integer"
- else:
- dataNodes = attrNode.getElementsByTagName("data")
- if len(dataNodes):
- t = dataNodes[0].getAttribute("type")
- # Denylist existing unexpected data types.
- if t not in ("token", "long", "decimal", "float", "byte", "ST_DecimalNumber", "positiveInteger"):
- raise Exception("unexpected data type: " + dataNodes[0].getAttribute("type"))
- return resourceName
-
-
-def idForNamespace(nsNode):
- return "NN_%s" % nsNode.getAttribute("name").replace('-', '_')
-
-
-def localIdForDefine(defineNode):
- return "DEFINE_%s" % defineNode.getAttribute("name")
-
-
-def idForDefine(nsNode, defineNode):
- return "%s|%s" % (idForNamespace(nsNode), localIdForDefine(defineNode))
-
-
-def fastNamespace(attrNode):
- return "oox::NMSP_%s" % attrNode.getAttribute("prefix")
-
-
-def fastLocalName(attrNode):
- if len(attrNode.getAttribute("localname")):
- return "oox::XML_%s" % attrNode.getAttribute("localname")
- else:
- return "oox::XML_TOKEN_COUNT"
-
-
-def fastToken(attrNode):
- ret = []
- if len(attrNode.getAttribute("prefix")):
- ret.append("%s|" % fastNamespace(attrNode))
- ret.append(fastLocalName(attrNode))
- return "".join(ret)
-
-
-def collectAttributeToResource(nsNode, defineNode):
- ret_dict = {}
- ret_order = []
- for refNode in getChildrenByName(defineNode, "ref"):
- refName = refNode.getAttribute("name")
- parent = refNode.parentNode
- if parent.localName in ("element", "attribute"):
- continue
- for define in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == refName]:
- ret = collectAttributeToResource(nsNode, define)
- ret_dict.update(ret[0])
- ret_order.extend(ret[1])
-
- attrNodes = defineNode.getElementsByTagName("attribute")
- for attrNode in attrNodes:
- attrToken = fastToken(attrNode)
- resourceName = resourceForAttribute(nsNode, attrNode)
- refDefine = "0"
- if len(resourceName):
- for refNode in attrNode.getElementsByTagName("ref"):
- refName = refNode.getAttribute("name")
- for define in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == refName]:
- refDefine = idForDefine(nsNode, define)
- ret_dict[attrToken] = "ResourceType::%s, %s" % (resourceName, refDefine)
- ret_order.append(attrToken)
-
- return [ret_dict, ret_order]
-
-
-def factoryAttributeToResourceMapInner(nsNode, defineNode):
- ret = []
- attributes = collectAttributeToResource(nsNode, defineNode)
- already_used = set()
- for k in attributes[1]:
- if k not in already_used:
- ret.append(" { %s, %s }," % (k, attributes[0][k]))
- already_used.add(k)
-
- return ret
-
-
-def factoryAttributeToResourceMap(nsNode):
- print("""const AttributeInfo* OOXMLFactory_%s::getAttributeInfoArray(Id nId)
-{
- switch (nId)
- {""" % nsToLabel(nsNode))
- for defineNode in getChildrenByName(getChildByName(nsNode, "grammar"), "define"):
- inner = "\n".join(factoryAttributeToResourceMapInner(nsNode, defineNode))
- if len(inner):
- print(" case %s:" % idForDefine(nsNode, defineNode))
- print(" {")
- print(" const static AttributeInfo info[] = {")
- print(inner)
- print(" { -1, ResourceType::NoResource, 0 }")
- print(" };")
- print(" return info;")
- print(" }")
- print(" break;")
-
- print(""" default:
- break;
- }
-
- return NULL;
-}""")
- print()
-
-
-# factoryGetListValue
-
-
-def idToLabel(idName):
- ns, ln = idName.split(':')
- return "NS_%s::LN_%s" % (ns, ln)
-
-
-def appendValueData(values, name, value):
- first = name[0:1]
-
- if first not in values:
- values[first] = []
-
- values[first].append([name, value])
-
-
-def printValueData(values):
- if "" in values:
- output_else = ""
- for i in values[""]:
- print(" %sif (aValue == \"%s\") { rOutValue = %s; return true; }" % (output_else, i[0], i[1]))
- output_else = "else "
- print(" else switch (aValue[0])")
- else:
- print(" if (aValue.empty())")
- print(" return false;")
- print(" switch (aValue[0])")
-
- print(" {")
- for k in sorted(values.keys()):
- if k != "":
- print(" case '%s':" % k)
- output_else = ""
- for i in values[k]:
- print(" %sif (aValue == \"%s\") { rOutValue = %s; }" % (output_else, i[0], i[1]))
- output_else = "else "
- print(" else { return false; }")
- print(" return true;")
- print(" }")
-
-
-def factoryGetListValue(nsNode):
- print("""bool OOXMLFactory_%s::getListValue(Id nId, std::string_view aValue, sal_uInt32& rOutValue)
-{
- (void) aValue;
- (void) rOutValue;
-
- switch (nId)
- {""" % nsToLabel(nsNode))
-
- for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if i.getAttribute("resource") == "List"]:
- print(" case %s:" % idForDefine(nsNode, resourceNode))
- values = {}
- for valueNode in getChildrenByName(resourceNode, "value"):
- valueData = ""
- if len(valueNode.childNodes):
- valueData = valueNode.childNodes[0].data
- appendValueData(values, valueData, idToLabel(valueNode.getAttribute("tokenid")))
- printValueData(values)
- print(" return false;")
-
- print(""" default:
- break;
- }
-
- return false;
-}
-""")
-
-
-# factoryCreateElementMap
-
-
-def contextResource(files, nsNode, refNode):
- refName = refNode.getAttribute("name")
- for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if i.getAttribute("name") == refName]:
- return resourceNode.getAttribute("resource")
-
- for includeNode in getChildrenByName(getChildByName(nsNode, "grammar"), "include"):
- namespaceNode = files[includeNode.getAttribute("href")]
- for resourceNode in [i for i in getChildrenByName(namespaceNode, "resource") if i.getAttribute("name") == refName]:
- return resourceNode.getAttribute("resource")
-
- if refName == "BUILT_IN_ANY_TYPE":
- return "Any"
- else:
- for namespaceNode in getChildrenByName(nsNode.parentNode, "namespace"):
- for resourceNode in [i for i in getChildrenByName(namespaceNode, "resource") if i.getAttribute("name") == refName]:
- return resourceNode.getAttribute("resource")
- return ""
-
-
-def idForRef(nsNode, refNode):
- refName = refNode.getAttribute("name")
- result1 = ""
- for define in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == refName]:
- result1 = idForDefine(nsNode, define)
- if refName == "BUILT_IN_ANY_TYPE":
- return "0"
- elif result1 == "":
- for namespaceNode in getChildrenByName(nsNode.parentNode, "namespace"):
- for define in [i for i in getChildrenByName(getChildByName(namespaceNode, "grammar"), "define") if i.getAttribute("name") == refName]:
- return idForDefine(namespaceNode, define)
- else:
- return result1
-
-
-def factoryCreateElementMapInner(files, nsNode, defineNode, resourceNamespaceNode=None):
- if not resourceNamespaceNode:
- resourceNamespaceNode = nsNode
- ret = {}
- for refNode in defineNode.getElementsByTagName("ref"):
- parent = refNode.parentNode
- if parent.localName in ("element", "attribute"):
- continue
- refName = refNode.getAttribute("name")
-
- block = {}
- for define in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == refName]:
- block = factoryCreateElementMapInner(files, nsNode, define)
-
- if len(block) == 0:
- block1 = {}
- for namespaceNode in getChildrenByName(nsNode.parentNode, "namespace"):
- for define in [i for i in getChildrenByName(getChildByName(namespaceNode, "grammar"), "define") if i.getAttribute("name") == refName]:
- block1.update(factoryCreateElementMapInner(files, namespaceNode, define, nsNode))
- else:
- block1 = block
-
- if len(block1):
- ret.update(block1)
-
- for elementNode in defineNode.getElementsByTagName("element"):
- resource = ""
- for refNode in getChildrenByName(elementNode, "ref"):
- refName = refNode.getAttribute("name")
- resource = contextResource(files, resourceNamespaceNode, refNode)
- if len(resource):
- break
- if len(resource):
- ret[fastToken(elementNode)] = " case %s: rOutResource = ResourceType::%s; rOutElement = %s; break;" % (fastToken(elementNode), resource, idForRef(nsNode, getChildByName(elementNode, "ref")))
-
- return ret
-
-
-def factoryCreateElementMapFromStart(files, nsNode):
- for startNode in getChildrenByName(nsNode, "start"):
- startName = startNode.getAttribute("name")
- block = None
- for defineNode in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == startName]:
- block = factoryCreateElementMapInner(files, nsNode, defineNode)
- print(" /* start: %s*/" % startName)
- if block:
- for k in block.keys():
- print(block[k])
-
-
-def factoryCreateElementMap(files, nsNode):
- print("""bool OOXMLFactory_%s::getElementId(Id nDefine, Id nId, ResourceType& rOutResource, Id& rOutElement)
-{
- (void) rOutResource;
- (void) rOutElement;
-
- switch (nDefine)
- {""" % nsToLabel(nsNode))
-
- for defineNode in getChildrenByName(getChildByName(nsNode, "grammar"), "define"):
- inner = factoryCreateElementMapInner(files, nsNode, defineNode)
- if len(inner):
- print(" case %s:" % idForDefine(nsNode, defineNode))
- print(" switch (nId)")
- print(" {")
- for k in sorted(inner.keys()):
- print(inner[k])
- print(" default: return false;")
- print(" }")
- print(" return true;")
- print(" default:")
- print(" switch (nId)")
- print(" {")
- factoryCreateElementMapFromStart(files, nsNode)
- print(""" default: return false;
- }
- return true;
- }
-}
-""")
-
-
-# factoryActions
-
-
-def charactersActionForValues(nsNode, refNode):
- ret = []
-
- refName = refNode.getAttribute("name")
- for defineNode in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == refName]:
- ret.append(" {")
- ret.append(" // %s" % defineNode.getAttribute("name"))
- for dataNode in getChildrenByName(defineNode, "data"):
- if dataNode.getAttribute("type") == "int":
- ret.append(" OOXMLValue::Pointer_t pValue(new OOXMLIntegerValue(sText));")
- ret.append(" pValueHandler->setValue(pValue);")
- ret.append(" }")
-
- return ret
-
-
-def factoryChooseAction(actionNode):
- ret = []
- extra_space = ""
- if actionNode.hasAttribute("tokenid"):
- ret.append(" if (sal::static_int_cast<Id>(pHandler->getId()) == %s)" % idToLabel(actionNode.getAttribute("tokenid")))
- ret.append(" {")
- extra_space = " "
- for condNode in getChildrenByName(actionNode, "cond"):
- ret.append(" {")
- ret.append(" OOXMLPropertySetEntryToInteger aHandler(%s);" % idToLabel(condNode.getAttribute("tokenid")))
- ret.append(" if (OOXMLFastContextHandlerStream* pStream = dynamic_cast<OOXMLFastContextHandlerStream*>(pHandler))")
- ret.append(" pStream->getPropertySetAttrs()->resolve(aHandler);")
- ret.append("")
- ret.append(" if (sal::static_int_cast<Id>(aHandler.getValue()) == %s)" % idToLabel(condNode.getAttribute("value")))
- ret.append(" {")
- extra_space = " "
-
- if actionNode.getAttribute("action") in ("handleXNotes", "handleHdrFtr", "handleComment", "handlePicture", "handleBreak", "handleOutOfOrderBreak", "handleOLE", "handleFontRel", "handleHyperlinkURL", "handleAltChunk"):
- ret.append(" %sif (OOXMLFastContextHandlerProperties* pProperties = dynamic_cast<OOXMLFastContextHandlerProperties*>(pHandler))" % extra_space)
- ret.append(" %s pProperties->%s();" % (extra_space, actionNode.getAttribute("action")))
- elif actionNode.getAttribute("action") == "propagateCharacterPropertiesAsSet":
- ret.append(" %spHandler->propagateCharacterPropertiesAsSet(%s);" % (extra_space, idToLabel(actionNode.getAttribute("sendtokenid"))))
- elif actionNode.getAttribute("action") in ("startCell", "endCell"):
- ret.append(" %sif (OOXMLFastContextHandlerTextTableCell* pTextTableCell = dynamic_cast<OOXMLFastContextHandlerTextTableCell*>(pHandler))" % extra_space)
- ret.append(" %s pTextTableCell->%s();" % (extra_space, actionNode.getAttribute("action")))
- elif actionNode.getAttribute("action") in ("startRow", "endRow"):
- ret.append(" %sif (OOXMLFastContextHandlerTextTableRow* pTextTableRow = dynamic_cast<OOXMLFastContextHandlerTextTableRow*>(pHandler))" % extra_space)
- ret.append(" %s pTextTableRow->%s();" % (extra_space, actionNode.getAttribute("action")))
- elif actionNode.getAttribute("action") == "handleGridAfter":
- ret.append(" %sif (OOXMLFastContextHandlerValue* pValueHandler = dynamic_cast<OOXMLFastContextHandlerValue*>(pHandler))" % extra_space)
- ret.append(" %s pValueHandler->%s();" % (extra_space, actionNode.getAttribute("action")))
- # tdf#111550
- elif actionNode.getAttribute("action") in ("start_P_Tbl"):
- ret.append(" %sif (OOXMLFastContextHandlerTextTable* pTextTable = dynamic_cast<OOXMLFastContextHandlerTextTable*>(pHandler))" % extra_space)
- ret.append(" %s pTextTable->%s();" % (extra_space, actionNode.getAttribute("action")))
- elif actionNode.getAttribute("action") in ("sendProperty", "handleHyperlink"):
- ret.append(" %sif (OOXMLFastContextHandlerStream* pStream = dynamic_cast<OOXMLFastContextHandlerStream*>(pHandler))" % extra_space)
- ret.append(" %s pStream->%s();" % (extra_space, actionNode.getAttribute("action")))
- elif actionNode.getAttribute("action") == "fieldstart":
- ret.append(" %spHandler->startField();" % (extra_space))
- elif actionNode.getAttribute("action") == "fieldsep":
- ret.append(" %spHandler->fieldSeparator();" % (extra_space))
- elif actionNode.getAttribute("action") == "fieldend":
- ret.append(" %spHandler->endField();" % (extra_space))
- elif actionNode.getAttribute("action") == "fieldlock":
- ret.append(" %s{" % (extra_space))
- ret.append(" %sOOXMLPropertySetEntryToBool aHandler(NS_ooxml::LN_CT_FldChar_fldLock);" % (extra_space))
- ret.append(" %sif (OOXMLFastContextHandlerStream* pStream = dynamic_cast<OOXMLFastContextHandlerStream*>(pHandler))" % (extra_space))
- ret.append(" %spStream->getPropertySetAttrs()->resolve(aHandler);" % (extra_space))
- ret.append(" %sif (aHandler.getValue())" % (extra_space))
- ret.append(" %spHandler->lockField();" % (extra_space))
- ret.append(" %s}" % (extra_space))
- elif actionNode.getAttribute("action") == "fieldlock_simple":
- ret.append(" %s{" % (extra_space))
- ret.append(" %sOOXMLPropertySetEntryToBool aHandler(NS_ooxml::LN_CT_SimpleField_fldLock);" % (extra_space))
- ret.append(" %sif (OOXMLFastContextHandlerStream* pStream = dynamic_cast<OOXMLFastContextHandlerStream*>(pHandler))" % (extra_space))
- ret.append(" %spStream->getPropertySetAttrs()->resolve(aHandler);" % (extra_space))
- ret.append(" %sif (aHandler.getValue())" % (extra_space))
- ret.append(" %spHandler->lockField();" % (extra_space))
- ret.append(" %s}" % (extra_space))
- elif actionNode.getAttribute("action") == "printproperty":
- ret.append(" %sif (OOXMLFastContextHandlerStream* pStream = dynamic_cast<OOXMLFastContextHandlerStream*>(pHandler))" % extra_space)
- ret.append(" %s pStream->sendProperty(%s);" % (extra_space, idToLabel(actionNode.getAttribute("sendtokenid"))))
- elif actionNode.getAttribute("action") == "sendPropertiesWithId":
- ret.append(" %spHandler->sendPropertiesWithId(%s);" % (extra_space, idToLabel(actionNode.getAttribute("sendtokenid"))))
- elif actionNode.getAttribute("action") == "text":
- ret.append(" %spHandler->text(sText);" % (extra_space))
- elif actionNode.getAttribute("action") == "positionOffset":
- ret.append(" %spHandler->positionOffset(sText);" % (extra_space))
- elif actionNode.getAttribute("action") == "positivePercentage":
- ret.append(" %spHandler->positivePercentage(sText);" % (extra_space))
- elif actionNode.getAttribute("action") == "alignH":
- ret.append(" %spHandler->alignH(sText);" % (extra_space))
- elif actionNode.getAttribute("action") == "alignV":
- ret.append(" %spHandler->alignV(sText);" % (extra_space))
- elif actionNode.getAttribute("action") == "tokenproperty":
- ret.append(" %sOOXMLFastHelper<OOXMLIntegerValue>::newProperty(pHandler, %s, pHandler->getToken());" % (extra_space, idToLabel("ooxml:token")))
- else:
- ret.append(" %spHandler->%s();" % (extra_space, actionNode.getAttribute("action")))
-
- for condNode in getChildrenByName(actionNode, "cond"):
- ret.append(" }")
- ret.append(" }")
- if actionNode.hasAttribute("tokenid"):
- ret.append(" }")
-
- return ret
-
-
-def factoryAction(nsNode, action):
- switchblock1 = []
- for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if len([j for j in getChildrenByName(i, "action") if j.getAttribute("name") == action])]:
- switchblock1.append("case %s:" % idForDefine(nsNode, resourceNode))
- for actionNode in [i for i in getChildrenByName(resourceNode, "action") if i.getAttribute("name") == action]:
- switchblock1.extend(factoryChooseAction(actionNode))
- switchblock1.append(" break;")
- switchblock1.append("")
-
- switchblock2 = []
- if action == "characters":
- for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if i.getAttribute("resource") == "Value"]:
- if not len(getChildrenByName(resourceNode, "attribute")):
- resourceName = resourceNode.getAttribute("name")
- switchblock2.append("case %s:" % idForDefine(nsNode, resourceNode))
- ret = []
- for define in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == resourceName]:
- for refNode in getChildrenByName(define, "ref"):
- ret.extend(charactersActionForValues(nsNode, refNode))
- switchblock2.extend(ret)
- switchblock2.append(" break;")
-
- sys.stdout.write("void OOXMLFactory_%s::%sAction(OOXMLFastContextHandler*" % (nsToLabel(nsNode), action))
- if len(switchblock1) or len(switchblock2):
- sys.stdout.write(" pHandler")
- if action == "characters":
- sys.stdout.write(", const OUString&")
- if "sText" in "".join(switchblock1) or "sText" in "".join(switchblock2):
- sys.stdout.write(" sText")
- print(")")
- print("{")
- if len(switchblock1) or len(switchblock2):
- print(" sal_uInt32 nDefine = pHandler->getDefine();")
- if len(switchblock1):
- print(" switch (nDefine)")
- print(" {")
- if switchblock1[-1] == "":
- switchblock1 = switchblock1[:-1]
- sys.stdout.write(" ")
- print("\n ".join(switchblock1))
- print()
- print(" default:")
- print(" break;")
- print(" }")
- if len(switchblock2):
- print(" switch (nDefine)")
- print(" {")
- print("\n ".join(switchblock2))
- print()
- print(" default:")
- print(" break;")
- print(" }")
- print("}")
-
-
-def factoryActions(nsNode):
- actions = []
- for resourceNode in getChildrenByName(nsNode, "resource"):
- for actionNode in getChildrenByName(resourceNode, "action"):
- actionName = actionNode.getAttribute("name")
- if actionName != "characters" and actionName not in actions:
- actions.append(actionName)
- for action in sorted(actions):
- factoryAction(nsNode, action)
- print()
- factoryAction(nsNode, "characters")
- print()
-
-
-# factoryGetResourceId
-
-
-def collectTokenToId(nsNode, defineNode):
- ret = {}
- for refNode in defineNode.getElementsByTagName("ref"):
- refName = refNode.getAttribute("name")
- parent = refNode.parentNode
- if parent.localName in ("element", "attribute"):
- continue
- refblock1 = {}
- for define in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == refName]:
- refblock1.update(collectTokenToId(nsNode, define))
- if not len(refblock1):
- for namespaceNode in getChildrenByName(nsNode.parentNode, "namespace"):
- for define in [i for i in getChildrenByName(getChildByName(namespaceNode, "grammar"), "define") if i.getAttribute("name") == refName]:
- ret.update(collectTokenToId(namespaceNode, define))
- else:
- ret.update(refblock1)
-
- defineName = defineNode.getAttribute("name")
- for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if i.getAttribute("name") == defineName]:
- for node in [i for i in resourceNode.childNodes if i.localName in ("element", "attribute")]:
- if node.hasAttribute("tokenid"):
- ret[fastToken(node)] = idToLabel(node.getAttribute("tokenid"))
-
- return ret
-
-
-def factoryTokenToIdMapInner(nsNode, defineNode):
- ids = collectTokenToId(nsNode, defineNode)
- ret = []
- for i in sorted(ids.keys()):
- ret.append(" case %s: return %s;" % (i, ids[i]))
-
- return ret
-
-
-def factoryGetResourceId(nsNode):
- print("""Id OOXMLFactory_%s::getResourceId(Id nDefine, sal_Int32 nToken)
-{
- (void) nDefine;
- (void) nToken;
-
- switch (nDefine)
- {""" % nsToLabel(nsNode))
- for defineNode in getChildrenByName(getChildByName(nsNode, "grammar"), "define"):
- inner = "\n".join(factoryTokenToIdMapInner(nsNode, defineNode))
- if len(inner):
- print(" case %s:" % idForDefine(nsNode, defineNode))
- print(" switch (nToken)")
- print(" {")
- print(inner)
- print(" }")
- print(" break;")
- print(" default:")
- print(" switch (nToken)")
- print(" {")
- for startNode in getChildrenByName(nsNode, "start"):
- startName = startNode.getAttribute("name")
- for defineNode in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == startName]:
- inner = factoryTokenToIdMapInner(nsNode, defineNode)
- if len(inner):
- print("\n".join(inner))
- print(""" }
- break;
- }
- return 0;
-}
-""")
-
-
-# factoryAttributeAction
-
-
-def factoryAttributeActionDefineInner(nsNode, defineNode):
- ret = []
-
- defineName = defineNode.getAttribute("name")
- block = []
- output_else = ""
- for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if i.getAttribute("name") == defineName]:
- for attributeNode in getChildrenByName(resourceNode, "attribute"):
- if attributeNode.hasAttribute("action"):
- block.append(" %sif (nToken == static_cast<Token_t>(%s))" % (output_else, fastToken(attributeNode)))
- block.append(" pHandler->%s(pValue);" % attributeNode.getAttribute("action"))
- output_else = "else "
- if len(block):
- resource = ""
- for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if i.getAttribute("name") == defineName]:
- resource = resourceNode.getAttribute("resource")
- break
- ret.append(" if (OOXMLFastContextHandler%s* pHandler = dynamic_cast<OOXMLFastContextHandler%s*>(_pHandler))" % (resource, resource))
- ret.append(" {")
- ret.extend(block)
- ret.append(" }")
-
- return ret
-
-
-def factoryAttributeActionInner(nsNode):
- ret = []
-
- for defineNode in getChildrenByName(getChildByName(nsNode, "grammar"), "define"):
- inner = factoryAttributeActionDefineInner(nsNode, defineNode)
- if len(inner):
- ret.append(" case %s:" % idForDefine(nsNode, defineNode))
- ret.extend(inner)
- ret.append(" break;")
-
- return ret
-
-
-def factoryAttributeAction(nsNode):
- nsLabel = nsToLabel(nsNode)
- inner = factoryAttributeActionInner(nsNode)
- if len(inner):
- print("""void OOXMLFactory_%s::attributeAction(OOXMLFastContextHandler* _pHandler, Token_t nToken, const OOXMLValue::Pointer_t& pValue)
-{
- switch (_pHandler->getDefine())
- {""" % nsLabel)
- print("\n".join(inner))
- print(" default:")
- print(" break;")
- print(" }")
- print("}")
- print()
- else:
- print("void OOXMLFactory_%s::attributeAction(OOXMLFastContextHandler*, Token_t, const OOXMLValue::Pointer_t&)" % nsLabel)
- print("{")
- print("}")
- print()
-
-
-# createImpl
-
-
-def getChildrenByName(parentNode, childName):
- return [i for i in parentNode.childNodes if i.localName == childName]
-
-
-def createImpl(modelNode, nsName):
- print("""
-#include "ooxml/resourceids.hxx"
-#include "OOXMLFactory_%s.hxx"
-#include "ooxml/OOXMLFastHelper.hxx"
-#include "oox/token/tokens.hxx"
-
-#ifdef _MSC_VER
-#pragma warning(disable:4060) // switch statement contains no 'case' or 'default' labels
-#pragma warning(disable:4065) // switch statement contains 'default' but no 'case' labels
-#pragma warning(disable:4702) // unreachable code
-#endif
-
-namespace writerfilter {
-namespace ooxml {
-
-using namespace com::sun::star;
-
-/// @cond GENERATED""" % nsName)
- print()
-
- files = {}
- for nsNode in getChildrenByName(modelNode, "namespace"):
- files[nsNode.getAttribute("name")] = nsNode
-
- for nsNode in [i for i in getChildrenByName(modelNode, "namespace") if i.getAttribute("name") == nsName]:
- nsLabel = nsToLabel(nsNode)
-
- factoryConstructor(nsLabel)
- factoryDestructor(nsLabel)
- factoryGetInstance(nsLabel)
- factoryAttributeToResourceMap(nsNode)
- factoryGetListValue(nsNode)
- factoryCreateElementMap(files, nsNode)
- factoryActions(nsNode)
- factoryGetResourceId(nsNode)
- factoryAttributeAction(nsNode)
-
- print("""/// @endcond
-}}""")
-
-
-def main():
- modelPath = sys.argv[1]
- filePath = sys.argv[2]
- modelNode = getChildByName(minidom.parse(modelPath), "model")
- nsName = filePath.split('OOXMLFactory_')[1].split('.cxx')[0]
- createImpl(modelNode, nsName)
-
-
-if __name__ == "__main__":
- main()
-
-# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/writerfilter/source/ooxml/factoryinc.py b/writerfilter/source/ooxml/factoryinc.py
deleted file mode 100644
index ec07f7fda1ce..000000000000
--- a/writerfilter/source/ooxml/factoryinc.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/env python
-#
-# 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/.
-#
-
-from xml.dom import minidom
-import sys
-
-
-def createInclude(model):
- print("""
-#ifndef INCLUDED_OOXML_FACTORY_GENERATED_HXX
-#define INCLUDED_OOXML_FACTORY_GENERATED_HXX
-
-namespace writerfilter {
-namespace ooxml {
-
-/// @cond GENERATED
- """)
-
- # Create namespaces.
- counter = 1
- for namespace in sorted([ns.getAttribute("name") for ns in model.getElementsByTagName("namespace")]):
- print("const Id NN_%s = %s << 16;" % (namespace.replace('-', '_'), counter))
- counter += 1
-
- # Create defines.
- counter = 1
- defines = []
- for define in sorted([ns.getAttribute("name") for ns in model.getElementsByTagName("define")]):
- if define not in defines:
- print("const Id DEFINE_%s = %s;" % (define, counter))
- defines.append(define)
- counter += 1
- print("""/// @endcond
-}}
-
-#endif // INCLUDED_OOXML_FACTORY_GENERATED_HXX""")
-
-
-modelPath = sys.argv[1]
-model = minidom.parse(modelPath)
-createInclude(model)
-
-# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml
deleted file mode 100644
index 2f84e72c0615..000000000000
--- a/writerfilter/source/ooxml/model.xml
+++ /dev/null
@@ -1,19426 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * 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 .
--->
-<model
- xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
- xmlns:adec="http://schemas.microsoft.com/office/drawing/2017/decorative"
- xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart"
- xmlns:dgm="http://schemas.openxmlformats.org/drawingml/2006/diagram"
- xmlns:lc="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas"
- xmlns:o="urn:schemas-microsoft-com:office:office"
- xmlns:p="urn:schemas-microsoft-com:office:powerpoint"
- xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
- xmlns:v="urn:schemas-microsoft-com:vml"
- xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
- xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
- xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
- xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"
- xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
- xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"
- xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"
- xmlns:wvml="urn:schemas-microsoft-com:office:word"
- xmlns:x="urn:schemas-microsoft-com:office:excel"
- xmlns:xml="http://www.w3.org/XML/1998/namespace">
- <token tokenid="ooxml:shape"/>
- <token tokenid="ooxml:token"/>
- <token tokenid="ooxml:inputstream"/>
- <token tokenid="ooxml:trackchange"/>
- <token tokenid="ooxml:object"/>
- <token tokenid="ooxml:tblStart"/>
- <token tokenid="ooxml:tblEnd"/>
- <token tokenid="ooxml:tcStart"/>
- <token tokenid="ooxml:tcEnd"/>
-
- <!-- These are not directly generated from OOXML XML elements / attributes, need to clean them up in the future. -->
- <token tokenid="ooxml:tblDepth"/>
- <token tokenid="ooxml:inTbl"/>
- <token tokenid="ooxml:tblCell"/>
- <token tokenid="ooxml:tblRow"/>
-
- <token tokenid="ooxml:ffdata"/>
- <token tokenid="ooxml:starmath"/>
- <token tokenid="ooxml:blip"/>
- <token tokenid="ooxml:payload"/>
- <token tokenid="ooxml:footnote"/>
- <token tokenid="ooxml:endnote"/>
- <token tokenid="ooxml:annotation"/>
- <token tokenid="ooxml:headerl"/>
- <token tokenid="ooxml:headerr"/>
- <token tokenid="ooxml:headerf"/>
- <token tokenid="ooxml:footerl"/>
- <token tokenid="ooxml:footerr"/>
- <token tokenid="ooxml:footerf"/>
-
- <!-- Present in RTF, but not in OOXML. -->
- <token tokenid="ooxml:CT_Settings_widowControl"/>
- <token tokenid="ooxml:CT_Settings_longerSpaceSequence"/>
-
- <namespace name="dml-stylesheet">
- <start name="theme"/>
- <start name="themeOverride"/>
- <start name="themeManager"/>
- <start name="hlinkClick"/>
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <include href="dml-baseStylesheet"/>
- <!-- start = theme | themeOverride | themeManager | hlinkClick -->
- <define name="CT_EmptyElement">
- </define>
- <define name="CT_ColorMapping">
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="bg1">
- <ref name="ST_ColorSchemeIndex"/>
- </attribute>
- <attribute name="tx1">
- <ref name="ST_ColorSchemeIndex"/>
- </attribute>
- <attribute name="bg2">
- <ref name="ST_ColorSchemeIndex"/>
- </attribute>
- <attribute name="tx2">
- <ref name="ST_ColorSchemeIndex"/>
- </attribute>
- <attribute name="accent1">
- <ref name="ST_ColorSchemeIndex"/>
- </attribute>
- <attribute name="accent2">
- <ref name="ST_ColorSchemeIndex"/>
- </attribute>
- <attribute name="accent3">
- <ref name="ST_ColorSchemeIndex"/>
- </attribute>
- <attribute name="accent4">
- <ref name="ST_ColorSchemeIndex"/>
- </attribute>
- <attribute name="accent5">
- <ref name="ST_ColorSchemeIndex"/>
- </attribute>
- <attribute name="accent6">
- <ref name="ST_ColorSchemeIndex"/>
- </attribute>
- <attribute name="hlink">
- <ref name="ST_ColorSchemeIndex"/>
- </attribute>
- <attribute name="folHlink">
- <ref name="ST_ColorSchemeIndex"/>
- </attribute>
- </define>
- <define name="CT_ColorMappingOverride">
- <choice>
- <element name="masterClrMapping">
- <ref name="CT_EmptyElement"/>
- </element>
- <element name="overrideClrMapping">
- <ref name="CT_ColorMapping"/>
- </element>
- </choice>
- </define>
- <define name="CT_ColorSchemeAndMapping">
- <element name="clrScheme">
- <ref name="CT_ColorScheme"/>
- </element>
- <element name="clrMap">
- <ref name="CT_ColorMapping"/>
- </element>
- </define>
- <define name="CT_ColorSchemeList">
- <element name="extraClrScheme">
- <ref name="CT_ColorSchemeAndMapping"/>
- </element>
- </define>
- <define name="CT_OfficeStyleSheet">
- <element name="themeElements">
- <ref name="CT_BaseStyles"/>
- </element>
- <element name="objectDefaults">
- <ref name="CT_ObjectStyleDefaults"/>
- </element>
- <element name="extraClrSchemeLst">
- <ref name="CT_ColorSchemeList"/>
- </element>
- <element name="custClrLst">
- <ref name="CT_CustomColorList"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="name">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_BaseStylesOverride">
- <element name="clrScheme">
- <ref name="CT_ColorScheme"/>
- </element>
- <element name="fontScheme">
- <ref name="CT_FontScheme"/>
- </element>
- <element name="fmtScheme">
- <ref name="CT_StyleMatrix"/>
- </element>
- </define>
- <define name="CT_ClipboardStyleSheet">
- <element name="themeElements">
- <ref name="CT_BaseStyles"/>
- </element>
- <element name="clrMap">
- <ref name="CT_ColorMapping"/>
- </element>
- </define>
- <define name="CT_Hyperlink">
- <attribute name="r:id">
- <data type="string"/>
- </attribute>
- </define>
- <define name="theme">
- <element name="theme">
- <ref name="CT_OfficeStyleSheet"/>
- </element>
- </define>
- <define name="themeOverride">
- <element name="themeOverride">
- <ref name="CT_BaseStylesOverride"/>
- </element>
- </define>
- <define name="themeManager">
- <element name="themeManager">
- <ref name="CT_EmptyElement"/>
- </element>
- </define>
- <define name="hlinkClick">
- <element name="hlinkClick">
- <ref name="CT_Hyperlink"/>
- </element>
- </define>
- </grammar>
- <resource name="CT_OfficeStyleSheet" resource="Theme" tokenid="ooxml:THEMETABLE"/>
- <resource name="CT_Hyperlink" resource="Properties">
- <attribute name="r:id" tokenid="ooxml:CT_Hyperlink_r_id"/>
- </resource>
- <resource name="theme" resource="Stream">
- <element name="theme" tokenid="ooxml:THEMETABLE"/>
- </resource>
- <resource name="themeOverride" resource="Stream"/>
- <resource name="themeManager" resource="Stream"/>
- <resource name="hlinkClick" resource="Properties">
- <element name="hlinkClick" tokenid="ooxml:hlinkClick_hlinkClick"/>
- </resource>
- </namespace>
- <namespace name="dml-styleDefaults">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <include href="dml-shapeProperties"/>
- <define name="CT_DefaultShapeDefinition">
- <element name="spPr">
- <ref name="CT_ShapeProperties"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- </define>
- <define name="CT_ObjectStyleDefaults">
- <element name="spDef">
- <ref name="CT_DefaultShapeDefinition"/>
- </element>
- <element name="lnDef">
- <ref name="CT_DefaultShapeDefinition"/>
- </element>
- <element name="txDef">
- <ref name="CT_DefaultShapeDefinition"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- </define>
- </grammar>
- </namespace>
- <namespace name="dml-shape3DLighting">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <define name="ST_LightRigDirection">
- <choice>
- <!-- Top Left -->
- <value>tl</value>
- <!-- Top -->
- <value>t</value>
- <!-- Top Right -->
- <value>tr</value>
- <!-- Left -->
- <value>l</value>
- <!-- Right -->
- <value>r</value>
- <!-- Bottom Left -->
- <value>bl</value>
- <!-- Bottom -->
- <value>b</value>
- <!-- Bottom Right -->
- <value>br</value>
- </choice>
- </define>
- <define name="ST_LightRigType">
- <choice>
- <!-- Legacy Flat 1 -->
- <value>legacyFlat1</value>
- <!-- Legacy Flat 2 -->
- <value>legacyFlat2</value>
- <!-- Legacy Flat 3 -->
- <value>legacyFlat3</value>
- <!-- Legacy Flat 4 -->
- <value>legacyFlat4</value>
- <!-- Legacy Normal 1 -->
- <value>legacyNormal1</value>
- <!-- Legacy Normal 2 -->
- <value>legacyNormal2</value>
- <!-- Legacy Normal 3 -->
- <value>legacyNormal3</value>
- <!-- Legacy Normal 4 -->
- <value>legacyNormal4</value>
- <!-- Legacy Harsh 1 -->
- <value>legacyHarsh1</value>
- <!-- Legacy Harsh 2 -->
- <value>legacyHarsh2</value>
- <!-- Legacy Harsh 3 -->
- <value>legacyHarsh3</value>
- <!-- Legacy Harsh 4 -->
- <value>legacyHarsh4</value>
- <!-- Three Point -->
- <value>threePt</value>
- <!-- Light Rig Enum ( Balanced ) -->
- <value>balanced</value>
- <!-- Soft -->
- <value>soft</value>
- <!-- Harsh -->
- <value>harsh</value>
- <!-- Flood -->
- <value>flood</value>
- <!-- Contrasting -->
- <value>contrasting</value>
- <!-- Morning -->
- <value>morning</value>
- <!-- Sunrise -->
- <value>sunrise</value>
- <!-- Sunset -->
- <value>sunset</value>
- <!-- Chilly -->
- <value>chilly</value>
- <!-- Freezing -->
- <value>freezing</value>
- <!-- Flat -->
- <value>flat</value>
- <!-- Two Point -->
- <value>twoPt</value>
- <!-- Glow -->
- <value>glow</value>
- <!-- Bright Room -->
- <value>brightRoom</value>
- </choice>
- </define>
- <define name="CT_LightRig">
- <element name="rot">
- <ref name="CT_SphereCoords"/>
- </element>
- <attribute name="rig">
- <ref name="ST_LightRigType"/>
- </attribute>
- <attribute name="dir">
- <ref name="ST_LightRigDirection"/>
- </attribute>
- </define>
- </grammar>
- <resource name="ST_LightRigDirection" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_LightRigDirection_tl">tl</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigDirection_t">t</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigDirection_tr">tr</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigDirection_l">l</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigDirection_r">r</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigDirection_bl">bl</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigDirection_b">b</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigDirection_br">br</value>
- </resource>
- <resource name="ST_LightRigType" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_legacyFlat1">legacyFlat1</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_legacyFlat2">legacyFlat2</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_legacyFlat3">legacyFlat3</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_legacyFlat4">legacyFlat4</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_legacyNormal1">legacyNormal1</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_legacyNormal2">legacyNormal2</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_legacyNormal3">legacyNormal3</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_legacyNormal4">legacyNormal4</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_legacyHarsh1">legacyHarsh1</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_legacyHarsh2">legacyHarsh2</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_legacyHarsh3">legacyHarsh3</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_legacyHarsh4">legacyHarsh4</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_threePt">threePt</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_balanced">balanced</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_soft">soft</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_harsh">harsh</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_flood">flood</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_contrasting">contrasting</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_morning">morning</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_sunrise">sunrise</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_sunset">sunset</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_chilly">chilly</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_freezing">freezing</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_flat">flat</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_twoPt">twoPt</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_glow">glow</value>
- <value tokenid="ooxml:Value_drawingml_ST_LightRigType_brightRoom">brightRoom</value>
- </resource>
- </namespace>
- <namespace name="dml-shape3DScene">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <include href="dml-shape3DCamera"/>
- <include href="dml-shape3DLighting"/>
- <define name="CT_Scene3D">
- <element name="camera">
- <ref name="CT_Camera"/>
- </element>
- <element name="lightRig">
- <ref name="CT_LightRig"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- </define>
- </grammar>
- </namespace>
- <namespace name="dml-shape3DStyles">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <include href="dml-shapeGeometry"/>
- <define name="ST_BevelPresetType">
- <choice>
- <!-- Relaxed Inset -->
- <value>relaxedInset</value>
- <!-- Circle -->
- <value>circle</value>
- <!-- Slope -->
- <value>slope</value>
- <!-- Cross -->
- <value>cross</value>
- <!-- Angle -->
- <value>angle</value>
- <!-- Soft Round -->
- <value>softRound</value>
- <!-- Convex -->
- <value>convex</value>
- <!-- Cool Slant -->
- <value>coolSlant</value>
- <!-- Divot -->
- <value>divot</value>
- <!-- Riblet -->
- <value>riblet</value>
- <!-- Hard Edge -->
- <value>hardEdge</value>
- <!-- Art Deco -->
- <value>artDeco</value>
- </choice>
- </define>
- <define name="CT_Bevel">
- <attribute name="w">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="h">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="prst">
- <ref name="ST_BevelPresetType"/>
- </attribute>
- </define>
- <define name="ST_PresetMaterialType">
- <choice>
- <!-- Legacy Matte -->
- <value>legacyMatte</value>
- <!-- Legacy Plastic -->
- <value>legacyPlastic</value>
- <!-- Legacy Metal -->
- <value>legacyMetal</value>
- <!-- Legacy Wireframe -->
- <value>legacyWireframe</value>
- <!-- Matte -->
- <value>matte</value>
- <!-- Plastic -->
- <value>plastic</value>
- <!-- Metal -->
- <value>metal</value>
- <!-- Warm Matte -->
- <value>warmMatte</value>
- <!-- Translucent Powder -->
- <value>translucentPowder</value>
- <!-- Powder -->
- <value>powder</value>
- <!-- Dark Edge -->
- <value>dkEdge</value>
- <!-- Soft Edge -->
- <value>softEdge</value>
- <!-- Clear -->
- <value>clear</value>
- <!-- Flat -->
- <value>flat</value>
- <!-- Soft Metal -->
- <value>softmetal</value>
- </choice>
- </define>
- <define name="CT_Shape3D">
- <element name="bevelT">
- <ref name="CT_Bevel"/>
- </element>
- <element name="bevelB">
- <ref name="CT_Bevel"/>
- </element>
- <element name="extrusionClr">
- <ref name="CT_Color"/>
- </element>
- <element name="contourClr">
- <ref name="CT_Color"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="z">
- <ref name="ST_Coordinate"/>
- </attribute>
- <attribute name="extrusionH">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="contourW">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="prstMaterial">
- <ref name="ST_PresetMaterialType"/>
- </attribute>
- </define>
- <define name="CT_FlatText">
- <attribute name="z">
- <ref name="ST_Coordinate"/>
- </attribute>
- </define>
- <define name="EG_Text3D">
- <choice>
- <element name="sp3d">
- <ref name="CT_Shape3D"/>
- </element>
- <element name="flatTx">
- <ref name="CT_FlatText"/>
- </element>
- </choice>
- </define>
- </grammar>
- <resource name="ST_BevelPresetType" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_BevelPresetType_relaxedInset">relaxedInset</value>
- <value tokenid="ooxml:Value_drawingml_ST_BevelPresetType_circle">circle</value>
- <value tokenid="ooxml:Value_drawingml_ST_BevelPresetType_slope">slope</value>
- <value tokenid="ooxml:Value_drawingml_ST_BevelPresetType_cross">cross</value>
- <value tokenid="ooxml:Value_drawingml_ST_BevelPresetType_angle">angle</value>
- <value tokenid="ooxml:Value_drawingml_ST_BevelPresetType_softRound">softRound</value>
- <value tokenid="ooxml:Value_drawingml_ST_BevelPresetType_convex">convex</value>
- <value tokenid="ooxml:Value_drawingml_ST_BevelPresetType_coolSlant">coolSlant</value>
- <value tokenid="ooxml:Value_drawingml_ST_BevelPresetType_divot">divot</value>
- <value tokenid="ooxml:Value_drawingml_ST_BevelPresetType_riblet">riblet</value>
- <value tokenid="ooxml:Value_drawingml_ST_BevelPresetType_hardEdge">hardEdge</value>
- <value tokenid="ooxml:Value_drawingml_ST_BevelPresetType_artDeco">artDeco</value>
- </resource>
- <resource name="ST_PresetMaterialType" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_legacyMatte">legacyMatte</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_legacyPlastic">legacyPlastic</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_legacyMetal">legacyMetal</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_legacyWireframe">legacyWireframe</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_matte">matte</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_plastic">plastic</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_metal">metal</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_warmMatte">warmMatte</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_translucentPowder">translucentPowder</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_powder">powder</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_dkEdge">dkEdge</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_softEdge">softEdge</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_clear">clear</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_flat">flat</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetMaterialType_softmetal">softmetal</value>
- </resource>
- </namespace>
- <namespace name="dml-shape3DCamera">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <define name="ST_PresetCameraType">
- <choice>
- <!-- Legacy Oblique Top Left -->
- <value>legacyObliqueTopLeft</value>
- <!-- Legacy Oblique Top -->
- <value>legacyObliqueTop</value>
- <!-- Legacy Oblique Top Right -->
- <value>legacyObliqueTopRight</value>
- <!-- Legacy Oblique Left -->
- <value>legacyObliqueLeft</value>
- <!-- Legacy Oblique Front -->
- <value>legacyObliqueFront</value>
- <!-- Legacy Oblique Right -->
- <value>legacyObliqueRight</value>
- <!-- Legacy Oblique Bottom Left -->
- <value>legacyObliqueBottomLeft</value>
- <!-- Legacy Oblique Bottom -->
- <value>legacyObliqueBottom</value>
- <!-- Legacy Oblique Bottom Right -->
- <value>legacyObliqueBottomRight</value>
- <!-- Legacy Perspective Top Left -->
- <value>legacyPerspectiveTopLeft</value>
- <!-- Legacy Perspective Top -->
- <value>legacyPerspectiveTop</value>
- <!-- Legacy Perspective Top Right -->
- <value>legacyPerspectiveTopRight</value>
- <!-- Legacy Perspective Left -->
- <value>legacyPerspectiveLeft</value>
- <!-- Legacy Perspective Front -->
- <value>legacyPerspectiveFront</value>
- <!-- Legacy Perspective Right -->
- <value>legacyPerspectiveRight</value>
- <!-- Legacy Perspective Bottom Left -->
- <value>legacyPerspectiveBottomLeft</value>
- <!-- Legacy Perspective Bottom -->
- <value>legacyPerspectiveBottom</value>
- <!-- Legacy Perspective Bottom Right -->
- <value>legacyPerspectiveBottomRight</value>
- <!-- Orthographic Front -->
- <value>orthographicFront</value>
- <!-- Isometric Top Up -->
- <value>isometricTopUp</value>
- <!-- Isometric Top Down -->
- <value>isometricTopDown</value>
- <!-- Isometric Bottom Up -->
- <value>isometricBottomUp</value>
- <!-- Isometric Bottom Down -->
- <value>isometricBottomDown</value>
- <!-- Isometric Left Up -->
- <value>isometricLeftUp</value>
- <!-- Isometric Left Down -->
- <value>isometricLeftDown</value>
- <!-- Isometric Right Up -->
- <value>isometricRightUp</value>
- <!-- Isometric Right Down -->
- <value>isometricRightDown</value>
- <!-- Isometric Off Axis 1 Left -->
- <value>isometricOffAxis1Left</value>
- <!-- Isometric Off Axis 1 Right -->
- <value>isometricOffAxis1Right</value>
- <!-- Isometric Off Axis 1 Top -->
- <value>isometricOffAxis1Top</value>
- <!-- Isometric Off Axis 2 Left -->
- <value>isometricOffAxis2Left</value>
- <!-- Isometric Off Axis 2 Right -->
- <value>isometricOffAxis2Right</value>
- <!-- Isometric Off Axis 2 Top -->
- <value>isometricOffAxis2Top</value>
- <!-- Isometric Off Axis 3 Left -->
- <value>isometricOffAxis3Left</value>
- <!-- Isometric Off Axis 3 Right -->
- <value>isometricOffAxis3Right</value>
- <!-- Isometric Off Axis 3 Bottom -->
- <value>isometricOffAxis3Bottom</value>
- <!-- Isometric Off Axis 4 Left -->
- <value>isometricOffAxis4Left</value>
- <!-- Isometric Off Axis 4 Right -->
- <value>isometricOffAxis4Right</value>
- <!-- Isometric Off Axis 4 Bottom -->
- <value>isometricOffAxis4Bottom</value>
- <!-- Oblique Top Left -->
- <value>obliqueTopLeft</value>
- <!-- Oblique Top -->
- <value>obliqueTop</value>
- <!-- Oblique Top Right -->
- <value>obliqueTopRight</value>
- <!-- Oblique Left -->
- <value>obliqueLeft</value>
- <!-- Oblique Right -->
- <value>obliqueRight</value>
- <!-- Oblique Bottom Left -->
- <value>obliqueBottomLeft</value>
- <!-- Oblique Bottom -->
- <value>obliqueBottom</value>
- <!-- Oblique Bottom Right -->
- <value>obliqueBottomRight</value>
- <!-- Perspective Front -->
- <value>perspectiveFront</value>
- <!-- Perspective Left -->
- <value>perspectiveLeft</value>
- <!-- Perspective Right -->
- <value>perspectiveRight</value>
- <!-- Orthographic Above -->
- <value>perspectiveAbove</value>
- <!-- Perspective Below -->
- <value>perspectiveBelow</value>
- <!-- Perspective Above Left Facing -->
- <value>perspectiveAboveLeftFacing</value>
- <!-- Perspective Above Right Facing -->
- <value>perspectiveAboveRightFacing</value>
- <!-- Perspective Contrasting Left Facing -->
- <value>perspectiveContrastingLeftFacing</value>
- <!-- Perspective Contrasting Right Facing -->
- <value>perspectiveContrastingRightFacing</value>
- <!-- Perspective Heroic Left Facing -->
- <value>perspectiveHeroicLeftFacing</value>
- <!-- Perspective Heroic Right Facing -->
- <value>perspectiveHeroicRightFacing</value>
- <!-- Perspective Heroic Extreme Left Facing -->
- <value>perspectiveHeroicExtremeLeftFacing</value>
- <!-- Perspective Heroic Extreme Right Facing -->
- <value>perspectiveHeroicExtremeRightFacing</value>
- <!-- Perspective Relaxed -->
- <value>perspectiveRelaxed</value>
- <!-- Perspective Relaxed Moderately -->
- <value>perspectiveRelaxedModerately</value>
- </choice>
- </define>
- <define name="ST_FOVAngle">
- </define>
- <define name="CT_Camera">
- <element name="rot">
- <ref name="CT_SphereCoords"/>
- </element>
- <attribute name="prst">
- <ref name="ST_PresetCameraType"/>
- </attribute>
- <attribute name="fov">
- <ref name="ST_FOVAngle"/>
- </attribute>
- <attribute name="zoom">
- <ref name="ST_PositivePercentage"/>
- </attribute>
- </define>
- </grammar>
- <resource name="ST_PresetCameraType" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyObliqueTopLeft">legacyObliqueTopLeft</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyObliqueTop">legacyObliqueTop</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyObliqueTopRight">legacyObliqueTopRight</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyObliqueLeft">legacyObliqueLeft</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyObliqueFront">legacyObliqueFront</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyObliqueRight">legacyObliqueRight</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyObliqueBottomLeft">legacyObliqueBottomLeft</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyObliqueBottom">legacyObliqueBottom</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyObliqueBottomRight">legacyObliqueBottomRight</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyPerspectiveTopLeft">legacyPerspectiveTopLeft</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyPerspectiveTop">legacyPerspectiveTop</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyPerspectiveTopRight">legacyPerspectiveTopRight</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyPerspectiveLeft">legacyPerspectiveLeft</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyPerspectiveFront">legacyPerspectiveFront</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyPerspectiveRight">legacyPerspectiveRight</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyPerspectiveBottomLeft">legacyPerspectiveBottomLeft</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyPerspectiveBottom">legacyPerspectiveBottom</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_legacyPerspectiveBottomRight">legacyPerspectiveBottomRight</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_orthographicFront">orthographicFront</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricTopUp">isometricTopUp</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricTopDown">isometricTopDown</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricBottomUp">isometricBottomUp</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricBottomDown">isometricBottomDown</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricLeftUp">isometricLeftUp</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricLeftDown">isometricLeftDown</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricRightUp">isometricRightUp</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricRightDown">isometricRightDown</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricOffAxis1Left">isometricOffAxis1Left</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricOffAxis1Right">isometricOffAxis1Right</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricOffAxis1Top">isometricOffAxis1Top</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricOffAxis2Left">isometricOffAxis2Left</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricOffAxis2Right">isometricOffAxis2Right</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricOffAxis2Top">isometricOffAxis2Top</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricOffAxis3Left">isometricOffAxis3Left</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricOffAxis3Right">isometricOffAxis3Right</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricOffAxis3Bottom">isometricOffAxis3Bottom</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricOffAxis4Left">isometricOffAxis4Left</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricOffAxis4Right">isometricOffAxis4Right</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_isometricOffAxis4Bottom">isometricOffAxis4Bottom</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_obliqueTopLeft">obliqueTopLeft</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_obliqueTop">obliqueTop</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_obliqueTopRight">obliqueTopRight</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_obliqueLeft">obliqueLeft</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_obliqueRight">obliqueRight</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_obliqueBottomLeft">obliqueBottomLeft</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_obliqueBottom">obliqueBottom</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_obliqueBottomRight">obliqueBottomRight</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveFront">perspectiveFront</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveLeft">perspectiveLeft</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveRight">perspectiveRight</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveAbove">perspectiveAbove</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveBelow">perspectiveBelow</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveAboveLeftFacing">perspectiveAboveLeftFacing</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveAboveRightFacing">perspectiveAboveRightFacing</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveContrastingLeftFacing">perspectiveContrastingLeftFacing</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveContrastingRightFacing">perspectiveContrastingRightFacing</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveHeroicLeftFacing">perspectiveHeroicLeftFacing</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveHeroicRightFacing">perspectiveHeroicRightFacing</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveHeroicExtremeLeftFacing">perspectiveHeroicExtremeLeftFacing</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveHeroicExtremeRightFacing">perspectiveHeroicExtremeRightFacing</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveRelaxed">perspectiveRelaxed</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetCameraType_perspectiveRelaxedModerately">perspectiveRelaxedModerately</value>
- </resource>
- </namespace>
- <namespace name="dml-baseStylesheet">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <!-- ISO RELAX NG Schema -->
- <define name="ST_ColorSchemeIndex">
- <choice>
- <!-- Dark 1 -->
- <value>dk1</value>
- <!-- Light 1 -->
- <value>lt1</value>
- <!-- Dark 2 -->
- <value>dk2</value>
- <!-- Light 2 -->
- <value>lt2</value>
- <!-- Accent 1 -->
- <value>accent1</value>
- <!-- Accent 2 -->
- <value>accent2</value>
- <!-- Accent 3 -->
- <value>accent3</value>
- <!-- Accent 4 -->
- <value>accent4</value>
- <!-- Accent 5 -->
- <value>accent5</value>
- <!-- Accent 6 -->
- <value>accent6</value>
- <!-- Hyperlink -->
- <value>hlink</value>
- <!-- Followed Hyperlink -->
- <value>folHlink</value>
- </choice>
- </define>
- <define name="CT_ColorScheme">
- <element name="dk1">
- <ref name="CT_Color"/>
- </element>
- <element name="lt1">
- <ref name="CT_Color"/>
- </element>
- <element name="dk2">
- <ref name="CT_Color"/>
- </element>
- <element name="lt2">
- <ref name="CT_Color"/>
- </element>
- <element name="accent1">
- <ref name="CT_Color"/>
- </element>
- <element name="accent2">
- <ref name="CT_Color"/>
- </element>
- <element name="accent3">
- <ref name="CT_Color"/>
- </element>
- <element name="accent4">
- <ref name="CT_Color"/>
- </element>
- <element name="accent5">
- <ref name="CT_Color"/>
- </element>
- <element name="accent6">
- <ref name="CT_Color"/>
- </element>
- <element name="hlink">
- <ref name="CT_Color"/>
- </element>
- <element name="folHlink">
- <ref name="CT_Color"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="name">
- <data type="string">
- </data>
- </attribute>
- </define>
- <define name="CT_CustomColor">
- <ref name="EG_ColorChoice"/>
- <attribute name="name">
- <data type="string">
- </data>
- </attribute>
- </define>
- <define name="CT_SupplementalFont">
- <attribute name="script">
- <data type="string">
- </data>
- </attribute>
- <attribute name="typeface">
- <ref name="ST_TextTypeface"/>
- <data type="string">
- </data>
- </attribute>
- </define>
- <define name="CT_CustomColorList">
- <element name="custClr">
- <ref name="CT_CustomColor"/>
- </element>
- </define>
- <define name="CT_FontCollection">
- <element name="latin">
- <ref name="CT_TextFont"/>
- </element>
- <element name="ea">
- <ref name="CT_TextFont"/>
- </element>
- <element name="cs">
- <ref name="CT_TextFont"/>
- </element>
- <element name="font">
- <ref name="CT_SupplementalFont"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- </define>
- <define name="CT_EffectStyleItem">
- <ref name="EG_EffectProperties"/>
- <element name="scene3d">
- <ref name="CT_Scene3D"/>
- </element>
- <element name="sp3d">
- <ref name="CT_Shape3D"/>
- </element>
- </define>
- <define name="CT_FontScheme">
- <element name="majorFont">
- <ref name="CT_FontCollection"/>
- </element>
- <element name="minorFont">
- <ref name="CT_FontCollection"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="name">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_FillStyleList">
- <ref name="EG_FillProperties"/>
- </define>
- <define name="CT_LineStyleList">
- <element name="ln">
- <ref name="CT_LineProperties"/>
- </element>
- </define>
- <define name="CT_EffectStyleList">
- <element name="effectStyle">
- <ref name="CT_EffectStyleItem"/>
- </element>
- </define>
- <define name="CT_BackgroundFillStyleList">
- <ref name="EG_FillProperties"/>
- </define>
- <define name="CT_StyleMatrix">
- <element name="fillStyleLst">
- <ref name="CT_FillStyleList"/>
- </element>
- <element name="lnStyleLst">
- <ref name="CT_LineStyleList"/>
- </element>
- <element name="effectStyleLst">
- <ref name="CT_EffectStyleList"/>
- </element>
- <element name="bgFillStyleLst">
- <ref name="CT_BackgroundFillStyleList"/>
- </element>
- <attribute name="name">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_BaseStyles">
- <element name="clrScheme">
- <ref name="CT_ColorScheme"/>
- </element>
- <element name="fontScheme">
- <ref name="CT_FontScheme"/>
- </element>
- <element name="fmtScheme">
- <ref name="CT_StyleMatrix"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- </define>
- </grammar>
- <resource name="ST_ColorSchemeIndex" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_ColorSchemeIndex_dk1">dk1</value>
- <value tokenid="ooxml:Value_drawingml_ST_ColorSchemeIndex_lt1">lt1</value>
- <value tokenid="ooxml:Value_drawingml_ST_ColorSchemeIndex_dk2">dk2</value>
- <value tokenid="ooxml:Value_drawingml_ST_ColorSchemeIndex_lt2">lt2</value>
- <value tokenid="ooxml:Value_drawingml_ST_ColorSchemeIndex_accent1">accent1</value>
- <value tokenid="ooxml:Value_drawingml_ST_ColorSchemeIndex_accent2">accent2</value>
- <value tokenid="ooxml:Value_drawingml_ST_ColorSchemeIndex_accent3">accent3</value>
- <value tokenid="ooxml:Value_drawingml_ST_ColorSchemeIndex_accent4">accent4</value>
- <value tokenid="ooxml:Value_drawingml_ST_ColorSchemeIndex_accent5">accent5</value>
- <value tokenid="ooxml:Value_drawingml_ST_ColorSchemeIndex_accent6">accent6</value>
- <value tokenid="ooxml:Value_drawingml_ST_ColorSchemeIndex_hlink">hlink</value>
- <value tokenid="ooxml:Value_drawingml_ST_ColorSchemeIndex_folHlink">folHlink</value>
- </resource>
- <resource name="CT_ColorScheme" resource="Properties">
- <element name="dk1" tokenid="ooxml:CT_ColorScheme_dk1"/>
- <element name="lt1" tokenid="ooxml:CT_ColorScheme_lt1"/>
- <element name="dk2" tokenid="ooxml:CT_ColorScheme_dk2"/>
- <element name="lt2" tokenid="ooxml:CT_ColorScheme_lt2"/>
- <element name="accent1" tokenid="ooxml:CT_ColorScheme_accent1"/>
- <element name="accent2" tokenid="ooxml:CT_ColorScheme_accent2"/>
- <element name="accent3" tokenid="ooxml:CT_ColorScheme_accent3"/>
- <element name="accent4" tokenid="ooxml:CT_ColorScheme_accent4"/>
- <element name="accent5" tokenid="ooxml:CT_ColorScheme_accent5"/>
- <element name="accent6" tokenid="ooxml:CT_ColorScheme_accent6"/>
- <element name="hlink" tokenid="ooxml:CT_ColorScheme_hlink"/>
- <element name="folHlink" tokenid="ooxml:CT_ColorScheme_folHlink"/>
- <element name="extLst" tokenid="ooxml:CT_ColorScheme_extLst"/>
- <attribute name="name" tokenid="ooxml:CT_ColorScheme_name"/>
- </resource>
- <resource name="CT_SupplementalFont" resource="Properties">
- <attribute name="script" tokenid="ooxml:CT_SupplementalFont_script"/>
- <attribute name="typeface" tokenid="ooxml:CT_SupplementalFont_typeface"/>
- </resource>
- <resource name="CT_FontCollection" resource="Properties">
- <element name="latin" tokenid="ooxml:CT_FontCollection_latin"/>
- <element name="ea" tokenid="ooxml:CT_FontCollection_ea"/>
- <element name="cs" tokenid="ooxml:CT_FontCollection_cs"/>
- <element name="font" tokenid="ooxml:CT_FontCollection_font"/>
- <element name="extLst" tokenid="ooxml:CT_FontCollection_extLst"/>
- </resource>
- <resource name="CT_FontScheme" resource="Properties">
- <element name="majorFont" tokenid="ooxml:CT_FontScheme_majorFont"/>
- <element name="minorFont" tokenid="ooxml:CT_FontScheme_minorFont"/>
- <element name="extLst" tokenid="ooxml:CT_FontScheme_extLst"/>
- <attribute name="name" tokenid="ooxml:CT_FontScheme_name"/>
- </resource>
- <resource name="CT_FillStyleList" resource="Properties"/>
- <resource name="CT_LineStyleList" resource="Properties">
- <element name="ln" tokenid="ooxml:CT_LineStyleList_ln"/>
- </resource>
- <resource name="CT_EffectStyleList" resource="Properties">
- <element name="effectStyle" tokenid="ooxml:CT_EffectStyleList_effectStyle"/>
- </resource>
- <resource name="CT_BackgroundFillStyleList" resource="Properties"/>
- <resource name="CT_StyleMatrix" resource="Properties">
- <element name="fillStyleLst" tokenid="ooxml:CT_StyleMatrix_fillStyleLst"/>
- <element name="lnStyleLst" tokenid="ooxml:CT_StyleMatrix_lnStyleLst"/>
- <element name="effectStyleLst" tokenid="ooxml:CT_StyleMatrix_effectStyleLst"/>
- <element name="bgFillStyleLst" tokenid="ooxml:CT_StyleMatrix_bgFillStyleLst"/>
- <attribute name="name" tokenid="ooxml:CT_StyleMatrix_name"/>
- </resource>
- <resource name="CT_BaseStyles" resource="Properties">
- <element name="clrScheme" tokenid="ooxml:CT_BaseStyles_clrScheme"/>
- <element name="fontScheme" tokenid="ooxml:CT_BaseStyles_fontScheme"/>
- <element name="fmtScheme" tokenid="ooxml:CT_BaseStyles_fmtScheme"/>
- <element name="extLst" tokenid="ooxml:CT_BaseStyles_extLst"/>
- </resource>
- </namespace>
- <namespace name="dml-textCharacter">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <include href="dml-shapeEffects"/>
- <include href="dml-shapeLineProperties"/>
- <define name="ST_TextPoint">
- <data type="int"/>
- </define>
- <define name="ST_TextNonNegativePoint">
- <data type="int"/>
- </define>
- <define name="ST_TextFontSize">
- <data type="int"/>
- </define>
- <define name="ST_Panose">
- <data type="hexBinary"/>
- </define>
- <define name="ST_TextTypeface">
- <data type="string"/>
- </define>
- <define name="CT_TextFont">
- <attribute name="typeface">
- <ref name="ST_TextTypeface"/>
- </attribute>
- <attribute name="panose">
- <ref name="ST_Panose"/>
- </attribute>
- <attribute name="pitchFamily">
- <data type="byte"/>
- </attribute>
- <attribute name="charset">
- <data type="byte"/>
- </attribute>
- </define>
- <define name="ST_TextLanguageID">
- <data type="string"/>
- </define>
- <define name="ST_TextUnderlineType">
- <choice>
- <!-- Text Underline Enum ( None ) -->
- <value>none</value>
- <!-- Text Underline Enum ( Words ) -->
- <value>words</value>
- <!-- Text Underline Enum ( Single ) -->
- <value>sng</value>
- <!-- Text Underline Enum ( Double ) -->
- <value>dbl</value>
- <!-- Text Underline Enum ( Heavy ) -->
- <value>heavy</value>
- <!-- Text Underline Enum ( Dotted ) -->
- <value>dotted</value>
- <!-- Text Underline Enum ( Heavy Dotted ) -->
- <value>dottedHeavy</value>
- <!-- Text Underline Enum ( Dashed ) -->
- <value>dash</value>
- <!-- Text Underline Enum ( Heavy Dashed ) -->
- <value>dashHeavy</value>
- <!-- Text Underline Enum ( Long Dashed ) -->
- <value>dashLong</value>
- <!-- Text Underline Enum ( Heavy Long Dashed ) -->
- <value>dashLongHeavy</value>
- <!-- Text Underline Enum ( Dot Dash ) -->
- <value>dotDash</value>
- <!-- Text Underline Enum ( Heavy Dot Dash ) -->
- <value>dotDashHeavy</value>
- <!-- Text Underline Enum ( Dot Dot Dash ) -->
- <value>dotDotDash</value>
- <!-- Text Underline Enum ( Heavy Dot Dot Dash ) -->
- <value>dotDotDashHeavy</value>
- <!-- Text Underline Enum ( Wavy ) -->
- <value>wavy</value>
- <!-- Text Underline Enum ( Heavy Wavy ) -->
- <value>wavyHeavy</value>
- <!-- Text Underline Enum ( Double Wavy ) -->
- <value>wavyDbl</value>
- </choice>
- </define>
- <define name="CT_TextUnderlineLineFollowText">
- </define>
- <define name="CT_TextUnderlineFillFollowText">
- </define>
- <define name="CT_TextUnderlineFillGroupWrapper">
- <ref name="EG_FillProperties"/>
- </define>
- <define name="EG_TextUnderlineLine">
- <choice>
- <element name="uLnTx">
- <ref name="CT_TextUnderlineLineFollowText"/>
- </element>
- <element name="uLn">
- <ref name="CT_LineProperties"/>
- </element>
- </choice>
- </define>
- <define name="EG_TextUnderlineFill">
- <choice>
- <element name="uFillTx">
- <ref name="CT_TextUnderlineFillFollowText"/>
- </element>
- <element name="uFill">
- <ref name="CT_TextUnderlineFillGroupWrapper"/>
- </element>
- </choice>
- </define>
- <define name="ST_TextStrikeType">
- <choice>
- <!-- Text Strike Enum ( No Strike ) -->
- <value>noStrike</value>
- <!-- Text Strike Enum ( Single Strike ) -->
- <value>sngStrike</value>
- <!-- Text Strike Enum ( Double Strike ) -->
- <value>dblStrike</value>
- </choice>
- </define>
- <define name="ST_TextCapsType">
- <choice>
- <!-- Text Caps Enum ( None ) -->
- <value>none</value>
- <!-- Text Caps Enum ( Small ) -->
- <value>small</value>
- <!-- Text Caps Enum ( All ) -->
- <value>all</value>
- </choice>
- </define>
- <define name="CT_TextCharacterProperties">
- <element name="ln">
- <ref name="CT_LineProperties"/>
- </element>
- <ref name="EG_FillProperties"/>
- <ref name="EG_EffectProperties"/>
- <element name="highlight">
- <ref name="CT_Color"/>
- </element>
- <ref name="EG_TextUnderlineLine"/>
- <ref name="EG_TextUnderlineFill"/>
- <element name="latin">
- <ref name="CT_TextFont"/>
- </element>
- <element name="ea">
- <ref name="CT_TextFont"/>
- </element>
- <element name="cs">
- <ref name="CT_TextFont"/>
- </element>
- <element name="sym">
- <ref name="CT_TextFont"/>
- </element>
- <element name="hlinkClick">
- <ref name="CT_Hyperlink"/>
- </element>
- <element name="hlinkMouseOver">
- <ref name="CT_Hyperlink"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="kumimoji">
- <data type="boolean"/>
- </attribute>
- <attribute name="lang">
- <ref name="ST_TextLanguageID"/>
- </attribute>
- <attribute name="altLang">
- <ref name="ST_TextLanguageID"/>
- </attribute>
- <attribute name="sz">
- <ref name="ST_TextFontSize"/>
- </attribute>
- <attribute name="b">
- <data type="boolean"/>
- </attribute>
- <attribute name="i">
- <data type="boolean"/>
- </attribute>
- <attribute name="u">
- <ref name="ST_TextUnderlineType"/>
- </attribute>
- <attribute name="strike">
- <ref name="ST_TextStrikeType"/>
- </attribute>
- <attribute name="kern">
- <ref name="ST_TextNonNegativePoint"/>
- </attribute>
- <attribute name="cap">
- <ref name="ST_TextCapsType"/>
- </attribute>
- <attribute name="spc">
- <ref name="ST_TextPoint"/>
- </attribute>
- <attribute name="normalizeH">
- <data type="boolean"/>
- </attribute>
- <attribute name="baseline">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="noProof">
- <data type="boolean"/>
- </attribute>
- <attribute name="dirty">
- <data type="boolean"/>
- </attribute>
- <attribute name="err">
- <data type="boolean"/>
- </attribute>
- <attribute name="smtClean">
- <data type="boolean"/>
- </attribute>
- <attribute name="smtId">
- <data type="unsignedInt"/>
- </attribute>
- <attribute name="bmk">
- <data type="string"/>
- </attribute>
- </define>
- </grammar>
- <resource name="ST_TextPoint" resource="Integer"/>
- <resource name="ST_TextNonNegativePoint" resource="Integer"/>
- <resource name="ST_TextFontSize" resource="Integer"/>
- <resource name="ST_Panose" resource="Hex"/>
- <resource name="ST_TextTypeface" resource="String"/>
- <resource name="CT_TextFont" resource="Properties">
- <attribute name="typeface" tokenid="ooxml:CT_TextFont_typeface"/>
- <attribute name="panose" tokenid="ooxml:CT_TextFont_panose"/>
- <attribute name="pitchFamily" tokenid="ooxml:CT_TextFont_pitchFamily"/>
- <attribute name="charset" tokenid="ooxml:CT_TextFont_charset"/>
- </resource>
- <resource name="ST_TextLanguageID" resource="String"/>
- <resource name="ST_TextUnderlineType" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_none">none</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_words">words</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_sng">sng</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_dbl">dbl</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_heavy">heavy</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_dotted">dotted</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_dottedHeavy">dottedHeavy</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_dash">dash</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_dashHeavy">dashHeavy</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_dashLong">dashLong</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_dashLongHeavy">dashLongHeavy</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_dotDash">dotDash</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_dotDashHeavy">dotDashHeavy</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_dotDotDash">dotDotDash</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_dotDotDashHeavy">dotDotDashHeavy</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_wavy">wavy</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_wavyHeavy">wavyHeavy</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextUnderlineType_wavyDbl">wavyDbl</value>
- </resource>
- <resource name="ST_TextStrikeType" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_TextStrikeType_noStrike">noStrike</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextStrikeType_sngStrike">sngStrike</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextStrikeType_dblStrike">dblStrike</value>
- </resource>
- <resource name="ST_TextCapsType" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_TextCapsType_none">none</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextCapsType_small">small</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextCapsType_all">all</value>
- </resource>
- </namespace>
- <namespace name="dml-shapeEffects">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <!-- start = blip -->
- <define name="CT_AlphaBiLevelEffect">
- <attribute name="thresh">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- </define>
- <define name="CT_AlphaCeilingEffect">
- </define>
- <define name="CT_AlphaFloorEffect">
- </define>
- <define name="CT_AlphaInverseEffect">
- <ref name="EG_ColorChoice"/>
- </define>
- <define name="CT_AlphaModulateFixedEffect">
- <attribute name="amt">
- <ref name="ST_PositivePercentage"/>
- </attribute>
- </define>
- <define name="CT_AlphaOutsetEffect">
- <attribute name="rad">
- <ref name="ST_Coordinate"/>
- </attribute>
- </define>
- <define name="CT_AlphaReplaceEffect">
- <attribute name="a">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- </define>
- <define name="CT_BiLevelEffect">
- <attribute name="thresh">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- </define>
- <define name="CT_BlurEffect">
- <attribute name="rad">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="grow">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_ColorChangeEffect">
- <element name="clrFrom">
- <ref name="CT_Color"/>
- </element>
- <element name="clrTo">
- <ref name="CT_Color"/>
- </element>
- <attribute name="useA">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_ColorReplaceEffect">
- <ref name="EG_ColorChoice"/>
- </define>
- <define name="CT_DuotoneEffect">
- <ref name="EG_ColorChoice"/>
- </define>
- <define name="CT_GlowEffect">
- <ref name="EG_ColorChoice"/>
- <attribute name="rad">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- </define>
- <define name="CT_GrayscaleEffect">
- </define>
- <define name="CT_HSLEffect">
- <attribute name="hue">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="sat">
- <ref name="ST_FixedPercentage"/>
- </attribute>
- <attribute name="lum">
- <ref name="ST_FixedPercentage"/>
- </attribute>
- </define>
- <define name="CT_InnerShadowEffect">
- <ref name="EG_ColorChoice"/>
- <attribute name="blurRad">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="dist">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="dir">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- </define>
- <define name="CT_LuminanceEffect">
- <attribute name="bright">
- <ref name="ST_FixedPercentage"/>
- </attribute>
- <attribute name="contrast">
- <ref name="ST_FixedPercentage"/>
- </attribute>
- </define>
- <define name="CT_OuterShadowEffect">
- <ref name="EG_ColorChoice"/>
- <attribute name="blurRad">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="dist">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="dir">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="sx">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="sy">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="kx">
- <ref name="ST_FixedAngle"/>
- </attribute>
- <attribute name="ky">
- <ref name="ST_FixedAngle"/>
- </attribute>
- <attribute name="algn">
- <ref name="ST_RectAlignment"/>
- </attribute>
- <attribute name="rotWithShape">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="ST_PresetShadowVal">
- <choice>
- <!-- Top Left Drop Shadow -->
- <value>shdw1</value>
- <!-- Top Right Drop Shadow -->
- <value>shdw2</value>
- <!-- Back Left Perspective Shadow -->
- <value>shdw3</value>
- <!-- Back Right Perspective Shadow -->
- <value>shdw4</value>
- <!-- Bottom Left Drop Shadow -->
- <value>shdw5</value>
- <!-- Bottom Right Drop Shadow -->
- <value>shdw6</value>
- <!-- Front Left Perspective Shadow -->
- <value>shdw7</value>
- <!-- Front Right Perspective Shadow -->
- <value>shdw8</value>
- <!-- Top Left Small Drop Shadow -->
- <value>shdw9</value>
- <!-- Top Left Large Drop Shadow -->
- <value>shdw10</value>
- <!-- Back Left Long Perspective Shadow -->
- <value>shdw11</value>
- <!-- Back Right Long Perspective Shadow -->
- <value>shdw12</value>
- <!-- Top Left Double Drop Shadow -->
- <value>shdw13</value>
- <!-- Bottom Right Small Drop Shadow -->
- <value>shdw14</value>
- <!-- Front Left Long Perspective Shadow -->
- <value>shdw15</value>
- <!-- Front Right LongPerspective Shadow -->
- <value>shdw16</value>
- <!-- 3D Outer Box Shadow -->
- <value>shdw17</value>
- <!-- 3D Inner Box Shadow -->
- <value>shdw18</value>
- <!-- Back Center Perspective Shadow -->
- <value>shdw19</value>
- <!-- Front Bottom Shadow -->
- <value>shdw20</value>
- </choice>
- </define>
- <define name="CT_PresetShadowEffect">
- <ref name="EG_ColorChoice"/>
- <attribute name="prst">
- <ref name="ST_PresetShadowVal"/>
- </attribute>
- <attribute name="dist">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="dir">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- </define>
- <define name="CT_ReflectionEffect">
- <attribute name="blurRad">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="stA">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="stPos">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="endA">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="endPos">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="dist">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="dir">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="fadeDir">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="sx">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="sy">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="kx">
- <ref name="ST_FixedAngle"/>
- </attribute>
- <attribute name="ky">
- <ref name="ST_FixedAngle"/>
- </attribute>
- <attribute name="algn">
- <ref name="ST_RectAlignment"/>
- </attribute>
- <attribute name="rotWithShape">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_RelativeOffsetEffect">
- <attribute name="tx">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="ty">
- <ref name="ST_Percentage"/>
- </attribute>
- </define>
- <define name="CT_SoftEdgesEffect">
- <attribute name="rad">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- </define>
- <define name="CT_TintEffect">
- <attribute name="hue">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="amt">
- <ref name="ST_FixedPercentage"/>
- </attribute>
- </define>
- <define name="CT_TransformEffect">
- <attribute name="sx">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="sy">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="kx">
- <ref name="ST_FixedAngle"/>
- </attribute>
- <attribute name="ky">
- <ref name="ST_FixedAngle"/>
- </attribute>
- <attribute name="tx">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="ty">
- <ref name="ST_Percentage"/>
- </attribute>
- </define>
- <define name="CT_NoFillProperties">
- </define>
- <define name="CT_SolidColorFillProperties">
- <ref name="EG_ColorChoice"/>
- </define>
- <define name="CT_LinearShadeProperties">
- <attribute name="ang">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="scaled">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="ST_PathShadeType">
- <choice>
- <!-- Shape -->
- <value>shape</value>
- <!-- Circle -->
- <value>circle</value>
- <!-- Rectangle -->
- <value>rect</value>
- </choice>
- </define>
- <define name="CT_PathShadeProperties">
- <element name="fillToRect">
- <ref name="CT_RelativeRect"/>
- </element>
- <attribute name="path">
- <ref name="ST_PathShadeType"/>
- </attribute>
- </define>
- <define name="EG_ShadeProperties">
- <choice>
- <element name="lin">
- <ref name="CT_LinearShadeProperties"/>
- </element>
- <element name="path">
- <ref name="CT_PathShadeProperties"/>
- </element>
- </choice>
- </define>
- <define name="ST_TileFlipMode">
- <choice>
- <!-- None -->
- <value>none</value>
- <!-- Horizontal -->
- <value>x</value>
- <!-- Vertical -->
- <value>y</value>
- <!-- Horizontal and Vertical -->
- <value>xy</value>
- </choice>
- </define>
- <define name="CT_GradientStop">
- <ref name="EG_ColorChoice"/>
- <attribute name="pos">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- </define>
- <define name="CT_GradientStopList">
- <element name="gs">
- <ref name="CT_GradientStop"/>
- </element>
- </define>
- <define name="CT_GradientFillProperties">
- <element name="gsLst">
- <ref name="CT_GradientStopList"/>
- </element>
- <ref name="EG_ShadeProperties"/>
- <element name="tileRect">
- <ref name="CT_RelativeRect"/>
- </element>
- <attribute name="flip">
- <ref name="ST_TileFlipMode"/>
- </attribute>
- <attribute name="rotWithShape">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_TileInfoProperties">
- <attribute name="tx">
- <ref name="ST_Coordinate"/>
- </attribute>
- <attribute name="ty">
- <ref name="ST_Coordinate"/>
- </attribute>
- <attribute name="sx">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="sy">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="flip">
- <ref name="ST_TileFlipMode"/>
- </attribute>
- <attribute name="algn">
- <ref name="ST_RectAlignment"/>
- </attribute>
- </define>
- <define name="CT_StretchInfoProperties">
- <element name="fillRect">
- <ref name="CT_RelativeRect"/>
- </element>
- </define>
- <define name="EG_FillModeProperties">
- <choice>
- <element name="tile">
- <ref name="CT_TileInfoProperties"/>
- </element>
- <element name="stretch">
- <ref name="CT_StretchInfoProperties"/>
- </element>
- </choice>
- </define>
- <define name="ST_BlipCompression">
- <choice>
- <!-- Email Compression -->
- <value>email</value>
- <!-- Screen Viewing Compression -->
- <value>screen</value>
- <!-- Printing Compression -->
- <value>print</value>
- <!-- High Quality Printing Compression -->
- <value>hqprint</value>
- <!-- No Compression -->
- <value>none</value>
- </choice>
- </define>
- <define name="CT_Blip">
- <choice>
- <element name="alphaBiLevel">
- <ref name="CT_AlphaBiLevelEffect"/>
- </element>
- <element name="alphaCeiling">
- <ref name="CT_AlphaCeilingEffect"/>
- </element>
- <element name="alphaFloor">
- <ref name="CT_AlphaFloorEffect"/>
- </element>
- <element name="alphaInv">
- <ref name="CT_AlphaInverseEffect"/>
- </element>
- <element name="alphaMod">
- <ref name="CT_AlphaModulateEffect"/>
- </element>
- <element name="alphaModFix">
- <ref name="CT_AlphaModulateFixedEffect"/>
- </element>
- <element name="alphaRepl">
- <ref name="CT_AlphaReplaceEffect"/>
- </element>
- <element name="biLevel">
- <ref name="CT_BiLevelEffect"/>
- </element>
- <element name="blur">
- <ref name="CT_BlurEffect"/>
- </element>
- <element name="clrChange">
- <ref name="CT_ColorChangeEffect"/>
- </element>
- <element name="clrRepl">
- <ref name="CT_ColorReplaceEffect"/>
- </element>
- <element name="duotone">
- <ref name="CT_DuotoneEffect"/>
- </element>
- <element name="fillOverlay">
- <ref name="CT_FillOverlayEffect"/>
- </element>
- <element name="grayscl">
- <ref name="CT_GrayscaleEffect"/>
- </element>
- <element name="hsl">
- <ref name="CT_HSLEffect"/>
- </element>
- <element name="lum">
- <ref name="CT_LuminanceEffect"/>
- </element>
- <element name="tint">
- <ref name="CT_TintEffect"/>
- </element>
- </choice>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <ref name="AG_Blob"/>
- <attribute name="cstate">
- <ref name="ST_BlipCompression"/>
- </attribute>
- </define>
- <define name="CT_BlipFillProperties">
- <element name="blip">
- <ref name="CT_Blip"/>
- </element>
- <element name="srcRect">
- <ref name="CT_RelativeRect"/>
- </element>
- <ref name="EG_FillModeProperties"/>
- <attribute name="dpi">
- <data type="unsignedInt"/>
- </attribute>
- <attribute name="rotWithShape">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="ST_PresetPatternVal">
- <choice>
- <!-- 5% -->
- <value>pct5</value>
- <!-- 10% -->
- <value>pct10</value>
- <!-- 20% -->
- <value>pct20</value>
- <!-- 25% -->
- <value>pct25</value>
- <!-- 30% -->
- <value>pct30</value>
- <!-- 40% -->
- <value>pct40</value>
- <!-- 50% -->
- <value>pct50</value>
- <!-- 60% -->
- <value>pct60</value>
- <!-- 70% -->
- <value>pct70</value>
- <!-- 75% -->
- <value>pct75</value>
- <!-- 80% -->
- <value>pct80</value>
- <!-- 90% -->
- <value>pct90</value>
- <!-- Horizontal -->
- <value>horz</value>
- <!-- Vertical -->
- <value>vert</value>
- <!-- Light Horizontal -->
- <value>ltHorz</value>
- <!-- Light Vertical -->
- <value>ltVert</value>
- <!-- Dark Horizontal -->
- <value>dkHorz</value>
- <!-- Dark Vertical -->
- <value>dkVert</value>
- <!-- Narrow Horizontal -->
- <value>narHorz</value>
- <!-- Narrow Vertical -->
- <value>narVert</value>
- <!-- Dashed Horizontal -->
- <value>dashHorz</value>
- <!-- Dashed Vertical -->
- <value>dashVert</value>
- <!-- Cross -->
- <value>cross</value>
- <!-- Downward Diagonal -->
- <value>dnDiag</value>
- <!-- Upward Diagonal -->
- <value>upDiag</value>
- <!-- Light Downward Diagonal -->
- <value>ltDnDiag</value>
- <!-- Light Upward Diagonal -->
- <value>ltUpDiag</value>
- <!-- Dark Downward Diagonal -->
- <value>dkDnDiag</value>
- <!-- Dark Upward Diagonal -->
- <value>dkUpDiag</value>
- <!-- Wide Downward Diagonal -->
- <value>wdDnDiag</value>
- <!-- Wide Upward Diagonal -->
- <value>wdUpDiag</value>
- <!-- Dashed Downward Diagonal -->
- <value>dashDnDiag</value>
- <!-- Dashed Upward Diagonal -->
- <value>dashUpDiag</value>
- <!-- Diagonal Cross -->
- <value>diagCross</value>
- <!-- Small Checker Board -->
- <value>smCheck</value>
- <!-- Large Checker Board -->
- <value>lgCheck</value>
- <!-- Small Grid -->
- <value>smGrid</value>
- <!-- Large Grid -->
- <value>lgGrid</value>
- <!-- Dotted Grid -->
- <value>dotGrid</value>
- <!-- Small Confetti -->
- <value>smConfetti</value>
- <!-- Large Confetti -->
- <value>lgConfetti</value>
- <!-- Horizontal Brick -->
- <value>horzBrick</value>
- <!-- Diagonal Brick -->
- <value>diagBrick</value>
- <!-- Solid Diamond -->
- <value>solidDmnd</value>
- <!-- Open Diamond -->
- <value>openDmnd</value>
- <!-- Dotted Diamond -->
- <value>dotDmnd</value>
- <!-- Plaid -->
- <value>plaid</value>
- <!-- Sphere -->
- <value>sphere</value>
- <!-- Weave -->
- <value>weave</value>
- <!-- Divot -->
- <value>divot</value>
- <!-- Shingle -->
- <value>shingle</value>
- <!-- Wave -->
- <value>wave</value>
- <!-- Trellis -->
- <value>trellis</value>
- <!-- Zig Zag -->
- <value>zigZag</value>
- <!-- Dashed Dotted -->
- <value>dashDot</value>
- <!-- Dashed Dotted Upward Diagonal -->
- <value>dashdotUpDiag</value>
- <!-- Solid Dotted -->
- <value>lsolidDoted</value>
- </choice>
- </define>
- <define name="CT_PatternFillProperties">
- <element name="fgClr">
- <ref name="CT_Color"/>
- </element>
- <element name="bgClr">
- <ref name="CT_Color"/>
- </element>
- <attribute name="prst">
- <ref name="ST_PresetPatternVal"/>
- </attribute>
- </define>
- <define name="CT_GroupFillProperties">
- </define>
- <define name="EG_FillProperties">
- <choice>
- <element name="noFill">
- <ref name="CT_NoFillProperties"/>
- </element>
- <element name="solidFill">
- <ref name="CT_SolidColorFillProperties"/>
- </element>
- <element name="gradFill">
- <ref name="CT_GradientFillProperties"/>
- </element>
- <element name="blipFill">
- <ref name="CT_BlipFillProperties"/>
- </element>
- <element name="pattFill">
- <ref name="CT_PatternFillProperties"/>
- </element>
- <element name="grpFill">
- <ref name="CT_GroupFillProperties"/>
- </element>
- </choice>
- </define>
- <define name="CT_FillProperties">
- <ref name="EG_FillProperties"/>
- </define>
- <define name="CT_FillEffect">
- <ref name="EG_FillProperties"/>
- </define>
- <define name="ST_BlendMode">
- <choice>
- <!-- Overlay -->
- <value>over</value>
- <!-- Multiply -->
- <value>mult</value>
- <!-- Screen -->
- <value>screen</value>
- <!-- Darken -->
- <value>darken</value>
- <!-- Lighten -->
- <value>lighten</value>
- </choice>
- </define>
- <define name="CT_FillOverlayEffect">
- <ref name="EG_FillProperties"/>
- <attribute name="blend">
- <ref name="ST_BlendMode"/>
- </attribute>
- </define>
- <define name="CT_EffectReference">
- <attribute name="ref">
- <data type="token"/>
- </attribute>
- </define>
- <define name="EG_Effect">
- <choice>
- <element name="cont">
- <ref name="CT_EffectContainer"/>
- </element>
- <element name="effect">
- <ref name="CT_EffectReference"/>
- </element>
- <element name="alphaBiLevel">
- <ref name="CT_AlphaBiLevelEffect"/>
- </element>
- <element name="alphaCeiling">
- <ref name="CT_AlphaCeilingEffect"/>
- </element>
- <element name="alphaFloor">
- <ref name="CT_AlphaFloorEffect"/>
- </element>
- <element name="alphaInv">
- <ref name="CT_AlphaInverseEffect"/>
- </element>
- <element name="alphaMod">
- <ref name="CT_AlphaModulateEffect"/>
- </element>
- <element name="alphaModFix">
- <ref name="CT_AlphaModulateFixedEffect"/>
- </element>
- <element name="alphaOutset">
- <ref name="CT_AlphaOutsetEffect"/>
- </element>
- <element name="alphaRepl">
- <ref name="CT_AlphaReplaceEffect"/>
- </element>
- <element name="biLevel">
- <ref name="CT_BiLevelEffect"/>
- </element>
- <element name="blend">
- <ref name="CT_BlendEffect"/>
- </element>
- <element name="blur">
- <ref name="CT_BlurEffect"/>
- </element>
- <element name="clrChange">
- <ref name="CT_ColorChangeEffect"/>
- </element>
- <element name="clrRepl">
- <ref name="CT_ColorReplaceEffect"/>
- </element>
- <element name="duotone">
- <ref name="CT_DuotoneEffect"/>
- </element>
- <element name="fill">
- <ref name="CT_FillEffect"/>
- </element>
- <element name="fillOverlay">
- <ref name="CT_FillOverlayEffect"/>
- </element>
- <element name="glow">
- <ref name="CT_GlowEffect"/>
- </element>
- <element name="grayscl">
- <ref name="CT_GrayscaleEffect"/>
- </element>
- <element name="hsl">
- <ref name="CT_HSLEffect"/>
- </element>
- <element name="innerShdw">
- <ref name="CT_InnerShadowEffect"/>
- </element>
- <element name="lum">
- <ref name="CT_LuminanceEffect"/>
- </element>
- <element name="outerShdw">
- <ref name="CT_OuterShadowEffect"/>
- </element>
- <element name="prstShdw">
- <ref name="CT_PresetShadowEffect"/>
- </element>
- <element name="reflection">
- <ref name="CT_ReflectionEffect"/>
- </element>
- <element name="relOff">
- <ref name="CT_RelativeOffsetEffect"/>
- </element>
- <element name="softEdge">
- <ref name="CT_SoftEdgesEffect"/>
- </element>
- <element name="tint">
- <ref name="CT_TintEffect"/>
- </element>
- <element name="xfrm">
- <ref name="CT_TransformEffect"/>
- </element>
- </choice>
- </define>
- <define name="ST_EffectContainerType">
- <choice>
- <!-- Sibling -->
- <value>sib</value>
- <!-- Tree -->
- <value>tree</value>
- </choice>
- </define>
- <define name="CT_EffectContainer">
- <ref name="EG_Effect"/>
- <attribute name="type">
- <ref name="ST_EffectContainerType"/>
- </attribute>
- <attribute name="name">
- <data type="token"/>
- </attribute>
- </define>
- <define name="CT_AlphaModulateEffect">
- <element name="cont">
- <ref name="CT_EffectContainer"/>
- </element>
- </define>
- <define name="CT_BlendEffect">
- <element name="cont">
- <ref name="CT_EffectContainer"/>
- </element>
- <attribute name="blend">
- <ref name="ST_BlendMode"/>
- </attribute>
- </define>
- <define name="CT_EffectList">
- <element name="blur">
- <ref name="CT_BlurEffect"/>
- </element>
- <element name="fillOverlay">
- <ref name="CT_FillOverlayEffect"/>
- </element>
- <element name="glow">
- <ref name="CT_GlowEffect"/>
- </element>
- <element name="innerShdw">
- <ref name="CT_InnerShadowEffect"/>
- </element>
- <element name="outerShdw">
- <ref name="CT_OuterShadowEffect"/>
- </element>
- <element name="prstShdw">
- <ref name="CT_PresetShadowEffect"/>
- </element>
- <element name="reflection">
- <ref name="CT_ReflectionEffect"/>
- </element>
- <element name="softEdge">
- <ref name="CT_SoftEdgesEffect"/>
- </element>
- </define>
- <define name="EG_EffectProperties">
- <choice>
- <element name="effectLst">
- <ref name="CT_EffectList"/>
- </element>
- <element name="effectDag">
- <ref name="CT_EffectContainer"/>
- </element>
- </choice>
- </define>
- <define name="CT_EffectProperties">
- <ref name="EG_EffectProperties"/>
- </define>
- <define name="blip">
- <element name="blip">
- <ref name="CT_Blip"/>
- </element>
- </define>
- </grammar>
- <resource name="ST_PresetShadowVal" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw1">shdw1</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw2">shdw2</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw3">shdw3</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw4">shdw4</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw5">shdw5</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw6">shdw6</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw7">shdw7</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw8">shdw8</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw9">shdw9</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw10">shdw10</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw11">shdw11</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw12">shdw12</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw13">shdw13</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw14">shdw14</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw15">shdw15</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw16">shdw16</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw17">shdw17</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw18">shdw18</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw19">shdw19</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetShadowVal_shdw20">shdw20</value>
- </resource>
- <resource name="CT_SolidColorFillProperties" resource="Properties"/>
- <resource name="ST_PathShadeType" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_PathShadeType_shape">shape</value>
- <value tokenid="ooxml:Value_drawingml_ST_PathShadeType_circle">circle</value>
- <value tokenid="ooxml:Value_drawingml_ST_PathShadeType_rect">rect</value>
- </resource>
- <resource name="ST_TileFlipMode" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_TileFlipMode_none">none</value>
- <value tokenid="ooxml:Value_drawingml_ST_TileFlipMode_x">x</value>
- <value tokenid="ooxml:Value_drawingml_ST_TileFlipMode_y">y</value>
- <value tokenid="ooxml:Value_drawingml_ST_TileFlipMode_xy">xy</value>
- </resource>
- <resource name="CT_GradientStop" resource="Properties">
- <attribute name="pos" tokenid="ooxml:CT_GradientStop_pos"/>
- </resource>
- <resource name="CT_TileInfoProperties" resource="Properties">
- <attribute name="tx" tokenid="ooxml:CT_TileInfoProperties_tx"/>
- <attribute name="ty" tokenid="ooxml:CT_TileInfoProperties_ty"/>
- <attribute name="sx" tokenid="ooxml:CT_TileInfoProperties_sx"/>
- <attribute name="sy" tokenid="ooxml:CT_TileInfoProperties_sy"/>
- <attribute name="flip" tokenid="ooxml:CT_TileInfoProperties_flip"/>
- <attribute name="algn" tokenid="ooxml:CT_TileInfoProperties_algn"/>
- </resource>
- <resource name="CT_StretchInfoProperties" resource="Properties">
- <element name="fillRect" tokenid="ooxml:CT_StretchInfoProperties_fillRect"/>
- </resource>
- <resource name="EG_FillModeProperties" resource="Properties">
- <element name="tile" tokenid="ooxml:EG_FillModeProperties_tile"/>
- <element name="stretch" tokenid="ooxml:EG_FillModeProperties_stretch"/>
- </resource>
- <resource name="ST_BlipCompression" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_BlipCompression_email">email</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlipCompression_screen">screen</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlipCompression_print">print</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlipCompression_hqprint">hqprint</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlipCompression_none">none</value>
- </resource>
- <resource name="CT_Blip" resource="Properties">
- <element name="alphaBiLevel" tokenid="ooxml:CT_Blip_alphaBiLevel"/>
- <element name="alphaCeiling" tokenid="ooxml:CT_Blip_alphaCeiling"/>
- <element name="alphaFloor" tokenid="ooxml:CT_Blip_alphaFloor"/>
- <element name="alphaInv" tokenid="ooxml:CT_Blip_alphaInv"/>
- <element name="alphaMod" tokenid="ooxml:CT_Blip_alphaMod"/>
- <element name="alphaModFix" tokenid="ooxml:CT_Blip_alphaModFix"/>
- <element name="alphaRepl" tokenid="ooxml:CT_Blip_alphaRepl"/>
- <element name="biLevel" tokenid="ooxml:CT_Blip_biLevel"/>
- <element name="blur" tokenid="ooxml:CT_Blip_blur"/>
- <element name="clrChange" tokenid="ooxml:CT_Blip_clrChange"/>
- <element name="clrRepl" tokenid="ooxml:CT_Blip_clrRepl"/>
- <element name="duotone" tokenid="ooxml:CT_Blip_duotone"/>
- <element name="fillOverlay" tokenid="ooxml:CT_Blip_fillOverlay"/>
- <element name="grayscl" tokenid="ooxml:CT_Blip_grayscl"/>
- <element name="hsl" tokenid="ooxml:CT_Blip_hsl"/>
- <element name="lum" tokenid="ooxml:CT_Blip_lum"/>
- <element name="tint" tokenid="ooxml:CT_Blip_tint"/>
- <element name="extLst" tokenid="ooxml:CT_Blip_extLst"/>
- <attribute name="cstate" tokenid="ooxml:CT_Blip_cstate"/>
- </resource>
- <resource name="CT_BlipFillProperties" resource="Properties">
- <element name="blip" tokenid="ooxml:CT_BlipFillProperties_blip"/>
- <element name="srcRect" tokenid="ooxml:CT_BlipFillProperties_srcRect"/>
- <attribute name="dpi" tokenid="ooxml:CT_BlipFillProperties_dpi"/>
- <attribute name="rotWithShape" tokenid="ooxml:CT_BlipFillProperties_rotWithShape"/>
- </resource>
- <resource name="ST_PresetPatternVal" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_pct5">pct5</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_pct10">pct10</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_pct20">pct20</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_pct25">pct25</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_pct30">pct30</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_pct40">pct40</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_pct50">pct50</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_pct60">pct60</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_pct70">pct70</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_pct75">pct75</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_pct80">pct80</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_pct90">pct90</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_horz">horz</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_vert">vert</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_ltHorz">ltHorz</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_ltVert">ltVert</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_dkHorz">dkHorz</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_dkVert">dkVert</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_narHorz">narHorz</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_narVert">narVert</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_dashHorz">dashHorz</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_dashVert">dashVert</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_cross">cross</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_dnDiag">dnDiag</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_upDiag">upDiag</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_ltDnDiag">ltDnDiag</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_ltUpDiag">ltUpDiag</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_dkDnDiag">dkDnDiag</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_dkUpDiag">dkUpDiag</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_wdDnDiag">wdDnDiag</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_wdUpDiag">wdUpDiag</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_dashDnDiag">dashDnDiag</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_dashUpDiag">dashUpDiag</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_diagCross">diagCross</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_smCheck">smCheck</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_lgCheck">lgCheck</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_smGrid">smGrid</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_lgGrid">lgGrid</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_dotGrid">dotGrid</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_smConfetti">smConfetti</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_lgConfetti">lgConfetti</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_horzBrick">horzBrick</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_diagBrick">diagBrick</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_solidDmnd">solidDmnd</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_openDmnd">openDmnd</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_dotDmnd">dotDmnd</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_plaid">plaid</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_sphere">sphere</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_weave">weave</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_divot">divot</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_shingle">shingle</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_wave">wave</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_trellis">trellis</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetPatternVal_zigZag">zigZag</value>
- </resource>
- <resource name="ST_BlendMode" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_BlendMode_over">over</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlendMode_mult">mult</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlendMode_screen">screen</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlendMode_darken">darken</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlendMode_lighten">lighten</value>
- </resource>
- <resource name="EG_Effect" resource="Properties">
- <element name="cont" tokenid="ooxml:EG_Effect_cont"/>
- <element name="effect" tokenid="ooxml:EG_Effect_effect"/>
- <element name="alphaBiLevel" tokenid="ooxml:EG_Effect_alphaBiLevel"/>
- <element name="alphaCeiling" tokenid="ooxml:EG_Effect_alphaCeiling"/>
- <element name="alphaFloor" tokenid="ooxml:EG_Effect_alphaFloor"/>
- <element name="alphaInv" tokenid="ooxml:EG_Effect_alphaInv"/>
- <element name="alphaMod" tokenid="ooxml:EG_Effect_alphaMod"/>
- <element name="alphaModFix" tokenid="ooxml:EG_Effect_alphaModFix"/>
- <element name="alphaOutset" tokenid="ooxml:EG_Effect_alphaOutset"/>
- <element name="alphaRepl" tokenid="ooxml:EG_Effect_alphaRepl"/>
- <element name="biLevel" tokenid="ooxml:EG_Effect_biLevel"/>
- <element name="blend" tokenid="ooxml:EG_Effect_blend"/>
- <element name="blur" tokenid="ooxml:EG_Effect_blur"/>
- <element name="clrChange" tokenid="ooxml:EG_Effect_clrChange"/>
- <element name="clrRepl" tokenid="ooxml:EG_Effect_clrRepl"/>
- <element name="duotone" tokenid="ooxml:EG_Effect_duotone"/>
- <element name="fill" tokenid="ooxml:EG_Effect_fill"/>
- <element name="fillOverlay" tokenid="ooxml:EG_Effect_fillOverlay"/>
- <element name="glow" tokenid="ooxml:EG_Effect_glow"/>
- <element name="grayscl" tokenid="ooxml:EG_Effect_grayscl"/>
- <element name="hsl" tokenid="ooxml:EG_Effect_hsl"/>
- <element name="innerShdw" tokenid="ooxml:EG_Effect_innerShdw"/>
- <element name="lum" tokenid="ooxml:EG_Effect_lum"/>
- <element name="outerShdw" tokenid="ooxml:EG_Effect_outerShdw"/>
- <element name="prstShdw" tokenid="ooxml:EG_Effect_prstShdw"/>
- <element name="reflection" tokenid="ooxml:EG_Effect_reflection"/>
- <element name="relOff" tokenid="ooxml:EG_Effect_relOff"/>
- <element name="softEdge" tokenid="ooxml:EG_Effect_softEdge"/>
- <element name="tint" tokenid="ooxml:EG_Effect_tint"/>
- <element name="xfrm" tokenid="ooxml:EG_Effect_xfrm"/>
- </resource>
- <resource name="ST_EffectContainerType" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_EffectContainerType_sib">sib</value>
- <value tokenid="ooxml:Value_drawingml_ST_EffectContainerType_tree">tree</value>
- </resource>
- <resource name="CT_EffectContainer" resource="Properties">
- <attribute name="type" tokenid="ooxml:CT_EffectContainer_type"/>
- <attribute name="name" tokenid="ooxml:CT_EffectContainer_name"/>
- </resource>
- </namespace>
- <namespace name="dml-shapeLineProperties">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <include href="dml-shapeEffects"/>
- <define name="ST_LineEndType">
- <choice>
- <!-- None -->
- <value>none</value>
- <!-- Triangle Arrow Head -->
- <value>triangle</value>
- <!-- Stealth Arrow -->
- <value>stealth</value>
- <!-- Diamond -->
- <value>diamond</value>
- <!-- Oval -->
- <value>oval</value>
- <!-- Arrow Head -->
- <value>arrow</value>
- </choice>
- </define>
- <define name="ST_LineEndWidth">
- <choice>
- <!-- Small -->
- <value>sm</value>
- <!-- Medium -->
- <value>med</value>
- <!-- Large -->
- <value>lg</value>
- </choice>
- </define>
- <define name="ST_LineEndLength">
- <choice>
- <!-- Small -->
- <value>sm</value>
- <!-- Medium -->
- <value>med</value>
- <!-- Large -->
- <value>lg</value>
- </choice>
- </define>
- <define name="CT_LineEndProperties">
- <attribute name="type">
- <ref name="ST_LineEndType"/>
- </attribute>
- <attribute name="w">
- <ref name="ST_LineEndWidth"/>
- </attribute>
- <attribute name="len">
- <ref name="ST_LineEndLength"/>
- </attribute>
- </define>
- <define name="EG_LineFillProperties">
- <choice>
- <element name="noFill">
- <ref name="CT_NoFillProperties"/>
- </element>
- <element name="solidFill">
- <ref name="CT_SolidColorFillProperties"/>
- </element>
- <element name="gradFill">
- <ref name="CT_GradientFillProperties"/>
- </element>
- <element name="pattFill">
- <ref name="CT_PatternFillProperties"/>
- </element>
- </choice>
- </define>
- <define name="CT_LineJoinBevel">
- </define>
- <define name="CT_LineJoinRound">
- </define>
- <define name="CT_LineJoinMiterProperties">
- <attribute name="lim">
- <ref name="ST_PositivePercentage"/>
- </attribute>
- </define>
- <define name="EG_LineJoinProperties">
- <choice>
- <element name="round">
- <ref name="CT_LineJoinRound"/>
- </element>
- <element name="bevel">
- <ref name="CT_LineJoinBevel"/>
- </element>
- <element name="miter">
- <ref name="CT_LineJoinMiterProperties"/>
- </element>
- </choice>
- </define>
- <define name="ST_PresetLineDashVal">
- <choice>
- <!-- Solid -->
- <value>solid</value>
- <!-- Dot -->
- <value>dot</value>
- <!-- Dash -->
- <value>dash</value>
- <!-- Large Dash -->
- <value>lgDash</value>
- <!-- Dash Dot -->
- <value>dashDot</value>
- <!-- Large Dash Dot -->
- <value>lgDashDot</value>
- <!-- Large Dash Dot Dot -->
- <value>lgDashDotDot</value>
- <!-- System Dash -->
- <value>sysDash</value>
- <!-- System Dot -->
- <value>sysDot</value>
- <!-- System Dash Dot -->
- <value>sysDashDot</value>
- <!-- System Dash Dot Dot -->
- <value>sysDashDotDot</value>
- </choice>
- </define>
- <define name="CT_PresetLineDashProperties">
- <attribute name="val">
- <ref name="ST_PresetLineDashVal"/>
- </attribute>
- </define>
- <define name="CT_DashStop">
- <attribute name="d">
- <ref name="ST_PositivePercentage"/>
- </attribute>
- <attribute name="sp">
- <ref name="ST_PositivePercentage"/>
- </attribute>
- </define>
- <define name="CT_DashStopList">
- <element name="ds">
- <ref name="CT_DashStop"/>
- </element>
- </define>
- <define name="EG_LineDashProperties">
- <choice>
- <element name="prstDash">
- <ref name="CT_PresetLineDashProperties"/>
- </element>
- <element name="custDash">
- <ref name="CT_DashStopList"/>
- </element>
- </choice>
- </define>
- <define name="ST_LineCap">
- <choice>
- <!-- Round Line Cap -->
- <value>rnd</value>
- <!-- Square Line Cap -->
- <value>sq</value>
- <!-- Flat Line Cap -->
- <value>flat</value>
- </choice>
- </define>
- <define name="ST_LineWidth">
- </define>
- <define name="ST_PenAlignment">
- <choice>
- <!-- Center Alignment -->
- <value>ctr</value>
- <!-- Inset Alignment -->
- <value>in</value>
- </choice>
- </define>
- <define name="ST_CompoundLine">
- <choice>
- <!-- Single Line -->
- <value>sng</value>
- <!-- Double Lines -->
- <value>dbl</value>
- <!-- Thick Thin Double Lines -->
- <value>thickThin</value>
- <!-- Thin Thick Double Lines -->
- <value>thinThick</value>
- <!-- Thin Thick Thin Triple Lines -->
- <value>tri</value>
- </choice>
- </define>
- <define name="CT_LineProperties">
- <ref name="EG_LineFillProperties"/>
- <ref name="EG_LineDashProperties"/>
- <ref name="EG_LineJoinProperties"/>
- <element name="headEnd">
- <ref name="CT_LineEndProperties"/>
- </element>
- <element name="tailEnd">
- <ref name="CT_LineEndProperties"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="w">
- <ref name="ST_LineWidth"/>
- </attribute>
- <attribute name="cap">
- <ref name="ST_LineCap"/>
- </attribute>
- <attribute name="cmpd">
- <ref name="ST_CompoundLine"/>
- </attribute>
- <attribute name="algn">
- <ref name="ST_PenAlignment"/>
- </attribute>
- </define>
- </grammar>
- <resource name="ST_LineEndType" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_LineEndType_none">none</value>
- <value tokenid="ooxml:Value_drawingml_ST_LineEndType_triangle">triangle</value>
- <value tokenid="ooxml:Value_drawingml_ST_LineEndType_stealth">stealth</value>
- <value tokenid="ooxml:Value_drawingml_ST_LineEndType_diamond">diamond</value>
- <value tokenid="ooxml:Value_drawingml_ST_LineEndType_oval">oval</value>
- <value tokenid="ooxml:Value_drawingml_ST_LineEndType_arrow">arrow</value>
- </resource>
- <resource name="ST_LineEndWidth" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_LineEndWidth_sm">sm</value>
- <value tokenid="ooxml:Value_drawingml_ST_LineEndWidth_med">med</value>
- <value tokenid="ooxml:Value_drawingml_ST_LineEndWidth_lg">lg</value>
- </resource>
- <resource name="ST_LineEndLength" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_LineEndLength_sm">sm</value>
- <value tokenid="ooxml:Value_drawingml_ST_LineEndLength_med">med</value>
- <value tokenid="ooxml:Value_drawingml_ST_LineEndLength_lg">lg</value>
- </resource>
- <resource name="CT_LineEndProperties" resource="Properties">
- <attribute name="type" tokenid="ooxml:CT_LineEndProperties_type"/>
- <attribute name="w" tokenid="ooxml:CT_LineEndProperties_w"/>
- <attribute name="len" tokenid="ooxml:CT_LineEndProperties_len"/>
- </resource>
- <resource name="EG_LineFillProperties" resource="Properties">
- <element name="noFill" tokenid="ooxml:EG_LineFillProperties_noFill"/>
- <element name="solidFill" tokenid="ooxml:EG_LineFillProperties_solidFill"/>
- <element name="gradFill" tokenid="ooxml:EG_LineFillProperties_gradFill"/>
- <element name="pattFill" tokenid="ooxml:EG_LineFillProperties_pattFill"/>
- </resource>
- <resource name="ST_PresetLineDashVal" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_PresetLineDashVal_solid">solid</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetLineDashVal_dot">dot</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetLineDashVal_dash">dash</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetLineDashVal_lgDash">lgDash</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetLineDashVal_dashDot">dashDot</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetLineDashVal_lgDashDot">lgDashDot</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetLineDashVal_lgDashDotDot">lgDashDotDot</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetLineDashVal_sysDash">sysDash</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetLineDashVal_sysDot">sysDot</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetLineDashVal_sysDashDot">sysDashDot</value>
- <value tokenid="ooxml:Value_drawingml_ST_PresetLineDashVal_sysDashDotDot">sysDashDotDot</value>
- </resource>
- <resource name="ST_LineCap" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_LineCap_rnd">rnd</value>
- <value tokenid="ooxml:Value_drawingml_ST_LineCap_sq">sq</value>
- <value tokenid="ooxml:Value_drawingml_ST_LineCap_flat">flat</value>
- </resource>
- <resource name="ST_PenAlignment" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_PenAlignment_ctr">ctr</value>
- <value tokenid="ooxml:Value_drawingml_ST_PenAlignment_in">in</value>
- </resource>
- <resource name="ST_CompoundLine" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_CompoundLine_sng">sng</value>
- <value tokenid="ooxml:Value_drawingml_ST_CompoundLine_dbl">dbl</value>
- <value tokenid="ooxml:Value_drawingml_ST_CompoundLine_thickThin">thickThin</value>
- <value tokenid="ooxml:Value_drawingml_ST_CompoundLine_thinThick">thinThick</value>
- <value tokenid="ooxml:Value_drawingml_ST_CompoundLine_tri">tri</value>
- </resource>
- <resource name="CT_LineProperties" resource="Properties">
- <element name="headEnd" tokenid="ooxml:CT_LineProperties_headEnd"/>
- <element name="tailEnd" tokenid="ooxml:CT_LineProperties_tailEnd"/>
- <element name="extLst" tokenid="ooxml:CT_LineProperties_extLst"/>
- <attribute name="w" tokenid="ooxml:CT_LineProperties_w"/>
- <attribute name="cap" tokenid="ooxml:CT_LineProperties_cap"/>
- <attribute name="cmpd" tokenid="ooxml:CT_LineProperties_cmpd"/>
- <attribute name="algn" tokenid="ooxml:CT_LineProperties_algn"/>
- </resource>
- </namespace>
- <namespace name="dml-shapeProperties">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <include href="dml-shape3DStyles"/>
- <include href="dml-shape3DScene"/>
- <include href="dml-shapeGeometry"/>
- <include href="dml-shapeEffects"/>
- <include href="dml-shapeLineProperties"/>
- <define name="CT_ShapeProperties">
- <element name="xfrm">
- <ref name="CT_Transform2D"/>
- </element>
- <ref name="EG_Geometry"/>
- <ref name="EG_FillProperties"/>
- <element name="ln">
- <ref name="CT_LineProperties"/>
- </element>
- <ref name="EG_EffectProperties"/>
- <element name="scene3d">
- <ref name="CT_Scene3D"/>
- </element>
- <element name="sp3d">
- <ref name="CT_Shape3D"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="bwMode">
- <ref name="ST_BlackWhiteMode"/>
- </attribute>
- </define>
- <define name="CT_GroupShapeProperties">
- <element name="xfrm">
- <ref name="CT_GroupTransform2D"/>
- </element>
- <ref name="EG_FillProperties"/>
- <ref name="EG_EffectProperties"/>
- <element name="scene3d">
- <ref name="CT_Scene3D"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="bwMode">
- <ref name="ST_BlackWhiteMode"/>
- </attribute>
- </define>
- </grammar>
- <resource name="CT_ShapeProperties" resource="Properties">
- <element name="xfrm" tokenid="ooxml:CT_ShapeProperties_xfrm"/>
- <element name="ln" tokenid="ooxml:CT_ShapeProperties_ln"/>
- <element name="scene3d" tokenid="ooxml:CT_ShapeProperties_scene3d"/>
- <element name="sp3d" tokenid="ooxml:CT_ShapeProperties_sp3d"/>
- <element name="extLst" tokenid="ooxml:CT_ShapeProperties_extLst"/>
- <attribute name="bwMode" tokenid="ooxml:CT_ShapeProperties_bwMode"/>
- </resource>
- </namespace>
- <namespace name="dml-baseTypes">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <include href="shared-relationshipReference"/>
- <define name="adec_decorative_val">
- <attribute name="val">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="adec_decorative">
- <element name="adec:decorative">
- <ref name="adec_decorative_val"/>
- </element>
- </define>
- <define name="CT_OfficeArtExtension">
- <choice>
- <!-- add implemented extensions here so they can be processed -->
- <ref name="adec_decorative"/>
- <element>
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- </choice>
- <attribute name="uri">
- <data type="token"/>
- </attribute>
- </define>
- <define name="ST_Coordinate">
- <data type="long"/>
- </define>
- <define name="ST_PositiveCoordinate">
- <data type="long"/>
- </define>
- <define name="ST_Angle">
- <data type="int"/>
- </define>
- <define name="CT_Angle">
- <attribute name="val">
- <ref name="ST_Angle"/>
- </attribute>
- </define>
- <define name="ST_FixedAngle">
- </define>
- <define name="ST_PositiveFixedAngle">
- </define>
- <define name="CT_PositiveFixedAngle">
- <attribute name="val">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- </define>
- <define name="ST_Percentage">
- <data type="int"/>
- </define>
- <define name="CT_Percentage">
- <attribute name="val">
- <ref name="ST_Percentage"/>
- </attribute>
- </define>
- <define name="ST_PositivePercentage">
- </define>
- <define name="CT_PositivePercentage">
- <attribute name="val">
- <ref name="ST_PositivePercentage"/>
- </attribute>
- </define>
- <define name="ST_FixedPercentage">
- </define>
- <define name="CT_FixedPercentage">
- <attribute name="val">
- <ref name="ST_FixedPercentage"/>
- </attribute>
- </define>
- <define name="ST_PositiveFixedPercentage">
- </define>
- <define name="CT_PositiveFixedPercentage">
- <attribute name="val">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- </define>
- <define name="CT_Ratio">
- <attribute name="n">
- <data type="long"/>
- </attribute>
- <attribute name="d">
- <data type="long"/>
- </attribute>
- </define>
- <define name="CT_Point2D">
- <attribute name="x">
- <ref name="ST_Coordinate"/>
- </attribute>
- <attribute name="y">
- <ref name="ST_Coordinate"/>
- </attribute>
- </define>
- <define name="CT_PositiveSize2D">
- <attribute name="cx">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="cy">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- </define>
- <define name="CT_ComplementTransform">
- </define>
- <define name="CT_InverseTransform">
- </define>
- <define name="CT_GrayscaleTransform">
- </define>
- <define name="CT_GammaTransform">
- </define>
- <define name="CT_InverseGammaTransform">
- </define>
- <define name="EG_ColorTransform">
- <choice>
- <element name="tint">
- <ref name="CT_PositiveFixedPercentage"/>
- </element>
- <element name="shade">
- <ref name="CT_PositiveFixedPercentage"/>
- </element>
- <element name="comp">
- <ref name="CT_ComplementTransform"/>
- </element>
- <element name="inv">
- <ref name="CT_InverseTransform"/>
- </element>
- <element name="gray">
- <ref name="CT_GrayscaleTransform"/>
- </element>
- <element name="alpha">
- <ref name="CT_PositiveFixedPercentage"/>
- </element>
- <element name="alphaOff">
- <ref name="CT_FixedPercentage"/>
- </element>
- <element name="alphaMod">
- <ref name="CT_PositivePercentage"/>
- </element>
- <element name="hue">
- <ref name="CT_PositiveFixedAngle"/>
- </element>
- <element name="hueOff">
- <ref name="CT_Angle"/>
- </element>
- <element name="hueMod">
- <ref name="CT_PositivePercentage"/>
- </element>
- <element name="sat">
- <ref name="CT_Percentage"/>
- </element>
- <element name="satOff">
- <ref name="CT_Percentage"/>
- </element>
- <element name="satMod">
- <ref name="CT_Percentage"/>
- </element>
- <element name="lum">
- <ref name="CT_Percentage"/>
- </element>
- <element name="lumOff">
- <ref name="CT_Percentage"/>
- </element>
- <element name="lumMod">
- <ref name="CT_Percentage"/>
- </element>
- <element name="red">
- <ref name="CT_Percentage"/>
- </element>
- <element name="redOff">
- <ref name="CT_Percentage"/>
- </element>
- <element name="redMod">
- <ref name="CT_Percentage"/>
- </element>
- <element name="green">
- <ref name="CT_Percentage"/>
- </element>
- <element name="greenOff">
- <ref name="CT_Percentage"/>
- </element>
- <element name="greenMod">
- <ref name="CT_Percentage"/>
- </element>
- <element name="blue">
- <ref name="CT_Percentage"/>
- </element>
- <element name="blueOff">
- <ref name="CT_Percentage"/>
- </element>
- <element name="blueMod">
- <ref name="CT_Percentage"/>
- </element>
- <element name="gamma">
- <ref name="CT_GammaTransform"/>
- </element>
- <element name="invGamma">
- <ref name="CT_InverseGammaTransform"/>
- </element>
- </choice>
- </define>
- <define name="CT_ScRgbColor">
- <ref name="EG_ColorTransform"/>
- <attribute name="r">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="g">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="b">
- <ref name="ST_Percentage"/>
- </attribute>
- </define>
- <define name="ST_HexBinary3">
- <data type="hexBinary"/>
- </define>
- <define name="CT_SRgbColor">
- <ref name="EG_ColorTransform"/>
- <attribute name="val">
- <ref name="ST_HexBinary3"/>
- </attribute>
- </define>
- <define name="CT_HslColor">
- <ref name="EG_ColorTransform"/>
- <attribute name="hue">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="sat">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="lum">
- <ref name="ST_Percentage"/>
- </attribute>
- </define>
- <define name="ST_SystemColorVal">
- <choice>
- <!-- Scroll Bar System Color -->
- <value>scrollBar</value>
- <!-- Background System Color -->
- <value>background</value>
- <!-- Active Caption System Color -->
- <value>activeCaption</value>
- <!-- Inactive Caption System Color -->
- <value>inactiveCaption</value>
- <!-- Menu System Color -->
- <value>menu</value>
- <!-- Window System Color -->
- <value>window</value>
- <!-- Window Frame System Color -->
- <value>windowFrame</value>
- <!-- Menu Text System Color -->
- <value>menuText</value>
- <!-- Window Text System Color -->
- <value>windowText</value>
- <!-- Caption Text System Color -->
- <value>captionText</value>
- <!-- Active Border System Color -->
- <value>activeBorder</value>
- <!-- Inactive Border System Color -->
- <value>inactiveBorder</value>
- <!-- Application Workspace System Color -->
- <value>appWorkspace</value>
- <!-- Highlight System Color -->
- <value>highlight</value>
- <!-- Highlight Text System Color -->
- <value>highlightText</value>
- <!-- Button Face System Color -->
- <value>btnFace</value>
- <!-- Button Shadow System Color -->
- <value>btnShadow</value>
- <!-- Gray Text System Color -->
- <value>grayText</value>
- <!-- Button Text System Color -->
- <value>btnText</value>
- <!-- Inactive Caption Text System Color -->
- <value>inactiveCaptionText</value>
- <!-- Button Highlight System Color -->
- <value>btnHighlight</value>
- <!-- 3D Dark System Color -->
- <value>3dDkShadow</value>
- <!-- 3D Light System Color -->
- <value>3dLight</value>
- <!-- Info Text System Color -->
- <value>infoText</value>
- <!-- Info Back System Color -->
- <value>infoBk</value>
- <!-- Hot Light System Color -->
- <value>hotLight</value>
- <!-- Gradient Active Caption System Color -->
- <value>gradientActiveCaption</value>
- <!-- Gradient Inactive Caption System Color -->
- <value>gradientInactiveCaption</value>
- <!-- Menu Highlight System Color -->
- <value>menuHighlight</value>
- <!-- Menu Bar System Color -->
- <value>menuBar</value>
- </choice>
- </define>
- <define name="CT_SystemColor">
- <ref name="EG_ColorTransform"/>
- <attribute name="val">
- <ref name="ST_SystemColorVal"/>
- </attribute>
- <attribute name="lastClr">
- <ref name="ST_HexBinary3"/>
- </attribute>
- </define>
- <define name="ST_SchemeColorVal">
- <choice>
- <!-- Background Color 1 -->
- <value>bg1</value>
- <!-- Text Color 1 -->
- <value>tx1</value>
- <!-- Background Color 2 -->
- <value>bg2</value>
- <!-- Text Color 2 -->
- <value>tx2</value>
- <!-- Accent Color 1 -->
- <value>accent1</value>
- <!-- Accent Color 2 -->
- <value>accent2</value>
- <!-- Accent Color 3 -->
- <value>accent3</value>
- <!-- Accent Color 4 -->
- <value>accent4</value>
- <!-- Accent Color 5 -->
- <value>accent5</value>
- <!-- Accent Color 6 -->
- <value>accent6</value>
- <!-- Hyperlink Color -->
- <value>hlink</value>
- <!-- Followed Hyperlink Color -->
- <value>folHlink</value>
- <!-- Style Color -->
- <value>phClr</value>
- <!-- Dark Color 1 -->
- <value>dk1</value>
- <!-- Light Color 1 -->
- <value>lt1</value>
- <!-- Dark Color 2 -->
- <value>dk2</value>
- <!-- Light Color 2 -->
- <value>lt2</value>
- </choice>
- </define>
- <define name="CT_SchemeColor">
- <ref name="EG_ColorTransform"/>
- <attribute name="val">
- <ref name="ST_SchemeColorVal"/>
- </attribute>
- </define>
- <define name="ST_PresetColorVal">
- <choice>
- <!-- Alice Blue Preset Color -->
- <value>aliceBlue</value>
- <!-- Antique White Preset Color -->
- <value>antiqueWhite</value>
- <!-- Aqua Preset Color -->
- <value>aqua</value>
- <!-- Aquamarine Preset Color -->
- <value>aquamarine</value>
- <!-- Azure Preset Color -->
- <value>azure</value>
- <!-- Beige Preset Color -->
- <value>beige</value>
- <!-- Bisque Preset Color -->
- <value>bisque</value>
- <!-- Black Preset Color -->
- <value>black</value>
- <!-- Blanched Almond Preset Color -->
- <value>blanchedAlmond</value>
- <!-- Blue Preset Color -->
- <value>blue</value>
- <!-- Blue Violet Preset Color -->
- <value>blueViolet</value>
- <!-- Brown Preset Color -->
- <value>brown</value>
- <!-- Burly Wood Preset Color -->
- <value>burlyWood</value>
- <!-- Cadet Blue Preset Color -->
- <value>cadetBlue</value>
- <!-- Chartreuse Preset Color -->
- <value>chartreuse</value>
- <!-- Chocolate Preset Color -->
- <value>chocolate</value>
- <!-- Coral Preset Color -->
- <value>coral</value>
- <!-- Cornflower Blue Preset Color -->
- <value>cornflowerBlue</value>
- <!-- Cornsilk Preset Color -->
- <value>cornsilk</value>
- <!-- Crimson Preset Color -->
- <value>crimson</value>
- <!-- Cyan Preset Color -->
- <value>cyan</value>
- <!-- Dark Blue Preset Color -->
- <value>dkBlue</value>
- <!-- Dark Cyan Preset Color -->
- <value>dkCyan</value>
- <!-- Dark Goldenrod Preset Color -->
- <value>dkGoldenrod</value>
- <!-- Dark Gray Preset Color -->
- <value>dkGray</value>
- <!-- Dark Green Preset Color -->
- <value>dkGreen</value>
- <!-- Dark Khaki Preset Color -->
- <value>dkKhaki</value>
- <!-- Dark Magenta Preset Color -->
- <value>dkMagenta</value>
- <!-- Dark Olive Green Preset Color -->
- <value>dkOliveGreen</value>
- <!-- Dark Orange Preset Color -->
- <value>dkOrange</value>
- <!-- Dark Orchid Preset Color -->
- <value>dkOrchid</value>
- <!-- Dark Red Preset Color -->
- <value>dkRed</value>
- <!-- Dark Salmon Preset Color -->
- <value>dkSalmon</value>
- <!-- Dark Sea Green Preset Color -->
- <value>dkSeaGreen</value>
- <!-- Dark Slate Blue Preset Color -->
- <value>dkSlateBlue</value>
- <!-- Dark Slate Gray Preset Color -->
- <value>dkSlateGray</value>
- <!-- Dark Turquoise Preset Color -->
- <value>dkTurquoise</value>
- <!-- Dark Violet Preset Color -->
- <value>dkViolet</value>
- <!-- Deep Pink Preset Color -->
- <value>deepPink</value>
- <!-- Deep Sky Blue Preset Color -->
- <value>deepSkyBlue</value>
- <!-- Dim Gray Preset Color -->
- <value>dimGray</value>
- <!-- Dodger Blue Preset Color -->
- <value>dodgerBlue</value>
- <!-- Firebrick Preset Color -->
- <value>firebrick</value>
- <!-- Floral White Preset Color -->
- <value>floralWhite</value>
- <!-- Forest Green Preset Color -->
- <value>forestGreen</value>
- <!-- Fuchsia Preset Color -->
- <value>fuchsia</value>
- <!-- Gainsboro Preset Color -->
- <value>gainsboro</value>
- <!-- Ghost White Preset Color -->
- <value>ghostWhite</value>
- <!-- Gold Preset Color -->
- <value>gold</value>
- <!-- Goldenrod Preset Color -->
- <value>goldenrod</value>
- <!-- Gray Preset Color -->
- <value>gray</value>
- <!-- Green Preset Color -->
- <value>green</value>
- <!-- Green Yellow Preset Color -->
- <value>greenYellow</value>
- <!-- Honeydew Preset Color -->
- <value>honeydew</value>
- <!-- Hot Pink Preset Color -->
- <value>hotPink</value>
- <!-- Indian Red Preset Color -->
- <value>indianRed</value>
- <!-- Indigo Preset Color -->
- <value>indigo</value>
- <!-- Ivory Preset Color -->
- <value>ivory</value>
- <!-- Khaki Preset Color -->
- <value>khaki</value>
- <!-- Lavender Preset Color -->
- <value>lavender</value>
- <!-- Lavender Blush Preset Color -->
- <value>lavenderBlush</value>
- <!-- Lawn Green Preset Color -->
- <value>lawnGreen</value>
- <!-- Lemon Chiffon Preset Color -->
- <value>lemonChiffon</value>
- <!-- Light Blue Preset Color -->
- <value>ltBlue</value>
- <!-- Light Coral Preset Color -->
- <value>ltCoral</value>
- <!-- Light Cyan Preset Color -->
- <value>ltCyan</value>
- <!-- Light Goldenrod Yellow Preset Color -->
- <value>ltGoldenrodYellow</value>
- <!-- Light Gray Preset Color -->
- <value>ltGray</value>
- <!-- Light Green Preset Color -->
- <value>ltGreen</value>
- <!-- Light Pink Preset Color -->
- <value>ltPink</value>
- <!-- Light Salmon Preset Color -->
- <value>ltSalmon</value>
- <!-- Light Sea Green Preset Color -->
- <value>ltSeaGreen</value>
- <!-- Light Sky Blue Preset Color -->
- <value>ltSkyBlue</value>
- <!-- Light Slate Gray Preset Color -->
- <value>ltSlateGray</value>
- <!-- Light Steel Blue Preset Color -->
- <value>ltSteelBlue</value>
- <!-- Light Yellow Preset Color -->
- <value>ltYellow</value>
- <!-- Lime Preset Color -->
- <value>lime</value>
- <!-- Lime Green Preset Color -->
- <value>limeGreen</value>
- <!-- Linen Preset Color -->
- <value>linen</value>
- <!-- Magenta Preset Color -->
- <value>magenta</value>
- <!-- Maroon Preset Color -->
- <value>maroon</value>
- <!-- Medium Aquamarine Preset Color -->
- <value>medAquamarine</value>
- <!-- Medium Blue Preset Color -->
- <value>medBlue</value>
- <!-- Medium Orchid Preset Color -->
- <value>medOrchid</value>
- <!-- Medium Purple Preset Color -->
- <value>medPurple</value>
- <!-- Medium Sea Green Preset Color -->
- <value>medSeaGreen</value>
- <!-- Medium Slate Blue Preset Color -->
- <value>medSlateBlue</value>
- <!-- Medium Spring Green Preset Color -->
- <value>medSpringGreen</value>
- <!-- Medium Turquoise Preset Color -->
- <value>medTurquoise</value>
- <!-- Medium Violet Red Preset Color -->
- <value>medVioletRed</value>
- <!-- Midnight Blue Preset Color -->
- <value>midnightBlue</value>
- <!-- Mint Cream Preset Color -->
- <value>mintCream</value>
- <!-- Misty Rose Preset Color -->
- <value>mistyRose</value>
- <!-- Moccasin Preset Color -->
- <value>moccasin</value>
- <!-- Navajo White Preset Color -->
- <value>navajoWhite</value>
- <!-- Navy Preset Color -->
- <value>navy</value>
- <!-- Old Lace Preset Color -->
- <value>oldLace</value>
- <!-- Olive Preset Color -->
- <value>olive</value>
- <!-- Olive Drab Preset Color -->
- <value>oliveDrab</value>
- <!-- Orange Preset Color -->
- <value>orange</value>
- <!-- Orange Red Preset Color -->
- <value>orangeRed</value>
- <!-- Orchid Preset Color -->
- <value>orchid</value>
- <!-- Pale Goldenrod Preset Color -->
- <value>paleGoldenrod</value>
- <!-- Pale Green Preset Color -->
- <value>paleGreen</value>
- <!-- Pale Turquoise Preset Color -->
- <value>paleTurquoise</value>
- <!-- Pale Violet Red Preset Color -->
- <value>paleVioletRed</value>
- <!-- Papaya Whip Preset Color -->
- <value>papayaWhip</value>
- <!-- Peach Puff Preset Color -->
- <value>peachPuff</value>
- <!-- Peru Preset Color -->
- <value>peru</value>
- <!-- Pink Preset Color -->
- <value>pink</value>
- <!-- Plum Preset Color -->
- <value>plum</value>
- <!-- Powder Blue Preset Color -->
- <value>powderBlue</value>
- <!-- Purple Preset Color -->
- <value>purple</value>
- <!-- Red Preset Color -->
- <value>red</value>
- <!-- Rosy Brown Preset Color -->
- <value>rosyBrown</value>
- <!-- Royal Blue Preset Color -->
- <value>royalBlue</value>
- <!-- Saddle Brown Preset Color -->
- <value>saddleBrown</value>
- <!-- Salmon Preset Color -->
- <value>salmon</value>
- <!-- Sandy Brown Preset Color -->
- <value>sandyBrown</value>
- <!-- Sea Green Preset Color -->
- <value>seaGreen</value>
- <!-- Sea Shell Preset Color -->
- <value>seaShell</value>
- <!-- Sienna Preset Color -->
- <value>sienna</value>
- <!-- Silver Preset Color -->
- <value>silver</value>
- <!-- Sky Blue Preset Color -->
- <value>skyBlue</value>
- <!-- Slate Blue Preset Color -->
- <value>slateBlue</value>
- <!-- Slate Gray Preset Color -->
- <value>slateGray</value>
- <!-- Snow Preset Color -->
- <value>snow</value>
- <!-- Spring Green Preset Color -->
- <value>springGreen</value>
- <!-- Steel Blue Preset Color -->
- <value>steelBlue</value>
- <!-- Tan Preset Color -->
- <value>tan</value>
- <!-- Teal Preset Color -->
- <value>teal</value>
- <!-- Thistle Preset Color -->
- <value>thistle</value>
- <!-- Tomato Preset Color -->
- <value>tomato</value>
- <!-- Turquoise Preset Color -->
- <value>turquoise</value>
- <!-- Violet Preset Color -->
- <value>violet</value>
- <!-- Wheat Preset Color -->
- <value>wheat</value>
- <!-- White Preset Color -->
- <value>white</value>
- <!-- White Smoke Preset Color -->
- <value>whiteSmoke</value>
- <!-- Yellow Preset Color -->
- <value>yellow</value>
- <!-- Yellow Green Preset Color -->
- <value>yellowGreen</value>
- </choice>
- </define>
- <define name="CT_PresetColor">
- <ref name="EG_ColorTransform"/>
- <attribute name="val">
- <ref name="ST_PresetColorVal"/>
- </attribute>
- </define>
- <define name="EG_OfficeArtExtensionList">
- <element name="ext">
- <ref name="CT_OfficeArtExtension"/>
- </element>
- </define>
- <define name="CT_OfficeArtExtensionList">
- <ref name="EG_OfficeArtExtensionList"/>
- </define>
- <define name="CT_Scale2D">
- <element name="sx">
- <ref name="CT_Ratio"/>
- </element>
- <element name="sy">
- <ref name="CT_Ratio"/>
- </element>
- </define>
- <define name="CT_Transform2D">
- <element name="off">
- <ref name="CT_Point2D"/>
- </element>
- <element name="ext">
- <ref name="CT_PositiveSize2D"/>
- </element>
- <attribute name="rot">
- <ref name="ST_Angle"/>
- </attribute>
- <attribute name="flipH">
- <data type="boolean"/>
- </attribute>
- <attribute name="flipV">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_GroupTransform2D">
- <element name="off">
- <ref name="CT_Point2D"/>
- </element>
- <element name="ext">
- <ref name="CT_PositiveSize2D"/>
- </element>
- <element name="chOff">
- <ref name="CT_Point2D"/>
- </element>
- <element name="chExt">
- <ref name="CT_PositiveSize2D"/>
- </element>
- <attribute name="rot">
- <ref name="ST_Angle"/>
- </attribute>
- <attribute name="flipH">
- <data type="boolean"/>
- </attribute>
- <attribute name="flipV">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_Point3D">
- <attribute name="x">
- <ref name="ST_Coordinate"/>
- </attribute>
- <attribute name="y">
- <ref name="ST_Coordinate"/>
- </attribute>
- <attribute name="z">
- <ref name="ST_Coordinate"/>
- </attribute>
- </define>
- <define name="CT_Vector3D">
- <attribute name="dx">
- <ref name="ST_Coordinate"/>
- </attribute>
- <attribute name="dy">
- <ref name="ST_Coordinate"/>
- </attribute>
- <attribute name="dz">
- <ref name="ST_Coordinate"/>
- </attribute>
- </define>
- <define name="CT_SphereCoords">
- <attribute name="lat">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="lon">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="rev">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- </define>
- <define name="CT_RelativeRect">
- <attribute name="l">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="t">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="r">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="b">
- <ref name="ST_Percentage"/>
- </attribute>
- </define>
- <define name="ST_RectAlignment">
- <choice>
- <!-- Rectangle Alignment Enum ( Top Left ) -->
- <value>tl</value>
- <!-- Rectangle Alignment Enum ( Top ) -->
- <value>t</value>
- <!-- Rectangle Alignment Enum ( Top Right ) -->
- <value>tr</value>
- <!-- Rectangle Alignment Enum ( Left ) -->
- <value>l</value>
- <!-- Rectangle Alignment Enum ( Center ) -->
- <value>ctr</value>
- <!-- Rectangle Alignment Enum ( Right ) -->
- <value>r</value>
- <!-- Rectangle Alignment Enum ( Bottom Left ) -->
- <value>bl</value>
- <!-- Rectangle Alignment Enum ( Bottom ) -->
- <value>b</value>
- <!-- Rectangle Alignment Enum ( Bottom Right ) -->
- <value>br</value>
- </choice>
- </define>
- <define name="EG_ColorChoice">
- <choice>
- <element name="scrgbClr">
- <ref name="CT_ScRgbColor"/>
- </element>
- <element name="srgbClr">
- <ref name="CT_SRgbColor"/>
- </element>
- <element name="hslClr">
- <ref name="CT_HslColor"/>
- </element>
- <element name="sysClr">
- <ref name="CT_SystemColor"/>
- </element>
- <element name="schemeClr">
- <ref name="CT_SchemeColor"/>
- </element>
- <element name="prstClr">
- <ref name="CT_PresetColor"/>
- </element>
- </choice>
- </define>
- <define name="CT_Color">
- <ref name="EG_ColorChoice"/>
- </define>
- <define name="CT_ColorMRU">
- <ref name="EG_ColorChoice"/>
- </define>
- <define name="ST_BlackWhiteMode">
- <choice>
- <!-- Color -->
- <value>clr</value>
- <!-- Automatic -->
- <value>auto</value>
- <!-- Gray -->
- <value>gray</value>
- <!-- Light Gray -->
- <value>ltGray</value>
- <!-- Inverse Gray -->
- <value>invGray</value>
- <!-- Gray and White -->
- <value>grayWhite</value>
- <!-- Black and Gray -->
- <value>blackGray</value>
- <!-- Black and White -->
- <value>blackWhite</value>
- <!-- Black -->
- <value>black</value>
- <!-- White -->
- <value>white</value>
- <!-- Hidden -->
- <value>hidden</value>
- </choice>
- </define>
- <define name="AG_Blob">
- <attribute name="r:embed">
- <data type="string"/>
- </attribute>
- <attribute name="r:link">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_EmbeddedWAVAudioFile">
- <attribute name="r:embed"/>
- <attribute name="name">
- <data type="string"/>
- </attribute>
- <attribute name="builtIn">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_Hyperlink">
- <element name="snd">
- <ref name="CT_EmbeddedWAVAudioFile"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="r:id"/>
- <attribute name="invalidUrl">
- <data type="string"/>
- </attribute>
- <attribute name="action">
- <data type="string"/>
- </attribute>
- <attribute name="tgtFrame">
- <data type="string"/>
- </attribute>
- <attribute name="tooltip">
- <data type="string"/>
- </attribute>
- <attribute name="history">
- <data type="boolean"/>
- </attribute>
- <attribute name="highlightClick">
- <data type="boolean"/>
- </attribute>
- <attribute name="endSnd">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="ST_DrawingElementId">
- <data type="unsignedInt"/>
- </define>
- </grammar>
- <resource name="CT_OfficeArtExtension" resource="Stream">
- <element name="adec:decorative" tokenid="ooxml:CT_OfficeArtExtension_Decorative"/>
- </resource>
- <!-- this is not ideal, but unlike more obvious variants it appears to work -->
- <resource name="adec_decorative" resource="Stream"/>
- <resource name="adec_decorative_val" resource="Properties">
- <attribute name="val" tokenid="ooxml:OfficeArtExtension_Decorative_val"/>
- </resource>
- <resource name="ST_Coordinate" resource="Integer"/>
- <resource name="ST_PositiveCoordinate" resource="Integer"/>
- <resource name="ST_Angle" resource="Integer"/>
- <resource name="CT_Angle" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Angle_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="CT_PositiveFixedAngle" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_PositiveFixedAngle_val" action="setValue"/>
- </resource>
- <resource name="ST_Percentage" resource="Integer"/>
- <resource name="CT_Percentage" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Percentage_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="ST_PositivePercentage" resource="Value">
- <action name="characters" action="positivePercentage"/>
- </resource>
- <resource name="CT_PositivePercentage" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_PositivePercentage_val" action="setValue"/>
- </resource>
- <resource name="CT_FixedPercentage" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_FixedPercentage_val" action="setValue"/>
- </resource>
- <resource name="CT_PositiveFixedPercentage" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_PositiveFixedPercentage_val" action="setValue"/>
- </resource>
- <resource name="CT_Point2D" resource="Properties">
- <attribute name="x" tokenid="ooxml:CT_Point2D_x"/>
- <attribute name="y" tokenid="ooxml:CT_Point2D_y"/>
- </resource>
- <resource name="CT_PositiveSize2D" resource="Properties">
- <attribute name="cx" tokenid="ooxml:CT_PositiveSize2D_cx"/>
- <attribute name="cy" tokenid="ooxml:CT_PositiveSize2D_cy"/>
- </resource>
- <resource name="CT_ScRgbColor" resource="Properties">
- <attribute name="r" tokenid="ooxml:CT_ScRgbColor_r"/>
- <attribute name="g" tokenid="ooxml:CT_ScRgbColor_g"/>
- <attribute name="b" tokenid="ooxml:CT_ScRgbColor_b"/>
- </resource>
- <resource name="ST_HexBinary3" resource="Hex"/>
- <resource name="CT_SRgbColor" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_SRgbColor_val"/>
- </resource>
- <resource name="CT_HslColor" resource="Properties">
- <attribute name="hue" tokenid="ooxml:CT_HslColor_hue"/>
- <attribute name="sat" tokenid="ooxml:CT_HslColor_sat"/>
- <attribute name="lum" tokenid="ooxml:CT_HslColor_lum"/>
- </resource>
- <resource name="ST_SystemColorVal" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_scrollBar">scrollBar</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_background">background</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_activeCaption">activeCaption</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_inactiveCaption">inactiveCaption</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_menu">menu</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_window">window</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_windowFrame">windowFrame</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_menuText">menuText</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_windowText">windowText</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_captionText">captionText</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_activeBorder">activeBorder</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_inactiveBorder">inactiveBorder</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_appWorkspace">appWorkspace</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_highlight">highlight</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_highlightText">highlightText</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_btnFace">btnFace</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_btnShadow">btnShadow</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_grayText">grayText</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_btnText">btnText</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_inactiveCaptionText">inactiveCaptionText</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_btnHighlight">btnHighlight</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_3dDkShadow">3dDkShadow</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_3dLight">3dLight</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_infoText">infoText</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_infoBk">infoBk</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_hotLight">hotLight</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_gradientActiveCaption">gradientActiveCaption</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_gradientInactiveCaption">gradientInactiveCaption</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_menuHighlight">menuHighlight</value>
- <value tokenid="ooxml:Value_drawingml_ST_SystemColorVal_menuBar">menuBar</value>
- </resource>
- <resource name="CT_SystemColor" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_SystemColor_val"/>
- <attribute name="lastClr" tokenid="ooxml:CT_SystemColor_lastClr"/>
- </resource>
- <resource name="ST_SchemeColorVal" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_bg1">bg1</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_tx1">tx1</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_bg2">bg2</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_tx2">tx2</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_accent1">accent1</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_accent2">accent2</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_accent3">accent3</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_accent4">accent4</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_accent5">accent5</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_accent6">accent6</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_hlink">hlink</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_folHlink">folHlink</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_phClr">phClr</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_dk1">dk1</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_lt1">lt1</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_dk2">dk2</value>
- <value tokenid="ooxml:Value_drawingml_ST_SchemeColorVal_lt2">lt2</value>
- </resource>
- <resource name="CT_SchemeColor" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_SchemeColor_val"/>
- </resource>
- <resource name="ST_PresetColorVal" resource="List">
- <value tokenid="ooxml:Value_ST_PresetColorVal_aliceBlue">aliceBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_antiqueWhite">antiqueWhite</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_aqua">aqua</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_aquamarine">aquamarine</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_azure">azure</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_beige">beige</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_bisque">bisque</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_black">black</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_blanchedAlmond">blanchedAlmond</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_blue">blue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_blueViolet">blueViolet</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_brown">brown</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_burlyWood">burlyWood</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_cadetBlue">cadetBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_chartreuse">chartreuse</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_chocolate">chocolate</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_coral">coral</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_cornflowerBlue">cornflowerBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_cornsilk">cornsilk</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_crimson">crimson</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_cyan">cyan</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_deepPink">deepPink</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_deepSkyBlue">deepSkyBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dimGray">dimGray</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkBlue">dkBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkCyan">dkCyan</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkGoldenrod">dkGoldenrod</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkGray">dkGray</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkGreen">dkGreen</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkKhaki">dkKhaki</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkMagenta">dkMagenta</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkOliveGreen">dkOliveGreen</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkOrange">dkOrange</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkOrchid">dkOrchid</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkRed">dkRed</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkSalmon">dkSalmon</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkSeaGreen">dkSeaGreen</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkSlateBlue">dkSlateBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkSlateGray">dkSlateGray</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkTurquoise">dkTurquoise</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dkViolet">dkViolet</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_dodgerBlue">dodgerBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_firebrick">firebrick</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_floralWhite">floralWhite</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_forestGreen">forestGreen</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_fuchsia">fuchsia</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_gainsboro">gainsboro</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ghostWhite">ghostWhite</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_gold">gold</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_goldenrod">goldenrod</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_gray">gray</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_green">green</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_greenYellow">greenYellow</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_honeydew">honeydew</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_hotPink">hotPink</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_indianRed">indianRed</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_indigo">indigo</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ivory">ivory</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_khaki">khaki</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_lavender">lavender</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_lavenderBlush">lavenderBlush</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_lawnGreen">lawnGreen</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_lemonChiffon">lemonChiffon</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_lime">lime</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_limeGreen">limeGreen</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_linen">linen</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ltBlue">ltBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ltCoral">ltCoral</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ltCyan">ltCyan</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ltGoldenrodYellow">ltGoldenrodYellow</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ltGray">ltGray</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ltGreen">ltGreen</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ltPink">ltPink</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ltSalmon">ltSalmon</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ltSeaGreen">ltSeaGreen</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ltSkyBlue">ltSkyBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ltSlateGray">ltSlateGray</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ltSteelBlue">ltSteelBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_ltYellow">ltYellow</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_magenta">magenta</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_maroon">maroon</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_medAquamarine">medAquamarine</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_medBlue">medBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_medOrchid">medOrchid</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_medPurple">medPurple</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_medSeaGreen">medSeaGreen</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_medSlateBlue">medSlateBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_medSpringGreen">medSpringGreen</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_medTurquoise">medTurquoise</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_medVioletRed">medVioletRed</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_midnightBlue">midnightBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_mintCream">mintCream</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_mistyRose">mistyRose</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_moccasin">moccasin</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_navajoWhite">navajoWhite</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_navy">navy</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_oldLace">oldLace</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_olive">olive</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_oliveDrab">oliveDrab</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_orange">orange</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_orangeRed">orangeRed</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_orchid">orchid</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_paleGoldenrod">paleGoldenrod</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_paleGreen">paleGreen</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_paleTurquoise">paleTurquoise</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_paleVioletRed">paleVioletRed</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_papayaWhip">papayaWhip</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_peachPuff">peachPuff</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_peru">peru</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_pink">pink</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_plum">plum</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_powderBlue">powderBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_purple">purple</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_red">red</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_rosyBrown">rosyBrown</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_royalBlue">royalBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_saddleBrown">saddleBrown</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_salmon">salmon</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_sandyBrown">sandyBrown</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_seaGreen">seaGreen</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_seaShell">seaShell</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_sienna">sienna</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_silver">silver</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_skyBlue">skyBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_slateBlue">slateBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_slateGray">slateGray</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_snow">snow</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_springGreen">springGreen</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_steelBlue">steelBlue</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_tan">tan</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_teal">teal</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_thistle">thistle</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_tomato">tomato</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_turquoise">turquoise</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_violet">violet</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_wheat">wheat</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_white">white</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_whiteSmoke">whiteSmoke</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_yellow">yellow</value>
- <value tokenid="ooxml:Value_ST_PresetColorVal_yellowGreen">yellowGreen</value>
- </resource>
- <resource name="CT_PresetColor" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_PresetColor_val"/>
- </resource>
- <resource name="CT_Transform2D" resource="Properties">
- <element name="off" tokenid="ooxml:CT_Transform2D_off"/>
- <element name="ext" tokenid="ooxml:CT_Transform2D_ext"/>
- <attribute name="rot" tokenid="ooxml:CT_Transform2D_rot"/>
- <attribute name="flipH" tokenid="ooxml:CT_Transform2D_flipH"/>
- <attribute name="flipV" tokenid="ooxml:CT_Transform2D_flipV"/>
- </resource>
- <resource name="ST_RectAlignment" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_RectAlignment_tl">tl</value>
- <value tokenid="ooxml:Value_drawingml_ST_RectAlignment_t">t</value>
- <value tokenid="ooxml:Value_drawingml_ST_RectAlignment_tr">tr</value>
- <value tokenid="ooxml:Value_drawingml_ST_RectAlignment_l">l</value>
- <value tokenid="ooxml:Value_drawingml_ST_RectAlignment_ctr">ctr</value>
- <value tokenid="ooxml:Value_drawingml_ST_RectAlignment_r">r</value>
- <value tokenid="ooxml:Value_drawingml_ST_RectAlignment_bl">bl</value>
- <value tokenid="ooxml:Value_drawingml_ST_RectAlignment_b">b</value>
- <value tokenid="ooxml:Value_drawingml_ST_RectAlignment_br">br</value>
- </resource>
- <resource name="EG_ColorChoice" resource="Properties">
- <element name="scrgbClr" tokenid="ooxml:EG_ColorChoice_scrgbClr"/>
- <element name="srgbClr" tokenid="ooxml:EG_ColorChoice_srgbClr"/>
- <element name="hslClr" tokenid="ooxml:EG_ColorChoice_hslClr"/>
- <element name="sysClr" tokenid="ooxml:EG_ColorChoice_sysClr"/>
- <element name="schemeClr" tokenid="ooxml:EG_ColorChoice_schemeClr"/>
- <element name="prstClr" tokenid="ooxml:EG_ColorChoice_prstClr"/>
- </resource>
- <resource name="CT_Color" resource="Properties"/>
- <resource name="CT_ColorMRU" resource="Properties"/>
- <resource name="ST_BlackWhiteMode" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_BlackWhiteMode_clr">clr</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlackWhiteMode_auto">auto</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlackWhiteMode_gray">gray</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlackWhiteMode_ltGray">ltGray</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlackWhiteMode_invGray">invGray</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlackWhiteMode_grayWhite">grayWhite</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlackWhiteMode_blackGray">blackGray</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlackWhiteMode_blackWhite">blackWhite</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlackWhiteMode_black">black</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlackWhiteMode_white">white</value>
- <value tokenid="ooxml:Value_drawingml_ST_BlackWhiteMode_hidden">hidden</value>
- </resource>
- <resource name="AG_Blob" resource="Properties">
- <attribute name="r:embed" tokenid="ooxml:AG_Blob_r_embed"/>
- <attribute name="r:link" tokenid="ooxml:AG_Blob_r_link"/>
- </resource>
- <resource name="ST_DrawingElementId" resource="Integer"/>
- </namespace>
- <namespace name="dml-documentProperties">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <include href="dml-shapeGeometry"/>
- <define name="AG_Locking">
- <attribute name="noGrp">
- <data type="boolean"/>
- </attribute>
- <attribute name="noSelect">
- <data type="boolean"/>
- </attribute>
- <attribute name="noRot">
- <data type="boolean"/>
- </attribute>
- <attribute name="noChangeAspect">
- <data type="boolean"/>
- </attribute>
- <attribute name="noMove">
- <data type="boolean"/>
- </attribute>
- <attribute name="noResize">
- <data type="boolean"/>
- </attribute>
- <attribute name="noEditPoints">
- <data type="boolean"/>
- </attribute>
- <attribute name="noAdjustHandles">
- <data type="boolean"/>
- </attribute>
- <attribute name="noChangeArrowheads">
- <data type="boolean"/>
- </attribute>
- <attribute name="noChangeShapeType">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_ConnectorLocking">
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <ref name="AG_Locking"/>
- </define>
- <define name="CT_ShapeLocking">
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <ref name="AG_Locking"/>
- <attribute name="noTextEdit">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_PictureLocking">
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <ref name="AG_Locking"/>
- <attribute name="noCrop">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_GroupLocking">
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="noGrp">
- <data type="boolean"/>
- </attribute>
- <attribute name="noUngrp">
- <data type="boolean"/>
- </attribute>
- <attribute name="noSelect">
- <data type="boolean"/>
- </attribute>
- <attribute name="noRot">
- <data type="boolean"/>
- </attribute>
- <attribute name="noChangeAspect">
- <data type="boolean"/>
- </attribute>
- <attribute name="noMove">
- <data type="boolean"/>
- </attribute>
- <attribute name="noResize">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_GraphicalObjectFrameLocking">
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="noGrp">
- <data type="boolean"/>
- </attribute>
- <attribute name="noDrilldown">
- <data type="boolean"/>
- </attribute>
- <attribute name="noSelect">
- <data type="boolean"/>
- </attribute>
- <attribute name="noChangeAspect">
- <data type="boolean"/>
- </attribute>
- <attribute name="noMove">
- <data type="boolean"/>
- </attribute>
- <attribute name="noResize">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_NonVisualDrawingProps">
- <element name="a:hlinkClick">
- <ref name="CT_Hyperlink_URL"/>
- </element>
- <element name="hlinkHover">
- <ref name="CT_Hyperlink"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="id">
- <ref name="ST_DrawingElementId"/>
- </attribute>
- <attribute name="name">
- <data type="string"/>
- </attribute>
- <attribute name="descr">
- <data type="string"/>
- </attribute>
- <attribute name="hidden">
- <data type="boolean"/>
- </attribute>
- <attribute name="title">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Hyperlink_URL">
- <attribute name="r:id">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_NonVisualDrawingShapeProps">
- <element name="spLocks">
- <ref name="CT_ShapeLocking"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="txBox">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_NonVisualConnectorProperties">
- <element name="cxnSpLocks">
- <ref name="CT_ConnectorLocking"/>
- </element>
- <element name="stCxn">
- <ref name="CT_Connection"/>
- </element>
- <element name="endCxn">
- <ref name="CT_Connection"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- </define>
- <define name="CT_NonVisualPictureProperties">
- <element name="picLocks">
- <ref name="CT_PictureLocking"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- <attribute name="preferRelativeResize">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_NonVisualGroupDrawingShapeProps">
- <element name="grpSpLocks">
- <ref name="CT_GroupLocking"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- </define>
- <define name="CT_NonVisualGraphicFrameProperties">
- <element name="graphicFrameLocks">
- <ref name="CT_GraphicalObjectFrameLocking"/>
- </element>
- <element name="extLst">
- <ref name="CT_OfficeArtExtensionList"/>
- </element>
- </define>
- </grammar>
- <resource name="CT_Hyperlink_URL" resource="Properties">
- <attribute name="r:id" tokenid="ooxml:CT_Hyperlink_URL"/>
- <action name="start" action="handleHyperlinkURL"/>
- </resource>
- <resource name="CT_GraphicalObjectFrameLocking" resource="Properties">
- <element name="extLst" tokenid="ooxml:CT_GraphicalObjectFrameLocking_extLst"/>
- <attribute name="noGrp" tokenid="ooxml:CT_GraphicalObjectFrameLocking_noGrp"/>
- <attribute name="noDrilldown" tokenid="ooxml:CT_GraphicalObjectFrameLocking_noDrilldown"/>
- <attribute name="noSelect" tokenid="ooxml:CT_GraphicalObjectFrameLocking_noSelect"/>
- <attribute name="noChangeAspect" tokenid="ooxml:CT_GraphicalObjectFrameLocking_noChangeAspect"/>
- <attribute name="noMove" tokenid="ooxml:CT_GraphicalObjectFrameLocking_noMove"/>
- <attribute name="noResize" tokenid="ooxml:CT_GraphicalObjectFrameLocking_noResize"/>
- </resource>
- <resource name="CT_OfficeArtExtensionList" resource="Properties">
- <element name="ext" tokenid="ooxml:CT_OfficeArtExtension"/>
- </resource>
- <resource name="CT_NonVisualDrawingProps" resource="Properties">
- <element name="a:hlinkClick" tokenid="ooxml:CT_NonVisualDrawingProps_a_hlinkClick"/>
- <element name="hlinkHover" tokenid="ooxml:CT_NonVisualDrawingProps_hlinkHover"/>
- <element name="extLst" tokenid="ooxml:CT_NonVisualDrawingProps_extLst"/>
- <attribute name="id" tokenid="ooxml:CT_NonVisualDrawingProps_id"/>
- <attribute name="name" tokenid="ooxml:CT_NonVisualDrawingProps_name"/>
- <attribute name="descr" tokenid="ooxml:CT_NonVisualDrawingProps_descr"/>
- <attribute name="hidden" tokenid="ooxml:CT_NonVisualDrawingProps_hidden"/>
- <attribute name="title" tokenid="ooxml:CT_NonVisualDrawingProps_title"/>
- </resource>
- <resource name="CT_NonVisualPictureProperties" resource="Properties">
- <element name="picLocks" tokenid="ooxml:CT_NonVisualPictureProperties_picLocks"/>
- <element name="extLst" tokenid="ooxml:CT_NonVisualPictureProperties_extLst"/>
- <attribute name="preferRelativeResize" tokenid="ooxml:CT_NonVisualPictureProperties_preferRelativeResize"/>
- </resource>
- <resource name="CT_NonVisualGraphicFrameProperties" resource="Properties">
- <element name="graphicFrameLocks" tokenid="ooxml:CT_NonVisualGraphicFrameProperties_graphicFrameLocks"/>
- <element name="extLst" tokenid="ooxml:CT_NonVisualGraphicFrameProperties_extLst"/>
- </resource>
- </namespace>
- <namespace name="dml-graphicalObject">
- <start name="graphic"/>
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <!-- ISO RELAX NG Schema -->
- <!-- start = graphic -->
- <define name="CT_GraphicalObjectData">
- <ref name="pic"/>
- <ref name="relIds"/>
- <ref name="lockedCanvas"/>
- <ref name="chart"/>
- <ref name="wsp"/>
- <ref name="wgp"/>
- <ref name="wpc"/>
- <element>
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <attribute name="uri">
- <data type="token"/>
- </attribute>
- </define>
- <define name="CT_GraphicalObject">
- <element name="graphicData">
- <ref name="CT_GraphicalObjectData"/>
- </element>
- </define>
- <define name="graphic">
- <element name="graphic">
- <ref name="CT_GraphicalObject"/>
- </element>
- </define>
- </grammar>
- <resource name="CT_GraphicalObjectData" resource="Properties">
- <element name="pic" tokenid="ooxml:CT_GraphicalObjectData_pic"/>
- <element name="relIds" tokenid="ooxml:CT_GraphicalObjectData_relIds"/>
- <element name="lockedCanvas" tokenid="ooxml:CT_GraphicalObjectData_lockedCanvas"/>
- <element name="chart" tokenid="ooxml:CT_GraphicalObjectData_chart"/>
- <element name="wsp" tokenid="ooxml:CT_GraphicalObjectData_wsp"/>
- <element name="wgp" tokenid="ooxml:CT_GraphicalObjectData_wgp"/>
- <element name="wpc" tokenid="ooxml:CT_GraphicalObjectData_wpc"/>
- <attribute name="uri" tokenid="ooxml:CT_GraphicalObjectData_uri"/>
- </resource>
- <resource name="CT_GraphicalObject" resource="Properties">
- <element name="graphicData" tokenid="ooxml:CT_GraphicalObject_graphicData"/>
- </resource>
- <resource name="graphic" resource="Properties">
- <element name="graphic" tokenid="ooxml:graphic_graphic"/>
- </resource>
- </namespace>
- <namespace name="wp14">
- <start name="sizeRelH"/>
- <start name="sizeRelV"/>
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing">
- <define name="ST_SizeRelFromH">
- <choice>
- <value>margin</value>
- <value>page</value>
- <value>leftMargin</value>
- <value>rightMargin</value>
- <value>insideMargin</value>
- <value>outsideMargin</value>
- </choice>
- </define>
- <define name="ST_SizeRelFromV">
- <choice>
- <value>margin</value>
- <value>page</value>
- <value>topMargin</value>
- <value>bottomMargin</value>
- <value>insideMargin</value>
- <value>outsideMargin</value>
- </choice>
- </define>
- <define name="CT_SizeRelH">
- <element name="pctWidth">
- <ref name="ST_PositivePercentage"/>
- </element>
- <attribute name="relativeFrom">
- <ref name="ST_SizeRelFromH"/>
- </attribute>
- </define>
- <define name="CT_SizeRelV">
- <element name="pctHeight">
- <ref name="ST_PositivePercentage"/>
- </element>
- <attribute name="relativeFrom">
- <ref name="ST_SizeRelFromV"/>
- </attribute>
- </define>
- <define name="sizeRelH">
- <element name="sizeRelH">
- <ref name="CT_SizeRelH"/>
- </element>
- </define>
- <define name="sizeRelV">
- <element name="sizeRelV">
- <ref name="CT_SizeRelV"/>
- </element>
- </define>
- </grammar>
- <resource name="ST_SizeRelFromH" resource="List">
- <value tokenid="ooxml:ST_SizeRelFromH_margin">margin</value>
- <value tokenid="ooxml:ST_SizeRelFromH_page">page</value>
- <value tokenid="ooxml:ST_SizeRelFromH_leftMargin">leftMargin</value>
- <value tokenid="ooxml:ST_SizeRelFromH_rightMargin">rightMargin</value>
- <value tokenid="ooxml:ST_SizeRelFromH_insideMargin">insideMargin</value>
- <value tokenid="ooxml:ST_SizeRelFromH_outsideMargin">outsideMargin</value>
- </resource>
- <resource name="ST_SizeRelFromV" resource="List">
- <value tokenid="ooxml:ST_SizeRelFromV_margin">margin</value>
- <value tokenid="ooxml:ST_SizeRelFromV_page">page</value>
- <value tokenid="ooxml:ST_SizeRelFromV_topMargin">topMargin</value>
- <value tokenid="ooxml:ST_SizeRelFromV_bottomMargin">bottomMargin</value>
- <value tokenid="ooxml:ST_SizeRelFromV_insideMargin">insideMargin</value>
- <value tokenid="ooxml:ST_SizeRelFromV_outsideMargin">outsideMargin</value>
- </resource>
- <resource name="CT_SizeRelH" resource="Properties">
- <element name="pctWidth" tokenid="ooxml:CT_SizeRelH_pctWidth"/>
- <attribute name="relativeFrom" tokenid="ooxml:CT_SizeRelH_relativeFrom"/>
- </resource>
- <resource name="CT_SizeRelV" resource="Properties">
- <element name="pctHeight" tokenid="ooxml:CT_SizeRelV_pctHeight"/>
- <attribute name="relativeFrom" tokenid="ooxml:CT_SizeRelV_relativeFrom"/>
- </resource>
- <resource name="sizeRelH" resource="Properties">
- <element name="sizeRelH" tokenid="ooxml:sizeRelH_sizeRelH"/>
- </resource>
- <resource name="sizeRelV" resource="Properties">
- <element name="sizeRelV" tokenid="ooxml:sizeRelV_sizeRelV"/>
- </resource>
- </namespace>
- <namespace name="w14">
- <start name="glow"/>
- <start name="shadow"/>
- <start name="reflection"/>
- <start name="textOutline"/>
- <start name="textFill"/>
- <start name="scene3d"/>
- <start name="props3d"/>
- <start name="ligatures"/>
- <start name="numForm"/>
- <start name="numSpacing"/>
- <start name="stylisticSets"/>
- <start name="cntxtAlts"/>
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.microsoft.com/office/word/2010/wordml" attributeFormDefault="qualified">
- <define name="ST_SchemeColorVal">
- <choice>
- <value>bg1</value>
- <value>tx1</value>
- <value>bg2</value>
- <value>tx2</value>
- <value>accent1</value>
- <value>accent2</value>
- <value>accent3</value>
- <value>accent4</value>
- <value>accent5</value>
- <value>accent6</value>
- <value>hlink</value>
- <value>folHlink</value>
- <value>dk1</value>
- <value>lt1</value>
- <value>dk2</value>
- <value>lt2</value>
- <value>phClr</value>
- </choice>
- </define>
- <define name="ST_RectAlignment">
- <choice>
- <value>none</value>
- <value>tl</value>
- <value>t</value>
- <value>tr</value>
- <value>l</value>
- <value>ctr</value>
- <value>r</value>
- <value>bl</value>
- <value>b</value>
- <value>br</value>
- </choice>
- </define>
- <define name="ST_LineCap">
- <choice>
- <value>rnd</value>
- <value>sq</value>
- <value>flat</value>
- </choice>
- </define>
- <define name="ST_CompoundLine">
- <choice>
- <value>sng</value>
- <value>dbl</value>
- <value>thickThin</value>
- <value>thinThick</value>
- <value>tri</value>
- </choice>
- </define>
- <define name="ST_PenAlignment">
- <choice>
- <value>ctr</value>
- <value>in</value>
- </choice>
- </define>
- <define name="ST_OnOff">
- <choice>
- <value>true</value>
- <value>false</value>
- <value>0</value>
- <value>1</value>
- </choice>
- </define>
- <define name="ST_PathShadeType">
- <choice>
- <value>shape</value>
- <value>circle</value>
- <value>rect</value>
- </choice>
- </define>
- <define name="ST_PresetLineDashVal">
- <choice>
- <value>solid</value>
- <value>dot</value>
- <value>sysDot</value>
- <value>dash</value>
- <value>sysDash</value>
- <value>lgDash</value>
- <value>dashDot</value>
- <value>sysDashDot</value>
- <value>lgDashDot</value>
- <value>lgDashDotDot</value>
- <value>sysDashDotDot</value>
- </choice>
- </define>
- <define name="ST_PresetCameraType">
- <choice>
- <value>legacyObliqueTopLeft</value>
- <value>legacyObliqueTop</value>
- <value>legacyObliqueTopRight</value>
- <value>legacyObliqueLeft</value>
- <value>legacyObliqueFront</value>
- <value>legacyObliqueRight</value>
- <value>legacyObliqueBottomLeft</value>
- <value>legacyObliqueBottom</value>
- <value>legacyObliqueBottomRight</value>
- <value>legacyPerspectiveTopLeft</value>
- <value>legacyPerspectiveTop</value>
- <value>legacyPerspectiveTopRight</value>
- <value>legacyPerspectiveLeft</value>
- <value>legacyPerspectiveFront</value>
- <value>legacyPerspectiveRight</value>
- <value>legacyPerspectiveBottomLeft</value>
- <value>legacyPerspectiveBottom</value>
- <value>legacyPerspectiveBottomRight</value>
- <value>orthographicFront</value>
- <value>isometricTopUp</value>
- <value>isometricTopDown</value>
- <value>isometricBottomUp</value>
- <value>isometricBottomDown</value>
- <value>isometricLeftUp</value>
- <value>isometricLeftDown</value>
- <value>isometricRightUp</value>
- <value>isometricRightDown</value>
- <value>isometricOffAxis1Left</value>
- <value>isometricOffAxis1Right</value>
- <value>isometricOffAxis1Top</value>
- <value>isometricOffAxis2Left</value>
- <value>isometricOffAxis2Right</value>
- <value>isometricOffAxis2Top</value>
- <value>isometricOffAxis3Left</value>
- <value>isometricOffAxis3Right</value>
- <value>isometricOffAxis3Bottom</value>
- <value>isometricOffAxis4Left</value>
- <value>isometricOffAxis4Right</value>
- <value>isometricOffAxis4Bottom</value>
- <value>obliqueTopLeft</value>
- <value>obliqueTop</value>
- <value>obliqueTopRight</value>
- <value>obliqueLeft</value>
- <value>obliqueRight</value>
- <value>obliqueBottomLeft</value>
- <value>obliqueBottom</value>
- <value>obliqueBottomRight</value>
- <value>perspectiveFront</value>
- <value>perspectiveLeft</value>
- <value>perspectiveRight</value>
- <value>perspectiveAbove</value>
- <value>perspectiveBelow</value>
- <value>perspectiveAboveLeftFacing</value>
- <value>perspectiveAboveRightFacing</value>
- <value>perspectiveContrastingLeftFacing</value>
- <value>perspectiveContrastingRightFacing</value>
- <value>perspectiveHeroicLeftFacing</value>
- <value>perspectiveHeroicRightFacing</value>
- <value>perspectiveHeroicExtremeLeftFacing</value>
- <value>perspectiveHeroicExtremeRightFacing</value>
- <value>perspectiveRelaxed</value>
- <value>perspectiveRelaxedModerately</value>
- </choice>
- </define>
- <define name="ST_LightRigType">
- <choice>
- <value>legacyFlat1</value>
- <value>legacyFlat2</value>
- <value>legacyFlat3</value>
- <value>legacyFlat4</value>
- <value>legacyNormal1</value>
- <value>legacyNormal2</value>
- <value>legacyNormal3</value>
- <value>legacyNormal4</value>
- <value>legacyHarsh1</value>
- <value>legacyHarsh2</value>
- <value>legacyHarsh3</value>
- <value>legacyHarsh4</value>
- <value>threePt</value>
- <value>balanced</value>
- <value>soft</value>
- <value>harsh</value>
- <value>flood</value>
- <value>contrasting</value>
- <value>morning</value>
- <value>sunrise</value>
- <value>sunset</value>
- <value>chilly</value>
- <value>freezing</value>
- <value>flat</value>
- <value>twoPt</value>
- <value>glow</value>
- <value>brightRoom</value>
- </choice>
- </define>
- <define name="ST_LightRigDirection">
- <choice>
- <value>tl</value>
- <value>t</value>
- <value>tr</value>
- <value>l</value>
- <value>r</value>
- <value>bl</value>
- <value>b</value>
- <value>br</value>
- </choice>
- </define>
- <define name="ST_BevelPresetType">
- <choice>
- <value>relaxedInset</value>
- <value>circle</value>
- <value>slope</value>
- <value>cross</value>
- <value>angle</value>
- <value>softRound</value>
- <value>convex</value>
- <value>coolSlant</value>
- <value>divot</value>
- <value>riblet</value>
- <value>hardEdge</value>
- <value>artDeco</value>
- </choice>
- </define>
- <define name="ST_PresetMaterialType">
- <choice>
- <value>legacyMatte</value>
- <value>legacyPlastic</value>
- <value>legacyMetal</value>
- <value>legacyWireframe</value>
- <value>matte</value>
- <value>plastic</value>
- <value>metal</value>
- <value>warmMatte</value>
- <value>translucentPowder</value>
- <value>powder</value>
- <value>dkEdge</value>
- <value>softEdge</value>
- <value>clear</value>
- <value>flat</value>
- <value>softmetal</value>
- <value>none</value>
- </choice>
- </define>
- <define name="ST_Ligatures">
- <choice>
- <value>none</value>
- <value>standard</value>
- <value>contextual</value>
- <value>historical</value>
- <value>discretional</value>
- <value>standardContextual</value>
- <value>standardHistorical</value>
- <value>contextualHistorical</value>
- <value>standardDiscretional</value>
- <value>contextualDiscretional</value>
- <value>historicalDiscretional</value>
- <value>standardContextualHistorical</value>
- <value>standardContextualDiscretional</value>
- <value>standardHistoricalDiscretional</value>
- <value>contextualHistoricalDiscretional</value>
- <value>all</value>
- </choice>
- </define>
- <define name="ST_NumForm">
- <choice>
- <value>default</value>
- <value>lining</value>
- <value>oldStyle</value>
- </choice>
- </define>
- <define name="ST_NumSpacing">
- <choice>
- <value>default</value>
- <value>proportional</value>
- <value>tabular</value>
- </choice>
- </define>
-
- <define name="ST_PositiveCoordinate">
- <data type="long"/>
- </define>
- <define name="ST_HexColorRGB">
- <data type="hexBinary"/>
- </define>
- <define name="ST_PositiveFixedPercentage">
- <data type="long"/>
- </define>
- <define name="ST_PositivePercentage">
- <data type="long"/>
- </define>
- <define name="ST_Percentage">
- <data type="long"/>
- </define>
- <define name="ST_PositiveFixedAngle">
- <data type="int"/>
- </define>
- <define name="ST_FixedAngle">
- <data type="int"/>
- </define>
- <define name="ST_LineWidth">
- <data type="int"/>
- </define>
- <define name="ST_UnsignedDecimalNumber">
- <data type="unsignedLong"/>
- </define>
-
- <define name="EG_ColorChoice">
- <choice>
- <element name="srgbClr">
- <ref name="CT_SRgbColor"/>
- </element>
- <element name="schemeClr">
- <ref name="CT_SchemeColor"/>
- </element>
- </choice>
- </define>
- <define name="EG_ColorTransform">
- <choice>
- <element name="tint">
- <ref name="CT_PositiveFixedPercentage"/>
- </element>
- <element name="shade">
- <ref name="CT_PositiveFixedPercentage"/>
- </element>
- <element name="alpha">
- <ref name="CT_PositiveFixedPercentage"/>
- </element>
- <element name="hueMod">
- <ref name="CT_PositivePercentage"/>
- </element>
- <element name="sat">
- <ref name="CT_Percentage"/>
- </element>
- <element name="satOff">
- <ref name="CT_Percentage"/>
- </element>
- <element name="satMod">
- <ref name="CT_Percentage"/>
- </element>
- <element name="lum">
- <ref name="CT_Percentage"/>
- </element>
- <element name="lumOff">
- <ref name="CT_Percentage"/>
- </element>
- <element name="lumMod">
- <ref name="CT_Percentage"/>
- </element>
- </choice>
- </define>
- <define name="EG_FillProperties">
- <choice>
- <element name="noFill">
- <ref name="CT_Empty"/>
- </element>
- <element name="solidFill">
- <ref name="CT_SolidColorFillProperties"/>
- </element>
- <element name="gradFill">
- <ref name="CT_GradientFillProperties"/>
- </element>
- </choice>
- </define>
- <define name="EG_ShadeProperties">
- <choice>
- <element name="lin">
- <ref name="CT_LinearShadeProperties"/>
- </element>
- <element name="path">
- <ref name="CT_PathShadeProperties"/>
- </element>
- </choice>
- </define>
- <define name="EG_LineDashProperties">
- <choice>
- <element name="prstDash">
- <ref name="CT_PresetLineDashProperties"/>
- </element>
- </choice>
- </define>
- <define name="EG_LineJoinProperties">
- <choice>
- <element name="round">
- <ref name="CT_Empty"/>
- </element>
- <element name="bevel">
- <ref name="CT_Empty"/>
- </element>
- <element name="miter">
- <ref name="CT_LineJoinMiterProperties"/>
- </element>
- </choice>
- </define>
-
- <define name="CT_SRgbColor">
- <ref name="EG_ColorTransform"/>
- <attribute name="val">
- <ref name="ST_HexColorRGB"/>
- </attribute>
- </define>
- <define name="CT_SchemeColor">
- <ref name="EG_ColorTransform"/>
- <attribute name="val">
- <ref name="ST_SchemeColorVal"/>
- </attribute>
- </define>
- <define name="CT_PositiveFixedPercentage">
- <attribute name="val">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- </define>
- <define name="CT_PositivePercentage">
- <attribute name="val">
- <ref name="ST_PositivePercentage"/>
- </attribute>
- </define>
- <define name="CT_Percentage">
- <attribute name="val">
- <ref name="ST_Percentage"/>
- </attribute>
- </define>
- <define name="CT_Empty">
- </define>
- <define name="CT_SolidColorFillProperties">
- <ref name="EG_ColorChoice"/>
- </define>
- <define name="CT_GradientFillProperties">
- <element name="gsLst">
- <ref name="CT_GradientStopList"/>
- </element>
- <ref name="EG_ShadeProperties"/>
- </define>
- <define name="CT_LinearShadeProperties">
- <attribute name="ang">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="scaled">
- <ref name="ST_OnOff"/>
- </attribute>
- </define>
- <define name="CT_PathShadeProperties">
- <element name="fillToRect">
- <ref name="CT_RelativeRect"/>
- </element>
- <attribute name="path">
- <ref name="ST_PathShadeType"/>
- </attribute>
- </define>
- <define name="CT_GradientStopList">
- <element name="gs">
- <ref name="CT_GradientStop"/>
- </element>
- </define>
- <define name="CT_GradientStop">
- <ref name="EG_ColorChoice"/>
- <attribute name="pos">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- </define>
- <define name="CT_RelativeRect">
- <attribute name="l">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="t">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="r">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="b">
- <ref name="ST_Percentage"/>
- </attribute>
- </define>
- <define name="CT_PresetLineDashProperties">
- <attribute name="val">
- <ref name="ST_PresetLineDashVal"/>
- </attribute>
- </define>
- <define name="CT_LineJoinMiterProperties">
- <attribute name="lim">
- <ref name="ST_PositivePercentage"/>
- </attribute>
- </define>
- <define name="CT_Camera">
- <attribute name="prst">
- <ref name="ST_PresetCameraType"/>
- </attribute>
- </define>
- <define name="CT_LightRig">
- <element name="rot">
- <ref name="CT_SphereCoords"/>
- </element>
- <attribute name="rig">
- <ref name="ST_LightRigType"/>
- </attribute>
- <attribute name="dir">
- <ref name="ST_LightRigDirection"/>
- </attribute>
- </define>
- <define name="CT_SphereCoords">
- <attribute name="lat">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="lon">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="rev">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- </define>
- <define name="CT_Bevel">
- <attribute name="w">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="h">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="prst">
- <ref name="ST_BevelPresetType"/>
- </attribute>
- </define>
- <define name="CT_Color">
- <ref name="EG_ColorChoice"/>
- </define>
- <define name="CT_StyleSet">
- <attribute name="id">
- <ref name="ST_UnsignedDecimalNumber"/>
- </attribute>
- <attribute name="val">
- <ref name="ST_OnOff"/>
- </attribute>
- </define>
- <define name="CT_OnOff">
- <attribute name="val">
- <ref name="ST_OnOff"/>
- </attribute>
- </define>
-
-
- <!-- Main Elements-->
- <define name="CT_Glow">
- <ref name="EG_ColorChoice"/>
- <attribute name="rad">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- </define>
- <define name="CT_Shadow">
- <ref name="EG_ColorChoice"/>
- <attribute name="blurRad">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="dist">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="dir">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="sx">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="sy">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="kx">
- <ref name="ST_FixedAngle"/>
- </attribute>
- <attribute name="ky">
- <ref name="ST_FixedAngle"/>
- </attribute>
- <attribute name="algn">
- <ref name="ST_RectAlignment"/>
- </attribute>
- </define>
- <define name="CT_Reflection">
- <attribute name="blurRad">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="stA">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="stPos">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="endA">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="endPos">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="dist">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="dir">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="fadeDir">
- <ref name="ST_PositiveFixedAngle"/>
- </attribute>
- <attribute name="sx">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="sy">
- <ref name="ST_Percentage"/>
- </attribute>
- <attribute name="kx">
- <ref name="ST_FixedAngle"/>
- </attribute>
- <attribute name="ky">
- <ref name="ST_FixedAngle"/>
- </attribute>
- <attribute name="algn">
- <ref name="ST_RectAlignment"/>
- </attribute>
- </define>
- <define name="CT_TextOutlineEffect">
- <ref name="EG_FillProperties"/>
- <ref name="EG_LineDashProperties"/>
- <ref name="EG_LineJoinProperties"/>
- <attribute name="w">
- <ref name="ST_LineWidth"/>
- </attribute>
- <attribute name="cap">
- <ref name="ST_LineCap"/>
- </attribute>
- <attribute name="cmpd">
- <ref name="ST_CompoundLine"/>
- </attribute>
- <attribute name="algn">
- <ref name="ST_PenAlignment"/>
- </attribute>
- </define>
- <define name="CT_FillTextEffect">
- <ref name="EG_FillProperties"/>
- </define>
- <define name="CT_Scene3D">
- <element name="camera">
- <ref name="CT_Camera"/>
- </element>
- <element name="lightRig">
- <ref name="CT_LightRig"/>
- </element>
- </define>
- <define name="CT_Props3D">
- <element name="bevelT">
- <ref name="CT_Bevel"/>
- </element>
- <element name="bevelB">
- <ref name="CT_Bevel"/>
- </element>
- <element name="extrusionClr">
- <ref name="CT_Color"/>
- </element>
- <element name="contourClr">
- <ref name="CT_Color"/>
- </element>
- <attribute name="extrusionH">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="contourW">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="prstMaterial">
- <ref name="ST_PresetMaterialType"/>
- </attribute>
- </define>
- <define name="CT_Ligatures">
- <attribute name="val">
- <ref name="ST_Ligatures"/>
- </attribute>
- </define>
- <define name="CT_NumForm">
- <attribute name="val">
- <ref name="ST_NumForm"/>
- </attribute>
- </define>
- <define name="CT_NumSpacing">
- <attribute name="val">
- <ref name="ST_NumSpacing"/>
- </attribute>
- </define>
- <define name="CT_StylisticSets">
- <element name="styleSet">
- <ref name="CT_StyleSet"/>
- </element>
- </define>
-
- <define name="glow">
- <element name="glow">
- <ref name="CT_Glow"/>
- </element>
- </define>
- <define name="shadow">
- <element name="shadow">
- <ref name="CT_Shadow"/>
- </element>
- </define>
- <define name="reflection">
- <element name="reflection">
- <ref name="CT_Reflection"/>
- </element>
- </define>
- <define name="textOutline">
- <element name="textOutline">
- <ref name="CT_TextOutlineEffect"/>
- </element>
- </define>
- <define name="textFill">
- <element name="textFill">
- <ref name="CT_FillTextEffect"/>
- </element>
- </define>
- <define name="scene3d">
- <element name="scene3d">
- <ref name="CT_Scene3D"/>
- </element>
- </define>
- <define name="props3d">
- <element name="props3d">
- <ref name="CT_Props3D"/>
- </element>
- </define>
- <define name="ligatures">
- <element name="ligatures">
- <ref name="CT_Ligatures"/>
- </element>
- </define>
- <define name="numForm">
- <element name="numForm">
- <ref name="CT_NumForm"/>
- </element>
- </define>
- <define name="numSpacing">
- <element name="numSpacing">
- <ref name="CT_NumSpacing"/>
- </element>
- </define>
- <define name="stylisticSets">
- <element name="stylisticSets">
- <ref name="CT_StylisticSets"/>
- </element>
- </define>
- <define name="cntxtAlts">
- <element name="cntxtAlts">
- <ref name="CT_OnOff"/>
- </element>
- </define>
-
- <define name="ST_String">
- <data type="string"/>
- </define>
- <define name="CT_String">
- <attribute name="val">
- <ref name="ST_String"/>
- </attribute>
- </define>
- <define name="CT_SdtCheckbox">
- <element name="checked">
- <ref name="CT_OnOff"/>
- </element>
- <element name="checkedState">
- <ref name="CT_String"/>
- </element>
- <element name="uncheckedState">
- <ref name="CT_String"/>
- </element>
- </define>
- </grammar>
-
- <!-- Simple Types Resource Definitions -->
- <resource name="CT_String" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_String_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_SdtCheckbox" resource="Properties">
- <element name="checked" tokenid="ooxml:CT_SdtCheckbox_checked"/>
- <element name="checkedState" tokenid="ooxml:CT_SdtCheckbox_checkedState"/>
- <element name="uncheckedState" tokenid="ooxml:CT_SdtCheckbox_uncheckedState"/>
- </resource>
- <resource name="ST_SchemeColorVal" resource="List">
- <value tokenid="ooxml:ST_SchemeColorVal_bg1">bg1</value>
- <value tokenid="ooxml:ST_SchemeColorVal_tx1">tx1</value>
- <value tokenid="ooxml:ST_SchemeColorVal_bg2">bg2</value>
- <value tokenid="ooxml:ST_SchemeColorVal_tx2">tx2</value>
- <value tokenid="ooxml:ST_SchemeColorVal_accent1">accent1</value>
- <value tokenid="ooxml:ST_SchemeColorVal_accent2">accent2</value>
- <value tokenid="ooxml:ST_SchemeColorVal_accent3">accent3</value>
- <value tokenid="ooxml:ST_SchemeColorVal_accent4">accent4</value>
- <value tokenid="ooxml:ST_SchemeColorVal_accent5">accent5</value>
- <value tokenid="ooxml:ST_SchemeColorVal_accent6">accent6</value>
- <value tokenid="ooxml:ST_SchemeColorVal_hlink">hlink</value>
- <value tokenid="ooxml:ST_SchemeColorVal_folHlink">folHlink</value>
- <value tokenid="ooxml:ST_SchemeColorVal_dk1">dk1</value>
- <value tokenid="ooxml:ST_SchemeColorVal_lt1">lt1</value>
- <value tokenid="ooxml:ST_SchemeColorVal_dk2">dk2</value>
- <value tokenid="ooxml:ST_SchemeColorVal_lt2">lt2</value>
- <value tokenid="ooxml:ST_SchemeColorVal_phClr">phClr</value>
- </resource>
- <resource name="ST_RectAlignment" resource="List">
- <value tokenid="ooxml:ST_RectAlignment_none">none</value>
- <value tokenid="ooxml:ST_RectAlignment_tl">tl</value>
- <value tokenid="ooxml:ST_RectAlignment_t">t</value>
- <value tokenid="ooxml:ST_RectAlignment_tr">tr</value>
- <value tokenid="ooxml:ST_RectAlignment_l">l</value>
- <value tokenid="ooxml:ST_RectAlignment_ctr">ctr</value>
- <value tokenid="ooxml:ST_RectAlignment_r">r</value>
- <value tokenid="ooxml:ST_RectAlignment_bl">bl</value>
- <value tokenid="ooxml:ST_RectAlignment_b">b</value>
- <value tokenid="ooxml:ST_RectAlignment_br">br</value>
- </resource>
- <resource name="ST_LineCap" resource="List">
- <value tokenid="ooxml:ST_LineCap_rnd">rnd</value>
- <value tokenid="ooxml:ST_LineCap_sq">sq</value>
- <value tokenid="ooxml:ST_LineCap_flat">flat</value>
- </resource>
- <resource name="ST_CompoundLine" resource="List">
- <value tokenid="ooxml:ST_CompoundLine_sng">sng</value>
- <value tokenid="ooxml:ST_CompoundLine_dbl">dbl</value>
- <value tokenid="ooxml:ST_CompoundLine_thickThin">thickThin</value>
- <value tokenid="ooxml:ST_CompoundLine_thinThick">thinThick</value>
- <value tokenid="ooxml:ST_CompoundLine_tri">tri</value>
- </resource>
- <resource name="ST_PenAlignment" resource="List">
- <value tokenid="ooxml:ST_PenAlignment_ctr">ctr</value>
- <value tokenid="ooxml:ST_PenAlignment_in">in</value>
- </resource>
- <resource name="ST_OnOff" resource="List">
- <value tokenid="ooxml:ST_OnOff_true">true</value>
- <value tokenid="ooxml:ST_OnOff_false">false</value>
- <value tokenid="ooxml:ST_OnOff_0">0</value>
- <value tokenid="ooxml:ST_OnOff_1">1</value>
- </resource>
- <resource name="ST_PathShadeType" resource="List">
- <value tokenid="ooxml:ST_PathShadeType_shape">shape</value>
- <value tokenid="ooxml:ST_PathShadeType_circle">circle</value>
- <value tokenid="ooxml:ST_PathShadeType_rect">rect</value>
- </resource>
- <resource name="ST_PresetLineDashVal" resource="List">
- <value tokenid="ooxml:ST_PresetLineDashVal_solid">solid</value>
- <value tokenid="ooxml:ST_PresetLineDashVal_dot">dot</value>
- <value tokenid="ooxml:ST_PresetLineDashVal_sysDot">sysDot</value>
- <value tokenid="ooxml:ST_PresetLineDashVal_dash">dash</value>
- <value tokenid="ooxml:ST_PresetLineDashVal_sysDash">sysDash</value>
- <value tokenid="ooxml:ST_PresetLineDashVal_lgDash">lgDash</value>
- <value tokenid="ooxml:ST_PresetLineDashVal_dashDot">dashDot</value>
- <value tokenid="ooxml:ST_PresetLineDashVal_sysDashDot">sysDashDot</value>
- <value tokenid="ooxml:ST_PresetLineDashVal_lgDashDot">lgDashDot</value>
- <value tokenid="ooxml:ST_PresetLineDashVal_lgDashDotDot">lgDashDotDot</value>
- <value tokenid="ooxml:ST_PresetLineDashVal_sysDashDotDot">sysDashDotDot</value>
- </resource>
- <resource name="ST_PresetCameraType" resource="List">
- <value tokenid="ooxml:ST_PresetCameraType_legacyObliqueTopLeft">legacyObliqueTopLeft</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyObliqueTop">legacyObliqueTop</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyObliqueTopRight">legacyObliqueTopRight</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyObliqueLeft">legacyObliqueLeft</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyObliqueFront">legacyObliqueFront</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyObliqueRight">legacyObliqueRight</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyObliqueBottomLeft">legacyObliqueBottomLeft</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyObliqueBottom">legacyObliqueBottom</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyObliqueBottomRight">legacyObliqueBottomRight</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyPerspectiveTopLeft">legacyPerspectiveTopLeft</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyPerspectiveTop">legacyPerspectiveTop</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyPerspectiveTopRight">legacyPerspectiveTopRight</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyPerspectiveLeft">legacyPerspectiveLeft</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyPerspectiveFront">legacyPerspectiveFront</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyPerspectiveRight">legacyPerspectiveRight</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyPerspectiveBottomLeft">legacyPerspectiveBottomLeft</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyPerspectiveBottom">legacyPerspectiveBottom</value>
- <value tokenid="ooxml:ST_PresetCameraType_legacyPerspectiveBottomRight">legacyPerspectiveBottomRight</value>
- <value tokenid="ooxml:ST_PresetCameraType_orthographicFront">orthographicFront</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricTopUp">isometricTopUp</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricTopDown">isometricTopDown</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricBottomUp">isometricBottomUp</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricBottomDown">isometricBottomDown</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricLeftUp">isometricLeftUp</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricLeftDown">isometricLeftDown</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricRightUp">isometricRightUp</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricRightDown">isometricRightDown</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricOffAxis1Left">isometricOffAxis1Left</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricOffAxis1Right">isometricOffAxis1Right</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricOffAxis1Top">isometricOffAxis1Top</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricOffAxis2Left">isometricOffAxis2Left</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricOffAxis2Right">isometricOffAxis2Right</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricOffAxis2Top">isometricOffAxis2Top</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricOffAxis3Left">isometricOffAxis3Left</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricOffAxis3Right">isometricOffAxis3Right</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricOffAxis3Bottom">isometricOffAxis3Bottom</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricOffAxis4Left">isometricOffAxis4Left</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricOffAxis4Right">isometricOffAxis4Right</value>
- <value tokenid="ooxml:ST_PresetCameraType_isometricOffAxis4Bottom">isometricOffAxis4Bottom</value>
- <value tokenid="ooxml:ST_PresetCameraType_obliqueTopLeft">obliqueTopLeft</value>
- <value tokenid="ooxml:ST_PresetCameraType_obliqueTop">obliqueTop</value>
- <value tokenid="ooxml:ST_PresetCameraType_obliqueTopRight">obliqueTopRight</value>
- <value tokenid="ooxml:ST_PresetCameraType_obliqueLeft">obliqueLeft</value>
- <value tokenid="ooxml:ST_PresetCameraType_obliqueRight">obliqueRight</value>
- <value tokenid="ooxml:ST_PresetCameraType_obliqueBottomLeft">obliqueBottomLeft</value>
- <value tokenid="ooxml:ST_PresetCameraType_obliqueBottom">obliqueBottom</value>
- <value tokenid="ooxml:ST_PresetCameraType_obliqueBottomRight">obliqueBottomRight</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveFront">perspectiveFront</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveLeft">perspectiveLeft</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveRight">perspectiveRight</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveAbove">perspectiveAbove</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveBelow">perspectiveBelow</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveAboveLeftFacing">perspectiveAboveLeftFacing</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveAboveRightFacing">perspectiveAboveRightFacing</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveContrastingLeftFacing">perspectiveContrastingLeftFacing</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveContrastingRightFacing">perspectiveContrastingRightFacing</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveHeroicLeftFacing">perspectiveHeroicLeftFacing</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveHeroicRightFacing">perspectiveHeroicRightFacing</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveHeroicExtremeLeftFacing">perspectiveHeroicExtremeLeftFacing</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveHeroicExtremeRightFacing">perspectiveHeroicExtremeRightFacing</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveRelaxed">perspectiveRelaxed</value>
- <value tokenid="ooxml:ST_PresetCameraType_perspectiveRelaxedModerately">perspectiveRelaxedModerately</value>
- </resource>
- <resource name="ST_LightRigType" resource="List">
- <value tokenid="ooxml:ST_LightRigType_legacyFlat1">legacyFlat1</value>
- <value tokenid="ooxml:ST_LightRigType_legacyFlat2">legacyFlat2</value>
- <value tokenid="ooxml:ST_LightRigType_legacyFlat3">legacyFlat3</value>
- <value tokenid="ooxml:ST_LightRigType_legacyFlat4">legacyFlat4</value>
- <value tokenid="ooxml:ST_LightRigType_legacyNormal1">legacyNormal1</value>
- <value tokenid="ooxml:ST_LightRigType_legacyNormal2">legacyNormal2</value>
- <value tokenid="ooxml:ST_LightRigType_legacyNormal3">legacyNormal3</value>
- <value tokenid="ooxml:ST_LightRigType_legacyNormal4">legacyNormal4</value>
- <value tokenid="ooxml:ST_LightRigType_legacyHarsh1">legacyHarsh1</value>
- <value tokenid="ooxml:ST_LightRigType_legacyHarsh2">legacyHarsh2</value>
- <value tokenid="ooxml:ST_LightRigType_legacyHarsh3">legacyHarsh3</value>
- <value tokenid="ooxml:ST_LightRigType_legacyHarsh4">legacyHarsh4</value>
- <value tokenid="ooxml:ST_LightRigType_threePt">threePt</value>
- <value tokenid="ooxml:ST_LightRigType_balanced">balanced</value>
- <value tokenid="ooxml:ST_LightRigType_soft">soft</value>
- <value tokenid="ooxml:ST_LightRigType_harsh">harsh</value>
- <value tokenid="ooxml:ST_LightRigType_flood">flood</value>
- <value tokenid="ooxml:ST_LightRigType_contrasting">contrasting</value>
- <value tokenid="ooxml:ST_LightRigType_morning">morning</value>
- <value tokenid="ooxml:ST_LightRigType_sunrise">sunrise</value>
- <value tokenid="ooxml:ST_LightRigType_sunset">sunset</value>
- <value tokenid="ooxml:ST_LightRigType_chilly">chilly</value>
- <value tokenid="ooxml:ST_LightRigType_freezing">freezing</value>
- <value tokenid="ooxml:ST_LightRigType_flat">flat</value>
- <value tokenid="ooxml:ST_LightRigType_twoPt">twoPt</value>
- <value tokenid="ooxml:ST_LightRigType_glow">glow</value>
- <value tokenid="ooxml:ST_LightRigType_brightRoom">brightRoom</value>
- </resource>
- <resource name="ST_LightRigDirection" resource="List">
- <value tokenid="ooxml:ST_LightRigDirection_tl">tl</value>
- <value tokenid="ooxml:ST_LightRigDirection_t">t</value>
- <value tokenid="ooxml:ST_LightRigDirection_tr">tr</value>
- <value tokenid="ooxml:ST_LightRigDirection_l">l</value>
- <value tokenid="ooxml:ST_LightRigDirection_r">r</value>
- <value tokenid="ooxml:ST_LightRigDirection_bl">bl</value>
- <value tokenid="ooxml:ST_LightRigDirection_b">b</value>
- <value tokenid="ooxml:ST_LightRigDirection_br">br</value>
- </resource>
- <resource name="ST_BevelPresetType" resource="List">
- <value tokenid="ooxml:ST_BevelPresetType_relaxedInset">relaxedInset</value>
- <value tokenid="ooxml:ST_BevelPresetType_circle">circle</value>
- <value tokenid="ooxml:ST_BevelPresetType_slope">slope</value>
- <value tokenid="ooxml:ST_BevelPresetType_cross">cross</value>
- <value tokenid="ooxml:ST_BevelPresetType_angle">angle</value>
- <value tokenid="ooxml:ST_BevelPresetType_softRound">softRound</value>
- <value tokenid="ooxml:ST_BevelPresetType_convex">convex</value>
- <value tokenid="ooxml:ST_BevelPresetType_coolSlant">coolSlant</value>
- <value tokenid="ooxml:ST_BevelPresetType_divot">divot</value>
- <value tokenid="ooxml:ST_BevelPresetType_riblet">riblet</value>
- <value tokenid="ooxml:ST_BevelPresetType_hardEdge">hardEdge</value>
- <value tokenid="ooxml:ST_BevelPresetType_artDeco">artDeco</value>
- </resource>
- <resource name="ST_PresetMaterialType" resource="List">
- <value tokenid="ooxml:ST_PresetMaterialType_legacyMatte">legacyMatte</value>
- <value tokenid="ooxml:ST_PresetMaterialType_legacyPlastic">legacyPlastic</value>
- <value tokenid="ooxml:ST_PresetMaterialType_legacyMetal">legacyMetal</value>
- <value tokenid="ooxml:ST_PresetMaterialType_legacyWireframe">legacyWireframe</value>
- <value tokenid="ooxml:ST_PresetMaterialType_matte">matte</value>
- <value tokenid="ooxml:ST_PresetMaterialType_plastic">plastic</value>
- <value tokenid="ooxml:ST_PresetMaterialType_metal">metal</value>
- <value tokenid="ooxml:ST_PresetMaterialType_warmMatte">warmMatte</value>
- <value tokenid="ooxml:ST_PresetMaterialType_translucentPowder">translucentPowder</value>
- <value tokenid="ooxml:ST_PresetMaterialType_powder">powder</value>
- <value tokenid="ooxml:ST_PresetMaterialType_dkEdge">dkEdge</value>
- <value tokenid="ooxml:ST_PresetMaterialType_softEdge">softEdge</value>
- <value tokenid="ooxml:ST_PresetMaterialType_clear">clear</value>
- <value tokenid="ooxml:ST_PresetMaterialType_flat">flat</value>
- <value tokenid="ooxml:ST_PresetMaterialType_softmetal">softmetal</value>
- <value tokenid="ooxml:ST_PresetMaterialType_none">none</value>
- </resource>
- <resource name="ST_Ligatures" resource="List">
- <value tokenid="ooxml:ST_Ligatures_none">none</value>
- <value tokenid="ooxml:ST_Ligatures_standard">standard</value>
- <value tokenid="ooxml:ST_Ligatures_contextual">contextual</value>
- <value tokenid="ooxml:ST_Ligatures_historical">historical</value>
- <value tokenid="ooxml:ST_Ligatures_discretional">discretional</value>
- <value tokenid="ooxml:ST_Ligatures_standardContextual">standardContextual</value>
- <value tokenid="ooxml:ST_Ligatures_standardHistorical">standardHistorical</value>
- <value tokenid="ooxml:ST_Ligatures_contextualHistorical">contextualHistorical</value>
- <value tokenid="ooxml:ST_Ligatures_standardDiscretional">standardDiscretional</value>
- <value tokenid="ooxml:ST_Ligatures_contextualDiscretional">contextualDiscretional</value>
- <value tokenid="ooxml:ST_Ligatures_historicalDiscretional">historicalDiscretional</value>
- <value tokenid="ooxml:ST_Ligatures_standardContextualHistorical">standardContextualHistorical</value>
- <value tokenid="ooxml:ST_Ligatures_standardContextualDiscretional">standardContextualDiscretional</value>
- <value tokenid="ooxml:ST_Ligatures_standardHistoricalDiscretional">standardHistoricalDiscretional</value>
- <value tokenid="ooxml:ST_Ligatures_contextualHistoricalDiscretional">contextualHistoricalDiscretional</value>
- <value tokenid="ooxml:ST_Ligatures_all">all</value>
- </resource>
- <resource name="ST_NumForm" resource="List">
- <value tokenid="ooxml:ST_NumForm_default">default</value>
- <value tokenid="ooxml:ST_NumForm_lining">lining</value>
- <value tokenid="ooxml:ST_NumForm_oldStyle">oldStyle</value>
- </resource>
- <resource name="ST_NumSpacing" resource="List">
- <value tokenid="ooxml:ST_NumSpacing_default">default</value>
- <value tokenid="ooxml:ST_NumSpacing_proportional">proportional</value>
- <value tokenid="ooxml:ST_NumSpacing_tabular">tabular</value>
- </resource>
-
- <resource name="ST_PositiveCoordinate" resource="Integer"/>
- <resource name="ST_HexColorRGB" resource="Hex"/>
- <resource name="ST_PositivePercentage" resource="Integer"/>
- <resource name="ST_PositiveFixedPercentage" resource="Integer"/>
- <resource name="ST_Percentage" resource="Integer"/>
- <resource name="ST_PositiveFixedAngle" resource="Integer"/>
- <resource name="ST_FixedAngle" resource="Integer"/>
- <resource name="ST_LineWidth" resource="Integer"/>
- <resource name="ST_UnsignedDecimalNumber" resource="Integer"/>
-
- <!-- Groups Resource Definitions -->
- <resource name="EG_ColorTransform" resource="Properties">
- <element name="tint" tokenid="ooxml:EG_ColorTransform_tint"/>
- <element name="shade" tokenid="ooxml:EG_ColorTransform_shade"/>
- <element name="alpha" tokenid="ooxml:EG_ColorTransform_alpha"/>
- <element name="hueMod" tokenid="ooxml:EG_ColorTransform_hueMod"/>
- <element name="sat" tokenid="ooxml:EG_ColorTransform_sat"/>
- <element name="satOff" tokenid="ooxml:EG_ColorTransform_satOff"/>
- <element name="satMod" tokenid="ooxml:EG_ColorTransform_satMod"/>
- <element name="lum" tokenid="ooxml:EG_ColorTransform_lum"/>
- <element name="lumOff" tokenid="ooxml:EG_ColorTransform_lumOff"/>
- <element name="lumMod" tokenid="ooxml:EG_ColorTransform_lumMod"/>
- </resource>
- <resource name="EG_ColorChoice" resource="Properties">
- <element name="srgbClr" tokenid="ooxml:EG_ColorChoice_srgbClr"/>
- <element name="schemeClr" tokenid="ooxml:EG_ColorChoice_schemeClr"/>
- </resource>
- <resource name="EG_FillProperties" resource="Properties">
- <element name="noFill" tokenid="ooxml:EG_FillProperties_noFill"/>
- <element name="solidFill" tokenid="ooxml:EG_FillProperties_solidFill"/>
- <element name="gradFill" tokenid="ooxml:EG_FillProperties_gradFill"/>
- </resource>
- <resource name="EG_ShadeProperties" resource="Properties">
- <element name="lin" tokenid="ooxml:EG_ShadeProperties_lin"/>
- <element name="path" tokenid="ooxml:EG_ShadeProperties_path"/>
- </resource>
- <resource name="EG_LineDashProperties" resource="Properties">
- <element name="prstDash" tokenid="ooxml:EG_LineDashProperties_prstDash"/>
- </resource>
- <resource name="EG_LineJoinProperties" resource="Properties">
- <element name="round" tokenid="ooxml:EG_LineJoinProperties_round"/>
- <element name="bevel" tokenid="ooxml:EG_LineJoinProperties_bevel"/>
- <element name="miter" tokenid="ooxml:EG_LineJoinProperties_miter"/>
- </resource>
-
- <!-- Complex Types Resource Definitions -->
- <resource name="CT_Glow" resource="Properties">
- <attribute name="rad" tokenid="ooxml:CT_Glow_rad"/>
- </resource>
- <resource name="CT_SRgbColor" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_SRgbColor_val"/>
- </resource>
- <resource name="CT_SchemeColor" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_SchemeColor_val"/>
- </resource>
- <resource name="CT_PositiveFixedPercentage" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_PositiveFixedPercentage_val"/>
- </resource>
- <resource name="CT_PositivePercentage" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_PositivePercentage_val"/>
- </resource>
- <resource name="CT_Percentage" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_Percentage_val"/>
- </resource>
- <resource name="CT_Empty" resource="Properties"/>
- <resource name="CT_SolidColorFillProperties" resource="Properties"/>
- <resource name="CT_GradientFillProperties" resource="Properties">
- <element name="gsLst" tokenid="ooxml:CT_GradientFillProperties_gsLst"/>
- </resource>
- <resource name="CT_GradientStopList" resource="Properties">
- <element name="gs" tokenid="ooxml:CT_GradientStopList_gs"/>
- </resource>
- <resource name="CT_GradientStop" resource="Properties">
- <attribute name="pos" tokenid="ooxml:CT_GradientStop_pos"/>
- </resource>
- <resource name="CT_LinearShadeProperties" resource="Properties">
- <attribute name="ang" tokenid="ooxml:CT_LinearShadeProperties_ang"/>
- <attribute name="scaled" tokenid="ooxml:CT_LinearShadeProperties_scaled"/>
- </resource>
- <resource name="CT_PathShadeProperties" resource="Properties">
- <element name="fillToRect" tokenid="ooxml:CT_PathShadeProperties_fillToRect"/>
- <attribute name="path" tokenid="ooxml:CT_PathShadeProperties_path"/>
- </resource>
- <resource name="CT_RelativeRect" resource="Properties">
- <attribute name="l" tokenid="ooxml:CT_RelativeRect_l"/>
- <attribute name="t" tokenid="ooxml:CT_RelativeRect_t"/>
- <attribute name="r" tokenid="ooxml:CT_RelativeRect_r"/>
- <attribute name="b" tokenid="ooxml:CT_RelativeRect_b"/>
- </resource>
- <resource name="CT_PresetLineDashProperties" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_PresetLineDashProperties_val"/>
- </resource>
- <resource name="CT_LineJoinMiterProperties" resource="Properties">
- <attribute name="lim" tokenid="ooxml:CT_LineJoinMiterProperties_lim"/>
- </resource>
- <resource name="CT_Camera" resource="Properties">
- <attribute name="prst" tokenid="ooxml:CT_Camera_prst"/>
- </resource>
- <resource name="CT_LightRig" resource="Properties">
- <element name="rot" tokenid="ooxml:CT_LightRig_rot"/>
- <attribute name="rig" tokenid="ooxml:CT_LightRig_rig"/>
- <attribute name="dir" tokenid="ooxml:CT_LightRig_dir"/>
- </resource>
- <resource name="CT_SphereCoords" resource="Properties">
- <attribute name="lat" tokenid="ooxml:CT_SphereCoords_lat"/>
- <attribute name="lon" tokenid="ooxml:CT_SphereCoords_lon"/>
- <attribute name="rev" tokenid="ooxml:CT_SphereCoords_rev"/>
- </resource>
- <resource name="CT_Bevel" resource="Properties">
- <attribute name="w" tokenid="ooxml:CT_Bevel_w"/>
- <attribute name="h" tokenid="ooxml:CT_Bevel_h"/>
- <attribute name="prst" tokenid="ooxml:CT_Bevel_prst"/>
- </resource>
- <resource name="CT_Color" resource="Properties"/>
- <resource name="CT_StyleSet" resource="Properties">
- <attribute name="id" tokenid="ooxml:CT_StyleSet_id"/>
- <attribute name="val" tokenid="ooxml:CT_StyleSet_val"/>
- </resource>
- <resource name="CT_OnOff" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_OnOff_val" action="setValue"/>
- <action name="start" action="setDefaultBooleanValue"/>
- </resource>
-
- <!-- Main element content -->
- <resource name="CT_Shadow" resource="Properties">
- <attribute name="blurRad" tokenid="ooxml:CT_Shadow_blurRad"/>
- <attribute name="dist" tokenid="ooxml:CT_Shadow_dist"/>
- <attribute name="dir" tokenid="ooxml:CT_Shadow_dir"/>
- <attribute name="sx" tokenid="ooxml:CT_Shadow_sx"/>
- <attribute name="sy" tokenid="ooxml:CT_Shadow_sy"/>
- <attribute name="kx" tokenid="ooxml:CT_Shadow_kx"/>
- <attribute name="ky" tokenid="ooxml:CT_Shadow_ky"/>
- <attribute name="algn" tokenid="ooxml:CT_Shadow_algn"/>
- </resource>
- <resource name="CT_Reflection" resource="Properties">
- <attribute name="blurRad" tokenid="ooxml:CT_Reflection_blurRad"/>
- <attribute name="stA" tokenid="ooxml:CT_Reflection_stA"/>
- <attribute name="stPos" tokenid="ooxml:CT_Reflection_stPos"/>
- <attribute name="endA" tokenid="ooxml:CT_Reflection_endA"/>
- <attribute name="endPos" tokenid="ooxml:CT_Reflection_endPos"/>
- <attribute name="dist" tokenid="ooxml:CT_Reflection_dist"/>
- <attribute name="dir" tokenid="ooxml:CT_Reflection_dir"/>
- <attribute name="fadeDir" tokenid="ooxml:CT_Reflection_fadeDir"/>
- <attribute name="sx" tokenid="ooxml:CT_Reflection_sx"/>
- <attribute name="sy" tokenid="ooxml:CT_Reflection_sy"/>
- <attribute name="kx" tokenid="ooxml:CT_Reflection_kx"/>
- <attribute name="ky" tokenid="ooxml:CT_Reflection_ky"/>
- <attribute name="algn" tokenid="ooxml:CT_Reflection_algn"/>
- </resource>
- <resource name="CT_TextOutlineEffect" resource="Properties">
- <attribute name="w" tokenid="ooxml:CT_TextOutlineEffect_w"/>
- <attribute name="cap" tokenid="ooxml:CT_TextOutlineEffect_cap"/>
- <attribute name="cmpd" tokenid="ooxml:CT_TextOutlineEffect_cmpd"/>
- <attribute name="algn" tokenid="ooxml:CT_TextOutlineEffect_algn"/>
- </resource>
- <resource name="CT_FillTextEffect" resource="Properties"/>
- <resource name="CT_Scene3D" resource="Properties">
- <element name="camera" tokenid="ooxml:CT_Scene3D_camera"/>
- <element name="lightRig" tokenid="ooxml:CT_Scene3D_lightRig"/>
- </resource>
- <resource name="CT_Props3D" resource="Properties">
- <element name="bevelT" tokenid="ooxml:CT_Props3D_bevelT"/>
- <element name="bevelB" tokenid="ooxml:CT_Props3D_bevelB"/>
- <element name="extrusionClr" tokenid="ooxml:CT_Props3D_extrusionClr"/>
- <element name="contourClr" tokenid="ooxml:CT_Props3D_contourClr"/>
- <attribute name="extrusionH" tokenid="ooxml:CT_Props3D_extrusionH"/>
- <attribute name="contourW" tokenid="ooxml:CT_Props3D_contourW"/>
- <attribute name="prstMaterial" tokenid="ooxml:CT_Props3D_prstMaterial"/>
- </resource>
- <resource name="CT_Ligatures" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_Ligatures_val"/>
- </resource>
- <resource name="CT_NumForm" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_NumForm_val"/>
- </resource>
- <resource name="CT_NumSpacing" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_NumSpacing_val"/>
- </resource>
- <resource name="CT_StylisticSets" resource="Properties">
- <attribute name="styleSet" tokenid="ooxml:CT_StylisticSets_styleSet"/>
- </resource>
-
- <resource name="glow" resource="Properties">
- <element name="glow" tokenid="ooxml:glow_glow"/>
- </resource>
- <resource name="shadow" resource="Properties">
- <element name="shadow" tokenid="ooxml:shadow_shadow"/>
- </resource>
- <resource name="reflection" resource="Properties">
- <element name="reflection" tokenid="ooxml:reflection_reflection"/>
- </resource>
- <resource name="textOutline" resource="Properties">
- <element name="textOutline" tokenid="ooxml:textOutline_textOutline"/>
- </resource>
- <resource name="textFill" resource="Properties">
- <element name="textFill" tokenid="ooxml:textFill_textFill"/>
- </resource>
- <resource name="scene3d" resource="Properties">
- <element name="scene3d" tokenid="ooxml:scene3d_scene3d"/>
- </resource>
- <resource name="props3d" resource="Properties">
- <element name="props3d" tokenid="ooxml:props3d_props3d"/>
- </resource>
- <resource name="ligatures" resource="Properties">
- <element name="ligatures" tokenid="ooxml:ligatures_ligatures"/>
- </resource>
- <resource name="numForm" resource="Properties">
- <element name="numForm" tokenid="ooxml:numForm_numForm"/>
- </resource>
- <resource name="numSpacing" resource="Properties">
- <element name="numSpacing" tokenid="ooxml:numSpacing_numSpacing"/>
- </resource>
- <resource name="stylisticSets" resource="Properties">
- <element name="stylisticSets" tokenid="ooxml:stylisticSets_stylisticSets"/>
- </resource>
- <resource name="cntxtAlts" resource="Properties">
- <element name="cntxtAlts" tokenid="ooxml:cntxtAlts_cntxtAlts"/>
- </resource>
- </namespace>
- <namespace name="w15">
- <start name="commentsEx"/>
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.microsoft.com/office/word/2012/wordml" attributeFormDefault="qualified">
- <define name="commentsEx">
- <element name="commentsEx">
- <ref name="CT_CommentsEx"/>
- </element>
- </define>
- <define name="CT_CommentsEx">
- <element name="commentEx">
- <ref name="CT_CommentEx"/>
- </element>
- </define>
- <define name="CT_CommentEx">
- <attribute name="paraId">
- <ref name="ST_LongHexNumber"/>
- </attribute>
- <attribute name="paraIdParent">
- <ref name="ST_LongHexNumber"/>
- </attribute>
- <attribute name="done">
- <ref name="ST_OnOff"/>
- </attribute>
- </define>
- <define name="ST_LongHexNumber">
- <data type="hexBinary"/>
- </define>
- <define name="ST_OnOff">
- <choice>
- <value>true</value>
- <value>false</value>
- <value>0</value>
- <value>1</value>
- </choice>
- </define>
- </grammar>
- <resource name="CT_CommentsEx" resource="Stream">
- <element name="commentEx" tokenid="ooxml:CT_CommentsEx_commentEx"/>
- </resource>
- <resource name="CT_CommentEx" resource="CommentEx">
- <attribute name="paraId" tokenid="ooxml:CT_CommentEx_paraId" action="att_paraId"/>
- <attribute name="paraIdParent" tokenid="ooxml:CT_CommentEx_paraIdParent" action="att_paraIdParent"/>
- <attribute name="done" tokenid="ooxml:CT_CommentEx_done" action="att_done"/>
- </resource>
- <resource name="ST_LongHexNumber" resource="String"/>
- <resource name="ST_OnOff" resource="Boolean"/>
- </namespace>
- <namespace name="a14">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.microsoft.com/office/drawing/2010/main">
- <!-- Simple types -->
- <define name="ST_ArtisticEffectParam10">
- <data type="integer"/>
- </define>
- <define name="ST_ArtisticEffectParam100">
- <data type="integer"/>
- </define>
- <define name="ST_ArtisticEffectParam4">
- <data type="integer"/>
- </define>
- <define name="ST_ArtisticEffectParam6">
- <data type="integer"/>
- </define>
- <define name="ST_ColorTemperature">
- <data type="integer"/>
- </define>
- <define name="ST_SaturationAmount">
- <data type="integer"/>
- </define>
-
- <!-- Complex types for effects -->
- <define name="CT_PictureEffectBlur">
- <attribute name="visible">
- <ref name="ST_ArtisticEffectParam100"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectCement">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="crackSpacing">
- <ref name="ST_ArtisticEffectParam100"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectChalkSketch">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="pressure">
- <ref name="ST_ArtisticEffectParam4"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectCrisscrossEtching">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="pressure">
- <ref name="ST_ArtisticEffectParam4"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectCutout">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="numberOfShades">
- <ref name="ST_ArtisticEffectParam6"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectFilmGrain">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="grainSize">
- <ref name="ST_ArtisticEffectParam100"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectGlass">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="scaling">
- <ref name="ST_ArtisticEffectParam100"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectGlowDiffused">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="intensity">
- <ref name="ST_ArtisticEffectParam10"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectGlowEdges">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="smoothness">
- <ref name="ST_ArtisticEffectParam10"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectLightScreen">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="gridSize">
- <ref name="ST_ArtisticEffectParam10"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectLineDrawing">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="pencilSize">
- <ref name="ST_ArtisticEffectParam100"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectMarker">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="size">
- <ref name="ST_ArtisticEffectParam100"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectMosiaicBubbles">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="pressure">
- <ref name="ST_ArtisticEffectParam100"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectPaintStrokes">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="intensity">
- <ref name="ST_ArtisticEffectParam10"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectPaintBrush">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="brushSize">
- <ref name="ST_ArtisticEffectParam10"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectPastelsSmooth">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="scaling">
- <ref name="ST_ArtisticEffectParam100"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectPencilGrayscale">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="pencilSize">
- <ref name="ST_ArtisticEffectParam100"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectPencilSketch">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="pressure">
- <ref name="ST_ArtisticEffectParam100"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectPhotocopy">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="detail">
- <ref name="ST_ArtisticEffectParam10"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectPlasticWrap">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="smoothness">
- <ref name="ST_ArtisticEffectParam10"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectTexturizer">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="scaling">
- <ref name="ST_ArtisticEffectParam100"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectWatercolorSponge">
- <attribute name="trans">
- <ref name="ST_PositiveFixedPercentage"/>
- </attribute>
- <attribute name="brushSize">
- <ref name="ST_ArtisticEffectParam10"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectBrightnessContrast">
- <attribute name="bright">
- <ref name="ST_FixedPercentage"/>
- </attribute>
- <attribute name="contrast">
- <ref name="ST_FixedPercentage"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectColorTemperature">
- <attribute name="colorTemp">
- <ref name="ST_ColorTemperature"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectSaturation">
- <attribute name="sat">
- <ref name="ST_SaturationAmount"/>
- </attribute>
- </define>
- <define name="CT_PictureEffectSharpenSoften">
- <attribute name="amount">
- <ref name="ST_FixedPercentage"/>
- </attribute>
- </define>
-
- <!-- Complex types for containers -->
- <define name="CT_PictureEffect">
- <choice>
- <element name="artisticBlur">
- <ref name="CT_PictureEffectBlur"/>
- </element>
- <element name="artisticCement">
- <ref name="CT_PictureEffectCement"/>
- </element>
- <element name="artisticChalkSketch">
- <ref name="CT_PictureEffectChalkSketch"/>
- </element>
- <element name="artisticCrisscrossEtching">
- <ref name="CT_PictureEffectCrisscrossEtching"/>
- </element>
- <element name="artisticCutout">
- <ref name="CT_PictureEffectCutout"/>
- </element>
- <element name="artisticFilmGrain">
- <ref name="CT_PictureEffectFilmGrain"/>
- </element>
- <element name="artisticGlass">
- <ref name="CT_PictureEffectGlass"/>
- </element>
- <element name="artisticGlowDiffused">
- <ref name="CT_PictureEffectGlowDiffused"/>
- </element>
- <element name="artisticGlowEdges">
- <ref name="CT_PictureEffectGlowEdges"/>
- </element>
- <element name="artisticLightScreen">
- <ref name="CT_PictureEffectLightScreen"/>
- </element>
- <element name="artisticLineDrawing">
- <ref name="CT_PictureEffectLineDrawing"/>
- </element>
- <element name="artisticMarker">
- <ref name="CT_PictureEffectMarker"/>
- </element>
- <element name="artisticMosiaicBubbles">
- <ref name="CT_PictureEffectMosiaicBubbles"/>
- </element>
- <element name="artisticPaintStrokes">
- <ref name="CT_PictureEffectPaintStrokes"/>
- </element>
- <element name="artisticPaintBrush">
- <ref name="CT_PictureEffectPaintBrush"/>
- </element>
- <element name="artisticPastelsSmooth">
- <ref name="CT_PictureEffectPastelsSmooth"/>
- </element>
- <element name="artisticPencilGrayscale">
- <ref name="CT_PictureEffectPencilGrayscale"/>
- </element>
- <element name="artisticPencilSketch">
- <ref name="CT_PictureEffectPencilSketch"/>
- </element>
- <element name="artisticPhotocopy">
- <ref name="CT_PictureEffectPhotocopy"/>
- </element>
- <element name="artisticPlasticWrap">
- <ref name="CT_PictureEffectPlasticWrap"/>
- </element>
- <element name="artisticTexturizer">
- <ref name="CT_PictureEffectTexturizer"/>
- </element>
- <element name="artisticWatercolorSponge">
- <ref name="CT_PictureEffectWatercolorSponge"/>
- </element>
- <element name="brightnessContrast">
- <ref name="CT_PictureEffectBrightnessContrast"/>
- </element>
- <element name="colorTemperature">
- <ref name="CT_PictureEffectColorTemperature"/>
- </element>
- <element name="saturation">
- <ref name="CT_PictureEffectSaturation"/>
- </element>
- <element name="sharpenSoften">
- <ref name="CT_PictureEffectSharpenSoften"/>
- </element>
- </choice>
- <attribute name="visible">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_PictureLayer">
- <element name="imgEffect">
- <ref name="CT_PictureEffect"/>
- </element>
- <attribute name="r:embed">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Photo">
- <element name="imgLayer">
- <ref name="CT_PictureLayer"/>
- </element>
- </define>
- </grammar>
- </namespace>
- <namespace name="dml-shapeGeometry">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/main">
- <define name="ST_ShapeType">
- <choice>
- <!-- Line Shape -->
- <value>line</value>
- <!-- Line Inverse Shape -->
- <value>lineInv</value>
- <!-- Triangle Shape -->
- <value>triangle</value>
- <!-- Right Triangle Shape -->
- <value>rtTriangle</value>
- <!-- Rectangle Shape -->
- <value>rect</value>
- <!-- Diamond Shape -->
- <value>diamond</value>
- <!-- Parallelogram Shape -->
- <value>parallelogram</value>
- <!-- Trapezoid Shape -->
- <value>trapezoid</value>
- <!-- Non-Isosceles Trapezoid Shape -->
- <value>nonIsoscelesTrapezoid</value>
- <!-- Pentagon Shape -->
- <value>pentagon</value>
- <!-- Hexagon Shape -->
- <value>hexagon</value>
- <!-- Heptagon Shape -->
- <value>heptagon</value>
- <!-- Octagon Shape -->
- <value>octagon</value>
- <!-- Decagon Shape -->
- <value>decagon</value>
- <!-- Dodecagon Shape -->
- <value>dodecagon</value>
- <!-- Four Pointed Star Shape -->
- <value>star4</value>
- <!-- Five Pointed Star Shape -->
- <value>star5</value>
- <!-- Six Pointed Star Shape -->
- <value>star6</value>
- <!-- Seven Pointed Star Shape -->
- <value>star7</value>
- <!-- Eight Pointed Star Shape -->
- <value>star8</value>
- <!-- Ten Pointed Star Shape -->
- <value>star10</value>
- <!-- Twelve Pointed Star Shape -->
- <value>star12</value>
- <!-- Sixteen Pointed Star Shape -->
- <value>star16</value>
- <!-- Twenty Four Pointed Star Shape -->
- <value>star24</value>
- <!-- Thirty Two Pointed Star Shape -->
- <value>star32</value>
- <!-- Round Corner Rectangle Shape -->
- <value>roundRect</value>
- <!-- One Round Corner Rectangle Shape -->
- <value>round1Rect</value>
- <!-- Two Same-side Round Corner Rectangle Shape -->
- <value>round2SameRect</value>
- <!-- Two Diagonal Round Corner Rectangle Shape -->
- <value>round2DiagRect</value>
- <!-- One Snip One Round Corner Rectangle Shape -->
- <value>snipRoundRect</value>
- <!-- One Snip Corner Rectangle Shape -->
- <value>snip1Rect</value>
- <!-- Two Same-side Snip Corner Rectangle Shape -->
- <value>snip2SameRect</value>
- <!-- Two Diagonal Snip Corner Rectangle Shape -->
- <value>snip2DiagRect</value>
- <!-- Plaque Shape -->
- <value>plaque</value>
- <!-- Ellipse Shape -->
- <value>ellipse</value>
- <!-- Teardrop Shape -->
- <value>teardrop</value>
- <!-- Home Plate Shape -->
- <value>homePlate</value>
- <!-- Chevron Shape -->
- <value>chevron</value>
- <!-- Pie Wedge Shape -->
- <value>pieWedge</value>
- <!-- Pie Shape -->
- <value>pie</value>
- <!-- Block Arc Shape -->
- <value>blockArc</value>
- <!-- Donut Shape -->
- <value>donut</value>
- <!-- No Smoking Shape -->
- <value>noSmoking</value>
- <!-- Right Arrow Shape -->
- <value>rightArrow</value>
- <!-- Left Arrow Shape -->
- <value>leftArrow</value>
- <!-- Up Arrow Shape -->
- <value>upArrow</value>
- <!-- Down Arrow Shape -->
- <value>downArrow</value>
- <!-- Striped Right Arrow Shape -->
- <value>stripedRightArrow</value>
- <!-- Notched Right Arrow Shape -->
- <value>notchedRightArrow</value>
- <!-- Bent Up Arrow Shape -->
- <value>bentUpArrow</value>
- <!-- Left Right Arrow Shape -->
- <value>leftRightArrow</value>
- <!-- Up Down Arrow Shape -->
- <value>upDownArrow</value>
- <!-- Left Up Arrow Shape -->
- <value>leftUpArrow</value>
- <!-- Left Right Up Arrow Shape -->
- <value>leftRightUpArrow</value>
- <!-- Quad-Arrow Shape -->
- <value>quadArrow</value>
- <!-- Callout Left Arrow Shape -->
- <value>leftArrowCallout</value>
- <!-- Callout Right Arrow Shape -->
- <value>rightArrowCallout</value>
- <!-- Callout Up Arrow Shape -->
- <value>upArrowCallout</value>
- <!-- Callout Down Arrow Shape -->
- <value>downArrowCallout</value>
- <!-- Callout Left Right Arrow Shape -->
- <value>leftRightArrowCallout</value>
- <!-- Callout Up Down Arrow Shape -->
- <value>upDownArrowCallout</value>
- <!-- Callout Quad-Arrow Shape -->
- <value>quadArrowCallout</value>
- <!-- Bent Arrow Shape -->
- <value>bentArrow</value>
- <!-- U-Turn Arrow Shape -->
- <value>uturnArrow</value>
- <!-- Circular Arrow Shape -->
- <value>circularArrow</value>
- <!-- Left Circular Arrow Shape -->
- <value>leftCircularArrow</value>
- <!-- Left Right Circular Arrow Shape -->
- <value>leftRightCircularArrow</value>
- <!-- Curved Right Arrow Shape -->
- <value>curvedRightArrow</value>
- <!-- Curved Left Arrow Shape -->
- <value>curvedLeftArrow</value>
- <!-- Curved Up Arrow Shape -->
- <value>curvedUpArrow</value>
- <!-- Curved Down Arrow Shape -->
- <value>curvedDownArrow</value>
- <!-- Swoosh Arrow Shape -->
- <value>swooshArrow</value>
- <!-- Cube Shape -->
- <value>cube</value>
- <!-- Can Shape -->
- <value>can</value>
- <!-- Lightning Bolt Shape -->
- <value>lightningBolt</value>
- <!-- Heart Shape -->
- <value>heart</value>
- <!-- Sun Shape -->
- <value>sun</value>
- <!-- Moon Shape -->
- <value>moon</value>
- <!-- Smiley Face Shape -->
- <value>smileyFace</value>
- <!-- Irregular Seal 1 Shape -->
- <value>irregularSeal1</value>
- <!-- Irregular Seal 2 Shape -->
- <value>irregularSeal2</value>
- <!-- Folded Corner Shape -->
- <value>foldedCorner</value>
- <!-- Bevel Shape -->
- <value>bevel</value>
- <!-- Frame Shape -->
- <value>frame</value>
- <!-- Half Frame Shape -->
- <value>halfFrame</value>
- <!-- Corner Shape -->
- <value>corner</value>
- <!-- Diagonal Stripe Shape -->
- <value>diagStripe</value>
- <!-- Chord Shape -->
- <value>chord</value>
- <!-- Curved Arc Shape -->
- <value>arc</value>
- <!-- Left Bracket Shape -->
- <value>leftBracket</value>
- <!-- Right Bracket Shape -->
- <value>rightBracket</value>
- <!-- Left Brace Shape -->
- <value>leftBrace</value>
- <!-- Right Brace Shape -->
- <value>rightBrace</value>
- <!-- Bracket Pair Shape -->
- <value>bracketPair</value>
- <!-- Brace Pair Shape -->
- <value>bracePair</value>
- <!-- Straight Connector 1 Shape -->
- <value>straightConnector1</value>
- <!-- Bent Connector 2 Shape -->
- <value>bentConnector2</value>
- <!-- Bent Connector 3 Shape -->
- <value>bentConnector3</value>
- <!-- Bent Connector 4 Shape -->
- <value>bentConnector4</value>
- <!-- Bent Connector 5 Shape -->
- <value>bentConnector5</value>
- <!-- Curved Connector 2 Shape -->
- <value>curvedConnector2</value>
- <!-- Curved Connector 3 Shape -->
- <value>curvedConnector3</value>
- <!-- Curved Connector 4 Shape -->
- <value>curvedConnector4</value>
- <!-- Curved Connector 5 Shape -->
- <value>curvedConnector5</value>
- <!-- Callout 1 Shape -->
- <value>callout1</value>
- <!-- Callout 2 Shape -->
- <value>callout2</value>
- <!-- Callout 3 Shape -->
- <value>callout3</value>
- <!-- Callout 1 Shape -->
- <value>accentCallout1</value>
- <!-- Callout 2 Shape -->
- <value>accentCallout2</value>
- <!-- Callout 3 Shape -->
- <value>accentCallout3</value>
- <!-- Callout 1 with Border Shape -->
- <value>borderCallout1</value>
- <!-- Callout 2 with Border Shape -->
- <value>borderCallout2</value>
- <!-- Callout 3 with Border Shape -->
- <value>borderCallout3</value>
- <!-- Callout 1 with Border and Accent Shape -->
- <value>accentBorderCallout1</value>
- <!-- Callout 2 with Border and Accent Shape -->
- <value>accentBorderCallout2</value>
- <!-- Callout 3 with Border and Accent Shape -->
- <value>accentBorderCallout3</value>
- <!-- Callout Wedge Rectangle Shape -->
- <value>wedgeRectCallout</value>
- <!-- Callout Wedge Round Rectangle Shape -->
- <value>wedgeRoundRectCallout</value>
- <!-- Callout Wedge Ellipse Shape -->
- <value>wedgeEllipseCallout</value>
- <!-- Callout Cloud Shape -->
- <value>cloudCallout</value>
- <!-- Cloud Shape -->
- <value>cloud</value>
- <!-- Ribbon Shape -->
- <value>ribbon</value>
- <!-- Ribbon 2 Shape -->
- <value>ribbon2</value>
- <!-- Ellipse Ribbon Shape -->
- <value>ellipseRibbon</value>
- <!-- Ellipse Ribbon 2 Shape -->
- <value>ellipseRibbon2</value>
- <!-- Left Right Ribbon Shape -->
- <value>leftRightRibbon</value>
- <!-- Vertical Scroll Shape -->
- <value>verticalScroll</value>
- <!-- Horizontal Scroll Shape -->
- <value>horizontalScroll</value>
- <!-- Wave Shape -->
- <value>wave</value>
- <!-- Double Wave Shape -->
- <value>doubleWave</value>
- <!-- Plus Shape -->
- <value>plus</value>
- <!-- Process Flow Shape -->
- <value>flowChartProcess</value>
- <!-- Decision Flow Shape -->
- <value>flowChartDecision</value>
- <!-- Input Output Flow Shape -->
- <value>flowChartInputOutput</value>
- <!-- Predefined Process Flow Shape -->
- <value>flowChartPredefinedProcess</value>
- <!-- Internal Storage Flow Shape -->
- <value>flowChartInternalStorage</value>
- <!-- Document Flow Shape -->
- <value>flowChartDocument</value>
- <!-- Multi-Document Flow Shape -->
- <value>flowChartMultidocument</value>
- <!-- Terminator Flow Shape -->
- <value>flowChartTerminator</value>
- <!-- Preparation Flow Shape -->
- <value>flowChartPreparation</value>
- <!-- Manual Input Flow Shape -->
- <value>flowChartManualInput</value>
- <!-- Manual Operation Flow Shape -->
- <value>flowChartManualOperation</value>
- <!-- Connector Flow Shape -->
- <value>flowChartConnector</value>
- <!-- Punched Card Flow Shape -->
- <value>flowChartPunchedCard</value>
- <!-- Punched Tape Flow Shape -->
- <value>flowChartPunchedTape</value>
- <!-- Summing Junction Flow Shape -->
- <value>flowChartSummingJunction</value>
- <!-- Or Flow Shape -->
- <value>flowChartOr</value>
- <!-- Collate Flow Shape -->
- <value>flowChartCollate</value>
- <!-- Sort Flow Shape -->
- <value>flowChartSort</value>
- <!-- Extract Flow Shape -->
- <value>flowChartExtract</value>
- <!-- Merge Flow Shape -->
- <value>flowChartMerge</value>
- <!-- Offline Storage Flow Shape -->
- <value>flowChartOfflineStorage</value>
- <!-- Online Storage Flow Shape -->
- <value>flowChartOnlineStorage</value>
- <!-- Magnetic Tape Flow Shape -->
- <value>flowChartMagneticTape</value>
- <!-- Magnetic Disk Flow Shape -->
- <value>flowChartMagneticDisk</value>
- <!-- Magnetic Drum Flow Shape -->
- <value>flowChartMagneticDrum</value>
- <!-- Display Flow Shape -->
- <value>flowChartDisplay</value>
- <!-- Delay Flow Shape -->
- <value>flowChartDelay</value>
- <!-- Alternate Process Flow Shape -->
- <value>flowChartAlternateProcess</value>
- <!-- Off-Page Connector Flow Shape -->
- <value>flowChartOffpageConnector</value>
- <!-- Blank Button Shape -->
- <value>actionButtonBlank</value>
- <!-- Home Button Shape -->
- <value>actionButtonHome</value>
- <!-- Help Button Shape -->
- <value>actionButtonHelp</value>
- <!-- Information Button Shape -->
- <value>actionButtonInformation</value>
- <!-- Forward or Next Button Shape -->
- <value>actionButtonForwardNext</value>
- <!-- Back or Previous Button Shape -->
- <value>actionButtonBackPrevious</value>
- <!-- End Button Shape -->
- <value>actionButtonEnd</value>
- <!-- Beginning Button Shape -->
- <value>actionButtonBeginning</value>
- <!-- Return Button Shape -->
- <value>actionButtonReturn</value>
- <!-- Document Button Shape -->
- <value>actionButtonDocument</value>
- <!-- Sound Button Shape -->
- <value>actionButtonSound</value>
- <!-- Movie Button Shape -->
- <value>actionButtonMovie</value>
- <!-- Gear 6 Shape -->
- <value>gear6</value>
- <!-- Gear 9 Shape -->
- <value>gear9</value>
- <!-- Funnel Shape -->
- <value>funnel</value>
- <!-- Plus Math Shape -->
- <value>mathPlus</value>
- <!-- Minus Math Shape -->
- <value>mathMinus</value>
- <!-- Multiply Math Shape -->
- <value>mathMultiply</value>
- <!-- Divide Math Shape -->
- <value>mathDivide</value>
- <!-- Equal Math Shape -->
- <value>mathEqual</value>
- <!-- Not Equal Math Shape -->
- <value>mathNotEqual</value>
- <!-- Corner Tabs Shape -->
- <value>cornerTabs</value>
- <!-- Square Tabs Shape -->
- <value>squareTabs</value>
- <!-- Plaque Tabs Shape -->
- <value>plaqueTabs</value>
- <!-- Chart X Shape -->
- <value>chartX</value>
- <!-- Chart Star Shape -->
- <value>chartStar</value>
- <!-- Chart Plus Shape -->
- <value>chartPlus</value>
- </choice>
- </define>
- <define name="ST_TextShapeType">
- <choice>
- <!-- No Text Shape -->
- <value>textNoShape</value>
- <!-- Plain Text Shape -->
- <value>textPlain</value>
- <!-- Stop Sign Text Shape -->
- <value>textStop</value>
- <!-- Triangle Text Shape -->
- <value>textTriangle</value>
- <!-- Inverted Triangle Text Shape -->
- <value>textTriangleInverted</value>
- <!-- Chevron Text Shape -->
- <value>textChevron</value>
- <!-- Inverted Chevron Text Shape -->
- <value>textChevronInverted</value>
- <!-- Inside Ring Text Shape -->
- <value>textRingInside</value>
- <!-- Outside Ring Text Shape -->
- <value>textRingOutside</value>
- <!-- Upward Arch Text Shape -->
- <value>textArchUp</value>
- <!-- Downward Arch Text Shape -->
- <value>textArchDown</value>
- <!-- Circle Text Shape -->
- <value>textCircle</value>
- <!-- Button Text Shape -->
- <value>textButton</value>
- <!-- Upward Pour Arch Text Shape -->
- <value>textArchUpPour</value>
- <!-- Downward Pour Arch Text Shape -->
- <value>textArchDownPour</value>
- <!-- Circle Pour Text Shape -->
- <value>textCirclePour</value>
- <!-- Button Pour Text Shape -->
- <value>textButtonPour</value>
- <!-- Upward Curve Text Shape -->
- <value>textCurveUp</value>
- <!-- Downward Curve Text Shape -->
- <value>textCurveDown</value>
- <!-- Upward Can Text Shape -->
- <value>textCanUp</value>
- <!-- Downward Can Text Shape -->
- <value>textCanDown</value>
- <!-- Wave 1 Text Shape -->
- <value>textWave1</value>
- <!-- Wave 2 Text Shape -->
- <value>textWave2</value>
- <!-- Double Wave 1 Text Shape -->
- <value>textDoubleWave1</value>
- <!-- Wave 4 Text Shape -->
- <value>textWave4</value>
- <!-- Inflate Text Shape -->
- <value>textInflate</value>
- <!-- Deflate Text Shape -->
- <value>textDeflate</value>
- <!-- Bottom Inflate Text Shape -->
- <value>textInflateBottom</value>
- <!-- Bottom Deflate Text Shape -->
- <value>textDeflateBottom</value>
- <!-- Top Inflate Text Shape -->
- <value>textInflateTop</value>
- <!-- Top Deflate Text Shape -->
- <value>textDeflateTop</value>
- <!-- Deflate-Inflate Text Shape -->
- <value>textDeflateInflate</value>
- <!-- Deflate-Inflate-Deflate Text Shape -->
- <value>textDeflateInflateDeflate</value>
- <!-- Right Fade Text Shape -->
- <value>textFadeRight</value>
- <!-- Left Fade Text Shape -->
- <value>textFadeLeft</value>
- <!-- Upward Fade Text Shape -->
- <value>textFadeUp</value>
- <!-- Downward Fade Text Shape -->
- <value>textFadeDown</value>
- <!-- Upward Slant Text Shape -->
- <value>textSlantUp</value>
- <!-- Downward Slant Text Shape -->
- <value>textSlantDown</value>
- <!-- Upward Cascade Text Shape -->
- <value>textCascadeUp</value>
- <!-- Downward Cascade Text Shape -->
- <value>textCascadeDown</value>
- </choice>
- </define>
- <define name="ST_GeomGuideName">
- <data type="token"/>
- </define>
- <define name="ST_GeomGuideFormula">
- <data type="string"/>
- </define>
- <define name="CT_GeomGuide">
- <attribute name="name">
- <ref name="ST_GeomGuideName"/>
- </attribute>
- <attribute name="fmla">
- <ref name="ST_GeomGuideFormula"/>
- </attribute>
- </define>
- <define name="CT_GeomGuideList">
- <element name="gd">
- <ref name="CT_GeomGuide"/>
- </element>
- </define>
- <define name="ST_AdjCoordinate">
- <choice>
- <ref name="ST_Coordinate"/>
- <ref name="ST_GeomGuideName"/>
- </choice>
- </define>
- <!-- Union -->
- <define name="ST_AdjAngle">
- <choice>
- <ref name="ST_Angle"/>
- <ref name="ST_GeomGuideName"/>
- </choice>
- </define>
- <!-- Union -->
- <define name="CT_AdjPoint2D">
- <attribute name="x">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- <attribute name="y">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- </define>
- <define name="CT_GeomRect">
- <attribute name="l">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- <attribute name="t">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- <attribute name="r">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- <attribute name="b">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- </define>
- <define name="CT_XYAdjustHandle">
- <element name="pos">
- <ref name="CT_AdjPoint2D"/>
- </element>
- <attribute name="gdRefX">
- <ref name="ST_GeomGuideName"/>
- </attribute>
- <attribute name="minX">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- <attribute name="maxX">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- <attribute name="gdRefY">
- <ref name="ST_GeomGuideName"/>
- </attribute>
- <attribute name="minY">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- <attribute name="maxY">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- </define>
- <define name="CT_PolarAdjustHandle">
- <element name="pos">
- <ref name="CT_AdjPoint2D"/>
- </element>
- <attribute name="gdRefR">
- <ref name="ST_GeomGuideName"/>
- </attribute>
- <attribute name="minR">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- <attribute name="maxR">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- <attribute name="gdRefAng">
- <ref name="ST_GeomGuideName"/>
- </attribute>
- <attribute name="minAng">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- <attribute name="maxAng">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- </define>
- <define name="CT_ConnectionSite">
- <element name="pos">
- <ref name="CT_AdjPoint2D"/>
- </element>
- <attribute name="ang">
- <ref name="ST_AdjAngle"/>
- </attribute>
- </define>
- <define name="CT_AdjustHandleList">
- <choice>
- <element name="ahXY">
- <ref name="CT_XYAdjustHandle"/>
- </element>
- <element name="ahPolar">
- <ref name="CT_PolarAdjustHandle"/>
- </element>
- </choice>
- </define>
- <define name="CT_ConnectionSiteList">
- <element name="cxn">
- <ref name="CT_ConnectionSite"/>
- </element>
- </define>
- <define name="CT_Connection">
- <attribute name="id">
- <ref name="ST_DrawingElementId"/>
- </attribute>
- <attribute name="idx">
- <data type="unsignedInt"/>
- </attribute>
- </define>
- <define name="CT_Path2DMoveTo">
- <element name="pt">
- <ref name="CT_AdjPoint2D"/>
- </element>
- </define>
- <define name="CT_Path2DLineTo">
- <element name="pt">
- <ref name="CT_AdjPoint2D"/>
- </element>
- </define>
- <define name="CT_Path2DArcTo">
- <attribute name="wR">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- <attribute name="hR">
- <ref name="ST_AdjCoordinate"/>
- </attribute>
- <attribute name="stAng">
- <ref name="ST_AdjAngle"/>
- </attribute>
- <attribute name="swAng">
- <ref name="ST_AdjAngle"/>
- </attribute>
- </define>
- <define name="CT_Path2DQuadBezierTo">
- <element name="pt">
- <ref name="CT_AdjPoint2D"/>
- </element>
- </define>
- <define name="CT_Path2DCubicBezierTo">
- <element name="pt">
- <ref name="CT_AdjPoint2D"/>
- </element>
- </define>
- <define name="CT_Path2DClose">
- </define>
- <define name="ST_PathFillMode">
- <choice>
- <!-- No Path Fill -->
- <value>none</value>
- <!-- Normal Path Fill -->
- <value>norm</value>
- <!-- Lighten Path Fill -->
- <value>lighten</value>
- <!-- Lighten Path Fill Less -->
- <value>lightenLess</value>
- <!-- Darken Path Fill -->
- <value>darken</value>
- <!-- Darken Path Fill Less -->
- <value>darkenLess</value>
- </choice>
- </define>
- <define name="CT_Path2D">
- <choice>
- <element name="close">
- <ref name="CT_Path2DClose"/>
- </element>
- <element name="moveTo">
- <ref name="CT_Path2DMoveTo"/>
- </element>
- <element name="lnTo">
- <ref name="CT_Path2DLineTo"/>
- </element>
- <element name="arcTo">
- <ref name="CT_Path2DArcTo"/>
- </element>
- <element name="quadBezTo">
- <ref name="CT_Path2DQuadBezierTo"/>
- </element>
- <element name="cubicBezTo">
- <ref name="CT_Path2DCubicBezierTo"/>
- </element>
- </choice>
- <attribute name="w">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="h">
- <ref name="ST_PositiveCoordinate"/>
- </attribute>
- <attribute name="fill">
- <ref name="ST_PathFillMode"/>
- </attribute>
- <attribute name="stroke">
- <data type="boolean"/>
- </attribute>
- <attribute name="extrusionOk">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_Path2DList">
- <element name="path">
- <ref name="CT_Path2D"/>
- </element>
- </define>
- <define name="CT_PresetGeometry2D">
- <element name="avLst">
- <ref name="CT_GeomGuideList"/>
- </element>
- <attribute name="prst">
- <ref name="ST_ShapeType"/>
- </attribute>
- </define>
- <define name="CT_PresetTextShape">
- <element name="avLst">
- <ref name="CT_GeomGuideList"/>
- </element>
- <attribute name="prst">
- <ref name="ST_TextShapeType"/>
- </attribute>
- </define>
- <define name="CT_CustomGeometry2D">
- <element name="avLst">
- <ref name="CT_GeomGuideList"/>
- </element>
- <element name="gdLst">
- <ref name="CT_GeomGuideList"/>
- </element>
- <element name="ahLst">
- <ref name="CT_AdjustHandleList"/>
- </element>
- <element name="cxnLst">
- <ref name="CT_ConnectionSiteList"/>
- </element>
- <element name="rect">
- <ref name="CT_GeomRect"/>
- </element>
- <element name="pathLst">
- <ref name="CT_Path2DList"/>
- </element>
- </define>
- <define name="EG_Geometry">
- <choice>
- <element name="custGeom">
- <ref name="CT_CustomGeometry2D"/>
- </element>
- <element name="prstGeom">
- <ref name="CT_PresetGeometry2D"/>
- </element>
- </choice>
- </define>
- <define name="EG_TextGeometry">
- <choice>
- <element name="custGeom">
- <ref name="CT_CustomGeometry2D"/>
- </element>
- <element name="prstTxWarp">
- <ref name="CT_PresetTextShape"/>
- </element>
- </choice>
- </define>
- </grammar>
- <resource name="ST_ShapeType" resource="List">
- <value tokenid="ooxml:Value_ST_ShapeType_line">line</value>
- <value tokenid="ooxml:Value_ST_ShapeType_lineInv">lineInv</value>
- <value tokenid="ooxml:Value_ST_ShapeType_triangle">triangle</value>
- <value tokenid="ooxml:Value_ST_ShapeType_rtTriangle">rtTriangle</value>
- <value tokenid="ooxml:Value_ST_ShapeType_rect">rect</value>
- <value tokenid="ooxml:Value_ST_ShapeType_diamond">diamond</value>
- <value tokenid="ooxml:Value_ST_ShapeType_parallelogram">parallelogram</value>
- <value tokenid="ooxml:Value_ST_ShapeType_trapezoid">trapezoid</value>
- <value tokenid="ooxml:Value_ST_ShapeType_nonIsoscelesTrapezoid">nonIsoscelesTrapezoid</value>
- <value tokenid="ooxml:Value_ST_ShapeType_pentagon">pentagon</value>
- <value tokenid="ooxml:Value_ST_ShapeType_hexagon">hexagon</value>
- <value tokenid="ooxml:Value_ST_ShapeType_heptagon">heptagon</value>
- <value tokenid="ooxml:Value_ST_ShapeType_octagon">octagon</value>
- <value tokenid="ooxml:Value_ST_ShapeType_decagon">decagon</value>
- <value tokenid="ooxml:Value_ST_ShapeType_dodecagon">dodecagon</value>
- <value tokenid="ooxml:Value_ST_ShapeType_star4">star4</value>
- <value tokenid="ooxml:Value_ST_ShapeType_star5">star5</value>
- <value tokenid="ooxml:Value_ST_ShapeType_star6">star6</value>
- <value tokenid="ooxml:Value_ST_ShapeType_star7">star7</value>
- <value tokenid="ooxml:Value_ST_ShapeType_star8">star8</value>
- <value tokenid="ooxml:Value_ST_ShapeType_star10">star10</value>
- <value tokenid="ooxml:Value_ST_ShapeType_star12">star12</value>
- <value tokenid="ooxml:Value_ST_ShapeType_star16">star16</value>
- <value tokenid="ooxml:Value_ST_ShapeType_star24">star24</value>
- <value tokenid="ooxml:Value_ST_ShapeType_star32">star32</value>
- <value tokenid="ooxml:Value_ST_ShapeType_roundRect">roundRect</value>
- <value tokenid="ooxml:Value_ST_ShapeType_round1Rect">round1Rect</value>
- <value tokenid="ooxml:Value_ST_ShapeType_round2SameRect">round2SameRect</value>
- <value tokenid="ooxml:Value_ST_ShapeType_round2DiagRect">round2DiagRect</value>
- <value tokenid="ooxml:Value_ST_ShapeType_snipRoundRect">snipRoundRect</value>
- <value tokenid="ooxml:Value_ST_ShapeType_snip1Rect">snip1Rect</value>
- <value tokenid="ooxml:Value_ST_ShapeType_snip2SameRect">snip2SameRect</value>
- <value tokenid="ooxml:Value_ST_ShapeType_snip2DiagRect">snip2DiagRect</value>
- <value tokenid="ooxml:Value_ST_ShapeType_plaque">plaque</value>
- <value tokenid="ooxml:Value_ST_ShapeType_ellipse">ellipse</value>
- <value tokenid="ooxml:Value_ST_ShapeType_teardrop">teardrop</value>
- <value tokenid="ooxml:Value_ST_ShapeType_homePlate">homePlate</value>
- <value tokenid="ooxml:Value_ST_ShapeType_chevron">chevron</value>
- <value tokenid="ooxml:Value_ST_ShapeType_pieWedge">pieWedge</value>
- <value tokenid="ooxml:Value_ST_ShapeType_pie">pie</value>
- <value tokenid="ooxml:Value_ST_ShapeType_blockArc">blockArc</value>
- <value tokenid="ooxml:Value_ST_ShapeType_donut">donut</value>
- <value tokenid="ooxml:Value_ST_ShapeType_noSmoking">noSmoking</value>
- <value tokenid="ooxml:Value_ST_ShapeType_rightArrow">rightArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_leftArrow">leftArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_upArrow">upArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_downArrow">downArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_stripedRightArrow">stripedRightArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_notchedRightArrow">notchedRightArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_bentUpArrow">bentUpArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_leftRightArrow">leftRightArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_upDownArrow">upDownArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_leftUpArrow">leftUpArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_leftRightUpArrow">leftRightUpArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_quadArrow">quadArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_leftArrowCallout">leftArrowCallout</value>
- <value tokenid="ooxml:Value_ST_ShapeType_rightArrowCallout">rightArrowCallout</value>
- <value tokenid="ooxml:Value_ST_ShapeType_upArrowCallout">upArrowCallout</value>
- <value tokenid="ooxml:Value_ST_ShapeType_downArrowCallout">downArrowCallout</value>
- <value tokenid="ooxml:Value_ST_ShapeType_leftRightArrowCallout">leftRightArrowCallout</value>
- <value tokenid="ooxml:Value_ST_ShapeType_upDownArrowCallout">upDownArrowCallout</value>
- <value tokenid="ooxml:Value_ST_ShapeType_quadArrowCallout">quadArrowCallout</value>
- <value tokenid="ooxml:Value_ST_ShapeType_bentArrow">bentArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_uturnArrow">uturnArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_circularArrow">circularArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_leftCircularArrow">leftCircularArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_leftRightCircularArrow">leftRightCircularArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_curvedRightArrow">curvedRightArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_curvedLeftArrow">curvedLeftArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_curvedUpArrow">curvedUpArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_curvedDownArrow">curvedDownArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_swooshArrow">swooshArrow</value>
- <value tokenid="ooxml:Value_ST_ShapeType_cube">cube</value>
- <value tokenid="ooxml:Value_ST_ShapeType_can">can</value>
- <value tokenid="ooxml:Value_ST_ShapeType_lightningBolt">lightningBolt</value>
- <value tokenid="ooxml:Value_ST_ShapeType_heart">heart</value>
- <value tokenid="ooxml:Value_ST_ShapeType_sun">sun</value>
- <value tokenid="ooxml:Value_ST_ShapeType_moon">moon</value>
- <value tokenid="ooxml:Value_ST_ShapeType_smileyFace">smileyFace</value>
- <value tokenid="ooxml:Value_ST_ShapeType_irregularSeal1">irregularSeal1</value>
- <value tokenid="ooxml:Value_ST_ShapeType_irregularSeal2">irregularSeal2</value>
- <value tokenid="ooxml:Value_ST_ShapeType_foldedCorner">foldedCorner</value>
- <value tokenid="ooxml:Value_ST_ShapeType_bevel">bevel</value>
- <value tokenid="ooxml:Value_ST_ShapeType_frame">frame</value>
- <value tokenid="ooxml:Value_ST_ShapeType_halfFrame">halfFrame</value>
- <value tokenid="ooxml:Value_ST_ShapeType_corner">corner</value>
- <value tokenid="ooxml:Value_ST_ShapeType_diagStripe">diagStripe</value>
- <value tokenid="ooxml:Value_ST_ShapeType_chord">chord</value>
- <value tokenid="ooxml:Value_ST_ShapeType_arc">arc</value>
- <value tokenid="ooxml:Value_ST_ShapeType_leftBracket">leftBracket</value>
- <value tokenid="ooxml:Value_ST_ShapeType_rightBracket">rightBracket</value>
- <value tokenid="ooxml:Value_ST_ShapeType_leftBrace">leftBrace</value>
- <value tokenid="ooxml:Value_ST_ShapeType_rightBrace">rightBrace</value>
- <value tokenid="ooxml:Value_ST_ShapeType_bracketPair">bracketPair</value>
- <value tokenid="ooxml:Value_ST_ShapeType_bracePair">bracePair</value>
- <value tokenid="ooxml:Value_ST_ShapeType_straightConnector1">straightConnector1</value>
- <value tokenid="ooxml:Value_ST_ShapeType_bentConnector2">bentConnector2</value>
- <value tokenid="ooxml:Value_ST_ShapeType_bentConnector3">bentConnector3</value>
- <value tokenid="ooxml:Value_ST_ShapeType_bentConnector4">bentConnector4</value>
- <value tokenid="ooxml:Value_ST_ShapeType_bentConnector5">bentConnector5</value>
- <value tokenid="ooxml:Value_ST_ShapeType_curvedConnector2">curvedConnector2</value>
- <value tokenid="ooxml:Value_ST_ShapeType_curvedConnector3">curvedConnector3</value>
- <value tokenid="ooxml:Value_ST_ShapeType_curvedConnector4">curvedConnector4</value>
- <value tokenid="ooxml:Value_ST_ShapeType_curvedConnector5">curvedConnector5</value>
- <value tokenid="ooxml:Value_ST_ShapeType_callout1">callout1</value>
- <value tokenid="ooxml:Value_ST_ShapeType_callout2">callout2</value>
- <value tokenid="ooxml:Value_ST_ShapeType_callout3">callout3</value>
- <value tokenid="ooxml:Value_ST_ShapeType_accentCallout1">accentCallout1</value>
- <value tokenid="ooxml:Value_ST_ShapeType_accentCallout2">accentCallout2</value>
- <value tokenid="ooxml:Value_ST_ShapeType_accentCallout3">accentCallout3</value>
- <value tokenid="ooxml:Value_ST_ShapeType_borderCallout1">borderCallout1</value>
- <value tokenid="ooxml:Value_ST_ShapeType_borderCallout2">borderCallout2</value>
- <value tokenid="ooxml:Value_ST_ShapeType_borderCallout3">borderCallout3</value>
- <value tokenid="ooxml:Value_ST_ShapeType_accentBorderCallout1">accentBorderCallout1</value>
- <value tokenid="ooxml:Value_ST_ShapeType_accentBorderCallout2">accentBorderCallout2</value>
- <value tokenid="ooxml:Value_ST_ShapeType_accentBorderCallout3">accentBorderCallout3</value>
- <value tokenid="ooxml:Value_ST_ShapeType_wedgeRectCallout">wedgeRectCallout</value>
- <value tokenid="ooxml:Value_ST_ShapeType_wedgeRoundRectCallout">wedgeRoundRectCallout</value>
- <value tokenid="ooxml:Value_ST_ShapeType_wedgeEllipseCallout">wedgeEllipseCallout</value>
- <value tokenid="ooxml:Value_ST_ShapeType_cloudCallout">cloudCallout</value>
- <value tokenid="ooxml:Value_ST_ShapeType_cloud">cloud</value>
- <value tokenid="ooxml:Value_ST_ShapeType_ribbon">ribbon</value>
- <value tokenid="ooxml:Value_ST_ShapeType_ribbon2">ribbon2</value>
- <value tokenid="ooxml:Value_ST_ShapeType_ellipseRibbon">ellipseRibbon</value>
- <value tokenid="ooxml:Value_ST_ShapeType_ellipseRibbon2">ellipseRibbon2</value>
- <value tokenid="ooxml:Value_ST_ShapeType_leftRightRibbon">leftRightRibbon</value>
- <value tokenid="ooxml:Value_ST_ShapeType_verticalScroll">verticalScroll</value>
- <value tokenid="ooxml:Value_ST_ShapeType_horizontalScroll">horizontalScroll</value>
- <value tokenid="ooxml:Value_ST_ShapeType_wave">wave</value>
- <value tokenid="ooxml:Value_ST_ShapeType_doubleWave">doubleWave</value>
- <value tokenid="ooxml:Value_ST_ShapeType_plus">plus</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartProcess">flowChartProcess</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartDecision">flowChartDecision</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartInputOutput">flowChartInputOutput</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartPredefinedProcess">flowChartPredefinedProcess</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartInternalStorage">flowChartInternalStorage</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartDocument">flowChartDocument</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartMultidocument">flowChartMultidocument</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartTerminator">flowChartTerminator</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartPreparation">flowChartPreparation</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartManualInput">flowChartManualInput</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartManualOperation">flowChartManualOperation</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartConnector">flowChartConnector</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartPunchedCard">flowChartPunchedCard</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartPunchedTape">flowChartPunchedTape</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartSummingJunction">flowChartSummingJunction</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartOr">flowChartOr</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartCollate">flowChartCollate</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartSort">flowChartSort</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartExtract">flowChartExtract</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartMerge">flowChartMerge</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartOfflineStorage">flowChartOfflineStorage</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartOnlineStorage">flowChartOnlineStorage</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartMagneticTape">flowChartMagneticTape</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartMagneticDisk">flowChartMagneticDisk</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartMagneticDrum">flowChartMagneticDrum</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartDisplay">flowChartDisplay</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartDelay">flowChartDelay</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartAlternateProcess">flowChartAlternateProcess</value>
- <value tokenid="ooxml:Value_ST_ShapeType_flowChartOffpageConnector">flowChartOffpageConnector</value>
- <value tokenid="ooxml:Value_ST_ShapeType_actionButtonBlank">actionButtonBlank</value>
- <value tokenid="ooxml:Value_ST_ShapeType_actionButtonHome">actionButtonHome</value>
- <value tokenid="ooxml:Value_ST_ShapeType_actionButtonHelp">actionButtonHelp</value>
- <value tokenid="ooxml:Value_ST_ShapeType_actionButtonInformation">actionButtonInformation</value>
- <value tokenid="ooxml:Value_ST_ShapeType_actionButtonForwardNext">actionButtonForwardNext</value>
- <value tokenid="ooxml:Value_ST_ShapeType_actionButtonBackPrevious">actionButtonBackPrevious</value>
- <value tokenid="ooxml:Value_ST_ShapeType_actionButtonEnd">actionButtonEnd</value>
- <value tokenid="ooxml:Value_ST_ShapeType_actionButtonBeginning">actionButtonBeginning</value>
- <value tokenid="ooxml:Value_ST_ShapeType_actionButtonReturn">actionButtonReturn</value>
- <value tokenid="ooxml:Value_ST_ShapeType_actionButtonDocument">actionButtonDocument</value>
- <value tokenid="ooxml:Value_ST_ShapeType_actionButtonSound">actionButtonSound</value>
- <value tokenid="ooxml:Value_ST_ShapeType_actionButtonMovie">actionButtonMovie</value>
- <value tokenid="ooxml:Value_ST_ShapeType_gear6">gear6</value>
- <value tokenid="ooxml:Value_ST_ShapeType_gear9">gear9</value>
- <value tokenid="ooxml:Value_ST_ShapeType_funnel">funnel</value>
- <value tokenid="ooxml:Value_ST_ShapeType_mathPlus">mathPlus</value>
- <value tokenid="ooxml:Value_ST_ShapeType_mathMinus">mathMinus</value>
- <value tokenid="ooxml:Value_ST_ShapeType_mathMultiply">mathMultiply</value>
- <value tokenid="ooxml:Value_ST_ShapeType_mathDivide">mathDivide</value>
- <value tokenid="ooxml:Value_ST_ShapeType_mathEqual">mathEqual</value>
- <value tokenid="ooxml:Value_ST_ShapeType_mathNotEqual">mathNotEqual</value>
- <value tokenid="ooxml:Value_ST_ShapeType_cornerTabs">cornerTabs</value>
- <value tokenid="ooxml:Value_ST_ShapeType_squareTabs">squareTabs</value>
- <value tokenid="ooxml:Value_ST_ShapeType_plaqueTabs">plaqueTabs</value>
- <value tokenid="ooxml:Value_ST_ShapeType_chartX">chartX</value>
- <value tokenid="ooxml:Value_ST_ShapeType_chartStar">chartStar</value>
- <value tokenid="ooxml:Value_ST_ShapeType_chartPlus">chartPlus</value>
- </resource>
- <resource name="ST_TextShapeType" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textNoShape">textNoShape</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textPlain">textPlain</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textStop">textStop</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textTriangle">textTriangle</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textTriangleInverted">textTriangleInverted</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textChevron">textChevron</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textChevronInverted">textChevronInverted</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textRingInside">textRingInside</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textRingOutside">textRingOutside</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textArchUp">textArchUp</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textArchDown">textArchDown</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textCircle">textCircle</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textButton">textButton</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textArchUpPour">textArchUpPour</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textArchDownPour">textArchDownPour</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textCirclePour">textCirclePour</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textButtonPour">textButtonPour</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textCurveUp">textCurveUp</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textCurveDown">textCurveDown</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textCanUp">textCanUp</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textCanDown">textCanDown</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textWave1">textWave1</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textWave2">textWave2</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textDoubleWave1">textDoubleWave1</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textWave4">textWave4</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textInflate">textInflate</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textDeflate">textDeflate</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textInflateBottom">textInflateBottom</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textDeflateBottom">textDeflateBottom</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textInflateTop">textInflateTop</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textDeflateTop">textDeflateTop</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textDeflateInflate">textDeflateInflate</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textDeflateInflateDeflate">textDeflateInflateDeflate</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textFadeRight">textFadeRight</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textFadeLeft">textFadeLeft</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textFadeUp">textFadeUp</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textFadeDown">textFadeDown</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textSlantUp">textSlantUp</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textSlantDown">textSlantDown</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textCascadeUp">textCascadeUp</value>
- <value tokenid="ooxml:Value_drawingml_ST_TextShapeType_textCascadeDown">textCascadeDown</value>
- </resource>
- <resource name="ST_GeomGuideName" resource="String"/>
- <resource name="ST_GeomGuideFormula" resource="String"/>
- <resource name="CT_GeomGuideList" resource="Properties">
- <element name="gd" tokenid="ooxml:CT_GeomGuideList_gd"/>
- </resource>
- <resource name="ST_PathFillMode" resource="List">
- <value tokenid="ooxml:Value_drawingml_ST_PathFillMode_none">none</value>
- <value tokenid="ooxml:Value_drawingml_ST_PathFillMode_norm">norm</value>
- <value tokenid="ooxml:Value_drawingml_ST_PathFillMode_lighten">lighten</value>
- <value tokenid="ooxml:Value_drawingml_ST_PathFillMode_lightenLess">lightenLess</value>
- <value tokenid="ooxml:Value_drawingml_ST_PathFillMode_darken">darken</value>
- <value tokenid="ooxml:Value_drawingml_ST_PathFillMode_darkenLess">darkenLess</value>
- </resource>
- <resource name="CT_PresetGeometry2D" resource="Properties">
- <element name="avLst" tokenid="ooxml:CT_PresetGeometry2D_avLst"/>
- <attribute name="prst" tokenid="ooxml:CT_PresetGeometry2D_prst"/>
- </resource>
- <resource name="CT_CustomGeometry2D" resource="Properties">
- <element name="avLst" tokenid="ooxml:CT_CustomGeometry2D_avLst"/>
- <element name="gdLst" tokenid="ooxml:CT_CustomGeometry2D_gdLst"/>
- <element name="ahLst" tokenid="ooxml:CT_CustomGeometry2D_ahLst"/>
- <element name="cxnLst" tokenid="ooxml:CT_CustomGeometry2D_cxnLst"/>
- <element name="rect" tokenid="ooxml:CT_CustomGeometry2D_rect"/>
- <element name="pathLst" tokenid="ooxml:CT_CustomGeometry2D_pathLst"/>
- </resource>
- <resource name="EG_Geometry" resource="Properties">
- <element name="custGeom" tokenid="ooxml:EG_Geometry_custGeom"/>
- <element name="prstGeom" tokenid="ooxml:EG_Geometry_prstGeom"/>
- </resource>
- </namespace>
- <namespace name="dml-wordprocessingDrawing">
- <start name="inline"/>
- <start name="anchor"/>
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
- <include href="dml-graphicalObject"/>
- <include href="dml-documentProperties"/>
- <!-- start = inline | anchor -->
- <define name="ST_Coordinate">
- <data type="long"/>
- </define>
- <define name="CT_EffectExtent">
- <attribute name="l">
- <ref name="ST_Coordinate"/>
- </attribute>
- <attribute name="t">
- <ref name="ST_Coordinate"/>
- </attribute>
- <attribute name="r">
- <ref name="ST_Coordinate"/>
- </attribute>
- <attribute name="b">
- <ref name="ST_Coordinate"/>
- </attribute>
- </define>
- <define name="ST_WrapDistance">
- <data type="unsignedInt"/>
- </define>
- <define name="ST_EditId">
- <data type="hexBinary"/>
- </define>
- <define name="CT_Inline">
- <element name="extent">
- <ref name="CT_PositiveSize2D"/>
- </element>
- <element name="effectExtent">
- <ref name="CT_EffectExtent"/>
- </element>
- <element name="docPr">
- <ref name="CT_NonVisualDrawingProps"/>
- </element>
- <element name="cNvGraphicFramePr">
- <ref name="CT_NonVisualGraphicFrameProperties"/>
- </element>
- <element name="a:graphic">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="wp14:sizeRelH">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="wp14:sizeRelV">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <attribute name="distT">
- <ref name="ST_WrapDistance"/>
- </attribute>
- <attribute name="distB">
- <ref name="ST_WrapDistance"/>
- </attribute>
- <attribute name="distL">
- <ref name="ST_WrapDistance"/>
- </attribute>
- <attribute name="distR">
- <ref name="ST_WrapDistance"/>
- </attribute>
- <attribute name="wp14:anchorId">
- <ref name="ST_EditId"/>
- </attribute>
- </define>
- <define name="ST_WrapText">
- <choice>
- <!-- Both Sides -->
- <value>bothSides</value>
- <!-- Left Side Only -->
- <value>left</value>
- <!-- Right Side Only -->
- <value>right</value>
- <!-- Largest Side Only -->
- <value>largest</value>
- </choice>
- </define>
- <define name="CT_WrapPath">
- <element name="start">
- <ref name="CT_Point2D"/>
- </element>
- <element name="lineTo">
- <ref name="CT_Point2D"/>
- </element>
- <attribute name="edited">
- <data type="boolean"/>
- </attribute>
- </define>
- <define name="CT_WrapNone">
- </define>
- <define name="CT_WrapSquare">
- <element name="effectExtent">
- <ref name="CT_EffectExtent"/>
- </element>
- <attribute name="wrapText">
- <ref name="ST_WrapText"/>
- </attribute>
- <attribute name="distT">
- <ref name="ST_WrapDistance"/>
- </attribute>
- <attribute name="distB">
- <ref name="ST_WrapDistance"/>
- </attribute>
- <attribute name="distL">
- <ref name="ST_WrapDistance"/>
- </attribute>
- <attribute name="distR">
- <ref name="ST_WrapDistance"/>
- </attribute>
- </define>
- <define name="CT_WrapTight">
- <element name="wrapPolygon">
- <ref name="CT_WrapPath"/>
- </element>
- <attribute name="wrapText">
- <ref name="ST_WrapText"/>
- </attribute>
- <attribute name="distL">
- <ref name="ST_WrapDistance"/>
- </attribute>
- <attribute name="distR">
- <ref name="ST_WrapDistance"/>
- </attribute>
- </define>
- <define name="CT_WrapThrough">
- <element name="wrapPolygon">
- <ref name="CT_WrapPath"/>
- </element>
- <attribute name="wrapText">
- <ref name="ST_WrapText"/>
- </attribute>
- <attribute name="distL">
- <ref name="ST_WrapDistance"/>
- </attribute>
- <attribute name="distR">
- <ref name="ST_WrapDistance"/>
- </attribute>
- </define>
- <define name="CT_WrapTopBottom">
- <element name="effectExtent">
- <ref name="CT_EffectExtent"/>
- </element>
- <attribute name="distT">
- <ref name="ST_WrapDistance"/>
- </attribute>
- <attribute name="distB">
- <ref name="ST_WrapDistance"/>
- </attribute>
- </define>
- <define name="EG_WrapType">
- <choice>
- <element name="wrapNone">
- <ref name="CT_WrapNone"/>
- </element>
- <element name="wrapSquare">
- <ref name="CT_WrapSquare"/>
- </element>
- <element name="wrapTight">
- <ref name="CT_WrapTight"/>
- </element>
- <element name="wrapThrough">
- <ref name="CT_WrapThrough"/>
- </element>
- <element name="wrapTopAndBottom">
- <ref name="CT_WrapTopBottom"/>
- </element>
- </choice>
- </define>
- <define name="ST_PositionOffset">
- <data type="int"/>
- </define>
- <define name="ST_AlignH">
- <choice>
- <!-- Left Alignment -->
- <value>left</value>
- <!-- Right Alignment -->
- <value>right</value>
- <!-- Center Alignment -->
- <value>center</value>
- <!-- Inside -->
- <value>inside</value>
- <!-- Outside -->
- <value>outside</value>
- </choice>
- </define>
- <define name="ST_RelFromH">
- <choice>
- <!-- Page Margin -->
- <value>margin</value>
- <!-- Page Edge -->
- <value>page</value>
- <!-- Column -->
- <value>column</value>
- <!-- Character -->
- <value>character</value>
- <!-- Left Margin -->
- <value>leftMargin</value>
- <!-- Right Margin -->
- <value>rightMargin</value>
- <!-- Inside Margin -->
- <value>insideMargin</value>
- <!-- Outside Margin -->
- <value>outsideMargin</value>
- </choice>
- </define>
- <define name="CT_PosH">
- <choice>
- <element name="align">
- <ref name="ST_AlignH"/>
- </element>
- <element name="posOffset">
- <ref name="ST_PositionOffset"/>
- </element>
- </choice>
- <attribute name="relativeFrom">
- <ref name="ST_RelFromH"/>
- </attribute>
- </define>
- <define name="ST_AlignV">
- <choice>
- <!-- Top -->
- <value>top</value>
- <!-- Bottom -->
- <value>bottom</value>
- <!-- Center Alignment -->
- <value>center</value>
- <!-- Inside -->
- <value>inside</value>
- <!-- Outside -->
- <value>outside</value>
- </choice>
- </define>
- <define name="ST_RelFromV">
- <choice>
- <!-- Page Margin -->
- <value>margin</value>
- <!-- Page Edge -->
- <value>page</value>
- <!-- Paragraph -->
- <value>paragraph</value>
- <!-- Line -->
- <value>line</value>
- <!-- Top Margin -->
- <value>topMargin</value>
- <!-- Bottom Margin -->
- <value>bottomMargin</value>
- <!-- Inside Margin -->
- <value>insideMargin</value>
- <!-- Outside Margin -->
- <value>outsideMargin</value>
- </choice>
- </define>
- <define name="CT_PosV">
- <choice>
- <element name="align">
- <ref name="ST_AlignV"/>
- </element>
- <element name="posOffset">
- <ref name="ST_PositionOffset"/>
- </element>
- </choice>
- <attribute name="relativeFrom">
- <ref name="ST_RelFromV"/>
- </attribute>
- </define>
- <define name="CT_Anchor">
- <element name="simplePos">
- <ref name="CT_Point2D"/>
- </element>
- <element name="positionH">
- <ref name="CT_PosH"/>
- </element>
- <element name="positionV">
- <ref name="CT_PosV"/>
- </element>
- <element name="extent">
- <ref name="CT_PositiveSize2D"/>
- </element>
- <element name="effectExtent">
- <ref name="CT_EffectExtent"/>
- </element>
- <ref name="EG_WrapType"/>
- <element name="docPr">
- <ref name="CT_NonVisualDrawingProps"/>
- </element>
- <element name="cNvGraphicFramePr">
- <ref name="CT_NonVisualGraphicFrameProperties"/>
- </element>
- <element name="a:graphic">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="wp14:sizeRelH">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="wp14:sizeRelV">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <attribute name="distT">
- <ref name="ST_WrapDistance"/>
- </attribute>
- <attribute name="distB">
- <ref name="ST_WrapDistance"/>
- </attribute>
- <attribute name="distL">
- <ref name="ST_WrapDistance"/>
- </attribute>
- <attribute name="distR">
- <ref name="ST_WrapDistance"/>
- </attribute>
- <attribute name="simplePos">
- <data type="boolean"/>
- </attribute>
- <attribute name="relativeHeight">
- <data type="unsignedInt"/>
- </attribute>
- <attribute name="behindDoc">
- <data type="boolean"/>
- </attribute>
- <attribute name="locked">
- <data type="boolean"/>
- </attribute>
- <attribute name="layoutInCell">
- <data type="boolean"/>
- </attribute>
- <attribute name="hidden">
- <data type="boolean"/>
- </attribute>
- <attribute name="allowOverlap">
- <data type="boolean"/>
- </attribute>
- <attribute name="wp14:anchorId">
- <ref name="ST_EditId"/>
- </attribute>
- </define>
- <define name="inline">
- <element name="inline">
- <ref name="CT_Inline"/>
- </element>
- </define>
- <define name="anchor">
- <element name="anchor">
- <ref name="CT_Anchor"/>
- </element>
- </define>
- </grammar>
- <resource name="ST_Coordinate" resource="Integer"/>
- <resource name="CT_EffectExtent" resource="Properties">
- <attribute name="l" tokenid="ooxml:CT_EffectExtent_l"/>
- <attribute name="t" tokenid="ooxml:CT_EffectExtent_t"/>
- <attribute name="r" tokenid="ooxml:CT_EffectExtent_r"/>
- <attribute name="b" tokenid="ooxml:CT_EffectExtent_b"/>
- </resource>
- <resource name="ST_WrapDistance" resource="Integer"/>
- <resource name="CT_Inline" resource="Properties">
- <element name="extent" tokenid="ooxml:CT_Inline_extent"/>
- <element name="effectExtent" tokenid="ooxml:CT_Inline_effectExtent"/>
- <element name="docPr" tokenid="ooxml:CT_Inline_docPr"/>
- <element name="cNvGraphicFramePr" tokenid="ooxml:CT_Inline_cNvGraphicFramePr"/>
- <element name="a:graphic" tokenid="ooxml:CT_Inline_a_graphic"/>
- <element name="wp14:sizeRelH" tokenid="ooxml:CT_Inline_wp14_sizeRelH"/>
- <element name="wp14:sizeRelV" tokenid="ooxml:CT_Inline_wp14_sizeRelV"/>
- <attribute name="distT" tokenid="ooxml:CT_Inline_distT"/>
- <attribute name="distB" tokenid="ooxml:CT_Inline_distB"/>
- <attribute name="distL" tokenid="ooxml:CT_Inline_distL"/>
- <attribute name="distR" tokenid="ooxml:CT_Inline_distR"/>
- <attribute name="wp14:anchorId" tokenid="ooxml:CT_Inline_wp14_anchorId"/>
- </resource>
- <resource name="ST_WrapText" resource="List">
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_WrapText_bothSides">bothSides</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_WrapText_left">left</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_WrapText_right">right</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_WrapText_largest">largest</value>
- </resource>
- <resource name="CT_WrapPath" resource="Properties">
- <element name="start" tokenid="ooxml:CT_WrapPath_start"/>
- <element name="lineTo" tokenid="ooxml:CT_WrapPath_lineTo"/>
- <attribute name="edited" tokenid="ooxml:CT_WrapPath_edited"/>
- </resource>
- <resource name="CT_WrapNone" resource="Properties"/>
- <resource name="CT_WrapSquare" resource="Properties">
- <element name="effectExtent" tokenid="ooxml:CT_WrapSquare_effectExtent"/>
- <attribute name="wrapText" tokenid="ooxml:CT_WrapSquare_wrapText"/>
- <attribute name="distT" tokenid="ooxml:CT_WrapSquare_distT"/>
- <attribute name="distB" tokenid="ooxml:CT_WrapSquare_distB"/>
- <attribute name="distL" tokenid="ooxml:CT_WrapSquare_distL"/>
- <attribute name="distR" tokenid="ooxml:CT_WrapSquare_distR"/>
- </resource>
- <resource name="CT_WrapTight" resource="Properties">
- <element name="wrapPolygon" tokenid="ooxml:CT_WrapTight_wrapPolygon"/>
- <attribute name="wrapText" tokenid="ooxml:CT_WrapTight_wrapText"/>
- <attribute name="distL" tokenid="ooxml:CT_WrapTight_distL"/>
- <attribute name="distR" tokenid="ooxml:CT_WrapTight_distR"/>
- </resource>
- <resource name="CT_WrapThrough" resource="Properties">
- <element name="wrapPolygon" tokenid="ooxml:CT_WrapThrough_wrapPolygon"/>
- <attribute name="wrapText" tokenid="ooxml:CT_WrapThrough_wrapText"/>
- <attribute name="distL" tokenid="ooxml:CT_WrapThrough_distL"/>
- <attribute name="distR" tokenid="ooxml:CT_WrapThrough_distR"/>
- </resource>
- <resource name="CT_WrapTopBottom" resource="Properties">
- <element name="effectExtent" tokenid="ooxml:CT_WrapTopBottom_effectExtent"/>
- <attribute name="distT" tokenid="ooxml:CT_WrapTopBottom_distT"/>
- <attribute name="distB" tokenid="ooxml:CT_WrapTopBottom_distB"/>
- </resource>
- <resource name="EG_WrapType" resource="Properties">
- <element name="wrapNone" tokenid="ooxml:EG_WrapType_wrapNone"/>
- <element name="wrapSquare" tokenid="ooxml:EG_WrapType_wrapSquare"/>
- <element name="wrapTight" tokenid="ooxml:EG_WrapType_wrapTight"/>
- <element name="wrapThrough" tokenid="ooxml:EG_WrapType_wrapThrough"/>
- <element name="wrapTopAndBottom" tokenid="ooxml:EG_WrapType_wrapTopAndBottom"/>
- </resource>
- <resource name="ST_PositionOffset" resource="Value">
- <action name="characters" action="positionOffset"/>
- </resource>
- <resource name="ST_AlignH" resource="Value">
- <action name="characters" action="alignH"/>
- </resource>
- <resource name="ST_RelFromH" resource="List">
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromH_margin">margin</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromH_page">page</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromH_column">column</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromH_character">character</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromH_leftMargin">leftMargin</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromH_rightMargin">rightMargin</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromH_insideMargin">insideMargin</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromH_outsideMargin">outsideMargin</value>
- </resource>
- <resource name="CT_PosH" resource="Properties">
- <element name="align" tokenid="ooxml:CT_PosH_align"/>
- <element name="posOffset" tokenid="ooxml:CT_PosH_posOffset"/>
- <attribute name="relativeFrom" tokenid="ooxml:CT_PosH_relativeFrom"/>
- </resource>
- <resource name="ST_AlignV" resource="Value">
- <action name="characters" action="alignV"/>
- </resource>
- <resource name="ST_RelFromV" resource="List">
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromV_margin">margin</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromV_page">page</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromV_paragraph">paragraph</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromV_line">line</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromV_topMargin">topMargin</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromV_bottomMargin">bottomMargin</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromV_insideMargin">insideMargin</value>
- <value tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromV_outsideMargin">outsideMargin</value>
- </resource>
- <resource name="CT_PosV" resource="Properties">
- <element name="align" tokenid="ooxml:CT_PosV_align"/>
- <element name="posOffset" tokenid="ooxml:CT_PosV_posOffset"/>
- <attribute name="relativeFrom" tokenid="ooxml:CT_PosV_relativeFrom"/>
- </resource>
- <resource name="ST_EditId" resource="Hex"/>
- <resource name="CT_Anchor" resource="Properties">
- <element name="simplePos" tokenid="ooxml:CT_Anchor_simplePos_elem"/>
- <element name="positionH" tokenid="ooxml:CT_Anchor_positionH"/>
- <element name="positionV" tokenid="ooxml:CT_Anchor_positionV"/>
- <element name="extent" tokenid="ooxml:CT_Anchor_extent"/>
- <element name="effectExtent" tokenid="ooxml:CT_Anchor_effectExtent"/>
- <element name="docPr" tokenid="ooxml:CT_Anchor_docPr"/>
- <element name="cNvGraphicFramePr" tokenid="ooxml:CT_Anchor_cNvGraphicFramePr"/>
- <element name="a:graphic" tokenid="ooxml:CT_Anchor_a_graphic"/>
- <element name="wp14:sizeRelV" tokenid="ooxml:CT_Anchor_wp14_sizeRelV"/>
- <attribute name="distT" tokenid="ooxml:CT_Anchor_distT"/>
- <attribute name="distB" tokenid="ooxml:CT_Anchor_distB"/>
- <attribute name="distL" tokenid="ooxml:CT_Anchor_distL"/>
- <attribute name="distR" tokenid="ooxml:CT_Anchor_distR"/>
- <attribute name="simplePos" tokenid="ooxml:CT_Anchor_simplePos_attr"/>
- <attribute name="relativeHeight" tokenid="ooxml:CT_Anchor_relativeHeight"/>
- <attribute name="behindDoc" tokenid="ooxml:CT_Anchor_behindDoc"/>
- <attribute name="locked" tokenid="ooxml:CT_Anchor_locked"/>
- <attribute name="layoutInCell" tokenid="ooxml:CT_Anchor_layoutInCell"/>
- <attribute name="hidden" tokenid="ooxml:CT_Anchor_hidden"/>
- <attribute name="allowOverlap" tokenid="ooxml:CT_Anchor_allowOverlap"/>
- <attribute name="wp14:anchorId" tokenid="ooxml:CT_Anchor_wp14_anchorId"/>
- </resource>
- <resource name="inline" resource="Properties">
- <element name="inline" tokenid="ooxml:inline_inline"/>
- </resource>
- <resource name="anchor" resource="Properties">
- <element name="anchor" tokenid="ooxml:anchor_anchor"/>
- </resource>
- </namespace>
- <namespace name="sml-customXmlMappings">
- <start name="schemaLibrary"/>
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/schemaLibrary/2006/main">
- <!-- ISO RELAX NG Schema -->
- <!-- start = schemaLibrary -->
- <define name="CT_Schema">
- <attribute name="uri">
- <data type="string"/>
- </attribute>
- <attribute name="manifestLocation">
- <data type="string"/>
- </attribute>
- <attribute name="schemaLocation">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SchemaLibrary">
- <element name="schema">
- <ref name="CT_Schema"/>
- </element>
- </define>
- <define name="schemaLibrary">
- <element name="schemaLibrary">
- <ref name="CT_SchemaLibrary"/>
- </element>
- </define>
- </grammar>
- </namespace>
- <namespace name="shared-math">
- <start name="oMathPara"/>
- <start name="oMath"/>
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/officeDocument/2006/math" attributeFormDefault="qualified">
- <include href="wml"/>
- <!-- start = mathPr | oMathPara | oMath -->
- <define name="ST_Integer255">
- <data type="integer"/>
- </define>
- <define name="CT_Integer255">
- <attribute name="val">
- <ref name="ST_Integer255"/>
- </attribute>
- </define>
- <define name="ST_Integer2">
- <data type="integer"/>
- </define>
- <define name="CT_Integer2">
- <attribute name="val">
- <ref name="ST_Integer2"/>
- </attribute>
- </define>
- <define name="ST_SpacingRule">
- <data type="integer"/>
- </define>
- <define name="CT_SpacingRule">
- <attribute name="val">
- <ref name="ST_SpacingRule"/>
- </attribute>
- </define>
- <define name="ST_UnSignedInteger">
- <data type="unsignedInt"/>
- </define>
- <define name="CT_UnSignedInteger">
- <attribute name="val">
- <ref name="ST_UnSignedInteger"/>
- </attribute>
- </define>
- <define name="ST_Char">
- <data type="string"/>
- </define>
- <define name="CT_Char">
- <attribute name="val">
- <ref name="ST_Char"/>
- </attribute>
- </define>
- <define name="ST_OnOff">
- <choice>
- <!-- On -->
- <value>on</value>
- <!-- Off -->
- <value>off</value>
- </choice>
- </define>
- <define name="CT_OnOff">
- <attribute name="val">
- <ref name="ST_OnOff"/>
- </attribute>
- </define>
- <define name="ST_String">
- <data type="string"/>
- </define>
- <define name="CT_String">
- <attribute name="val">
- <ref name="ST_String"/>
- </attribute>
- </define>
- <define name="ST_XAlign">
- <choice>
- <!-- Left Justification -->
- <value>left</value>
- <!-- Center -->
- <value>center</value>
- <!-- Right -->
- <value>right</value>
- </choice>
- </define>
- <define name="CT_XAlign">
- <attribute name="val">
- <ref name="ST_XAlign"/>
- </attribute>
- </define>
- <define name="ST_YAlign">
- <choice>
- <!-- Top -->
- <value>top</value>
- <!-- Center (Function) -->
- <value>center</value>
- <!-- Bottom Alignment -->
- <value>bot</value>
- </choice>
- </define>
- <define name="CT_YAlign">
- <attribute name="val">
- <ref name="ST_YAlign"/>
- </attribute>
- </define>
- <define name="ST_Shp">
- <choice>
- <!-- Centered (Delimiters) -->
- <value>centered</value>
- <!-- Match -->
- <value>match</value>
- </choice>
- </define>
- <define name="CT_Shp">
- <attribute name="val">
- <ref name="ST_Shp"/>
- </attribute>
- </define>
- <define name="ST_FType">
- <choice>
- <!-- Bar Fraction -->
- <value>bar</value>
- <!-- Skewed -->
- <value>skw</value>
- <!-- Linear Fraction -->
- <value>lin</value>
- <!-- No-Bar Fraction (Stack) -->
- <value>noBar</value>
- </choice>
- </define>
- <define name="CT_FType">
- <attribute name="val">
- <ref name="ST_FType"/>
- </attribute>
- </define>
- <define name="ST_LimLoc">
- <choice>
- <!-- Under-Over location -->
- <value>undOvr</value>
- <!-- Subscript-Superscript location -->
- <value>subSup</value>
- </choice>
- </define>
- <define name="CT_LimLoc">
- <attribute name="val">
- <ref name="ST_LimLoc"/>
- </attribute>
- </define>
- <define name="ST_TopBot">
- <choice>
- <!-- Top -->
- <value>top</value>
- <!-- Bottom Alignment -->
- <value>bot</value>
- </choice>
- </define>
- <define name="CT_TopBot">
- <attribute name="val">
- <ref name="ST_TopBot"/>
- </attribute>
- </define>
- <define name="ST_Script">
- <choice>
- <!-- Roman -->
- <value>roman</value>
- <!-- Script -->
- <value>script</value>
- <!-- Fraktur -->
- <value>fraktur</value>
- <!-- double-struck -->
- <value>double-struck</value>
- <!-- Sans-Serif -->
- <value>sans-serif</value>
- <!-- Monospace -->
- <value>monospace</value>
- </choice>
- </define>
- <define name="CT_Script">
- <attribute name="val">
- <ref name="ST_Script"/>
- </attribute>
- </define>
- <define name="ST_Style">
- <choice>
- <!-- Plain -->
- <value>p</value>
- <!-- Bold -->
- <value>b</value>
- <!-- Italic -->
- <value>i</value>
- <!-- Bold-Italic -->
- <value>bi</value>
- </choice>
- </define>
- <define name="CT_Style">
- <attribute name="val">
- <ref name="ST_Style"/>
- </attribute>
- </define>
- <define name="CT_ManualBreak">
- <attribute name="alnAt">
- <ref name="ST_Integer255"/>
- </attribute>
- </define>
- <define name="EG_ScriptStyle">
- <element name="scr">
- <ref name="CT_Script"/>
- </element>
- <element name="sty">
- <ref name="CT_Style"/>
- </element>
- </define>
- <define name="CT_RPR">
- <element name="lit">
- <ref name="CT_OnOff"/>
- </element>
- <choice>
- <element name="nor">
- <ref name="CT_OnOff"/>
- </element>
- <ref name="EG_ScriptStyle"/>
- </choice>
- <element name="brk">
- <ref name="CT_ManualBreak"/>
- </element>
- <element name="aln">
- <ref name="CT_OnOff"/>
- </element>
- </define>
- <define name="CT_Text">
- <ref name="ST_String"/>
- <attribute name="xml:space">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_R">
- <element name="rPr">
- <ref name="CT_RPR"/>
- </element>
- <ref name="EG_RPr"/>
- <choice>
- <ref name="EG_RunInnerContent"/>
- <element name="t">
- <ref name="CT_Text"/>
- </element>
- </choice>
- </define>
- <define name="CT_CtrlPr">
- <ref name="EG_RPrMath"/>
- </define>
- <define name="CT_AccPr">
- <element name="chr">
- <ref name="CT_Char"/>
- </element>
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_Acc">
- <element name="accPr">
- <ref name="CT_AccPr"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_BarPr">
- <element name="pos">
- <ref name="CT_TopBot"/>
- </element>
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_Bar">
- <element name="barPr">
- <ref name="CT_BarPr"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_BoxPr">
- <element name="opEmu">
- <ref name="CT_OnOff"/>
- </element>
- <element name="noBreak">
- <ref name="CT_OnOff"/>
- </element>
- <element name="diff">
- <ref name="CT_OnOff"/>
- </element>
- <element name="brk">
- <ref name="CT_ManualBreak"/>
- </element>
- <element name="aln">
- <ref name="CT_OnOff"/>
- </element>
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_Box">
- <element name="boxPr">
- <ref name="CT_BoxPr"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_BorderBoxPr">
- <element name="hideTop">
- <ref name="CT_OnOff"/>
- </element>
- <element name="hideBot">
- <ref name="CT_OnOff"/>
- </element>
- <element name="hideLeft">
- <ref name="CT_OnOff"/>
- </element>
- <element name="hideRight">
- <ref name="CT_OnOff"/>
- </element>
- <element name="strikeH">
- <ref name="CT_OnOff"/>
- </element>
- <element name="strikeV">
- <ref name="CT_OnOff"/>
- </element>
- <element name="strikeBLTR">
- <ref name="CT_OnOff"/>
- </element>
- <element name="strikeTLBR">
- <ref name="CT_OnOff"/>
- </element>
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_BorderBox">
- <element name="borderBoxPr">
- <ref name="CT_BorderBoxPr"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_DPr">
- <element name="begChr">
- <ref name="CT_Char"/>
- </element>
- <element name="sepChr">
- <ref name="CT_Char"/>
- </element>
- <element name="endChr">
- <ref name="CT_Char"/>
- </element>
- <element name="grow">
- <ref name="CT_OnOff"/>
- </element>
- <element name="shp">
- <ref name="CT_Shp"/>
- </element>
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_D">
- <element name="dPr">
- <ref name="CT_DPr"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_EqArrPr">
- <element name="baseJc">
- <ref name="CT_YAlign"/>
- </element>
- <element name="maxDist">
- <ref name="CT_OnOff"/>
- </element>
- <element name="objDist">
- <ref name="CT_OnOff"/>
- </element>
- <element name="rSpRule">
- <ref name="CT_SpacingRule"/>
- </element>
- <element name="rSp">
- <ref name="CT_UnSignedInteger"/>
- </element>
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_EqArr">
- <element name="eqArrPr">
- <ref name="CT_EqArrPr"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_FPr">
- <element name="type">
- <ref name="CT_FType"/>
- </element>
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_F">
- <element name="fPr">
- <ref name="CT_FPr"/>
- </element>
- <element name="num">
- <ref name="CT_OMathArg"/>
- </element>
- <element name="den">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_FuncPr">
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_Func">
- <element name="funcPr">
- <ref name="CT_FuncPr"/>
- </element>
- <element name="fName">
- <ref name="CT_OMathArg"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_GroupChrPr">
- <element name="chr">
- <ref name="CT_Char"/>
- </element>
- <element name="pos">
- <ref name="CT_TopBot"/>
- </element>
- <element name="vertJc">
- <ref name="CT_TopBot"/>
- </element>
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_GroupChr">
- <element name="groupChrPr">
- <ref name="CT_GroupChrPr"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_LimLowPr">
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_LimLow">
- <element name="limLowPr">
- <ref name="CT_LimLowPr"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- <element name="lim">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_LimUppPr">
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_LimUpp">
- <element name="limUppPr">
- <ref name="CT_LimUppPr"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- <element name="lim">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_MCPr">
- <element name="count">
- <ref name="CT_Integer255"/>
- </element>
- <element name="mcJc">
- <ref name="CT_XAlign"/>
- </element>
- </define>
- <define name="CT_MC">
- <element name="mcPr">
- <ref name="CT_MCPr"/>
- </element>
- </define>
- <define name="CT_MCS">
- <element name="mc">
- <ref name="CT_MC"/>
- </element>
- </define>
- <define name="CT_MPr">
- <element name="baseJc">
- <ref name="CT_YAlign"/>
- </element>
- <element name="plcHide">
- <ref name="CT_OnOff"/>
- </element>
- <element name="rSpRule">
- <ref name="CT_SpacingRule"/>
- </element>
- <element name="cGpRule">
- <ref name="CT_SpacingRule"/>
- </element>
- <element name="rSp">
- <ref name="CT_UnSignedInteger"/>
- </element>
- <element name="cSp">
- <ref name="CT_UnSignedInteger"/>
- </element>
- <element name="cGp">
- <ref name="CT_UnSignedInteger"/>
- </element>
- <element name="mcs">
- <ref name="CT_MCS"/>
- </element>
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_MR">
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_M">
- <element name="mPr">
- <ref name="CT_MPr"/>
- </element>
- <element name="mr">
- <ref name="CT_MR"/>
- </element>
- </define>
- <define name="CT_NaryPr">
- <element name="chr">
- <ref name="CT_Char"/>
- </element>
- <element name="limLoc">
- <ref name="CT_LimLoc"/>
- </element>
- <element name="grow">
- <ref name="CT_OnOff"/>
- </element>
- <element name="subHide">
- <ref name="CT_OnOff"/>
- </element>
- <element name="supHide">
- <ref name="CT_OnOff"/>
- </element>
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_Nary">
- <element name="naryPr">
- <ref name="CT_NaryPr"/>
- </element>
- <element name="sub">
- <ref name="CT_OMathArg"/>
- </element>
- <element name="sup">
- <ref name="CT_OMathArg"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_PhantPr">
- <element name="show">
- <ref name="CT_OnOff"/>
- </element>
- <element name="zeroWid">
- <ref name="CT_OnOff"/>
- </element>
- <element name="zeroAsc">
- <ref name="CT_OnOff"/>
- </element>
- <element name="zeroDesc">
- <ref name="CT_OnOff"/>
- </element>
- <element name="transp">
- <ref name="CT_OnOff"/>
- </element>
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_Phant">
- <element name="phantPr">
- <ref name="CT_PhantPr"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_RadPr">
- <element name="degHide">
- <ref name="CT_OnOff"/>
- </element>
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_Rad">
- <element name="radPr">
- <ref name="CT_RadPr"/>
- </element>
- <element name="deg">
- <ref name="CT_OMathArg"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_SPrePr">
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_SPre">
- <element name="sPrePr">
- <ref name="CT_SPrePr"/>
- </element>
- <element name="sub">
- <ref name="CT_OMathArg"/>
- </element>
- <element name="sup">
- <ref name="CT_OMathArg"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_SSubPr">
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_SSub">
- <element name="sSubPr">
- <ref name="CT_SSubPr"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- <element name="sub">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_SSubSupPr">
- <element name="alnScr">
- <ref name="CT_OnOff"/>
- </element>
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_SSubSup">
- <element name="sSubSupPr">
- <ref name="CT_SSubSupPr"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- <element name="sub">
- <ref name="CT_OMathArg"/>
- </element>
- <element name="sup">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="CT_SSupPr">
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="CT_SSup">
- <element name="sSupPr">
- <ref name="CT_SSupPr"/>
- </element>
- <element name="e">
- <ref name="CT_OMathArg"/>
- </element>
- <element name="sup">
- <ref name="CT_OMathArg"/>
- </element>
- </define>
- <define name="EG_OMathMathElements">
- <choice>
- <element name="acc">
- <ref name="CT_Acc"/>
- </element>
- <element name="bar">
- <ref name="CT_Bar"/>
- </element>
- <element name="box">
- <ref name="CT_Box"/>
- </element>
- <element name="borderBox">
- <ref name="CT_BorderBox"/>
- </element>
- <element name="d">
- <ref name="CT_D"/>
- </element>
- <element name="eqArr">
- <ref name="CT_EqArr"/>
- </element>
- <element name="f">
- <ref name="CT_F"/>
- </element>
- <element name="func">
- <ref name="CT_Func"/>
- </element>
- <element name="groupChr">
- <ref name="CT_GroupChr"/>
- </element>
- <element name="limLow">
- <ref name="CT_LimLow"/>
- </element>
- <element name="limUpp">
- <ref name="CT_LimUpp"/>
- </element>
- <element name="m">
- <ref name="CT_M"/>
- </element>
- <element name="nary">
- <ref name="CT_Nary"/>
- </element>
- <element name="phant">
- <ref name="CT_Phant"/>
- </element>
- <element name="rad">
- <ref name="CT_Rad"/>
- </element>
- <element name="sPre">
- <ref name="CT_SPre"/>
- </element>
- <element name="sSub">
- <ref name="CT_SSub"/>
- </element>
- <element name="sSubSup">
- <ref name="CT_SSubSup"/>
- </element>
- <element name="sSup">
- <ref name="CT_SSup"/>
- </element>
- <element name="r">
- <ref name="CT_R"/>
- </element>
- </choice>
- </define>
- <define name="EG_OMathElements">
- <choice>
- <ref name="EG_OMathMathElements"/>
- <ref name="EG_RunLevelElts"/>
- </choice>
- </define>
- <define name="CT_OMathArgPr">
- <element name="argSz">
- <ref name="CT_Integer2"/>
- </element>
- </define>
- <define name="CT_OMathArg">
- <element name="argPr">
- <ref name="CT_OMathArgPr"/>
- </element>
- <ref name="EG_OMathElements"/>
- <element name="ctrlPr">
- <ref name="CT_CtrlPr"/>
- </element>
- </define>
- <define name="ST_Jc">
- <choice>
- <!-- Align To Leading Edge -->
- <value>start</value>
- <!-- Align To Trailing Edge -->
- <value>end</value>
- <!-- Left Justification (ecma) -->
- <value>left</value>
- <!-- Right (ecma) -->
- <value>right</value>
- <!-- Center (Equation) -->
- <value>center</value>
- <!-- Centered as Group (Equations) -->
- <value>centerGroup</value>
- </choice>
- </define>
- <define name="CT_OMathJc">
- <attribute name="val">
- <ref name="ST_Jc"/>
- </attribute>
- </define>
- <define name="CT_OMathParaPr">
- <element name="jc">
- <ref name="CT_OMathJc"/>
- </element>
- </define>
- <define name="ST_TwipsMeasure">
- <data type="unsignedInt"/>
- </define>
- <define name="CT_TwipsMeasure">
- <attribute name="val">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- </define>
- <define name="ST_BreakBin">
- <choice>
- <!-- Before -->
- <value>before</value>
- <!-- After -->
- <value>after</value>
- <!-- Repeat -->
- <value>repeat</value>
- </choice>
- </define>
- <define name="CT_BreakBin">
- <attribute name="val">
- <ref name="ST_BreakBin"/>
- </attribute>
- </define>
- <define name="ST_BreakBinSub">
- <choice>
- <!-- Minus Minus -->
- <value>--</value>
- <!-- Minus Plus -->
- <value>-+</value>
- <!-- Plus Minus -->
- <value>+-</value>
- </choice>
- </define>
- <define name="CT_BreakBinSub">
- <attribute name="val">
- <ref name="ST_BreakBinSub"/>
- </attribute>
- </define>
- <define name="CT_MathPr">
- <element name="mathFont">
- <ref name="CT_String"/>
- </element>
- <element name="brkBin">
- <ref name="CT_BreakBin"/>
- </element>
- <element name="brkBinSub">
- <ref name="CT_BreakBinSub"/>
- </element>
- <element name="smallFrac">
- <ref name="CT_OnOff"/>
- </element>
- <element name="dispDef">
- <ref name="CT_OnOff"/>
- </element>
- <element name="lMargin">
- <ref name="CT_TwipsMeasure"/>
- </element>
- <element name="rMargin">
- <ref name="CT_TwipsMeasure"/>
- </element>
- <element name="defJc">
- <ref name="CT_OMathJc"/>
- </element>
- <element name="preSp">
- <ref name="CT_TwipsMeasure"/>
- </element>
- <element name="postSp">
- <ref name="CT_TwipsMeasure"/>
- </element>
- <element name="interSp">
- <ref name="CT_TwipsMeasure"/>
- </element>
- <element name="intraSp">
- <ref name="CT_TwipsMeasure"/>
- </element>
- <choice>
- <element name="wrapIndent">
- <ref name="CT_TwipsMeasure"/>
- </element>
- <element name="wrapRight">
- <ref name="CT_OnOff"/>
- </element>
- </choice>
- <element name="intLim">
- <ref name="CT_LimLoc"/>
- </element>
- <element name="naryLim">
- <ref name="CT_LimLoc"/>
- </element>
- </define>
- <define name="mathPr">
- <element name="mathPr">
- <ref name="CT_MathPr"/>
- </element>
- </define>
- <define name="CT_OMathPara">
- <element name="oMathParaPr">
- <ref name="CT_OMathParaPr"/>
- </element>
- <element name="oMath">
- <ref name="CT_OMath"/>
- </element>
- </define>
- <define name="CT_OMath">
- <ref name="EG_OMathElements"/>
- </define>
- <define name="oMathPara">
- <element name="oMathPara">
- <ref name="CT_OMathPara"/>
- </element>
- </define>
- <define name="oMath">
- <element name="oMath">
- <ref name="CT_OMath"/>
- </element>
- </define>
- <define name="oMathParaPr">
- <element name="oMathParaPr">
- <ref name="CT_OMathParaPr"/>
- </element>
- </define>
- </grammar>
- <resource name="ST_Integer255" resource="Integer"/>
- <resource name="CT_Integer255" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Integer255_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="ST_Integer2" resource="Integer"/>
- <resource name="CT_Integer2" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Integer2_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="ST_SpacingRule" resource="Integer"/>
- <resource name="CT_SpacingRule" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_SpacingRule_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="ST_UnSignedInteger" resource="Integer"/>
- <resource name="CT_UnSignedInteger" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_UnSignedInteger_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="ST_Char" resource="String"/>
- <resource name="CT_Char" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Char_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="ST_OnOff" resource="List">
- <value tokenid="ooxml:Value_math_ST_OnOff_on">on</value>
- <value tokenid="ooxml:Value_math_ST_OnOff_off">off</value>
- </resource>
- <resource name="CT_OnOff" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_OnOff_val" action="setValue"/>
- <action name="start" action="setDefaultBooleanValue"/>
- </resource>
- <resource name="ST_String" resource="String"/>
- <resource name="CT_String" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_String_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="ST_XAlign" resource="List">
- <value tokenid="ooxml:Value_math_ST_XAlign_left">left</value>
- <value tokenid="ooxml:Value_math_ST_XAlign_center">center</value>
- <value tokenid="ooxml:Value_math_ST_XAlign_right">right</value>
- </resource>
- <resource name="CT_XAlign" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_XAlign_val" action="setValue"/>
- </resource>
- <resource name="ST_YAlign" resource="List">
- <value tokenid="ooxml:Value_math_ST_YAlign_top">top</value>
- <value tokenid="ooxml:Value_math_ST_YAlign_center">center</value>
- <value tokenid="ooxml:Value_math_ST_YAlign_bot">bot</value>
- </resource>
- <resource name="CT_YAlign" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_YAlign_val" action="setValue"/>
- </resource>
- <resource name="ST_Shp" resource="List">
- <value tokenid="ooxml:Value_math_ST_Shp_centered">centered</value>
- <value tokenid="ooxml:Value_math_ST_Shp_match">match</value>
- </resource>
- <resource name="CT_Shp" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Shp_val" action="setValue"/>
- </resource>
- <resource name="ST_FType" resource="List">
- <value tokenid="ooxml:Value_math_ST_FType_bar">bar</value>
- <value tokenid="ooxml:Value_math_ST_FType_skw">skw</value>
- <value tokenid="ooxml:Value_math_ST_FType_lin">lin</value>
- <value tokenid="ooxml:Value_math_ST_FType_noBar">noBar</value>
- </resource>
- <resource name="CT_FType" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_FType_val" action="setValue"/>
- </resource>
- <resource name="ST_LimLoc" resource="List">
- <value tokenid="ooxml:Value_math_ST_LimLoc_undOvr">undOvr</value>
- <value tokenid="ooxml:Value_math_ST_LimLoc_subSup">subSup</value>
- </resource>
- <resource name="CT_LimLoc" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_LimLoc_val" action="setValue"/>
- </resource>
- <resource name="ST_TopBot" resource="List">
- <value tokenid="ooxml:Value_math_ST_TopBot_top">top</value>
- <value tokenid="ooxml:Value_math_ST_TopBot_bot">bot</value>
- </resource>
- <resource name="CT_TopBot" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_TopBot_val" action="setValue"/>
- </resource>
- <resource name="ST_Script" resource="List">
- <value tokenid="ooxml:Value_math_ST_Script_roman">roman</value>
- <value tokenid="ooxml:Value_math_ST_Script_script">script</value>
- <value tokenid="ooxml:Value_math_ST_Script_fraktur">fraktur</value>
- <value tokenid="ooxml:Value_math_ST_Script_doublemstruck">double-struck</value>
- <value tokenid="ooxml:Value_math_ST_Script_sansmserif">sans-serif</value>
- <value tokenid="ooxml:Value_math_ST_Script_monospace">monospace</value>
- </resource>
- <resource name="CT_Script" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Script_val" action="setValue"/>
- </resource>
- <resource name="ST_Style" resource="List">
- <value tokenid="ooxml:Value_ST_Style_b">b</value>
- <value tokenid="ooxml:Value_ST_Style_bi">bi</value>
- <value tokenid="ooxml:Value_ST_Style_i">i</value>
- <value tokenid="ooxml:Value_ST_Style_p">p</value>
- </resource>
- <resource name="CT_Style" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Style_val" action="setValue"/>
- </resource>
- <resource name="ST_Jc" resource="String">
- <value tokenid="ooxml:Value_math_ST_Jc_start">left</value>
- <value tokenid="ooxml:Value_math_ST_Jc_end">right</value>
- <value tokenid="ooxml:Value_math_ST_Jc_left">left</value>
- <value tokenid="ooxml:Value_math_ST_Jc_right">right</value>
- <value tokenid="ooxml:Value_math_ST_Jc_center">center</value>
- <value tokenid="ooxml:Value_math_ST_Jc_centerGroup">centerGroup</value>
- </resource>
- <resource name="CT_OMathJc" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_OMathJc_val" action="setValue"/>
- </resource>
- <resource name="ST_TwipsMeasure" resource="TwipsMeasure_asSigned"/>
- <resource name="CT_TwipsMeasure" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_TwipsMeasure_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="ST_BreakBin" resource="List">
- <value tokenid="ooxml:Value_math_ST_BreakBin_before">before</value>
- <value tokenid="ooxml:Value_math_ST_BreakBin_after">after</value>
- <value tokenid="ooxml:Value_math_ST_BreakBin_repeat">repeat</value>
- </resource>
- <resource name="CT_BreakBin" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_BreakBin_val" action="setValue"/>
- </resource>
- <resource name="ST_BreakBinSub" resource="List">
- <value tokenid="ooxml:Value_math_ST_BreakBinSub_mm">--</value>
- <value tokenid="ooxml:Value_math_ST_BreakBinSub_mp">-+</value>
- <value tokenid="ooxml:Value_math_ST_BreakBinSub_pm">+-</value>
- </resource>
- <resource name="CT_BreakBinSub" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_BreakBinSub_val" action="setValue"/>
- </resource>
- </namespace>
- <namespace name="shared-relationshipReference">
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
- <!-- ISO RELAX NG Schema -->
- <define name="id">
- <attribute name="id">
- <data type="string"/>
- </attribute>
- </define>
- <define name="embed">
- <attribute name="embed">
- <data type="string"/>
- </attribute>
- </define>
- <define name="link">
- <attribute name="link"/>
- </define>
- <define name="dm">
- <attribute name="dm"/>
- </define>
- <define name="lo">
- <attribute name="lo"/>
- </define>
- <define name="qs">
- <attribute name="qs"/>
- </define>
- <define name="cs">
- <attribute name="cs"/>
- </define>
- <define name="blip">
- <attribute name="blip"/>
- </define>
- <define name="pict">
- <attribute name="pict"/>
- </define>
- <define name="href">
- <attribute name="href">
- <data type="string"/>
- </attribute>
- </define>
- </grammar>
- </namespace>
- <namespace name="dml-chartDrawing">
- <start name="pic"/>
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/drawingml/2006/picture">
- <include href="dml-shapeProperties"/>
- <include href="dml-documentProperties"/>
- <!-- start = pic -->
- <define name="CT_PictureNonVisual">
- <element name="cNvPr">
- <ref name="CT_NonVisualDrawingProps"/>
- </element>
- <element name="cNvPicPr">
- <ref name="CT_NonVisualPictureProperties"/>
- </element>
- </define>
- <define name="CT_Picture">
- <element name="nvPicPr">
- <ref name="CT_PictureNonVisual"/>
- </element>
- <element name="blipFill">
- <ref name="CT_BlipFillProperties"/>
- </element>
- <element name="spPr">
- <ref name="CT_ShapeProperties"/>
- </element>
- </define>
- <define name="pic">
- <element name="pic">
- <ref name="CT_Picture"/>
- </element>
- </define>
- <define name="CT_RelIds">
- <attribute name="r:dm">
- <data type="string"/>
- </attribute>
- <attribute name="r:lo">
- <data type="string"/>
- </attribute>
- <attribute name="r:qs">
- <data type="string"/>
- </attribute>
- <attribute name="r:cs">
- <data type="string"/>
- </attribute>
- </define>
- <define name="relIds">
- <element name="dgm:relIds">
- <ref name="CT_RelIds"/>
- </element>
- </define>
- <define name="CT_GvmlGroupShape">
- <element name="nvGrpSpPr">
- <ref name="CT_NonVisualGroupDrawingShapeProps"/>
- </element>
- <element name="grpSpPr">
- <ref name="CT_GroupShapeProperties"/>
- </element>
- </define>
- <define name="lockedCanvas">
- <element name="lc:lockedCanvas">
- <ref name="CT_GvmlGroupShape"/>
- </element>
- </define>
- <define name="CT_Chart">
- <attribute name="r:id">
- <data type="string"/>
- </attribute>
- </define>
- <define name="chart">
- <element name="c:chart">
- <ref name="CT_Chart"/>
- </element>
- </define>
- <define name="CT_WordprocessingShape">
- <element name="cNvSpPr">
- <ref name="CT_NonVisualDrawingShapeProps"/>
- </element>
- <element name="spPr">
- <ref name="CT_ShapeProperties"/>
- </element>
- </define>
- <define name="wsp">
- <element name="wps:wsp">
- <ref name="CT_WordprocessingShape"/>
- </element>
- </define>
- <define name="CT_WordprocessingGroup">
- <element name="cNvGrpSpPr">
- <ref name="CT_NonVisualGroupDrawingShapeProps"/>
- </element>
- <element name="grpSpPr">
- <ref name="CT_WordprocessingGroup"/>
- </element>
- </define>
- <define name="wgp">
- <element name="wpg:wgp">
- <ref name="CT_WordprocessingGroup"/>
- </element>
- </define>
- <define name="CT_BackgroundFormatting">
- <ref name="EG_FillProperties"/>
- <ref name="EG_EffectProperties"/>
- </define>
- <define name="CT_WholeE2oFormatting">
- <element name="ln">
- <ref name="CT_LineProperties"/>
- </element>
- <ref name="EG_EffectProperties"/>
- </define>
- <define name="CT_WordprocessingCanvas">
- <element name="wpc:bg">
- <ref name="CT_BackgroundFormatting"/>
- </element>
- <element name="wpc:whole">
- <ref name="CT_WholeE2oFormatting"/>
- </element>
- <choice>
- <ref name="wsp"/>
- <ref name="pic"/>
- <!-- ToDo w14:contentPart missing -->
- <ref name="wgp"/>
- <!-- ToDo graphicFrame missing -->
- </choice>
- <!-- ToDo extLst missing -->
- </define>
- <define name="wpc">
- <element name="wpc:wpc">
- <ref name="CT_WordprocessingCanvas"/>
- </element>
- </define>
- </grammar>
- <resource name="CT_PictureNonVisual" resource="Properties">
- <element name="cNvPr" tokenid="ooxml:CT_PictureNonVisual_cNvPr"/>
- <element name="cNvPicPr" tokenid="ooxml:CT_PictureNonVisual_cNvPicPr"/>
- </resource>
- <resource name="CT_Picture" resource="Shape">
- <element name="nvPicPr" tokenid="ooxml:CT_Picture_nvPicPr"/>
- <element name="blipFill" tokenid="ooxml:CT_Picture_blipFill"/>
- <element name="spPr" tokenid="ooxml:CT_Picture_spPr"/>
- </resource>
- <resource name="pic" resource="Properties">
- <element name="pic" tokenid="ooxml:pic_pic"/>
- </resource>
- <resource name="CT_RelIds" resource="Shape">
- <attribute name="r:dm" tokenid="ooxml:CT_RelIds_dm"/>
- <attribute name="r:lo" tokenid="ooxml:CT_RelIds_lo"/>
- <attribute name="r:qs" tokenid="ooxml:CT_RelIds_qs"/>
- <attribute name="r:cs" tokenid="ooxml:CT_RelIds_cs"/>
- </resource>
- <resource name="relIds" resource="Shape">
- <element name="dgm:relIds" tokenid="ooxml:dgm_relIds"/>
- </resource>
- <resource name="CT_GvmlGroupShape" resource="Shape">
- <element name="a:nvGrpSpPr" tokenid="ooxml:CT_GvmlGroupShape_nvGrpSpPr"/>
- <element name="a:grpSpPr" tokenid="ooxml:CT_GvmlGroupShape_grpSpPr"/>
- </resource>
- <resource name="lockedCanvas" resource="Shape">
- <element name="lc:lockedCanvas" tokenid="ooxml:lc_lockedCanvas"/>
- </resource>
- <resource name="CT_Chart" resource="Shape">
- <attribute name="r:id" tokenid="ooxml:CT_RelId_chart"/>
- </resource>
- <resource name="chart" resource="Shape">
- <element name="c:chart" tokenid="ooxml:c_chart"/>
- </resource>
- <resource name="CT_WordprocessingShape" resource="Shape">
- <element name="wps:cNvSpPr" tokenid="ooxml:CT_WordprocessingShape_cNvSpPr"/>
- <element name="wps:spPr" tokenid="ooxml:CT_WordprocessingShape_spPr"/>
- </resource>
- <resource name="wsp" resource="Shape">
- <element name="wps:wsp" tokenid="ooxml:wps_wsp"/>
- </resource>
- <resource name="CT_WordprocessingGroup" resource="Shape">
- <element name="wpg:cNvGrpSpPr" tokenid="ooxml:CT_WordprocessingGroup_cNvGrpSpPr"/>
- <element name="wpg:grpSpPr" tokenid="ooxml:CT_WordprocessingGroup_grpSpPr"/>
- </resource>
- <resource name="wgp" resource="Shape">
- <element name="wpg:wgp" tokenid="ooxml:wpg_wgp"/>
- </resource>
- <resource name="CT_WholeE2oFormatting" resource="Properties">
- <element name="a:ln" tokenid="ooxml:CT_WholeE2oFormatting_ln"/>
- </resource>
- <resource name="CT_WordprocessingCanvas" resource="Shape">
- <element name="wpc:bg" tokenid="ooxml:CT_WordprocessingCanvas_bg"/>
- <element name="wpc:whole" tokenid="ooxml:CT_WordprocessingCanvas_whole"/>
- <element name="wps:wsp" tokenid="ooxml:CT_WordprocessingCanvas_wsp"/>
- <element name="pic" tokenid="ooxml:CT_WordprocessingCanvas_pic"/>
- <element name="wpg:wgp" tokenid="ooxml:CT_WordprocessingCanvas_wgp"/>
- </resource>
- <resource name="wpc" resource="Shape">
- <element name="wpc:wpc" tokenid="ooxml:wpc_wpc"/>
- </resource>
-
- </namespace>
- <namespace name="vml-main">
- <start name="shape"/>
- <start name="shapetype"/>
- <start name="group"/>
- <start name="background"/>
- <start name="fill"/>
- <start name="formulas"/>
- <start name="handles"/>
- <start name="imagedata"/>
- <start name="path"/>
- <start name="textbox"/>
- <start name="shadow"/>
- <start name="stroke"/>
- <start name="textpath"/>
- <start name="arc"/>
- <start name="curve"/>
- <start name="image"/>
- <start name="line"/>
- <start name="oval"/>
- <start name="polyline"/>
- <start name="rect"/>
- <start name="roundrect"/>
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="urn:schemas-microsoft-com:vml">
- <include href="vml-officeDrawing"/>
- <include href="vml-wordprocessingDrawing"/>
- <!-- start = shape | shapetype | group | background | fill | formulas | handles | imagedata | path | textbox | shadow | stroke | textpath | arc | curve | image | line | oval | polyline | rect | roundrect -->
- <define name="AG_Id">
- <attribute name="id">
- <data type="string"/>
- </attribute>
- </define>
- <define name="AG_Style">
- <attribute name="style">
- <data type="string"/>
- </attribute>
- </define>
- <define name="AG_Type">
- <attribute name="type">
- <data type="string"/>
- </attribute>
- </define>
- <define name="AG_Adj">
- <attribute name="adj">
- <data type="string"/>
- </attribute>
- </define>
- <define name="AG_Path">
- <attribute name="path">
- <data type="string"/>
- </attribute>
- </define>
- <define name="AG_Fill">
- <attribute name="filled">
- <data type="string"/>
- </attribute>
- <attribute name="fillcolor">
- <data type="string"/>
- </attribute>
- </define>
- <define name="AG_Chromakey">
- <attribute name="chromakey">
- <data type="string"/>
- </attribute>
- </define>
- <define name="AG_Ext">
- <attribute name="ext">
- <data type="string"/>
- </attribute>
- </define>
- <define name="AG_CoreAttributes">
- <ref name="AG_Id"/>
- <ref name="AG_Style"/>
- <attribute name="href">
- <data type="string"/>
- </attribute>
- <attribute name="target">
- <data type="string"/>
- </attribute>
- <attribute name="class">
- <data type="string"/>
- </attribute>
- <attribute name="title">
- <data type="string"/>
- </attribute>
- <attribute name="alt">
- <data type="string"/>
- </attribute>
- <attribute name="coordsize">
- <data type="string"/>
- </attribute>
- <attribute name="coordorigin">
- <data type="string"/>
- </attribute>
- <attribute name="wrapcoords">
- <data type="string"/>
- </attribute>
- <attribute name="print">
- <data type="string"/>
- </attribute>
- </define>
- <define name="AG_ShapeAttributes">
- <ref name="AG_Chromakey"/>
- <ref name="AG_Fill"/>
- <attribute name="opacity">
- <data type="string"/>
- </attribute>
- <attribute name="stroked">
- <data type="string"/>
- </attribute>
- <attribute name="strokecolor">
- <data type="string"/>
- </attribute>
- <attribute name="strokeweight">
- <data type="string"/>
- </attribute>
- <attribute name="insetpen">
- <data type="string"/>
- </attribute>
- </define>
- <define name="AG_OfficeCoreAttributes">
- <attribute name="o:spid"/>
- <attribute name="o:oned"/>
- <attribute name="o:regroupid"/>
- <attribute name="o:doubleclicknotify"/>
- <attribute name="o:button"/>
- <attribute name="o:userhidden"/>
- <attribute name="o:bullet"/>
- <attribute name="o:hr"/>
- <attribute name="o:hrstd"/>
- <attribute name="o:hrnoshade"/>
- <attribute name="o:hrpct"/>
- <attribute name="o:hralign"/>
- <attribute name="o:allowincell"/>
- <attribute name="o:allowoverlap"/>
- <attribute name="o:userdrawn"/>
- <attribute name="o:bordertopcolor"/>
- <attribute name="o:borderleftcolor"/>
- <attribute name="o:borderbottomcolor"/>
- <attribute name="o:borderrightcolor"/>
- <attribute name="o:dgmlayout"/>
- <attribute name="o:dgmnodekind"/>
- <attribute name="o:dgmlayoutmru"/>
- <attribute name="o:insetmode"/>
- </define>
- <define name="AG_OfficeShapeAttributes">
- <attribute name="o:spt"/>
- <attribute name="o:connectortype"/>
- <attribute name="o:bwmode"/>
- <attribute name="o:bwpure"/>
- <attribute name="o:bwnormal"/>
- <attribute name="o:forcedash"/>
- <attribute name="o:oleicon"/>
- <attribute name="o:ole"/>
- <attribute name="o:preferrelative"/>
- <attribute name="o:cliptowrap"/>
- <attribute name="o:clip"/>
- </define>
- <define name="AG_AllCoreAttributes">
- <ref name="AG_CoreAttributes"/>
- <ref name="AG_OfficeCoreAttributes"/>
- </define>
- <define name="AG_AllShapeAttributes">
- <ref name="AG_ShapeAttributes"/>
- <ref name="AG_OfficeShapeAttributes"/>
- </define>
- <define name="AG_ImageAttributes">
- <attribute name="src">
- <data type="string"/>
- </attribute>
- <attribute name="cropleft">
- <data type="string"/>
- </attribute>
- <attribute name="croptop">
- <data type="string"/>
- </attribute>
- <attribute name="cropright">
- <data type="string"/>
- </attribute>
- <attribute name="cropbottom">
- <data type="string"/>
- </attribute>
- <attribute name="gain">
- <data type="string"/>
- </attribute>
- <attribute name="blacklevel">
- <data type="string"/>
- </attribute>
- <attribute name="gamma">
- <data type="string"/>
- </attribute>
- <attribute name="grayscale">
- <data type="string"/>
- </attribute>
- <attribute name="bilevel">
- <data type="string"/>
- </attribute>
- </define>
- <define name="AG_StrokeAttributes">
- <attribute name="on">
- <data type="string"/>
- </attribute>
- <attribute name="weight">
- <data type="string"/>
- </attribute>
- <attribute name="color">
- <data type="string"/>
- </attribute>
- <attribute name="opacity">
- <data type="string"/>
- </attribute>
- <attribute name="linestyle">
- <data type="string"/>
- </attribute>
- <attribute name="miterlimit">
- <data type="decimal"/>
- </attribute>
- <attribute name="joinstyle">
- <data type="string"/>
- </attribute>
- <attribute name="endcap">
- <data type="string"/>
- </attribute>
- <attribute name="dashstyle">
- <data type="string"/>
- </attribute>
- <attribute name="filltype">
- <data type="string"/>
- </attribute>
- <attribute name="src">
- <data type="string"/>
- </attribute>
- <attribute name="imageaspect">
- <data type="string"/>
- </attribute>
- <attribute name="imagesize">
- <data type="string"/>
- </attribute>
- <attribute name="imagealignshape">
- <data type="string"/>
- </attribute>
- <attribute name="color2">
- <data type="string"/>
- </attribute>
- <attribute name="startarrow">
- <data type="string"/>
- </attribute>
- <attribute name="startarrowwidth">
- <data type="string"/>
- </attribute>
- <attribute name="startarrowlength">
- <data type="string"/>
- </attribute>
- <attribute name="endarrow">
- <data type="string"/>
- </attribute>
- <attribute name="endarrowwidth">
- <data type="string"/>
- </attribute>
- <attribute name="endarrowlength">
- <data type="string"/>
- </attribute>
- <attribute name="o:href"/>
- <attribute name="o:althref"/>
- <attribute name="o:title"/>
- <attribute name="o:forcedash"/>
- <attribute name="r:id"/>
- <attribute name="insetpen">
- <data type="string"/>
- </attribute>
- <attribute name="o:relid"/>
- </define>
- <define name="EG_ShapeElements">
- <choice>
- <ref name="path"/>
- <ref name="formulas"/>
- <ref name="handles"/>
- <ref name="fill"/>
- <ref name="stroke"/>
- <ref name="shadow"/>
- <ref name="textbox"/>
- <ref name="textpath"/>
- <ref name="imagedata"/>
- <element name="o:skew">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="o:extrusion">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="o:callout">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="o:lock">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="o:clippath">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="o:signatureline">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="wvml:wrap">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="wvml:anchorlock">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="wvml:bordertop">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="wvml:borderbottom">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="wvml:borderleft">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="wvml:borderright">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="x:ClientData">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="p:textdata">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- </choice>
- </define>
- <define name="shape">
- <element name="shape">
- <ref name="CT_Shape"/>
- </element>
- </define>
- <define name="shapetype">
- <element name="shapetype">
- <ref name="CT_Shapetype"/>
- </element>
- </define>
- <define name="group">
- <element name="group">
- <ref name="CT_Group"/>
- </element>
- </define>
- <define name="background">
- <element name="background">
- <ref name="CT_Background"/>
- </element>
- </define>
- <define name="CT_Shape">
- <choice>
- <ref name="EG_ShapeElements"/>
- <element name="o:ink">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="p:iscomment">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- </choice>
- <ref name="AG_AllCoreAttributes"/>
- <ref name="AG_AllShapeAttributes"/>
- <ref name="AG_Type"/>
- <ref name="AG_Adj"/>
- <ref name="AG_Path"/>
- <attribute name="o:gfxdata"/>
- <attribute name="equationxml">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Shapetype">
- <ref name="EG_ShapeElements"/>
- <element name="o:complex">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <ref name="AG_AllCoreAttributes"/>
- <ref name="AG_AllShapeAttributes"/>
- <ref name="AG_Adj"/>
- <ref name="AG_Path"/>
- <attribute name="o:master"/>
- </define>
- <define name="CT_Group">
- <choice>
- <ref name="EG_ShapeElements"/>
- <ref name="group"/>
- <ref name="shape"/>
- <ref name="shapetype"/>
- <ref name="arc"/>
- <ref name="curve"/>
- <ref name="image"/>
- <ref name="line"/>
- <ref name="oval"/>
- <ref name="polyline"/>
- <ref name="rect"/>
- <ref name="roundrect"/>
- <element name="o:diagram">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- </choice>
- <ref name="AG_AllCoreAttributes"/>
- <ref name="AG_Fill"/>
- <attribute name="editas">
- <data type="string"/>
- </attribute>
- <attribute name="o:tableproperties"/>
- <attribute name="o:tablelimits"/>
- </define>
- <define name="CT_Background">
- <ref name="fill"/>
- <ref name="AG_Id"/>
- <ref name="AG_Fill"/>
- <attribute name="o:bwmode"/>
- <attribute name="o:bwpure"/>
- <attribute name="o:bwnormal"/>
- <attribute name="o:targetscreensize"/>
- </define>
- <define name="fill">
- <element name="fill">
- <ref name="CT_Fill"/>
- </element>
- </define>
- <define name="formulas">
- <element name="formulas">
- <ref name="CT_Formulas"/>
- </element>
- </define>
- <define name="handles">
- <element name="handles">
- <ref name="CT_Handles"/>
- </element>
- </define>
- <define name="imagedata">
- <element name="imagedata">
- <ref name="CT_ImageData"/>
- </element>
- </define>
- <define name="path">
- <element name="path">
- <ref name="CT_Path"/>
- </element>
- </define>
- <define name="textbox">
- <element name="textbox">
- <ref name="CT_Textbox"/>
- </element>
- </define>
- <define name="shadow">
- <element name="shadow">
- <ref name="CT_Shadow"/>
- </element>
- </define>
- <define name="stroke">
- <element name="stroke">
- <ref name="CT_Stroke"/>
- </element>
- </define>
- <define name="textpath">
- <element name="textpath">
- <ref name="CT_TextPath"/>
- </element>
- </define>
- <define name="CT_Fill">
- <element name="o:fill">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <ref name="AG_Id"/>
- <attribute name="type">
- <data type="string"/>
- </attribute>
- <attribute name="on">
- <data type="string"/>
- </attribute>
- <attribute name="color">
- <data type="string"/>
- </attribute>
- <attribute name="opacity">
- <data type="string"/>
- </attribute>
- <attribute name="color2">
- <data type="string"/>
- </attribute>
- <attribute name="src">
- <data type="string"/>
- </attribute>
- <attribute name="o:href"/>
- <attribute name="o:althref"/>
- <attribute name="size">
- <data type="string"/>
- </attribute>
- <attribute name="origin">
- <data type="string"/>
- </attribute>
- <attribute name="position">
- <data type="string"/>
- </attribute>
- <attribute name="aspect">
- <data type="string"/>
- </attribute>
- <attribute name="colors">
- <data type="string"/>
- </attribute>
- <attribute name="angle">
- <data type="decimal"/>
- </attribute>
- <attribute name="alignshape">
- <data type="string"/>
- </attribute>
- <attribute name="focus">
- <data type="string"/>
- </attribute>
- <attribute name="focussize">
- <data type="string"/>
- </attribute>
- <attribute name="focusposition">
- <data type="string"/>
- </attribute>
- <attribute name="method">
- <data type="string"/>
- </attribute>
- <attribute name="o:detectmouseclick"/>
- <attribute name="o:title"/>
- <attribute name="o:opacity2"/>
- <attribute name="recolor">
- <data type="string"/>
- </attribute>
- <attribute name="rotate">
- <data type="string"/>
- </attribute>
- <attribute name="r:id"/>
- <attribute name="o:relid"/>
- </define>
- <define name="CT_Formulas">
- <element name="f">
- <ref name="CT_F"/>
- </element>
- </define>
- <define name="CT_F">
- <attribute name="eqn">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Handles">
- <element name="h">
- <ref name="CT_H"/>
- </element>
- </define>
- <define name="CT_H">
- <attribute name="position">
- <data type="string"/>
- </attribute>
- <attribute name="polar">
- <data type="string"/>
- </attribute>
- <attribute name="map">
- <data type="string"/>
- </attribute>
- <attribute name="invx">
- <data type="string"/>
- </attribute>
- <attribute name="invy">
- <data type="string"/>
- </attribute>
- <attribute name="switch">
- <data type="string"/>
- </attribute>
- <attribute name="xrange">
- <data type="string"/>
- </attribute>
- <attribute name="yrange">
- <data type="string"/>
- </attribute>
- <attribute name="radiusrange">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_ImageData">
- <ref name="AG_Id"/>
- <ref name="AG_ImageAttributes"/>
- <ref name="AG_Chromakey"/>
- <attribute name="embosscolor">
- <data type="string"/>
- </attribute>
- <attribute name="recolortarget">
- <data type="string"/>
- </attribute>
- <attribute name="o:href"/>
- <attribute name="o:althref"/>
- <attribute name="o:title"/>
- <attribute name="o:oleid"/>
- <attribute name="o:detectmouseclick"/>
- <attribute name="o:movie"/>
- <attribute name="o:relid"/>
- <attribute name="r:id"/>
- <attribute name="r:pict"/>
- <attribute name="r:href"/>
- </define>
- <define name="CT_Path">
- <ref name="AG_Id"/>
- <attribute name="v">
- <data type="string"/>
- </attribute>
- <attribute name="limo">
- <data type="string"/>
- </attribute>
- <attribute name="textboxrect">
- <data type="string"/>
- </attribute>
- <attribute name="fillok">
- <data type="string"/>
- </attribute>
- <attribute name="strokeok">
- <data type="string"/>
- </attribute>
- <attribute name="shadowok">
- <data type="string"/>
- </attribute>
- <attribute name="arrowok">
- <data type="string"/>
- </attribute>
- <attribute name="gradientshapeok">
- <data type="string"/>
- </attribute>
- <attribute name="textpathok">
- <data type="string"/>
- </attribute>
- <attribute name="insetpenok">
- <data type="string"/>
- </attribute>
- <attribute name="o:connecttype"/>
- <attribute name="o:connectlocs"/>
- <attribute name="o:connectangles"/>
- <attribute name="o:extrusionok"/>
- </define>
- <define name="CT_Shadow">
- <ref name="AG_Id"/>
- <attribute name="on">
- <data type="string"/>
- </attribute>
- <attribute name="type">
- <data type="string"/>
- </attribute>
- <attribute name="obscured">
- <data type="string"/>
- </attribute>
- <attribute name="color">
- <data type="string"/>
- </attribute>
- <attribute name="opacity">
- <data type="string"/>
- </attribute>
- <attribute name="offset">
- <data type="string"/>
- </attribute>
- <attribute name="color2">
- <data type="string"/>
- </attribute>
- <attribute name="offset2">
- <data type="string"/>
- </attribute>
- <attribute name="origin">
- <data type="string"/>
- </attribute>
- <attribute name="matrix">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Stroke">
- <element name="o:left">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="o:top">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="o:right">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="o:bottom">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="o:column">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <ref name="AG_Id"/>
- <ref name="AG_StrokeAttributes"/>
- </define>
- <define name="CT_Textbox">
- <choice>
- <element name="w:txbxContent">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element>
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- </choice>
- <ref name="AG_Id"/>
- <ref name="AG_Style"/>
- <attribute name="inset">
- <data type="string"/>
- </attribute>
- <attribute name="o:singleclick"/>
- <attribute name="o:insetmode"/>
- </define>
- <define name="CT_TextPath">
- <ref name="AG_Id"/>
- <ref name="AG_Style"/>
- <attribute name="on">
- <data type="string"/>
- </attribute>
- <attribute name="fitshape">
- <data type="string"/>
- </attribute>
- <attribute name="fitpath">
- <data type="string"/>
- </attribute>
- <attribute name="trim">
- <data type="string"/>
- </attribute>
- <attribute name="xscale">
- <data type="string"/>
- </attribute>
- <attribute name="string">
- <data type="string"/>
- </attribute>
- </define>
- <define name="arc">
- <element name="arc">
- <ref name="CT_Arc"/>
- </element>
- </define>
- <define name="curve">
- <element name="curve">
- <ref name="CT_Curve"/>
- </element>
- </define>
- <define name="image">
- <element name="image">
- <ref name="CT_Image"/>
- </element>
- </define>
- <define name="line">
- <element name="line">
- <ref name="CT_Line"/>
- </element>
- </define>
- <define name="oval">
- <element name="oval">
- <ref name="CT_Oval"/>
- </element>
- </define>
- <define name="polyline">
- <element name="polyline">
- <ref name="CT_PolyLine"/>
- </element>
- </define>
- <define name="rect">
- <element name="rect">
- <ref name="CT_Rect"/>
- </element>
- </define>
- <define name="roundrect">
- <element name="roundrect">
- <ref name="CT_RoundRect"/>
- </element>
- </define>
- <define name="CT_Arc">
- <ref name="EG_ShapeElements"/>
- <ref name="AG_AllCoreAttributes"/>
- <ref name="AG_AllShapeAttributes"/>
- <attribute name="startAngle">
- <data type="decimal"/>
- </attribute>
- <attribute name="endAngle">
- <data type="decimal"/>
- </attribute>
- </define>
- <define name="CT_Curve">
- <ref name="EG_ShapeElements"/>
- <ref name="AG_AllCoreAttributes"/>
- <ref name="AG_AllShapeAttributes"/>
- <attribute name="from">
- <data type="string"/>
- </attribute>
- <attribute name="control1">
- <data type="string"/>
- </attribute>
- <attribute name="control2">
- <data type="string"/>
- </attribute>
- <attribute name="to">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Image">
- <ref name="EG_ShapeElements"/>
- <ref name="AG_AllCoreAttributes"/>
- <ref name="AG_AllShapeAttributes"/>
- <ref name="AG_ImageAttributes"/>
- </define>
- <define name="CT_Line">
- <ref name="EG_ShapeElements"/>
- <ref name="AG_AllCoreAttributes"/>
- <ref name="AG_AllShapeAttributes"/>
- <attribute name="from">
- <data type="string"/>
- </attribute>
- <attribute name="to">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Oval">
- <ref name="EG_ShapeElements"/>
- <ref name="AG_AllCoreAttributes"/>
- <ref name="AG_AllShapeAttributes"/>
- </define>
- <define name="CT_PolyLine">
- <choice>
- <ref name="EG_ShapeElements"/>
- <element name="o:ink">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- </choice>
- <ref name="AG_AllCoreAttributes"/>
- <ref name="AG_AllShapeAttributes"/>
- <attribute name="points">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Rect">
- <ref name="EG_ShapeElements"/>
- <ref name="AG_AllCoreAttributes"/>
- <ref name="AG_AllShapeAttributes"/>
- </define>
- <define name="CT_RoundRect">
- <ref name="EG_ShapeElements"/>
- <ref name="AG_AllCoreAttributes"/>
- <ref name="AG_AllShapeAttributes"/>
- <attribute name="arcsize">
- <data type="string"/>
- </attribute>
- </define>
- <define name="ST_FillType">
- <choice>
- <!-- Solid Fill -->
- <value>solid</value>
- <!-- Linear Gradient -->
- <value>gradient</value>
- <!-- Radial Gradient -->
- <value>gradientRadial</value>
- <!-- Tiled Image -->
- <value>tile</value>
- <!-- Image Pattern -->
- <value>pattern</value>
- <!-- Stretch Image to Fit -->
- <value>frame</value>
- </choice>
- </define>
- <define name="ST_StrokeLineStyle">
- <choice>
- <!-- Single Line -->
- <value>single</value>
- <!-- Two Thin Lines -->
- <value>thinThin</value>
- <!-- Thin Line Outside Thick Line -->
- <value>thinThick</value>
- <!-- Thick Line Outside Thin Line -->
- <value>thickThin</value>
- <!-- Thick Line Between Thin Lines -->
- <value>thickBetweenThin</value>
- </choice>
- </define>
- <define name="ST_StrokeJoinStyle">
- <choice>
- <!-- Round Joint -->
- <value>round</value>
- <!-- Bevel Joint -->
- <value>bevel</value>
- <!-- Miter Joint -->
- <value>miter</value>
- </choice>
- </define>
- <define name="ST_StrokeEndCap">
- <choice>
- <!-- Flat End -->
- <value>flat</value>
- <!-- Square End -->
- <value>square</value>
- <!-- Round End -->
- <value>round</value>
- </choice>
- </define>
- <define name="ST_StrokeArrowLength">
- <choice>
- <!-- Short Arrowhead -->
- <value>short</value>
- <!-- Medium Arrowhead -->
- <value>medium</value>
- <!-- Long Arrowhead -->
- <value>long</value>
- </choice>
- </define>
- <define name="ST_StrokeArrowWidth">
- <choice>
- <!-- Narrow Arrowhead -->
- <value>narrow</value>
- <!-- Medium Arrowhead -->
- <value>medium</value>
- <!-- Wide Arrowhead -->
- <value>wide</value>
- </choice>
- </define>
- <define name="ST_StrokeArrowType">
- <choice>
- <!-- No Arrowhead -->
- <value>none</value>
- <!-- Block Arrowhead -->
- <value>block</value>
- <!-- Classic Arrowhead -->
- <value>classic</value>
- <!-- Oval Arrowhead -->
- <value>oval</value>
- <!-- Diamond Arrowhead -->
- <value>diamond</value>
- <!-- Open Arrowhead -->
- <value>open</value>
- </choice>
- </define>
- <define name="ST_ImageAspect">
- <choice>
- <!-- Ignore Aspect Ratio -->
- <value>ignore</value>
- <!-- At Most -->
- <value>atMost</value>
- <!-- At Least -->
- <value>atLeast</value>
- </choice>
- </define>
- <define name="ST_TrueFalseBlank">
- <choice>
- <!-- Logical True -->
- <value>t</value>
- <!-- Logical False -->
- <value>f</value>
- <!-- Logical True -->
- <value>true</value>
- <!-- Logical False -->
- <value>false</value>
- <!-- Blank - Logical False -->
- <value/>
- </choice>
- </define>
- <define name="BUILT_IN_ANY_TYPE">
- <choice>
- <element>
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <data type="string"/>
- </choice>
- </define>
- </grammar>
- <resource name="ST_FillType" resource="List">
- <value tokenid="ooxml:Value_vml_ST_FillType_solid">solid</value>
- <value tokenid="ooxml:Value_vml_ST_FillType_gradient">gradient</value>
- <value tokenid="ooxml:Value_vml_ST_FillType_gradientRadial">gradientRadial</value>
- <value tokenid="ooxml:Value_vml_ST_FillType_tile">tile</value>
- <value tokenid="ooxml:Value_vml_ST_FillType_pattern">pattern</value>
- <value tokenid="ooxml:Value_vml_ST_FillType_frame">frame</value>
- </resource>
- <resource name="ST_StrokeLineStyle" resource="List">
- <value tokenid="ooxml:Value_vml_ST_StrokeLineStyle_single">single</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeLineStyle_thinThin">thinThin</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeLineStyle_thinThick">thinThick</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeLineStyle_thickThin">thickThin</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeLineStyle_thickBetweenThin">thickBetweenThin</value>
- </resource>
- <resource name="ST_StrokeJoinStyle" resource="List">
- <value tokenid="ooxml:Value_vml_ST_StrokeJoinStyle_round">round</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeJoinStyle_bevel">bevel</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeJoinStyle_miter">miter</value>
- </resource>
- <resource name="ST_StrokeEndCap" resource="List">
- <value tokenid="ooxml:Value_vml_ST_StrokeEndCap_flat">flat</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeEndCap_square">square</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeEndCap_round">round</value>
- </resource>
- <resource name="ST_StrokeArrowLength" resource="List">
- <value tokenid="ooxml:Value_vml_ST_StrokeArrowLength_short">short</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeArrowLength_medium">medium</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeArrowLength_long">long</value>
- </resource>
- <resource name="ST_StrokeArrowWidth" resource="List">
- <value tokenid="ooxml:Value_vml_ST_StrokeArrowWidth_narrow">narrow</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeArrowWidth_medium">medium</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeArrowWidth_wide">wide</value>
- </resource>
- <resource name="ST_StrokeArrowType" resource="List">
- <value tokenid="ooxml:Value_vml_ST_StrokeArrowType_none">none</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeArrowType_block">block</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeArrowType_classic">classic</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeArrowType_oval">oval</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeArrowType_diamond">diamond</value>
- <value tokenid="ooxml:Value_vml_ST_StrokeArrowType_open">open</value>
- </resource>
- <resource name="ST_ImageAspect" resource="List">
- <value tokenid="ooxml:Value_vml_ST_ImageAspect_ignore">ignore</value>
- <value tokenid="ooxml:Value_vml_ST_ImageAspect_atMost">atMost</value>
- <value tokenid="ooxml:Value_vml_ST_ImageAspect_atLeast">atLeast</value>
- </resource>
- <resource name="ST_TrueFalseBlank" resource="List">
- <value tokenid="ooxml:Value_vml_ST_TrueFalseBlank_t">t</value>
- <value tokenid="ooxml:Value_vml_ST_TrueFalseBlank_f">f</value>
- <value tokenid="ooxml:Value_vml_ST_TrueFalseBlank_true">true</value>
- <value tokenid="ooxml:Value_vml_ST_TrueFalseBlank_false">false</value>
- <value tokenid="ooxml:Value_vml_ST_TrueFalseBlank_"/>
- </resource>
- <resource name="CT_Background" resource="Properties">
- <attribute name="id" tokenid="ooxml:CT_Background_id"/>
- </resource>
- <resource name="background" resource="Properties">
- <element name="background" tokenid="ooxml:background_background"/>
- </resource>
- </namespace>
- <namespace name="vml-officeDrawing">
- <start name="shapedefaults"/>
- <start name="shapelayout"/>
- <start name="signatureline"/>
- <start name="ink"/>
- <start name="diagram"/>
- <start name="skew"/>
- <start name="extrusion"/>
- <start name="callout"/>
- <start name="lock"/>
- <start name="OLEObject"/>
- <start name="complex"/>
- <start name="left"/>
- <start name="top"/>
- <start name="right"/>
- <start name="bottom"/>
- <start name="column"/>
- <start name="clippath"/>
- <start name="fill"/>
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="urn:schemas-microsoft-com:office:office" >
- <include href="vml-main"/>
- <!-- External schema: http://schemas.openxmlformats.org/officeDocument/2006/relationships -->
- <!-- start = shapedefaults | shapelayout | signatureline | ink | diagram | skew | extrusion | callout | lock | OLEObject | complex | left | top | right | bottom | column | clippath | fill -->
- <define name="bwmode">
- <attribute name="bwmode"/>
- </define>
- <define name="bwpure">
- <attribute name="bwpure"/>
- </define>
- <define name="bwnormal">
- <attribute name="bwnormal"/>
- </define>
- <define name="targetscreensize">
- <attribute name="targetscreensize"/>
- </define>
- <define name="insetmode">
- <attribute name="insetmode"/>
- </define>
- <define name="spt">
- <attribute name="spt">
- <data type="float"/>
- </attribute>
- </define>
- <define name="wrapcoords">
- <attribute name="wrapcoords">
- <data type="string"/>
- </attribute>
- </define>
- <define name="oned">
- <attribute name="oned"/>
- </define>
- <define name="regroupid">
- <attribute name="regroupid">
- <data type="integer"/>
- </attribute>
- </define>
- <define name="doubleclicknotify">
- <attribute name="doubleclicknotify"/>
- </define>
- <define name="connectortype">
- <attribute name="connectortype"/>
- </define>
- <define name="button">
- <attribute name="button"/>
- </define>
- <define name="userhidden">
- <attribute name="userhidden"/>
- </define>
- <define name="forcedash">
- <attribute name="forcedash"/>
- </define>
- <define name="oleicon">
- <attribute name="oleicon"/>
- </define>
- <define name="ole">
- <attribute name="ole"/>
- </define>
- <define name="preferrelative">
- <attribute name="preferrelative"/>
- </define>
- <define name="cliptowrap">
- <attribute name="cliptowrap"/>
- </define>
- <define name="clip">
- <attribute name="clip"/>
- </define>
- <define name="bullet">
- <attribute name="bullet"/>
- </define>
- <define name="hr">
- <attribute name="hr"/>
- </define>
- <define name="hrstd">
- <attribute name="hrstd"/>
- </define>
- <define name="hrnoshade">
- <attribute name="hrnoshade"/>
- </define>
- <define name="hrpct">
- <attribute name="hrpct">
- <data type="float"/>
- </attribute>
- </define>
- <define name="hralign">
- <attribute name="hralign"/>
- </define>
- <define name="allowincell">
- <attribute name="allowincell"/>
- </define>
- <define name="allowoverlap">
- <attribute name="allowoverlap"/>
- </define>
- <define name="userdrawn">
- <attribute name="userdrawn"/>
- </define>
- <define name="bordertopcolor">
- <attribute name="bordertopcolor">
- <data type="string"/>
- </attribute>
- </define>
- <define name="borderleftcolor">
- <attribute name="borderleftcolor">
- <data type="string"/>
- </attribute>
- </define>
- <define name="borderbottomcolor">
- <attribute name="borderbottomcolor">
- <data type="string"/>
- </attribute>
- </define>
- <define name="borderrightcolor">
- <attribute name="borderrightcolor">
- <data type="string"/>
- </attribute>
- </define>
- <define name="connecttype">
- <attribute name="connecttype"/>
- </define>
- <define name="connectlocs">
- <attribute name="connectlocs">
- <data type="string"/>
- </attribute>
- </define>
- <define name="connectangles">
- <attribute name="connectangles">
- <data type="string"/>
- </attribute>
- </define>
- <define name="master">
- <attribute name="master">
- <data type="string"/>
- </attribute>
- </define>
- <define name="extrusionok">
- <attribute name="extrusionok"/>
- </define>
- <define name="href">
- <attribute name="href">
- <data type="string"/>
- </attribute>
- </define>
- <define name="althref">
- <attribute name="althref">
- <data type="string"/>
- </attribute>
- </define>
- <define name="title">
- <attribute name="title">
- <data type="string"/>
- </attribute>
- </define>
- <define name="singleclick">
- <attribute name="singleclick"/>
- </define>
- <define name="oleid">
- <attribute name="oleid">
- <data type="float"/>
- </attribute>
- </define>
- <define name="detectmouseclick">
- <attribute name="detectmouseclick"/>
- </define>
- <define name="movie">
- <attribute name="movie">
- <data type="float"/>
- </attribute>
- </define>
- <define name="spid">
- <attribute name="spid">
- <data type="string"/>
- </attribute>
- </define>
- <define name="opacity2">
- <attribute name="opacity2">
- <data type="string"/>
- </attribute>
- </define>
- <define name="relid">
- <attribute name="relid"/>
- </define>
- <define name="dgmlayout">
- <attribute name="dgmlayout">
- <data type="integer"/>
- </attribute>
- </define>
- <define name="dgmnodekind">
- <attribute name="dgmnodekind">
- <data type="integer"/>
- </attribute>
- </define>
- <define name="dgmlayoutmru">
- <attribute name="dgmlayoutmru">
- <data type="integer"/>
- </attribute>
- </define>
- <define name="gfxdata">
- <attribute name="gfxdata">
- <data type="base64Binary"/>
- </attribute>
- </define>
- <define name="tableproperties">
- <attribute name="tableproperties">
- <data type="string"/>
- </attribute>
- </define>
- <define name="tablelimits">
- <attribute name="tablelimits">
- <data type="string"/>
- </attribute>
- </define>
- <define name="shapedefaults">
- <element name="shapedefaults">
- <ref name="CT_ShapeDefaults"/>
- </element>
- </define>
- <define name="shapelayout">
- <element name="shapelayout">
- <ref name="CT_ShapeLayout"/>
- </element>
- </define>
- <define name="signatureline">
- <element name="signatureline">
- <ref name="CT_SignatureLine"/>
- </element>
- </define>
- <define name="ink">
- <element name="ink">
- <ref name="CT_Ink"/>
- </element>
- </define>
- <define name="diagram">
- <element name="diagram">
- <ref name="CT_Diagram"/>
- </element>
- </define>
- <define name="CT_ShapeDefaults">
- <element name="v:fill">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="v:stroke">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="v:textbox">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="v:shadow">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <ref name="skew"/>
- <ref name="extrusion"/>
- <ref name="callout"/>
- <ref name="lock"/>
- <element name="colormru">
- <ref name="CT_ColorMru"/>
- </element>
- <element name="colormenu">
- <ref name="CT_ColorMenu"/>
- </element>
- <ref name="BUILT_IN_ANY_TYPE"/>
- <attribute name="spidmax">
- <data type="integer"/>
- </attribute>
- <attribute name="style">
- <data type="string"/>
- </attribute>
- <attribute name="fill">
- <data type="string"/>
- </attribute>
- <attribute name="fillcolor">
- <data type="string"/>
- </attribute>
- <attribute name="stroke">
- <data type="string"/>
- </attribute>
- <attribute name="strokecolor">
- <data type="string"/>
- </attribute>
- <attribute name="allowincell">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Ink">
- <attribute name="i">
- <data type="base64Binary"/>
- </attribute>
- <attribute name="annotation">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SignatureLine">
- <ref name="BUILT_IN_ANY_TYPE"/>
- <attribute name="issignatureline">
- <data type="string"/>
- </attribute>
- <attribute name="id">
- <data type="string"/>
- </attribute>
- <attribute name="provid">
- <data type="string"/>
- </attribute>
- <attribute name="signinginstructionsset">
- <data type="string"/>
- </attribute>
- <attribute name="allowcomments">
- <data type="string"/>
- </attribute>
- <attribute name="showsigndate">
- <data type="string"/>
- </attribute>
- <attribute name="suggestedsigner">
- <data type="string"/>
- </attribute>
- <attribute name="suggestedsigner2">
- <data type="string"/>
- </attribute>
- <attribute name="suggestedsigneremail">
- <data type="string"/>
- </attribute>
- <attribute name="signinginstructions">
- <data type="string"/>
- </attribute>
- <attribute name="addlxml">
- <data type="string"/>
- </attribute>
- <attribute name="sigprovurl">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_ShapeLayout">
- <element name="idmap">
- <ref name="CT_IdMap"/>
- </element>
- <element name="regrouptable">
- <ref name="CT_RegroupTable"/>
- </element>
- <element name="rules">
- <ref name="CT_Rules"/>
- </element>
- <ref name="BUILT_IN_ANY_TYPE"/>
- </define>
- <define name="CT_IdMap">
- <ref name="BUILT_IN_ANY_TYPE"/>
- <attribute name="data">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_RegroupTable">
- <element name="entry">
- <ref name="CT_Entry"/>
- </element>
- <ref name="BUILT_IN_ANY_TYPE"/>
- </define>
- <define name="CT_Entry">
- <attribute name="new">
- <data type="int"/>
- </attribute>
- <attribute name="old">
- <data type="int"/>
- </attribute>
- </define>
- <define name="CT_Rules">
- <element name="r">
- <ref name="CT_R"/>
- </element>
- <ref name="BUILT_IN_ANY_TYPE"/>
- </define>
- <define name="CT_R">
- <element name="proxy">
- <ref name="CT_Proxy"/>
- </element>
- <attribute name="id">
- <data type="string"/>
- </attribute>
- <attribute name="type">
- <data type="string"/>
- </attribute>
- <attribute name="how">
- <data type="string"/>
- </attribute>
- <attribute name="idref">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Proxy">
- <attribute name="start">
- <data type="string"/>
- </attribute>
- <attribute name="end">
- <data type="string"/>
- </attribute>
- <attribute name="idref">
- <data type="string"/>
- </attribute>
- <attribute name="connectloc">
- <data type="int"/>
- </attribute>
- </define>
- <define name="CT_Diagram">
- <element name="relationtable">
- <ref name="CT_RelationTable"/>
- </element>
- <ref name="BUILT_IN_ANY_TYPE"/>
- <attribute name="dgmstyle">
- <data type="integer"/>
- </attribute>
- <attribute name="autoformat">
- <data type="string"/>
- </attribute>
- <attribute name="reverse">
- <data type="string"/>
- </attribute>
- <attribute name="autolayout">
- <data type="string"/>
- </attribute>
- <attribute name="dgmscalex">
- <data type="integer"/>
- </attribute>
- <attribute name="dgmscaley">
- <data type="integer"/>
- </attribute>
- <attribute name="dgmfontsize">
- <data type="integer"/>
- </attribute>
- <attribute name="constrainbounds">
- <data type="string"/>
- </attribute>
- <attribute name="dgmbasetextscale">
- <data type="integer"/>
- </attribute>
- </define>
- <define name="CT_RelationTable">
- <element name="rel">
- <ref name="CT_Relation"/>
- </element>
- <ref name="BUILT_IN_ANY_TYPE"/>
- </define>
- <define name="CT_Relation">
- <ref name="BUILT_IN_ANY_TYPE"/>
- <attribute name="idsrc">
- <data type="string"/>
- </attribute>
- <attribute name="iddest">
- <data type="string"/>
- </attribute>
- <attribute name="idcntr">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_ColorMru">
- <ref name="BUILT_IN_ANY_TYPE"/>
- <attribute name="colors">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_ColorMenu">
- <ref name="BUILT_IN_ANY_TYPE"/>
- <attribute name="strokecolor">
- <data type="string"/>
- </attribute>
- <attribute name="fillcolor">
- <data type="string"/>
- </attribute>
- <attribute name="shadowcolor">
- <data type="string"/>
- </attribute>
- <attribute name="extrusioncolor">
- <data type="string"/>
- </attribute>
- </define>
- <define name="skew">
- <element name="skew">
- <ref name="CT_Skew"/>
- </element>
- </define>
- <define name="extrusion">
- <element name="extrusion">
- <ref name="CT_Extrusion"/>
- </element>
- </define>
- <define name="callout">
- <element name="callout">
- <ref name="CT_Callout"/>
- </element>
- </define>
- <define name="lock">
- <element name="lock">
- <ref name="CT_Lock"/>
- </element>
- </define>
- <define name="OLEObject">
- <element name="OLEObject">
- <ref name="CT_OLEObject"/>
- </element>
- </define>
- <define name="complex">
- <element name="complex">
- <ref name="CT_Complex"/>
- </element>
- </define>
- <define name="left">
- <element name="left">
- <ref name="CT_StrokeChild"/>
- </element>
- </define>
- <define name="top">
- <element name="top">
- <ref name="CT_StrokeChild"/>
- </element>
- </define>
- <define name="right">
- <element name="right">
- <ref name="CT_StrokeChild"/>
- </element>
- </define>
- <define name="bottom">
- <element name="bottom">
- <ref name="CT_StrokeChild"/>
- </element>
- </define>
- <define name="column">
- <element name="column">
- <ref name="CT_StrokeChild"/>
- </element>
- </define>
- <define name="clippath">
- <element name="clippath">
- <ref name="CT_ClipPath"/>
- </element>
- </define>
- <define name="fill">
- <element name="fill">
- <ref name="CT_Fill"/>
- </element>
- </define>
- <define name="CT_Skew">
- <ref name="BUILT_IN_ANY_TYPE"/>
- <attribute name="id">
- <data type="string"/>
- </attribute>
- <attribute name="on">
- <data type="string"/>
- </attribute>
- <attribute name="offset">
- <data type="string"/>
- </attribute>
- <attribute name="origin">
- <data type="string"/>
- </attribute>
- <attribute name="matrix">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Extrusion">
- <ref name="BUILT_IN_ANY_TYPE"/>
- <attribute name="on">
- <data type="string"/>
- </attribute>
- <attribute name="type">
- <data type="string"/>
- </attribute>
- <attribute name="render">
- <data type="string"/>
- </attribute>
- <attribute name="viewpointorigin">
- <data type="string"/>
- </attribute>
- <attribute name="viewpoint">
- <data type="string"/>
- </attribute>
- <attribute name="plane">
- <data type="string"/>
- </attribute>
- <attribute name="skewangle">
- <data type="float"/>
- </attribute>
- <attribute name="skewamt">
- <data type="string"/>
- </attribute>
- <attribute name="foredepth">
- <data type="string"/>
- </attribute>
- <attribute name="backdepth">
- <data type="string"/>
- </attribute>
- <attribute name="orientation">
- <data type="string"/>
- </attribute>
- <attribute name="orientationangle">
- <data type="float"/>
- </attribute>
- <attribute name="lockrotationcenter">
- <data type="string"/>
- </attribute>
- <attribute name="autorotationcenter">
- <data type="string"/>
- </attribute>
- <attribute name="rotationcenter">
- <data type="string"/>
- </attribute>
- <attribute name="rotationangle">
- <data type="string"/>
- </attribute>
- <attribute name="colormode">
- <data type="string"/>
- </attribute>
- <attribute name="color">
- <data type="string"/>
- </attribute>
- <attribute name="shininess">
- <data type="float"/>
- </attribute>
- <attribute name="specularity">
- <data type="string"/>
- </attribute>
- <attribute name="diffusity">
- <data type="string"/>
- </attribute>
- <attribute name="metal">
- <data type="string"/>
- </attribute>
- <attribute name="edge">
- <data type="string"/>
- </attribute>
- <attribute name="facet">
- <data type="string"/>
- </attribute>
- <attribute name="lightface">
- <data type="string"/>
- </attribute>
- <attribute name="brightness">
- <data type="string"/>
- </attribute>
- <attribute name="lightposition">
- <data type="string"/>
- </attribute>
- <attribute name="lightlevel">
- <data type="string"/>
- </attribute>
- <attribute name="lightharsh">
- <data type="string"/>
- </attribute>
- <attribute name="lightposition2">
- <data type="string"/>
- </attribute>
- <attribute name="lightlevel2">
- <data type="string"/>
- </attribute>
- <attribute name="lightharsh2">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Callout">
- <ref name="BUILT_IN_ANY_TYPE"/>
- <attribute name="on">
- <data type="string"/>
- </attribute>
- <attribute name="type">
- <data type="string"/>
- </attribute>
- <attribute name="gap">
- <data type="string"/>
- </attribute>
- <attribute name="angle">
- <data type="string"/>
- </attribute>
- <attribute name="dropauto">
- <data type="string"/>
- </attribute>
- <attribute name="drop">
- <data type="string"/>
- </attribute>
- <attribute name="distance">
- <data type="string"/>
- </attribute>
- <attribute name="lengthspecified">
- <data type="string"/>
- </attribute>
- <attribute name="length">
- <data type="string"/>
- </attribute>
- <attribute name="accentbar">
- <data type="string"/>
- </attribute>
- <attribute name="textborder">
- <data type="string"/>
- </attribute>
- <attribute name="minusx">
- <data type="string"/>
- </attribute>
- <attribute name="minusy">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Lock">
- <ref name="BUILT_IN_ANY_TYPE"/>
- <attribute name="position">
- <data type="string"/>
- </attribute>
- <attribute name="selection">
- <data type="string"/>
- </attribute>
- <attribute name="grouping">
- <data type="string"/>
- </attribute>
- <attribute name="ungrouping">
- <data type="string"/>
- </attribute>
- <attribute name="rotation">
- <data type="string"/>
- </attribute>
- <attribute name="cropping">
- <data type="string"/>
- </attribute>
- <attribute name="verticies">
- <data type="string"/>
- </attribute>
- <attribute name="adjusthandles">
- <data type="string"/>
- </attribute>
- <attribute name="text">
- <data type="string"/>
- </attribute>
- <attribute name="aspectratio">
- <data type="string"/>
- </attribute>
- <attribute name="shapetype">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_OLEObject">
- <element name="LinkType">
- <ref name="ST_OLELinkType"/>
- </element>
- <element name="LockedField">
- <ref name="ST_TrueFalseBlank"/>
- </element>
- <element name="FieldCodes">
- <data type="string"/>
- </element>
- <attribute name="Type">
- <data type="string"/>
- </attribute>
- <attribute name="ProgID">
- <data type="string"/>
- </attribute>
- <attribute name="ShapeID">
- <data type="string"/>
- </attribute>
- <attribute name="DrawAspect">
- <data type="string"/>
- </attribute>
- <attribute name="ObjectID">
- <data type="string"/>
- </attribute>
- <attribute name="r:id">
- <data type="string"/>
- </attribute>
- <attribute name="UpdateMode">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Complex">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </define>
- <define name="CT_StrokeChild">
- <ref name="BUILT_IN_ANY_TYPE"/>
- <attribute name="on">
- <data type="string"/>
- </attribute>
- <attribute name="weight">
- <data type="string"/>
- </attribute>
- <attribute name="color">
- <data type="string"/>
- </attribute>
- <attribute name="color2">
- <data type="string"/>
- </attribute>
- <attribute name="opacity">
- <data type="string"/>
- </attribute>
- <attribute name="linestyle">
- <ref name="ST_StrokeLineStyle"/>
- </attribute>
- <attribute name="miterlimit">
- <data type="decimal"/>
- </attribute>
- <attribute name="joinstyle">
- <ref name="ST_StrokeJoinStyle"/>
- </attribute>
- <attribute name="endcap">
- <ref name="ST_StrokeEndCap"/>
- </attribute>
- <attribute name="dashstyle">
- <data type="string"/>
- </attribute>
- <attribute name="insetpen">
- <data type="string"/>
- </attribute>
- <attribute name="filltype">
- <ref name="ST_FillType"/>
- </attribute>
- <attribute name="src">
- <data type="string"/>
- </attribute>
- <attribute name="imageaspect">
- <ref name="ST_ImageAspect"/>
- </attribute>
- <attribute name="imagesize">
- <data type="string"/>
- </attribute>
- <attribute name="imagealignshape">
- <data type="string"/>
- </attribute>
- <attribute name="startarrow">
- <ref name="ST_StrokeArrowType"/>
- </attribute>
- <attribute name="startarrowwidth">
- <ref name="ST_StrokeArrowWidth"/>
- </attribute>
- <attribute name="startarrowlength">
- <ref name="ST_StrokeArrowLength"/>
- </attribute>
- <attribute name="endarrow">
- <ref name="ST_StrokeArrowType"/>
- </attribute>
- <attribute name="endarrowwidth">
- <ref name="ST_StrokeArrowWidth"/>
- </attribute>
- <attribute name="endarrowlength">
- <ref name="ST_StrokeArrowLength"/>
- </attribute>
- <ref name="href"/>
- <ref name="althref"/>
- <ref name="title"/>
- <ref name="forcedash"/>
- </define>
- <define name="CT_ClipPath">
- <attribute name="v">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Fill">
- <ref name="BUILT_IN_ANY_TYPE"/>
- <attribute name="type">
- <data type="string"/>
- </attribute>
- </define>
- <define name="ST_Angle">
- <choice>
- <!-- Any Angle -->
- <value>any</value>
- <!-- 30 degrees -->
- <value>30</value>
- <!-- 45 degrees -->
- <value>45</value>
- <!-- 60 degrees -->
- <value>60</value>
- <!-- 90 degrees -->
- <value>90</value>
- <!-- Automatic Angle -->
- <value>auto</value>
- </choice>
- </define>
- <define name="ST_OLELinkType">
- <choice>
- <!-- Other Image -->
- <value>Picture</value>
- <!-- Bitmap Image -->
- <value>Bitmap</value>
- <!-- Enhanced Metafile Image -->
- <value>EnhancedMetaFile</value>
- </choice>
- </define>
- <define name="ST_TrueFalseBlank">
- <choice>
- <!-- Blank - Logical False -->
- <value/>
- <!-- Logical True -->
- <value>t</value>
- <!-- Logical False -->
- <value>f</value>
- <!-- Logical True -->
- <value>true</value>
- <!-- Logical False -->
- <value>false</value>
- </choice>
- </define>
- <define name="ST_FillType">
- <choice>
- <!-- Centered Radial Gradient -->
- <value>gradientCenter</value>
- <!-- Solid Fill -->
- <value>solid</value>
- <!-- Image Pattern -->
- <value>pattern</value>
- <!-- Tiled Image -->
- <value>tile</value>
- <!-- Stretch Image to Fit -->
- <value>frame</value>
- <!-- Unscaled Gradient -->
- <value>gradientUnscaled</value>
- <!-- Radial Gradient -->
- <value>gradientRadial</value>
- <!-- Linear Gradient -->
- <value>gradient</value>
- <!-- Use Background Fill -->
- <value>background</value>
- </choice>
- </define>
- <define name="BUILT_IN_ANY_TYPE">
- <choice>
- <element>
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <data type="string"/>
- </choice>
- </define>
- </grammar>
- <resource name="OLEObject" resource="Properties">
- <element name="OLEObject" tokenid="ooxml:OLEObject_OLEObject"/>
- </resource>
- <resource name="CT_OLEObject" resource="Properties">
- <element name="LinkType" tokenid="ooxml:CT_OLEObject_LinkType"/>
- <element name="LockedField" tokenid="ooxml:CT_OLEObject_LockedField"/>
- <element name="FieldCodes" tokenid="ooxml:CT_OLEObject_FieldCodes"/>
- <attribute name="Type" tokenid="ooxml:CT_OLEObject_Type"/>
- <attribute name="ProgID" tokenid="ooxml:CT_OLEObject_ProgID"/>
- <attribute name="ShapeID" tokenid="ooxml:CT_OLEObject_ShapeID"/>
- <attribute name="DrawAspect" tokenid="ooxml:CT_OLEObject_DrawAspect"/>
- <attribute name="ObjectID" tokenid="ooxml:CT_OLEObject_ObjectID"/>
- <attribute name="r:id" tokenid="ooxml:CT_OLEObject_r_id"/>
- <attribute name="UpdateMode" tokenid="ooxml:CT_OLEObject_UpdateMode"/>
- <action name="end" action="handleOLE"/>
- </resource>
- <resource name="ST_Angle" resource="List">
- <value tokenid="ooxml:Value_vmlOffice_ST_Angle_any">any</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_Angle_30">30</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_Angle_45">45</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_Angle_60">60</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_Angle_90">90</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_Angle_auto">auto</value>
- </resource>
- <resource name="ST_OLELinkType" resource="List">
- <value tokenid="ooxml:Value_vmlOffice_ST_OLELinkType_Picture">Picture</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_OLELinkType_Bitmap">Bitmap</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_OLELinkType_EnhancedMetaFile">EnhancedMetaFile</value>
- </resource>
- <resource name="ST_TrueFalseBlank" resource="List">
- <value tokenid="ooxml:Value_vmlOffice_ST_TrueFalseBlank_"/>
- <value tokenid="ooxml:Value_vmlOffice_ST_TrueFalseBlank_t">t</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_TrueFalseBlank_f">f</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_TrueFalseBlank_true">true</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_TrueFalseBlank_false">false</value>
- </resource>
- <resource name="ST_FillType" resource="List">
- <value tokenid="ooxml:Value_vmlOffice_ST_FillType_gradientCenter">gradientCenter</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_FillType_solid">solid</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_FillType_pattern">pattern</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_FillType_tile">tile</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_FillType_frame">frame</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_FillType_gradientUnscaled">gradientUnscaled</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_FillType_gradientRadial">gradientRadial</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_FillType_gradient">gradient</value>
- <value tokenid="ooxml:Value_vmlOffice_ST_FillType_background">background</value>
- </resource>
- </namespace>
- <namespace name="vml-wordprocessingDrawing">
- <start name="bordertop"/>
- <start name="borderleft"/>
- <start name="borderright"/>
- <start name="borderbottom"/>
- <start name="wrap"/>
- <start name="anchorlock"/>
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="urn:schemas-microsoft-com:office:word">
- <!-- ISO RELAX NG Schema -->
- <!-- start = bordertop | borderleft | borderright | borderbottom | wrap | anchorlock -->
- <define name="bordertop">
- <element name="bordertop">
- <ref name="CT_Border"/>
- </element>
- </define>
- <define name="borderleft">
- <element name="borderleft">
- <ref name="CT_Border"/>
- </element>
- </define>
- <define name="borderright">
- <element name="borderright">
- <ref name="CT_Border"/>
- </element>
- </define>
- <define name="borderbottom">
- <element name="borderbottom">
- <ref name="CT_Border"/>
- </element>
- </define>
- <define name="CT_Border">
- <attribute name="type">
- <data type="string"/>
- </attribute>
- <attribute name="width">
- <data type="positiveInteger"/>
- </attribute>
- <attribute name="shadow">
- <data type="string"/>
- </attribute>
- </define>
- <define name="wrap">
- <element name="wrap">
- <ref name="CT_Wrap"/>
- </element>
- </define>
- <define name="CT_Wrap">
- <attribute name="type">
- <ref name="ST_WrapType"/>
- </attribute>
- <attribute name="side">
- <ref name="ST_WrapSide"/>
- </attribute>
- <attribute name="anchorx">
- <ref name="ST_HorizontalAnchor"/>
- </attribute>
- <attribute name="anchory">
- <ref name="ST_VerticalAnchor"/>
- </attribute>
- </define>
- <define name="anchorlock">
- <element name="anchorlock">
- <ref name="CT_AnchorLock"/>
- </element>
- </define>
- <define name="CT_AnchorLock">
- </define>
- <define name="ST_WrapType">
- <choice>
- <!-- Top and bottom wrapping -->
- <value>topAndBottom</value>
- <!-- Square wrapping -->
- <value>square</value>
- <!-- No wrapping -->
- <value>none</value>
- <!-- Tight wrapping -->
- <value>tight</value>
- <!-- Through wrapping -->
- <value>through</value>
- </choice>
- </define>
- <define name="ST_WrapSide">
- <choice>
- <!-- Both sides -->
- <value>both</value>
- <!-- Left side -->
- <value>left</value>
- <!-- Right side -->
- <value>right</value>
- <!-- Largest side -->
- <value>largest</value>
- </choice>
- </define>
- <define name="ST_HorizontalAnchor">
- <choice>
- <!-- Margin -->
- <value>margin</value>
- <!-- Page -->
- <value>page</value>
- <!-- Text -->
- <value>text</value>
- <!-- Character -->
- <value>char</value>
- </choice>
- </define>
- <define name="ST_VerticalAnchor">
- <choice>
- <!-- Margin -->
- <value>margin</value>
- <!-- Page -->
- <value>page</value>
- <!-- Text -->
- <value>text</value>
- <!-- Line -->
- <value>line</value>
- </choice>
- </define>
- </grammar>
- <resource name="wrap" resource="Properties">
- <element name="wrap" tokenid="ooxml:wrap_wrap"/>
- </resource>
- <resource name="CT_Wrap" resource="Properties">
- <attribute name="type" tokenid="ooxml:CT_Wrap_type"/>
- <attribute name="side" tokenid="ooxml:CT_Wrap_side"/>
- <attribute name="anchorx" tokenid="ooxml:CT_Wrap_anchorx"/>
- <attribute name="anchory" tokenid="ooxml:CT_Wrap_anchory"/>
- </resource>
- <resource name="ST_WrapType" resource="List">
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_WrapType_topAndBottom">topAndBottom</value>
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_WrapType_square">square</value>
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_WrapType_none">none</value>
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_WrapType_tight">tight</value>
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_WrapType_through">through</value>
- </resource>
- <resource name="ST_WrapSide" resource="List">
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_WrapSide_both">both</value>
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_WrapSide_left">left</value>
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_WrapSide_right">right</value>
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_WrapSide_largest">largest</value>
- </resource>
- <resource name="ST_HorizontalAnchor" resource="List">
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_HorizontalAnchor_margin">margin</value>
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_HorizontalAnchor_page">page</value>
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_HorizontalAnchor_text">text</value>
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_HorizontalAnchor_char">char</value>
- </resource>
- <resource name="ST_VerticalAnchor" resource="List">
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_VerticalAnchor_margin">margin</value>
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_VerticalAnchor_page">page</value>
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_VerticalAnchor_text">text</value>
- <value tokenid="ooxml:Value_vml_wordprocessingDrawing_ST_VerticalAnchor_line">line</value>
- </resource>
- </namespace>
- <namespace name="wml">
- <start name="recipients"/>
- <start name="txbxContent"/>
- <start name="comments"/>
- <start name="footnotes"/>
- <start name="endnotes"/>
- <start name="hdr"/>
- <start name="ftr"/>
- <start name="settings"/>
- <start name="webSettings"/>
- <start name="fonts"/>
- <start name="numbering"/>
- <start name="styles"/>
- <start name="document"/>
- <start name="glossaryDocument"/>
- <grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://schemas.openxmlformats.org/wordprocessingml/2006/main" attributeFormDefault="qualified">
- <include href="shared-math"/>
- <include href="dml-wordprocessingDrawing"/>
- <include href="shared-relationshipReference"/>
- <!-- start = recipients | txbxContent | comments | footnotes | endnotes | hdr | ftr | settings | webSettings | fonts | numbering | styles | document | glossaryDocument -->
- <define name="CT_Empty">
- </define>
- <define name="ST_OnOff">
- <choice>
- <!-- True -->
- <value>true</value>
- <!-- False -->
- <value>false</value>
- <!-- True -->
- <value>on</value>
- <!-- False -->
- <value>off</value>
- <!-- False -->
- <value>0</value>
- <!-- True -->
- <value>1</value>
- </choice>
- </define>
- <define name="CT_OnOff">
- <attribute name="val">
- <ref name="ST_OnOff"/>
- </attribute>
- </define>
- <define name="ST_LongHexNumber">
- <data type="hexBinary"/>
- </define>
- <define name="CT_LongHexNumber">
- <attribute name="val">
- <ref name="ST_LongHexNumber"/>
- </attribute>
- </define>
- <define name="ST_ShortHexNumber">
- <data type="hexBinary"/>
- </define>
- <define name="CT_ShortHexNumber">
- <attribute name="val">
- <ref name="ST_ShortHexNumber"/>
- </attribute>
- </define>
- <define name="ST_UcharHexNumber">
- <data type="hexBinary"/>
- </define>
- <define name="CT_UcharHexNumber">
- <attribute name="val">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- </define>
- <define name="ST_DecimalNumber">
- <data type="integer"/>
- </define>
- <define name="CT_DecimalNumber">
- <attribute name="val">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- </define>
- <define name="ST_UnsignedDecimalNumber">
- <data type="unsignedLong"/>
- </define>
-<!-- MS documentation states that TwipsMeasure is a positive value
- but it doesn't indicate how to handle an invalid negative
- value. So, ST_TwipsMeasure matches the documented type,
- and the extension (_asSigned, _asZero, or perhaps _asAbsolute)
- indicates how MS handles it in practice.
-
- Historically, LO has treated TwipsMeasure as signed,
- i.e. that negative numbers are allowed and treated as negative,
- so that is the default handling.
--->
- <define name="ST_TwipsMeasure">
- <data type="unsignedLong"/>
- </define>
- <define name="ST_TwipsMeasure_asSigned">
- <data type="unsignedLong"/>
- </define>
- <define name="ST_TwipsMeasure_asZero">
- <data type="unsignedLong"/>
- </define>
- <define name="CT_TwipsMeasure">
- <attribute name="val">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- </define>
- <define name="ST_SignedTwipsMeasure">
- <data type="integer"/>
- </define>
- <define name="CT_SignedTwipsMeasure">
- <attribute name="val">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- </define>
- <define name="ST_PixelsMeasure">
- <data type="unsignedLong"/>
- </define>
- <define name="CT_PixelsMeasure">
- <attribute name="val">
- <ref name="ST_PixelsMeasure"/>
- </attribute>
- </define>
- <define name="ST_HpsMeasure">
- <data type="unsignedLong"/>
- </define>
- <define name="CT_HpsMeasure">
- <attribute name="val">
- <ref name="ST_HpsMeasure"/>
- </attribute>
- </define>
- <define name="ST_SignedHpsMeasure">
- <data type="integer"/>
- </define>
- <define name="CT_SignedHpsMeasure">
- <attribute name="val">
- <ref name="ST_SignedHpsMeasure"/>
- </attribute>
- </define>
- <define name="ST_DateTime">
- <data type="dateTime"/>
- </define>
- <define name="CT_MacroName">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="ST_EighthPointMeasure">
- <data type="unsignedLong"/>
- </define>
- <define name="ST_PointMeasure">
- <data type="unsignedLong"/>
- </define>
- <define name="ST_String">
- <data type="string"/>
- </define>
- <define name="CT_String">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="ST_TextScale">
- <data type="integer"/>
- </define>
- <define name="CT_TextScale">
- <attribute name="val">
- <ref name="ST_TextScale"/>
- </attribute>
- </define>
- <define name="ST_HighlightColor">
- <choice>
- <!-- Black Highlighting Color -->
- <value>black</value>
- <!-- Blue Highlighting Color -->
- <value>blue</value>
- <!-- Cyan Highlighting Color -->
- <value>cyan</value>
- <!-- Green Highlighting Color -->
- <value>green</value>
- <!-- Magenta Highlighting Color -->
- <value>magenta</value>
- <!-- Red Highlighting Color -->
- <value>red</value>
- <!-- Yellow Highlighting Color -->
- <value>yellow</value>
- <!-- White Highlighting Color -->
- <value>white</value>
- <!-- Dark Blue Highlighting Color -->
- <value>darkBlue</value>
- <!-- Dark Cyan Highlighting Color -->
- <value>darkCyan</value>
- <!-- Dark Green Highlighting Color -->
- <value>darkGreen</value>
- <!-- Dark Magenta Highlighting Color -->
- <value>darkMagenta</value>
- <!-- Dark Red Highlighting Color -->
- <value>darkRed</value>
- <!-- Dark Yellow Highlighting Color -->
- <value>darkYellow</value>
- <!-- Dark Gray Highlighting Color -->
- <value>darkGray</value>
- <!-- Light Gray Highlighting Color -->
- <value>lightGray</value>
- <!-- No Text Highlighting -->
- <value>none</value>
- </choice>
- </define>
- <define name="CT_Highlight">
- <attribute name="val">
- <ref name="ST_HighlightColor"/>
- </attribute>
- </define>
- <define name="ST_HexColorAuto">
- <choice>
- <!-- Automatically Determined Color -->
- <value>auto</value>
- </choice>
- </define>
- <define name="ST_HexColorRGB">
- <data type="hexBinary"/>
- </define>
- <define name="ST_HexColor">
- <choice>
- <ref name="ST_HexColorAuto"/>
- <ref name="ST_HexColorRGB"/>
- </choice>
- </define>
- <!-- Union -->
- <define name="CT_Color">
- <attribute name="val">
- <ref name="ST_HexColor"/>
- </attribute>
- <attribute name="themeColor">
- <ref name="ST_ThemeColor"/>
- </attribute>
- <attribute name="themeTint">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <attribute name="themeShade">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- </define>
- <define name="ST_LangCode">
- <data type="hexBinary"/>
- </define>
- <define name="ST_Lang">
- <choice>
- <ref name="ST_LangCode"/>
- <ref name="ST_String"/>
- </choice>
- </define>
- <!-- Union -->
- <define name="CT_Lang">
- <attribute name="val">
- <ref name="ST_Lang"/>
- </attribute>
- </define>
- <define name="CT_Guid">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="ST_Underline">
- <choice>
- <!-- Single Underline -->
- <value>single</value>
- <!-- Underline Non-Space Characters Only -->
- <value>words</value>
- <!-- Double Underline -->
- <value>double</value>
- <!-- Thick Underline -->
- <value>thick</value>
- <!-- Dotted Underline -->
- <value>dotted</value>
- <!-- Thick Dotted Underline -->
- <value>dottedHeavy</value>
- <!-- Dashed Underline -->
- <value>dash</value>
- <!-- Thick Dashed Underline -->
- <value>dashedHeavy</value>
- <!-- Long Dashed Underline -->
- <value>dashLong</value>
- <!-- Thick Long Dashed Underline -->
- <value>dashLongHeavy</value>
- <!-- Dash-Dot Underline -->
- <value>dotDash</value>
- <!-- Thick Dash-Dot Underline -->
- <value>dashDotHeavy</value>
- <!-- Dash-Dot-Dot Underline -->
- <value>dotDotDash</value>
- <!-- Thick Dash-Dot-Dot Underline -->
- <value>dashDotDotHeavy</value>
- <!-- Wave Underline -->
- <value>wave</value>
- <!-- Heavy Wave Underline -->
- <value>wavyHeavy</value>
- <!-- Double Wave Underline -->
- <value>wavyDouble</value>
- <!-- No Underline -->
- <value>none</value>
- </choice>
- </define>
- <define name="CT_Underline">
- <attribute name="val">
- <ref name="ST_Underline"/>
- </attribute>
- <attribute name="color">
- <ref name="ST_HexColor"/>
- </attribute>
- <attribute name="themeColor">
- <ref name="ST_ThemeColor"/>
- </attribute>
- <attribute name="themeTint">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <attribute name="themeShade">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- </define>
- <define name="ST_TextEffect">
- <choice>
- <!-- Blinking Background Animation -->
- <value>blinkBackground</value>
- <!-- Colored Lights Animation -->
- <value>lights</value>
- <!-- Black Dashed Line Animation -->
- <value>antsBlack</value>
- <!-- Marching Red Ants -->
- <value>antsRed</value>
- <!-- Shimmer Animation -->
- <value>shimmer</value>
- <!-- Sparkling Lights Animation -->
- <value>sparkle</value>
- <!-- No Animation -->
- <value>none</value>
- </choice>
- </define>
- <define name="CT_TextEffect">
- <attribute name="val">
- <ref name="ST_TextEffect"/>
- </attribute>
- </define>
- <define name="ST_Border">
- <choice>
- <!-- No Border -->
- <value>nil</value>
- <!-- No Border -->
- <value>none</value>
- <!-- Single Line Border -->
- <value>single</value>
- <!-- Single Line Border -->
- <value>thick</value>
- <!-- Double Line Border -->
- <value>double</value>
- <!-- Dotted Line Border -->
- <value>dotted</value>
- <!-- Dashed Line Border -->
- <value>dashed</value>
- <!-- Dot Dash Line Border -->
- <value>dotDash</value>
- <!-- Dot Dot Dash Line Border -->
- <value>dotDotDash</value>
- <!-- Triple Line Border -->
- <value>triple</value>
- <!-- Thin, Thick Line Border -->
- <value>thinThickSmallGap</value>
- <!-- Thick, Thin Line Border -->
- <value>thickThinSmallGap</value>
- <!-- Thin, Thick, Thin Line Border -->
- <value>thinThickThinSmallGap</value>
- <!-- Thin, Thick Line Border -->
- <value>thinThickMediumGap</value>
- <!-- Thick, Thin Line Border -->
- <value>thickThinMediumGap</value>
- <!-- Thin, Thick, Thin Line Border -->
- <value>thinThickThinMediumGap</value>
- <!-- Thin, Thick Line Border -->
- <value>thinThickLargeGap</value>
- <!-- Thick, Thin Line Border -->
- <value>thickThinLargeGap</value>
- <!-- Thin, Thick, Thin Line Border -->
- <value>thinThickThinLargeGap</value>
- <!-- Wavy Line Border -->
- <value>wave</value>
- <!-- Double Wave Line Border -->
- <value>doubleWave</value>
- <!-- Dashed Line Border -->
- <value>dashSmallGap</value>
- <!-- Dash Dot Strokes Line Border -->
- <value>dashDotStroked</value>
- <!-- 3D Embossed Line Border -->
- <value>threeDEmboss</value>
- <!-- 3D Engraved Line Border -->
- <value>threeDEngrave</value>
- <!-- Outset Line Border -->
- <value>outset</value>
- <!-- Inset Line Border -->
- <value>inset</value>
- <!-- Apples Art Border -->
- <value>apples</value>
- <!-- Arched Scallops Art Border -->
- <value>archedScallops</value>
- <!-- Baby Pacifier Art Border -->
- <value>babyPacifier</value>
- <!-- Baby Rattle Art Border -->
- <value>babyRattle</value>
- <!-- Three Color Balloons Art Border -->
- <value>balloons3Colors</value>
- <!-- Hot Air Balloons Art Border -->
- <value>balloonsHotAir</value>
- <!-- Black Dash Art Border -->
- <value>basicBlackDashes</value>
- <!-- Black Dot Art Border -->
- <value>basicBlackDots</value>
- <!-- Black Square Art Border -->
- <value>basicBlackSquares</value>
- <!-- Thin Line Art Border -->
- <value>basicThinLines</value>
- <!-- White Dash Art Border -->
- <value>basicWhiteDashes</value>
- <!-- White Dot Art Border -->
- <value>basicWhiteDots</value>
- <!-- White Square Art Border -->
- <value>basicWhiteSquares</value>
- <!-- Wide Inline Art Border -->
- <value>basicWideInline</value>
- <!-- Wide Midline Art Border -->
- <value>basicWideMidline</value>
- <!-- Wide Outline Art Border -->
- <value>basicWideOutline</value>
- <!-- Bats Art Border -->
- <value>bats</value>
- <!-- Birds Art Border -->
- <value>birds</value>
- <!-- Birds Flying Art Border -->
- <value>birdsFlight</value>
- <!-- Cabin Art Border -->
- <value>cabins</value>
- <!-- Cake Art Border -->
- <value>cakeSlice</value>
- <!-- Candy Corn Art Border -->
- <value>candyCorn</value>
- <!-- Knot Work Art Border -->
- <value>celticKnotwork</value>
- <!-- Certificate Banner Art Border -->
- <value>certificateBanner</value>
- <!-- Chain Link Art Border -->
- <value>chainLink</value>
- <!-- Champagne Bottle Art Border -->
- <value>champagneBottle</value>
- <!-- Black and White Bar Art Border -->
- <value>checkedBarBlack</value>
- <!-- Color Checked Bar Art Border -->
- <value>checkedBarColor</value>
- <!-- Checkerboard Art Border -->
- <value>checkered</value>
- <!-- Christmas Tree Art Border -->
- <value>christmasTree</value>
- <!-- Circles And Lines Art Border -->
- <value>circlesLines</value>
- <!-- Circles and Rectangles Art Border -->
- <value>circlesRectangles</value>
- <!-- Wave Art Border -->
- <value>classicalWave</value>
- <!-- Clocks Art Border -->
- <value>clocks</value>
- <!-- Compass Art Border -->
- <value>compass</value>
- <!-- Confetti Art Border -->
- <value>confetti</value>
- <!-- Confetti Art Border -->
- <value>confettiGrays</value>
- <!-- Confetti Art Border -->
- <value>confettiOutline</value>
- <!-- Confetti Streamers Art Border -->
- <value>confettiStreamers</value>
- <!-- Confetti Art Border -->
- <value>confettiWhite</value>
- <!-- Corner Triangle Art Border -->
- <value>cornerTriangles</value>
- <!-- Dashed Line Art Border -->
- <value>couponCutoutDashes</value>
- <!-- Dotted Line Art Border -->
- <value>couponCutoutDots</value>
- <!-- Maze Art Border -->
- <value>crazyMaze</value>
- <!-- Butterfly Art Border -->
- <value>creaturesButterfly</value>
- <!-- Fish Art Border -->
- <value>creaturesFish</value>
- <!-- Insects Art Border -->
- <value>creaturesInsects</value>
- <!-- Ladybug Art Border -->
- <value>creaturesLadyBug</value>
- <!-- Cross-stitch Art Border -->
- <value>crossStitch</value>
- <!-- Cupid Art Border -->
- <value>cup</value>
- <!-- Archway Art Border -->
- <value>decoArch</value>
- <!-- Color Archway Art Border -->
- <value>decoArchColor</value>
- <!-- Blocks Art Border -->
- <value>decoBlocks</value>
- <!-- Gray Diamond Art Border -->
- <value>diamondsGray</value>
- <!-- Double D Art Border -->
- <value>doubleD</value>
- <!-- Diamond Art Border -->
- <value>doubleDiamonds</value>
- <!-- Earth Art Border -->
- <value>earth1</value>
- <!-- Earth Art Border -->
- <value>earth2</value>
- <!-- Shadowed Square Art Border -->
- <value>eclipsingSquares1</value>
- <!-- Shadowed Square Art Border -->
- <value>eclipsingSquares2</value>
- <!-- Painted Egg Art Border -->
- <value>eggsBlack</value>
- <!-- Fans Art Border -->
- <value>fans</value>
- <!-- Film Reel Art Border -->
- <value>film</value>
- <!-- Firecracker Art Border -->
- <value>firecrackers</value>
- <!-- Flowers Art Border -->
- <value>flowersBlockPrint</value>
- <!-- Daisy Art Border -->
- <value>flowersDaisies</value>
- <!-- Flowers Art Border -->
- <value>flowersModern1</value>
- <!-- Flowers Art Border -->
- <value>flowersModern2</value>
- <!-- Pansy Art Border -->
- <value>flowersPansy</value>
- <!-- Red Rose Art Border -->
- <value>flowersRedRose</value>
- <!-- Roses Art Border -->
- <value>flowersRoses</value>
- <!-- Flowers in a Teacup Art Border -->
- <value>flowersTeacup</value>
- <!-- Small Flower Art Border -->
- <value>flowersTiny</value>
- <!-- Gems Art Border -->
- <value>gems</value>
- <!-- Gingerbread Man Art Border -->
- <value>gingerbreadMan</value>
- <!-- Triangle Gradient Art Border -->
- <value>gradient</value>
- <!-- Handmade Art Border -->
- <value>handmade1</value>
- <!-- Handmade Art Border -->
- <value>handmade2</value>
- <!-- Heart-Shaped Balloon Art Border -->
- <value>heartBalloon</value>
- <!-- Gray Heart Art Border -->
- <value>heartGray</value>
- <!-- Hearts Art Border -->
- <value>hearts</value>
- <!-- Pattern Art Border -->
- <value>heebieJeebies</value>
- <!-- Holly Art Border -->
- <value>holly</value>
- <!-- House Art Border -->
- <value>houseFunky</value>
- <!-- Circular Art Border -->
- <value>hypnotic</value>
- <!-- Ice Cream Cone Art Border -->
- <value>iceCreamCones</value>
- <!-- Light Bulb Art Border -->
- <value>lightBulb</value>
- <!-- Lightning Art Border -->
- <value>lightning1</value>
- <!-- Lightning Art Border -->
- <value>lightning2</value>
- <!-- Map Pins Art Border -->
- <value>mapPins</value>
- <!-- Maple Leaf Art Border -->
- <value>mapleLeaf</value>
- <!-- Muffin Art Border -->
- <value>mapleMuffins</value>
- <!-- Marquee Art Border -->
- <value>marquee</value>
- <!-- Marquee Art Border -->
- <value>marqueeToothed</value>
- <!-- Moon Art Border -->
- <value>moons</value>
- <!-- Mosaic Art Border -->
- <value>mosaic</value>
- <!-- Musical Note Art Border -->
- <value>musicNotes</value>
- <!-- Patterned Art Border -->
- <value>northwest</value>
- <!-- Oval Art Border -->
- <value>ovals</value>
- <!-- Package Art Border -->
- <value>packages</value>
- <!-- Black Palm Tree Art Border -->
- <value>palmsBlack</value>
- <!-- Color Palm Tree Art Border -->
- <value>palmsColor</value>
- <!-- Paper Clip Art Border -->
- <value>paperClips</value>
- <!-- Papyrus Art Border -->
- <value>papyrus</value>
- <!-- Party Favor Art Border -->
- <value>partyFavor</value>
- <!-- Party Glass Art Border -->
- <value>partyGlass</value>
- <!-- Pencils Art Border -->
- <value>pencils</value>
- <!-- Character Art Border -->
- <value>people</value>
- <!-- Waving Character Border -->
- <value>peopleWaving</value>
- <!-- Character With Hat Art Border -->
- <value>peopleHats</value>
- <!-- Poinsettia Art Border -->
- <value>poinsettias</value>
- <!-- Postage Stamp Art Border -->
- <value>postageStamp</value>
- <!-- Pumpkin Art Border -->
- <value>pumpkin1</value>
- <!-- Push Pin Art Border -->
- <value>pushPinNote2</value>
- <!-- Push Pin Art Border -->
- <value>pushPinNote1</value>
- <!-- Pyramid Art Border -->
- <value>pyramids</value>
- <!-- Pyramid Art Border -->
- <value>pyramidsAbove</value>
- <!-- Quadrants Art Border -->
- <value>quadrants</value>
- <!-- Rings Art Border -->
- <value>rings</value>
- <!-- Safari Art Border -->
- <value>safari</value>
- <!-- Saw tooth Art Border -->
- <value>sawtooth</value>
- <!-- Gray Saw tooth Art Border -->
- <value>sawtoothGray</value>
- <!-- Scared Cat Art Border -->
- <value>scaredCat</value>
- <!-- Umbrella Art Border -->
- <value>seattle</value>
- <!-- Shadowed Squares Art Border -->
- <value>shadowedSquares</value>
- <!-- Shark Tooth Art Border -->
- <value>sharksTeeth</value>
- <!-- Bird Tracks Art Border -->
- <value>shorebirdTracks</value>
- <!-- Rocket Art Border -->
- <value>skyrocket</value>
- <!-- Snowflake Art Border -->
- <value>snowflakeFancy</value>
- <!-- Snowflake Art Border -->
- <value>snowflakes</value>
- <!-- Sombrero Art Border -->
- <value>sombrero</value>
- <!-- Southwest-themed Art Border -->
- <value>southwest</value>
- <!-- Stars Art Border -->
- <value>stars</value>
- <!-- Stars On Top Art Border -->
- <value>starsTop</value>
- <!-- 3-D Stars Art Border -->
- <value>stars3d</value>
- <!-- Stars Art Border -->
- <value>starsBlack</value>
- <!-- Stars With Shadows Art Border -->
- <value>starsShadowed</value>
- <!-- Sun Art Border -->
- <value>sun</value>
- <!-- Whirligig Art Border -->
- <value>swirligig</value>
- <!-- Torn Paper Art Border -->
- <value>tornPaper</value>
- <!-- Black Torn Paper Art Border -->
- <value>tornPaperBlack</value>
- <!-- Tree Art Border -->
- <value>trees</value>
- <!-- Triangle Art Border -->
- <value>triangleParty</value>
- <!-- Triangles Art Border -->
- <value>triangles</value>
- <!-- Tribal Art Border One -->
- <value>tribal1</value>
- <!-- Tribal Art Border Two -->
- <value>tribal2</value>
- <!-- Tribal Art Border Three -->
- <value>tribal3</value>
- <!-- Tribal Art Border Four -->
- <value>tribal4</value>
- <!-- Tribal Art Border Five -->
- <value>tribal5</value>
- <!-- Tribal Art Border Six -->
- <value>tribal6</value>
- <!-- Twisted Lines Art Border -->
- <value>twistedLines1</value>
- <!-- Twisted Lines Art Border -->
- <value>twistedLines2</value>
- <!-- Vine Art Border -->
- <value>vine</value>
- <!-- Wavy Line Art Border -->
- <value>waveline</value>
- <!-- Weaving Angles Art Border -->
- <value>weavingAngles</value>
- <!-- Weaving Braid Art Border -->
- <value>weavingBraid</value>
- <!-- Weaving Ribbon Art Border -->
- <value>weavingRibbon</value>
- <!-- Weaving Strips Art Border -->
- <value>weavingStrips</value>
- <!-- White Flowers Art Border -->
- <value>whiteFlowers</value>
- <!-- Woodwork Art Border -->
- <value>woodwork</value>
- <!-- Crisscross Art Border -->
- <value>xIllusions</value>
- <!-- Triangle Art Border -->
- <value>zanyTriangles</value>
- <!-- Zigzag Art Border -->
- <value>zigZag</value>
- <!-- Zigzag stitch -->
- <value>zigZagStitch</value>
- </choice>
- </define>
- <define name="CT_Border">
- <attribute name="val">
- <ref name="ST_Border"/>
- </attribute>
- <attribute name="color">
- <ref name="ST_HexColor"/>
- </attribute>
- <attribute name="themeColor">
- <ref name="ST_ThemeColor"/>
- </attribute>
- <attribute name="themeTint">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <attribute name="themeShade">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <attribute name="sz">
- <ref name="ST_EighthPointMeasure"/>
- </attribute>
- <attribute name="space">
- <ref name="ST_PointMeasure"/>
- </attribute>
- <attribute name="shadow">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="frame">
- <ref name="ST_OnOff"/>
- </attribute>
- </define>
- <define name="ST_Shd">
- <choice>
- <!-- No Pattern -->
- <value>nil</value>
- <!-- No Pattern -->
- <value>clear</value>
- <!-- 100% Fill Pattern -->
- <value>solid</value>
- <!-- Horizontal Stripe Pattern -->
- <value>horzStripe</value>
- <!-- Vertical Stripe Pattern -->
- <value>vertStripe</value>
- <!-- Reverse Diagonal Stripe Pattern -->
- <value>reverseDiagStripe</value>
- <!-- Diagonal Stripe Pattern -->
- <value>diagStripe</value>
- <!-- Horizontal Cross Pattern -->
- <value>horzCross</value>
- <!-- Diagonal Cross Pattern -->
- <value>diagCross</value>
- <!-- Thin Horizontal Stripe Pattern -->
- <value>thinHorzStripe</value>
- <!-- Thin Vertical Stripe Pattern -->
- <value>thinVertStripe</value>
- <!-- Thin Reverse Diagonal Stripe Pattern -->
- <value>thinReverseDiagStripe</value>
- <!-- Thin Diagonal Stripe Pattern -->
- <value>thinDiagStripe</value>
- <!-- Thin Horizontal Cross Pattern -->
- <value>thinHorzCross</value>
- <!-- Thin Diagonal Cross Pattern -->
- <value>thinDiagCross</value>
- <!-- 5% Fill Pattern -->
- <value>pct5</value>
- <!-- 10% Fill Pattern -->
- <value>pct10</value>
- <!-- 12.5% Fill Pattern -->
- <value>pct12</value>
- <!-- 15% Fill Pattern -->
- <value>pct15</value>
- <!-- 20% Fill Pattern -->
- <value>pct20</value>
- <!-- 25% Fill Pattern -->
- <value>pct25</value>
- <!-- 30% Fill Pattern -->
- <value>pct30</value>
- <!-- 35% Fill Pattern -->
- <value>pct35</value>
- <!-- 37.5% Fill Pattern -->
- <value>pct37</value>
- <!-- 40% Fill Pattern -->
- <value>pct40</value>
- <!-- 45% Fill Pattern -->
- <value>pct45</value>
- <!-- 50% Fill Pattern -->
- <value>pct50</value>
- <!-- 55% Fill Pattern -->
- <value>pct55</value>
- <!-- 60% Fill Pattern -->
- <value>pct60</value>
- <!-- 62.5% Fill Pattern -->
- <value>pct62</value>
- <!-- 65% Fill Pattern -->
- <value>pct65</value>
- <!-- 70% Fill Pattern -->
- <value>pct70</value>
- <!-- 75% Fill Pattern -->
- <value>pct75</value>
- <!-- 80% Fill Pattern -->
- <value>pct80</value>
- <!-- 85% Fill Pattern -->
- <value>pct85</value>
- <!-- 87.5% Fill Pattern -->
- <value>pct87</value>
- <!-- 90% Fill Pattern -->
- <value>pct90</value>
- <!-- 95% Fill Pattern -->
- <value>pct95</value>
- </choice>
- </define>
- <define name="CT_Shd">
- <attribute name="val">
- <ref name="ST_Shd"/>
- </attribute>
- <attribute name="color">
- <ref name="ST_HexColor"/>
- </attribute>
- <attribute name="themeColor">
- <ref name="ST_ThemeColor"/>
- </attribute>
- <attribute name="themeTint">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <attribute name="themeShade">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <attribute name="fill">
- <ref name="ST_HexColor"/>
- </attribute>
- <attribute name="themeFill">
- <ref name="ST_ThemeColor"/>
- </attribute>
- <attribute name="themeFillTint">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <attribute name="themeFillShade">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- </define>
- <define name="CT_VerticalAlignRun">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_FitText">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- <attribute name="id">
- <data type="string"/>
- </attribute>
- </define>
- <define name="ST_Em">
- <choice>
- <!-- No Emphasis Mark -->
- <value>none</value>
- <!-- Dot Emphasis Mark Above Characters -->
- <value>dot</value>
- <!-- Comma Emphasis Mark Above Characters -->
- <value>comma</value>
- <!-- Circle Emphasis Mark Above Characters -->
- <value>circle</value>
- <!-- Dot Emphasis Mark Below Characters -->
- <value>underDot</value>
- </choice>
- </define>
- <define name="CT_Em">
- <attribute name="val">
- <ref name="ST_Em"/>
- </attribute>
- </define>
- <define name="CT_Language">
- <attribute name="val">
- <ref name="ST_Lang"/>
- </attribute>
- <attribute name="eastAsia">
- <ref name="ST_Lang"/>
- </attribute>
- <attribute name="bidi">
- <ref name="ST_Lang"/>
- </attribute>
- </define>
- <define name="ST_CombineBrackets">
- <choice>
- <!-- No Enclosing Brackets -->
- <value>none</value>
- <!-- Round Brackets -->
- <value>round</value>
- <!-- Square Brackets -->
- <value>square</value>
- <!-- Angle Brackets -->
- <value>angle</value>
- <!-- Curly Brackets -->
- <value>curly</value>
- </choice>
- </define>
- <define name="CT_EastAsianLayout">
- <attribute name="id">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="combine">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="combineBrackets">
- <ref name="ST_CombineBrackets"/>
- </attribute>
- <attribute name="vert">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="vertCompress">
- <ref name="ST_OnOff"/>
- </attribute>
- </define>
- <define name="ST_XAlign">
- <choice>
- <!-- Left Aligned Horizontally -->
- <value>left</value>
- <!-- Centered Horizontally -->
- <value>center</value>
- <!-- Right Aligned Horizontally -->
- <value>right</value>
- <!-- Inside -->
- <value>inside</value>
- <!-- Outside -->
- <value>outside</value>
- </choice>
- </define>
- <define name="ST_YAlign">
- <choice>
- <!-- In line With Text -->
- <value>inline</value>
- <!-- Top -->
- <value>top</value>
- <!-- Centered Vertically -->
- <value>center</value>
- <!-- Bottom -->
- <value>bottom</value>
- <!-- Inside Anchor Extents -->
- <value>inside</value>
- <!-- Outside Anchor Extents -->
- <value>outside</value>
- </choice>
- </define>
- <define name="ST_HeightRule">
- <choice>
- <!-- Determine Height Based On Contents -->
- <value>auto</value>
- <!-- Exact Height -->
- <value>exact</value>
- <!-- Minimum Height -->
- <value>atLeast</value>
- </choice>
- </define>
- <define name="ST_Wrap">
- <choice>
- <!-- Default Text Wrapping Around Frame -->
- <value>auto</value>
- <!-- No Text Wrapping Beside Frame -->
- <value>notBeside</value>
- <!-- Allow Text Wrapping Around Frame -->
- <value>around</value>
- <!-- Tight Text Wrapping Around Frame -->
- <value>tight</value>
- <!-- Through Text Wrapping Around Frame -->
- <value>through</value>
- <!-- No Text Wrapping Around Frame -->
- <value>none</value>
- </choice>
- </define>
- <define name="ST_VAnchor">
- <choice>
- <!-- Relative To Vertical Text Extents -->
- <value>text</value>
- <!-- Relative To Margin -->
- <value>margin</value>
- <!-- Relative To Page -->
- <value>page</value>
- </choice>
- </define>
- <define name="ST_HAnchor">
- <choice>
- <!-- Relative to Text Extents -->
- <value>text</value>
- <!-- Relative To Margin -->
- <value>margin</value>
- <!-- Relative to Page -->
- <value>page</value>
- </choice>
- </define>
- <define name="ST_DropCap">
- <choice>
- <!-- Not Drop Cap -->
- <value>none</value>
- <!-- Drop Cap Inside Margin -->
- <value>drop</value>
- <!-- Drop Cap Outside Margin -->
- <value>margin</value>
- </choice>
- </define>
- <define name="CT_FramePr">
- <attribute name="dropCap">
- <ref name="ST_DropCap"/>
- </attribute>
- <attribute name="lines">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="w">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="h">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="vSpace">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="hSpace">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="wrap">
- <ref name="ST_Wrap"/>
- </attribute>
- <attribute name="hAnchor">
- <ref name="ST_HAnchor"/>
- </attribute>
- <attribute name="vAnchor">
- <ref name="ST_VAnchor"/>
- </attribute>
- <attribute name="x">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- <attribute name="xAlign">
- <ref name="ST_XAlign"/>
- </attribute>
- <attribute name="y">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- <attribute name="yAlign">
- <ref name="ST_YAlign"/>
- </attribute>
- <attribute name="hRule">
- <ref name="ST_HeightRule"/>
- </attribute>
- <attribute name="anchorLock">
- <ref name="ST_OnOff"/>
- </attribute>
- </define>
- <define name="ST_TabJc">
- <choice>
- <!-- No Tab Stop -->
- <value>clear</value>
- <!-- Leading Tab -->
- <value>start</value>
- <!-- Left Tab (ecma) -->
- <value>left</value>
- <!-- Centered Tab -->
- <value>center</value>
- <!-- Trailing Tab -->
- <value>end</value>
- <!-- Right Tab (ecma) -->
- <value>right</value>
- <!-- Decimal Tab -->
- <value>decimal</value>
- <!-- Bar Tab -->
- <value>bar</value>
- <!-- List Tab -->
- <value>num</value>
- </choice>
- </define>
- <define name="ST_TabTlc">
- <choice>
- <!-- No tab stop leader -->
- <value>none</value>
- <!-- Dotted leader line -->
- <value>dot</value>
- <!-- Dashed tab stop leader line -->
- <value>hyphen</value>
- <!-- Solid leader line -->
- <value>underscore</value>
- <!-- Heavy solid leader line -->
- <value>heavy</value>
- <!-- Middle dot leader line -->
- <value>middleDot</value>
- </choice>
- </define>
- <define name="CT_TabStop">
- <attribute name="val">
- <ref name="ST_TabJc"/>
- </attribute>
- <attribute name="leader">
- <ref name="ST_TabTlc"/>
- </attribute>
- <attribute name="pos">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- </define>
- <define name="ST_LineSpacingRule">
- <choice>
- <!-- Automatically Determined Line Height -->
- <value>auto</value>
- <!-- Exact Line Height -->
- <value>exact</value>
- <!-- Minimum Line Height -->
- <value>atLeast</value>
- </choice>
- </define>
- <define name="CT_Spacing">
- <attribute name="before">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="beforeLines">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="beforeAutospacing">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="after">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="afterLines">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="afterAutospacing">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="line">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- <attribute name="lineRule">
- <ref name="ST_LineSpacingRule"/>
- </attribute>
- </define>
- <define name="CT_Ind">
- <attribute name="end">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- <attribute name="endChars">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="start">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- <attribute name="startChars">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="left">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- <attribute name="leftChars">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="right">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- <attribute name="rightChars">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="hanging">
- <ref name="ST_TwipsMeasure_asSigned"/>
- </attribute>
- <attribute name="hangingChars">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="firstLine">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="firstLineChars">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- </define>
- <define name="ST_Jc">
- <choice>
- <!-- Align To Leading Edge -->
- <value>start</value>
- <!-- Align To Trailing Edge -->
- <value>end</value>
- <!-- Align Left (ecma) -->
- <value>left</value>
- <!-- Align Center -->
- <value>center</value>
- <!-- Align Right (ecma) -->
- <value>right</value>
- <!-- Justified -->
- <value>both</value>
- <!-- Medium Kashida Length -->
- <value>mediumKashida</value>
- <!-- Distribute All Characters Equally -->
- <value>distribute</value>
- <!-- Align to List Tab -->
- <value>numTab</value>
- <!-- Widest Kashida Length -->
- <value>highKashida</value>
- <!-- Low Kashida Length -->
- <value>lowKashida</value>
- <!-- Thai Language Justification -->
- <value>thaiDistribute</value>
- </choice>
- </define>
- <define name="CT_Jc">
- <attribute name="val">
- <ref name="ST_Jc"/>
- </attribute>
- </define>
- <define name="ST_View">
- <choice>
- <!-- Default View -->
- <value>none</value>
- <!-- Print Layout View -->
- <value>print</value>
- <!-- Outline View -->
- <value>outline</value>
- <!-- Master Document View -->
- <value>masterPages</value>
- <!-- Draft View -->
- <value>normal</value>
- <!-- Web Page View -->
- <value>web</value>
- </choice>
- </define>
- <define name="CT_View">
- <attribute name="val">
- <ref name="ST_View"/>
- </attribute>
- </define>
- <define name="ST_Zoom">
- <choice>
- <!-- No Preset Magnification -->
- <value>none</value>
- <!-- Display One Full Page -->
- <value>fullPage</value>
- <!-- Display Page Width -->
- <value>bestFit</value>
- <!-- Display Text Width -->
- <value>textFit</value>
- </choice>
- </define>
- <define name="ST_Percentage">
- <data type="int"/>
- </define>
- <define name="CT_Zoom">
- <attribute name="val">
- <ref name="ST_Zoom"/>
- </attribute>
- <attribute name="percent">
- <ref name="ST_Percentage"/>
- </attribute>
- </define>
- <define name="CT_WritingStyle">
- <attribute name="lang">
- <data type="string"/>
- </attribute>
- <attribute name="vendorID">
- <data type="string"/>
- </attribute>
- <attribute name="dllVersion">
- <data type="string"/>
- </attribute>
- <attribute name="nlCheck">
- <data type="string"/>
- </attribute>
- <attribute name="checkStyle">
- <data type="string"/>
- </attribute>
- <attribute name="appName">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Proof">
- <attribute name="spelling">
- <data type="string"/>
- </attribute>
- <attribute name="grammar">
- <data type="string"/>
- </attribute>
- </define>
- <define name="ST_DocType">
- <choice>
- <!-- Default Document -->
- <value>notSpecified</value>
- <!-- Letter -->
- <value>letter</value>
- <!-- E-Mail Message -->
- <value>eMail</value>
- </choice>
- </define>
- <define name="CT_DocType">
- <attribute name="val">
- <ref name="ST_DocType"/>
- </attribute>
- </define>
- <define name="ST_DocProtect">
- <choice>
- <!-- No Editing Restrictions -->
- <value>none</value>
- <!-- Allow No Editing -->
- <value>readOnly</value>
- <!-- Allow Editing of Comments -->
- <value>comments</value>
- <!-- Allow Editing With Revision Tracking -->
- <value>trackedChanges</value>
- <!-- Allow Editing of Form Fields -->
- <value>forms</value>
- </choice>
- </define>
- <define name="ST_CryptProv">
- <choice>
- <!-- AES Provider -->
- <value>rsaAES</value>
- <!-- Any Provider -->
- <value>rsaFull</value>
- </choice>
- </define>
- <define name="ST_AlgClass">
- <choice>
- <!-- Hashing -->
- <value>hash</value>
- </choice>
- </define>
- <define name="ST_AlgType">
- <choice>
- <!-- Any Type -->
- <value>typeAny</value>
- </choice>
- </define>
- <define name="AG_Password">
- <attribute name="cryptProviderType">
- <ref name="ST_CryptProv"/>
- </attribute>
- <attribute name="cryptAlgorithmClass">
- <ref name="ST_AlgClass"/>
- </attribute>
- <attribute name="cryptAlgorithmType">
- <ref name="ST_AlgType"/>
- </attribute>
- <attribute name="cryptAlgorithmSid">
- <data type="string"/>
- </attribute>
- <attribute name="cryptSpinCount">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="cryptProvider">
- <data type="string"/>
- </attribute>
- <attribute name="algIdExt">
- <data type="string"/>
- </attribute>
- <attribute name="algIdExtSource">
- <data type="string"/>
- </attribute>
- <attribute name="cryptProviderTypeExt">
- <data type="string"/>
- </attribute>
- <attribute name="cryptProviderTypeExtSource">
- <data type="string"/>
- </attribute>
- <attribute name="hash">
- <data type="base64Binary"/>
- </attribute>
- <attribute name="salt">
- <data type="base64Binary"/>
- </attribute>
- </define>
- <define name="CT_DocProtect">
- <attribute name="edit">
- <ref name="ST_DocProtect"/>
- </attribute>
- <attribute name="formatting">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="enforcement">
- <ref name="ST_OnOff"/>
- </attribute>
- <ref name="AG_Password"/>
- </define>
- <define name="CT_MailMergeDocType">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_MailMergeDataType">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_MailMergeDest">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_MailMergeOdsoFMDFieldType">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_TrackChangesView">
- <attribute name="markup">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="comments">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="insDel">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="formatting">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="inkAnnotations">
- <ref name="ST_OnOff"/>
- </attribute>
- </define>
- <define name="CT_Kinsoku">
- <attribute name="lang">
- <ref name="ST_Lang"/>
- </attribute>
- <attribute name="val">
- <ref name="ST_String"/>
- </attribute>
- </define>
- <define name="ST_TextDirection">
- <choice>
- <!-- Left to Right, Top to Bottom -->
- <value>lrTb</value>
- <!-- Top to Bottom, Right to Left -->
- <value>tbRl</value>
- <!-- Bottom to Top, Left to Right -->
- <value>btLr</value>
- <!-- Left to Right, Top to Bottom Rotated -->
- <value>lrTbV</value>
- <!-- Top to Bottom, Right to Left Rotated -->
- <value>tbRlV</value>
- <!-- Top to Bottom, Left to Right Rotated -->
- <value>tbLrV</value>
- </choice>
- </define>
- <define name="CT_TextDirection">
- <attribute name="val">
- <ref name="ST_TextDirection"/>
- </attribute>
- </define>
- <define name="ST_TextAlignment">
- <choice>
- <!-- Align Text at Top -->
- <value>top</value>
- <!-- Align Text at Center -->
- <value>center</value>
- <!-- Align Text at Baseline -->
- <value>baseline</value>
- <!-- Align Text at Bottom -->
- <value>bottom</value>
- <!-- Automatically Determine Alignment -->
- <value>auto</value>
- </choice>
- </define>
- <define name="CT_TextAlignment">
- <attribute name="val">
- <ref name="ST_TextAlignment"/>
- </attribute>
- </define>
- <define name="ST_DisplacedByCustomXml">
- <choice>
- <!-- Displaced by Next Custom XML Markup Tag -->
- <value>next</value>
- <!-- Displaced by Previous Custom XML Markup Tag -->
- <value>prev</value>
- </choice>
- </define>
- <define name="ST_AnnotationVMerge">
- <choice>
- <!-- Vertically Merged Cell -->
- <value>cont</value>
- <!-- Vertically Split Cell -->
- <value>rest</value>
- </choice>
- </define>
- <define name="CT_Markup">
- <attribute name="id">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- </define>
- <define name="CT_TrackChange">
- <ref name="CT_Markup"/>
- <attribute name="author">
- <ref name="ST_String"/>
- </attribute>
- <attribute name="date">
- <ref name="ST_DateTime"/>
- </attribute>
- </define>
- <define name="CT_CellMergeTrackChange">
- <ref name="CT_TrackChange"/>
- <attribute name="vMerge">
- <ref name="ST_AnnotationVMerge"/>
- </attribute>
- <attribute name="vMergeOrig">
- <ref name="ST_AnnotationVMerge"/>
- </attribute>
- </define>
- <define name="CT_TrackChangeRange">
- <ref name="CT_TrackChange"/>
- <attribute name="displacedByCustomXml">
- <ref name="ST_DisplacedByCustomXml"/>
- </attribute>
- </define>
- <define name="CT_MarkupRange">
- <ref name="CT_Markup"/>
- <attribute name="displacedByCustomXml">
- <ref name="ST_DisplacedByCustomXml"/>
- </attribute>
- </define>
- <define name="CT_MarkupRangeBookmark">
- <attribute name="id">
- <data type="string"/>
- </attribute>
- <ref name="CT_MarkupRange"/>
- </define>
- <define name="CT_MarkupRangePerm">
- <ref name="CT_MarkupRange"/>
- </define>
- <define name="CT_MarkupRangeCommentStart">
- <ref name="CT_Markup"/>
- </define>
- <define name="CT_MarkupRangeCommentEnd">
- <ref name="CT_Markup"/>
- </define>
- <define name="CT_BookmarkRange">
- <ref name="CT_MarkupRangeBookmark"/>
- <attribute name="colFirst">
- <data type="string"/>
- </attribute>
- <attribute name="colLast">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Bookmark">
- <ref name="CT_BookmarkRange"/>
- <attribute name="name">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_MoveBookmark">
- <ref name="CT_Bookmark"/>
- <attribute name="author">
- <data type="string"/>
- </attribute>
- <attribute name="date">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Comment">
- <attribute name="id">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <ref name="CT_TrackChange"/>
- <ref name="EG_BlockLevelElts"/>
- <attribute name="initials">
- <ref name="ST_String"/>
- </attribute>
- </define>
- <define name="CT_PermStart">
- <ref name="CT_MarkupRangePerm"/>
- <attribute name="ed">
- <data type="string"/>
- </attribute>
- <attribute name="edGrp">
- <data type="string"/>
- </attribute>
- <attribute name="colFirst">
- <data type="ST_DecimalNumber"/>
- </attribute>
- <attribute name="colLast">
- <data type="ST_DecimalNumber"/>
- </attribute>
- </define>
- <define name="CT_PermEnd">
- <ref name="CT_MarkupRangePerm"/>
- </define>
- <define name="CT_TrackChangeNumbering">
- <ref name="CT_TrackChange"/>
- <attribute name="original">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_TblPrExChange">
- <ref name="CT_TrackChange"/>
- <element name="tblPrEx">
- <ref name="CT_TblPrExBase"/>
- </element>
- </define>
- <define name="CT_TcPrChange">
- <ref name="CT_TrackChange"/>
- <element name="tcPr">
- <ref name="CT_TcPrInner"/>
- </element>
- </define>
- <define name="CT_TrPrChange">
- <ref name="CT_TrackChange"/>
- <element name="trPr">
- <ref name="CT_TrPrBase"/>
- </element>
- </define>
- <define name="CT_TblGridChange">
- <ref name="CT_Markup"/>
- <element name="tblGrid">
- <ref name="CT_TblGridBase"/>
- </element>
- </define>
- <define name="CT_TblPrChange">
- <ref name="CT_TrackChange"/>
- <element name="tblPr">
- <ref name="CT_TblPrBase"/>
- </element>
- </define>
- <define name="CT_SectPrChange">
- <ref name="CT_TrackChange"/>
- <element name="sectPr">
- <ref name="CT_SectPrBase"/>
- </element>
- </define>
- <define name="CT_PPrChange">
- <ref name="CT_TrackChange"/>
- <element name="pPr">
- <ref name="CT_PPrBase"/>
- </element>
- </define>
- <define name="CT_RPrChange">
- <ref name="CT_TrackChange"/>
- <element name="rPr">
- <ref name="CT_RPrOriginal"/>
- </element>
- </define>
- <define name="CT_ParaRPrChange">
- <ref name="CT_TrackChange"/>
- <element name="rPr">
- <ref name="CT_ParaRPrOriginal"/>
- </element>
- </define>
- <define name="CT_RunTrackChange">
- <ref name="CT_TrackChange"/>
- <choice>
- <ref name="EG_ContentRunContent"/>
- <ref name="EG_OMathMathElements"/>
- </choice>
- </define>
- <define name="EG_CellMarkupElements">
- <choice>
- <element name="cellIns">
- <ref name="CT_TrackChange"/>
- </element>
- <element name="cellDel">
- <ref name="CT_TrackChange"/>
- </element>
- <element name="cellMerge">
- <ref name="CT_CellMergeTrackChange"/>
- </element>
- </choice>
- </define>
- <define name="EG_RangeMarkupElements">
- <choice>
- <element name="bookmarkStart">
- <ref name="CT_Bookmark"/>
- </element>
- <element name="bookmarkEnd">
- <ref name="CT_MarkupRangeBookmark"/>
- </element>
- <element name="permStart">
- <ref name="CT_PermStart"/>
- </element>
- <element name="permEnd">
- <ref name="CT_PermEnd"/>
- </element>
- <element name="moveFromRangeStart">
- <ref name="CT_MoveBookmark"/>
- </element>
- <element name="moveFromRangeEnd">
- <ref name="CT_MarkupRangeBookmark"/>
- </element>
- <element name="moveToRangeStart">
- <ref name="CT_MoveBookmark"/>
- </element>
- <element name="moveToRangeEnd">
- <ref name="CT_MarkupRangeBookmark"/>
- </element>
- <element name="commentRangeStart">
- <ref name="CT_MarkupRangeCommentStart"/>
- </element>
- <element name="commentRangeEnd">
- <ref name="CT_MarkupRangeCommentEnd"/>
- </element>
- <element name="customXmlInsRangeStart">
- <ref name="CT_TrackChange"/>
- </element>
- <element name="customXmlInsRangeEnd">
- <ref name="CT_Markup"/>
- </element>
- <element name="customXmlDelRangeStart">
- <ref name="CT_TrackChange"/>
- </element>
- <element name="customXmlDelRangeEnd">
- <ref name="CT_Markup"/>
- </element>
- <element name="customXmlMoveFromRangeStart">
- <ref name="CT_TrackChange"/>
- </element>
- <element name="customXmlMoveFromRangeEnd">
- <ref name="CT_Markup"/>
- </element>
- <element name="customXmlMoveToRangeStart">
- <ref name="CT_TrackChange"/>
- </element>
- <element name="customXmlMoveToRangeEnd">
- <ref name="CT_Markup"/>
- </element>
- </choice>
- </define>
- <define name="CT_NumPr">
- <element name="ilvl">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="numId">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="numberingChange">
- <ref name="CT_TrackChangeNumbering"/>
- </element>
- <element name="ins">
- <ref name="CT_TrackChange"/>
- </element>
- </define>
- <define name="CT_PBdr">
- <element name="top">
- <ref name="CT_Border"/>
- </element>
- <element name="left">
- <ref name="CT_Border"/>
- </element>
- <element name="bottom">
- <ref name="CT_Border"/>
- </element>
- <element name="right">
- <ref name="CT_Border"/>
- </element>
- <element name="between">
- <ref name="CT_Border"/>
- </element>
- <element name="bar">
- <ref name="CT_Border"/>
- </element>
- </define>
- <define name="CT_Tabs">
- <element name="tab">
- <ref name="CT_TabStop"/>
- </element>
- </define>
- <define name="CT_TextboxTightWrap">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_PPrBase">
- <element name="pStyle">
- <ref name="CT_String"/>
- </element>
- <element name="keepNext">
- <ref name="CT_OnOff"/>
- </element>
- <element name="keepLines">
- <ref name="CT_OnOff"/>
- </element>
- <element name="pageBreakBefore">
- <ref name="CT_OnOff"/>
- </element>
- <element name="framePr">
- <ref name="CT_FramePr"/>
- </element>
- <element name="widowControl">
- <ref name="CT_OnOff"/>
- </element>
- <element name="numPr">
- <ref name="CT_NumPr"/>
- </element>
- <element name="suppressLineNumbers">
- <ref name="CT_OnOff"/>
- </element>
- <element name="pBdr">
- <ref name="CT_PBdr"/>
- </element>
- <element name="shd">
- <ref name="CT_Shd"/>
- </element>
- <element name="tabs">
- <ref name="CT_Tabs"/>
- </element>
- <element name="suppressAutoHyphens">
- <ref name="CT_OnOff"/>
- </element>
- <element name="kinsoku">
- <ref name="CT_OnOff"/>
- </element>
- <element name="wordWrap">
- <ref name="CT_OnOff"/>
- </element>
- <element name="overflowPunct">
- <ref name="CT_OnOff"/>
- </element>
- <element name="topLinePunct">
- <ref name="CT_OnOff"/>
- </element>
- <element name="autoSpaceDE">
- <ref name="CT_OnOff"/>
- </element>
- <element name="autoSpaceDN">
- <ref name="CT_OnOff"/>
- </element>
- <element name="bidi">
- <ref name="CT_OnOff"/>
- </element>
- <element name="adjustRightInd">
- <ref name="CT_OnOff"/>
- </element>
- <element name="snapToGrid">
- <ref name="CT_OnOff"/>
- </element>
- <element name="spacing">
- <ref name="CT_Spacing"/>
- </element>
- <element name="ind">
- <ref name="CT_Ind"/>
- </element>
- <element name="contextualSpacing">
- <ref name="CT_OnOff"/>
- </element>
- <element name="mirrorIndents">
- <ref name="CT_OnOff"/>
- </element>
- <element name="suppressOverlap">
- <ref name="CT_OnOff"/>
- </element>
- <element name="jc">
- <ref name="CT_Jc"/>
- </element>
- <element name="textDirection">
- <ref name="CT_TextDirection"/>
- </element>
- <element name="textAlignment">
- <ref name="CT_TextAlignment"/>
- </element>
- <element name="textboxTightWrap">
- <ref name="CT_TextboxTightWrap"/>
- </element>
- <element name="outlineLvl">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="divId">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="cnfStyle">
- <ref name="CT_Cnf"/>
- </element>
- </define>
- <define name="CT_PPr">
- <ref name="CT_PPrBase"/>
- <element name="rPr">
- <ref name="CT_ParaRPr"/>
- </element>
- <element name="sectPr">
- <ref name="CT_SectPr"/>
- </element>
- <element name="pPrChange">
- <ref name="CT_PPrChange"/>
- </element>
- </define>
- <define name="CT_Background">
- <ref name="CT_PictureBase"/>
- <attribute name="color">
- <ref name="ST_HexColor"/>
- </attribute>
- <attribute name="themeColor">
- <ref name="ST_ThemeColor"/>
- </attribute>
- <attribute name="themeTint">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <attribute name="themeShade">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <element name="v:background">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- </define>
- <define name="CT_Rel">
- <attribute name="r:id">
- <ref name="ST_String"/>
- </attribute>
- </define>
- <define name="CT_PictureBase">
- <element>
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- </define>
- <define name="CT_Object">
- <ref name="CT_PictureBase"/>
- <attribute name="dxaOrig">
- <data type="string"/>
- </attribute>
- <attribute name="dyaOrig">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Picture">
- <ref name="CT_PictureBase"/>
- <element name="movie">
- <ref name="CT_Rel"/>
- </element>
- </define>
- <define name="CT_Drawing">
- <choice>
- <ref name="anchor"/>
- <ref name="inline"/>
- </choice>
- </define>
- <define name="CT_SimpleField">
- <element name="fldData">
- <ref name="CT_FLDData"/>
- </element>
- <ref name="EG_PContent"/>
- <attribute name="instr">
- <data type="string"/>
- </attribute>
- <attribute name="fldLock">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="dirty">
- <data type="string"/>
- </attribute>
- </define>
- <define name="ST_FldCharType">
- <choice>
- <!-- Start Character -->
- <value>begin</value>
- <!-- Separator Character -->
- <value>separate</value>
- <!-- End Character -->
- <value>end</value>
- </choice>
- </define>
- <define name="ST_InfoTextType">
- <choice>
- <!-- Literal Text -->
- <value>text</value>
- <!-- Glossary Document Entry -->
- <value>autoText</value>
- </choice>
- </define>
- <define name="ST_FFName">
- <data type="string"/>
- </define>
- <define name="CT_FFTextType">
- <attribute name="val">
- <ref name="ST_FFName"/>
- </attribute>
- </define>
- <define name="CT_FFName">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_FldChar">
- <choice>
- <element name="fldData">
- <ref name="CT_FLDData"/>
- </element>
- <element name="ffData">
- <ref name="CT_FFData"/>
- </element>
- <element name="numberingChange">
- <ref name="CT_TrackChangeNumbering"/>
- </element>
- </choice>
- <attribute name="fldCharType">
- <ref name="ST_FldCharType"/>
- </attribute>
- <attribute name="fldLock">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="dirty">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Hyperlink">
- <ref name="EG_PContent"/>
- <attribute name="tgtFrame">
- <data type="string"/>
- </attribute>
- <attribute name="tooltip">
- <data type="string"/>
- </attribute>
- <attribute name="docLocation">
- <data type="string"/>
- </attribute>
- <attribute name="history">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="anchor">
- <data type="string"/>
- </attribute>
- <attribute name="r:id">
- <ref name="ST_String"/>
- </attribute>
- </define>
- <define name="CT_FLDData">
- <ref name="ST_String"/>
- </define>
- <define name="CT_FFData">
- <choice>
- <element name="name">
- <ref name="CT_FFName"/>
- </element>
- <element name="enabled">
- <ref name="CT_OnOff"/>
- </element>
- <element name="calcOnExit">
- <ref name="CT_OnOff"/>
- </element>
- <element name="entryMacro">
- <ref name="CT_MacroName"/>
- </element>
- <element name="exitMacro">
- <ref name="CT_MacroName"/>
- </element>
- <element name="helpText">
- <ref name="CT_FFHelpText"/>
- </element>
- <element name="statusText">
- <ref name="CT_FFStatusText"/>
- </element>
- <element name="checkBox">
- <ref name="CT_FFCheckBox"/>
- </element>
- <element name="ddList">
- <ref name="CT_FFDDList"/>
- </element>
- <element name="textInput">
- <ref name="CT_FFTextInput"/>
- </element>
- </choice>
- </define>
- <define name="CT_FFHelpText">
- <attribute name="type">
- <ref name="ST_InfoTextType"/>
- </attribute>
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_FFStatusText">
- <attribute name="type">
- <ref name="ST_InfoTextType"/>
- </attribute>
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_FFCheckBox">
- <choice>
- <element name="size">
- <ref name="CT_HpsMeasure"/>
- </element>
- <element name="sizeAuto">
- <ref name="CT_OnOff"/>
- </element>
- </choice>
- <element name="default">
- <ref name="CT_OnOff"/>
- </element>
- <element name="checked">
- <ref name="CT_OnOff"/>
- </element>
- </define>
- <define name="CT_FFDDList">
- <element name="result">
- <ref name="CT_String"/>
- </element>
- <element name="default">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="listEntry">
- <ref name="CT_String"/>
- </element>
- </define>
- <define name="CT_FFTextInput">
- <element name="type">
- <ref name="CT_FFTextType"/>
- </element>
- <element name="default">
- <ref name="CT_String"/>
- </element>
- <element name="maxLength">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="format">
- <ref name="CT_String"/>
- </element>
- </define>
- <define name="ST_SectionMark">
- <choice>
- <!-- Next Page Section Break -->
- <value>nextPage</value>
- <!-- Column Section Break -->
- <value>nextColumn</value>
- <!-- Continuous Section Break -->
- <value>continuous</value>
- <!-- Even Page Section Break -->
- <value>evenPage</value>
- <!-- Odd Page Section Break -->
- <value>oddPage</value>
- </choice>
- </define>
- <define name="CT_SectType">
- <attribute name="val">
- <ref name="ST_SectionMark"/>
- </attribute>
- </define>
- <define name="CT_PaperSource">
- <attribute name="first">
- <data type="string"/>
- </attribute>
- <attribute name="other">
- <data type="string"/>
- </attribute>
- </define>
- <define name="ST_NumberFormat">
- <choice>
- <!-- Decimal Numbers -->
- <value>decimal</value>
- <!-- Uppercase Roman Numerals -->
- <value>upperRoman</value>
- <!-- Lowercase Roman Numerals -->
- <value>lowerRoman</value>
- <!-- Uppercase Latin Alphabet -->
- <value>upperLetter</value>
- <!-- Lowercase Latin Alphabet -->
- <value>lowerLetter</value>
- <!-- Ordinal -->
- <value>ordinal</value>
- <!-- Cardinal Text -->
- <value>cardinalText</value>
- <!-- Ordinal Text -->
- <value>ordinalText</value>
- <!-- Hexadecimal Numbering -->
- <value>hex</value>
- <!-- Chicago Manual of Style -->
- <value>chicago</value>
- <!-- Ideographs -->
- <value>ideographDigital</value>
- <!-- Japanese Counting System -->
- <value>japaneseCounting</value>
- <!-- AIUEO Order Hiragana -->
- <value>aiueo</value>
- <!-- Iroha Ordered Katakana -->
- <value>iroha</value>
- <!-- Double Byte Arabic Numerals -->
- <value>decimalFullWidth</value>
- <!-- Single Byte Arabic Numerals -->
- <value>decimalHalfWidth</value>
- <!-- Japanese Legal Numbering -->
- <value>japaneseLegal</value>
- <!-- Japanese Digital Ten Thousand Counting System -->
- <value>japaneseDigitalTenThousand</value>
- <!-- Decimal Numbers Enclosed in a Circle -->
- <value>decimalEnclosedCircle</value>
- <!-- Double Byte Arabic Numerals Alternate -->
- <value>decimalFullWidth2</value>
- <!-- Full-Width AIUEO Order Hiragana -->
- <value>aiueoFullWidth</value>
- <!-- Full-Width Iroha Ordered Katakana -->
- <value>irohaFullWidth</value>
- <!-- Initial Zero Arabic Numerals -->
- <value>decimalZero</value>
- <!-- Bullet -->
- <value>bullet</value>
- <!-- Korean Ganada Numbering -->
- <value>ganada</value>
- <!-- Korean Chosung Numbering -->
- <value>chosung</value>
- <!-- Decimal Numbers Followed by a Period -->
- <value>decimalEnclosedFullstop</value>
- <!-- Decimal Numbers Enclosed in Parenthesis -->
- <value>decimalEnclosedParen</value>
- <!-- Decimal Numbers Enclosed in a Circle -->
- <value>decimalEnclosedCircleChinese</value>
- <!-- Ideographs Enclosed in a Circle -->
- <value>ideographEnclosedCircle</value>
- <!-- Traditional Ideograph Format -->
- <value>ideographTraditional</value>
- <!-- Zodiac Ideograph Format -->
- <value>ideographZodiac</value>
- <!-- Traditional Zodiac Ideograph Format -->
- <value>ideographZodiacTraditional</value>
- <!-- Taiwanese Counting System -->
- <value>taiwaneseCounting</value>
- <!-- Traditional Legal Ideograph Format -->
- <value>ideographLegalTraditional</value>
- <!-- Taiwanese Counting Thousand System -->
- <value>taiwaneseCountingThousand</value>
- <!-- Taiwanese Digital Counting System -->
- <value>taiwaneseDigital</value>
- <!-- Chinese Counting System -->
- <value>chineseCounting</value>
- <!-- Chinese Legal Simplified Format -->
- <value>chineseLegalSimplified</value>
- <!-- Chinese Counting Thousand System -->
- <value>chineseCountingThousand</value>
- <!-- Korean Digital Counting System -->
- <value>koreanDigital</value>
- <!-- Korean Counting System -->
- <value>koreanCounting</value>
- <!-- Korean Legal Numbering -->
- <value>koreanLegal</value>
- <!-- Korean Digital Counting System Alternate -->
- <value>koreanDigital2</value>
- <!-- Vietnamese Numerals -->
- <value>vietnameseCounting</value>
- <!-- Lowercase Russian Alphabet -->
- <value>russianLower</value>
- <!-- Uppercase Russian Alphabet -->
- <value>russianUpper</value>
- <!-- No Numbering -->
- <value>none</value>
- <!-- Number With Dashes -->
- <value>numberInDash</value>
- <!-- Hebrew Numerals -->
- <value>hebrew1</value>
- <!-- Hebrew Alphabet -->
- <value>hebrew2</value>
- <!-- Arabic Alphabet -->
- <value>arabicAlpha</value>
- <!-- Arabic Abjad Numerals -->
- <value>arabicAbjad</value>
- <!-- Hindi Vowels -->
- <value>hindiVowels</value>
- <!-- Hindi Consonants -->
- <value>hindiConsonants</value>
- <!-- Hindi Numbers -->
- <value>hindiNumbers</value>
- <!-- Hindi Counting System -->
- <value>hindiCounting</value>
- <!-- Thai Letters -->
- <value>thaiLetters</value>
- <!-- Thai Numerals -->
- <value>thaiNumbers</value>
- <!-- Thai Counting System -->
- <value>thaiCounting</value>
- <value>custom</value>
- </choice>
- </define>
- <define name="ST_PageOrientation">
- <choice>
- <!-- Portrait Mode -->
- <value>portrait</value>
- <!-- Landscape Mode -->
- <value>landscape</value>
- </choice>
- </define>
- <define name="CT_PageSz">
- <attribute name="w">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="h">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="orient">
- <ref name="ST_PageOrientation"/>
- </attribute>
- <attribute name="code">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- </define>
- <define name="CT_PageMar">
- <attribute name="top">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- <attribute name="right">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="bottom">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- <attribute name="left">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="header">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="footer">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="gutter">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- </define>
- <define name="ST_PageBorderZOrder">
- <choice>
- <!-- Page Border Ahead of Text -->
- <value>front</value>
- <!-- Page Border Behind Text -->
- <value>back</value>
- </choice>
- </define>
- <define name="ST_PageBorderDisplay">
- <choice>
- <!-- Display Page Border on All Pages -->
- <value>allPages</value>
- <!-- Display Page Border on First Page -->
- <value>firstPage</value>
- <!-- Display Page Border on All Pages Except First -->
- <value>notFirstPage</value>
- </choice>
- </define>
- <define name="ST_PageBorderOffset">
- <choice>
- <!-- Page Border Is Positioned Relative to Page Edges -->
- <value>page</value>
- <!-- Page Border Is Positioned Relative to Text Extents -->
- <value>text</value>
- </choice>
- </define>
- <define name="CT_PageBorders">
- <element name="top">
- <ref name="CT_Border"/>
- </element>
- <element name="left">
- <ref name="CT_Border"/>
- </element>
- <element name="bottom">
- <ref name="CT_Border"/>
- </element>
- <element name="right">
- <ref name="CT_Border"/>
- </element>
- <attribute name="zOrder">
- <ref name="ST_PageBorderZOrder"/>
- </attribute>
- <attribute name="display">
- <ref name="ST_PageBorderDisplay"/>
- </attribute>
- <attribute name="offsetFrom">
- <ref name="ST_PageBorderOffset"/>
- </attribute>
- </define>
- <define name="ST_ChapterSep">
- <choice>
- <!-- Hyphen Chapter Separator -->
- <value>hyphen</value>
- <!-- Period Chapter Separator -->
- <value>period</value>
- <!-- Colon Chapter Separator -->
- <value>colon</value>
- <!-- Em Dash Chapter Separator -->
- <value>emDash</value>
- <!-- En Dash Chapter Separator -->
- <value>enDash</value>
- </choice>
- </define>
- <define name="ST_LineNumberRestart">
- <choice>
- <!-- Restart Line Numbering on Each Page -->
- <value>newPage</value>
- <!-- Restart Line Numbering for Each Section -->
- <value>newSection</value>
- <!-- Continue Line Numbering From Previous Section -->
- <value>continuous</value>
- </choice>
- </define>
- <define name="CT_LineNumber">
- <attribute name="countBy">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="start">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="distance">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="restart">
- <ref name="ST_LineNumberRestart"/>
- </attribute>
- </define>
- <define name="CT_PageNumber">
- <attribute name="fmt">
- <ref name="ST_NumberFormat"/>
- </attribute>
- <attribute name="start">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="chapStyle">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="chapSep">
- <ref name="ST_ChapterSep"/>
- </attribute>
- </define>
- <define name="CT_Column">
- <attribute name="w">
- <ref name="ST_TwipsMeasure_asZero"/>
- </attribute>
- <attribute name="space">
- <ref name="ST_TwipsMeasure_asZero"/>
- </attribute>
- </define>
- <define name="CT_Columns">
- <element name="col">
- <ref name="CT_Column"/>
- </element>
- <attribute name="equalWidth">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="space">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- <attribute name="num">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="sep">
- <ref name="ST_OnOff"/>
- </attribute>
- </define>
- <define name="ST_VerticalJc">
- <choice>
- <!-- Align Top -->
- <value>top</value>
- <!-- Align Center -->
- <value>center</value>
- <!-- Vertical Justification -->
- <value>both</value>
- <!-- Align Bottom -->
- <value>bottom</value>
- </choice>
- </define>
- <define name="CT_VerticalJc">
- <attribute name="val">
- <ref name="ST_VerticalJc"/>
- </attribute>
- </define>
- <define name="ST_DocGrid">
- <choice>
- <!-- No Document Grid -->
- <value>default</value>
- <!-- Line Grid Only -->
- <value>lines</value>
- <!-- Line and Character Grid -->
- <value>linesAndChars</value>
- <!-- Character Grid Only -->
- <value>snapToChars</value>
- </choice>
- </define>
- <define name="CT_DocGrid">
- <attribute name="type">
- <ref name="ST_DocGrid"/>
- </attribute>
- <attribute name="linePitch">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="charSpace">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- </define>
- <define name="ST_HdrFtr">
- <choice>
- <!-- Even Numbered Pages Only -->
- <value>even</value>
- <!-- Default Header or Footer -->
- <value>default</value>
- <!-- First Page Only -->
- <value>first</value>
- </choice>
- </define>
- <define name="ST_FtnEdn">
- <choice>
- <!-- Normal Footnote/Endnote -->
- <value>normal</value>
- <!-- Separator -->
- <value>separator</value>
- <!-- Continuation Separator -->
- <value>continuationSeparator</value>
- <!-- Continuation Notice Separator -->
- <value>continuationNotice</value>
- </choice>
- </define>
- <define name="CT_HdrFtrRef">
- <attribute name="type">
- <ref name="ST_HdrFtr"/>
- </attribute>
- <attribute name="r:id">
- <ref name="ST_String"/>
- </attribute>
- </define>
- <define name="EG_HdrFtrReferences">
- <choice>
- <element name="headerReference">
- <ref name="CT_HdrFtrRef"/>
- </element>
- <element name="footerReference">
- <ref name="CT_HdrFtrRef"/>
- </element>
- </choice>
- </define>
- <define name="CT_HdrFtr">
- <ref name="EG_BlockLevelElts"/>
- </define>
- <define name="EG_SectPrContents">
- <element name="footnotePr">
- <ref name="CT_FtnProps"/>
- </element>
- <element name="endnotePr">
- <ref name="CT_EdnProps"/>
- </element>
- <element name="type">
- <ref name="CT_SectType"/>
- </element>
- <element name="pgSz">
- <ref name="CT_PageSz"/>
- </element>
- <element name="pgMar">
- <ref name="CT_PageMar"/>
- </element>
- <element name="paperSrc">
- <ref name="CT_PaperSource"/>
- </element>
- <element name="pgBorders">
- <ref name="CT_PageBorders"/>
- </element>
- <element name="lnNumType">
- <ref name="CT_LineNumber"/>
- </element>
- <element name="pgNumType">
- <ref name="CT_PageNumber"/>
- </element>
- <element name="cols">
- <ref name="CT_Columns"/>
- </element>
- <element name="formProt">
- <ref name="CT_OnOff"/>
- </element>
- <element name="vAlign">
- <ref name="CT_VerticalJc"/>
- </element>
- <element name="noEndnote">
- <ref name="CT_OnOff"/>
- </element>
- <element name="titlePg">
- <ref name="CT_OnOff"/>
- </element>
- <element name="textDirection">
- <ref name="CT_TextDirection"/>
- </element>
- <element name="bidi">
- <ref name="CT_OnOff"/>
- </element>
- <element name="rtlGutter">
- <ref name="CT_OnOff"/>
- </element>
- <element name="docGrid">
- <ref name="CT_DocGrid"/>
- </element>
- <element name="printerSettings">
- <ref name="CT_Rel"/>
- </element>
- </define>
- <define name="AG_SectPrAttributes">
- <attribute name="rsidRPr">
- <data type="string"/>
- </attribute>
- <attribute name="rsidDel">
- <data type="string"/>
- </attribute>
- <attribute name="rsidR">
- <data type="string"/>
- </attribute>
- <attribute name="rsidSect">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SectPrBase">
- <ref name="EG_SectPrContents"/>
- <ref name="AG_SectPrAttributes"/>
- </define>
- <define name="CT_SectPr">
- <ref name="EG_HdrFtrReferences"/>
- <ref name="EG_SectPrContents"/>
- <element name="sectPrChange">
- <ref name="CT_SectPrChange"/>
- </element>
- <ref name="AG_SectPrAttributes"/>
- </define>
- <define name="CT_finalSectPr">
- <ref name="EG_HdrFtrReferences"/>
- <ref name="EG_SectPrContents"/>
- <element name="sectPrChange">
- <ref name="CT_SectPrChange"/>
- </element>
- <ref name="AG_SectPrAttributes"/>
- </define>
- <define name="ST_BrType">
- <choice>
- <!-- Page Break -->
- <value>page</value>
- <!-- Column Break -->
- <value>column</value>
- <!-- Line Break -->
- <value>textWrapping</value>
- </choice>
- </define>
- <define name="ST_BrClear">
- <choice>
- <!-- Restart On Next Line -->
- <value>none</value>
- <!-- Restart In Next Text Region When In Leftmost Position -->
- <value>left</value>
- <!-- Restart In Next Text Region When In Rightmost Position -->
- <value>right</value>
- <!-- Restart On Next Full Line -->
- <value>all</value>
- </choice>
- </define>
- <define name="CT_Br">
- <attribute name="type">
- <ref name="ST_BrType"/>
- </attribute>
- <attribute name="clear">
- <ref name="ST_BrClear"/>
- </attribute>
- </define>
- <define name="CT_Br_OutOfOrder">
- <attribute name="type">
- <ref name="ST_BrType"/>
- </attribute>
- <attribute name="clear">
- <ref name="ST_BrClear"/>
- </attribute>
- </define>
- <define name="ST_PTabAlignment">
- <choice>
- <!-- Left -->
- <value>left</value>
- <!-- Center -->
- <value>center</value>
- <!-- Right -->
- <value>right</value>
- </choice>
- </define>
- <define name="ST_PTabRelativeTo">
- <choice>
- <!-- Relative To Text Margins -->
- <value>margin</value>
- <!-- Relative To Indents -->
- <value>indent</value>
- </choice>
- </define>
- <define name="ST_PTabLeader">
- <choice>
- <!-- No Leader Character -->
- <value>none</value>
- <!-- Dot Leader Character -->
- <value>dot</value>
- <!-- Hyphen Leader Character -->
- <value>hyphen</value>
- <!-- Underscore Leader Character -->
- <value>underscore</value>
- <!-- Centered Dot Leader Character -->
- <value>middleDot</value>
- </choice>
- </define>
- <define name="CT_PTab">
- <attribute name="alignment">
- <ref name="ST_PTabAlignment"/>
- </attribute>
- <attribute name="relativeTo">
- <ref name="ST_PTabRelativeTo"/>
- </attribute>
- <attribute name="leader">
- <ref name="ST_PTabLeader"/>
- </attribute>
- </define>
- <define name="CT_Sym">
- <attribute name="font">
- <data type="string"/>
- </attribute>
- <attribute name="char">
- <ref name="ST_ShortHexNumber"/>
- </attribute>
- </define>
- <define name="CT_instrText">
- <ref name="ST_String"/>
- <attribute name="xml:space">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_delText">
- <ref name="ST_String"/>
- <attribute name="xml:space">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_delInstrText">
- <ref name="ST_String"/>
- <attribute name="xml:space">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_ProofErr">
- <attribute name="type">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Text">
- <ref name="ST_String"/>
- <attribute name="xml:space">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_FtnEdnRefChar">
- </define>
- <define name="CT_FtnEdnSep">
- </define>
- <define name="CT_FtnEdnCont">
- </define>
- <define name="CT_PgNum">
- </define>
- <define name="CT_Cr">
- </define>
- <define name="CT_Tab">
- </define>
- <define name="EG_RunInnerContent">
- <choice>
- <element name="br">
- <ref name="CT_Br"/>
- </element>
- <element name="t">
- <ref name="CT_Text"/>
- </element>
- <element name="delText">
- <ref name="CT_delText"/>
- </element>
- <element name="instrText">
- <ref name="CT_instrText"/>
- </element>
- <element name="delInstrText">
- <ref name="CT_delInstrText"/>
- </element>
- <element name="noBreakHyphen">
- <ref name="CT_Empty"/>
- </element>
- <element name="softHyphen">
- <ref name="CT_Empty"/>
- </element>
- <element name="dayShort">
- <ref name="CT_Empty"/>
- </element>
- <element name="monthShort">
- <ref name="CT_Empty"/>
- </element>
- <element name="yearShort">
- <ref name="CT_Empty"/>
- </element>
- <element name="dayLong">
- <ref name="CT_Empty"/>
- </element>
- <element name="monthLong">
- <ref name="CT_Empty"/>
- </element>
- <element name="yearLong">
- <ref name="CT_Empty"/>
- </element>
- <element name="annotationRef">
- <ref name="CT_Empty"/>
- </element>
- <element name="footnoteRef">
- <ref name="CT_FtnEdnRefChar"/>
- </element>
- <element name="endnoteRef">
- <ref name="CT_FtnEdnRefChar"/>
- </element>
- <element name="separator">
- <ref name="CT_FtnEdnSep"/>
- </element>
- <element name="continuationSeparator">
- <ref name="CT_FtnEdnCont"/>
- </element>
- <element name="sym">
- <ref name="CT_Sym"/>
- </element>
- <element name="pgNum">
- <ref name="CT_PgNum"/>
- </element>
- <element name="cr">
- <ref name="CT_Cr"/>
- </element>
- <element name="tab">
- <ref name="CT_Tab"/>
- </element>
- <element name="object">
- <ref name="CT_Object"/>
- </element>
- <element name="pict">
- <ref name="CT_Picture"/>
- </element>
- <element name="fldChar">
- <ref name="CT_FldChar"/>
- </element>
- <element name="ruby">
- <ref name="CT_Ruby"/>
- </element>
- <element name="footnoteReference">
- <ref name="CT_FtnEdnRef"/>
- </element>
- <element name="endnoteReference">
- <ref name="CT_FtnEdnRef"/>
- </element>
- <element name="commentReference">
- <ref name="CT_CommentRef"/>
- </element>
- <element name="drawing">
- <ref name="CT_Drawing"/>
- </element>
- <element name="ptab">
- <ref name="CT_PTab"/>
- </element>
- <element name="lastRenderedPageBreak">
- <ref name="CT_Empty"/>
- </element>
- </choice>
- </define>
- <define name="CT_R">
- <ref name="EG_RPr"/>
- <ref name="EG_RunInnerContent"/>
- <attribute name="rsidRPr">
- <data type="string"/>
- </attribute>
- <attribute name="rsidDel">
- <data type="string"/>
- </attribute>
- <attribute name="rsidR">
- <data type="string"/>
- </attribute>
- </define>
- <define name="ST_Hint">
- <choice>
- <!-- High ANSI Font -->
- <value>default</value>
- <!-- East Asian Font -->
- <value>eastAsia</value>
- <!-- Complex Script Font -->
- <value>cs</value>
- </choice>
- </define>
- <define name="ST_Theme">
- <choice>
- <!-- Major East Asian Theme Font -->
- <value>majorEastAsia</value>
- <!-- Major Complex Script Theme Font -->
- <value>majorBidi</value>
- <!-- Major ASCII Theme Font -->
- <value>majorAscii</value>
- <!-- Major High ANSI Theme Font -->
- <value>majorHAnsi</value>
- <!-- Minor East Asian Theme Font -->
- <value>minorEastAsia</value>
- <!-- Minor Complex Script Theme Font -->
- <value>minorBidi</value>
- <!-- Minor ASCII Theme Font -->
- <value>minorAscii</value>
- <!-- Minor High ANSI Theme Font -->
- <value>minorHAnsi</value>
- </choice>
- </define>
- <define name="CT_Fonts">
- <attribute name="hint">
- <ref name="ST_Hint"/>
- </attribute>
- <attribute name="ascii">
- <ref name="ST_String"/>
- </attribute>
- <attribute name="hAnsi">
- <ref name="ST_String"/>
- </attribute>
- <attribute name="eastAsia">
- <ref name="ST_String"/>
- </attribute>
- <attribute name="cs">
- <ref name="ST_String"/>
- </attribute>
- <attribute name="asciiTheme">
- <ref name="ST_Theme"/>
- </attribute>
- <attribute name="hAnsiTheme">
- <ref name="ST_Theme"/>
- </attribute>
- <attribute name="eastAsiaTheme">
- <ref name="ST_Theme"/>
- </attribute>
- <attribute name="cstheme">
- <ref name="ST_Theme"/>
- </attribute>
- </define>
- <define name="EG_RPrBase">
- <element name="rStyle">
- <ref name="CT_String"/>
- </element>
- <element name="rFonts">
- <ref name="CT_Fonts"/>
- </element>
- <element name="b">
- <ref name="CT_OnOff"/>
- </element>
- <element name="bCs">
- <ref name="CT_OnOff"/>
- </element>
- <element name="i">
- <ref name="CT_OnOff"/>
- </element>
- <element name="iCs">
- <ref name="CT_OnOff"/>
- </element>
- <element name="caps">
- <ref name="CT_OnOff"/>
- </element>
- <element name="smallCaps">
- <ref name="CT_OnOff"/>
- </element>
- <element name="strike">
- <ref name="CT_OnOff"/>
- </element>
- <element name="dstrike">
- <ref name="CT_OnOff"/>
- </element>
- <element name="outline">
- <ref name="CT_OnOff"/>
- </element>
- <element name="shadow">
- <ref name="CT_OnOff"/>
- </element>
- <element name="emboss">
- <ref name="CT_OnOff"/>
- </element>
- <element name="imprint">
- <ref name="CT_OnOff"/>
- </element>
- <element name="noProof">
- <ref name="CT_OnOff"/>
- </element>
- <element name="snapToGrid">
- <ref name="CT_OnOff"/>
- </element>
- <element name="vanish">
- <ref name="CT_OnOff"/>
- </element>
- <element name="webHidden">
- <ref name="CT_OnOff"/>
- </element>
- <element name="color">
- <ref name="CT_Color"/>
- </element>
- <element name="spacing">
- <ref name="CT_SignedTwipsMeasure"/>
- </element>
- <element name="w">
- <ref name="CT_TextScale"/>
- </element>
- <element name="kern">
- <ref name="CT_HpsMeasure"/>
- </element>
- <element name="position">
- <ref name="CT_SignedHpsMeasure"/>
- </element>
- <element name="sz">
- <ref name="CT_HpsMeasure"/>
- </element>
- <element name="szCs">
- <ref name="CT_HpsMeasure"/>
- </element>
- <element name="highlight">
- <ref name="CT_Highlight"/>
- </element>
- <element name="u">
- <ref name="CT_Underline"/>
- </element>
- <element name="effect">
- <ref name="CT_TextEffect"/>
- </element>
- <element name="bdr">
- <ref name="CT_Border"/>
- </element>
- <element name="shd">
- <ref name="CT_Shd"/>
- </element>
- <element name="fitText">
- <ref name="CT_FitText"/>
- </element>
- <element name="vertAlign">
- <ref name="CT_VerticalAlignRun"/>
- </element>
- <element name="rtl">
- <ref name="CT_OnOff"/>
- </element>
- <element name="cs">
- <ref name="CT_OnOff"/>
- </element>
- <element name="em">
- <ref name="CT_Em"/>
- </element>
- <element name="lang">
- <ref name="CT_Language"/>
- </element>
- <element name="eastAsianLayout">
- <ref name="CT_EastAsianLayout"/>
- </element>
- <element name="specVanish">
- <ref name="CT_OnOff"/>
- </element>
- <element name="oMath">
- <ref name="CT_OnOff"/>
- </element>
- <element name="w14:glow">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="w14:shadow">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="w14:reflection">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="w14:textOutline">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="w14:textFill">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="w14:scene3d">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="w14:props3d">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="w14:ligatures">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="w14:numForm">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="w14:numSpacing">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="w14:stylisticSets">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <element name="w14:cntxtAlts">
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- </define>
- <define name="EG_RPrContent">
- <ref name="EG_RPrBase"/>
- <element name="rPrChange">
- <ref name="CT_RPrChange"/>
- </element>
- </define>
- <define name="CT_RPr">
- <ref name="EG_RPrContent"/>
- </define>
- <define name="EG_RPr">
- <element name="rPr">
- <ref name="CT_RPr"/>
- </element>
- </define>
- <define name="EG_RPrMath">
- <choice>
- <ref name="EG_RPr"/>
- <element name="ins">
- <ref name="CT_RPrChange"/>
- </element>
- <element name="del">
- <ref name="CT_RPrChange"/>
- </element>
- </choice>
- </define>
- <define name="CT_RPrOriginal">
- <ref name="EG_RPrBase"/>
- </define>
- <define name="CT_ParaRPrOriginal">
- <ref name="EG_ParaRPrTrackChanges"/>
- <ref name="EG_RPrBase"/>
- </define>
- <define name="CT_ParaRPr">
- <ref name="EG_ParaRPrTrackChanges"/>
- <ref name="EG_RPrBase"/>
- <element name="rPrChange">
- <ref name="CT_ParaRPrChange"/>
- </element>
- </define>
- <define name="CT_ParaTrackChange">
- <ref name="CT_TrackChange"/>
- </define>
- <define name="EG_ParaRPrTrackChanges">
- <element name="ins">
- <ref name="CT_ParaTrackChange"/>
- </element>
- <element name="del">
- <ref name="CT_ParaTrackChange"/>
- </element>
- <element name="moveFrom">
- <ref name="CT_TrackChange"/>
- </element>
- <element name="moveTo">
- <ref name="CT_TrackChange"/>
- </element>
- </define>
- <define name="CT_AltChunk">
- <element name="altChunkPr">
- <ref name="CT_AltChunkPr"/>
- </element>
- <attribute name="r:id">
- <ref name="ST_String"/>
- </attribute>
- </define>
- <define name="CT_AltChunkPr">
- <element name="matchSrc">
- <ref name="CT_OnOff"/>
- </element>
- </define>
- <define name="ST_RubyAlign">
- <choice>
- <value>center</value>
- <value>distributeLetter</value>
- <value>distributeSpace</value>
- <value>left</value>
- <value>right</value>
- <value>rightVertical</value>
- </choice>
- </define>
- <define name="CT_RubyAlign">
- <attribute name="val">
- <ref name="ST_RubyAlign"/>
- </attribute>
- </define>
- <define name="CT_RubyPr">
- <element name="rubyAlign">
- <ref name="CT_RubyAlign"/>
- </element>
- <element name="hps">
- <ref name="CT_HpsMeasure"/>
- </element>
- <element name="hpsRaise">
- <ref name="CT_HpsMeasure"/>
- </element>
- <element name="hpsBaseText">
- <ref name="CT_HpsMeasure"/>
- </element>
- <element name="lid">
- <ref name="CT_Lang"/>
- </element>
- <element name="dirty">
- <ref name="CT_OnOff"/>
- </element>
- </define>
- <define name="EG_RubyContent">
- <choice>
- <element name="r">
- <ref name="CT_R"/>
- </element>
- <ref name="EG_RunLevelElts"/>
- </choice>
- </define>
- <define name="CT_RubyContent">
- <ref name="EG_RubyContent"/>
- </define>
- <define name="CT_Ruby">
- <element name="rubyPr">
- <ref name="CT_RubyPr"/>
- </element>
- <element name="rt">
- <ref name="CT_RubyContent"/>
- </element>
- <element name="rubyBase">
- <ref name="CT_RubyContent"/>
- </element>
- </define>
- <define name="CT_Lock">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SdtListItem">
- <attribute name="displayText">
- <data type="string"/>
- </attribute>
- <attribute name="value">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SdtDateMappingType">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_CalendarType">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SdtDate">
- <element name="dateFormat">
- <ref name="CT_String"/>
- </element>
- <element name="lid">
- <ref name="CT_Lang"/>
- </element>
- <element name="storeMappedDataAs">
- <ref name="CT_SdtDateMappingType"/>
- </element>
- <element name="calendar">
- <ref name="CT_CalendarType"/>
- </element>
- <attribute name="fullDate">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SdtDocPart">
- <element name="docPartGallery">
- <ref name="CT_String"/>
- </element>
- <element name="docPartCategory">
- <ref name="CT_String"/>
- </element>
- <element name="docPartUnique">
- <ref name="CT_OnOff"/>
- </element>
- </define>
- <define name="CT_SdtDropDownList">
- <element name="listItem">
- <ref name="CT_SdtListItem"/>
- </element>
- <attribute name="lastValue">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SdtPlaceholderDocPart">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SdtPlaceholder">
- <element name="docPart">
- <ref name="CT_SdtPlaceholderDocPart"/>
- </element>
- </define>
- <define name="CT_SdtText">
- <attribute name="multiLine">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_DataBinding">
- <attribute name="prefixMappings">
- <data type="string"/>
- </attribute>
- <attribute name="xpath">
- <data type="string"/>
- </attribute>
- <attribute name="storeItemID">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SdtColor">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SdtAppearance">
- <attribute name="w15:val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SdtPr">
- <choice>
- <element name="rPr">
- <ref name="CT_RPr"/>
- </element>
- <element name="alias">
- <ref name="CT_String"/>
- </element>
- <element name="lock">
- <ref name="CT_Lock"/>
- </element>
- <element name="placeholder">
- <ref name="CT_SdtPlaceholder"/>
- </element>
- <element name="showingPlcHdr">
- <ref name="CT_OnOff"/>
- </element>
- <element name="dataBinding">
- <ref name="CT_DataBinding"/>
- </element>
- <element name="temporary">
- <ref name="CT_OnOff"/>
- </element>
- <element name="id">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="tabIndex">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="tag">
- <ref name="CT_String"/>
- </element>
- <element name="equation">
- <ref name="CT_OnOff"/>
- </element>
- <element name="comboBox">
- <ref name="CT_SdtDropDownList"/>
- </element>
- <element name="w14:checkbox">
- <ref name="CT_SdtCheckbox"/>
- </element>
- <element name="date">
- <ref name="CT_SdtDate"/>
- </element>
- <element name="docPartObj">
- <ref name="CT_SdtDocPart"/>
- </element>
- <element name="docPartList">
- <ref name="CT_SdtDocPart"/>
- </element>
- <element name="dropDownList">
- <ref name="CT_SdtDropDownList"/>
- </element>
- <element name="picture">
- <ref name="CT_OnOff"/>
- </element>
- <element name="richText">
- <ref name="CT_Empty"/>
- </element>
- <element name="text">
- <ref name="CT_SdtText"/>
- </element>
- <element name="citation">
- <ref name="CT_OnOff"/>
- </element>
- <element name="group">
- <ref name="CT_OnOff"/>
- </element>
- <element name="bibliography">
- <ref name="CT_Empty"/>
- </element>
- <element name="w15:color">
- <ref name="CT_SdtColor"/>
- </element>
- <element name="w15:appearance">
- <ref name="CT_SdtAppearance"/>
- </element>
- </choice>
- </define>
- <define name="CT_SdtEndPr">
- <element name="rPr">
- <ref name="CT_RPr"/>
- </element>
- </define>
- <define name="EG_ContentRunContent">
- <choice>
- <element name="customXml">
- <ref name="CT_CustomXmlRun"/>
- </element>
- <element name="smartTag">
- <ref name="CT_SmartTagRun"/>
- </element>
- <element name="sdt">
- <ref name="CT_SdtRun"/>
- </element>
- <element name="dir">
- <ref name="CT_DirContentRun"/>
- </element>
- <element name="r">
- <ref name="CT_R"/>
- </element>
- <ref name="EG_RunLevelElts"/>
- </choice>
- </define>
- <define name="CT_DirContentRun">
- <ref name="EG_PContent"/>
- <attribute name="val">
- <ref name="ST_Direction"/>
- </attribute>
- </define>
- <define name="ST_Direction">
- <choice>
- <value>ltr</value>
- <value>rtl</value>
- </choice>
- </define>
- <define name="CT_SdtContentRun">
- <ref name="EG_PContent"/>
- </define>
- <define name="EG_ContentBlockContent">
- <choice>
- <element name="customXml">
- <ref name="CT_CustomXmlBlock"/>
- </element>
- <element name="sdt">
- <ref name="CT_SdtBlock"/>
- </element>
- <element name="p">
- <ref name="CT_P"/>
- </element>
- <element name="tbl">
- <ref name="CT_Tbl"/>
- </element>
- <!-- tdf#108714 : allow <w:br> at block level (despite this is illegal according to ECMA-376-1:2016) - bug-to-bug compatibility with Word -->
- <element name="br">
- <ref name="CT_Br_OutOfOrder"/>
- </element>
- <!-- end tdf#108714 -->
- <ref name="EG_RunLevelElts"/>
- </choice>
- </define>
- <define name="CT_SdtContentBlock">
- <ref name="EG_ContentBlockContent"/>
- </define>
- <define name="EG_ContentRowContent">
- <choice>
- <element name="tr">
- <ref name="CT_Row"/>
- </element>
- <element name="customXml">
- <ref name="CT_CustomXmlRow"/>
- </element>
- <element name="sdt">
- <ref name="CT_SdtRow"/>
- </element>
- <ref name="EG_RunLevelElts"/>
- </choice>
- </define>
- <define name="CT_SdtContentRow">
- <ref name="EG_ContentRowContent"/>
- </define>
- <define name="EG_ContentCellContent">
- <choice>
- <element name="tc">
- <ref name="CT_Tc"/>
- </element>
- <element name="customXml">
- <ref name="CT_CustomXmlCell"/>
- </element>
- <element name="sdt">
- <ref name="CT_SdtCell"/>
- </element>
- <ref name="EG_RunLevelElts"/>
- </choice>
- </define>
- <define name="CT_SdtContentCell">
- <ref name="EG_ContentCellContent"/>
- </define>
- <define name="CT_SdtBlock">
- <element name="sdtPr">
- <ref name="CT_SdtPr"/>
- </element>
- <element name="sdtEndPr">
- <ref name="CT_SdtEndPr"/>
- </element>
- <element name="sdtContent">
- <ref name="CT_SdtContentBlock"/>
- </element>
- </define>
- <define name="CT_SdtRun">
- <element name="sdtPr">
- <ref name="CT_SdtPr"/>
- </element>
- <element name="sdtEndPr">
- <ref name="CT_SdtEndPr"/>
- </element>
- <element name="sdtContent">
- <ref name="CT_SdtContentRun"/>
- </element>
- </define>
- <define name="CT_SdtCell">
- <element name="sdtPr">
- <ref name="CT_SdtPr"/>
- </element>
- <element name="sdtEndPr">
- <ref name="CT_SdtEndPr"/>
- </element>
- <element name="sdtContent">
- <ref name="CT_SdtContentCell"/>
- </element>
- </define>
- <define name="CT_SdtRow">
- <element name="sdtPr">
- <ref name="CT_SdtPr"/>
- </element>
- <element name="sdtEndPr">
- <ref name="CT_SdtEndPr"/>
- </element>
- <element name="sdtContent">
- <ref name="CT_SdtContentRow"/>
- </element>
- </define>
- <define name="CT_Attr">
- <attribute name="uri">
- <data type="string"/>
- </attribute>
- <attribute name="name">
- <data type="string"/>
- </attribute>
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_CustomXmlRun">
- <element name="customXmlPr">
- <ref name="CT_CustomXmlPr"/>
- </element>
- <ref name="EG_PContent"/>
- <attribute name="uri">
- <data type="string"/>
- </attribute>
- <attribute name="element">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SmartTagRun">
- <element name="smartTagPr">
- <ref name="CT_SmartTagPr"/>
- </element>
- <ref name="EG_PContent"/>
- <attribute name="uri">
- <data type="string"/>
- </attribute>
- <attribute name="element">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_CustomXmlBlock">
- <element name="customXmlPr">
- <ref name="CT_CustomXmlPr"/>
- </element>
- <ref name="EG_ContentBlockContent"/>
- <attribute name="uri">
- <data type="string"/>
- </attribute>
- <attribute name="element">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_CustomXmlPr">
- <element name="placeholder">
- <ref name="CT_String"/>
- </element>
- <element name="attr">
- <ref name="CT_Attr"/>
- </element>
- </define>
- <define name="CT_CustomXmlRow">
- <element name="customXmlPr">
- <ref name="CT_CustomXmlPr"/>
- </element>
- <ref name="EG_ContentRowContent"/>
- <attribute name="uri">
- <data type="string"/>
- </attribute>
- <attribute name="element">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_CustomXmlCell">
- <element name="customXmlPr">
- <ref name="CT_CustomXmlPr"/>
- </element>
- <ref name="EG_ContentCellContent"/>
- <attribute name="uri">
- <data type="string"/>
- </attribute>
- <attribute name="element">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SmartTagPr">
- <element name="attr">
- <ref name="CT_Attr"/>
- </element>
- </define>
- <define name="EG_PContent">
- <choice>
- <ref name="EG_ContentRunContent"/>
- <element name="fldSimple">
- <ref name="CT_SimpleField"/>
- </element>
- <element name="hyperlink">
- <ref name="CT_Hyperlink"/>
- </element>
- <element name="subDoc">
- <ref name="CT_Rel"/>
- </element>
- </choice>
- </define>
- <!-- [MS-DOCX] sect. 2.2.4 "p and tr Extensions" -->
- <!-- Should rather be in w14 namespace, but I don't see how to reference things from there -->
- <define name="AG_Parids">
- <attribute name="w14:paraId">
- <data type="string"/>
- </attribute>
- <!-- Not yet used
- <attribute name="textId">
- <ref name="ST_LongHexNumber"/>
- </attribute>
- -->
- </define>
- <define name="CT_P">
- <element name="pPr">
- <ref name="CT_PPr"/>
- </element>
- <ref name="EG_PContent"/>
- <attribute name="rsidRPr">
- <data type="string"/>
- </attribute>
- <attribute name="rsidR">
- <data type="string"/>
- </attribute>
- <attribute name="rsidDel">
- <data type="string"/>
- </attribute>
- <attribute name="rsidP">
- <data type="string"/>
- </attribute>
- <attribute name="rsidRDefault">
- <data type="string"/>
- </attribute>
- <ref name="AG_Parids"/>
- <!-- tdf#108714 : allow <w:br> at paragraph level (despite this is illegal according to ECMA-376-1:2016) - bug-to-bug compatibility with Word -->
- <element name="br">
- <ref name="CT_Br_OutOfOrder"/>
- </element>
- <!-- end tdf#108714 -->
- <!-- tdf#111550 : allow <w:tbl> at paragraph level (despite this is illegal according to ECMA-376-1:2016) - bug-to-bug compatibility with Word -->
- <element name="tbl">
- <ref name="CT_P_Tbl"/>
- </element>
- </define>
- <define name="ST_TblWidth">
- <choice>
- <!-- No Width -->
- <value>nil</value>
- <!-- Width in Fiftieths of a Percent -->
- <value>pct</value>
- <!-- Width in Twentieths of a Point -->
- <value>dxa</value>
- <!-- Automatically Determined Width -->
- <value>auto</value>
- </choice>
- </define>
- <define name="ST_MeasurementOrPercent">
- <data type="string"/>
- </define>
- <define name="CT_Height">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- <attribute name="hRule">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_TblWidth">
- <attribute name="w">
- <ref name="ST_MeasurementOrPercent"/>
- </attribute>
- <attribute name="type">
- <ref name="ST_TblWidth"/>
- </attribute>
- </define>
- <define name="CT_TblGridCol">
- <attribute name="w">
- <ref name="ST_TwipsMeasure"/>
- </attribute>
- </define>
- <define name="CT_TblGridBase">
- <element name="gridCol">
- <ref name="CT_TblGridCol"/>
- </element>
- </define>
- <define name="CT_TblGrid">
- <ref name="CT_TblGridBase"/>
- <element name="tblGridChange">
- <ref name="CT_TblGridChange"/>
- </element>
- </define>
- <define name="CT_TcBorders">
- <element name="top">
- <ref name="CT_Border"/>
- </element>
- <element name="start">
- <ref name="CT_Border"/>
- </element>
- <element name="left">
- <ref name="CT_Border"/>
- </element>
- <element name="bottom">
- <ref name="CT_Border"/>
- </element>
- <element name="end">
- <ref name="CT_Border"/>
- </element>
- <element name="right">
- <ref name="CT_Border"/>
- </element>
- <element name="insideH">
- <ref name="CT_Border"/>
- </element>
- <element name="insideV">
- <ref name="CT_Border"/>
- </element>
- <element name="tl2br">
- <ref name="CT_Border"/>
- </element>
- <element name="tr2bl">
- <ref name="CT_Border"/>
- </element>
- </define>
- <define name="CT_TcMar">
- <element name="top">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="start">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="left">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="bottom">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="right">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="end">
- <ref name="CT_TblWidth"/>
- </element>
- </define>
- <define name="ST_Merge">
- <choice>
- <!-- Continue Merged Region -->
- <value>continue</value>
- <!-- Start/Restart Merged Region -->
- <value>restart</value>
- </choice>
- </define>
- <define name="CT_VMerge">
- <attribute name="val">
- <ref name="ST_Merge"/>
- </attribute>
- </define>
- <define name="CT_HMerge">
- <attribute name="val">
- <ref name="ST_Merge"/>
- </attribute>
- </define>
- <define name="CT_TcPrBase">
- <element name="cnfStyle">
- <ref name="CT_Cnf"/>
- </element>
- <element name="tcW">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="gridSpan">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="hMerge">
- <ref name="CT_HMerge"/>
- </element>
- <element name="vMerge">
- <ref name="CT_VMerge"/>
- </element>
- <element name="tcBorders">
- <ref name="CT_TcBorders"/>
- </element>
- <element name="shd">
- <ref name="CT_Shd"/>
- </element>
- <element name="noWrap">
- <ref name="CT_OnOff"/>
- </element>
- <element name="tcMar">
- <ref name="CT_TcMar"/>
- </element>
- <element name="textDirection">
- <ref name="CT_TextDirection"/>
- </element>
- <element name="tcFitText">
- <ref name="CT_OnOff"/>
- </element>
- <element name="vAlign">
- <ref name="CT_VerticalJc"/>
- </element>
- <element name="hideMark">
- <ref name="CT_OnOff"/>
- </element>
- </define>
- <define name="CT_TcPr">
- <ref name="CT_TcPrInner"/>
- <element name="tcPrChange">
- <ref name="CT_TcPrChange"/>
- </element>
- </define>
- <define name="CT_TcPrInner">
- <ref name="CT_TcPrBase"/>
- <ref name="EG_CellMarkupElements"/>
- </define>
- <define name="CT_Tc">
- <element name="tcPr">
- <ref name="CT_TcPr"/>
- </element>
- <ref name="EG_BlockLevelElts"/>
- </define>
- <define name="ST_Cnf">
- <data type="string"/>
- </define>
- <define name="CT_Cnf">
- <attribute name="val">
- <ref name="ST_Cnf"/>
- </attribute>
- <attribute name="firstRow">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="lastRow">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="firstColumn">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="lastColumn">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="oddVBand">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="evenVBand">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="oddHBand">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="evenHBand">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="firstRowFirstColumn">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="firstRowLastColumn">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="lastRowFirstColumn">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="lastRowLastColumn">
- <ref name="ST_OnOff"/>
- </attribute>
- </define>
- <define name="CT_TrPrBase">
- <choice>
- <element name="cnfStyle">
- <ref name="CT_Cnf"/>
- </element>
- <element name="divId">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="gridBefore">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="gridAfter">
- <ref name="CT_TrPrBaseGridAfter"/>
- </element>
- <element name="wBefore">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="wAfter">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="cantSplit">
- <ref name="CT_OnOff"/>
- </element>
- <element name="trHeight">
- <ref name="CT_Height"/>
- </element>
- <element name="tblHeader">
- <ref name="CT_OnOff"/>
- </element>
- <element name="tblCellSpacing">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="jc">
- <ref name="CT_Jc"/>
- </element>
- <element name="hidden">
- <ref name="CT_OnOff"/>
- </element>
- </choice>
- </define>
- <define name="CT_TrPrBaseGridAfter">
- <attribute name="val">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- </define>
- <define name="CT_TrPr">
- <ref name="CT_TrPrBase"/>
- <element name="ins">
- <ref name="CT_TrackChange"/>
- </element>
- <element name="del">
- <ref name="CT_TrackChange"/>
- </element>
- <element name="trPrChange">
- <ref name="CT_TrPrChange"/>
- </element>
- </define>
- <define name="CT_Row">
- <element name="tblPrEx">
- <ref name="CT_TblPrEx"/>
- </element>
- <element name="trPr">
- <ref name="CT_TrPr"/>
- </element>
- <ref name="EG_ContentCellContent"/>
- <attribute name="rsidRPr">
- <data type="string"/>
- </attribute>
- <attribute name="rsidR">
- <data type="string"/>
- </attribute>
- <attribute name="rsidDel">
- <data type="string"/>
- </attribute>
- <attribute name="rsidTr">
- <data type="string"/>
- </attribute>
- <ref name="AG_Parids"/>
- </define>
- <define name="ST_TblLayout">
- <choice>
- <!-- Fixed Width Table Layout -->
- <value>fixed</value>
- <!-- AutoFit Table Layout -->
- <value>autofit</value>
- </choice>
- </define>
- <define name="CT_TblLayoutType">
- <attribute name="type">
- <ref name="ST_TblLayout"/>
- </attribute>
- </define>
- <define name="ST_TblOverlap">
- <choice>
- <!-- Floating Table Cannot Overlap -->
- <value>never</value>
- <!-- Floating Table Can Overlap -->
- <value>overlap</value>
- </choice>
- </define>
- <define name="CT_TblOverlap">
- <attribute name="val">
- <ref name="ST_TblOverlap"/>
- </attribute>
- </define>
- <define name="CT_TblPPr">
- <attribute name="leftFromText">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- <attribute name="rightFromText">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- <attribute name="topFromText">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- <attribute name="bottomFromText">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- <attribute name="vertAnchor">
- <data type="string"/>
- </attribute>
- <attribute name="horzAnchor">
- <data type="string"/>
- </attribute>
- <attribute name="tblpXSpec">
- <data type="string"/>
- </attribute>
- <attribute name="tblpX">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- <attribute name="tblpYSpec">
- <data type="string"/>
- </attribute>
- <attribute name="tblpY">
- <ref name="ST_SignedTwipsMeasure"/>
- </attribute>
- </define>
- <define name="CT_TblCellMar">
- <element name="top">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="start">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="left">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="bottom">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="right">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="end">
- <ref name="CT_TblWidth"/>
- </element>
- </define>
- <define name="CT_TblBorders">
- <element name="top">
- <ref name="CT_Border"/>
- </element>
- <element name="start">
- <ref name="CT_Border"/>
- </element>
- <element name="left">
- <ref name="CT_Border"/>
- </element>
- <element name="bottom">
- <ref name="CT_Border"/>
- </element>
- <element name="end">
- <ref name="CT_Border"/>
- </element>
- <element name="right">
- <ref name="CT_Border"/>
- </element>
- <element name="insideH">
- <ref name="CT_Border"/>
- </element>
- <element name="insideV">
- <ref name="CT_Border"/>
- </element>
- </define>
- <define name="CT_TblPrBase">
- <element name="tblStyle">
- <ref name="CT_String"/>
- </element>
- <element name="tblpPr">
- <ref name="CT_TblPPr"/>
- </element>
- <element name="tblOverlap">
- <ref name="CT_TblOverlap"/>
- </element>
- <element name="bidiVisual">
- <ref name="CT_OnOff"/>
- </element>
- <element name="tblStyleRowBandSize">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="tblStyleColBandSize">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="tblW">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="jc">
- <ref name="CT_Jc"/>
- </element>
- <element name="tblCellSpacing">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="tblInd">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="tblBorders">
- <ref name="CT_TblBorders"/>
- </element>
- <element name="shd">
- <ref name="CT_Shd"/>
- </element>
- <element name="tblLayout">
- <ref name="CT_TblLayoutType"/>
- </element>
- <element name="tblCellMar">
- <ref name="CT_TblCellMar"/>
- </element>
- <element name="tblLook">
- <ref name="CT_TblLook"/>
- </element>
- <element name="tblCaption">
- <ref name="CT_String"/>
- </element>
- <element name="tblDescription">
- <ref name="CT_String"/>
- </element>
- </define>
- <define name="CT_TblPr">
- <ref name="CT_TblPrBase"/>
- <element name="tblPrChange">
- <ref name="CT_TblPrChange"/>
- </element>
- </define>
- <define name="CT_TblPrExBase">
- <element name="tblW">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="jc">
- <ref name="CT_Jc"/>
- </element>
- <element name="tblCellSpacing">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="tblInd">
- <ref name="CT_TblWidth"/>
- </element>
- <element name="tblBorders">
- <ref name="CT_TblBorders"/>
- </element>
- <element name="shd">
- <ref name="CT_Shd"/>
- </element>
- <element name="tblLayout">
- <ref name="CT_TblLayoutType"/>
- </element>
- <element name="tblCellMar">
- <ref name="CT_TblCellMar"/>
- </element>
- <element name="tblLook">
- <ref name="CT_TblLook"/>
- </element>
- <element name="tblCaption">
- <ref name="CT_String"/>
- </element>
- <element name="tblDescription">
- <ref name="CT_String"/>
- </element>
- </define>
- <define name="CT_TblPrEx">
- <ref name="CT_TblPrExBase"/>
- <element name="tblPrExChange">
- <ref name="CT_TblPrExChange"/>
- </element>
- </define>
- <define name="CT_Tbl">
- <ref name="EG_RangeMarkupElements"/>
- <element name="tblPr">
- <ref name="CT_TblPr"/>
- </element>
- <element name="tblGrid">
- <ref name="CT_TblGrid"/>
- </element>
- <ref name="EG_ContentRowContent"/>
- </define>
- <!-- tdf#111550 : Special element - copy of usual CT_Tbl, but only used as direct child of CT_P -->
- <define name="CT_P_Tbl">
- <ref name="EG_RangeMarkupElements"/>
- <element name="tblPr">
- <ref name="CT_TblPr"/>
- </element>
- <element name="tblGrid">
- <ref name="CT_TblGrid"/>
- </element>
- <ref name="EG_ContentRowContent"/>
- </define>
- <define name="CT_TblLook">
- <attribute name="firstRow">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="lastRow">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="firstColumn">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="lastColumn">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="noHBand">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="noVBand">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="val">
- <ref name="ST_ShortHexNumber"/>
- </attribute>
- </define>
- <define name="ST_FtnPos">
- <choice>
- <!-- Footnotes Positioned at Page Bottom -->
- <value>pageBottom</value>
- <!-- Footnotes Positioned Beneath Text -->
- <value>beneathText</value>
- <!-- Footnotes Positioned At End of Section -->
- <value>sectEnd</value>
- <!-- Footnotes Positioned At End of Document -->
- <value>docEnd</value>
- </choice>
- </define>
- <define name="CT_FtnPos">
- <attribute name="val">
- <ref name="ST_FtnPos"/>
- </attribute>
- </define>
- <define name="ST_EdnPos">
- <choice>
- <!-- Endnotes Positioned at End of Section -->
- <value>sectEnd</value>
- <!-- Endnotes Positioned at End of Document -->
- <value>docEnd</value>
- </choice>
- </define>
- <define name="CT_EdnPos">
- <attribute name="val">
- <ref name="ST_EdnPos"/>
- </attribute>
- </define>
- <define name="CT_NumFmt">
- <attribute name="format">
- <data type="string"/>
- </attribute>
- <attribute name="val">
- <ref name="ST_NumberFormat"/>
- </attribute>
- </define>
- <define name="ST_RestartNumber">
- <choice>
- <!-- Continue Numbering From Previous Section -->
- <value>continuous</value>
- <!-- Restart Numbering For Each Section -->
- <value>eachSect</value>
- <!-- Restart Numbering On Each Page -->
- <value>eachPage</value>
- </choice>
- </define>
- <define name="CT_NumRestart">
- <attribute name="val">
- <ref name="ST_RestartNumber"/>
- </attribute>
- </define>
- <define name="CT_FtnEdnRef">
- <attribute name="customMarkFollows">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="id">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- </define>
- <define name="CT_FtnEdnSepRef">
- <attribute name="id">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- </define>
- <define name="CT_FtnEdn">
- <ref name="EG_BlockLevelElts"/>
- <attribute name="type">
- <ref name="ST_FtnEdn"/>
- </attribute>
- <attribute name="id">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- </define>
- <define name="CT_CommentRef">
- <ref name="CT_Markup"/>
- </define>
- <define name="EG_FtnEdnNumProps">
- <element name="numStart">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="numRestart">
- <ref name="CT_NumRestart"/>
- </element>
- </define>
- <define name="CT_FtnProps">
- <element name="pos">
- <ref name="CT_FtnPos"/>
- </element>
- <element name="numFmt">
- <ref name="CT_NumFmt"/>
- </element>
- <ref name="EG_FtnEdnNumProps"/>
- </define>
- <define name="CT_EdnProps">
- <element name="pos">
- <ref name="CT_EdnPos"/>
- </element>
- <element name="numFmt">
- <ref name="CT_NumFmt"/>
- </element>
- <ref name="EG_FtnEdnNumProps"/>
- </define>
- <define name="CT_FtnDocProps">
- <ref name="CT_FtnProps"/>
- <element name="footnote">
- <ref name="CT_FtnEdnSepRef"/>
- </element>
- </define>
- <define name="CT_EdnDocProps">
- <ref name="CT_EdnProps"/>
- <element name="endnote">
- <ref name="CT_FtnEdnSepRef"/>
- </element>
- </define>
- <define name="CT_RecipientData">
- <element name="active">
- <ref name="CT_OnOff"/>
- </element>
- <element name="column">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="uniqueTag">
- <data type="base64Binary"/>
- </element>
- </define>
- <define name="CT_Recipients">
- <element name="recipientData">
- <ref name="CT_RecipientData"/>
- </element>
- </define>
- <define name="recipients">
- <element name="recipients">
- <ref name="CT_Recipients"/>
- </element>
- </define>
- <define name="CT_OdsoFieldMapData">
- <element name="type">
- <ref name="CT_MailMergeOdsoFMDFieldType"/>
- </element>
- <element name="name">
- <ref name="CT_String"/>
- </element>
- <element name="mappedName">
- <ref name="CT_String"/>
- </element>
- <element name="column">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="lid">
- <ref name="CT_Lang"/>
- </element>
- <element name="dynamicAddress">
- <ref name="CT_OnOff"/>
- </element>
- </define>
- <define name="CT_MailMergeSourceType">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Odso">
- <element name="udl">
- <ref name="CT_String"/>
- </element>
- <element name="table">
- <ref name="CT_String"/>
- </element>
- <element name="src">
- <ref name="CT_Rel"/>
- </element>
- <element name="colDelim">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="type">
- <ref name="CT_MailMergeSourceType"/>
- </element>
- <element name="fHdr">
- <ref name="CT_OnOff"/>
- </element>
- <element name="fieldMapData">
- <ref name="CT_OdsoFieldMapData"/>
- </element>
- <element name="recipientData">
- <ref name="CT_Rel"/>
- </element>
- </define>
- <define name="CT_MailMerge">
- <element name="mainDocumentType">
- <ref name="CT_MailMergeDocType"/>
- </element>
- <element name="linkToQuery">
- <ref name="CT_OnOff"/>
- </element>
- <element name="dataType">
- <ref name="CT_MailMergeDataType"/>
- </element>
- <element name="connectString">
- <ref name="CT_String"/>
- </element>
- <element name="query">
- <ref name="CT_String"/>
- </element>
- <element name="dataSource">
- <ref name="CT_Rel"/>
- </element>
- <element name="headerSource">
- <ref name="CT_Rel"/>
- </element>
- <element name="doNotSuppressBlankLines">
- <ref name="CT_OnOff"/>
- </element>
- <element name="destination">
- <ref name="CT_MailMergeDest"/>
- </element>
- <element name="addressFieldName">
- <ref name="CT_String"/>
- </element>
- <element name="mailSubject">
- <ref name="CT_String"/>
- </element>
- <element name="mailAsAttachment">
- <ref name="CT_OnOff"/>
- </element>
- <element name="viewMergedData">
- <ref name="CT_OnOff"/>
- </element>
- <element name="activeRecord">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="checkErrors">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="odso">
- <ref name="CT_Odso"/>
- </element>
- </define>
- <define name="CT_TargetScreenSz">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Compat">
- <element name="useSingleBorderforContiguousCells">
- <ref name="CT_OnOff"/>
- </element>
- <element name="wpJustification">
- <ref name="CT_OnOff"/>
- </element>
- <element name="noTabHangInd">
- <ref name="CT_OnOff"/>
- </element>
- <element name="noLeading">
- <ref name="CT_OnOff"/>
- </element>
- <element name="spaceForUL">
- <ref name="CT_OnOff"/>
- </element>
- <element name="noColumnBalance">
- <ref name="CT_OnOff"/>
- </element>
- <element name="balanceSingleByteDoubleByteWidth">
- <ref name="CT_OnOff"/>
- </element>
- <element name="noExtraLineSpacing">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotLeaveBackslashAlone">
- <ref name="CT_OnOff"/>
- </element>
- <element name="ulTrailSpace">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotExpandShiftReturn">
- <ref name="CT_OnOff"/>
- </element>
- <element name="spacingInWholePoints">
- <ref name="CT_OnOff"/>
- </element>
- <element name="lineWrapLikeWord6">
- <ref name="CT_OnOff"/>
- </element>
- <element name="printBodyTextBeforeHeader">
- <ref name="CT_OnOff"/>
- </element>
- <element name="printColBlack">
- <ref name="CT_OnOff"/>
- </element>
- <element name="wpSpaceWidth">
- <ref name="CT_OnOff"/>
- </element>
- <element name="showBreaksInFrames">
- <ref name="CT_OnOff"/>
- </element>
- <element name="subFontBySize">
- <ref name="CT_OnOff"/>
- </element>
- <element name="suppressBottomSpacing">
- <ref name="CT_OnOff"/>
- </element>
- <element name="suppressTopSpacing">
- <ref name="CT_OnOff"/>
- </element>
- <element name="suppressSpacingAtTopOfPage">
- <ref name="CT_OnOff"/>
- </element>
- <element name="suppressTopSpacingWP">
- <ref name="CT_OnOff"/>
- </element>
- <element name="suppressSpBfAfterPgBrk">
- <ref name="CT_OnOff"/>
- </element>
- <element name="swapBordersFacingPages">
- <ref name="CT_OnOff"/>
- </element>
- <element name="convMailMergeEsc">
- <ref name="CT_OnOff"/>
- </element>
- <element name="truncateFontHeightsLikeWP6">
- <ref name="CT_OnOff"/>
- </element>
- <element name="mwSmallCaps">
- <ref name="CT_OnOff"/>
- </element>
- <element name="usePrinterMetrics">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotSuppressParagraphBorders">
- <ref name="CT_OnOff"/>
- </element>
- <element name="wrapTrailSpaces">
- <ref name="CT_OnOff"/>
- </element>
- <element name="footnoteLayoutLikeWW8">
- <ref name="CT_OnOff"/>
- </element>
- <element name="shapeLayoutLikeWW8">
- <ref name="CT_OnOff"/>
- </element>
- <element name="alignTablesRowByRow">
- <ref name="CT_OnOff"/>
- </element>
- <element name="forgetLastTabAlignment">
- <ref name="CT_OnOff"/>
- </element>
- <element name="adjustLineHeightInTable">
- <ref name="CT_OnOff"/>
- </element>
- <element name="autoSpaceLikeWord95">
- <ref name="CT_OnOff"/>
- </element>
- <element name="noSpaceRaiseLower">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotUseHTMLParagraphAutoSpacing">
- <ref name="CT_OnOff"/>
- </element>
- <element name="layoutRawTableWidth">
- <ref name="CT_OnOff"/>
- </element>
- <element name="layoutTableRowsApart">
- <ref name="CT_OnOff"/>
- </element>
- <element name="useWord97LineBreakRules">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotBreakWrappedTables">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotSnapToGridInCell">
- <ref name="CT_OnOff"/>
- </element>
- <element name="selectFldWithFirstOrLastChar">
- <ref name="CT_OnOff"/>
- </element>
- <element name="applyBreakingRules">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotWrapTextWithPunct">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotUseEastAsianBreakRules">
- <ref name="CT_OnOff"/>
- </element>
- <element name="useWord2002TableStyleRules">
- <ref name="CT_OnOff"/>
- </element>
- <element name="growAutofit">
- <ref name="CT_OnOff"/>
- </element>
- <element name="useFELayout">
- <ref name="CT_OnOff"/>
- </element>
- <element name="useNormalStyleForList">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotUseIndentAsNumberingTabStop">
- <ref name="CT_OnOff"/>
- </element>
- <element name="useAltKinsokuLineBreakRules">
- <ref name="CT_OnOff"/>
- </element>
- <element name="allowSpaceOfSameStyleInTable">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotSuppressIndentation">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotAutofitConstrainedTables">
- <ref name="CT_OnOff"/>
- </element>
- <element name="autofitToFirstFixedWidthCell">
- <ref name="CT_OnOff"/>
- </element>
- <element name="underlineTabInNumList">
- <ref name="CT_OnOff"/>
- </element>
- <element name="displayHangulFixedWidth">
- <ref name="CT_OnOff"/>
- </element>
- <element name="splitPgBreakAndParaMark">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotVertAlignCellWithSp">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotBreakConstrainedForcedTable">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotVertAlignInTxbx">
- <ref name="CT_OnOff"/>
- </element>
- <element name="useAnsiKerningPairs">
- <ref name="CT_OnOff"/>
- </element>
- <element name="cachedColBalance">
- <ref name="CT_OnOff"/>
- </element>
- <element name="compatSetting">
- <ref name="CT_CompatSetting"/>
- </element>
- </define>
- <define name="CT_CompatSetting">
- <attribute name="name">
- <ref name="ST_String"/>
- </attribute>
- <attribute name="uri">
- <ref name="ST_String"/>
- </attribute>
- <attribute name="val">
- <ref name="ST_String"/>
- </attribute>
- </define>
- <define name="CT_DocVar">
- <attribute name="name">
- <data type="string"/>
- </attribute>
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_DocVars">
- <element name="docVar">
- <ref name="CT_DocVar"/>
- </element>
- </define>
- <define name="CT_DocRsids">
- <element name="rsidRoot">
- <ref name="CT_LongHexNumber"/>
- </element>
- <element name="rsid">
- <ref name="CT_LongHexNumber"/>
- </element>
- </define>
- <define name="CT_CharacterSpacing">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_SaveThroughXslt">
- <attribute name="r:id">
- <ref name="ST_String"/>
- </attribute>
- <attribute name="solutionID">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_RPrDefault">
- <element name="rPr">
- <ref name="CT_RPr"/>
- </element>
- </define>
- <define name="CT_PPrDefault">
- <element name="pPr">
- <ref name="CT_PPr"/>
- </element>
- </define>
- <define name="CT_DocDefaults">
- <element name="rPrDefault">
- <ref name="CT_RPrDefault"/>
- </element>
- <element name="pPrDefault">
- <ref name="CT_PPrDefault"/>
- </element>
- </define>
- <define name="ST_ColorSchemeIndex">
- <choice>
- <!-- Dark 1 Theme Color Reference -->
- <value>dark1</value>
- <!-- Light 1 Theme Color Reference -->
- <value>light1</value>
- <!-- Dark 2 Theme Color Reference -->
- <value>dark2</value>
- <!-- Light 2 Theme Color Reference -->
- <value>light2</value>
- <!-- Accent 1 Theme Color Reference -->
- <value>accent1</value>
- <!-- Accent 2 Theme Color Reference -->
- <value>accent2</value>
- <!-- Accent 3 Theme Color Reference -->
- <value>accent3</value>
- <!-- Accent4 Theme Color Reference -->
- <value>accent4</value>
- <!-- Accent5 Theme Color Reference -->
- <value>accent5</value>
- <!-- Accent 6 Theme Color Reference -->
- <value>accent6</value>
- <!-- Hyperlink Theme Color Reference -->
- <value>hyperlink</value>
- <!-- Followed Hyperlink Theme Color Reference -->
- <value>followedHyperlink</value>
- </choice>
- </define>
- <define name="CT_ColorSchemeMapping">
- <attribute name="bg1">
- <data type="string"/>
- </attribute>
- <attribute name="t1">
- <data type="string"/>
- </attribute>
- <attribute name="bg2">
- <data type="string"/>
- </attribute>
- <attribute name="t2">
- <data type="string"/>
- </attribute>
- <attribute name="accent1">
- <data type="string"/>
- </attribute>
- <attribute name="accent2">
- <data type="string"/>
- </attribute>
- <attribute name="accent3">
- <data type="string"/>
- </attribute>
- <attribute name="accent4">
- <data type="string"/>
- </attribute>
- <attribute name="accent5">
- <data type="string"/>
- </attribute>
- <attribute name="accent6">
- <data type="string"/>
- </attribute>
- <attribute name="hyperlink">
- <data type="string"/>
- </attribute>
- <attribute name="followedHyperlink">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_ReadingModeInkLockDown">
- <attribute name="actualPg">
- <data type="string"/>
- </attribute>
- <attribute name="w">
- <data type="string"/>
- </attribute>
- <attribute name="h">
- <data type="string"/>
- </attribute>
- <attribute name="fontSz">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_WriteProtection">
- <attribute name="recommended">
- <ref name="ST_OnOff"/>
- </attribute>
- <ref name="AG_Password"/>
- </define>
- <define name="CT_Settings">
- <element name="writeProtection">
- <ref name="CT_WriteProtection"/>
- </element>
- <element name="view">
- <ref name="CT_View"/>
- </element>
- <element name="zoom">
- <ref name="CT_Zoom"/>
- </element>
- <element name="linkStyles">
- <ref name="CT_OnOff"/>
- </element>
- <element name="removePersonalInformation">
- <ref name="CT_OnOff"/>
- </element>
- <element name="removeDateAndTime">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotDisplayPageBoundaries">
- <ref name="CT_OnOff"/>
- </element>
- <element name="displayBackgroundShape">
- <ref name="CT_OnOff"/>
- </element>
- <element name="printPostScriptOverText">
- <ref name="CT_OnOff"/>
- </element>
- <element name="printFractionalCharacterWidth">
- <ref name="CT_OnOff"/>
- </element>
- <element name="printFormsData">
- <ref name="CT_OnOff"/>
- </element>
- <element name="embedTrueTypeFonts">
- <ref name="CT_OnOff"/>
- </element>
- <element name="embedSystemFonts">
- <ref name="CT_OnOff"/>
- </element>
- <element name="saveSubsetFonts">
- <ref name="CT_OnOff"/>
- </element>
- <element name="saveFormsData">
- <ref name="CT_OnOff"/>
- </element>
- <element name="mirrorMargins">
- <ref name="CT_OnOff"/>
- </element>
- <element name="alignBordersAndEdges">
- <ref name="CT_OnOff"/>
- </element>
- <element name="bordersDoNotSurroundHeader">
- <ref name="CT_OnOff"/>
- </element>
- <element name="bordersDoNotSurroundFooter">
- <ref name="CT_OnOff"/>
- </element>
- <element name="gutterAtTop">
- <ref name="CT_OnOff"/>
- </element>
- <element name="hideSpellingErrors">
- <ref name="CT_OnOff"/>
- </element>
- <element name="hideGrammaticalErrors">
- <ref name="CT_OnOff"/>
- </element>
- <element name="activeWritingStyle">
- <ref name="CT_WritingStyle"/>
- </element>
- <element name="proofState">
- <ref name="CT_Proof"/>
- </element>
- <element name="formsDesign">
- <ref name="CT_OnOff"/>
- </element>
- <element name="attachedTemplate">
- <ref name="CT_Rel"/>
- </element>
- <element name="linkStyles">
- <ref name="CT_OnOff"/>
- </element>
- <element name="stylePaneFormatFilter">
- <ref name="CT_ShortHexNumber"/>
- </element>
- <element name="stylePaneSortMethod">
- <ref name="CT_ShortHexNumber"/>
- </element>
- <element name="documentType">
- <ref name="CT_DocType"/>
- </element>
- <element name="mailMerge">
- <ref name="CT_MailMerge"/>
- </element>
- <element name="revisionView">
- <ref name="CT_TrackChangesView"/>
- </element>
- <element name="trackRevisions">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotTrackMoves">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotTrackFormatting">
- <ref name="CT_OnOff"/>
- </element>
- <element name="documentProtection">
- <ref name="CT_DocProtect"/>
- </element>
- <element name="autoFormatOverride">
- <ref name="CT_OnOff"/>
- </element>
- <element name="styleLockTheme">
- <ref name="CT_OnOff"/>
- </element>
- <element name="styleLockQFSet">
- <ref name="CT_OnOff"/>
- </element>
- <element name="defaultTabStop">
- <ref name="CT_TwipsMeasure"/>
- </element>
- <element name="autoHyphenation">
- <ref name="CT_OnOff"/>
- </element>
- <element name="consecutiveHyphenLimit">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="hyphenationZone">
- <ref name="CT_TwipsMeasure"/>
- </element>
- <element name="doNotHyphenateCaps">
- <ref name="CT_OnOff"/>
- </element>
- <element name="showEnvelope">
- <ref name="CT_OnOff"/>
- </element>
- <element name="summaryLength">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="clickAndTypeStyle">
- <ref name="CT_String"/>
- </element>
- <element name="defaultTableStyle">
- <ref name="CT_String"/>
- </element>
- <element name="evenAndOddHeaders">
- <ref name="CT_OnOff"/>
- </element>
- <element name="bookFoldRevPrinting">
- <ref name="CT_OnOff"/>
- </element>
- <element name="bookFoldPrinting">
- <ref name="CT_OnOff"/>
- </element>
- <element name="bookFoldPrintingSheets">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="drawingGridHorizontalSpacing">
- <ref name="CT_TwipsMeasure"/>
- </element>
- <element name="drawingGridVerticalSpacing">
- <ref name="CT_TwipsMeasure"/>
- </element>
- <element name="displayHorizontalDrawingGridEvery">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="displayVerticalDrawingGridEvery">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="doNotUseMarginsForDrawingGridOrigin">
- <ref name="CT_OnOff"/>
- </element>
- <element name="drawingGridHorizontalOrigin">
- <ref name="CT_TwipsMeasure"/>
- </element>
- <element name="drawingGridVerticalOrigin">
- <ref name="CT_TwipsMeasure"/>
- </element>
- <element name="doNotShadeFormData">
- <ref name="CT_OnOff"/>
- </element>
- <element name="noPunctuationKerning">
- <ref name="CT_OnOff"/>
- </element>
- <element name="characterSpacingControl">
- <ref name="CT_CharacterSpacing"/>
- </element>
- <element name="printTwoOnOne">
- <ref name="CT_OnOff"/>
- </element>
- <element name="strictFirstAndLastChars">
- <ref name="CT_OnOff"/>
- </element>
- <element name="noLineBreaksAfter">
- <ref name="CT_Kinsoku"/>
- </element>
- <element name="noLineBreaksBefore">
- <ref name="CT_Kinsoku"/>
- </element>
- <element name="savePreviewPicture">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotValidateAgainstSchema">
- <ref name="CT_OnOff"/>
- </element>
- <element name="saveInvalidXml">
- <ref name="CT_OnOff"/>
- </element>
- <element name="ignoreMixedContent">
- <ref name="CT_OnOff"/>
- </element>
- <element name="alwaysShowPlaceholderText">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotDemarcateInvalidXml">
- <ref name="CT_OnOff"/>
- </element>
- <element name="saveXmlDataOnly">
- <ref name="CT_OnOff"/>
- </element>
- <element name="useXSLTWhenSaving">
- <ref name="CT_OnOff"/>
- </element>
- <element name="saveThroughXslt">
- <ref name="CT_SaveThroughXslt"/>
- </element>
- <element name="showXMLTags">
- <ref name="CT_OnOff"/>
- </element>
- <element name="alwaysMergeEmptyNamespace">
- <ref name="CT_OnOff"/>
- </element>
- <element name="updateFields">
- <ref name="CT_OnOff"/>
- </element>
- <element name="hdrShapeDefaults">
- <ref name="CT_ShapeDefaults"/>
- </element>
- <element name="footnotePr">
- <ref name="CT_FtnDocProps"/>
- </element>
- <element name="endnotePr">
- <ref name="CT_EdnDocProps"/>
- </element>
- <element name="compat">
- <ref name="CT_Compat"/>
- </element>
- <element name="docVars">
- <ref name="CT_DocVars"/>
- </element>
- <element name="rsids">
- <ref name="CT_DocRsids"/>
- </element>
- <ref name="mathPr"/>
- <element name="uiCompat97To2003">
- <ref name="CT_OnOff"/>
- </element>
- <element name="attachedSchema">
- <ref name="CT_String"/>
- </element>
- <element name="themeFontLang">
- <ref name="CT_Language"/>
- </element>
- <element name="clrSchemeMapping">
- <ref name="CT_ColorSchemeMapping"/>
- </element>
- <element name="doNotIncludeSubdocsInStats">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotAutoCompressPictures">
- <ref name="CT_OnOff"/>
- </element>
- <element name="forceUpgrade">
- <ref name="CT_Empty"/>
- </element>
- <element name="captions">
- <ref name="CT_Captions"/>
- </element>
- <element name="readModeInkLockDown">
- <ref name="CT_ReadingModeInkLockDown"/>
- </element>
- <element name="smartTagType">
- <ref name="CT_SmartTagType"/>
- </element>
- <ref name="schemaLibrary"/>
- <element name="shapeDefaults">
- <ref name="CT_ShapeDefaults"/>
- </element>
- <element name="doNotEmbedSmartTags">
- <ref name="CT_OnOff"/>
- </element>
- <element name="decimalSymbol">
- <ref name="CT_String"/>
- </element>
- <element name="listSeparator">
- <ref name="CT_String"/>
- </element>
- </define>
- <define name="CT_WebSettings">
- <element name="frameset">
- <ref name="CT_Frameset"/>
- </element>
- <element name="divs">
- <ref name="CT_Divs"/>
- </element>
- <element name="encoding">
- <ref name="CT_String"/>
- </element>
- <element name="optimizeForBrowser">
- <ref name="CT_OnOff"/>
- </element>
- <element name="relyOnVML">
- <ref name="CT_OnOff"/>
- </element>
- <element name="allowPNG">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotRelyOnCSS">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotSaveAsSingleFile">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotOrganizeInFolder">
- <ref name="CT_OnOff"/>
- </element>
- <element name="doNotUseLongFileNames">
- <ref name="CT_OnOff"/>
- </element>
- <element name="pixelsPerInch">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="targetScreenSz">
- <ref name="CT_TargetScreenSz"/>
- </element>
- <element name="saveSmartTagsAsXml">
- <ref name="CT_OnOff"/>
- </element>
- </define>
- <define name="CT_FrameScrollbar">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Frame">
- <element name="sz">
- <ref name="CT_String"/>
- </element>
- <element name="name">
- <ref name="CT_String"/>
- </element>
- <element name="sourceFileName">
- <ref name="CT_Rel"/>
- </element>
- <element name="marW">
- <ref name="CT_PixelsMeasure"/>
- </element>
- <element name="marH">
- <ref name="CT_PixelsMeasure"/>
- </element>
- <element name="scrollbar">
- <ref name="CT_FrameScrollbar"/>
- </element>
- <element name="noResizeAllowed">
- <ref name="CT_OnOff"/>
- </element>
- <element name="linkedToFile">
- <ref name="CT_OnOff"/>
- </element>
- </define>
- <define name="CT_FrameLayout">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_FramesetSplitbar">
- <element name="w">
- <ref name="CT_TwipsMeasure"/>
- </element>
- <element name="color">
- <ref name="CT_Color"/>
- </element>
- <element name="noBorder">
- <ref name="CT_OnOff"/>
- </element>
- <element name="flatBorders">
- <ref name="CT_OnOff"/>
- </element>
- </define>
- <define name="CT_Frameset">
- <element name="sz">
- <ref name="CT_String"/>
- </element>
- <element name="framesetSplitbar">
- <ref name="CT_FramesetSplitbar"/>
- </element>
- <element name="frameLayout">
- <ref name="CT_FrameLayout"/>
- </element>
- <choice>
- <element name="frameset">
- <ref name="CT_Frameset"/>
- </element>
- <element name="frame">
- <ref name="CT_Frame"/>
- </element>
- </choice>
- </define>
- <define name="CT_NumPicBullet">
- <element name="pict">
- <ref name="CT_Picture"/>
- </element>
- <attribute name="numPicBulletId">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_LevelSuffix">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_LevelText">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- <attribute name="null">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_LvlLegacy">
- <attribute name="legacy">
- <data type="string"/>
- </attribute>
- <attribute name="legacySpace">
- <data type="string"/>
- </attribute>
- <attribute name="legacyIndent">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Lvl">
- <element name="start">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="numFmt">
- <ref name="CT_NumFmt"/>
- </element>
- <element name="lvlRestart">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="pStyle">
- <ref name="CT_String"/>
- </element>
- <element name="isLgl">
- <ref name="CT_OnOff"/>
- </element>
- <element name="suff">
- <ref name="CT_LevelSuffix"/>
- </element>
- <element name="lvlText">
- <ref name="CT_LevelText"/>
- </element>
- <element name="lvlPicBulletId">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="legacy">
- <ref name="CT_LvlLegacy"/>
- </element>
- <element name="lvlJc">
- <ref name="CT_Jc"/>
- </element>
- <element name="pPr">
- <ref name="CT_PPr"/>
- </element>
- <element name="rPr">
- <ref name="CT_RPr"/>
- </element>
- <attribute name="ilvl">
- <data type="string"/>
- </attribute>
- <attribute name="tplc">
- <data type="string"/>
- </attribute>
- <attribute name="tentative">
- <data type="string"/>
- </attribute>
- </define>
- <define name="ST_MultiLevelType">
- <choice>
- <!-- Single Level Numbering Definition -->
- <value>singleLevel</value>
- <!-- Multilevel Numbering Definition -->
- <value>multilevel</value>
- <!-- Hybrid Multilevel Numbering Definition -->
- <value>hybridMultilevel</value>
- </choice>
- </define>
- <define name="CT_MultiLevelType">
- <attribute name="val">
- <ref name="ST_MultiLevelType"/>
- </attribute>
- </define>
- <define name="CT_AbstractNum">
- <element name="nsid">
- <ref name="CT_LongHexNumber"/>
- </element>
- <element name="multiLevelType">
- <ref name="CT_MultiLevelType"/>
- </element>
- <element name="tmpl">
- <ref name="CT_LongHexNumber"/>
- </element>
- <element name="name">
- <ref name="CT_String"/>
- </element>
- <element name="styleLink">
- <ref name="CT_String"/>
- </element>
- <element name="numStyleLink">
- <ref name="CT_String"/>
- </element>
- <element name="lvl">
- <ref name="CT_Lvl"/>
- </element>
- <attribute name="abstractNumId">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_NumLvl">
- <element name="startOverride">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="lvl">
- <ref name="CT_Lvl"/>
- </element>
- <attribute name="ilvl">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Num">
- <element name="abstractNumId">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="lvlOverride">
- <ref name="CT_NumLvl"/>
- </element>
- <attribute name="numId">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Numbering">
- <element name="numPicBullet">
- <ref name="CT_NumPicBullet"/>
- </element>
- <element name="abstractNum">
- <ref name="CT_AbstractNum"/>
- </element>
- <element name="num">
- <ref name="CT_Num"/>
- </element>
- <element name="numIdMacAtCleanup">
- <ref name="CT_DecimalNumber"/>
- </element>
- </define>
- <define name="ST_TblStyleOverrideType">
- <choice>
- <!-- Whole table formatting -->
- <value>wholeTable</value>
- <!-- First Row Conditional Formatting -->
- <value>firstRow</value>
- <!-- Last table row formatting -->
- <value>lastRow</value>
- <!-- First Column Conditional Formatting -->
- <value>firstCol</value>
- <!-- Last table column formatting -->
- <value>lastCol</value>
- <!-- Banded Column Conditional Formatting -->
- <value>band1Vert</value>
- <!-- Even Column Stripe Conditional Formatting -->
- <value>band2Vert</value>
- <!-- Banded Row Conditional Formatting -->
- <value>band1Horz</value>
- <!-- Even Row Stripe Conditional Formatting -->
- <value>band2Horz</value>
- <!-- Top right table cell formatting -->
- <value>neCell</value>
- <!-- Top left table cell formatting -->
- <value>nwCell</value>
- <!-- Bottom right table cell formatting -->
- <value>seCell</value>
- <!-- Bottom left table cell formatting -->
- <value>swCell</value>
- </choice>
- </define>
- <define name="CT_Style_tblStylePr">
- <element name="pPr">
- <ref name="CT_PPrBase"/>
- </element>
- <element name="rPr">
- <ref name="EG_RPrBase"/>
- </element>
- <element name="tblPr">
- <ref name="CT_TblPrBase"/>
- </element>
- <element name="trPr">
- <ref name="CT_TrPrBase"/>
- </element>
- <element name="tcPr">
- <ref name="CT_TcPrBase"/>
- </element>
- <attribute name="type">
- <ref name="ST_TblStyleOverrideType"/>
- </attribute>
- </define>
- <define name="CT_Style_TblPr">
- <ref name="CT_TblPrBase"/>
- </define>
- <define name="CT_Style_TrPr">
- <ref name="CT_TrPrBase"/>
- </define>
- <define name="CT_Style_TcPr">
- <ref name="CT_TcPrBase"/>
- </define>
- <define name="ST_StyleType">
- <choice>
- <!-- Paragraph Style -->
- <value>paragraph</value>
- <!-- Character Style -->
- <value>character</value>
- <!-- Table Style -->
- <value>table</value>
- <!-- Numbering Style -->
- <value>numbering</value>
- </choice>
- </define>
- <define name="CT_Style">
- <element name="name">
- <ref name="CT_String"/>
- </element>
- <element name="aliases">
- <ref name="CT_String"/>
- </element>
- <element name="basedOn">
- <ref name="CT_String"/>
- </element>
- <element name="next">
- <ref name="CT_String"/>
- </element>
- <element name="link">
- <ref name="CT_String"/>
- </element>
- <element name="autoRedefine">
- <ref name="CT_OnOff"/>
- </element>
- <element name="hidden">
- <ref name="CT_OnOff"/>
- </element>
- <element name="uiPriority">
- <ref name="CT_DecimalNumber"/>
- </element>
- <element name="semiHidden">
- <ref name="CT_OnOff"/>
- </element>
- <element name="unhideWhenUsed">
- <ref name="CT_OnOff"/>
- </element>
- <element name="qFormat">
- <ref name="CT_OnOff"/>
- </element>
- <element name="locked">
- <ref name="CT_OnOff"/>
- </element>
- <element name="personal">
- <ref name="CT_OnOff"/>
- </element>
- <element name="personalCompose">
- <ref name="CT_OnOff"/>
- </element>
- <element name="personalReply">
- <ref name="CT_OnOff"/>
- </element>
- <element name="rsid">
- <ref name="CT_LongHexNumber"/>
- </element>
- <element name="pPr">
- <ref name="CT_PPrBase"/>
- </element>
- <element name="rPr">
- <ref name="EG_RPrBase"/>
- </element>
- <element name="tblPr">
- <ref name="CT_TblPrBase"/>
- </element>
- <element name="trPr">
- <ref name="CT_TrPrBase"/>
- </element>
- <element name="tcPr">
- <ref name="CT_TcPrBase"/>
- </element>
- <element name="tblStylePr">
- <ref name="CT_Style_tblStylePr"/>
- </element>
- <attribute name="type">
- <ref name="ST_StyleType"/>
- </attribute>
- <attribute name="styleId">
- <ref name="ST_String"/>
- </attribute>
- <attribute name="default">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="customStyle">
- <ref name="ST_OnOff"/>
- </attribute>
- </define>
- <define name="CT_LsdException">
- <attribute name="name">
- <data type="string"/>
- </attribute>
- <attribute name="locked">
- <data type="string"/>
- </attribute>
- <attribute name="uiPriority">
- <data type="string"/>
- </attribute>
- <attribute name="semiHidden">
- <data type="string"/>
- </attribute>
- <attribute name="unhideWhenUsed">
- <data type="string"/>
- </attribute>
- <attribute name="qFormat">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_LatentStyles">
- <element name="lsdException">
- <ref name="CT_LsdException"/>
- </element>
- <attribute name="defLockedState">
- <data type="string"/>
- </attribute>
- <attribute name="defUIPriority">
- <data type="string"/>
- </attribute>
- <attribute name="defSemiHidden">
- <data type="string"/>
- </attribute>
- <attribute name="defUnhideWhenUsed">
- <data type="string"/>
- </attribute>
- <attribute name="defQFormat">
- <data type="string"/>
- </attribute>
- <attribute name="count">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Styles">
- <element name="docDefaults">
- <ref name="CT_DocDefaults"/>
- </element>
- <element name="latentStyles">
- <ref name="CT_LatentStyles"/>
- </element>
- <element name="style">
- <ref name="CT_Style"/>
- </element>
- </define>
- <define name="ST_Panose">
- <data type="hexBinary"/>
- </define>
- <define name="CT_Panose">
- <attribute name="val">
- <ref name="ST_Panose"/>
- </attribute>
- </define>
- <define name="ST_FontFamily">
- <choice>
- <!-- Novelty Font -->
- <value>decorative</value>
- <!-- Monospace Font -->
- <value>modern</value>
- <!-- Proportional Font With Serifs -->
- <value>roman</value>
- <!-- Script Font -->
- <value>script</value>
- <!-- Proportional Font Without Serifs -->
- <value>swiss</value>
- <!-- No Font Family -->
- <value>auto</value>
- </choice>
- </define>
- <define name="CT_FontFamily">
- <attribute name="val">
- <ref name="ST_FontFamily"/>
- </attribute>
- </define>
- <define name="ST_Pitch">
- <choice>
- <!-- Fixed Width -->
- <value>fixed</value>
- <!-- Proportional Width -->
- <value>variable</value>
- <!-- Default -->
- <value>default</value>
- </choice>
- </define>
- <define name="CT_Pitch">
- <attribute name="val">
- <ref name="ST_Pitch"/>
- </attribute>
- </define>
- <define name="CT_FontSig">
- <attribute name="usb0">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <attribute name="usb1">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <attribute name="usb2">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <attribute name="usb3">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <attribute name="csb0">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <attribute name="csb1">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- </define>
- <define name="CT_FontRel">
- <ref name="CT_Rel"/>
- <attribute name="fontKey">
- <data type="string"/>
- </attribute>
- <attribute name="subsetted">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Font">
- <element name="altName">
- <ref name="CT_String"/>
- </element>
- <element name="panose1">
- <ref name="CT_Panose"/>
- </element>
- <element name="charset">
- <ref name="CT_Charset"/>
- </element>
- <element name="characterSet">
- <ref name="CT_String"/>
- </element>
- <element name="family">
- <ref name="CT_FontFamily"/>
- </element>
- <element name="notTrueType">
- <ref name="CT_OnOff"/>
- </element>
- <element name="pitch">
- <ref name="CT_Pitch"/>
- </element>
- <element name="sig">
- <ref name="CT_FontSig"/>
- </element>
- <element name="embedRegular">
- <ref name="CT_FontRel"/>
- </element>
- <element name="embedBold">
- <ref name="CT_FontRel"/>
- </element>
- <element name="embedItalic">
- <ref name="CT_FontRel"/>
- </element>
- <element name="embedBoldItalic">
- <ref name="CT_FontRel"/>
- </element>
- <attribute name="name">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_FontsList">
- <element name="font">
- <ref name="CT_Font"/>
- </element>
- </define>
- <define name="CT_Charset">
- <attribute name="val">
- <ref name="ST_UcharHexNumber"/>
- </attribute>
- <attribute name="characterSet">
- <ref name="ST_String"/>
- </attribute>
- </define>
- <define name="CT_DivBdr">
- <element name="top">
- <ref name="CT_Border"/>
- </element>
- <element name="left">
- <ref name="CT_Border"/>
- </element>
- <element name="bottom">
- <ref name="CT_Border"/>
- </element>
- <element name="right">
- <ref name="CT_Border"/>
- </element>
- </define>
- <define name="CT_Div">
- <element name="blockQuote">
- <ref name="CT_OnOff"/>
- </element>
- <element name="bodyDiv">
- <ref name="CT_OnOff"/>
- </element>
- <element name="marLeft">
- <ref name="CT_SignedTwipsMeasure"/>
- </element>
- <element name="marRight">
- <ref name="CT_SignedTwipsMeasure"/>
- </element>
- <element name="marTop">
- <ref name="CT_SignedTwipsMeasure"/>
- </element>
- <element name="marBottom">
- <ref name="CT_SignedTwipsMeasure"/>
- </element>
- <element name="divBdr">
- <ref name="CT_DivBdr"/>
- </element>
- <element name="divsChild">
- <ref name="CT_Divs"/>
- </element>
- <attribute name="id">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_Divs">
- <element name="div">
- <ref name="CT_Div"/>
- </element>
- </define>
- <define name="CT_TxbxContent">
- <ref name="EG_BlockLevelElts"/>
- </define>
- <define name="txbxContent">
- <element name="txbxContent">
- <ref name="CT_TxbxContent"/>
- </element>
- </define>
- <define name="EG_MathContent">
- <choice>
- <ref name="oMathPara"/>
- <ref name="oMath"/>
- </choice>
- </define>
- <define name="EG_BlockLevelChunkElts">
- <ref name="EG_ContentBlockContent"/>
- </define>
- <define name="EG_BlockLevelElts">
- <choice>
- <ref name="EG_BlockLevelChunkElts"/>
- <element name="altChunk">
- <ref name="CT_AltChunk"/>
- </element>
- </choice>
- </define>
- <define name="EG_RunLevelElts">
- <choice>
- <element name="proofErr">
- <ref name="CT_ProofErr"/>
- </element>
- <ref name="EG_RangeMarkupElements"/>
- <element name="ins">
- <ref name="CT_RunTrackChange"/>
- </element>
- <element name="del">
- <ref name="CT_RunTrackChange"/>
- </element>
- <element name="moveFrom">
- <ref name="CT_RunTrackChange"/>
- </element>
- <element name="moveTo">
- <ref name="CT_RunTrackChange"/>
- </element>
- <ref name="EG_MathContent"/>
- </choice>
- </define>
- <define name="CT_Body">
- <ref name="EG_BlockLevelElts"/>
- <element name="sectPr">
- <ref name="CT_finalSectPr"/>
- </element>
- </define>
- <define name="CT_ShapeDefaults">
- <element>
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- </define>
- <define name="CT_Comments">
- <element name="comment">
- <ref name="CT_Comment"/>
- </element>
- </define>
- <define name="comments">
- <element name="comments">
- <ref name="CT_Comments"/>
- </element>
- </define>
- <define name="CT_Footnotes">
- <element name="footnote">
- <ref name="CT_FtnEdn"/>
- </element>
- </define>
- <define name="footnotes">
- <element name="footnotes">
- <ref name="CT_Footnotes"/>
- </element>
- </define>
- <define name="CT_Endnotes">
- <element name="endnote">
- <ref name="CT_FtnEdn"/>
- </element>
- </define>
- <define name="endnotes">
- <element name="endnotes">
- <ref name="CT_Endnotes"/>
- </element>
- </define>
- <define name="hdr">
- <element name="hdr">
- <ref name="CT_HdrFtr"/>
- </element>
- </define>
- <define name="ftr">
- <element name="ftr">
- <ref name="CT_HdrFtr"/>
- </element>
- </define>
- <define name="CT_SmartTagType">
- <attribute name="namespaceuri">
- <data type="string"/>
- </attribute>
- <attribute name="name">
- <data type="string"/>
- </attribute>
- <attribute name="url">
- <data type="string"/>
- </attribute>
- </define>
- <define name="ST_ThemeColor">
- <choice>
- <!-- Dark 1 Theme Color -->
- <value>dark1</value>
- <!-- Light 1 Theme Color -->
- <value>light1</value>
- <!-- Dark 2 Theme Color -->
- <value>dark2</value>
- <!-- Light 2 Theme Color -->
- <value>light2</value>
- <!-- Accent 1 Theme Color -->
- <value>accent1</value>
- <!-- Accent 2 Theme Color -->
- <value>accent2</value>
- <!-- Accent 3 Theme Color -->
- <value>accent3</value>
- <!-- Accent 4 Theme Color -->
- <value>accent4</value>
- <!-- Accent 5 Theme Color -->
- <value>accent5</value>
- <!-- Accent 6 Theme Color -->
- <value>accent6</value>
- <!-- Hyperlink Theme Color -->
- <value>hyperlink</value>
- <!-- Followed Hyperlink Theme Color -->
- <value>followedHyperlink</value>
- <!-- No Theme Color -->
- <value>none</value>
- <!-- Background 1 Theme Color -->
- <value>background1</value>
- <!-- Text 1 Theme Color -->
- <value>text1</value>
- <!-- Background 2 Theme Color -->
- <value>background2</value>
- <!-- Text 2 Theme Color -->
- <value>text2</value>
- </choice>
- </define>
- <define name="CT_DocPartBehavior">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_DocPartBehaviors">
- <element name="behavior">
- <ref name="CT_DocPartBehavior"/>
- </element>
- </define>
- <define name="CT_DocPartType">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_DocPartTypes">
- <element name="type">
- <ref name="CT_DocPartType"/>
- </element>
- <attribute name="all">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_DocPartGallery">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_DocPartCategory">
- <element name="name">
- <ref name="CT_String"/>
- </element>
- <element name="gallery">
- <ref name="CT_DocPartGallery"/>
- </element>
- </define>
- <define name="CT_DocPartName">
- <attribute name="val">
- <data type="string"/>
- </attribute>
- <attribute name="decorated">
- <data type="string"/>
- </attribute>
- </define>
- <define name="CT_DocPartPr">
- <choice>
- <element name="name">
- <ref name="CT_DocPartName"/>
- </element>
- <element name="style">
- <ref name="CT_String"/>
- </element>
- <element name="category">
- <ref name="CT_DocPartCategory"/>
- </element>
- <element name="types">
- <ref name="CT_DocPartTypes"/>
- </element>
- <element name="behaviors">
- <ref name="CT_DocPartBehaviors"/>
- </element>
- <element name="description">
- <ref name="CT_String"/>
- </element>
- <element name="guid">
- <ref name="CT_Guid"/>
- </element>
- </choice>
- </define>
- <define name="CT_DocPart">
- <element name="docPartPr">
- <ref name="CT_DocPartPr"/>
- </element>
- <element name="docPartBody">
- <ref name="CT_Body"/>
- </element>
- </define>
- <define name="CT_DocParts">
- <element name="docPart">
- <ref name="CT_DocPart"/>
- </element>
- </define>
- <define name="settings">
- <element name="settings">
- <ref name="CT_Settings"/>
- </element>
- </define>
- <define name="webSettings">
- <element name="webSettings">
- <ref name="CT_WebSettings"/>
- </element>
- </define>
- <define name="fonts">
- <element name="fonts">
- <ref name="CT_FontsList"/>
- </element>
- </define>
- <define name="numbering">
- <element name="numbering">
- <ref name="CT_Numbering"/>
- </element>
- </define>
- <define name="styles">
- <element name="styles">
- <ref name="CT_Styles"/>
- </element>
- </define>
- <define name="ST_CaptionPos">
- <choice>
- <!-- Position Caption Above Object -->
- <value>above</value>
- <!-- Position Caption Below Object -->
- <value>below</value>
- <!-- Position Caption Left Of Object -->
- <value>left</value>
- <!-- Position Caption Right Of Object -->
- <value>right</value>
- </choice>
- </define>
- <define name="CT_Caption">
- <attribute name="name">
- <ref name="ST_String"/>
- </attribute>
- <attribute name="pos">
- <ref name="ST_CaptionPos"/>
- </attribute>
- <attribute name="chapNum">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="heading">
- <ref name="ST_DecimalNumber"/>
- </attribute>
- <attribute name="noLabel">
- <ref name="ST_OnOff"/>
- </attribute>
- <attribute name="numFmt">
- <ref name="ST_NumberFormat"/>
- </attribute>
- <attribute name="sep">
- <ref name="ST_ChapterSep"/>
- </attribute>
- </define>
- <define name="CT_AutoCaption">
- <attribute name="name">
- <ref name="ST_String"/>
- </attribute>
- <attribute name="caption">
- <ref name="ST_String"/>
- </attribute>
- </define>
- <define name="CT_AutoCaptions">
- <element name="autoCaption">
- <ref name="CT_AutoCaption"/>
- </element>
- </define>
- <define name="CT_Captions">
- <element name="caption">
- <ref name="CT_Caption"/>
- </element>
- <element name="autoCaptions">
- <ref name="CT_AutoCaptions"/>
- </element>
- </define>
- <define name="CT_DocumentBase">
- <element name="background">
- <ref name="CT_Background"/>
- </element>
- </define>
- <define name="CT_Document">
- <ref name="CT_DocumentBase"/>
- <element name="body">
- <ref name="CT_Body"/>
- </element>
- </define>
- <define name="CT_GlossaryDocument">
- <ref name="CT_DocumentBase"/>
- <element name="docParts">
- <ref name="CT_DocParts"/>
- </element>
- </define>
- <define name="document">
- <element name="document">
- <ref name="CT_Document"/>
- </element>
- </define>
- <define name="glossaryDocument">
- <element name="glossaryDocument">
- <ref name="CT_GlossaryDocument"/>
- </element>
- </define>
- <define name="BUILT_IN_ANY_TYPE">
- <choice>
- <element>
- <ref name="BUILT_IN_ANY_TYPE"/>
- </element>
- <data type="string"/>
- </choice>
- </define>
- </grammar>
- <resource name="CT_Empty" resource="Stream">
- <action name="end" tokenid="ooxml:EG_RunInnerContent_noBreakHyphen" action="noBreakHyphen"/>
- <action name="end" tokenid="ooxml:EG_RunInnerContent_softHyphen" action="softHyphen"/>
- <action name="end" tokenid="ooxml:EG_RunInnerContent_cr" action="cr"/>
- </resource>
- <resource name="ST_OnOff" resource="Boolean"/>
- <resource name="CT_OnOff" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_OnOff_val" action="setValue"/>
- <action name="start" action="setDefaultBooleanValue"/>
- </resource>
- <resource name="ST_LongHexNumber" resource="Hex"/>
- <resource name="CT_LongHexNumber" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_LongHexNumber_val" action="setValue"/>
- <action name="start" action="setDefaultHexValue"/>
- </resource>
- <resource name="ST_ShortHexNumber" resource="Hex"/>
- <resource name="CT_ShortHexNumber" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_ShortHexNumber_val" action="setValue"/>
- <action name="start" action="setDefaultHexValue"/>
- </resource>
- <resource name="ST_UcharHexNumber" resource="Hex"/>
- <resource name="CT_UcharHexNumber" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_UcharHexNumber_val" action="setValue"/>
- <action name="start" action="setDefaultHexValue"/>
- </resource>
- <resource name="ST_DecimalNumber" resource="Integer"/>
- <resource name="CT_DecimalNumber" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_DecimalNumber_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="ST_UnsignedDecimalNumber" resource="Integer"/>
-<!--
- Historically, LO has treated TwipsMeasure as signed,
- i.e. that negative numbers are allowed and treated as negative,
- so that is the default handling.
--->
- <resource name="ST_TwipsMeasure" resource="TwipsMeasure_asSigned"/>
- <resource name="ST_TwipsMeasure_asSigned" resource="TwipsMeasure_asSigned"/>
- <resource name="ST_TwipsMeasure_asZero" resource="TwipsMeasure_asZero"/>
- <resource name="CT_TwipsMeasure" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_TwipsMeasure_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="ST_SignedTwipsMeasure" resource="TwipsMeasure_asSigned"/>
- <resource name="CT_SignedTwipsMeasure" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_SignedTwipsMeasure_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="ST_PixelsMeasure" resource="Integer"/>
- <resource name="CT_PixelsMeasure" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_PixelsMeasure_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="ST_HpsMeasure" resource="HpsMeasure"/>
- <resource name="CT_HpsMeasure" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_HpsMeasure_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="ST_SignedHpsMeasure" resource="Integer"/>
- <resource name="CT_SignedHpsMeasure" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_SignedHpsMeasure_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="ST_MeasurementOrPercent" resource="MeasurementOrPercent"/>
- <resource name="ST_DateTime" resource="String"/>
- <resource name="CT_MacroName" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_MacroName_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="ST_EighthPointMeasure" resource="Integer"/>
- <resource name="ST_PointMeasure" resource="Integer"/>
- <resource name="ST_String" resource="String"/>
- <resource name="CT_String" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_String_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="ST_TextScale" resource="Integer"/>
- <resource name="CT_TextScale" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_TextScale_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="ST_HighlightColor" resource="List">
- <value tokenid="ooxml:Value_ST_HighlightColor_black">black</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_blue">blue</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_cyan">cyan</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_green">green</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_magenta">magenta</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_red">red</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_yellow">yellow</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_white">white</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_darkBlue">darkBlue</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_darkCyan">darkCyan</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_darkGreen">darkGreen</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_darkMagenta">darkMagenta</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_darkRed">darkRed</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_darkYellow">darkYellow</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_darkGray">darkGray</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_lightGray">lightGray</value>
- <value tokenid="ooxml:Value_ST_HighlightColor_none">none</value>
- </resource>
- <resource name="CT_Highlight" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Highlight_val" action="setValue"/>
- </resource>
- <resource name="ST_HexColorAuto" resource="List">
- <value tokenid="ooxml:Value_ST_HexColorAuto_auto">auto</value>
- </resource>
- <resource name="ST_HexColorRGB" resource="Hex"/>
- <resource name="ST_HexColor" resource="HexColor"/>
- <resource name="CT_Color" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_Color_val"/>
- <attribute name="themeColor" tokenid="ooxml:CT_Color_themeColor"/>
- <attribute name="themeTint" tokenid="ooxml:CT_Color_themeTint"/>
- <attribute name="themeShade" tokenid="ooxml:CT_Color_themeShade"/>
- </resource>
- <resource name="ST_LangCode" resource="Hex"/>
- <resource name="ST_Lang" resource="String"/>
- <resource name="CT_Lang" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Lang_val" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="CT_Guid" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Guid_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="ST_Underline" resource="List">
- <value tokenid="ooxml:Value_ST_Underline_single">single</value>
- <value tokenid="ooxml:Value_ST_Underline_words">words</value>
- <value tokenid="ooxml:Value_ST_Underline_double">double</value>
- <value tokenid="ooxml:Value_ST_Underline_thick">thick</value>
- <value tokenid="ooxml:Value_ST_Underline_dotted">dotted</value>
- <value tokenid="ooxml:Value_ST_Underline_dottedHeavy">dottedHeavy</value>
- <value tokenid="ooxml:Value_ST_Underline_dash">dash</value>
- <value tokenid="ooxml:Value_ST_Underline_dashedHeavy">dashedHeavy</value>
- <value tokenid="ooxml:Value_ST_Underline_dashLong">dashLong</value>
- <value tokenid="ooxml:Value_ST_Underline_dashLongHeavy">dashLongHeavy</value>
- <value tokenid="ooxml:Value_ST_Underline_dotDash">dotDash</value>
- <value tokenid="ooxml:Value_ST_Underline_dashDotHeavy">dashDotHeavy</value>
- <value tokenid="ooxml:Value_ST_Underline_dotDotDash">dotDotDash</value>
- <value tokenid="ooxml:Value_ST_Underline_dashDotDotHeavy">dashDotDotHeavy</value>
- <value tokenid="ooxml:Value_ST_Underline_wave">wave</value>
- <value tokenid="ooxml:Value_ST_Underline_wavyHeavy">wavyHeavy</value>
- <value tokenid="ooxml:Value_ST_Underline_wavyDouble">wavyDouble</value>
- <value tokenid="ooxml:Value_ST_Underline_none">none</value>
- </resource>
- <resource name="CT_Underline" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_Underline_val"/>
- <attribute name="color" tokenid="ooxml:CT_Underline_color"/>
- <attribute name="themeColor" tokenid="ooxml:CT_Underline_themeColor"/>
- <attribute name="themeTint" tokenid="ooxml:CT_Underline_themeTint"/>
- <attribute name="themeShade" tokenid="ooxml:CT_Underline_themeShade"/>
- </resource>
- <resource name="ST_TextEffect" resource="List">
- <value tokenid="ooxml:Value_ST_TextEffect_none">none</value>
- <value tokenid="ooxml:Value_ST_TextEffect_lights">lights</value>
- <value tokenid="ooxml:Value_ST_TextEffect_blinkBackground">blinkBackground</value>
- <value tokenid="ooxml:Value_ST_TextEffect_sparkle">sparkle</value>
- <value tokenid="ooxml:Value_ST_TextEffect_antsBlack">antsBlack</value>
- <value tokenid="ooxml:Value_ST_TextEffect_antsRed">antsRed</value>
- <value tokenid="ooxml:Value_ST_TextEffect_shimmer">shimmer</value>
- </resource>
- <resource name="CT_TextEffect" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_TextEffect_val" action="setValue"/>
- </resource>
- <resource name="ST_Border" resource="List">
- <value tokenid="ooxml:Value_ST_Border_nil">nil</value>
- <value tokenid="ooxml:Value_ST_Border_none">none</value>
- <value tokenid="ooxml:Value_ST_Border_single">single</value>
- <value tokenid="ooxml:Value_ST_Border_thick">thick</value>
- <value tokenid="ooxml:Value_ST_Border_double">double</value>
- <value tokenid="ooxml:Value_ST_Border_dotted">dotted</value>
- <value tokenid="ooxml:Value_ST_Border_dashed">dashed</value>
- <value tokenid="ooxml:Value_ST_Border_dotDash">dotDash</value>
- <value tokenid="ooxml:Value_ST_Border_dotDotDash">dotDotDash</value>
- <value tokenid="ooxml:Value_ST_Border_triple">triple</value>
- <value tokenid="ooxml:Value_ST_Border_thinThickSmallGap">thinThickSmallGap</value>
- <value tokenid="ooxml:Value_ST_Border_thickThinSmallGap">thickThinSmallGap</value>
- <value tokenid="ooxml:Value_ST_Border_thinThickThinSmallGap">thinThickThinSmallGap</value>
- <value tokenid="ooxml:Value_ST_Border_thinThickMediumGap">thinThickMediumGap</value>
- <value tokenid="ooxml:Value_ST_Border_thickThinMediumGap">thickThinMediumGap</value>
- <value tokenid="ooxml:Value_ST_Border_thinThickThinMediumGap">thinThickThinMediumGap</value>
- <value tokenid="ooxml:Value_ST_Border_thinThickLargeGap">thinThickLargeGap</value>
- <value tokenid="ooxml:Value_ST_Border_thickThinLargeGap">thickThinLargeGap</value>
- <value tokenid="ooxml:Value_ST_Border_thinThickThinLargeGap">thinThickThinLargeGap</value>
- <value tokenid="ooxml:Value_ST_Border_wave">wave</value>
- <value tokenid="ooxml:Value_ST_Border_doubleWave">doubleWave</value>
- <value tokenid="ooxml:Value_ST_Border_dashSmallGap">dashSmallGap</value>
- <value tokenid="ooxml:Value_ST_Border_dashDotStroked">dashDotStroked</value>
- <value tokenid="ooxml:Value_ST_Border_threeDEmboss">threeDEmboss</value>
- <value tokenid="ooxml:Value_ST_Border_threeDEngrave">threeDEngrave</value>
- <value tokenid="ooxml:Value_ST_Border_outset">outset</value>
- <value tokenid="ooxml:Value_ST_Border_inset">inset</value>
- <value tokenid="ooxml:Value_ST_Border_apples">apples</value>
- <value tokenid="ooxml:Value_ST_Border_archedScallops">archedScallops</value>
- <value tokenid="ooxml:Value_ST_Border_babyPacifier">babyPacifier</value>
- <value tokenid="ooxml:Value_ST_Border_babyRattle">babyRattle</value>
- <value tokenid="ooxml:Value_ST_Border_balloons3Colors">balloons3Colors</value>
- <value tokenid="ooxml:Value_ST_Border_balloonsHotAir">balloonsHotAir</value>
- <value tokenid="ooxml:Value_ST_Border_basicBlackDashes">basicBlackDashes</value>
- <value tokenid="ooxml:Value_ST_Border_basicBlackDots">basicBlackDots</value>
- <value tokenid="ooxml:Value_ST_Border_basicBlackSquares">basicBlackSquares</value>
- <value tokenid="ooxml:Value_ST_Border_basicThinLines">basicThinLines</value>
- <value tokenid="ooxml:Value_ST_Border_basicWhiteDashes">basicWhiteDashes</value>
- <value tokenid="ooxml:Value_ST_Border_basicWhiteDots">basicWhiteDots</value>
- <value tokenid="ooxml:Value_ST_Border_basicWhiteSquares">basicWhiteSquares</value>
- <value tokenid="ooxml:Value_ST_Border_basicWideInline">basicWideInline</value>
- <value tokenid="ooxml:Value_ST_Border_basicWideMidline">basicWideMidline</value>
- <value tokenid="ooxml:Value_ST_Border_basicWideOutline">basicWideOutline</value>
- <value tokenid="ooxml:Value_ST_Border_bats">bats</value>
- <value tokenid="ooxml:Value_ST_Border_birds">birds</value>
- <value tokenid="ooxml:Value_ST_Border_birdsFlight">birdsFlight</value>
- <value tokenid="ooxml:Value_ST_Border_cabins">cabins</value>
- <value tokenid="ooxml:Value_ST_Border_cakeSlice">cakeSlice</value>
- <value tokenid="ooxml:Value_ST_Border_candyCorn">candyCorn</value>
- <value tokenid="ooxml:Value_ST_Border_celticKnotwork">celticKnotwork</value>
- <value tokenid="ooxml:Value_ST_Border_certificateBanner">certificateBanner</value>
- <value tokenid="ooxml:Value_ST_Border_chainLink">chainLink</value>
- <value tokenid="ooxml:Value_ST_Border_champagneBottle">champagneBottle</value>
- <value tokenid="ooxml:Value_ST_Border_checkedBarBlack">checkedBarBlack</value>
- <value tokenid="ooxml:Value_ST_Border_checkedBarColor">checkedBarColor</value>
- <value tokenid="ooxml:Value_ST_Border_checkered">checkered</value>
- <value tokenid="ooxml:Value_ST_Border_christmasTree">christmasTree</value>
- <value tokenid="ooxml:Value_ST_Border_circlesLines">circlesLines</value>
- <value tokenid="ooxml:Value_ST_Border_circlesRectangles">circlesRectangles</value>
- <value tokenid="ooxml:Value_ST_Border_classicalWave">classicalWave</value>
- <value tokenid="ooxml:Value_ST_Border_clocks">clocks</value>
- <value tokenid="ooxml:Value_ST_Border_compass">compass</value>
- <value tokenid="ooxml:Value_ST_Border_confetti">confetti</value>
- <value tokenid="ooxml:Value_ST_Border_confettiGrays">confettiGrays</value>
- <value tokenid="ooxml:Value_ST_Border_confettiOutline">confettiOutline</value>
- <value tokenid="ooxml:Value_ST_Border_confettiStreamers">confettiStreamers</value>
- <value tokenid="ooxml:Value_ST_Border_confettiWhite">confettiWhite</value>
- <value tokenid="ooxml:Value_ST_Border_cornerTriangles">cornerTriangles</value>
- <value tokenid="ooxml:Value_ST_Border_couponCutoutDashes">couponCutoutDashes</value>
- <value tokenid="ooxml:Value_ST_Border_couponCutoutDots">couponCutoutDots</value>
- <value tokenid="ooxml:Value_ST_Border_crazyMaze">crazyMaze</value>
- <value tokenid="ooxml:Value_ST_Border_creaturesButterfly">creaturesButterfly</value>
- <value tokenid="ooxml:Value_ST_Border_creaturesFish">creaturesFish</value>
- <value tokenid="ooxml:Value_ST_Border_creaturesInsects">creaturesInsects</value>
- <value tokenid="ooxml:Value_ST_Border_creaturesLadyBug">creaturesLadyBug</value>
- <value tokenid="ooxml:Value_ST_Border_crossStitch">crossStitch</value>
- <value tokenid="ooxml:Value_ST_Border_cup">cup</value>
- <value tokenid="ooxml:Value_ST_Border_decoArch">decoArch</value>
- <value tokenid="ooxml:Value_ST_Border_decoArchColor">decoArchColor</value>
- <value tokenid="ooxml:Value_ST_Border_decoBlocks">decoBlocks</value>
- <value tokenid="ooxml:Value_ST_Border_diamondsGray">diamondsGray</value>
- <value tokenid="ooxml:Value_ST_Border_doubleD">doubleD</value>
- <value tokenid="ooxml:Value_ST_Border_doubleDiamonds">doubleDiamonds</value>
- <value tokenid="ooxml:Value_ST_Border_earth1">earth1</value>
- <value tokenid="ooxml:Value_ST_Border_earth2">earth2</value>
- <value tokenid="ooxml:Value_ST_Border_eclipsingSquares1">eclipsingSquares1</value>
- <value tokenid="ooxml:Value_ST_Border_eclipsingSquares2">eclipsingSquares2</value>
- <value tokenid="ooxml:Value_ST_Border_eggsBlack">eggsBlack</value>
- <value tokenid="ooxml:Value_ST_Border_fans">fans</value>
- <value tokenid="ooxml:Value_ST_Border_film">film</value>
- <value tokenid="ooxml:Value_ST_Border_firecrackers">firecrackers</value>
- <value tokenid="ooxml:Value_ST_Border_flowersBlockPrint">flowersBlockPrint</value>
- <value tokenid="ooxml:Value_ST_Border_flowersDaisies">flowersDaisies</value>
- <value tokenid="ooxml:Value_ST_Border_flowersModern1">flowersModern1</value>
- <value tokenid="ooxml:Value_ST_Border_flowersModern2">flowersModern2</value>
- <value tokenid="ooxml:Value_ST_Border_flowersPansy">flowersPansy</value>
- <value tokenid="ooxml:Value_ST_Border_flowersRedRose">flowersRedRose</value>
- <value tokenid="ooxml:Value_ST_Border_flowersRoses">flowersRoses</value>
- <value tokenid="ooxml:Value_ST_Border_flowersTeacup">flowersTeacup</value>
- <value tokenid="ooxml:Value_ST_Border_flowersTiny">flowersTiny</value>
- <value tokenid="ooxml:Value_ST_Border_gems">gems</value>
- <value tokenid="ooxml:Value_ST_Border_gingerbreadMan">gingerbreadMan</value>
- <value tokenid="ooxml:Value_ST_Border_gradient">gradient</value>
- <value tokenid="ooxml:Value_ST_Border_handmade1">handmade1</value>
- <value tokenid="ooxml:Value_ST_Border_handmade2">handmade2</value>
- <value tokenid="ooxml:Value_ST_Border_heartBalloon">heartBalloon</value>
- <value tokenid="ooxml:Value_ST_Border_heartGray">heartGray</value>
- <value tokenid="ooxml:Value_ST_Border_hearts">hearts</value>
- <value tokenid="ooxml:Value_ST_Border_heebieJeebies">heebieJeebies</value>
- <value tokenid="ooxml:Value_ST_Border_holly">holly</value>
- <value tokenid="ooxml:Value_ST_Border_houseFunky">houseFunky</value>
- <value tokenid="ooxml:Value_ST_Border_hypnotic">hypnotic</value>
- <value tokenid="ooxml:Value_ST_Border_iceCreamCones">iceCreamCones</value>
- <value tokenid="ooxml:Value_ST_Border_lightBulb">lightBulb</value>
- <value tokenid="ooxml:Value_ST_Border_lightning1">lightning1</value>
- <value tokenid="ooxml:Value_ST_Border_lightning2">lightning2</value>
- <value tokenid="ooxml:Value_ST_Border_mapPins">mapPins</value>
- <value tokenid="ooxml:Value_ST_Border_mapleLeaf">mapleLeaf</value>
- <value tokenid="ooxml:Value_ST_Border_mapleMuffins">mapleMuffins</value>
- <value tokenid="ooxml:Value_ST_Border_marquee">marquee</value>
- <value tokenid="ooxml:Value_ST_Border_marqueeToothed">marqueeToothed</value>
- <value tokenid="ooxml:Value_ST_Border_moons">moons</value>
- <value tokenid="ooxml:Value_ST_Border_mosaic">mosaic</value>
- <value tokenid="ooxml:Value_ST_Border_musicNotes">musicNotes</value>
- <value tokenid="ooxml:Value_ST_Border_northwest">northwest</value>
- <value tokenid="ooxml:Value_ST_Border_ovals">ovals</value>
- <value tokenid="ooxml:Value_ST_Border_packages">packages</value>
- <value tokenid="ooxml:Value_ST_Border_palmsBlack">palmsBlack</value>
- <value tokenid="ooxml:Value_ST_Border_palmsColor">palmsColor</value>
- <value tokenid="ooxml:Value_ST_Border_paperClips">paperClips</value>
- <value tokenid="ooxml:Value_ST_Border_papyrus">papyrus</value>
- <value tokenid="ooxml:Value_ST_Border_partyFavor">partyFavor</value>
- <value tokenid="ooxml:Value_ST_Border_partyGlass">partyGlass</value>
- <value tokenid="ooxml:Value_ST_Border_pencils">pencils</value>
- <value tokenid="ooxml:Value_ST_Border_people">people</value>
- <value tokenid="ooxml:Value_ST_Border_peopleWaving">peopleWaving</value>
- <value tokenid="ooxml:Value_ST_Border_peopleHats">peopleHats</value>
- <value tokenid="ooxml:Value_ST_Border_poinsettias">poinsettias</value>
- <value tokenid="ooxml:Value_ST_Border_postageStamp">postageStamp</value>
- <value tokenid="ooxml:Value_ST_Border_pumpkin1">pumpkin1</value>
- <value tokenid="ooxml:Value_ST_Border_pushPinNote2">pushPinNote2</value>
- <value tokenid="ooxml:Value_ST_Border_pushPinNote1">pushPinNote1</value>
- <value tokenid="ooxml:Value_ST_Border_pyramids">pyramids</value>
- <value tokenid="ooxml:Value_ST_Border_pyramidsAbove">pyramidsAbove</value>
- <value tokenid="ooxml:Value_ST_Border_quadrants">quadrants</value>
- <value tokenid="ooxml:Value_ST_Border_rings">rings</value>
- <value tokenid="ooxml:Value_ST_Border_safari">safari</value>
- <value tokenid="ooxml:Value_ST_Border_sawtooth">sawtooth</value>
- <value tokenid="ooxml:Value_ST_Border_sawtoothGray">sawtoothGray</value>
- <value tokenid="ooxml:Value_ST_Border_scaredCat">scaredCat</value>
- <value tokenid="ooxml:Value_ST_Border_seattle">seattle</value>
- <value tokenid="ooxml:Value_ST_Border_shadowedSquares">shadowedSquares</value>
- <value tokenid="ooxml:Value_ST_Border_sharksTeeth">sharksTeeth</value>
- <value tokenid="ooxml:Value_ST_Border_shorebirdTracks">shorebirdTracks</value>
- <value tokenid="ooxml:Value_ST_Border_skyrocket">skyrocket</value>
- <value tokenid="ooxml:Value_ST_Border_snowflakeFancy">snowflakeFancy</value>
- <value tokenid="ooxml:Value_ST_Border_snowflakes">snowflakes</value>
- <value tokenid="ooxml:Value_ST_Border_sombrero">sombrero</value>
- <value tokenid="ooxml:Value_ST_Border_southwest">southwest</value>
- <value tokenid="ooxml:Value_ST_Border_stars">stars</value>
- <value tokenid="ooxml:Value_ST_Border_starsTop">starsTop</value>
- <value tokenid="ooxml:Value_ST_Border_stars3d">stars3d</value>
- <value tokenid="ooxml:Value_ST_Border_starsBlack">starsBlack</value>
- <value tokenid="ooxml:Value_ST_Border_starsShadowed">starsShadowed</value>
- <value tokenid="ooxml:Value_ST_Border_sun">sun</value>
- <value tokenid="ooxml:Value_ST_Border_swirligig">swirligig</value>
- <value tokenid="ooxml:Value_ST_Border_tornPaper">tornPaper</value>
- <value tokenid="ooxml:Value_ST_Border_tornPaperBlack">tornPaperBlack</value>
- <value tokenid="ooxml:Value_ST_Border_trees">trees</value>
- <value tokenid="ooxml:Value_ST_Border_triangleParty">triangleParty</value>
- <value tokenid="ooxml:Value_ST_Border_triangles">triangles</value>
- <value tokenid="ooxml:Value_ST_Border_tribal1">tribal1</value>
- <value tokenid="ooxml:Value_ST_Border_tribal2">tribal2</value>
- <value tokenid="ooxml:Value_ST_Border_tribal3">tribal3</value>
- <value tokenid="ooxml:Value_ST_Border_tribal4">tribal4</value>
- <value tokenid="ooxml:Value_ST_Border_tribal5">tribal5</value>
- <value tokenid="ooxml:Value_ST_Border_tribal6">tribal6</value>
- <value tokenid="ooxml:Value_ST_Border_twistedLines1">twistedLines1</value>
- <value tokenid="ooxml:Value_ST_Border_twistedLines2">twistedLines2</value>
- <value tokenid="ooxml:Value_ST_Border_vine">vine</value>
- <value tokenid="ooxml:Value_ST_Border_waveline">waveline</value>
- <value tokenid="ooxml:Value_ST_Border_weavingAngles">weavingAngles</value>
- <value tokenid="ooxml:Value_ST_Border_weavingBraid">weavingBraid</value>
- <value tokenid="ooxml:Value_ST_Border_weavingRibbon">weavingRibbon</value>
- <value tokenid="ooxml:Value_ST_Border_weavingStrips">weavingStrips</value>
- <value tokenid="ooxml:Value_ST_Border_whiteFlowers">whiteFlowers</value>
- <value tokenid="ooxml:Value_ST_Border_woodwork">woodwork</value>
- <value tokenid="ooxml:Value_ST_Border_xIllusions">xIllusions</value>
- <value tokenid="ooxml:Value_ST_Border_zanyTriangles">zanyTriangles</value>
- <value tokenid="ooxml:Value_ST_Border_zigZag">zigZag</value>
- <value tokenid="ooxml:Value_ST_Border_zigZagStitch">zigZagStitch</value>
- </resource>
- <resource name="CT_Border" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_Border_val"/>
- <attribute name="color" tokenid="ooxml:CT_Border_color"/>
- <attribute name="themeColor" tokenid="ooxml:CT_Border_themeColor"/>
- <attribute name="themeTint" tokenid="ooxml:CT_Border_themeTint"/>
- <attribute name="themeShade" tokenid="ooxml:CT_Border_themeShade"/>
- <attribute name="sz" tokenid="ooxml:CT_Border_sz"/>
- <attribute name="space" tokenid="ooxml:CT_Border_space"/>
- <attribute name="shadow" tokenid="ooxml:CT_Border_shadow"/>
- <attribute name="frame" tokenid="ooxml:CT_Border_frame"/>
- </resource>
- <!-- This DOCX values will be mapped to match the 'DOC' values that are defined here: -->
- <!-- http://msdn.microsoft.com/en-us/library/dd945712(v=office.12).aspx -->
- <resource name="ST_Shd" resource="List">
- <value tokenid="ooxml:Value_ST_Shd_clear">clear</value>
- <value tokenid="ooxml:Value_ST_Shd_solid">solid</value>
- <value tokenid="ooxml:Value_ST_Shd_pct5">pct5</value>
- <value tokenid="ooxml:Value_ST_Shd_pct10">pct10</value>
- <value tokenid="ooxml:Value_ST_Shd_pct20">pct20</value>
- <value tokenid="ooxml:Value_ST_Shd_pct25">pct25</value>
- <value tokenid="ooxml:Value_ST_Shd_pct30">pct30</value>
- <value tokenid="ooxml:Value_ST_Shd_pct40">pct40</value>
- <value tokenid="ooxml:Value_ST_Shd_pct50">pct50</value>
- <value tokenid="ooxml:Value_ST_Shd_pct60">pct60</value>
- <value tokenid="ooxml:Value_ST_Shd_pct70">pct70</value>
- <value tokenid="ooxml:Value_ST_Shd_pct75">pct75</value>
- <value tokenid="ooxml:Value_ST_Shd_pct80">pct80</value>
- <value tokenid="ooxml:Value_ST_Shd_pct90">pct90</value>
- <value tokenid="ooxml:Value_ST_Shd_horzStripe">horzStripe</value>
- <value tokenid="ooxml:Value_ST_Shd_vertStripe">vertStripe</value>
- <value tokenid="ooxml:Value_ST_Shd_reverseDiagStripe">reverseDiagStripe</value>
- <value tokenid="ooxml:Value_ST_Shd_diagStripe">diagStripe</value>
- <value tokenid="ooxml:Value_ST_Shd_horzCross">horzCross</value>
- <value tokenid="ooxml:Value_ST_Shd_diagCross">diagCross</value>
- <value tokenid="ooxml:Value_ST_Shd_thinHorzStripe">thinHorzStripe</value>
- <value tokenid="ooxml:Value_ST_Shd_thinVertStripe">thinVertStripe</value>
- <value tokenid="ooxml:Value_ST_Shd_thinReverseDiagStripe">thinReverseDiagStripe</value>
- <value tokenid="ooxml:Value_ST_Shd_thinDiagStripe">thinDiagStripe</value>
- <value tokenid="ooxml:Value_ST_Shd_thinHorzCross">thinHorzCross</value>
- <value tokenid="ooxml:Value_ST_Shd_thinDiagCross">thinDiagCross</value>
- <value tokenid="ooxml:Value_ST_Shd_pct12">pct12</value>
- <value tokenid="ooxml:Value_ST_Shd_pct15">pct15</value>
- <value tokenid="ooxml:Value_ST_Shd_pct35">pct35</value>
- <value tokenid="ooxml:Value_ST_Shd_pct37">pct37</value>
- <value tokenid="ooxml:Value_ST_Shd_pct45">pct45</value>
- <value tokenid="ooxml:Value_ST_Shd_pct55">pct55</value>
- <value tokenid="ooxml:Value_ST_Shd_pct62">pct62</value>
- <value tokenid="ooxml:Value_ST_Shd_pct65">pct65</value>
- <value tokenid="ooxml:Value_ST_Shd_pct85">pct85</value>
- <value tokenid="ooxml:Value_ST_Shd_pct87">pct87</value>
- <value tokenid="ooxml:Value_ST_Shd_pct95">pct95</value>
- <value tokenid="ooxml:Value_ST_Shd_nil">nil</value>
- </resource>
- <resource name="CT_Shd" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_Shd_val"/>
- <attribute name="color" tokenid="ooxml:CT_Shd_color"/>
- <attribute name="themeColor" tokenid="ooxml:CT_Shd_themeColor"/>
- <attribute name="themeTint" tokenid="ooxml:CT_Shd_themeTint"/>
- <attribute name="themeShade" tokenid="ooxml:CT_Shd_themeShade"/>
- <attribute name="fill" tokenid="ooxml:CT_Shd_fill"/>
- <attribute name="themeFill" tokenid="ooxml:CT_Shd_themeFill"/>
- <attribute name="themeFillTint" tokenid="ooxml:CT_Shd_themeFillTint"/>
- <attribute name="themeFillShade" tokenid="ooxml:CT_Shd_themeFillShade"/>
- </resource>
- <resource name="CT_VerticalAlignRun" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_VerticalAlignRun_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_FitText" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_FitText_val"/>
- <attribute name="id" tokenid="ooxml:CT_FitText_id"/>
- </resource>
- <resource name="ST_Em" resource="List">
- <value tokenid="ooxml:Value_ST_Em_none">none</value>
- <value tokenid="ooxml:Value_ST_Em_dot">dot</value>
- <value tokenid="ooxml:Value_ST_Em_comma">comma</value>
- <value tokenid="ooxml:Value_ST_Em_circle">circle</value>
- <value tokenid="ooxml:Value_ST_Em_underDot">underDot</value>
- </resource>
- <resource name="CT_Em" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Em_val" action="setValue"/>
- </resource>
- <resource name="CT_Language" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_Language_val"/>
- <attribute name="eastAsia" tokenid="ooxml:CT_Language_eastAsia"/>
- <attribute name="bidi" tokenid="ooxml:CT_Language_bidi"/>
- </resource>
- <resource name="ST_CombineBrackets" resource="List">
- <value tokenid="ooxml:Value_ST_CombineBrackets_none">none</value>
- <value tokenid="ooxml:Value_ST_CombineBrackets_round">round</value>
- <value tokenid="ooxml:Value_ST_CombineBrackets_square">square</value>
- <value tokenid="ooxml:Value_ST_CombineBrackets_angle">angle</value>
- <value tokenid="ooxml:Value_ST_CombineBrackets_curly">curly</value>
- </resource>
- <resource name="CT_EastAsianLayout" resource="Properties">
- <attribute name="id" tokenid="ooxml:CT_EastAsianLayout_id"/>
- <attribute name="combine" tokenid="ooxml:CT_EastAsianLayout_combine"/>
- <attribute name="combineBrackets" tokenid="ooxml:CT_EastAsianLayout_combineBrackets"/>
- <attribute name="vert" tokenid="ooxml:CT_EastAsianLayout_vert"/>
- <attribute name="vertCompress" tokenid="ooxml:CT_EastAsianLayout_vertCompress"/>
- </resource>
- <resource name="ST_XAlign" resource="List">
- <value tokenid="ooxml:Value_doc_ST_XAlign_left">left</value>
- <value tokenid="ooxml:Value_doc_ST_XAlign_center">center</value>
- <value tokenid="ooxml:Value_doc_ST_XAlign_right">right</value>
- <value tokenid="ooxml:Value_doc_ST_XAlign_inside">inside</value>
- <value tokenid="ooxml:Value_doc_ST_XAlign_outside">outside</value>
- </resource>
- <resource name="ST_YAlign" resource="List">
- <value tokenid="ooxml:Value_doc_ST_YAlign_inline">inline</value>
- <value tokenid="ooxml:Value_doc_ST_YAlign_top">top</value>
- <value tokenid="ooxml:Value_doc_ST_YAlign_center">center</value>
- <value tokenid="ooxml:Value_doc_ST_YAlign_bottom">bottom</value>
- <value tokenid="ooxml:Value_doc_ST_YAlign_inside">inside</value>
- <value tokenid="ooxml:Value_doc_ST_YAlign_outside">outside</value>
- </resource>
- <resource name="ST_HeightRule" resource="List">
- <value tokenid="ooxml:Value_doc_ST_HeightRule_auto">auto</value>
- <value tokenid="ooxml:Value_doc_ST_HeightRule_exact">exact</value>
- <value tokenid="ooxml:Value_doc_ST_HeightRule_atLeast">atLeast</value>
- </resource>
- <resource name="ST_Wrap" resource="List">
- <value tokenid="ooxml:Value_doc_ST_Wrap_auto">auto</value>
- <value tokenid="ooxml:Value_doc_ST_Wrap_notBeside">notBeside</value>
- <value tokenid="ooxml:Value_doc_ST_Wrap_around">around</value>
- <value tokenid="ooxml:Value_doc_ST_Wrap_tight">tight</value>
- <value tokenid="ooxml:Value_doc_ST_Wrap_through">through</value>
- <value tokenid="ooxml:Value_doc_ST_Wrap_none">none</value>
- </resource>
- <resource name="ST_VAnchor" resource="List">
- <value tokenid="ooxml:Value_doc_ST_VAnchor_text">text</value>
- <value tokenid="ooxml:Value_doc_ST_VAnchor_margin">margin</value>
- <value tokenid="ooxml:Value_doc_ST_VAnchor_page">page</value>
- </resource>
- <resource name="ST_HAnchor" resource="List">
- <value tokenid="ooxml:Value_doc_ST_HAnchor_text">text</value>
- <value tokenid="ooxml:Value_doc_ST_HAnchor_margin">margin</value>
- <value tokenid="ooxml:Value_doc_ST_HAnchor_page">page</value>
- </resource>
- <resource name="ST_DropCap" resource="List">
- <value tokenid="ooxml:Value_doc_ST_DropCap_none">none</value>
- <value tokenid="ooxml:Value_doc_ST_DropCap_drop">drop</value>
- <value tokenid="ooxml:Value_doc_ST_DropCap_margin">margin</value>
- </resource>
- <resource name="CT_FramePr" resource="Properties">
- <attribute name="dropCap" tokenid="ooxml:CT_FramePr_dropCap"/>
- <attribute name="lines" tokenid="ooxml:CT_FramePr_lines"/>
- <attribute name="w" tokenid="ooxml:CT_FramePr_w"/>
- <attribute name="h" tokenid="ooxml:CT_FramePr_h"/>
- <attribute name="vSpace" tokenid="ooxml:CT_FramePr_vSpace"/>
- <attribute name="hSpace" tokenid="ooxml:CT_FramePr_hSpace"/>
- <attribute name="wrap" tokenid="ooxml:CT_FramePr_wrap"/>
- <attribute name="hAnchor" tokenid="ooxml:CT_FramePr_hAnchor"/>
- <attribute name="vAnchor" tokenid="ooxml:CT_FramePr_vAnchor"/>
- <attribute name="x" tokenid="ooxml:CT_FramePr_x"/>
- <attribute name="xAlign" tokenid="ooxml:CT_FramePr_xAlign"/>
- <attribute name="y" tokenid="ooxml:CT_FramePr_y"/>
- <attribute name="yAlign" tokenid="ooxml:CT_FramePr_yAlign"/>
- <attribute name="hRule" tokenid="ooxml:CT_FramePr_hRule"/>
- <attribute name="anchorLock" tokenid="ooxml:CT_FramePr_anchorLock"/>
- </resource>
- <resource name="ST_TabJc" resource="List">
- <value tokenid="ooxml:Value_ST_TabJc_clear">clear</value>
- <value tokenid="ooxml:Value_ST_TabJc_start">start</value>
- <value tokenid="ooxml:Value_ST_TabJc_left">left</value>
- <value tokenid="ooxml:Value_ST_TabJc_center">center</value>
- <value tokenid="ooxml:Value_ST_TabJc_end">end</value>
- <value tokenid="ooxml:Value_ST_TabJc_right">right</value>
- <value tokenid="ooxml:Value_ST_TabJc_decimal">decimal</value>
- <value tokenid="ooxml:Value_ST_TabJc_bar">bar</value>
- <value tokenid="ooxml:Value_ST_TabJc_num">num</value>
- </resource>
- <resource name="ST_TabTlc" resource="List">
- <value tokenid="ooxml:Value_ST_TabTlc_none">none</value>
- <value tokenid="ooxml:Value_ST_TabTlc_dot">dot</value>
- <value tokenid="ooxml:Value_ST_TabTlc_hyphen">hyphen</value>
- <value tokenid="ooxml:Value_ST_TabTlc_underscore">underscore</value>
- <value tokenid="ooxml:Value_ST_TabTlc_heavy">heavy</value>
- <value tokenid="ooxml:Value_ST_TabTlc_middleDot">middleDot</value>
- </resource>
- <resource name="CT_TabStop" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_TabStop_val"/>
- <attribute name="leader" tokenid="ooxml:CT_TabStop_leader"/>
- <attribute name="pos" tokenid="ooxml:CT_TabStop_pos"/>
- </resource>
- <resource name="ST_LineSpacingRule" resource="List">
- <value tokenid="ooxml:Value_doc_ST_LineSpacingRule_auto">auto</value>
- <value tokenid="ooxml:Value_doc_ST_LineSpacingRule_exact">exact</value>
- <value tokenid="ooxml:Value_doc_ST_LineSpacingRule_atLeast">atLeast</value>
- </resource>
- <resource name="CT_Spacing" resource="Properties">
- <attribute name="before" tokenid="ooxml:CT_Spacing_before"/>
- <attribute name="beforeLines" tokenid="ooxml:CT_Spacing_beforeLines"/>
- <attribute name="beforeAutospacing" tokenid="ooxml:CT_Spacing_beforeAutospacing"/>
- <attribute name="after" tokenid="ooxml:CT_Spacing_after"/>
- <attribute name="afterLines" tokenid="ooxml:CT_Spacing_afterLines"/>
- <attribute name="afterAutospacing" tokenid="ooxml:CT_Spacing_afterAutospacing"/>
- <attribute name="line" tokenid="ooxml:CT_Spacing_line"/>
- <attribute name="lineRule" tokenid="ooxml:CT_Spacing_lineRule"/>
- </resource>
- <resource name="CT_Ind" resource="Properties">
- <attribute name="end" tokenid="ooxml:CT_Ind_end"/>
- <attribute name="endChars" tokenid="ooxml:CT_Ind_endChars"/>
- <attribute name="start" tokenid="ooxml:CT_Ind_start"/>
- <attribute name="startChars" tokenid="ooxml:CT_Ind_startChars"/>
- <attribute name="hanging" tokenid="ooxml:CT_Ind_hanging"/>
- <attribute name="hangingChars" tokenid="ooxml:CT_Ind_hangingChars"/>
- <attribute name="firstLine" tokenid="ooxml:CT_Ind_firstLine"/>
- <attribute name="firstLineChars" tokenid="ooxml:CT_Ind_firstLineChars"/>
- <!-- ECMA 1st version -->
- <attribute name="left" tokenid="ooxml:CT_Ind_left"/>
- <attribute name="leftChars" tokenid="ooxml:CT_Ind_leftChars"/>
- <attribute name="right" tokenid="ooxml:CT_Ind_right"/>
- <attribute name="rightChars" tokenid="ooxml:CT_Ind_rightChars"/>
- </resource>
- <resource name="ST_Jc" resource="List">
- <value tokenid="ooxml:Value_ST_Jc_left">left</value>
- <value tokenid="ooxml:Value_ST_Jc_right">right</value>
- <value tokenid="ooxml:Value_ST_Jc_start">start</value>
- <value tokenid="ooxml:Value_ST_Jc_center">center</value>
- <value tokenid="ooxml:Value_ST_Jc_end">end</value>
- <value tokenid="ooxml:Value_ST_Jc_both">both</value>
- <value tokenid="ooxml:Value_ST_Jc_mediumKashida">mediumKashida</value>
- <value tokenid="ooxml:Value_ST_Jc_distribute">distribute</value>
- <value tokenid="ooxml:Value_ST_Jc_numTab">numTab</value>
- <value tokenid="ooxml:Value_ST_Jc_highKashida">highKashida</value>
- <value tokenid="ooxml:Value_ST_Jc_lowKashida">lowKashida</value>
- <value tokenid="ooxml:Value_ST_Jc_thaiDistribute">thaiDistribute</value>
- </resource>
- <resource name="CT_Jc" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Jc_val" action="setValue"/>
- </resource>
- <resource name="ST_View" resource="List">
- <value tokenid="ooxml:Value_doc_ST_View_none">none</value>
- <value tokenid="ooxml:Value_doc_ST_View_print">print</value>
- <value tokenid="ooxml:Value_doc_ST_View_outline">outline</value>
- <value tokenid="ooxml:Value_doc_ST_View_masterPages">masterPages</value>
- <value tokenid="ooxml:Value_doc_ST_View_normal">normal</value>
- <value tokenid="ooxml:Value_doc_ST_View_web">web</value>
- </resource>
- <resource name="CT_View" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_View_val"/>
- </resource>
- <resource name="ST_Zoom" resource="List">
- <value tokenid="ooxml:Value_doc_ST_Zoom_none">none</value>
- <value tokenid="ooxml:Value_doc_ST_Zoom_fullPage">fullPage</value>
- <value tokenid="ooxml:Value_doc_ST_Zoom_bestFit">bestFit</value>
- <value tokenid="ooxml:Value_doc_ST_Zoom_textFit">textFit</value>
- </resource>
- <resource name="ST_Percentage" resource="Integer"/>
- <resource name="CT_Zoom" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_Zoom_val"/>
- <attribute name="percent" tokenid="ooxml:CT_Zoom_percent"/>
- </resource>
- <resource name="CT_WritingStyle" resource="Properties">
- <attribute name="lang" tokenid="ooxml:CT_WritingStyle_lang"/>
- <attribute name="vendorID" tokenid="ooxml:CT_WritingStyle_vendorID"/>
- <attribute name="dllVersion" tokenid="ooxml:CT_WritingStyle_dllVersion"/>
- <attribute name="nlCheck" tokenid="ooxml:CT_WritingStyle_nlCheck"/>
- <attribute name="checkStyle" tokenid="ooxml:CT_WritingStyle_checkStyle"/>
- <attribute name="appName" tokenid="ooxml:CT_WritingStyle_appName"/>
- </resource>
- <resource name="CT_Proof" resource="Properties">
- <attribute name="spelling" tokenid="ooxml:CT_Proof_spelling"/>
- <attribute name="grammar" tokenid="ooxml:CT_Proof_grammar"/>
- </resource>
- <resource name="ST_DocType" resource="List">
- <value tokenid="ooxml:Value_doc_ST_DocType_notSpecified">notSpecified</value>
- <value tokenid="ooxml:Value_doc_ST_DocType_letter">letter</value>
- <value tokenid="ooxml:Value_doc_ST_DocType_eMail">eMail</value>
- </resource>
- <resource name="CT_DocType" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_DocType_val"/>
- </resource>
- <resource name="ST_DocProtect" resource="List">
- <value tokenid="ooxml:Value_doc_ST_DocProtect_none">none</value>
- <value tokenid="ooxml:Value_doc_ST_DocProtect_readOnly">readOnly</value>
- <value tokenid="ooxml:Value_doc_ST_DocProtect_comments">comments</value>
- <value tokenid="ooxml:Value_doc_ST_DocProtect_trackedChanges">trackedChanges</value>
- <value tokenid="ooxml:Value_doc_ST_DocProtect_forms">forms</value>
- </resource>
- <resource name="ST_CryptProv" resource="List">
- <value tokenid="ooxml:Value_doc_ST_CryptProv_rsaAES">rsaAES</value>
- <value tokenid="ooxml:Value_doc_ST_CryptProv_rsaFull">rsaFull</value>
- </resource>
- <resource name="ST_AlgClass" resource="List">
- <value tokenid="ooxml:Value_doc_ST_AlgClass_hash">hash</value>
- </resource>
- <resource name="ST_AlgType" resource="List">
- <value tokenid="ooxml:Value_doc_ST_AlgType_typeAny">typeAny</value>
- </resource>
- <resource name="AG_Password" resource="Properties">
- <attribute name="cryptProviderType" tokenid="ooxml:AG_Password_cryptProviderType"/>
- <attribute name="cryptAlgorithmClass" tokenid="ooxml:AG_Password_cryptAlgorithmClass"/>
- <attribute name="cryptAlgorithmType" tokenid="ooxml:AG_Password_cryptAlgorithmType"/>
- <attribute name="cryptAlgorithmSid" tokenid="ooxml:AG_Password_cryptAlgorithmSid"/>
- <attribute name="cryptSpinCount" tokenid="ooxml:AG_Password_cryptSpinCount"/>
- <attribute name="cryptProvider" tokenid="ooxml:AG_Password_cryptProvider"/>
- <attribute name="algIdExt" tokenid="ooxml:AG_Password_algIdExt"/>
- <attribute name="algIdExtSource" tokenid="ooxml:AG_Password_algIdExtSource"/>
- <attribute name="cryptProviderTypeExt" tokenid="ooxml:AG_Password_cryptProviderTypeExt"/>
- <attribute name="cryptProviderTypeExtSource" tokenid="ooxml:AG_Password_cryptProviderTypeExtSource"/>
- <attribute name="hash" tokenid="ooxml:AG_Password_hash"/>
- <attribute name="salt" tokenid="ooxml:AG_Password_salt"/>
- </resource>
- <resource name="CT_DocProtect" resource="Properties">
- <attribute name="edit" tokenid="ooxml:CT_DocProtect_edit"/>
- <attribute name="formatting" tokenid="ooxml:CT_DocProtect_formatting"/>
- <attribute name="enforcement" tokenid="ooxml:CT_DocProtect_enforcement"/>
- </resource>
- <resource name="CT_MailMergeDocType" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_MailMergeDocType_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_MailMergeDataType" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_MailMergeDataType_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_MailMergeDest" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_MailMergeDest_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_MailMergeOdsoFMDFieldType" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_MailMergeOdsoFMDFieldType_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_TrackChangesView" resource="Properties">
- <attribute name="markup" tokenid="ooxml:CT_TrackChangesView_markup"/>
- <attribute name="comments" tokenid="ooxml:CT_TrackChangesView_comments"/>
- <attribute name="insDel" tokenid="ooxml:CT_TrackChangesView_insDel"/>
- <attribute name="formatting" tokenid="ooxml:CT_TrackChangesView_formatting"/>
- <attribute name="inkAnnotations" tokenid="ooxml:CT_TrackChangesView_inkAnnotations"/>
- </resource>
- <resource name="CT_Kinsoku" resource="Properties">
- <attribute name="lang" tokenid="ooxml:CT_Kinsoku_lang"/>
- <attribute name="val" tokenid="ooxml:CT_Kinsoku_val"/>
- </resource>
- <resource name="ST_TextDirection" resource="List">
- <value tokenid="ooxml:Value_ST_TextDirection_lrTb">lrTb</value>
- <value tokenid="ooxml:Value_ST_TextDirection_tbRl">tbRl</value>
- <value tokenid="ooxml:Value_ST_TextDirection_btLr">btLr</value>
- <value tokenid="ooxml:Value_ST_TextDirection_lrTbV">lrTbV</value>
- <value tokenid="ooxml:Value_ST_TextDirection_tbRlV">tbRlV</value>
- <value tokenid="ooxml:Value_ST_TextDirection_tbLrV">tbLrV</value>
- </resource>
- <resource name="CT_TextDirection" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_TextDirection_val" action="setValue"/>
- </resource>
- <resource name="ST_TextAlignment" resource="List">
- <value tokenid="ooxml:Value_doc_ST_TextAlignment_top">top</value>
- <value tokenid="ooxml:Value_doc_ST_TextAlignment_center">center</value>
- <value tokenid="ooxml:Value_doc_ST_TextAlignment_baseline">baseline</value>
- <value tokenid="ooxml:Value_doc_ST_TextAlignment_bottom">bottom</value>
- <value tokenid="ooxml:Value_doc_ST_TextAlignment_auto">auto</value>
- </resource>
- <resource name="CT_TextAlignment" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_TextAlignment_val" action="setValue"/>
- </resource>
- <resource name="ST_DisplacedByCustomXml" resource="List">
- <value tokenid="ooxml:Value_doc_ST_DisplacedByCustomXml_next">next</value>
- <value tokenid="ooxml:Value_doc_ST_DisplacedByCustomXml_prev">prev</value>
- </resource>
- <resource name="ST_AnnotationVMerge" resource="List">
- <value tokenid="ooxml:Value_doc_ST_AnnotationVMerge_cont">cont</value>
- <value tokenid="ooxml:Value_doc_ST_AnnotationVMerge_rest">rest</value>
- </resource>
- <resource name="CT_Markup" resource="Properties">
- <attribute name="id" tokenid="ooxml:CT_Markup_id"/>
- </resource>
- <resource name="CT_TrackChange" resource="Properties">
- <attribute name="author" tokenid="ooxml:CT_TrackChange_author"/>
- <attribute name="date" tokenid="ooxml:CT_TrackChange_date"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlInsRangeStart" action="sendPropertiesWithId" sendtokenid="ooxml:EG_RangeMarkupElements_customXmlInsRangeStart"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlInsRangeStart" action="clearProps"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlInsRangeEnd" action="sendPropertiesWithId" sendtokenid="ooxml:EG_RangeMarkupElements_customXmlInsRangeEnd"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlInsRangeEnd" action="clearProps"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlDelRangeStart" action="sendPropertiesWithId" sendtokenid="ooxml:EG_RangeMarkupElements_customXmlDelRangeStart"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlDelRangeStart" action="clearProps"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlDelRangeEnd" action="sendPropertiesWithId" sendtokenid="ooxml:EG_RangeMarkupElements_customXmlDelRangeEnd"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlDelRangeEnd" action="clearProps"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveFromRangeStart" action="sendPropertiesWithId" sendtokenid="ooxml:EG_RangeMarkupElements_customXmlMoveFromRangeStart"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveFromRangeStart" action="clearProps"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveFromRangeEnd" action="sendPropertiesWithId" sendtokenid="ooxml:EG_RangeMarkupElements_customXmlMoveFromRangeEnd"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveFromRangeEnd" action="clearProps"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveToRangeStart" action="sendPropertiesWithId" sendtokenid="ooxml:EG_RangeMarkupElements_customXmlMoveToRangeStart"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveToRangeStart" action="clearProps"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveToRangeEnd" action="sendPropertiesWithId" sendtokenid="ooxml:EG_RangeMarkupElements_customXmlMoveToRangeEnd"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveToRangeEnd" action="clearProps"/>
- </resource>
- <resource name="CT_CellMergeTrackChange" resource="Properties">
- <attribute name="vMerge" tokenid="ooxml:CT_CellMergeTrackChange_vMerge"/>
- <attribute name="vMergeOrig" tokenid="ooxml:CT_CellMergeTrackChange_vMergeOrig"/>
- </resource>
- <resource name="CT_TrackChangeRange" resource="Properties">
- <attribute name="displacedByCustomXml" tokenid="ooxml:CT_TrackChangeRange_displacedByCustomXml"/>
- </resource>
- <resource name="CT_MarkupRange" resource="Properties">
- <attribute name="displacedByCustomXml" tokenid="ooxml:CT_MarkupRange_displacedByCustomXml"/>
- </resource>
- <resource name="CT_MarkupRangeBookmark" resource="Properties">
- <attribute name="id" tokenid="ooxml:CT_MarkupRangeBookmark_id"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_moveFromRangeEnd" action="sendPropertiesWithId" sendtokenid="ooxml:EG_RangeMarkupElements_moveFromRangeEnd"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_moveToRangeEnd" action="sendPropertiesWithId" sendtokenid="ooxml:EG_RangeMarkupElements_moveToRangeEnd"/>
- </resource>
- <resource name="CT_PermStart" resource="Properties">
- <attribute name="id" tokenid="ooxml:CT_PermStart_id"/>
- <attribute name="colFirst" tokenid="ooxml:CT_PermStart_colFirst"/>
- <attribute name="colLast" tokenid="ooxml:CT_PermStart_colLast"/>
- <attribute name="ed" tokenid="ooxml:CT_PermStart_ed"/>
- <attribute name="edGrp" tokenid="ooxml:CT_PermStart_edGrp"/>
- <attribute name="displacedByCustomXml" tokenid="ooxml:CT_PermStart_displacedByCustomXml"/>
- </resource>
- <resource name="CT_PermEnd" resource="Properties">
- <attribute name="id" tokenid="ooxml:CT_PermEnd_id"/>
- <attribute name="displacedByCustomXml" tokenid="ooxml:CT_PermEnd_displacedByCustomXml"/>
- </resource>
- <resource name="CT_MarkupRangeCommentStart" resource="Properties">
- <attribute name="id" tokenid="ooxml:EG_RangeMarkupElements_commentRangeStart"/>
- </resource>
- <resource name="CT_MarkupRangeCommentEnd" resource="Properties">
- <attribute name="id" tokenid="ooxml:EG_RangeMarkupElements_commentRangeEnd"/>
- </resource>
- <resource name="CT_BookmarkRange" resource="Properties">
- <attribute name="colFirst" tokenid="ooxml:CT_BookmarkRange_colFirst"/>
- <attribute name="colLast" tokenid="ooxml:CT_BookmarkRange_colLast"/>
- </resource>
- <resource name="CT_Bookmark" resource="Properties">
- <attribute name="name" tokenid="ooxml:CT_Bookmark_name"/>
- </resource>
- <resource name="CT_MoveBookmark" resource="Properties">
- <attribute name="author" tokenid="ooxml:CT_MoveBookmark_author"/>
- <attribute name="date" tokenid="ooxml:CT_MoveBookmark_date"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_moveFromRangeStart" action="sendPropertiesWithId" sendtokenid="ooxml:EG_RangeMarkupElements_moveFromRangeStart"/>
- <action name="end" tokenid="ooxml:EG_RangeMarkupElements_moveToRangeStart" action="sendPropertiesWithId" sendtokenid="ooxml:EG_RangeMarkupElements_moveToRangeStart"/>
- </resource>
- <resource name="CT_Comment" resource="XNote">
- <attribute name="id" action="checkId"/>
- <attribute name="initials" tokenid="ooxml:CT_Comment_initials"/>
- </resource>
- <resource name="CT_TrackChangeNumbering" resource="Properties">
- <attribute name="original" tokenid="ooxml:CT_TrackChangeNumbering_original"/>
- </resource>
- <resource name="CT_TblPrExChange" resource="Properties">
- <element name="tblPrEx" tokenid="ooxml:CT_TblPrExChange_tblPrEx"/>
- </resource>
- <resource name="CT_TcPrChange" resource="Properties">
- <element name="tcPr" tokenid="ooxml:CT_TcPrChange_tcPr"/>
- </resource>
- <resource name="CT_TrPrChange" resource="Properties">
- <element name="trPr" tokenid="ooxml:CT_TrPrChange_trPr"/>
- </resource>
- <resource name="CT_TblGridChange" resource="Properties">
- <element name="tblGrid" tokenid="ooxml:CT_TblGridChange_tblGrid"/>
- </resource>
- <resource name="CT_TblPrChange" resource="Properties">
- <element name="tblPr" tokenid="ooxml:CT_TblPrChange_tblPr"/>
- </resource>
- <resource name="CT_SectPrChange" resource="Properties">
- <element name="sectPr" tokenid="ooxml:CT_SectPrChange_sectPr"/>
- </resource>
- <resource name="CT_PPrChange" resource="Properties">
- <element name="pPr" tokenid="ooxml:CT_PPrChange_pPr"/>
- </resource>
- <resource name="CT_RPrChange" resource="Properties">
- <element name="rPr" tokenid="ooxml:CT_RPrChange_rPr"/>
- </resource>
- <resource name="CT_ParaRPrChange" resource="Properties">
- <element name="rPr" tokenid="ooxml:CT_ParaRPrChange_rPr"/>
- </resource>
- <resource name="CT_RunTrackChange" resource="Stream">
- <action name="start" action="tokenproperty"/>
- <action name="start" action="sendPropertiesWithId" sendtokenid="ooxml:trackchange"/>
- <action name="start" action="clearProps"/>
- <action name="end" action="tokenproperty"/>
- <action name="end" action="sendPropertiesWithId" sendtokenid="ooxml:endtrackchange"/>
- <action name="end" action="clearProps"/>
- </resource>
- <resource name="EG_RangeMarkupElements" resource="Properties">
- <element name="bookmarkStart" tokenid="ooxml:EG_RangeMarkupElements_bookmarkStart"/>
- <element name="bookmarkEnd" tokenid="ooxml:EG_RangeMarkupElements_bookmarkEnd"/>
- <element name="permStart" tokenid="ooxml:EG_RangeMarkupElements_PermStart"/>
- <element name="permEnd" tokenid="ooxml:EG_RangeMarkupElements_PermEnd"/>
- <element name="moveFromRangeStart" tokenid="ooxml:EG_RangeMarkupElements_moveFromRangeStart"/>
- <element name="moveFromRangeEnd" tokenid="ooxml:EG_RangeMarkupElements_moveFromRangeEnd"/>
- <element name="moveToRangeStart" tokenid="ooxml:EG_RangeMarkupElements_moveToRangeStart"/>
- <element name="moveToRangeEnd" tokenid="ooxml:EG_RangeMarkupElements_moveToRangeEnd"/>
- <element name="commentRangeStart" tokenid="ooxml:EG_RangeMarkupElements_commentRangeStart"/>
- <element name="commentRangeEnd" tokenid="ooxml:EG_RangeMarkupElements_commentRangeEnd"/>
- <element name="customXmlInsRangeStart" tokenid="ooxml:EG_RangeMarkupElements_customXmlInsRangeStart"/>
- <element name="customXmlInsRangeEnd" tokenid="ooxml:EG_RangeMarkupElements_customXmlInsRangeEnd"/>
- <element name="customXmlDelRangeStart" tokenid="ooxml:EG_RangeMarkupElements_customXmlDelRangeStart"/>
- <element name="customXmlDelRangeEnd" tokenid="ooxml:EG_RangeMarkupElements_customXmlDelRangeEnd"/>
- <element name="customXmlMoveFromRangeStart" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveFromRangeStart"/>
- <element name="customXmlMoveFromRangeEnd" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveFromRangeEnd"/>
- <element name="customXmlMoveToRangeStart" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveToRangeStart"/>
- <element name="customXmlMoveToRangeEnd" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveToRangeEnd"/>
- </resource>
- <resource name="CT_NumPr" resource="Properties">
- <element name="ilvl" tokenid="ooxml:CT_NumPr_ilvl"/>
- <element name="numId" tokenid="ooxml:CT_NumPr_numId"/>
- <element name="numberingChange" tokenid="ooxml:CT_NumPr_numberingChange"/>
- <element name="ins" tokenid="ooxml:CT_NumPr_ins"/>
- </resource>
- <resource name="CT_PBdr" resource="Properties">
- <element name="top" tokenid="ooxml:CT_PBdr_top"/>
- <element name="left" tokenid="ooxml:CT_PBdr_left"/>
- <element name="bottom" tokenid="ooxml:CT_PBdr_bottom"/>
- <element name="right" tokenid="ooxml:CT_PBdr_right"/>
- <element name="between" tokenid="ooxml:CT_PBdr_between"/>
- <element name="bar" tokenid="ooxml:CT_PBdr_bar"/>
- </resource>
- <resource name="CT_Tabs" resource="Properties">
- <element name="tab" tokenid="ooxml:CT_Tabs_tab"/>
- </resource>
- <resource name="CT_TextboxTightWrap" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_TextboxTightWrap_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_PPrBase" resource="Properties">
- <element name="pStyle" tokenid="ooxml:CT_PPrBase_pStyle"/>
- <element name="keepNext" tokenid="ooxml:CT_PPrBase_keepNext"/>
- <element name="keepLines" tokenid="ooxml:CT_PPrBase_keepLines"/>
- <element name="pageBreakBefore" tokenid="ooxml:CT_PPrBase_pageBreakBefore"/>
- <element name="framePr" tokenid="ooxml:CT_PPrBase_framePr"/>
- <element name="widowControl" tokenid="ooxml:CT_PPrBase_widowControl"/>
- <element name="numPr" tokenid="ooxml:CT_PPrBase_numPr"/>
- <element name="suppressLineNumbers" tokenid="ooxml:CT_PPrBase_suppressLineNumbers"/>
- <element name="pBdr" tokenid="ooxml:CT_PrBase_pBdr"/>
- <element name="shd" tokenid="ooxml:CT_PrBase_shd"/>
- <element name="tabs" tokenid="ooxml:CT_PPrBase_tabs"/>
- <element name="suppressAutoHyphens" tokenid="ooxml:CT_PPrBase_suppressAutoHyphens"/>
- <element name="kinsoku" tokenid="ooxml:CT_PPrBase_kinsoku"/>
- <element name="wordWrap" tokenid="ooxml:CT_PPrBase_wordWrap"/>
- <element name="overflowPunct" tokenid="ooxml:CT_PPrBase_overflowPunct"/>
- <element name="topLinePunct" tokenid="ooxml:CT_PPrBase_topLinePunct"/>
- <element name="autoSpaceDE" tokenid="ooxml:CT_PPrBase_autoSpaceDE"/>
- <element name="autoSpaceDN" tokenid="ooxml:CT_PPrBase_autoSpaceDN"/>
- <element name="bidi" tokenid="ooxml:CT_PPrBase_bidi"/>
- <element name="adjustRightInd" tokenid="ooxml:CT_PPrBase_adjustRightInd"/>
- <element name="snapToGrid" tokenid="ooxml:CT_PPrBase_snapToGrid"/>
- <element name="spacing" tokenid="ooxml:CT_PPrBase_spacing"/>
- <element name="ind" tokenid="ooxml:CT_PPrBase_ind"/>
- <element name="contextualSpacing" tokenid="ooxml:CT_PPrBase_contextualSpacing"/>
- <element name="mirrorIndents" tokenid="ooxml:CT_PPrBase_mirrorIndents"/>
- <element name="suppressOverlap" tokenid="ooxml:CT_PPrBase_suppressOverlap"/>
- <element name="jc" tokenid="ooxml:CT_PPrBase_jc"/>
- <element name="textDirection" tokenid="ooxml:CT_PPrBase_textDirection"/>
- <element name="textAlignment" tokenid="ooxml:CT_PPrBase_textAlignment"/>
- <element name="textboxTightWrap" tokenid="ooxml:CT_PPrBase_textboxTightWrap"/>
- <element name="outlineLvl" tokenid="ooxml:CT_PPrBase_outlineLvl"/>
- <element name="divId" tokenid="ooxml:CT_PPrBase_divId"/>
- <element name="cnfStyle" tokenid="ooxml:CT_PPrBase_cnfStyle"/>
- </resource>
- <resource name="CT_PPr" resource="Properties">
- <element name="rPr" tokenid="ooxml:CT_PPr_rPr"/>
- <element name="sectPr" tokenid="ooxml:CT_PPr_sectPr"/>
- <element name="pPrChange" tokenid="ooxml:CT_PPr_pPrChange"/>
- </resource>
- <resource name="CT_Background" resource="Shape">
- <attribute name="color" tokenid="ooxml:CT_Background_color"/>
- <attribute name="themeColor" tokenid="ooxml:CT_Background_themeColor"/>
- <attribute name="themeTint" tokenid="ooxml:CT_Background_themeTint"/>
- <attribute name="themeShade" tokenid="ooxml:CT_Background_themeShade"/>
- <element name="v:background" tokenid="ooxml:CT_Background_v_background"/>
- <action name="end" action="sendPropertiesWithId" sendtokenid="ooxml:background_background"/>
- </resource>
- <resource name="CT_Rel" resource="Properties">
- <attribute name="r:id" tokenid="ooxml:CT_Rel_id"/>
- </resource>
- <resource name="CT_PictureBase" resource="Properties"/>
- <resource name="CT_Object" resource="Shape">
- <attribute name="dxaOrig" tokenid="ooxml:CT_Object_dxaOrig"/>
- <attribute name="dyaOrig" tokenid="ooxml:CT_Object_dyaOrig"/>
- <action name="end" action="sendPropertiesWithId" sendtokenid="ooxml:object"/>
- <action name="end" action="clearProps"/>
- </resource>
- <resource name="CT_Picture" resource="Shape">
- <element name="movie" tokenid="ooxml:CT_Picture_movie"/>
- <action name="end" action="sendPropertiesWithId" sendtokenid="ooxml:object"/>
- <action name="end" action="clearProps"/>
- </resource>
- <resource name="CT_Drawing" resource="Properties">
- <action name="end" action="handlePicture"/>
- </resource>
- <resource name="CT_SimpleField" resource="Stream">
- <element name="fldData" tokenid="ooxml:CT_SimpleField_fldData"/>
- <attribute name="instr" tokenid="ooxml:CT_SimpleField_instr"/>
- <attribute name="fldLock" tokenid="ooxml:CT_SimpleField_fldLock"/>
- <attribute name="dirty" tokenid="ooxml:CT_SimpleField_dirty"/>
- <action name="start" action="fieldstart"/>
- <action name="start" action="startCharacterGroup"/>
- <action name="start" action="printproperty" sendtokenid="ooxml:CT_SimpleField_instr"/>
- <action name="start" action="endCharacterGroup"/>
- <action name="start" action="fieldlock_simple"/>
- <action name="start" action="fieldsep"/>
- <action name="end" action="fieldend"/>
- </resource>
- <resource name="ST_FldCharType" resource="List">
- <value tokenid="ooxml:Value_ST_FldCharType_begin">begin</value>
- <value tokenid="ooxml:Value_ST_FldCharType_separate">separate</value>
- <value tokenid="ooxml:Value_ST_FldCharType_end">end</value>
- </resource>
- <resource name="ST_InfoTextType" resource="List">
- <value tokenid="ooxml:Value_doc_ST_InfoTextType_text">text</value>
- <value tokenid="ooxml:Value_doc_ST_InfoTextType_autoText">autoText</value>
- </resource>
- <resource name="ST_FFName" resource="String"/>
- <resource name="CT_FFTextType" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_FFTextType_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_FFName" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_FFName_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_FldChar" resource="Stream">
- <element name="fldData" tokenid="ooxml:CT_FldChar_fldData"/>
- <element name="ffData" tokenid="ooxml:CT_FldChar_ffData"/>
- <element name="numberingChange" tokenid="ooxml:CT_FldChar_numberingChange"/>
- <attribute name="fldCharType" tokenid="ooxml:CT_FldChar_fldCharType"/>
- <attribute name="fldLock" tokenid="ooxml:CT_FldChar_fldLock"/>
- <attribute name="dirty" tokenid="ooxml:CT_FldChar_dirty"/>
- <action name="start" action="fieldstart">
- <cond tokenid="ooxml:CT_FldChar_fldCharType" value="ooxml:Value_ST_FldCharType_begin"/>
- </action>
- <action name="start" action="fieldsep">
- <cond tokenid="ooxml:CT_FldChar_fldCharType" value="ooxml:Value_ST_FldCharType_separate"/>
- </action>
- <action name="start" action="fieldend">
- <cond tokenid="ooxml:CT_FldChar_fldCharType" value="ooxml:Value_ST_FldCharType_end"/>
- </action>
- <action name="start" action="fieldlock"/>
- </resource>
- <resource name="CT_Hyperlink" resource="Stream">
- <attribute name="tgtFrame" tokenid="ooxml:CT_Hyperlink_tgtFrame"/>
- <attribute name="tooltip" tokenid="ooxml:CT_Hyperlink_tooltip"/>
- <attribute name="docLocation" tokenid="ooxml:CT_Hyperlink_docLocation"/>
- <attribute name="history" tokenid="ooxml:CT_Hyperlink_history"/>
- <attribute name="anchor" tokenid="ooxml:CT_Hyperlink_anchor"/>
- <attribute name="r:id" tokenid="ooxml:CT_Hyperlink_r_id"/>
- <action name="start" action="fieldstart"/>
- <action name="start" action="handleHyperlink"/>
- <action name="start" action="fieldsep"/>
- <action name="end" action="fieldend"/>
- </resource>
- <resource name="CT_FLDData" resource="Stream">
- <action name="characters" action="ignore"/>
- </resource>
- <resource name="CT_FFData" resource="Properties">
- <element name="name" tokenid="ooxml:CT_FFData_name"/>
- <element name="enabled" tokenid="ooxml:CT_FFData_enabled"/>
- <element name="calcOnExit" tokenid="ooxml:CT_FFData_calcOnExit"/>
- <element name="entryMacro" tokenid="ooxml:CT_FFData_entryMacro"/>
- <element name="exitMacro" tokenid="ooxml:CT_FFData_exitMacro"/>
- <element name="helpText" tokenid="ooxml:CT_FFData_helpText"/>
- <element name="statusText" tokenid="ooxml:CT_FFData_statusText"/>
- <element name="checkBox" tokenid="ooxml:CT_FFData_checkBox"/>
- <element name="ddList" tokenid="ooxml:CT_FFData_ddList"/>
- <element name="textInput" tokenid="ooxml:CT_FFData_textInput"/>
- <action name="end" action="sendPropertiesWithId" sendtokenid="ooxml:ffdata"/>
- <action name="end" action="clearProps"/>
- </resource>
- <resource name="CT_FFHelpText" resource="Properties">
- <attribute name="type" tokenid="ooxml:CT_FFHelpText_type"/>
- <attribute name="val" tokenid="ooxml:CT_FFHelpText_val"/>
- </resource>
- <resource name="CT_FFStatusText" resource="Properties">
- <attribute name="type" tokenid="ooxml:CT_FFStatusText_type"/>
- <attribute name="val" tokenid="ooxml:CT_FFStatusText_val"/>
- </resource>
- <resource name="CT_FFCheckBox" resource="Properties">
- <element name="size" tokenid="ooxml:CT_FFCheckBox_size"/>
- <element name="sizeAuto" tokenid="ooxml:CT_FFCheckBox_sizeAuto"/>
- <element name="default" tokenid="ooxml:CT_FFCheckBox_default"/>
- <element name="checked" tokenid="ooxml:CT_FFCheckBox_checked"/>
- </resource>
- <resource name="CT_FFDDList" resource="Properties">
- <element name="result" tokenid="ooxml:CT_FFDDList_result"/>
- <element name="default" tokenid="ooxml:CT_FFDDList_default"/>
- <element name="listEntry" tokenid="ooxml:CT_FFDDList_listEntry"/>
- </resource>
- <resource name="CT_FFTextInput" resource="Properties">
- <element name="type" tokenid="ooxml:CT_FFTextInput_type"/>
- <element name="default" tokenid="ooxml:CT_FFTextInput_default"/>
- <element name="maxLength" tokenid="ooxml:CT_FFTextInput_maxLength"/>
- <element name="format" tokenid="ooxml:CT_FFTextInput_format"/>
- </resource>
- <resource name="ST_SectionMark" resource="List">
- <value tokenid="ooxml:Value_ST_SectionMark_continuous">continuous</value>
- <value tokenid="ooxml:Value_ST_SectionMark_nextColumn">nextColumn</value>
- <value tokenid="ooxml:Value_ST_SectionMark_nextPage">nextPage</value>
- <value tokenid="ooxml:Value_ST_SectionMark_evenPage">evenPage</value>
- <value tokenid="ooxml:Value_ST_SectionMark_oddPage">oddPage</value>
- </resource>
- <resource name="CT_SectType" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_SectType_val" action="setValue"/>
- </resource>
- <resource name="ST_NumberFormat" resource="List">
- <value tokenid="ooxml:Value_ST_NumberFormat_decimal">decimal</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_upperRoman">upperRoman</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_lowerRoman">lowerRoman</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_upperLetter">upperLetter</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_lowerLetter">lowerLetter</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_ordinal">ordinal</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_cardinalText">cardinalText</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_ordinalText">ordinalText</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_hex">hex</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_chicago">chicago</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_ideographDigital">ideographDigital</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_japaneseCounting">japaneseCounting</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_aiueo">aiueo</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_iroha">iroha</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_decimalFullWidth">decimalFullWidth</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_decimalHalfWidth">decimalHalfWidth</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_japaneseLegal">japaneseLegal</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_japaneseDigitalTenThousand">japaneseDigitalTenThousand</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_decimalEnclosedCircle">decimalEnclosedCircle</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_decimalFullWidth2">decimalFullWidth2</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_aiueoFullWidth">aiueoFullWidth</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_irohaFullWidth">irohaFullWidth</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_decimalZero">decimalZero</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_bullet">bullet</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_ganada">ganada</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_chosung">chosung</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_decimalEnclosedFullstop">decimalEnclosedFullstop</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_decimalEnclosedParen">decimalEnclosedParen</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_decimalEnclosedCircleChinese">decimalEnclosedCircleChinese</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_ideographEnclosedCircle">ideographEnclosedCircle</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_ideographTraditional">ideographTraditional</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_ideographZodiac">ideographZodiac</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_ideographZodiacTraditional">ideographZodiacTraditional</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_taiwaneseCounting">taiwaneseCounting</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_ideographLegalTraditional">ideographLegalTraditional</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_taiwaneseCountingThousand">taiwaneseCountingThousand</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_taiwaneseDigital">taiwaneseDigital</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_chineseCounting">chineseCounting</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_chineseLegalSimplified">chineseLegalSimplified</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_chineseCountingThousand">chineseCountingThousand</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_koreanDigital">koreanDigital</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_koreanCounting">koreanCounting</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_koreanLegal">koreanLegal</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_koreanDigital2">koreanDigital2</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_vietnameseCounting">vietnameseCounting</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_russianLower">russianLower</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_russianUpper">russianUpper</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_none">none</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_numberInDash">numberInDash</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_hebrew1">hebrew1</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_hebrew2">hebrew2</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_arabicAlpha">arabicAlpha</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_arabicAbjad">arabicAbjad</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_hindiVowels">hindiVowels</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_hindiConsonants">hindiConsonants</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_hindiNumbers">hindiNumbers</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_hindiCounting">hindiCounting</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_thaiLetters">thaiLetters</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_thaiNumbers">thaiNumbers</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_thaiCounting">thaiCounting</value>
- <value tokenid="ooxml:Value_ST_NumberFormat_custom">custom</value>
- </resource>
- <resource name="ST_PageOrientation" resource="List">
- <value tokenid="ooxml:Value_ST_PageOrientation_portrait">portrait</value>
- <value tokenid="ooxml:Value_ST_PageOrientation_landscape">landscape</value>
- </resource>
- <resource name="CT_PageSz" resource="Properties">
- <attribute name="w" tokenid="ooxml:CT_PageSz_w"/>
- <attribute name="h" tokenid="ooxml:CT_PageSz_h"/>
- <attribute name="orient" tokenid="ooxml:CT_PageSz_orient"/>
- <attribute name="code" tokenid="ooxml:CT_PageSz_code"/>
- </resource>
- <resource name="CT_PageMar" resource="Properties">
- <attribute name="top" tokenid="ooxml:CT_PageMar_top"/>
- <attribute name="right" tokenid="ooxml:CT_PageMar_right"/>
- <attribute name="bottom" tokenid="ooxml:CT_PageMar_bottom"/>
- <attribute name="left" tokenid="ooxml:CT_PageMar_left"/>
- <attribute name="header" tokenid="ooxml:CT_PageMar_header"/>
- <attribute name="footer" tokenid="ooxml:CT_PageMar_footer"/>
- <attribute name="gutter" tokenid="ooxml:CT_PageMar_gutter"/>
- </resource>
- <resource name="CT_PaperSource" resource="Properties">
- <attribute name="first" tokenid="ooxml:CT_PaperSource_first"/>
- <attribute name="other" tokenid="ooxml:CT_PaperSource_other"/>
- </resource>
- <resource name="ST_PageBorderZOrder" resource="List">
- <value tokenid="ooxml:Value_doc_ST_PageBorderZOrder_front">front</value>
- <value tokenid="ooxml:Value_doc_ST_PageBorderZOrder_back">back</value>
- </resource>
- <resource name="ST_PageBorderDisplay" resource="List">
- <value tokenid="ooxml:Value_doc_ST_PageBorderDisplay_allPages">allPages</value>
- <value tokenid="ooxml:Value_doc_ST_PageBorderDisplay_firstPage">firstPage</value>
- <value tokenid="ooxml:Value_doc_ST_PageBorderDisplay_notFirstPage">notFirstPage</value>
- </resource>
- <resource name="ST_PageBorderOffset" resource="List">
- <value tokenid="ooxml:Value_doc_ST_PageBorderOffset_page">page</value>
- <value tokenid="ooxml:Value_doc_ST_PageBorderOffset_text">text</value>
- </resource>
- <resource name="CT_PageBorders" resource="Properties">
- <element name="top" tokenid="ooxml:CT_PageBorders_top"/>
- <element name="left" tokenid="ooxml:CT_PageBorders_left"/>
- <element name="bottom" tokenid="ooxml:CT_PageBorders_bottom"/>
- <element name="right" tokenid="ooxml:CT_PageBorders_right"/>
- <attribute name="zOrder" tokenid="ooxml:CT_PageBorders_zOrder"/>
- <attribute name="display" tokenid="ooxml:CT_PageBorders_display"/>
- <attribute name="offsetFrom" tokenid="ooxml:CT_PageBorders_offsetFrom"/>
- </resource>
- <resource name="ST_ChapterSep" resource="List">
- <value tokenid="ooxml:Value_ST_ChapterSep_hyphen">hyphen</value>
- <value tokenid="ooxml:Value_ST_ChapterSep_period">period</value>
- <value tokenid="ooxml:Value_ST_ChapterSep_colon">colon</value>
- <value tokenid="ooxml:Value_ST_ChapterSep_emDash">emDash</value>
- <value tokenid="ooxml:Value_ST_ChapterSep_enDash">enDash</value>
- </resource>
- <resource name="ST_LineNumberRestart" resource="List">
- <value tokenid="ooxml:Value_ST_LineNumberRestart_newPage">newPage</value>
- <value tokenid="ooxml:Value_ST_LineNumberRestart_newSection">newSection</value>
- <value tokenid="ooxml:Value_ST_LineNumberRestart_continuous">continuous</value>
- </resource>
- <resource name="CT_LineNumber" resource="Properties">
- <attribute name="countBy" tokenid="ooxml:CT_LineNumber_countBy"/>
- <attribute name="start" tokenid="ooxml:CT_LineNumber_start"/>
- <attribute name="distance" tokenid="ooxml:CT_LineNumber_distance"/>
- <attribute name="restart" tokenid="ooxml:CT_LineNumber_restart"/>
- </resource>
- <resource name="CT_PageNumber" resource="Properties">
- <attribute name="fmt" tokenid="ooxml:CT_PageNumber_fmt"/>
- <attribute name="start" tokenid="ooxml:CT_PageNumber_start"/>
- <attribute name="chapStyle" tokenid="ooxml:CT_PageNumber_chapStyle"/>
- <attribute name="chapSep" tokenid="ooxml:CT_PageNumber_chapSep"/>
- </resource>
- <resource name="CT_Column" resource="Properties">
- <attribute name="space" tokenid="ooxml:CT_Column_space"/>
- <attribute name="w" tokenid="ooxml:CT_Column_w"/>
- </resource>
- <resource name="CT_Columns" resource="Properties">
- <attribute name="equalWidth" tokenid="ooxml:CT_Columns_equalWidth"/>
- <attribute name="space" tokenid="ooxml:CT_Columns_space"/>
- <attribute name="num" tokenid="ooxml:CT_Columns_num"/>
- <attribute name="sep" tokenid="ooxml:CT_Columns_sep"/>
- <element name="col" tokenid="ooxml:CT_Columns_col"/>
- </resource>
- <resource name="ST_VerticalJc" resource="List">
- <value tokenid="ooxml:Value_ST_VerticalJc_top">top</value>
- <value tokenid="ooxml:Value_ST_VerticalJc_center">center</value>
- <value tokenid="ooxml:Value_ST_VerticalJc_both">both</value>
- <value tokenid="ooxml:Value_ST_VerticalJc_bottom">bottom</value>
- </resource>
- <resource name="CT_VerticalJc" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_VerticalJc_val" action="setValue"/>
- </resource>
- <resource name="ST_DocGrid" resource="List">
- <value tokenid="ooxml:Value_doc_ST_DocGrid_default">default</value>
- <value tokenid="ooxml:Value_doc_ST_DocGrid_lines">lines</value>
- <value tokenid="ooxml:Value_doc_ST_DocGrid_linesAndChars">linesAndChars</value>
- <value tokenid="ooxml:Value_doc_ST_DocGrid_snapToChars">snapToChars</value>
- </resource>
- <resource name="CT_DocGrid" resource="Properties">
- <attribute name="type" tokenid="ooxml:CT_DocGrid_type"/>
- <attribute name="linePitch" tokenid="ooxml:CT_DocGrid_linePitch"/>
- <attribute name="charSpace" tokenid="ooxml:CT_DocGrid_charSpace"/>
- </resource>
- <resource name="ST_HdrFtr" resource="List">
- <value tokenid="ooxml:Value_ST_HdrFtr_even">even</value>
- <value tokenid="ooxml:Value_ST_HdrFtr_default">default</value>
- <value tokenid="ooxml:Value_ST_HdrFtr_first">first</value>
- </resource>
- <resource name="ST_FtnEdn" resource="List">
- <value tokenid="ooxml:Value_doc_ST_FtnEdn_normal">normal</value>
- <value tokenid="ooxml:Value_doc_ST_FtnEdn_separator">separator</value>
- <value tokenid="ooxml:Value_doc_ST_FtnEdn_continuationSeparator">continuationSeparator</value>
- <value tokenid="ooxml:Value_doc_ST_FtnEdn_continuationNotice">continuationNotice</value>
- </resource>
- <resource name="CT_HdrFtrRef" resource="Properties">
- <attribute name="type" tokenid="ooxml:CT_HdrFtrRef_type"/>
- <attribute name="r:id" tokenid="ooxml:CT_HdrFtrRef_id"/>
- <action name="end" action="handleHdrFtr"/>
- </resource>
- <resource name="EG_HdrFtrReferences" resource="Properties">
- <element name="headerReference" tokenid="ooxml:EG_HdrFtrReferences_headerReference"/>
- <element name="footerReference" tokenid="ooxml:EG_HdrFtrReferences_footerReference"/>
- </resource>
- <resource name="CT_HdrFtr" resource="Stream">
- <action name="end" action="endParagraphGroup"/>
- </resource>
- <resource name="EG_SectPrContents" resource="Properties">
- <element name="bidi" tokenid="ooxml:EG_SectPrContents_bidi"/>
- <element name="cols" tokenid="ooxml:EG_SectPrContents_cols"/>
- <element name="docGrid" tokenid="ooxml:EG_SectPrContents_docGrid"/>
- <element name="endnotePr" tokenid="ooxml:EG_SectPrContents_endnotePr"/>
- <element name="footnotePr" tokenid="ooxml:EG_SectPrContents_footnotePr"/>
- <element name="formProt" tokenid="ooxml:EG_SectPrContents_formProt"/>
- <element name="lnNumType" tokenid="ooxml:EG_SectPrContents_lnNumType"/>
- <element name="noEndnote" tokenid="ooxml:EG_SectPrContents_noEndnote"/>
- <element name="paperSrc" tokenid="ooxml:EG_SectPrContents_paperSrc"/>
- <element name="pgBorders" tokenid="ooxml:EG_SectPrContents_pgBorders"/>
- <element name="pgMar" tokenid="ooxml:EG_SectPrContents_pgMar"/>
- <element name="pgNumType" tokenid="ooxml:EG_SectPrContents_pgNumType"/>
- <element name="pgSz" tokenid="ooxml:EG_SectPrContents_pgSz"/>
- <element name="printerSettings" tokenid="ooxml:EG_SectPrContents_printerSettings"/>
- <element name="rtlGutter" tokenid="ooxml:EG_SectPrContents_rtlGutter"/>
- <element name="textDirection" tokenid="ooxml:EG_SectPrContents_textDirection"/>
- <element name="titlePg" tokenid="ooxml:EG_SectPrContents_titlePg"/>
- <element name="type" tokenid="ooxml:EG_SectPrContents_type"/>
- <element name="vAlign" tokenid="ooxml:EG_SectPrContents_vAlign"/>
- </resource>
- <resource name="CT_SectPrBase" resource="Properties"/>
- <resource name="CT_SectPr" resource="Properties">
- <action name="start" action="handleLastParagraphInSection"/>
- <element name="sectPrChange" tokenid="ooxml:CT_SectPr_sectPrChange"/>
- <action name="start" action="setLastParagraphInSection"/>
- </resource>
- <resource name="CT_finalSectPr" resource="Properties">
- <action name="start" action="handleLastParagraphInSection"/>
- <element name="sectPrChange" tokenid="ooxml:CT_SectPr_sectPrChange"/>
- </resource>
- <resource name="ST_BrType" resource="List">
- <value tokenid="ooxml:Value_ST_BrType_column">column</value>
- <value tokenid="ooxml:Value_ST_BrType_page">page</value>
- <value tokenid="ooxml:Value_ST_BrType_textWrapping">textWrapping</value>
- </resource>
- <resource name="ST_BrClear" resource="List">
- <value tokenid="ooxml:Value_ST_BrClear_none">none</value>
- <value tokenid="ooxml:Value_ST_BrClear_left">left</value>
- <value tokenid="ooxml:Value_ST_BrClear_right">right</value>
- <value tokenid="ooxml:Value_ST_BrClear_all">all</value>
- </resource>
- <resource name="CT_Br" resource="Properties">
- <attribute name="type" tokenid="ooxml:CT_Br_type"/>
- <attribute name="clear" tokenid="ooxml:CT_Br_clear"/>
- <action name="end" action="handleBreak"/>
- </resource>
- <resource name="CT_Br_OutOfOrder" resource="Properties">
- <attribute name="type" tokenid="ooxml:CT_Br_type"/>
- <attribute name="clear" tokenid="ooxml:CT_Br_clear"/>
- <action name="end" action="handleOutOfOrderBreak"/>
- </resource>
- <resource name="ST_PTabAlignment" resource="List">
- <value tokenid="ooxml:Value_ST_PTabAlignment_left">left</value>
- <value tokenid="ooxml:Value_ST_PTabAlignment_center">center</value>
- <value tokenid="ooxml:Value_ST_PTabAlignment_right">right</value>
- </resource>
- <resource name="ST_PTabRelativeTo" resource="List">
- <value tokenid="ooxml:Value_ST_PTabRelativeTo_margin">margin</value>
- <value tokenid="ooxml:Value_ST_PTabRelativeTo_indent">indent</value>
- </resource>
- <resource name="ST_PTabLeader" resource="List">
- <value tokenid="ooxml:Value_ST_PTabLeader_none">none</value>
- <value tokenid="ooxml:Value_ST_PTabLeader_dot">dot</value>
- <value tokenid="ooxml:Value_ST_PTabLeader_hyphen">hyphen</value>
- <value tokenid="ooxml:Value_ST_PTabLeader_underscore">underscore</value>
- <value tokenid="ooxml:Value_ST_PTabLeader_middleDot">middleDot</value>
- </resource>
- <resource name="CT_PTab" resource="Properties">
- <attribute name="alignment" tokenid="ooxml:CT_PTab_alignment"/>
- <attribute name="relativeTo" tokenid="ooxml:CT_PTab_relativeTo"/>
- <attribute name="leader" tokenid="ooxml:CT_PTab_leader"/>
- <action name="end" action="tab"/>
- </resource>
- <resource name="CT_Sym" resource="Properties">
- <attribute name="font" tokenid="ooxml:CT_Sym_font"/>
- <attribute name="char" tokenid="ooxml:CT_Sym_char"/>
- <action name="end" action="symbol"/>
- </resource>
- <resource name="CT_Text" resource="Stream">
- <attribute name="xml:space" tokenid="ooxml:CT_Text_space"/>
- <action name="characters" action="text"/>
- </resource>
- <resource name="CT_instrText" resource="Stream">
- <attribute name="xml:space" tokenid="ooxml:CT_Text_space"/>
- <action name="start" action="sendPropertiesWithId" tokenid="ooxml:EG_RunInnerContent_instrText" sendtokenid="ooxml:EG_RunInnerContent_instrText"/>
- <action name="characters" action="text"/>
- </resource>
- <resource name="CT_delText" resource="Stream">
- <attribute name="xml:space" tokenid="ooxml:CT_Text_space"/>
- <action name="start" action="sendPropertiesWithId" tokenid="ooxml:EG_RunInnerContent_delText" sendtokenid="ooxml:EG_RunInnerContent_delText"/>
- <action name="characters" action="text"/>
- </resource>
- <resource name="CT_delInstrText" resource="Stream">
- <attribute name="xml:space" tokenid="ooxml:CT_Text_space"/>
- <action name="start" action="sendPropertiesWithId" tokenid="ooxml:EG_RunInnerContent_delInstrText" sendtokenid="ooxml:EG_RunInnerContent_delInstrText"/>
- <action name="characters" action="text"/>
- </resource>
- <resource name="CT_FtnEdnRefChar" resource="Stream">
- <action name="end" action="ftnednref"/>
- </resource>
- <resource name="CT_FtnEdnSep" resource="Stream">
- <action name="end" action="ftnednsep"/>
- </resource>
- <resource name="CT_FtnEdnCont" resource="Stream">
- <action name="end" action="ftnedncont"/>
- </resource>
- <resource name="CT_PgNum" resource="Stream">
- <action name="end" action="pgNum"/>
- </resource>
- <resource name="CT_Cr" resource="Properties">
- <action name="end" action="handleBreak"/>
- </resource>
- <resource name="CT_Tab" resource="Stream">
- <action name="end" action="tab"/>
- </resource>
- <resource name="EG_RunInnerContent" resource="Stream">
- <element name="br" tokenid="ooxml:EG_RunInnerContent_br"/>
- <element name="t" tokenid="ooxml:EG_RunInnerContent_t"/>
- <element name="delText" tokenid="ooxml:EG_RunInnerContent_delText"/>
- <element name="instrText" tokenid="ooxml:EG_RunInnerContent_instrText"/>
- <element name="delInstrText" tokenid="ooxml:EG_RunInnerContent_delInstrText"/>
- <element name="noBreakHyphen" tokenid="ooxml:EG_RunInnerContent_noBreakHyphen"/>
- <element name="softHyphen" tokenid="ooxml:EG_RunInnerContent_softHyphen"/>
- <element name="dayShort" tokenid="ooxml:EG_RunInnerContent_dayShort"/>
- <element name="monthShort" tokenid="ooxml:EG_RunInnerContent_monthShort"/>
- <element name="yearShort" tokenid="ooxml:EG_RunInnerContent_yearShort"/>
- <element name="dayLong" tokenid="ooxml:EG_RunInnerContent_dayLong"/>
- <element name="monthLong" tokenid="ooxml:EG_RunInnerContent_monthLong"/>
- <element name="yearLong" tokenid="ooxml:EG_RunInnerContent_yearLong"/>
- <element name="annotationRef" tokenid="ooxml:EG_RunInnerContent_annotationRef"/>
- <element name="footnoteRef" tokenid="ooxml:EG_RunInnerContent_footnoteRef"/>
- <element name="endnoteRef" tokenid="ooxml:EG_RunInnerContent_endnoteRef"/>
- <element name="separator" tokenid="ooxml:EG_RunInnerContent_separator"/>
- <element name="continuationSeparator" tokenid="ooxml:EG_RunInnerContent_continuationSeparator"/>
- <element name="sym" tokenid="ooxml:EG_RunInnerContent_sym"/>
- <element name="pgNum" tokenid="ooxml:EG_RunInnerContent_pgNum"/>
- <element name="cr" tokenid="ooxml:EG_RunInnerContent_cr"/>
- <element name="tab" tokenid="ooxml:EG_RunInnerContent_tab"/>
- <element name="object" tokenid="ooxml:EG_RunInnerContent_object"/>
- <element name="pict" tokenid="ooxml:EG_RunInnerContent_pict"/>
- <element name="fldChar" tokenid="ooxml:EG_RunInnerContent_fldChar"/>
- <element name="ruby" tokenid="ooxml:EG_RunInnerContent_ruby"/>
- <element name="footnoteReference" tokenid="ooxml:EG_RunInnerContent_footnoteReference"/>
- <element name="endnoteReference" tokenid="ooxml:EG_RunInnerContent_endnoteReference"/>
- <element name="commentReference" tokenid="ooxml:EG_RunInnerContent_commentReference"/>
- <element name="drawing" tokenid="ooxml:EG_RunInnerContent_drawing"/>
- <element name="ptab" tokenid="ooxml:EG_RunInnerContent_ptab"/>
- <element name="lastRenderedPageBreak" tokenid="ooxml:EG_RunInnerContent_lastRenderedPageBreak"/>
- </resource>
- <resource name="CT_R" resource="Stream">
- <action name="start" action="startCharacterGroup"/>
- <action name="start" action="sendPropertiesWithId" tokenid="ooxml:EG_RubyContent_r" sendtokenid="ooxml:EG_RubyContent_r"/>
- </resource>
- <resource name="ST_Hint" resource="List">
- <value tokenid="ooxml:Value_ST_Hint_default">default</value>
- <value tokenid="ooxml:Value_ST_Hint_eastAsia">eastAsia</value>
- <value tokenid="ooxml:Value_ST_Hint_cs">cs</value>
- </resource>
- <resource name="ST_Theme" resource="List">
- <value tokenid="ooxml:Value_ST_Theme_majorEastAsia">majorEastAsia</value>
- <value tokenid="ooxml:Value_ST_Theme_majorBidi">majorBidi</value>
- <value tokenid="ooxml:Value_ST_Theme_majorAscii">majorAscii</value>
- <value tokenid="ooxml:Value_ST_Theme_majorHAnsi">majorHAnsi</value>
- <value tokenid="ooxml:Value_ST_Theme_minorEastAsia">minorEastAsia</value>
- <value tokenid="ooxml:Value_ST_Theme_minorBidi">minorBidi</value>
- <value tokenid="ooxml:Value_ST_Theme_minorAscii">minorAscii</value>
- <value tokenid="ooxml:Value_ST_Theme_minorHAnsi">minorHAnsi</value>
- </resource>
- <resource name="CT_Fonts" resource="Properties">
- <attribute name="hint" tokenid="ooxml:CT_Fonts_hint"/>
- <attribute name="ascii" tokenid="ooxml:CT_Fonts_ascii"/>
- <attribute name="hAnsi" tokenid="ooxml:CT_Fonts_hAnsi"/>
- <attribute name="eastAsia" tokenid="ooxml:CT_Fonts_eastAsia"/>
- <attribute name="cs" tokenid="ooxml:CT_Fonts_cs"/>
- <attribute name="asciiTheme" tokenid="ooxml:CT_Fonts_asciiTheme"/>
- <attribute name="hAnsiTheme" tokenid="ooxml:CT_Fonts_hAnsiTheme"/>
- <attribute name="eastAsiaTheme" tokenid="ooxml:CT_Fonts_eastAsiaTheme"/>
- <attribute name="cstheme" tokenid="ooxml:CT_Fonts_cstheme"/>
- </resource>
- <resource name="EG_RPrBase" resource="Properties">
- <element name="rStyle" tokenid="ooxml:EG_RPrBase_rStyle"/>
- <element name="rFonts" tokenid="ooxml:EG_RPrBase_rFonts"/>
- <element name="b" tokenid="ooxml:EG_RPrBase_b"/>
- <element name="bCs" tokenid="ooxml:EG_RPrBase_bCs"/>
- <element name="i" tokenid="ooxml:EG_RPrBase_i"/>
- <element name="iCs" tokenid="ooxml:EG_RPrBase_iCs"/>
- <element name="caps" tokenid="ooxml:EG_RPrBase_caps"/>
- <element name="smallCaps" tokenid="ooxml:EG_RPrBase_smallCaps"/>
- <element name="strike" tokenid="ooxml:EG_RPrBase_strike"/>
- <element name="dstrike" tokenid="ooxml:EG_RPrBase_dstrike"/>
- <element name="outline" tokenid="ooxml:EG_RPrBase_outline"/>
- <element name="shadow" tokenid="ooxml:EG_RPrBase_shadow"/>
- <element name="emboss" tokenid="ooxml:EG_RPrBase_emboss"/>
- <element name="imprint" tokenid="ooxml:EG_RPrBase_imprint"/>
- <element name="noProof" tokenid="ooxml:EG_RPrBase_noProof"/>
- <element name="snapToGrid" tokenid="ooxml:EG_RPrBase_snapToGrid"/>
- <element name="vanish" tokenid="ooxml:EG_RPrBase_vanish"/>
- <element name="webHidden" tokenid="ooxml:EG_RPrBase_webHidden"/>
- <element name="color" tokenid="ooxml:EG_RPrBase_color"/>
- <element name="spacing" tokenid="ooxml:EG_RPrBase_spacing"/>
- <element name="w" tokenid="ooxml:EG_RPrBase_w"/>
- <element name="kern" tokenid="ooxml:EG_RPrBase_kern"/>
- <element name="position" tokenid="ooxml:EG_RPrBase_position"/>
- <element name="sz" tokenid="ooxml:EG_RPrBase_sz"/>
- <element name="szCs" tokenid="ooxml:EG_RPrBase_szCs"/>
- <element name="highlight" tokenid="ooxml:EG_RPrBase_highlight"/>
- <element name="u" tokenid="ooxml:EG_RPrBase_u"/>
- <element name="effect" tokenid="ooxml:EG_RPrBase_effect"/>
- <element name="bdr" tokenid="ooxml:EG_RPrBase_bdr"/>
- <element name="shd" tokenid="ooxml:EG_RPrBase_shd"/>
- <element name="fitText" tokenid="ooxml:EG_RPrBase_fitText"/>
- <element name="vertAlign" tokenid="ooxml:EG_RPrBase_vertAlign"/>
- <element name="rtl" tokenid="ooxml:EG_RPrBase_rtl"/>
- <element name="cs" tokenid="ooxml:EG_RPrBase_cs"/>
- <element name="em" tokenid="ooxml:EG_RPrBase_em"/>
- <element name="lang" tokenid="ooxml:EG_RPrBase_lang"/>
- <element name="eastAsianLayout" tokenid="ooxml:EG_RPrBase_eastAsianLayout"/>
- <element name="specVanish" tokenid="ooxml:EG_RPrBase_specVanish"/>
- <element name="oMath" tokenid="ooxml:EG_RPrBase_oMath"/>
- <element name="w14:glow" tokenid="ooxml:EG_RPrBase_w14_glow"/>
- <element name="w14:shadow" tokenid="ooxml:EG_RPrBase_w14_shadow"/>
- <element name="w14:reflection" tokenid="ooxml:EG_RPrBase_w14_reflection"/>
- <element name="w14:textOutline" tokenid="ooxml:EG_RPrBase_w14_textOutline"/>
- <element name="w14:textFill" tokenid="ooxml:EG_RPrBase_w14_textFill"/>
- <element name="w14:scene3d" tokenid="ooxml:EG_RPrBase_w14_scene3d"/>
- <element name="w14:props3d" tokenid="ooxml:EG_RPrBase_w14_props3d"/>
- <element name="w14:ligatures" tokenid="ooxml:EG_RPrBase_w14_ligatures"/>
- <element name="w14:numForm" tokenid="ooxml:EG_RPrBase_w14_numForm"/>
- <element name="w14:numSpacing" tokenid="ooxml:EG_RPrBase_w14_numSpacing"/>
- <element name="w14:stylisticSets" tokenid="ooxml:EG_RPrBase_w14_stylisticSets"/>
- <element name="w14:cntxtAlts" tokenid="ooxml:EG_RPrBase_w14_cntxtAlts"/>
- </resource>
- <resource name="EG_RPrContent" resource="Properties">
- <element name="rPrChange" tokenid="ooxml:EG_RPrContent_rPrChange"/>
- </resource>
- <resource name="CT_RPr" resource="Properties">
- </resource>
- <resource name="CT_RPrOriginal" resource="Properties"/>
- <resource name="CT_ParaRPrOriginal" resource="Properties"/>
- <resource name="CT_ParaRPr" resource="Properties">
- <element name="ins" tokenid="ooxml:CT_ParaRPr_ins"/>
- <element name="del" tokenid="ooxml:CT_ParaRPr_del"/>
- <element name="moveFrom" tokenid="ooxml:CT_ParaRPr_moveFrom"/>
- <element name="moveTo" tokenid="ooxml:CT_ParaRPr_moveTo"/>
- <element name="rPrChange" tokenid="ooxml:CT_ParaRPr_rPrChange"/>
- </resource>
- <resource name="CT_ParaTrackChange" resource="Properties">
- <action name="start" action="tokenproperty"/>
- <action name="start" action="sendPropertiesWithId" sendtokenid="ooxml:paratrackchange"/>
- <action name="start" action="clearProps"/>
- </resource>
- <resource name="CT_AltChunk" resource="Properties">
- <attribute name="r:id" tokenid="ooxml:CT_AltChunk"/>
- <action name="start" action="handleAltChunk"/>
- </resource>
- <resource name="ST_RubyAlign" resource="List">
- <value tokenid="ooxml:Value_ST_RubyAlign_center">center</value>
- <value tokenid="ooxml:Value_ST_RubyAlign_distributeLetter">distributeLetter</value>
- <value tokenid="ooxml:Value_ST_RubyAlign_distributeSpace">distributeSpace</value>
- <value tokenid="ooxml:Value_ST_RubyAlign_left">left</value>
- <value tokenid="ooxml:Value_ST_RubyAlign_right">right</value>
- <value tokenid="ooxml:Value_ST_RubyAlign_rightVertical">rightVertical</value>
- </resource>
- <resource name="CT_RubyAlign" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_RubyAlign_val" action="setValue"/>
- </resource>
- <resource name="CT_RubyPr" resource="Properties">
- <element name="rubyAlign" tokenid="ooxml:CT_RubyPr_rubyAlign"/>
- <element name="hps" tokenid="ooxml:CT_RubyPr_hps"/>
- <element name="hpsRaise" tokenid="ooxml:CT_RubyPr_hpsRaise"/>
- <element name="hpsBaseText" tokenid="ooxml:CT_RubyPr_hpsBaseText"/>
- <element name="lid" tokenid="ooxml:CT_RubyPr_lid"/>
- <element name="dirty" tokenid="ooxml:CT_RubyPr_dirty"/>
- <action name="start" action="sendPropertiesWithId" tokenid="ooxml:CT_RubyPr" sendtokenid="ooxml:CT_RubyPr"/>
- </resource>
- <resource name="CT_Ruby" resource="Stream">
- <element name="rubyPr" tokenid="ooxml:CT_RubyPr"/>
- <element name="rt" tokenid="ooxml:CT_Ruby_rt"/>
- <element name="rubyBase" tokenid="ooxml:CT_Ruby_rubyBase"/>
- <action name="start" action="sendPropertiesWithId" tokenid="ooxml:EG_RunInnerContent_ruby" sendtokenid="ooxml:EG_RunInnerContent_ruby"/>
- </resource>
- <resource name="CT_RubyContent" resource="Stream">
- <action name="start" action="sendPropertiesWithId" tokenid="ooxml:CT_Ruby_rt" sendtokenid="ooxml:CT_Ruby_rt"/>
- <action name="start" action="sendPropertiesWithId" tokenid="ooxml:CT_Ruby_rubyBase" sendtokenid="ooxml:CT_Ruby_rubyBase"/>
- </resource>
- <resource name="EG_RubyContent" resource="Stream">
- <element name="r" tokenid="ooxml:EG_RubyContent_r"/>
- </resource>
- <resource name="CT_Lock" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Lock_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_SdtDateMappingType" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_SdtDateMappingType_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_CalendarType" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_CalendarType_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_SdtText" resource="Properties">
- <attribute name="multiLine" tokenid="ooxml:CT_SdtText_multiLine"/>
- </resource>
- <resource name="CT_SdtPlaceholder" resource="Properties">
- <attribute name="docPart" tokenid="ooxml:CT_SdtPlaceholder_docPart"/>
- </resource>
- <resource name="CT_DataBinding" resource="Properties">
- <attribute name="prefixMappings" tokenid="ooxml:CT_DataBinding_prefixMappings"/>
- <attribute name="xpath" tokenid="ooxml:CT_DataBinding_xpath"/>
- <attribute name="storeItemID" tokenid="ooxml:CT_DataBinding_storeItemID"/>
- </resource>
- <resource name="CT_SdtColor" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_SdtColor_val"/>
- </resource>
- <resource name="CT_SdtAppearance" resource="Properties">
- <attribute name="w15:val" tokenid="ooxml:CT_SdtAppearance_val"/>
- </resource>
- <resource name="CT_SdtPr" resource="Properties">
- <element name="rPr" tokenid="ooxml:CT_SdtPr_rPr"/>
- <element name="alias" tokenid="ooxml:CT_SdtPr_alias"/>
- <element name="lock" tokenid="ooxml:CT_SdtPr_lock"/>
- <element name="placeholder" tokenid="ooxml:CT_SdtPr_placeholder"/>
- <element name="showingPlcHdr" tokenid="ooxml:CT_SdtPr_showingPlcHdr"/>
- <element name="dataBinding" tokenid="ooxml:CT_SdtPr_dataBinding"/>
- <element name="temporary" tokenid="ooxml:CT_SdtPr_temporary"/>
- <element name="id" tokenid="ooxml:CT_SdtPr_id"/>
- <element name="tabIndex" tokenid="ooxml:CT_SdtPr_tabIndex"/>
- <element name="tag" tokenid="ooxml:CT_SdtPr_tag"/>
- <element name="equation" tokenid="ooxml:CT_SdtPr_equation"/>
- <element name="comboBox" tokenid="ooxml:CT_SdtPr_comboBox"/>
- <element name="w14:checkbox" tokenid="ooxml:CT_SdtPr_checkbox"/>
- <element name="date" tokenid="ooxml:CT_SdtPr_date"/>
- <element name="docPartObj" tokenid="ooxml:CT_SdtPr_docPartObj"/>
- <element name="docPartList" tokenid="ooxml:CT_SdtPr_docPartList"/>
- <element name="dropDownList" tokenid="ooxml:CT_SdtPr_dropDownList"/>
- <element name="picture" tokenid="ooxml:CT_SdtPr_picture"/>
- <element name="richText" tokenid="ooxml:CT_SdtPr_richText"/>
- <element name="text" tokenid="ooxml:CT_SdtPr_text"/>
- <element name="citation" tokenid="ooxml:CT_SdtPr_citation"/>
- <element name="group" tokenid="ooxml:CT_SdtPr_group"/>
- <element name="bibliography" tokenid="ooxml:CT_SdtPr_bibliography"/>
- <element name="w15:color" tokenid="ooxml:CT_SdtPr_color"/>
- <element name="w15:appearance" tokenid="ooxml:CT_SdtPr_appearance"/>
- </resource>
- <resource name="CT_SdtEndPr" resource="Properties">
- <element name="rPr" tokenid="ooxml:CT_SdtEndPr_rPr"/>
- </resource>
- <resource name="CT_DirContentRun" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_DirContentRun_val" action="setValue"/>
- <action name="start" action="pushBiDiEmbedLevel"/>
- <action name="end" action="popBiDiEmbedLevel"/>
- </resource>
- <resource name="ST_Direction" resource="List">
- <value tokenid="ooxml:Value_ST_Direction_ltr">ltr</value>
- <value tokenid="ooxml:Value_ST_Direction_rtl">rtl</value>
- </resource>
- <resource name="CT_SdtContentRun" resource="Stream"/>
- <resource name="CT_SdtContentBlock" resource="Stream"/>
- <resource name="CT_SdtContentRow" resource="Stream"/>
- <resource name="CT_SdtContentCell" resource="Stream">
- <action name="start" action="startSdt"/>
- <action name="end" action="endSdt"/>
- </resource>
- <resource name="CT_SdtBlock" resource="Stream">
- <element name="sdtPr" tokenid="ooxml:CT_SdtBlock_sdtPr"/>
- <element name="sdtEndPr" tokenid="ooxml:CT_SdtBlock_sdtEndPr"/>
- <element name="sdtContent" tokenid="ooxml:CT_SdtBlock_sdtContent"/>
- <element name="sdtEndContent" tokenid="ooxml:CT_SdtBlock_sdtEndContent"/>
- <action name="start" action="startSdt"/>
- <action name="end" action="endSdt"/>
- </resource>
- <resource name="CT_SdtRun" resource="Stream">
- <element name="sdtPr" tokenid="ooxml:CT_SdtRun_sdtPr"/>
- <element name="sdtEndPr" tokenid="ooxml:CT_SdtRun_sdtEndPr"/>
- <element name="sdtContent" tokenid="ooxml:CT_SdtRun_sdtContent"/>
- <element name="sdtEndContent" tokenid="ooxml:CT_SdtRun_sdtEndContent"/>
- <action name="start" action="startSdtRun"/>
- <action name="end" action="endSdtRun"/>
- </resource>
- <resource name="CT_SdtCell" resource="Stream">
- <element name="sdtPr" tokenid="ooxml:CT_SdtCell_sdtPr"/>
- <element name="sdtEndPr" tokenid="ooxml:CT_SdtCell_sdtEndPr"/>
- <element name="sdtContent" tokenid="ooxml:CT_SdtCell_sdtContent"/>
- </resource>
- <resource name="CT_SdtRow" resource="Stream">
- <element name="sdtPr" tokenid="ooxml:CT_SdtRow_sdtPr"/>
- <element name="sdtEndPr" tokenid="ooxml:CT_SdtRow_sdtEndPr"/>
- <element name="sdtContent" tokenid="ooxml:CT_SdtRow_sdtContent"/>
- </resource>
- <resource name="CT_SdtDropDownList" resource="Properties">
- <element name="listItem" tokenid="ooxml:CT_SdtDropDownList_listItem"/>
- </resource>
- <resource name="CT_SdtDate" resource="Properties">
- <attribute name="fullDate" tokenid="ooxml:CT_SdtDate_fullDate"/>
- <element name="dateFormat" tokenid="ooxml:CT_SdtDate_dateFormat"/>
- <element name="lid" tokenid="ooxml:CT_SdtDate_lid"/>
- <element name="storeMappedDataAs" tokenid="ooxml:CT_SdtDate_storeMappedDataAs"/>
- <element name="calendar" tokenid="ooxml:CT_SdtDate_calendar"/>
- </resource>
- <resource name="CT_SdtDocPart" resource="Properties">
- <element name="docPartGallery" tokenid="ooxml:CT_SdtDocPart_docPartGallery"/>
- <element name="docPartCategory" tokenid="ooxml:CT_SdtDocPart_docPartCategory"/>
- <element name="docPartUnique" tokenid="ooxml:CT_SdtDocPart_docPartUnique"/>
- </resource>
- <resource name="CT_SdtListItem" resource="Properties">
- <attribute name="displayText" tokenid="ooxml:CT_SdtListItem_displayText"/>
- <attribute name="value" tokenid="ooxml:CT_SdtListItem_value"/>
- </resource>
- <resource name="CT_SdtPlaceholderDocPart" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_SdtPlaceholder_docPart_val"/>
- </resource>
- <resource name="CT_Attr" resource="Properties">
- <attribute name="uri" tokenid="ooxml:CT_Attr_uri"/>
- <attribute name="name" tokenid="ooxml:CT_Attr_name"/>
- <attribute name="val" tokenid="ooxml:CT_Attr_val"/>
- </resource>
- <resource name="CT_CustomXmlRun" resource="Properties">
- <element name="customXmlPr" tokenid="ooxml:CT_CustomXmlRun_customXmlPr"/>
- <attribute name="uri" tokenid="ooxml:CT_CustomXmlRun_uri"/>
- <attribute name="element" tokenid="ooxml:CT_CustomXmlRun_element"/>
- </resource>
- <resource name="CT_CustomXmlBlock" resource="Properties">
- <element name="customXmlPr" tokenid="ooxml:CT_CustomXmlBlock_customXmlPr"/>
- <attribute name="uri" tokenid="ooxml:CT_CustomXmlBlock_uri"/>
- <attribute name="element" tokenid="ooxml:CT_CustomXmlBlock_element"/>
- </resource>
- <resource name="CT_CustomXmlCell" resource="Properties">
- <element name="customXmlPr" tokenid="ooxml:CT_CustomXmlCell_customXmlPr"/>
- <attribute name="uri" tokenid="ooxml:CT_CustomXmlCell_uri"/>
- <attribute name="element" tokenid="ooxml:CT_CustomXmlCell_element"/>
- </resource>
- <resource name="CT_CustomXmlRow" resource="Properties">
- <element name="customXmlPr" tokenid="ooxml:CT_CustomXmlRow_customXmlPr"/>
- <attribute name="uri" tokenid="ooxml:CT_CustomXmlRow_uri"/>
- <attribute name="element" tokenid="ooxml:CT_CustomXmlRow_element"/>
- </resource>
- <resource name="CT_SmartTagRun" resource="Properties">
- <element name="smartTagPr" tokenid="ooxml:CT_SmartTagRun_smartTagPr"/>
- <attribute name="uri" tokenid="ooxml:CT_SmartTagRun_uri"/>
- <attribute name="element" tokenid="ooxml:CT_SmartTagRun_element"/>
- </resource>
- <resource name="CT_SmartTagPr" resource="Properties">
- <element name="attr" tokenid="ooxml:CT_SmartTagPr_attr"/>
- </resource>
- <resource name="EG_PContent" resource="Properties">
- <element name="fldSimple" tokenid="ooxml:EG_PContent_fldSimple"/>
- <element name="hyperlink" tokenid="ooxml:EG_PContent_hyperlink"/>
- <element name="subDoc" tokenid="ooxml:EG_PContent_subDoc"/>
- </resource>
- <resource name="CT_P" resource="Stream">
- <attribute name="w14:paraId" tokenid="ooxml:AG_Parids_paraId"/>
- <action name="start" action="handleLastParagraphInSection"/>
- <action name="start" action="startParagraphGroup"/>
- <action name="start" action="setHandle"/>
- <action name="start" action="sendTableDepth"/>
- <action name="end" action="endOfParagraph"/>
- </resource>
- <resource name="ST_TblWidth" resource="List">
- <value tokenid="ooxml:Value_ST_TblWidth_nil">nil</value>
- <value tokenid="ooxml:Value_ST_TblWidth_pct">pct</value>
- <value tokenid="ooxml:Value_ST_TblWidth_dxa">dxa</value>
- <value tokenid="ooxml:Value_ST_TblWidth_auto">auto</value>
- </resource>
- <resource name="CT_Height" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_Height_val"/>
- <attribute name="hRule" tokenid="ooxml:CT_Height_hRule"/>
- </resource>
- <resource name="CT_TblWidth" resource="Properties">
- <attribute name="w" tokenid="ooxml:CT_TblWidth_w"/>
- <attribute name="type" tokenid="ooxml:CT_TblWidth_type"/>
- </resource>
- <resource name="CT_TblPPr" resource="Properties">
- <attribute name="vertAnchor" tokenid="ooxml:CT_TblPPr_vertAnchor"/>
- <attribute name="tblpYSpec" tokenid="ooxml:CT_TblPPr_tblpYSpec"/>
- <attribute name="horzAnchor" tokenid="ooxml:CT_TblPPr_horzAnchor"/>
- <attribute name="tblpXSpec" tokenid="ooxml:CT_TblPPr_tblpXSpec"/>
- <attribute name="tblpY" tokenid="ooxml:CT_TblPPr_tblpY"/>
- <attribute name="tblpX" tokenid="ooxml:CT_TblPPr_tblpX"/>
- <attribute name="leftFromText" tokenid="ooxml:CT_TblPPr_leftFromText"/>
- <attribute name="rightFromText" tokenid="ooxml:CT_TblPPr_rightFromText"/>
- <attribute name="topFromText" tokenid="ooxml:CT_TblPPr_topFromText"/>
- <attribute name="bottomFromText" tokenid="ooxml:CT_TblPPr_bottomFromText"/>
- </resource>
- <resource name="CT_TblGridCol" resource="Value">
- <attribute name="w" tokenid="ooxml:CT_TblGridCol_w" action="setValue"/>
- <action name="start" action="setDefaultIntegerValue"/>
- </resource>
- <resource name="CT_TblGridBase" resource="Properties">
- <element name="gridCol" tokenid="ooxml:CT_TblGridBase_gridCol"/>
- </resource>
- <resource name="CT_TblGrid" resource="Properties">
- <element name="tblGridChange" tokenid="ooxml:CT_TblGrid_tblGridChange"/>
- <action name="end" action="propagateTableProperties"/>
- <action name="end" action="clearProps"/>
- </resource>
- <resource name="CT_TcBorders" resource="Properties">
- <element name="top" tokenid="ooxml:CT_TcBorders_top"/>
- <element name="start" tokenid="ooxml:CT_TcBorders_start"/>
- <element name="left" tokenid="ooxml:CT_TcBorders_left"/>
- <element name="bottom" tokenid="ooxml:CT_TcBorders_bottom"/>
- <element name="end" tokenid="ooxml:CT_TcBorders_end"/>
- <element name="right" tokenid="ooxml:CT_TcBorders_right"/>
- <element name="insideH" tokenid="ooxml:CT_TcBorders_insideH"/>
- <element name="insideV" tokenid="ooxml:CT_TcBorders_insideV"/>
- <element name="tl2br" tokenid="ooxml:CT_TcBorders_tl2br"/>
- <element name="tr2bl" tokenid="ooxml:CT_TcBorders_tr2bl"/>
- </resource>
- <resource name="CT_TcMar" resource="Properties">
- <element name="top" tokenid="ooxml:CT_TcMar_top"/>
- <element name="start" tokenid="ooxml:CT_TcMar_start"/>
- <element name="left" tokenid="ooxml:CT_TcMar_left"/>
- <element name="bottom" tokenid="ooxml:CT_TcMar_bottom"/>
- <element name="end" tokenid="ooxml:CT_TcMar_end"/>
- <element name="right" tokenid="ooxml:CT_TcMar_right"/>
- </resource>
- <resource name="ST_Merge" resource="List">
- <value tokenid="ooxml:Value_ST_Merge_continue">continue</value>
- <value tokenid="ooxml:Value_ST_Merge_restart">restart</value>
- </resource>
- <resource name="CT_VMerge" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_VMerge_val" action="setValue"/>
- </resource>
- <resource name="CT_HMerge" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_HMerge_val" action="setValue"/>
- </resource>
- <resource name="CT_TcPrBase" resource="Properties">
- <element name="cnfStyle" tokenid="ooxml:CT_TcPrBase_cnfStyle"/>
- <element name="tcW" tokenid="ooxml:CT_TcPrBase_tcW"/>
- <element name="gridSpan" tokenid="ooxml:CT_TcPrBase_gridSpan"/>
- <element name="hMerge" tokenid="ooxml:CT_TcPrBase_hMerge"/>
- <element name="vMerge" tokenid="ooxml:CT_TcPrBase_vMerge"/>
- <element name="tcBorders" tokenid="ooxml:CT_TcPrBase_tcBorders"/>
- <element name="shd" tokenid="ooxml:CT_TcPrBase_shd"/>
- <element name="noWrap" tokenid="ooxml:CT_TcPrBase_noWrap"/>
- <element name="tcMar" tokenid="ooxml:CT_TcPrBase_tcMar"/>
- <element name="textDirection" tokenid="ooxml:CT_TcPrBase_textDirection"/>
- <element name="tcFitText" tokenid="ooxml:CT_TcPrBase_tcFitText"/>
- <element name="vAlign" tokenid="ooxml:CT_TcPrBase_vAlign"/>
- <element name="hideMark" tokenid="ooxml:CT_TcPrBase_hideMark"/>
- <element name="cellDel" tokenid="ooxml:CT_TcPrBase_cellDel"/>
- <element name="cellIns" tokenid="ooxml:CT_TcPrBase_cellIns"/>
- <element name="cellMerge" tokenid="ooxml:CT_TcPrBase_cellMerge"/>
- </resource>
- <resource name="CT_TcPr" resource="Properties">
- <element name="tcPrChange" tokenid="ooxml:CT_TcPr_tcPrChange"/>
- <action name="end" action="propagateCellProperties"/>
- <action name="end" action="clearProps"/>
- </resource>
- <resource name="CT_TcPrInner" resource="Properties"/>
- <resource name="CT_Tc" resource="TextTableCell">
- <action name="start" action="startCell"/>
- <action name="end" action="endCell"/>
- <action name="end" action="sendCellProperties"/>
- <action name="end" action="endParagraphGroup"/>
- </resource>
- <resource name="ST_Cnf" resource="String"/>
- <resource name="CT_Cnf" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_Cnf_val"/>
- <attribute name="firstRow" tokenid="ooxml:CT_Cnf_firstRow"/>
- <attribute name="lastRow" tokenid="ooxml:CT_Cnf_lastRow"/>
- <attribute name="firstColumn" tokenid="ooxml:CT_Cnf_firstColumn"/>
- <attribute name="lastColumn" tokenid="ooxml:CT_Cnf_lastColumn"/>
- <attribute name="oddVBand" tokenid="ooxml:CT_Cnf_oddVBand"/>
- <attribute name="evenVBand" tokenid="ooxml:CT_Cnf_evenVBand"/>
- <attribute name="oddHBand" tokenid="ooxml:CT_Cnf_oddHBand"/>
- <attribute name="evenHBand" tokenid="ooxml:CT_Cnf_evenHBand"/>
- <attribute name="firstRowFirstColumn" tokenid="ooxml:CT_Cnf_firstRowFirstColumn"/>
- <attribute name="firstRowLastColumn" tokenid="ooxml:CT_Cnf_firstRowLastColumn"/>
- <attribute name="lastRowFirstColumn" tokenid="ooxml:CT_Cnf_lastRowFirstColumn"/>
- <attribute name="lastRowLastColumn" tokenid="ooxml:CT_Cnf_lastRowLastColumn"/>
- </resource>
- <resource name="CT_TrPrBase" resource="Properties">
- <element name="cnfStyle" tokenid="ooxml:CT_TrPrBase_cnfStyle"/>
- <element name="divId" tokenid="ooxml:CT_TrPrBase_divId"/>
- <element name="gridBefore" tokenid="ooxml:CT_TrPrBase_gridBefore"/>
- <element name="gridAfter" tokenid="ooxml:CT_TrPrBase_gridAfter"/>
- <element name="wBefore" tokenid="ooxml:CT_TrPrBase_wBefore"/>
- <element name="wAfter" tokenid="ooxml:CT_TrPrBase_wAfter"/>
- <element name="cantSplit" tokenid="ooxml:CT_TrPrBase_cantSplit"/>
- <element name="trHeight" tokenid="ooxml:CT_TrPrBase_trHeight"/>
- <element name="tblHeader" tokenid="ooxml:CT_TrPrBase_tblHeader"/>
- <element name="tblCellSpacing" tokenid="ooxml:CT_TrPrBase_tblCellSpacing"/>
- <element name="jc" tokenid="ooxml:CT_TrPrBase_jc"/>
- <element name="hidden" tokenid="ooxml:CT_TrPrBase_hidden"/>
- </resource>
- <resource name="CT_TrPrBaseGridAfter" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_TrPrBase_gridAfter" action="setValue"/>
- <action name="end" action="handleGridAfter"/>
- </resource>
- <resource name="CT_TrPr" resource="Properties">
- <element name="ins" tokenid="ooxml:CT_TrPr_ins"/>
- <element name="del" tokenid="ooxml:CT_TrPr_del"/>
- <element name="trPrChange" tokenid="ooxml:CT_TrPr_trPrChange"/>
- <action name="end" action="propagateRowProperties"/>
- <action name="end" action="clearProps"/>
- </resource>
- <resource name="CT_Row" resource="TextTableRow">
- <action name="start" action="startRow"/>
- <action name="end" action="sendRowProperties"/>
- <action name="end" action="sendTableProperties"/>
- <action name="end" action="endRow"/>
- </resource>
- <resource name="ST_TblLayout" resource="List">
- <value tokenid="ooxml:Value_doc_ST_TblLayout_fixed">fixed</value>
- <value tokenid="ooxml:Value_doc_ST_TblLayout_autofit">autofit</value>
- </resource>
- <resource name="CT_TblLayoutType" resource="Value">
- <attribute name="type" tokenid="ooxml:CT_TblLayoutType_type" action="setValue"/>
- </resource>
- <resource name="ST_TblOverlap" resource="List">
- <value tokenid="ooxml:Value_ST_TblOverlap_never">never</value>
- <value tokenid="ooxml:Value_ST_TblOverlap_overlap">overlap</value>
- </resource>
- <resource name="CT_TblOverlap" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_TblOverlap_val" action="setValue"/>
- </resource>
- <resource name="CT_TblCellMar" resource="Properties">
- <element name="top" tokenid="ooxml:CT_TblCellMar_top"/>
- <element name="start" tokenid="ooxml:CT_TblCellMar_start"/>
- <element name="left" tokenid="ooxml:CT_TblCellMar_left"/>
- <element name="bottom" tokenid="ooxml:CT_TblCellMar_bottom"/>
- <element name="end" tokenid="ooxml:CT_TblCellMar_end"/>
- <element name="right" tokenid="ooxml:CT_TblCellMar_right"/>
- </resource>
- <resource name="CT_TblBorders" resource="Properties">
- <element name="top" tokenid="ooxml:CT_TblBorders_top"/>
- <element name="start" tokenid="ooxml:CT_TblBorders_start"/>
- <element name="left" tokenid="ooxml:CT_TblBorders_left"/>
- <element name="bottom" tokenid="ooxml:CT_TblBorders_bottom"/>
- <element name="end" tokenid="ooxml:CT_TblBorders_end"/>
- <element name="right" tokenid="ooxml:CT_TblBorders_right"/>
- <element name="insideH" tokenid="ooxml:CT_TblBorders_insideH"/>
- <element name="insideV" tokenid="ooxml:CT_TblBorders_insideV"/>
- </resource>
- <resource name="CT_TblPrBase" resource="Properties">
- <element name="tblStyle" tokenid="ooxml:CT_TblPrBase_tblStyle"/>
- <element name="tblpPr" tokenid="ooxml:CT_TblPrBase_tblpPr"/>
- <element name="tblOverlap" tokenid="ooxml:CT_TblPrBase_tblOverlap"/>
- <element name="bidiVisual" tokenid="ooxml:CT_TblPrBase_bidiVisual"/>
- <element name="tblStyleRowBandSize" tokenid="ooxml:CT_TblPrBase_tblStyleRowBandSize"/>
- <element name="tblStyleColBandSize" tokenid="ooxml:CT_TblPrBase_tblStyleColBandSize"/>
- <element name="tblW" tokenid="ooxml:CT_TblPrBase_tblW"/>
- <element name="jc" tokenid="ooxml:CT_TblPrBase_jc"/>
- <element name="tblCellSpacing" tokenid="ooxml:CT_TblPrBase_tblCellSpacing"/>
- <element name="tblInd" tokenid="ooxml:CT_TblPrBase_tblInd"/>
- <element name="tblBorders" tokenid="ooxml:CT_TblPrBase_tblBorders"/>
- <element name="shd" tokenid="ooxml:CT_TblPrBase_shd"/>
- <element name="tblLayout" tokenid="ooxml:CT_TblPrBase_tblLayout"/>
- <element name="tblCellMar" tokenid="ooxml:CT_TblPrBase_tblCellMar"/>
- <element name="tblLook" tokenid="ooxml:CT_TblPrBase_tblLook"/>
- <element name="tblCaption" tokenid="ooxml:CT_TblPrBase_tblCaption"/>
- <element name="tblDescription" tokenid="ooxml:CT_TblPrBase_tblDescription"/>
- </resource>
- <resource name="CT_TblPr" resource="Properties">
- <element name="tblPrChange" tokenid="ooxml:CT_TblPr_tblPrChange"/>
- <action name="end" action="propagateTableProperties"/>
- <action name="end" action="clearProps"/>
- </resource>
- <resource name="CT_TblPrEx" resource="Properties">
- <element name="tblPrExChange" tokenid="ooxml:CT_TblPrEx_tblPrExChange"/>
- <element name="tblBorders" tokenid="ooxml:CT_TblPrEx_tblBorders"/>
- </resource>
- <resource name="CT_Tbl" resource="TextTable"/>
- <!-- tdf#111550 : allow <w:tbl> at paragraph level (despite this is illegal according to ECMA-376-1:2016) - bug-to-bug compatibility with Word -->
- <resource name="CT_P_Tbl" resource="TextTable">
- <action name="start" action="start_P_Tbl"/>
- </resource>
- <resource name="CT_TblLook" resource="Properties">
- <attribute name="firstRow" tokenid="ooxml:CT_TblLook_firstRow"/>
- <attribute name="lastRow" tokenid="ooxml:CT_TblLook_lastRow"/>
- <attribute name="firstColumn" tokenid="ooxml:CT_TblLook_firstColumn"/>
- <attribute name="lastColumn" tokenid="ooxml:CT_TblLook_lastColumn"/>
- <attribute name="noHBand" tokenid="ooxml:CT_TblLook_noHBand"/>
- <attribute name="noVBand" tokenid="ooxml:CT_TblLook_noVBand"/>
- <attribute name="val" tokenid="ooxml:CT_TblLook_val"/>
- </resource>
- <resource name="ST_FtnPos" resource="List">
- <value tokenid="ooxml:Value_ST_FtnPos_pageBottom">pageBottom</value>
- <value tokenid="ooxml:Value_ST_FtnPos_beneathText">beneathText</value>
- <value tokenid="ooxml:Value_ST_FtnPos_sectEnd">sectEnd</value>
- <value tokenid="ooxml:Value_ST_FtnPos_docEnd">docEnd</value>
- </resource>
- <resource name="CT_FtnPos" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_FtnPos_val" action="setValue"/>
- </resource>
- <resource name="ST_EdnPos" resource="List">
- <value tokenid="ooxml:Value_ST_EdnPos_sectEnd">sectEnd</value>
- <value tokenid="ooxml:Value_ST_EdnPos_docEnd">docEnd</value>
- </resource>
- <resource name="CT_EdnPos" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_EdnPos_val" action="setValue"/>
- </resource>
- <resource name="CT_NumFmt" resource="Properties">
- <attribute name="format" tokenid="ooxml:CT_NumFmt_format"/>
- <attribute name="val" tokenid="ooxml:CT_NumFmt_val"/>
- </resource>
- <resource name="ST_RestartNumber" resource="List">
- <value tokenid="ooxml:Value_ST_RestartNumber_continuous">continuous</value>
- <value tokenid="ooxml:Value_ST_RestartNumber_eachSect">eachSect</value>
- <value tokenid="ooxml:Value_ST_RestartNumber_eachPage">eachPage</value>
- </resource>
- <resource name="CT_NumRestart" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_NumRestart_val" action="setValue"/>
- </resource>
- <resource name="CT_FtnEdnRef" resource="Properties">
- <attribute name="customMarkFollows" tokenid="ooxml:CT_FtnEdnRef_customMarkFollows"/>
- <attribute name="id" tokenid="ooxml:CT_FtnEdnRef_id" action="setXNoteId"/>
- <action name="end" action="handleXNotes"/>
- </resource>
- <resource name="CT_FtnEdnSepRef" resource="Properties">
- <attribute name="id" tokenid="ooxml:CT_FtnEdnSepRef_id"/>
- </resource>
- <resource name="CT_FtnEdn" resource="XNote">
- <attribute name="type" tokenid="ooxml:CT_FtnEdn_type" action="checkType"/>
- <attribute name="id" tokenid="ooxml:CT_FtnEdn_id" action="checkId"/>
- <action name="start" action="propagateCharacterProperties"/>
- <action name="end" action="endSectionGroup"/>
- </resource>
- <resource name="CT_CommentRef" resource="Properties">
- <action name="end" action="handleComment"/>
- </resource>
- <resource name="EG_FtnEdnNumProps" resource="Properties">
- <element name="numStart" tokenid="ooxml:EG_FtnEdnNumProps_numStart"/>
- <element name="numRestart" tokenid="ooxml:EG_FtnEdnNumProps_numRestart"/>
- </resource>
- <resource name="CT_FtnProps" resource="Properties">
- <element name="pos" tokenid="ooxml:CT_FtnProps_pos"/>
- <element name="numFmt" tokenid="ooxml:CT_FtnProps_numFmt"/>
- </resource>
- <resource name="CT_EdnProps" resource="Properties">
- <element name="pos" tokenid="ooxml:CT_EdnProps_pos"/>
- <element name="numFmt" tokenid="ooxml:CT_EdnProps_numFmt"/>
- </resource>
- <resource name="CT_FtnDocProps" resource="Properties">
- <element name="footnote" tokenid="ooxml:CT_FtnDocProps_footnote"/>
- </resource>
- <resource name="CT_EdnDocProps" resource="Properties">
- <element name="endnote" tokenid="ooxml:CT_EdnDocProps_endnote"/>
- </resource>
- <resource name="CT_MailMergeSourceType" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_MailMergeSourceType_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_MailMerge" resource="Properties">
- <element name="mainDocumentType" tokenid="ooxml:CT_MailMerge_mainDocumentType"/>
- <element name="linkToQuery" tokenid="ooxml:CT_MailMerge_linkToQuery"/>
- <element name="dataType" tokenid="ooxml:CT_MailMerge_dataType"/>
- <element name="connectString" tokenid="ooxml:CT_MailMerge_connectString"/>
- <element name="query" tokenid="ooxml:CT_MailMerge_query"/>
- <element name="dataSource" tokenid="ooxml:CT_MailMerge_dataSource"/>
- <element name="headerSource" tokenid="ooxml:CT_MailMerge_headerSource"/>
- <element name="doNotSuppressBlankLines" tokenid="ooxml:CT_MailMerge_doNotSuppressBlankLines"/>
- <element name="destination" tokenid="ooxml:CT_MailMerge_destination"/>
- <element name="addressFieldName" tokenid="ooxml:CT_MailMerge_addressFieldName"/>
- <element name="mailSubject" tokenid="ooxml:CT_MailMerge_mailSubject"/>
- <element name="mailAsAttachment" tokenid="ooxml:CT_MailMerge_mailAsAttachment"/>
- <element name="viewMergedData" tokenid="ooxml:CT_MailMerge_viewMergedData"/>
- <element name="activeRecord" tokenid="ooxml:CT_MailMerge_activeRecord"/>
- <element name="checkErrors" tokenid="ooxml:CT_MailMerge_checkErrors"/>
- <element name="odso" tokenid="ooxml:CT_MailMerge_odso"/>
- </resource>
- <resource name="CT_TargetScreenSz" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_TargetScreenSz_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_Compat" resource="Properties">
- <element name="useSingleBorderforContiguousCells" tokenid="ooxml:CT_Compat_useSingleBorderforContiguousCells"/>
- <element name="wpJustification" tokenid="ooxml:CT_Compat_wpJustification"/>
- <element name="noTabHangInd" tokenid="ooxml:CT_Compat_noTabHangInd"/>
- <element name="noLeading" tokenid="ooxml:CT_Compat_noLeading"/>
- <element name="spaceForUL" tokenid="ooxml:CT_Compat_spaceForUL"/>
- <element name="noColumnBalance" tokenid="ooxml:CT_Compat_noColumnBalance"/>
- <element name="balanceSingleByteDoubleByteWidth" tokenid="ooxml:CT_Compat_balanceSingleByteDoubleByteWidth"/>
- <element name="noExtraLineSpacing" tokenid="ooxml:CT_Compat_noExtraLineSpacing"/>
- <element name="doNotLeaveBackslashAlone" tokenid="ooxml:CT_Compat_doNotLeaveBackslashAlone"/>
- <element name="ulTrailSpace" tokenid="ooxml:CT_Compat_ulTrailSpace"/>
- <element name="doNotExpandShiftReturn" tokenid="ooxml:CT_Compat_doNotExpandShiftReturn"/>
- <element name="spacingInWholePoints" tokenid="ooxml:CT_Compat_spacingInWholePoints"/>
- <element name="lineWrapLikeWord6" tokenid="ooxml:CT_Compat_lineWrapLikeWord6"/>
- <element name="printBodyTextBeforeHeader" tokenid="ooxml:CT_Compat_printBodyTextBeforeHeader"/>
- <element name="printColBlack" tokenid="ooxml:CT_Compat_printColBlack"/>
- <element name="wpSpaceWidth" tokenid="ooxml:CT_Compat_wpSpaceWidth"/>
- <element name="showBreaksInFrames" tokenid="ooxml:CT_Compat_showBreaksInFrames"/>
- <element name="subFontBySize" tokenid="ooxml:CT_Compat_subFontBySize"/>
- <element name="suppressBottomSpacing" tokenid="ooxml:CT_Compat_suppressBottomSpacing"/>
- <element name="suppressTopSpacing" tokenid="ooxml:CT_Compat_suppressTopSpacing"/>
- <element name="suppressSpacingAtTopOfPage" tokenid="ooxml:CT_Compat_suppressSpacingAtTopOfPage"/>
- <element name="suppressTopSpacingWP" tokenid="ooxml:CT_Compat_suppressTopSpacingWP"/>
- <element name="suppressSpBfAfterPgBrk" tokenid="ooxml:CT_Compat_suppressSpBfAfterPgBrk"/>
- <element name="swapBordersFacingPages" tokenid="ooxml:CT_Compat_swapBordersFacingPages"/>
- <element name="convMailMergeEsc" tokenid="ooxml:CT_Compat_convMailMergeEsc"/>
- <element name="truncateFontHeightsLikeWP6" tokenid="ooxml:CT_Compat_truncateFontHeightsLikeWP6"/>
- <element name="mwSmallCaps" tokenid="ooxml:CT_Compat_mwSmallCaps"/>
- <element name="usePrinterMetrics" tokenid="ooxml:CT_Compat_usePrinterMetrics"/>
- <element name="doNotSuppressParagraphBorders" tokenid="ooxml:CT_Compat_doNotSuppressParagraphBorders"/>
- <element name="wrapTrailSpaces" tokenid="ooxml:CT_Compat_wrapTrailSpaces"/>
- <element name="footnoteLayoutLikeWW8" tokenid="ooxml:CT_Compat_footnoteLayoutLikeWW8"/>
- <element name="shapeLayoutLikeWW8" tokenid="ooxml:CT_Compat_shapeLayoutLikeWW8"/>
- <element name="alignTablesRowByRow" tokenid="ooxml:CT_Compat_alignTablesRowByRow"/>
- <element name="forgetLastTabAlignment" tokenid="ooxml:CT_Compat_forgetLastTabAlignment"/>
- <element name="adjustLineHeightInTable" tokenid="ooxml:CT_Compat_adjustLineHeightInTable"/>
- <element name="autoSpaceLikeWord95" tokenid="ooxml:CT_Compat_autoSpaceLikeWord95"/>
- <element name="noSpaceRaiseLower" tokenid="ooxml:CT_Compat_noSpaceRaiseLower"/>
- <element name="doNotUseHTMLParagraphAutoSpacing" tokenid="ooxml:CT_Compat_doNotUseHTMLParagraphAutoSpacing"/>
- <element name="layoutRawTableWidth" tokenid="ooxml:CT_Compat_layoutRawTableWidth"/>
- <element name="layoutTableRowsApart" tokenid="ooxml:CT_Compat_layoutTableRowsApart"/>
- <element name="useWord97LineBreakRules" tokenid="ooxml:CT_Compat_useWord97LineBreakRules"/>
- <element name="doNotBreakWrappedTables" tokenid="ooxml:CT_Compat_doNotBreakWrappedTables"/>
- <element name="doNotSnapToGridInCell" tokenid="ooxml:CT_Compat_doNotSnapToGridInCell"/>
- <element name="selectFldWithFirstOrLastChar" tokenid="ooxml:CT_Compat_selectFldWithFirstOrLastChar"/>
- <element name="applyBreakingRules" tokenid="ooxml:CT_Compat_applyBreakingRules"/>
- <element name="doNotWrapTextWithPunct" tokenid="ooxml:CT_Compat_doNotWrapTextWithPunct"/>
- <element name="doNotUseEastAsianBreakRules" tokenid="ooxml:CT_Compat_doNotUseEastAsianBreakRules"/>
- <element name="useWord2002TableStyleRules" tokenid="ooxml:CT_Compat_useWord2002TableStyleRules"/>
- <element name="growAutofit" tokenid="ooxml:CT_Compat_growAutofit"/>
- <element name="useFELayout" tokenid="ooxml:CT_Compat_useFELayout"/>
- <element name="useNormalStyleForList" tokenid="ooxml:CT_Compat_useNormalStyleForList"/>
- <element name="doNotUseIndentAsNumberingTabStop" tokenid="ooxml:CT_Compat_doNotUseIndentAsNumberingTabStop"/>
- <element name="useAltKinsokuLineBreakRules" tokenid="ooxml:CT_Compat_useAltKinsokuLineBreakRules"/>
- <element name="allowSpaceOfSameStyleInTable" tokenid="ooxml:CT_Compat_allowSpaceOfSameStyleInTable"/>
- <element name="doNotSuppressIndentation" tokenid="ooxml:CT_Compat_doNotSuppressIndentation"/>
- <element name="doNotAutofitConstrainedTables" tokenid="ooxml:CT_Compat_doNotAutofitConstrainedTables"/>
- <element name="autofitToFirstFixedWidthCell" tokenid="ooxml:CT_Compat_autofitToFirstFixedWidthCell"/>
- <element name="underlineTabInNumList" tokenid="ooxml:CT_Compat_underlineTabInNumList"/>
- <element name="displayHangulFixedWidth" tokenid="ooxml:CT_Compat_displayHangulFixedWidth"/>
- <element name="splitPgBreakAndParaMark" tokenid="ooxml:CT_Compat_splitPgBreakAndParaMark"/>
- <element name="doNotVertAlignCellWithSp" tokenid="ooxml:CT_Compat_doNotVertAlignCellWithSp"/>
- <element name="doNotBreakConstrainedForcedTable" tokenid="ooxml:CT_Compat_doNotBreakConstrainedForcedTable"/>
- <element name="doNotVertAlignInTxbx" tokenid="ooxml:CT_Compat_doNotVertAlignInTxbx"/>
- <element name="useAnsiKerningPairs" tokenid="ooxml:CT_Compat_useAnsiKerningPairs"/>
- <element name="cachedColBalance" tokenid="ooxml:CT_Compat_cachedColBalance"/>
- <element name="compatSetting" tokenid="ooxml:CT_Compat_compatSetting"/>
- </resource>
- <resource name="CT_CompatSetting" resource="Properties">
- <attribute name="name" tokenid="ooxml:CT_CompatSetting_name"/>
- <attribute name="uri" tokenid="ooxml:CT_CompatSetting_uri"/>
- <attribute name="val" tokenid="ooxml:CT_CompatSetting_val"/>
- </resource>
- <resource name="CT_DocVars" resource="Properties">
- <element name="docVar" tokenid="ooxml:CT_DocVar"/>
- </resource>
- <resource name="CT_DocVar" resource="Properties">
- <attribute name="name" tokenid="ooxml:CT_DocVar_name"/>
- <attribute name="val" tokenid="ooxml:CT_DocVar_val"/>
- </resource>
- <resource name="CT_DocRsids" resource="Properties">
- <element name="rsidRoot" tokenid="ooxml:CT_DocRsids_rsidRoot"/>
- <element name="rsid" tokenid="ooxml:CT_DocRsids_rsid"/>
- </resource>
- <resource name="CT_CharacterSpacing" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_CharacterSpacing_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_SaveThroughXslt" resource="Properties">
- <attribute name="r:id" tokenid="ooxml:CT_SaveThroughXslt_r_id"/>
- <attribute name="solutionID" tokenid="ooxml:CT_SaveThroughXslt_solutionID"/>
- </resource>
- <resource name="CT_RPrDefault" resource="Properties">
- <element name="rPr" tokenid="ooxml:CT_RPrDefault_rPr"/>
- </resource>
- <resource name="CT_PPrDefault" resource="Properties">
- <element name="pPr" tokenid="ooxml:CT_PPrDefault_pPr"/>
- </resource>
- <resource name="CT_DocDefaults" resource="Properties">
- <element name="pPrDefault" tokenid="ooxml:CT_DocDefaults_pPrDefault"/>
- <element name="rPrDefault" tokenid="ooxml:CT_DocDefaults_rPrDefault"/>
- </resource>
- <resource name="CT_LatentStyles" resource="Properties">
- <attribute name="defLockedState" tokenid="ooxml:CT_LatentStyles_defLockedState"/>
- <attribute name="defUIPriority" tokenid="ooxml:CT_LatentStyles_defUIPriority"/>
- <attribute name="defSemiHidden" tokenid="ooxml:CT_LatentStyles_defSemiHidden"/>
- <attribute name="defUnhideWhenUsed" tokenid="ooxml:CT_LatentStyles_defUnhideWhenUsed"/>
- <attribute name="defQFormat" tokenid="ooxml:CT_LatentStyles_defQFormat"/>
- <attribute name="count" tokenid="ooxml:CT_LatentStyles_count"/>
- <element name="lsdException" tokenid="ooxml:CT_LatentStyles_lsdException"/>
- </resource>
- <resource name="CT_LsdException" resource="Properties">
- <attribute name="name" tokenid="ooxml:CT_LsdException_name"/>
- <attribute name="locked" tokenid="ooxml:CT_LsdException_locked"/>
- <attribute name="uiPriority" tokenid="ooxml:CT_LsdException_uiPriority"/>
- <attribute name="semiHidden" tokenid="ooxml:CT_LsdException_semiHidden"/>
- <attribute name="unhideWhenUsed" tokenid="ooxml:CT_LsdException_unhideWhenUsed"/>
- <attribute name="qFormat" tokenid="ooxml:CT_LsdException_qFormat"/>
- </resource>
- <resource name="ST_ColorSchemeIndex" resource="List">
- <value tokenid="ooxml:Value_doc_ST_ColorSchemeIndex_dark1">dark1</value>
- <value tokenid="ooxml:Value_doc_ST_ColorSchemeIndex_light1">light1</value>
- <value tokenid="ooxml:Value_doc_ST_ColorSchemeIndex_dark2">dark2</value>
- <value tokenid="ooxml:Value_doc_ST_ColorSchemeIndex_light2">light2</value>
- <value tokenid="ooxml:Value_doc_ST_ColorSchemeIndex_accent1">accent1</value>
- <value tokenid="ooxml:Value_doc_ST_ColorSchemeIndex_accent2">accent2</value>
- <value tokenid="ooxml:Value_doc_ST_ColorSchemeIndex_accent3">accent3</value>
- <value tokenid="ooxml:Value_doc_ST_ColorSchemeIndex_accent4">accent4</value>
- <value tokenid="ooxml:Value_doc_ST_ColorSchemeIndex_accent5">accent5</value>
- <value tokenid="ooxml:Value_doc_ST_ColorSchemeIndex_accent6">accent6</value>
- <value tokenid="ooxml:Value_doc_ST_ColorSchemeIndex_hyperlink">hyperlink</value>
- <value tokenid="ooxml:Value_doc_ST_ColorSchemeIndex_followedHyperlink">followedHyperlink</value>
- </resource>
- <resource name="CT_ReadingModeInkLockDown" resource="Properties">
- <attribute name="actualPg" tokenid="ooxml:CT_ReadingModeInkLockDown_actualPg"/>
- <attribute name="w" tokenid="ooxml:CT_ReadingModeInkLockDown_w"/>
- <attribute name="h" tokenid="ooxml:CT_ReadingModeInkLockDown_h"/>
- <attribute name="fontSz" tokenid="ooxml:CT_ReadingModeInkLockDown_fontSz"/>
- </resource>
- <resource name="CT_WriteProtection" resource="Properties">
- <attribute name="recommended" tokenid="ooxml:CT_WriteProtection_recommended"/>
- </resource>
- <resource name="CT_Settings" resource="PropertyTable" tokenid="ooxml:SETTINGS">
- <element name="writeProtection" tokenid="ooxml:CT_Settings_writeProtection"/>
- <element name="view" tokenid="ooxml:CT_Settings_view"/>
- <element name="zoom" tokenid="ooxml:CT_Settings_zoom"/>
- <element name="removePersonalInformation" tokenid="ooxml:CT_Settings_removePersonalInformation"/>
- <element name="removeDateAndTime" tokenid="ooxml:CT_Settings_removeDateAndTime"/>
- <element name="doNotDisplayPageBoundaries" tokenid="ooxml:CT_Settings_doNotDisplayPageBoundaries"/>
- <element name="displayBackgroundShape" tokenid="ooxml:CT_Settings_displayBackgroundShape"/>
- <element name="printPostScriptOverText" tokenid="ooxml:CT_Settings_printPostScriptOverText"/>
- <element name="printFractionalCharacterWidth" tokenid="ooxml:CT_Settings_printFractionalCharacterWidth"/>
- <element name="printFormsData" tokenid="ooxml:CT_Settings_printFormsData"/>
- <element name="embedTrueTypeFonts" tokenid="ooxml:CT_Settings_embedTrueTypeFonts"/>
- <element name="embedSystemFonts" tokenid="ooxml:CT_Settings_embedSystemFonts"/>
- <element name="saveSubsetFonts" tokenid="ooxml:CT_Settings_saveSubsetFonts"/>
- <element name="saveFormsData" tokenid="ooxml:CT_Settings_saveFormsData"/>
- <element name="mirrorMargins" tokenid="ooxml:CT_Settings_mirrorMargins"/>
- <element name="alignBordersAndEdges" tokenid="ooxml:CT_Settings_alignBordersAndEdges"/>
- <element name="bordersDoNotSurroundHeader" tokenid="ooxml:CT_Settings_bordersDoNotSurroundHeader"/>
- <element name="bordersDoNotSurroundFooter" tokenid="ooxml:CT_Settings_bordersDoNotSurroundFooter"/>
- <element name="gutterAtTop" tokenid="ooxml:CT_Settings_gutterAtTop"/>
- <element name="hideSpellingErrors" tokenid="ooxml:CT_Settings_hideSpellingErrors"/>
- <element name="hideGrammaticalErrors" tokenid="ooxml:CT_Settings_hideGrammaticalErrors"/>
- <element name="activeWritingStyle" tokenid="ooxml:CT_Settings_activeWritingStyle"/>
- <element name="proofState" tokenid="ooxml:CT_Settings_proofState"/>
- <element name="formsDesign" tokenid="ooxml:CT_Settings_formsDesign"/>
- <element name="attachedTemplate" tokenid="ooxml:CT_Settings_attachedTemplate"/>
- <element name="linkStyles" tokenid="ooxml:CT_Settings_linkStyles"/>
- <element name="stylePaneFormatFilter" tokenid="ooxml:CT_Settings_stylePaneFormatFilter"/>
- <element name="stylePaneSortMethod" tokenid="ooxml:CT_Settings_stylePaneSortMethod"/>
- <element name="documentType" tokenid="ooxml:CT_Settings_documentType"/>
- <element name="mailMerge" tokenid="ooxml:CT_Settings_mailMerge"/>
- <element name="revisionView" tokenid="ooxml:CT_Settings_revisionView"/>
- <element name="trackRevisions" tokenid="ooxml:CT_Settings_trackRevisions"/>
- <element name="doNotTrackMoves" tokenid="ooxml:CT_Settings_doNotTrackMoves"/>
- <element name="doNotTrackFormatting" tokenid="ooxml:CT_Settings_doNotTrackFormatting"/>
- <element name="documentProtection" tokenid="ooxml:CT_Settings_documentProtection"/>
- <element name="autoFormatOverride" tokenid="ooxml:CT_Settings_autoFormatOverride"/>
- <element name="styleLockTheme" tokenid="ooxml:CT_Settings_styleLockTheme"/>
- <element name="styleLockQFSet" tokenid="ooxml:CT_Settings_styleLockQFSet"/>
- <element name="defaultTabStop" tokenid="ooxml:CT_Settings_defaultTabStop"/>
- <element name="autoHyphenation" tokenid="ooxml:CT_Settings_autoHyphenation"/>
- <element name="consecutiveHyphenLimit" tokenid="ooxml:CT_Settings_consecutiveHyphenLimit"/>
- <element name="hyphenationZone" tokenid="ooxml:CT_Settings_hyphenationZone"/>
- <element name="doNotHyphenateCaps" tokenid="ooxml:CT_Settings_doNotHyphenateCaps"/>
- <element name="showEnvelope" tokenid="ooxml:CT_Settings_showEnvelope"/>
- <element name="summaryLength" tokenid="ooxml:CT_Settings_summaryLength"/>
- <element name="clickAndTypeStyle" tokenid="ooxml:CT_Settings_clickAndTypeStyle"/>
- <element name="defaultTableStyle" tokenid="ooxml:CT_Settings_defaultTableStyle"/>
- <element name="evenAndOddHeaders" tokenid="ooxml:CT_Settings_evenAndOddHeaders"/>
- <element name="bookFoldRevPrinting" tokenid="ooxml:CT_Settings_bookFoldRevPrinting"/>
- <element name="bookFoldPrinting" tokenid="ooxml:CT_Settings_bookFoldPrinting"/>
- <element name="bookFoldPrintingSheets" tokenid="ooxml:CT_Settings_bookFoldPrintingSheets"/>
- <element name="drawingGridHorizontalSpacing" tokenid="ooxml:CT_Settings_drawingGridHorizontalSpacing"/>
- <element name="drawingGridVerticalSpacing" tokenid="ooxml:CT_Settings_drawingGridVerticalSpacing"/>
- <element name="displayHorizontalDrawingGridEvery" tokenid="ooxml:CT_Settings_displayHorizontalDrawingGridEvery"/>
- <element name="displayVerticalDrawingGridEvery" tokenid="ooxml:CT_Settings_displayVerticalDrawingGridEvery"/>
- <element name="doNotUseMarginsForDrawingGridOrigin" tokenid="ooxml:CT_Settings_doNotUseMarginsForDrawingGridOrigin"/>
- <element name="drawingGridHorizontalOrigin" tokenid="ooxml:CT_Settings_drawingGridHorizontalOrigin"/>
- <element name="drawingGridVerticalOrigin" tokenid="ooxml:CT_Settings_drawingGridVerticalOrigin"/>
- <element name="doNotShadeFormData" tokenid="ooxml:CT_Settings_doNotShadeFormData"/>
- <element name="noPunctuationKerning" tokenid="ooxml:CT_Settings_noPunctuationKerning"/>
- <element name="characterSpacingControl" tokenid="ooxml:CT_Settings_characterSpacingControl"/>
- <element name="printTwoOnOne" tokenid="ooxml:CT_Settings_printTwoOnOne"/>
- <element name="strictFirstAndLastChars" tokenid="ooxml:CT_Settings_strictFirstAndLastChars"/>
- <element name="noLineBreaksAfter" tokenid="ooxml:CT_Settings_noLineBreaksAfter"/>
- <element name="noLineBreaksBefore" tokenid="ooxml:CT_Settings_noLineBreaksBefore"/>
- <element name="savePreviewPicture" tokenid="ooxml:CT_Settings_savePreviewPicture"/>
- <element name="doNotValidateAgainstSchema" tokenid="ooxml:CT_Settings_doNotValidateAgainstSchema"/>
- <element name="saveInvalidXml" tokenid="ooxml:CT_Settings_saveInvalidXml"/>
- <element name="ignoreMixedContent" tokenid="ooxml:CT_Settings_ignoreMixedContent"/>
- <element name="alwaysShowPlaceholderText" tokenid="ooxml:CT_Settings_alwaysShowPlaceholderText"/>
- <element name="doNotDemarcateInvalidXml" tokenid="ooxml:CT_Settings_doNotDemarcateInvalidXml"/>
- <element name="saveXmlDataOnly" tokenid="ooxml:CT_Settings_saveXmlDataOnly"/>
- <element name="useXSLTWhenSaving" tokenid="ooxml:CT_Settings_useXSLTWhenSaving"/>
- <element name="saveThroughXslt" tokenid="ooxml:CT_Settings_saveThroughXslt"/>
- <element name="showXMLTags" tokenid="ooxml:CT_Settings_showXMLTags"/>
- <element name="alwaysMergeEmptyNamespace" tokenid="ooxml:CT_Settings_alwaysMergeEmptyNamespace"/>
- <element name="updateFields" tokenid="ooxml:CT_Settings_updateFields"/>
- <element name="hdrShapeDefaults" tokenid="ooxml:CT_Settings_hdrShapeDefaults"/>
- <element name="footnotePr" tokenid="ooxml:CT_Settings_footnotePr"/>
- <element name="endnotePr" tokenid="ooxml:CT_Settings_endnotePr"/>
- <element name="compat" tokenid="ooxml:CT_Settings_compat"/>
- <element name="docVars" tokenid="ooxml:CT_Settings_docVars"/>
- <element name="rsids" tokenid="ooxml:CT_Settings_rsids"/>
- <element name="uiCompat97To2003" tokenid="ooxml:CT_Settings_uiCompat97To2003"/>
- <element name="attachedSchema" tokenid="ooxml:CT_Settings_attachedSchema"/>
- <element name="themeFontLang" tokenid="ooxml:CT_Settings_themeFontLang"/>
- <element name="clrSchemeMapping" tokenid="ooxml:CT_Settings_clrSchemeMapping"/>
- <element name="doNotIncludeSubdocsInStats" tokenid="ooxml:CT_Settings_doNotIncludeSubdocsInStats"/>
- <element name="doNotAutoCompressPictures" tokenid="ooxml:CT_Settings_doNotAutoCompressPictures"/>
- <element name="forceUpgrade" tokenid="ooxml:CT_Settings_forceUpgrade"/>
- <element name="captions" tokenid="ooxml:CT_Settings_captions"/>
- <element name="readModeInkLockDown" tokenid="ooxml:CT_Settings_readModeInkLockDown"/>
- <element name="smartTagType" tokenid="ooxml:CT_Settings_smartTagType"/>
- <element name="shapeDefaults" tokenid="ooxml:CT_Settings_shapeDefaults"/>
- <element name="doNotEmbedSmartTags" tokenid="ooxml:CT_Settings_doNotEmbedSmartTags"/>
- <element name="decimalSymbol" tokenid="ooxml:CT_Settings_decimalSymbol"/>
- <element name="listSeparator" tokenid="ooxml:CT_Settings_listSeparator"/>
- </resource>
- <resource name="CT_FrameScrollbar" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_FrameScrollbar_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_FrameLayout" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_FrameLayout_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_LevelSuffix" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_LevelSuffix_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_LevelText" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_LevelText_val"/>
- <attribute name="null" tokenid="ooxml:CT_LevelText_null"/>
- </resource>
- <resource name="CT_LvlLegacy" resource="Properties">
- <attribute name="legacy" tokenid="ooxml:CT_LvlLegacy_legacy"/>
- <attribute name="legacySpace" tokenid="ooxml:CT_LvlLegacy_legacySpace"/>
- <attribute name="legacyIndent" tokenid="ooxml:CT_LvlLegacy_legacyIndent"/>
- </resource>
- <resource name="CT_Lvl" resource="Properties">
- <element name="start" tokenid="ooxml:CT_Lvl_start"/>
- <element name="numFmt" tokenid="ooxml:CT_Lvl_numFmt"/>
- <element name="lvlRestart" tokenid="ooxml:CT_Lvl_lvlRestart"/>
- <element name="pStyle" tokenid="ooxml:CT_Lvl_pStyle"/>
- <element name="isLgl" tokenid="ooxml:CT_Lvl_isLgl"/>
- <element name="suff" tokenid="ooxml:CT_Lvl_suff"/>
- <element name="lvlText" tokenid="ooxml:CT_Lvl_lvlText"/>
- <element name="lvlPicBulletId" tokenid="ooxml:CT_Lvl_lvlPicBulletId"/>
- <element name="legacy" tokenid="ooxml:CT_Lvl_legacy"/>
- <element name="lvlJc" tokenid="ooxml:CT_Lvl_lvlJc"/>
- <element name="pPr" tokenid="ooxml:CT_Lvl_pPr"/>
- <element name="rPr" tokenid="ooxml:CT_Lvl_rPr"/>
- <attribute name="ilvl" tokenid="ooxml:CT_Lvl_ilvl"/>
- <attribute name="tplc" tokenid="ooxml:CT_Lvl_tplc"/>
- <attribute name="tentative" tokenid="ooxml:CT_Lvl_tentative"/>
- </resource>
- <resource name="ST_MultiLevelType" resource="List">
- <value tokenid="ooxml:Value_ST_MultiLevelType_singleLevel">singleLevel</value>
- <value tokenid="ooxml:Value_ST_MultiLevelType_multilevel">multilevel</value>
- <value tokenid="ooxml:Value_ST_MultiLevelType_hybridMultilevel">hybridMultilevel</value>
- </resource>
- <resource name="CT_MultiLevelType" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_MultiLevelType_val" action="setValue"/>
- </resource>
- <resource name="CT_NumPicBullet" resource="Properties">
- <element name="pict" tokenid="ooxml:CT_NumPicBullet_pict"/>
- <attribute name="numPicBulletId" tokenid="ooxml:CT_NumPicBullet_numPicBulletId"/>
- </resource>
- <resource name="CT_AbstractNum" resource="Properties">
- <element name="nsid" tokenid="ooxml:CT_AbstractNum_nsid"/>
- <element name="multiLevelType" tokenid="ooxml:CT_AbstractNum_multiLevelType"/>
- <element name="tmpl" tokenid="ooxml:CT_AbstractNum_tmpl"/>
- <element name="name" tokenid="ooxml:CT_AbstractNum_name"/>
- <element name="styleLink" tokenid="ooxml:CT_AbstractNum_styleLink"/>
- <element name="numStyleLink" tokenid="ooxml:CT_AbstractNum_numStyleLink"/>
- <element name="lvl" tokenid="ooxml:CT_AbstractNum_lvl"/>
- <attribute name="abstractNumId" tokenid="ooxml:CT_AbstractNum_abstractNumId"/>
- </resource>
- <resource name="CT_NumLvl" resource="Properties">
- <element name="startOverride" tokenid="ooxml:CT_NumLvl_startOverride"/>
- <element name="lvl" tokenid="ooxml:CT_NumLvl_lvl"/>
- <attribute name="ilvl" tokenid="ooxml:CT_NumLvl_ilvl"/>
- </resource>
- <resource name="CT_Num" resource="Properties">
- <element name="abstractNumId" tokenid="ooxml:CT_Num_abstractNumId"/>
- <element name="lvlOverride" tokenid="ooxml:CT_Num_lvlOverride"/>
- <attribute name="numId" tokenid="ooxml:CT_Num_numId"/>
- </resource>
- <resource name="CT_Numbering" resource="PropertyTable" tokenid="ooxml:NUMBERING">
- <element name="numPicBullet" tokenid="ooxml:CT_Numbering_numPicBullet"/>
- <element name="abstractNum" tokenid="ooxml:CT_Numbering_abstractNum"/>
- <element name="num" tokenid="ooxml:CT_Numbering_num"/>
- <element name="numIdMacAtCleanup" tokenid="ooxml:CT_Numbering_numIdMacAtCleanup"/>
- </resource>
- <resource name="ST_TblStyleOverrideType" resource="List">
- <value tokenid="ooxml:Value_ST_TblStyleOverrideType_wholeTable">wholeTable</value>
- <value tokenid="ooxml:Value_ST_TblStyleOverrideType_firstRow">firstRow</value>
- <value tokenid="ooxml:Value_ST_TblStyleOverrideType_lastRow">lastRow</value>
- <value tokenid="ooxml:Value_ST_TblStyleOverrideType_firstCol">firstCol</value>
- <value tokenid="ooxml:Value_ST_TblStyleOverrideType_lastCol">lastCol</value>
- <value tokenid="ooxml:Value_ST_TblStyleOverrideType_band1Vert">band1Vert</value>
- <value tokenid="ooxml:Value_ST_TblStyleOverrideType_band2Vert">band2Vert</value>
- <value tokenid="ooxml:Value_ST_TblStyleOverrideType_band1Horz">band1Horz</value>
- <value tokenid="ooxml:Value_ST_TblStyleOverrideType_band2Horz">band2Horz</value>
- <value tokenid="ooxml:Value_ST_TblStyleOverrideType_neCell">neCell</value>
- <value tokenid="ooxml:Value_ST_TblStyleOverrideType_nwCell">nwCell</value>
- <value tokenid="ooxml:Value_ST_TblStyleOverrideType_seCell">seCell</value>
- <value tokenid="ooxml:Value_ST_TblStyleOverrideType_swCell">swCell</value>
- </resource>
- <resource name="CT_Style_tblStylePr" resource="Properties">
- <element name="pPr" tokenid="ooxml:CT_PPrBase"/>
- <element name="rPr" tokenid="ooxml:EG_RPrBase"/>
- <element name="tblPr" tokenid="ooxml:CT_TblPrBase"/>
- <element name="trPr" tokenid="ooxml:CT_TrPrBase"/>
- <element name="tcPr" tokenid="ooxml:CT_TcPrBase"/>
- <attribute name="type" tokenid="ooxml:CT_TblStyleOverrideType"/>
- </resource>
- <resource name="ST_StyleType" resource="List">
- <value tokenid="ooxml:Value_ST_StyleType_paragraph">paragraph</value>
- <value tokenid="ooxml:Value_ST_StyleType_character">character</value>
- <value tokenid="ooxml:Value_ST_StyleType_table">table</value>
- <value tokenid="ooxml:Value_ST_StyleType_numbering">numbering</value>
- </resource>
- <resource name="CT_Style" resource="Properties">
- <element name="name" tokenid="ooxml:CT_Style_name"/>
- <element name="aliases" tokenid="ooxml:CT_Style_aliases"/>
- <element name="basedOn" tokenid="ooxml:CT_Style_basedOn"/>
- <element name="next" tokenid="ooxml:CT_Style_next"/>
- <element name="link" tokenid="ooxml:CT_Style_link"/>
- <element name="autoRedefine" tokenid="ooxml:CT_Style_autoRedefine"/>
- <element name="hidden" tokenid="ooxml:CT_Style_hidden"/>
- <element name="uiPriority" tokenid="ooxml:CT_Style_uiPriority"/>
- <element name="semiHidden" tokenid="ooxml:CT_Style_semiHidden"/>
- <element name="unhideWhenUsed" tokenid="ooxml:CT_Style_unhideWhenUsed"/>
- <element name="qFormat" tokenid="ooxml:CT_Style_qFormat"/>
- <element name="locked" tokenid="ooxml:CT_Style_locked"/>
- <element name="personal" tokenid="ooxml:CT_Style_personal"/>
- <element name="personalCompose" tokenid="ooxml:CT_Style_personalCompose"/>
- <element name="personalReply" tokenid="ooxml:CT_Style_personalReply"/>
- <element name="rsid" tokenid="ooxml:CT_Style_rsid"/>
- <element name="pPr" tokenid="ooxml:CT_Style_pPr"/>
- <element name="rPr" tokenid="ooxml:CT_Style_rPr"/>
- <element name="tblPr" tokenid="ooxml:CT_Style_tblPr"/>
- <element name="trPr" tokenid="ooxml:CT_Style_trPr"/>
- <element name="tcPr" tokenid="ooxml:CT_Style_tcPr"/>
- <element name="tblStylePr" tokenid="ooxml:CT_Style_tblStylePr"/>
- <attribute name="type" tokenid="ooxml:CT_Style_type"/>
- <attribute name="styleId" tokenid="ooxml:CT_Style_styleId"/>
- <attribute name="default" tokenid="ooxml:CT_Style_default"/>
- <attribute name="customStyle" tokenid="ooxml:CT_Style_customStyle"/>
- </resource>
- <resource name="CT_Styles" resource="Table" tokenid="ooxml:STYLESHEET"/>
- <resource name="ST_Panose" resource="Hex"/>
- <resource name="CT_Panose" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_Panose_val" action="setValue"/>
- <action name="start" action="setDefaultHexValue"/>
- </resource>
- <resource name="CT_Charset" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_Charset_val"/>
- <attribute name="characterSet" tokenid="ooxml:CT_Charset_characterSet"/>
- </resource>
- <resource name="ST_FontFamily" resource="List">
- <value tokenid="ooxml:Value_ST_FontFamily_decorative">decorative</value>
- <value tokenid="ooxml:Value_ST_FontFamily_modern">modern</value>
- <value tokenid="ooxml:Value_ST_FontFamily_roman">roman</value>
- <value tokenid="ooxml:Value_ST_FontFamily_script">script</value>
- <value tokenid="ooxml:Value_ST_FontFamily_swiss">swiss</value>
- <value tokenid="ooxml:Value_ST_FontFamily_auto">auto</value>
- </resource>
- <resource name="CT_FontFamily" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_FontFamily_val" action="setValue"/>
- </resource>
- <resource name="ST_Pitch" resource="List">
- <value tokenid="ooxml:Value_ST_Pitch_fixed">fixed</value>
- <value tokenid="ooxml:Value_ST_Pitch_variable">variable</value>
- <value tokenid="ooxml:Value_ST_Pitch_default">default</value>
- </resource>
- <resource name="CT_Pitch" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_Pitch_val"/>
- </resource>
- <resource name="CT_FontSig" resource="Properties">
- <attribute name="usb0" tokenid="ooxml:CT_FontSig_usb0"/>
- <attribute name="usb1" tokenid="ooxml:CT_FontSig_usb1"/>
- <attribute name="usb2" tokenid="ooxml:CT_FontSig_usb2"/>
- <attribute name="usb3" tokenid="ooxml:CT_FontSig_usb3"/>
- <attribute name="csb0" tokenid="ooxml:CT_FontSig_csb0"/>
- <attribute name="csb1" tokenid="ooxml:CT_FontSig_csb1"/>
- </resource>
- <resource name="CT_FontRel" resource="Properties">
- <attribute name="fontKey" tokenid="ooxml:CT_FontRel_fontKey"/>
- <attribute name="subsetted" tokenid="ooxml:CT_FontRel_subsetted"/>
- <action name="start" action="handleFontRel"/>
- </resource>
- <resource name="CT_Font" resource="Properties">
- <element name="altName" tokenid="ooxml:CT_Font_altName"/>
- <element name="panose1" tokenid="ooxml:CT_Font_panose1"/>
- <element name="charset" tokenid="ooxml:CT_Font_charset"/>
- <element name="characterSet" tokenid="ooxml:CT_Font_characterSet"/>
- <element name="family" tokenid="ooxml:CT_Font_family"/>
- <element name="notTrueType" tokenid="ooxml:CT_Font_notTrueType"/>
- <element name="pitch" tokenid="ooxml:CT_Font_pitch"/>
- <element name="sig" tokenid="ooxml:CT_Font_sig"/>
- <element name="embedRegular" tokenid="ooxml:CT_Font_embedRegular"/>
- <element name="embedBold" tokenid="ooxml:CT_Font_embedBold"/>
- <element name="embedItalic" tokenid="ooxml:CT_Font_embedItalic"/>
- <element name="embedBoldItalic" tokenid="ooxml:CT_Font_embedBoldItalic"/>
- <attribute name="name" tokenid="ooxml:CT_Font_name"/>
- </resource>
- <resource name="CT_FontsList" resource="Table" tokenid="ooxml:FONTTABLE"/>
- <resource name="EG_BlockLevelElts" resource="Properties">
- <attribute name="name" tokenid="ooxml:EG_BlockLevelElts_altChunk"/>
- </resource>
- <resource name="EG_RunLevelElts" resource="Stream">
- <element name="proofErr" tokenid="ooxml:EG_RunLevelElts_proofErr"/>
- <element name="permStart" tokenid="ooxml:EG_RunLevelElts_permStart"/>
- <element name="permEnd" tokenid="ooxml:EG_RunLevelElts_permEnd"/>
- <element name="ins" tokenid="ooxml:EG_RunLevelElts_ins"/>
- <element name="del" tokenid="ooxml:EG_RunLevelElts_del"/>
- <element name="moveFrom" tokenid="ooxml:EG_RunLevelElts_moveFrom"/>
- <element name="moveTo" tokenid="ooxml:EG_RunLevelElts_moveTo"/>
- </resource>
- <resource name="CT_Body" resource="Stream">
- <action name="start" action="startSectionGroup"/>
- <!--
- <action name="start" action="footnoteSeparator"/>
- <action name="start" action="footnoteCont"/>
- <action name="start" action="endnoteSeparator"/>
- <action name="start" action="endnoteCont"/>
- -->
- <action name="end" action="endCharacterGroup"/>
- <action name="end" action="endParagraphGroup"/>
- <action name="end" action="setLastSectionGroup"/>
- <action name="end" action="endSectionGroup"/>
- </resource>
- <resource name="CT_ShapeDefaults" resource="Properties">
- <element name="v:fill" tokenid="ooxml:CT_ShapeDefaults_v_fill"/>
- <element name="v:stroke" tokenid="ooxml:CT_ShapeDefaults_v_stroke"/>
- <element name="v:textbox" tokenid="ooxml:CT_ShapeDefaults_v_textbox"/>
- <element name="v:shadow" tokenid="ooxml:CT_ShapeDefaults_v_shadow"/>
- <element name="colormru" tokenid="ooxml:CT_ShapeDefaults_colormru"/>
- <element name="colormenu" tokenid="ooxml:CT_ShapeDefaults_colormenu"/>
- <attribute name="spidmax" tokenid="ooxml:CT_ShapeDefaults_spidmax"/>
- <attribute name="style" tokenid="ooxml:CT_ShapeDefaults_style"/>
- <attribute name="fill" tokenid="ooxml:CT_ShapeDefaults_fill"/>
- <attribute name="fillcolor" tokenid="ooxml:CT_ShapeDefaults_fillcolor"/>
- <attribute name="stroke" tokenid="ooxml:CT_ShapeDefaults_stroke"/>
- <attribute name="strokecolor" tokenid="ooxml:CT_ShapeDefaults_strokecolor"/>
- <attribute name="allowincell" tokenid="ooxml:CT_ShapeDefaults_allowincell"/>
- </resource>
- <resource name="CT_Comments" resource="Stream">
- <action name="start" action="startSectionGroup"/>
- <action name="end" action="endSectionGroup"/>
- </resource>
- <resource name="CT_Footnotes" resource="Stream"/>
- <resource name="footnotes" resource="Stream"/>
- <resource name="CT_Endnotes" resource="Stream"/>
- <resource name="endnotes" resource="Stream"/>
- <resource name="CT_SmartTagType" resource="Properties">
- <attribute name="namespaceuri" tokenid="ooxml:CT_SmartTagType_namespaceuri"/>
- <attribute name="name" tokenid="ooxml:CT_SmartTagType_name"/>
- <attribute name="url" tokenid="ooxml:CT_SmartTagType_url"/>
- </resource>
- <resource name="ST_ThemeColor" resource="List">
- <value tokenid="ooxml:Value_St_ThemeColor_dark1">dark1</value>
- <value tokenid="ooxml:Value_St_ThemeColor_light1">light1</value>
- <value tokenid="ooxml:Value_St_ThemeColor_dark2">dark2</value>
- <value tokenid="ooxml:Value_St_ThemeColor_light2">light2</value>
- <value tokenid="ooxml:Value_St_ThemeColor_accent1">accent1</value>
- <value tokenid="ooxml:Value_St_ThemeColor_accent2">accent2</value>
- <value tokenid="ooxml:Value_St_ThemeColor_accent3">accent3</value>
- <value tokenid="ooxml:Value_St_ThemeColor_accent4">accent4</value>
- <value tokenid="ooxml:Value_St_ThemeColor_accent5">accent5</value>
- <value tokenid="ooxml:Value_St_ThemeColor_accent6">accent6</value>
- <value tokenid="ooxml:Value_St_ThemeColor_hyperlink">hyperlink</value>
- <value tokenid="ooxml:Value_St_ThemeColor_followedHyperlink">followedHyperlink</value>
- <value tokenid="ooxml:Value_St_ThemeColor_none">none</value>
- <value tokenid="ooxml:Value_St_ThemeColor_background1">background1</value>
- <value tokenid="ooxml:Value_St_ThemeColor_text1">text1</value>
- <value tokenid="ooxml:Value_St_ThemeColor_background2">background2</value>
- <value tokenid="ooxml:Value_St_ThemeColor_text2">text2</value>
- </resource>
- <resource name="CT_DocPartBehavior" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_DocPartBehavior_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_DocPartType" resource="Value">
- <attribute name="val" tokenid="ooxml:CT_DocPartType_val" action="setValue"/>
- <action name="start" action="setDefaultStringValue"/>
- </resource>
- <resource name="CT_DocPartGallery" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_DocPartGallery_val"/>
- </resource>
- <resource name="CT_DocPartName" resource="Properties">
- <attribute name="val" tokenid="ooxml:CT_DocPartName_val"/>
- <attribute name="decorated" tokenid="ooxml:CT_DocPartName_decorated"/>
- </resource>
- <resource name="settings" resource="Stream">
- <element name="settings" tokenid="ooxml:settings_settings"/>
- </resource>
- <resource name="fonts" resource="Stream">
- <element name="fonts" tokenid="ooxml:FONTTABLE"/>
- </resource>
- <resource name="numbering" resource="Stream">
- <element name="numbering" tokenid="ooxml:NUMBERING"/>
- </resource>
- <resource name="styles" resource="Stream">
- <element name="styles" tokenid="ooxml:STYLESHEET"/>
- </resource>
- <resource name="ST_CaptionPos" resource="List">
- <value tokenid="ooxml:Value_doc_ST_CaptionPos_above">above</value>
- <value tokenid="ooxml:Value_doc_ST_CaptionPos_below">below</value>
- <value tokenid="ooxml:Value_doc_ST_CaptionPos_left">left</value>
- <value tokenid="ooxml:Value_doc_ST_CaptionPos_right">right</value>
- </resource>
- <resource name="CT_Caption" resource="Properties">
- <attribute name="name" tokenid="ooxml:CT_Caption_name"/>
- <attribute name="pos" tokenid="ooxml:CT_Caption_pos"/>
- <attribute name="chapNum" tokenid="ooxml:CT_Caption_chapNum"/>
- <attribute name="heading" tokenid="ooxml:CT_Caption_heading"/>
- <attribute name="noLabel" tokenid="ooxml:CT_Caption_noLabel"/>
- <attribute name="numFmt" tokenid="ooxml:CT_Caption_numFmt"/>
- <attribute name="sep" tokenid="ooxml:CT_Caption_sep"/>
- </resource>
- <resource name="CT_AutoCaption" resource="Properties">
- <attribute name="name" tokenid="ooxml:CT_AutoCaption_name"/>
- <attribute name="caption" tokenid="ooxml:CT_AutoCaption_caption"/>
- </resource>
- <resource name="CT_AutoCaptions" resource="Properties">
- <element name="autoCaption" tokenid="ooxml:CT_AutoCaptions_autoCaption"/>
- </resource>
- <resource name="CT_Captions" resource="Properties">
- <element name="caption" tokenid="ooxml:CT_Captions_caption"/>
- <element name="autoCaptions" tokenid="ooxml:CT_Captions_autoCaptions"/>
- </resource>
- <resource name="CT_DocumentBase" resource="Properties">
- <element name="background" tokenid="ooxml:CT_DocumentBase_background"/>
- </resource>
- <resource name="CT_Document" resource="Stream"/>
- <resource name="CT_GlossaryDocument" resource="Stream"/>
- <resource name="CT_DocParts" resource="Stream"/>
- <resource name="CT_DocPart" resource="Stream">
- <action name="start" action="startGlossaryEntry"/>
- <action name="end" action="endGlossaryEntry"/>
- </resource>
- <resource name="CT_DocPartPr" resource="Properties">
- <action name="start" action="startSectionGroup"/>
- <element name="name" tokenid="ooxml:CT_DocPartPr_name"/>
- <element name="category" tokenid="ooxml:CT_DocPartPr_category"/>
- </resource>
- <resource name="CT_DocPartCategory" resource="Properties">
- <element name="gallery" tokenid="ooxml:CT_DocPartCategory_gallery"/>
- </resource>
- <resource name="document" resource="Stream"/>
- <resource name="glossaryDocument" resource="Stream"/>
- <resource name="CT_TxbxContent" resource="Stream">
- <action name="start" action="startTxbxContent"/>
- <action name="end" action="endTxbxContent"/>
- </resource>
- <resource name="CT_OMath" resource="Math"/>
- <resource name="CT_OMathPara" resource="Stream"/>
- <resource name="CT_OMathParaPr" resource="Properties"/>
- <resource name="CT_OMathJc" resource="Value"/>
- </namespace>
-</model>
-<!-- vim: shiftwidth=2 softtabstop=2 expandtab:
--->
diff --git a/writerfilter/source/ooxml/modelpreprocess.py b/writerfilter/source/ooxml/modelpreprocess.py
deleted file mode 100644
index d6ef4c175430..000000000000
--- a/writerfilter/source/ooxml/modelpreprocess.py
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/usr/bin/env python
-#
-# 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/.
-#
-
-from xml.dom import minidom
-import sys
-
-
-def prefixForGrammar(namespace):
- ns = namespace.getElementsByTagName("grammar")[0].getAttribute("ns")
- return ooxUrlAliases[ns]
-
-
-def parseNamespaceAliases(node):
- ret = {}
- for k, v in list(node.attributes.items()):
- if k.startswith("xmlns:"):
- ret[k.replace('xmlns:', '')] = v
- return ret
-
-
-def parseNamespaces(fro):
- sock = open(fro)
- for i in sock.readlines():
- line = i.strip()
- alias, url = line.split(' ')[1:]
- ooxUrlAliases[url] = alias
- sock.close()
-
-
-def check(model):
- defines = [i.getAttribute("name") for i in model.getElementsByTagName("define")]
- for reference in [i.getAttribute("name") for i in model.getElementsByTagName("ref")]:
- if reference not in defines:
- raise Exception("Unknown define element with name '%s'" % reference)
- for start in [i.getAttribute("name") for i in model.getElementsByTagName("start")]:
- if start not in defines:
- raise Exception("Unknown start element with name '%s'" % start)
-
-
-def preprocess(model):
- modelNode = [i for i in model.childNodes if i.localName == "model"][0]
- # Alias -> URL, based on "xmlns:" attributes.
- modelNamespaceAliases = parseNamespaceAliases(modelNode)
- for i in modelNode.getElementsByTagName("namespace"):
- grammarprefix = prefixForGrammar(i)
-
- grammar = i.getElementsByTagName("grammar")[0]
-
- for j in i.getElementsByTagName("element") + i.getElementsByTagName("attribute"):
- # prefix
- prefix = ""
- if ":" in j.getAttribute("name"):
- nameprefix = j.getAttribute("name").split(':')[0]
- prefix = ooxUrlAliases[modelNamespaceAliases[nameprefix]]
- elif j.localName == "attribute":
- if grammar.getAttribute("attributeFormDefault") == "qualified":
- prefix = grammarprefix
- else:
- prefix = grammarprefix
-
- # localname
- if ":" in j.getAttribute("name"):
- localname = j.getAttribute("name").split(':')[1]
- else:
- localname = j.getAttribute("name")
-
- # set the attributes
- j.setAttribute("prefix", prefix)
- j.setAttribute("localname", localname)
-
-
-namespacesPath = sys.argv[1]
-modelPath = sys.argv[2]
-
-# URL -> alias, from oox
-ooxUrlAliases = {}
-parseNamespaces(namespacesPath)
-
-model = minidom.parse(modelPath)
-check(model)
-preprocess(model)
-model.writexml(sys.stdout)
-
-# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/writerfilter/source/ooxml/qnametostr.py b/writerfilter/source/ooxml/qnametostr.py
deleted file mode 100644
index e09a98570111..000000000000
--- a/writerfilter/source/ooxml/qnametostr.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env python
-#
-# 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/.
-#
-
-import xml.sax
-import sys
-
-
-class ContentHandler(xml.sax.handler.ContentHandler):
- def __init__(self):
- self.tokens = []
-
- def startDocument(self):
- print("""
-#include "ooxml/resourceids.hxx"
-#include "ooxml/QNameToString.hxx"
-#include "unordered_map"
-
-namespace writerfilter
-{
-
-#ifdef DBG_UTIL
-
- /* ooxml */
- static const std::unordered_map<Id, const char*> g_QNameToStringMap {
-""")
-
- def endDocument(self):
- print("""
- };
-
- std::string QNameToString(Id qName)
- {
- auto it = g_QNameToStringMap.find(qName);
- if (it == g_QNameToStringMap.end())
- return std::string();
-
- return it->second;
- }
-
-#endif
-}
-""")
-
- def startElement(self, name, attrs):
- for k, v in list(attrs.items()):
- if k == "tokenid":
- if v.startswith("ooxml:"):
- token = v.replace('ooxml:', '')
- if token not in self.tokens:
- print(""" { NS_ooxml::LN_%s, "ooxml:%s" },""" % (token, token))
- self.tokens.append(token)
-
-
-parser = xml.sax.make_parser()
-parser.setContentHandler(ContentHandler())
-parser.parse(sys.argv[1])
-
-# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/writerfilter/source/ooxml/resourceids.py b/writerfilter/source/ooxml/resourceids.py
deleted file mode 100644
index 70325c9d376b..000000000000
--- a/writerfilter/source/ooxml/resourceids.py
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env python
-#
-# 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/.
-#
-
-import xml.sax
-import sys
-
-
-class ContentHandler(xml.sax.handler.ContentHandler):
- def __init__(self):
- self.tokens = []
- self.counter = 90001
-
- def startDocument(self):
- print("""
-/*
-
- THIS FILE IS GENERATED AUTOMATICALLY! DO NOT EDIT!
-
-*/
-
-
-#ifndef INCLUDED_OOXML_RESOURCEIDS_HXX
-#define INCLUDED_OOXML_RESOURCEIDS_HXX
-
-#include <dmapper/resourcemodel.hxx>
-
-namespace writerfilter {
-
-namespace NS_ooxml
-{""")
-
- def endDocument(self):
- print("""}
-
-
-}
-#endif // INCLUDED_OOXML_RESOURCEIDS_HXX""")
-
- def startElement(self, name, attrs):
- for k, v in attrs.items():
- if k in ("tokenid", "sendtokenid"):
- if v.startswith("ooxml:"):
- token = v.replace('ooxml:', '')
- if token not in self.tokens:
- print(" const Id LN_%s = %s;" % (token, self.counter))
- self.tokens.append(token)
- self.counter += 1
-
-
-parser = xml.sax.make_parser()
-parser.setContentHandler(ContentHandler())
-parser.parse(sys.argv[1])
-
-# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/writerfilter/source/ooxml/tox.ini b/writerfilter/source/ooxml/tox.ini
deleted file mode 100644
index c1781905c427..000000000000
--- a/writerfilter/source/ooxml/tox.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[pycodestyle]
-ignore = E501
diff --git a/writerfilter/source/rtftok/README b/writerfilter/source/rtftok/README
deleted file mode 100644
index 4adbb7563b8b..000000000000
--- a/writerfilter/source/rtftok/README
+++ /dev/null
@@ -1,12 +0,0 @@
-= Writerfilter-based RTF tokenizer
-
-== Mathematics
-
-At the time of writing, all control words understood by SmOoxmlImport are
-imported. To view the current status:
-
-----
-grep M_TOKEN starmath/source/ooxmlimport.cxx |sed 's/.*\(M_TOKEN(\) /\1/;s/ ).*/)/'|sort -u > ~/math-import-list
-grep '[^_]M_TOKEN' writerfilter/source/rtftok/rtfdocumentimpl.cxx |sed 's/.*\(M_TOKEN(\)/\1/;s/).*/)/'|sort -u > ~/wf-export-list
-diff -u ~/math-import-list ~/wf-export-list |grep ^-M_TOKEN
-----
diff --git a/writerfilter/source/rtftok/rtfcharsets.cxx b/writerfilter/source/rtftok/rtfcharsets.cxx
deleted file mode 100644
index 1b71bbb9951c..000000000000
--- a/writerfilter/source/rtftok/rtfcharsets.cxx
+++ /dev/null
@@ -1,66 +0,0 @@
-/* -*- 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 "rtfcharsets.hxx"
-
-#include <iterator>
-
-#include <rtl/textenc.h>
-
-namespace writerfilter::rtftok
-{
-// See RTF spec v1.9.1, page 19
-RTFEncoding const aRTFEncodings[] = {
- // charset codepage Windows / Mac name
- { 0, 1252 }, // ANSI
- { 1, 0 }, // Default
- { 2, 42 }, // Symbol
- { 77, 10000 }, // Mac Roman
- { 78, 10001 }, // Mac Shift Jis
- { 79, 10003 }, // Mac Hangul
- { 80, 10008 }, // Mac GB2312
- { 81, 10002 }, // Mac Big5
- { 83, 10005 }, // Mac Herbrew
- { 84, 10004 }, // Mac Arabic
- { 85, 10006 }, // Mac Greek
- { 86, 10081 }, // Mac Turkish
- { 87, 10021 }, // Mac Thai
- { 88, 10029 }, // Mac East Europe
- { 89, 10007 }, // Mac Russian
- { 128, 932 }, // Shift JIS
- { 129, 949 }, // Hangul
- { 130, 1361 }, // Johab
- { 134, 936 }, // GB2312
- { 136, 950 }, // Big5
- { 161, 1253 }, // Greek
- { 162, 1254 }, // Turkish
- { 163, 1258 }, // Vietnamese
- { 177, 1255 }, // Herbrew
- { 178, 1256 }, // Arabic
- { 186, 1257 }, // Baltic
- { 204, 1251 }, // Russian
- { 222, 874 }, // Thai
- { 238, 1250 }, // Eastern European
- { 254, 437 }, // PC 437
- { 255, 850 }, // OEM
-};
-
-int nRTFEncodings = std::size(aRTFEncodings);
-
-RTFFontNameSuffix const aRTFFontNameSuffixes[] = {
- { "Baltic", RTL_TEXTENCODING_MS_1257 }, { "CE", RTL_TEXTENCODING_MS_1250 },
- { "Cyr", RTL_TEXTENCODING_MS_1251 }, { "Greek", RTL_TEXTENCODING_MS_1253 },
- { "Tur", RTL_TEXTENCODING_MS_1254 }, { "(Hebrew)", RTL_TEXTENCODING_MS_1255 },
- { "(Arabic)", RTL_TEXTENCODING_MS_1256 }, { "(Vietnamese)", RTL_TEXTENCODING_MS_1258 },
- { "", RTL_TEXTENCODING_DONTKNOW } // End of array
-};
-
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfcharsets.hxx b/writerfilter/source/rtftok/rtfcharsets.hxx
deleted file mode 100644
index 826dea271f6b..000000000000
--- a/writerfilter/source/rtftok/rtfcharsets.hxx
+++ /dev/null
@@ -1,37 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-namespace writerfilter::rtftok
-{
-/// RTF legacy charsets
-struct RTFEncoding
-{
- int charset;
- int codepage;
-};
-extern RTFEncoding const aRTFEncodings[];
-extern int nRTFEncodings;
-
-/// Font name can contain special suffixes used
-/// to determine encoding for given font table entry
-/// For example "Arial CE" is "Arial" with CP1250 encoding
-/// List of these suffixes is not official and detected in a empirical
-/// way thus may be inexact and incomplete.
-struct RTFFontNameSuffix
-{
- const char* suffix;
- int codepage;
-};
-extern RTFFontNameSuffix const aRTFFontNameSuffixes[];
-
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfcontrolwords.cxx b/writerfilter/source/rtftok/rtfcontrolwords.cxx
deleted file mode 100644
index 8b035b37bbe2..000000000000
--- a/writerfilter/source/rtftok/rtfcontrolwords.cxx
+++ /dev/null
@@ -1,1900 +0,0 @@
-/* -*- 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 "rtfcontrolwords.hxx"
-#include <oox/token/namespaces.hxx>
-
-namespace writerfilter::rtftok
-{
-RTFSymbol const aRTFControlWords[] = {
- // sKeyword nControlType nIndex
- { "'", RTFControlType::SYMBOL, RTFKeyword::HEXCHAR, 0 },
- { "-", RTFControlType::SYMBOL, RTFKeyword::OPTHYPH, 0 },
- { "*", RTFControlType::SYMBOL, RTFKeyword::IGNORE, 0 },
- { ":", RTFControlType::SYMBOL, RTFKeyword::SUBENTRY, 0 },
- { "\\", RTFControlType::SYMBOL, RTFKeyword::BACKSLASH, 0 },
- { "\n", RTFControlType::SYMBOL, RTFKeyword::PAR, 0 },
- { "\r", RTFControlType::SYMBOL, RTFKeyword::PAR, 0 },
- { "\r\n", RTFControlType::SYMBOL, RTFKeyword::PAR, 0 },
- { "_", RTFControlType::SYMBOL, RTFKeyword::NOBRKHYPH, 0 },
- { "{", RTFControlType::SYMBOL, RTFKeyword::LBRACE, 0 },
- { "|", RTFControlType::SYMBOL, RTFKeyword::FORMULA, 0 },
- { "}", RTFControlType::SYMBOL, RTFKeyword::RBRACE, 0 },
- { "~", RTFControlType::SYMBOL, RTFKeyword::NOBREAK, 0 },
- { "ab", RTFControlType::TOGGLE, RTFKeyword::AB, 1 },
- { "absh", RTFControlType::VALUE, RTFKeyword::ABSH, 0 },
- { "abslock", RTFControlType::FLAG, RTFKeyword::ABSLOCK, 0 },
- { "absnoovrlp", RTFControlType::TOGGLE, RTFKeyword::ABSNOOVRLP, 1 },
- { "absw", RTFControlType::VALUE, RTFKeyword::ABSW, 0 },
- { "acaps", RTFControlType::TOGGLE, RTFKeyword::ACAPS, 1 },
- { "acccircle", RTFControlType::TOGGLE, RTFKeyword::ACCCIRCLE, 1 },
- { "acccomma", RTFControlType::TOGGLE, RTFKeyword::ACCCOMMA, 1 },
- { "accdot", RTFControlType::TOGGLE, RTFKeyword::ACCDOT, 1 },
- { "accnone", RTFControlType::TOGGLE, RTFKeyword::ACCNONE, 1 },
- { "accunderdot", RTFControlType::TOGGLE, RTFKeyword::ACCUNDERDOT, 1 },
- { "acf", RTFControlType::VALUE, RTFKeyword::ACF, 0 },
- { "adeff", RTFControlType::VALUE, RTFKeyword::ADEFF, 0 },
- { "additive", RTFControlType::FLAG, RTFKeyword::ADDITIVE, 0 },
- { "adeflang", RTFControlType::VALUE, RTFKeyword::ADEFLANG, 0 },
- { "adjustright", RTFControlType::FLAG, RTFKeyword::ADJUSTRIGHT, 0 },
- { "adn", RTFControlType::VALUE, RTFKeyword::ADN, 6 },
- { "aenddoc", RTFControlType::FLAG, RTFKeyword::AENDDOC, 0 },
- { "aendnotes", RTFControlType::FLAG, RTFKeyword::AENDNOTES, 0 },
- { "aexpnd", RTFControlType::VALUE, RTFKeyword::AEXPND, 0 },
- { "af", RTFControlType::VALUE, RTFKeyword::AF, 0 },
- { "afelev", RTFControlType::FLAG, RTFKeyword::AFELEV, 0 },
- { "afs", RTFControlType::VALUE, RTFKeyword::AFS, 24 },
- { "aftnbj", RTFControlType::FLAG, RTFKeyword::AFTNBJ, 0 },
- { "aftncn", RTFControlType::DESTINATION, RTFKeyword::AFTNCN, 0 },
- { "aftnnalc", RTFControlType::FLAG, RTFKeyword::AFTNNALC, 0 },
- { "aftnnar", RTFControlType::FLAG, RTFKeyword::AFTNNAR, 0 },
- { "aftnnauc", RTFControlType::FLAG, RTFKeyword::AFTNNAUC, 0 },
- { "aftnnchi", RTFControlType::FLAG, RTFKeyword::AFTNNCHI, 0 },
- { "aftnnchosung", RTFControlType::FLAG, RTFKeyword::AFTNNCHOSUNG, 0 },
- { "aftnncnum", RTFControlType::FLAG, RTFKeyword::AFTNNCNUM, 0 },
- { "aftnndbar", RTFControlType::FLAG, RTFKeyword::AFTNNDBAR, 0 },
- { "aftnndbnum", RTFControlType::FLAG, RTFKeyword::AFTNNDBNUM, 0 },
- { "aftnndbnumd", RTFControlType::FLAG, RTFKeyword::AFTNNDBNUMD, 0 },
- { "aftnndbnumk", RTFControlType::FLAG, RTFKeyword::AFTNNDBNUMK, 0 },
- { "aftnndbnumt", RTFControlType::FLAG, RTFKeyword::AFTNNDBNUMT, 0 },
- { "aftnnganada", RTFControlType::FLAG, RTFKeyword::AFTNNGANADA, 0 },
- { "aftnngbnum", RTFControlType::FLAG, RTFKeyword::AFTNNGBNUM, 0 },
- { "aftnngbnumd", RTFControlType::FLAG, RTFKeyword::AFTNNGBNUMD, 0 },
- { "aftnngbnumk", RTFControlType::FLAG, RTFKeyword::AFTNNGBNUMK, 0 },
- { "aftnngbnuml", RTFControlType::FLAG, RTFKeyword::AFTNNGBNUML, 0 },
- { "aftnnrlc", RTFControlType::FLAG, RTFKeyword::AFTNNRLC, 0 },
- { "aftnnruc", RTFControlType::FLAG, RTFKeyword::AFTNNRUC, 0 },
- { "aftnnzodiac", RTFControlType::FLAG, RTFKeyword::AFTNNZODIAC, 0 },
- { "aftnnzodiacd", RTFControlType::FLAG, RTFKeyword::AFTNNZODIACD, 0 },
- { "aftnnzodiacl", RTFControlType::FLAG, RTFKeyword::AFTNNZODIACL, 0 },
- { "aftnrestart", RTFControlType::FLAG, RTFKeyword::AFTNRESTART, 0 },
- { "aftnrstcont", RTFControlType::FLAG, RTFKeyword::AFTNRSTCONT, 0 },
- { "aftnsep", RTFControlType::DESTINATION, RTFKeyword::AFTNSEP, 0 },
- { "aftnsepc", RTFControlType::DESTINATION, RTFKeyword::AFTNSEPC, 0 },
- { "aftnstart", RTFControlType::VALUE, RTFKeyword::AFTNSTART, 1 },
- { "aftntj", RTFControlType::FLAG, RTFKeyword::AFTNTJ, 0 },
- { "ai", RTFControlType::TOGGLE, RTFKeyword::AI, 1 },
- { "alang", RTFControlType::VALUE, RTFKeyword::ALANG, 0 },
- { "allowfieldendsel", RTFControlType::FLAG, RTFKeyword::ALLOWFIELDENDSEL, 0 },
- { "allprot", RTFControlType::FLAG, RTFKeyword::ALLPROT, 0 },
- { "alntblind", RTFControlType::FLAG, RTFKeyword::ALNTBLIND, 0 },
- { "alt", RTFControlType::FLAG, RTFKeyword::ALT, 0 },
- { "animtext", RTFControlType::VALUE, RTFKeyword::ANIMTEXT, 0 },
- { "annotation", RTFControlType::DESTINATION, RTFKeyword::ANNOTATION, 0 },
- { "annotprot", RTFControlType::FLAG, RTFKeyword::ANNOTPROT, 0 },
- { "ansi", RTFControlType::FLAG, RTFKeyword::ANSI, 0 },
- { "ansicpg", RTFControlType::VALUE, RTFKeyword::ANSICPG, 0 },
- { "aoutl", RTFControlType::TOGGLE, RTFKeyword::AOUTL, 1 },
- { "ApplyBrkRules", RTFControlType::FLAG, RTFKeyword::APPLYBRKRULES, 0 },
- { "ascaps", RTFControlType::TOGGLE, RTFKeyword::ASCAPS, 1 },
- { "ashad", RTFControlType::TOGGLE, RTFKeyword::ASHAD, 1 },
- { "asianbrkrule", RTFControlType::FLAG, RTFKeyword::ASIANBRKRULE, 0 },
- { "aspalpha", RTFControlType::TOGGLE, RTFKeyword::ASPALPHA, 1 },
- { "aspnum", RTFControlType::TOGGLE, RTFKeyword::ASPNUM, 1 },
- { "astrike", RTFControlType::TOGGLE, RTFKeyword::ASTRIKE, 1 },
- { "atnauthor", RTFControlType::DESTINATION, RTFKeyword::ATNAUTHOR, 0 },
- { "atndate", RTFControlType::DESTINATION, RTFKeyword::ATNDATE, 0 },
- { "atnicn", RTFControlType::DESTINATION, RTFKeyword::ATNICN, 0 },
- { "atnid", RTFControlType::DESTINATION, RTFKeyword::ATNID, 0 },
- { "atnparent", RTFControlType::DESTINATION, RTFKeyword::ATNPARENT, 0 },
- { "atnref", RTFControlType::DESTINATION, RTFKeyword::ATNREF, 0 },
- { "atntime", RTFControlType::DESTINATION, RTFKeyword::ATNTIME, 0 },
- { "atrfend", RTFControlType::DESTINATION, RTFKeyword::ATRFEND, 0 },
- { "atrfstart", RTFControlType::DESTINATION, RTFKeyword::ATRFSTART, 0 },
- { "aul", RTFControlType::TOGGLE, RTFKeyword::AUL, 1 },
- { "auld", RTFControlType::TOGGLE, RTFKeyword::AULD, 1 },
- { "auldb", RTFControlType::TOGGLE, RTFKeyword::AULDB, 1 },
- { "aulnone", RTFControlType::TOGGLE, RTFKeyword::AULNONE, 1 },
- { "aulw", RTFControlType::TOGGLE, RTFKeyword::AULW, 1 },
- { "aup", RTFControlType::VALUE, RTFKeyword::AUP, 6 },
- { "author", RTFControlType::DESTINATION, RTFKeyword::AUTHOR, 0 },
- { "autofmtoverride", RTFControlType::FLAG, RTFKeyword::AUTOFMTOVERRIDE, 0 },
- { "b", RTFControlType::TOGGLE, RTFKeyword::B, 1 },
- { "background", RTFControlType::DESTINATION, RTFKeyword::BACKGROUND, 0 },
- { "bdbfhdr", RTFControlType::FLAG, RTFKeyword::BDBFHDR, 0 },
- { "bdrrlswsix", RTFControlType::FLAG, RTFKeyword::BDRRLSWSIX, 0 },
- { "bgbdiag", RTFControlType::FLAG, RTFKeyword::BGBDIAG, 0 },
- { "bgcross", RTFControlType::FLAG, RTFKeyword::BGCROSS, 0 },
- { "bgdcross", RTFControlType::FLAG, RTFKeyword::BGDCROSS, 0 },
- { "bgdkbdiag", RTFControlType::FLAG, RTFKeyword::BGDKBDIAG, 0 },
- { "bgdkcross", RTFControlType::FLAG, RTFKeyword::BGDKCROSS, 0 },
- { "bgdkdcross", RTFControlType::FLAG, RTFKeyword::BGDKDCROSS, 0 },
- { "bgdkfdiag", RTFControlType::FLAG, RTFKeyword::BGDKFDIAG, 0 },
- { "bgdkhoriz", RTFControlType::FLAG, RTFKeyword::BGDKHORIZ, 0 },
- { "bgdkvert", RTFControlType::FLAG, RTFKeyword::BGDKVERT, 0 },
- { "bgfdiag", RTFControlType::FLAG, RTFKeyword::BGFDIAG, 0 },
- { "bghoriz", RTFControlType::FLAG, RTFKeyword::BGHORIZ, 0 },
- { "bgvert", RTFControlType::FLAG, RTFKeyword::BGVERT, 0 },
- { "bin", RTFControlType::VALUE, RTFKeyword::BIN, 0 },
- { "binfsxn", RTFControlType::VALUE, RTFKeyword::BINFSXN, 0 },
- { "binsxn", RTFControlType::VALUE, RTFKeyword::BINSXN, 0 },
- { "bkmkcolf", RTFControlType::VALUE, RTFKeyword::BKMKCOLF, 0 },
- { "bkmkcoll", RTFControlType::VALUE, RTFKeyword::BKMKCOLL, 0 },
- { "bkmkend", RTFControlType::DESTINATION, RTFKeyword::BKMKEND, 0 },
- { "bkmkpub", RTFControlType::FLAG, RTFKeyword::BKMKPUB, 0 },
- { "bkmkstart", RTFControlType::DESTINATION, RTFKeyword::BKMKSTART, 0 },
- { "bliptag", RTFControlType::VALUE, RTFKeyword::BLIPTAG, 0 },
- { "blipuid", RTFControlType::DESTINATION, RTFKeyword::BLIPUID, 0 },
- { "blipupi", RTFControlType::VALUE, RTFKeyword::BLIPUPI, 0 },
- { "blue", RTFControlType::VALUE, RTFKeyword::BLUE, 0 },
- { "bookfold", RTFControlType::FLAG, RTFKeyword::BOOKFOLD, 0 },
- { "bookfoldrev", RTFControlType::FLAG, RTFKeyword::BOOKFOLDREV, 0 },
- { "bookfoldsheets", RTFControlType::VALUE, RTFKeyword::BOOKFOLDSHEETS, 0 },
- { "box", RTFControlType::FLAG, RTFKeyword::BOX, 0 },
- { "brdrart", RTFControlType::VALUE, RTFKeyword::BRDRART, 0 },
- { "brdrb", RTFControlType::FLAG, RTFKeyword::BRDRB, 0 },
- { "brdrbar", RTFControlType::FLAG, RTFKeyword::BRDRBAR, 0 },
- { "brdrbtw", RTFControlType::FLAG, RTFKeyword::BRDRBTW, 0 },
- { "brdrcf", RTFControlType::VALUE, RTFKeyword::BRDRCF, 0 },
- { "brdrdash", RTFControlType::FLAG, RTFKeyword::BRDRDASH, 0 },
- { "brdrdashd", RTFControlType::FLAG, RTFKeyword::BRDRDASHD, 0 },
- { "brdrdashdd", RTFControlType::FLAG, RTFKeyword::BRDRDASHDD, 0 },
- { "brdrdashdotstr", RTFControlType::FLAG, RTFKeyword::BRDRDASHDOTSTR, 0 },
- { "brdrdashsm", RTFControlType::FLAG, RTFKeyword::BRDRDASHSM, 0 },
- { "brdrdb", RTFControlType::FLAG, RTFKeyword::BRDRDB, 0 },
- { "brdrdot", RTFControlType::FLAG, RTFKeyword::BRDRDOT, 0 },
- { "brdremboss", RTFControlType::FLAG, RTFKeyword::BRDREMBOSS, 0 },
- { "brdrengrave", RTFControlType::FLAG, RTFKeyword::BRDRENGRAVE, 0 },
- { "brdrframe", RTFControlType::FLAG, RTFKeyword::BRDRFRAME, 0 },
- { "brdrhair", RTFControlType::FLAG, RTFKeyword::BRDRHAIR, 0 },
- { "brdrinset", RTFControlType::FLAG, RTFKeyword::BRDRINSET, 0 },
- { "brdrl", RTFControlType::FLAG, RTFKeyword::BRDRL, 0 },
- { "brdrnil", RTFControlType::FLAG, RTFKeyword::BRDRNIL, 0 },
- { "brdrnone", RTFControlType::FLAG, RTFKeyword::BRDRNONE, 0 },
- { "brdroutset", RTFControlType::FLAG, RTFKeyword::BRDROUTSET, 0 },
- { "brdrr", RTFControlType::FLAG, RTFKeyword::BRDRR, 0 },
- { "brdrs", RTFControlType::FLAG, RTFKeyword::BRDRS, 0 },
- { "brdrsh", RTFControlType::FLAG, RTFKeyword::BRDRSH, 0 },
- { "brdrt", RTFControlType::FLAG, RTFKeyword::BRDRT, 0 },
- { "brdrtbl", RTFControlType::FLAG, RTFKeyword::BRDRTBL, 0 },
- { "brdrth", RTFControlType::FLAG, RTFKeyword::BRDRTH, 0 },
- { "brdrthtnlg", RTFControlType::FLAG, RTFKeyword::BRDRTHTNLG, 0 },
- { "brdrthtnmg", RTFControlType::FLAG, RTFKeyword::BRDRTHTNMG, 0 },
- { "brdrthtnsg", RTFControlType::FLAG, RTFKeyword::BRDRTHTNSG, 0 },
- { "brdrtnthlg", RTFControlType::FLAG, RTFKeyword::BRDRTNTHLG, 0 },
- { "brdrtnthmg", RTFControlType::FLAG, RTFKeyword::BRDRTNTHMG, 0 },
- { "brdrtnthsg", RTFControlType::FLAG, RTFKeyword::BRDRTNTHSG, 0 },
- { "brdrtnthtnlg", RTFControlType::FLAG, RTFKeyword::BRDRTNTHTNLG, 0 },
- { "brdrtnthtnmg", RTFControlType::FLAG, RTFKeyword::BRDRTNTHTNMG, 0 },
- { "brdrtnthtnsg", RTFControlType::FLAG, RTFKeyword::BRDRTNTHTNSG, 0 },
- { "brdrtriple", RTFControlType::FLAG, RTFKeyword::BRDRTRIPLE, 0 },
- { "brdrw", RTFControlType::VALUE, RTFKeyword::BRDRW, 0 },
- { "brdrwavy", RTFControlType::FLAG, RTFKeyword::BRDRWAVY, 0 },
- { "brdrwavydb", RTFControlType::FLAG, RTFKeyword::BRDRWAVYDB, 0 },
- { "brkfrm", RTFControlType::FLAG, RTFKeyword::BRKFRM, 0 },
- { "brsp", RTFControlType::VALUE, RTFKeyword::BRSP, 0 },
- { "bullet", RTFControlType::SYMBOL, RTFKeyword::BULLET, 0 },
- { "buptim", RTFControlType::DESTINATION, RTFKeyword::BUPTIM, 0 },
- { "bxe", RTFControlType::FLAG, RTFKeyword::BXE, 0 },
- { "caccentfive", RTFControlType::FLAG, RTFKeyword::CACCENTFIVE, 0 },
- { "caccentfour", RTFControlType::FLAG, RTFKeyword::CACCENTFOUR, 0 },
- { "caccentone", RTFControlType::FLAG, RTFKeyword::CACCENTONE, 0 },
- { "caccentsix", RTFControlType::FLAG, RTFKeyword::CACCENTSIX, 0 },
- { "caccentthree", RTFControlType::FLAG, RTFKeyword::CACCENTTHREE, 0 },
- { "caccenttwo", RTFControlType::FLAG, RTFKeyword::CACCENTTWO, 0 },
- { "cachedcolbal", RTFControlType::FLAG, RTFKeyword::CACHEDCOLBAL, 0 },
- { "caps", RTFControlType::TOGGLE, RTFKeyword::CAPS, 1 },
- { "category", RTFControlType::DESTINATION, RTFKeyword::CATEGORY, 0 },
- { "cb", RTFControlType::VALUE, RTFKeyword::CB, 0 },
- { "cbackgroundone", RTFControlType::FLAG, RTFKeyword::CBACKGROUNDONE, 0 },
- { "cbackgroundtwo", RTFControlType::FLAG, RTFKeyword::CBACKGROUNDTWO, 0 },
- { "cbpat", RTFControlType::VALUE, RTFKeyword::CBPAT, 0 },
- { "cchs", RTFControlType::VALUE, RTFKeyword::CCHS, 0 },
- { "cell", RTFControlType::SYMBOL, RTFKeyword::CELL, 0 },
- { "cellx", RTFControlType::VALUE, RTFKeyword::CELLX, 0 },
- { "cf", RTFControlType::VALUE, RTFKeyword::CF, 0 },
- { "cfollowedhyperlink", RTFControlType::FLAG, RTFKeyword::CFOLLOWEDHYPERLINK, 0 },
- { "cfpat", RTFControlType::VALUE, RTFKeyword::CFPAT, 0 },
- { "cgrid", RTFControlType::VALUE, RTFKeyword::CGRID, 0 },
- { "charrsid", RTFControlType::VALUE, RTFKeyword::CHARRSID, 0 },
- { "charscalex", RTFControlType::VALUE, RTFKeyword::CHARSCALEX, 100 },
- { "chatn", RTFControlType::SYMBOL, RTFKeyword::CHATN, 0 },
- { "chbgbdiag", RTFControlType::FLAG, RTFKeyword::CHBGBDIAG, 0 },
- { "chbgcross", RTFControlType::FLAG, RTFKeyword::CHBGCROSS, 0 },
- { "chbgdcross", RTFControlType::FLAG, RTFKeyword::CHBGDCROSS, 0 },
- { "chbgdkbdiag", RTFControlType::FLAG, RTFKeyword::CHBGDKBDIAG, 0 },
- { "chbgdkcross", RTFControlType::FLAG, RTFKeyword::CHBGDKCROSS, 0 },
- { "chbgdkdcross", RTFControlType::FLAG, RTFKeyword::CHBGDKDCROSS, 0 },
- { "chbgdkfdiag", RTFControlType::FLAG, RTFKeyword::CHBGDKFDIAG, 0 },
- { "chbgdkhoriz", RTFControlType::FLAG, RTFKeyword::CHBGDKHORIZ, 0 },
- { "chbgdkvert", RTFControlType::FLAG, RTFKeyword::CHBGDKVERT, 0 },
- { "chbgfdiag", RTFControlType::FLAG, RTFKeyword::CHBGFDIAG, 0 },
- { "chbghoriz", RTFControlType::FLAG, RTFKeyword::CHBGHORIZ, 0 },
- { "chbgvert", RTFControlType::FLAG, RTFKeyword::CHBGVERT, 0 },
- { "chbrdr", RTFControlType::FLAG, RTFKeyword::CHBRDR, 0 },
- { "chcbpat", RTFControlType::VALUE, RTFKeyword::CHCBPAT, 0 },
- { "chcfpat", RTFControlType::VALUE, RTFKeyword::CHCFPAT, 0 },
- { "chdate", RTFControlType::SYMBOL, RTFKeyword::CHDATE, 0 },
- { "chdpa", RTFControlType::SYMBOL, RTFKeyword::CHDPA, 0 },
- { "chdpl", RTFControlType::SYMBOL, RTFKeyword::CHDPL, 0 },
- { "chftn", RTFControlType::SYMBOL, RTFKeyword::CHFTN, 0 },
- { "chftnsep", RTFControlType::SYMBOL, RTFKeyword::CHFTNSEP, 0 },
- { "chftnsepc", RTFControlType::SYMBOL, RTFKeyword::CHFTNSEPC, 0 },
- { "chpgn", RTFControlType::SYMBOL, RTFKeyword::CHPGN, 0 },
- { "chhres", RTFControlType::VALUE, RTFKeyword::CHHRES, 0 },
- { "chshdng", RTFControlType::VALUE, RTFKeyword::CHSHDNG, 0 },
- { "chtime", RTFControlType::SYMBOL, RTFKeyword::CHTIME, 0 },
- { "chyperlink", RTFControlType::FLAG, RTFKeyword::CHYPERLINK, 0 },
- { "clbgbdiag", RTFControlType::FLAG, RTFKeyword::CLBGBDIAG, 0 },
- { "clbgcross", RTFControlType::FLAG, RTFKeyword::CLBGCROSS, 0 },
- { "clbgdcross", RTFControlType::FLAG, RTFKeyword::CLBGDCROSS, 0 },
- { "clbgdkbdiag", RTFControlType::FLAG, RTFKeyword::CLBGDKBDIAG, 0 },
- { "clbgdkcross", RTFControlType::FLAG, RTFKeyword::CLBGDKCROSS, 0 },
- { "clbgdkdcross", RTFControlType::FLAG, RTFKeyword::CLBGDKDCROSS, 0 },
- { "clbgdkfdiag", RTFControlType::FLAG, RTFKeyword::CLBGDKFDIAG, 0 },
- { "clbgdkhor", RTFControlType::FLAG, RTFKeyword::CLBGDKHOR, 0 },
- { "clbgdkvert", RTFControlType::FLAG, RTFKeyword::CLBGDKVERT, 0 },
- { "clbgfdiag", RTFControlType::FLAG, RTFKeyword::CLBGFDIAG, 0 },
- { "clbghoriz", RTFControlType::FLAG, RTFKeyword::CLBGHORIZ, 0 },
- { "clbgvert", RTFControlType::FLAG, RTFKeyword::CLBGVERT, 0 },
- { "clbrdrb", RTFControlType::FLAG, RTFKeyword::CLBRDRB, 0 },
- { "clbrdrl", RTFControlType::FLAG, RTFKeyword::CLBRDRL, 0 },
- { "clbrdrr", RTFControlType::FLAG, RTFKeyword::CLBRDRR, 0 },
- { "clbrdrt", RTFControlType::FLAG, RTFKeyword::CLBRDRT, 0 },
- { "clcbpat", RTFControlType::VALUE, RTFKeyword::CLCBPAT, 0 },
- { "clcbpatraw", RTFControlType::VALUE, RTFKeyword::CLCBPATRAW, 0 },
- { "clcfpat", RTFControlType::VALUE, RTFKeyword::CLCFPAT, 0 },
- { "clcfpatraw", RTFControlType::VALUE, RTFKeyword::CLCFPATRAW, 0 },
- { "cldel", RTFControlType::FLAG, RTFKeyword::CLDEL, 0 },
- { "cldelauth", RTFControlType::VALUE, RTFKeyword::CLDELAUTH, 0 },
- { "cldeldttm", RTFControlType::VALUE, RTFKeyword::CLDELDTTM, 0 },
- { "cldgll", RTFControlType::FLAG, RTFKeyword::CLDGLL, 0 },
- { "cldglu", RTFControlType::FLAG, RTFKeyword::CLDGLU, 0 },
- { "clFitText", RTFControlType::FLAG, RTFKeyword::CLFITTEXT, 0 },
- { "clftsWidth", RTFControlType::VALUE, RTFKeyword::CLFTSWIDTH, 0 },
- { "clhidemark", RTFControlType::FLAG, RTFKeyword::CLHIDEMARK, 0 },
- { "clins", RTFControlType::FLAG, RTFKeyword::CLINS, 0 },
- { "clinsauth", RTFControlType::VALUE, RTFKeyword::CLINSAUTH, 0 },
- { "clinsdttm", RTFControlType::VALUE, RTFKeyword::CLINSDTTM, 0 },
- { "clmgf", RTFControlType::FLAG, RTFKeyword::CLMGF, 0 },
- { "clmrg", RTFControlType::FLAG, RTFKeyword::CLMRG, 0 },
- { "clmrgd", RTFControlType::FLAG, RTFKeyword::CLMRGD, 0 },
- { "clmrgdauth", RTFControlType::VALUE, RTFKeyword::CLMRGDAUTH, 0 },
- { "clmrgddttm", RTFControlType::VALUE, RTFKeyword::CLMRGDDTTM, 0 },
- { "clmrgdr", RTFControlType::FLAG, RTFKeyword::CLMRGDR, 0 },
- { "clNoWrap", RTFControlType::FLAG, RTFKeyword::CLNOWRAP, 0 },
- { "clpadb", RTFControlType::VALUE, RTFKeyword::CLPADB, 0 },
- { "clpadfb", RTFControlType::VALUE, RTFKeyword::CLPADFB, 0 },
- { "clpadfl", RTFControlType::VALUE, RTFKeyword::CLPADFL, 0 },
- { "clpadfr", RTFControlType::VALUE, RTFKeyword::CLPADFR, 0 },
- { "clpadft", RTFControlType::VALUE, RTFKeyword::CLPADFT, 0 },
- { "clpadl", RTFControlType::VALUE, RTFKeyword::CLPADL, 0 },
- { "clpadr", RTFControlType::VALUE, RTFKeyword::CLPADR, 0 },
- { "clpadt", RTFControlType::VALUE, RTFKeyword::CLPADT, 0 },
- { "clspb", RTFControlType::VALUE, RTFKeyword::CLSPB, 0 },
- { "clspfb", RTFControlType::VALUE, RTFKeyword::CLSPFB, 0 },
- { "clspfl", RTFControlType::VALUE, RTFKeyword::CLSPFL, 0 },
- { "clspfr", RTFControlType::VALUE, RTFKeyword::CLSPFR, 0 },
- { "clspft", RTFControlType::VALUE, RTFKeyword::CLSPFT, 0 },
- { "clspl", RTFControlType::VALUE, RTFKeyword::CLSPL, 0 },
- { "clspr", RTFControlType::VALUE, RTFKeyword::CLSPR, 0 },
- { "clspt", RTFControlType::VALUE, RTFKeyword::CLSPT, 0 },
- { "clshdng", RTFControlType::VALUE, RTFKeyword::CLSHDNG, 0 },
- { "clshdngraw", RTFControlType::VALUE, RTFKeyword::CLSHDNGRAW, 0 },
- { "clshdrawnil", RTFControlType::FLAG, RTFKeyword::CLSHDRAWNIL, 0 },
- { "clsplit", RTFControlType::FLAG, RTFKeyword::CLSPLIT, 0 },
- { "clsplitr", RTFControlType::FLAG, RTFKeyword::CLSPLITR, 0 },
- { "cltxbtlr", RTFControlType::FLAG, RTFKeyword::CLTXBTLR, 0 },
- { "cltxlrtb", RTFControlType::FLAG, RTFKeyword::CLTXLRTB, 0 },
- { "cltxlrtbv", RTFControlType::FLAG, RTFKeyword::CLTXLRTBV, 0 },
- { "cltxtbrl", RTFControlType::FLAG, RTFKeyword::CLTXTBRL, 0 },
- { "cltxtbrlv", RTFControlType::FLAG, RTFKeyword::CLTXTBRLV, 0 },
- { "clvertalb", RTFControlType::FLAG, RTFKeyword::CLVERTALB, 0 },
- { "clvertalc", RTFControlType::FLAG, RTFKeyword::CLVERTALC, 0 },
- { "clvertalt", RTFControlType::FLAG, RTFKeyword::CLVERTALT, 0 },
- { "clvmgf", RTFControlType::FLAG, RTFKeyword::CLVMGF, 0 },
- { "clvmrg", RTFControlType::FLAG, RTFKeyword::CLVMRG, 0 },
- { "clwWidth", RTFControlType::VALUE, RTFKeyword::CLWWIDTH, 0 },
- { "cmaindarkone", RTFControlType::FLAG, RTFKeyword::CMAINDARKONE, 0 },
- { "cmaindarktwo", RTFControlType::FLAG, RTFKeyword::CMAINDARKTWO, 0 },
- { "cmainlightone", RTFControlType::FLAG, RTFKeyword::CMAINLIGHTONE, 0 },
- { "cmainlighttwo", RTFControlType::FLAG, RTFKeyword::CMAINLIGHTTWO, 0 },
- { "collapsed", RTFControlType::FLAG, RTFKeyword::COLLAPSED, 0 },
- { "colno", RTFControlType::VALUE, RTFKeyword::COLNO, 0 },
- { "colorschememapping", RTFControlType::DESTINATION, RTFKeyword::COLORSCHEMEMAPPING, 0 },
- { "colortbl", RTFControlType::DESTINATION, RTFKeyword::COLORTBL, 0 },
- { "cols", RTFControlType::VALUE, RTFKeyword::COLS, 1 },
- { "colsr", RTFControlType::VALUE, RTFKeyword::COLSR, 0 },
- { "colsx", RTFControlType::VALUE, RTFKeyword::COLSX, 720 },
- { "column", RTFControlType::SYMBOL, RTFKeyword::COLUMN, 0 },
- { "colw", RTFControlType::VALUE, RTFKeyword::COLW, 0 },
- { "comment", RTFControlType::DESTINATION, RTFKeyword::COMMENT, 0 },
- { "company", RTFControlType::DESTINATION, RTFKeyword::COMPANY, 0 },
- { "contextualspace", RTFControlType::FLAG, RTFKeyword::CONTEXTUALSPACE, 0 },
- { "cpg", RTFControlType::VALUE, RTFKeyword::CPG, 0 },
- { "crauth", RTFControlType::VALUE, RTFKeyword::CRAUTH, 0 },
- { "crdate", RTFControlType::VALUE, RTFKeyword::CRDATE, 0 },
- { "creatim", RTFControlType::DESTINATION, RTFKeyword::CREATIM, 0 },
- { "cs", RTFControlType::VALUE, RTFKeyword::CS, 0 },
- { "cshade", RTFControlType::VALUE, RTFKeyword::CSHADE, 0 },
- { "ctextone", RTFControlType::FLAG, RTFKeyword::CTEXTONE, 0 },
- { "ctexttwo", RTFControlType::FLAG, RTFKeyword::CTEXTTWO, 0 },
- { "ctint", RTFControlType::VALUE, RTFKeyword::CTINT, 0 },
- { "ctrl", RTFControlType::FLAG, RTFKeyword::CTRL, 0 },
- { "cts", RTFControlType::VALUE, RTFKeyword::CTS, 0 },
- { "cufi", RTFControlType::VALUE, RTFKeyword::CUFI, 0 },
- { "culi", RTFControlType::VALUE, RTFKeyword::CULI, 0 },
- { "curi", RTFControlType::VALUE, RTFKeyword::CURI, 0 },
- { "cvmme", RTFControlType::FLAG, RTFKeyword::CVMME, 0 },
- { "datafield", RTFControlType::DESTINATION, RTFKeyword::DATAFIELD, 0 },
- { "datastore", RTFControlType::DESTINATION, RTFKeyword::DATASTORE, 0 },
- { "date", RTFControlType::FLAG, RTFKeyword::DATE, 0 },
- { "dbch", RTFControlType::FLAG, RTFKeyword::DBCH, 0 },
- { "defchp", RTFControlType::DESTINATION, RTFKeyword::DEFCHP, 0 },
- { "deff", RTFControlType::VALUE, RTFKeyword::DEFF, 0 },
- { "defformat", RTFControlType::FLAG, RTFKeyword::DEFFORMAT, 0 },
- { "deflang", RTFControlType::VALUE, RTFKeyword::DEFLANG, 0 },
- { "deflangfe", RTFControlType::VALUE, RTFKeyword::DEFLANGFE, 0 },
- { "defpap", RTFControlType::DESTINATION, RTFKeyword::DEFPAP, 0 },
- { "defshp", RTFControlType::FLAG, RTFKeyword::DEFSHP, 0 },
- { "deftab", RTFControlType::VALUE, RTFKeyword::DEFTAB, 720 },
- { "deleted", RTFControlType::TOGGLE, RTFKeyword::DELETED, 1 },
- { "delrsid", RTFControlType::VALUE, RTFKeyword::DELRSID, 0 },
- { "dfrauth", RTFControlType::VALUE, RTFKeyword::DFRAUTH, 0 },
- { "dfrdate", RTFControlType::VALUE, RTFKeyword::DFRDATE, 0 },
- { "dfrmtxtx", RTFControlType::VALUE, RTFKeyword::DFRMTXTX, 0 },
- { "dfrmtxty", RTFControlType::VALUE, RTFKeyword::DFRMTXTY, 0 },
- { "dfrstart", RTFControlType::VALUE, RTFKeyword::DFRSTART, 0 },
- { "dfrstop", RTFControlType::VALUE, RTFKeyword::DFRSTOP, 0 },
- { "dfrxst", RTFControlType::VALUE, RTFKeyword::DFRXST, 0 },
- { "dghorigin", RTFControlType::VALUE, RTFKeyword::DGHORIGIN, 1701 },
- { "dghshow", RTFControlType::VALUE, RTFKeyword::DGHSHOW, 3 },
- { "dghspace", RTFControlType::VALUE, RTFKeyword::DGHSPACE, 120 },
- { "dgmargin", RTFControlType::FLAG, RTFKeyword::DGMARGIN, 0 },
- { "dgsnap", RTFControlType::FLAG, RTFKeyword::DGSNAP, 0 },
- { "dgvorigin", RTFControlType::VALUE, RTFKeyword::DGVORIGIN, 1984 },
- { "dgvshow", RTFControlType::VALUE, RTFKeyword::DGVSHOW, 0 },
- { "dgvspace", RTFControlType::VALUE, RTFKeyword::DGVSPACE, 120 },
- { "dibitmap", RTFControlType::VALUE, RTFKeyword::DIBITMAP, 0 },
- { "disabled", RTFControlType::TOGGLE, RTFKeyword::DISABLED, 1 },
- { "dn", RTFControlType::VALUE, RTFKeyword::DN, 6 },
- { "dntblnsbdb", RTFControlType::FLAG, RTFKeyword::DNTBLNSBDB, 0 },
- { "do", RTFControlType::DESTINATION, RTFKeyword::DO, 0 },
- { "dobxcolumn", RTFControlType::FLAG, RTFKeyword::DOBXCOLUMN, 0 },
- { "dobxmargin", RTFControlType::FLAG, RTFKeyword::DOBXMARGIN, 0 },
- { "dobxpage", RTFControlType::FLAG, RTFKeyword::DOBXPAGE, 0 },
- { "dobymargin", RTFControlType::FLAG, RTFKeyword::DOBYMARGIN, 0 },
- { "dobypage", RTFControlType::FLAG, RTFKeyword::DOBYPAGE, 0 },
- { "dobypara", RTFControlType::FLAG, RTFKeyword::DOBYPARA, 0 },
- { "doccomm", RTFControlType::DESTINATION, RTFKeyword::DOCCOMM, 0 },
- { "doctemp", RTFControlType::FLAG, RTFKeyword::DOCTEMP, 0 },
- { "doctype", RTFControlType::VALUE, RTFKeyword::DOCTYPE, 0 },
- { "docvar", RTFControlType::DESTINATION, RTFKeyword::DOCVAR, 0 },
- { "dodhgt", RTFControlType::VALUE, RTFKeyword::DODHGT, 0 },
- { "dolock", RTFControlType::FLAG, RTFKeyword::DOLOCK, 0 },
- { "donotembedlingdata", RTFControlType::VALUE, RTFKeyword::DONOTEMBEDLINGDATA, 0 },
- { "donotembedsysfont", RTFControlType::VALUE, RTFKeyword::DONOTEMBEDSYSFONT, 0 },
- { "donotshowcomments", RTFControlType::FLAG, RTFKeyword::DONOTSHOWCOMMENTS, 0 },
- { "donotshowinsdel", RTFControlType::FLAG, RTFKeyword::DONOTSHOWINSDEL, 0 },
- { "donotshowmarkup", RTFControlType::FLAG, RTFKeyword::DONOTSHOWMARKUP, 0 },
- { "donotshowprops", RTFControlType::FLAG, RTFKeyword::DONOTSHOWPROPS, 0 },
- { "dpaendhol", RTFControlType::FLAG, RTFKeyword::DPAENDHOL, 0 },
- { "dpaendl", RTFControlType::VALUE, RTFKeyword::DPAENDL, 0 },
- { "dpaendsol", RTFControlType::FLAG, RTFKeyword::DPAENDSOL, 0 },
- { "dpaendw", RTFControlType::VALUE, RTFKeyword::DPAENDW, 0 },
- { "dparc", RTFControlType::FLAG, RTFKeyword::DPARC, 0 },
- { "dparcflipx", RTFControlType::FLAG, RTFKeyword::DPARCFLIPX, 0 },
- { "dparcflipy", RTFControlType::FLAG, RTFKeyword::DPARCFLIPY, 0 },
- { "dpastarthol", RTFControlType::FLAG, RTFKeyword::DPASTARTHOL, 0 },
- { "dpastartl", RTFControlType::VALUE, RTFKeyword::DPASTARTL, 0 },
- { "dpastartsol", RTFControlType::FLAG, RTFKeyword::DPASTARTSOL, 0 },
- { "dpastartw", RTFControlType::VALUE, RTFKeyword::DPASTARTW, 0 },
- { "dpcallout", RTFControlType::FLAG, RTFKeyword::DPCALLOUT, 0 },
- { "dpcoa", RTFControlType::VALUE, RTFKeyword::DPCOA, 0 },
- { "dpcoaccent", RTFControlType::FLAG, RTFKeyword::DPCOACCENT, 0 },
- { "dpcobestfit", RTFControlType::FLAG, RTFKeyword::DPCOBESTFIT, 0 },
- { "dpcoborder", RTFControlType::FLAG, RTFKeyword::DPCOBORDER, 0 },
- { "dpcodabs", RTFControlType::FLAG, RTFKeyword::DPCODABS, 0 },
- { "dpcodbottom", RTFControlType::FLAG, RTFKeyword::DPCODBOTTOM, 0 },
- { "dpcodcenter", RTFControlType::FLAG, RTFKeyword::DPCODCENTER, 0 },
- { "dpcodescent", RTFControlType::VALUE, RTFKeyword::DPCODESCENT, 0 },
- { "dpcodtop", RTFControlType::FLAG, RTFKeyword::DPCODTOP, 0 },
- { "dpcolength", RTFControlType::VALUE, RTFKeyword::DPCOLENGTH, 0 },
- { "dpcominusx", RTFControlType::FLAG, RTFKeyword::DPCOMINUSX, 0 },
- { "dpcominusy", RTFControlType::FLAG, RTFKeyword::DPCOMINUSY, 0 },
- { "dpcooffset", RTFControlType::VALUE, RTFKeyword::DPCOOFFSET, 0 },
- { "dpcosmarta", RTFControlType::FLAG, RTFKeyword::DPCOSMARTA, 0 },
- { "dpcotdouble", RTFControlType::FLAG, RTFKeyword::DPCOTDOUBLE, 0 },
- { "dpcotright", RTFControlType::FLAG, RTFKeyword::DPCOTRIGHT, 0 },
- { "dpcotsingle", RTFControlType::FLAG, RTFKeyword::DPCOTSINGLE, 0 },
- { "dpcottriple", RTFControlType::FLAG, RTFKeyword::DPCOTTRIPLE, 0 },
- { "dpcount", RTFControlType::VALUE, RTFKeyword::DPCOUNT, 0 },
- { "dpellipse", RTFControlType::FLAG, RTFKeyword::DPELLIPSE, 0 },
- { "dpendgroup", RTFControlType::FLAG, RTFKeyword::DPENDGROUP, 0 },
- { "dpfillbgcb", RTFControlType::VALUE, RTFKeyword::DPFILLBGCB, 0 },
- { "dpfillbgcg", RTFControlType::VALUE, RTFKeyword::DPFILLBGCG, 0 },
- { "dpfillbgcr", RTFControlType::VALUE, RTFKeyword::DPFILLBGCR, 0 },
- { "dpfillbggray", RTFControlType::VALUE, RTFKeyword::DPFILLBGGRAY, 0 },
- { "dpfillbgpal", RTFControlType::FLAG, RTFKeyword::DPFILLBGPAL, 0 },
- { "dpfillfgcb", RTFControlType::VALUE, RTFKeyword::DPFILLFGCB, 0 },
- { "dpfillfgcg", RTFControlType::VALUE, RTFKeyword::DPFILLFGCG, 0 },
- { "dpfillfgcr", RTFControlType::VALUE, RTFKeyword::DPFILLFGCR, 0 },
- { "dpfillfggray", RTFControlType::VALUE, RTFKeyword::DPFILLFGGRAY, 0 },
- { "dpfillfgpal", RTFControlType::FLAG, RTFKeyword::DPFILLFGPAL, 0 },
- { "dpfillpat", RTFControlType::VALUE, RTFKeyword::DPFILLPAT, 0 },
- { "dpgroup", RTFControlType::FLAG, RTFKeyword::DPGROUP, 0 },
- { "dpline", RTFControlType::FLAG, RTFKeyword::DPLINE, 0 },
- { "dplinecob", RTFControlType::VALUE, RTFKeyword::DPLINECOB, 0 },
- { "dplinecog", RTFControlType::VALUE, RTFKeyword::DPLINECOG, 0 },
- { "dplinecor", RTFControlType::VALUE, RTFKeyword::DPLINECOR, 0 },
- { "dplinedado", RTFControlType::FLAG, RTFKeyword::DPLINEDADO, 0 },
- { "dplinedadodo", RTFControlType::FLAG, RTFKeyword::DPLINEDADODO, 0 },
- { "dplinedash", RTFControlType::FLAG, RTFKeyword::DPLINEDASH, 0 },
- { "dplinedot", RTFControlType::FLAG, RTFKeyword::DPLINEDOT, 0 },
- { "dplinegray", RTFControlType::VALUE, RTFKeyword::DPLINEGRAY, 0 },
- { "dplinehollow", RTFControlType::FLAG, RTFKeyword::DPLINEHOLLOW, 0 },
- { "dplinepal", RTFControlType::FLAG, RTFKeyword::DPLINEPAL, 0 },
- { "dplinesolid", RTFControlType::FLAG, RTFKeyword::DPLINESOLID, 0 },
- { "dplinew", RTFControlType::VALUE, RTFKeyword::DPLINEW, 0 },
- { "dppolycount", RTFControlType::VALUE, RTFKeyword::DPPOLYCOUNT, 0 },
- { "dppolygon", RTFControlType::FLAG, RTFKeyword::DPPOLYGON, 0 },
- { "dppolyline", RTFControlType::FLAG, RTFKeyword::DPPOLYLINE, 0 },
- { "dpptx", RTFControlType::VALUE, RTFKeyword::DPPTX, 0 },
- { "dppty", RTFControlType::VALUE, RTFKeyword::DPPTY, 0 },
- { "dprect", RTFControlType::FLAG, RTFKeyword::DPRECT, 0 },
- { "dproundr", RTFControlType::FLAG, RTFKeyword::DPROUNDR, 0 },
- { "dpshadow", RTFControlType::FLAG, RTFKeyword::DPSHADOW, 0 },
- { "dpshadx", RTFControlType::VALUE, RTFKeyword::DPSHADX, 0 },
- { "dpshady", RTFControlType::VALUE, RTFKeyword::DPSHADY, 0 },
- { "dptxbtlr", RTFControlType::FLAG, RTFKeyword::DPTXBTLR, 0 },
- { "dptxbx", RTFControlType::FLAG, RTFKeyword::DPTXBX, 0 },
- { "dptxbxmar", RTFControlType::VALUE, RTFKeyword::DPTXBXMAR, 0 },
- { "dptxbxtext", RTFControlType::DESTINATION, RTFKeyword::DPTXBXTEXT, 0 },
- { "dptxlrtb", RTFControlType::FLAG, RTFKeyword::DPTXLRTB, 0 },
- { "dptxlrtbv", RTFControlType::FLAG, RTFKeyword::DPTXLRTBV, 0 },
- { "dptxtbrl", RTFControlType::FLAG, RTFKeyword::DPTXTBRL, 0 },
- { "dptxtbrlv", RTFControlType::FLAG, RTFKeyword::DPTXTBRLV, 0 },
- { "dpx", RTFControlType::VALUE, RTFKeyword::DPX, 0 },
- { "dpxsize", RTFControlType::VALUE, RTFKeyword::DPXSIZE, 0 },
- { "dpy", RTFControlType::VALUE, RTFKeyword::DPY, 0 },
- { "dpysize", RTFControlType::VALUE, RTFKeyword::DPYSIZE, 0 },
- { "dropcapli", RTFControlType::VALUE, RTFKeyword::DROPCAPLI, 0 },
- { "dropcapt", RTFControlType::VALUE, RTFKeyword::DROPCAPT, 0 },
- { "ds", RTFControlType::VALUE, RTFKeyword::DS, 0 },
- { "dxfrtext", RTFControlType::VALUE, RTFKeyword::DXFRTEXT, 0 },
- { "dy", RTFControlType::VALUE, RTFKeyword::DY, 0 },
- { "ebcend", RTFControlType::DESTINATION, RTFKeyword::EBCEND, 0 },
- { "ebcstart", RTFControlType::DESTINATION, RTFKeyword::EBCSTART, 0 },
- { "edmins", RTFControlType::VALUE, RTFKeyword::EDMINS, 0 },
- { "embo", RTFControlType::TOGGLE, RTFKeyword::EMBO, 1 },
- { "emdash", RTFControlType::SYMBOL, RTFKeyword::EMDASH, 0 },
- { "emfblip", RTFControlType::FLAG, RTFKeyword::EMFBLIP, 0 },
- { "emspace", RTFControlType::SYMBOL, RTFKeyword::EMSPACE, 0 },
- { "endash", RTFControlType::SYMBOL, RTFKeyword::ENDASH, 0 },
- { "enddoc", RTFControlType::FLAG, RTFKeyword::ENDDOC, 0 },
- { "endnhere", RTFControlType::FLAG, RTFKeyword::ENDNHERE, 0 },
- { "endnotes", RTFControlType::FLAG, RTFKeyword::ENDNOTES, 0 },
- { "enforceprot", RTFControlType::VALUE, RTFKeyword::ENFORCEPROT, 0 },
- { "enspace", RTFControlType::SYMBOL, RTFKeyword::ENSPACE, 0 },
- { "expnd", RTFControlType::VALUE, RTFKeyword::EXPND, 0 },
- { "expndtw", RTFControlType::VALUE, RTFKeyword::EXPNDTW, 0 },
- { "expshrtn", RTFControlType::FLAG, RTFKeyword::EXPSHRTN, 0 },
- { "f", RTFControlType::VALUE, RTFKeyword::F, 0 },
- { "faauto", RTFControlType::FLAG, RTFKeyword::FAAUTO, 0 },
- { "facenter", RTFControlType::FLAG, RTFKeyword::FACENTER, 0 },
- { "facingp", RTFControlType::TOGGLE, RTFKeyword::FACINGP, 1 },
- { "factoidname", RTFControlType::DESTINATION, RTFKeyword::FACTOIDNAME, 0 },
- { "fafixed", RTFControlType::FLAG, RTFKeyword::FAFIXED, 0 },
- { "fahang", RTFControlType::FLAG, RTFKeyword::FAHANG, 0 },
- { "falt", RTFControlType::DESTINATION, RTFKeyword::FALT, 0 },
- { "faroman", RTFControlType::FLAG, RTFKeyword::FAROMAN, 0 },
- { "favar", RTFControlType::FLAG, RTFKeyword::FAVAR, 0 },
- { "fbias", RTFControlType::VALUE, RTFKeyword::FBIAS, 0 },
- { "fbidi", RTFControlType::FLAG, RTFKeyword::FBIDI, 0 },
- { "fbidis", RTFControlType::FLAG, RTFKeyword::FBIDIS, 0 },
- { "fbimajor", RTFControlType::FLAG, RTFKeyword::FBIMAJOR, 0 },
- { "fbiminor", RTFControlType::FLAG, RTFKeyword::FBIMINOR, 0 },
- { "fchars", RTFControlType::DESTINATION, RTFKeyword::FCHARS, 0 },
- { "fcharset", RTFControlType::VALUE, RTFKeyword::FCHARSET, 0 },
- { "fcs", RTFControlType::VALUE, RTFKeyword::FCS, 0 },
- { "fdbmajor", RTFControlType::FLAG, RTFKeyword::FDBMAJOR, 0 },
- { "fdbminor", RTFControlType::FLAG, RTFKeyword::FDBMINOR, 0 },
- { "fdecor", RTFControlType::FLAG, RTFKeyword::FDECOR, 0 },
- { "felnbrelev", RTFControlType::FLAG, RTFKeyword::FELNBRELEV, 0 },
- { "fet", RTFControlType::VALUE, RTFKeyword::FET, 0 },
- { "fetch", RTFControlType::FLAG, RTFKeyword::FETCH, 0 },
- { "ffdefres", RTFControlType::VALUE, RTFKeyword::FFDEFRES, 0 },
- { "ffdeftext", RTFControlType::DESTINATION, RTFKeyword::FFDEFTEXT, 0 },
- { "ffentrymcr", RTFControlType::DESTINATION, RTFKeyword::FFENTRYMCR, 0 },
- { "ffexitmcr", RTFControlType::DESTINATION, RTFKeyword::FFEXITMCR, 0 },
- { "ffformat", RTFControlType::DESTINATION, RTFKeyword::FFFORMAT, 0 },
- { "ffhaslistbox", RTFControlType::VALUE, RTFKeyword::FFHASLISTBOX, 0 },
- { "ffhelptext", RTFControlType::DESTINATION, RTFKeyword::FFHELPTEXT, 0 },
- { "ffhps", RTFControlType::VALUE, RTFKeyword::FFHPS, 0 },
- { "ffl", RTFControlType::DESTINATION, RTFKeyword::FFL, 0 },
- { "ffmaxlen", RTFControlType::VALUE, RTFKeyword::FFMAXLEN, 0 },
- { "ffname", RTFControlType::DESTINATION, RTFKeyword::FFNAME, 0 },
- { "ffownhelp", RTFControlType::VALUE, RTFKeyword::FFOWNHELP, 0 },
- { "ffownstat", RTFControlType::VALUE, RTFKeyword::FFOWNSTAT, 0 },
- { "ffprot", RTFControlType::VALUE, RTFKeyword::FFPROT, 0 },
- { "ffrecalc", RTFControlType::VALUE, RTFKeyword::FFRECALC, 0 },
- { "ffres", RTFControlType::VALUE, RTFKeyword::FFRES, 0 },
- { "ffsize", RTFControlType::VALUE, RTFKeyword::FFSIZE, 0 },
- { "ffstattext", RTFControlType::DESTINATION, RTFKeyword::FFSTATTEXT, 0 },
- { "fftype", RTFControlType::VALUE, RTFKeyword::FFTYPE, 0 },
- { "fftypetxt", RTFControlType::VALUE, RTFKeyword::FFTYPETXT, 0 },
- { "fhimajor", RTFControlType::FLAG, RTFKeyword::FHIMAJOR, 0 },
- { "fhiminor", RTFControlType::FLAG, RTFKeyword::FHIMINOR, 0 },
- { "fi", RTFControlType::VALUE, RTFKeyword::FI, 0 },
- { "fid", RTFControlType::VALUE, RTFKeyword::FID, 0 },
- { "field", RTFControlType::DESTINATION, RTFKeyword::FIELD, 0 },
- { "file", RTFControlType::DESTINATION, RTFKeyword::FILE, 0 },
- { "filetbl", RTFControlType::DESTINATION, RTFKeyword::FILETBL, 0 },
- { "fittext", RTFControlType::VALUE, RTFKeyword::FITTEXT, 0 },
- { "fjgothic", RTFControlType::FLAG, RTFKeyword::FJGOTHIC, 0 },
- { "fjminchou", RTFControlType::FLAG, RTFKeyword::FJMINCHOU, 0 },
- { "fldalt", RTFControlType::FLAG, RTFKeyword::FLDALT, 0 },
- { "flddirty", RTFControlType::FLAG, RTFKeyword::FLDDIRTY, 0 },
- { "fldedit", RTFControlType::FLAG, RTFKeyword::FLDEDIT, 0 },
- { "fldinst", RTFControlType::DESTINATION, RTFKeyword::FLDINST, 0 },
- { "fldlock", RTFControlType::FLAG, RTFKeyword::FLDLOCK, 0 },
- { "fldpriv", RTFControlType::FLAG, RTFKeyword::FLDPRIV, 0 },
- { "fldrslt", RTFControlType::DESTINATION, RTFKeyword::FLDRSLT, 0 },
- { "fldtype", RTFControlType::DESTINATION, RTFKeyword::FLDTYPE, 0 },
- { "flomajor", RTFControlType::FLAG, RTFKeyword::FLOMAJOR, 0 },
- { "flominor", RTFControlType::FLAG, RTFKeyword::FLOMINOR, 0 },
- { "fmodern", RTFControlType::FLAG, RTFKeyword::FMODERN, 0 },
- { "fn", RTFControlType::VALUE, RTFKeyword::FN, 0 },
- { "fname", RTFControlType::DESTINATION, RTFKeyword::FNAME, 0 },
- { "fnetwork", RTFControlType::FLAG, RTFKeyword::FNETWORK, 0 },
- { "fnil", RTFControlType::FLAG, RTFKeyword::FNIL, 0 },
- { "fnonfilesys", RTFControlType::FLAG, RTFKeyword::FNONFILESYS, 0 },
- { "fontemb", RTFControlType::DESTINATION, RTFKeyword::FONTEMB, 0 },
- { "fontfile", RTFControlType::DESTINATION, RTFKeyword::FONTFILE, 0 },
- { "fonttbl", RTFControlType::DESTINATION, RTFKeyword::FONTTBL, 0 },
- { "footer", RTFControlType::DESTINATION, RTFKeyword::FOOTER, 0 },
- { "footerf", RTFControlType::DESTINATION, RTFKeyword::FOOTERF, 0 },
- { "footerl", RTFControlType::DESTINATION, RTFKeyword::FOOTERL, 0 },
- { "footerr", RTFControlType::DESTINATION, RTFKeyword::FOOTERR, 0 },
- { "footery", RTFControlType::VALUE, RTFKeyword::FOOTERY, 720 },
- { "footnote", RTFControlType::DESTINATION, RTFKeyword::FOOTNOTE, 0 },
- { "forceupgrade", RTFControlType::FLAG, RTFKeyword::FORCEUPGRADE, 0 },
- { "formdisp", RTFControlType::FLAG, RTFKeyword::FORMDISP, 0 },
- { "formfield", RTFControlType::DESTINATION, RTFKeyword::FORMFIELD, 0 },
- { "formprot", RTFControlType::FLAG, RTFKeyword::FORMPROT, 0 },
- { "formshade", RTFControlType::FLAG, RTFKeyword::FORMSHADE, 0 },
- { "fosnum", RTFControlType::VALUE, RTFKeyword::FOSNUM, 0 },
- { "fprq", RTFControlType::VALUE, RTFKeyword::FPRQ, 0 },
- { "fracwidth", RTFControlType::FLAG, RTFKeyword::FRACWIDTH, 0 },
- { "frelative", RTFControlType::VALUE, RTFKeyword::FRELATIVE, 0 },
- { "frmtxbtlr", RTFControlType::FLAG, RTFKeyword::FRMTXBTLR, 0 },
- { "frmtxlrtb", RTFControlType::FLAG, RTFKeyword::FRMTXLRTB, 0 },
- { "frmtxlrtbv", RTFControlType::FLAG, RTFKeyword::FRMTXLRTBV, 0 },
- { "frmtxtbrl", RTFControlType::FLAG, RTFKeyword::FRMTXTBRL, 0 },
- { "frmtxtbrlv", RTFControlType::FLAG, RTFKeyword::FRMTXTBRLV, 0 },
- { "froman", RTFControlType::FLAG, RTFKeyword::FROMAN, 0 },
- { "fromhtml", RTFControlType::VALUE, RTFKeyword::FROMHTML, 0 },
- { "fromtext", RTFControlType::FLAG, RTFKeyword::FROMTEXT, 0 },
- { "fs", RTFControlType::VALUE, RTFKeyword::FS, 24 },
- { "fscript", RTFControlType::FLAG, RTFKeyword::FSCRIPT, 0 },
- { "fswiss", RTFControlType::FLAG, RTFKeyword::FSWISS, 0 },
- { "ftech", RTFControlType::FLAG, RTFKeyword::FTECH, 0 },
- { "ftnalt", RTFControlType::FLAG, RTFKeyword::FTNALT, 0 },
- { "ftnbj", RTFControlType::FLAG, RTFKeyword::FTNBJ, 0 },
- { "ftncn", RTFControlType::DESTINATION, RTFKeyword::FTNCN, 0 },
- { "ftnil", RTFControlType::FLAG, RTFKeyword::FTNIL, 0 },
- { "ftnlytwnine", RTFControlType::FLAG, RTFKeyword::FTNLYTWNINE, 0 },
- { "ftnnalc", RTFControlType::FLAG, RTFKeyword::FTNNALC, 0 },
- { "ftnnar", RTFControlType::FLAG, RTFKeyword::FTNNAR, 0 },
- { "ftnnauc", RTFControlType::FLAG, RTFKeyword::FTNNAUC, 0 },
- { "ftnnchi", RTFControlType::FLAG, RTFKeyword::FTNNCHI, 0 },
- { "ftnnchosung", RTFControlType::FLAG, RTFKeyword::FTNNCHOSUNG, 0 },
- { "ftnncnum", RTFControlType::FLAG, RTFKeyword::FTNNCNUM, 0 },
- { "ftnndbar", RTFControlType::FLAG, RTFKeyword::FTNNDBAR, 0 },
- { "ftnndbnum", RTFControlType::FLAG, RTFKeyword::FTNNDBNUM, 0 },
- { "ftnndbnumd", RTFControlType::FLAG, RTFKeyword::FTNNDBNUMD, 0 },
- { "ftnndbnumk", RTFControlType::FLAG, RTFKeyword::FTNNDBNUMK, 0 },
- { "ftnndbnumt", RTFControlType::FLAG, RTFKeyword::FTNNDBNUMT, 0 },
- { "ftnnganada", RTFControlType::FLAG, RTFKeyword::FTNNGANADA, 0 },
- { "ftnngbnum", RTFControlType::FLAG, RTFKeyword::FTNNGBNUM, 0 },
- { "ftnngbnumd", RTFControlType::FLAG, RTFKeyword::FTNNGBNUMD, 0 },
- { "ftnngbnumk", RTFControlType::FLAG, RTFKeyword::FTNNGBNUMK, 0 },
- { "ftnngbnuml", RTFControlType::FLAG, RTFKeyword::FTNNGBNUML, 0 },
- { "ftnnrlc", RTFControlType::FLAG, RTFKeyword::FTNNRLC, 0 },
- { "ftnnruc", RTFControlType::FLAG, RTFKeyword::FTNNRUC, 0 },
- { "ftnnzodiac", RTFControlType::FLAG, RTFKeyword::FTNNZODIAC, 0 },
- { "ftnnzodiacd", RTFControlType::FLAG, RTFKeyword::FTNNZODIACD, 0 },
- { "ftnnzodiacl", RTFControlType::FLAG, RTFKeyword::FTNNZODIACL, 0 },
- { "ftnrestart", RTFControlType::FLAG, RTFKeyword::FTNRESTART, 0 },
- { "ftnrstcont", RTFControlType::FLAG, RTFKeyword::FTNRSTCONT, 0 },
- { "ftnrstpg", RTFControlType::FLAG, RTFKeyword::FTNRSTPG, 0 },
- { "ftnsep", RTFControlType::DESTINATION, RTFKeyword::FTNSEP, 0 },
- { "ftnsepc", RTFControlType::DESTINATION, RTFKeyword::FTNSEPC, 0 },
- { "ftnstart", RTFControlType::VALUE, RTFKeyword::FTNSTART, 1 },
- { "ftntj", RTFControlType::FLAG, RTFKeyword::FTNTJ, 0 },
- { "fttruetype", RTFControlType::FLAG, RTFKeyword::FTTRUETYPE, 0 },
- { "fvaliddos", RTFControlType::FLAG, RTFKeyword::FVALIDDOS, 0 },
- { "fvalidhpfs", RTFControlType::FLAG, RTFKeyword::FVALIDHPFS, 0 },
- { "fvalidmac", RTFControlType::FLAG, RTFKeyword::FVALIDMAC, 0 },
- { "fvalidntfs", RTFControlType::FLAG, RTFKeyword::FVALIDNTFS, 0 },
- { "g", RTFControlType::DESTINATION, RTFKeyword::G, 0 },
- { "gcw", RTFControlType::VALUE, RTFKeyword::GCW, 0 },
- { "generator", RTFControlType::DESTINATION, RTFKeyword::GENERATOR, 0 },
- { "green", RTFControlType::VALUE, RTFKeyword::GREEN, 0 },
- { "grfdocevents", RTFControlType::VALUE, RTFKeyword::GRFDOCEVENTS, 0 },
- { "gridtbl", RTFControlType::DESTINATION, RTFKeyword::GRIDTBL, 0 },
- { "gutter", RTFControlType::VALUE, RTFKeyword::GUTTER, 0 },
- { "gutterprl", RTFControlType::FLAG, RTFKeyword::GUTTERPRL, 0 },
- { "guttersxn", RTFControlType::VALUE, RTFKeyword::GUTTERSXN, 0 },
- { "header", RTFControlType::DESTINATION, RTFKeyword::HEADER, 0 },
- { "headerf", RTFControlType::DESTINATION, RTFKeyword::HEADERF, 0 },
- { "headerl", RTFControlType::DESTINATION, RTFKeyword::HEADERL, 0 },
- { "headerr", RTFControlType::DESTINATION, RTFKeyword::HEADERR, 0 },
- { "headery", RTFControlType::VALUE, RTFKeyword::HEADERY, 720 },
- { "hich", RTFControlType::FLAG, RTFKeyword::HICH, 0 },
- { "highlight", RTFControlType::VALUE, RTFKeyword::HIGHLIGHT, 0 },
- { "hl", RTFControlType::DESTINATION, RTFKeyword::HL, 0 },
- { "hlfr", RTFControlType::DESTINATION, RTFKeyword::HLFR, 0 },
- { "hlinkbase", RTFControlType::DESTINATION, RTFKeyword::HLINKBASE, 0 },
- { "hlloc", RTFControlType::DESTINATION, RTFKeyword::HLLOC, 0 },
- { "hlsrc", RTFControlType::DESTINATION, RTFKeyword::HLSRC, 0 },
- { "horzdoc", RTFControlType::FLAG, RTFKeyword::HORZDOC, 0 },
- { "horzsect", RTFControlType::FLAG, RTFKeyword::HORZSECT, 0 },
- { "horzvert", RTFControlType::VALUE, RTFKeyword::HORZVERT, 0 },
- { "hr", RTFControlType::VALUE, RTFKeyword::HR, 0 },
- { "hres", RTFControlType::VALUE, RTFKeyword::HRES, 0 },
- { "hrule", RTFControlType::FLAG, RTFKeyword::HRULE, 0 },
- { "hsv", RTFControlType::DESTINATION, RTFKeyword::HSV, 0 },
- { "htmautsp", RTFControlType::FLAG, RTFKeyword::HTMAUTSP, 0 },
- { "htmlbase", RTFControlType::FLAG, RTFKeyword::HTMLBASE, 0 },
- { "htmlrtf", RTFControlType::TOGGLE, RTFKeyword::HTMLRTF, 1 },
- { "htmltag", RTFControlType::DESTINATION, RTFKeyword::HTMLTAG, 0 },
- { "hwelev", RTFControlType::FLAG, RTFKeyword::HWELEV, 0 },
- { "hyphauto", RTFControlType::TOGGLE, RTFKeyword::HYPHAUTO, 1 },
- { "hyphcaps", RTFControlType::TOGGLE, RTFKeyword::HYPHCAPS, 1 },
- { "hyphconsec", RTFControlType::VALUE, RTFKeyword::HYPHCONSEC, 0 },
- { "hyphhotz", RTFControlType::VALUE, RTFKeyword::HYPHHOTZ, 0 },
- { "hyphpar", RTFControlType::TOGGLE, RTFKeyword::HYPHPAR, 1 },
- { "i", RTFControlType::TOGGLE, RTFKeyword::I, 1 },
- { "id", RTFControlType::VALUE, RTFKeyword::ID, 0 },
- { "ignoremixedcontent", RTFControlType::VALUE, RTFKeyword::IGNOREMIXEDCONTENT, 0 },
- { "ilfomacatclnup", RTFControlType::VALUE, RTFKeyword::ILFOMACATCLNUP, 0 },
- { "ilvl", RTFControlType::VALUE, RTFKeyword::ILVL, 0 },
- { "impr", RTFControlType::TOGGLE, RTFKeyword::IMPR, 1 },
- { "indmirror", RTFControlType::FLAG, RTFKeyword::INDMIRROR, 0 },
- { "indrlsweleven", RTFControlType::FLAG, RTFKeyword::INDRLSWELEVEN, 0 },
- { "info", RTFControlType::DESTINATION, RTFKeyword::INFO, 0 },
- { "insrsid", RTFControlType::VALUE, RTFKeyword::INSRSID, 0 },
- { "intbl", RTFControlType::FLAG, RTFKeyword::INTBL, 0 },
- { "ipgp", RTFControlType::VALUE, RTFKeyword::IPGP, 0 },
- { "irowband", RTFControlType::VALUE, RTFKeyword::IROWBAND, 0 },
- { "irow", RTFControlType::VALUE, RTFKeyword::IROW, 0 },
- { "itap", RTFControlType::VALUE, RTFKeyword::ITAP, 1 },
- { "ixe", RTFControlType::FLAG, RTFKeyword::IXE, 0 },
- { "jcompress", RTFControlType::FLAG, RTFKeyword::JCOMPRESS, 0 },
- { "jexpand", RTFControlType::FLAG, RTFKeyword::JEXPAND, 0 },
- { "jis", RTFControlType::FLAG, RTFKeyword::JIS, 0 },
- { "jpegblip", RTFControlType::FLAG, RTFKeyword::JPEGBLIP, 0 },
- { "jsksu", RTFControlType::FLAG, RTFKeyword::JSKSU, 0 },
- { "keep", RTFControlType::FLAG, RTFKeyword::KEEP, 0 },
- { "keepn", RTFControlType::FLAG, RTFKeyword::KEEPN, 0 },
- { "kerning", RTFControlType::VALUE, RTFKeyword::KERNING, 0 },
- { "keycode", RTFControlType::DESTINATION, RTFKeyword::KEYCODE, 0 },
- { "keywords", RTFControlType::DESTINATION, RTFKeyword::KEYWORDS, 0 },
- { "krnprsnet", RTFControlType::FLAG, RTFKeyword::KRNPRSNET, 0 },
- { "ksulang", RTFControlType::VALUE, RTFKeyword::KSULANG, 0 },
- { "jclisttab", RTFControlType::FLAG, RTFKeyword::JCLISTTAB, 0 },
- { "landscape", RTFControlType::FLAG, RTFKeyword::LANDSCAPE, 0 },
- { "lang", RTFControlType::VALUE, RTFKeyword::LANG, 0 },
- { "langfe", RTFControlType::VALUE, RTFKeyword::LANGFE, 0 },
- { "langfenp", RTFControlType::VALUE, RTFKeyword::LANGFENP, 0 },
- { "langnp", RTFControlType::VALUE, RTFKeyword::LANGNP, 0 },
- { "lastrow", RTFControlType::FLAG, RTFKeyword::LASTROW, 0 },
- { "latentstyles", RTFControlType::DESTINATION, RTFKeyword::LATENTSTYLES, 0 },
- { "lbr", RTFControlType::VALUE, RTFKeyword::LBR, 0 },
- { "lchars", RTFControlType::DESTINATION, RTFKeyword::LCHARS, 0 },
- { "ldblquote", RTFControlType::SYMBOL, RTFKeyword::LDBLQUOTE, 0 },
- { "level", RTFControlType::VALUE, RTFKeyword::LEVEL, 0 },
- { "levelfollow", RTFControlType::VALUE, RTFKeyword::LEVELFOLLOW, 0 },
- { "levelindent", RTFControlType::VALUE, RTFKeyword::LEVELINDENT, 0 },
- { "leveljc", RTFControlType::VALUE, RTFKeyword::LEVELJC, 0 },
- { "leveljcn", RTFControlType::VALUE, RTFKeyword::LEVELJCN, 0 },
- { "levellegal", RTFControlType::VALUE, RTFKeyword::LEVELLEGAL, 1 },
- { "levelnfc", RTFControlType::VALUE, RTFKeyword::LEVELNFC, 0 },
- { "levelnfcn", RTFControlType::VALUE, RTFKeyword::LEVELNFCN, 0 },
- { "levelnorestart", RTFControlType::VALUE, RTFKeyword::LEVELNORESTART, 0 },
- { "levelnumbers", RTFControlType::DESTINATION, RTFKeyword::LEVELNUMBERS, 0 },
- { "levelold", RTFControlType::VALUE, RTFKeyword::LEVELOLD, 0 },
- { "levelpicture", RTFControlType::VALUE, RTFKeyword::LEVELPICTURE, 0 },
- { "levelpicturenosize", RTFControlType::FLAG, RTFKeyword::LEVELPICTURENOSIZE, 0 },
- { "levelprev", RTFControlType::VALUE, RTFKeyword::LEVELPREV, 0 },
- { "levelprevspace", RTFControlType::VALUE, RTFKeyword::LEVELPREVSPACE, 0 },
- { "levelspace", RTFControlType::VALUE, RTFKeyword::LEVELSPACE, 0 },
- { "levelstartat", RTFControlType::VALUE, RTFKeyword::LEVELSTARTAT, 0 },
- { "leveltemplateid", RTFControlType::VALUE, RTFKeyword::LEVELTEMPLATEID, 0 },
- { "leveltext", RTFControlType::DESTINATION, RTFKeyword::LEVELTEXT, 0 },
- { "lfolevel", RTFControlType::DESTINATION, RTFKeyword::LFOLEVEL, 0 },
- { "li", RTFControlType::VALUE, RTFKeyword::LI, 0 },
- { "line", RTFControlType::SYMBOL, RTFKeyword::LINE, 0 },
- { "linebetcol", RTFControlType::FLAG, RTFKeyword::LINEBETCOL, 0 },
- { "linecont", RTFControlType::FLAG, RTFKeyword::LINECONT, 0 },
- { "linemod", RTFControlType::VALUE, RTFKeyword::LINEMOD, 1 },
- { "lineppage", RTFControlType::FLAG, RTFKeyword::LINEPPAGE, 0 },
- { "linerestart", RTFControlType::FLAG, RTFKeyword::LINERESTART, 0 },
- { "linestart", RTFControlType::VALUE, RTFKeyword::LINESTART, 1 },
- { "linestarts", RTFControlType::VALUE, RTFKeyword::LINESTARTS, 1 },
- { "linex", RTFControlType::VALUE, RTFKeyword::LINEX, 360 },
- { "linkself", RTFControlType::FLAG, RTFKeyword::LINKSELF, 0 },
- { "linkstyles", RTFControlType::FLAG, RTFKeyword::LINKSTYLES, 0 },
- { "linkval", RTFControlType::DESTINATION, RTFKeyword::LINKVAL, 0 },
- { "lin", RTFControlType::VALUE, RTFKeyword::LIN, 0 },
- { "lisa", RTFControlType::VALUE, RTFKeyword::LISA, 0 },
- { "lisb", RTFControlType::VALUE, RTFKeyword::LISB, 0 },
- { "list", RTFControlType::DESTINATION, RTFKeyword::LIST, 0 },
- { "listhybrid", RTFControlType::FLAG, RTFKeyword::LISTHYBRID, 0 },
- { "listid", RTFControlType::VALUE, RTFKeyword::LISTID, 0 },
- { "listlevel", RTFControlType::DESTINATION, RTFKeyword::LISTLEVEL, 0 },
- { "listname", RTFControlType::DESTINATION, RTFKeyword::LISTNAME, 0 },
- { "listoverride", RTFControlType::DESTINATION, RTFKeyword::LISTOVERRIDE, 0 },
- { "listoverridecount", RTFControlType::VALUE, RTFKeyword::LISTOVERRIDECOUNT, 0 },
- { "listoverrideformat", RTFControlType::VALUE, RTFKeyword::LISTOVERRIDEFORMAT, 0 },
- { "listoverridestartat", RTFControlType::FLAG, RTFKeyword::LISTOVERRIDESTARTAT, 0 },
- { "listoverridetable", RTFControlType::DESTINATION, RTFKeyword::LISTOVERRIDETABLE, 0 },
- { "listpicture", RTFControlType::DESTINATION, RTFKeyword::LISTPICTURE, 0 },
- { "listrestarthdn", RTFControlType::VALUE, RTFKeyword::LISTRESTARTHDN, 0 },
- { "listsimple", RTFControlType::VALUE, RTFKeyword::LISTSIMPLE, 0 },
- { "liststyleid", RTFControlType::VALUE, RTFKeyword::LISTSTYLEID, 0 },
- { "liststylename", RTFControlType::DESTINATION, RTFKeyword::LISTSTYLENAME, 0 },
- { "listtable", RTFControlType::DESTINATION, RTFKeyword::LISTTABLE, 0 },
- { "listtemplateid", RTFControlType::VALUE, RTFKeyword::LISTTEMPLATEID, 0 },
- { "listtext", RTFControlType::DESTINATION, RTFKeyword::LISTTEXT, 0 },
- { "lnbrkrule", RTFControlType::FLAG, RTFKeyword::LNBRKRULE, 0 },
- { "lndscpsxn", RTFControlType::FLAG, RTFKeyword::LNDSCPSXN, 0 },
- { "lnongrid", RTFControlType::FLAG, RTFKeyword::LNONGRID, 0 },
- { "loch", RTFControlType::FLAG, RTFKeyword::LOCH, 0 },
- { "lquote", RTFControlType::SYMBOL, RTFKeyword::LQUOTE, 0 },
- { "ls", RTFControlType::VALUE, RTFKeyword::LS, 0 },
- { "lsdlocked", RTFControlType::VALUE, RTFKeyword::LSDLOCKED, 0 },
- { "lsdlockeddef", RTFControlType::VALUE, RTFKeyword::LSDLOCKEDDEF, 0 },
- { "lsdlockedexcept", RTFControlType::DESTINATION, RTFKeyword::LSDLOCKEDEXCEPT, 0 },
- { "lsdpriority", RTFControlType::VALUE, RTFKeyword::LSDPRIORITY, 0 },
- { "lsdprioritydef", RTFControlType::VALUE, RTFKeyword::LSDPRIORITYDEF, 0 },
- { "lsdqformat", RTFControlType::VALUE, RTFKeyword::LSDQFORMAT, 0 },
- { "lsdqformatdef", RTFControlType::VALUE, RTFKeyword::LSDQFORMATDEF, 0 },
- { "lsdsemihidden", RTFControlType::VALUE, RTFKeyword::LSDSEMIHIDDEN, 0 },
- { "lsdsemihiddendef", RTFControlType::VALUE, RTFKeyword::LSDSEMIHIDDENDEF, 0 },
- { "lsdstimax", RTFControlType::VALUE, RTFKeyword::LSDSTIMAX, 0 },
- { "lsdunhideused", RTFControlType::VALUE, RTFKeyword::LSDUNHIDEUSED, 0 },
- { "lsdunhideuseddef", RTFControlType::VALUE, RTFKeyword::LSDUNHIDEUSEDDEF, 0 },
- { "ltrch", RTFControlType::FLAG, RTFKeyword::LTRCH, 0 },
- { "ltrdoc", RTFControlType::FLAG, RTFKeyword::LTRDOC, 0 },
- { "ltrmark", RTFControlType::SYMBOL, RTFKeyword::LTRMARK, 0 },
- { "ltrpar", RTFControlType::FLAG, RTFKeyword::LTRPAR, 0 },
- { "ltrrow", RTFControlType::FLAG, RTFKeyword::LTRROW, 0 },
- { "ltrsect", RTFControlType::FLAG, RTFKeyword::LTRSECT, 0 },
- { "lvltentative", RTFControlType::FLAG, RTFKeyword::LVLTENTATIVE, 0 },
- { "lytcalctblwd", RTFControlType::FLAG, RTFKeyword::LYTCALCTBLWD, 0 },
- { "lytexcttp", RTFControlType::FLAG, RTFKeyword::LYTEXCTTP, 0 },
- { "lytprtmet", RTFControlType::FLAG, RTFKeyword::LYTPRTMET, 0 },
- { "lyttblrtgr", RTFControlType::FLAG, RTFKeyword::LYTTBLRTGR, 0 },
- { "mac", RTFControlType::FLAG, RTFKeyword::MAC, 0 },
- { "macc", RTFControlType::DESTINATION, RTFKeyword::MACC, 0 },
- { "maccPr", RTFControlType::DESTINATION, RTFKeyword::MACCPR, 0 },
- { "macpict", RTFControlType::FLAG, RTFKeyword::MACPICT, 0 },
- { "mailmerge", RTFControlType::DESTINATION, RTFKeyword::MAILMERGE, 0 },
- { "makebackup", RTFControlType::FLAG, RTFKeyword::MAKEBACKUP, 0 },
- { "maln", RTFControlType::DESTINATION, RTFKeyword::MALN, 0 },
- { "malnScr", RTFControlType::DESTINATION, RTFKeyword::MALNSCR, 0 },
- { "manager", RTFControlType::DESTINATION, RTFKeyword::MANAGER, 0 },
- { "margb", RTFControlType::VALUE, RTFKeyword::MARGB, 1440 },
- { "margbsxn", RTFControlType::VALUE, RTFKeyword::MARGBSXN, 0 },
- { "margl", RTFControlType::VALUE, RTFKeyword::MARGL, 1800 },
- { "marglsxn", RTFControlType::VALUE, RTFKeyword::MARGLSXN, 0 },
- { "margmirror", RTFControlType::FLAG, RTFKeyword::MARGMIRROR, 0 },
- { "margmirsxn", RTFControlType::FLAG, RTFKeyword::MARGMIRSXN, 0 },
- { "margPr", RTFControlType::DESTINATION, RTFKeyword::MARGPR, 0 },
- { "margr", RTFControlType::VALUE, RTFKeyword::MARGR, 1800 },
- { "margrsxn", RTFControlType::VALUE, RTFKeyword::MARGRSXN, 0 },
- { "margSz", RTFControlType::VALUE, RTFKeyword::MARGSZ, 0 },
- { "margt", RTFControlType::VALUE, RTFKeyword::MARGT, 1440 },
- { "margtsxn", RTFControlType::VALUE, RTFKeyword::MARGTSXN, 0 },
- { "mbar", RTFControlType::DESTINATION, RTFKeyword::MBAR, 0 },
- { "mbarPr", RTFControlType::DESTINATION, RTFKeyword::MBARPR, 0 },
- { "mbaseJc", RTFControlType::DESTINATION, RTFKeyword::MBASEJC, 0 },
- { "mbegChr", RTFControlType::DESTINATION, RTFKeyword::MBEGCHR, 0 },
- { "mborderBox", RTFControlType::DESTINATION, RTFKeyword::MBORDERBOX, 0 },
- { "mborderBoxPr", RTFControlType::DESTINATION, RTFKeyword::MBORDERBOXPR, 0 },
- { "mbox", RTFControlType::DESTINATION, RTFKeyword::MBOX, 0 },
- { "mboxPr", RTFControlType::DESTINATION, RTFKeyword::MBOXPR, 0 },
- { "mbrk", RTFControlType::VALUE, RTFKeyword::MBRK, 0 },
- { "mbrkBin", RTFControlType::VALUE, RTFKeyword::MBRKBIN, 0 },
- { "mbrkBinSub", RTFControlType::VALUE, RTFKeyword::MBRKBINSUB, 0 },
- { "mcGp", RTFControlType::VALUE, RTFKeyword::MCGP, 0 },
- { "mcGpRule", RTFControlType::VALUE, RTFKeyword::MCGPRULE, 0 },
- { "mchr", RTFControlType::DESTINATION, RTFKeyword::MCHR, 0 },
- { "mcount", RTFControlType::DESTINATION, RTFKeyword::MCOUNT, 0 },
- { "mcSp", RTFControlType::VALUE, RTFKeyword::MCSP, 0 },
- { "mctrlPr", RTFControlType::DESTINATION, RTFKeyword::MCTRLPR, 0 },
- { "md", RTFControlType::DESTINATION, RTFKeyword::MD, 0 },
- { "mdefJc", RTFControlType::VALUE, RTFKeyword::MDEFJC, 0 },
- { "mdeg", RTFControlType::DESTINATION, RTFKeyword::MDEG, 0 },
- { "mdegHide", RTFControlType::DESTINATION, RTFKeyword::MDEGHIDE, 0 },
- { "mden", RTFControlType::DESTINATION, RTFKeyword::MDEN, 0 },
- { "mdiff", RTFControlType::DESTINATION, RTFKeyword::MDIFF, 0 },
- { "mdiffSty", RTFControlType::VALUE, RTFKeyword::MDIFFSTY, 0 },
- { "mdispdef", RTFControlType::VALUE, RTFKeyword::MDISPDEF, 1 },
- { "mdPr", RTFControlType::DESTINATION, RTFKeyword::MDPR, 0 },
- { "me", RTFControlType::DESTINATION, RTFKeyword::ME, 0 },
- { "mendChr", RTFControlType::DESTINATION, RTFKeyword::MENDCHR, 0 },
- { "meqArr", RTFControlType::DESTINATION, RTFKeyword::MEQARR, 0 },
- { "meqArrPr", RTFControlType::DESTINATION, RTFKeyword::MEQARRPR, 0 },
- { "mf", RTFControlType::DESTINATION, RTFKeyword::MF, 0 },
- { "mfName", RTFControlType::DESTINATION, RTFKeyword::MFNAME, 0 },
- { "mfPr", RTFControlType::DESTINATION, RTFKeyword::MFPR, 0 },
- { "mfunc", RTFControlType::DESTINATION, RTFKeyword::MFUNC, 0 },
- { "mfuncPr", RTFControlType::DESTINATION, RTFKeyword::MFUNCPR, 0 },
- { "mgroupChr", RTFControlType::DESTINATION, RTFKeyword::MGROUPCHR, 0 },
- { "mgroupChrPr", RTFControlType::DESTINATION, RTFKeyword::MGROUPCHRPR, 0 },
- { "mgrow", RTFControlType::DESTINATION, RTFKeyword::MGROW, 0 },
- { "mhideBot", RTFControlType::DESTINATION, RTFKeyword::MHIDEBOT, 0 },
- { "mhideLeft", RTFControlType::DESTINATION, RTFKeyword::MHIDELEFT, 0 },
- { "mhideRight", RTFControlType::DESTINATION, RTFKeyword::MHIDERIGHT, 0 },
- { "mhideTop", RTFControlType::DESTINATION, RTFKeyword::MHIDETOP, 0 },
- { "mhtmltag", RTFControlType::DESTINATION, RTFKeyword::MHTMLTAG, 0 },
- { "min", RTFControlType::VALUE, RTFKeyword::MIN, 0 },
- { "minterSp", RTFControlType::VALUE, RTFKeyword::MINTERSP, 0 },
- { "mintLim", RTFControlType::VALUE, RTFKeyword::MINTLIM, 0 },
- { "mintraSp", RTFControlType::VALUE, RTFKeyword::MINTRASP, 0 },
- { "mjc", RTFControlType::VALUE, RTFKeyword::MJC, 0 },
- { "mlim", RTFControlType::DESTINATION, RTFKeyword::MLIM, 0 },
- { "mlimloc", RTFControlType::DESTINATION, RTFKeyword::MLIMLOC, 0 },
- { "mlimLoc", RTFControlType::DESTINATION, RTFKeyword::MLIMLOC, 0 },
- { "mlimlow", RTFControlType::DESTINATION, RTFKeyword::MLIMLOW, 0 },
- { "mlimLow", RTFControlType::DESTINATION, RTFKeyword::MLIMLOW, 0 },
- { "mlimlowPr", RTFControlType::DESTINATION, RTFKeyword::MLIMLOWPR, 0 },
- { "mlimLowPr", RTFControlType::DESTINATION, RTFKeyword::MLIMLOWPR, 0 },
- { "mlimupp", RTFControlType::DESTINATION, RTFKeyword::MLIMUPP, 0 },
- { "mlimUpp", RTFControlType::DESTINATION, RTFKeyword::MLIMUPP, 0 },
- { "mlimuppPr", RTFControlType::DESTINATION, RTFKeyword::MLIMUPPPR, 0 },
- { "mlimUppPr", RTFControlType::DESTINATION, RTFKeyword::MLIMUPPPR, 0 },
- { "mlit", RTFControlType::FLAG, RTFKeyword::MLIT, 0 },
- { "mlMargin", RTFControlType::VALUE, RTFKeyword::MLMARGIN, 0 },
- { "mm", RTFControlType::DESTINATION, RTFKeyword::MM, 0 },
- { "mmaddfieldname", RTFControlType::DESTINATION, RTFKeyword::MMADDFIELDNAME, 0 },
- { "mmath", RTFControlType::DESTINATION, RTFKeyword::MMATH, 0 },
- { "mmathFont", RTFControlType::VALUE, RTFKeyword::MMATHFONT, 0 },
- { "mmathPict", RTFControlType::DESTINATION, RTFKeyword::MMATHPICT, 0 },
- { "mmathPr", RTFControlType::DESTINATION, RTFKeyword::MMATHPR, 0 },
- { "mmattach", RTFControlType::FLAG, RTFKeyword::MMATTACH, 0 },
- { "mmaxdist", RTFControlType::DESTINATION, RTFKeyword::MMAXDIST, 0 },
- { "mmblanklines", RTFControlType::FLAG, RTFKeyword::MMBLANKLINES, 0 },
- { "mmc", RTFControlType::DESTINATION, RTFKeyword::MMC, 0 },
- { "mmcJc", RTFControlType::DESTINATION, RTFKeyword::MMCJC, 0 },
- { "mmconnectstr", RTFControlType::DESTINATION, RTFKeyword::MMCONNECTSTR, 0 },
- { "mmconnectstrdata", RTFControlType::DESTINATION, RTFKeyword::MMCONNECTSTRDATA, 0 },
- { "mmcPr", RTFControlType::DESTINATION, RTFKeyword::MMCPR, 0 },
- { "mmcs", RTFControlType::DESTINATION, RTFKeyword::MMCS, 0 },
- { "mmdatasource", RTFControlType::DESTINATION, RTFKeyword::MMDATASOURCE, 0 },
- { "mmdatatypeaccess", RTFControlType::FLAG, RTFKeyword::MMDATATYPEACCESS, 0 },
- { "mmdatatypeexcel", RTFControlType::FLAG, RTFKeyword::MMDATATYPEEXCEL, 0 },
- { "mmdatatypefile", RTFControlType::FLAG, RTFKeyword::MMDATATYPEFILE, 0 },
- { "mmdatatypeodbc", RTFControlType::FLAG, RTFKeyword::MMDATATYPEODBC, 0 },
- { "mmdatatypeodso", RTFControlType::FLAG, RTFKeyword::MMDATATYPEODSO, 0 },
- { "mmdatatypeqt", RTFControlType::FLAG, RTFKeyword::MMDATATYPEQT, 0 },
- { "mmdefaultsql", RTFControlType::FLAG, RTFKeyword::MMDEFAULTSQL, 0 },
- { "mmdestemail", RTFControlType::FLAG, RTFKeyword::MMDESTEMAIL, 0 },
- { "mmdestfax", RTFControlType::FLAG, RTFKeyword::MMDESTFAX, 0 },
- { "mmdestnewdoc", RTFControlType::FLAG, RTFKeyword::MMDESTNEWDOC, 0 },
- { "mmdestprinter", RTFControlType::FLAG, RTFKeyword::MMDESTPRINTER, 0 },
- { "mmerrors", RTFControlType::VALUE, RTFKeyword::MMERRORS, 0 },
- { "mmfttypeaddress", RTFControlType::FLAG, RTFKeyword::MMFTTYPEADDRESS, 0 },
- { "mmfttypebarcode", RTFControlType::FLAG, RTFKeyword::MMFTTYPEBARCODE, 0 },
- { "mmfttypedbcolumn", RTFControlType::FLAG, RTFKeyword::MMFTTYPEDBCOLUMN, 0 },
- { "mmfttypemapped", RTFControlType::FLAG, RTFKeyword::MMFTTYPEMAPPED, 0 },
- { "mmfttypenull", RTFControlType::FLAG, RTFKeyword::MMFTTYPENULL, 0 },
- { "mmfttypesalutation", RTFControlType::FLAG, RTFKeyword::MMFTTYPESALUTATION, 0 },
- { "mmheadersource", RTFControlType::DESTINATION, RTFKeyword::MMHEADERSOURCE, 0 },
- { "mmjdsotype", RTFControlType::VALUE, RTFKeyword::MMJDSOTYPE, 0 },
- { "mmlinktoquery", RTFControlType::FLAG, RTFKeyword::MMLINKTOQUERY, 0 },
- { "mmmailsubject", RTFControlType::DESTINATION, RTFKeyword::MMMAILSUBJECT, 0 },
- { "mmmaintypecatalog", RTFControlType::FLAG, RTFKeyword::MMMAINTYPECATALOG, 0 },
- { "mmmaintypeemail", RTFControlType::FLAG, RTFKeyword::MMMAINTYPEEMAIL, 0 },
- { "mmmaintypeenvelopes", RTFControlType::FLAG, RTFKeyword::MMMAINTYPEENVELOPES, 0 },
- { "mmmaintypefax", RTFControlType::FLAG, RTFKeyword::MMMAINTYPEFAX, 0 },
- { "mmmaintypelabels", RTFControlType::FLAG, RTFKeyword::MMMAINTYPELABELS, 0 },
- { "mmmaintypeletters", RTFControlType::FLAG, RTFKeyword::MMMAINTYPELETTERS, 0 },
- { "mmodso", RTFControlType::DESTINATION, RTFKeyword::MMODSO, 0 },
- { "mmodsoactive", RTFControlType::VALUE, RTFKeyword::MMODSOACTIVE, 0 },
- { "mmodsocoldelim", RTFControlType::VALUE, RTFKeyword::MMODSOCOLDELIM, 0 },
- { "mmodsocolumn", RTFControlType::VALUE, RTFKeyword::MMODSOCOLUMN, 0 },
- { "mmodsodynaddr", RTFControlType::VALUE, RTFKeyword::MMODSODYNADDR, 0 },
- { "mmodsofhdr", RTFControlType::VALUE, RTFKeyword::MMODSOFHDR, 0 },
- { "mmodsofilter", RTFControlType::DESTINATION, RTFKeyword::MMODSOFILTER, 0 },
- { "mmodsofldmpdata", RTFControlType::DESTINATION, RTFKeyword::MMODSOFLDMPDATA, 0 },
- { "mmodsofmcolumn", RTFControlType::VALUE, RTFKeyword::MMODSOFMCOLUMN, 0 },
- { "mmodsohash", RTFControlType::VALUE, RTFKeyword::MMODSOHASH, 0 },
- { "mmodsolid", RTFControlType::VALUE, RTFKeyword::MMODSOLID, 0 },
- { "mmodsomappedname", RTFControlType::DESTINATION, RTFKeyword::MMODSOMAPPEDNAME, 0 },
- { "mmodsoname", RTFControlType::DESTINATION, RTFKeyword::MMODSONAME, 0 },
- { "mmodsorecipdata", RTFControlType::DESTINATION, RTFKeyword::MMODSORECIPDATA, 0 },
- { "mmodsosort", RTFControlType::DESTINATION, RTFKeyword::MMODSOSORT, 0 },
- { "mmodsosrc", RTFControlType::DESTINATION, RTFKeyword::MMODSOSRC, 0 },
- { "mmodsotable", RTFControlType::DESTINATION, RTFKeyword::MMODSOTABLE, 0 },
- { "mmodsoudl", RTFControlType::DESTINATION, RTFKeyword::MMODSOUDL, 0 },
- { "mmodsoudldata", RTFControlType::DESTINATION, RTFKeyword::MMODSOUDLDATA, 0 },
- { "mmodsouniquetag", RTFControlType::DESTINATION, RTFKeyword::MMODSOUNIQUETAG, 0 },
- { "mmPr", RTFControlType::DESTINATION, RTFKeyword::MMPR, 0 },
- { "mmquery", RTFControlType::DESTINATION, RTFKeyword::MMQUERY, 0 },
- { "mmr", RTFControlType::DESTINATION, RTFKeyword::MMR, 0 },
- { "mmreccur", RTFControlType::VALUE, RTFKeyword::MMRECCUR, 0 },
- { "mmshowdata", RTFControlType::FLAG, RTFKeyword::MMSHOWDATA, 0 },
- { "mnary", RTFControlType::DESTINATION, RTFKeyword::MNARY, 0 },
- { "mnaryLim", RTFControlType::VALUE, RTFKeyword::MNARYLIM, 0 },
- { "mnaryPr", RTFControlType::DESTINATION, RTFKeyword::MNARYPR, 0 },
- { "mnoBreak", RTFControlType::DESTINATION, RTFKeyword::MNOBREAK, 0 },
- { "mnor", RTFControlType::FLAG, RTFKeyword::MNOR, 0 },
- { "mnum", RTFControlType::DESTINATION, RTFKeyword::MNUM, 0 },
- { "mo", RTFControlType::VALUE, RTFKeyword::MO, 0 },
- { "mobjDist", RTFControlType::DESTINATION, RTFKeyword::MOBJDIST, 0 },
- { "moMath", RTFControlType::DESTINATION, RTFKeyword::MOMATH, 0 },
- { "moMathPara", RTFControlType::DESTINATION, RTFKeyword::MOMATHPARA, 0 },
- { "moMathParaPr", RTFControlType::DESTINATION, RTFKeyword::MOMATHPARAPR, 0 },
- { "mopEmu", RTFControlType::DESTINATION, RTFKeyword::MOPEMU, 0 },
- { "mphant", RTFControlType::DESTINATION, RTFKeyword::MPHANT, 0 },
- { "mphantPr", RTFControlType::DESTINATION, RTFKeyword::MPHANTPR, 0 },
- { "mplcHide", RTFControlType::DESTINATION, RTFKeyword::MPLCHIDE, 0 },
- { "mpos", RTFControlType::DESTINATION, RTFKeyword::MPOS, 0 },
- { "mpostSp", RTFControlType::VALUE, RTFKeyword::MPOSTSP, 0 },
- { "mpreSp", RTFControlType::VALUE, RTFKeyword::MPRESP, 0 },
- { "mr", RTFControlType::DESTINATION, RTFKeyword::MR, 0 },
- { "mrad", RTFControlType::DESTINATION, RTFKeyword::MRAD, 0 },
- { "mradPr", RTFControlType::DESTINATION, RTFKeyword::MRADPR, 0 },
- { "mrMargin", RTFControlType::VALUE, RTFKeyword::MRMARGIN, 0 },
- { "mrPr", RTFControlType::DESTINATION, RTFKeyword::MRPR, 0 },
- { "mrSp", RTFControlType::VALUE, RTFKeyword::MRSP, 0 },
- { "mrSpRule", RTFControlType::VALUE, RTFKeyword::MRSPRULE, 0 },
- { "mscr", RTFControlType::VALUE, RTFKeyword::MSCR, 0 },
- { "msepChr", RTFControlType::DESTINATION, RTFKeyword::MSEPCHR, 0 },
- { "mshow", RTFControlType::DESTINATION, RTFKeyword::MSHOW, 0 },
- { "mshp", RTFControlType::DESTINATION, RTFKeyword::MSHP, 0 },
- { "msmallFrac", RTFControlType::VALUE, RTFKeyword::MSMALLFRAC, 0 },
- { "msmcap", RTFControlType::FLAG, RTFKeyword::MSMCAP, 0 },
- { "msPre", RTFControlType::DESTINATION, RTFKeyword::MSPRE, 0 },
- { "msPrePr", RTFControlType::DESTINATION, RTFKeyword::MSPREPR, 0 },
- { "msSub", RTFControlType::DESTINATION, RTFKeyword::MSSUB, 0 },
- { "msSubPr", RTFControlType::DESTINATION, RTFKeyword::MSSUBPR, 0 },
- { "msSubSup", RTFControlType::DESTINATION, RTFKeyword::MSSUBSUP, 0 },
- { "msSubSupPr", RTFControlType::DESTINATION, RTFKeyword::MSSUBSUPPR, 0 },
- { "msSup", RTFControlType::DESTINATION, RTFKeyword::MSSUP, 0 },
- { "msSupPr", RTFControlType::DESTINATION, RTFKeyword::MSSUPPR, 0 },
- { "mstrikeBLTR", RTFControlType::DESTINATION, RTFKeyword::MSTRIKEBLTR, 0 },
- { "mstrikeH", RTFControlType::DESTINATION, RTFKeyword::MSTRIKEH, 0 },
- { "mstrikeTLBR", RTFControlType::DESTINATION, RTFKeyword::MSTRIKETLBR, 0 },
- { "mstrikeV", RTFControlType::DESTINATION, RTFKeyword::MSTRIKEV, 0 },
- { "msty", RTFControlType::VALUE, RTFKeyword::MSTY, 0 },
- { "msub", RTFControlType::DESTINATION, RTFKeyword::MSUB, 0 },
- { "msubHide", RTFControlType::DESTINATION, RTFKeyword::MSUBHIDE, 0 },
- { "msup", RTFControlType::DESTINATION, RTFKeyword::MSUP, 0 },
- { "msupHide", RTFControlType::DESTINATION, RTFKeyword::MSUPHIDE, 0 },
- { "mtransp", RTFControlType::DESTINATION, RTFKeyword::MTRANSP, 0 },
- { "mtype", RTFControlType::DESTINATION, RTFKeyword::MTYPE, 0 },
- { "muser", RTFControlType::FLAG, RTFKeyword::MUSER, 0 },
- { "mvauth", RTFControlType::VALUE, RTFKeyword::MVAUTH, 0 },
- { "mvdate", RTFControlType::VALUE, RTFKeyword::MVDATE, 0 },
- { "mvertJc", RTFControlType::DESTINATION, RTFKeyword::MVERTJC, 0 },
- { "mvf", RTFControlType::FLAG, RTFKeyword::MVF, 0 },
- { "mvfmf", RTFControlType::DESTINATION, RTFKeyword::MVFMF, 0 },
- { "mvfml", RTFControlType::DESTINATION, RTFKeyword::MVFML, 0 },
- { "mvt", RTFControlType::FLAG, RTFKeyword::MVT, 0 },
- { "mvtof", RTFControlType::DESTINATION, RTFKeyword::MVTOF, 0 },
- { "mvtol", RTFControlType::DESTINATION, RTFKeyword::MVTOL, 0 },
- { "mwrapIndent", RTFControlType::VALUE, RTFKeyword::MWRAPINDENT, 1440 },
- { "mwrapRight", RTFControlType::VALUE, RTFKeyword::MWRAPRIGHT, 0 },
- { "mzeroAsc", RTFControlType::DESTINATION, RTFKeyword::MZEROASC, 0 },
- { "mzeroDesc", RTFControlType::DESTINATION, RTFKeyword::MZERODESC, 0 },
- { "mzeroWid", RTFControlType::DESTINATION, RTFKeyword::MZEROWID, 0 },
- { "nestcell", RTFControlType::SYMBOL, RTFKeyword::NESTCELL, 0 },
- { "nestrow", RTFControlType::SYMBOL, RTFKeyword::NESTROW, 0 },
- { "nesttableprops", RTFControlType::DESTINATION, RTFKeyword::NESTTABLEPROPS, 0 },
- { "newtblstyruls", RTFControlType::FLAG, RTFKeyword::NEWTBLSTYRULS, 0 },
- { "nextfile", RTFControlType::DESTINATION, RTFKeyword::NEXTFILE, 0 },
- { "noafcnsttbl", RTFControlType::FLAG, RTFKeyword::NOAFCNSTTBL, 0 },
- { "nobrkwrptbl", RTFControlType::FLAG, RTFKeyword::NOBRKWRPTBL, 0 },
- { "nocolbal", RTFControlType::FLAG, RTFKeyword::NOCOLBAL, 0 },
- { "nocompatoptions", RTFControlType::FLAG, RTFKeyword::NOCOMPATOPTIONS, 0 },
- { "nocwrap", RTFControlType::FLAG, RTFKeyword::NOCWRAP, 0 },
- { "nocxsptable", RTFControlType::FLAG, RTFKeyword::NOCXSPTABLE, 0 },
- { "noextrasprl", RTFControlType::FLAG, RTFKeyword::NOEXTRASPRL, 0 },
- { "nofchars", RTFControlType::VALUE, RTFKeyword::NOFCHARS, 0 },
- { "nofcharsws", RTFControlType::VALUE, RTFKeyword::NOFCHARSWS, 0 },
- { "nofeaturethrottle", RTFControlType::FLAG, RTFKeyword::NOFEATURETHROTTLE, 0 },
- { "nofpages", RTFControlType::VALUE, RTFKeyword::NOFPAGES, 0 },
- { "nofwords", RTFControlType::VALUE, RTFKeyword::NOFWORDS, 0 },
- { "nogrowautofit", RTFControlType::FLAG, RTFKeyword::NOGROWAUTOFIT, 0 },
- { "noindnmbrts", RTFControlType::FLAG, RTFKeyword::NOINDNMBRTS, 0 },
- { "nojkernpunct", RTFControlType::FLAG, RTFKeyword::NOJKERNPUNCT, 0 },
- { "nolead", RTFControlType::FLAG, RTFKeyword::NOLEAD, 0 },
- { "noline", RTFControlType::FLAG, RTFKeyword::NOLINE, 0 },
- { "nolnhtadjtbl", RTFControlType::FLAG, RTFKeyword::NOLNHTADJTBL, 0 },
- { "nonesttables", RTFControlType::DESTINATION, RTFKeyword::NONESTTABLES, 0 },
- { "nonshppict", RTFControlType::FLAG, RTFKeyword::NONSHPPICT, 0 },
- { "nooverflow", RTFControlType::FLAG, RTFKeyword::NOOVERFLOW, 0 },
- { "noproof", RTFControlType::FLAG, RTFKeyword::NOPROOF, 0 },
- { "noqfpromote", RTFControlType::FLAG, RTFKeyword::NOQFPROMOTE, 0 },
- { "nosectexpand", RTFControlType::FLAG, RTFKeyword::NOSECTEXPAND, 0 },
- { "nosnaplinegrid", RTFControlType::FLAG, RTFKeyword::NOSNAPLINEGRID, 0 },
- { "nospaceforul", RTFControlType::FLAG, RTFKeyword::NOSPACEFORUL, 0 },
- { "nosupersub", RTFControlType::FLAG, RTFKeyword::NOSUPERSUB, 0 },
- { "notabind", RTFControlType::FLAG, RTFKeyword::NOTABIND, 0 },
- { "notbrkcnstfrctbl", RTFControlType::FLAG, RTFKeyword::NOTBRKCNSTFRCTBL, 0 },
- { "notcvasp", RTFControlType::FLAG, RTFKeyword::NOTCVASP, 0 },
- { "notvatxbx", RTFControlType::FLAG, RTFKeyword::NOTVATXBX, 0 },
- { "nouicompat", RTFControlType::FLAG, RTFKeyword::NOUICOMPAT, 0 },
- { "noultrlspc", RTFControlType::FLAG, RTFKeyword::NOULTRLSPC, 0 },
- { "nowidctlpar", RTFControlType::FLAG, RTFKeyword::NOWIDCTLPAR, 0 },
- { "nowrap", RTFControlType::FLAG, RTFKeyword::NOWRAP, 0 },
- { "nowwrap", RTFControlType::FLAG, RTFKeyword::NOWWRAP, 0 },
- { "noxlattoyen", RTFControlType::FLAG, RTFKeyword::NOXLATTOYEN, 0 },
- { "objalias", RTFControlType::DESTINATION, RTFKeyword::OBJALIAS, 0 },
- { "objalign", RTFControlType::VALUE, RTFKeyword::OBJALIGN, 0 },
- { "objattph", RTFControlType::FLAG, RTFKeyword::OBJATTPH, 0 },
- { "objautlink", RTFControlType::FLAG, RTFKeyword::OBJAUTLINK, 0 },
- { "objclass", RTFControlType::DESTINATION, RTFKeyword::OBJCLASS, 0 },
- { "objcropb", RTFControlType::VALUE, RTFKeyword::OBJCROPB, 0 },
- { "objcropl", RTFControlType::VALUE, RTFKeyword::OBJCROPL, 0 },
- { "objcropr", RTFControlType::VALUE, RTFKeyword::OBJCROPR, 0 },
- { "objcropt", RTFControlType::VALUE, RTFKeyword::OBJCROPT, 0 },
- { "objdata", RTFControlType::DESTINATION, RTFKeyword::OBJDATA, 0 },
- { "object", RTFControlType::DESTINATION, RTFKeyword::OBJECT, 0 },
- { "objemb", RTFControlType::FLAG, RTFKeyword::OBJEMB, 0 },
- { "objh", RTFControlType::VALUE, RTFKeyword::OBJH, 0 },
- { "objhtml", RTFControlType::FLAG, RTFKeyword::OBJHTML, 0 },
- { "objicemb", RTFControlType::FLAG, RTFKeyword::OBJICEMB, 0 },
- { "objlink", RTFControlType::FLAG, RTFKeyword::OBJLINK, 0 },
- { "objlock", RTFControlType::FLAG, RTFKeyword::OBJLOCK, 0 },
- { "objname", RTFControlType::DESTINATION, RTFKeyword::OBJNAME, 0 },
- { "objocx", RTFControlType::FLAG, RTFKeyword::OBJOCX, 0 },
- { "objpub", RTFControlType::FLAG, RTFKeyword::OBJPUB, 0 },
- { "objscalex", RTFControlType::VALUE, RTFKeyword::OBJSCALEX, 0 },
- { "objscaley", RTFControlType::VALUE, RTFKeyword::OBJSCALEY, 0 },
- { "objsect", RTFControlType::DESTINATION, RTFKeyword::OBJSECT, 0 },
- { "objsetsize", RTFControlType::FLAG, RTFKeyword::OBJSETSIZE, 0 },
- { "objsub", RTFControlType::FLAG, RTFKeyword::OBJSUB, 0 },
- { "objtime", RTFControlType::DESTINATION, RTFKeyword::OBJTIME, 0 },
- { "objtransy", RTFControlType::VALUE, RTFKeyword::OBJTRANSY, 0 },
- { "objupdate", RTFControlType::FLAG, RTFKeyword::OBJUPDATE, 0 },
- { "objw", RTFControlType::VALUE, RTFKeyword::OBJW, 0 },
- { "ogutter", RTFControlType::VALUE, RTFKeyword::OGUTTER, 0 },
- { "oldas", RTFControlType::FLAG, RTFKeyword::OLDAS, 0 },
- { "oldcprops", RTFControlType::DESTINATION, RTFKeyword::OLDCPROPS, 0 },
- { "oldlinewrap", RTFControlType::FLAG, RTFKeyword::OLDLINEWRAP, 0 },
- { "oldpprops", RTFControlType::DESTINATION, RTFKeyword::OLDPPROPS, 0 },
- { "oldsprops", RTFControlType::DESTINATION, RTFKeyword::OLDSPROPS, 0 },
- { "oldtprops", RTFControlType::DESTINATION, RTFKeyword::OLDTPROPS, 0 },
- { "oleclsid", RTFControlType::DESTINATION, RTFKeyword::OLECLSID, 0 },
- { "operator", RTFControlType::DESTINATION, RTFKeyword::OPERATOR, 0 },
- { "otblrul", RTFControlType::FLAG, RTFKeyword::OTBLRUL, 0 },
- { "outl", RTFControlType::TOGGLE, RTFKeyword::OUTL, 1 },
- { "outlinelevel", RTFControlType::VALUE, RTFKeyword::OUTLINELEVEL, 0 },
- { "overlay", RTFControlType::FLAG, RTFKeyword::OVERLAY, 0 },
- { "page", RTFControlType::SYMBOL, RTFKeyword::PAGE, 0 },
- { "pagebb", RTFControlType::FLAG, RTFKeyword::PAGEBB, 0 },
- { "panose", RTFControlType::DESTINATION, RTFKeyword::PANOSE, 0 },
- { "paperh", RTFControlType::VALUE, RTFKeyword::PAPERH, 15840 },
- { "paperw", RTFControlType::VALUE, RTFKeyword::PAPERW, 12240 },
- { "par", RTFControlType::SYMBOL, RTFKeyword::PAR, 0 },
- { "pararsid", RTFControlType::VALUE, RTFKeyword::PARARSID, 0 },
- { "pard", RTFControlType::FLAG, RTFKeyword::PARD, 0 },
- { "password", RTFControlType::DESTINATION, RTFKeyword::PASSWORD, 0 },
- { "passwordhash", RTFControlType::DESTINATION, RTFKeyword::PASSWORDHASH, 0 },
- { "pc", RTFControlType::FLAG, RTFKeyword::PC, 0 },
- { "pca", RTFControlType::FLAG, RTFKeyword::PCA, 0 },
- { "pgbrdrb", RTFControlType::FLAG, RTFKeyword::PGBRDRB, 0 },
- { "pgbrdrfoot", RTFControlType::FLAG, RTFKeyword::PGBRDRFOOT, 0 },
- { "pgbrdrhead", RTFControlType::FLAG, RTFKeyword::PGBRDRHEAD, 0 },
- { "pgbrdrl", RTFControlType::FLAG, RTFKeyword::PGBRDRL, 0 },
- { "pgbrdropt", RTFControlType::VALUE, RTFKeyword::PGBRDROPT, 0 },
- { "pgbrdrr", RTFControlType::FLAG, RTFKeyword::PGBRDRR, 0 },
- { "pgbrdrsnap", RTFControlType::FLAG, RTFKeyword::PGBRDRSNAP, 0 },
- { "pgbrdrt", RTFControlType::FLAG, RTFKeyword::PGBRDRT, 0 },
- { "pghsxn", RTFControlType::VALUE, RTFKeyword::PGHSXN, 0 },
- { "pgnbidia", RTFControlType::FLAG, RTFKeyword::PGNBIDIA, 0 },
- { "pgnbidib", RTFControlType::FLAG, RTFKeyword::PGNBIDIB, 0 },
- { "pgnchosung", RTFControlType::FLAG, RTFKeyword::PGNCHOSUNG, 0 },
- { "pgncnum", RTFControlType::FLAG, RTFKeyword::PGNCNUM, 0 },
- { "pgncont", RTFControlType::FLAG, RTFKeyword::PGNCONT, 0 },
- { "pgndbnum", RTFControlType::FLAG, RTFKeyword::PGNDBNUM, 0 },
- { "pgndbnumd", RTFControlType::FLAG, RTFKeyword::PGNDBNUMD, 0 },
- { "pgndbnumk", RTFControlType::FLAG, RTFKeyword::PGNDBNUMK, 0 },
- { "pgndbnumt", RTFControlType::FLAG, RTFKeyword::PGNDBNUMT, 0 },
- { "pgndec", RTFControlType::FLAG, RTFKeyword::PGNDEC, 0 },
- { "pgndecd", RTFControlType::FLAG, RTFKeyword::PGNDECD, 0 },
- { "pgnganada", RTFControlType::FLAG, RTFKeyword::PGNGANADA, 0 },
- { "pgngbnum", RTFControlType::FLAG, RTFKeyword::PGNGBNUM, 0 },
- { "pgngbnumd", RTFControlType::FLAG, RTFKeyword::PGNGBNUMD, 0 },
- { "pgngbnumk", RTFControlType::FLAG, RTFKeyword::PGNGBNUMK, 0 },
- { "pgngbnuml", RTFControlType::FLAG, RTFKeyword::PGNGBNUML, 0 },
- { "pgnhindia", RTFControlType::FLAG, RTFKeyword::PGNHINDIA, 0 },
- { "pgnhindib", RTFControlType::FLAG, RTFKeyword::PGNHINDIB, 0 },
- { "pgnhindic", RTFControlType::FLAG, RTFKeyword::PGNHINDIC, 0 },
- { "pgnhindid", RTFControlType::FLAG, RTFKeyword::PGNHINDID, 0 },
- { "pgnhn", RTFControlType::VALUE, RTFKeyword::PGNHN, 0 },
- { "pgnhnsc", RTFControlType::FLAG, RTFKeyword::PGNHNSC, 0 },
- { "pgnhnsh", RTFControlType::FLAG, RTFKeyword::PGNHNSH, 0 },
- { "pgnhnsm", RTFControlType::FLAG, RTFKeyword::PGNHNSM, 0 },
- { "pgnhnsn", RTFControlType::FLAG, RTFKeyword::PGNHNSN, 0 },
- { "pgnhnsp", RTFControlType::FLAG, RTFKeyword::PGNHNSP, 0 },
- { "pgnid", RTFControlType::FLAG, RTFKeyword::PGNID, 0 },
- { "pgnlcltr", RTFControlType::FLAG, RTFKeyword::PGNLCLTR, 0 },
- { "pgnlcrm", RTFControlType::FLAG, RTFKeyword::PGNLCRM, 0 },
- { "pgnrestart", RTFControlType::FLAG, RTFKeyword::PGNRESTART, 0 },
- { "pgnstart", RTFControlType::VALUE, RTFKeyword::PGNSTART, 1 },
- { "pgnstarts", RTFControlType::VALUE, RTFKeyword::PGNSTARTS, 1 },
- { "pgnthaia", RTFControlType::FLAG, RTFKeyword::PGNTHAIA, 0 },
- { "pgnthaib", RTFControlType::FLAG, RTFKeyword::PGNTHAIB, 0 },
- { "pgnthaic", RTFControlType::FLAG, RTFKeyword::PGNTHAIC, 0 },
- { "pgnucltr", RTFControlType::FLAG, RTFKeyword::PGNUCLTR, 0 },
- { "pgnucrm", RTFControlType::FLAG, RTFKeyword::PGNUCRM, 0 },
- { "pgnvieta", RTFControlType::FLAG, RTFKeyword::PGNVIETA, 0 },
- { "pgnx", RTFControlType::VALUE, RTFKeyword::PGNX, 720 },
- { "pgny", RTFControlType::VALUE, RTFKeyword::PGNY, 720 },
- { "pgnzodiac", RTFControlType::FLAG, RTFKeyword::PGNZODIAC, 0 },
- { "pgnzodiacd", RTFControlType::FLAG, RTFKeyword::PGNZODIACD, 0 },
- { "pgnzodiacl", RTFControlType::FLAG, RTFKeyword::PGNZODIACL, 0 },
- { "pgp", RTFControlType::DESTINATION, RTFKeyword::PGP, 0 },
- { "pgptbl", RTFControlType::DESTINATION, RTFKeyword::PGPTBL, 0 },
- { "pgwsxn", RTFControlType::VALUE, RTFKeyword::PGWSXN, 0 },
- { "phcol", RTFControlType::FLAG, RTFKeyword::PHCOL, 0 },
- { "phmrg", RTFControlType::FLAG, RTFKeyword::PHMRG, 0 },
- { "phpg", RTFControlType::FLAG, RTFKeyword::PHPG, 0 },
- { "picbmp", RTFControlType::FLAG, RTFKeyword::PICBMP, 0 },
- { "picbpp", RTFControlType::VALUE, RTFKeyword::PICBPP, 0 },
- { "piccropb", RTFControlType::VALUE, RTFKeyword::PICCROPB, 0 },
- { "piccropl", RTFControlType::VALUE, RTFKeyword::PICCROPL, 0 },
- { "piccropr", RTFControlType::VALUE, RTFKeyword::PICCROPR, 0 },
- { "piccropt", RTFControlType::VALUE, RTFKeyword::PICCROPT, 0 },
- { "pich", RTFControlType::VALUE, RTFKeyword::PICH, 0 },
- { "pichgoal", RTFControlType::VALUE, RTFKeyword::PICHGOAL, 0 },
- { "pichGoal", RTFControlType::VALUE, RTFKeyword::PICHGOAL, 0 },
- { "picprop", RTFControlType::DESTINATION, RTFKeyword::PICPROP, 0 },
- { "picscaled", RTFControlType::FLAG, RTFKeyword::PICSCALED, 0 },
- { "picscalex", RTFControlType::VALUE, RTFKeyword::PICSCALEX, 100 },
- { "picscaley", RTFControlType::VALUE, RTFKeyword::PICSCALEY, 100 },
- { "pict", RTFControlType::DESTINATION, RTFKeyword::PICT, 0 },
- { "picw", RTFControlType::VALUE, RTFKeyword::PICW, 0 },
- { "picwgoal", RTFControlType::VALUE, RTFKeyword::PICWGOAL, 0 },
- { "picwGoal", RTFControlType::VALUE, RTFKeyword::PICWGOAL, 0 },
- { "pindtabqc", RTFControlType::FLAG, RTFKeyword::PINDTABQC, 0 },
- { "pindtabql", RTFControlType::FLAG, RTFKeyword::PINDTABQL, 0 },
- { "pindtabqr", RTFControlType::FLAG, RTFKeyword::PINDTABQR, 0 },
- { "plain", RTFControlType::FLAG, RTFKeyword::PLAIN, 0 },
- { "pmartabqc", RTFControlType::FLAG, RTFKeyword::PMARTABQC, 0 },
- { "pmartabql", RTFControlType::FLAG, RTFKeyword::PMARTABQL, 0 },
- { "pmartabqr", RTFControlType::FLAG, RTFKeyword::PMARTABQR, 0 },
- { "pmmetafile", RTFControlType::VALUE, RTFKeyword::PMMETAFILE, 0 },
- { "pn", RTFControlType::DESTINATION, RTFKeyword::PN, 0 },
- { "pnacross", RTFControlType::FLAG, RTFKeyword::PNACROSS, 0 },
- { "pnaiu", RTFControlType::FLAG, RTFKeyword::PNAIU, 0 },
- { "pnaiud", RTFControlType::FLAG, RTFKeyword::PNAIUD, 0 },
- { "pnaiueo", RTFControlType::FLAG, RTFKeyword::PNAIUEO, 0 },
- { "pnaiueod", RTFControlType::FLAG, RTFKeyword::PNAIUEOD, 0 },
- { "pnb", RTFControlType::TOGGLE, RTFKeyword::PNB, 1 },
- { "pnbidia", RTFControlType::FLAG, RTFKeyword::PNBIDIA, 0 },
- { "pnbidib", RTFControlType::FLAG, RTFKeyword::PNBIDIB, 0 },
- { "pncaps", RTFControlType::TOGGLE, RTFKeyword::PNCAPS, 1 },
- { "pncard", RTFControlType::FLAG, RTFKeyword::PNCARD, 0 },
- { "pncf", RTFControlType::VALUE, RTFKeyword::PNCF, 0 },
- { "pnchosung", RTFControlType::FLAG, RTFKeyword::PNCHOSUNG, 0 },
- { "pncnum", RTFControlType::FLAG, RTFKeyword::PNCNUM, 0 },
- { "pndbnum", RTFControlType::FLAG, RTFKeyword::PNDBNUM, 0 },
- { "pndbnumd", RTFControlType::FLAG, RTFKeyword::PNDBNUMD, 0 },
- { "pndbnumk", RTFControlType::FLAG, RTFKeyword::PNDBNUMK, 0 },
- { "pndbnuml", RTFControlType::FLAG, RTFKeyword::PNDBNUML, 0 },
- { "pndbnumt", RTFControlType::FLAG, RTFKeyword::PNDBNUMT, 0 },
- { "pndec", RTFControlType::FLAG, RTFKeyword::PNDEC, 0 },
- { "pndecd", RTFControlType::FLAG, RTFKeyword::PNDECD, 0 },
- { "pnf", RTFControlType::VALUE, RTFKeyword::PNF, 0 },
- { "pnfs", RTFControlType::VALUE, RTFKeyword::PNFS, 0 },
- { "pnganada", RTFControlType::FLAG, RTFKeyword::PNGANADA, 0 },
- { "pngblip", RTFControlType::FLAG, RTFKeyword::PNGBLIP, 0 },
- { "pngbnum", RTFControlType::FLAG, RTFKeyword::PNGBNUM, 0 },
- { "pngbnumd", RTFControlType::FLAG, RTFKeyword::PNGBNUMD, 0 },
- { "pngbnumk", RTFControlType::FLAG, RTFKeyword::PNGBNUMK, 0 },
- { "pngbnuml", RTFControlType::FLAG, RTFKeyword::PNGBNUML, 0 },
- { "pnhang", RTFControlType::FLAG, RTFKeyword::PNHANG, 0 },
- { "pni", RTFControlType::TOGGLE, RTFKeyword::PNI, 1 },
- { "pnindent", RTFControlType::VALUE, RTFKeyword::PNINDENT, 0 },
- { "pniroha", RTFControlType::FLAG, RTFKeyword::PNIROHA, 0 },
- { "pnirohad", RTFControlType::FLAG, RTFKeyword::PNIROHAD, 0 },
- { "pnlcltr", RTFControlType::FLAG, RTFKeyword::PNLCLTR, 0 },
- { "pnlcrm", RTFControlType::FLAG, RTFKeyword::PNLCRM, 0 },
- { "pnlvl", RTFControlType::VALUE, RTFKeyword::PNLVL, 0 },
- { "pnlvlblt", RTFControlType::FLAG, RTFKeyword::PNLVLBLT, 0 },
- { "pnlvlbody", RTFControlType::FLAG, RTFKeyword::PNLVLBODY, 0 },
- { "pnlvlcont", RTFControlType::FLAG, RTFKeyword::PNLVLCONT, 0 },
- { "pnnumonce", RTFControlType::FLAG, RTFKeyword::PNNUMONCE, 0 },
- { "pnord", RTFControlType::FLAG, RTFKeyword::PNORD, 0 },
- { "pnordt", RTFControlType::FLAG, RTFKeyword::PNORDT, 0 },
- { "pnprev", RTFControlType::FLAG, RTFKeyword::PNPREV, 0 },
- { "pnqc", RTFControlType::FLAG, RTFKeyword::PNQC, 0 },
- { "pnql", RTFControlType::FLAG, RTFKeyword::PNQL, 0 },
- { "pnqr", RTFControlType::FLAG, RTFKeyword::PNQR, 0 },
- { "pnrauth", RTFControlType::VALUE, RTFKeyword::PNRAUTH, 0 },
- { "pnrdate", RTFControlType::VALUE, RTFKeyword::PNRDATE, 0 },
- { "pnrestart", RTFControlType::FLAG, RTFKeyword::PNRESTART, 0 },
- { "pnrnfc", RTFControlType::VALUE, RTFKeyword::PNRNFC, 0 },
- { "pnrnot", RTFControlType::FLAG, RTFKeyword::PNRNOT, 0 },
- { "pnrpnbr", RTFControlType::VALUE, RTFKeyword::PNRPNBR, 0 },
- { "pnrrgb", RTFControlType::VALUE, RTFKeyword::PNRRGB, 0 },
- { "pnrstart", RTFControlType::VALUE, RTFKeyword::PNRSTART, 0 },
- { "pnrstop", RTFControlType::VALUE, RTFKeyword::PNRSTOP, 0 },
- { "pnrxst", RTFControlType::VALUE, RTFKeyword::PNRXST, 0 },
- { "pnscaps", RTFControlType::TOGGLE, RTFKeyword::PNSCAPS, 1 },
- { "pnseclvl", RTFControlType::DESTINATION, RTFKeyword::PNSECLVL, 0 },
- { "pnsp", RTFControlType::VALUE, RTFKeyword::PNSP, 0 },
- { "pnstart", RTFControlType::VALUE, RTFKeyword::PNSTART, 0 },
- { "pnstrike", RTFControlType::TOGGLE, RTFKeyword::PNSTRIKE, 1 },
- { "pntext", RTFControlType::DESTINATION, RTFKeyword::PNTEXT, 0 },
- { "pntxta", RTFControlType::DESTINATION, RTFKeyword::PNTXTA, 0 },
- { "pntxtb", RTFControlType::DESTINATION, RTFKeyword::PNTXTB, 0 },
- { "pnucltr", RTFControlType::FLAG, RTFKeyword::PNUCLTR, 0 },
- { "pnucrm", RTFControlType::FLAG, RTFKeyword::PNUCRM, 0 },
- { "pnul", RTFControlType::TOGGLE, RTFKeyword::PNUL, 1 },
- { "pnuld", RTFControlType::FLAG, RTFKeyword::PNULD, 0 },
- { "pnuldash", RTFControlType::FLAG, RTFKeyword::PNULDASH, 0 },
- { "pnuldashd", RTFControlType::FLAG, RTFKeyword::PNULDASHD, 0 },
- { "pnuldashdd", RTFControlType::FLAG, RTFKeyword::PNULDASHDD, 0 },
- { "pnuldb", RTFControlType::FLAG, RTFKeyword::PNULDB, 0 },
- { "pnulhair", RTFControlType::FLAG, RTFKeyword::PNULHAIR, 0 },
- { "pnulnone", RTFControlType::FLAG, RTFKeyword::PNULNONE, 0 },
- { "pnulth", RTFControlType::FLAG, RTFKeyword::PNULTH, 0 },
- { "pnulw", RTFControlType::FLAG, RTFKeyword::PNULW, 0 },
- { "pnulwave", RTFControlType::FLAG, RTFKeyword::PNULWAVE, 0 },
- { "pnzodiac", RTFControlType::FLAG, RTFKeyword::PNZODIAC, 0 },
- { "pnzodiacd", RTFControlType::FLAG, RTFKeyword::PNZODIACD, 0 },
- { "pnzodiacl", RTFControlType::FLAG, RTFKeyword::PNZODIACL, 0 },
- { "posnegx", RTFControlType::VALUE, RTFKeyword::POSNEGX, 0 },
- { "posnegy", RTFControlType::VALUE, RTFKeyword::POSNEGY, 0 },
- { "posx", RTFControlType::VALUE, RTFKeyword::POSX, 0 },
- { "posxc", RTFControlType::FLAG, RTFKeyword::POSXC, 0 },
- { "posxi", RTFControlType::FLAG, RTFKeyword::POSXI, 0 },
- { "posxl", RTFControlType::FLAG, RTFKeyword::POSXL, 0 },
- { "posxo", RTFControlType::FLAG, RTFKeyword::POSXO, 0 },
- { "posxr", RTFControlType::FLAG, RTFKeyword::POSXR, 0 },
- { "posy", RTFControlType::VALUE, RTFKeyword::POSY, 0 },
- { "posyb", RTFControlType::FLAG, RTFKeyword::POSYB, 0 },
- { "posyc", RTFControlType::FLAG, RTFKeyword::POSYC, 0 },
- { "posyil", RTFControlType::FLAG, RTFKeyword::POSYIL, 0 },
- { "posyin", RTFControlType::FLAG, RTFKeyword::POSYIN, 0 },
- { "posyout", RTFControlType::FLAG, RTFKeyword::POSYOUT, 0 },
- { "posyt", RTFControlType::FLAG, RTFKeyword::POSYT, 0 },
- { "prauth", RTFControlType::VALUE, RTFKeyword::PRAUTH, 0 },
- { "prcolbl", RTFControlType::FLAG, RTFKeyword::PRCOLBL, 0 },
- { "prdate", RTFControlType::VALUE, RTFKeyword::PRDATE, 0 },
- { "printdata", RTFControlType::FLAG, RTFKeyword::PRINTDATA, 0 },
- { "printim", RTFControlType::DESTINATION, RTFKeyword::PRINTIM, 0 },
- { "private", RTFControlType::DESTINATION, RTFKeyword::PRIVATE, 0 },
- { "propname", RTFControlType::DESTINATION, RTFKeyword::PROPNAME, 0 },
- { "proptype", RTFControlType::VALUE, RTFKeyword::PROPTYPE, 0 },
- { "protect", RTFControlType::TOGGLE, RTFKeyword::PROTECT, 1 },
- { "protend", RTFControlType::DESTINATION, RTFKeyword::PROTEND, 0 },
- { "protlevel", RTFControlType::VALUE, RTFKeyword::PROTLEVEL, 0 },
- { "protstart", RTFControlType::DESTINATION, RTFKeyword::PROTSTART, 0 },
- { "protusertbl", RTFControlType::DESTINATION, RTFKeyword::PROTUSERTBL, 0 },
- { "psover", RTFControlType::FLAG, RTFKeyword::PSOVER, 0 },
- { "psz", RTFControlType::VALUE, RTFKeyword::PSZ, 0 },
- { "ptabldot", RTFControlType::FLAG, RTFKeyword::PTABLDOT, 0 },
- { "ptablmdot", RTFControlType::FLAG, RTFKeyword::PTABLMDOT, 0 },
- { "ptablminus", RTFControlType::FLAG, RTFKeyword::PTABLMINUS, 0 },
- { "ptablnone", RTFControlType::FLAG, RTFKeyword::PTABLNONE, 0 },
- { "ptabluscore", RTFControlType::FLAG, RTFKeyword::PTABLUSCORE, 0 },
- { "pubauto", RTFControlType::FLAG, RTFKeyword::PUBAUTO, 0 },
- { "pvmrg", RTFControlType::FLAG, RTFKeyword::PVMRG, 0 },
- { "pvpara", RTFControlType::FLAG, RTFKeyword::PVPARA, 0 },
- { "pvpg", RTFControlType::FLAG, RTFKeyword::PVPG, 0 },
- { "pwd", RTFControlType::VALUE, RTFKeyword::PWD, 0 },
- { "pxe", RTFControlType::DESTINATION, RTFKeyword::PXE, 0 },
- { "qc", RTFControlType::FLAG, RTFKeyword::QC, 0 },
- { "qd", RTFControlType::FLAG, RTFKeyword::QD, 0 },
- { "qj", RTFControlType::FLAG, RTFKeyword::QJ, 0 },
- { "qk", RTFControlType::VALUE, RTFKeyword::QK, 0 },
- { "ql", RTFControlType::FLAG, RTFKeyword::QL, 0 },
- { "qmspace", RTFControlType::SYMBOL, RTFKeyword::QMSPACE, 0 },
- { "qr", RTFControlType::FLAG, RTFKeyword::QR, 0 },
- { "qt", RTFControlType::FLAG, RTFKeyword::QT, 0 },
- { "rawclbgdkbdiag", RTFControlType::FLAG, RTFKeyword::RAWCLBGDKBDIAG, 0 },
- { "rawclbgbdiag", RTFControlType::FLAG, RTFKeyword::RAWCLBGBDIAG, 0 },
- { "rawclbgcross", RTFControlType::FLAG, RTFKeyword::RAWCLBGCROSS, 0 },
- { "rawclbgdcross", RTFControlType::FLAG, RTFKeyword::RAWCLBGDCROSS, 0 },
- { "rawclbgdkcross", RTFControlType::FLAG, RTFKeyword::RAWCLBGDKCROSS, 0 },
- { "rawclbgdkdcross", RTFControlType::FLAG, RTFKeyword::RAWCLBGDKDCROSS, 0 },
- { "rawclbgdkfdiag", RTFControlType::FLAG, RTFKeyword::RAWCLBGDKFDIAG, 0 },
- { "rawclbgdkhor", RTFControlType::FLAG, RTFKeyword::RAWCLBGDKHOR, 0 },
- { "rawclbgdkvert", RTFControlType::FLAG, RTFKeyword::RAWCLBGDKVERT, 0 },
- { "rawclbgfdiag", RTFControlType::FLAG, RTFKeyword::RAWCLBGFDIAG, 0 },
- { "rawclbghoriz", RTFControlType::FLAG, RTFKeyword::RAWCLBGHORIZ, 0 },
- { "rawclbgvert", RTFControlType::FLAG, RTFKeyword::RAWCLBGVERT, 0 },
- { "rdblquote", RTFControlType::SYMBOL, RTFKeyword::RDBLQUOTE, 0 },
- { "readonlyrecommended", RTFControlType::FLAG, RTFKeyword::READONLYRECOMMENDED, 0 },
- { "readprot", RTFControlType::FLAG, RTFKeyword::READPROT, 0 },
- { "red", RTFControlType::VALUE, RTFKeyword::RED, 0 },
- { "relyonvml", RTFControlType::VALUE, RTFKeyword::RELYONVML, 0 },
- { "remdttm", RTFControlType::FLAG, RTFKeyword::REMDTTM, 0 },
- { "rempersonalinfo", RTFControlType::FLAG, RTFKeyword::REMPERSONALINFO, 0 },
- { "result", RTFControlType::DESTINATION, RTFKeyword::RESULT, 0 },
- { "revauth", RTFControlType::VALUE, RTFKeyword::REVAUTH, 0 },
- { "revauthdel", RTFControlType::VALUE, RTFKeyword::REVAUTHDEL, 0 },
- { "revbar", RTFControlType::VALUE, RTFKeyword::REVBAR, 3 },
- { "revdttm", RTFControlType::VALUE, RTFKeyword::REVDTTM, 0 },
- { "revdttmdel", RTFControlType::VALUE, RTFKeyword::REVDTTMDEL, 0 },
- { "revised", RTFControlType::TOGGLE, RTFKeyword::REVISED, 1 },
- { "revisions", RTFControlType::FLAG, RTFKeyword::REVISIONS, 0 },
- { "revprop", RTFControlType::VALUE, RTFKeyword::REVPROP, 3 },
- { "revprot", RTFControlType::FLAG, RTFKeyword::REVPROT, 0 },
- { "revtbl", RTFControlType::DESTINATION, RTFKeyword::REVTBL, 0 },
- { "revtim", RTFControlType::DESTINATION, RTFKeyword::REVTIM, 0 },
- { "ri", RTFControlType::VALUE, RTFKeyword::RI, 0 },
- { "rin", RTFControlType::VALUE, RTFKeyword::RIN, 0 },
- { "row", RTFControlType::SYMBOL, RTFKeyword::ROW, 0 },
- { "rquote", RTFControlType::SYMBOL, RTFKeyword::RQUOTE, 0 },
- { "rsid", RTFControlType::VALUE, RTFKeyword::RSID, 0 },
- { "rsidroot", RTFControlType::VALUE, RTFKeyword::RSIDROOT, 0 },
- { "rsidtbl", RTFControlType::DESTINATION, RTFKeyword::RSIDTBL, 0 },
- { "rsltbmp", RTFControlType::FLAG, RTFKeyword::RSLTBMP, 0 },
- { "rslthtml", RTFControlType::FLAG, RTFKeyword::RSLTHTML, 0 },
- { "rsltmerge", RTFControlType::FLAG, RTFKeyword::RSLTMERGE, 0 },
- { "rsltpict", RTFControlType::FLAG, RTFKeyword::RSLTPICT, 0 },
- { "rsltrtf", RTFControlType::FLAG, RTFKeyword::RSLTRTF, 0 },
- { "rslttxt", RTFControlType::FLAG, RTFKeyword::RSLTTXT, 0 },
- { "rtf", RTFControlType::DESTINATION, RTFKeyword::RTF, 0 },
- { "rtlch", RTFControlType::FLAG, RTFKeyword::RTLCH, 0 },
- { "rtldoc", RTFControlType::FLAG, RTFKeyword::RTLDOC, 0 },
- { "rtlgutter", RTFControlType::FLAG, RTFKeyword::RTLGUTTER, 0 },
- { "rtlmark", RTFControlType::SYMBOL, RTFKeyword::RTLMARK, 0 },
- { "rtlpar", RTFControlType::FLAG, RTFKeyword::RTLPAR, 0 },
- { "rtlrow", RTFControlType::FLAG, RTFKeyword::RTLROW, 0 },
- { "rtlsect", RTFControlType::FLAG, RTFKeyword::RTLSECT, 0 },
- { "rxe", RTFControlType::DESTINATION, RTFKeyword::RXE, 0 },
- { "s", RTFControlType::VALUE, RTFKeyword::S, 0 },
- { "sa", RTFControlType::VALUE, RTFKeyword::SA, 0 },
- { "saauto", RTFControlType::TOGGLE, RTFKeyword::SAAUTO, 1 },
- { "saftnnalc", RTFControlType::FLAG, RTFKeyword::SAFTNNALC, 0 },
- { "saftnnar", RTFControlType::FLAG, RTFKeyword::SAFTNNAR, 0 },
- { "saftnnauc", RTFControlType::FLAG, RTFKeyword::SAFTNNAUC, 0 },
- { "saftnnchi", RTFControlType::FLAG, RTFKeyword::SAFTNNCHI, 0 },
- { "saftnnchosung", RTFControlType::FLAG, RTFKeyword::SAFTNNCHOSUNG, 0 },
- { "saftnncnum", RTFControlType::FLAG, RTFKeyword::SAFTNNCNUM, 0 },
- { "saftnndbar", RTFControlType::FLAG, RTFKeyword::SAFTNNDBAR, 0 },
- { "saftnndbnum", RTFControlType::FLAG, RTFKeyword::SAFTNNDBNUM, 0 },
- { "saftnndbnumd", RTFControlType::FLAG, RTFKeyword::SAFTNNDBNUMD, 0 },
- { "saftnndbnumk", RTFControlType::FLAG, RTFKeyword::SAFTNNDBNUMK, 0 },
- { "saftnndbnumt", RTFControlType::FLAG, RTFKeyword::SAFTNNDBNUMT, 0 },
- { "saftnnganada", RTFControlType::FLAG, RTFKeyword::SAFTNNGANADA, 0 },
- { "saftnngbnum", RTFControlType::FLAG, RTFKeyword::SAFTNNGBNUM, 0 },
- { "saftnngbnumd", RTFControlType::FLAG, RTFKeyword::SAFTNNGBNUMD, 0 },
- { "saftnngbnumk", RTFControlType::FLAG, RTFKeyword::SAFTNNGBNUMK, 0 },
- { "saftnngbnuml", RTFControlType::FLAG, RTFKeyword::SAFTNNGBNUML, 0 },
- { "saftnnrlc", RTFControlType::FLAG, RTFKeyword::SAFTNNRLC, 0 },
- { "saftnnruc", RTFControlType::FLAG, RTFKeyword::SAFTNNRUC, 0 },
- { "saftnnzodiac", RTFControlType::FLAG, RTFKeyword::SAFTNNZODIAC, 0 },
- { "saftnnzodiacd", RTFControlType::FLAG, RTFKeyword::SAFTNNZODIACD, 0 },
- { "saftnnzodiacl", RTFControlType::FLAG, RTFKeyword::SAFTNNZODIACL, 0 },
- { "saftnrestart", RTFControlType::FLAG, RTFKeyword::SAFTNRESTART, 0 },
- { "saftnrstcont", RTFControlType::FLAG, RTFKeyword::SAFTNRSTCONT, 0 },
- { "saftnstart", RTFControlType::VALUE, RTFKeyword::SAFTNSTART, 1 },
- { "sautoupd", RTFControlType::FLAG, RTFKeyword::SAUTOUPD, 0 },
- { "saveinvalidxml", RTFControlType::FLAG, RTFKeyword::SAVEINVALIDXML, 0 },
- { "saveprevpict", RTFControlType::FLAG, RTFKeyword::SAVEPREVPICT, 0 },
- { "sb", RTFControlType::VALUE, RTFKeyword::SB, 0 },
- { "sbasedon", RTFControlType::VALUE, RTFKeyword::SBASEDON, 222 },
- { "sbauto", RTFControlType::TOGGLE, RTFKeyword::SBAUTO, 1 },
- { "sbkcol", RTFControlType::FLAG, RTFKeyword::SBKCOL, 0 },
- { "sbkeven", RTFControlType::FLAG, RTFKeyword::SBKEVEN, 0 },
- { "sbknone", RTFControlType::FLAG, RTFKeyword::SBKNONE, 0 },
- { "sbkodd", RTFControlType::FLAG, RTFKeyword::SBKODD, 0 },
- { "sbkpage", RTFControlType::FLAG, RTFKeyword::SBKPAGE, 0 },
- { "sbys", RTFControlType::FLAG, RTFKeyword::SBYS, 0 },
- { "scaps", RTFControlType::TOGGLE, RTFKeyword::SCAPS, 1 },
- { "scompose", RTFControlType::FLAG, RTFKeyword::SCOMPOSE, 0 },
- { "sec", RTFControlType::VALUE, RTFKeyword::SEC, 0 },
- { "sect", RTFControlType::SYMBOL, RTFKeyword::SECT, 0 },
- { "sectd", RTFControlType::FLAG, RTFKeyword::SECTD, 0 },
- { "sectdefaultcl", RTFControlType::FLAG, RTFKeyword::SECTDEFAULTCL, 0 },
- { "sectexpand", RTFControlType::VALUE, RTFKeyword::SECTEXPAND, 0 },
- { "sectlinegrid", RTFControlType::VALUE, RTFKeyword::SECTLINEGRID, 0 },
- { "sectnum", RTFControlType::SYMBOL, RTFKeyword::SECTNUM, 0 },
- { "sectrsid", RTFControlType::VALUE, RTFKeyword::SECTRSID, 0 },
- { "sectspecifycl", RTFControlType::FLAG, RTFKeyword::SECTSPECIFYCL, 0 },
- { "sectspecifygenN", RTFControlType::FLAG, RTFKeyword::SECTSPECIFYGENN, 0 },
- { "sectspecifyl", RTFControlType::FLAG, RTFKeyword::SECTSPECIFYL, 0 },
- { "sectunlocked", RTFControlType::FLAG, RTFKeyword::SECTUNLOCKED, 0 },
- { "sftnbj", RTFControlType::FLAG, RTFKeyword::SFTNBJ, 0 },
- { "sftnnalc", RTFControlType::FLAG, RTFKeyword::SFTNNALC, 0 },
- { "sftnnar", RTFControlType::FLAG, RTFKeyword::SFTNNAR, 0 },
- { "sftnnauc", RTFControlType::FLAG, RTFKeyword::SFTNNAUC, 0 },
- { "sftnnchi", RTFControlType::FLAG, RTFKeyword::SFTNNCHI, 0 },
- { "sftnnchosung", RTFControlType::FLAG, RTFKeyword::SFTNNCHOSUNG, 0 },
- { "sftnncnum", RTFControlType::FLAG, RTFKeyword::SFTNNCNUM, 0 },
- { "sftnndbar", RTFControlType::FLAG, RTFKeyword::SFTNNDBAR, 0 },
- { "sftnndbnum", RTFControlType::FLAG, RTFKeyword::SFTNNDBNUM, 0 },
- { "sftnndbnumd", RTFControlType::FLAG, RTFKeyword::SFTNNDBNUMD, 0 },
- { "sftnndbnumk", RTFControlType::FLAG, RTFKeyword::SFTNNDBNUMK, 0 },
- { "sftnndbnumt", RTFControlType::FLAG, RTFKeyword::SFTNNDBNUMT, 0 },
- { "sftnnganada", RTFControlType::FLAG, RTFKeyword::SFTNNGANADA, 0 },
- { "sftnngbnum", RTFControlType::FLAG, RTFKeyword::SFTNNGBNUM, 0 },
- { "sftnngbnumd", RTFControlType::FLAG, RTFKeyword::SFTNNGBNUMD, 0 },
- { "sftnngbnumk", RTFControlType::FLAG, RTFKeyword::SFTNNGBNUMK, 0 },
- { "sftnngbnuml", RTFControlType::FLAG, RTFKeyword::SFTNNGBNUML, 0 },
- { "sftnnrlc", RTFControlType::FLAG, RTFKeyword::SFTNNRLC, 0 },
- { "sftnnruc", RTFControlType::FLAG, RTFKeyword::SFTNNRUC, 0 },
- { "sftnnzodiac", RTFControlType::FLAG, RTFKeyword::SFTNNZODIAC, 0 },
- { "sftnnzodiacd", RTFControlType::FLAG, RTFKeyword::SFTNNZODIACD, 0 },
- { "sftnnzodiacl", RTFControlType::FLAG, RTFKeyword::SFTNNZODIACL, 0 },
- { "sftnrestart", RTFControlType::FLAG, RTFKeyword::SFTNRESTART, 0 },
- { "sftnrstcont", RTFControlType::FLAG, RTFKeyword::SFTNRSTCONT, 0 },
- { "sftnrstpg", RTFControlType::FLAG, RTFKeyword::SFTNRSTPG, 0 },
- { "sftnstart", RTFControlType::VALUE, RTFKeyword::SFTNSTART, 1 },
- { "sftntj", RTFControlType::FLAG, RTFKeyword::SFTNTJ, 0 },
- { "shad", RTFControlType::TOGGLE, RTFKeyword::SHAD, 1 },
- { "shading", RTFControlType::VALUE, RTFKeyword::SHADING, 0 },
- { "shidden", RTFControlType::FLAG, RTFKeyword::SHIDDEN, 0 },
- { "shift", RTFControlType::FLAG, RTFKeyword::SHIFT, 0 },
- { "showplaceholdtext", RTFControlType::VALUE, RTFKeyword::SHOWPLACEHOLDTEXT, 0 },
- { "showxmlerrors", RTFControlType::VALUE, RTFKeyword::SHOWXMLERRORS, 0 },
- { "shp", RTFControlType::DESTINATION, RTFKeyword::SHP, 0 },
- { "shpbottom", RTFControlType::VALUE, RTFKeyword::SHPBOTTOM, 0 },
- { "shpbxcolumn", RTFControlType::FLAG, RTFKeyword::SHPBXCOLUMN, 0 },
- { "shpbxignore", RTFControlType::FLAG, RTFKeyword::SHPBXIGNORE, 0 },
- { "shpbxmargin", RTFControlType::FLAG, RTFKeyword::SHPBXMARGIN, 0 },
- { "shpbxpage", RTFControlType::FLAG, RTFKeyword::SHPBXPAGE, 0 },
- { "shpbyignore", RTFControlType::FLAG, RTFKeyword::SHPBYIGNORE, 0 },
- { "shpbymargin", RTFControlType::FLAG, RTFKeyword::SHPBYMARGIN, 0 },
- { "shpbypage", RTFControlType::FLAG, RTFKeyword::SHPBYPAGE, 0 },
- { "shpbypara", RTFControlType::FLAG, RTFKeyword::SHPBYPARA, 0 },
- { "shpfblwtxt", RTFControlType::VALUE, RTFKeyword::SHPFBLWTXT, 0 },
- { "shpfhdr", RTFControlType::VALUE, RTFKeyword::SHPFHDR, 0 },
- { "shpgrp", RTFControlType::DESTINATION, RTFKeyword::SHPGRP, 0 },
- { "shpinst", RTFControlType::DESTINATION, RTFKeyword::SHPINST, 0 },
- { "shpleft", RTFControlType::VALUE, RTFKeyword::SHPLEFT, 0 },
- { "shplid", RTFControlType::VALUE, RTFKeyword::SHPLID, 0 },
- { "shplockanchor", RTFControlType::FLAG, RTFKeyword::SHPLOCKANCHOR, 0 },
- { "shppict", RTFControlType::DESTINATION, RTFKeyword::SHPPICT, 0 },
- { "shpright", RTFControlType::VALUE, RTFKeyword::SHPRIGHT, 0 },
- { "shprslt", RTFControlType::DESTINATION, RTFKeyword::SHPRSLT, 0 },
- { "shptop", RTFControlType::VALUE, RTFKeyword::SHPTOP, 0 },
- { "shptxt", RTFControlType::DESTINATION, RTFKeyword::SHPTXT, 0 },
- { "shpwrk", RTFControlType::VALUE, RTFKeyword::SHPWRK, 0 },
- { "shpwr", RTFControlType::VALUE, RTFKeyword::SHPWR, 0 },
- { "shpz", RTFControlType::VALUE, RTFKeyword::SHPZ, 0 },
- { "sl", RTFControlType::VALUE, RTFKeyword::SL, 0 },
- { "slink", RTFControlType::VALUE, RTFKeyword::SLINK, 0 },
- { "slmult", RTFControlType::VALUE, RTFKeyword::SLMULT, 0 },
- { "slocked", RTFControlType::FLAG, RTFKeyword::SLOCKED, 0 },
- { "sn", RTFControlType::DESTINATION, RTFKeyword::SN, 0 },
- { "snaptogridincell", RTFControlType::FLAG, RTFKeyword::SNAPTOGRIDINCELL, 0 },
- { "snext", RTFControlType::VALUE, RTFKeyword::SNEXT, 0 },
- { "softcol", RTFControlType::FLAG, RTFKeyword::SOFTCOL, 0 },
- { "softlheight", RTFControlType::VALUE, RTFKeyword::SOFTLHEIGHT, 0 },
- { "softline", RTFControlType::FLAG, RTFKeyword::SOFTLINE, 0 },
- { "softpage", RTFControlType::FLAG, RTFKeyword::SOFTPAGE, 0 },
- { "sp", RTFControlType::DESTINATION, RTFKeyword::SP, 0 },
- { "spersonal", RTFControlType::FLAG, RTFKeyword::SPERSONAL, 0 },
- { "spltpgpar", RTFControlType::FLAG, RTFKeyword::SPLTPGPAR, 0 },
- { "splytwnine", RTFControlType::FLAG, RTFKeyword::SPLYTWNINE, 0 },
- { "spriority", RTFControlType::VALUE, RTFKeyword::SPRIORITY, 0 },
- { "sprsbsp", RTFControlType::FLAG, RTFKeyword::SPRSBSP, 0 },
- { "sprslnsp", RTFControlType::FLAG, RTFKeyword::SPRSLNSP, 0 },
- { "sprsspbf", RTFControlType::FLAG, RTFKeyword::SPRSSPBF, 0 },
- { "sprstsm", RTFControlType::FLAG, RTFKeyword::SPRSTSM, 0 },
- { "sprstsp", RTFControlType::FLAG, RTFKeyword::SPRSTSP, 0 },
- { "spv", RTFControlType::FLAG, RTFKeyword::SPV, 0 },
- { "sqformat", RTFControlType::FLAG, RTFKeyword::SQFORMAT, 0 },
- { "srauth", RTFControlType::VALUE, RTFKeyword::SRAUTH, 0 },
- { "srdate", RTFControlType::VALUE, RTFKeyword::SRDATE, 0 },
- { "sreply", RTFControlType::FLAG, RTFKeyword::SREPLY, 0 },
- { "ssemihidden", RTFControlType::VALUE, RTFKeyword::SSEMIHIDDEN, 0 },
- { "staticval", RTFControlType::DESTINATION, RTFKeyword::STATICVAL, 0 },
- { "stextflow", RTFControlType::VALUE, RTFKeyword::STEXTFLOW, 0 },
- { "strike", RTFControlType::TOGGLE, RTFKeyword::STRIKE, 1 },
- { "striked", RTFControlType::TOGGLE, RTFKeyword::STRIKED, 1 },
- { "stshfbi", RTFControlType::VALUE, RTFKeyword::STSHFBI, 0 },
- { "stshfdbch", RTFControlType::VALUE, RTFKeyword::STSHFDBCH, 0 },
- { "stshfhich", RTFControlType::VALUE, RTFKeyword::STSHFHICH, 0 },
- { "stshfloch", RTFControlType::VALUE, RTFKeyword::STSHFLOCH, 0 },
- { "stylelock", RTFControlType::FLAG, RTFKeyword::STYLELOCK, 0 },
- { "stylelockbackcomp", RTFControlType::FLAG, RTFKeyword::STYLELOCKBACKCOMP, 0 },
- { "stylelockenforced", RTFControlType::FLAG, RTFKeyword::STYLELOCKENFORCED, 0 },
- { "stylelockqfset", RTFControlType::FLAG, RTFKeyword::STYLELOCKQFSET, 0 },
- { "stylelocktheme", RTFControlType::FLAG, RTFKeyword::STYLELOCKTHEME, 0 },
- { "stylesheet", RTFControlType::DESTINATION, RTFKeyword::STYLESHEET, 0 },
- { "stylesortmethod", RTFControlType::VALUE, RTFKeyword::STYLESORTMETHOD, 1 },
- { "styrsid", RTFControlType::VALUE, RTFKeyword::STYRSID, 0 },
- { "sub", RTFControlType::FLAG, RTFKeyword::SUB, 0 },
- { "subdocument", RTFControlType::VALUE, RTFKeyword::SUBDOCUMENT, 0 },
- { "subfontbysize", RTFControlType::FLAG, RTFKeyword::SUBFONTBYSIZE, 0 },
- { "subject", RTFControlType::DESTINATION, RTFKeyword::SUBJECT, 0 },
- { "sunhideused", RTFControlType::VALUE, RTFKeyword::SUNHIDEUSED, 0 },
- { "super", RTFControlType::FLAG, RTFKeyword::SUPER, 0 },
- { "sv", RTFControlType::DESTINATION, RTFKeyword::SV, 0 },
- { "svb", RTFControlType::DESTINATION, RTFKeyword::SVB, 0 },
- { "swpbdr", RTFControlType::FLAG, RTFKeyword::SWPBDR, 0 },
- { "tab", RTFControlType::SYMBOL, RTFKeyword::TAB, 0 },
- { "tabsnoovrlp", RTFControlType::FLAG, RTFKeyword::TABSNOOVRLP, 0 },
- { "taprtl", RTFControlType::FLAG, RTFKeyword::TAPRTL, 0 },
- { "tb", RTFControlType::VALUE, RTFKeyword::TB, 0 },
- { "tblind", RTFControlType::VALUE, RTFKeyword::TBLIND, 0 },
- { "tblindtype", RTFControlType::VALUE, RTFKeyword::TBLINDTYPE, 0 },
- { "tbllkbestfit", RTFControlType::FLAG, RTFKeyword::TBLLKBESTFIT, 0 },
- { "tbllkborder", RTFControlType::FLAG, RTFKeyword::TBLLKBORDER, 0 },
- { "tbllkcolor", RTFControlType::FLAG, RTFKeyword::TBLLKCOLOR, 0 },
- { "tbllkfont", RTFControlType::FLAG, RTFKeyword::TBLLKFONT, 0 },
- { "tbllkhdrcols", RTFControlType::FLAG, RTFKeyword::TBLLKHDRCOLS, 0 },
- { "tbllkhdrrows", RTFControlType::FLAG, RTFKeyword::TBLLKHDRROWS, 0 },
- { "tbllklastcol", RTFControlType::FLAG, RTFKeyword::TBLLKLASTCOL, 0 },
- { "tbllklastrow", RTFControlType::FLAG, RTFKeyword::TBLLKLASTROW, 0 },
- { "tbllknocolband", RTFControlType::FLAG, RTFKeyword::TBLLKNOCOLBAND, 0 },
- { "tbllknorowband", RTFControlType::FLAG, RTFKeyword::TBLLKNOROWBAND, 0 },
- { "tbllkshading", RTFControlType::FLAG, RTFKeyword::TBLLKSHADING, 0 },
- { "tblrsid", RTFControlType::VALUE, RTFKeyword::TBLRSID, 0 },
- { "tc", RTFControlType::DESTINATION, RTFKeyword::TC, 0 },
- { "tcelld", RTFControlType::FLAG, RTFKeyword::TCELLD, 0 },
- { "tcf", RTFControlType::VALUE, RTFKeyword::TCF, 67 },
- { "tcl", RTFControlType::VALUE, RTFKeyword::TCL, 0 },
- { "tcn", RTFControlType::FLAG, RTFKeyword::TCN, 0 },
- { "tdfrmtxtBottom", RTFControlType::VALUE, RTFKeyword::TDFRMTXTBOTTOM, 0 },
- { "tdfrmtxtLeft", RTFControlType::VALUE, RTFKeyword::TDFRMTXTLEFT, 0 },
- { "tdfrmtxtRight", RTFControlType::VALUE, RTFKeyword::TDFRMTXTRIGHT, 0 },
- { "tdfrmtxtTop", RTFControlType::VALUE, RTFKeyword::TDFRMTXTTOP, 0 },
- { "template", RTFControlType::DESTINATION, RTFKeyword::TEMPLATE, 0 },
- { "themedata", RTFControlType::DESTINATION, RTFKeyword::THEMEDATA, 0 },
- { "themelang", RTFControlType::VALUE, RTFKeyword::THEMELANG, 0 },
- { "themelangcs", RTFControlType::VALUE, RTFKeyword::THEMELANGCS, 0 },
- { "themelangfe", RTFControlType::VALUE, RTFKeyword::THEMELANGFE, 0 },
- { "time", RTFControlType::FLAG, RTFKeyword::TIME, 0 },
- { "title", RTFControlType::DESTINATION, RTFKeyword::TITLE, 0 },
- { "titlepg", RTFControlType::FLAG, RTFKeyword::TITLEPG, 0 },
- { "tldot", RTFControlType::FLAG, RTFKeyword::TLDOT, 0 },
- { "tleq", RTFControlType::FLAG, RTFKeyword::TLEQ, 0 },
- { "tlhyph", RTFControlType::FLAG, RTFKeyword::TLHYPH, 0 },
- { "tlmdot", RTFControlType::FLAG, RTFKeyword::TLMDOT, 0 },
- { "tlth", RTFControlType::FLAG, RTFKeyword::TLTH, 0 },
- { "tlul", RTFControlType::FLAG, RTFKeyword::TLUL, 0 },
- { "toplinepunct", RTFControlType::FLAG, RTFKeyword::TOPLINEPUNCT, 0 },
- { "tphcol", RTFControlType::FLAG, RTFKeyword::TPHCOL, 0 },
- { "tphmrg", RTFControlType::FLAG, RTFKeyword::TPHMRG, 0 },
- { "tphpg", RTFControlType::FLAG, RTFKeyword::TPHPG, 0 },
- { "tposnegx", RTFControlType::VALUE, RTFKeyword::TPOSNEGX, 0 },
- { "tposnegy", RTFControlType::VALUE, RTFKeyword::TPOSNEGY, 0 },
- { "tposxc", RTFControlType::FLAG, RTFKeyword::TPOSXC, 0 },
- { "tposxi", RTFControlType::FLAG, RTFKeyword::TPOSXI, 0 },
- { "tposxl", RTFControlType::FLAG, RTFKeyword::TPOSXL, 0 },
- { "tposx", RTFControlType::VALUE, RTFKeyword::TPOSX, 0 },
- { "tposxo", RTFControlType::FLAG, RTFKeyword::TPOSXO, 0 },
- { "tposxr", RTFControlType::FLAG, RTFKeyword::TPOSXR, 0 },
- { "tposy", RTFControlType::VALUE, RTFKeyword::TPOSY, 0 },
- { "tposyb", RTFControlType::FLAG, RTFKeyword::TPOSYB, 0 },
- { "tposyc", RTFControlType::FLAG, RTFKeyword::TPOSYC, 0 },
- { "tposyil", RTFControlType::FLAG, RTFKeyword::TPOSYIL, 0 },
- { "tposyin", RTFControlType::FLAG, RTFKeyword::TPOSYIN, 0 },
- { "tposyout", RTFControlType::FLAG, RTFKeyword::TPOSYOUT, 0 },
- { "tposyt", RTFControlType::FLAG, RTFKeyword::TPOSYT, 0 },
- { "tpvmrg", RTFControlType::FLAG, RTFKeyword::TPVMRG, 0 },
- { "tpvpara", RTFControlType::FLAG, RTFKeyword::TPVPARA, 0 },
- { "tpvpg", RTFControlType::FLAG, RTFKeyword::TPVPG, 0 },
- { "tqc", RTFControlType::FLAG, RTFKeyword::TQC, 0 },
- { "tqdec", RTFControlType::FLAG, RTFKeyword::TQDEC, 0 },
- { "tqr", RTFControlType::FLAG, RTFKeyword::TQR, 0 },
- { "trackformatting", RTFControlType::VALUE, RTFKeyword::TRACKFORMATTING, 0 },
- { "trackmoves", RTFControlType::VALUE, RTFKeyword::TRACKMOVES, 0 },
- { "transmf", RTFControlType::FLAG, RTFKeyword::TRANSMF, 0 },
- { "trauth", RTFControlType::VALUE, RTFKeyword::TRAUTH, 0 },
- { "trautofit", RTFControlType::TOGGLE, RTFKeyword::TRAUTOFIT, 1 },
- { "trbgbdiag", RTFControlType::FLAG, RTFKeyword::TRBGBDIAG, 0 },
- { "trbgcross", RTFControlType::FLAG, RTFKeyword::TRBGCROSS, 0 },
- { "trbgdcross", RTFControlType::FLAG, RTFKeyword::TRBGDCROSS, 0 },
- { "trbgdkbdiag", RTFControlType::FLAG, RTFKeyword::TRBGDKBDIAG, 0 },
- { "trbgdkcross", RTFControlType::FLAG, RTFKeyword::TRBGDKCROSS, 0 },
- { "trbgdkdcross", RTFControlType::FLAG, RTFKeyword::TRBGDKDCROSS, 0 },
- { "trbgdkfdiag", RTFControlType::FLAG, RTFKeyword::TRBGDKFDIAG, 0 },
- { "trbgdkhor", RTFControlType::FLAG, RTFKeyword::TRBGDKHOR, 0 },
- { "trbgdkvert", RTFControlType::FLAG, RTFKeyword::TRBGDKVERT, 0 },
- { "trbgfdiag", RTFControlType::FLAG, RTFKeyword::TRBGFDIAG, 0 },
- { "trbghoriz", RTFControlType::FLAG, RTFKeyword::TRBGHORIZ, 0 },
- { "trbgvert", RTFControlType::FLAG, RTFKeyword::TRBGVERT, 0 },
- { "trbrdrb", RTFControlType::FLAG, RTFKeyword::TRBRDRB, 0 },
- { "trbrdrh", RTFControlType::FLAG, RTFKeyword::TRBRDRH, 0 },
- { "trbrdrl", RTFControlType::FLAG, RTFKeyword::TRBRDRL, 0 },
- { "trbrdrr", RTFControlType::FLAG, RTFKeyword::TRBRDRR, 0 },
- { "trbrdrt", RTFControlType::FLAG, RTFKeyword::TRBRDRT, 0 },
- { "trbrdrv", RTFControlType::FLAG, RTFKeyword::TRBRDRV, 0 },
- { "trcbpat", RTFControlType::VALUE, RTFKeyword::TRCBPAT, 0 },
- { "trcfpat", RTFControlType::VALUE, RTFKeyword::TRCFPAT, 0 },
- { "trdate", RTFControlType::VALUE, RTFKeyword::TRDATE, 0 },
- { "trftsWidthA", RTFControlType::VALUE, RTFKeyword::TRFTSWIDTHA, 0 },
- { "trftsWidthB", RTFControlType::VALUE, RTFKeyword::TRFTSWIDTHB, 0 },
- { "trftsWidth", RTFControlType::VALUE, RTFKeyword::TRFTSWIDTH, 0 },
- { "trgaph", RTFControlType::VALUE, RTFKeyword::TRGAPH, 0 },
- { "trhdr", RTFControlType::FLAG, RTFKeyword::TRHDR, 0 },
- { "trkeep", RTFControlType::FLAG, RTFKeyword::TRKEEP, 0 },
- { "trkeepfollow", RTFControlType::FLAG, RTFKeyword::TRKEEPFOLLOW, 0 },
- { "trleft", RTFControlType::VALUE, RTFKeyword::TRLEFT, 0 },
- { "trowd", RTFControlType::FLAG, RTFKeyword::TROWD, 0 },
- { "trpaddb", RTFControlType::VALUE, RTFKeyword::TRPADDB, 0 },
- { "trpaddfb", RTFControlType::VALUE, RTFKeyword::TRPADDFB, 0 },
- { "trpaddfl", RTFControlType::VALUE, RTFKeyword::TRPADDFL, 0 },
- { "trpaddfr", RTFControlType::VALUE, RTFKeyword::TRPADDFR, 0 },
- { "trpaddft", RTFControlType::VALUE, RTFKeyword::TRPADDFT, 0 },
- { "trpaddl", RTFControlType::VALUE, RTFKeyword::TRPADDL, 0 },
- { "trpaddr", RTFControlType::VALUE, RTFKeyword::TRPADDR, 0 },
- { "trpaddt", RTFControlType::VALUE, RTFKeyword::TRPADDT, 0 },
- { "trpadob", RTFControlType::VALUE, RTFKeyword::TRPADOB, 0 },
- { "trpadofb", RTFControlType::VALUE, RTFKeyword::TRPADOFB, 0 },
- { "trpadofl", RTFControlType::VALUE, RTFKeyword::TRPADOFL, 0 },
- { "trpadofr", RTFControlType::VALUE, RTFKeyword::TRPADOFR, 0 },
- { "trpadoft", RTFControlType::VALUE, RTFKeyword::TRPADOFT, 0 },
- { "trpadol", RTFControlType::VALUE, RTFKeyword::TRPADOL, 0 },
- { "trpador", RTFControlType::VALUE, RTFKeyword::TRPADOR, 0 },
- { "trpadot", RTFControlType::VALUE, RTFKeyword::TRPADOT, 0 },
- { "trpat", RTFControlType::VALUE, RTFKeyword::TRPAT, 0 },
- { "trqc", RTFControlType::FLAG, RTFKeyword::TRQC, 0 },
- { "trql", RTFControlType::FLAG, RTFKeyword::TRQL, 0 },
- { "trqr", RTFControlType::FLAG, RTFKeyword::TRQR, 0 },
- { "trrh", RTFControlType::VALUE, RTFKeyword::TRRH, 0 },
- { "trshdng", RTFControlType::VALUE, RTFKeyword::TRSHDNG, 0 },
- { "trspdb", RTFControlType::VALUE, RTFKeyword::TRSPDB, 0 },
- { "trspdfb", RTFControlType::VALUE, RTFKeyword::TRSPDFB, 0 },
- { "trspdfl", RTFControlType::VALUE, RTFKeyword::TRSPDFL, 0 },
- { "trspdfr", RTFControlType::VALUE, RTFKeyword::TRSPDFR, 0 },
- { "trspdft", RTFControlType::VALUE, RTFKeyword::TRSPDFT, 0 },
- { "trspdl", RTFControlType::VALUE, RTFKeyword::TRSPDL, 0 },
- { "trspdr", RTFControlType::VALUE, RTFKeyword::TRSPDR, 0 },
- { "trspdt", RTFControlType::VALUE, RTFKeyword::TRSPDT, 0 },
- { "trspob", RTFControlType::VALUE, RTFKeyword::TRSPOB, 0 },
- { "trspofb", RTFControlType::VALUE, RTFKeyword::TRSPOFB, 0 },
- { "trspofl", RTFControlType::VALUE, RTFKeyword::TRSPOFL, 0 },
- { "trspofr", RTFControlType::VALUE, RTFKeyword::TRSPOFR, 0 },
- { "trspoft", RTFControlType::VALUE, RTFKeyword::TRSPOFT, 0 },
- { "trspol", RTFControlType::VALUE, RTFKeyword::TRSPOL, 0 },
- { "trspor", RTFControlType::VALUE, RTFKeyword::TRSPOR, 0 },
- { "trspot", RTFControlType::VALUE, RTFKeyword::TRSPOT, 0 },
- { "truncatefontheight", RTFControlType::FLAG, RTFKeyword::TRUNCATEFONTHEIGHT, 0 },
- { "truncex", RTFControlType::FLAG, RTFKeyword::TRUNCEX, 0 },
- { "trwWidthA", RTFControlType::VALUE, RTFKeyword::TRWWIDTHA, 0 },
- { "trwWidthB", RTFControlType::VALUE, RTFKeyword::TRWWIDTHB, 0 },
- { "trwWidth", RTFControlType::VALUE, RTFKeyword::TRWWIDTH, 0 },
- { "ts", RTFControlType::VALUE, RTFKeyword::TS, 0 },
- { "tsbgbdiag", RTFControlType::FLAG, RTFKeyword::TSBGBDIAG, 0 },
- { "tsbgcross", RTFControlType::FLAG, RTFKeyword::TSBGCROSS, 0 },
- { "tsbgdcross", RTFControlType::FLAG, RTFKeyword::TSBGDCROSS, 0 },
- { "tsbgdkbdiag", RTFControlType::FLAG, RTFKeyword::TSBGDKBDIAG, 0 },
- { "tsbgdkcross", RTFControlType::FLAG, RTFKeyword::TSBGDKCROSS, 0 },
- { "tsbgdkdcross", RTFControlType::FLAG, RTFKeyword::TSBGDKDCROSS, 0 },
- { "tsbgdkfdiag", RTFControlType::FLAG, RTFKeyword::TSBGDKFDIAG, 0 },
- { "tsbgdkhor", RTFControlType::FLAG, RTFKeyword::TSBGDKHOR, 0 },
- { "tsbgdkvert", RTFControlType::FLAG, RTFKeyword::TSBGDKVERT, 0 },
- { "tsbgfdiag", RTFControlType::FLAG, RTFKeyword::TSBGFDIAG, 0 },
- { "tsbghoriz", RTFControlType::FLAG, RTFKeyword::TSBGHORIZ, 0 },
- { "tsbgvert", RTFControlType::FLAG, RTFKeyword::TSBGVERT, 0 },
- { "tsbrdrb", RTFControlType::FLAG, RTFKeyword::TSBRDRB, 0 },
- { "tsbrdrdgl", RTFControlType::FLAG, RTFKeyword::TSBRDRDGL, 0 },
- { "tsbrdrdgr", RTFControlType::FLAG, RTFKeyword::TSBRDRDGR, 0 },
- { "tsbrdrh", RTFControlType::FLAG, RTFKeyword::TSBRDRH, 0 },
- { "tsbrdrl", RTFControlType::FLAG, RTFKeyword::TSBRDRL, 0 },
- { "tsbrdrr", RTFControlType::FLAG, RTFKeyword::TSBRDRR, 0 },
- { "tsbrdrt", RTFControlType::FLAG, RTFKeyword::TSBRDRT, 0 },
- { "tsbrdrv", RTFControlType::FLAG, RTFKeyword::TSBRDRV, 0 },
- { "tscbandhorzeven", RTFControlType::FLAG, RTFKeyword::TSCBANDHORZEVEN, 0 },
- { "tscbandhorzodd", RTFControlType::FLAG, RTFKeyword::TSCBANDHORZODD, 0 },
- { "tscbandsh", RTFControlType::VALUE, RTFKeyword::TSCBANDSH, 0 },
- { "tscbandsv", RTFControlType::VALUE, RTFKeyword::TSCBANDSV, 0 },
- { "tscbandverteven", RTFControlType::FLAG, RTFKeyword::TSCBANDVERTEVEN, 0 },
- { "tscbandvertodd", RTFControlType::FLAG, RTFKeyword::TSCBANDVERTODD, 0 },
- { "tscellcbpat", RTFControlType::VALUE, RTFKeyword::TSCELLCBPAT, 0 },
- { "tscellcfpat", RTFControlType::VALUE, RTFKeyword::TSCELLCFPAT, 0 },
- { "tscellpaddb", RTFControlType::VALUE, RTFKeyword::TSCELLPADDB, 0 },
- { "tscellpaddfb", RTFControlType::VALUE, RTFKeyword::TSCELLPADDFB, 0 },
- { "tscellpaddfl", RTFControlType::VALUE, RTFKeyword::TSCELLPADDFL, 0 },
- { "tscellpaddfr", RTFControlType::VALUE, RTFKeyword::TSCELLPADDFR, 0 },
- { "tscellpaddft", RTFControlType::VALUE, RTFKeyword::TSCELLPADDFT, 0 },
- { "tscellpaddl", RTFControlType::VALUE, RTFKeyword::TSCELLPADDL, 0 },
- { "tscellpaddr", RTFControlType::VALUE, RTFKeyword::TSCELLPADDR, 0 },
- { "tscellpaddt", RTFControlType::VALUE, RTFKeyword::TSCELLPADDT, 0 },
- { "tscellpct", RTFControlType::VALUE, RTFKeyword::TSCELLPCT, 0 },
- { "tscellwidth", RTFControlType::VALUE, RTFKeyword::TSCELLWIDTH, 0 },
- { "tscellwidthfts", RTFControlType::VALUE, RTFKeyword::TSCELLWIDTHFTS, 0 },
- { "tscfirstcol", RTFControlType::FLAG, RTFKeyword::TSCFIRSTCOL, 0 },
- { "tscfirstrow", RTFControlType::FLAG, RTFKeyword::TSCFIRSTROW, 0 },
- { "tsclastcol", RTFControlType::FLAG, RTFKeyword::TSCLASTCOL, 0 },
- { "tsclastrow", RTFControlType::FLAG, RTFKeyword::TSCLASTROW, 0 },
- { "tscnecell", RTFControlType::FLAG, RTFKeyword::TSCNECELL, 0 },
- { "tscnwcell", RTFControlType::FLAG, RTFKeyword::TSCNWCELL, 0 },
- { "tscsecell", RTFControlType::FLAG, RTFKeyword::TSCSECELL, 0 },
- { "tscswcell", RTFControlType::FLAG, RTFKeyword::TSCSWCELL, 0 },
- { "tsd", RTFControlType::FLAG, RTFKeyword::TSD, 0 },
- { "tsnowrap", RTFControlType::FLAG, RTFKeyword::TSNOWRAP, 0 },
- { "tsrowd", RTFControlType::FLAG, RTFKeyword::TSROWD, 0 },
- { "tsvertalb", RTFControlType::FLAG, RTFKeyword::TSVERTALB, 0 },
- { "tsvertalc", RTFControlType::FLAG, RTFKeyword::TSVERTALC, 0 },
- { "tsvertalt", RTFControlType::FLAG, RTFKeyword::TSVERTALT, 0 },
- { "twoinone", RTFControlType::VALUE, RTFKeyword::TWOINONE, 0 },
- { "twoonone", RTFControlType::FLAG, RTFKeyword::TWOONONE, 0 },
- { "tx", RTFControlType::VALUE, RTFKeyword::TX, 0 },
- { "txbxtwalways", RTFControlType::FLAG, RTFKeyword::TXBXTWALWAYS, 0 },
- { "txbxtwfirst", RTFControlType::FLAG, RTFKeyword::TXBXTWFIRST, 0 },
- { "txbxtwfirstlast", RTFControlType::FLAG, RTFKeyword::TXBXTWFIRSTLAST, 0 },
- { "txbxtwlast", RTFControlType::FLAG, RTFKeyword::TXBXTWLAST, 0 },
- { "txbxtwno", RTFControlType::FLAG, RTFKeyword::TXBXTWNO, 0 },
- { "txe", RTFControlType::DESTINATION, RTFKeyword::TXE, 0 },
- { "u", RTFControlType::VALUE, RTFKeyword::U, 0 },
- { "uc", RTFControlType::VALUE, RTFKeyword::UC, 1 },
- { "ud", RTFControlType::DESTINATION, RTFKeyword::UD, 0 },
- { "ul", RTFControlType::TOGGLE, RTFKeyword::UL, 1 },
- { "ulc", RTFControlType::VALUE, RTFKeyword::ULC, 0 },
- { "uld", RTFControlType::FLAG, RTFKeyword::ULD, 0 },
- { "uldash", RTFControlType::TOGGLE, RTFKeyword::ULDASH, 1 },
- { "uldashd", RTFControlType::TOGGLE, RTFKeyword::ULDASHD, 1 },
- { "uldashdd", RTFControlType::TOGGLE, RTFKeyword::ULDASHDD, 1 },
- { "uldb", RTFControlType::TOGGLE, RTFKeyword::ULDB, 1 },
- { "ulhair", RTFControlType::TOGGLE, RTFKeyword::ULHAIR, 1 },
- { "ulhwave", RTFControlType::TOGGLE, RTFKeyword::ULHWAVE, 1 },
- { "ulldash", RTFControlType::TOGGLE, RTFKeyword::ULLDASH, 1 },
- { "ulnone", RTFControlType::FLAG, RTFKeyword::ULNONE, 0 },
- { "ulth", RTFControlType::TOGGLE, RTFKeyword::ULTH, 1 },
- { "ulthd", RTFControlType::TOGGLE, RTFKeyword::ULTHD, 1 },
- { "ulthdash", RTFControlType::TOGGLE, RTFKeyword::ULTHDASH, 1 },
- { "ulthdashd", RTFControlType::TOGGLE, RTFKeyword::ULTHDASHD, 1 },
- { "ulthdashdd", RTFControlType::TOGGLE, RTFKeyword::ULTHDASHDD, 1 },
- { "ulthldash", RTFControlType::TOGGLE, RTFKeyword::ULTHLDASH, 1 },
- { "ululdbwave", RTFControlType::TOGGLE, RTFKeyword::ULULDBWAVE, 1 },
- { "ulw", RTFControlType::FLAG, RTFKeyword::ULW, 0 },
- { "ulwave", RTFControlType::TOGGLE, RTFKeyword::ULWAVE, 1 },
- { "up", RTFControlType::VALUE, RTFKeyword::UP, 6 },
- { "upr", RTFControlType::DESTINATION, RTFKeyword::UPR, 0 },
- { "urtf", RTFControlType::VALUE, RTFKeyword::URTF, 0 },
- { "useltbaln", RTFControlType::FLAG, RTFKeyword::USELTBALN, 0 },
- { "usenormstyforlist", RTFControlType::FLAG, RTFKeyword::USENORMSTYFORLIST, 0 },
- { "userprops", RTFControlType::DESTINATION, RTFKeyword::USERPROPS, 0 },
- { "usexform", RTFControlType::FLAG, RTFKeyword::USEXFORM, 0 },
- { "utinl", RTFControlType::FLAG, RTFKeyword::UTINL, 0 },
- { "v", RTFControlType::TOGGLE, RTFKeyword::V, 1 },
- { "validatexml", RTFControlType::VALUE, RTFKeyword::VALIDATEXML, 0 },
- { "vern", RTFControlType::VALUE, RTFKeyword::VERN, 0 },
- { "version", RTFControlType::VALUE, RTFKeyword::VERSION, 0 },
- { "vertal", RTFControlType::FLAG, RTFKeyword::VERTAL, 0 },
- { "vertalb", RTFControlType::FLAG, RTFKeyword::VERTALB, 0 },
- { "vertalc", RTFControlType::FLAG, RTFKeyword::VERTALC, 0 },
- { "vertalj", RTFControlType::FLAG, RTFKeyword::VERTALJ, 0 },
- { "vertalt", RTFControlType::FLAG, RTFKeyword::VERTALT, 0 },
- { "vertdoc", RTFControlType::FLAG, RTFKeyword::VERTDOC, 0 },
- { "vertsect", RTFControlType::FLAG, RTFKeyword::VERTSECT, 0 },
- { "viewbksp", RTFControlType::VALUE, RTFKeyword::VIEWBKSP, 0 },
- { "viewkind", RTFControlType::VALUE, RTFKeyword::VIEWKIND, 0 },
- { "viewnobound", RTFControlType::FLAG, RTFKeyword::VIEWNOBOUND, 0 },
- { "viewscale", RTFControlType::VALUE, RTFKeyword::VIEWSCALE, 100 },
- { "viewzk", RTFControlType::VALUE, RTFKeyword::VIEWZK, 0 },
- { "wbitmap", RTFControlType::VALUE, RTFKeyword::WBITMAP, 0 },
- { "wbmbitspixel", RTFControlType::VALUE, RTFKeyword::WBMBITSPIXEL, 1 },
- { "wbmplanes", RTFControlType::VALUE, RTFKeyword::WBMPLANES, 0 },
- { "wbmwidthbyte", RTFControlType::VALUE, RTFKeyword::WBMWIDTHBYTE, 0 },
- { "webhidden", RTFControlType::FLAG, RTFKeyword::WEBHIDDEN, 0 },
- { "wgrffmtfilter", RTFControlType::DESTINATION, RTFKeyword::WGRFFMTFILTER, 0 },
- { "widctlpar", RTFControlType::FLAG, RTFKeyword::WIDCTLPAR, 0 },
- { "widowctrl", RTFControlType::FLAG, RTFKeyword::WIDOWCTRL, 0 },
- { "windowcaption", RTFControlType::DESTINATION, RTFKeyword::WINDOWCAPTION, 0 },
- { "wmetafile", RTFControlType::VALUE, RTFKeyword::WMETAFILE, 1 },
- { "wpeqn", RTFControlType::FLAG, RTFKeyword::WPEQN, 0 },
- { "wpjst", RTFControlType::FLAG, RTFKeyword::WPJST, 0 },
- { "wpsp", RTFControlType::FLAG, RTFKeyword::WPSP, 0 },
- { "wraparound", RTFControlType::FLAG, RTFKeyword::WRAPAROUND, 0 },
- { "wrapdefault", RTFControlType::FLAG, RTFKeyword::WRAPDEFAULT, 0 },
- { "wrapthrough", RTFControlType::FLAG, RTFKeyword::WRAPTHROUGH, 0 },
- { "wraptight", RTFControlType::FLAG, RTFKeyword::WRAPTIGHT, 0 },
- { "wraptrsp", RTFControlType::FLAG, RTFKeyword::WRAPTRSP, 0 },
- { "writereservation", RTFControlType::DESTINATION, RTFKeyword::WRITERESERVATION, 0 },
- { "writereservhash", RTFControlType::DESTINATION, RTFKeyword::WRITERESERVHASH, 0 },
- { "wrppunct", RTFControlType::FLAG, RTFKeyword::WRPPUNCT, 0 },
- { "xe", RTFControlType::DESTINATION, RTFKeyword::XE, 0 },
- { "xef", RTFControlType::VALUE, RTFKeyword::XEF, 0 },
- { "xform", RTFControlType::DESTINATION, RTFKeyword::XFORM, 0 },
- { "xmlattr", RTFControlType::FLAG, RTFKeyword::XMLATTR, 0 },
- { "xmlattrname", RTFControlType::DESTINATION, RTFKeyword::XMLATTRNAME, 0 },
- { "xmlattrns", RTFControlType::VALUE, RTFKeyword::XMLATTRNS, 0 },
- { "xmlattrvalue", RTFControlType::DESTINATION, RTFKeyword::XMLATTRVALUE, 0 },
- { "xmlclose", RTFControlType::DESTINATION, RTFKeyword::XMLCLOSE, 0 },
- { "xmlname", RTFControlType::DESTINATION, RTFKeyword::XMLNAME, 0 },
- { "xmlns", RTFControlType::VALUE, RTFKeyword::XMLNS, 0 },
- { "xmlnstbl", RTFControlType::DESTINATION, RTFKeyword::XMLNSTBL, 0 },
- { "xmlopen", RTFControlType::DESTINATION, RTFKeyword::XMLOPEN, 0 },
- { "xmlsdttcell", RTFControlType::FLAG, RTFKeyword::XMLSDTTCELL, 0 },
- { "xmlsdttpara", RTFControlType::FLAG, RTFKeyword::XMLSDTTPARA, 0 },
- { "xmlsdttregular", RTFControlType::FLAG, RTFKeyword::XMLSDTTREGULAR, 0 },
- { "xmlsdttrow", RTFControlType::FLAG, RTFKeyword::XMLSDTTROW, 0 },
- { "xmlsdttunknown", RTFControlType::FLAG, RTFKeyword::XMLSDTTUNKNOWN, 0 },
- { "yr", RTFControlType::VALUE, RTFKeyword::YR, 0 },
- { "yts", RTFControlType::VALUE, RTFKeyword::YTS, 0 },
- { "yxe", RTFControlType::FLAG, RTFKeyword::YXE, 0 },
- { "zwbo", RTFControlType::SYMBOL, RTFKeyword::ZWBO, 0 },
- { "zwj", RTFControlType::SYMBOL, RTFKeyword::ZWJ, 0 },
- { "zwnbo", RTFControlType::SYMBOL, RTFKeyword::ZWNBO, 0 },
- { "zwnj", RTFControlType::SYMBOL, RTFKeyword::ZWNJ, 0 },
- { "flymaincnt", RTFControlType::DESTINATION, RTFKeyword::FLYMAINCNT, 0 },
- { "flyvert", RTFControlType::VALUE, RTFKeyword::FLYVERT, 0 },
- { "flyhorz", RTFControlType::VALUE, RTFKeyword::FLYHORZ, 0 },
- { "flyanchor", RTFControlType::VALUE, RTFKeyword::FLYANCHOR, 0 },
-};
-const int nRTFControlWords = SAL_N_ELEMENTS(aRTFControlWords);
-
-RTFMathSymbol const aRTFMathControlWords[] = {
- // eKeyword nToken eDestination
- { RTFKeyword::MOMATH, M_TOKEN(oMath), Destination::MOMATH },
- { RTFKeyword::MF, M_TOKEN(f), Destination::MF },
- { RTFKeyword::MFPR, M_TOKEN(fPr), Destination::MFPR },
- { RTFKeyword::MCTRLPR, M_TOKEN(ctrlPr), Destination::MCTRLPR },
- { RTFKeyword::MNUM, M_TOKEN(num), Destination::MNUM },
- { RTFKeyword::MDEN, M_TOKEN(den), Destination::MDEN },
- { RTFKeyword::MACC, M_TOKEN(acc), Destination::MACC },
- { RTFKeyword::MACCPR, M_TOKEN(accPr), Destination::MACCPR },
- { RTFKeyword::MBAR, M_TOKEN(bar), Destination::MBAR },
- { RTFKeyword::MBARPR, M_TOKEN(barPr), Destination::MBARPR },
- { RTFKeyword::ME, M_TOKEN(e), Destination::ME },
- { RTFKeyword::MD, M_TOKEN(d), Destination::MD },
- { RTFKeyword::MDPR, M_TOKEN(dPr), Destination::MDPR },
- { RTFKeyword::MFUNC, M_TOKEN(func), Destination::MFUNC },
- { RTFKeyword::MFUNCPR, M_TOKEN(funcPr), Destination::MFUNCPR },
- { RTFKeyword::MFNAME, M_TOKEN(fName), Destination::MFNAME },
- { RTFKeyword::MLIMLOW, M_TOKEN(limLow), Destination::MLIMLOW },
- { RTFKeyword::MLIMLOWPR, M_TOKEN(limLowPr), Destination::MLIMLOWPR },
- { RTFKeyword::MLIM, M_TOKEN(lim), Destination::MLIM },
- { RTFKeyword::MM, M_TOKEN(m), Destination::MM },
- { RTFKeyword::MMPR, M_TOKEN(mPr), Destination::MMPR },
- { RTFKeyword::MMR, M_TOKEN(mr), Destination::MMR },
- { RTFKeyword::MNARY, M_TOKEN(nary), Destination::MNARY },
- { RTFKeyword::MNARYPR, M_TOKEN(naryPr), Destination::MNARYPR },
- { RTFKeyword::MSUB, M_TOKEN(sub), Destination::MSUB },
- { RTFKeyword::MSUP, M_TOKEN(sup), Destination::MSUP },
- { RTFKeyword::MLIMUPP, M_TOKEN(limUpp), Destination::MLIMUPP },
- { RTFKeyword::MLIMUPPPR, M_TOKEN(limUppPr), Destination::MLIMUPPPR },
- { RTFKeyword::MGROUPCHR, M_TOKEN(groupChr), Destination::MGROUPCHR },
- { RTFKeyword::MGROUPCHRPR, M_TOKEN(groupChrPr), Destination::MGROUPCHRPR },
- { RTFKeyword::MBORDERBOX, M_TOKEN(borderBox), Destination::MBORDERBOX },
- { RTFKeyword::MBORDERBOXPR, M_TOKEN(borderBoxPr), Destination::MBORDERBOXPR },
- { RTFKeyword::MRAD, M_TOKEN(rad), Destination::MRAD },
- { RTFKeyword::MRADPR, M_TOKEN(radPr), Destination::MRADPR },
- { RTFKeyword::MDEG, M_TOKEN(deg), Destination::MDEG },
- { RTFKeyword::MSSUB, M_TOKEN(sSub), Destination::MSSUB },
- { RTFKeyword::MSSUBPR, M_TOKEN(sSubPr), Destination::MSSUBPR },
- { RTFKeyword::MSSUP, M_TOKEN(sSup), Destination::MSSUP },
- { RTFKeyword::MSSUPPR, M_TOKEN(sSupPr), Destination::MSSUPPR },
- { RTFKeyword::MSSUBSUP, M_TOKEN(sSubSup), Destination::MSSUBSUP },
- { RTFKeyword::MSSUBSUPPR, M_TOKEN(sSubSupPr), Destination::MSSUBSUPPR },
- { RTFKeyword::MSPRE, M_TOKEN(sPre), Destination::MSPRE },
- { RTFKeyword::MSPREPR, M_TOKEN(sPrePr), Destination::MSPREPR },
- { RTFKeyword::MBOX, M_TOKEN(box), Destination::MBOX },
- { RTFKeyword::MEQARR, M_TOKEN(eqArr), Destination::MEQARR },
-};
-const int nRTFMathControlWords = SAL_N_ELEMENTS(aRTFMathControlWords);
-
-bool RTFMathSymbol::operator<(const RTFMathSymbol& rOther) const
-{
- return m_eKeyword < rOther.m_eKeyword;
-}
-
-} // namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfcontrolwords.hxx b/writerfilter/source/rtftok/rtfcontrolwords.hxx
deleted file mode 100644
index c1480ffb0231..000000000000
--- a/writerfilter/source/rtftok/rtfcontrolwords.hxx
+++ /dev/null
@@ -1,2049 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-namespace writerfilter::rtftok
-{
-/**
- * An RTF destination state is the last open destination control word.
- *
- * Note that this is not a 1:1 mapping between destination control
- * words, e.g. RTF_PICT gets mapped to Destination::PICT or
- * Destination::SHAPEPROPERTYVALUEPICT.
- */
-enum class Destination
-{
- NORMAL,
- SKIP,
- FONTTABLE,
- FONTENTRY,
- COLORTABLE,
- STYLESHEET,
- STYLEENTRY,
- FIELD,
- FIELDINSTRUCTION,
- FIELDRESULT,
- LISTTABLE,
- LISTPICTURE,
- LISTENTRY,
- LISTNAME,
- LISTOVERRIDETABLE,
- LISTOVERRIDEENTRY,
- LISTLEVEL,
- LEVELTEXT,
- LEVELNUMBERS,
- SHPPICT,
- PICT,
- PICPROP,
- SHAPEPROPERTY,
- SHAPEPROPERTYNAME,
- SHAPEPROPERTYVALUE,
- SHAPE,
- SHAPEINSTRUCTION,
- SHAPEPROPERTYVALUEPICT,
- NESTEDTABLEPROPERTIES,
- FOOTNOTE,
- BOOKMARKSTART,
- BOOKMARKEND,
- REVISIONTABLE,
- REVISIONENTRY,
- SHAPETEXT,
- FORMFIELD,
- FORMFIELDNAME,
- FORMFIELDLIST,
- DATAFIELD,
- INFO,
- CREATIONTIME,
- REVISIONTIME,
- PRINTTIME,
- AUTHOR,
- KEYWORDS,
- OPERATOR,
- COMPANY,
- COMMENT,
- OBJECT,
- OBJDATA,
- OBJCLASS,
- RESULT,
- ANNOTATIONDATE,
- ANNOTATIONAUTHOR,
- ANNOTATIONREFERENCE,
- FALT,
- FLYMAINCONTENT,
- DRAWINGOBJECT,
- PARAGRAPHNUMBERING,
- PARAGRAPHNUMBERING_TEXTBEFORE,
- PARAGRAPHNUMBERING_TEXTAFTER,
- TITLE,
- SUBJECT,
- DOCCOMM,
- ATNID,
- ANNOTATIONREFERENCESTART,
- ANNOTATIONREFERENCEEND,
- MOMATH,
- MR,
- MF,
- MFPR,
- MCTRLPR,
- MNUM,
- MDEN,
- MACC,
- MACCPR,
- MCHR,
- MPOS,
- MVERTJC,
- MSTRIKEH,
- MDEGHIDE,
- ME,
- MBAR,
- MBARPR,
- MD,
- MDPR,
- MBEGCHR,
- MSEPCHR,
- MENDCHR,
- MFUNC,
- MFUNCPR,
- MFNAME,
- MLIMLOW,
- MLIMLOWPR,
- MLIM,
- MM,
- MMPR,
- MMR,
- MNARY,
- MNARYPR,
- MSUB,
- MSUP,
- MSUBHIDE,
- MSUPHIDE,
- MLIMUPP,
- MLIMUPPPR,
- MGROUPCHR,
- MGROUPCHRPR,
- MBORDERBOX,
- MBORDERBOXPR,
- MRAD,
- MRADPR,
- MDEG,
- MSSUB,
- MSSUBPR,
- MSSUP,
- MSSUPPR,
- MSSUBSUP,
- MSSUBSUPPR,
- MSPRE,
- MSPREPR,
- MTYPE,
- MGROW,
- MBOX,
- MEQARR,
- UPR,
- LFOLEVEL,
- BACKGROUND,
- SHAPEGROUP,
- FOOTNOTESEPARATOR,
- INDEXENTRY,
- TOCENTRY,
- USERPROPS,
- PROPNAME,
- STATICVAL,
- GENERATOR,
- DOCVAR,
-};
-
-enum class RTFKeyword
-{
- invalid = -1,
- HEXCHAR,
- OPTHYPH,
- IGNORE,
- SUBENTRY,
- BACKSLASH,
- NOBRKHYPH,
- LBRACE,
- FORMULA,
- RBRACE,
- NOBREAK,
- AB,
- ABSH,
- ABSLOCK,
- ABSNOOVRLP,
- ABSW,
- ACAPS,
- ACCCIRCLE,
- ACCCOMMA,
- ACCDOT,
- ACCNONE,
- ACCUNDERDOT,
- ACF,
- ADEFF,
- ADDITIVE,
- ADEFLANG,
- ADJUSTRIGHT,
- ADN,
- AENDDOC,
- AENDNOTES,
- AEXPND,
- AF,
- AFELEV,
- AFS,
- AFTNBJ,
- AFTNCN,
- AFTNNALC,
- AFTNNAR,
- AFTNNAUC,
- AFTNNCHI,
- AFTNNCHOSUNG,
- AFTNNCNUM,
- AFTNNDBAR,
- AFTNNDBNUM,
- AFTNNDBNUMD,
- AFTNNDBNUMK,
- AFTNNDBNUMT,
- AFTNNGANADA,
- AFTNNGBNUM,
- AFTNNGBNUMD,
- AFTNNGBNUMK,
- AFTNNGBNUML,
- AFTNNRLC,
- AFTNNRUC,
- AFTNNZODIAC,
- AFTNNZODIACD,
- AFTNNZODIACL,
- AFTNRESTART,
- AFTNRSTCONT,
- AFTNSEP,
- AFTNSEPC,
- AFTNSTART,
- AFTNTJ,
- AI,
- ALANG,
- ALLOWFIELDENDSEL,
- ALLPROT,
- ALNTBLIND,
- ALT,
- ANIMTEXT,
- ANNOTATION,
- ANNOTPROT,
- ANSI,
- ANSICPG,
- AOUTL,
- APPLYBRKRULES,
- ASCAPS,
- ASHAD,
- ASIANBRKRULE,
- ASPALPHA,
- ASPNUM,
- ASTRIKE,
- ATNAUTHOR,
- ATNDATE,
- ATNICN,
- ATNID,
- ATNPARENT,
- ATNREF,
- ATNTIME,
- ATRFEND,
- ATRFSTART,
- AUL,
- AULD,
- AULDB,
- AULNONE,
- AULW,
- AUP,
- AUTHOR,
- AUTOFMTOVERRIDE,
- B,
- BACKGROUND,
- BDBFHDR,
- BDRRLSWSIX,
- BGBDIAG,
- BGCROSS,
- BGDCROSS,
- BGDKBDIAG,
- BGDKCROSS,
- BGDKDCROSS,
- BGDKFDIAG,
- BGDKHORIZ,
- BGDKVERT,
- BGFDIAG,
- BGHORIZ,
- BGVERT,
- BIN,
- BINFSXN,
- BINSXN,
- BKMKCOLF,
- BKMKCOLL,
- BKMKEND,
- BKMKPUB,
- BKMKSTART,
- BLIPTAG,
- BLIPUID,
- BLIPUPI,
- BLUE,
- BOOKFOLD,
- BOOKFOLDREV,
- BOOKFOLDSHEETS,
- BOX,
- BRDRART,
- BRDRB,
- BRDRBAR,
- BRDRBTW,
- BRDRCF,
- BRDRDASH,
- BRDRDASHD,
- BRDRDASHDD,
- BRDRDASHDOTSTR,
- BRDRDASHSM,
- BRDRDB,
- BRDRDOT,
- BRDREMBOSS,
- BRDRENGRAVE,
- BRDRFRAME,
- BRDRHAIR,
- BRDRINSET,
- BRDRL,
- BRDRNIL,
- BRDRNONE,
- BRDROUTSET,
- BRDRR,
- BRDRS,
- BRDRSH,
- BRDRT,
- BRDRTBL,
- BRDRTH,
- BRDRTHTNLG,
- BRDRTHTNMG,
- BRDRTHTNSG,
- BRDRTNTHLG,
- BRDRTNTHMG,
- BRDRTNTHSG,
- BRDRTNTHTNLG,
- BRDRTNTHTNMG,
- BRDRTNTHTNSG,
- BRDRTRIPLE,
- BRDRW,
- BRDRWAVY,
- BRDRWAVYDB,
- BRKFRM,
- BRSP,
- BULLET,
- BUPTIM,
- BXE,
- CACCENTFIVE,
- CACCENTFOUR,
- CACCENTONE,
- CACCENTSIX,
- CACCENTTHREE,
- CACCENTTWO,
- CACHEDCOLBAL,
- CAPS,
- CATEGORY,
- CB,
- CBACKGROUNDONE,
- CBACKGROUNDTWO,
- CBPAT,
- CCHS,
- CELL,
- CELLX,
- CF,
- CFOLLOWEDHYPERLINK,
- CFPAT,
- CGRID,
- CHARRSID,
- CHARSCALEX,
- CHATN,
- CHBGBDIAG,
- CHBGCROSS,
- CHBGDCROSS,
- CHBGDKBDIAG,
- CHBGDKCROSS,
- CHBGDKDCROSS,
- CHBGDKFDIAG,
- CHBGDKHORIZ,
- CHBGDKVERT,
- CHBGFDIAG,
- CHBGHORIZ,
- CHBGVERT,
- CHBRDR,
- CHCBPAT,
- CHCFPAT,
- CHDATE,
- CHDPA,
- CHDPL,
- CHFTN,
- CHFTNSEP,
- CHFTNSEPC,
- CHPGN,
- CHHRES,
- CHSHDNG,
- CHTIME,
- CHYPERLINK,
- CLBGBDIAG,
- CLBGCROSS,
- CLBGDCROSS,
- CLBGDKBDIAG,
- CLBGDKCROSS,
- CLBGDKDCROSS,
- CLBGDKFDIAG,
- CLBGDKHOR,
- CLBGDKVERT,
- CLBGFDIAG,
- CLBGHORIZ,
- CLBGVERT,
- CLBRDRB,
- CLBRDRL,
- CLBRDRR,
- CLBRDRT,
- CLCBPAT,
- CLCBPATRAW,
- CLCFPAT,
- CLCFPATRAW,
- CLDEL,
- CLDELAUTH,
- CLDELDTTM,
- CLDGLL,
- CLDGLU,
- CLFITTEXT,
- CLFTSWIDTH,
- CLHIDEMARK,
- CLINS,
- CLINSAUTH,
- CLINSDTTM,
- CLMGF,
- CLMRG,
- CLMRGD,
- CLMRGDAUTH,
- CLMRGDDTTM,
- CLMRGDR,
- CLNOWRAP,
- CLPADB,
- CLPADFB,
- CLPADFL,
- CLPADFR,
- CLPADFT,
- CLPADL,
- CLPADR,
- CLPADT,
- CLSPB,
- CLSPFB,
- CLSPFL,
- CLSPFR,
- CLSPFT,
- CLSPL,
- CLSPR,
- CLSPT,
- CLSHDNG,
- CLSHDNGRAW,
- CLSHDRAWNIL,
- CLSPLIT,
- CLSPLITR,
- CLTXBTLR,
- CLTXLRTB,
- CLTXLRTBV,
- CLTXTBRL,
- CLTXTBRLV,
- CLVERTALB,
- CLVERTALC,
- CLVERTALT,
- CLVMGF,
- CLVMRG,
- CLWWIDTH,
- CMAINDARKONE,
- CMAINDARKTWO,
- CMAINLIGHTONE,
- CMAINLIGHTTWO,
- COLLAPSED,
- COLNO,
- COLORSCHEMEMAPPING,
- COLORTBL,
- COLS,
- COLSR,
- COLSX,
- COLUMN,
- COLW,
- COMMENT,
- COMPANY,
- CONTEXTUALSPACE,
- CPG,
- CRAUTH,
- CRDATE,
- CREATIM,
- CS,
- CSHADE,
- CTEXTONE,
- CTEXTTWO,
- CTINT,
- CTRL,
- CTS,
- CUFI,
- CULI,
- CURI,
- CVMME,
- DATAFIELD,
- DATASTORE,
- DATE,
- DBCH,
- DEFCHP,
- DEFF,
- DEFFORMAT,
- DEFLANG,
- DEFLANGFE,
- DEFPAP,
- DEFSHP,
- DEFTAB,
- DELETED,
- DELRSID,
- DFRAUTH,
- DFRDATE,
- DFRMTXTX,
- DFRMTXTY,
- DFRSTART,
- DFRSTOP,
- DFRXST,
- DGHORIGIN,
- DGHSHOW,
- DGHSPACE,
- DGMARGIN,
- DGSNAP,
- DGVORIGIN,
- DGVSHOW,
- DGVSPACE,
- DIBITMAP,
- DISABLED,
- DN,
- DNTBLNSBDB,
- DO,
- DOBXCOLUMN,
- DOBXMARGIN,
- DOBXPAGE,
- DOBYMARGIN,
- DOBYPAGE,
- DOBYPARA,
- DOCCOMM,
- DOCTEMP,
- DOCTYPE,
- DOCVAR,
- DODHGT,
- DOLOCK,
- DONOTEMBEDLINGDATA,
- DONOTEMBEDSYSFONT,
- DONOTSHOWCOMMENTS,
- DONOTSHOWINSDEL,
- DONOTSHOWMARKUP,
- DONOTSHOWPROPS,
- DPAENDHOL,
- DPAENDL,
- DPAENDSOL,
- DPAENDW,
- DPARC,
- DPARCFLIPX,
- DPARCFLIPY,
- DPASTARTHOL,
- DPASTARTL,
- DPASTARTSOL,
- DPASTARTW,
- DPCALLOUT,
- DPCOA,
- DPCOACCENT,
- DPCOBESTFIT,
- DPCOBORDER,
- DPCODABS,
- DPCODBOTTOM,
- DPCODCENTER,
- DPCODESCENT,
- DPCODTOP,
- DPCOLENGTH,
- DPCOMINUSX,
- DPCOMINUSY,
- DPCOOFFSET,
- DPCOSMARTA,
- DPCOTDOUBLE,
- DPCOTRIGHT,
- DPCOTSINGLE,
- DPCOTTRIPLE,
- DPCOUNT,
- DPELLIPSE,
- DPENDGROUP,
- DPFILLBGCB,
- DPFILLBGCG,
- DPFILLBGCR,
- DPFILLBGGRAY,
- DPFILLBGPAL,
- DPFILLFGCB,
- DPFILLFGCG,
- DPFILLFGCR,
- DPFILLFGGRAY,
- DPFILLFGPAL,
- DPFILLPAT,
- DPGROUP,
- DPLINE,
- DPLINECOB,
- DPLINECOG,
- DPLINECOR,
- DPLINEDADO,
- DPLINEDADODO,
- DPLINEDASH,
- DPLINEDOT,
- DPLINEGRAY,
- DPLINEHOLLOW,
- DPLINEPAL,
- DPLINESOLID,
- DPLINEW,
- DPPOLYCOUNT,
- DPPOLYGON,
- DPPOLYLINE,
- DPPTX,
- DPPTY,
- DPRECT,
- DPROUNDR,
- DPSHADOW,
- DPSHADX,
- DPSHADY,
- DPTXBTLR,
- DPTXBX,
- DPTXBXMAR,
- DPTXBXTEXT,
- DPTXLRTB,
- DPTXLRTBV,
- DPTXTBRL,
- DPTXTBRLV,
- DPX,
- DPXSIZE,
- DPY,
- DPYSIZE,
- DROPCAPLI,
- DROPCAPT,
- DS,
- DXFRTEXT,
- DY,
- EBCEND,
- EBCSTART,
- EDMINS,
- EMBO,
- EMDASH,
- EMFBLIP,
- EMSPACE,
- ENDASH,
- ENDDOC,
- ENDNHERE,
- ENDNOTES,
- ENFORCEPROT,
- ENSPACE,
- EXPND,
- EXPNDTW,
- EXPSHRTN,
- F,
- FAAUTO,
- FACENTER,
- FACINGP,
- FACTOIDNAME,
- FAFIXED,
- FAHANG,
- FALT,
- FAROMAN,
- FAVAR,
- FBIAS,
- FBIDI,
- FBIDIS,
- FBIMAJOR,
- FBIMINOR,
- FCHARS,
- FCHARSET,
- FCS,
- FDBMAJOR,
- FDBMINOR,
- FDECOR,
- FELNBRELEV,
- FET,
- FETCH,
- FFDEFRES,
- FFDEFTEXT,
- FFENTRYMCR,
- FFEXITMCR,
- FFFORMAT,
- FFHASLISTBOX,
- FFHELPTEXT,
- FFHPS,
- FFL,
- FFMAXLEN,
- FFNAME,
- FFOWNHELP,
- FFOWNSTAT,
- FFPROT,
- FFRECALC,
- FFRES,
- FFSIZE,
- FFSTATTEXT,
- FFTYPE,
- FFTYPETXT,
- FHIMAJOR,
- FHIMINOR,
- FI,
- FID,
- FIELD,
- FILE,
- FILETBL,
- FITTEXT,
- FJGOTHIC,
- FJMINCHOU,
- FLDALT,
- FLDDIRTY,
- FLDEDIT,
- FLDINST,
- FLDLOCK,
- FLDPRIV,
- FLDRSLT,
- FLDTYPE,
- FLOMAJOR,
- FLOMINOR,
- FMODERN,
- FN,
- FNAME,
- FNETWORK,
- FNIL,
- FNONFILESYS,
- FONTEMB,
- FONTFILE,
- FONTTBL,
- FOOTER,
- FOOTERF,
- FOOTERL,
- FOOTERR,
- FOOTERY,
- FOOTNOTE,
- FORCEUPGRADE,
- FORMDISP,
- FORMFIELD,
- FORMPROT,
- FORMSHADE,
- FOSNUM,
- FPRQ,
- FRACWIDTH,
- FRELATIVE,
- FRMTXBTLR,
- FRMTXLRTB,
- FRMTXLRTBV,
- FRMTXTBRL,
- FRMTXTBRLV,
- FROMAN,
- FROMHTML,
- FROMTEXT,
- FS,
- FSCRIPT,
- FSWISS,
- FTECH,
- FTNALT,
- FTNBJ,
- FTNCN,
- FTNIL,
- FTNLYTWNINE,
- FTNNALC,
- FTNNAR,
- FTNNAUC,
- FTNNCHI,
- FTNNCHOSUNG,
- FTNNCNUM,
- FTNNDBAR,
- FTNNDBNUM,
- FTNNDBNUMD,
- FTNNDBNUMK,
- FTNNDBNUMT,
- FTNNGANADA,
- FTNNGBNUM,
- FTNNGBNUMD,
- FTNNGBNUMK,
- FTNNGBNUML,
- FTNNRLC,
- FTNNRUC,
- FTNNZODIAC,
- FTNNZODIACD,
- FTNNZODIACL,
- FTNRESTART,
- FTNRSTCONT,
- FTNRSTPG,
- FTNSEP,
- FTNSEPC,
- FTNSTART,
- FTNTJ,
- FTTRUETYPE,
- FVALIDDOS,
- FVALIDHPFS,
- FVALIDMAC,
- FVALIDNTFS,
- G,
- GCW,
- GENERATOR,
- GREEN,
- GRFDOCEVENTS,
- GRIDTBL,
- GUTTER,
- GUTTERPRL,
- GUTTERSXN,
- HEADER,
- HEADERF,
- HEADERL,
- HEADERR,
- HEADERY,
- HICH,
- HIGHLIGHT,
- HL,
- HLFR,
- HLINKBASE,
- HLLOC,
- HLSRC,
- HORZDOC,
- HORZSECT,
- HORZVERT,
- HR,
- HRES,
- HRULE,
- HSV,
- HTMAUTSP,
- HTMLBASE,
- HTMLRTF,
- HTMLTAG,
- HWELEV,
- HYPHAUTO,
- HYPHCAPS,
- HYPHCONSEC,
- HYPHHOTZ,
- HYPHPAR,
- I,
- ID,
- IGNOREMIXEDCONTENT,
- ILFOMACATCLNUP,
- ILVL,
- IMPR,
- INDMIRROR,
- INDRLSWELEVEN,
- INFO,
- INSRSID,
- INTBL,
- IPGP,
- IROWBAND,
- IROW,
- ITAP,
- IXE,
- JCOMPRESS,
- JEXPAND,
- JIS,
- JPEGBLIP,
- JSKSU,
- KEEP,
- KEEPN,
- KERNING,
- KEYCODE,
- KEYWORDS,
- KRNPRSNET,
- KSULANG,
- JCLISTTAB,
- LANDSCAPE,
- LANG,
- LANGFE,
- LANGFENP,
- LANGNP,
- LASTROW,
- LATENTSTYLES,
- LBR,
- LCHARS,
- LDBLQUOTE,
- LEVEL,
- LEVELFOLLOW,
- LEVELINDENT,
- LEVELJC,
- LEVELJCN,
- LEVELLEGAL,
- LEVELNFC,
- LEVELNFCN,
- LEVELNORESTART,
- LEVELNUMBERS,
- LEVELOLD,
- LEVELPICTURE,
- LEVELPICTURENOSIZE,
- LEVELPREV,
- LEVELPREVSPACE,
- LEVELSPACE,
- LEVELSTARTAT,
- LEVELTEMPLATEID,
- LEVELTEXT,
- LFOLEVEL,
- LI,
- LINE,
- LINEBETCOL,
- LINECONT,
- LINEMOD,
- LINEPPAGE,
- LINERESTART,
- LINESTART,
- LINESTARTS,
- LINEX,
- LINKSELF,
- LINKSTYLES,
- LINKVAL,
- LIN,
- LISA,
- LISB,
- LIST,
- LISTHYBRID,
- LISTID,
- LISTLEVEL,
- LISTNAME,
- LISTOVERRIDE,
- LISTOVERRIDECOUNT,
- LISTOVERRIDEFORMAT,
- LISTOVERRIDESTARTAT,
- LISTOVERRIDETABLE,
- LISTPICTURE,
- LISTRESTARTHDN,
- LISTSIMPLE,
- LISTSTYLEID,
- LISTSTYLENAME,
- LISTTABLE,
- LISTTEMPLATEID,
- LISTTEXT,
- LNBRKRULE,
- LNDSCPSXN,
- LNONGRID,
- LOCH,
- LQUOTE,
- LS,
- LSDLOCKED,
- LSDLOCKEDDEF,
- LSDLOCKEDEXCEPT,
- LSDPRIORITY,
- LSDPRIORITYDEF,
- LSDQFORMAT,
- LSDQFORMATDEF,
- LSDSEMIHIDDEN,
- LSDSEMIHIDDENDEF,
- LSDSTIMAX,
- LSDUNHIDEUSED,
- LSDUNHIDEUSEDDEF,
- LTRCH,
- LTRDOC,
- LTRMARK,
- LTRPAR,
- LTRROW,
- LTRSECT,
- LVLTENTATIVE,
- LYTCALCTBLWD,
- LYTEXCTTP,
- LYTPRTMET,
- LYTTBLRTGR,
- MAC,
- MACC,
- MACCPR,
- MACPICT,
- MAILMERGE,
- MAKEBACKUP,
- MALN,
- MALNSCR,
- MANAGER,
- MARGB,
- MARGBSXN,
- MARGL,
- MARGLSXN,
- MARGMIRROR,
- MARGMIRSXN,
- MARGPR,
- MARGR,
- MARGRSXN,
- MARGSZ,
- MARGT,
- MARGTSXN,
- MBAR,
- MBARPR,
- MBASEJC,
- MBEGCHR,
- MBORDERBOX,
- MBORDERBOXPR,
- MBOX,
- MBOXPR,
- MBRK,
- MBRKBIN,
- MBRKBINSUB,
- MCGP,
- MCGPRULE,
- MCHR,
- MCOUNT,
- MCSP,
- MCTRLPR,
- MD,
- MDEFJC,
- MDEG,
- MDEGHIDE,
- MDEN,
- MDIFF,
- MDIFFSTY,
- MDISPDEF,
- MDPR,
- ME,
- MENDCHR,
- MEQARR,
- MEQARRPR,
- MF,
- MFNAME,
- MFPR,
- MFUNC,
- MFUNCPR,
- MGROUPCHR,
- MGROUPCHRPR,
- MGROW,
- MHIDEBOT,
- MHIDELEFT,
- MHIDERIGHT,
- MHIDETOP,
- MHTMLTAG,
- MIN,
- MINTERSP,
- MINTLIM,
- MINTRASP,
- MJC,
- MLIM,
- MLIMLOC,
- MLIMLOW,
- MLIMLOWPR,
- MLIMUPP,
- MLIMUPPPR,
- MLIT,
- MLMARGIN,
- MM,
- MMADDFIELDNAME,
- MMATH,
- MMATHFONT,
- MMATHPICT,
- MMATHPR,
- MMATTACH,
- MMAXDIST,
- MMBLANKLINES,
- MMC,
- MMCJC,
- MMCONNECTSTR,
- MMCONNECTSTRDATA,
- MMCPR,
- MMCS,
- MMDATASOURCE,
- MMDATATYPEACCESS,
- MMDATATYPEEXCEL,
- MMDATATYPEFILE,
- MMDATATYPEODBC,
- MMDATATYPEODSO,
- MMDATATYPEQT,
- MMDEFAULTSQL,
- MMDESTEMAIL,
- MMDESTFAX,
- MMDESTNEWDOC,
- MMDESTPRINTER,
- MMERRORS,
- MMFTTYPEADDRESS,
- MMFTTYPEBARCODE,
- MMFTTYPEDBCOLUMN,
- MMFTTYPEMAPPED,
- MMFTTYPENULL,
- MMFTTYPESALUTATION,
- MMHEADERSOURCE,
- MMJDSOTYPE,
- MMLINKTOQUERY,
- MMMAILSUBJECT,
- MMMAINTYPECATALOG,
- MMMAINTYPEEMAIL,
- MMMAINTYPEENVELOPES,
- MMMAINTYPEFAX,
- MMMAINTYPELABELS,
- MMMAINTYPELETTERS,
- MMODSO,
- MMODSOACTIVE,
- MMODSOCOLDELIM,
- MMODSOCOLUMN,
- MMODSODYNADDR,
- MMODSOFHDR,
- MMODSOFILTER,
- MMODSOFLDMPDATA,
- MMODSOFMCOLUMN,
- MMODSOHASH,
- MMODSOLID,
- MMODSOMAPPEDNAME,
- MMODSONAME,
- MMODSORECIPDATA,
- MMODSOSORT,
- MMODSOSRC,
- MMODSOTABLE,
- MMODSOUDL,
- MMODSOUDLDATA,
- MMODSOUNIQUETAG,
- MMPR,
- MMQUERY,
- MMR,
- MMRECCUR,
- MMSHOWDATA,
- MNARY,
- MNARYLIM,
- MNARYPR,
- MNOBREAK,
- MNOR,
- MNUM,
- MO,
- MOBJDIST,
- MOMATH,
- MOMATHPARA,
- MOMATHPARAPR,
- MOPEMU,
- MPHANT,
- MPHANTPR,
- MPLCHIDE,
- MPOS,
- MPOSTSP,
- MPRESP,
- MR,
- MRAD,
- MRADPR,
- MRMARGIN,
- MRPR,
- MRSP,
- MRSPRULE,
- MSCR,
- MSEPCHR,
- MSHOW,
- MSHP,
- MSMALLFRAC,
- MSMCAP,
- MSPRE,
- MSPREPR,
- MSSUB,
- MSSUBPR,
- MSSUBSUP,
- MSSUBSUPPR,
- MSSUP,
- MSSUPPR,
- MSTRIKEBLTR,
- MSTRIKEH,
- MSTRIKETLBR,
- MSTRIKEV,
- MSTY,
- MSUB,
- MSUBHIDE,
- MSUP,
- MSUPHIDE,
- MTRANSP,
- MTYPE,
- MUSER,
- MVAUTH,
- MVDATE,
- MVERTJC,
- MVF,
- MVFMF,
- MVFML,
- MVT,
- MVTOF,
- MVTOL,
- MWRAPINDENT,
- MWRAPRIGHT,
- MZEROASC,
- MZERODESC,
- MZEROWID,
- NESTCELL,
- NESTROW,
- NESTTABLEPROPS,
- NEWTBLSTYRULS,
- NEXTFILE,
- NOAFCNSTTBL,
- NOBRKWRPTBL,
- NOCOLBAL,
- NOCOMPATOPTIONS,
- NOCWRAP,
- NOCXSPTABLE,
- NOEXTRASPRL,
- NOFCHARS,
- NOFCHARSWS,
- NOFEATURETHROTTLE,
- NOFPAGES,
- NOFWORDS,
- NOGROWAUTOFIT,
- NOINDNMBRTS,
- NOJKERNPUNCT,
- NOLEAD,
- NOLINE,
- NOLNHTADJTBL,
- NONESTTABLES,
- NONSHPPICT,
- NOOVERFLOW,
- NOPROOF,
- NOQFPROMOTE,
- NOSECTEXPAND,
- NOSNAPLINEGRID,
- NOSPACEFORUL,
- NOSUPERSUB,
- NOTABIND,
- NOTBRKCNSTFRCTBL,
- NOTCVASP,
- NOTVATXBX,
- NOUICOMPAT,
- NOULTRLSPC,
- NOWIDCTLPAR,
- NOWRAP,
- NOWWRAP,
- NOXLATTOYEN,
- OBJALIAS,
- OBJALIGN,
- OBJATTPH,
- OBJAUTLINK,
- OBJCLASS,
- OBJCROPB,
- OBJCROPL,
- OBJCROPR,
- OBJCROPT,
- OBJDATA,
- OBJECT,
- OBJEMB,
- OBJH,
- OBJHTML,
- OBJICEMB,
- OBJLINK,
- OBJLOCK,
- OBJNAME,
- OBJOCX,
- OBJPUB,
- OBJSCALEX,
- OBJSCALEY,
- OBJSECT,
- OBJSETSIZE,
- OBJSUB,
- OBJTIME,
- OBJTRANSY,
- OBJUPDATE,
- OBJW,
- OGUTTER,
- OLDAS,
- OLDCPROPS,
- OLDLINEWRAP,
- OLDPPROPS,
- OLDSPROPS,
- OLDTPROPS,
- OLECLSID,
- OPERATOR,
- OTBLRUL,
- OUTL,
- OUTLINELEVEL,
- OVERLAY,
- PAGE,
- PAGEBB,
- PANOSE,
- PAPERH,
- PAPERW,
- PAR,
- PARARSID,
- PARD,
- PASSWORD,
- PASSWORDHASH,
- PC,
- PCA,
- PGBRDRB,
- PGBRDRFOOT,
- PGBRDRHEAD,
- PGBRDRL,
- PGBRDROPT,
- PGBRDRR,
- PGBRDRSNAP,
- PGBRDRT,
- PGHSXN,
- PGNBIDIA,
- PGNBIDIB,
- PGNCHOSUNG,
- PGNCNUM,
- PGNCONT,
- PGNDBNUM,
- PGNDBNUMD,
- PGNDBNUMK,
- PGNDBNUMT,
- PGNDEC,
- PGNDECD,
- PGNGANADA,
- PGNGBNUM,
- PGNGBNUMD,
- PGNGBNUMK,
- PGNGBNUML,
- PGNHINDIA,
- PGNHINDIB,
- PGNHINDIC,
- PGNHINDID,
- PGNHN,
- PGNHNSC,
- PGNHNSH,
- PGNHNSM,
- PGNHNSN,
- PGNHNSP,
- PGNID,
- PGNLCLTR,
- PGNLCRM,
- PGNRESTART,
- PGNSTART,
- PGNSTARTS,
- PGNTHAIA,
- PGNTHAIB,
- PGNTHAIC,
- PGNUCLTR,
- PGNUCRM,
- PGNVIETA,
- PGNX,
- PGNY,
- PGNZODIAC,
- PGNZODIACD,
- PGNZODIACL,
- PGP,
- PGPTBL,
- PGWSXN,
- PHCOL,
- PHMRG,
- PHPG,
- PICBMP,
- PICBPP,
- PICCROPB,
- PICCROPL,
- PICCROPR,
- PICCROPT,
- PICH,
- PICHGOAL,
- PICPROP,
- PICSCALED,
- PICSCALEX,
- PICSCALEY,
- PICT,
- PICW,
- PICWGOAL,
- PINDTABQC,
- PINDTABQL,
- PINDTABQR,
- PLAIN,
- PMARTABQC,
- PMARTABQL,
- PMARTABQR,
- PMMETAFILE,
- PN,
- PNACROSS,
- PNAIU,
- PNAIUD,
- PNAIUEO,
- PNAIUEOD,
- PNB,
- PNBIDIA,
- PNBIDIB,
- PNCAPS,
- PNCARD,
- PNCF,
- PNCHOSUNG,
- PNCNUM,
- PNDBNUM,
- PNDBNUMD,
- PNDBNUMK,
- PNDBNUML,
- PNDBNUMT,
- PNDEC,
- PNDECD,
- PNF,
- PNFS,
- PNGANADA,
- PNGBLIP,
- PNGBNUM,
- PNGBNUMD,
- PNGBNUMK,
- PNGBNUML,
- PNHANG,
- PNI,
- PNINDENT,
- PNIROHA,
- PNIROHAD,
- PNLCLTR,
- PNLCRM,
- PNLVL,
- PNLVLBLT,
- PNLVLBODY,
- PNLVLCONT,
- PNNUMONCE,
- PNORD,
- PNORDT,
- PNPREV,
- PNQC,
- PNQL,
- PNQR,
- PNRAUTH,
- PNRDATE,
- PNRESTART,
- PNRNFC,
- PNRNOT,
- PNRPNBR,
- PNRRGB,
- PNRSTART,
- PNRSTOP,
- PNRXST,
- PNSCAPS,
- PNSECLVL,
- PNSP,
- PNSTART,
- PNSTRIKE,
- PNTEXT,
- PNTXTA,
- PNTXTB,
- PNUCLTR,
- PNUCRM,
- PNUL,
- PNULD,
- PNULDASH,
- PNULDASHD,
- PNULDASHDD,
- PNULDB,
- PNULHAIR,
- PNULNONE,
- PNULTH,
- PNULW,
- PNULWAVE,
- PNZODIAC,
- PNZODIACD,
- PNZODIACL,
- POSNEGX,
- POSNEGY,
- POSX,
- POSXC,
- POSXI,
- POSXL,
- POSXO,
- POSXR,
- POSY,
- POSYB,
- POSYC,
- POSYIL,
- POSYIN,
- POSYOUT,
- POSYT,
- PRAUTH,
- PRCOLBL,
- PRDATE,
- PRINTDATA,
- PRINTIM,
- PRIVATE,
- PROPNAME,
- PROPTYPE,
- PROTECT,
- PROTEND,
- PROTLEVEL,
- PROTSTART,
- PROTUSERTBL,
- PSOVER,
- PSZ,
- PTABLDOT,
- PTABLMDOT,
- PTABLMINUS,
- PTABLNONE,
- PTABLUSCORE,
- PUBAUTO,
- PVMRG,
- PVPARA,
- PVPG,
- PWD,
- PXE,
- QC,
- QD,
- QJ,
- QK,
- QL,
- QMSPACE,
- QR,
- QT,
- RAWCLBGDKBDIAG,
- RAWCLBGBDIAG,
- RAWCLBGCROSS,
- RAWCLBGDCROSS,
- RAWCLBGDKCROSS,
- RAWCLBGDKDCROSS,
- RAWCLBGDKFDIAG,
- RAWCLBGDKHOR,
- RAWCLBGDKVERT,
- RAWCLBGFDIAG,
- RAWCLBGHORIZ,
- RAWCLBGVERT,
- RDBLQUOTE,
- READONLYRECOMMENDED,
- READPROT,
- RED,
- RELYONVML,
- REMDTTM,
- REMPERSONALINFO,
- RESULT,
- REVAUTH,
- REVAUTHDEL,
- REVBAR,
- REVDTTM,
- REVDTTMDEL,
- REVISED,
- REVISIONS,
- REVPROP,
- REVPROT,
- REVTBL,
- REVTIM,
- RI,
- RIN,
- ROW,
- RQUOTE,
- RSID,
- RSIDROOT,
- RSIDTBL,
- RSLTBMP,
- RSLTHTML,
- RSLTMERGE,
- RSLTPICT,
- RSLTRTF,
- RSLTTXT,
- RTF,
- RTLCH,
- RTLDOC,
- RTLGUTTER,
- RTLMARK,
- RTLPAR,
- RTLROW,
- RTLSECT,
- RXE,
- S,
- SA,
- SAAUTO,
- SAFTNNALC,
- SAFTNNAR,
- SAFTNNAUC,
- SAFTNNCHI,
- SAFTNNCHOSUNG,
- SAFTNNCNUM,
- SAFTNNDBAR,
- SAFTNNDBNUM,
- SAFTNNDBNUMD,
- SAFTNNDBNUMK,
- SAFTNNDBNUMT,
- SAFTNNGANADA,
- SAFTNNGBNUM,
- SAFTNNGBNUMD,
- SAFTNNGBNUMK,
- SAFTNNGBNUML,
- SAFTNNRLC,
- SAFTNNRUC,
- SAFTNNZODIAC,
- SAFTNNZODIACD,
- SAFTNNZODIACL,
- SAFTNRESTART,
- SAFTNRSTCONT,
- SAFTNSTART,
- SAUTOUPD,
- SAVEINVALIDXML,
- SAVEPREVPICT,
- SB,
- SBASEDON,
- SBAUTO,
- SBKCOL,
- SBKEVEN,
- SBKNONE,
- SBKODD,
- SBKPAGE,
- SBYS,
- SCAPS,
- SCOMPOSE,
- SEC,
- SECT,
- SECTD,
- SECTDEFAULTCL,
- SECTEXPAND,
- SECTLINEGRID,
- SECTNUM,
- SECTRSID,
- SECTSPECIFYCL,
- SECTSPECIFYGENN,
- SECTSPECIFYL,
- SECTUNLOCKED,
- SFTNBJ,
- SFTNNALC,
- SFTNNAR,
- SFTNNAUC,
- SFTNNCHI,
- SFTNNCHOSUNG,
- SFTNNCNUM,
- SFTNNDBAR,
- SFTNNDBNUM,
- SFTNNDBNUMD,
- SFTNNDBNUMK,
- SFTNNDBNUMT,
- SFTNNGANADA,
- SFTNNGBNUM,
- SFTNNGBNUMD,
- SFTNNGBNUMK,
- SFTNNGBNUML,
- SFTNNRLC,
- SFTNNRUC,
- SFTNNZODIAC,
- SFTNNZODIACD,
- SFTNNZODIACL,
- SFTNRESTART,
- SFTNRSTCONT,
- SFTNRSTPG,
- SFTNSTART,
- SFTNTJ,
- SHAD,
- SHADING,
- SHIDDEN,
- SHIFT,
- SHOWPLACEHOLDTEXT,
- SHOWXMLERRORS,
- SHP,
- SHPBOTTOM,
- SHPBXCOLUMN,
- SHPBXIGNORE,
- SHPBXMARGIN,
- SHPBXPAGE,
- SHPBYIGNORE,
- SHPBYMARGIN,
- SHPBYPAGE,
- SHPBYPARA,
- SHPFBLWTXT,
- SHPFHDR,
- SHPGRP,
- SHPINST,
- SHPLEFT,
- SHPLID,
- SHPLOCKANCHOR,
- SHPPICT,
- SHPRIGHT,
- SHPRSLT,
- SHPTOP,
- SHPTXT,
- SHPWRK,
- SHPWR,
- SHPZ,
- SL,
- SLINK,
- SLMULT,
- SLOCKED,
- SN,
- SNAPTOGRIDINCELL,
- SNEXT,
- SOFTCOL,
- SOFTLHEIGHT,
- SOFTLINE,
- SOFTPAGE,
- SP,
- SPERSONAL,
- SPLTPGPAR,
- SPLYTWNINE,
- SPRIORITY,
- SPRSBSP,
- SPRSLNSP,
- SPRSSPBF,
- SPRSTSM,
- SPRSTSP,
- SPV,
- SQFORMAT,
- SRAUTH,
- SRDATE,
- SREPLY,
- SSEMIHIDDEN,
- STATICVAL,
- STEXTFLOW,
- STRIKE,
- STRIKED,
- STSHFBI,
- STSHFDBCH,
- STSHFHICH,
- STSHFLOCH,
- STYLELOCK,
- STYLELOCKBACKCOMP,
- STYLELOCKENFORCED,
- STYLELOCKQFSET,
- STYLELOCKTHEME,
- STYLESHEET,
- STYLESORTMETHOD,
- STYRSID,
- SUB,
- SUBDOCUMENT,
- SUBFONTBYSIZE,
- SUBJECT,
- SUNHIDEUSED,
- SUPER,
- SV,
- SVB,
- SWPBDR,
- TAB,
- TABSNOOVRLP,
- TAPRTL,
- TB,
- TBLIND,
- TBLINDTYPE,
- TBLLKBESTFIT,
- TBLLKBORDER,
- TBLLKCOLOR,
- TBLLKFONT,
- TBLLKHDRCOLS,
- TBLLKHDRROWS,
- TBLLKLASTCOL,
- TBLLKLASTROW,
- TBLLKNOCOLBAND,
- TBLLKNOROWBAND,
- TBLLKSHADING,
- TBLRSID,
- TC,
- TCELLD,
- TCF,
- TCL,
- TCN,
- TDFRMTXTBOTTOM,
- TDFRMTXTLEFT,
- TDFRMTXTRIGHT,
- TDFRMTXTTOP,
- TEMPLATE,
- THEMEDATA,
- THEMELANG,
- THEMELANGCS,
- THEMELANGFE,
- TIME,
- TITLE,
- TITLEPG,
- TLDOT,
- TLEQ,
- TLHYPH,
- TLMDOT,
- TLTH,
- TLUL,
- TOPLINEPUNCT,
- TPHCOL,
- TPHMRG,
- TPHPG,
- TPOSNEGX,
- TPOSNEGY,
- TPOSXC,
- TPOSXI,
- TPOSXL,
- TPOSX,
- TPOSXO,
- TPOSXR,
- TPOSY,
- TPOSYB,
- TPOSYC,
- TPOSYIL,
- TPOSYIN,
- TPOSYOUT,
- TPOSYT,
- TPVMRG,
- TPVPARA,
- TPVPG,
- TQC,
- TQDEC,
- TQR,
- TRACKFORMATTING,
- TRACKMOVES,
- TRANSMF,
- TRAUTH,
- TRAUTOFIT,
- TRBGBDIAG,
- TRBGCROSS,
- TRBGDCROSS,
- TRBGDKBDIAG,
- TRBGDKCROSS,
- TRBGDKDCROSS,
- TRBGDKFDIAG,
- TRBGDKHOR,
- TRBGDKVERT,
- TRBGFDIAG,
- TRBGHORIZ,
- TRBGVERT,
- TRBRDRB,
- TRBRDRH,
- TRBRDRL,
- TRBRDRR,
- TRBRDRT,
- TRBRDRV,
- TRCBPAT,
- TRCFPAT,
- TRDATE,
- TRFTSWIDTHA,
- TRFTSWIDTHB,
- TRFTSWIDTH,
- TRGAPH,
- TRHDR,
- TRKEEP,
- TRKEEPFOLLOW,
- TRLEFT,
- TROWD,
- TRPADDB,
- TRPADDFB,
- TRPADDFL,
- TRPADDFR,
- TRPADDFT,
- TRPADDL,
- TRPADDR,
- TRPADDT,
- TRPADOB,
- TRPADOFB,
- TRPADOFL,
- TRPADOFR,
- TRPADOFT,
- TRPADOL,
- TRPADOR,
- TRPADOT,
- TRPAT,
- TRQC,
- TRQL,
- TRQR,
- TRRH,
- TRSHDNG,
- TRSPDB,
- TRSPDFB,
- TRSPDFL,
- TRSPDFR,
- TRSPDFT,
- TRSPDL,
- TRSPDR,
- TRSPDT,
- TRSPOB,
- TRSPOFB,
- TRSPOFL,
- TRSPOFR,
- TRSPOFT,
- TRSPOL,
- TRSPOR,
- TRSPOT,
- TRUNCATEFONTHEIGHT,
- TRUNCEX,
- TRWWIDTHA,
- TRWWIDTHB,
- TRWWIDTH,
- TS,
- TSBGBDIAG,
- TSBGCROSS,
- TSBGDCROSS,
- TSBGDKBDIAG,
- TSBGDKCROSS,
- TSBGDKDCROSS,
- TSBGDKFDIAG,
- TSBGDKHOR,
- TSBGDKVERT,
- TSBGFDIAG,
- TSBGHORIZ,
- TSBGVERT,
- TSBRDRB,
- TSBRDRDGL,
- TSBRDRDGR,
- TSBRDRH,
- TSBRDRL,
- TSBRDRR,
- TSBRDRT,
- TSBRDRV,
- TSCBANDHORZEVEN,
- TSCBANDHORZODD,
- TSCBANDSH,
- TSCBANDSV,
- TSCBANDVERTEVEN,
- TSCBANDVERTODD,
- TSCELLCBPAT,
- TSCELLCFPAT,
- TSCELLPADDB,
- TSCELLPADDFB,
- TSCELLPADDFL,
- TSCELLPADDFR,
- TSCELLPADDFT,
- TSCELLPADDL,
- TSCELLPADDR,
- TSCELLPADDT,
- TSCELLPCT,
- TSCELLWIDTH,
- TSCELLWIDTHFTS,
- TSCFIRSTCOL,
- TSCFIRSTROW,
- TSCLASTCOL,
- TSCLASTROW,
- TSCNECELL,
- TSCNWCELL,
- TSCSECELL,
- TSCSWCELL,
- TSD,
- TSNOWRAP,
- TSROWD,
- TSVERTALB,
- TSVERTALC,
- TSVERTALT,
- TWOINONE,
- TWOONONE,
- TX,
- TXBXTWALWAYS,
- TXBXTWFIRST,
- TXBXTWFIRSTLAST,
- TXBXTWLAST,
- TXBXTWNO,
- TXE,
- U,
- UC,
- UD,
- UL,
- ULC,
- ULD,
- ULDASH,
- ULDASHD,
- ULDASHDD,
- ULDB,
- ULHAIR,
- ULHWAVE,
- ULLDASH,
- ULNONE,
- ULTH,
- ULTHD,
- ULTHDASH,
- ULTHDASHD,
- ULTHDASHDD,
- ULTHLDASH,
- ULULDBWAVE,
- ULW,
- ULWAVE,
- UP,
- UPR,
- URTF,
- USELTBALN,
- USENORMSTYFORLIST,
- USERPROPS,
- USEXFORM,
- UTINL,
- V,
- VALIDATEXML,
- VERN,
- VERSION,
- VERTAL,
- VERTALB,
- VERTALC,
- VERTALJ,
- VERTALT,
- VERTDOC,
- VERTSECT,
- VIEWBKSP,
- VIEWKIND,
- VIEWNOBOUND,
- VIEWSCALE,
- VIEWZK,
- WBITMAP,
- WBMBITSPIXEL,
- WBMPLANES,
- WBMWIDTHBYTE,
- WEBHIDDEN,
- WGRFFMTFILTER,
- WIDCTLPAR,
- WIDOWCTRL,
- WINDOWCAPTION,
- WMETAFILE,
- WPEQN,
- WPJST,
- WPSP,
- WRAPAROUND,
- WRAPDEFAULT,
- WRAPTHROUGH,
- WRAPTIGHT,
- WRAPTRSP,
- WRITERESERVATION,
- WRITERESERVHASH,
- WRPPUNCT,
- XE,
- XEF,
- XFORM,
- XMLATTR,
- XMLATTRNAME,
- XMLATTRNS,
- XMLATTRVALUE,
- XMLCLOSE,
- XMLNAME,
- XMLNS,
- XMLNSTBL,
- XMLOPEN,
- XMLSDTTCELL,
- XMLSDTTPARA,
- XMLSDTTREGULAR,
- XMLSDTTROW,
- XMLSDTTUNKNOWN,
- YR,
- YTS,
- YXE,
- ZWBO,
- ZWJ,
- ZWNBO,
- ZWNJ,
- FLYMAINCNT,
- FLYVERT,
- FLYHORZ,
- FLYANCHOR
-};
-const char* keywordToString(RTFKeyword nKeyword);
-
-/// Types of an RTF Control Word
-enum class RTFControlType
-{
- FLAG, // eg \sbknone takes no parameter
- DESTINATION, // eg \fonttbl, if ignored, the whole group should be skipped
- SYMBOL, // eg \tab
- TOGGLE, // eg \b (between on and off)
- VALUE // eg \fs (requires parameter)
-};
-
-/// Represents an RTF Control Word
-class RTFSymbol
-{
- const char* m_sKeyword;
- RTFControlType m_eControlType;
- RTFKeyword m_nIndex;
-
- int m_nDefValue; ///< Most of the control words default to 0.
-
-public:
- RTFSymbol(const char* sKeyword, RTFControlType nControlType, RTFKeyword nIndex, int nDefValue)
- : m_sKeyword(sKeyword)
- , m_eControlType(nControlType)
- , m_nIndex(nIndex)
- , m_nDefValue(nDefValue)
- {
- }
-
- const char* GetKeyword() const { return m_sKeyword; }
-
- RTFControlType GetControlType() const { return m_eControlType; }
-
- RTFKeyword GetIndex() const { return m_nIndex; }
-
- int GetDefValue() const { return m_nDefValue; }
-};
-
-extern RTFSymbol const aRTFControlWords[];
-extern const int nRTFControlWords;
-
-/// Represents an RTF Math Control Word
-class RTFMathSymbol
-{
- RTFKeyword m_eKeyword;
- int m_nToken; ///< This is the OOXML token equivalent.
- Destination m_eDestination;
-
-public:
- RTFMathSymbol(RTFKeyword eKeyword, int nToken = 0,
- Destination eDestination = Destination::NORMAL)
- : m_eKeyword(eKeyword)
- , m_nToken(nToken)
- , m_eDestination(eDestination)
- {
- }
-
- int GetToken() const { return m_nToken; }
-
- Destination GetDestination() const { return m_eDestination; }
-
- bool operator<(const RTFMathSymbol& rOther) const;
-};
-
-extern RTFMathSymbol const aRTFMathControlWords[];
-extern const int nRTFMathControlWords;
-
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfdispatchdestination.cxx b/writerfilter/source/rtftok/rtfdispatchdestination.cxx
deleted file mode 100644
index 8789c3f858a8..000000000000
--- a/writerfilter/source/rtftok/rtfdispatchdestination.cxx
+++ /dev/null
@@ -1,684 +0,0 @@
-/* -*- 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 <sal/config.h>
-
-#include <string_view>
-
-#include "rtfdocumentimpl.hxx"
-
-#include <com/sun/star/document/DocumentProperties.hpp>
-#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
-#include <com/sun/star/text/VertOrientation.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-
-#include <filter/msfilter/escherex.hxx>
-#include <rtl/character.hxx>
-#include <tools/stream.hxx>
-#include <sal/log.hxx>
-
-#include <dmapper/DomainMapperFactory.hxx>
-#include <ooxml/resourceids.hxx>
-
-#include "rtflookahead.hxx"
-#include "rtfreferenceproperties.hxx"
-#include "rtfsdrimport.hxx"
-#include "rtfskipdestination.hxx"
-#include "rtftokenizer.hxx"
-
-using namespace com::sun::star;
-
-namespace writerfilter::rtftok
-{
-RTFError RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword)
-{
- setNeedSect(true);
- checkUnicode(/*bUnicode =*/true, /*bHex =*/true);
- RTFSkipDestination aSkip(*this);
- // special case \upr: ignore everything except nested \ud
- if (Destination::UPR == m_aStates.top().getDestination() && RTFKeyword::UD != nKeyword)
- {
- m_aStates.top().setDestination(Destination::SKIP);
- aSkip.setParsed(false);
- }
- else
- switch (nKeyword)
- {
- case RTFKeyword::RTF:
- break;
- case RTFKeyword::FONTTBL:
- m_aStates.top().setDestination(Destination::FONTTABLE);
- break;
- case RTFKeyword::COLORTBL:
- m_aStates.top().setDestination(Destination::COLORTABLE);
- break;
- case RTFKeyword::STYLESHEET:
- m_aStates.top().setDestination(Destination::STYLESHEET);
- break;
- case RTFKeyword::FIELD:
- m_aStates.top().setDestination(Destination::FIELD);
- m_aStates.top().setFieldLocked(false);
- break;
- case RTFKeyword::DOCVAR:
- m_aStates.top().setDestination(Destination::DOCVAR);
- break;
- case RTFKeyword::FLDINST:
- {
- // Look for the field type
- sal_uInt64 const nPos = Strm().Tell();
- OStringBuffer aBuf;
- char ch = 0;
- bool bFoundCode = false;
- bool bInKeyword = false;
- while (!bFoundCode && ch != '}')
- {
- Strm().ReadChar(ch);
- if ('\\' == ch)
- bInKeyword = true;
- if (!bInKeyword && rtl::isAsciiAlphanumeric(static_cast<unsigned char>(ch)))
- aBuf.append(ch);
- else if (bInKeyword && rtl::isAsciiWhiteSpace(static_cast<unsigned char>(ch)))
- bInKeyword = false;
- if (!aBuf.isEmpty()
- && !rtl::isAsciiAlphanumeric(static_cast<unsigned char>(ch)))
- bFoundCode = true;
- }
-
- if (std::string_view(aBuf) == "INCLUDEPICTURE")
- {
- // Extract the field argument of INCLUDEPICTURE: we handle that
- // at a tokenizer level, as DOCX has no such field.
- aBuf.append(ch);
- while (true)
- {
- Strm().ReadChar(ch);
- if (ch == '}')
- break;
- aBuf.append(ch);
- }
- OUString aFieldCommand = OStringToOUString(aBuf, RTL_TEXTENCODING_UTF8);
- std::tuple<OUString, std::vector<OUString>, std::vector<OUString>> aResult
- = writerfilter::dmapper::splitFieldCommand(aFieldCommand);
- m_aPicturePath
- = std::get<1>(aResult).empty() ? OUString() : std::get<1>(aResult).front();
- }
-
- Strm().Seek(nPos);
-
- // Form data should be handled only for form fields if any
- if (aBuf.toString().indexOf("FORM") != -1)
- m_bFormField = true;
-
- singleChar(cFieldStart);
- m_aStates.top().setDestination(Destination::FIELDINSTRUCTION);
- }
- break;
- case RTFKeyword::FLDRSLT:
- m_aStates.top().setDestination(Destination::FIELDRESULT);
- break;
- case RTFKeyword::LISTTABLE:
- m_aStates.top().setDestination(Destination::LISTTABLE);
- break;
- case RTFKeyword::LISTPICTURE:
- m_aStates.top().setDestination(Destination::LISTPICTURE);
- m_aStates.top().setInListpicture(true);
- break;
- case RTFKeyword::LIST:
- m_aStates.top().setDestination(Destination::LISTENTRY);
- break;
- case RTFKeyword::LISTNAME:
- m_aStates.top().setDestination(Destination::LISTNAME);
- break;
- case RTFKeyword::LFOLEVEL:
- m_aStates.top().setDestination(Destination::LFOLEVEL);
- m_aStates.top().getTableSprms().clear();
- break;
- case RTFKeyword::LISTOVERRIDETABLE:
- m_aStates.top().setDestination(Destination::LISTOVERRIDETABLE);
- break;
- case RTFKeyword::LISTOVERRIDE:
- m_aStates.top().setDestination(Destination::LISTOVERRIDEENTRY);
- break;
- case RTFKeyword::LISTLEVEL:
- m_aStates.top().setDestination(Destination::LISTLEVEL);
- ++m_nListLevel;
- break;
- case RTFKeyword::LEVELTEXT:
- m_aStates.top().setDestination(Destination::LEVELTEXT);
- break;
- case RTFKeyword::LEVELNUMBERS:
- m_aStates.top().setDestination(Destination::LEVELNUMBERS);
- break;
- case RTFKeyword::SHPPICT:
- resetFrame();
- m_aStates.top().setDestination(Destination::SHPPICT);
- break;
- case RTFKeyword::PICT:
- if (m_aStates.top().getDestination() != Destination::SHAPEPROPERTYVALUE)
- m_aStates.top().setDestination(Destination::PICT); // as character
- else
- m_aStates.top().setDestination(
- Destination::SHAPEPROPERTYVALUEPICT); // anchored inside a shape
- break;
- case RTFKeyword::PICPROP:
- m_aStates.top().setDestination(Destination::PICPROP);
- break;
- case RTFKeyword::SP:
- m_aStates.top().setDestination(Destination::SHAPEPROPERTY);
- break;
- case RTFKeyword::SN:
- m_aStates.top().setDestination(Destination::SHAPEPROPERTYNAME);
- break;
- case RTFKeyword::SV:
- m_aStates.top().setDestination(Destination::SHAPEPROPERTYVALUE);
- break;
- case RTFKeyword::SHP:
- m_bNeedCrOrig = m_bNeedCr;
- m_aStates.top().setDestination(Destination::SHAPE);
- m_aStates.top().setInShape(true);
- break;
- case RTFKeyword::SHPINST:
- m_aStates.top().setDestination(Destination::SHAPEINSTRUCTION);
- break;
- case RTFKeyword::NESTTABLEPROPS:
- // do not set any properties of outer table at nested table!
- m_aStates.top().getTableCellSprms() = m_aDefaultState.getTableCellSprms();
- m_aStates.top().getTableCellAttributes() = m_aDefaultState.getTableCellAttributes();
- m_aNestedTableCellsSprms.clear();
- m_aNestedTableCellsAttributes.clear();
- m_nNestedCells = 0;
- m_aStates.top().setDestination(Destination::NESTEDTABLEPROPERTIES);
- break;
- case RTFKeyword::HEADER:
- case RTFKeyword::FOOTER:
- case RTFKeyword::HEADERL:
- case RTFKeyword::HEADERR:
- case RTFKeyword::HEADERF:
- case RTFKeyword::FOOTERL:
- case RTFKeyword::FOOTERR:
- case RTFKeyword::FOOTERF:
- if (!m_pSuperstream)
- {
- Id nId = 0;
- std::size_t nPos = m_nGroupStartPos - 1;
- switch (nKeyword)
- {
- case RTFKeyword::HEADER:
- if (!m_hasRHeader)
- {
- nId = NS_ooxml::LN_headerr;
- m_hasRHeader = true;
- }
- break;
- case RTFKeyword::FOOTER:
- if (!m_hasRFooter)
- {
- nId = NS_ooxml::LN_footerr;
- m_hasRFooter = true;
- }
- break;
- case RTFKeyword::HEADERL:
- nId = NS_ooxml::LN_headerl;
- break;
- case RTFKeyword::HEADERR:
- nId = NS_ooxml::LN_headerr;
- break;
- case RTFKeyword::HEADERF:
- if (!m_hasFHeader)
- {
- nId = NS_ooxml::LN_headerf;
- m_hasFHeader = true;
- }
- break;
- case RTFKeyword::FOOTERL:
- nId = NS_ooxml::LN_footerl;
- break;
- case RTFKeyword::FOOTERR:
- nId = NS_ooxml::LN_footerr;
- break;
- case RTFKeyword::FOOTERF:
- if (!m_hasFFooter)
- {
- nId = NS_ooxml::LN_footerf;
- m_hasFFooter = true;
- }
- break;
- default:
- break;
- }
-
- if (nId != 0)
- m_nHeaderFooterPositions.push(std::make_pair(nId, nPos));
-
- m_aStates.top().setDestination(Destination::SKIP);
- }
- break;
- case RTFKeyword::FOOTNOTE:
- checkFirstRun();
- if (!m_pSuperstream)
- {
- Id nId = NS_ooxml::LN_footnote;
-
- // Check if this is an endnote.
- OStringBuffer aBuf;
- char ch;
- sal_uInt64 const nCurrent = Strm().Tell();
- for (int i = 0; i < 7; ++i)
- {
- Strm().ReadChar(ch);
- aBuf.append(ch);
- }
- Strm().Seek(nCurrent);
- OString aKeyword = aBuf.makeStringAndClear();
- if (aKeyword == "\\ftnalt")
- nId = NS_ooxml::LN_endnote;
-
- if (m_aStates.top().getCurrentBuffer() == &m_aSuperBuffer)
- m_aStates.top().setCurrentBuffer(nullptr);
- bool bCustomMark = false;
- OUString aCustomMark;
- for (auto const& elem : m_aSuperBuffer)
- {
- if (std::get<0>(elem) == BUFFER_UTEXT)
- {
- aCustomMark = std::get<1>(elem)->getString();
- bCustomMark = true;
- }
- }
- m_aSuperBuffer.clear();
- m_aStates.top().setDestination(Destination::FOOTNOTE);
- Mapper().startCharacterGroup();
- runProps();
- if (!m_aStates.top().getCurrentBuffer())
- resolveSubstream(m_nGroupStartPos - 1, nId, aCustomMark);
- else
- {
- RTFSprms aAttributes;
- aAttributes.set(Id(0), new RTFValue(m_nGroupStartPos - 1));
- aAttributes.set(Id(1), new RTFValue(nId));
- aAttributes.set(Id(2), new RTFValue(aCustomMark));
- m_aStates.top().getCurrentBuffer()->push_back(
- Buf_t(BUFFER_RESOLVESUBSTREAM, new RTFValue(aAttributes), nullptr));
- }
- if (bCustomMark)
- {
- m_aStates.top().getCharacterAttributes().clear();
- m_aStates.top().getCharacterSprms().clear();
- auto pValue = new RTFValue(1);
- m_aStates.top().getCharacterAttributes().set(
- NS_ooxml::LN_CT_FtnEdnRef_customMarkFollows, pValue);
- text(aCustomMark);
- }
- Mapper().endCharacterGroup();
- m_aStates.top().setDestination(Destination::SKIP);
- }
- break;
- case RTFKeyword::BKMKSTART:
- m_aStates.top().setDestination(Destination::BOOKMARKSTART);
- break;
- case RTFKeyword::BKMKEND:
- m_aStates.top().setDestination(Destination::BOOKMARKEND);
- break;
- case RTFKeyword::XE:
- m_aStates.top().setDestination(Destination::INDEXENTRY);
- break;
- case RTFKeyword::TC:
- case RTFKeyword::TCN:
- m_aStates.top().setDestination(Destination::TOCENTRY);
- break;
- case RTFKeyword::REVTBL:
- m_aStates.top().setDestination(Destination::REVISIONTABLE);
- break;
- case RTFKeyword::ANNOTATION:
- if (!m_pSuperstream)
- {
- if (!m_aStates.top().getCurrentBuffer())
- {
- resolveSubstream(m_nGroupStartPos - 1, NS_ooxml::LN_annotation);
- }
- else
- {
- RTFSprms aAttributes;
- aAttributes.set(Id(0), new RTFValue(m_nGroupStartPos - 1));
- aAttributes.set(Id(1), new RTFValue(NS_ooxml::LN_annotation));
- aAttributes.set(Id(2), new RTFValue(OUString()));
- m_aStates.top().getCurrentBuffer()->push_back(
- Buf_t(BUFFER_RESOLVESUBSTREAM, new RTFValue(aAttributes), nullptr));
- }
- m_aStates.top().setDestination(Destination::SKIP);
- }
- else
- {
- // If there is an author set, emit it now.
- if (!m_aAuthor.isEmpty() || !m_aAuthorInitials.isEmpty())
- {
- RTFSprms aAttributes;
- if (!m_aAuthor.isEmpty())
- {
- auto pValue = new RTFValue(m_aAuthor);
- aAttributes.set(NS_ooxml::LN_CT_TrackChange_author, pValue);
- }
- if (!m_aAuthorInitials.isEmpty())
- {
- auto pValue = new RTFValue(m_aAuthorInitials);
- aAttributes.set(NS_ooxml::LN_CT_Comment_initials, pValue);
- }
- writerfilter::Reference<Properties>::Pointer_t pProperties
- = new RTFReferenceProperties(std::move(aAttributes));
- Mapper().props(pProperties);
- }
- }
- break;
- case RTFKeyword::SHPTXT:
- case RTFKeyword::DPTXBXTEXT:
- {
- bool bPictureFrame = false;
- for (const auto& rProperty : m_aStates.top().getShape().getProperties())
- {
- if (rProperty.first == "shapeType"
- && rProperty.second
- == std::u16string_view(
- OUString::number(ESCHER_ShpInst_PictureFrame)))
- {
- bPictureFrame = true;
- break;
- }
- }
- if (bPictureFrame)
- // Skip text on picture frames.
- m_aStates.top().setDestination(Destination::SKIP);
- else
- {
- m_aStates.top().setDestination(Destination::SHAPETEXT);
- checkFirstRun();
- dispatchFlag(RTFKeyword::PARD);
- m_bNeedPap = true;
- if (nKeyword == RTFKeyword::SHPTXT)
- {
- if (!m_aStates.top().getCurrentBuffer())
- m_pSdrImport->resolve(m_aStates.top().getShape(), false,
- RTFSdrImport::SHAPE);
- else
- {
- auto pValue = new RTFValue(m_aStates.top().getShape());
- m_aStates.top().getCurrentBuffer()->push_back(
- Buf_t(BUFFER_STARTSHAPE, pValue, nullptr));
- }
- }
- }
- }
- break;
- case RTFKeyword::FORMFIELD:
- if (m_aStates.top().getDestination() == Destination::FIELDINSTRUCTION)
- m_aStates.top().setDestination(Destination::FORMFIELD);
- break;
- case RTFKeyword::FFNAME:
- m_aStates.top().setDestination(Destination::FORMFIELDNAME);
- break;
- case RTFKeyword::FFL:
- m_aStates.top().setDestination(Destination::FORMFIELDLIST);
- break;
- case RTFKeyword::DATAFIELD:
- m_aStates.top().setDestination(Destination::DATAFIELD);
- break;
- case RTFKeyword::INFO:
- m_aStates.top().setDestination(Destination::INFO);
- break;
- case RTFKeyword::CREATIM:
- m_aStates.top().setDestination(Destination::CREATIONTIME);
- break;
- case RTFKeyword::REVTIM:
- m_aStates.top().setDestination(Destination::REVISIONTIME);
- break;
- case RTFKeyword::PRINTIM:
- m_aStates.top().setDestination(Destination::PRINTTIME);
- break;
- case RTFKeyword::AUTHOR:
- m_aStates.top().setDestination(Destination::AUTHOR);
- break;
- case RTFKeyword::KEYWORDS:
- m_aStates.top().setDestination(Destination::KEYWORDS);
- break;
- case RTFKeyword::OPERATOR:
- m_aStates.top().setDestination(Destination::OPERATOR);
- break;
- case RTFKeyword::COMPANY:
- m_aStates.top().setDestination(Destination::COMPANY);
- break;
- case RTFKeyword::COMMENT:
- m_aStates.top().setDestination(Destination::COMMENT);
- break;
- case RTFKeyword::OBJECT:
- {
- // beginning of an OLE Object
- m_aStates.top().setDestination(Destination::OBJECT);
-
- // check if the object is in a special container (e.g. a table)
- if (!m_aStates.top().getCurrentBuffer())
- {
- // the object is in a table or another container.
- // Don't try to treat it as an OLE object (fdo#53594).
- // Use the \result (RTFKeyword::RESULT) element of the object instead,
- // the result element contain picture representing the OLE Object.
- m_bObject = true;
- }
- }
- break;
- case RTFKeyword::OBJDATA:
- // check if the object is in a special container (e.g. a table)
- if (m_aStates.top().getCurrentBuffer())
- {
- // the object is in a table or another container.
- // Use the \result (RTFKeyword::RESULT) element of the object instead,
- // of the \objdata.
- m_aStates.top().setDestination(Destination::SKIP);
- }
- else
- {
- m_aStates.top().setDestination(Destination::OBJDATA);
- }
- break;
- case RTFKeyword::OBJCLASS:
- m_aStates.top().setDestination(Destination::OBJCLASS);
- break;
- case RTFKeyword::RESULT:
- m_aStates.top().setDestination(Destination::RESULT);
- break;
- case RTFKeyword::ATNDATE:
- m_aStates.top().setDestination(Destination::ANNOTATIONDATE);
- break;
- case RTFKeyword::ATNAUTHOR:
- m_aStates.top().setDestination(Destination::ANNOTATIONAUTHOR);
- break;
- case RTFKeyword::ATNREF:
- m_aStates.top().setDestination(Destination::ANNOTATIONREFERENCE);
- break;
- case RTFKeyword::FALT:
- m_aStates.top().setDestination(Destination::FALT);
- break;
- case RTFKeyword::FLYMAINCNT:
- m_aStates.top().setDestination(Destination::FLYMAINCONTENT);
- break;
- case RTFKeyword::LISTTEXT:
- // Should be ignored by any reader that understands Word 97 through Word 2007 numbering.
- case RTFKeyword::NONESTTABLES:
- // This destination should be ignored by readers that support nested tables.
- m_aStates.top().setDestination(Destination::SKIP);
- break;
- case RTFKeyword::DO:
- m_aStates.top().setDestination(Destination::DRAWINGOBJECT);
- break;
- case RTFKeyword::PN:
- m_aStates.top().setDestination(Destination::PARAGRAPHNUMBERING);
- break;
- case RTFKeyword::PNTEXT:
- // This destination should be ignored by readers that support paragraph numbering.
- m_aStates.top().setDestination(Destination::SKIP);
- break;
- case RTFKeyword::PNTXTA:
- m_aStates.top().setDestination(Destination::PARAGRAPHNUMBERING_TEXTAFTER);
- break;
- case RTFKeyword::PNTXTB:
- m_aStates.top().setDestination(Destination::PARAGRAPHNUMBERING_TEXTBEFORE);
- break;
- case RTFKeyword::TITLE:
- m_aStates.top().setDestination(Destination::TITLE);
- break;
- case RTFKeyword::SUBJECT:
- m_aStates.top().setDestination(Destination::SUBJECT);
- break;
- case RTFKeyword::DOCCOMM:
- m_aStates.top().setDestination(Destination::DOCCOMM);
- break;
- case RTFKeyword::ATRFSTART:
- m_aStates.top().setDestination(Destination::ANNOTATIONREFERENCESTART);
- break;
- case RTFKeyword::ATRFEND:
- m_aStates.top().setDestination(Destination::ANNOTATIONREFERENCEEND);
- break;
- case RTFKeyword::ATNID:
- m_aStates.top().setDestination(Destination::ATNID);
- break;
- case RTFKeyword::MMATH:
- case RTFKeyword::MOMATHPARA:
- // Nothing to do here (just enter the destination) till RTFKeyword::MMATHPR is implemented.
- break;
- case RTFKeyword::MR:
- m_aStates.top().setDestination(Destination::MR);
- break;
- case RTFKeyword::MCHR:
- m_aStates.top().setDestination(Destination::MCHR);
- break;
- case RTFKeyword::MPOS:
- m_aStates.top().setDestination(Destination::MPOS);
- break;
- case RTFKeyword::MVERTJC:
- m_aStates.top().setDestination(Destination::MVERTJC);
- break;
- case RTFKeyword::MSTRIKEH:
- m_aStates.top().setDestination(Destination::MSTRIKEH);
- break;
- case RTFKeyword::MDEGHIDE:
- m_aStates.top().setDestination(Destination::MDEGHIDE);
- break;
- case RTFKeyword::MTYPE:
- m_aStates.top().setDestination(Destination::MTYPE);
- break;
- case RTFKeyword::MGROW:
- m_aStates.top().setDestination(Destination::MGROW);
- break;
- case RTFKeyword::MHIDETOP:
- case RTFKeyword::MHIDEBOT:
- case RTFKeyword::MHIDELEFT:
- case RTFKeyword::MHIDERIGHT:
- // SmOoxmlImport::handleBorderBox will ignore these anyway, so silently ignore for now.
- m_aStates.top().setDestination(Destination::SKIP);
- break;
- case RTFKeyword::MSUBHIDE:
- m_aStates.top().setDestination(Destination::MSUBHIDE);
- break;
- case RTFKeyword::MSUPHIDE:
- m_aStates.top().setDestination(Destination::MSUPHIDE);
- break;
- case RTFKeyword::MBEGCHR:
- m_aStates.top().setDestination(Destination::MBEGCHR);
- break;
- case RTFKeyword::MSEPCHR:
- m_aStates.top().setDestination(Destination::MSEPCHR);
- break;
- case RTFKeyword::MENDCHR:
- m_aStates.top().setDestination(Destination::MENDCHR);
- break;
- case RTFKeyword::UPR:
- m_aStates.top().setDestination(Destination::UPR);
- break;
- case RTFKeyword::UD:
- // Anything inside \ud is just normal Unicode content.
- m_aStates.top().setDestination(Destination::NORMAL);
- break;
- case RTFKeyword::BACKGROUND:
- m_aStates.top().setDestination(Destination::BACKGROUND);
- m_aStates.top().setInBackground(true);
- break;
- case RTFKeyword::SHPGRP:
- {
- RTFLookahead aLookahead(Strm(), m_pTokenizer->getGroupStart());
- if (!aLookahead.hasTable())
- {
- uno::Reference<drawing::XShapes> xGroupShape(
- m_xModelFactory->createInstance("com.sun.star.drawing.GroupShape"),
- uno::UNO_QUERY);
- uno::Reference<drawing::XDrawPageSupplier> xDrawSupplier(m_xDstDoc,
- uno::UNO_QUERY);
- if (xDrawSupplier.is())
- {
- uno::Reference<drawing::XShape> xShape(xGroupShape, uno::UNO_QUERY);
- // set default VertOrient before inserting
- uno::Reference<beans::XPropertySet>(xShape, uno::UNO_QUERY_THROW)
- ->setPropertyValue("VertOrient", uno::Any(text::VertOrientation::NONE));
- xDrawSupplier->getDrawPage()->add(xShape);
- }
- m_pSdrImport->pushParent(xGroupShape);
- m_aStates.top().setCreatedShapeGroup(true);
- }
- m_aStates.top().setDestination(Destination::SHAPEGROUP);
- m_aStates.top().setInShapeGroup(true);
- }
- break;
- case RTFKeyword::FTNSEP:
- m_aStates.top().setDestination(Destination::FOOTNOTESEPARATOR);
- m_aStates.top().getCharacterAttributes().set(
- NS_ooxml::LN_CT_FtnEdn_type,
- new RTFValue(NS_ooxml::LN_Value_doc_ST_FtnEdn_separator));
- break;
- case RTFKeyword::USERPROPS:
- // Container of all user-defined properties.
- m_aStates.top().setDestination(Destination::USERPROPS);
- if (m_xDocumentProperties.is())
- // Create a custom document properties to be able to process them later all at once.
- m_xDocumentProperties = document::DocumentProperties::create(m_xContext);
- break;
- case RTFKeyword::PROPNAME:
- m_aStates.top().setDestination(Destination::PROPNAME);
- break;
- case RTFKeyword::STATICVAL:
- m_aStates.top().setDestination(Destination::STATICVAL);
- break;
- case RTFKeyword::GENERATOR:
- m_aStates.top().setDestination(Destination::GENERATOR);
- break;
- default:
- {
- // Check if it's a math token.
- RTFMathSymbol aSymbol(nKeyword);
- if (RTFTokenizer::lookupMathKeyword(aSymbol))
- {
- m_aMathBuffer.appendOpeningTag(aSymbol.GetToken());
- m_aStates.top().setDestination(aSymbol.GetDestination());
- return RTFError::OK;
- }
-
- SAL_INFO("writerfilter",
- "TODO handle destination '" << keywordToString(nKeyword) << "'");
- // Make sure we skip destinations (even without \*) till we don't handle them
- m_aStates.top().setDestination(Destination::SKIP);
- aSkip.setParsed(false);
- }
- break;
- }
-
- // new destination => use new destination text
- m_aStates.top().setCurrentDestinationText(&m_aStates.top().getDestinationText());
-
- return RTFError::OK;
-}
-
-} // namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfdispatchflag.cxx b/writerfilter/source/rtftok/rtfdispatchflag.cxx
deleted file mode 100644
index 753f1c3fbba9..000000000000
--- a/writerfilter/source/rtftok/rtfdispatchflag.cxx
+++ /dev/null
@@ -1,1381 +0,0 @@
-/* -*- 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 <sal/config.h>
-
-#include <string_view>
-
-#include "rtfdocumentimpl.hxx"
-
-#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
-#include <com/sun/star/drawing/XEnhancedCustomShapeDefaulter.hpp>
-#include <com/sun/star/text/RelOrientation.hpp>
-#include <com/sun/star/text/VertOrientation.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-
-#include <filter/msfilter/escherex.hxx>
-
-#include <ooxml/resourceids.hxx>
-
-#include <sal/log.hxx>
-
-#include "rtfsdrimport.hxx"
-#include "rtfskipdestination.hxx"
-
-using namespace com::sun::star;
-
-namespace writerfilter::rtftok
-{
-bool RTFDocumentImpl::dispatchFloatingTableFlag(RTFKeyword nKeyword)
-{
- // Positioned Wrapped Tables
- OUString aParam;
- switch (nKeyword)
- {
- case RTFKeyword::TPVPARA:
- aParam = "text";
- break;
- case RTFKeyword::TPVMRG:
- aParam = "margin";
- break;
- case RTFKeyword::TPVPG:
- aParam = "page";
- break;
- default:
- break;
- }
- if (!aParam.isEmpty())
- {
- putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
- NS_ooxml::LN_CT_TblPPr_vertAnchor, new RTFValue(aParam));
- return true;
- }
- switch (nKeyword)
- {
- case RTFKeyword::TPHCOL:
- aParam = "text";
- break;
- case RTFKeyword::TPHMRG:
- aParam = "margin";
- break;
- case RTFKeyword::TPHPG:
- aParam = "page";
- break;
- default:
- break;
- }
- if (!aParam.isEmpty())
- {
- putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
- NS_ooxml::LN_CT_TblPPr_horzAnchor, new RTFValue(aParam));
- return true;
- }
- switch (nKeyword)
- {
- case RTFKeyword::TPOSYC:
- aParam = "center";
- break;
- case RTFKeyword::TPOSYB:
- aParam = "bottom";
- break;
- default:
- break;
- }
- if (!aParam.isEmpty())
- {
- putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
- NS_ooxml::LN_CT_TblPPr_tblpYSpec, new RTFValue(aParam));
- return true;
- }
- switch (nKeyword)
- {
- case RTFKeyword::TPOSXC:
- aParam = "center";
- break;
- case RTFKeyword::TPOSXR:
- aParam = "right";
- break;
- default:
- break;
- }
- if (!aParam.isEmpty())
- {
- putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
- NS_ooxml::LN_CT_TblPPr_tblpXSpec, new RTFValue(aParam));
- return true;
- }
-
- if (nKeyword == RTFKeyword::TABSNOOVRLP)
- {
- m_aStates.top().getTableRowSprms().set(
- NS_ooxml::LN_CT_TblPrBase_tblOverlap,
- new RTFValue(NS_ooxml::LN_Value_ST_TblOverlap_never));
- return true;
- }
-
- return false;
-}
-
-RTFError RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword)
-{
- setNeedSect(true);
- checkUnicode(/*bUnicode =*/true, /*bHex =*/true);
- RTFSkipDestination aSkip(*this);
- int nParam = -1;
- int nSprm = -1;
-
- // Underline flags.
- switch (nKeyword)
- {
- case RTFKeyword::ULD:
- nSprm = NS_ooxml::LN_Value_ST_Underline_dotted;
- break;
- case RTFKeyword::ULW:
- nSprm = NS_ooxml::LN_Value_ST_Underline_words;
- break;
- default:
- break;
- }
- if (nSprm >= 0)
- {
- auto pValue = new RTFValue(nSprm);
- m_aStates.top().getCharacterAttributes().set(NS_ooxml::LN_CT_Underline_val, pValue);
- return RTFError::OK;
- }
-
- // Indentation
- switch (nKeyword)
- {
- case RTFKeyword::QC:
- nParam = NS_ooxml::LN_Value_ST_Jc_center;
- break;
- case RTFKeyword::QJ:
- nParam = NS_ooxml::LN_Value_ST_Jc_both;
- break;
- case RTFKeyword::QL:
- nParam = NS_ooxml::LN_Value_ST_Jc_left;
- break;
- case RTFKeyword::QR:
- nParam = NS_ooxml::LN_Value_ST_Jc_right;
- break;
- case RTFKeyword::QD:
- nParam = NS_ooxml::LN_Value_ST_Jc_distribute;
- break;
- default:
- break;
- }
- if (nParam >= 0)
- {
- auto pValue = new RTFValue(nParam);
- m_aStates.top().getParagraphSprms().set(NS_ooxml::LN_CT_PPrBase_jc, pValue);
- m_bNeedPap = true;
- return RTFError::OK;
- }
-
- // Font Alignment
- switch (nKeyword)
- {
- case RTFKeyword::FAFIXED:
- case RTFKeyword::FAAUTO:
- nParam = NS_ooxml::LN_Value_doc_ST_TextAlignment_auto;
- break;
- case RTFKeyword::FAHANG:
- nParam = NS_ooxml::LN_Value_doc_ST_TextAlignment_top;
- break;
- case RTFKeyword::FACENTER:
- nParam = NS_ooxml::LN_Value_doc_ST_TextAlignment_center;
- break;
- case RTFKeyword::FAROMAN:
- nParam = NS_ooxml::LN_Value_doc_ST_TextAlignment_baseline;
- break;
- case RTFKeyword::FAVAR:
- nParam = NS_ooxml::LN_Value_doc_ST_TextAlignment_bottom;
- break;
- default:
- break;
- }
- if (nParam >= 0)
- {
- auto pValue = new RTFValue(nParam);
- m_aStates.top().getParagraphSprms().set(NS_ooxml::LN_CT_PPrBase_textAlignment, pValue);
- return RTFError::OK;
- }
-
- // Tab kind.
- switch (nKeyword)
- {
- case RTFKeyword::TQR:
- nParam = NS_ooxml::LN_Value_ST_TabJc_right;
- break;
- case RTFKeyword::TQC:
- nParam = NS_ooxml::LN_Value_ST_TabJc_center;
- break;
- case RTFKeyword::TQDEC:
- nParam = NS_ooxml::LN_Value_ST_TabJc_decimal;
- break;
- default:
- break;
- }
- if (nParam >= 0)
- {
- auto pValue = new RTFValue(nParam);
- m_aStates.top().getTabAttributes().set(NS_ooxml::LN_CT_TabStop_val, pValue);
- return RTFError::OK;
- }
-
- // Tab lead.
- switch (nKeyword)
- {
- case RTFKeyword::TLDOT:
- nParam = NS_ooxml::LN_Value_ST_TabTlc_dot;
- break;
- case RTFKeyword::TLMDOT:
- nParam = NS_ooxml::LN_Value_ST_TabTlc_middleDot;
- break;
- case RTFKeyword::TLHYPH:
- nParam = NS_ooxml::LN_Value_ST_TabTlc_hyphen;
- break;
- case RTFKeyword::TLUL:
- case RTFKeyword::TLTH:
- nParam = NS_ooxml::LN_Value_ST_TabTlc_underscore;
- break;
- case RTFKeyword::TLEQ:
- default:
- break;
- }
- if (nParam >= 0)
- {
- auto pValue = new RTFValue(nParam);
- m_aStates.top().getTabAttributes().set(NS_ooxml::LN_CT_TabStop_leader, pValue);
- return RTFError::OK;
- }
-
- // Border types
- {
- switch (nKeyword)
- {
- // brdrhair and brdrs are the same, brdrw will make a difference
- // map to values in ooxml/model.xml resource ST_Border
- case RTFKeyword::BRDRHAIR:
- case RTFKeyword::BRDRS:
- nParam = NS_ooxml::LN_Value_ST_Border_single;
- break;
- case RTFKeyword::BRDRDOT:
- nParam = NS_ooxml::LN_Value_ST_Border_dotted;
- break;
- case RTFKeyword::BRDRDASH:
- nParam = NS_ooxml::LN_Value_ST_Border_dashed;
- break;
- case RTFKeyword::BRDRDB:
- nParam = NS_ooxml::LN_Value_ST_Border_double;
- break;
- case RTFKeyword::BRDRTNTHSG:
- nParam = NS_ooxml::LN_Value_ST_Border_thinThickSmallGap;
- break;
- case RTFKeyword::BRDRTNTHMG:
- nParam = NS_ooxml::LN_Value_ST_Border_thinThickMediumGap;
- break;
- case RTFKeyword::BRDRTNTHLG:
- nParam = NS_ooxml::LN_Value_ST_Border_thinThickLargeGap;
- break;
- case RTFKeyword::BRDRTHTNSG:
- nParam = NS_ooxml::LN_Value_ST_Border_thickThinSmallGap;
- break;
- case RTFKeyword::BRDRTHTNMG:
- nParam = NS_ooxml::LN_Value_ST_Border_thickThinMediumGap;
- break;
- case RTFKeyword::BRDRTHTNLG:
- nParam = NS_ooxml::LN_Value_ST_Border_thickThinLargeGap;
- break;
- case RTFKeyword::BRDREMBOSS:
- nParam = NS_ooxml::LN_Value_ST_Border_threeDEmboss;
- break;
- case RTFKeyword::BRDRENGRAVE:
- nParam = NS_ooxml::LN_Value_ST_Border_threeDEngrave;
- break;
- case RTFKeyword::BRDROUTSET:
- nParam = NS_ooxml::LN_Value_ST_Border_outset;
- break;
- case RTFKeyword::BRDRINSET:
- nParam = NS_ooxml::LN_Value_ST_Border_inset;
- break;
- case RTFKeyword::BRDRDASHSM:
- nParam = NS_ooxml::LN_Value_ST_Border_dashSmallGap;
- break;
- case RTFKeyword::BRDRDASHD:
- nParam = NS_ooxml::LN_Value_ST_Border_dotDash;
- break;
- case RTFKeyword::BRDRDASHDD:
- nParam = NS_ooxml::LN_Value_ST_Border_dotDotDash;
- break;
- case RTFKeyword::BRDRNONE:
- nParam = NS_ooxml::LN_Value_ST_Border_none;
- break;
- default:
- break;
- }
- if (nParam >= 0)
- {
- auto pValue = new RTFValue(nParam);
- putBorderProperty(m_aStates, NS_ooxml::LN_CT_Border_val, pValue);
- return RTFError::OK;
- }
- }
-
- // Section breaks
- switch (nKeyword)
- {
- case RTFKeyword::SBKNONE:
- nParam = NS_ooxml::LN_Value_ST_SectionMark_continuous;
- break;
- case RTFKeyword::SBKCOL:
- nParam = NS_ooxml::LN_Value_ST_SectionMark_nextColumn;
- break;
- case RTFKeyword::SBKPAGE:
- nParam = NS_ooxml::LN_Value_ST_SectionMark_nextPage;
- break;
- case RTFKeyword::SBKEVEN:
- nParam = NS_ooxml::LN_Value_ST_SectionMark_evenPage;
- break;
- case RTFKeyword::SBKODD:
- nParam = NS_ooxml::LN_Value_ST_SectionMark_oddPage;
- break;
- default:
- break;
- }
- if (nParam >= 0)
- {
- if (m_nResetBreakOnSectBreak != RTFKeyword::invalid)
- {
- m_nResetBreakOnSectBreak = nKeyword;
- }
- auto pValue = new RTFValue(nParam);
- m_aStates.top().getSectionSprms().set(NS_ooxml::LN_EG_SectPrContents_type, pValue);
- return RTFError::OK;
- }
-
- // Footnote numbering
- switch (nKeyword)
- {
- case RTFKeyword::FTNNAR:
- nParam = NS_ooxml::LN_Value_ST_NumberFormat_decimal;
- break;
- case RTFKeyword::FTNNALC:
- nParam = NS_ooxml::LN_Value_ST_NumberFormat_lowerLetter;
- break;
- case RTFKeyword::FTNNAUC:
- nParam = NS_ooxml::LN_Value_ST_NumberFormat_upperLetter;
- break;
- case RTFKeyword::FTNNRLC:
- nParam = NS_ooxml::LN_Value_ST_NumberFormat_lowerRoman;
- break;
- case RTFKeyword::FTNNRUC:
- nParam = NS_ooxml::LN_Value_ST_NumberFormat_upperRoman;
- break;
- case RTFKeyword::FTNNCHI:
- nParam = NS_ooxml::LN_Value_ST_NumberFormat_chicago;
- break;
- default:
- break;
- }
- if (nParam >= 0)
- {
- auto pInner = new RTFValue(nParam);
- RTFSprms aAttributes;
- aAttributes.set(NS_ooxml::LN_CT_NumFmt_val, pInner);
- auto pOuter = new RTFValue(aAttributes);
- putNestedSprm(m_aDefaultState.getParagraphSprms(),
- NS_ooxml::LN_EG_SectPrContents_footnotePr, NS_ooxml::LN_CT_FtnProps_numFmt,
- pOuter);
- return RTFError::OK;
- }
-
- // Footnote restart type
- switch (nKeyword)
- {
- case RTFKeyword::FTNRSTPG:
- nParam = NS_ooxml::LN_Value_ST_RestartNumber_eachPage;
- break;
- case RTFKeyword::FTNRESTART:
- nParam = NS_ooxml::LN_Value_ST_RestartNumber_eachSect;
- break;
- case RTFKeyword::FTNRSTCONT:
- nParam = NS_ooxml::LN_Value_ST_RestartNumber_continuous;
- break;
- default:
- break;
- }
- if (nParam >= 0)
- {
- auto pValue = new RTFValue(nParam);
- putNestedSprm(m_aDefaultState.getParagraphSprms(),
- NS_ooxml::LN_EG_SectPrContents_footnotePr,
- NS_ooxml::LN_EG_FtnEdnNumProps_numRestart, pValue);
- return RTFError::OK;
- }
-
- // Endnote numbering
- switch (nKeyword)
- {
- case RTFKeyword::AFTNNAR:
- nParam = NS_ooxml::LN_Value_ST_NumberFormat_decimal;
- break;
- case RTFKeyword::AFTNNALC:
- nParam = NS_ooxml::LN_Value_ST_NumberFormat_lowerLetter;
- break;
- case RTFKeyword::AFTNNAUC:
- nParam = NS_ooxml::LN_Value_ST_NumberFormat_upperLetter;
- break;
- case RTFKeyword::AFTNNRLC:
- nParam = NS_ooxml::LN_Value_ST_NumberFormat_lowerRoman;
- break;
- case RTFKeyword::AFTNNRUC:
- nParam = NS_ooxml::LN_Value_ST_NumberFormat_upperRoman;
- break;
- case RTFKeyword::AFTNNCHI:
- nParam = NS_ooxml::LN_Value_ST_NumberFormat_chicago;
- break;
- default:
- break;
- }
- if (nParam >= 0)
- {
- auto pInner = new RTFValue(nParam);
- RTFSprms aAttributes;
- aAttributes.set(NS_ooxml::LN_CT_NumFmt_val, pInner);
- auto pOuter = new RTFValue(aAttributes);
- putNestedSprm(m_aDefaultState.getParagraphSprms(), NS_ooxml::LN_EG_SectPrContents_endnotePr,
- NS_ooxml::LN_CT_EdnProps_numFmt, pOuter);
- return RTFError::OK;
- }
-
- switch (nKeyword)
- {
- case RTFKeyword::TRQL:
- nParam = NS_ooxml::LN_Value_ST_Jc_left;
- break;
- case RTFKeyword::TRQC:
- nParam = NS_ooxml::LN_Value_ST_Jc_center;
- break;
- case RTFKeyword::TRQR:
- nParam = NS_ooxml::LN_Value_ST_Jc_right;
- break;
- default:
- break;
- }
- if (nParam >= 0)
- {
- auto pValue = new RTFValue(nParam);
- m_aStates.top().getTableRowSprms().set(NS_ooxml::LN_CT_TrPrBase_jc, pValue);
- return RTFError::OK;
- }
-
- // Cell Text Flow
- switch (nKeyword)
- {
- case RTFKeyword::CLTXLRTB:
- nParam = NS_ooxml::LN_Value_ST_TextDirection_lrTb;
- break;
- case RTFKeyword::CLTXTBRL:
- nParam = NS_ooxml::LN_Value_ST_TextDirection_tbRl;
- break;
- case RTFKeyword::CLTXBTLR:
- nParam = NS_ooxml::LN_Value_ST_TextDirection_btLr;
- break;
- case RTFKeyword::CLTXLRTBV:
- nParam = NS_ooxml::LN_Value_ST_TextDirection_lrTbV;
- break;
- case RTFKeyword::CLTXTBRLV:
- nParam = NS_ooxml::LN_Value_ST_TextDirection_tbRlV;
- break;
- default:
- break;
- }
- if (nParam >= 0)
- {
- auto pValue = new RTFValue(nParam);
- m_aStates.top().getTableCellSprms().set(NS_ooxml::LN_CT_TcPrBase_textDirection, pValue);
- }
-
- // Trivial paragraph flags
- switch (nKeyword)
- {
- case RTFKeyword::KEEP:
- if (m_aStates.top().getCurrentBuffer() != &m_aTableBufferStack.back())
- nParam = NS_ooxml::LN_CT_PPrBase_keepLines;
- break;
- case RTFKeyword::KEEPN:
- nParam = NS_ooxml::LN_CT_PPrBase_keepNext;
- break;
- case RTFKeyword::INTBL:
- {
- m_aStates.top().setCurrentBuffer(&m_aTableBufferStack.back());
- nParam = NS_ooxml::LN_inTbl;
- }
- break;
- case RTFKeyword::PAGEBB:
- // ignore a page break that is defined before the document content has even started
- if (!m_bFirstRun)
- nParam = NS_ooxml::LN_CT_PPrBase_pageBreakBefore;
- break;
- default:
- break;
- }
- if (nParam >= 0)
- {
- auto pValue = new RTFValue(1);
- m_aStates.top().getParagraphSprms().set(nParam, pValue);
- return RTFError::OK;
- }
-
- if (dispatchFloatingTableFlag(nKeyword))
- {
- return RTFError::OK;
- }
-
- switch (nKeyword)
- {
- case RTFKeyword::FNIL:
- case RTFKeyword::FROMAN:
- case RTFKeyword::FSWISS:
- case RTFKeyword::FMODERN:
- case RTFKeyword::FSCRIPT:
- case RTFKeyword::FDECOR:
- case RTFKeyword::FTECH:
- case RTFKeyword::FBIDI:
- // TODO ooxml:CT_Font_family seems to be ignored by the domain mapper
- break;
- case RTFKeyword::ANSI:
- m_aStates.top().setCurrentEncoding(RTL_TEXTENCODING_MS_1252);
- break;
- case RTFKeyword::MAC:
- m_aDefaultState.setCurrentEncoding(RTL_TEXTENCODING_APPLE_ROMAN);
- m_aStates.top().setCurrentEncoding(m_aDefaultState.getCurrentEncoding());
- break;
- case RTFKeyword::PC:
- m_aDefaultState.setCurrentEncoding(RTL_TEXTENCODING_IBM_437);
- m_aStates.top().setCurrentEncoding(m_aDefaultState.getCurrentEncoding());
- break;
- case RTFKeyword::PCA:
- m_aDefaultState.setCurrentEncoding(RTL_TEXTENCODING_IBM_850);
- m_aStates.top().setCurrentEncoding(m_aDefaultState.getCurrentEncoding());
- break;
- case RTFKeyword::PLAIN:
- {
- m_aStates.top().getCharacterSprms() = getDefaultState().getCharacterSprms();
- m_aStates.top().setCurrentEncoding(getEncoding(getFontIndex(m_nDefaultFontIndex)));
- m_aStates.top().getCharacterAttributes() = getDefaultState().getCharacterAttributes();
- m_aStates.top().setCurrentCharacterStyleIndex(-1);
- m_aStates.top().setRunType(RTFParserState::RunType::NONE);
- }
- break;
- case RTFKeyword::PARD:
- {
- if (m_bHadPicture)
- dispatchSymbol(RTFKeyword::PAR);
- // \pard is allowed between \cell and \row, but in that case it should not reset the fact that we're inside a table.
- // It should not reset the paragraph style, either, so remember the old paragraph style.
- m_aStates.top().getParagraphSprms() = m_aDefaultState.getParagraphSprms();
- m_aStates.top().getParagraphAttributes() = m_aDefaultState.getParagraphAttributes();
-
- if (m_nTopLevelCells == 0 && m_nNestedCells == 0)
- {
- // Reset that we're in a table.
- m_aStates.top().setCurrentBuffer(nullptr);
- }
- else
- {
- // We are still in a table.
- m_aStates.top().getParagraphSprms().set(NS_ooxml::LN_inTbl, new RTFValue(1));
- // Ideally getDefaultSPRM() would take care of this, but it would not when we're buffering.
- m_aStates.top().getParagraphSprms().set(NS_ooxml::LN_CT_PPrBase_tabs,
- new RTFValue());
- }
- resetFrame();
-
- // Reset currently selected paragraph style as well.
- // By default the style with index 0 is applied.
- {
- OUString const aName = getStyleName(0);
- // But only in case it's not a character style.
- if (!aName.isEmpty()
- && getStyleType(0) != NS_ooxml::LN_Value_ST_StyleType_character)
- {
- m_aStates.top().getParagraphSprms().set(NS_ooxml::LN_CT_PPrBase_pStyle,
- new RTFValue(aName));
- }
- m_aStates.top().setCurrentStyleIndex(0);
- }
- // Need to send paragraph properties again, if there will be any.
- m_bNeedPap = true;
- break;
- }
- case RTFKeyword::SECTD:
- {
- m_aStates.top().getSectionSprms() = m_aDefaultState.getSectionSprms();
- m_aStates.top().getSectionAttributes() = m_aDefaultState.getSectionAttributes();
- }
- break;
- case RTFKeyword::TROWD:
- {
- // Back these up, in case later we still need this info.
- backupTableRowProperties();
- resetTableRowProperties();
- // In case the table definition is in the middle of the row
- // (invalid), make sure table definition is emitted.
- m_bNeedPap = true;
- }
- break;
- case RTFKeyword::WIDCTLPAR:
- case RTFKeyword::NOWIDCTLPAR:
- {
- auto pValue = new RTFValue(int(nKeyword == RTFKeyword::WIDCTLPAR));
- m_aStates.top().getParagraphSprms().set(NS_ooxml::LN_CT_PPrBase_widowControl, pValue);
- }
- break;
- case RTFKeyword::BOX:
- {
- RTFSprms aAttributes;
- auto pValue = new RTFValue(aAttributes);
- for (int i = 0; i < 4; i++)
- m_aStates.top().getParagraphSprms().set(getParagraphBorder(i), pValue);
- m_aStates.top().setBorderState(RTFBorderState::PARAGRAPH_BOX);
- }
- break;
- case RTFKeyword::LTRSECT:
- case RTFKeyword::RTLSECT:
- {
- auto pValue = new RTFValue(nKeyword == RTFKeyword::LTRSECT ? 0 : 1);
- m_aStates.top().setRunType(RTFParserState::RunType::NONE);
- m_aStates.top().getParagraphSprms().set(NS_ooxml::LN_EG_SectPrContents_textDirection,
- pValue);
- }
- break;
- case RTFKeyword::LTRPAR:
- case RTFKeyword::RTLPAR:
- {
- auto pValue = new RTFValue(nKeyword == RTFKeyword::LTRPAR ? 0 : 1);
- m_aStates.top().setRunType(RTFParserState::RunType::NONE);
- m_aStates.top().getParagraphSprms().set(NS_ooxml::LN_CT_PPrBase_bidi, pValue);
- }
- break;
- case RTFKeyword::LTRROW:
- case RTFKeyword::RTLROW:
- m_aStates.top().setRunType(RTFParserState::RunType::NONE);
- m_aStates.top().getTableRowSprms().set(
- NS_ooxml::LN_CT_TblPrBase_bidiVisual,
- new RTFValue(int(nKeyword == RTFKeyword::RTLROW)));
- break;
- case RTFKeyword::LTRCH:
- // dmapper does not support this.
- if (m_aStates.top().getRunType() == RTFParserState::RunType::RTLCH_LTRCH_1)
- m_aStates.top().setRunType(RTFParserState::RunType::RTLCH_LTRCH_2);
- else
- m_aStates.top().setRunType(RTFParserState::RunType::LTRCH_RTLCH_1);
- break;
- case RTFKeyword::RTLCH:
- if (m_aStates.top().getRunType() == RTFParserState::RunType::LTRCH_RTLCH_1)
- m_aStates.top().setRunType(RTFParserState::RunType::LTRCH_RTLCH_2);
- else
- m_aStates.top().setRunType(RTFParserState::RunType::RTLCH_LTRCH_1);
-
- if (m_aDefaultState.getCurrentEncoding() == RTL_TEXTENCODING_MS_1255)
- m_aStates.top().setCurrentEncoding(m_aDefaultState.getCurrentEncoding());
- break;
- case RTFKeyword::ULNONE:
- {
- auto pValue = new RTFValue(NS_ooxml::LN_Value_ST_Underline_none);
- m_aStates.top().getCharacterAttributes().set(NS_ooxml::LN_CT_Underline_val, pValue);
- }
- break;
- case RTFKeyword::NONSHPPICT:
- case RTFKeyword::MMATHPICT: // Picture group used by readers not understanding \moMath group
- m_aStates.top().setDestination(Destination::SKIP);
- break;
- case RTFKeyword::CLBRDRT:
- case RTFKeyword::CLBRDRL:
- case RTFKeyword::CLBRDRB:
- case RTFKeyword::CLBRDRR:
- {
- RTFSprms aAttributes;
- RTFSprms aSprms;
- auto pValue = new RTFValue(aAttributes, aSprms);
- switch (nKeyword)
- {
- case RTFKeyword::CLBRDRT:
- nSprm = NS_ooxml::LN_CT_TcBorders_top;
- break;
- case RTFKeyword::CLBRDRL:
- nSprm = NS_ooxml::LN_CT_TcBorders_left;
- break;
- case RTFKeyword::CLBRDRB:
- nSprm = NS_ooxml::LN_CT_TcBorders_bottom;
- break;
- case RTFKeyword::CLBRDRR:
- nSprm = NS_ooxml::LN_CT_TcBorders_right;
- break;
- default:
- break;
- }
- putNestedSprm(m_aStates.top().getTableCellSprms(), NS_ooxml::LN_CT_TcPrBase_tcBorders,
- nSprm, pValue);
- m_aStates.top().setBorderState(RTFBorderState::CELL);
- }
- break;
- case RTFKeyword::PGBRDRT:
- case RTFKeyword::PGBRDRL:
- case RTFKeyword::PGBRDRB:
- case RTFKeyword::PGBRDRR:
- {
- RTFSprms aAttributes;
- RTFSprms aSprms;
- auto pValue = new RTFValue(aAttributes, aSprms);
- switch (nKeyword)
- {
- case RTFKeyword::PGBRDRT:
- nSprm = NS_ooxml::LN_CT_PageBorders_top;
- break;
- case RTFKeyword::PGBRDRL:
- nSprm = NS_ooxml::LN_CT_PageBorders_left;
- break;
- case RTFKeyword::PGBRDRB:
- nSprm = NS_ooxml::LN_CT_PageBorders_bottom;
- break;
- case RTFKeyword::PGBRDRR:
- nSprm = NS_ooxml::LN_CT_PageBorders_right;
- break;
- default:
- break;
- }
- putNestedSprm(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgBorders, nSprm, pValue);
- m_aStates.top().setBorderState(RTFBorderState::PAGE);
- }
- break;
- case RTFKeyword::BRDRT:
- case RTFKeyword::BRDRL:
- case RTFKeyword::BRDRB:
- case RTFKeyword::BRDRR:
- case RTFKeyword::BRDRBTW:
- {
- RTFSprms aAttributes;
- RTFSprms aSprms;
- auto pValue = new RTFValue(aAttributes, aSprms);
- switch (nKeyword)
- {
- case RTFKeyword::BRDRT:
- nSprm = getParagraphBorder(0);
- break;
- case RTFKeyword::BRDRL:
- nSprm = getParagraphBorder(1);
- break;
- case RTFKeyword::BRDRB:
- nSprm = getParagraphBorder(2);
- break;
- case RTFKeyword::BRDRR:
- nSprm = getParagraphBorder(3);
- break;
- case RTFKeyword::BRDRBTW:
- nSprm = getParagraphBorder(4);
- break;
- default:
- break;
- }
- putNestedSprm(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PrBase_pBdr, nSprm,
- pValue);
- m_aStates.top().setBorderState(RTFBorderState::PARAGRAPH);
- }
- break;
- case RTFKeyword::CHBRDR:
- {
- RTFSprms aAttributes;
- auto pValue = new RTFValue(aAttributes);
- m_aStates.top().getCharacterSprms().set(NS_ooxml::LN_EG_RPrBase_bdr, pValue);
- m_aStates.top().setBorderState(RTFBorderState::CHARACTER);
- }
- break;
- case RTFKeyword::CLMGF:
- {
- auto pValue = new RTFValue(NS_ooxml::LN_Value_ST_Merge_restart);
- m_aStates.top().getTableCellSprms().set(NS_ooxml::LN_CT_TcPrBase_hMerge, pValue);
- }
- break;
- case RTFKeyword::CLMRG:
- {
- auto pValue = new RTFValue(NS_ooxml::LN_Value_ST_Merge_continue);
- m_aStates.top().getTableCellSprms().set(NS_ooxml::LN_CT_TcPrBase_hMerge, pValue);
- }
- break;
- case RTFKeyword::CLVMGF:
- {
- auto pValue = new RTFValue(NS_ooxml::LN_Value_ST_Merge_restart);
- m_aStates.top().getTableCellSprms().set(NS_ooxml::LN_CT_TcPrBase_vMerge, pValue);
- }
- break;
- case RTFKeyword::CLVMRG:
- {
- auto pValue = new RTFValue(NS_ooxml::LN_Value_ST_Merge_continue);
- m_aStates.top().getTableCellSprms().set(NS_ooxml::LN_CT_TcPrBase_vMerge, pValue);
- }
- break;
- case RTFKeyword::CLVERTALT:
- case RTFKeyword::CLVERTALC:
- case RTFKeyword::CLVERTALB:
- {
- switch (nKeyword)
- {
- case RTFKeyword::CLVERTALT:
- nParam = NS_ooxml::LN_Value_ST_VerticalJc_top;
- break;
- case RTFKeyword::CLVERTALC:
- nParam = NS_ooxml::LN_Value_ST_VerticalJc_center;
- break;
- case RTFKeyword::CLVERTALB:
- nParam = NS_ooxml::LN_Value_ST_VerticalJc_bottom;
- break;
- default:
- break;
- }
- auto pValue = new RTFValue(nParam);
- m_aStates.top().getTableCellSprms().set(NS_ooxml::LN_CT_TcPrBase_vAlign, pValue);
- }
- break;
- case RTFKeyword::TRKEEP:
- {
- auto pValue = new RTFValue(1);
- m_aStates.top().getTableRowSprms().set(NS_ooxml::LN_CT_TrPrBase_cantSplit, pValue);
- }
- break;
- case RTFKeyword::SECTUNLOCKED:
- {
- auto pValue = new RTFValue(0);
- m_aStates.top().getSectionSprms().set(NS_ooxml::LN_EG_SectPrContents_formProt, pValue);
- }
- break;
- case RTFKeyword::PGNBIDIA:
- case RTFKeyword::PGNBIDIB:
- // These should be mapped to NS_ooxml::LN_EG_SectPrContents_pgNumType, but dmapper has no API for that at the moment.
- break;
- case RTFKeyword::LOCH:
- m_aStates.top().setRunType(RTFParserState::RunType::LOCH);
- break;
- case RTFKeyword::HICH:
- m_aStates.top().setRunType(RTFParserState::RunType::HICH);
- break;
- case RTFKeyword::DBCH:
- m_aStates.top().setRunType(RTFParserState::RunType::DBCH);
- break;
- case RTFKeyword::TITLEPG:
- {
- auto pValue = new RTFValue(1);
- m_aStates.top().getSectionSprms().set(NS_ooxml::LN_EG_SectPrContents_titlePg, pValue);
- }
- break;
- case RTFKeyword::SUPER:
- {
- // Make sure character properties are not lost if the document
- // starts with a footnote.
- if (!isStyleSheetImport())
- {
- checkFirstRun();
- checkNeedPap();
- }
-
- if (!m_aStates.top().getCurrentBuffer())
- m_aStates.top().setCurrentBuffer(&m_aSuperBuffer);
-
- auto pValue = new RTFValue("superscript");
- m_aStates.top().getCharacterSprms().set(NS_ooxml::LN_EG_RPrBase_vertAlign, pValue);
- }
- break;
- case RTFKeyword::SUB:
- {
- auto pValue = new RTFValue("subscript");
- m_aStates.top().getCharacterSprms().set(NS_ooxml::LN_EG_RPrBase_vertAlign, pValue);
- }
- break;
- case RTFKeyword::NOSUPERSUB:
- {
- if (m_aStates.top().getCurrentBuffer() == &m_aSuperBuffer)
- {
- replayBuffer(m_aSuperBuffer, nullptr, nullptr);
- m_aStates.top().setCurrentBuffer(nullptr);
- }
- m_aStates.top().getCharacterSprms().erase(NS_ooxml::LN_EG_RPrBase_vertAlign);
- }
- break;
- case RTFKeyword::LINEPPAGE:
- case RTFKeyword::LINECONT:
- {
- auto pValue = new RTFValue(nKeyword == RTFKeyword::LINEPPAGE
- ? NS_ooxml::LN_Value_ST_LineNumberRestart_newPage
- : NS_ooxml::LN_Value_ST_LineNumberRestart_continuous);
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_lnNumType,
- NS_ooxml::LN_CT_LineNumber_restart, pValue);
- }
- break;
- case RTFKeyword::AENDDOC:
- // Noop, this is the default in Writer.
- case RTFKeyword::AENDNOTES:
- // Noop
- case RTFKeyword::AFTNRSTCONT:
- // Noop, this is the default in Writer.
- case RTFKeyword::AFTNRESTART:
- // Noop
- case RTFKeyword::FTNBJ:
- // Noop, this is the default in Writer.
- break;
- case RTFKeyword::ENDDOC:
- {
- auto pValue = new RTFValue(NS_ooxml::LN_Value_ST_RestartNumber_eachSect);
- putNestedSprm(m_aDefaultState.getParagraphSprms(),
- NS_ooxml::LN_EG_SectPrContents_footnotePr,
- NS_ooxml::LN_EG_FtnEdnNumProps_numRestart, pValue);
- }
- break;
- case RTFKeyword::NOLINE:
- eraseNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_lnNumType,
- NS_ooxml::LN_CT_LineNumber_distance);
- break;
- case RTFKeyword::FORMSHADE:
- // Noop, this is the default in Writer.
- break;
- case RTFKeyword::PNGBLIP:
- m_aStates.top().getPicture().eStyle = RTFBmpStyle::PNG;
- break;
- case RTFKeyword::JPEGBLIP:
- m_aStates.top().getPicture().eStyle = RTFBmpStyle::JPEG;
- break;
- case RTFKeyword::POSYT:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_yAlign,
- NS_ooxml::LN_Value_doc_ST_YAlign_top);
- break;
- case RTFKeyword::POSYB:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_yAlign,
- NS_ooxml::LN_Value_doc_ST_YAlign_bottom);
- break;
- case RTFKeyword::POSYC:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_yAlign,
- NS_ooxml::LN_Value_doc_ST_YAlign_center);
- break;
- case RTFKeyword::POSYIN:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_yAlign,
- NS_ooxml::LN_Value_doc_ST_YAlign_inside);
- break;
- case RTFKeyword::POSYOUT:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_yAlign,
- NS_ooxml::LN_Value_doc_ST_YAlign_outside);
- break;
- case RTFKeyword::POSYIL:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_yAlign,
- NS_ooxml::LN_Value_doc_ST_YAlign_inline);
- break;
-
- case RTFKeyword::PHMRG:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_hAnchor,
- NS_ooxml::LN_Value_doc_ST_HAnchor_margin);
- break;
- case RTFKeyword::PVMRG:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_vAnchor,
- NS_ooxml::LN_Value_doc_ST_VAnchor_margin);
- break;
- case RTFKeyword::PHPG:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_hAnchor,
- NS_ooxml::LN_Value_doc_ST_HAnchor_page);
- break;
- case RTFKeyword::PVPG:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_vAnchor,
- NS_ooxml::LN_Value_doc_ST_VAnchor_page);
- break;
- case RTFKeyword::PHCOL:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_hAnchor,
- NS_ooxml::LN_Value_doc_ST_HAnchor_text);
- break;
- case RTFKeyword::PVPARA:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_vAnchor,
- NS_ooxml::LN_Value_doc_ST_VAnchor_text);
- break;
-
- case RTFKeyword::POSXC:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_xAlign,
- NS_ooxml::LN_Value_doc_ST_XAlign_center);
- break;
- case RTFKeyword::POSXI:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_xAlign,
- NS_ooxml::LN_Value_doc_ST_XAlign_inside);
- break;
- case RTFKeyword::POSXO:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_xAlign,
- NS_ooxml::LN_Value_doc_ST_XAlign_outside);
- break;
- case RTFKeyword::POSXL:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_xAlign,
- NS_ooxml::LN_Value_doc_ST_XAlign_left);
- break;
- case RTFKeyword::POSXR:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_xAlign,
- NS_ooxml::LN_Value_doc_ST_XAlign_right);
- break;
-
- case RTFKeyword::DPLINE:
- case RTFKeyword::DPRECT:
- case RTFKeyword::DPELLIPSE:
- case RTFKeyword::DPTXBX:
- case RTFKeyword::DPPOLYLINE:
- case RTFKeyword::DPPOLYGON:
- {
- sal_Int32 nType = 0;
- switch (nKeyword)
- {
- case RTFKeyword::DPLINE:
- {
- uno::Reference<drawing::XShape> xShape(
- getModelFactory()->createInstance("com.sun.star.drawing.LineShape"),
- uno::UNO_QUERY);
- m_aStates.top().getDrawingObject().setShape(xShape);
- break;
- }
- case RTFKeyword::DPPOLYLINE:
- {
- // The reason this is not a simple CustomShape is that in the old syntax we have no ViewBox info.
- uno::Reference<drawing::XShape> xShape(
- getModelFactory()->createInstance("com.sun.star.drawing.PolyLineShape"),
- uno::UNO_QUERY);
- m_aStates.top().getDrawingObject().setShape(xShape);
- break;
- }
- case RTFKeyword::DPPOLYGON:
- {
- uno::Reference<drawing::XShape> xShape(
- getModelFactory()->createInstance("com.sun.star.drawing.PolyPolygonShape"),
- uno::UNO_QUERY);
- m_aStates.top().getDrawingObject().setShape(xShape);
- break;
- }
- case RTFKeyword::DPRECT:
- {
- uno::Reference<drawing::XShape> xShape(
- getModelFactory()->createInstance("com.sun.star.drawing.RectangleShape"),
- uno::UNO_QUERY);
- m_aStates.top().getDrawingObject().setShape(xShape);
- break;
- }
- case RTFKeyword::DPELLIPSE:
- nType = ESCHER_ShpInst_Ellipse;
- break;
- case RTFKeyword::DPTXBX:
- {
- uno::Reference<drawing::XShape> xShape(
- getModelFactory()->createInstance("com.sun.star.text.TextFrame"),
- uno::UNO_QUERY);
- m_aStates.top().getDrawingObject().setShape(xShape);
- std::vector<beans::PropertyValue> aDefaults
- = RTFSdrImport::getTextFrameDefaults(false);
- for (const auto& rDefault : aDefaults)
- {
- if (!findPropertyName(
- m_aStates.top().getDrawingObject().getPendingProperties(),
- rDefault.Name))
- m_aStates.top().getDrawingObject().getPendingProperties().push_back(
- rDefault);
- }
- checkFirstRun();
- Mapper().startShape(m_aStates.top().getDrawingObject().getShape());
- m_aStates.top().getDrawingObject().setHadShapeText(true);
- }
- break;
- default:
- break;
- }
- if (nType)
- {
- uno::Reference<drawing::XShape> xShape(
- getModelFactory()->createInstance("com.sun.star.drawing.CustomShape"),
- uno::UNO_QUERY);
- m_aStates.top().getDrawingObject().setShape(xShape);
- }
- uno::Reference<drawing::XDrawPageSupplier> xDrawSupplier(m_xDstDoc, uno::UNO_QUERY);
- uno::Reference<beans::XPropertySet> xPropertySet(
- m_aStates.top().getDrawingObject().getShape(), uno::UNO_QUERY);
- m_aStates.top().getDrawingObject().setPropertySet(xPropertySet);
- if (xDrawSupplier.is())
- {
- uno::Reference<drawing::XShapes> xShapes = xDrawSupplier->getDrawPage();
- if (xShapes.is() && nKeyword != RTFKeyword::DPTXBX)
- {
- // set default VertOrient before inserting
- m_aStates.top().getDrawingObject().getPropertySet()->setPropertyValue(
- "VertOrient", uno::Any(text::VertOrientation::NONE));
- xShapes->add(m_aStates.top().getDrawingObject().getShape());
- }
- }
- if (nType)
- {
- uno::Reference<drawing::XEnhancedCustomShapeDefaulter> xDefaulter(
- m_aStates.top().getDrawingObject().getShape(), uno::UNO_QUERY);
- xDefaulter->createCustomShapeDefaults(OUString::number(nType));
- }
- std::vector<beans::PropertyValue>& rPendingProperties
- = m_aStates.top().getDrawingObject().getPendingProperties();
- for (const auto& rPendingProperty : rPendingProperties)
- m_aStates.top().getDrawingObject().getPropertySet()->setPropertyValue(
- rPendingProperty.Name, rPendingProperty.Value);
- m_pSdrImport->resolveDhgt(m_aStates.top().getDrawingObject().getPropertySet(),
- m_aStates.top().getDrawingObject().getDhgt(),
- /*bOldStyle=*/true);
- }
- break;
- case RTFKeyword::DOBXMARGIN:
- case RTFKeyword::DOBYMARGIN:
- {
- beans::PropertyValue aPropertyValue;
- aPropertyValue.Name
- = (nKeyword == RTFKeyword::DOBXMARGIN ? std::u16string_view(u"HoriOrientRelation")
- : std::u16string_view(u"VertOrientRelation"));
- aPropertyValue.Value <<= text::RelOrientation::PAGE_PRINT_AREA;
- m_aStates.top().getDrawingObject().getPendingProperties().push_back(aPropertyValue);
- }
- break;
- case RTFKeyword::DOBXPAGE:
- case RTFKeyword::DOBYPAGE:
- {
- beans::PropertyValue aPropertyValue;
- aPropertyValue.Name
- = (nKeyword == RTFKeyword::DOBXPAGE ? std::u16string_view(u"HoriOrientRelation")
- : std::u16string_view(u"VertOrientRelation"));
- aPropertyValue.Value <<= text::RelOrientation::PAGE_FRAME;
- m_aStates.top().getDrawingObject().getPendingProperties().push_back(aPropertyValue);
- }
- break;
- case RTFKeyword::DOBYPARA:
- {
- beans::PropertyValue aPropertyValue;
- aPropertyValue.Name = "VertOrientRelation";
- aPropertyValue.Value <<= text::RelOrientation::FRAME;
- m_aStates.top().getDrawingObject().getPendingProperties().push_back(aPropertyValue);
- }
- break;
- case RTFKeyword::CONTEXTUALSPACE:
- {
- auto pValue = new RTFValue(1);
- m_aStates.top().getParagraphSprms().set(NS_ooxml::LN_CT_PPrBase_contextualSpacing,
- pValue);
- }
- break;
- case RTFKeyword::LINKSTYLES:
- {
- auto pValue = new RTFValue(1);
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Settings_linkStyles, pValue);
- }
- break;
- case RTFKeyword::PNLVLBODY:
- {
- auto pValue = new RTFValue(2);
- m_aStates.top().getTableAttributes().set(NS_ooxml::LN_CT_AbstractNum_nsid, pValue);
- }
- break;
- case RTFKeyword::PNDEC:
- {
- auto pValue = new RTFValue(NS_ooxml::LN_Value_ST_NumberFormat_decimal);
- putNestedAttribute(m_aStates.top().getTableSprms(), NS_ooxml::LN_CT_Lvl_numFmt,
- NS_ooxml::LN_CT_NumFmt_val, pValue);
- }
- break;
- case RTFKeyword::PNLVLBLT:
- {
- m_aStates.top().getTableAttributes().set(NS_ooxml::LN_CT_AbstractNum_nsid,
- new RTFValue(1));
- putNestedAttribute(m_aStates.top().getTableSprms(), NS_ooxml::LN_CT_Lvl_numFmt,
- NS_ooxml::LN_CT_NumFmt_val,
- new RTFValue(NS_ooxml::LN_Value_ST_NumberFormat_bullet));
- }
- break;
- case RTFKeyword::LANDSCAPE:
- {
- auto pValue = new RTFValue(NS_ooxml::LN_Value_ST_PageOrientation_landscape);
- putNestedAttribute(m_aDefaultState.getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgSz, NS_ooxml::LN_CT_PageSz_orient,
- pValue);
- [[fallthrough]]; // set the default + current value
- }
- case RTFKeyword::LNDSCPSXN:
- {
- auto pValue = new RTFValue(NS_ooxml::LN_Value_ST_PageOrientation_landscape);
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgSz, NS_ooxml::LN_CT_PageSz_orient,
- pValue);
- }
- break;
- case RTFKeyword::SHPBXPAGE:
- m_aStates.top().getShape().setHoriOrientRelation(text::RelOrientation::PAGE_FRAME);
- m_aStates.top().getShape().setHoriOrientRelationToken(
- NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromH_page);
- break;
- case RTFKeyword::SHPBYPAGE:
- m_aStates.top().getShape().setVertOrientRelation(text::RelOrientation::PAGE_FRAME);
- m_aStates.top().getShape().setVertOrientRelationToken(
- NS_ooxml::LN_Value_wordprocessingDrawing_ST_RelFromV_page);
- break;
- case RTFKeyword::DPLINEHOLLOW:
- m_aStates.top().getDrawingObject().setFLine(0);
- break;
- case RTFKeyword::DPROUNDR:
- if (m_aStates.top().getDrawingObject().getPropertySet().is())
- // Seems this old syntax has no way to specify a custom radius, and this is the default
- m_aStates.top().getDrawingObject().getPropertySet()->setPropertyValue(
- "CornerRadius", uno::Any(sal_Int32(83)));
- break;
- case RTFKeyword::NOWRAP:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_wrap,
- NS_ooxml::LN_Value_doc_ST_Wrap_notBeside);
- break;
- case RTFKeyword::OVERLAY:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_wrap,
- NS_ooxml::LN_Value_doc_ST_Wrap_none);
- break;
- case RTFKeyword::WRAPAROUND:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_wrap,
- NS_ooxml::LN_Value_doc_ST_Wrap_around);
- break;
- case RTFKeyword::WRAPTHROUGH:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_wrap,
- NS_ooxml::LN_Value_doc_ST_Wrap_through);
- break;
- case RTFKeyword::WRAPTIGHT:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_wrap,
- NS_ooxml::LN_Value_doc_ST_Wrap_tight);
- break;
- case RTFKeyword::WRAPDEFAULT:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_wrap,
- NS_ooxml::LN_Value_doc_ST_Wrap_auto);
- break;
- case RTFKeyword::MNOR:
- m_bMathNor = true;
- break;
- case RTFKeyword::REVISIONS:
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Settings_trackRevisions, new RTFValue(1));
- break;
- case RTFKeyword::BRDRSH:
- putBorderProperty(m_aStates, NS_ooxml::LN_CT_Border_shadow, new RTFValue(1));
- break;
- case RTFKeyword::NOCOLBAL:
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Compat_noColumnBalance, new RTFValue(1));
- break;
- case RTFKeyword::MARGMIRROR:
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Settings_mirrorMargins, new RTFValue(1));
- break;
- case RTFKeyword::SAUTOUPD:
- m_aStates.top().getTableSprms().set(NS_ooxml::LN_CT_Style_autoRedefine,
- new RTFValue(1));
- break;
- case RTFKeyword::WIDOWCTRL:
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Settings_widowControl, new RTFValue(1));
- break;
- case RTFKeyword::LINEBETCOL:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_cols, NS_ooxml::LN_CT_Columns_sep,
- new RTFValue(1));
- break;
- case RTFKeyword::PGNRESTART:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgNumType,
- NS_ooxml::LN_CT_PageNumber_start, new RTFValue(1));
- break;
- case RTFKeyword::PGNUCLTR:
- {
- auto pIntValue = new RTFValue(NS_ooxml::LN_Value_ST_NumberFormat_upperLetter);
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgNumType,
- NS_ooxml::LN_CT_PageNumber_fmt, pIntValue);
- }
- break;
- case RTFKeyword::PGNLCLTR:
- {
- auto pIntValue = new RTFValue(NS_ooxml::LN_Value_ST_NumberFormat_lowerLetter);
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgNumType,
- NS_ooxml::LN_CT_PageNumber_fmt, pIntValue);
- }
- break;
- case RTFKeyword::PGNUCRM:
- {
- auto pIntValue = new RTFValue(NS_ooxml::LN_Value_ST_NumberFormat_upperRoman);
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgNumType,
- NS_ooxml::LN_CT_PageNumber_fmt, pIntValue);
- }
- break;
- case RTFKeyword::PGNLCRM:
- {
- auto pIntValue = new RTFValue(NS_ooxml::LN_Value_ST_NumberFormat_lowerRoman);
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgNumType,
- NS_ooxml::LN_CT_PageNumber_fmt, pIntValue);
- }
- break;
- case RTFKeyword::PGNDEC:
- {
- auto pIntValue = new RTFValue(NS_ooxml::LN_Value_ST_NumberFormat_decimal);
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgNumType,
- NS_ooxml::LN_CT_PageNumber_fmt, pIntValue);
- }
- break;
- case RTFKeyword::HTMAUTSP:
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Compat_doNotUseHTMLParagraphAutoSpacing,
- new RTFValue(0));
- break;
- case RTFKeyword::DNTBLNSBDB:
- // tdf#128428 switch off longer space sequence
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Settings_longerSpaceSequence,
- new RTFValue(0));
- break;
- case RTFKeyword::GUTTERPRL:
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Settings_gutterAtTop, new RTFValue(1));
- break;
- case RTFKeyword::RTLGUTTER:
- {
- m_aStates.top().getSectionSprms().set(NS_ooxml::LN_EG_SectPrContents_rtlGutter,
- new RTFValue(1));
- }
- break;
- case RTFKeyword::FLDLOCK:
- {
- if (m_aStates.top().getDestination() == Destination::FIELD)
- m_aStates.top().setFieldLocked(true);
- }
- break;
- case RTFKeyword::NOBRKWRPTBL:
- {
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Compat_doNotBreakWrappedTables,
- new RTFValue(0));
- }
- break;
- case RTFKeyword::SPLTPGPAR:
- {
- // if flag is present, it is turned *off* - opposite to what spec says
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Compat_splitPgBreakAndParaMark,
- new RTFValue(0));
- }
- break;
- default:
- {
- SAL_INFO("writerfilter", "TODO handle flag '" << keywordToString(nKeyword) << "'");
- aSkip.setParsed(false);
- }
- break;
- }
- return RTFError::OK;
-}
-
-} // namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfdispatchsymbol.cxx b/writerfilter/source/rtftok/rtfdispatchsymbol.cxx
deleted file mode 100644
index b40fd55dde9b..000000000000
--- a/writerfilter/source/rtftok/rtfdispatchsymbol.cxx
+++ /dev/null
@@ -1,455 +0,0 @@
-/* -*- 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 "rtfdocumentimpl.hxx"
-
-#include <com/sun/star/io/WrongFormatException.hpp>
-#include <svl/lngmisc.hxx>
-
-#include <ooxml/resourceids.hxx>
-
-#include <sal/log.hxx>
-
-#include "rtfreferenceproperties.hxx"
-#include "rtfskipdestination.hxx"
-
-using namespace com::sun::star;
-
-namespace writerfilter::rtftok
-{
-RTFError RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
-{
- setNeedSect(true);
- if (nKeyword != RTFKeyword::HEXCHAR)
- checkUnicode(/*bUnicode =*/true, /*bHex =*/true);
- else
- checkUnicode(/*bUnicode =*/true, /*bHex =*/false);
- RTFSkipDestination aSkip(*this);
-
- if (RTFKeyword::LINE == nKeyword)
- {
- // very special handling since text() will eat lone '\n'
- singleChar('\n', /*bRunProps=*/true);
- return RTFError::OK;
- }
- // Trivial symbols
- sal_uInt8 cCh = 0;
- switch (nKeyword)
- {
- case RTFKeyword::TAB:
- cCh = '\t';
- break;
- case RTFKeyword::BACKSLASH:
- cCh = '\\';
- break;
- case RTFKeyword::LBRACE:
- cCh = '{';
- break;
- case RTFKeyword::RBRACE:
- cCh = '}';
- break;
- case RTFKeyword::EMDASH:
- cCh = 151;
- break;
- case RTFKeyword::ENDASH:
- cCh = 150;
- break;
- case RTFKeyword::BULLET:
- cCh = 149;
- break;
- case RTFKeyword::LQUOTE:
- cCh = 145;
- break;
- case RTFKeyword::RQUOTE:
- cCh = 146;
- break;
- case RTFKeyword::LDBLQUOTE:
- cCh = 147;
- break;
- case RTFKeyword::RDBLQUOTE:
- cCh = 148;
- break;
- default:
- break;
- }
- if (cCh > 0)
- {
- OUString aStr(OStringToOUString(OStringChar(char(cCh)), RTL_TEXTENCODING_MS_1252));
- text(aStr);
- return RTFError::OK;
- }
-
- switch (nKeyword)
- {
- case RTFKeyword::IGNORE:
- {
- m_bSkipUnknown = true;
- aSkip.setReset(false);
- return RTFError::OK;
- }
- break;
- case RTFKeyword::PAR:
- {
- if (m_aStates.top().getDestination() == Destination::FOOTNOTESEPARATOR)
- break; // just ignore it - only thing we read in here is CHFTNSEP
- checkFirstRun();
- checkNeedPap();
- runProps(); // tdf#152872 paragraph marker formatting
- if (!m_aStates.top().getCurrentBuffer())
- {
- parBreak();
- // Not in table? Reset max width.
- if (m_nCellxMax)
- {
- // Was in table, but not anymore -> tblEnd.
- RTFSprms aAttributes;
- RTFSprms aSprms;
- aSprms.set(NS_ooxml::LN_tblEnd, new RTFValue(1));
- writerfilter::Reference<Properties>::Pointer_t pProperties
- = new RTFReferenceProperties(std::move(aAttributes), std::move(aSprms));
- Mapper().props(pProperties);
- }
- m_nCellxMax = 0;
- }
- else if (m_aStates.top().getDestination() != Destination::SHAPETEXT)
- {
- RTFValue::Pointer_t pValue;
- m_aStates.top().getCurrentBuffer()->push_back(Buf_t(BUFFER_PAR, pValue, nullptr));
- }
- // but don't emit properties yet, since they may change till the first text token arrives
- m_bNeedPap = true;
- if (!m_aStates.top().getFrame().hasProperties())
- m_bNeedPar = false;
- m_bNeedFinalPar = false;
- }
- break;
- case RTFKeyword::SECT:
- {
- m_bHadSect = true;
- if (m_bIgnoreNextContSectBreak || m_aStates.top().getFrame().hasProperties())
- {
- // testContSectionPageBreak: need \par now
- dispatchSymbol(RTFKeyword::PAR);
- m_bIgnoreNextContSectBreak = false;
- }
- else
- {
- bool bPendingFloatingTable = false;
- RTFValue::Pointer_t pTblpPr
- = m_aStates.top().getTableRowSprms().find(NS_ooxml::LN_CT_TblPrBase_tblpPr);
- if (pTblpPr)
- {
- // We have a pending floating table, provide an anchor for it still in this
- // section.
- bPendingFloatingTable = true;
- }
-
- if (m_bNeedCr || bPendingFloatingTable)
- { // tdf#158586 don't dispatch \par here, it eats deferred page breaks
- setNeedPar(true);
- }
-
- sectBreak();
- if (m_nResetBreakOnSectBreak != RTFKeyword::invalid)
- {
- // this should run on _second_ \sect after \page
- dispatchFlag(m_nResetBreakOnSectBreak); // lazy reset
- m_nResetBreakOnSectBreak = RTFKeyword::invalid;
- m_bNeedSect = false; // dispatchSymbol set it
- }
- setNeedPar(true); // testFdo52052: need \par at end of document
- // testNestedTable: but not m_bNeedCr, that creates a page break
- }
- }
- break;
- case RTFKeyword::NOBREAK:
- {
- OUString aStr(SVT_HARD_SPACE);
- text(aStr);
- }
- break;
- case RTFKeyword::NOBRKHYPH:
- {
- OUString aStr(SVT_HARD_HYPHEN);
- text(aStr);
- }
- break;
- case RTFKeyword::OPTHYPH:
- {
- OUString aStr(SVT_SOFT_HYPHEN);
- text(aStr);
- }
- break;
- case RTFKeyword::HEXCHAR:
- m_aStates.top().setInternalState(RTFInternalState::HEX);
- break;
- case RTFKeyword::CELL:
- case RTFKeyword::NESTCELL:
- {
- checkFirstRun();
- if (m_bNeedPap)
- {
- // There were no runs in the cell, so we need to send paragraph and character properties here.
- auto pPValue = new RTFValue(m_aStates.top().getParagraphAttributes(),
- m_aStates.top().getParagraphSprms());
- bufferProperties(m_aTableBufferStack.back(), pPValue, nullptr);
- auto pCValue = new RTFValue(m_aStates.top().getCharacterAttributes(),
- m_aStates.top().getCharacterSprms());
- bufferProperties(m_aTableBufferStack.back(), pCValue, nullptr);
- }
-
- RTFValue::Pointer_t pValue;
- m_aTableBufferStack.back().emplace_back(Buf_t(BUFFER_CELLEND, pValue, nullptr));
- m_bNeedPap = true;
- }
- break;
- case RTFKeyword::NESTROW:
- {
- tools::SvRef<TableRowBuffer> const pBuffer(
- new TableRowBuffer(m_aTableBufferStack.back(), m_aNestedTableCellsSprms,
- m_aNestedTableCellsAttributes, m_nNestedCells));
- prepareProperties(m_aStates.top(), pBuffer->GetParaProperties(),
- pBuffer->GetFrameProperties(), pBuffer->GetRowProperties(),
- m_nNestedCells, m_nNestedCurrentCellX - m_nNestedTRLeft);
-
- if (m_aTableBufferStack.size() == 1 || !m_aStates.top().getCurrentBuffer())
- {
- throw io::WrongFormatException("mismatch between \\itap and number of \\nestrow",
- nullptr);
- }
- assert(m_aStates.top().getCurrentBuffer() == &m_aTableBufferStack.back());
- // note: there may be several states pointing to table buffer!
- for (std::size_t i = 0; i < m_aStates.size(); ++i)
- {
- if (m_aStates[i].getCurrentBuffer() == &m_aTableBufferStack.back())
- {
- m_aStates[i].setCurrentBuffer(
- &m_aTableBufferStack[m_aTableBufferStack.size() - 2]);
- }
- }
- m_aTableBufferStack.pop_back();
- m_aTableBufferStack.back().emplace_back(
- Buf_t(BUFFER_NESTROW, RTFValue::Pointer_t(), pBuffer));
-
- m_aNestedTableCellsSprms.clear();
- m_aNestedTableCellsAttributes.clear();
- m_nNestedCells = 0;
- m_bNeedPap = true;
- }
- break;
- case RTFKeyword::ROW:
- {
- if (m_aStates.top().getTableRowWidthAfter() > 0)
- {
- // Add fake cellx / cell, RTF equivalent of
- // OOXMLFastContextHandlerTextTableRow::handleGridAfter().
- auto pXValue = new RTFValue(m_aStates.top().getTableRowWidthAfter());
- m_aStates.top().getTableRowSprms().set(NS_ooxml::LN_CT_TblGridBase_gridCol, pXValue,
- RTFOverwrite::NO_APPEND);
- dispatchSymbol(RTFKeyword::CELL);
-
- // Adjust total width, which is done in the \cellx handler for normal cells.
- m_nTopLevelCurrentCellX += m_aStates.top().getTableRowWidthAfter();
-
- m_aStates.top().setTableRowWidthAfter(0);
- }
-
- bool bRestored = false;
- // Ending a row, but no cells defined?
- // See if there was an invalid table row reset, so we can restore cell infos to help invalid documents.
- if (!m_nTopLevelCurrentCellX && m_nBackupTopLevelCurrentCellX)
- {
- restoreTableRowProperties();
- bRestored = true;
- }
-
- // If the right edge of the last cell (row width) is smaller than the width of some other row, mimic WW8TabDesc::CalcDefaults(): resize the last cell
- const int MINLAY = 23; // sw/inc/swtypes.hxx, minimal possible size of frames.
- if ((m_nCellxMax - m_nTopLevelCurrentCellX) >= MINLAY)
- {
- auto pXValueLast = m_aStates.top().getTableRowSprms().find(
- NS_ooxml::LN_CT_TblGridBase_gridCol, false);
- const int nXValueLast = pXValueLast ? pXValueLast->getInt() : 0;
- auto pXValue = new RTFValue(nXValueLast + m_nCellxMax - m_nTopLevelCurrentCellX);
- m_aStates.top().getTableRowSprms().eraseLast(NS_ooxml::LN_CT_TblGridBase_gridCol);
- m_aStates.top().getTableRowSprms().set(NS_ooxml::LN_CT_TblGridBase_gridCol, pXValue,
- RTFOverwrite::NO_APPEND);
- m_nTopLevelCurrentCellX = m_nCellxMax;
- }
-
- if (m_nTopLevelCells)
- {
- // Make a backup before we start popping elements
- m_aTableInheritingCellsSprms = m_aTopLevelTableCellsSprms;
- m_aTableInheritingCellsAttributes = m_aTopLevelTableCellsAttributes;
- m_nInheritingCells = m_nTopLevelCells;
- }
- else
- {
- // No table definition? Then inherit from the previous row
- m_aTopLevelTableCellsSprms = m_aTableInheritingCellsSprms;
- m_aTopLevelTableCellsAttributes = m_aTableInheritingCellsAttributes;
- m_nTopLevelCells = m_nInheritingCells;
- }
-
- while (m_aTableBufferStack.size() > 1)
- {
- SAL_WARN("writerfilter.rtf", "dropping extra table buffer");
- // note: there may be several states pointing to table buffer!
- for (std::size_t i = 0; i < m_aStates.size(); ++i)
- {
- if (m_aStates[i].getCurrentBuffer() == &m_aTableBufferStack.back())
- {
- m_aStates[i].setCurrentBuffer(&m_aTableBufferStack.front());
- }
- }
- m_aTableBufferStack.pop_back();
- }
-
- replayRowBuffer(m_aTableBufferStack.back(), m_aTopLevelTableCellsSprms,
- m_aTopLevelTableCellsAttributes, m_nTopLevelCells);
-
- // The scope of the table cell defaults is one row.
- m_aDefaultState.getTableCellSprms().clear();
- m_aStates.top().getTableCellSprms() = m_aDefaultState.getTableCellSprms();
- m_aStates.top().getTableCellAttributes() = m_aDefaultState.getTableCellAttributes();
-
- writerfilter::Reference<Properties>::Pointer_t paraProperties;
- writerfilter::Reference<Properties>::Pointer_t frameProperties;
- writerfilter::Reference<Properties>::Pointer_t rowProperties;
- prepareProperties(m_aStates.top(), paraProperties, frameProperties, rowProperties,
- m_nTopLevelCells, m_nTopLevelCurrentCellX - m_nTopLevelTRLeft);
- sendProperties(paraProperties, frameProperties, rowProperties);
-
- m_bNeedPap = true;
- m_bNeedFinalPar = true;
- m_aTableBufferStack.back().clear();
- m_nTopLevelCells = 0;
-
- if (bRestored)
- // We restored cell definitions, clear these now.
- // This is necessary, as later cell definitions want to overwrite the restored ones.
- resetTableRowProperties();
- }
- break;
- case RTFKeyword::COLUMN:
- {
- bool bColumns = false; // If we have multiple columns
- RTFValue::Pointer_t pCols
- = m_aStates.top().getSectionSprms().find(NS_ooxml::LN_EG_SectPrContents_cols);
- if (pCols)
- {
- RTFValue::Pointer_t pNum = pCols->getAttributes().find(NS_ooxml::LN_CT_Columns_num);
- if (pNum && pNum->getInt() > 1)
- bColumns = true;
- }
- checkFirstRun();
- if (bColumns)
- {
- sal_uInt8 const sBreak[] = { 0xe };
- Mapper().startCharacterGroup();
- Mapper().text(sBreak, 1);
- Mapper().endCharacterGroup();
- }
- else
- dispatchSymbol(RTFKeyword::PAGE);
- }
- break;
- case RTFKeyword::CHFTN:
- {
- if (m_aStates.top().getCurrentBuffer() == &m_aSuperBuffer)
- // Stop buffering, there will be no custom mark for this footnote or endnote.
- m_aStates.top().setCurrentBuffer(nullptr);
- break;
- }
- case RTFKeyword::PAGE:
- {
- // Ignore page breaks inside tables.
- if (m_aStates.top().getCurrentBuffer() == &m_aTableBufferStack.back())
- break;
-
- // If we're inside a continuous section, we should send a section break, not a page one.
- RTFValue::Pointer_t pBreak
- = m_aStates.top().getSectionSprms().find(NS_ooxml::LN_EG_SectPrContents_type);
- // Unless we're on a title page.
- RTFValue::Pointer_t pTitlePg
- = m_aStates.top().getSectionSprms().find(NS_ooxml::LN_EG_SectPrContents_titlePg);
- if (((pBreak
- && pBreak->getInt()
- == static_cast<sal_Int32>(NS_ooxml::LN_Value_ST_SectionMark_continuous)
- && m_bHadSect) // tdf#158983 before first \sect, ignore \sbknone!
- || m_nResetBreakOnSectBreak == RTFKeyword::SBKNONE)
- && !(pTitlePg && pTitlePg->getInt()))
- {
- if (m_bWasInFrame)
- {
- dispatchSymbol(RTFKeyword::PAR);
- m_bWasInFrame = false;
- }
- sectBreak();
- // note: this will not affect the following section break
- // but the one just pushed
- dispatchFlag(RTFKeyword::SBKPAGE);
- if (m_bNeedPar)
- dispatchSymbol(RTFKeyword::PAR);
- m_bIgnoreNextContSectBreak = true;
- // arrange to clean up the synthetic RTFKeyword::SBKPAGE
- m_nResetBreakOnSectBreak = RTFKeyword::SBKNONE;
- }
- else
- {
- bool bFirstRun = m_bFirstRun;
- checkFirstRun();
- if (bFirstRun || m_bNeedCr)
- {
- // Only send the paragraph properties early if we'll create a new paragraph in a
- // bit anyway.
- checkNeedPap();
- // flush previously deferred break - needed for testFdo49893_2
- // which has consecutive \page with no text between
- sal_Unicode const nothing[] = { 0 /*MSVC doesn't allow it to be empty*/ };
- Mapper().utext(nothing, 0);
- }
- sal_uInt8 const sBreak[] = { 0xc };
- Mapper().text(sBreak, 1);
- // testFdo81892 don't do another \par break directly; because of
- // GetSplitPgBreakAndParaMark() it does finishParagraph *twice*
- m_bNeedCr = true;
- }
- }
- break;
- case RTFKeyword::CHPGN:
- {
- OUString aStr("PAGE");
- singleChar(cFieldStart);
- text(aStr);
- singleChar(cFieldSep, true);
- singleChar(cFieldEnd);
- }
- break;
- case RTFKeyword::CHFTNSEP:
- {
- static const sal_Unicode uFtnEdnSep = 0x3;
- Mapper().utext(&uFtnEdnSep, 1);
- }
- break;
- default:
- {
- SAL_INFO("writerfilter.rtf",
- "TODO handle symbol '" << keywordToString(nKeyword) << "'");
- aSkip.setParsed(false);
- }
- break;
- }
- return RTFError::OK;
-}
-
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfdispatchvalue.cxx b/writerfilter/source/rtftok/rtfdispatchvalue.cxx
deleted file mode 100644
index 1e7552dd71b1..000000000000
--- a/writerfilter/source/rtftok/rtfdispatchvalue.cxx
+++ /dev/null
@@ -1,1909 +0,0 @@
-/* -*- 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 "rtfdocumentimpl.hxx"
-
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/text/WrapTextMode.hpp>
-#include <com/sun/star/document/XDocumentProperties.hpp>
-#include <comphelper/sequence.hxx>
-#include <i18nlangtag/languagetag.hxx>
-#include <osl/thread.h>
-#include <sal/log.hxx>
-#include <rtl/tencinfo.h>
-#include <tools/UnitConversion.hxx>
-
-#include <ooxml/resourceids.hxx>
-
-#include "rtfcharsets.hxx"
-#include "rtffly.hxx"
-#include "rtfreferenceproperties.hxx"
-#include "rtfskipdestination.hxx"
-
-#include <unotools/defaultencoding.hxx>
-#include <unotools/wincodepage.hxx>
-
-using namespace com::sun::star;
-
-namespace writerfilter
-{
-static int getNumberFormat(int nParam)
-{
- static const int aMap[]
- = { NS_ooxml::LN_Value_ST_NumberFormat_decimal,
- NS_ooxml::LN_Value_ST_NumberFormat_upperRoman,
- NS_ooxml::LN_Value_ST_NumberFormat_lowerRoman,
- NS_ooxml::LN_Value_ST_NumberFormat_upperLetter,
- NS_ooxml::LN_Value_ST_NumberFormat_lowerLetter,
- NS_ooxml::LN_Value_ST_NumberFormat_ordinal,
- NS_ooxml::LN_Value_ST_NumberFormat_cardinalText,
- NS_ooxml::LN_Value_ST_NumberFormat_ordinalText,
- NS_ooxml::LN_Value_ST_NumberFormat_none, // Undefined in RTF 1.8 spec.
- NS_ooxml::LN_Value_ST_NumberFormat_none, // Undefined in RTF 1.8 spec.
- NS_ooxml::LN_Value_ST_NumberFormat_ideographDigital,
- NS_ooxml::LN_Value_ST_NumberFormat_japaneseCounting,
- NS_ooxml::LN_Value_ST_NumberFormat_aiueo,
- NS_ooxml::LN_Value_ST_NumberFormat_iroha,
- NS_ooxml::LN_Value_ST_NumberFormat_decimalFullWidth,
- NS_ooxml::LN_Value_ST_NumberFormat_decimalHalfWidth,
- NS_ooxml::LN_Value_ST_NumberFormat_japaneseLegal,
- NS_ooxml::LN_Value_ST_NumberFormat_japaneseDigitalTenThousand,
- NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedCircleChinese,
- NS_ooxml::LN_Value_ST_NumberFormat_decimalFullWidth2,
- NS_ooxml::LN_Value_ST_NumberFormat_aiueoFullWidth,
- NS_ooxml::LN_Value_ST_NumberFormat_irohaFullWidth,
- NS_ooxml::LN_Value_ST_NumberFormat_decimalZero,
- NS_ooxml::LN_Value_ST_NumberFormat_bullet,
- NS_ooxml::LN_Value_ST_NumberFormat_ganada,
- NS_ooxml::LN_Value_ST_NumberFormat_chosung,
- NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedFullstop,
- NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedParen,
- NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedCircleChinese,
- NS_ooxml::LN_Value_ST_NumberFormat_ideographEnclosedCircle,
- NS_ooxml::LN_Value_ST_NumberFormat_ideographTraditional,
- NS_ooxml::LN_Value_ST_NumberFormat_ideographZodiac,
- NS_ooxml::LN_Value_ST_NumberFormat_ideographZodiacTraditional,
- NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseCounting,
- NS_ooxml::LN_Value_ST_NumberFormat_ideographLegalTraditional,
- NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseCountingThousand,
- NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseDigital,
- NS_ooxml::LN_Value_ST_NumberFormat_chineseCounting,
- NS_ooxml::LN_Value_ST_NumberFormat_chineseLegalSimplified,
- NS_ooxml::LN_Value_ST_NumberFormat_chineseCountingThousand,
- NS_ooxml::LN_Value_ST_NumberFormat_decimal,
- NS_ooxml::LN_Value_ST_NumberFormat_koreanDigital,
- NS_ooxml::LN_Value_ST_NumberFormat_koreanCounting,
- NS_ooxml::LN_Value_ST_NumberFormat_koreanLegal,
- NS_ooxml::LN_Value_ST_NumberFormat_koreanDigital2,
- NS_ooxml::LN_Value_ST_NumberFormat_hebrew1,
- NS_ooxml::LN_Value_ST_NumberFormat_arabicAlpha,
- NS_ooxml::LN_Value_ST_NumberFormat_hebrew2,
- NS_ooxml::LN_Value_ST_NumberFormat_arabicAbjad };
- const int nLen = SAL_N_ELEMENTS(aMap);
- int nValue = 0;
- if (nParam >= 0 && nParam < nLen)
- nValue = aMap[nParam];
- else // 255 and the other cases.
- nValue = NS_ooxml::LN_Value_ST_NumberFormat_none;
- return nValue;
-}
-
-namespace rtftok
-{
-bool RTFDocumentImpl::dispatchTableSprmValue(RTFKeyword nKeyword, int nParam)
-{
- int nSprm = 0;
- tools::SvRef<RTFValue> pIntValue(new RTFValue(nParam));
- switch (nKeyword)
- {
- case RTFKeyword::LEVELJC:
- {
- nSprm = NS_ooxml::LN_CT_Lvl_lvlJc;
- int nValue = 0;
- switch (nParam)
- {
- case 0:
- nValue = NS_ooxml::LN_Value_ST_Jc_left;
- break;
- case 1:
- nValue = NS_ooxml::LN_Value_ST_Jc_center;
- break;
- case 2:
- nValue = NS_ooxml::LN_Value_ST_Jc_right;
- break;
- }
- pIntValue = new RTFValue(nValue);
- break;
- }
- case RTFKeyword::LEVELSTARTAT:
- nSprm = NS_ooxml::LN_CT_Lvl_start;
- break;
- case RTFKeyword::LEVELPICTURE:
- nSprm = NS_ooxml::LN_CT_Lvl_lvlPicBulletId;
- break;
- case RTFKeyword::SBASEDON:
- nSprm = NS_ooxml::LN_CT_Style_basedOn;
- pIntValue = new RTFValue(getStyleName(nParam));
- break;
- case RTFKeyword::SNEXT:
- nSprm = NS_ooxml::LN_CT_Style_next;
- pIntValue = new RTFValue(getStyleName(nParam));
- break;
- case RTFKeyword::LEVELLEGAL:
- nSprm = NS_ooxml::LN_CT_Lvl_isLgl;
- break;
- default:
- break;
- }
- if (nSprm > 0)
- {
- m_aStates.top().getTableSprms().set(nSprm, pIntValue);
- return true;
- }
- if (nKeyword == RTFKeyword::LEVELNFC)
- {
- pIntValue = new RTFValue(getNumberFormat(nParam));
- putNestedAttribute(m_aStates.top().getTableSprms(), NS_ooxml::LN_CT_Lvl_numFmt,
- NS_ooxml::LN_CT_NumFmt_val, pIntValue);
- return true;
- }
-
- return false;
-}
-
-bool RTFDocumentImpl::dispatchCharacterSprmValue(RTFKeyword nKeyword, int nParam)
-{
- int nSprm = 0;
- tools::SvRef<RTFValue> pIntValue(new RTFValue(nParam));
-
- switch (nKeyword)
- {
- case RTFKeyword::FS:
- case RTFKeyword::AFS:
- switch (m_aStates.top().getRunType())
- {
- case RTFParserState::RunType::HICH:
- case RTFParserState::RunType::RTLCH_LTRCH_1:
- case RTFParserState::RunType::LTRCH_RTLCH_2:
- nSprm = NS_ooxml::LN_EG_RPrBase_szCs;
- break;
- case RTFParserState::RunType::NONE:
- case RTFParserState::RunType::LOCH:
- case RTFParserState::RunType::LTRCH_RTLCH_1:
- case RTFParserState::RunType::RTLCH_LTRCH_2:
- case RTFParserState::RunType::DBCH:
- default:
- nSprm = NS_ooxml::LN_EG_RPrBase_sz;
- break;
- }
- break;
- case RTFKeyword::EXPNDTW:
- nSprm = NS_ooxml::LN_EG_RPrBase_spacing;
- break;
- case RTFKeyword::KERNING:
- nSprm = NS_ooxml::LN_EG_RPrBase_kern;
- break;
- case RTFKeyword::CHARSCALEX:
- nSprm = NS_ooxml::LN_EG_RPrBase_w;
- break;
- default:
- break;
- }
- if (nSprm > 0)
- {
- if (m_aStates.top().getDestination() == Destination::LISTLEVEL)
- {
- m_aStates.top().getTableSprms().set(nSprm, pIntValue);
- }
- else
- {
- m_aStates.top().getCharacterSprms().set(nSprm, pIntValue);
- }
- return true;
- }
-
- return false;
-}
-
-bool RTFDocumentImpl::dispatchCharacterAttributeValue(RTFKeyword nKeyword, int nParam)
-{
- int nSprm = 0;
-
- switch (nKeyword)
- {
- case RTFKeyword::LANG:
- case RTFKeyword::ALANG:
- switch (m_aStates.top().getRunType())
- {
- case RTFParserState::RunType::HICH:
- case RTFParserState::RunType::RTLCH_LTRCH_1:
- case RTFParserState::RunType::LTRCH_RTLCH_2:
- nSprm = NS_ooxml::LN_CT_Language_bidi;
- break;
- case RTFParserState::RunType::DBCH:
- nSprm = NS_ooxml::LN_CT_Language_eastAsia;
- break;
- case RTFParserState::RunType::NONE:
- case RTFParserState::RunType::LOCH:
- case RTFParserState::RunType::LTRCH_RTLCH_1:
- case RTFParserState::RunType::RTLCH_LTRCH_2:
- default:
- nSprm = NS_ooxml::LN_CT_Language_val;
- break;
- }
- break;
- case RTFKeyword::LANGFE: // this one is always CJK apparently
- nSprm = NS_ooxml::LN_CT_Language_eastAsia;
- break;
- default:
- break;
- }
- if (nSprm > 0)
- {
- LanguageTag aTag((LanguageType(static_cast<sal_uInt16>(nParam))));
- auto pValue = new RTFValue(aTag.getBcp47());
- putNestedAttribute(m_aStates.top().getCharacterSprms(), NS_ooxml::LN_EG_RPrBase_lang, nSprm,
- pValue);
- // Language is a character property, but we should store it at a paragraph level as well for fields.
- if (nKeyword == RTFKeyword::LANG && m_bNeedPap)
- putNestedAttribute(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_EG_RPrBase_lang,
- nSprm, pValue);
- return true;
- }
-
- return false;
-}
-
-bool RTFDocumentImpl::dispatchParagraphSprmValue(RTFKeyword nKeyword, int nParam)
-{
- int nSprm = 0;
- tools::SvRef<RTFValue> pIntValue(new RTFValue(nParam));
-
- switch (nKeyword)
- {
- case RTFKeyword::ITAP:
- nSprm = NS_ooxml::LN_tblDepth;
- // tdf#117268: If \itap0 is encountered inside tables (between \cellxN and \cell), then
- // use the default value (1), as Word apparently does
- if (nParam == 0 && (m_nTopLevelCells != 0 || m_nNestedCells != 0))
- {
- nParam = 1;
- pIntValue = new RTFValue(nParam);
- }
- break;
- default:
- break;
- }
- if (nSprm > 0)
- {
- m_aStates.top().getParagraphSprms().set(nSprm, pIntValue);
- if (nKeyword == RTFKeyword::ITAP && nParam > 0)
- {
- while (m_aTableBufferStack.size() < sal::static_int_cast<std::size_t>(nParam))
- {
- m_aTableBufferStack.emplace_back();
- }
- // Invalid tables may omit INTBL after ITAP
- dispatchFlag(RTFKeyword::INTBL); // sets newly pushed buffer as current
- assert(m_aStates.top().getCurrentBuffer() == &m_aTableBufferStack.back());
- }
- return true;
- }
-
- return false;
-}
-
-bool RTFDocumentImpl::dispatchInfoValue(RTFKeyword nKeyword, int nParam)
-{
- int nSprm = 0;
-
- switch (nKeyword)
- {
- case RTFKeyword::YR:
- {
- m_aStates.top().setYear(nParam);
- nSprm = 1;
- }
- break;
- case RTFKeyword::MO:
- {
- m_aStates.top().setMonth(nParam);
- nSprm = 1;
- }
- break;
- case RTFKeyword::DY:
- {
- m_aStates.top().setDay(nParam);
- nSprm = 1;
- }
- break;
- case RTFKeyword::HR:
- {
- m_aStates.top().setHour(nParam);
- nSprm = 1;
- }
- break;
- case RTFKeyword::MIN:
- {
- m_aStates.top().setMinute(nParam);
- nSprm = 1;
- }
- break;
- default:
- break;
- }
-
- return nSprm > 0;
-}
-
-bool RTFDocumentImpl::dispatchFrameValue(RTFKeyword nKeyword, int nParam)
-{
- Id nId = 0;
- switch (nKeyword)
- {
- case RTFKeyword::ABSW:
- nId = NS_ooxml::LN_CT_FramePr_w;
- break;
- case RTFKeyword::ABSH:
- nId = NS_ooxml::LN_CT_FramePr_h;
- break;
- case RTFKeyword::POSX:
- {
- nId = NS_ooxml::LN_CT_FramePr_x;
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_xAlign, 0);
- }
- break;
- case RTFKeyword::POSY:
- {
- nId = NS_ooxml::LN_CT_FramePr_y;
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_yAlign, 0);
- }
- break;
- default:
- break;
- }
-
- if (nId > 0)
- {
- m_bNeedPap = true;
- // Don't try to support text frames inside tables for now.
- if (m_aStates.top().getCurrentBuffer() != &m_aTableBufferStack.back())
- m_aStates.top().getFrame().setSprm(nId, nParam);
-
- return true;
- }
-
- return false;
-}
-
-bool RTFDocumentImpl::dispatchTableValue(RTFKeyword nKeyword, int nParam)
-{
- int nSprm = 0;
- tools::SvRef<RTFValue> pIntValue(new RTFValue(nParam));
-
- switch (nKeyword)
- {
- case RTFKeyword::CELLX:
- {
- int& rCurrentCellX(
- (Destination::NESTEDTABLEPROPERTIES == m_aStates.top().getDestination())
- ? m_nNestedCurrentCellX
- : m_nTopLevelCurrentCellX);
- int nCellX = nParam - rCurrentCellX;
-
- if (!nCellX && nParam > 0)
- {
- // If width of cell is 0, BUT there is a value for \cellxN use minimal
- // possible width. But if \cellxN has no value leave 0 so autofit will
- // try to resolve this.
-
- // sw/source/filter/inc/wrtswtbl.hxx, minimal possible width of cells.
- const int COL_DFLT_WIDTH = 41;
- nCellX = COL_DFLT_WIDTH;
- }
-
- // If there is a negative left margin, then the first cellx is relative to that.
- RTFValue::Pointer_t pTblInd
- = m_aStates.top().getTableRowSprms().find(NS_ooxml::LN_CT_TblPrBase_tblInd);
- if (rCurrentCellX == 0 && pTblInd)
- {
- RTFValue::Pointer_t pWidth
- = pTblInd->getAttributes().find(NS_ooxml::LN_CT_TblWidth_w);
- if (pWidth && pWidth->getInt() < 0)
- nCellX = -1 * (pWidth->getInt() - nParam);
- }
-
- rCurrentCellX = nParam;
- auto pXValue = new RTFValue(nCellX);
- m_aStates.top().getTableRowSprms().set(NS_ooxml::LN_CT_TblGridBase_gridCol, pXValue,
- RTFOverwrite::NO_APPEND);
- if (Destination::NESTEDTABLEPROPERTIES == m_aStates.top().getDestination())
- {
- m_nNestedCells++;
- // Push cell properties.
- m_aNestedTableCellsSprms.push_back(m_aStates.top().getTableCellSprms());
- m_aNestedTableCellsAttributes.push_back(m_aStates.top().getTableCellAttributes());
- }
- else
- {
- m_nTopLevelCells++;
- // Push cell properties.
- m_aTopLevelTableCellsSprms.push_back(m_aStates.top().getTableCellSprms());
- m_aTopLevelTableCellsAttributes.push_back(m_aStates.top().getTableCellAttributes());
- }
-
- m_aStates.top().getTableCellSprms() = m_aDefaultState.getTableCellSprms();
- m_aStates.top().getTableCellAttributes() = m_aDefaultState.getTableCellAttributes();
- // We assume text after a row definition always belongs to the table, to handle text before the real INTBL token
- dispatchFlag(RTFKeyword::INTBL);
- if (!m_nCellxMax)
- {
- // Wasn't in table, but now is -> tblStart.
- RTFSprms aAttributes;
- RTFSprms aSprms;
- aSprms.set(NS_ooxml::LN_tblStart, new RTFValue(1));
- writerfilter::Reference<Properties>::Pointer_t pProperties
- = new RTFReferenceProperties(std::move(aAttributes), std::move(aSprms));
- Mapper().props(pProperties);
- }
- m_nCellxMax = std::max(m_nCellxMax, nParam);
- return true;
- }
- break;
- case RTFKeyword::TRRH:
- {
- OUString hRule("auto");
- if (nParam < 0)
- {
- tools::SvRef<RTFValue> pAbsValue(new RTFValue(-nParam));
- std::swap(pIntValue, pAbsValue);
-
- hRule = "exact";
- }
- else if (nParam > 0)
- hRule = "atLeast";
-
- putNestedAttribute(m_aStates.top().getTableRowSprms(),
- NS_ooxml::LN_CT_TrPrBase_trHeight, NS_ooxml::LN_CT_Height_val,
- pIntValue);
-
- auto pHRule = new RTFValue(hRule);
- putNestedAttribute(m_aStates.top().getTableRowSprms(),
- NS_ooxml::LN_CT_TrPrBase_trHeight, NS_ooxml::LN_CT_Height_hRule,
- pHRule);
- return true;
- }
- break;
- case RTFKeyword::TRLEFT:
- case RTFKeyword::TBLIND:
- {
- // the value is in twips
- auto const aDestination = m_aStates.top().getDestination();
- int& rCurrentTRLeft((Destination::NESTEDTABLEPROPERTIES == aDestination)
- ? m_nNestedTRLeft
- : m_nTopLevelTRLeft);
- int& rCurrentCellX((Destination::NESTEDTABLEPROPERTIES == aDestination)
- ? m_nNestedCurrentCellX
- : m_nTopLevelCurrentCellX);
- putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblInd,
- NS_ooxml::LN_CT_TblWidth_type,
- new RTFValue(NS_ooxml::LN_Value_ST_TblWidth_dxa));
-
- if (nKeyword == RTFKeyword::TBLIND)
- {
- RTFValue::Pointer_t pCellMargin
- = m_aStates.top().getTableRowSprms().find(NS_ooxml::LN_CT_TblPrBase_tblCellMar);
- if (pCellMargin)
- {
- RTFValue::Pointer_t pMarginLeft
- = pCellMargin->getSprms().find(NS_ooxml::LN_CT_TcMar_left);
- if (pMarginLeft)
- nParam -= pMarginLeft->getAttributes()
- .find(NS_ooxml::LN_CT_TblWidth_w)
- ->getInt();
- }
- rCurrentTRLeft = nParam;
- }
- else
- rCurrentTRLeft = rCurrentCellX = nParam;
-
- putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblInd,
- +NS_ooxml::LN_CT_TblWidth_w, new RTFValue(nParam));
- return true;
- }
- break;
- case RTFKeyword::CLSHDNG:
- {
- int nValue = -1;
-
- if (nParam < 1)
- nValue = NS_ooxml::LN_Value_ST_Shd_clear;
- else if (nParam < 750)
- // Values in between 1 and 250 visually closer to 0% shading (white)
- // But this will mean "no shading" while cell actually have some.
- // So lets use minimal available value.
- nValue = NS_ooxml::LN_Value_ST_Shd_pct5;
- else if (nParam < 1100)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct10;
- else if (nParam < 1350)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct12;
- else if (nParam < 1750)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct15;
- else if (nParam < 2250)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct20;
- else if (nParam < 2750)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct25;
- else if (nParam < 3250)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct30;
- else if (nParam < 3600)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct35;
- else if (nParam < 3850)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct37;
- else if (nParam < 4250)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct40;
- else if (nParam < 4750)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct45;
- else if (nParam < 5250)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct50;
- else if (nParam < 5750)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct55;
- else if (nParam < 6100)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct60;
- else if (nParam < 6350)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct62;
- else if (nParam < 6750)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct65;
- else if (nParam < 7250)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct70;
- else if (nParam < 7750)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct75;
- else if (nParam < 8250)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct80;
- else if (nParam < 8600)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct85;
- else if (nParam < 8850)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct87;
- else if (nParam < 9250)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct90;
- else if (nParam < 9750)
- nValue = NS_ooxml::LN_Value_ST_Shd_pct95;
- else
- // Solid fill
- nValue = NS_ooxml::LN_Value_ST_Shd_solid;
-
- putNestedAttribute(m_aStates.top().getTableCellSprms(), NS_ooxml::LN_CT_TcPrBase_shd,
- NS_ooxml::LN_CT_Shd_val, new RTFValue(nValue));
- return true;
- }
- break;
- case RTFKeyword::CLPADB:
- case RTFKeyword::CLPADL:
- case RTFKeyword::CLPADR:
- case RTFKeyword::CLPADT:
- {
- RTFSprms aAttributes;
- aAttributes.set(NS_ooxml::LN_CT_TblWidth_type,
- new RTFValue(NS_ooxml::LN_Value_ST_TblWidth_dxa));
- aAttributes.set(NS_ooxml::LN_CT_TblWidth_w, new RTFValue(nParam));
- // Top and left is swapped, that's what Word does.
- switch (nKeyword)
- {
- case RTFKeyword::CLPADB:
- nSprm = NS_ooxml::LN_CT_TcMar_bottom;
- break;
- case RTFKeyword::CLPADL:
- nSprm = NS_ooxml::LN_CT_TcMar_top;
- break;
- case RTFKeyword::CLPADR:
- nSprm = NS_ooxml::LN_CT_TcMar_right;
- break;
- case RTFKeyword::CLPADT:
- nSprm = NS_ooxml::LN_CT_TcMar_left;
- break;
- default:
- break;
- }
- putNestedSprm(m_aStates.top().getTableCellSprms(), NS_ooxml::LN_CT_TcPrBase_tcMar,
- nSprm, new RTFValue(aAttributes));
- return true;
- }
- break;
- case RTFKeyword::TRPADDFB:
- case RTFKeyword::TRPADDFL:
- case RTFKeyword::TRPADDFR:
- case RTFKeyword::TRPADDFT:
- {
- RTFSprms aAttributes;
- switch (nParam)
- {
- case 3:
- aAttributes.set(NS_ooxml::LN_CT_TblWidth_type,
- new RTFValue(NS_ooxml::LN_Value_ST_TblWidth_dxa));
- break;
- }
- switch (nKeyword)
- {
- case RTFKeyword::TRPADDFB:
- nSprm = NS_ooxml::LN_CT_TcMar_bottom;
- break;
- case RTFKeyword::TRPADDFL:
- nSprm = NS_ooxml::LN_CT_TcMar_left;
- break;
- case RTFKeyword::TRPADDFR:
- nSprm = NS_ooxml::LN_CT_TcMar_right;
- break;
- case RTFKeyword::TRPADDFT:
- nSprm = NS_ooxml::LN_CT_TcMar_top;
- break;
- default:
- break;
- }
- putNestedAttribute(m_aStates.top().getTableRowSprms(),
- NS_ooxml::LN_CT_TblPrBase_tblCellMar, nSprm,
- new RTFValue(aAttributes));
- // tdf#74795 also set on current cell, and as default for table cells
- // (why isn't this done by domainmapper?)
- putNestedAttribute(m_aStates.top().getTableCellSprms(), NS_ooxml::LN_CT_TcPrBase_tcMar,
- nSprm, new RTFValue(aAttributes));
- putNestedAttribute(m_aDefaultState.getTableCellSprms(), NS_ooxml::LN_CT_TcPrBase_tcMar,
- nSprm, new RTFValue(aAttributes));
- return true;
- }
- break;
- case RTFKeyword::TRPADDB:
- case RTFKeyword::TRPADDL:
- case RTFKeyword::TRPADDR:
- case RTFKeyword::TRPADDT:
- {
- RTFSprms aAttributes;
- aAttributes.set(NS_ooxml::LN_CT_TblWidth_w, new RTFValue(nParam));
- switch (nKeyword)
- {
- case RTFKeyword::TRPADDB:
- nSprm = NS_ooxml::LN_CT_TcMar_bottom;
- break;
- case RTFKeyword::TRPADDL:
- nSprm = NS_ooxml::LN_CT_TcMar_left;
- break;
- case RTFKeyword::TRPADDR:
- nSprm = NS_ooxml::LN_CT_TcMar_right;
- break;
- case RTFKeyword::TRPADDT:
- nSprm = NS_ooxml::LN_CT_TcMar_top;
- break;
- default:
- break;
- }
- putNestedSprm(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblCellMar,
- nSprm, new RTFValue(aAttributes));
- // tdf#74795 also set on current cell, and as default for table cells
- // (why isn't this done by domainmapper?)
- putNestedSprm(m_aStates.top().getTableCellSprms(), NS_ooxml::LN_CT_TcPrBase_tcMar,
- nSprm, new RTFValue(aAttributes));
- putNestedSprm(m_aDefaultState.getTableCellSprms(), NS_ooxml::LN_CT_TcPrBase_tcMar,
- nSprm, new RTFValue(aAttributes));
- return true;
- }
- case RTFKeyword::TRGAPH:
- // Half of the space between the cells of a table row: default left/right table cell margin.
- if (nParam > 0)
- {
- RTFSprms aAttributes;
- aAttributes.set(NS_ooxml::LN_CT_TblWidth_type,
- new RTFValue(NS_ooxml::LN_Value_ST_TblWidth_dxa));
- aAttributes.set(NS_ooxml::LN_CT_TblWidth_w, pIntValue);
- // FIXME: this is wrong, it is half-gap, needs to be distinguished from margin! depending on TRPADDFL/TRPADDFR
- putNestedSprm(m_aStates.top().getTableRowSprms(),
- NS_ooxml::LN_CT_TblPrBase_tblCellMar, NS_ooxml::LN_CT_TblCellMar_left,
- new RTFValue(aAttributes));
- putNestedSprm(m_aStates.top().getTableRowSprms(),
- NS_ooxml::LN_CT_TblPrBase_tblCellMar,
- NS_ooxml::LN_CT_TblCellMar_right, new RTFValue(aAttributes));
- }
- return true;
- case RTFKeyword::TRFTSWIDTH:
- putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblW,
- NS_ooxml::LN_CT_TblWidth_type, pIntValue);
- return true;
- case RTFKeyword::TRWWIDTH:
- putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblW,
- NS_ooxml::LN_CT_TblWidth_w, pIntValue);
- return true;
- default:
- break;
- }
-
- return false;
-}
-
-RTFError RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam)
-{
- setNeedSect(true);
- checkUnicode(/*bUnicode =*/nKeyword != RTFKeyword::U, /*bHex =*/true);
- RTFSkipDestination aSkip(*this);
- int nSprm = 0;
- tools::SvRef<RTFValue> pIntValue(new RTFValue(nParam));
- // Trivial table sprms.
- if (dispatchTableSprmValue(nKeyword, nParam))
- {
- return RTFError::OK;
- }
-
- // Trivial character sprms.
- if (dispatchCharacterSprmValue(nKeyword, nParam))
- {
- return RTFError::OK;
- }
-
- // Trivial character attributes.
- if (dispatchCharacterAttributeValue(nKeyword, nParam))
- {
- return RTFError::OK;
- }
-
- // Trivial paragraph sprms.
- if (dispatchParagraphSprmValue(nKeyword, nParam))
- {
- return RTFError::OK;
- }
-
- // Info group.
- if (dispatchInfoValue(nKeyword, nParam))
- {
- return RTFError::OK;
- }
-
- // Frame size / position.
- if (dispatchFrameValue(nKeyword, nParam))
- {
- return RTFError::OK;
- }
-
- // Table-related values.
- if (dispatchTableValue(nKeyword, nParam))
- {
- return RTFError::OK;
- }
-
- // Then check for the more complex ones.
- switch (nKeyword)
- {
- case RTFKeyword::F:
- case RTFKeyword::AF:
- switch (m_aStates.top().getRunType())
- {
- case RTFParserState::RunType::RTLCH_LTRCH_1:
- case RTFParserState::RunType::LTRCH_RTLCH_2:
- nSprm = NS_ooxml::LN_CT_Fonts_cs;
- break;
- case RTFParserState::RunType::DBCH:
- nSprm = NS_ooxml::LN_CT_Fonts_eastAsia;
- break;
- case RTFParserState::RunType::NONE:
- case RTFParserState::RunType::LOCH:
- case RTFParserState::RunType::HICH:
- case RTFParserState::RunType::LTRCH_RTLCH_1:
- case RTFParserState::RunType::RTLCH_LTRCH_2:
- default:
- nSprm = NS_ooxml::LN_CT_Fonts_ascii;
- break;
- }
-
- if (m_aStates.top().getDestination() == Destination::FONTTABLE
- || m_aStates.top().getDestination() == Destination::FONTENTRY)
- {
- // Some text in buffer? It is font name. So previous font definition is complete
- if (m_aStates.top().getCurrentDestinationText()->getLength())
- handleFontTableEntry();
-
- m_aFontIndexes.push_back(nParam);
- m_nCurrentFontIndex = getFontIndex(nParam);
- }
- else if (m_aStates.top().getDestination() == Destination::LISTLEVEL)
- {
- RTFSprms aFontAttributes;
- aFontAttributes.set(nSprm, new RTFValue(m_aFontNames[getFontIndex(nParam)]));
- RTFSprms aRunPropsSprms;
- aRunPropsSprms.set(NS_ooxml::LN_EG_RPrBase_rFonts, new RTFValue(aFontAttributes));
- m_aStates.top().getTableSprms().set(NS_ooxml::LN_CT_Lvl_rPr,
- new RTFValue(RTFSprms(), aRunPropsSprms),
- RTFOverwrite::NO_APPEND);
- }
- else
- {
- m_nCurrentFontIndex = getFontIndex(nParam);
- auto pValue = new RTFValue(getFontName(m_nCurrentFontIndex));
- putNestedAttribute(m_aStates.top().getCharacterSprms(),
- NS_ooxml::LN_EG_RPrBase_rFonts, nSprm, pValue);
- if (nKeyword == RTFKeyword::F)
- m_aStates.top().setCurrentEncoding(getEncoding(m_nCurrentFontIndex));
- }
- break;
- case RTFKeyword::RED:
- m_aStates.top().getCurrentColor().SetRed(nParam);
- break;
- case RTFKeyword::GREEN:
- m_aStates.top().getCurrentColor().SetGreen(nParam);
- break;
- case RTFKeyword::BLUE:
- m_aStates.top().getCurrentColor().SetBlue(nParam);
- break;
- case RTFKeyword::FCHARSET:
- {
- // we always send text to the domain mapper in OUString, so no
- // need to send encoding info
- int i;
- for (i = 0; i < nRTFEncodings; i++)
- {
- if (aRTFEncodings[i].charset == nParam)
- break;
- }
- if (i == nRTFEncodings)
- // not found
- return RTFError::OK;
-
- m_nCurrentEncoding
- = aRTFEncodings[i].codepage == 0 // Default (CP_ACP)
- ? osl_getThreadTextEncoding()
- : rtl_getTextEncodingFromWindowsCodePage(aRTFEncodings[i].codepage);
- m_aStates.top().setCurrentEncoding(m_nCurrentEncoding);
- }
- break;
- case RTFKeyword::ANSICPG:
- case RTFKeyword::CPG:
- {
- rtl_TextEncoding nEncoding
- = (nParam == 0)
- ? utl_getWinTextEncodingFromLangStr(utl_getLocaleForGlobalDefaultEncoding())
- : rtl_getTextEncodingFromWindowsCodePage(nParam);
- if (nKeyword == RTFKeyword::ANSICPG)
- m_aDefaultState.setCurrentEncoding(nEncoding);
- else
- m_nCurrentEncoding = nEncoding;
- m_aStates.top().setCurrentEncoding(nEncoding);
- }
- break;
- case RTFKeyword::CF:
- {
- RTFSprms aAttributes;
- auto pValue = new RTFValue(sal_uInt32(getColorTable(nParam)));
- aAttributes.set(NS_ooxml::LN_CT_Color_val, pValue);
- m_aStates.top().getCharacterSprms().set(NS_ooxml::LN_EG_RPrBase_color,
- new RTFValue(aAttributes));
- }
- break;
- case RTFKeyword::S:
- {
- m_aStates.top().setCurrentStyleIndex(nParam);
-
- if (m_aStates.top().getDestination() == Destination::STYLESHEET
- || m_aStates.top().getDestination() == Destination::STYLEENTRY)
- {
- m_nCurrentStyleIndex = nParam;
- auto pValue = new RTFValue(NS_ooxml::LN_Value_ST_StyleType_paragraph);
- m_aStates.top().getTableAttributes().set(NS_ooxml::LN_CT_Style_type,
- pValue); // paragraph style
- }
- else
- {
- OUString aName = getStyleName(nParam);
- if (!aName.isEmpty())
- {
- if (m_aStates.top().getDestination() == Destination::LISTLEVEL)
- m_aStates.top().getTableSprms().set(NS_ooxml::LN_CT_Lvl_pStyle,
- new RTFValue(aName));
- else
- m_aStates.top().getParagraphSprms().set(NS_ooxml::LN_CT_PPrBase_pStyle,
- new RTFValue(aName));
- }
- }
- }
- break;
- case RTFKeyword::CS:
- m_aStates.top().setCurrentCharacterStyleIndex(nParam);
- if (m_aStates.top().getDestination() == Destination::STYLESHEET
- || m_aStates.top().getDestination() == Destination::STYLEENTRY)
- {
- m_nCurrentStyleIndex = nParam;
- auto pValue = new RTFValue(NS_ooxml::LN_Value_ST_StyleType_character);
- m_aStates.top().getTableAttributes().set(NS_ooxml::LN_CT_Style_type,
- pValue); // character style
- }
- else
- {
- OUString aName = getStyleName(nParam);
- if (!aName.isEmpty())
- m_aStates.top().getCharacterSprms().set(NS_ooxml::LN_EG_RPrBase_rStyle,
- new RTFValue(aName));
- }
- break;
- case RTFKeyword::DS:
- if (m_aStates.top().getDestination() == Destination::STYLESHEET
- || m_aStates.top().getDestination() == Destination::STYLEENTRY)
- {
- m_nCurrentStyleIndex = nParam;
- auto pValue = new RTFValue(0); // TODO no value in enum StyleType?
- m_aStates.top().getTableAttributes().set(NS_ooxml::LN_CT_Style_type,
- pValue); // section style
- }
- break;
- case RTFKeyword::TS:
- if (m_aStates.top().getDestination() == Destination::STYLESHEET
- || m_aStates.top().getDestination() == Destination::STYLEENTRY)
- {
- m_nCurrentStyleIndex = nParam;
- // FIXME the correct value would be NS_ooxml::LN_Value_ST_StyleType_table but maybe table styles mess things up in dmapper, be cautious and disable them for now
- auto pValue = new RTFValue(0);
- m_aStates.top().getTableAttributes().set(NS_ooxml::LN_CT_Style_type,
- pValue); // table style
- }
- break;
- case RTFKeyword::DEFF:
- m_nDefaultFontIndex = nParam;
- break;
- case RTFKeyword::STSHFDBCH:
- // tdf#123703 switch off longer space sequence except in the case of the fixed compatibility setting font id 31505
- if (nParam != 31505)
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Settings_longerSpaceSequence,
- new RTFValue(0));
- break;
- case RTFKeyword::DEFLANG:
- case RTFKeyword::ADEFLANG:
- {
- LanguageTag aTag((LanguageType(static_cast<sal_uInt16>(nParam))));
- auto pValue = new RTFValue(aTag.getBcp47());
- putNestedAttribute(m_aStates.top().getCharacterSprms(),
- (nKeyword == RTFKeyword::DEFLANG ? NS_ooxml::LN_EG_RPrBase_lang
- : NS_ooxml::LN_CT_Language_bidi),
- nSprm, pValue);
- }
- break;
- case RTFKeyword::CHCBPAT:
- {
- auto pValue = new RTFValue(sal_uInt32(nParam ? getColorTable(nParam) : COL_AUTO));
- putNestedAttribute(m_aStates.top().getCharacterSprms(), NS_ooxml::LN_EG_RPrBase_shd,
- NS_ooxml::LN_CT_Shd_fill, pValue);
- }
- break;
- case RTFKeyword::CLCBPAT:
- case RTFKeyword::CLCBPATRAW:
- {
- auto pValue = new RTFValue(sal_uInt32(getColorTable(nParam)));
- putNestedAttribute(m_aStates.top().getTableCellSprms(), NS_ooxml::LN_CT_TcPrBase_shd,
- NS_ooxml::LN_CT_Shd_fill, pValue);
- }
- break;
- case RTFKeyword::CBPAT:
- if (nParam)
- {
- auto pValue = new RTFValue(sal_uInt32(getColorTable(nParam)));
- putNestedAttribute(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PrBase_shd,
- NS_ooxml::LN_CT_Shd_fill, pValue);
- }
- break;
- case RTFKeyword::ULC:
- {
- auto pValue = new RTFValue(sal_uInt32(getColorTable(nParam)));
- m_aStates.top().getCharacterSprms().set(0x6877, pValue);
- }
- break;
- case RTFKeyword::HIGHLIGHT:
- {
- auto pValue = new RTFValue(sal_uInt32(nParam ? getColorTable(nParam) : COL_AUTO));
- m_aStates.top().getCharacterSprms().set(NS_ooxml::LN_EG_RPrBase_highlight, pValue);
- }
- break;
- case RTFKeyword::UP:
- case RTFKeyword::DN:
- {
- auto pValue = new RTFValue(nParam * (nKeyword == RTFKeyword::UP ? 1 : -1));
- m_aStates.top().getCharacterSprms().set(NS_ooxml::LN_EG_RPrBase_position, pValue);
- }
- break;
- case RTFKeyword::HORZVERT:
- {
- auto pValue = new RTFValue(int(true));
- m_aStates.top().getCharacterAttributes().set(NS_ooxml::LN_CT_EastAsianLayout_vert,
- pValue);
- if (nParam)
- // rotate fits to a single line
- m_aStates.top().getCharacterAttributes().set(
- NS_ooxml::LN_CT_EastAsianLayout_vertCompress, pValue);
- }
- break;
- case RTFKeyword::EXPND:
- {
- // Convert quarter-points to twentieths of a point
- auto pValue = new RTFValue(nParam * 5);
- m_aStates.top().getCharacterSprms().set(NS_ooxml::LN_EG_RPrBase_spacing, pValue);
- }
- break;
- case RTFKeyword::TWOINONE:
- {
- auto pValue = new RTFValue(int(true));
- m_aStates.top().getCharacterAttributes().set(NS_ooxml::LN_CT_EastAsianLayout_combine,
- pValue);
- Id nId = 0;
- switch (nParam)
- {
- case 0:
- nId = NS_ooxml::LN_Value_ST_CombineBrackets_none;
- break;
- case 1:
- nId = NS_ooxml::LN_Value_ST_CombineBrackets_round;
- break;
- case 2:
- nId = NS_ooxml::LN_Value_ST_CombineBrackets_square;
- break;
- case 3:
- nId = NS_ooxml::LN_Value_ST_CombineBrackets_angle;
- break;
- case 4:
- nId = NS_ooxml::LN_Value_ST_CombineBrackets_curly;
- break;
- }
- if (nId > 0)
- m_aStates.top().getCharacterAttributes().set(
- NS_ooxml::LN_CT_EastAsianLayout_combineBrackets, new RTFValue(nId));
- }
- break;
- case RTFKeyword::SL:
- {
- // This is similar to RTFKeyword::ABSH, negative value means 'exact', positive means 'at least'.
- tools::SvRef<RTFValue> pValue(
- new RTFValue(NS_ooxml::LN_Value_doc_ST_LineSpacingRule_atLeast));
- if (nParam < 0)
- {
- pValue = new RTFValue(NS_ooxml::LN_Value_doc_ST_LineSpacingRule_exact);
- pIntValue = new RTFValue(-nParam);
- }
- m_aStates.top().getParagraphAttributes().set(NS_ooxml::LN_CT_Spacing_lineRule, pValue);
- m_aStates.top().getParagraphAttributes().set(NS_ooxml::LN_CT_Spacing_line, pIntValue);
- }
- break;
- case RTFKeyword::SLMULT:
- if (nParam > 0)
- {
- auto pValue = new RTFValue(NS_ooxml::LN_Value_doc_ST_LineSpacingRule_auto);
- m_aStates.top().getParagraphAttributes().set(NS_ooxml::LN_CT_Spacing_lineRule,
- pValue);
- }
- break;
- case RTFKeyword::BRDRW:
- {
- // dmapper expects it in 1/8 pt, we have it in twip - but avoid rounding 1 to 0
- if (nParam > 1)
- nParam = nParam * 2 / 5;
- auto pValue = new RTFValue(nParam);
- putBorderProperty(m_aStates, NS_ooxml::LN_CT_Border_sz, pValue);
- }
- break;
- case RTFKeyword::BRDRCF:
- {
- auto pValue = new RTFValue(sal_uInt32(getColorTable(nParam)));
- putBorderProperty(m_aStates, NS_ooxml::LN_CT_Border_color, pValue);
- }
- break;
- case RTFKeyword::BRSP:
- {
- // dmapper expects it in points, we have it in twip
- auto pValue = new RTFValue(nParam / 20);
- putBorderProperty(m_aStates, NS_ooxml::LN_CT_Border_space, pValue);
- }
- break;
- case RTFKeyword::TX:
- {
- m_aStates.top().getTabAttributes().set(NS_ooxml::LN_CT_TabStop_pos, pIntValue);
- auto pValue = new RTFValue(m_aStates.top().getTabAttributes());
- if (m_aStates.top().getDestination() == Destination::LISTLEVEL)
- putNestedSprm(m_aStates.top().getTableSprms(), NS_ooxml::LN_CT_PPrBase_tabs,
- NS_ooxml::LN_CT_Tabs_tab, pValue);
- else
- putNestedSprm(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_tabs,
- NS_ooxml::LN_CT_Tabs_tab, pValue);
- m_aStates.top().getTabAttributes().clear();
- }
- break;
- case RTFKeyword::ILVL:
- putNestedSprm(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_numPr,
- NS_ooxml::LN_CT_NumPr_ilvl, pIntValue);
- break;
- case RTFKeyword::LISTTEMPLATEID:
- // This one is not referenced anywhere, so it's pointless to store it at the moment.
- break;
- case RTFKeyword::LISTID:
- {
- if (m_aStates.top().getDestination() == Destination::LISTENTRY)
- m_aStates.top().getTableAttributes().set(NS_ooxml::LN_CT_AbstractNum_abstractNumId,
- pIntValue);
- else if (m_aStates.top().getDestination() == Destination::LISTOVERRIDEENTRY)
- m_aStates.top().getTableSprms().set(NS_ooxml::LN_CT_Num_abstractNumId, pIntValue);
- m_aStates.top().setCurrentListIndex(nParam);
- }
- break;
- case RTFKeyword::LS:
- {
- if (m_aStates.top().getDestination() == Destination::LISTOVERRIDEENTRY)
- {
- m_aStates.top().getTableAttributes().set(NS_ooxml::LN_CT_AbstractNum_nsid,
- pIntValue);
- m_aStates.top().setCurrentListOverrideIndex(nParam);
- }
- else
- {
- // Insert at the start, so properties inherited from the list
- // can be overridden by direct formatting. But still allow the
- // case when old-style paragraph numbering is already
- // tokenized.
- putNestedSprm(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_numPr,
- NS_ooxml::LN_CT_NumPr_numId, pIntValue, RTFOverwrite::YES_PREPEND);
- }
- }
- break;
- case RTFKeyword::UC:
- if ((SAL_MIN_INT16 <= nParam) && (nParam <= SAL_MAX_INT16))
- m_aStates.top().setUc(nParam);
- break;
- case RTFKeyword::U:
- // sal_Unicode is unsigned 16-bit, RTF may represent that as a
- // signed SAL_MIN_INT16..SAL_MAX_INT16 or 0..SAL_MAX_UINT16. The
- // static_cast() will do the right thing.
- if ((SAL_MIN_INT16 <= nParam) && (nParam <= SAL_MAX_UINT16))
- {
- if (m_aStates.top().getDestination() == Destination::LEVELNUMBERS)
- {
- if (nParam != ';')
- m_aStates.top().getLevelNumbers().push_back(sal_Int32(nParam));
- else
- // ';' in \u form is not considered valid.
- m_aStates.top().setLevelNumbersValid(false);
- }
- else
- m_aUnicodeBuffer.append(static_cast<sal_Unicode>(nParam));
- m_aStates.top().getCharsToSkip() = m_aStates.top().getUc();
- }
- break;
- case RTFKeyword::LEVELFOLLOW:
- {
- OUString sValue;
- switch (nParam)
- {
- case 0:
- sValue = "tab";
- break;
- case 1:
- sValue = "space";
- break;
- case 2:
- sValue = "nothing";
- break;
- }
- if (!sValue.isEmpty())
- m_aStates.top().getTableSprms().set(NS_ooxml::LN_CT_Lvl_suff, new RTFValue(sValue));
- }
- break;
- case RTFKeyword::FPRQ:
- {
- sal_Int32 nValue = 0;
- switch (nParam)
- {
- case 0:
- nValue = NS_ooxml::LN_Value_ST_Pitch_default;
- break;
- case 1:
- nValue = NS_ooxml::LN_Value_ST_Pitch_fixed;
- break;
- case 2:
- nValue = NS_ooxml::LN_Value_ST_Pitch_variable;
- break;
- }
- if (nValue)
- {
- RTFSprms aAttributes;
- aAttributes.set(NS_ooxml::LN_CT_Pitch_val, new RTFValue(nValue));
- m_aStates.top().getTableSprms().set(NS_ooxml::LN_CT_Font_pitch,
- new RTFValue(aAttributes));
- }
- }
- break;
- case RTFKeyword::LISTOVERRIDECOUNT:
- // Ignore this for now, the exporter always emits it with a zero parameter.
- break;
- case RTFKeyword::PICSCALEX:
- m_aStates.top().getPicture().nScaleX = nParam;
- break;
- case RTFKeyword::PICSCALEY:
- m_aStates.top().getPicture().nScaleY = nParam;
- break;
- case RTFKeyword::PICW:
- m_aStates.top().getPicture().nWidth = nParam;
- break;
- case RTFKeyword::PICH:
- m_aStates.top().getPicture().nHeight = nParam;
- break;
- case RTFKeyword::PICWGOAL:
- m_aStates.top().getPicture().nGoalWidth = convertTwipToMm100(nParam);
- break;
- case RTFKeyword::PICHGOAL:
- m_aStates.top().getPicture().nGoalHeight = convertTwipToMm100(nParam);
- break;
- case RTFKeyword::PICCROPL:
- m_aStates.top().getPicture().nCropL = convertTwipToMm100(nParam);
- break;
- case RTFKeyword::PICCROPR:
- m_aStates.top().getPicture().nCropR = convertTwipToMm100(nParam);
- break;
- case RTFKeyword::PICCROPT:
- m_aStates.top().getPicture().nCropT = convertTwipToMm100(nParam);
- break;
- case RTFKeyword::PICCROPB:
- m_aStates.top().getPicture().nCropB = convertTwipToMm100(nParam);
- break;
- case RTFKeyword::SHPWRK:
- {
- int nValue = 0;
- switch (nParam)
- {
- case 0:
- nValue = NS_ooxml::LN_Value_wordprocessingDrawing_ST_WrapText_bothSides;
- break;
- case 1:
- nValue = NS_ooxml::LN_Value_wordprocessingDrawing_ST_WrapText_left;
- break;
- case 2:
- nValue = NS_ooxml::LN_Value_wordprocessingDrawing_ST_WrapText_right;
- break;
- case 3:
- nValue = NS_ooxml::LN_Value_wordprocessingDrawing_ST_WrapText_largest;
- break;
- default:
- break;
- }
- auto pValue = new RTFValue(nValue);
- RTFValue::Pointer_t pTight
- = m_aStates.top().getCharacterSprms().find(NS_ooxml::LN_EG_WrapType_wrapTight);
- if (pTight)
- pTight->getAttributes().set(NS_ooxml::LN_CT_WrapTight_wrapText, pValue);
- else
- m_aStates.top().getCharacterAttributes().set(NS_ooxml::LN_CT_WrapSquare_wrapText,
- pValue);
- }
- break;
- case RTFKeyword::SHPWR:
- {
- switch (nParam)
- {
- case 1:
- m_aStates.top().getShape().setWrap(text::WrapTextMode_NONE);
- break;
- case 2:
- m_aStates.top().getShape().setWrap(text::WrapTextMode_PARALLEL);
- break;
- case 3:
- m_aStates.top().getShape().setWrap(text::WrapTextMode_THROUGH);
- m_aStates.top().getCharacterSprms().set(NS_ooxml::LN_EG_WrapType_wrapNone,
- new RTFValue());
- break;
- case 4:
- m_aStates.top().getShape().setWrap(text::WrapTextMode_PARALLEL);
- m_aStates.top().getCharacterSprms().set(NS_ooxml::LN_EG_WrapType_wrapTight,
- new RTFValue());
- break;
- case 5:
- m_aStates.top().getShape().setWrap(text::WrapTextMode_THROUGH);
- break;
- }
- }
- break;
- case RTFKeyword::COLS:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_cols, NS_ooxml::LN_CT_Columns_num,
- pIntValue);
- break;
- case RTFKeyword::COLSX:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_cols, NS_ooxml::LN_CT_Columns_space,
- pIntValue);
- break;
- case RTFKeyword::COLNO:
- putNestedSprm(m_aStates.top().getSectionSprms(), NS_ooxml::LN_EG_SectPrContents_cols,
- NS_ooxml::LN_CT_Columns_col, pIntValue);
- break;
- case RTFKeyword::COLW:
- case RTFKeyword::COLSR:
- {
- RTFSprms& rAttributes = getLastAttributes(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_cols);
- rAttributes.set((nKeyword == RTFKeyword::COLW ? NS_ooxml::LN_CT_Column_w
- : NS_ooxml::LN_CT_Column_space),
- pIntValue);
- }
- break;
- case RTFKeyword::PAPERH:
- putNestedAttribute(m_aDefaultState.getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgSz, NS_ooxml::LN_CT_PageSz_h,
- pIntValue);
- [[fallthrough]]; // set the default + current value
- case RTFKeyword::PGHSXN:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgSz, NS_ooxml::LN_CT_PageSz_h,
- pIntValue);
- break;
- case RTFKeyword::PAPERW:
- putNestedAttribute(m_aDefaultState.getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgSz, NS_ooxml::LN_CT_PageSz_w,
- pIntValue);
- [[fallthrough]]; // set the default + current value
- case RTFKeyword::PGWSXN:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgSz, NS_ooxml::LN_CT_PageSz_w,
- pIntValue);
- break;
- case RTFKeyword::BINFSXN:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_paperSrc,
- NS_ooxml::LN_CT_PaperSource_first, pIntValue);
- break;
- case RTFKeyword::BINSXN:
- {
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_paperSrc,
- NS_ooxml::LN_CT_PaperSource_other, pIntValue);
- }
- break;
- case RTFKeyword::MARGL:
- putNestedAttribute(m_aDefaultState.getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgMar, NS_ooxml::LN_CT_PageMar_left,
- pIntValue);
- [[fallthrough]]; // set the default + current value
- case RTFKeyword::MARGLSXN:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgMar, NS_ooxml::LN_CT_PageMar_left,
- pIntValue);
- break;
- case RTFKeyword::MARGR:
- putNestedAttribute(m_aDefaultState.getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgMar, NS_ooxml::LN_CT_PageMar_right,
- pIntValue);
- [[fallthrough]]; // set the default + current value
- case RTFKeyword::MARGRSXN:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgMar, NS_ooxml::LN_CT_PageMar_right,
- pIntValue);
- break;
- case RTFKeyword::MARGT:
- putNestedAttribute(m_aDefaultState.getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgMar, NS_ooxml::LN_CT_PageMar_top,
- pIntValue);
- [[fallthrough]]; // set the default + current value
- case RTFKeyword::MARGTSXN:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgMar, NS_ooxml::LN_CT_PageMar_top,
- pIntValue);
- break;
- case RTFKeyword::MARGB:
- putNestedAttribute(m_aDefaultState.getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgMar, NS_ooxml::LN_CT_PageMar_bottom,
- pIntValue);
- [[fallthrough]]; // set the default + current value
- case RTFKeyword::MARGBSXN:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgMar, NS_ooxml::LN_CT_PageMar_bottom,
- pIntValue);
- break;
- case RTFKeyword::HEADERY:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgMar, NS_ooxml::LN_CT_PageMar_header,
- pIntValue);
- break;
- case RTFKeyword::FOOTERY:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgMar, NS_ooxml::LN_CT_PageMar_footer,
- pIntValue);
- break;
- case RTFKeyword::GUTTER:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgMar, NS_ooxml::LN_CT_PageMar_gutter,
- pIntValue);
- break;
- case RTFKeyword::DEFTAB:
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Settings_defaultTabStop, pIntValue);
- break;
- case RTFKeyword::LINEMOD:
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_lnNumType,
- NS_ooxml::LN_CT_LineNumber_countBy, pIntValue);
- break;
- case RTFKeyword::LINEX:
- if (nParam)
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_lnNumType,
- NS_ooxml::LN_CT_LineNumber_distance, pIntValue);
- break;
- case RTFKeyword::LINESTARTS:
- {
- // OOXML <w:lnNumType w:start="..."/> is 0-based, RTF is 1-based.
- auto pStart = tools::make_ref<RTFValue>(nParam - 1);
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_lnNumType,
- NS_ooxml::LN_CT_LineNumber_start, pStart);
- }
- break;
- case RTFKeyword::REVAUTH:
- case RTFKeyword::REVAUTHDEL:
- {
- auto pValue = new RTFValue(m_aAuthors[nParam]);
- putNestedAttribute(m_aStates.top().getCharacterSprms(), NS_ooxml::LN_trackchange,
- NS_ooxml::LN_CT_TrackChange_author, pValue);
- }
- break;
- case RTFKeyword::REVDTTM:
- case RTFKeyword::REVDTTMDEL:
- {
- OUString aStr(
- OStringToOUString(DTTM22OString(nParam), m_aStates.top().getCurrentEncoding()));
- auto pValue = new RTFValue(aStr);
- putNestedAttribute(m_aStates.top().getCharacterSprms(), NS_ooxml::LN_trackchange,
- NS_ooxml::LN_CT_TrackChange_date, pValue);
- }
- break;
- case RTFKeyword::SHPLEFT:
- m_aStates.top().getShape().setLeft(convertTwipToMm100(nParam));
- break;
- case RTFKeyword::SHPTOP:
- m_aStates.top().getShape().setTop(convertTwipToMm100(nParam));
- break;
- case RTFKeyword::SHPRIGHT:
- m_aStates.top().getShape().setRight(convertTwipToMm100(nParam));
- break;
- case RTFKeyword::SHPBOTTOM:
- m_aStates.top().getShape().setBottom(convertTwipToMm100(nParam));
- break;
- case RTFKeyword::SHPZ:
- m_aStates.top().getShape().setZ(nParam);
- break;
- case RTFKeyword::FFTYPE:
- switch (nParam)
- {
- case 0:
- m_nFormFieldType = RTFFormFieldType::TEXT;
- break;
- case 1:
- m_nFormFieldType = RTFFormFieldType::CHECKBOX;
- break;
- case 2:
- m_nFormFieldType = RTFFormFieldType::LIST;
- break;
- default:
- m_nFormFieldType = RTFFormFieldType::NONE;
- break;
- }
- break;
- case RTFKeyword::FFDEFRES:
- if (m_nFormFieldType == RTFFormFieldType::CHECKBOX)
- m_aFormfieldSprms.set(NS_ooxml::LN_CT_FFCheckBox_default, pIntValue);
- else if (m_nFormFieldType == RTFFormFieldType::LIST)
- m_aFormfieldSprms.set(NS_ooxml::LN_CT_FFDDList_default, pIntValue);
- break;
- case RTFKeyword::FFRES:
- // 25 means undefined, see [MS-DOC] 2.9.79, FFDataBits.
- if (m_nFormFieldType == RTFFormFieldType::CHECKBOX && nParam != 25)
- m_aFormfieldSprms.set(NS_ooxml::LN_CT_FFCheckBox_checked, pIntValue);
- else if (m_nFormFieldType == RTFFormFieldType::LIST)
- m_aFormfieldSprms.set(NS_ooxml::LN_CT_FFDDList_result, pIntValue);
- break;
- case RTFKeyword::EDMINS:
- if (m_xDocumentProperties.is())
- {
- // tdf#116851 some RTF may be malformed
- if (nParam < 0)
- nParam = -nParam;
- m_xDocumentProperties->setEditingDuration(nParam);
- }
- break;
- case RTFKeyword::NOFPAGES:
- case RTFKeyword::NOFWORDS:
- case RTFKeyword::NOFCHARS:
- case RTFKeyword::NOFCHARSWS:
- if (m_xDocumentProperties.is())
- {
- comphelper::SequenceAsHashMap aSeq = m_xDocumentProperties->getDocumentStatistics();
- OUString aName;
- switch (nKeyword)
- {
- case RTFKeyword::NOFPAGES:
- aName = "PageCount";
- nParam = 99;
- break;
- case RTFKeyword::NOFWORDS:
- aName = "WordCount";
- break;
- case RTFKeyword::NOFCHARS:
- aName = "CharacterCount";
- break;
- case RTFKeyword::NOFCHARSWS:
- aName = "NonWhitespaceCharacterCount";
- break;
- default:
- break;
- }
- if (!aName.isEmpty())
- {
- aSeq[aName] <<= sal_Int32(nParam);
- m_xDocumentProperties->setDocumentStatistics(aSeq.getAsConstNamedValueList());
- }
- }
- break;
- case RTFKeyword::VERSION:
- if (m_xDocumentProperties.is())
- m_xDocumentProperties->setEditingCycles(nParam);
- break;
- case RTFKeyword::VERN:
- // Ignore this for now, later the RTF writer version could be used to add hacks for older buggy writers.
- break;
- case RTFKeyword::FTNSTART:
- putNestedSprm(m_aDefaultState.getParagraphSprms(),
- NS_ooxml::LN_EG_SectPrContents_footnotePr,
- NS_ooxml::LN_EG_FtnEdnNumProps_numStart, pIntValue);
- break;
- case RTFKeyword::AFTNSTART:
- putNestedSprm(m_aDefaultState.getParagraphSprms(),
- NS_ooxml::LN_EG_SectPrContents_endnotePr,
- NS_ooxml::LN_EG_FtnEdnNumProps_numStart, pIntValue);
- break;
- case RTFKeyword::DFRMTXTX:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_hSpace, nParam);
- break;
- case RTFKeyword::DFRMTXTY:
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_vSpace, nParam);
- break;
- case RTFKeyword::DXFRTEXT:
- {
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_hSpace, nParam);
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_vSpace, nParam);
- }
- break;
- case RTFKeyword::FLYVERT:
- {
- RTFVertOrient aVertOrient(nParam);
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_yAlign,
- aVertOrient.GetAlign());
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_vAnchor,
- aVertOrient.GetAnchor());
- }
- break;
- case RTFKeyword::FLYHORZ:
- {
- RTFHoriOrient aHoriOrient(nParam);
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_xAlign,
- aHoriOrient.GetAlign());
- m_aStates.top().getFrame().setSprm(NS_ooxml::LN_CT_FramePr_hAnchor,
- aHoriOrient.GetAnchor());
- }
- break;
- case RTFKeyword::FLYANCHOR:
- break;
- case RTFKeyword::WMETAFILE:
- m_aStates.top().getPicture().eWMetafile = nParam;
- break;
- case RTFKeyword::SB:
- putNestedAttribute(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_spacing,
- NS_ooxml::LN_CT_Spacing_before, pIntValue);
- break;
- case RTFKeyword::SA:
- putNestedAttribute(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_spacing,
- NS_ooxml::LN_CT_Spacing_after, pIntValue);
- break;
- case RTFKeyword::DPX:
- m_aStates.top().getDrawingObject().setLeft(convertTwipToMm100(nParam));
- break;
- case RTFKeyword::DPY:
- m_aStates.top().getDrawingObject().setTop(convertTwipToMm100(nParam));
- break;
- case RTFKeyword::DPXSIZE:
- m_aStates.top().getDrawingObject().setRight(convertTwipToMm100(nParam));
- break;
- case RTFKeyword::DPYSIZE:
- m_aStates.top().getDrawingObject().setBottom(convertTwipToMm100(nParam));
- break;
- case RTFKeyword::PNSTART:
- m_aStates.top().getTableSprms().set(NS_ooxml::LN_CT_Lvl_start, pIntValue);
- break;
- case RTFKeyword::PNF:
- {
- auto pValue = new RTFValue(m_aFontNames[getFontIndex(nParam)]);
- RTFSprms aAttributes;
- aAttributes.set(NS_ooxml::LN_CT_Fonts_ascii, pValue);
- putNestedSprm(m_aStates.top().getTableSprms(), NS_ooxml::LN_CT_Lvl_rPr,
- NS_ooxml::LN_EG_RPrBase_rFonts, new RTFValue(aAttributes));
- }
- break;
- case RTFKeyword::VIEWSCALE:
- m_aSettingsTableAttributes.set(NS_ooxml::LN_CT_Zoom_percent, pIntValue);
- break;
- case RTFKeyword::BIN:
- {
- m_aStates.top().setInternalState(RTFInternalState::BIN);
- m_aStates.top().setBinaryToRead(nParam);
- }
- break;
- case RTFKeyword::DPLINECOR:
- m_aStates.top().getDrawingObject().setLineColorR(nParam);
- m_aStates.top().getDrawingObject().setHasLineColor(true);
- break;
- case RTFKeyword::DPLINECOG:
- m_aStates.top().getDrawingObject().setLineColorG(nParam);
- m_aStates.top().getDrawingObject().setHasLineColor(true);
- break;
- case RTFKeyword::DPLINECOB:
- m_aStates.top().getDrawingObject().setLineColorB(nParam);
- m_aStates.top().getDrawingObject().setHasLineColor(true);
- break;
- case RTFKeyword::DPFILLBGCR:
- m_aStates.top().getDrawingObject().setFillColorR(nParam);
- m_aStates.top().getDrawingObject().setHasFillColor(true);
- break;
- case RTFKeyword::DPFILLBGCG:
- m_aStates.top().getDrawingObject().setFillColorG(nParam);
- m_aStates.top().getDrawingObject().setHasFillColor(true);
- break;
- case RTFKeyword::DPFILLBGCB:
- m_aStates.top().getDrawingObject().setFillColorB(nParam);
- m_aStates.top().getDrawingObject().setHasFillColor(true);
- break;
- case RTFKeyword::DODHGT:
- m_aStates.top().getDrawingObject().setDhgt(nParam);
- break;
- case RTFKeyword::DPPOLYCOUNT:
- if (nParam >= 0)
- {
- m_aStates.top().getDrawingObject().setPolyLineCount(nParam);
- }
- break;
- case RTFKeyword::DPPTX:
- {
- RTFDrawingObject& rDrawingObject = m_aStates.top().getDrawingObject();
-
- if (rDrawingObject.getPolyLinePoints().empty())
- dispatchValue(RTFKeyword::DPPOLYCOUNT, 2);
-
- rDrawingObject.getPolyLinePoints().emplace_back(convertTwipToMm100(nParam), 0);
- }
- break;
- case RTFKeyword::DPPTY:
- {
- RTFDrawingObject& rDrawingObject = m_aStates.top().getDrawingObject();
- if (!rDrawingObject.getPolyLinePoints().empty())
- {
- rDrawingObject.getPolyLinePoints().back().Y = convertTwipToMm100(nParam);
- rDrawingObject.setPolyLineCount(rDrawingObject.getPolyLineCount() - 1);
- if (rDrawingObject.getPolyLineCount() == 0 && rDrawingObject.getPropertySet().is())
- {
- uno::Sequence<uno::Sequence<awt::Point>> aPointSequenceSequence
- = { comphelper::containerToSequence(rDrawingObject.getPolyLinePoints()) };
- rDrawingObject.getPropertySet()->setPropertyValue(
- "PolyPolygon", uno::Any(aPointSequenceSequence));
- }
- }
- }
- break;
- case RTFKeyword::SHPFBLWTXT:
- // Shape is below text -> send it to the background.
- m_aStates.top().getShape().setInBackground(nParam != 0);
- break;
- case RTFKeyword::FI:
- {
- if (m_aStates.top().getDestination() == Destination::LISTLEVEL)
- {
- if (m_aStates.top().getLevelNumbersValid())
- putNestedAttribute(m_aStates.top().getTableSprms(), NS_ooxml::LN_CT_PPrBase_ind,
- NS_ooxml::LN_CT_Ind_firstLine, pIntValue);
- else
- m_aInvalidListLevelFirstIndents[m_nListLevel] = nParam;
- }
- else
- putNestedAttribute(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_ind,
- NS_ooxml::LN_CT_Ind_firstLine, pIntValue);
- break;
- }
- case RTFKeyword::LI:
- {
- if (m_aStates.top().getDestination() == Destination::LISTLEVEL)
- {
- if (m_aStates.top().getLevelNumbersValid())
- putNestedAttribute(m_aStates.top().getTableSprms(), NS_ooxml::LN_CT_PPrBase_ind,
- NS_ooxml::LN_CT_Ind_left, pIntValue);
- }
- else
- {
- putNestedAttribute(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_ind,
- NS_ooxml::LN_CT_Ind_left, pIntValue);
- }
- // It turns out \li should reset the \fi inherited from the stylesheet.
- // So set the direct formatting to zero, if we don't have such direct formatting yet.
- putNestedAttribute(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_ind,
- NS_ooxml::LN_CT_Ind_firstLine, new RTFValue(0),
- RTFOverwrite::NO_IGNORE);
- }
- break;
- case RTFKeyword::RI:
- putNestedAttribute(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_ind,
- NS_ooxml::LN_CT_Ind_right, pIntValue);
- break;
- case RTFKeyword::LIN:
- putNestedAttribute(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_ind,
- NS_ooxml::LN_CT_Ind_start, pIntValue);
- break;
- case RTFKeyword::RIN:
- putNestedAttribute(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_ind,
- NS_ooxml::LN_CT_Ind_end, pIntValue);
- break;
- case RTFKeyword::OUTLINELEVEL:
- m_aStates.top().getParagraphSprms().set(NS_ooxml::LN_CT_PPrBase_outlineLvl, pIntValue);
- break;
- case RTFKeyword::PROPTYPE:
- {
- switch (nParam)
- {
- case 3:
- m_aStates.top().setPropType(cppu::UnoType<sal_Int32>::get());
- break;
- case 5:
- m_aStates.top().setPropType(cppu::UnoType<double>::get());
- break;
- case 11:
- m_aStates.top().setPropType(cppu::UnoType<bool>::get());
- break;
- case 30:
- m_aStates.top().setPropType(cppu::UnoType<OUString>::get());
- break;
- case 64:
- m_aStates.top().setPropType(cppu::UnoType<util::DateTime>::get());
- break;
- }
- }
- break;
- case RTFKeyword::DIBITMAP:
- m_aStates.top().getPicture().eStyle = RTFBmpStyle::DIBITMAP;
- break;
- case RTFKeyword::TRWWIDTHA:
- m_aStates.top().setTableRowWidthAfter(nParam);
- break;
- case RTFKeyword::ANIMTEXT:
- {
- Id nId = 0;
- switch (nParam)
- {
- case 0:
- nId = NS_ooxml::LN_Value_ST_TextEffect_none;
- break;
- case 2:
- nId = NS_ooxml::LN_Value_ST_TextEffect_blinkBackground;
- break;
- }
-
- if (nId > 0)
- m_aStates.top().getCharacterSprms().set(NS_ooxml::LN_EG_RPrBase_effect,
- new RTFValue(nId));
- break;
- }
- case RTFKeyword::VIEWBKSP:
- {
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Settings_displayBackgroundShape, pIntValue);
- // Send this token immediately, if it only appears before the first
- // run, it will be too late, we ignored the background shape already by then.
- outputSettingsTable();
- break;
- }
- case RTFKeyword::STEXTFLOW:
- {
- Id nId = 0;
- switch (nParam)
- {
- case 0:
- nId = NS_ooxml::LN_Value_ST_TextDirection_lrTb;
- break;
- case 1:
- nId = NS_ooxml::LN_Value_ST_TextDirection_tbRl;
- break;
- }
-
- if (nId > 0)
- {
- m_aStates.top().getSectionSprms().set(NS_ooxml::LN_EG_SectPrContents_textDirection,
- new RTFValue(nId));
- }
- }
- break;
- case RTFKeyword::LBR:
- {
- Id nId = 0;
- switch (nParam)
- {
- case 1:
- nId = NS_ooxml::LN_Value_ST_BrClear_left;
- break;
- case 2:
- nId = NS_ooxml::LN_Value_ST_BrClear_right;
- break;
- case 3:
- nId = NS_ooxml::LN_Value_ST_BrClear_all;
- break;
- }
-
- if (nId > 0)
- {
- m_aStates.top().getCharacterAttributes().set(NS_ooxml::LN_CT_Br_clear,
- new RTFValue(nId));
- }
- }
- break;
- case RTFKeyword::PGBRDROPT:
- {
- sal_Int16 nOffsetFrom = (nParam & 0xe0) >> 5;
- bool bFromEdge = nOffsetFrom == 1;
- if (bFromEdge)
- {
- Id nId = NS_ooxml::LN_Value_doc_ST_PageBorderOffset_page;
- putNestedAttribute(m_aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgBorders,
- NS_ooxml::LN_CT_PageBorders_offsetFrom, new RTFValue(nId));
- }
- }
- break;
- case RTFKeyword::TPOSY:
- {
- putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
- NS_ooxml::LN_CT_TblPPr_tblpY, new RTFValue(nParam));
- }
- break;
- case RTFKeyword::TPOSX:
- {
- putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
- NS_ooxml::LN_CT_TblPPr_tblpX, new RTFValue(nParam));
- }
- break;
- case RTFKeyword::TDFRMTXTLEFT:
- {
- putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
- NS_ooxml::LN_CT_TblPPr_leftFromText, new RTFValue(nParam));
- }
- break;
- case RTFKeyword::TDFRMTXTRIGHT:
- {
- putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
- NS_ooxml::LN_CT_TblPPr_rightFromText, new RTFValue(nParam));
- }
- break;
- case RTFKeyword::TDFRMTXTTOP:
- {
- putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
- NS_ooxml::LN_CT_TblPPr_topFromText, new RTFValue(nParam));
- }
- break;
- case RTFKeyword::TDFRMTXTBOTTOM:
- {
- putNestedAttribute(m_aStates.top().getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblpPr,
- NS_ooxml::LN_CT_TblPPr_bottomFromText, new RTFValue(nParam));
- }
- break;
- default:
- {
- SAL_INFO("writerfilter", "TODO handle value '" << keywordToString(nKeyword) << "'");
- aSkip.setParsed(false);
- }
- break;
- }
- return RTFError::OK;
-}
-
-} // namespace rtftok
-} // namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfdocumentfactory.cxx b/writerfilter/source/rtftok/rtfdocumentfactory.cxx
deleted file mode 100644
index 75b109b6842d..000000000000
--- a/writerfilter/source/rtftok/rtfdocumentfactory.cxx
+++ /dev/null
@@ -1,28 +0,0 @@
-/* -*- 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 "rtfdocumentimpl.hxx"
-
-namespace writerfilter::rtftok
-{
-RTFDocument::Pointer_t RTFDocumentFactory::createDocument(
- css::uno::Reference<css::uno::XComponentContext> const& xContext,
- css::uno::Reference<css::io::XInputStream> const& xInputStream,
- css::uno::Reference<css::lang::XComponent> const& xDstDoc,
- css::uno::Reference<css::frame::XFrame> const& xFrame,
- css::uno::Reference<css::task::XStatusIndicator> const& xStatusIndicator,
- const utl::MediaDescriptor& rMediaDescriptor)
-{
- return new RTFDocumentImpl(xContext, xInputStream, xDstDoc, xFrame, xStatusIndicator,
- rMediaDescriptor);
-}
-
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
deleted file mode 100644
index ab700ff0dc14..000000000000
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ /dev/null
@@ -1,4062 +0,0 @@
-/* -*- 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 "rtfdocumentimpl.hxx"
-
-#include <algorithm>
-#include <memory>
-#include <string_view>
-
-#include <com/sun/star/embed/XEmbeddedObject.hpp>
-#include <com/sun/star/beans/PropertyAttribute.hpp>
-#include <com/sun/star/io/WrongFormatException.hpp>
-#include <com/sun/star/lang/XServiceInfo.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/text/TextContentAnchorType.hpp>
-#include <com/sun/star/text/XDependentTextField.hpp>
-#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
-
-#include <i18nlangtag/languagetag.hxx>
-#include <unotools/ucbstreamhelper.hxx>
-#include <unotools/streamwrap.hxx>
-#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
-#include <filter/msfilter/util.hxx>
-#include <filter/msfilter/rtfutil.hxx>
-#include <comphelper/string.hxx>
-#include <comphelper/diagnose_ex.hxx>
-#include <tools/globname.hxx>
-#include <tools/datetimeutils.hxx>
-#include <comphelper/classids.hxx>
-#include <comphelper/embeddedobjectcontainer.hxx>
-#include <svl/lngmisc.hxx>
-#include <sfx2/classificationhelper.hxx>
-#include <oox/mathml/imexport.hxx>
-#include <ooxml/resourceids.hxx>
-#include <oox/token/namespaces.hxx>
-#include <oox/drawingml/drawingmltypes.hxx>
-#include <rtl/uri.hxx>
-#include <rtl/tencinfo.h>
-#include <sal/log.hxx>
-#include <osl/diagnose.h>
-#include <oox/helper/graphichelper.hxx>
-#include <vcl/wmfexternal.hxx>
-#include <vcl/graph.hxx>
-#include <vcl/settings.hxx>
-#include <vcl/svapp.hxx>
-#include "rtfsdrimport.hxx"
-#include "rtfreferenceproperties.hxx"
-#include "rtfskipdestination.hxx"
-#include "rtftokenizer.hxx"
-#include "rtflookahead.hxx"
-#include "rtfcharsets.hxx"
-
-using namespace com::sun::star;
-
-namespace
-{
-/// Returns an util::DateTime from a 'YYYY. MM. DD.' string.
-util::DateTime getDateTimeFromUserProp(std::u16string_view rString)
-{
- util::DateTime aRet;
- size_t nLen = rString.size();
- if (nLen >= 4)
- {
- aRet.Year = o3tl::toInt32(rString.substr(0, 4));
-
- if (nLen >= 8 && o3tl::starts_with(rString.substr(4), u". "))
- {
- aRet.Month = o3tl::toInt32(rString.substr(6, 2));
-
- if (nLen >= 12 && o3tl::starts_with(rString.substr(8), u". "))
- aRet.Day = o3tl::toInt32(rString.substr(10, 2));
- }
- }
- return aRet;
-}
-} // anonymous namespace
-
-namespace writerfilter::rtftok
-{
-Id getParagraphBorder(sal_uInt32 nIndex)
-{
- static const Id aBorderIds[]
- = { NS_ooxml::LN_CT_PBdr_top, NS_ooxml::LN_CT_PBdr_left, NS_ooxml::LN_CT_PBdr_bottom,
- NS_ooxml::LN_CT_PBdr_right, NS_ooxml::LN_CT_PBdr_between };
-
- return aBorderIds[nIndex];
-}
-
-void putNestedAttribute(RTFSprms& rSprms, Id nParent, Id nId, const RTFValue::Pointer_t& pValue,
- RTFOverwrite eOverwrite, bool bAttribute)
-{
- RTFValue::Pointer_t pParent = rSprms.find(nParent, /*bFirst=*/true, /*bForWrite=*/true);
- if (!pParent)
- {
- RTFSprms aAttributes;
- if (nParent == NS_ooxml::LN_CT_TcPrBase_shd)
- {
- // RTF default is 'auto', see writerfilter::dmapper::CellColorHandler
- aAttributes.set(NS_ooxml::LN_CT_Shd_color, new RTFValue(sal_uInt32(COL_AUTO)));
- aAttributes.set(NS_ooxml::LN_CT_Shd_fill, new RTFValue(sal_uInt32(COL_AUTO)));
- }
- auto pParentValue = new RTFValue(aAttributes);
- rSprms.set(nParent, pParentValue, eOverwrite);
- pParent = pParentValue;
- }
- RTFSprms& rAttributes = (bAttribute ? pParent->getAttributes() : pParent->getSprms());
- rAttributes.set(nId, pValue, eOverwrite);
-}
-
-void putNestedSprm(RTFSprms& rSprms, Id nParent, Id nId, const RTFValue::Pointer_t& pValue,
- RTFOverwrite eOverwrite)
-{
- putNestedAttribute(rSprms, nParent, nId, pValue, eOverwrite, false);
-}
-
-RTFValue::Pointer_t getNestedAttribute(RTFSprms& rSprms, Id nParent, Id nId)
-{
- RTFValue::Pointer_t pParent = rSprms.find(nParent);
- if (!pParent)
- return RTFValue::Pointer_t();
- RTFSprms& rAttributes = pParent->getAttributes();
- return rAttributes.find(nId);
-}
-
-RTFValue::Pointer_t getNestedSprm(RTFSprms& rSprms, Id nParent, Id nId)
-{
- RTFValue::Pointer_t pParent = rSprms.find(nParent);
- if (!pParent)
- return RTFValue::Pointer_t();
- RTFSprms& rInner = pParent->getSprms();
- return rInner.find(nId);
-}
-
-bool eraseNestedAttribute(RTFSprms& rSprms, Id nParent, Id nId)
-{
- RTFValue::Pointer_t pParent = rSprms.find(nParent);
- if (!pParent)
- // It doesn't even have a parent, we're done.
- return false;
- RTFSprms& rAttributes = pParent->getAttributes();
- return rAttributes.erase(nId);
-}
-
-RTFSprms& getLastAttributes(RTFSprms& rSprms, Id nId)
-{
- RTFValue::Pointer_t p = rSprms.find(nId);
- if (p && !p->getSprms().empty())
- return p->getSprms().back().second->getAttributes();
-
- SAL_WARN("writerfilter.rtf", "trying to set property when no type is defined");
- return rSprms;
-}
-
-void putBorderProperty(RTFStack& aStates, Id nId, const RTFValue::Pointer_t& pValue)
-{
- RTFSprms* pAttributes = nullptr;
- if (aStates.top().getBorderState() == RTFBorderState::PARAGRAPH_BOX)
- for (int i = 0; i < 4; i++)
- {
- RTFValue::Pointer_t p = aStates.top().getParagraphSprms().find(getParagraphBorder(i));
- if (p)
- {
- RTFSprms& rAttributes = p->getAttributes();
- rAttributes.set(nId, pValue);
- }
- }
- else if (aStates.top().getBorderState() == RTFBorderState::CHARACTER)
- {
- RTFValue::Pointer_t pPointer
- = aStates.top().getCharacterSprms().find(NS_ooxml::LN_EG_RPrBase_bdr);
- if (pPointer)
- {
- RTFSprms& rAttributes = pPointer->getAttributes();
- rAttributes.set(nId, pValue);
- }
- }
- // Attributes of the last border type
- else if (aStates.top().getBorderState() == RTFBorderState::PARAGRAPH)
- pAttributes
- = &getLastAttributes(aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PrBase_pBdr);
- else if (aStates.top().getBorderState() == RTFBorderState::CELL)
- pAttributes = &getLastAttributes(aStates.top().getTableCellSprms(),
- NS_ooxml::LN_CT_TcPrBase_tcBorders);
- else if (aStates.top().getBorderState() == RTFBorderState::PAGE)
- pAttributes = &getLastAttributes(aStates.top().getSectionSprms(),
- NS_ooxml::LN_EG_SectPrContents_pgBorders);
- else if (aStates.top().getBorderState() == RTFBorderState::NONE)
- {
- // this is invalid, but Word apparently clears or overrides all paragraph borders now
- for (int i = 0; i < 4; ++i)
- {
- auto const nBorder = getParagraphBorder(i);
- RTFSprms aAttributes;
- RTFSprms aSprms;
- aAttributes.set(NS_ooxml::LN_CT_Border_val,
- new RTFValue(NS_ooxml::LN_Value_ST_Border_none));
- putNestedSprm(aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PrBase_pBdr, nBorder,
- new RTFValue(aAttributes, aSprms), RTFOverwrite::YES);
- }
- }
-
- if (pAttributes)
- pAttributes->set(nId, pValue);
-}
-
-OString DTTM22OString(tools::Long nDTTM)
-{
- return DateTimeToOString(msfilter::util::DTTM2DateTime(nDTTM));
-}
-
-static RTFSprms lcl_getBookmarkProperties(int nPos, const OUString& rString)
-{
- RTFSprms aAttributes;
- auto pPos = new RTFValue(nPos);
- if (!rString.isEmpty())
- {
- // If present, this should be sent first.
- auto pString = new RTFValue(rString);
- aAttributes.set(NS_ooxml::LN_CT_Bookmark_name, pString);
- }
- aAttributes.set(NS_ooxml::LN_CT_MarkupRangeBookmark_id, pPos);
- return aAttributes;
-}
-
-const char* keywordToString(RTFKeyword nKeyword)
-{
- for (int i = 0; i < nRTFControlWords; i++)
- {
- if (nKeyword == aRTFControlWords[i].GetIndex())
- return aRTFControlWords[i].GetKeyword();
- }
- return nullptr;
-}
-
-static util::DateTime lcl_getDateTime(RTFParserState const& aState)
-{
- return { 0 /*100sec*/,
- 0 /*sec*/,
- aState.getMinute(),
- aState.getHour(),
- aState.getDay(),
- aState.getMonth(),
- static_cast<sal_Int16>(aState.getYear()),
- false };
-}
-
-static void lcl_DestinationToMath(OUStringBuffer* pDestinationText,
- oox::formulaimport::XmlStreamBuilder& rMathBuffer, bool& rMathNor)
-{
- if (!pDestinationText)
- return;
- OUString aStr = pDestinationText->makeStringAndClear();
- if (aStr.isEmpty())
- return;
- rMathBuffer.appendOpeningTag(M_TOKEN(r));
- if (rMathNor)
- {
- rMathBuffer.appendOpeningTag(M_TOKEN(rPr));
- // Same as M_TOKEN(lit)
- rMathBuffer.appendOpeningTag(M_TOKEN(nor));
- rMathBuffer.appendClosingTag(M_TOKEN(nor));
- rMathBuffer.appendClosingTag(M_TOKEN(rPr));
- rMathNor = false;
- }
- rMathBuffer.appendOpeningTag(M_TOKEN(t));
- rMathBuffer.appendCharacters(aStr);
- rMathBuffer.appendClosingTag(M_TOKEN(t));
- rMathBuffer.appendClosingTag(M_TOKEN(r));
-}
-
-RTFDocumentImpl::RTFDocumentImpl(uno::Reference<uno::XComponentContext> const& xContext,
- uno::Reference<io::XInputStream> const& xInputStream,
- uno::Reference<lang::XComponent> const& xDstDoc,
- uno::Reference<frame::XFrame> const& xFrame,
- uno::Reference<task::XStatusIndicator> const& xStatusIndicator,
- const utl::MediaDescriptor& rMediaDescriptor)
- : m_xContext(xContext)
- , m_xInputStream(xInputStream)
- , m_xDstDoc(xDstDoc)
- , m_xFrame(xFrame)
- , m_xStatusIndicator(xStatusIndicator)
- , m_pMapperStream(nullptr)
- , m_aDefaultState(this)
- , m_bSkipUnknown(false)
- , m_bFirstRun(true)
- , m_bFirstRunException(false)
- , m_bNeedPap(true)
- , m_bNeedCr(false)
- , m_bNeedCrOrig(false)
- , m_bNeedPar(true)
- , m_bNeedFinalPar(false)
- , m_nNestedCells(0)
- , m_nTopLevelCells(0)
- , m_nInheritingCells(0)
- , m_nNestedTRLeft(0)
- , m_nTopLevelTRLeft(0)
- , m_nNestedCurrentCellX(0)
- , m_nTopLevelCurrentCellX(0)
- , m_nBackupTopLevelCurrentCellX(0)
- , m_aTableBufferStack(1) // create top-level buffer already
- , m_pSuperstream(nullptr)
- , m_nStreamType(0)
- , m_nGroupStartPos(0)
- , m_nFormFieldType(RTFFormFieldType::NONE)
- , m_bObject(false)
- , m_nCurrentFontIndex(0)
- , m_nCurrentEncoding(-1)
- , m_nDefaultFontIndex(-1)
- , m_pStyleTableEntries(new RTFReferenceTable::Entries_t)
- , m_nCurrentStyleIndex(0)
- , m_bFormField(false)
- , m_bMathNor(false)
- , m_bIgnoreNextContSectBreak(false)
- , m_nResetBreakOnSectBreak(RTFKeyword::invalid)
- , m_bNeedSect(false) // done by checkFirstRun
- , m_bWasInFrame(false)
- , m_bHadPicture(false)
- , m_bHadSect(false)
- , m_nCellxMax(0)
- , m_nListPictureId(0)
- , m_bIsNewDoc(!rMediaDescriptor.getUnpackedValueOrDefault("InsertMode", false))
- , m_rMediaDescriptor(rMediaDescriptor)
- , m_hasRHeader(false)
- , m_hasFHeader(false)
- , m_hasRFooter(false)
- , m_hasFFooter(false)
-{
- OSL_ASSERT(xInputStream.is());
- m_pInStream = utl::UcbStreamHelper::CreateStream(xInputStream, true);
-
- m_xModelFactory.set(m_xDstDoc, uno::UNO_QUERY);
-
- uno::Reference<document::XDocumentPropertiesSupplier> xDocumentPropertiesSupplier(
- m_xDstDoc, uno::UNO_QUERY);
- if (xDocumentPropertiesSupplier.is())
- m_xDocumentProperties = xDocumentPropertiesSupplier->getDocumentProperties();
-
- m_pGraphicHelper = std::make_shared<oox::GraphicHelper>(m_xContext, xFrame, oox::StorageRef());
-
- m_pTokenizer = new RTFTokenizer(*this, m_pInStream.get(), m_xStatusIndicator);
- m_pSdrImport = new RTFSdrImport(*this, m_xDstDoc);
-
- // unlike OOXML, this is enabled by default
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Compat_splitPgBreakAndParaMark, new RTFValue(1));
-}
-
-RTFDocumentImpl::~RTFDocumentImpl() = default;
-
-SvStream& RTFDocumentImpl::Strm() { return *m_pInStream; }
-
-void RTFDocumentImpl::setSuperstream(RTFDocumentImpl* pSuperstream)
-{
- m_pSuperstream = pSuperstream;
-}
-
-bool RTFDocumentImpl::isSubstream() const { return m_pSuperstream != nullptr; }
-
-void RTFDocumentImpl::finishSubstream() { checkUnicode(/*bUnicode =*/true, /*bHex =*/true); }
-
-void RTFDocumentImpl::resolveSubstream(std::size_t nPos, Id nId)
-{
- resolveSubstream(nPos, nId, OUString());
-}
-void RTFDocumentImpl::resolveSubstream(std::size_t nPos, Id nId, OUString const& rIgnoreFirst)
-{
- sal_uInt64 const nCurrent = Strm().Tell();
- // Seek to header position, parse, then seek back.
- auto pImpl = new RTFDocumentImpl(m_xContext, m_xInputStream, m_xDstDoc, m_xFrame,
- m_xStatusIndicator, m_rMediaDescriptor);
- pImpl->setSuperstream(this);
- pImpl->m_nStreamType = nId;
- pImpl->m_aIgnoreFirst = rIgnoreFirst;
- if (!m_aAuthor.isEmpty())
- {
- pImpl->m_aAuthor = m_aAuthor;
- m_aAuthor.clear();
- }
- if (!m_aAuthorInitials.isEmpty())
- {
- pImpl->m_aAuthorInitials = m_aAuthorInitials;
- m_aAuthorInitials.clear();
- }
- pImpl->m_nDefaultFontIndex = m_nDefaultFontIndex;
- pImpl->m_pStyleTableEntries = m_pStyleTableEntries;
- pImpl->Strm().Seek(nPos);
- SAL_INFO("writerfilter.rtf", "substream start");
- Mapper().substream(nId, pImpl);
- SAL_INFO("writerfilter.rtf", "substream end");
- Strm().Seek(nCurrent);
-}
-
-void RTFDocumentImpl::outputSettingsTable()
-{
- // tdf#136740: do not change target document settings when pasting
- if (!m_bIsNewDoc || isSubstream())
- return;
- writerfilter::Reference<Properties>::Pointer_t pProp
- = new RTFReferenceProperties(m_aSettingsTableAttributes, m_aSettingsTableSprms);
- RTFReferenceTable::Entries_t aSettingsTableEntries;
- aSettingsTableEntries.insert(std::make_pair(0, pProp));
- writerfilter::Reference<Table>::Pointer_t pTable
- = new RTFReferenceTable(std::move(aSettingsTableEntries));
- Mapper().table(NS_ooxml::LN_settings_settings, pTable);
-}
-
-void RTFDocumentImpl::checkFirstRun()
-{
- if (!m_bFirstRun)
- return;
-
- outputSettingsTable();
- // start initial paragraph
- m_bFirstRun = false;
- assert(!m_bNeedSect || m_bFirstRunException);
- setNeedSect(true); // first call that succeeds
-
- // set the requested default font, if there are none for each state in stack
- RTFValue::Pointer_t pFont
- = getNestedAttribute(m_aDefaultState.getCharacterSprms(), NS_ooxml::LN_EG_RPrBase_rFonts,
- NS_ooxml::LN_CT_Fonts_ascii);
- if (!pFont)
- return;
-
- for (size_t i = 0; i < m_aStates.size(); i++)
- {
- RTFValue::Pointer_t pCurrentFont
- = getNestedAttribute(m_aStates[i].getCharacterSprms(), NS_ooxml::LN_EG_RPrBase_rFonts,
- NS_ooxml::LN_CT_Fonts_ascii);
- if (!pCurrentFont)
- putNestedAttribute(m_aStates[i].getCharacterSprms(), NS_ooxml::LN_EG_RPrBase_rFonts,
- NS_ooxml::LN_CT_Fonts_ascii, pFont);
- }
-}
-
-void RTFDocumentImpl::setNeedPar(bool bNeedPar) { m_bNeedPar = bNeedPar; }
-
-void RTFDocumentImpl::setNeedSect(bool bNeedSect)
-{
- if (!m_bNeedSect && bNeedSect && m_bFirstRun)
- {
- RTFLookahead aLookahead(Strm(), m_pTokenizer->getGroupStart());
- if (aLookahead.hasTable() && aLookahead.hasColumns())
- {
- m_bFirstRunException = true;
- }
- }
-
- // ignore setting before checkFirstRun - every keyword calls setNeedSect!
- // except the case of a table in a multicolumn section
- if (!m_bNeedSect && bNeedSect && (!m_bFirstRun || m_bFirstRunException))
- {
- if (!m_pSuperstream) // no sections in header/footer!
- {
- Mapper().startSectionGroup();
- }
- // set flag in substream too - otherwise multiple startParagraphGroup
- m_bNeedSect = bNeedSect;
- Mapper().startParagraphGroup();
- setNeedPar(true);
- }
- else if (m_bNeedSect && !bNeedSect)
- {
- m_bNeedSect = bNeedSect;
- }
-}
-
-/// Copy rProps to rStyleAttributes and rStyleSprms, but in case of nested sprms, copy their children as toplevel sprms/attributes.
-static void lcl_copyFlatten(RTFReferenceProperties& rProps, RTFSprms& rStyleAttributes,
- RTFSprms& rStyleSprms)
-{
- for (auto& rSprm : rProps.getSprms())
- {
- // createStyleProperties() puts properties to rPr, but here we need a flat list.
- if (rSprm.first == NS_ooxml::LN_CT_Style_rPr)
- {
- // rPr can have both attributes and SPRMs, copy over both types.
- RTFSprms& rRPrSprms = rSprm.second->getSprms();
- for (const auto& rRPrSprm : rRPrSprms)
- rStyleSprms.set(rRPrSprm.first, rRPrSprm.second);
-
- RTFSprms& rRPrAttributes = rSprm.second->getAttributes();
- for (const auto& rRPrAttribute : rRPrAttributes)
- rStyleAttributes.set(rRPrAttribute.first, rRPrAttribute.second);
- }
- else
- rStyleSprms.set(rSprm.first, rSprm.second);
- }
-
- RTFSprms& rAttributes = rProps.getAttributes();
- for (const auto& rAttribute : rAttributes)
- rStyleAttributes.set(rAttribute.first, rAttribute.second);
-}
-
-writerfilter::Reference<Properties>::Pointer_t
-RTFDocumentImpl::getProperties(const RTFSprms& rAttributes, RTFSprms const& rSprms, Id nStyleType)
-{
- RTFSprms aSprms(rSprms);
- RTFValue::Pointer_t pAbstractList;
- int nAbstractListId = -1;
- RTFValue::Pointer_t pNumId
- = getNestedSprm(aSprms, NS_ooxml::LN_CT_PPrBase_numPr, NS_ooxml::LN_CT_NumPr_numId);
- if (pNumId)
- {
- // We have a numbering, look up the abstract list for property
- // deduplication and duplication.
- auto itNumId = m_aListOverrideTable.find(pNumId->getInt());
- if (itNumId != m_aListOverrideTable.end())
- {
- nAbstractListId = itNumId->second;
- auto itAbstract = m_aListTable.find(nAbstractListId);
- if (itAbstract != m_aListTable.end())
- pAbstractList = itAbstract->second;
- }
- }
-
- if (pAbstractList)
- {
- auto it = m_aInvalidListTableFirstIndents.find(nAbstractListId);
- if (it != m_aInvalidListTableFirstIndents.end())
- aSprms.deduplicateList(it->second);
- }
-
- int nStyle = 0;
- if (!m_aStates.empty())
- nStyle = m_aStates.top().getCurrentStyleIndex();
- auto it = m_pStyleTableEntries->find(nStyle);
- if (it != m_pStyleTableEntries->end())
- {
- // cloneAndDeduplicate() wants to know about only a single "style", so
- // let's merge paragraph and character style properties here.
- auto itChar = m_pStyleTableEntries->end();
- if (!m_aStates.empty())
- {
- int nCharStyle = m_aStates.top().getCurrentCharacterStyleIndex();
- itChar = m_pStyleTableEntries->find(nCharStyle);
- }
-
- RTFSprms aStyleSprms;
- RTFSprms aStyleAttributes;
- // Ensure the paragraph style is a flat list.
- // Take paragraph style into account for character properties as well,
- // as paragraph style may contain character properties.
- RTFReferenceProperties& rProps = *static_cast<RTFReferenceProperties*>(it->second.get());
- lcl_copyFlatten(rProps, aStyleAttributes, aStyleSprms);
-
- if (itChar != m_pStyleTableEntries->end())
- {
- // Found active character style, then update aStyleSprms/Attributes.
- if (!nStyleType || nStyleType == NS_ooxml::LN_Value_ST_StyleType_character)
- {
- RTFReferenceProperties& rCharProps
- = *static_cast<RTFReferenceProperties*>(itChar->second.get());
- lcl_copyFlatten(rCharProps, aStyleAttributes, aStyleSprms);
- }
- }
-
- RTFSprms sprms(aSprms.cloneAndDeduplicate(aStyleSprms, nStyleType, true, &aSprms));
- RTFSprms attributes(rAttributes.cloneAndDeduplicate(aStyleAttributes, nStyleType, true));
- return new RTFReferenceProperties(std::move(attributes), std::move(sprms));
- }
-
- if (pAbstractList)
- aSprms.duplicateList(pAbstractList);
- writerfilter::Reference<Properties>::Pointer_t pRet
- = new RTFReferenceProperties(rAttributes, std::move(aSprms));
- return pRet;
-}
-
-void RTFDocumentImpl::checkNeedPap()
-{
- if (!m_bNeedPap)
- return;
-
- m_bNeedPap = false; // reset early, so we can avoid recursion when calling ourselves
-
- if (m_aStates.empty())
- return;
-
- if (!m_aStates.top().getCurrentBuffer())
- {
- writerfilter::Reference<Properties>::Pointer_t const pParagraphProperties(getProperties(
- m_aStates.top().getParagraphAttributes(), m_aStates.top().getParagraphSprms(),
- NS_ooxml::LN_Value_ST_StyleType_paragraph));
-
- // Writer will ignore a page break before a text frame, so guard it with empty paragraphs
- const bool bIsInFrame = m_aStates.top().getFrame().hasProperties();
- bool hasBreakBeforeFrame
- = bIsInFrame
- && m_aStates.top().getParagraphSprms().find(NS_ooxml::LN_CT_PPrBase_pageBreakBefore);
- if (hasBreakBeforeFrame)
- {
- dispatchSymbol(RTFKeyword::PAR);
- m_bNeedPap = false;
- }
- Mapper().props(pParagraphProperties);
- if (hasBreakBeforeFrame)
- dispatchSymbol(RTFKeyword::PAR);
-
- if (bIsInFrame)
- {
- writerfilter::Reference<Properties>::Pointer_t const pFrameProperties(
- new RTFReferenceProperties(RTFSprms(), m_aStates.top().getFrame().getSprms()));
- Mapper().props(pFrameProperties);
- }
- }
- else
- {
- auto pValue = new RTFValue(m_aStates.top().getParagraphAttributes(),
- m_aStates.top().getParagraphSprms());
- bufferProperties(*m_aStates.top().getCurrentBuffer(), pValue, nullptr);
- }
-}
-
-void RTFDocumentImpl::runProps()
-{
- if (!m_aStates.top().getCurrentBuffer())
- {
- Reference<Properties>::Pointer_t const pProperties = getProperties(
- m_aStates.top().getCharacterAttributes(), m_aStates.top().getCharacterSprms(),
- NS_ooxml::LN_Value_ST_StyleType_character);
- Mapper().props(pProperties);
- }
- else
- {
- auto pValue = new RTFValue(m_aStates.top().getCharacterAttributes(),
- m_aStates.top().getCharacterSprms());
- bufferProperties(*m_aStates.top().getCurrentBuffer(), pValue, nullptr,
- NS_ooxml::LN_Value_ST_StyleType_character);
- }
-
- // Delete the sprm, so the trackchange range will be started only once.
- // OTOH set a boolean flag, so we'll know we need to end the range later.
- RTFValue::Pointer_t pTrackchange
- = m_aStates.top().getCharacterSprms().find(NS_ooxml::LN_trackchange);
- if (pTrackchange)
- {
- m_aStates.top().setStartedTrackchange(true);
- m_aStates.top().getCharacterSprms().erase(NS_ooxml::LN_trackchange);
- }
-}
-
-void RTFDocumentImpl::runBreak()
-{
- sal_Unicode const sBreak[] = { 0x0d };
- Mapper().utext(sBreak, 1);
- m_bNeedCr = false;
-}
-
-void RTFDocumentImpl::tableBreak()
-{
- checkFirstRun(); // ooo113308-1.rtf has a header at offset 151084 that doesn't startParagraphGroup() without this
- runBreak();
- Mapper().endParagraphGroup();
- Mapper().startParagraphGroup();
-}
-
-void RTFDocumentImpl::parBreak()
-{
- checkFirstRun();
- checkNeedPap();
- // end previous paragraph
- Mapper().startCharacterGroup();
- runBreak();
- Mapper().endCharacterGroup();
- Mapper().endParagraphGroup();
-
- m_bHadPicture = false;
-
- // start new one
- if (!m_bParAtEndOfSection)
- {
- Mapper().startParagraphGroup();
- }
-}
-
-void RTFDocumentImpl::sectBreak(bool bFinal)
-{
- SAL_INFO("writerfilter.rtf", __func__ << ": final? " << bFinal << ", needed? " << m_bNeedSect);
- bool bNeedSect = m_bNeedSect;
- RTFValue::Pointer_t pBreak
- = m_aStates.top().getSectionSprms().find(NS_ooxml::LN_EG_SectPrContents_type);
- bool bContinuous = pBreak && pBreak->getInt() == NS_ooxml::LN_Value_ST_SectionMark_continuous;
- // If there is no paragraph in this section, then insert a dummy one, as required by Writer,
- // unless this is the end of the doc, we had nothing since the last section break and this is not a continuous one.
- // Also, when pasting, it's fine to not have any paragraph inside the document at all.
- if (m_bNeedPar && (!bFinal || m_bNeedSect || bContinuous) && !isSubstream() && m_bIsNewDoc)
- {
- m_bParAtEndOfSection = true;
- dispatchSymbol(RTFKeyword::PAR);
- }
- // It's allowed to not have a non-table paragraph at the end of an RTF doc, add it now if required.
- if (m_bNeedFinalPar && bFinal)
- {
- dispatchFlag(RTFKeyword::PARD);
- m_bParAtEndOfSection = true;
- dispatchSymbol(RTFKeyword::PAR);
- m_bNeedSect = bNeedSect;
- }
- // testTdf148515, if RTF ends with \row, endParagraphGroup() must be called!
- if (!m_bParAtEndOfSection || m_aStates.top().getCurrentBuffer())
- {
- Mapper().endParagraphGroup(); // < top para context dies with page break
- }
- m_bParAtEndOfSection = false;
- // paragraph properties are *done* now - only section properties following
-
- while (!m_nHeaderFooterPositions.empty())
- {
- std::pair<Id, std::size_t> aPair = m_nHeaderFooterPositions.front();
- m_nHeaderFooterPositions.pop();
- resolveSubstream(aPair.second, aPair.first);
- }
-
- // Normally a section break at the end of the doc is necessary. Unless the
- // last control word in the document is a section break itself.
- if (!bNeedSect || !m_bHadSect)
- {
- // In case the last section is a continuous one, we don't need to output a section break.
- if (bFinal && bContinuous)
- m_aStates.top().getSectionSprms().erase(NS_ooxml::LN_EG_SectPrContents_type);
- }
-
- // Section properties are a paragraph sprm.
- auto pValue
- = new RTFValue(m_aStates.top().getSectionAttributes(), m_aStates.top().getSectionSprms());
- RTFSprms aAttributes;
- RTFSprms aSprms;
- aSprms.set(NS_ooxml::LN_CT_PPr_sectPr, pValue);
- writerfilter::Reference<Properties>::Pointer_t pProperties
- = new RTFReferenceProperties(std::move(aAttributes), std::move(aSprms));
-
- if (bFinal && !m_pSuperstream)
- // This is the end of the document, not just the end of e.g. a header.
- // This makes sure that dmapper can set DontBalanceTextColumns=true for this section if necessary.
- Mapper().markLastSectionGroup();
-
- // The trick is that we send properties of the previous section right now, which will be exactly what dmapper expects.
- Mapper().props(pProperties);
-
- // End Section
- if (!m_pSuperstream)
- {
- m_hasFHeader = false;
- m_hasRHeader = false;
- m_hasRFooter = false;
- m_hasFFooter = false;
- Mapper().endSectionGroup();
- }
- m_bNeedPar = false;
- m_bNeedSect = false;
-}
-
-Color RTFDocumentImpl::getColorTable(sal_uInt32 nIndex)
-{
- if (!m_pSuperstream)
- {
- if (nIndex < m_aColorTable.size())
- return m_aColorTable[nIndex];
- return 0;
- }
-
- return m_pSuperstream->getColorTable(nIndex);
-}
-
-rtl_TextEncoding RTFDocumentImpl::getEncoding(int nFontIndex)
-{
- if (!m_pSuperstream)
- {
- auto it = m_aFontEncodings.find(nFontIndex);
- if (it != m_aFontEncodings.end())
- // We have a font encoding associated to this font.
- return it->second;
- if (m_aDefaultState.getCurrentEncoding() != rtl_getTextEncodingFromWindowsCharset(0))
- // We have a default encoding.
- return m_aDefaultState.getCurrentEncoding();
- // Guess based on locale.
- return msfilter::util::getBestTextEncodingFromLocale(
- Application::GetSettings().GetLanguageTag().getLocale());
- }
-
- return m_pSuperstream->getEncoding(nFontIndex);
-}
-
-OUString RTFDocumentImpl::getFontName(int nIndex)
-{
- if (!m_pSuperstream)
- return m_aFontNames[nIndex];
-
- return m_pSuperstream->getFontName(nIndex);
-}
-
-int RTFDocumentImpl::getFontIndex(int nIndex)
-{
- if (!m_pSuperstream)
- return std::find(m_aFontIndexes.begin(), m_aFontIndexes.end(), nIndex)
- - m_aFontIndexes.begin();
-
- return m_pSuperstream->getFontIndex(nIndex);
-}
-
-OUString RTFDocumentImpl::getStyleName(int nIndex)
-{
- if (!m_pSuperstream)
- {
- OUString aRet;
- auto it = m_aStyleNames.find(nIndex);
- if (it != m_aStyleNames.end())
- aRet = it->second;
- return aRet;
- }
-
- return m_pSuperstream->getStyleName(nIndex);
-}
-
-Id RTFDocumentImpl::getStyleType(int nIndex)
-{
- if (!m_pSuperstream)
- {
- Id nRet = 0;
- auto it = m_aStyleTypes.find(nIndex);
- if (it != m_aStyleTypes.end())
- nRet = it->second;
- return nRet;
- }
-
- return m_pSuperstream->getStyleType(nIndex);
-}
-
-RTFParserState& RTFDocumentImpl::getDefaultState()
-{
- if (!m_pSuperstream)
- return m_aDefaultState;
-
- return m_pSuperstream->getDefaultState();
-}
-
-oox::GraphicHelper& RTFDocumentImpl::getGraphicHelper() { return *m_pGraphicHelper; }
-
-bool RTFDocumentImpl::isStyleSheetImport()
-{
- if (m_aStates.empty())
- return false;
- Destination eDestination = m_aStates.top().getDestination();
- return eDestination == Destination::STYLESHEET || eDestination == Destination::STYLEENTRY;
-}
-
-void RTFDocumentImpl::resolve(Stream& rMapper)
-{
- m_pMapperStream = &rMapper;
- switch (m_pTokenizer->resolveParse())
- {
- case RTFError::OK:
- SAL_INFO("writerfilter.rtf", "RTFDocumentImpl::resolve: finished without errors");
- break;
- case RTFError::GROUP_UNDER:
- SAL_INFO("writerfilter.rtf", "RTFDocumentImpl::resolve: unmatched '}'");
- break;
- case RTFError::GROUP_OVER:
- SAL_INFO("writerfilter.rtf", "RTFDocumentImpl::resolve: unmatched '{'");
- throw io::WrongFormatException(m_pTokenizer->getPosition());
- break;
- case RTFError::UNEXPECTED_EOF:
- SAL_INFO("writerfilter.rtf", "RTFDocumentImpl::resolve: unexpected end of file");
- throw io::WrongFormatException(m_pTokenizer->getPosition());
- break;
- case RTFError::HEX_INVALID:
- SAL_INFO("writerfilter.rtf", "RTFDocumentImpl::resolve: invalid hex char");
- throw io::WrongFormatException(m_pTokenizer->getPosition());
- break;
- case RTFError::CHAR_OVER:
- SAL_INFO("writerfilter.rtf", "RTFDocumentImpl::resolve: characters after last '}'");
- break;
- case RTFError::CLASSIFICATION:
- SAL_INFO("writerfilter.rtf",
- "RTFDocumentImpl::resolve: classification prevented paste");
- break;
- }
-}
-
-void RTFDocumentImpl::resolvePict(bool const bInline, uno::Reference<drawing::XShape> const& rShape)
-{
- SvMemoryStream aStream;
- SvStream* pStream = nullptr;
- if (!m_pBinaryData)
- {
- pStream = &aStream;
- int b = 0;
- int count = 2;
-
- // Feed the destination text to a stream.
- auto& rDestinationTextBuffer = m_aStates.top().getDestinationText();
- OString aStr = OUStringToOString(rDestinationTextBuffer, RTL_TEXTENCODING_ASCII_US);
- rDestinationTextBuffer.setLength(0);
- for (int i = 0; i < aStr.getLength(); ++i)
- {
- char ch = aStr[i];
- if (ch != 0x0d && ch != 0x0a && ch != 0x20)
- {
- b = b << 4;
- sal_Int8 parsed = msfilter::rtfutil::AsHex(ch);
- if (parsed == -1)
- return;
- b += parsed;
- count--;
- if (!count)
- {
- aStream.WriteChar(static_cast<char>(b));
- count = 2;
- b = 0;
- }
- }
- }
- }
- else
- pStream = m_pBinaryData.get();
-
- if (!pStream->Tell())
- // No destination text? Then we'll get it later.
- return;
-
- SvMemoryStream aDIBStream;
- if (m_aStates.top().getPicture().eStyle == RTFBmpStyle::DIBITMAP)
- {
- // Construct a BITMAPFILEHEADER structure before the real data.
- SvStream& rBodyStream = *pStream;
- aDIBStream.WriteChar('B');
- aDIBStream.WriteChar('M');
- // The size of the real data.
- aDIBStream.WriteUInt32(rBodyStream.Tell());
- // Reserved.
- aDIBStream.WriteUInt32(0);
- // The offset of the real data, i.e. the size of the header, including this number.
- aDIBStream.WriteUInt32(14);
- rBodyStream.Seek(0);
- aDIBStream.WriteStream(rBodyStream);
- pStream = &aDIBStream;
- }
-
- // Store, and get its URL.
- pStream->Seek(0);
- uno::Reference<io::XInputStream> xInputStream(new utl::OInputStreamWrapper(pStream));
- WmfExternal aExtHeader;
- aExtHeader.mapMode = m_aStates.top().getPicture().eWMetafile;
- if (m_aStates.top().getPicture().nGoalWidth == 0
- || m_aStates.top().getPicture().nGoalHeight == 0)
- {
- // Don't use the values provided by picw and pich if the desired size is provided.
-
- aExtHeader.xExt = sal_uInt16(std::clamp<sal_Int32>(
- m_aStates.top().getPicture().nWidth, 0,
- SAL_MAX_UINT16)); //TODO: better way to handle out-of-bounds values?
- aExtHeader.yExt = sal_uInt16(std::clamp<sal_Int32>(
- m_aStates.top().getPicture().nHeight, 0,
- SAL_MAX_UINT16)); //TODO: better way to handle out-of-bounds values?
- }
- WmfExternal* pExtHeader = &aExtHeader;
- uno::Reference<lang::XServiceInfo> xServiceInfo(m_aStates.top().getDrawingObject().getShape(),
- uno::UNO_QUERY);
- if (xServiceInfo.is() && xServiceInfo->supportsService("com.sun.star.text.TextFrame"))
- pExtHeader = nullptr;
-
- uno::Reference<graphic::XGraphic> xGraphic
- = m_pGraphicHelper->importGraphic(xInputStream, pExtHeader);
-
- if (m_aStates.top().getPicture().eStyle != RTFBmpStyle::NONE)
- {
- // In case of PNG/JPEG, the real size is known, don't use the values
- // provided by picw and pich.
-
- Graphic aGraphic(xGraphic);
- Size aSize(aGraphic.GetPrefSize());
- MapMode aMap(MapUnit::Map100thMM);
- if (aGraphic.GetPrefMapMode().GetMapUnit() == MapUnit::MapPixel)
- aSize = Application::GetDefaultDevice()->PixelToLogic(aSize, aMap);
- else
- aSize = OutputDevice::LogicToLogic(aSize, aGraphic.GetPrefMapMode(), aMap);
- m_aStates.top().getPicture().nWidth = aSize.Width();
- m_aStates.top().getPicture().nHeight = aSize.Height();
- }
-
- uno::Reference<drawing::XShape> xShape(rShape);
- if (m_aStates.top().getInShape() && xShape.is())
- {
- awt::Size aSize = xShape->getSize();
- if (aSize.Width || aSize.Height)
- {
- // resolvePict() is processing pib structure inside shape
- // So if shape has dimensions we should use them instead of
- // \picwN, \pichN, \picscalexN, \picscaleyN given with picture
- m_aStates.top().getPicture().nGoalWidth = aSize.Width;
- m_aStates.top().getPicture().nGoalHeight = aSize.Height;
- m_aStates.top().getPicture().nScaleX = 100;
- m_aStates.top().getPicture().nScaleY = 100;
- }
- }
-
- // Wrap it in an XShape.
- if (xShape.is())
- {
- uno::Reference<lang::XServiceInfo> xSI(xShape, uno::UNO_QUERY_THROW);
- if (!xSI->supportsService("com.sun.star.drawing.GraphicObjectShape"))
- {
- // it's sometimes an error to get here - but it's possible to have
- // a \pict inside the \shptxt of a \shp of shapeType 202 "TextBox"
- // and in that case xShape is the text frame; we actually need a
- // new GraphicObject then (example: fdo37691-1.rtf)
- SAL_INFO("writerfilter.rtf",
- "cannot set graphic on existing shape, creating a new GraphicObjectShape");
- xShape.clear();
- }
- }
- if (!xShape.is())
- {
- if (m_xModelFactory.is())
- xShape.set(m_xModelFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"),
- uno::UNO_QUERY);
- uno::Reference<drawing::XDrawPageSupplier> const xDrawSupplier(m_xDstDoc, uno::UNO_QUERY);
- if (xDrawSupplier.is())
- {
- uno::Reference<drawing::XShapes> xShapes = xDrawSupplier->getDrawPage();
- if (xShapes.is())
- xShapes->add(xShape);
- }
- }
-
- uno::Reference<beans::XPropertySet> xPropertySet(xShape, uno::UNO_QUERY);
-
- if (xPropertySet.is())
- xPropertySet->setPropertyValue("Graphic", uno::Any(xGraphic));
-
- // check if the picture is in an OLE object and if the \objdata element is used
- // (see RTFKeyword::OBJECT in RTFDocumentImpl::dispatchDestination)
- if (m_bObject)
- {
- // Set the object size
- awt::Size aSize;
- aSize.Width
- = (m_aStates.top().getPicture().nGoalWidth ? m_aStates.top().getPicture().nGoalWidth
- : m_aStates.top().getPicture().nWidth);
- aSize.Height
- = (m_aStates.top().getPicture().nGoalHeight ? m_aStates.top().getPicture().nGoalHeight
- : m_aStates.top().getPicture().nHeight);
- xShape->setSize(aSize);
-
- // Replacement graphic is inline by default, see oox::vml::SimpleShape::implConvertAndInsert().
- xPropertySet->setPropertyValue("AnchorType",
- uno::Any(text::TextContentAnchorType_AS_CHARACTER));
-
- auto pShapeValue = new RTFValue(xShape);
- m_aObjectAttributes.set(NS_ooxml::LN_shape, pShapeValue);
- return;
- }
-
- if (m_aStates.top().getInListpicture())
- {
- // Send the shape directly, no section is started, to additional properties will be ignored anyway.
- Mapper().startShape(xShape);
- Mapper().endShape();
- return;
- }
-
- // Send it to the dmapper.
- RTFSprms aSprms;
- RTFSprms aAttributes;
- // shape attribute
- RTFSprms aPicAttributes;
- if (m_aStates.top().getPicture().nCropT != 0 || m_aStates.top().getPicture().nCropB != 0
- || m_aStates.top().getPicture().nCropL != 0 || m_aStates.top().getPicture().nCropR != 0)
- {
- text::GraphicCrop const crop{ m_aStates.top().getPicture().nCropT,
- m_aStates.top().getPicture().nCropB,
- m_aStates.top().getPicture().nCropL,
- m_aStates.top().getPicture().nCropR };
- auto const pCrop = new RTFValue(crop);
- aPicAttributes.set(NS_ooxml::LN_CT_BlipFillProperties_srcRect, pCrop);
- }
- auto pShapeValue = new RTFValue(xShape);
- aPicAttributes.set(NS_ooxml::LN_shape, pShapeValue);
- // pic sprm
- RTFSprms aGraphicDataAttributes;
- RTFSprms aGraphicDataSprms;
- auto pPicValue = new RTFValue(aPicAttributes);
- aGraphicDataSprms.set(NS_ooxml::LN_pic_pic, pPicValue);
- // graphicData sprm
- RTFSprms aGraphicAttributes;
- RTFSprms aGraphicSprms;
- auto pGraphicDataValue = new RTFValue(aGraphicDataAttributes, aGraphicDataSprms);
- aGraphicSprms.set(NS_ooxml::LN_CT_GraphicalObject_graphicData, pGraphicDataValue);
- // graphic sprm
- auto pGraphicValue = new RTFValue(aGraphicAttributes, aGraphicSprms);
- // extent sprm
- RTFSprms aExtentAttributes;
- int nXExt = (m_aStates.top().getPicture().nGoalWidth ? m_aStates.top().getPicture().nGoalWidth
- : m_aStates.top().getPicture().nWidth);
- int nYExt = (m_aStates.top().getPicture().nGoalHeight ? m_aStates.top().getPicture().nGoalHeight
- : m_aStates.top().getPicture().nHeight);
- if (m_aStates.top().getPicture().nScaleX != 100)
- nXExt = (static_cast<tools::Long>(m_aStates.top().getPicture().nScaleX)
- * (nXExt
- - (m_aStates.top().getPicture().nCropL + m_aStates.top().getPicture().nCropR)))
- / 100L;
- if (m_aStates.top().getPicture().nScaleY != 100)
- nYExt = (static_cast<tools::Long>(m_aStates.top().getPicture().nScaleY)
- * (nYExt
- - (m_aStates.top().getPicture().nCropT + m_aStates.top().getPicture().nCropB)))
- / 100L;
- auto pXExtValue = new RTFValue(oox::drawingml::convertHmmToEmu(nXExt));
- auto pYExtValue = new RTFValue(oox::drawingml::convertHmmToEmu(nYExt));
- aExtentAttributes.set(NS_ooxml::LN_CT_PositiveSize2D_cx, pXExtValue);
- aExtentAttributes.set(NS_ooxml::LN_CT_PositiveSize2D_cy, pYExtValue);
- auto pExtentValue = new RTFValue(aExtentAttributes);
- // docpr sprm
- RTFSprms aDocprAttributes;
- for (const auto& rCharacterAttribute : m_aStates.top().getCharacterAttributes())
- if (rCharacterAttribute.first == NS_ooxml::LN_CT_NonVisualDrawingProps_name
- || rCharacterAttribute.first == NS_ooxml::LN_CT_NonVisualDrawingProps_descr)
- aDocprAttributes.set(rCharacterAttribute.first, rCharacterAttribute.second);
- auto pDocprValue = new RTFValue(aDocprAttributes);
- if (bInline)
- {
- RTFSprms aInlineAttributes;
- aInlineAttributes.set(NS_ooxml::LN_CT_Inline_distT, new RTFValue(0));
- aInlineAttributes.set(NS_ooxml::LN_CT_Inline_distB, new RTFValue(0));
- aInlineAttributes.set(NS_ooxml::LN_CT_Inline_distL, new RTFValue(0));
- aInlineAttributes.set(NS_ooxml::LN_CT_Inline_distR, new RTFValue(0));
- RTFSprms aInlineSprms;
- aInlineSprms.set(NS_ooxml::LN_CT_Inline_extent, pExtentValue);
- aInlineSprms.set(NS_ooxml::LN_CT_Inline_docPr, pDocprValue);
- aInlineSprms.set(NS_ooxml::LN_graphic_graphic, pGraphicValue);
- // inline sprm
- auto pValue = new RTFValue(aInlineAttributes, aInlineSprms);
- aSprms.set(NS_ooxml::LN_inline_inline, pValue);
- }
- else // anchored
- {
- // wrap sprm
- RTFSprms aAnchorWrapAttributes;
- m_aStates.top().getShape().getAnchorAttributes().set(
- NS_ooxml::LN_CT_Anchor_behindDoc,
- new RTFValue((m_aStates.top().getShape().getInBackground()) ? 1 : 0));
- RTFSprms aAnchorSprms;
- for (const auto& rCharacterAttribute : m_aStates.top().getCharacterAttributes())
- {
- if (rCharacterAttribute.first == NS_ooxml::LN_CT_WrapSquare_wrapText)
- aAnchorWrapAttributes.set(rCharacterAttribute.first, rCharacterAttribute.second);
- }
- sal_Int32 nWrap = -1;
- for (auto& rCharacterSprm : m_aStates.top().getCharacterSprms())
- {
- if (rCharacterSprm.first == NS_ooxml::LN_EG_WrapType_wrapNone
- || rCharacterSprm.first == NS_ooxml::LN_EG_WrapType_wrapTight)
- {
- nWrap = rCharacterSprm.first;
-
- // If there is a wrap polygon prepared by RTFSdrImport, pick it up here.
- if (rCharacterSprm.first == NS_ooxml::LN_EG_WrapType_wrapTight
- && !m_aStates.top().getShape().getWrapPolygonSprms().empty())
- rCharacterSprm.second->getSprms().set(
- NS_ooxml::LN_CT_WrapTight_wrapPolygon,
- new RTFValue(RTFSprms(), m_aStates.top().getShape().getWrapPolygonSprms()));
-
- aAnchorSprms.set(rCharacterSprm.first, rCharacterSprm.second);
- }
- }
-
- if (m_aStates.top().getShape().getWrapSprm().first != 0)
- // Replay of a buffered shape, wrap sprm there has priority over
- // character sprms of the current state.
- aAnchorSprms.set(m_aStates.top().getShape().getWrapSprm().first,
- m_aStates.top().getShape().getWrapSprm().second);
-
- aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_extent, pExtentValue);
- if (!aAnchorWrapAttributes.empty() && nWrap == -1)
- aAnchorSprms.set(NS_ooxml::LN_EG_WrapType_wrapSquare,
- new RTFValue(aAnchorWrapAttributes));
-
- // See OOXMLFastContextHandler::positionOffset(), we can't just put offset values in an RTFValue.
- RTFSprms aPoshAttributes;
- RTFSprms aPoshSprms;
- if (m_aStates.top().getShape().getHoriOrientRelationToken() > 0)
- aPoshAttributes.set(
- NS_ooxml::LN_CT_PosH_relativeFrom,
- new RTFValue(m_aStates.top().getShape().getHoriOrientRelationToken()));
- if (m_aStates.top().getShape().getLeft() != 0)
- {
- Mapper().positionOffset(OUString::number(oox::drawingml::convertHmmToEmu(
- m_aStates.top().getShape().getLeft())),
- /*bVertical=*/false);
- aPoshSprms.set(NS_ooxml::LN_CT_PosH_posOffset, new RTFValue());
- }
- aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_positionH,
- new RTFValue(aPoshAttributes, aPoshSprms));
-
- RTFSprms aPosvAttributes;
- RTFSprms aPosvSprms;
- if (m_aStates.top().getShape().getVertOrientRelationToken() > 0)
- aPosvAttributes.set(
- NS_ooxml::LN_CT_PosV_relativeFrom,
- new RTFValue(m_aStates.top().getShape().getVertOrientRelationToken()));
- if (m_aStates.top().getShape().getTop() != 0)
- {
- Mapper().positionOffset(OUString::number(oox::drawingml::convertHmmToEmu(
- m_aStates.top().getShape().getTop())),
- /*bVertical=*/true);
- aPosvSprms.set(NS_ooxml::LN_CT_PosV_posOffset, new RTFValue());
- }
- aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_positionV,
- new RTFValue(aPosvAttributes, aPosvSprms));
-
- aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_docPr, pDocprValue);
- aAnchorSprms.set(NS_ooxml::LN_graphic_graphic, pGraphicValue);
- // anchor sprm
- auto pValue = new RTFValue(m_aStates.top().getShape().getAnchorAttributes(), aAnchorSprms);
- aSprms.set(NS_ooxml::LN_anchor_anchor, pValue);
- }
- checkFirstRun();
-
- if (!m_aStates.top().getCurrentBuffer())
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties
- = new RTFReferenceProperties(std::move(aAttributes), std::move(aSprms));
- Mapper().props(pProperties);
- // Make sure we don't lose these properties with a too early reset.
- m_bHadPicture = true;
- }
- else
- {
- auto pValue = new RTFValue(aAttributes, aSprms);
- bufferProperties(*m_aStates.top().getCurrentBuffer(), pValue, nullptr);
- }
-}
-
-RTFError RTFDocumentImpl::resolveChars(char ch)
-{
- if (m_aStates.top().getInternalState() == RTFInternalState::BIN)
- {
- m_pBinaryData = std::make_shared<SvMemoryStream>();
- m_pBinaryData->WriteChar(ch);
- for (int i = 0; i < m_aStates.top().getBinaryToRead() - 1; ++i)
- {
- Strm().ReadChar(ch);
- m_pBinaryData->WriteChar(ch);
- }
- m_aStates.top().setInternalState(RTFInternalState::NORMAL);
- return RTFError::OK;
- }
-
- OStringBuffer aBuf(512);
-
- bool bUnicodeChecked = false;
- bool bSkipped = false;
-
- while (!Strm().eof()
- && (m_aStates.top().getInternalState() == RTFInternalState::HEX
- || (ch != '{' && ch != '}' && ch != '\\')))
- {
- if (m_aStates.top().getInternalState() == RTFInternalState::HEX
- || (ch != 0x0d && ch != 0x0a))
- {
- if (m_aStates.top().getCharsToSkip() == 0)
- {
- if (!bUnicodeChecked)
- {
- checkUnicode(/*bUnicode =*/true, /*bHex =*/false);
- bUnicodeChecked = true;
- }
- aBuf.append(ch);
- }
- else
- {
- bSkipped = true;
- m_aStates.top().getCharsToSkip()--;
- }
- }
-
- // read a single char if we're in hex mode
- if (m_aStates.top().getInternalState() == RTFInternalState::HEX)
- break;
-
- if (RTL_TEXTENCODING_MS_932 == m_aStates.top().getCurrentEncoding())
- {
- unsigned char uch = ch;
- if ((uch >= 0x80 && uch <= 0x9F) || uch >= 0xE0)
- {
- // read second byte of 2-byte Shift-JIS - may be \ { }
- Strm().ReadChar(ch);
- if (m_aStates.top().getCharsToSkip() == 0)
- {
- // fdo#79384: Word will reject Shift-JIS following \loch
- // but apparently OOo could read and (worse) write such documents
- SAL_INFO_IF(m_aStates.top().getRunType() != RTFParserState::RunType::DBCH,
- "writerfilter.rtf", "invalid Shift-JIS without DBCH");
- assert(bUnicodeChecked);
- aBuf.append(ch);
- }
- else
- {
- assert(bSkipped);
- // anybody who uses \ucN with Shift-JIS is insane
- m_aStates.top().getCharsToSkip()--;
- }
- }
- }
-
- Strm().ReadChar(ch);
- }
- if (m_aStates.top().getInternalState() != RTFInternalState::HEX && !Strm().eof())
- Strm().SeekRel(-1);
-
- if (m_aStates.top().getInternalState() == RTFInternalState::HEX
- && m_aStates.top().getDestination() != Destination::LEVELNUMBERS)
- {
- if (!bSkipped)
- {
- // note: apparently \'0d\'0a is interpreted as 2 breaks, not 1
- if ((ch == '\r' || ch == '\n')
- && m_aStates.top().getDestination() != Destination::DOCCOMM
- && m_aStates.top().getDestination() != Destination::LEVELNUMBERS
- && m_aStates.top().getDestination() != Destination::LEVELTEXT)
- {
- checkUnicode(/*bUnicode =*/false, /*bHex =*/true);
- dispatchSymbol(RTFKeyword::PAR);
- }
- else
- {
- m_aHexBuffer.append(ch);
- }
- }
- return RTFError::OK;
- }
-
- if (m_aStates.top().getDestination() == Destination::SKIP)
- return RTFError::OK;
- OString aStr = aBuf.makeStringAndClear();
- if (m_aStates.top().getDestination() == Destination::LEVELNUMBERS)
- {
- if (aStr.toChar() != ';')
- m_aStates.top().getLevelNumbers().push_back(sal_Int32(ch));
- return RTFError::OK;
- }
-
- SAL_INFO("writerfilter.rtf",
- "RTFDocumentImpl::resolveChars: collected '"
- << OStringToOUString(aStr, m_aStates.top().getCurrentEncoding()) << "'");
-
- if (m_aStates.top().getDestination() == Destination::COLORTABLE)
- {
- // we hit a ';' at the end of each color entry
- m_aColorTable.push_back(m_aStates.top().getCurrentColor().GetColor());
- // set components back to zero
- m_aStates.top().getCurrentColor() = RTFColorTableEntry();
- }
- else if (!aStr.isEmpty())
- m_aHexBuffer.append(aStr);
-
- checkUnicode(/*bUnicode =*/false, /*bHex =*/true);
- return RTFError::OK;
-}
-
-void RTFDocumentImpl::singleChar(sal_uInt8 nValue, bool bRunProps)
-{
- sal_uInt8 sValue[] = { nValue };
- RTFBuffer_t* pCurrentBuffer = m_aStates.top().getCurrentBuffer();
-
- if (!pCurrentBuffer)
- {
- Mapper().startCharacterGroup();
- }
- else
- {
- pCurrentBuffer->emplace_back(BUFFER_STARTRUN, nullptr, nullptr);
- }
-
- // Should we send run properties?
- if (bRunProps)
- runProps();
-
- if (!pCurrentBuffer)
- {
- Mapper().text(sValue, 1);
- Mapper().endCharacterGroup();
- }
- else
- {
- auto pValue = new RTFValue(*sValue);
- pCurrentBuffer->emplace_back(BUFFER_TEXT, pValue, nullptr);
- pCurrentBuffer->emplace_back(BUFFER_ENDRUN, nullptr, nullptr);
- }
-}
-
-void RTFDocumentImpl::handleFontTableEntry()
-{
- OUString aName = m_aStates.top().getCurrentDestinationText()->makeStringAndClear();
-
- if (aName.isEmpty())
- return;
-
- if (aName.endsWith(";"))
- {
- aName = aName.copy(0, aName.getLength() - 1);
- }
-
- // Old documents can contain no encoding information in fontinfo,
- // but there can be font name suffixes: Arial CE is not a special
- // font, it is ordinal Arial, but with used cp 1250 encoding.
- // Moreover these suffixes have priority over \cpgN and \fcharsetN
- // in MS Word.
- OUString aFontSuffix;
- OUString aNameNoSuffix(aName);
- sal_Int32 nLastSpace = aName.lastIndexOf(' ');
- if (nLastSpace >= 0)
- {
- aFontSuffix = aName.copy(nLastSpace + 1);
- aNameNoSuffix = aName.copy(0, nLastSpace);
- sal_Int32 nEncoding = RTL_TEXTENCODING_DONTKNOW;
- for (int i = 0; aRTFFontNameSuffixes[i].codepage != RTL_TEXTENCODING_DONTKNOW; i++)
- {
- if (aFontSuffix.equalsAscii(aRTFFontNameSuffixes[i].suffix))
- {
- nEncoding = aRTFFontNameSuffixes[i].codepage;
- break;
- }
- }
- if (nEncoding > RTL_TEXTENCODING_DONTKNOW)
- {
- m_nCurrentEncoding = nEncoding;
- m_aStates.top().setCurrentEncoding(m_nCurrentEncoding);
- }
- else
- {
- // Unknown suffix: looks like it is just a part of font name, restore it
- aNameNoSuffix = aName;
- }
- }
-
- m_aFontNames[m_nCurrentFontIndex] = aNameNoSuffix;
- if (m_nCurrentEncoding >= 0)
- {
- m_aFontEncodings[m_nCurrentFontIndex] = m_nCurrentEncoding;
- m_nCurrentEncoding = -1;
- }
- m_aStates.top().getTableAttributes().set(NS_ooxml::LN_CT_Font_name,
- new RTFValue(aNameNoSuffix));
-
- writerfilter::Reference<Properties>::Pointer_t const pProp(new RTFReferenceProperties(
- m_aStates.top().getTableAttributes(), m_aStates.top().getTableSprms()));
-
- //See fdo#47347 initial invalid font entry properties are inserted first,
- //so when we attempt to insert the correct ones, there's already an
- //entry in the map for them, so the new ones aren't inserted.
- auto lb = m_aFontTableEntries.lower_bound(m_nCurrentFontIndex);
- if (lb != m_aFontTableEntries.end()
- && !(m_aFontTableEntries.key_comp()(m_nCurrentFontIndex, lb->first)))
- lb->second = pProp;
- else
- m_aFontTableEntries.insert(lb, std::make_pair(m_nCurrentFontIndex, pProp));
-}
-
-void RTFDocumentImpl::text(OUString& rString)
-{
- if (rString.getLength() == 1 && m_aStates.top().getDestination() != Destination::DOCCOMM)
- {
- // No cheating! Tokenizer ignores bare \r and \n, their hex \'0d / \'0a form doesn't count, either.
- sal_Unicode ch = rString[0];
- if (ch == 0x0d || ch == 0x0a)
- return;
- }
-
- bool bRet = true;
- switch (m_aStates.top().getDestination())
- {
- // Note: in stylesheet and revtbl groups are mandatory
- case Destination::STYLEENTRY:
- case Destination::LISTNAME:
- case Destination::REVISIONENTRY:
- {
- // ; is the end of the entry
- bool bEnd = false;
- if (rString.endsWith(";"))
- {
- rString = rString.copy(0, rString.getLength() - 1);
- bEnd = true;
- }
- m_aStates.top().appendDestinationText(rString);
- if (bEnd)
- {
- // always clear, necessary in case of group-less fonttable
- OUString const aName
- = m_aStates.top().getCurrentDestinationText()->makeStringAndClear();
- switch (m_aStates.top().getDestination())
- {
- case Destination::STYLEENTRY:
- {
- RTFValue::Pointer_t pType
- = m_aStates.top().getTableAttributes().find(NS_ooxml::LN_CT_Style_type);
- if (pType)
- {
- // Word strips whitespace around style names.
- m_aStyleNames[m_nCurrentStyleIndex] = aName.trim();
- m_aStyleTypes[m_nCurrentStyleIndex] = pType->getInt();
- auto pValue = new RTFValue(aName.trim());
- m_aStates.top().getTableAttributes().set(NS_ooxml::LN_CT_Style_styleId,
- pValue);
- m_aStates.top().getTableSprms().set(NS_ooxml::LN_CT_Style_name, pValue);
-
- writerfilter::Reference<Properties>::Pointer_t const pProp(
- createStyleProperties());
- m_pStyleTableEntries->insert(
- std::make_pair(m_nCurrentStyleIndex, pProp));
- }
- else
- SAL_INFO("writerfilter.rtf", "no RTF style type defined, ignoring");
- break;
- }
- case Destination::LISTNAME:
- // TODO: what can be done with a list name?
- break;
- case Destination::REVISIONENTRY:
- m_aAuthors[m_aAuthors.size()] = aName;
- break;
- default:
- break;
- }
- resetAttributes();
- resetSprms();
- }
- }
- break;
- case Destination::DOCVAR:
- {
- m_aStates.top().appendDocVar(rString);
- }
- break;
- case Destination::FONTTABLE:
- case Destination::FONTENTRY:
- case Destination::LEVELTEXT:
- case Destination::SHAPEPROPERTYNAME:
- case Destination::SHAPEPROPERTYVALUE:
- case Destination::BOOKMARKEND:
- case Destination::PICT:
- case Destination::SHAPEPROPERTYVALUEPICT:
- case Destination::FORMFIELDNAME:
- case Destination::FORMFIELDLIST:
- case Destination::DATAFIELD:
- case Destination::AUTHOR:
- case Destination::KEYWORDS:
- case Destination::OPERATOR:
- case Destination::COMPANY:
- case Destination::COMMENT:
- case Destination::OBJDATA:
- case Destination::OBJCLASS:
- case Destination::ANNOTATIONDATE:
- case Destination::ANNOTATIONAUTHOR:
- case Destination::ANNOTATIONREFERENCE:
- case Destination::FALT:
- case Destination::PARAGRAPHNUMBERING_TEXTAFTER:
- case Destination::PARAGRAPHNUMBERING_TEXTBEFORE:
- case Destination::TITLE:
- case Destination::SUBJECT:
- case Destination::DOCCOMM:
- case Destination::ATNID:
- case Destination::ANNOTATIONREFERENCESTART:
- case Destination::ANNOTATIONREFERENCEEND:
- case Destination::MR:
- case Destination::MCHR:
- case Destination::MPOS:
- case Destination::MVERTJC:
- case Destination::MSTRIKEH:
- case Destination::MDEGHIDE:
- case Destination::MBEGCHR:
- case Destination::MSEPCHR:
- case Destination::MENDCHR:
- case Destination::MSUBHIDE:
- case Destination::MSUPHIDE:
- case Destination::MTYPE:
- case Destination::MGROW:
- case Destination::INDEXENTRY:
- case Destination::TOCENTRY:
- case Destination::PROPNAME:
- case Destination::STATICVAL:
- m_aStates.top().appendDestinationText(rString);
- break;
- case Destination::GENERATOR:
- // don't enlarge space sequences, eg. it was saved in LibreOffice
- if (!rString.startsWithIgnoreAsciiCase("Microsoft"))
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Settings_longerSpaceSequence,
- new RTFValue(0));
- break;
- default:
- bRet = false;
- break;
- }
- if (bRet)
- return;
-
- if (!m_aIgnoreFirst.isEmpty() && m_aIgnoreFirst == rString)
- {
- m_aIgnoreFirst.clear();
- return;
- }
-
- // Are we in the middle of the table definition? (No cell defs yet, but we already have some cell props.)
- if (m_aStates.top().getTableCellSprms().find(NS_ooxml::LN_CT_TcPrBase_vAlign)
- && m_nTopLevelCells == 0)
- {
- m_aTableBufferStack.back().emplace_back(BUFFER_UTEXT, new RTFValue(rString), nullptr);
- return;
- }
-
- checkFirstRun();
- checkNeedPap();
-
- // Don't return earlier, a bookmark start has to be in a paragraph group.
- if (m_aStates.top().getDestination() == Destination::BOOKMARKSTART)
- {
- m_aStates.top().appendDestinationText(rString);
- return;
- }
-
- RTFBuffer_t* pCurrentBuffer = m_aStates.top().getCurrentBuffer();
-
- if (!pCurrentBuffer && m_aStates.top().getDestination() != Destination::FOOTNOTE)
- Mapper().startCharacterGroup();
- else if (pCurrentBuffer)
- {
- RTFValue::Pointer_t pValue;
- pCurrentBuffer->emplace_back(BUFFER_STARTRUN, pValue, nullptr);
- }
-
- if (m_aStates.top().getDestination() == Destination::NORMAL
- || m_aStates.top().getDestination() == Destination::FIELDRESULT
- || m_aStates.top().getDestination() == Destination::SHAPETEXT)
- runProps();
-
- if (!pCurrentBuffer)
- Mapper().utext(rString.getStr(), rString.getLength());
- else
- {
- auto pValue = new RTFValue(rString);
- pCurrentBuffer->emplace_back(BUFFER_UTEXT, pValue, nullptr);
- }
-
- m_bNeedCr = true;
-
- if (!pCurrentBuffer && m_aStates.top().getDestination() != Destination::FOOTNOTE)
- Mapper().endCharacterGroup();
- else if (pCurrentBuffer)
- {
- RTFValue::Pointer_t pValue;
- pCurrentBuffer->emplace_back(BUFFER_ENDRUN, pValue, nullptr);
- }
-}
-
-void RTFDocumentImpl::prepareProperties(
- RTFParserState& rState, writerfilter::Reference<Properties>::Pointer_t& o_rpParagraphProperties,
- writerfilter::Reference<Properties>::Pointer_t& o_rpFrameProperties,
- writerfilter::Reference<Properties>::Pointer_t& o_rpTableRowProperties, int const nCells,
- int const nCurrentCellX)
-{
- o_rpParagraphProperties
- = getProperties(rState.getParagraphAttributes(), rState.getParagraphSprms(),
- NS_ooxml::LN_Value_ST_StyleType_paragraph);
-
- if (rState.getFrame().hasProperties())
- {
- o_rpFrameProperties = new RTFReferenceProperties(RTFSprms(), rState.getFrame().getSprms());
- }
-
- // Table width.
- RTFValue::Pointer_t const pTableWidthProps
- = rState.getTableRowSprms().find(NS_ooxml::LN_CT_TblPrBase_tblW);
- if (!pTableWidthProps)
- {
- auto pUnitValue = new RTFValue(3);
- putNestedAttribute(rState.getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblW,
- NS_ooxml::LN_CT_TblWidth_type, pUnitValue);
- auto pWValue = new RTFValue(nCurrentCellX);
- putNestedAttribute(rState.getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblW,
- NS_ooxml::LN_CT_TblWidth_w, pWValue);
- }
-
- if (nCells > 0)
- rState.getTableRowSprms().set(NS_ooxml::LN_tblRow, new RTFValue(1));
-
- RTFValue::Pointer_t const pCellMar
- = rState.getTableRowSprms().find(NS_ooxml::LN_CT_TblPrBase_tblCellMar);
- if (!pCellMar)
- {
- // If no cell margins are defined, the default left/right margin is 0 in Word, but not in Writer.
- RTFSprms aAttributes;
- aAttributes.set(NS_ooxml::LN_CT_TblWidth_type,
- new RTFValue(NS_ooxml::LN_Value_ST_TblWidth_dxa));
- aAttributes.set(NS_ooxml::LN_CT_TblWidth_w, new RTFValue(0));
- putNestedSprm(rState.getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblCellMar,
- NS_ooxml::LN_CT_TblCellMar_left, new RTFValue(aAttributes));
- putNestedSprm(rState.getTableRowSprms(), NS_ooxml::LN_CT_TblPrBase_tblCellMar,
- NS_ooxml::LN_CT_TblCellMar_right, new RTFValue(aAttributes));
- }
-
- o_rpTableRowProperties
- = new RTFReferenceProperties(rState.getTableRowAttributes(), rState.getTableRowSprms());
-}
-
-void RTFDocumentImpl::sendProperties(
- writerfilter::Reference<Properties>::Pointer_t const& pParagraphProperties,
- writerfilter::Reference<Properties>::Pointer_t const& pFrameProperties,
- writerfilter::Reference<Properties>::Pointer_t const& pTableRowProperties)
-{
- Mapper().props(pParagraphProperties);
-
- if (pFrameProperties)
- {
- Mapper().props(pFrameProperties);
- }
-
- Mapper().props(pTableRowProperties);
-
- tableBreak();
-}
-
-void RTFDocumentImpl::replayRowBuffer(RTFBuffer_t& rBuffer, ::std::deque<RTFSprms>& rCellsSprms,
- ::std::deque<RTFSprms>& rCellsAttributes, int const nCells)
-{
- for (int i = 0; i < nCells; ++i)
- {
- replayBuffer(rBuffer, &rCellsSprms.front(), &rCellsAttributes.front());
- rCellsSprms.pop_front();
- rCellsAttributes.pop_front();
- }
- for (Buf_t& i : rBuffer)
- {
- SAL_WARN_IF(BUFFER_CELLEND == std::get<0>(i), "writerfilter.rtf", "dropping table cell!");
- }
- assert(rCellsSprms.empty());
- assert(rCellsAttributes.empty());
-}
-
-void RTFDocumentImpl::replayBuffer(RTFBuffer_t& rBuffer, RTFSprms* const pSprms,
- RTFSprms const* const pAttributes)
-{
- while (!rBuffer.empty())
- {
- Buf_t aTuple(rBuffer.front());
- rBuffer.pop_front();
- if (std::get<0>(aTuple) == BUFFER_PROPS || std::get<0>(aTuple) == BUFFER_PROPS_CHAR)
- {
- // Construct properties via getProperties() and not directly, to take care of deduplication.
- writerfilter::Reference<Properties>::Pointer_t const pProp(getProperties(
- std::get<1>(aTuple)->getAttributes(), std::get<1>(aTuple)->getSprms(),
- std::get<0>(aTuple) == BUFFER_PROPS_CHAR ? NS_ooxml::LN_Value_ST_StyleType_character
- : 0));
- Mapper().props(pProp);
- }
- else if (std::get<0>(aTuple) == BUFFER_NESTROW)
- {
- TableRowBuffer& rRowBuffer(*std::get<2>(aTuple));
-
- replayRowBuffer(rRowBuffer.GetBuffer(), rRowBuffer.GetCellsSprms(),
- rRowBuffer.GetCellsAttributes(), rRowBuffer.GetCells());
-
- sendProperties(rRowBuffer.GetParaProperties(), rRowBuffer.GetFrameProperties(),
- rRowBuffer.GetRowProperties());
- }
- else if (std::get<0>(aTuple) == BUFFER_CELLEND)
- {
- assert(pSprms && pAttributes);
- auto pValue = new RTFValue(1);
- pSprms->set(NS_ooxml::LN_tblCell, pValue);
- writerfilter::Reference<Properties>::Pointer_t const pTableCellProperties(
- new RTFReferenceProperties(*pAttributes, *pSprms));
- Mapper().props(pTableCellProperties);
- tableBreak();
- break;
- }
- else if (std::get<0>(aTuple) == BUFFER_STARTRUN)
- Mapper().startCharacterGroup();
- else if (std::get<0>(aTuple) == BUFFER_TEXT)
- {
- sal_uInt8 const nValue = std::get<1>(aTuple)->getInt();
- Mapper().text(&nValue, 1);
- }
- else if (std::get<0>(aTuple) == BUFFER_UTEXT)
- {
- OUString const aString(std::get<1>(aTuple)->getString());
- Mapper().utext(aString.getStr(), aString.getLength());
- }
- else if (std::get<0>(aTuple) == BUFFER_ENDRUN)
- Mapper().endCharacterGroup();
- else if (std::get<0>(aTuple) == BUFFER_PAR)
- parBreak();
- else if (std::get<0>(aTuple) == BUFFER_STARTSHAPE)
- m_pSdrImport->resolve(std::get<1>(aTuple)->getShape(), false, RTFSdrImport::SHAPE);
- else if (std::get<0>(aTuple) == BUFFER_RESOLVESHAPE)
- {
- // Make sure there is no current buffer while replaying the shape,
- // otherwise it gets re-buffered.
- RTFBuffer_t* pCurrentBuffer = m_aStates.top().getCurrentBuffer();
- m_aStates.top().setCurrentBuffer(nullptr);
-
- // Set current shape during replay, needed by e.g. wrap in
- // background.
- RTFShape aShape = m_aStates.top().getShape();
- m_aStates.top().getShape() = std::get<1>(aTuple)->getShape();
-
- m_pSdrImport->resolve(std::get<1>(aTuple)->getShape(), true, RTFSdrImport::SHAPE);
- m_aStates.top().getShape() = std::move(aShape);
- m_aStates.top().setCurrentBuffer(pCurrentBuffer);
- }
- else if (std::get<0>(aTuple) == BUFFER_ENDSHAPE)
- m_pSdrImport->close();
- else if (std::get<0>(aTuple) == BUFFER_RESOLVESUBSTREAM)
- {
- RTFSprms& rAttributes = std::get<1>(aTuple)->getAttributes();
- std::size_t nPos = rAttributes.find(0)->getInt();
- Id nId = rAttributes.find(1)->getInt();
- OUString aCustomMark = rAttributes.find(2)->getString();
- resolveSubstream(nPos, nId, aCustomMark);
- }
- else if (std::get<0>(aTuple) == BUFFER_PICTURE)
- m_aStates.top().getPicture() = std::get<1>(aTuple)->getPicture();
- else if (std::get<0>(aTuple) == BUFFER_SETSTYLE)
- {
- if (!m_aStates.empty())
- m_aStates.top().setCurrentStyleIndex(std::get<1>(aTuple)->getInt());
- }
- else
- assert(false);
- }
-}
-
-bool findPropertyName(const std::vector<beans::PropertyValue>& rProperties, const OUString& rName)
-{
- return std::any_of(
- rProperties.begin(), rProperties.end(),
- [&rName](const beans::PropertyValue& rProperty) { return rProperty.Name == rName; });
-}
-
-void RTFDocumentImpl::backupTableRowProperties()
-{
- if (m_nTopLevelCurrentCellX)
- {
- m_aBackupTableRowSprms = m_aStates.top().getTableRowSprms();
- m_aBackupTableRowAttributes = m_aStates.top().getTableRowAttributes();
- m_nBackupTopLevelCurrentCellX = m_nTopLevelCurrentCellX;
- }
-}
-
-void RTFDocumentImpl::restoreTableRowProperties()
-{
- m_aStates.top().getTableRowSprms() = m_aBackupTableRowSprms;
- m_aStates.top().getTableRowAttributes() = m_aBackupTableRowAttributes;
- m_nTopLevelCurrentCellX = m_nBackupTopLevelCurrentCellX;
-}
-
-void RTFDocumentImpl::resetTableRowProperties()
-{
- m_aStates.top().getTableRowSprms() = m_aDefaultState.getTableRowSprms();
- m_aStates.top().getTableRowSprms().set(NS_ooxml::LN_CT_TblGridBase_gridCol, new RTFValue(-1),
- RTFOverwrite::NO_APPEND);
- m_aStates.top().getTableRowAttributes() = m_aDefaultState.getTableRowAttributes();
- if (Destination::NESTEDTABLEPROPERTIES == m_aStates.top().getDestination())
- {
- m_nNestedTRLeft = 0;
- m_nNestedCurrentCellX = 0;
- }
- else
- {
- m_nTopLevelTRLeft = 0;
- m_nTopLevelCurrentCellX = 0;
- }
-}
-
-RTFError RTFDocumentImpl::dispatchToggle(RTFKeyword nKeyword, bool bParam, int nParam)
-{
- setNeedSect(true);
- checkUnicode(/*bUnicode =*/true, /*bHex =*/true);
- RTFSkipDestination aSkip(*this);
- int nSprm = -1;
- tools::SvRef<RTFValue> pBoolValue(new RTFValue(int(!bParam || nParam != 0)));
-
- // Underline toggles.
- switch (nKeyword)
- {
- case RTFKeyword::UL:
- nSprm = NS_ooxml::LN_Value_ST_Underline_single;
- break;
- case RTFKeyword::ULDASH:
- nSprm = NS_ooxml::LN_Value_ST_Underline_dash;
- break;
- case RTFKeyword::ULDASHD:
- nSprm = NS_ooxml::LN_Value_ST_Underline_dotDash;
- break;
- case RTFKeyword::ULDASHDD:
- nSprm = NS_ooxml::LN_Value_ST_Underline_dotDotDash;
- break;
- case RTFKeyword::ULDB:
- nSprm = NS_ooxml::LN_Value_ST_Underline_double;
- break;
- case RTFKeyword::ULHWAVE:
- nSprm = NS_ooxml::LN_Value_ST_Underline_wavyHeavy;
- break;
- case RTFKeyword::ULLDASH:
- nSprm = NS_ooxml::LN_Value_ST_Underline_dashLong;
- break;
- case RTFKeyword::ULTH:
- nSprm = NS_ooxml::LN_Value_ST_Underline_thick;
- break;
- case RTFKeyword::ULTHD:
- nSprm = NS_ooxml::LN_Value_ST_Underline_dottedHeavy;
- break;
- case RTFKeyword::ULTHDASH:
- nSprm = NS_ooxml::LN_Value_ST_Underline_dashedHeavy;
- break;
- case RTFKeyword::ULTHDASHD:
- nSprm = NS_ooxml::LN_Value_ST_Underline_dashDotHeavy;
- break;
- case RTFKeyword::ULTHDASHDD:
- nSprm = NS_ooxml::LN_Value_ST_Underline_dashDotDotHeavy;
- break;
- case RTFKeyword::ULTHLDASH:
- nSprm = NS_ooxml::LN_Value_ST_Underline_dashLongHeavy;
- break;
- case RTFKeyword::ULULDBWAVE:
- nSprm = NS_ooxml::LN_Value_ST_Underline_wavyDouble;
- break;
- case RTFKeyword::ULWAVE:
- nSprm = NS_ooxml::LN_Value_ST_Underline_wave;
- break;
- default:
- break;
- }
- if (nSprm >= 0)
- {
- auto pValue
- = new RTFValue((!bParam || nParam != 0) ? nSprm : NS_ooxml::LN_Value_ST_Underline_none);
- m_aStates.top().getCharacterAttributes().set(NS_ooxml::LN_CT_Underline_val, pValue);
- return RTFError::OK;
- }
-
- // Accent characters (over dot / over comma).
- switch (nKeyword)
- {
- case RTFKeyword::ACCNONE:
- nSprm = NS_ooxml::LN_Value_ST_Em_none;
- break;
- case RTFKeyword::ACCDOT:
- nSprm = NS_ooxml::LN_Value_ST_Em_dot;
- break;
- case RTFKeyword::ACCCOMMA:
- nSprm = NS_ooxml::LN_Value_ST_Em_comma;
- break;
- case RTFKeyword::ACCCIRCLE:
- nSprm = NS_ooxml::LN_Value_ST_Em_circle;
- break;
- case RTFKeyword::ACCUNDERDOT:
- nSprm = NS_ooxml::LN_Value_ST_Em_underDot;
- break;
- default:
- break;
- }
- if (nSprm >= 0)
- {
- auto pValue = new RTFValue((!bParam || nParam != 0) ? nSprm : 0);
- m_aStates.top().getCharacterSprms().set(NS_ooxml::LN_EG_RPrBase_em, pValue);
- return RTFError::OK;
- }
-
- // Trivial character sprms.
- switch (nKeyword)
- {
- case RTFKeyword::B:
- case RTFKeyword::AB:
- switch (m_aStates.top().getRunType())
- {
- case RTFParserState::RunType::HICH:
- case RTFParserState::RunType::RTLCH_LTRCH_1:
- case RTFParserState::RunType::LTRCH_RTLCH_2:
- nSprm = NS_ooxml::LN_EG_RPrBase_bCs;
- break;
- case RTFParserState::RunType::NONE:
- case RTFParserState::RunType::LOCH:
- case RTFParserState::RunType::LTRCH_RTLCH_1:
- case RTFParserState::RunType::RTLCH_LTRCH_2:
- case RTFParserState::RunType::DBCH:
- default:
- nSprm = NS_ooxml::LN_EG_RPrBase_b;
- break;
- }
- break;
- case RTFKeyword::I:
- case RTFKeyword::AI:
- switch (m_aStates.top().getRunType())
- {
- case RTFParserState::RunType::HICH:
- case RTFParserState::RunType::RTLCH_LTRCH_1:
- case RTFParserState::RunType::LTRCH_RTLCH_2:
- nSprm = NS_ooxml::LN_EG_RPrBase_iCs;
- break;
- case RTFParserState::RunType::NONE:
- case RTFParserState::RunType::LOCH:
- case RTFParserState::RunType::LTRCH_RTLCH_1:
- case RTFParserState::RunType::RTLCH_LTRCH_2:
- case RTFParserState::RunType::DBCH:
- default:
- nSprm = NS_ooxml::LN_EG_RPrBase_i;
- break;
- }
- break;
- case RTFKeyword::OUTL:
- nSprm = NS_ooxml::LN_EG_RPrBase_outline;
- break;
- case RTFKeyword::SHAD:
- nSprm = NS_ooxml::LN_EG_RPrBase_shadow;
- break;
- case RTFKeyword::V:
- nSprm = NS_ooxml::LN_EG_RPrBase_vanish;
- break;
- case RTFKeyword::STRIKE:
- nSprm = NS_ooxml::LN_EG_RPrBase_strike;
- break;
- case RTFKeyword::STRIKED:
- nSprm = NS_ooxml::LN_EG_RPrBase_dstrike;
- break;
- case RTFKeyword::SCAPS:
- nSprm = NS_ooxml::LN_EG_RPrBase_smallCaps;
- break;
- case RTFKeyword::IMPR:
- nSprm = NS_ooxml::LN_EG_RPrBase_imprint;
- break;
- case RTFKeyword::CAPS:
- nSprm = NS_ooxml::LN_EG_RPrBase_caps;
- break;
- default:
- break;
- }
- if (nSprm >= 0)
- {
- if (m_aStates.top().getDestination() == Destination::LISTLEVEL)
- {
- m_aStates.top().getTableSprms().set(nSprm, pBoolValue);
- }
- else
- {
- m_aStates.top().getCharacterSprms().set(nSprm, pBoolValue);
- }
- return RTFError::OK;
- }
-
- switch (nKeyword)
- {
- case RTFKeyword::ASPALPHA:
- m_aStates.top().getParagraphSprms().set(NS_ooxml::LN_CT_PPrBase_autoSpaceDE,
- pBoolValue);
- break;
- case RTFKeyword::DELETED:
- case RTFKeyword::REVISED:
- {
- auto pValue
- = new RTFValue(nKeyword == RTFKeyword::DELETED ? oox::XML_del : oox::XML_ins);
- putNestedAttribute(m_aStates.top().getCharacterSprms(), NS_ooxml::LN_trackchange,
- NS_ooxml::LN_token, pValue);
- }
- break;
- case RTFKeyword::SBAUTO:
- putNestedAttribute(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_spacing,
- NS_ooxml::LN_CT_Spacing_beforeAutospacing, pBoolValue);
- break;
- case RTFKeyword::SAAUTO:
- putNestedAttribute(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_spacing,
- NS_ooxml::LN_CT_Spacing_afterAutospacing, pBoolValue);
- break;
- case RTFKeyword::FACINGP:
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Settings_evenAndOddHeaders, pBoolValue);
- break;
- case RTFKeyword::HYPHAUTO:
- m_aSettingsTableSprms.set(NS_ooxml::LN_CT_Settings_autoHyphenation, pBoolValue);
- break;
- case RTFKeyword::HYPHPAR:
- m_aStates.top().getParagraphSprms().set(NS_ooxml::LN_CT_PPrBase_suppressAutoHyphens,
- new RTFValue(int(bParam && nParam == 0)));
- break;
- default:
- {
- SAL_INFO("writerfilter.rtf",
- "TODO handle toggle '" << keywordToString(nKeyword) << "'");
- aSkip.setParsed(false);
- }
- break;
- }
- return RTFError::OK;
-}
-
-RTFError RTFDocumentImpl::pushState()
-{
- //SAL_INFO("writerfilter.rtf", __func__ << " before push: " << m_pTokenizer->getGroup());
-
- checkUnicode(/*bUnicode =*/true, /*bHex =*/true);
- m_nGroupStartPos = Strm().Tell();
-
- if (m_aStates.empty())
- m_aStates.push(m_aDefaultState);
- else
- {
- // fdo#85812 group resets run type of _current_ and new state (but not RTL)
- if (m_aStates.top().getRunType() != RTFParserState::RunType::LTRCH_RTLCH_2
- && m_aStates.top().getRunType() != RTFParserState::RunType::RTLCH_LTRCH_2)
- {
- m_aStates.top().setRunType(RTFParserState::RunType::NONE);
- }
-
- if (m_aStates.top().getDestination() == Destination::MR)
- lcl_DestinationToMath(m_aStates.top().getCurrentDestinationText(), m_aMathBuffer,
- m_bMathNor);
- m_aStates.push(m_aStates.top());
- }
- m_aStates.top().getDestinationText().setLength(0); // was copied: always reset!
-
- m_pTokenizer->pushGroup();
-
- switch (m_aStates.top().getDestination())
- {
- case Destination::FONTTABLE:
- // this is a "faked" destination for the font entry
- m_aStates.top().setCurrentDestinationText(&m_aStates.top().getDestinationText());
- m_aStates.top().setDestination(Destination::FONTENTRY);
- break;
- case Destination::STYLESHEET:
- // this is a "faked" destination for the style sheet entry
- m_aStates.top().setCurrentDestinationText(&m_aStates.top().getDestinationText());
- m_aStates.top().setDestination(Destination::STYLEENTRY);
- {
- // the *default* is \s0 i.e. paragraph style default
- // this will be overwritten by \sN \csN \dsN \tsN
- m_nCurrentStyleIndex = 0;
- auto pValue = new RTFValue(NS_ooxml::LN_Value_ST_StyleType_paragraph);
- m_aStates.top().getTableAttributes().set(NS_ooxml::LN_CT_Style_type, pValue);
- }
- break;
- case Destination::FIELDRESULT:
- case Destination::SHAPETEXT:
- case Destination::FORMFIELD:
- //TODO: if this is pushed then the font encoding is used which results in a broken command string
- // if it is not pushed to NORMAL then it is not restored in time.
- case Destination::FIELDINSTRUCTION:
- case Destination::PICT:
- m_aStates.top().setDestination(Destination::NORMAL);
- break;
- case Destination::MNUM:
- case Destination::MDEN:
- case Destination::ME:
- case Destination::MFNAME:
- case Destination::MLIM:
- case Destination::MSUB:
- case Destination::MSUP:
- case Destination::MDEG:
- case Destination::MOMATH:
- m_aStates.top().setDestination(Destination::MR);
- break;
- case Destination::REVISIONTABLE:
- // this is a "faked" destination for the revision table entry
- m_aStates.top().setCurrentDestinationText(&m_aStates.top().getDestinationText());
- m_aStates.top().setDestination(Destination::REVISIONENTRY);
- break;
- default:
- break;
- }
-
- // If this is true, then ooxml:endtrackchange will be generated. Make sure
- // we don't generate more ooxml:endtrackchange than ooxml:trackchange: new
- // state does not inherit this flag.
- m_aStates.top().setStartedTrackchange(false);
-
- return RTFError::OK;
-}
-
-writerfilter::Reference<Properties>::Pointer_t RTFDocumentImpl::createStyleProperties()
-{
- int nBasedOn = 0;
- RTFValue::Pointer_t pBasedOn
- = m_aStates.top().getTableSprms().find(NS_ooxml::LN_CT_Style_basedOn);
- if (pBasedOn)
- nBasedOn = pBasedOn->getInt();
- if (nBasedOn == 0)
- {
- // No parent style, then mimic what Word does: ignore attributes which
- // would set a margin as formatting, but with a default value.
- for (const auto& nId :
- { NS_ooxml::LN_CT_Ind_firstLine, NS_ooxml::LN_CT_Ind_left, NS_ooxml::LN_CT_Ind_right,
- NS_ooxml::LN_CT_Ind_start, NS_ooxml::LN_CT_Ind_end })
- {
- RTFValue::Pointer_t pValue = getNestedAttribute(m_aStates.top().getParagraphSprms(),
- NS_ooxml::LN_CT_PPrBase_ind, nId);
- if (pValue && pValue->getInt() == 0)
- eraseNestedAttribute(m_aStates.top().getParagraphSprms(),
- NS_ooxml::LN_CT_PPrBase_ind, nId);
- }
- }
-
- RTFValue::Pointer_t pParaProps = new RTFValue(m_aStates.top().getParagraphAttributes(),
- m_aStates.top().getParagraphSprms());
- RTFValue::Pointer_t pCharProps = new RTFValue(m_aStates.top().getCharacterAttributes(),
- m_aStates.top().getCharacterSprms());
-
- // resetSprms will clean up this modification
- m_aStates.top().getTableSprms().set(NS_ooxml::LN_CT_Style_pPr, pParaProps);
- m_aStates.top().getTableSprms().set(NS_ooxml::LN_CT_Style_rPr, pCharProps);
-
- writerfilter::Reference<Properties>::Pointer_t pProps(new RTFReferenceProperties(
- m_aStates.top().getTableAttributes(), m_aStates.top().getTableSprms()));
- return pProps;
-}
-
-/** 2 different representations of the styles are needed:
-
- 1) flat content, as read from the input file:
- stored in m_pStyleTableEntries, used as reference input for
- deduplication both here and for hard formatting in getProperties()
-
- 2) real content, with proper override of sprms/attributes where it differs
- from parent style; this is produced here and sent to domain mapper
- */
-RTFReferenceTable::Entries_t RTFDocumentImpl::deduplicateStyleTable()
-{
- RTFReferenceTable::Entries_t ret;
- for (auto const& it : *m_pStyleTableEntries)
- {
- auto pStyle = it.second;
- ret[it.first] = pStyle;
- // ugly downcasts here, but can't easily replace the members with
- // RTFReferenceProperties because dmapper wants SvRef<Properties> anyway
- RTFValue::Pointer_t const pBasedOn(
- static_cast<RTFReferenceProperties&>(*pStyle).getSprms().find(
- NS_ooxml::LN_CT_Style_basedOn));
- if (pBasedOn)
- {
- int const nBasedOn(pBasedOn->getInt());
- // don't deduplicate yourself - especially a potential problem for the default style.
- if (it.first == nBasedOn)
- continue;
-
- auto const itParent(m_pStyleTableEntries->find(nBasedOn)); // definition as read!
- if (itParent != m_pStyleTableEntries->end())
- {
- auto const pStyleType(
- static_cast<RTFReferenceProperties&>(*pStyle).getAttributes().find(
- NS_ooxml::LN_CT_Style_type));
- assert(pStyleType);
- int const nStyleType(pStyleType->getInt());
- RTFSprms sprms(
- static_cast<RTFReferenceProperties&>(*pStyle).getSprms().cloneAndDeduplicate(
- static_cast<RTFReferenceProperties&>(*itParent->second).getSprms(),
- nStyleType));
- RTFSprms attributes(
- static_cast<RTFReferenceProperties&>(*pStyle)
- .getAttributes()
- .cloneAndDeduplicate(
- static_cast<RTFReferenceProperties&>(*itParent->second).getAttributes(),
- nStyleType));
-
- ret[it.first] = new RTFReferenceProperties(std::move(attributes), std::move(sprms));
- }
- else
- {
- SAL_WARN("writerfilter.rtf", "parent style not found: " << nBasedOn);
- }
- }
- }
- assert(ret.size() == m_pStyleTableEntries->size());
- return ret;
-}
-
-void RTFDocumentImpl::resetSprms()
-{
- m_aStates.top().getTableSprms().clear();
- m_aStates.top().getCharacterSprms().clear();
- m_aStates.top().getParagraphSprms().clear();
-}
-
-void RTFDocumentImpl::resetAttributes()
-{
- m_aStates.top().getTableAttributes().clear();
- m_aStates.top().getCharacterAttributes().clear();
- m_aStates.top().getParagraphAttributes().clear();
-}
-
-static bool lcl_containsProperty(const uno::Sequence<beans::Property>& rProperties,
- std::u16string_view rName)
-{
- return std::any_of(rProperties.begin(), rProperties.end(),
- [&](const beans::Property& rProperty) { return rProperty.Name == rName; });
-}
-
-RTFError RTFDocumentImpl::beforePopState(RTFParserState& rState)
-{
- switch (rState.getDestination())
- {
- //Note: in fonttbl there may or may not be groups, so process it as no groups
- case Destination::FONTTABLE:
- case Destination::FONTENTRY:
- {
- // Some text unhandled? Seems it is last font name
- if (m_aStates.top().getCurrentDestinationText()->getLength())
- handleFontTableEntry();
-
- if (rState.getDestination() == Destination::FONTTABLE)
- {
- writerfilter::Reference<Table>::Pointer_t const pTable(
- new RTFReferenceTable(m_aFontTableEntries));
- Mapper().table(NS_ooxml::LN_FONTTABLE, pTable);
- if (m_nDefaultFontIndex >= 0)
- {
- auto pValue = new RTFValue(m_aFontNames[getFontIndex(m_nDefaultFontIndex)]);
- putNestedAttribute(m_aDefaultState.getCharacterSprms(),
- NS_ooxml::LN_EG_RPrBase_rFonts, NS_ooxml::LN_CT_Fonts_ascii,
- pValue);
- }
- }
- }
- break;
- case Destination::STYLESHEET:
- {
- RTFReferenceTable::Entries_t pStyleTableDeduplicated(deduplicateStyleTable());
- writerfilter::Reference<Table>::Pointer_t const pTable(
- new RTFReferenceTable(std::move(pStyleTableDeduplicated)));
- Mapper().table(NS_ooxml::LN_STYLESHEET, pTable);
- }
- break;
- case Destination::LISTOVERRIDETABLE:
- {
- RTFSprms aListTableAttributes;
- writerfilter::Reference<Properties>::Pointer_t pProp
- = new RTFReferenceProperties(std::move(aListTableAttributes), m_aListTableSprms);
- RTFReferenceTable::Entries_t aListTableEntries;
- aListTableEntries.insert(std::make_pair(0, pProp));
- writerfilter::Reference<Table>::Pointer_t const pTable(
- new RTFReferenceTable(std::move(aListTableEntries)));
- Mapper().table(NS_ooxml::LN_NUMBERING, pTable);
- }
- break;
- case Destination::LISTENTRY:
- for (const auto& rListLevelEntry : rState.getListLevelEntries())
- rState.getTableSprms().set(rListLevelEntry.first, rListLevelEntry.second,
- RTFOverwrite::NO_APPEND);
- break;
- case Destination::FIELDINSTRUCTION:
- {
- auto pValue = new RTFValue(m_aFormfieldAttributes, m_aFormfieldSprms);
- RTFSprms aFFAttributes;
- RTFSprms aFFSprms;
- aFFSprms.set(NS_ooxml::LN_ffdata, pValue);
- if (!m_aStates.top().getCurrentBuffer())
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties
- = new RTFReferenceProperties(std::move(aFFAttributes), std::move(aFFSprms));
- Mapper().props(pProperties);
- }
- else
- {
- auto pFFValue = new RTFValue(aFFAttributes, aFFSprms);
- bufferProperties(*m_aStates.top().getCurrentBuffer(), pFFValue, nullptr);
- }
- m_aFormfieldAttributes.clear();
- m_aFormfieldSprms.clear();
-
- if (m_aStates.top().isFieldLocked())
- singleChar(cFieldLock);
- singleChar(cFieldSep, true);
- }
- break;
- case Destination::FIELDRESULT:
- singleChar(cFieldEnd);
-
- if (!m_aPicturePath.isEmpty())
- {
- // Read the picture into m_aStates.top().aDestinationText.
- pushState();
- dispatchDestination(RTFKeyword::PICT);
- if (m_aPicturePath.endsWith(".png"))
- dispatchFlag(RTFKeyword::PNGBLIP);
- OUString aFileURL = m_rMediaDescriptor.getUnpackedValueOrDefault(
- utl::MediaDescriptor::PROP_URL, OUString());
- OUString aPictureURL;
- try
- {
- aPictureURL = rtl::Uri::convertRelToAbs(aFileURL, m_aPicturePath);
- }
- catch (const rtl::MalformedUriException& rException)
- {
- SAL_WARN("writerfilter.rtf",
- "rtl::Uri::convertRelToAbs() failed: " << rException.getMessage());
- }
-
- if (!aPictureURL.isEmpty())
- {
- SvFileStream aStream(aPictureURL, StreamMode::READ);
- if (aStream.IsOpen())
- {
- OUStringBuffer aBuf;
- while (aStream.good())
- {
- unsigned char ch = 0;
- aStream.ReadUChar(ch);
- if (ch < 16)
- aBuf.append("0");
- aBuf.append(static_cast<sal_Int32>(ch), 16);
- }
- m_aStates.top().getDestinationText() = aBuf;
- }
- }
- popState();
- m_aPicturePath.clear();
- }
-
- break;
- case Destination::LEVELTEXT:
- {
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- OUString aStr = m_aStates.top().getCurrentDestinationText()->makeStringAndClear();
-
- // The first character is the length of the string (the rest should be ignored).
- sal_Int32 nLength(aStr.toChar());
- OUString aValue;
- if (nLength < aStr.getLength())
- aValue = aStr.copy(1, nLength);
- else
- aValue = aStr;
- auto pValue = new RTFValue(aValue, true);
- rState.getTableAttributes().set(NS_ooxml::LN_CT_LevelText_val, pValue);
- }
- break;
- case Destination::LEVELNUMBERS:
- {
- bool bNestedLevelNumbers = false;
- if (m_aStates.size() > 1)
- // Current destination is levelnumbers and parent destination is levelnumbers as well.
- bNestedLevelNumbers
- = m_aStates[m_aStates.size() - 2].getDestination() == Destination::LEVELNUMBERS;
- if (!bNestedLevelNumbers && rState.getTableSprms().find(NS_ooxml::LN_CT_Lvl_lvlText))
- {
- RTFSprms& rAttributes
- = rState.getTableSprms().find(NS_ooxml::LN_CT_Lvl_lvlText)->getAttributes();
- RTFValue::Pointer_t pValue = rAttributes.find(NS_ooxml::LN_CT_LevelText_val);
- if (pValue && rState.getLevelNumbersValid())
- {
- OUString aOrig = pValue->getString();
-
- OUStringBuffer aBuf(aOrig.getLength() * 2);
- sal_Int32 nReplaces = 1;
- for (int i = 0; i < aOrig.getLength(); i++)
- {
- if (std::find(rState.getLevelNumbers().begin(),
- rState.getLevelNumbers().end(), i + 1)
- != rState.getLevelNumbers().end())
- {
- aBuf.append('%');
- // '1.1.1' -> '%1.%2.%3', but '1.' (with '2.' prefix omitted) is %2.
- aBuf.append(sal_Int32(nReplaces++ + rState.getListLevelNum() + 1
- - rState.getLevelNumbers().size()));
- }
- else
- aBuf.append(aOrig[i]);
- }
-
- pValue->setString(aBuf.makeStringAndClear());
- }
- else if (pValue)
- // Have a value, but levelnumbers is not valid -> ignore it.
- pValue->setString(OUString());
- }
- break;
- }
- case Destination::SHAPEPROPERTYNAME:
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- rState.getShape().getProperties().emplace_back(
- m_aStates.top().getCurrentDestinationText()->makeStringAndClear(), OUString());
- break;
- case Destination::SHAPEPROPERTYVALUE:
- if (!rState.getShape().getProperties().empty())
- {
- rState.getShape().getProperties().back().second
- = m_aStates.top().getCurrentDestinationText()->makeStringAndClear();
- if (m_aStates.top().getHadShapeText())
- m_pSdrImport->append(rState.getShape().getProperties().back().first,
- rState.getShape().getProperties().back().second);
- else if (rState.getInShapeGroup() && !rState.getInShape()
- && rState.getShape().getProperties().back().first == "rotation")
- {
- // Rotation should be applied on the groupshape itself, not on each shape.
- rState.getShape().getGroupProperties().push_back(
- rState.getShape().getProperties().back());
- rState.getShape().getProperties().pop_back();
- }
- }
- break;
- case Destination::PICPROP:
- case Destination::SHAPEINSTRUCTION:
- if (m_aStates.size() > 1
- && m_aStates[m_aStates.size() - 2].getDestination()
- == Destination::SHAPEINSTRUCTION)
- {
- // Do not resolve shape if shape instruction destination is inside other shape instruction
- }
- else if (!m_bObject && !rState.getInListpicture() && !rState.getHadShapeText()
- && (!rState.getInShapeGroup() || rState.getInShape()))
- {
- // Don't trigger a shape import in case we're only leaving the \shpinst of the groupshape itself.
- RTFSdrImport::ShapeOrPict eType
- = (rState.getDestination() == Destination::SHAPEINSTRUCTION)
- ? RTFSdrImport::SHAPE
- : RTFSdrImport::PICT;
- if (!m_aStates.top().getCurrentBuffer() || eType != RTFSdrImport::SHAPE)
- m_pSdrImport->resolve(m_aStates.top().getShape(), true, eType);
- else
- {
- // Shape inside table: buffer the import to have correct anchor position.
- // Also buffer the RTFPicture of the state stack as it contains
- // the shape size.
- auto pPictureValue = new RTFValue(m_aStates.top().getPicture());
- m_aStates.top().getCurrentBuffer()->emplace_back(BUFFER_PICTURE, pPictureValue,
- nullptr);
- auto pValue = new RTFValue(m_aStates.top().getShape());
-
- // Buffer wrap type.
- for (const auto& rCharacterSprm : m_aStates.top().getCharacterSprms())
- {
- if (rCharacterSprm.first == NS_ooxml::LN_EG_WrapType_wrapNone
- || rCharacterSprm.first == NS_ooxml::LN_EG_WrapType_wrapTight)
- {
- m_aStates.top().getShape().getWrapSprm() = rCharacterSprm;
- break;
- }
- }
-
- m_aStates.top().getCurrentBuffer()->emplace_back(BUFFER_RESOLVESHAPE, pValue,
- nullptr);
- }
- }
- else if (rState.getInShapeGroup() && !rState.getInShape())
- {
- // End of a groupshape, as we're in shapegroup, but not in a real shape.
- for (const auto& rGroupProperty : rState.getShape().getGroupProperties())
- m_pSdrImport->appendGroupProperty(rGroupProperty.first, rGroupProperty.second);
- rState.getShape().getGroupProperties().clear();
- }
- break;
- case Destination::BOOKMARKSTART:
- {
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- OUString aStr = m_aStates.top().getCurrentDestinationText()->makeStringAndClear();
- int nPos = m_aBookmarks.size();
- m_aBookmarks[aStr] = nPos;
- if (!m_aStates.top().getCurrentBuffer())
- Mapper().props(new RTFReferenceProperties(lcl_getBookmarkProperties(nPos, aStr)));
- else
- bufferProperties(*m_aStates.top().getCurrentBuffer(),
- new RTFValue(lcl_getBookmarkProperties(nPos, aStr)), nullptr);
- }
- break;
- case Destination::BOOKMARKEND:
- {
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- OUString aStr = m_aStates.top().getCurrentDestinationText()->makeStringAndClear();
- if (!m_aStates.top().getCurrentBuffer())
- Mapper().props(new RTFReferenceProperties(
- lcl_getBookmarkProperties(m_aBookmarks[aStr], aStr)));
- else
- bufferProperties(*m_aStates.top().getCurrentBuffer(),
- new RTFValue(lcl_getBookmarkProperties(m_aBookmarks[aStr], aStr)),
- nullptr);
- }
- break;
- case Destination::INDEXENTRY:
- case Destination::TOCENTRY:
- {
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- OUString str(m_aStates.top().getCurrentDestinationText()->makeStringAndClear());
- // dmapper expects this as a field, so let's fake something...
- auto const field((Destination::INDEXENTRY == rState.getDestination())
- ? std::u16string_view(u"XE")
- : std::u16string_view(u"TC"));
- str = OUString::Concat(field) + " \"" + str.replaceAll("\"", "\\\"") + "\"";
- singleChar(cFieldStart);
- Mapper().utext(str.getStr(), str.getLength());
- singleChar(cFieldSep, true);
- // no result
- singleChar(cFieldEnd);
- }
- break;
- case Destination::FORMFIELDNAME:
- {
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- auto pValue
- = new RTFValue(m_aStates.top().getCurrentDestinationText()->makeStringAndClear());
- m_aFormfieldSprms.set(NS_ooxml::LN_CT_FFData_name, pValue);
- }
- break;
- case Destination::FORMFIELDLIST:
- {
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- auto pValue
- = new RTFValue(m_aStates.top().getCurrentDestinationText()->makeStringAndClear());
- // OOXML puts these into a LN_CT_FFData_ddList but FFDataHandler should handle this too
- m_aFormfieldSprms.set(NS_ooxml::LN_CT_FFDDList_listEntry, pValue,
- RTFOverwrite::NO_APPEND);
- }
- break;
- case Destination::DATAFIELD:
- {
- if (m_bFormField)
- {
- OUStringBuffer* pCurrentDestinationText
- = m_aStates.top().getCurrentDestinationText();
- if (&m_aStates.top().getDestinationText() != pCurrentDestinationText)
- break; // not for nested group
- OString aStr
- = OUStringToOString(*pCurrentDestinationText, rState.getCurrentEncoding());
- pCurrentDestinationText->setLength(0);
- // decode hex dump
- OStringBuffer aBuf;
- int b = 0;
- int count = 2;
- for (int i = 0; i < aStr.getLength(); ++i)
- {
- char ch = aStr[i];
- if (ch != 0x0d && ch != 0x0a)
- {
- b = b << 4;
- sal_Int8 parsed = msfilter::rtfutil::AsHex(ch);
- if (parsed == -1)
- return RTFError::HEX_INVALID;
- b += parsed;
- count--;
- if (!count)
- {
- aBuf.append(static_cast<char>(b));
- count = 2;
- b = 0;
- }
- }
- }
- aStr = aBuf.makeStringAndClear();
-
- // ignore the first bytes
- if (aStr.getLength() > 8)
- aStr = aStr.copy(8);
- // extract name
- sal_Int32 nLength = aStr.toChar();
- if (!aStr.isEmpty())
- aStr = aStr.copy(1);
- nLength = std::min(nLength, aStr.getLength());
- OString aName = aStr.copy(0, nLength);
- if (aStr.getLength() > nLength)
- aStr = aStr.copy(nLength + 1); // zero-terminated string
- else
- aStr.clear();
- // extract default text
- nLength = aStr.toChar();
- if (!aStr.isEmpty())
- aStr = aStr.copy(1);
- auto pNValue = new RTFValue(OStringToOUString(aName, rState.getCurrentEncoding()));
- m_aFormfieldSprms.set(NS_ooxml::LN_CT_FFData_name, pNValue);
- if (nLength > 0)
- {
- OString aDefaultText = aStr.copy(0, std::min(nLength, aStr.getLength()));
- auto pDValue = new RTFValue(
- OStringToOUString(aDefaultText, rState.getCurrentEncoding()));
- m_aFormfieldSprms.set(NS_ooxml::LN_CT_FFTextInput_default, pDValue);
- }
-
- m_bFormField = false;
- }
- }
- break;
- case Destination::CREATIONTIME:
- if (m_xDocumentProperties.is())
- m_xDocumentProperties->setCreationDate(lcl_getDateTime(rState));
- break;
- case Destination::REVISIONTIME:
- if (m_xDocumentProperties.is())
- m_xDocumentProperties->setModificationDate(lcl_getDateTime(rState));
- break;
- case Destination::PRINTTIME:
- if (m_xDocumentProperties.is())
- m_xDocumentProperties->setPrintDate(lcl_getDateTime(rState));
- break;
- case Destination::AUTHOR:
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- if (m_xDocumentProperties.is())
- m_xDocumentProperties->setAuthor(
- m_aStates.top().getCurrentDestinationText()->makeStringAndClear());
- break;
- case Destination::KEYWORDS:
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- if (m_xDocumentProperties.is())
- {
- OUStringBuffer* pCurrentDestinationText
- = m_aStates.top().getCurrentDestinationText();
- m_xDocumentProperties->setKeywords(
- comphelper::string::convertCommaSeparated(*pCurrentDestinationText));
- pCurrentDestinationText->setLength(0);
- }
- break;
- case Destination::COMMENT:
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- if (m_xDocumentProperties.is())
- m_xDocumentProperties->setGenerator(
- m_aStates.top().getCurrentDestinationText()->makeStringAndClear());
- break;
- case Destination::SUBJECT:
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- if (m_xDocumentProperties.is())
- m_xDocumentProperties->setSubject(
- m_aStates.top().getCurrentDestinationText()->makeStringAndClear());
- break;
- case Destination::TITLE:
- {
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- if (m_xDocumentProperties.is())
- m_xDocumentProperties->setTitle(
- rState.getCurrentDestinationText()->makeStringAndClear());
- }
- break;
-
- case Destination::DOCCOMM:
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- if (m_xDocumentProperties.is())
- m_xDocumentProperties->setDescription(
- m_aStates.top().getCurrentDestinationText()->makeStringAndClear());
- break;
- case Destination::OPERATOR:
- case Destination::COMPANY:
- {
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- OUString aName = rState.getDestination() == Destination::OPERATOR ? OUString("Operator")
- : OUString("Company");
- uno::Any aValue(m_aStates.top().getCurrentDestinationText()->makeStringAndClear());
- if (m_xDocumentProperties.is())
- {
- uno::Reference<beans::XPropertyContainer> xUserDefinedProperties
- = m_xDocumentProperties->getUserDefinedProperties();
- uno::Reference<beans::XPropertySet> xPropertySet(xUserDefinedProperties,
- uno::UNO_QUERY);
- uno::Reference<beans::XPropertySetInfo> xPropertySetInfo
- = xPropertySet->getPropertySetInfo();
- if (xPropertySetInfo->hasPropertyByName(aName))
- xPropertySet->setPropertyValue(aName, aValue);
- else
- xUserDefinedProperties->addProperty(aName, beans::PropertyAttribute::REMOVABLE,
- aValue);
- }
- }
- break;
- case Destination::OBJDATA:
- {
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
-
- RTFError eError = handleEmbeddedObject();
- if (eError != RTFError::OK)
- return eError;
- }
- break;
- case Destination::OBJCLASS:
- {
- auto pValue
- = new RTFValue(m_aStates.top().getCurrentDestinationText()->makeStringAndClear());
- m_aOLEAttributes.set(NS_ooxml::LN_CT_OLEObject_ProgID, pValue);
- break;
- }
- case Destination::OBJECT:
- {
- if (!m_bObject)
- {
- // if the object is in a special container we will use the \result
- // element instead of the \objdata
- // (see RTFKeyword::OBJECT in RTFDocumentImpl::dispatchDestination)
- break;
- }
-
- RTFSprms aObjectSprms;
- auto pOLEValue = new RTFValue(m_aOLEAttributes);
- aObjectSprms.set(NS_ooxml::LN_OLEObject_OLEObject, pOLEValue);
-
- RTFSprms aObjAttributes;
- RTFSprms aObjSprms;
- auto pValue = new RTFValue(m_aObjectAttributes, aObjectSprms);
- aObjSprms.set(NS_ooxml::LN_object, pValue);
- writerfilter::Reference<Properties>::Pointer_t pProperties
- = new RTFReferenceProperties(std::move(aObjAttributes), std::move(aObjSprms));
- uno::Reference<drawing::XShape> xShape;
- RTFValue::Pointer_t pShape = m_aObjectAttributes.find(NS_ooxml::LN_shape);
- OSL_ASSERT(pShape);
- if (pShape)
- pShape->getAny() >>= xShape;
- if (xShape.is())
- {
- Mapper().startShape(xShape);
- Mapper().props(pProperties);
- Mapper().endShape();
- }
- m_aObjectAttributes.clear();
- m_aOLEAttributes.clear();
- m_bObject = false;
- }
- break;
- case Destination::ANNOTATIONDATE:
- {
- OUStringBuffer* pCurrentDestinationText = m_aStates.top().getCurrentDestinationText();
- if (&m_aStates.top().getDestinationText() != pCurrentDestinationText)
- break; // not for nested group
- OUString aStr(OStringToOUString(DTTM22OString(o3tl::toInt32(*pCurrentDestinationText)),
- rState.getCurrentEncoding()));
- pCurrentDestinationText->setLength(0);
- auto pValue = new RTFValue(aStr);
- RTFSprms aAnnAttributes;
- aAnnAttributes.set(NS_ooxml::LN_CT_TrackChange_date, pValue);
- writerfilter::Reference<Properties>::Pointer_t pProperties
- = new RTFReferenceProperties(std::move(aAnnAttributes));
- Mapper().props(pProperties);
- }
- break;
- case Destination::ANNOTATIONAUTHOR:
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- m_aAuthor = m_aStates.top().getCurrentDestinationText()->makeStringAndClear();
- break;
- case Destination::ATNID:
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- m_aAuthorInitials = m_aStates.top().getCurrentDestinationText()->makeStringAndClear();
- break;
- case Destination::ANNOTATIONREFERENCESTART:
- case Destination::ANNOTATIONREFERENCEEND:
- {
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- OUString aStr = m_aStates.top().getCurrentDestinationText()->makeStringAndClear();
- auto pValue = new RTFValue(aStr.toInt32());
- RTFSprms aAttributes;
- if (rState.getDestination() == Destination::ANNOTATIONREFERENCESTART)
- aAttributes.set(NS_ooxml::LN_EG_RangeMarkupElements_commentRangeStart, pValue);
- else
- aAttributes.set(NS_ooxml::LN_EG_RangeMarkupElements_commentRangeEnd, pValue);
- if (!m_aStates.top().getCurrentBuffer())
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties
- = new RTFReferenceProperties(std::move(aAttributes));
- Mapper().props(pProperties);
- }
- else
- {
- auto const pValue2 = new RTFValue(aAttributes, RTFSprms());
- bufferProperties(*m_aStates.top().getCurrentBuffer(), pValue2, nullptr);
- }
- }
- break;
- case Destination::ANNOTATIONREFERENCE:
- {
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- OUString aStr = m_aStates.top().getCurrentDestinationText()->makeStringAndClear();
- RTFSprms aAnnAttributes;
- aAnnAttributes.set(NS_ooxml::LN_CT_Markup_id, new RTFValue(aStr.toInt32()));
- Mapper().props(new RTFReferenceProperties(std::move(aAnnAttributes)));
- }
- break;
- case Destination::FALT:
- {
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- OUString aStr(m_aStates.top().getCurrentDestinationText()->makeStringAndClear());
- auto pValue = new RTFValue(aStr);
- rState.getTableSprms().set(NS_ooxml::LN_CT_Font_altName, pValue);
- }
- break;
- case Destination::DRAWINGOBJECT:
- if (m_aStates.top().getDrawingObject().getShape().is())
- {
- RTFDrawingObject& rDrawing = m_aStates.top().getDrawingObject();
- const uno::Reference<drawing::XShape>& xShape(rDrawing.getShape());
- const uno::Reference<beans::XPropertySet>& xPropertySet(rDrawing.getPropertySet());
-
- uno::Reference<lang::XServiceInfo> xServiceInfo(xShape, uno::UNO_QUERY);
- bool bTextFrame = xServiceInfo->supportsService("com.sun.star.text.TextFrame");
-
- // The default is certainly not inline, but then what Word supports is just at-character.
- xPropertySet->setPropertyValue("AnchorType",
- uno::Any(text::TextContentAnchorType_AT_CHARACTER));
-
- if (bTextFrame)
- {
- xPropertySet->setPropertyValue("HoriOrientPosition",
- uno::Any(rDrawing.getLeft()));
- xPropertySet->setPropertyValue("VertOrientPosition",
- uno::Any(rDrawing.getTop()));
- }
- else
- {
- xShape->setPosition(awt::Point(rDrawing.getLeft(), rDrawing.getTop()));
- }
- xShape->setSize(awt::Size(rDrawing.getRight(), rDrawing.getBottom()));
-
- if (rDrawing.getHasLineColor())
- {
- uno::Any aLineColor(sal_uInt32((rDrawing.getLineColorR() << 16)
- + (rDrawing.getLineColorG() << 8)
- + rDrawing.getLineColorB()));
- uno::Any aLineWidth;
- RTFSdrImport::resolveLineColorAndWidth(bTextFrame, xPropertySet, aLineColor,
- aLineWidth);
- }
- if (rDrawing.getHasFillColor())
- xPropertySet->setPropertyValue(
- "FillColor", uno::Any(sal_uInt32((rDrawing.getFillColorR() << 16)
- + (rDrawing.getFillColorG() << 8)
- + rDrawing.getFillColorB())));
- else if (!bTextFrame)
- // If there is no fill, the Word default is 100% transparency.
- xPropertySet->setPropertyValue("FillTransparence", uno::Any(sal_Int32(100)));
-
- RTFSdrImport::resolveFLine(xPropertySet, rDrawing.getFLine());
-
- if (!m_aStates.top().getDrawingObject().getHadShapeText())
- {
- Mapper().startShape(xShape);
- }
- Mapper().endShape();
- }
- break;
- case Destination::PICT:
- // fdo#79319 ignore picture data if it's really a shape
- if (!m_pSdrImport->isFakePict())
- {
- resolvePict(true, m_pSdrImport->getCurrentShape());
- }
- m_bNeedFinalPar = true;
- break;
- case Destination::SHAPE:
- m_bNeedFinalPar = true;
- m_bNeedCr = m_bNeedCrOrig;
- // tdf#47036 insert paragraph break for graphic object inside text
- // frame at start of document - TODO: the object may actually be
- // anchored inside the text frame and this ends up putting the
- // anchor in the body, but better than losing the shape...
- if (rState.getFrame().hasProperties() && m_pSdrImport->isTextGraphicObject())
- {
- // parBreak() modifies m_aStates.top() so we can't apply resetFrame() directly on aState
- resetFrame();
- parBreak();
- // Save this state for later use, so we only reset frame status only for the first shape inside a frame.
- rState = m_aStates.top();
- m_bNeedPap = true;
- }
- break;
- case Destination::MOMATH:
- {
- m_aMathBuffer.appendClosingTag(M_TOKEN(oMath));
-
- SvGlobalName aGlobalName(SO3_SM_CLASSID);
- comphelper::EmbeddedObjectContainer aContainer;
- OUString aName;
- uno::Reference<embed::XEmbeddedObject> xObject
- = aContainer.CreateEmbeddedObject(aGlobalName.GetByteSequence(), aName);
- if (xObject) // rhbz#1766990 starmath might not be available
- {
- uno::Reference<util::XCloseable> xComponent(xObject->getComponent(),
- uno::UNO_SET_THROW);
- if (oox::FormulaImExportBase* pImport
- = dynamic_cast<oox::FormulaImExportBase*>(xComponent.get()))
- pImport->readFormulaOoxml(m_aMathBuffer);
-
- auto pValue = new RTFValue(xObject);
- RTFSprms aMathAttributes;
- aMathAttributes.set(NS_ooxml::LN_starmath, pValue);
- writerfilter::Reference<Properties>::Pointer_t pProperties
- = new RTFReferenceProperties(std::move(aMathAttributes));
- Mapper().props(pProperties);
- }
-
- m_aMathBuffer = oox::formulaimport::XmlStreamBuilder();
- }
- break;
- case Destination::MR:
- lcl_DestinationToMath(m_aStates.top().getCurrentDestinationText(), m_aMathBuffer,
- m_bMathNor);
- break;
- case Destination::MF:
- m_aMathBuffer.appendClosingTag(M_TOKEN(f));
- break;
- case Destination::MFPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(fPr));
- break;
- case Destination::MCTRLPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(ctrlPr));
- break;
- case Destination::MNUM:
- m_aMathBuffer.appendClosingTag(M_TOKEN(num));
- break;
- case Destination::MDEN:
- m_aMathBuffer.appendClosingTag(M_TOKEN(den));
- break;
- case Destination::MACC:
- m_aMathBuffer.appendClosingTag(M_TOKEN(acc));
- break;
- case Destination::MACCPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(accPr));
- break;
- case Destination::MCHR:
- case Destination::MPOS:
- case Destination::MVERTJC:
- case Destination::MSTRIKEH:
- case Destination::MDEGHIDE:
- case Destination::MBEGCHR:
- case Destination::MSEPCHR:
- case Destination::MENDCHR:
- case Destination::MSUBHIDE:
- case Destination::MSUPHIDE:
- case Destination::MTYPE:
- case Destination::MGROW:
- {
- sal_Int32 nMathToken = 0;
- switch (rState.getDestination())
- {
- case Destination::MCHR:
- nMathToken = M_TOKEN(chr);
- break;
- case Destination::MPOS:
- nMathToken = M_TOKEN(pos);
- break;
- case Destination::MVERTJC:
- nMathToken = M_TOKEN(vertJc);
- break;
- case Destination::MSTRIKEH:
- nMathToken = M_TOKEN(strikeH);
- break;
- case Destination::MDEGHIDE:
- nMathToken = M_TOKEN(degHide);
- break;
- case Destination::MBEGCHR:
- nMathToken = M_TOKEN(begChr);
- break;
- case Destination::MSEPCHR:
- nMathToken = M_TOKEN(sepChr);
- break;
- case Destination::MENDCHR:
- nMathToken = M_TOKEN(endChr);
- break;
- case Destination::MSUBHIDE:
- nMathToken = M_TOKEN(subHide);
- break;
- case Destination::MSUPHIDE:
- nMathToken = M_TOKEN(supHide);
- break;
- case Destination::MTYPE:
- nMathToken = M_TOKEN(type);
- break;
- case Destination::MGROW:
- nMathToken = M_TOKEN(grow);
- break;
- default:
- break;
- }
-
- oox::formulaimport::XmlStream::AttributeList aAttribs;
- aAttribs[M_TOKEN(val)]
- = m_aStates.top().getCurrentDestinationText()->makeStringAndClear();
- m_aMathBuffer.appendOpeningTag(nMathToken, aAttribs);
- m_aMathBuffer.appendClosingTag(nMathToken);
- }
- break;
- case Destination::ME:
- m_aMathBuffer.appendClosingTag(M_TOKEN(e));
- break;
- case Destination::MBAR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(bar));
- break;
- case Destination::MBARPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(barPr));
- break;
- case Destination::MD:
- m_aMathBuffer.appendClosingTag(M_TOKEN(d));
- break;
- case Destination::MDPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(dPr));
- break;
- case Destination::MFUNC:
- m_aMathBuffer.appendClosingTag(M_TOKEN(func));
- break;
- case Destination::MFUNCPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(funcPr));
- break;
- case Destination::MFNAME:
- m_aMathBuffer.appendClosingTag(M_TOKEN(fName));
- break;
- case Destination::MLIMLOW:
- m_aMathBuffer.appendClosingTag(M_TOKEN(limLow));
- break;
- case Destination::MLIMLOWPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(limLowPr));
- break;
- case Destination::MLIM:
- m_aMathBuffer.appendClosingTag(M_TOKEN(lim));
- break;
- case Destination::MM:
- m_aMathBuffer.appendClosingTag(M_TOKEN(m));
- break;
- case Destination::MMPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(mPr));
- break;
- case Destination::MMR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(mr));
- break;
- case Destination::MNARY:
- m_aMathBuffer.appendClosingTag(M_TOKEN(nary));
- break;
- case Destination::MNARYPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(naryPr));
- break;
- case Destination::MSUB:
- m_aMathBuffer.appendClosingTag(M_TOKEN(sub));
- break;
- case Destination::MSUP:
- m_aMathBuffer.appendClosingTag(M_TOKEN(sup));
- break;
- case Destination::MLIMUPP:
- m_aMathBuffer.appendClosingTag(M_TOKEN(limUpp));
- break;
- case Destination::MLIMUPPPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(limUppPr));
- break;
- case Destination::MGROUPCHR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(groupChr));
- break;
- case Destination::MGROUPCHRPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(groupChrPr));
- break;
- case Destination::MBORDERBOX:
- m_aMathBuffer.appendClosingTag(M_TOKEN(borderBox));
- break;
- case Destination::MBORDERBOXPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(borderBoxPr));
- break;
- case Destination::MRAD:
- m_aMathBuffer.appendClosingTag(M_TOKEN(rad));
- break;
- case Destination::MRADPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(radPr));
- break;
- case Destination::MDEG:
- m_aMathBuffer.appendClosingTag(M_TOKEN(deg));
- break;
- case Destination::MSSUB:
- m_aMathBuffer.appendClosingTag(M_TOKEN(sSub));
- break;
- case Destination::MSSUBPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(sSubPr));
- break;
- case Destination::MSSUP:
- m_aMathBuffer.appendClosingTag(M_TOKEN(sSup));
- break;
- case Destination::MSSUPPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(sSupPr));
- break;
- case Destination::MSSUBSUP:
- m_aMathBuffer.appendClosingTag(M_TOKEN(sSubSup));
- break;
- case Destination::MSSUBSUPPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(sSubSupPr));
- break;
- case Destination::MSPRE:
- m_aMathBuffer.appendClosingTag(M_TOKEN(sPre));
- break;
- case Destination::MSPREPR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(sPrePr));
- break;
- case Destination::MBOX:
- m_aMathBuffer.appendClosingTag(M_TOKEN(box));
- break;
- case Destination::MEQARR:
- m_aMathBuffer.appendClosingTag(M_TOKEN(eqArr));
- break;
- case Destination::SHAPEGROUP:
- if (rState.getCreatedShapeGroup())
- m_pSdrImport->popParent();
- break;
- case Destination::PROPNAME:
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- rState.setPropName(m_aStates.top().getCurrentDestinationText()->makeStringAndClear());
- break;
- case Destination::STATICVAL:
- if (&m_aStates.top().getDestinationText()
- != m_aStates.top().getCurrentDestinationText())
- break; // not for nested group
- if (m_xDocumentProperties.is())
- {
- // Find out what is the key, value type and value we want to set.
- uno::Reference<beans::XPropertyContainer> xPropertyContainer
- = m_xDocumentProperties->getUserDefinedProperties();
- const OUString& rKey = m_aStates.top().getPropName();
- OUString aStaticVal
- = m_aStates.top().getCurrentDestinationText()->makeStringAndClear();
- uno::Any aAny;
- if (m_aStates.top().getPropType() == cppu::UnoType<OUString>::get())
- aAny <<= aStaticVal;
- else if (m_aStates.top().getPropType() == cppu::UnoType<sal_Int32>::get())
- aAny <<= aStaticVal.toInt32();
- else if (m_aStates.top().getPropType() == cppu::UnoType<bool>::get())
- aAny <<= aStaticVal.toBoolean();
- else if (m_aStates.top().getPropType() == cppu::UnoType<util::DateTime>::get())
- aAny <<= getDateTimeFromUserProp(aStaticVal);
- else if (m_aStates.top().getPropType() == cppu::UnoType<double>::get())
- aAny <<= aStaticVal.toDouble();
-
- xPropertyContainer->addProperty(rKey, beans::PropertyAttribute::REMOVABLE, aAny);
- }
- break;
- case Destination::USERPROPS:
- {
- // These are the imported properties.
- uno::Reference<document::XDocumentProperties> xDocumentProperties
- = m_xDocumentProperties;
-
- // These are the real document properties.
- uno::Reference<document::XDocumentPropertiesSupplier> xDocumentPropertiesSupplier(
- m_xDstDoc, uno::UNO_QUERY);
- if (xDocumentPropertiesSupplier.is())
- m_xDocumentProperties = xDocumentPropertiesSupplier->getDocumentProperties();
-
- if (m_xDocumentProperties.is())
- {
- if (!m_bIsNewDoc)
- {
- // Check classification.
- if (!SfxClassificationHelper::ShowPasteInfo(SfxClassificationHelper::CheckPaste(
- xDocumentProperties, m_xDocumentProperties)))
- return RTFError::CLASSIFICATION;
- }
-
- uno::Reference<beans::XPropertyContainer> xClipboardPropertyContainer
- = xDocumentProperties->getUserDefinedProperties();
- uno::Reference<beans::XPropertyContainer> xDocumentPropertyContainer
- = m_xDocumentProperties->getUserDefinedProperties();
- uno::Reference<beans::XPropertySet> xClipboardPropertySet(
- xClipboardPropertyContainer, uno::UNO_QUERY);
- uno::Reference<beans::XPropertySet> xDocumentPropertySet(xDocumentPropertyContainer,
- uno::UNO_QUERY);
- const uno::Sequence<beans::Property> aClipboardProperties
- = xClipboardPropertySet->getPropertySetInfo()->getProperties();
- uno::Sequence<beans::Property> aDocumentProperties
- = xDocumentPropertySet->getPropertySetInfo()->getProperties();
-
- for (const beans::Property& rProperty : aClipboardProperties)
- {
- const OUString& rKey = rProperty.Name;
- uno::Any aValue = xClipboardPropertySet->getPropertyValue(rKey);
-
- try
- {
- if (lcl_containsProperty(aDocumentProperties, rKey))
- {
- // When pasting, don't update existing properties.
- if (!m_bIsNewDoc)
- xDocumentPropertySet->setPropertyValue(rKey, aValue);
- }
- else
- xDocumentPropertyContainer->addProperty(
- rKey, beans::PropertyAttribute::REMOVABLE, aValue);
- }
- catch (const uno::Exception&)
- {
- TOOLS_WARN_EXCEPTION("writerfilter.rtf", "failed to set property " << rKey);
- }
- }
- }
- }
- break;
- default:
- break;
- }
-
- return RTFError::OK;
-}
-
-void RTFDocumentImpl::afterPopState(RTFParserState& rState)
-{
- // list table
- switch (rState.getDestination())
- {
- case Destination::LISTENTRY:
- {
- auto pValue = new RTFValue(rState.getTableAttributes(), rState.getTableSprms());
- m_aListTableSprms.set(NS_ooxml::LN_CT_Numbering_abstractNum, pValue,
- RTFOverwrite::NO_APPEND);
- m_aListTable[rState.getCurrentListIndex()] = pValue;
- m_nListLevel = -1;
- m_aInvalidListTableFirstIndents[rState.getCurrentListIndex()]
- = m_aInvalidListLevelFirstIndents;
- m_aInvalidListLevelFirstIndents.clear();
- }
- break;
- case Destination::PARAGRAPHNUMBERING:
- {
- RTFValue::Pointer_t pIdValue
- = rState.getTableAttributes().find(NS_ooxml::LN_CT_AbstractNum_nsid);
- if (pIdValue && !m_aStates.empty())
- {
- // Abstract numbering
- RTFSprms aLeveltextAttributes;
- OUString aTextValue;
- RTFValue::Pointer_t pTextBefore
- = rState.getTableAttributes().find(NS_ooxml::LN_CT_LevelText_val);
- if (pTextBefore)
- aTextValue += pTextBefore->getString();
- aTextValue += "%1";
- RTFValue::Pointer_t pTextAfter
- = rState.getTableAttributes().find(NS_ooxml::LN_CT_LevelSuffix_val);
- if (pTextAfter)
- aTextValue += pTextAfter->getString();
- auto pTextValue = new RTFValue(aTextValue);
- aLeveltextAttributes.set(NS_ooxml::LN_CT_LevelText_val, pTextValue);
-
- RTFSprms aLevelAttributes;
- RTFSprms aLevelSprms;
- auto pIlvlValue = new RTFValue(0);
- aLevelAttributes.set(NS_ooxml::LN_CT_Lvl_ilvl, pIlvlValue);
-
- RTFValue::Pointer_t pFmtValue
- = rState.getTableSprms().find(NS_ooxml::LN_CT_Lvl_numFmt);
- if (pFmtValue)
- aLevelSprms.set(NS_ooxml::LN_CT_Lvl_numFmt, pFmtValue);
-
- RTFValue::Pointer_t pStartatValue
- = rState.getTableSprms().find(NS_ooxml::LN_CT_Lvl_start);
- if (pStartatValue)
- aLevelSprms.set(NS_ooxml::LN_CT_Lvl_start, pStartatValue);
-
- auto pLeveltextValue = new RTFValue(aLeveltextAttributes);
- aLevelSprms.set(NS_ooxml::LN_CT_Lvl_lvlText, pLeveltextValue);
- RTFValue::Pointer_t pRunProps
- = rState.getTableSprms().find(NS_ooxml::LN_CT_Lvl_rPr);
- if (pRunProps)
- aLevelSprms.set(NS_ooxml::LN_CT_Lvl_rPr, pRunProps);
-
- RTFSprms aAbstractAttributes;
- RTFSprms aAbstractSprms;
- aAbstractAttributes.set(NS_ooxml::LN_CT_AbstractNum_abstractNumId, pIdValue);
- auto pLevelValue = new RTFValue(aLevelAttributes, aLevelSprms);
- aAbstractSprms.set(NS_ooxml::LN_CT_AbstractNum_lvl, pLevelValue,
- RTFOverwrite::NO_APPEND);
-
- RTFSprms aListTableSprms;
- auto pAbstractValue = new RTFValue(aAbstractAttributes, aAbstractSprms);
- // It's important that Numbering_abstractNum and Numbering_num never overwrites previous values.
- aListTableSprms.set(NS_ooxml::LN_CT_Numbering_abstractNum, pAbstractValue,
- RTFOverwrite::NO_APPEND);
-
- // Numbering
- RTFSprms aNumberingAttributes;
- RTFSprms aNumberingSprms;
- aNumberingAttributes.set(NS_ooxml::LN_CT_AbstractNum_nsid, pIdValue);
- aNumberingSprms.set(NS_ooxml::LN_CT_Num_abstractNumId, pIdValue);
- auto pNumberingValue = new RTFValue(aNumberingAttributes, aNumberingSprms);
- aListTableSprms.set(NS_ooxml::LN_CT_Numbering_num, pNumberingValue,
- RTFOverwrite::NO_APPEND);
-
- // Table
- RTFSprms aListTableAttributes;
- writerfilter::Reference<Properties>::Pointer_t pProp = new RTFReferenceProperties(
- std::move(aListTableAttributes), std::move(aListTableSprms));
-
- RTFReferenceTable::Entries_t aListTableEntries;
- aListTableEntries.insert(std::make_pair(0, pProp));
- writerfilter::Reference<Table>::Pointer_t const pTable(
- new RTFReferenceTable(std::move(aListTableEntries)));
- Mapper().table(NS_ooxml::LN_NUMBERING, pTable);
-
- // Use it
- putNestedSprm(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_numPr,
- NS_ooxml::LN_CT_NumPr_ilvl, pIlvlValue, RTFOverwrite::YES_PREPEND);
- putNestedSprm(m_aStates.top().getParagraphSprms(), NS_ooxml::LN_CT_PPrBase_numPr,
- NS_ooxml::LN_CT_NumPr_numId, pIdValue, RTFOverwrite::YES_PREPEND);
- }
- }
- break;
- case Destination::PARAGRAPHNUMBERING_TEXTAFTER:
- if (!m_aStates.empty())
- {
- // FIXME: don't use pDestinationText, points to popped state
- auto pValue = new RTFValue(rState.getDestinationText().makeStringAndClear(), true);
- m_aStates.top().getTableAttributes().set(NS_ooxml::LN_CT_LevelSuffix_val, pValue);
- }
- break;
- case Destination::PARAGRAPHNUMBERING_TEXTBEFORE:
- if (!m_aStates.empty())
- {
- // FIXME: don't use pDestinationText, points to popped state
- auto pValue = new RTFValue(rState.getDestinationText().makeStringAndClear(), true);
- m_aStates.top().getTableAttributes().set(NS_ooxml::LN_CT_LevelText_val, pValue);
- }
- break;
- case Destination::LISTNAME:
- break;
- case Destination::LISTLEVEL:
- if (!m_aStates.empty())
- {
- auto pInnerValue = new RTFValue(m_aStates.top().getListLevelNum()++);
- rState.getTableAttributes().set(NS_ooxml::LN_CT_Lvl_ilvl, pInnerValue);
-
- auto pValue = new RTFValue(rState.getTableAttributes(), rState.getTableSprms());
- if (m_aStates.top().getDestination() != Destination::LFOLEVEL)
- m_aStates.top().getListLevelEntries().set(NS_ooxml::LN_CT_AbstractNum_lvl,
- pValue, RTFOverwrite::NO_APPEND);
- else
- m_aStates.top().getTableSprms().set(NS_ooxml::LN_CT_NumLvl_lvl, pValue);
- }
- break;
- case Destination::LFOLEVEL:
- if (!m_aStates.empty())
- {
- auto pInnerValue = new RTFValue(m_aStates.top().getListLevelNum()++);
- rState.getTableAttributes().set(NS_ooxml::LN_CT_NumLvl_ilvl, pInnerValue);
-
- auto pValue = new RTFValue(rState.getTableAttributes(), rState.getTableSprms());
- m_aStates.top().getTableSprms().set(NS_ooxml::LN_CT_Num_lvlOverride, pValue,
- RTFOverwrite::NO_APPEND);
- }
- break;
- // list override table
- case Destination::LISTOVERRIDEENTRY:
- if (!m_aStates.empty())
- {
- if (m_aStates.top().getDestination() == Destination::LISTOVERRIDEENTRY)
- {
- // copy properties upwards so upper popState() inserts it
- m_aStates.top().getTableAttributes() = rState.getTableAttributes();
- m_aStates.top().getTableSprms() = rState.getTableSprms();
- }
- else
- {
- auto pValue = new RTFValue(rState.getTableAttributes(), rState.getTableSprms());
- m_aListTableSprms.set(NS_ooxml::LN_CT_Numbering_num, pValue,
- RTFOverwrite::NO_APPEND);
- m_aListOverrideTable[rState.getCurrentListOverrideIndex()]
- = rState.getCurrentListIndex();
- }
- }
- break;
- case Destination::LEVELTEXT:
- if (!m_aStates.empty())
- {
- auto pValue = new RTFValue(rState.getTableAttributes());
- m_aStates.top().getTableSprms().set(NS_ooxml::LN_CT_Lvl_lvlText, pValue);
- }
- break;
- case Destination::LEVELNUMBERS:
- if (!m_aStates.empty())
- {
- m_aStates.top().getTableSprms() = rState.getTableSprms();
- if (m_aStates.top().getDestination() == Destination::LEVELNUMBERS
- || m_aStates.top().getDestination() == Destination::LISTLEVEL)
- // Parent state is level number or list level, current state is
- // level numbers: mark parent as invalid as well if necessary.
- m_aStates.top().setLevelNumbersValid(rState.getLevelNumbersValid());
- }
- break;
- case Destination::FIELDINSTRUCTION:
- if (!m_aStates.empty())
- m_aStates.top().setFieldStatus(RTFFieldStatus::INSTRUCTION);
- break;
- case Destination::FIELDRESULT:
- if (!m_aStates.empty())
- m_aStates.top().setFieldStatus(RTFFieldStatus::RESULT);
- break;
- case Destination::FIELD:
- if (rState.getFieldStatus() == RTFFieldStatus::INSTRUCTION)
- singleChar(cFieldEnd);
- break;
- case Destination::DOCVAR:
- if (!m_aStates.empty())
- {
- OUString docvar(rState.getDocVar());
- if (m_aStates.top().getDocVarName().isEmpty())
- {
- m_aStates.top().setDocVarName(docvar);
- }
- else
- {
- uno::Reference<beans::XPropertySet> xMaster(
- m_xModelFactory->createInstance("com.sun.star.text.FieldMaster.User"),
- uno::UNO_QUERY_THROW);
- xMaster->setPropertyValue("Name", uno::Any(m_aStates.top().getDocVarName()));
- uno::Reference<text::XDependentTextField> xField(
- m_xModelFactory->createInstance("com.sun.star.text.TextField.User"),
- uno::UNO_QUERY);
- xField->attachTextFieldMaster(xMaster);
- xField->getTextFieldMaster()->setPropertyValue("Content", uno::Any(docvar));
-
- m_aStates.top().clearDocVarName();
- }
- }
- break;
- case Destination::SHAPEPROPERTYVALUEPICT:
- if (!m_aStates.empty())
- {
- m_aStates.top().getPicture() = rState.getPicture();
- // both \sp and \sv are destinations, copy the text up-ward for later
- m_aStates.top().getDestinationText() = rState.getDestinationText();
- }
- break;
- case Destination::FALT:
- if (!m_aStates.empty())
- m_aStates.top().getTableSprms() = rState.getTableSprms();
- break;
- case Destination::SHAPEPROPERTYNAME:
- case Destination::SHAPEPROPERTYVALUE:
- case Destination::SHAPEPROPERTY:
- if (!m_aStates.empty())
- {
- m_aStates.top().getShape() = rState.getShape();
- m_aStates.top().getPicture() = rState.getPicture();
- m_aStates.top().getCharacterAttributes() = rState.getCharacterAttributes();
- }
- break;
- case Destination::SHAPEINSTRUCTION:
- if (!m_aStates.empty()
- && m_aStates.top().getDestination() == Destination::SHAPEINSTRUCTION)
- {
- // Shape instruction inside other shape instruction: just copy new shape settings:
- // it will be resolved on end of topmost shape instruction destination
- m_aStates.top().getShape() = rState.getShape();
- m_aStates.top().getPicture() = rState.getPicture();
- m_aStates.top().getCharacterSprms() = rState.getCharacterSprms();
- m_aStates.top().getCharacterAttributes() = rState.getCharacterAttributes();
- }
- break;
- case Destination::FLYMAINCONTENT:
- case Destination::SHPPICT:
- case Destination::SHAPE:
- if (!m_aStates.empty())
- {
- m_aStates.top().getFrame() = rState.getFrame();
- if (rState.getDestination() == Destination::SHPPICT
- && m_aStates.top().getDestination() == Destination::LISTPICTURE)
- {
- RTFSprms aAttributes;
- aAttributes.set(NS_ooxml::LN_CT_NumPicBullet_numPicBulletId,
- new RTFValue(m_nListPictureId++));
- RTFSprms aSprms;
- // Dummy value, real picture is already sent to dmapper.
- aSprms.set(NS_ooxml::LN_CT_NumPicBullet_pict, new RTFValue(0));
- auto pValue = new RTFValue(aAttributes, aSprms);
- m_aListTableSprms.set(NS_ooxml::LN_CT_Numbering_numPicBullet, pValue,
- RTFOverwrite::NO_APPEND);
- }
- }
- break;
- case Destination::SHAPETEXT:
- if (!m_aStates.empty())
- {
- // If we're leaving the shapetext group (it may have nested ones) and this is a shape, not an old drawingobject.
- if (m_aStates.top().getDestination() != Destination::SHAPETEXT
- && !m_aStates.top().getDrawingObject().getHadShapeText())
- {
- m_aStates.top().setHadShapeText(true);
- if (!m_aStates.top().getCurrentBuffer())
- m_pSdrImport->close();
- else
- m_aStates.top().getCurrentBuffer()->emplace_back(BUFFER_ENDSHAPE, nullptr,
- nullptr);
- }
-
- // It's allowed to declare these inside the shape text, and they
- // are expected to have an effect for the whole shape.
- if (rState.getDrawingObject().getLeft())
- m_aStates.top().getDrawingObject().setLeft(rState.getDrawingObject().getLeft());
- if (rState.getDrawingObject().getTop())
- m_aStates.top().getDrawingObject().setTop(rState.getDrawingObject().getTop());
- if (rState.getDrawingObject().getRight())
- m_aStates.top().getDrawingObject().setRight(
- rState.getDrawingObject().getRight());
- if (rState.getDrawingObject().getBottom())
- m_aStates.top().getDrawingObject().setBottom(
- rState.getDrawingObject().getBottom());
- }
- break;
- case Destination::PROPNAME:
- if (m_aStates.top().getDestination() == Destination::USERPROPS)
- m_aStates.top().setPropName(rState.getPropName());
- break;
- default:
- {
- if (!m_aStates.empty() && m_aStates.top().getDestination() == Destination::PICT)
- m_aStates.top().getPicture() = rState.getPicture();
- }
- break;
- }
-}
-
-RTFError RTFDocumentImpl::popState()
-{
- //SAL_INFO("writerfilter", __func__ << " before pop: m_pTokenizer->getGroup() " << m_pTokenizer->getGroup() <<
- // ", dest state: " << m_aStates.top().eDestination);
-
- checkUnicode(/*bUnicode =*/true, /*bHex =*/true);
- RTFParserState aState(m_aStates.top());
- m_bWasInFrame = aState.getFrame().hasProperties();
-
- // dmapper expects some content in header/footer, so if there would be nothing, add an empty paragraph.
- if (m_pTokenizer->getGroup() == 1 && m_bFirstRun)
- {
- switch (m_nStreamType)
- {
- case NS_ooxml::LN_headerl:
- case NS_ooxml::LN_headerr:
- case NS_ooxml::LN_headerf:
- case NS_ooxml::LN_footerl:
- case NS_ooxml::LN_footerr:
- case NS_ooxml::LN_footerf:
- dispatchSymbol(RTFKeyword::PAR);
- break;
- }
- }
-
- RTFError eError = beforePopState(aState);
- if (eError != RTFError::OK)
- return eError;
-
- // See if we need to end a track change
- if (aState.getStartedTrackchange())
- {
- RTFSprms aTCSprms;
- auto pValue = new RTFValue(0);
- aTCSprms.set(NS_ooxml::LN_endtrackchange, pValue);
- if (!m_aStates.top().getCurrentBuffer())
- Mapper().props(new RTFReferenceProperties(RTFSprms(), std::move(aTCSprms)));
- else
- bufferProperties(*m_aStates.top().getCurrentBuffer(),
- new RTFValue(RTFSprms(), aTCSprms), nullptr);
- }
-
- // This is the end of the doc, see if we need to close the last section.
- if (m_pTokenizer->getGroup() == 1 && !m_bFirstRun)
- {
- // \par means an empty paragraph at the end of footnotes/endnotes, but
- // not in case of other substreams, like headers.
- if (m_bNeedCr && m_nStreamType != NS_ooxml::LN_footnote
- && m_nStreamType != NS_ooxml::LN_endnote)
- {
- if (!m_bIsNewDoc)
- {
- // Make sure all the paragraph settings are set, but do not add next paragraph
- Mapper().markLastParagraph();
- }
- dispatchSymbol(RTFKeyword::PAR);
- }
- if (m_bNeedSect) // may be set by dispatchSymbol above!
- sectBreak(true);
- else if (!m_pSuperstream)
- {
- Mapper().markLastSectionGroup(); // ensure it's set for \par below
- }
- if (m_bNeedPar && !m_pSuperstream)
- {
- assert(!m_bNeedSect);
- dispatchSymbol(RTFKeyword::PAR);
- m_bNeedSect = false; // reset - m_bNeedPar was set for \sect at
- // end of doc so don't need another one
- }
- }
-
- m_aStates.pop();
-
- m_pTokenizer->popGroup();
-
- afterPopState(aState);
-
- if (aState.getCurrentBuffer() == &m_aSuperBuffer)
- {
- OSL_ASSERT(!m_aStates.empty() && m_aStates.top().getCurrentBuffer() == nullptr);
-
- if (!m_aSuperBuffer.empty())
- replayBuffer(m_aSuperBuffer, nullptr, nullptr);
- }
-
- if (!m_aStates.empty() && m_aStates.top().getTableRowWidthAfter() > 0
- && aState.getTableRowWidthAfter() == 0)
- // An RTFKeyword::ROW in the inner group already parsed nTableRowWidthAfter,
- // don't do it again in the outer state later.
- m_aStates.top().setTableRowWidthAfter(0);
-
- if (m_nResetBreakOnSectBreak != RTFKeyword::invalid && !m_aStates.empty())
- {
- // Section break type created for \page still has an effect in the
- // outer state as well.
- RTFValue::Pointer_t pType
- = aState.getSectionSprms().find(NS_ooxml::LN_EG_SectPrContents_type);
- if (pType)
- m_aStates.top().getSectionSprms().set(NS_ooxml::LN_EG_SectPrContents_type, pType);
- }
-
- return RTFError::OK;
-}
-
-RTFError RTFDocumentImpl::handleEmbeddedObject()
-{
- OUStringBuffer* pCurrentDestinationText = m_aStates.top().getCurrentDestinationText();
- OString aStr = OUStringToOString(*pCurrentDestinationText, RTL_TEXTENCODING_ASCII_US);
- pCurrentDestinationText->setLength(0);
- std::unique_ptr<SvStream> pStream(new SvMemoryStream());
- if (!msfilter::rtfutil::ExtractOLE2FromObjdata(aStr, *pStream))
- return RTFError::HEX_INVALID;
-
- uno::Reference<io::XInputStream> xInputStream(
- new utl::OSeekableInputStreamWrapper(pStream.release(), /*_bOwner=*/true));
- m_aOLEAttributes.set(NS_ooxml::LN_inputstream, new RTFValue(xInputStream));
-
- return RTFError::OK;
-}
-
-bool RTFDocumentImpl::isInBackground() { return m_aStates.top().getInBackground(); }
-
-RTFInternalState RTFDocumentImpl::getInternalState() { return m_aStates.top().getInternalState(); }
-
-void RTFDocumentImpl::setInternalState(RTFInternalState nInternalState)
-{
- m_aStates.top().setInternalState(nInternalState);
-}
-
-Destination RTFDocumentImpl::getDestination() { return m_aStates.top().getDestination(); }
-
-void RTFDocumentImpl::setDestination(Destination eDestination)
-{
- m_aStates.top().setDestination(eDestination);
-}
-
-// this is a questionably named method that is used only in a very special
-// situation where it looks like the "current" buffer is needed?
-void RTFDocumentImpl::setDestinationText(std::u16string_view rString)
-{
- m_aStates.top().getDestinationText().setLength(0);
- m_aStates.top().getDestinationText().append(rString);
-}
-
-bool RTFDocumentImpl::getSkipUnknown() { return m_bSkipUnknown; }
-
-void RTFDocumentImpl::setSkipUnknown(bool bSkipUnknown) { m_bSkipUnknown = bSkipUnknown; }
-
-static auto FilterControlChars(Destination const destination, OUString const& rString) -> OUString
-{
- if (destination == Destination::LEVELNUMBERS || destination == Destination::LEVELTEXT)
- { // control characters are magic here!
- return rString;
- }
- OUStringBuffer buf(rString.getLength());
- for (sal_Int32 i = 0; i < rString.getLength(); ++i)
- {
- sal_Unicode const ch(rString[i]);
- if (!linguistic::IsControlChar(ch) || ch == '\r' || ch == '\n' || ch == '\t')
- {
- buf.append(ch);
- }
- else
- {
- SAL_INFO("writerfilter.rtf", "filtering control character");
- }
- }
- return buf.makeStringAndClear();
-}
-
-void RTFDocumentImpl::checkUnicode(bool bUnicode, bool bHex)
-{
- if (bUnicode && !m_aUnicodeBuffer.isEmpty())
- {
- OUString aString = m_aUnicodeBuffer.toString();
- m_aUnicodeBuffer.setLength(0);
- aString = FilterControlChars(m_aStates.top().getDestination(), aString);
- text(aString);
- }
- if (bHex && !m_aHexBuffer.isEmpty())
- {
- rtl_TextEncoding nEncoding = m_aStates.top().getCurrentEncoding();
- if (nEncoding == RTL_TEXTENCODING_SYMBOL
- && (m_aStates.top().getDestination() == Destination::FONTENTRY
- || (m_aStates.size() > 1
- && m_aStates[m_aStates.size() - 2].getDestination()
- == Destination::FIELDINSTRUCTION)))
- nEncoding = RTL_TEXTENCODING_MS_1252;
- OUString aString = OStringToOUString(m_aHexBuffer, nEncoding);
- m_aHexBuffer.setLength(0);
- aString = FilterControlChars(m_aStates.top().getDestination(), aString);
- text(aString);
- }
-}
-
-RTFParserState::RTFParserState(RTFDocumentImpl* pDocumentImpl)
- : m_pDocumentImpl(pDocumentImpl)
- , m_nInternalState(RTFInternalState::NORMAL)
- , m_eDestination(Destination::NORMAL)
- , m_eFieldStatus(RTFFieldStatus::NONE)
- , m_bFieldLocked(false)
- , m_nBorderState(RTFBorderState::NONE)
- , m_nCurrentEncoding(rtl_getTextEncodingFromWindowsCharset(0))
- , m_nUc(1)
- , m_nCharsToSkip(0)
- , m_nBinaryToRead(0)
- , m_nListLevelNum(0)
- , m_bLevelNumbersValid(true)
- , m_aFrame(this)
- , m_eRunType(RunType::NONE)
- , m_nYear(0)
- , m_nMonth(0)
- , m_nDay(0)
- , m_nHour(0)
- , m_nMinute(0)
- , m_pCurrentDestinationText(nullptr)
- , m_nCurrentStyleIndex(0)
- , m_nCurrentCharacterStyleIndex(-1)
- , m_pCurrentBuffer(nullptr)
- , m_bInListpicture(false)
- , m_bInBackground(false)
- , m_bHadShapeText(false)
- , m_bInShapeGroup(false)
- , m_bInShape(false)
- , m_bCreatedShapeGroup(false)
- , m_bStartedTrackchange(false)
- , m_nTableRowWidthAfter(0)
-{
-}
-
-void RTFDocumentImpl::resetFrame() { m_aStates.top().getFrame() = RTFFrame(&m_aStates.top()); }
-
-void RTFDocumentImpl::bufferProperties(RTFBuffer_t& rBuffer, const RTFValue::Pointer_t& pValue,
- const tools::SvRef<TableRowBuffer>& pTableProperties,
- Id const nStyleType)
-{
- rBuffer.emplace_back(BUFFER_SETSTYLE, new RTFValue(m_aStates.top().getCurrentStyleIndex()),
- nullptr);
- assert(nStyleType == 0 || nStyleType == NS_ooxml::LN_Value_ST_StyleType_character);
- rBuffer.emplace_back(nStyleType == NS_ooxml::LN_Value_ST_StyleType_character ? BUFFER_PROPS_CHAR
- : BUFFER_PROPS,
- pValue, pTableProperties);
-}
-
-RTFShape::RTFShape() = default;
-
-RTFDrawingObject::RTFDrawingObject() = default;
-
-RTFFrame::RTFFrame(RTFParserState* pParserState)
- : m_pDocumentImpl(pParserState->getDocumentImpl())
- , m_nX(0)
- , m_nY(0)
- , m_nW(0)
- , m_nH(0)
- , m_nHoriPadding(0)
- , m_nVertPadding(0)
- , m_nHoriAlign(0)
- , m_nHoriAnchor(0)
- , m_nVertAlign(0)
- , m_nVertAnchor(0)
- , m_nHRule(NS_ooxml::LN_Value_doc_ST_HeightRule_auto)
-{
-}
-
-void RTFFrame::setSprm(Id nId, Id nValue)
-{
- switch (nId)
- {
- case NS_ooxml::LN_CT_FramePr_w:
- m_nW = nValue;
- break;
- case NS_ooxml::LN_CT_FramePr_h:
- m_nH = nValue;
- break;
- case NS_ooxml::LN_CT_FramePr_x:
- m_nX = nValue;
- break;
- case NS_ooxml::LN_CT_FramePr_y:
- m_nY = nValue;
- break;
- case NS_ooxml::LN_CT_FramePr_hSpace:
- m_nHoriPadding = nValue;
- break;
- case NS_ooxml::LN_CT_FramePr_vSpace:
- m_nVertPadding = nValue;
- break;
- case NS_ooxml::LN_CT_FramePr_xAlign:
- m_nHoriAlign = nValue;
- break;
- case NS_ooxml::LN_CT_FramePr_hAnchor:
- m_nHoriAnchor = nValue;
- break;
- case NS_ooxml::LN_CT_FramePr_yAlign:
- m_nVertAlign = nValue;
- break;
- case NS_ooxml::LN_CT_FramePr_vAnchor:
- m_nVertAnchor = nValue;
- break;
- case NS_ooxml::LN_CT_FramePr_wrap:
- m_oWrap = nValue;
- break;
- default:
- break;
- }
-
- if (m_pDocumentImpl->getFirstRun() && !m_pDocumentImpl->isStyleSheetImport() && hasProperties())
- {
- m_pDocumentImpl->checkFirstRun();
- m_pDocumentImpl->setNeedPar(false);
- }
-}
-
-RTFSprms RTFFrame::getSprms()
-{
- RTFSprms sprms;
-
- static const Id pNames[]
- = { NS_ooxml::LN_CT_FramePr_x, NS_ooxml::LN_CT_FramePr_y,
- NS_ooxml::LN_CT_FramePr_hRule, // Make sure nHRule is processed before nH
- NS_ooxml::LN_CT_FramePr_h, NS_ooxml::LN_CT_FramePr_w,
- NS_ooxml::LN_CT_FramePr_hSpace, NS_ooxml::LN_CT_FramePr_vSpace,
- NS_ooxml::LN_CT_FramePr_hAnchor, NS_ooxml::LN_CT_FramePr_vAnchor,
- NS_ooxml::LN_CT_FramePr_xAlign, NS_ooxml::LN_CT_FramePr_yAlign,
- NS_ooxml::LN_CT_FramePr_wrap, NS_ooxml::LN_CT_FramePr_dropCap,
- NS_ooxml::LN_CT_FramePr_lines };
-
- for (Id nId : pNames)
- {
- RTFValue::Pointer_t pValue;
-
- switch (nId)
- {
- case NS_ooxml::LN_CT_FramePr_x:
- if (m_nX != 0)
- pValue = new RTFValue(m_nX);
- break;
- case NS_ooxml::LN_CT_FramePr_y:
- if (m_nY != 0)
- pValue = new RTFValue(m_nY);
- break;
- case NS_ooxml::LN_CT_FramePr_h:
- if (m_nH != 0)
- {
- if (m_nHRule == NS_ooxml::LN_Value_doc_ST_HeightRule_exact)
- pValue = new RTFValue(-m_nH); // The negative value just sets nHRule
- else
- pValue = new RTFValue(m_nH);
- }
- break;
- case NS_ooxml::LN_CT_FramePr_w:
- if (m_nW != 0)
- pValue = new RTFValue(m_nW);
- break;
- case NS_ooxml::LN_CT_FramePr_hSpace:
- if (m_nHoriPadding != 0)
- pValue = new RTFValue(m_nHoriPadding);
- break;
- case NS_ooxml::LN_CT_FramePr_vSpace:
- if (m_nVertPadding != 0)
- pValue = new RTFValue(m_nVertPadding);
- break;
- case NS_ooxml::LN_CT_FramePr_hAnchor:
- {
- if (m_nHoriAnchor == 0)
- m_nHoriAnchor = NS_ooxml::LN_Value_doc_ST_HAnchor_text;
- pValue = new RTFValue(m_nHoriAnchor);
- }
- break;
- case NS_ooxml::LN_CT_FramePr_vAnchor:
- {
- if (m_nVertAnchor == 0)
- m_nVertAnchor = NS_ooxml::LN_Value_doc_ST_VAnchor_margin;
- pValue = new RTFValue(m_nVertAnchor);
- }
- break;
- case NS_ooxml::LN_CT_FramePr_xAlign:
- pValue = new RTFValue(m_nHoriAlign);
- break;
- case NS_ooxml::LN_CT_FramePr_yAlign:
- pValue = new RTFValue(m_nVertAlign);
- break;
- case NS_ooxml::LN_CT_FramePr_hRule:
- {
- if (m_nH < 0)
- m_nHRule = NS_ooxml::LN_Value_doc_ST_HeightRule_exact;
- else if (m_nH > 0)
- m_nHRule = NS_ooxml::LN_Value_doc_ST_HeightRule_atLeast;
- pValue = new RTFValue(m_nHRule);
- }
- break;
- case NS_ooxml::LN_CT_FramePr_wrap:
- if (m_oWrap)
- pValue = new RTFValue(*m_oWrap);
- break;
- default:
- break;
- }
-
- if (pValue)
- sprms.set(nId, pValue);
- }
-
- RTFSprms frameprSprms;
- frameprSprms.set(NS_ooxml::LN_CT_PPrBase_framePr, new RTFValue(sprms));
- return frameprSprms;
-}
-
-bool RTFFrame::hasProperties() const
-{
- // tdf#153178 \dxfrtext \dfrmtxtx \dfrmtxty \wrapdefault do *not* create frame
- return m_nX != 0 || m_nY != 0 || m_nW != 0 || m_nH != 0
- || (m_nHoriAlign && m_nHoriAlign != NS_ooxml::LN_Value_doc_ST_XAlign_left)
- || (m_nHoriAnchor && m_nHoriAnchor != NS_ooxml::LN_Value_doc_ST_HAnchor_text)
- || (m_nVertAlign && m_nVertAlign != NS_ooxml::LN_Value_doc_ST_YAlign_inline)
- || (m_nVertAnchor && m_nVertAnchor != NS_ooxml::LN_Value_doc_ST_VAnchor_margin)
- || (m_oWrap && *m_oWrap != NS_ooxml::LN_Value_doc_ST_Wrap_auto);
-}
-
-} // namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
deleted file mode 100644
index f05f7d321cdd..000000000000
--- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
+++ /dev/null
@@ -1,995 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-#include <memory>
-#include <queue>
-#include <tuple>
-#include <vector>
-#include <optional>
-
-#include <com/sun/star/text/WrapTextMode.hpp>
-#include <com/sun/star/io/WrongFormatException.hpp>
-#include <oox/mathml/importutils.hxx>
-#include <rtl/strbuf.hxx>
-#include <rtl/ustrbuf.hxx>
-#include <tools/color.hxx>
-#include <tools/long.hxx>
-
-#include <rtftok/RTFDocument.hxx>
-#include "rtfreferencetable.hxx"
-#include "rtfsprm.hxx"
-#include "rtflistener.hxx"
-
-class SvStream;
-namespace oox
-{
-class GraphicHelper;
-}
-namespace com::sun::star
-{
-namespace beans
-{
-class XPropertySet;
-}
-namespace document
-{
-class XDocumentProperties;
-}
-namespace lang
-{
-class XMultiServiceFactory;
-}
-}
-
-namespace writerfilter::rtftok
-{
-class RTFParserState;
-class RTFDocumentImpl;
-class RTFTokenizer;
-class RTFSdrImport;
-class TableRowBuffer;
-
-enum class RTFBorderState
-{
- NONE,
- PARAGRAPH,
- PARAGRAPH_BOX,
- CELL,
- PAGE,
- CHARACTER
-};
-
-/// Different kind of buffers for table cell contents.
-enum RTFBufferTypes
-{
- BUFFER_SETSTYLE,
- /// Stores properties, should be created only in bufferProperties().
- BUFFER_PROPS,
- BUFFER_PROPS_CHAR,
- BUFFER_NESTROW,
- BUFFER_CELLEND,
- BUFFER_STARTRUN,
- BUFFER_TEXT,
- BUFFER_UTEXT,
- BUFFER_ENDRUN,
- BUFFER_PAR,
- BUFFER_STARTSHAPE,
- /// Imports a shape.
- BUFFER_RESOLVESHAPE,
- BUFFER_ENDSHAPE,
- BUFFER_RESOLVESUBSTREAM,
- /// Restores RTFParserState::aPicture.
- BUFFER_PICTURE
-};
-
-/// Form field types
-enum class RTFFormFieldType
-{
- NONE,
- TEXT,
- CHECKBOX,
- LIST
-};
-
-enum class RTFBmpStyle
-{
- NONE,
- PNG,
- JPEG,
- DIBITMAP
-};
-
-enum class RTFFieldStatus
-{
- NONE,
- INSTRUCTION,
- RESULT
-};
-
-/// A buffer storing dmapper calls.
-using Buf_t = std::tuple<RTFBufferTypes, RTFValue::Pointer_t, tools::SvRef<TableRowBuffer>>;
-using RTFBuffer_t = std::deque<Buf_t>;
-
-/// holds one nested table row
-class TableRowBuffer : public virtual SvRefBase
-{
- RTFBuffer_t m_aBuffer;
- ::std::deque<RTFSprms> m_aCellsSprms;
- ::std::deque<RTFSprms> m_aCellsAttributes;
- int m_nCells;
- writerfilter::Reference<Properties>::Pointer_t m_pParaProperties;
- writerfilter::Reference<Properties>::Pointer_t m_pFrameProperties;
- writerfilter::Reference<Properties>::Pointer_t m_pRowProperties;
-
-public:
- TableRowBuffer(RTFBuffer_t aBuffer, std::deque<RTFSprms> aSprms,
- std::deque<RTFSprms> aAttributes, int const nCells)
- : m_aBuffer(std::move(aBuffer))
- , m_aCellsSprms(std::move(aSprms))
- , m_aCellsAttributes(std::move(aAttributes))
- , m_nCells(nCells)
- {
- }
-
- RTFBuffer_t& GetBuffer() { return m_aBuffer; }
- std::deque<RTFSprms>& GetCellsSprms() { return m_aCellsSprms; }
- std::deque<RTFSprms>& GetCellsAttributes() { return m_aCellsAttributes; }
- int GetCells() const { return m_nCells; }
- writerfilter::Reference<Properties>::Pointer_t& GetParaProperties()
- {
- return m_pParaProperties;
- }
- writerfilter::Reference<Properties>::Pointer_t& GetFrameProperties()
- {
- return m_pFrameProperties;
- }
- writerfilter::Reference<Properties>::Pointer_t& GetRowProperties() { return m_pRowProperties; }
-};
-
-/// An entry in the color table.
-class RTFColorTableEntry
-{
-public:
- void SetRed(sal_uInt8 nRed)
- {
- m_bAuto = false;
- m_nR = nRed;
- }
- void SetGreen(sal_uInt8 nGreen)
- {
- m_bAuto = false;
- m_nG = nGreen;
- }
- void SetBlue(sal_uInt8 nBlue)
- {
- m_bAuto = false;
- m_nB = nBlue;
- }
- Color GetColor() const { return m_bAuto ? COL_AUTO : Color(m_nR, m_nG, m_nB); }
-
-private:
- bool m_bAuto = true;
- sal_uInt8 m_nR = 0;
- sal_uInt8 m_nG = 0;
- sal_uInt8 m_nB = 0;
-};
-
-/// Stores the properties of a shape.
-class RTFShape : public virtual SvRefBase
-{
-public:
- RTFShape();
-
- std::vector<std::pair<OUString, OUString>>& getProperties() { return m_aProperties; }
-
- const std::vector<std::pair<OUString, OUString>>& getProperties() const
- {
- return m_aProperties;
- }
-
- std::vector<std::pair<OUString, OUString>>& getGroupProperties() { return m_aGroupProperties; }
-
- void setLeft(sal_Int32 nLeft) { m_nLeft = nLeft; }
-
- sal_Int32 getLeft() const { return m_nLeft; }
-
- void setTop(sal_Int32 nTop) { m_nTop = nTop; }
-
- sal_Int32 getTop() const { return m_nTop; }
-
- void setRight(sal_Int32 nRight) { m_nRight = nRight; }
-
- sal_Int32 getRight() const { return m_nRight; }
-
- void setBottom(sal_Int32 nBottom) { m_nBottom = nBottom; }
-
- sal_Int32 getBottom() const { return m_nBottom; }
-
- void setZ(sal_Int32 nZ) { m_oZ = nZ; }
-
- bool hasZ() const { return bool(m_oZ); }
-
- sal_Int32 getZ() const { return *m_oZ; }
-
- void setHoriOrientRelation(sal_Int16 nHoriOrientRelation)
- {
- m_nHoriOrientRelation = nHoriOrientRelation;
- }
-
- sal_Int16 getHoriOrientRelation() const { return m_nHoriOrientRelation; }
-
- void setVertOrientRelation(sal_Int16 nVertOrientRelation)
- {
- m_nVertOrientRelation = nVertOrientRelation;
- }
-
- sal_Int16 getVertOrientRelation() const { return m_nVertOrientRelation; }
-
- void setHoriOrientRelationToken(sal_uInt32 nHoriOrientRelationToken)
- {
- m_nHoriOrientRelationToken = nHoriOrientRelationToken;
- }
-
- sal_uInt32 getHoriOrientRelationToken() const { return m_nHoriOrientRelationToken; }
-
- void setVertOrientRelationToken(sal_uInt32 nVertOrientRelationToken)
- {
- m_nVertOrientRelationToken = nVertOrientRelationToken;
- }
-
- sal_uInt32 getVertOrientRelationToken() const { return m_nVertOrientRelationToken; }
-
- void setWrap(css::text::WrapTextMode nWrap) { m_nWrap = nWrap; }
-
- css::text::WrapTextMode getWrap() const { return m_nWrap; }
-
- void setInBackground(bool bInBackground) { m_bInBackground = bInBackground; }
-
- bool getInBackground() const { return m_bInBackground; }
-
- RTFSprms& getWrapPolygonSprms() { return m_aWrapPolygonSprms; }
-
- RTFSprms& getAnchorAttributes() { return m_aAnchorAttributes; }
-
- std::pair<Id, RTFValue::Pointer_t>& getWrapSprm() { return m_aWrapSprm; }
-
-private:
- std::vector<std::pair<OUString, OUString>> m_aProperties; ///< Properties of a single shape.
- std::vector<std::pair<OUString, OUString>>
- m_aGroupProperties; ///< Properties applied on the groupshape.
- sal_Int32 m_nLeft = 0;
- sal_Int32 m_nTop = 0;
- sal_Int32 m_nRight = 0;
- sal_Int32 m_nBottom = 0;
- std::optional<sal_Int32> m_oZ; ///< Z-Order of the shape.
- sal_Int16 m_nHoriOrientRelation
- = 0; ///< Horizontal text::RelOrientation for drawinglayer shapes.
- sal_Int16 m_nVertOrientRelation = 0; ///< Vertical text::RelOrientation for drawinglayer shapes.
- sal_uInt32 m_nHoriOrientRelationToken = 0; ///< Horizontal dmapper token for Writer pictures.
- sal_uInt32 m_nVertOrientRelationToken = 0; ///< Vertical dmapper token for Writer pictures.
- css::text::WrapTextMode m_nWrap = css::text::WrapTextMode::WrapTextMode_MAKE_FIXED_SIZE;
- /// If shape is below text (true) or text is below shape (false).
- bool m_bInBackground = false;
- /// Wrap polygon, written by RTFSdrImport::resolve(), read by RTFDocumentImpl::resolvePict().
- RTFSprms m_aWrapPolygonSprms;
- /// Anchor attributes like wrap distance, written by RTFSdrImport::resolve(), read by RTFDocumentImpl::resolvePict().
- RTFSprms m_aAnchorAttributes;
- /// Wrap type, written by RTFDocumentImpl::popState(), read by RTFDocumentImpl::resolvePict().
- std::pair<Id, RTFValue::Pointer_t> m_aWrapSprm{ 0, nullptr };
-};
-
-/// Stores the properties of a drawing object.
-class RTFDrawingObject : public RTFShape
-{
-public:
- RTFDrawingObject();
-
- void setShape(const css::uno::Reference<css::drawing::XShape>& xShape) { m_xShape = xShape; }
- const css::uno::Reference<css::drawing::XShape>& getShape() const { return m_xShape; }
- void setPropertySet(const css::uno::Reference<css::beans::XPropertySet>& xPropertySet)
- {
- m_xPropertySet = xPropertySet;
- }
- const css::uno::Reference<css::beans::XPropertySet>& getPropertySet() const
- {
- return m_xPropertySet;
- }
- std::vector<css::beans::PropertyValue>& getPendingProperties() { return m_aPendingProperties; }
- void setLineColorR(sal_uInt8 nLineColorR) { m_nLineColorR = nLineColorR; }
- sal_uInt8 getLineColorR() const { return m_nLineColorR; }
- void setLineColorG(sal_uInt8 nLineColorG) { m_nLineColorG = nLineColorG; }
- sal_uInt8 getLineColorG() const { return m_nLineColorG; }
- void setLineColorB(sal_uInt8 nLineColorB) { m_nLineColorB = nLineColorB; }
- sal_uInt8 getLineColorB() const { return m_nLineColorB; }
- void setHasLineColor(bool bHasLineColor) { m_bHasLineColor = bHasLineColor; }
- bool getHasLineColor() const { return m_bHasLineColor; }
- void setFillColorR(sal_uInt8 nFillColorR) { m_nFillColorR = nFillColorR; }
- sal_uInt8 getFillColorR() const { return m_nFillColorR; }
- void setFillColorG(sal_uInt8 nFillColorG) { m_nFillColorG = nFillColorG; }
- sal_uInt8 getFillColorG() const { return m_nFillColorG; }
- void setFillColorB(sal_uInt8 nFillColorB) { m_nFillColorB = nFillColorB; }
- sal_uInt8 getFillColorB() const { return m_nFillColorB; }
- void setHasFillColor(bool bHasFillColor) { m_bHasFillColor = bHasFillColor; }
- bool getHasFillColor() const { return m_bHasFillColor; }
- void setDhgt(sal_Int32 nDhgt) { m_nDhgt = nDhgt; }
- sal_Int32 getDhgt() const { return m_nDhgt; }
- void setFLine(sal_Int32 nFLine) { m_nFLine = nFLine; }
- sal_Int32 getFLine() const { return m_nFLine; }
- void setPolyLineCount(sal_Int32 nPolyLineCount) { m_nPolyLineCount = nPolyLineCount; }
- sal_Int32 getPolyLineCount() const { return m_nPolyLineCount; }
- std::vector<css::awt::Point>& getPolyLinePoints() { return m_aPolyLinePoints; }
- void setHadShapeText(bool bHadShapeText) { m_bHadShapeText = bHadShapeText; }
- bool getHadShapeText() const { return m_bHadShapeText; }
-
-private:
- css::uno::Reference<css::drawing::XShape> m_xShape;
- css::uno::Reference<css::beans::XPropertySet> m_xPropertySet;
- std::vector<css::beans::PropertyValue> m_aPendingProperties;
- sal_uInt8 m_nLineColorR = 0;
- sal_uInt8 m_nLineColorG = 0;
- sal_uInt8 m_nLineColorB = 0;
- bool m_bHasLineColor = false;
- sal_uInt8 m_nFillColorR = 0;
- sal_uInt8 m_nFillColorG = 0;
- sal_uInt8 m_nFillColorB = 0;
- bool m_bHasFillColor = false;
- sal_Int32 m_nDhgt = 0;
- sal_Int32 m_nFLine = -1;
- sal_Int32 m_nPolyLineCount = 0;
- std::vector<css::awt::Point> m_aPolyLinePoints;
- bool m_bHadShapeText = false;
-};
-
-/// Stores the properties of a picture.
-class RTFPicture : public virtual SvRefBase
-{
-public:
- sal_Int32 nWidth = 0;
- sal_Int32 nHeight = 0;
- sal_Int32 nGoalWidth = 0;
- sal_Int32 nGoalHeight = 0;
- sal_uInt16 nScaleX = 100;
- sal_uInt16 nScaleY = 100;
- short nCropT = 0;
- short nCropB = 0;
- short nCropL = 0;
- short nCropR = 0;
- sal_uInt16 eWMetafile = 0;
- RTFBmpStyle eStyle = RTFBmpStyle::NONE;
-};
-
-/// Stores the properties of a frame
-class RTFFrame
-{
-private:
- RTFDocumentImpl* m_pDocumentImpl;
- sal_Int32 m_nX, m_nY, m_nW, m_nH;
- sal_Int32 m_nHoriPadding, m_nVertPadding;
- sal_Int32 m_nHoriAlign, m_nHoriAnchor, m_nVertAlign, m_nVertAnchor;
- Id m_nHRule;
- std::optional<Id> m_oWrap;
-
-public:
- explicit RTFFrame(RTFParserState* pParserState);
-
- /// Convert the stored properties to Sprms
- RTFSprms getSprms();
- /// Store a property
- void setSprm(Id nId, Id nValue);
- /// If we got tokens indicating we're in a frame.
- bool hasProperties() const;
-};
-
-/// State of the parser, which gets saved / restored when changing groups.
-class RTFParserState
-{
-public:
- /// Maps to OOXML's ascii, cs or eastAsia.
- enum class RunType
- {
- NONE,
- LOCH,
- HICH,
- DBCH,
- LTRCH_RTLCH_1,
- LTRCH_RTLCH_2,
- RTLCH_LTRCH_1,
- RTLCH_LTRCH_2
- };
-
- explicit RTFParserState(RTFDocumentImpl* pDocumentImpl);
-
- void appendDestinationText(std::u16string_view rString)
- {
- if (m_pCurrentDestinationText)
- m_pCurrentDestinationText->append(rString);
- }
-
- void setPropName(const OUString& rPropName) { m_aPropName = rPropName; }
- OUString const& getPropName() const { return m_aPropName; }
- void setPropType(const css::uno::Type& rPropType) { m_aPropType = rPropType; }
- css::uno::Type const& getPropType() const { return m_aPropType; }
- void setTableRowWidthAfter(int nTableRowWidthAfter)
- {
- m_nTableRowWidthAfter = nTableRowWidthAfter;
- }
- int getTableRowWidthAfter() const { return m_nTableRowWidthAfter; }
- void setStartedTrackchange(bool bStartedTrackchange)
- {
- m_bStartedTrackchange = bStartedTrackchange;
- }
- bool getStartedTrackchange() const { return m_bStartedTrackchange; }
- void setCreatedShapeGroup(bool bCreatedShapeGroup)
- {
- m_bCreatedShapeGroup = bCreatedShapeGroup;
- }
- bool getCreatedShapeGroup() const { return m_bCreatedShapeGroup; }
- void setInShape(bool bInShape) { m_bInShape = bInShape; }
- bool getInShape() const { return m_bInShape; }
- void setInShapeGroup(bool bInShapeGroup) { m_bInShapeGroup = bInShapeGroup; }
- bool getInShapeGroup() const { return m_bInShapeGroup; }
- void setHadShapeText(bool bHadShapeText) { m_bHadShapeText = bHadShapeText; }
- bool getHadShapeText() const { return m_bHadShapeText; }
- void setInBackground(bool bInBackground) { m_bInBackground = bInBackground; }
- bool getInBackground() const { return m_bInBackground; }
- void setInListpicture(bool bInListpicture) { m_bInListpicture = bInListpicture; }
- bool getInListpicture() const { return m_bInListpicture; }
- void setCurrentBuffer(RTFBuffer_t* pCurrentBuffer) { m_pCurrentBuffer = pCurrentBuffer; }
- RTFBuffer_t* getCurrentBuffer() const { return m_pCurrentBuffer; }
- void setCurrentListOverrideIndex(int nCurrentListOverrideIndex)
- {
- m_nCurrentListOverrideIndex = nCurrentListOverrideIndex;
- }
- int getCurrentListOverrideIndex() const { return m_nCurrentListOverrideIndex; }
- void setCurrentListIndex(int nCurrentListIndex) { m_nCurrentListIndex = nCurrentListIndex; }
- int getCurrentListIndex() const { return m_nCurrentListIndex; }
- void setCurrentCharacterStyleIndex(int nCurrentCharacterStyleIndex)
- {
- m_nCurrentCharacterStyleIndex = nCurrentCharacterStyleIndex;
- }
- int getCurrentCharacterStyleIndex() const { return m_nCurrentCharacterStyleIndex; }
- void setCurrentStyleIndex(int nCurrentStyleIndex) { m_nCurrentStyleIndex = nCurrentStyleIndex; }
- int getCurrentStyleIndex() const { return m_nCurrentStyleIndex; }
- void setCurrentDestinationText(OUStringBuffer* pDestinationText)
- {
- m_pCurrentDestinationText = pDestinationText;
- }
- OUStringBuffer* getCurrentDestinationText() const { return m_pCurrentDestinationText; }
- OUStringBuffer& getDestinationText() { return m_aDestinationText; }
- void setMinute(sal_uInt16 nMinute) { m_nMinute = nMinute; }
- sal_uInt16 getMinute() const { return m_nMinute; }
- void setHour(sal_uInt16 nHour) { m_nHour = nHour; }
- sal_uInt16 getHour() const { return m_nHour; }
- void setDay(sal_uInt16 nDay) { m_nDay = nDay; }
- sal_uInt16 getDay() const { return m_nDay; }
- void setMonth(sal_uInt16 nMonth) { m_nMonth = nMonth; }
- sal_uInt16 getMonth() const { return m_nMonth; }
- void setYear(sal_uInt16 nYear) { m_nYear = nYear; }
- sal_uInt16 getYear() const { return m_nYear; }
- void setRunType(RunType eRunType) { m_eRunType = eRunType; }
- RunType getRunType() const { return m_eRunType; }
- RTFFrame& getFrame() { return m_aFrame; }
- RTFDrawingObject& getDrawingObject() { return m_aDrawingObject; }
- RTFShape& getShape() { return m_aShape; }
- RTFPicture& getPicture() { return m_aPicture; }
- void setLevelNumbersValid(bool bLevelNumbersValid)
- {
- m_bLevelNumbersValid = bLevelNumbersValid;
- }
- bool getLevelNumbersValid() const { return m_bLevelNumbersValid; }
- std::vector<sal_Int32>& getLevelNumbers() { return m_aLevelNumbers; }
- RTFSprms& getListLevelEntries() { return m_aListLevelEntries; }
- int& getListLevelNum() { return m_nListLevelNum; }
- void setBinaryToRead(int nBinaryToRead) { m_nBinaryToRead = nBinaryToRead; }
- int getBinaryToRead() const { return m_nBinaryToRead; }
- int& getCharsToSkip() { return m_nCharsToSkip; }
- void setUc(int nUc) { m_nUc = nUc; }
- int getUc() const { return m_nUc; }
- void setCurrentEncoding(rtl_TextEncoding nCurrentEncoding)
- {
- m_nCurrentEncoding = nCurrentEncoding;
- }
- rtl_TextEncoding getCurrentEncoding() const { return m_nCurrentEncoding; }
- RTFColorTableEntry& getCurrentColor() { return m_aCurrentColor; }
- RTFSprms& getTabAttributes() { return m_aTabAttributes; }
- RTFSprms& getTableCellAttributes() { return m_aTableCellAttributes; }
- RTFSprms& getTableCellSprms() { return m_aTableCellSprms; }
- RTFSprms& getTableRowAttributes() { return m_aTableRowAttributes; }
- RTFSprms& getTableRowSprms() { return m_aTableRowSprms; }
- RTFSprms& getSectionAttributes() { return m_aSectionAttributes; }
- RTFSprms& getSectionSprms() { return m_aSectionSprms; }
- RTFSprms& getParagraphAttributes() { return m_aParagraphAttributes; }
- RTFSprms& getParagraphSprms() { return m_aParagraphSprms; }
- RTFSprms& getCharacterAttributes() { return m_aCharacterAttributes; }
- RTFSprms& getCharacterSprms() { return m_aCharacterSprms; }
- RTFSprms& getTableAttributes() { return m_aTableAttributes; }
- RTFSprms& getTableSprms() { return m_aTableSprms; }
- void setBorderState(RTFBorderState nBorderState) { m_nBorderState = nBorderState; }
- RTFBorderState getBorderState() const { return m_nBorderState; }
- void setFieldStatus(RTFFieldStatus eFieldStatus) { m_eFieldStatus = eFieldStatus; }
- RTFFieldStatus getFieldStatus() const { return m_eFieldStatus; }
- void setFieldLocked(bool bSet) { m_bFieldLocked = bSet; }
- bool isFieldLocked() const { return m_bFieldLocked; }
- void setDestination(Destination eDestination) { m_eDestination = eDestination; }
- Destination getDestination() const { return m_eDestination; }
- void setInternalState(RTFInternalState nInternalState) { m_nInternalState = nInternalState; }
- RTFInternalState getInternalState() const { return m_nInternalState; }
- RTFDocumentImpl* getDocumentImpl() { return m_pDocumentImpl; }
- OUString getDocVar() { return m_aDocVar; }
- void appendDocVar(OUString& aDocVar) { m_aDocVar += aDocVar; };
- OUString getDocVarName() { return m_aDocVarName; }
- void setDocVarName(OUString& aDocVarName) { m_aDocVarName = aDocVarName; }
- void clearDocVarName() { m_aDocVarName = ""; }
-
-private:
- RTFDocumentImpl* m_pDocumentImpl;
- RTFInternalState m_nInternalState;
- Destination m_eDestination;
- RTFFieldStatus m_eFieldStatus;
- bool m_bFieldLocked;
- RTFBorderState m_nBorderState;
- // font table, stylesheet table
- RTFSprms m_aTableSprms;
- RTFSprms m_aTableAttributes;
- // reset by plain
- RTFSprms m_aCharacterSprms;
- RTFSprms m_aCharacterAttributes;
- // reset by pard
- RTFSprms m_aParagraphSprms;
- RTFSprms m_aParagraphAttributes;
- // reset by sectd
- RTFSprms m_aSectionSprms;
- RTFSprms m_aSectionAttributes;
- // reset by trowd
- RTFSprms m_aTableRowSprms;
- RTFSprms m_aTableRowAttributes;
- // reset by cellx
- RTFSprms m_aTableCellSprms;
- RTFSprms m_aTableCellAttributes;
- // reset by tx
- RTFSprms m_aTabAttributes;
-
- RTFColorTableEntry m_aCurrentColor;
-
- rtl_TextEncoding m_nCurrentEncoding;
-
- /// Current \uc value.
- int m_nUc;
- /// Characters to skip, set to nUc by \u.
- int m_nCharsToSkip;
- /// Characters to read, once in binary mode.
- int m_nBinaryToRead;
-
- /// Next list level index to use when parsing list table.
- int m_nListLevelNum;
- /// List level entries, which will form a list entry later.
- RTFSprms m_aListLevelEntries;
- /// List of character positions in leveltext to replace.
- std::vector<sal_Int32> m_aLevelNumbers;
- /// If aLevelNumbers should be read at all.
- bool m_bLevelNumbersValid;
-
- RTFPicture m_aPicture;
- RTFShape m_aShape;
- RTFDrawingObject m_aDrawingObject;
- RTFFrame m_aFrame;
-
- RunType m_eRunType;
-
- // Info group.
- sal_Int16 m_nYear;
- sal_uInt16 m_nMonth;
- sal_uInt16 m_nDay;
- sal_uInt16 m_nHour;
- sal_uInt16 m_nMinute;
-
- /// Text from special destinations.
- OUStringBuffer m_aDestinationText{ 512 };
- /// point to the buffer of the current destination
- OUStringBuffer* m_pCurrentDestinationText;
-
- /// Index of the current style.
- int m_nCurrentStyleIndex;
- /// Index of the current character style.
- int m_nCurrentCharacterStyleIndex;
- /// Current listid, points to a listtable entry.
- int m_nCurrentListIndex = -1;
- /// Current ls, points to a listoverridetable entry.
- int m_nCurrentListOverrideIndex = -1;
-
- /// Points to the active buffer, if there is one.
- RTFBuffer_t* m_pCurrentBuffer;
-
- /// If we're inside a \listpicture group.
- bool m_bInListpicture;
-
- /// If we're inside a \background group.
- bool m_bInBackground;
-
- bool m_bHadShapeText;
- bool m_bInShapeGroup; ///< If we're inside a \shpgrp group.
- bool m_bInShape; ///< If we're inside a \shp group.
- bool m_bCreatedShapeGroup; ///< A GroupShape was created and pushed to the parent stack.
- bool m_bStartedTrackchange; ///< Track change is started, need to end it before popping.
-
- /// User-defined property: key name.
- OUString m_aPropName;
- /// User-defined property: value type.
- css::uno::Type m_aPropType;
-
- /// Width of invisible cell at the end of the row.
- int m_nTableRowWidthAfter;
-
- /// For importing document variables which are not referenced in the document
- OUString m_aDocVar;
- OUString m_aDocVarName;
-};
-
-/// An RTF stack is similar to std::stack, except that it has an operator[].
-struct RTFStack
-{
-private:
- std::deque<RTFParserState> m_Impl;
-
-public:
- RTFParserState& top()
- {
- if (m_Impl.empty())
- throw css::io::WrongFormatException(
- "Parser state is empty! Invalid usage of destination braces in RTF?", nullptr);
- return m_Impl.back();
- }
- void pop()
- {
- if (m_Impl.empty())
- throw css::io::WrongFormatException(
- "Parser state is empty! Invalid usage of destination braces in RTF?", nullptr);
- return m_Impl.pop_back();
- }
- void push(RTFParserState const& rState) { return m_Impl.push_back(rState); }
- bool empty() const { return m_Impl.empty(); }
- size_t size() const { return m_Impl.size(); }
- const RTFParserState& operator[](size_t nIndex) const { return m_Impl[nIndex]; }
- RTFParserState& operator[](size_t nIndex) { return m_Impl[nIndex]; }
-};
-
-void putBorderProperty(RTFStack& aStates, Id nId, const RTFValue::Pointer_t& pValue);
-void putNestedSprm(RTFSprms& rSprms, Id nParent, Id nId, const RTFValue::Pointer_t& pValue,
- RTFOverwrite eOverwrite = RTFOverwrite::NO_APPEND);
-Id getParagraphBorder(sal_uInt32 nIndex);
-void putNestedAttribute(RTFSprms& rSprms, Id nParent, Id nId, const RTFValue::Pointer_t& pValue,
- RTFOverwrite eOverwrite = RTFOverwrite::YES, bool bAttribute = true);
-bool eraseNestedAttribute(RTFSprms& rSprms, Id nParent, Id nId);
-
-/// Looks up the nParent then the nested nId attribute in rSprms.
-RTFValue::Pointer_t getNestedAttribute(RTFSprms& rSprms, Id nParent, Id nId);
-
-/// Looks up the nParent then the nested nId sprm in rSprms.
-RTFValue::Pointer_t getNestedSprm(RTFSprms& rSprms, Id nParent, Id nId);
-
-/// Checks if rName is contained at least once in rProperties as a key.
-bool findPropertyName(const std::vector<css::beans::PropertyValue>& rProperties,
- const OUString& rName);
-RTFSprms& getLastAttributes(RTFSprms& rSprms, Id nId);
-OString DTTM22OString(tools::Long nDTTM);
-
-/// Implementation of the RTFDocument interface.
-class RTFDocumentImpl : public RTFDocument, public RTFListener
-{
-public:
- using Pointer_t = tools::SvRef<RTFDocumentImpl>;
- RTFDocumentImpl(css::uno::Reference<css::uno::XComponentContext> const& xContext,
- css::uno::Reference<css::io::XInputStream> const& xInputStream,
- css::uno::Reference<css::lang::XComponent> const& xDstDoc,
- css::uno::Reference<css::frame::XFrame> const& xFrame,
- css::uno::Reference<css::task::XStatusIndicator> const& xStatusIndicator,
- const utl::MediaDescriptor& rMediaDescriptor);
- ~RTFDocumentImpl() override;
-
- // RTFDocument
- void resolve(Stream& rMapper) override;
-
- // RTFListener
- RTFError dispatchDestination(RTFKeyword nKeyword) override;
- RTFError dispatchFlag(RTFKeyword nKeyword) override;
- /// Dispatches flags related to Positioned Wrapped Tables.
- bool dispatchFloatingTableFlag(RTFKeyword nKeyword);
- RTFError dispatchSymbol(RTFKeyword nKeyword) override;
- RTFError dispatchToggle(RTFKeyword nKeyword, bool bParam, int nParam) override;
- RTFError dispatchValue(RTFKeyword nKeyword, int nParam) override;
- bool dispatchTableSprmValue(RTFKeyword nKeyword, int nParam);
- bool dispatchCharacterSprmValue(RTFKeyword nKeyword, int nParam);
- bool dispatchCharacterAttributeValue(RTFKeyword nKeyword, int nParam);
- bool dispatchParagraphSprmValue(RTFKeyword nKeyword, int nParam);
- bool dispatchInfoValue(RTFKeyword nKeyword, int nParam);
- bool dispatchFrameValue(RTFKeyword nKeyword, int nParam);
- bool dispatchTableValue(RTFKeyword nKeyword, int nParam);
- RTFError resolveChars(char ch) override;
- RTFError pushState() override;
- RTFError beforePopState(RTFParserState& rState);
- RTFError popState() override;
- void afterPopState(RTFParserState& rState);
- Destination getDestination() override;
- void setDestination(Destination eDestination) override;
- RTFInternalState getInternalState() override;
- void setInternalState(RTFInternalState nInternalState) override;
- bool getSkipUnknown() override;
- void setSkipUnknown(bool bSkipUnknown) override;
- void finishSubstream() override;
- bool isSubstream() const override;
-
- Stream& Mapper() { return *m_pMapperStream; }
- void setSuperstream(RTFDocumentImpl* pSuperstream);
- const css::uno::Reference<css::lang::XMultiServiceFactory>& getModelFactory() const
- {
- return m_xModelFactory;
- }
- bool isInBackground();
- void setDestinationText(std::u16string_view rString);
- /// Resolve a picture: If not inline, then anchored.
- void resolvePict(bool bInline, css::uno::Reference<css::drawing::XShape> const& rShape);
-
- /// If this is the first run of the document, starts the initial paragraph.
- void checkFirstRun();
- /// Send NS_ooxml::LN_settings_settings to dmapper.
- void outputSettingsTable();
- /// If the initial paragraph is started.
- bool getFirstRun() const { return m_bFirstRun; }
- /// If we need to add a dummy paragraph before a section break.
- void setNeedPar(bool bNeedPar);
- /// Return the dmapper index of an RTF index for fonts.
- int getFontIndex(int nIndex);
- /// Return the name of the font, based on a dmapper index.
- OUString getFontName(int nIndex);
- /// Return the style name of an RTF style index.
- OUString getStyleName(int nIndex);
- /// Return the style type of an RTF style index.
- Id getStyleType(int nIndex);
- /// Return the encoding associated with a font index.
- rtl_TextEncoding getEncoding(int nFontIndex);
- /// Get the default parser state.
- RTFParserState& getDefaultState();
- oox::GraphicHelper& getGraphicHelper();
- /// Are we inside the stylesheet table?
- bool isStyleSheetImport();
- /// Resets m_aStates.top().aFrame.
- void resetFrame();
- /// Buffers properties to be sent later.
- void bufferProperties(RTFBuffer_t& rBuffer, const RTFValue::Pointer_t& pValue,
- const tools::SvRef<TableRowBuffer>& pTableProperties, Id nStyleType = 0);
- /// implement non-obvious RTF specific style inheritance
- RTFReferenceTable::Entries_t deduplicateStyleTable();
-
-private:
- SvStream& Strm();
- Color getColorTable(sal_uInt32 nIndex);
- writerfilter::Reference<Properties>::Pointer_t createStyleProperties();
- void resetSprms();
- void resetAttributes();
- void resolveSubstream(std::size_t nPos, Id nId);
- void resolveSubstream(std::size_t nPos, Id nId, OUString const& rIgnoreFirst);
-
- void text(OUString& rString);
- // Sends a single character to dmapper, taking care of buffering.
- void singleChar(sal_uInt8 nValue, bool bRunProps = false);
- // Sends run properties to dmapper, taking care of buffering.
- void runProps();
- void runBreak();
- void parBreak();
- void tableBreak();
- writerfilter::Reference<Properties>::Pointer_t
- getProperties(const RTFSprms& rAttributes, RTFSprms const& rSprms, Id nStyleType);
- void checkNeedPap();
- void handleFontTableEntry();
- void sectBreak(bool bFinal = false);
- void prepareProperties(RTFParserState& rState,
- writerfilter::Reference<Properties>::Pointer_t& o_rpParagraphProperties,
- writerfilter::Reference<Properties>::Pointer_t& o_rpFrameProperties,
- writerfilter::Reference<Properties>::Pointer_t& o_rpTableRowProperties,
- int nCells, int nCurrentCellX);
- /// Send the passed properties to dmapper.
- void sendProperties(writerfilter::Reference<Properties>::Pointer_t const& pParagraphProperties,
- writerfilter::Reference<Properties>::Pointer_t const& pFrameProperties,
- writerfilter::Reference<Properties>::Pointer_t const& pTableRowProperties);
- void replayRowBuffer(RTFBuffer_t& rBuffer, ::std::deque<RTFSprms>& rCellsSprms,
- ::std::deque<RTFSprms>& rCellsAttributes, int nCells);
- void replayBuffer(RTFBuffer_t& rBuffer, RTFSprms* pSprms, RTFSprms const* pAttributes);
- /// If we have some unicode or hex characters to send.
- void checkUnicode(bool bUnicode, bool bHex);
- /// If we need a final section break at the end of the document.
- void setNeedSect(bool bNeedSect);
- void resetTableRowProperties();
- void backupTableRowProperties();
- void restoreTableRowProperties();
- /// Turns the destination text into an input stream of the current OLE attributes.
- RTFError handleEmbeddedObject();
-
- css::uno::Reference<css::uno::XComponentContext> const& m_xContext;
- css::uno::Reference<css::io::XInputStream> const& m_xInputStream;
- css::uno::Reference<css::lang::XComponent> const& m_xDstDoc;
- css::uno::Reference<css::frame::XFrame> const& m_xFrame;
- css::uno::Reference<css::task::XStatusIndicator> const& m_xStatusIndicator;
- css::uno::Reference<css::lang::XMultiServiceFactory> m_xModelFactory;
- css::uno::Reference<css::document::XDocumentProperties> m_xDocumentProperties;
- std::unique_ptr<SvStream> m_pInStream;
- Stream* m_pMapperStream;
- tools::SvRef<RTFSdrImport> m_pSdrImport;
- tools::SvRef<RTFTokenizer> m_pTokenizer;
- RTFStack m_aStates;
- /// Read by RTF_PARD.
- RTFParserState m_aDefaultState;
- bool m_bSkipUnknown;
- /// Font index <-> encoding map, *not* part of the parser state
- std::map<int, rtl_TextEncoding> m_aFontEncodings;
- /// Font index <-> name map.
- std::map<int, OUString> m_aFontNames;
- /// Maps the non-continuous font indexes to the continuous dmapper indexes.
- std::vector<int> m_aFontIndexes;
- /// Maps style indexes to style names.
- std::map<int, OUString> m_aStyleNames;
- /// Maps style indexes to style types.
- std::map<int, Id> m_aStyleTypes;
- /// Color index <-> RGB color value map
- std::vector<Color> m_aColorTable;
- /// to start initial paragraph / section after font/style tables
- bool m_bFirstRun;
- /// except in the case of tables in initial multicolumn section (global for assertion)
- bool m_bFirstRunException;
- /// If paragraph properties should be emitted on next run.
- bool m_bNeedPap;
- /// If we need to emit a CR at the end of substream.
- bool m_bNeedCr;
- /// Original value of m_bNeedCr -- saved/restored before/after textframes.
- bool m_bNeedCrOrig;
- bool m_bNeedPar;
- /// If set, an empty paragraph will be added at the end of the document.
- bool m_bNeedFinalPar;
- /// a synthetic \par was dispatched at the end of the current section
- bool m_bParAtEndOfSection = false;
- /// The list table and list override table combined.
- RTFSprms m_aListTableSprms;
- /// Maps between listoverridetable and listtable indexes.
- std::map<int, int> m_aListOverrideTable;
- /// Maps listtable indexes to listtable entries.
- std::map<int, RTFValue::Pointer_t> m_aListTable;
- /// Index of the current list level in a list table entry.
- int m_nListLevel = -1;
- /// Maps List level indexes to removed values in the current list entry.
- std::map<int, int> m_aInvalidListLevelFirstIndents;
- /// Maps list table indexes to levels (and their removed values).
- std::map<int, std::map<int, int>> m_aInvalidListTableFirstIndents;
- /// The settings table attributes.
- RTFSprms m_aSettingsTableAttributes;
- /// The settings table sprms.
- RTFSprms m_aSettingsTableSprms;
-
- std::shared_ptr<oox::GraphicHelper> m_pGraphicHelper;
-
- /// cell props buffer for nested tables, reset by \nestrow
- /// the \nesttableprops is a destination and must follow the
- /// nested cells, so it should be sufficient to store the
- /// currently active one, no need for a stack of them
- int m_nNestedCells;
- std::deque<RTFSprms> m_aNestedTableCellsSprms;
- std::deque<RTFSprms> m_aNestedTableCellsAttributes;
- /// cell props buffer for top-level table, reset by \row
- int m_nTopLevelCells;
- std::deque<RTFSprms> m_aTopLevelTableCellsSprms;
- std::deque<RTFSprms> m_aTopLevelTableCellsAttributes;
- /// backup of top-level props, to support inheriting cell props
- int m_nInheritingCells;
- std::deque<RTFSprms> m_aTableInheritingCellsSprms;
- std::deque<RTFSprms> m_aTableInheritingCellsAttributes;
-
- // Left row margin (for nested and top-level rows)
- int m_nNestedTRLeft;
- int m_nTopLevelTRLeft;
-
- /// Current cellx value (nested table)
- int m_nNestedCurrentCellX;
- /// Current cellx value (top-level table)
- int m_nTopLevelCurrentCellX;
-
- // Backup of what \trowd clears, to work around invalid input.
- RTFSprms m_aBackupTableRowSprms;
- RTFSprms m_aBackupTableRowAttributes;
- int m_nBackupTopLevelCurrentCellX;
-
- /// Buffered table cells, till cell definitions are not reached.
- /// for nested table, one buffer per table level
- std::deque<RTFBuffer_t> m_aTableBufferStack;
- /// Buffered superscript, till footnote is reached (or not).
- RTFBuffer_t m_aSuperBuffer;
-
- /// Superstream of this substream.
- RTFDocumentImpl* m_pSuperstream;
- /// Type of the stream: header, footer, footnote, etc.
- Id m_nStreamType;
- std::queue<std::pair<Id, std::size_t>> m_nHeaderFooterPositions;
- std::size_t m_nGroupStartPos;
- /// Ignore the first occurrence of this text.
- OUString m_aIgnoreFirst;
- /// Bookmark name <-> index map.
- std::map<OUString, int> m_aBookmarks;
- /// Revision index <-> author map.
- std::map<int, OUString> m_aAuthors;
- /// Annotation author of the next annotation.
- OUString m_aAuthor;
- /// Initials of author of the next annotation.
- OUString m_aAuthorInitials;
-
- RTFSprms m_aFormfieldSprms;
- RTFSprms m_aFormfieldAttributes;
- RTFFormFieldType m_nFormFieldType;
-
- /// OLE attributes are attributes of the ooxml:OLEObject_OLEObject sprm.
- RTFSprms m_aOLEAttributes;
- RTFSprms m_aObjectAttributes;
- /** If we are in an object group and if the we use its
- * \objdata element.
- * (if we don't use the \objdata we use the \result element)*/
- bool m_bObject;
- /// If the data for a picture is a binary one, it's stored here.
- std::shared_ptr<SvStream> m_pBinaryData;
-
- RTFReferenceTable::Entries_t m_aFontTableEntries;
- int m_nCurrentFontIndex;
- /// Used only during font table parsing till we don't know the font name.
- int m_nCurrentEncoding;
- /// Raw default font index, use getFont() on it to get a real one.
- int m_nDefaultFontIndex;
-
- /// To avoid copying entries between DomainMapper instances it is stored as pointer
- std::shared_ptr<RTFReferenceTable::Entries_t> m_pStyleTableEntries;
- int m_nCurrentStyleIndex;
- bool m_bFormField;
- /// For the INCLUDEPICTURE field's argument.
- OUString m_aPicturePath;
- // Unicode characters are collected here so we don't have to send them one by one.
- OUStringBuffer m_aUnicodeBuffer{ 512 };
- /// Same for hex characters.
- OStringBuffer m_aHexBuffer{ 512 };
- /// Formula import.
- oox::formulaimport::XmlStreamBuilder m_aMathBuffer;
- /// Normal text property, that is math italic and math spacing are not applied to the current run.
- bool m_bMathNor;
- /// If the next continuous section break should be ignored.
- bool m_bIgnoreNextContSectBreak;
- /// clean up a synthetic page break, see RTF_PAGE
- /// if inactive value is -1, otherwise the RTF_SKB* to restore
- RTFKeyword m_nResetBreakOnSectBreak;
- /// If a section break is needed before the end of the doc (false right after a section break).
- bool m_bNeedSect;
- /// If aFrame.hasProperties() was true in the previous state.
- bool m_bWasInFrame;
- /// A picture was seen in the current paragraph.
- bool m_bHadPicture;
- /// The document has multiple sections.
- bool m_bHadSect;
- /// Max width of the rows in the current table.
- int m_nCellxMax;
- /// ID of the next \listlevel picture.
- int m_nListPictureId;
-
- /// New document means not pasting into an existing one.
- bool m_bIsNewDoc;
- /// The media descriptor contains e.g. the base URL of the document.
- const utl::MediaDescriptor& m_rMediaDescriptor;
-
- /// Flags for ensuring that only one header and footer is added per section
- bool m_hasRHeader;
- bool m_hasFHeader;
- bool m_hasRFooter;
- bool m_hasFFooter;
-};
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtffly.hxx b/writerfilter/source/rtftok/rtffly.hxx
deleted file mode 100644
index b1dec0c77b4f..000000000000
--- a/writerfilter/source/rtftok/rtffly.hxx
+++ /dev/null
@@ -1,138 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-#include <com/sun/star/text/HoriOrientation.hpp>
-#include <com/sun/star/text/RelOrientation.hpp>
-#include <com/sun/star/text/VertOrientation.hpp>
-
-#include <ooxml/resourceids.hxx>
-#include <osl/endian.h>
-
-namespace writerfilter::rtftok
-{
-/// Stores the vertical orientation properties of an RTF fly frame.
-class RTFVertOrient
-{
-public:
- explicit RTFVertOrient(sal_uInt16 nValue)
- : m_nVal(nValue)
- {
- }
-
- sal_uInt16 GetOrient() const { return OSL_LONIBBLE(OSL_LOBYTE(m_nVal)); }
-
- sal_uInt16 GetRelation() const { return OSL_HINIBBLE(OSL_LOBYTE(m_nVal)); }
-
- sal_Int32 GetAlign() const
- {
- sal_Int32 nAlign = 0;
- switch (GetOrient())
- {
- case css::text::VertOrientation::CENTER:
- nAlign = NS_ooxml::LN_Value_doc_ST_YAlign_center;
- break;
- case css::text::VertOrientation::TOP:
- nAlign = NS_ooxml::LN_Value_doc_ST_YAlign_top;
- break;
- case css::text::VertOrientation::BOTTOM:
- nAlign = NS_ooxml::LN_Value_doc_ST_YAlign_bottom;
- break;
- }
-
- return nAlign;
- }
-
- sal_Int32 GetAnchor() const
- {
- sal_Int32 nAnchor = 0;
- switch (GetRelation())
- {
- case css::text::RelOrientation::FRAME:
- nAnchor = NS_ooxml::LN_Value_doc_ST_VAnchor_text;
- break;
- case css::text::RelOrientation::PAGE_FRAME:
- nAnchor = NS_ooxml::LN_Value_doc_ST_VAnchor_page;
- break;
- case css::text::RelOrientation::PAGE_PRINT_AREA:
- nAnchor = NS_ooxml::LN_Value_doc_ST_VAnchor_margin;
- break;
- }
-
- return nAnchor;
- }
-
-private:
- sal_uInt16 m_nVal;
-};
-
-/// Stores the horizontal orientation properties of an RTF fly frame.
-class RTFHoriOrient
-{
-public:
- explicit RTFHoriOrient(sal_uInt16 nValue)
- : m_nVal(nValue)
- {
- }
-
- sal_uInt16 GetOrient() const { return OSL_LONIBBLE(OSL_LOBYTE(m_nVal)); }
-
- sal_uInt16 GetRelation() const { return OSL_LONIBBLE(OSL_HIBYTE(m_nVal)); }
-
- sal_Int32 GetAlign() const
- {
- sal_Int32 nAlign = 0;
- switch (GetOrient())
- {
- case css::text::HoriOrientation::CENTER:
- nAlign = NS_ooxml::LN_Value_doc_ST_XAlign_center;
- break;
- case css::text::HoriOrientation::RIGHT:
- nAlign = NS_ooxml::LN_Value_doc_ST_XAlign_right;
- break;
- case css::text::HoriOrientation::LEFT:
- nAlign = NS_ooxml::LN_Value_doc_ST_XAlign_left;
- break;
- case css::text::HoriOrientation::INSIDE:
- nAlign = NS_ooxml::LN_Value_doc_ST_XAlign_inside;
- break;
- case css::text::HoriOrientation::OUTSIDE:
- nAlign = NS_ooxml::LN_Value_doc_ST_XAlign_outside;
- break;
- }
-
- return nAlign;
- }
-
- sal_Int32 GetAnchor() const
- {
- sal_Int32 nAnchor = 0;
- switch (GetRelation())
- {
- case css::text::RelOrientation::FRAME:
- nAnchor = NS_ooxml::LN_Value_doc_ST_HAnchor_text;
- break;
- case css::text::RelOrientation::PAGE_FRAME:
- nAnchor = NS_ooxml::LN_Value_doc_ST_HAnchor_page;
- break;
- case css::text::RelOrientation::PAGE_PRINT_AREA:
- nAnchor = NS_ooxml::LN_Value_doc_ST_HAnchor_margin;
- break;
- }
-
- return nAnchor;
- }
-
-private:
- sal_uInt16 m_nVal;
-};
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtflistener.hxx b/writerfilter/source/rtftok/rtflistener.hxx
deleted file mode 100644
index 150440afbb47..000000000000
--- a/writerfilter/source/rtftok/rtflistener.hxx
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-#include "rtfcontrolwords.hxx"
-
-namespace writerfilter::rtftok
-{
-enum class RTFInternalState
-{
- NORMAL,
- BIN,
- HEX
-};
-
-enum class RTFError
-{
- OK,
- GROUP_UNDER,
- GROUP_OVER,
- UNEXPECTED_EOF,
- HEX_INVALID,
- CHAR_OVER,
- CLASSIFICATION
-};
-
-/**
- * RTFTokenizer needs a class implementing this interface. While
- * RTFTokenizer separates control words (and their arguments) from
- * text, the class implementing this interface is expected to map the
- * raw RTF tokens to dmapper tokens.
- */
-class RTFListener
-{
-public:
- virtual ~RTFListener() = default;
- // Dispatching of control words and characters.
- virtual RTFError dispatchDestination(RTFKeyword nKeyword) = 0;
- virtual RTFError dispatchFlag(RTFKeyword nKeyword) = 0;
- virtual RTFError dispatchSymbol(RTFKeyword nKeyword) = 0;
- virtual RTFError dispatchToggle(RTFKeyword nKeyword, bool bParam, int nParam) = 0;
- virtual RTFError dispatchValue(RTFKeyword nKeyword, int nParam) = 0;
- virtual RTFError resolveChars(char ch) = 0;
-
- // State handling.
- virtual RTFError pushState() = 0;
- virtual RTFError popState() = 0;
-
- virtual Destination getDestination() = 0;
- virtual void setDestination(Destination eDestination) = 0;
- virtual RTFInternalState getInternalState() = 0;
- virtual void setInternalState(RTFInternalState nInternalState) = 0;
- virtual bool getSkipUnknown() = 0;
- virtual void setSkipUnknown(bool bSkipUnknown) = 0;
-
- // Substream handling.
- virtual void finishSubstream() = 0;
- virtual bool isSubstream() const = 0;
-};
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtflookahead.cxx b/writerfilter/source/rtftok/rtflookahead.cxx
deleted file mode 100644
index 033feacce69d..000000000000
--- a/writerfilter/source/rtftok/rtflookahead.cxx
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- 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 "rtflookahead.hxx"
-#include <com/sun/star/uno/Reference.hxx>
-#include <tools/stream.hxx>
-#include "rtftokenizer.hxx"
-
-namespace com::sun::star::task
-{
-class XStatusIndicator;
-}
-
-using namespace com::sun::star;
-
-namespace writerfilter::rtftok
-{
-RTFLookahead::RTFLookahead(SvStream& rStream, sal_uInt64 nGroupStart)
- : m_rStream(rStream)
- , m_bHasTable(false)
- , m_bHasColumns(false)
-{
- sal_uInt64 const nPos = m_rStream.Tell();
- m_rStream.Seek(nGroupStart);
- uno::Reference<task::XStatusIndicator> xStatusIndicator;
- m_pTokenizer = new RTFTokenizer(*this, &m_rStream, xStatusIndicator);
- m_pTokenizer->resolveParse();
- m_rStream.Seek(nPos);
-}
-
-RTFLookahead::~RTFLookahead() = default;
-
-RTFError RTFLookahead::dispatchDestination(RTFKeyword /*nKeyword*/) { return RTFError::OK; }
-
-RTFError RTFLookahead::dispatchFlag(RTFKeyword nKeyword)
-{
- if (nKeyword == RTFKeyword::INTBL)
- m_bHasTable = true;
- return RTFError::OK;
-}
-
-RTFError RTFLookahead::dispatchSymbol(RTFKeyword /*nKeyword*/) { return RTFError::OK; }
-
-RTFError RTFLookahead::dispatchToggle(RTFKeyword /*nKeyword*/, bool /*bParam*/, int /*nParam*/)
-{
- return RTFError::OK;
-}
-
-RTFError RTFLookahead::dispatchValue(RTFKeyword nKeyword, int nParam)
-{
- if (nKeyword == RTFKeyword::COLS && nParam >= 2)
- m_bHasColumns = true;
- return RTFError::OK;
-}
-
-RTFError RTFLookahead::resolveChars(char ch)
-{
- while (!m_rStream.eof() && (ch != '{' && ch != '}' && ch != '\\'))
- m_rStream.ReadChar(ch);
- if (!m_rStream.eof())
- m_rStream.SeekRel(-1);
- return RTFError::OK;
-}
-
-RTFError RTFLookahead::pushState()
-{
- m_pTokenizer->pushGroup();
- return RTFError::OK;
-}
-
-RTFError RTFLookahead::popState()
-{
- m_pTokenizer->popGroup();
- return RTFError::OK;
-}
-
-Destination RTFLookahead::getDestination() { return Destination::NORMAL; }
-
-void RTFLookahead::setDestination(Destination /*eDestination*/) {}
-
-RTFInternalState RTFLookahead::getInternalState() { return RTFInternalState::NORMAL; }
-
-void RTFLookahead::setInternalState(RTFInternalState /*nInternalState*/) {}
-
-bool RTFLookahead::getSkipUnknown() { return false; }
-
-void RTFLookahead::setSkipUnknown(bool /*bSkipUnknown*/) {}
-
-void RTFLookahead::finishSubstream() {}
-
-bool RTFLookahead::isSubstream() const { return false; }
-
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtflookahead.hxx b/writerfilter/source/rtftok/rtflookahead.hxx
deleted file mode 100644
index 9ec213f624c3..000000000000
--- a/writerfilter/source/rtftok/rtflookahead.hxx
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-#include <sal/types.h>
-#include <tools/ref.hxx>
-#include "rtflistener.hxx"
-
-class SvStream;
-
-namespace writerfilter::rtftok
-{
-class RTFTokenizer;
-/**
- * This acts like an importer, but used for looking ahead, e.g. to
- * determine if the current group contains a table, etc.
- */
-class RTFLookahead : public RTFListener
-{
-public:
- RTFLookahead(SvStream& rStream, sal_uInt64 nGroupStart);
- ~RTFLookahead() override;
- RTFError dispatchDestination(RTFKeyword nKeyword) override;
- RTFError dispatchFlag(RTFKeyword nKeyword) override;
- RTFError dispatchSymbol(RTFKeyword nKeyword) override;
- RTFError dispatchToggle(RTFKeyword nKeyword, bool bParam, int nParam) override;
- RTFError dispatchValue(RTFKeyword nKeyword, int nParam) override;
- RTFError resolveChars(char ch) override;
- RTFError pushState() override;
- RTFError popState() override;
- Destination getDestination() override;
- void setDestination(Destination eDestination) override;
- RTFInternalState getInternalState() override;
- void setInternalState(RTFInternalState nInternalState) override;
- bool getSkipUnknown() override;
- void setSkipUnknown(bool bSkipUnknown) override;
- void finishSubstream() override;
- bool isSubstream() const override;
- bool hasTable() const { return m_bHasTable; }
- bool hasColumns() const { return m_bHasColumns; }
-
-private:
- tools::SvRef<RTFTokenizer> m_pTokenizer;
- SvStream& m_rStream;
- bool m_bHasTable;
- bool m_bHasColumns;
-};
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfreferenceproperties.cxx b/writerfilter/source/rtftok/rtfreferenceproperties.cxx
deleted file mode 100644
index d32557bc7d46..000000000000
--- a/writerfilter/source/rtftok/rtfreferenceproperties.cxx
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- 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 "rtfreferenceproperties.hxx"
-
-namespace writerfilter::rtftok
-{
-RTFReferenceProperties::RTFReferenceProperties(RTFSprms aAttributes, RTFSprms aSprms)
- : m_aAttributes(std::move(aAttributes))
- , m_aSprms(std::move(aSprms))
-{
-}
-
-RTFReferenceProperties::RTFReferenceProperties(RTFSprms aAttributes)
- : m_aAttributes(std::move(aAttributes))
-{
-}
-
-RTFReferenceProperties::~RTFReferenceProperties() = default;
-
-void RTFReferenceProperties::resolve(Properties& rHandler)
-{
- for (auto& rAttribute : m_aAttributes)
- rHandler.attribute(rAttribute.first, *rAttribute.second);
- for (auto& rSprm : m_aSprms)
- {
- RTFSprm aSprm(rSprm.first, rSprm.second);
- rHandler.sprm(aSprm);
- }
-}
-
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfreferenceproperties.hxx b/writerfilter/source/rtftok/rtfreferenceproperties.hxx
deleted file mode 100644
index 6a5e5618ba30..000000000000
--- a/writerfilter/source/rtftok/rtfreferenceproperties.hxx
+++ /dev/null
@@ -1,33 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-#include "rtfsprm.hxx"
-
-namespace writerfilter::rtftok
-{
-/// Sends RTFSprm instances to DomainMapper.
-class RTFReferenceProperties : public writerfilter::Reference<Properties>
-{
-public:
- RTFReferenceProperties(RTFSprms aAttributes, RTFSprms aSprms);
- explicit RTFReferenceProperties(RTFSprms aAttributes);
- ~RTFReferenceProperties() override;
- void resolve(Properties& rHandler) override;
- RTFSprms& getAttributes() { return m_aAttributes; }
- RTFSprms& getSprms() { return m_aSprms; }
-
-private:
- RTFSprms m_aAttributes;
- RTFSprms m_aSprms;
-};
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfreferencetable.cxx b/writerfilter/source/rtftok/rtfreferencetable.cxx
deleted file mode 100644
index 1a70a93d9bf8..000000000000
--- a/writerfilter/source/rtftok/rtfreferencetable.cxx
+++ /dev/null
@@ -1,29 +0,0 @@
-/* -*- 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 "rtfreferencetable.hxx"
-
-namespace writerfilter::rtftok
-{
-RTFReferenceTable::RTFReferenceTable(Entries_t aEntries)
- : m_aEntries(std::move(aEntries))
-{
-}
-
-RTFReferenceTable::~RTFReferenceTable() = default;
-
-void RTFReferenceTable::resolve(Table& rHandler)
-{
- for (const auto& rEntry : m_aEntries)
- rHandler.entry(rEntry.first, rEntry.second);
-}
-
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfreferencetable.hxx b/writerfilter/source/rtftok/rtfreferencetable.hxx
deleted file mode 100644
index 76cbaacf2371..000000000000
--- a/writerfilter/source/rtftok/rtfreferencetable.hxx
+++ /dev/null
@@ -1,32 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-#include <map>
-#include <dmapper/resourcemodel.hxx>
-
-namespace writerfilter::rtftok
-{
-/// Sends tables (e.g. font table) to the domain mapper.
-class RTFReferenceTable : public writerfilter::Reference<Table>
-{
-public:
- using Entries_t = std::map<int, writerfilter::Reference<Properties>::Pointer_t>;
- using Entry_t = std::pair<int, writerfilter::Reference<Properties>::Pointer_t>;
- explicit RTFReferenceTable(Entries_t aEntries);
- ~RTFReferenceTable() override;
- void resolve(Table& rHandler) override;
-
-private:
- Entries_t m_aEntries;
-};
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfsdrimport.cxx b/writerfilter/source/rtftok/rtfsdrimport.cxx
deleted file mode 100644
index d9c57be4a8a8..000000000000
--- a/writerfilter/source/rtftok/rtfsdrimport.cxx
+++ /dev/null
@@ -1,1186 +0,0 @@
-/* -*- 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 "rtfsdrimport.hxx"
-#include <cmath>
-#include <optional>
-#include <com/sun/star/container/XNamed.hpp>
-#include <com/sun/star/drawing/FillStyle.hpp>
-#include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp>
-#include <com/sun/star/drawing/XEnhancedCustomShapeDefaulter.hpp>
-#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
-#include <com/sun/star/drawing/LineStyle.hpp>
-#include <com/sun/star/drawing/EnhancedCustomShapeSegment.hpp>
-#include <com/sun/star/drawing/EnhancedCustomShapeSegmentCommand.hpp>
-#include <com/sun/star/drawing/ColorMode.hpp>
-#include <com/sun/star/lang/XServiceInfo.hpp>
-#include <com/sun/star/table/BorderLine2.hpp>
-#include <com/sun/star/text/HoriOrientation.hpp>
-#include <com/sun/star/text/RelOrientation.hpp>
-#include <com/sun/star/text/SizeType.hpp>
-#include <com/sun/star/text/VertOrientation.hpp>
-#include <com/sun/star/text/WrapTextMode.hpp>
-#include <com/sun/star/text/WritingMode.hpp>
-#include <com/sun/star/text/WritingMode2.hpp>
-#include <com/sun/star/text/TextContentAnchorType.hpp>
-#include <com/sun/star/text/XTextRange.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <ooxml/resourceids.hxx>
-#include <filter/msfilter/escherex.hxx>
-#include <filter/msfilter/util.hxx>
-#include <filter/msfilter/rtfutil.hxx>
-#include <sal/log.hxx>
-#include <svx/svdtrans.hxx>
-#include <comphelper/sequence.hxx>
-#include <comphelper/propertysequence.hxx>
-#include "rtfreferenceproperties.hxx"
-#include <oox/vml/vmlformatting.hxx>
-#include <oox/helper/modelobjecthelper.hxx>
-#include <oox/drawingml/drawingmltypes.hxx>
-#include <oox/drawingml/shapepropertymap.hxx>
-#include <oox/helper/propertyset.hxx>
-#include <basegfx/matrix/b2dhommatrix.hxx>
-#include <svx/svdobj.hxx>
-#include <tools/UnitConversion.hxx>
-#include <o3tl/string_view.hxx>
-
-#include <dmapper/GraphicZOrderHelper.hxx>
-#include "rtfdocumentimpl.hxx"
-
-using namespace com::sun::star;
-
-namespace writerfilter::rtftok
-{
-RTFSdrImport::RTFSdrImport(RTFDocumentImpl& rDocument,
- uno::Reference<lang::XComponent> const& xDstDoc)
- : m_rImport(rDocument)
- , m_bTextFrame(false)
- , m_bTextGraphicObject(false)
- , m_bFakePict(false)
-{
- uno::Reference<drawing::XDrawPageSupplier> xDrawings(xDstDoc, uno::UNO_QUERY);
- if (xDrawings.is())
- m_aParents.push(xDrawings->getDrawPage());
- m_aGraphicZOrderHelpers.push(writerfilter::dmapper::GraphicZOrderHelper());
-}
-
-RTFSdrImport::~RTFSdrImport()
-{
- if (!m_aGraphicZOrderHelpers.empty())
- m_aGraphicZOrderHelpers.pop();
- if (!m_aParents.empty())
- m_aParents.pop();
-}
-
-void RTFSdrImport::createShape(const OUString& rService, uno::Reference<drawing::XShape>& xShape,
- uno::Reference<beans::XPropertySet>& xPropertySet)
-{
- if (m_rImport.getModelFactory().is())
- xShape.set(m_rImport.getModelFactory()->createInstance(rService), uno::UNO_QUERY);
- xPropertySet.set(xShape, uno::UNO_QUERY);
-}
-
-std::vector<beans::PropertyValue> RTFSdrImport::getTextFrameDefaults(bool bNew)
-{
- std::vector<beans::PropertyValue> aRet;
- beans::PropertyValue aPropertyValue;
-
- aPropertyValue.Name = "HoriOrient";
- aPropertyValue.Value <<= text::HoriOrientation::NONE;
- aRet.push_back(aPropertyValue);
- aPropertyValue.Name = "HoriOrientRelation";
- aPropertyValue.Value <<= text::RelOrientation::FRAME;
- aRet.push_back(aPropertyValue);
- aPropertyValue.Name = "VertOrient";
- aPropertyValue.Value <<= text::VertOrientation::NONE;
- aRet.push_back(aPropertyValue);
- aPropertyValue.Name = "VertOrientRelation";
- aPropertyValue.Value <<= text::RelOrientation::FRAME;
- aRet.push_back(aPropertyValue);
- if (!bNew)
- {
- aPropertyValue.Name = "BackColorTransparency";
- aPropertyValue.Value <<= sal_Int32(100);
- aRet.push_back(aPropertyValue);
- }
- // See the spec, new-style frame default margins are specified in EMUs.
- aPropertyValue.Name = "LeftBorderDistance";
- aPropertyValue.Value <<= sal_Int32(bNew ? (91440 / 360) : 0);
- aRet.push_back(aPropertyValue);
- aPropertyValue.Name = "RightBorderDistance";
- aPropertyValue.Value <<= sal_Int32(bNew ? (91440 / 360) : 0);
- aRet.push_back(aPropertyValue);
- aPropertyValue.Name = "TopBorderDistance";
- aPropertyValue.Value <<= sal_Int32(bNew ? (45720 / 360) : 0);
- aRet.push_back(aPropertyValue);
- aPropertyValue.Name = "BottomBorderDistance";
- aPropertyValue.Value <<= sal_Int32(bNew ? (45720 / 360) : 0);
- aRet.push_back(aPropertyValue);
- aPropertyValue.Name = "SizeType";
- aPropertyValue.Value <<= text::SizeType::FIX;
- aRet.push_back(aPropertyValue);
- return aRet;
-}
-
-void RTFSdrImport::pushParent(uno::Reference<drawing::XShapes> const& xParent)
-{
- m_aParents.push(xParent);
- m_aGraphicZOrderHelpers.push(writerfilter::dmapper::GraphicZOrderHelper());
-}
-
-void RTFSdrImport::popParent()
-{
- if (!m_aGraphicZOrderHelpers.empty())
- m_aGraphicZOrderHelpers.pop();
- if (!m_aParents.empty())
- m_aParents.pop();
-}
-
-void RTFSdrImport::resolveDhgt(uno::Reference<beans::XPropertySet> const& xPropertySet,
- sal_Int32 const nZOrder, bool const bOldStyle)
-{
- if (!m_aGraphicZOrderHelpers.empty())
- {
- writerfilter::dmapper::GraphicZOrderHelper& rHelper = m_aGraphicZOrderHelpers.top();
- xPropertySet->setPropertyValue("ZOrder", uno::Any(rHelper.findZOrder(nZOrder, bOldStyle)));
- rHelper.addItem(xPropertySet, nZOrder);
- }
-}
-
-void RTFSdrImport::resolveLineColorAndWidth(bool bTextFrame,
- const uno::Reference<beans::XPropertySet>& xPropertySet,
- uno::Any const& rLineColor, uno::Any const& rLineWidth)
-{
- if (!bTextFrame)
- {
- xPropertySet->setPropertyValue("LineColor", rLineColor);
- xPropertySet->setPropertyValue("LineWidth", rLineWidth);
- }
- else
- {
- static const char* aBorders[]
- = { "TopBorder", "LeftBorder", "BottomBorder", "RightBorder" };
- for (const char* pBorder : aBorders)
- {
- auto aBorderLine = xPropertySet->getPropertyValue(OUString::createFromAscii(pBorder))
- .get<table::BorderLine2>();
- if (rLineColor.hasValue())
- aBorderLine.Color = rLineColor.get<sal_Int32>();
- if (rLineWidth.hasValue())
- aBorderLine.LineWidth = rLineWidth.get<sal_Int32>();
- xPropertySet->setPropertyValue(OUString::createFromAscii(pBorder),
- uno::Any(aBorderLine));
- }
- }
-}
-
-void RTFSdrImport::resolveFLine(uno::Reference<beans::XPropertySet> const& xPropertySet,
- sal_Int32 const nFLine)
-{
- if (nFLine == 0)
- xPropertySet->setPropertyValue("LineStyle", uno::Any(drawing::LineStyle_NONE));
- else
- xPropertySet->setPropertyValue("LineStyle", uno::Any(drawing::LineStyle_SOLID));
-}
-
-void RTFSdrImport::applyProperty(uno::Reference<drawing::XShape> const& xShape,
- std::u16string_view aKey, std::u16string_view aValue) const
-{
- uno::Reference<beans::XPropertySet> xPropertySet(xShape, uno::UNO_QUERY);
- sal_Int16 nHoriOrient = 0;
- sal_Int16 nVertOrient = 0;
- std::optional<bool> obFitShapeToText;
- bool bFilled = true;
-
- if (aKey == u"posh")
- {
- switch (o3tl::toInt32(aValue))
- {
- case 1:
- nHoriOrient = text::HoriOrientation::LEFT;
- break;
- case 2:
- nHoriOrient = text::HoriOrientation::CENTER;
- break;
- case 3:
- nHoriOrient = text::HoriOrientation::RIGHT;
- break;
- case 4:
- nHoriOrient = text::HoriOrientation::INSIDE;
- break;
- case 5:
- nHoriOrient = text::HoriOrientation::OUTSIDE;
- break;
- default:
- break;
- }
- }
- else if (aKey == u"posv")
- {
- switch (o3tl::toInt32(aValue))
- {
- case 1:
- nVertOrient = text::VertOrientation::TOP;
- break;
- case 2:
- nVertOrient = text::VertOrientation::CENTER;
- break;
- case 3:
- nVertOrient = text::VertOrientation::BOTTOM;
- break;
- default:
- break;
- }
- }
- else if (aKey == u"fFitShapeToText")
- obFitShapeToText = o3tl::toInt32(aValue) == 1;
- else if (aKey == u"fFilled")
- bFilled = o3tl::toInt32(aValue) == 1;
- else if (aKey == u"rotation")
- {
- // See DffPropertyReader::Fix16ToAngle(): in RTF, positive rotation angles are clockwise, we have them as counter-clockwise.
- // Additionally, RTF type is 0..360*2^16, our is 0..360*100.
- sal_Int32 nRotation = o3tl::toInt32(aValue) * 100 / RTF_MULTIPLIER;
- uno::Reference<lang::XServiceInfo> xServiceInfo(xShape, uno::UNO_QUERY);
- if (!xServiceInfo->supportsService("com.sun.star.text.TextFrame"))
- xPropertySet->setPropertyValue(
- "RotateAngle", uno::Any(NormAngle36000(Degree100(nRotation * -1)).get()));
- }
-
- if (nHoriOrient != 0 && xPropertySet.is())
- xPropertySet->setPropertyValue("HoriOrient", uno::Any(nHoriOrient));
- if (nVertOrient != 0 && xPropertySet.is())
- xPropertySet->setPropertyValue("VertOrient", uno::Any(nVertOrient));
- if (obFitShapeToText.has_value() && xPropertySet.is())
- {
- xPropertySet->setPropertyValue(
- "SizeType", uno::Any(*obFitShapeToText ? text::SizeType::MIN : text::SizeType::FIX));
- xPropertySet->setPropertyValue("FrameIsAutomaticHeight", uno::Any(*obFitShapeToText));
- }
- if (!bFilled && xPropertySet.is())
- {
- if (m_bTextFrame)
- xPropertySet->setPropertyValue("BackColorTransparency", uno::Any(sal_Int32(100)));
- else
- xPropertySet->setPropertyValue("FillStyle", uno::Any(drawing::FillStyle_NONE));
- }
-}
-
-int RTFSdrImport::initShape(uno::Reference<drawing::XShape>& o_xShape,
- uno::Reference<beans::XPropertySet>& o_xPropSet, bool& o_rIsCustomShape,
- RTFShape const& rShape, bool const bClose,
- ShapeOrPict const shapeOrPict)
-{
- assert(!o_xShape.is());
- assert(!o_xPropSet.is());
- o_rIsCustomShape = false;
- m_bFakePict = false;
-
- // first, find the shape type
- int nType = -1;
- auto iter = std::find_if(rShape.getProperties().begin(), rShape.getProperties().end(),
- [](const std::pair<OUString, OUString>& rProperty) {
- return rProperty.first == "shapeType";
- });
-
- if (iter == rShape.getProperties().end())
- {
- if (SHAPE == shapeOrPict)
- {
- // The spec doesn't state what is the default for shapeType,
- // Word seems to implement it as a rectangle.
- nType = ESCHER_ShpInst_Rectangle;
- }
- else
- {
- // pict is picture by default but can be a rectangle too fdo#79319
- nType = ESCHER_ShpInst_PictureFrame;
- }
- }
- else
- {
- nType = iter->second.toInt32();
- if (PICT == shapeOrPict && ESCHER_ShpInst_PictureFrame != nType)
- {
- m_bFakePict = true;
- }
- }
-
- switch (nType)
- {
- case ESCHER_ShpInst_PictureFrame:
- createShape("com.sun.star.drawing.GraphicObjectShape", o_xShape, o_xPropSet);
- m_bTextGraphicObject = true;
- break;
- case ESCHER_ShpInst_Line:
- createShape("com.sun.star.drawing.LineShape", o_xShape, o_xPropSet);
- break;
- case ESCHER_ShpInst_Rectangle:
- case ESCHER_ShpInst_TextBox:
- // If we're inside a groupshape, can't use text frames.
- if (!bClose && m_aParents.size() == 1)
- {
- createShape("com.sun.star.text.TextFrame", o_xShape, o_xPropSet);
- m_bTextFrame = true;
- std::vector<beans::PropertyValue> aDefaults = getTextFrameDefaults(true);
- for (const beans::PropertyValue& i : aDefaults)
- o_xPropSet->setPropertyValue(i.Name, i.Value);
- break;
- }
- [[fallthrough]];
- default:
- createShape("com.sun.star.drawing.CustomShape", o_xShape, o_xPropSet);
- o_rIsCustomShape = true;
- break;
- }
-
- // Defaults
- if (o_xPropSet.is() && !m_bTextFrame)
- {
- o_xPropSet->setPropertyValue(
- "FillColor",
- uno::Any(sal_uInt32(0xffffff))); // White in Word, kind of blue in Writer.
- o_xPropSet->setPropertyValue("VertOrient", uno::Any(text::VertOrientation::NONE));
- }
-
- return nType;
-}
-
-void RTFSdrImport::resolve(RTFShape& rShape, bool bClose, ShapeOrPict const shapeOrPict)
-{
- bool bPib = false;
- m_bTextFrame = false;
- m_bTextGraphicObject = false;
-
- uno::Reference<drawing::XShape> xShape;
- uno::Reference<beans::XPropertySet> xPropertySet;
- uno::Any aAny;
- beans::PropertyValue aPropertyValue;
- awt::Rectangle aViewBox;
- std::vector<beans::PropertyValue> aPath;
- // Default line color is black in Word, blue in Writer.
- uno::Any aLineColor(COL_BLACK);
- // Default line width is 0.75 pt (26 mm100) in Word, 0 in Writer.
- uno::Any aLineWidth(sal_Int32(26));
- sal_Int16 eWritingMode = text::WritingMode2::LR_TB;
- // Groupshape support
- std::optional<sal_Int32> oGroupLeft;
- std::optional<sal_Int32> oGroupTop;
- std::optional<sal_Int32> oGroupRight;
- std::optional<sal_Int32> oGroupBottom;
- std::optional<sal_Int32> oRelLeft;
- std::optional<sal_Int32> oRelTop;
- std::optional<sal_Int32> oRelRight;
- std::optional<sal_Int32> oRelBottom;
-
- // Importing these are not trivial, let the VML import do the hard work.
- oox::vml::FillModel aFillModel; // Gradient.
- oox::vml::ShadowModel aShadowModel; // Shadow.
-
- bool bOpaque = true;
-
- std::optional<sal_Int16> oRelativeWidth;
- std::optional<sal_Int16> oRelativeHeight;
- sal_Int16 nRelativeWidthRelation = text::RelOrientation::PAGE_FRAME;
- sal_Int16 nRelativeHeightRelation = text::RelOrientation::PAGE_FRAME;
- std::optional<bool> obRelFlipV;
- bool obFlipH(false);
- bool obFlipV(false);
-
- OUString aShapeText = "";
- OUString aFontFamily = "";
- float nFontSize = 1.0;
-
- sal_Int32 nContrast = 0x10000;
- sal_Int16 nBrightness = 0;
-
- bool bCustom(false);
- int const nType = initShape(xShape, xPropertySet, bCustom, rShape, bClose, shapeOrPict);
- if (nType == ESCHER_ShpInst_PictureFrame && xPropertySet.is())
- {
- xPropertySet->setPropertyValue("IsEmptyPresentationObject", uno::Any(true));
- }
-
- for (auto& rProperty : rShape.getProperties())
- {
- if (rProperty.first == "shapeType")
- {
- continue; // ignore: already handled by initShape
- }
- if (rProperty.first == "wzName")
- {
- if (m_bTextFrame)
- {
- uno::Reference<container::XNamed> xNamed(xShape, uno::UNO_QUERY);
- xNamed->setName(rProperty.second);
- }
- else
- xPropertySet->setPropertyValue("Name", uno::Any(rProperty.second));
- }
- else if (rProperty.first == "wzDescription")
- xPropertySet->setPropertyValue("Description", uno::Any(rProperty.second));
- else if (rProperty.first == "gtextUNICODE")
- aShapeText = rProperty.second;
- else if (rProperty.first == "gtextFont")
- aFontFamily = rProperty.second;
- else if (rProperty.first == "gtextSize")
- {
- // RTF size is multiplied by 2^16
- nFontSize = static_cast<float>(rProperty.second.toUInt32()) / RTF_MULTIPLIER;
- }
- else if (rProperty.first == "pib")
- {
- m_rImport.setDestinationText(rProperty.second);
- bPib = true;
- }
- else if (rProperty.first == "fillColor" && xPropertySet.is())
- {
- aAny <<= msfilter::util::BGRToRGB(rProperty.second.toUInt32());
- if (m_bTextFrame)
- xPropertySet->setPropertyValue("BackColor", aAny);
- else
- xPropertySet->setPropertyValue("FillColor", aAny);
-
- // fillType will decide, possible it'll be the start color of a gradient.
- aFillModel.moColor
- = "#"
- + msfilter::util::ConvertColorOU(Color(ColorTransparency, aAny.get<sal_Int32>()));
- }
- else if (rProperty.first == "fillBackColor")
- // fillType will decide, possible it'll be the end color of a gradient.
- aFillModel.moColor2 = "#"
- + msfilter::util::ConvertColorOU(
- msfilter::util::BGRToRGB(rProperty.second.toInt32()));
- else if (rProperty.first == "lineColor")
- aLineColor <<= msfilter::util::BGRToRGB(rProperty.second.toInt32());
- else if (rProperty.first == "lineBackColor")
- ; // Ignore: complementer of lineColor
- else if (rProperty.first == "txflTextFlow" && xPropertySet.is())
- {
- switch (rProperty.second.toInt32())
- {
- case 1: // Top to bottom ASCII font
- case 3: // Top to bottom non-ASCII font
- eWritingMode = text::WritingMode2::TB_RL;
- break;
- case 2: // Bottom to top non-ASCII font
- eWritingMode = text::WritingMode2::BT_LR;
- break;
- }
- }
- else if (rProperty.first == "fLine" && xPropertySet.is())
- resolveFLine(xPropertySet, rProperty.second.toInt32());
- else if (rProperty.first == "fillOpacity" && xPropertySet.is())
- {
- int opacity = 100 - (rProperty.second.toInt32()) * 100 / RTF_MULTIPLIER;
- xPropertySet->setPropertyValue("FillTransparence", uno::Any(sal_uInt32(opacity)));
- }
- else if (rProperty.first == "lineWidth")
- aLineWidth <<= rProperty.second.toInt32() / 360;
- else if (rProperty.first == "pVerticies")
- {
- std::vector<drawing::EnhancedCustomShapeParameterPair> aCoordinates;
- sal_Int32 nSize = 0; // Size of a token (its value is hardwired in the exporter)
- sal_Int32 nCount = 0; // Number of tokens
- sal_Int32 nCharIndex = 0; // Character index
- do
- {
- std::u16string_view aToken = o3tl::getToken(rProperty.second, 0, ';', nCharIndex);
- if (!nSize)
- nSize = o3tl::toInt32(aToken);
- else if (!nCount)
- nCount = o3tl::toInt32(aToken);
- else if (!aToken.empty())
- {
- // The coordinates are in an (x,y) form.
- aToken = aToken.substr(1, aToken.size() - 2);
- sal_Int32 nI = 0;
- sal_Int32 nX = o3tl::toInt32(o3tl::getToken(aToken, 0, ',', nI));
- sal_Int32 nY
- = (nI >= 0) ? o3tl::toInt32(o3tl::getToken(aToken, 0, ',', nI)) : 0;
- drawing::EnhancedCustomShapeParameterPair aPair;
- aPair.First.Value <<= nX;
- aPair.Second.Value <<= nY;
- aCoordinates.push_back(aPair);
- }
- } while (nCharIndex >= 0);
- aPropertyValue.Name = "Coordinates";
- aPropertyValue.Value <<= comphelper::containerToSequence(aCoordinates);
- aPath.push_back(aPropertyValue);
- }
- else if (rProperty.first == "pSegmentInfo")
- {
- std::vector<drawing::EnhancedCustomShapeSegment> aSegments;
- sal_Int32 nSize = 0;
- sal_Int32 nCount = 0;
- sal_Int32 nCharIndex = 0;
- do
- {
- sal_Int32 nSeg
- = o3tl::toInt32(o3tl::getToken(rProperty.second, 0, ';', nCharIndex));
- if (!nSize)
- nSize = nSeg;
- else if (!nCount)
- nCount = nSeg;
- else
- {
- sal_Int32 nPoints = 1;
- if (nSeg >= 0x2000 && nSeg < 0x20FF)
- {
- nPoints = nSeg & 0x0FFF;
- nSeg &= 0xFF00;
- }
-
- drawing::EnhancedCustomShapeSegment aSegment;
- switch (nSeg)
- {
- case 0x0001: // lineto
- aSegment.Command = drawing::EnhancedCustomShapeSegmentCommand::LINETO;
- aSegment.Count = sal_Int32(1);
- aSegments.push_back(aSegment);
- break;
- case 0x4000: // moveto
- aSegment.Command = drawing::EnhancedCustomShapeSegmentCommand::MOVETO;
- aSegment.Count = sal_Int32(1);
- aSegments.push_back(aSegment);
- break;
- case 0x2000: // curveto
- aSegment.Command = drawing::EnhancedCustomShapeSegmentCommand::CURVETO;
- aSegment.Count = nPoints;
- aSegments.push_back(aSegment);
- break;
- case 0xb300: // arcto
- aSegment.Command = drawing::EnhancedCustomShapeSegmentCommand::ARCTO;
- aSegment.Count = sal_Int32(0);
- aSegments.push_back(aSegment);
- break;
- case 0xac00:
- case 0xaa00: // nofill
- case 0xab00: // nostroke
- case 0x6001: // close
- break;
- case 0x8000: // end
- aSegment.Command
- = drawing::EnhancedCustomShapeSegmentCommand::ENDSUBPATH;
- aSegment.Count = sal_Int32(0);
- aSegments.push_back(aSegment);
- break;
- default: // given number of lineto elements
- aSegment.Command = drawing::EnhancedCustomShapeSegmentCommand::LINETO;
- aSegment.Count = nSeg;
- aSegments.push_back(aSegment);
- break;
- }
- }
- } while (nCharIndex >= 0);
- aPropertyValue.Name = "Segments";
- aPropertyValue.Value <<= comphelper::containerToSequence(aSegments);
- aPath.push_back(aPropertyValue);
- }
- else if (rProperty.first == "geoLeft")
- aViewBox.X = rProperty.second.toInt32();
- else if (rProperty.first == "geoTop")
- aViewBox.Y = rProperty.second.toInt32();
- else if (rProperty.first == "geoRight")
- aViewBox.Width = rProperty.second.toInt32();
- else if (rProperty.first == "geoBottom")
- aViewBox.Height = rProperty.second.toInt32();
- else if (rProperty.first == "dhgt")
- {
- // dhgt is Word 2007, \shpz is Word 97-2003, the later has priority.
- if (!rShape.hasZ())
- resolveDhgt(xPropertySet, rProperty.second.toInt32(), /*bOldStyle=*/false);
- }
- // These are in EMU, convert to mm100.
- else if (rProperty.first == "dxTextLeft")
- {
- if (xPropertySet.is())
- xPropertySet->setPropertyValue("LeftBorderDistance",
- uno::Any(rProperty.second.toInt32() / 360));
- }
- else if (rProperty.first == "dyTextTop")
- {
- if (xPropertySet.is())
- xPropertySet->setPropertyValue("TopBorderDistance",
- uno::Any(rProperty.second.toInt32() / 360));
- }
- else if (rProperty.first == "dxTextRight")
- {
- if (xPropertySet.is())
- xPropertySet->setPropertyValue("RightBorderDistance",
- uno::Any(rProperty.second.toInt32() / 360));
- }
- else if (rProperty.first == "dyTextBottom")
- {
- if (xPropertySet.is())
- xPropertySet->setPropertyValue("BottomBorderDistance",
- uno::Any(rProperty.second.toInt32() / 360));
- }
- else if (rProperty.first == "dxWrapDistLeft")
- {
- if (m_bTextGraphicObject)
- rShape.getAnchorAttributes().set(NS_ooxml::LN_CT_Anchor_distL,
- new RTFValue(rProperty.second.toInt32()));
- else if (xPropertySet.is())
- xPropertySet->setPropertyValue("LeftMargin",
- uno::Any(rProperty.second.toInt32() / 360));
- }
- else if (rProperty.first == "dyWrapDistTop")
- {
- if (m_bTextGraphicObject)
- rShape.getAnchorAttributes().set(NS_ooxml::LN_CT_Anchor_distT,
- new RTFValue(rProperty.second.toInt32()));
- else if (xPropertySet.is())
- xPropertySet->setPropertyValue("TopMargin",
- uno::Any(rProperty.second.toInt32() / 360));
- }
- else if (rProperty.first == "dxWrapDistRight")
- {
- if (m_bTextGraphicObject)
- rShape.getAnchorAttributes().set(NS_ooxml::LN_CT_Anchor_distR,
- new RTFValue(rProperty.second.toInt32()));
- else if (xPropertySet.is())
- xPropertySet->setPropertyValue("RightMargin",
- uno::Any(rProperty.second.toInt32() / 360));
- }
- else if (rProperty.first == "dyWrapDistBottom")
- {
- if (m_bTextGraphicObject)
- rShape.getAnchorAttributes().set(NS_ooxml::LN_CT_Anchor_distB,
- new RTFValue(rProperty.second.toInt32()));
- else if (xPropertySet.is())
- xPropertySet->setPropertyValue("BottomMargin",
- uno::Any(rProperty.second.toInt32() / 360));
- }
- else if (rProperty.first == "fillType")
- {
- switch (rProperty.second.toInt32())
- {
- case 7: // Shade using the fillAngle
- aFillModel.moType = oox::XML_gradient;
- break;
- default:
- SAL_INFO("writerfilter",
- "TODO handle fillType value '" << rProperty.second << "'");
- break;
- }
- }
- else if (rProperty.first == "fillAngle")
- {
- aFillModel.moAngle = rProperty.second.toInt32() / oox::drawingml::PER_DEGREE;
- }
- else if (rProperty.first == "fillFocus")
- aFillModel.moFocus = rProperty.second.toDouble() / 100; // percent
- else if (rProperty.first == "fShadow" && xPropertySet.is())
- {
- if (rProperty.second.toInt32() == 1)
- aShadowModel.mbHasShadow = true;
- }
- else if (rProperty.first == "shadowColor")
- aShadowModel.moColor = "#"
- + msfilter::util::ConvertColorOU(
- msfilter::util::BGRToRGB(rProperty.second.toInt32()));
- else if (rProperty.first == "shadowOffsetX")
- // EMUs to points
- aShadowModel.moOffset = OUString::number(rProperty.second.toDouble() / 12700) + "pt";
- else if (rProperty.first == "posh" || rProperty.first == "posv"
- || rProperty.first == "fFitShapeToText" || rProperty.first == "fFilled"
- || rProperty.first == "rotation")
- applyProperty(xShape, rProperty.first, rProperty.second);
- else if (rProperty.first == "posrelh")
- {
- switch (rProperty.second.toInt32())
- {
- case 1:
- rShape.setHoriOrientRelation(text::RelOrientation::PAGE_FRAME);
- break;
- default:
- break;
- }
- }
- else if (rProperty.first == "posrelv")
- {
- switch (rProperty.second.toInt32())
- {
- case 1:
- rShape.setVertOrientRelation(text::RelOrientation::PAGE_FRAME);
- break;
- default:
- break;
- }
- }
- else if (rProperty.first == "groupLeft")
- oGroupLeft = convertTwipToMm100(rProperty.second.toInt32());
- else if (rProperty.first == "groupTop")
- oGroupTop = convertTwipToMm100(rProperty.second.toInt32());
- else if (rProperty.first == "groupRight")
- oGroupRight = convertTwipToMm100(rProperty.second.toInt32());
- else if (rProperty.first == "groupBottom")
- oGroupBottom = convertTwipToMm100(rProperty.second.toInt32());
- else if (rProperty.first == "relLeft")
- oRelLeft = convertTwipToMm100(rProperty.second.toInt32());
- else if (rProperty.first == "relTop")
- oRelTop = convertTwipToMm100(rProperty.second.toInt32());
- else if (rProperty.first == "relRight")
- oRelRight = convertTwipToMm100(rProperty.second.toInt32());
- else if (rProperty.first == "relBottom")
- oRelBottom = convertTwipToMm100(rProperty.second.toInt32());
- else if (rProperty.first == "fBehindDocument")
- bOpaque = !rProperty.second.toInt32();
- else if (rProperty.first == "pctHoriz" || rProperty.first == "pctVert")
- {
- sal_Int16 nPercentage = rtl::math::round(rProperty.second.toDouble() / 10);
- if (nPercentage)
- {
- std::optional<sal_Int16>& rPercentage
- = rProperty.first == "pctHoriz" ? oRelativeWidth : oRelativeHeight;
- rPercentage = nPercentage;
- }
- }
- else if (rProperty.first == "sizerelh")
- {
- if (xPropertySet.is())
- {
- switch (rProperty.second.toInt32())
- {
- case 0: // margin
- nRelativeWidthRelation = text::RelOrientation::FRAME;
- break;
- case 1: // page
- nRelativeWidthRelation = text::RelOrientation::PAGE_FRAME;
- break;
- default:
- SAL_WARN("writerfilter", "RTFSdrImport::resolve: unhandled sizerelh value: "
- << rProperty.second);
- break;
- }
- }
- }
- else if (rProperty.first == "sizerelv")
- {
- if (xPropertySet.is())
- {
- switch (rProperty.second.toInt32())
- {
- case 0: // margin
- nRelativeHeightRelation = text::RelOrientation::FRAME;
- break;
- case 1: // page
- nRelativeHeightRelation = text::RelOrientation::PAGE_FRAME;
- break;
- default:
- SAL_WARN("writerfilter", "RTFSdrImport::resolve: unhandled sizerelv value: "
- << rProperty.second);
- break;
- }
- }
- }
- else if (rProperty.first == "fHorizRule") // TODO: what does "fStandardHR" do?
- {
- // horizontal rule: relative width defaults to 100% of paragraph
- // TODO: does it have a default height?
- if (!oRelativeWidth)
- {
- oRelativeWidth = 100;
- }
- nRelativeWidthRelation = text::RelOrientation::FRAME;
- if (xPropertySet.is())
- {
- sal_Int16 const nVertOrient = text::VertOrientation::CENTER;
- xPropertySet->setPropertyValue("VertOrient", uno::Any(nVertOrient));
- }
- }
- else if (rProperty.first == "pctHR")
- {
- // horizontal rule relative width in permille
- oRelativeWidth = rProperty.second.toInt32() / 10;
- }
- else if (rProperty.first == "dxHeightHR")
- {
- // horizontal rule height
- sal_uInt32 const nHeight(convertTwipToMm100(rProperty.second.toInt32()));
- rShape.setBottom(rShape.getTop() + nHeight);
- }
- else if (rProperty.first == "dxWidthHR")
- {
- // horizontal rule width
- sal_uInt32 const nWidth(convertTwipToMm100(rProperty.second.toInt32()));
- rShape.setRight(rShape.getLeft() + nWidth);
- }
- else if (rProperty.first == "alignHR")
- {
- // horizontal orientation *for horizontal rule*
- sal_Int16 nHoriOrient = text::HoriOrientation::NONE;
- switch (rProperty.second.toInt32())
- {
- case 0:
- nHoriOrient = text::HoriOrientation::LEFT;
- break;
- case 1:
- nHoriOrient = text::HoriOrientation::CENTER;
- break;
- case 2:
- nHoriOrient = text::HoriOrientation::RIGHT;
- break;
- }
- if (xPropertySet.is() && text::HoriOrientation::NONE != nHoriOrient)
- {
- xPropertySet->setPropertyValue("HoriOrient", uno::Any(nHoriOrient));
- }
- }
- else if (rProperty.first == "pWrapPolygonVertices")
- {
- RTFSprms aPolygonSprms;
- sal_Int32 nSize = 0; // Size of a token
- sal_Int32 nCount = 0; // Number of tokens
- sal_Int32 nCharIndex = 0; // Character index
- do
- {
- std::u16string_view aToken = o3tl::getToken(rProperty.second, 0, ';', nCharIndex);
- if (!nSize)
- nSize = o3tl::toInt32(aToken);
- else if (!nCount)
- nCount = o3tl::toInt32(aToken);
- else if (!aToken.empty())
- {
- // The coordinates are in an (x,y) form.
- aToken = aToken.substr(1, aToken.size() - 2);
- sal_Int32 nI = 0;
- sal_Int32 nX = o3tl::toInt32(o3tl::getToken(aToken, 0, ',', nI));
- sal_Int32 nY
- = (nI >= 0) ? o3tl::toInt32(o3tl::getToken(aToken, 0, ',', nI)) : 0;
- RTFSprms aPathAttributes;
- aPathAttributes.set(NS_ooxml::LN_CT_Point2D_x, new RTFValue(nX));
- aPathAttributes.set(NS_ooxml::LN_CT_Point2D_y, new RTFValue(nY));
- aPolygonSprms.set(NS_ooxml::LN_CT_WrapPath_lineTo,
- new RTFValue(aPathAttributes), RTFOverwrite::NO_APPEND);
- }
- } while (nCharIndex >= 0);
- rShape.getWrapPolygonSprms() = aPolygonSprms;
- }
- else if (rProperty.first == "fRelFlipV")
- obRelFlipV = rProperty.second.toInt32() == 1;
- else if (rProperty.first == "fFlipH")
- obFlipH = rProperty.second.toInt32() == 1;
- else if (rProperty.first == "fFlipV")
- obFlipV = rProperty.second.toInt32() == 1;
- else if (rProperty.first == "pictureContrast")
- {
- // Gain / contrast.
- nContrast = rProperty.second.toInt32();
- if (nContrast < 0x10000)
- {
- nContrast *= 101; // 100 + 1 to round
- nContrast /= 0x10000;
- nContrast -= 100;
- }
- }
- else if (rProperty.first == "pictureBrightness")
- {
- // Blacklevel / brightness.
- nBrightness = rProperty.second.toInt32();
- if (nBrightness != 0)
- {
- nBrightness /= 327;
- }
- }
- else
- SAL_INFO("writerfilter", "TODO handle shape property '" << rProperty.first << "':'"
- << rProperty.second << "'");
- }
-
- if (xPropertySet.is())
- {
- resolveLineColorAndWidth(m_bTextFrame, xPropertySet, aLineColor, aLineWidth);
- if (rShape.hasZ())
- {
- bool bOldStyle = m_aParents.size() > 1;
- resolveDhgt(xPropertySet, rShape.getZ(), bOldStyle);
- }
- if (m_bTextFrame)
- xPropertySet->setPropertyValue("WritingMode", uno::Any(eWritingMode));
- else
- // Only Writer textframes implement text::WritingMode2.
- xPropertySet->setPropertyValue("TextWritingMode",
- uno::Any(text::WritingMode(eWritingMode)));
- }
-
- if (!m_aParents.empty() && m_aParents.top().is() && !m_bTextFrame)
- m_aParents.top()->add(xShape);
-
- if (nContrast == -70 && nBrightness == 70 && xPropertySet.is())
- {
- // Map MSO 'washout' to our watermark colormode.
- xPropertySet->setPropertyValue("GraphicColorMode", uno::Any(drawing::ColorMode_WATERMARK));
- }
-
- if (bCustom && xShape.is() && !bPib)
- {
- uno::Reference<drawing::XEnhancedCustomShapeDefaulter> xDefaulter(xShape, uno::UNO_QUERY);
- xDefaulter->createCustomShapeDefaults(OUString::number(nType));
- }
-
- // Set shape text
- if (bCustom && !aShapeText.isEmpty())
- {
- uno::Reference<text::XTextRange> xTextRange(xShape, uno::UNO_QUERY);
- if (xTextRange.is())
- xTextRange->setString(aShapeText);
-
- xPropertySet->setPropertyValue("CharFontName", uno::Any(aFontFamily));
- xPropertySet->setPropertyValue("CharHeight", uno::Any(nFontSize));
- }
-
- // Creating CustomShapeGeometry property
- if (bCustom && xPropertySet.is())
- {
- bool bChanged = false;
- comphelper::SequenceAsHashMap aCustomShapeGeometry(
- xPropertySet->getPropertyValue("CustomShapeGeometry"));
-
- if (aViewBox.X || aViewBox.Y || aViewBox.Width || aViewBox.Height)
- {
- aViewBox.Width -= aViewBox.X;
- aViewBox.Height -= aViewBox.Y;
- aCustomShapeGeometry["ViewBox"] <<= aViewBox;
- bChanged = true;
- }
-
- if (!aPath.empty())
- {
- aCustomShapeGeometry["Path"] <<= comphelper::containerToSequence(aPath);
- bChanged = true;
- }
-
- if (!aShapeText.isEmpty())
- {
- uno::Sequence<beans::PropertyValue> aSequence(comphelper::InitPropertySequence({
- { "TextPath", uno::Any(true) },
- }));
- aCustomShapeGeometry["TextPath"] <<= aSequence;
- xPropertySet->setPropertyValue("TextAutoGrowHeight", uno::Any(false));
- xPropertySet->setPropertyValue("TextAutoGrowWidth", uno::Any(false));
- bChanged = true;
- }
-
- if (bChanged)
- {
- xPropertySet->setPropertyValue(
- "CustomShapeGeometry",
- uno::Any(aCustomShapeGeometry.getAsConstPropertyValueList()));
- }
- }
-
- if (obRelFlipV.has_value() && xPropertySet.is())
- {
- if (nType == ESCHER_ShpInst_Line)
- {
- // Line shape inside group shape: get the polygon sequence and transform it.
- uno::Sequence<uno::Sequence<awt::Point>> aPolyPolySequence;
- if ((xPropertySet->getPropertyValue("PolyPolygon") >>= aPolyPolySequence)
- && aPolyPolySequence.hasElements())
- {
- uno::Sequence<awt::Point>& rPolygon = aPolyPolySequence.getArray()[0];
- basegfx::B2DPolygon aPoly;
- for (const awt::Point& rPoint : rPolygon)
- {
- aPoly.append(basegfx::B2DPoint(rPoint.X, rPoint.Y));
- }
- basegfx::B2DHomMatrix aTransformation;
- aTransformation.scale(1.0, *obRelFlipV ? -1.0 : 1.0);
- aPoly.transform(aTransformation);
- auto pPolygon = rPolygon.getArray();
- for (sal_Int32 i = 0; i < rPolygon.getLength(); ++i)
- {
- basegfx::B2DPoint aPoint(aPoly.getB2DPoint(i));
- pPolygon[i] = awt::Point(static_cast<sal_Int32>(aPoint.getX()),
- static_cast<sal_Int32>(aPoint.getY()));
- }
- xPropertySet->setPropertyValue("PolyPolygon", uno::Any(aPolyPolySequence));
- }
- }
- }
-
- // Set position and size
- if (xShape.is())
- {
- sal_Int32 nLeft = rShape.getLeft();
- sal_Int32 nTop = rShape.getTop();
-
- bool bInShapeGroup = oGroupLeft && oGroupTop && oGroupRight && oGroupBottom && oRelLeft
- && oRelTop && oRelRight && oRelBottom;
- awt::Size aSize;
- if (bInShapeGroup)
- {
- // See lclGetAbsPoint() in the VML import: rShape is the group shape, oGroup is its coordinate system, oRel is the relative child shape.
- sal_Int32 nShapeWidth = rShape.getRight() - rShape.getLeft();
- sal_Int32 nShapeHeight = rShape.getBottom() - rShape.getTop();
- sal_Int32 nCoordSysWidth = *oGroupRight - *oGroupLeft;
- sal_Int32 nCoordSysHeight = *oGroupBottom - *oGroupTop;
- double fWidthRatio = static_cast<double>(nShapeWidth) / nCoordSysWidth;
- double fHeightRatio = static_cast<double>(nShapeHeight) / nCoordSysHeight;
- nLeft = static_cast<sal_Int32>(rShape.getLeft()
- + fWidthRatio * (*oRelLeft - *oGroupLeft));
- nTop = static_cast<sal_Int32>(rShape.getTop() + fHeightRatio * (*oRelTop - *oGroupTop));
-
- // See lclGetAbsRect() in the VML import.
- aSize.Width = std::lround(fWidthRatio * (*oRelRight - *oRelLeft));
- aSize.Height = std::lround(fHeightRatio * (*oRelBottom - *oRelTop));
- }
-
- if (m_bTextFrame)
- {
- xPropertySet->setPropertyValue("HoriOrientPosition", uno::Any(nLeft));
- xPropertySet->setPropertyValue("VertOrientPosition", uno::Any(nTop));
- }
- else
- xShape->setPosition(awt::Point(nLeft, nTop));
-
- if (bInShapeGroup)
- xShape->setSize(aSize);
- else
- xShape->setSize(awt::Size(rShape.getRight() - rShape.getLeft(),
- rShape.getBottom() - rShape.getTop()));
-
- if (obFlipH || obFlipV)
- {
- if (bCustom)
- {
- // This has to be set after position and size is set, otherwise flip will affect the position.
- comphelper::SequenceAsHashMap aCustomShapeGeometry(
- xPropertySet->getPropertyValue("CustomShapeGeometry"));
- if (obFlipH)
- aCustomShapeGeometry["MirroredX"] <<= true;
- if (obFlipV)
- aCustomShapeGeometry["MirroredY"] <<= true;
- xPropertySet->setPropertyValue(
- "CustomShapeGeometry",
- uno::Any(aCustomShapeGeometry.getAsConstPropertyValueList()));
- }
- else if (SdrObject* pObject = SdrObject::getSdrObjectFromXShape(xShape))
- {
- Point aRef1 = pObject->GetSnapRect().Center();
- Point aRef2(aRef1);
- if (obFlipH)
- {
- // Horizontal mirror means a vertical reference line.
- aRef2.AdjustY(1);
- }
- if (obFlipV)
- {
- // Vertical mirror means a horizontal reference line.
- aRef2.AdjustX(1);
- }
- pObject->Mirror(aRef1, aRef2);
- }
- }
-
- if (rShape.getHoriOrientRelation() != 0)
- xPropertySet->setPropertyValue("HoriOrientRelation",
- uno::Any(rShape.getHoriOrientRelation()));
- if (rShape.getVertOrientRelation() != 0)
- xPropertySet->setPropertyValue("VertOrientRelation",
- uno::Any(rShape.getVertOrientRelation()));
- if (rShape.getWrap() != text::WrapTextMode::WrapTextMode_MAKE_FIXED_SIZE)
- xPropertySet->setPropertyValue("Surround", uno::Any(rShape.getWrap()));
- oox::ModelObjectHelper aModelObjectHelper(m_rImport.getModelFactory());
- if (aFillModel.moType.has_value())
- {
- oox::drawingml::ShapePropertyMap aPropMap(aModelObjectHelper);
- aFillModel.pushToPropMap(aPropMap, m_rImport.getGraphicHelper());
- // Sets the FillStyle and FillGradient UNO properties.
- oox::PropertySet(xShape).setProperties(aPropMap);
- }
-
- if (aShadowModel.mbHasShadow)
- {
- oox::drawingml::ShapePropertyMap aPropMap(aModelObjectHelper);
- aShadowModel.pushToPropMap(aPropMap, m_rImport.getGraphicHelper());
- // Sets the ShadowFormat UNO property.
- oox::PropertySet(xShape).setProperties(aPropMap);
- }
- xPropertySet->setPropertyValue("AnchorType",
- uno::Any(text::TextContentAnchorType_AT_CHARACTER));
- xPropertySet->setPropertyValue("Opaque", uno::Any(bOpaque));
- if (oRelativeWidth)
- {
- xPropertySet->setPropertyValue("RelativeWidth", uno::Any(*oRelativeWidth));
- xPropertySet->setPropertyValue("RelativeWidthRelation",
- uno::Any(nRelativeWidthRelation));
- }
- if (oRelativeHeight)
- {
- xPropertySet->setPropertyValue("RelativeHeight", uno::Any(*oRelativeHeight));
- xPropertySet->setPropertyValue("RelativeHeightRelation",
- uno::Any(nRelativeHeightRelation));
- }
- }
-
- if (bPib)
- {
- m_rImport.resolvePict(false, xShape);
- }
-
- if (nType == ESCHER_ShpInst_PictureFrame) // picture frame
- {
- assert(!m_bTextFrame);
- if (!bPib) // ??? not sure if the early return should be removed on else?
- {
- m_xShape = xShape; // store it for later resolvePict call
- }
-
- // Handle horizontal flip.
- if (obFlipH && xPropertySet.is())
- xPropertySet->setPropertyValue("IsMirrored", uno::Any(true));
- return;
- }
-
- // Send it to dmapper
- if (xShape.is())
- {
- m_rImport.Mapper().startShape(xShape);
- if (bClose)
- {
- m_rImport.Mapper().endShape();
- }
- }
-
- if (m_rImport.isInBackground())
- {
- RTFSprms aSprms;
- aSprms.set(NS_ooxml::LN_background_background, new RTFValue()); // action="end"
- m_rImport.Mapper().props(new RTFReferenceProperties(RTFSprms(), std::move(aSprms)));
- }
-
- // If the shape has an inner shape, the inner object's properties should not be influenced by
- // the outer one.
- rShape.getProperties().clear();
-
- m_xShape = xShape;
-}
-
-void RTFSdrImport::close() { m_rImport.Mapper().endShape(); }
-
-void RTFSdrImport::append(std::u16string_view aKey, std::u16string_view aValue)
-{
- applyProperty(m_xShape, aKey, aValue);
-}
-
-void RTFSdrImport::appendGroupProperty(std::u16string_view aKey, std::u16string_view aValue)
-{
- if (m_aParents.empty())
- return;
- uno::Reference<drawing::XShape> xShape(m_aParents.top(), uno::UNO_QUERY);
- if (xShape.is())
- applyProperty(xShape, aKey, aValue);
-}
-
-} // namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfsdrimport.hxx b/writerfilter/source/rtftok/rtfsdrimport.hxx
deleted file mode 100644
index b06803bd0f64..000000000000
--- a/writerfilter/source/rtftok/rtfsdrimport.hxx
+++ /dev/null
@@ -1,104 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-#include <stack>
-#include <vector>
-
-#include <dmapper/GraphicZOrderHelper.hxx>
-#include <tools/ref.hxx>
-
-namespace com::sun::star
-{
-namespace beans
-{
-class XPropertySet;
-struct PropertyValue;
-}
-namespace drawing
-{
-class XShape;
-class XShapes;
-}
-namespace lang
-{
-class XComponent;
-}
-}
-
-namespace writerfilter::rtftok
-{
-class RTFDocumentImpl;
-class RTFShape;
-
-/// Handles the import of drawings using RTF markup.
-class RTFSdrImport final : public virtual SvRefBase
-{
-public:
- RTFSdrImport(RTFDocumentImpl& rDocument,
- css::uno::Reference<css::lang::XComponent> const& xDstDoc);
- ~RTFSdrImport() override;
-
- enum ShapeOrPict
- {
- SHAPE,
- PICT
- };
- void resolve(RTFShape& rShape, bool bClose, ShapeOrPict shapeOrPict);
- void close();
- void append(std::u16string_view aKey, std::u16string_view aValue);
- /// Append property on the current parent.
- void appendGroupProperty(std::u16string_view aKey, std::u16string_view aValue);
- void resolveDhgt(css::uno::Reference<css::beans::XPropertySet> const& xPropertySet,
- sal_Int32 nZOrder, bool bOldStyle);
- /// Set line color and line width on the shape, using the relevant API depending on if the shape is a text frame or not.
- static void
- resolveLineColorAndWidth(bool bTextFrame,
- const css::uno::Reference<css::beans::XPropertySet>& xPropertySet,
- css::uno::Any const& rLineColor, css::uno::Any const& rLineWidth);
- static void resolveFLine(css::uno::Reference<css::beans::XPropertySet> const& xPropertySet,
- sal_Int32 nFLine);
- /**
- * These are the default in Word, but not in Writer.
- *
- * @param bNew if the frame is new-style or old-style.
- */
- static std::vector<css::beans::PropertyValue> getTextFrameDefaults(bool bNew);
- /// Push a new group shape to the parent stack.
- void pushParent(css::uno::Reference<css::drawing::XShapes> const& xParent);
- /// Pop the current group shape from the parent stack.
- void popParent();
- css::uno::Reference<css::drawing::XShape> const& getCurrentShape() const { return m_xShape; }
- bool isFakePict() const { return m_bFakePict; }
- bool isTextGraphicObject() const { return m_bTextGraphicObject; }
-
-private:
- void createShape(const OUString& rService, css::uno::Reference<css::drawing::XShape>& xShape,
- css::uno::Reference<css::beans::XPropertySet>& xPropertySet);
- void applyProperty(css::uno::Reference<css::drawing::XShape> const& xShape,
- std::u16string_view aKey, std::u16string_view aValue) const;
- int initShape(css::uno::Reference<css::drawing::XShape>& o_xShape,
- css::uno::Reference<css::beans::XPropertySet>& o_xPropSet, bool& o_rIsCustomShape,
- RTFShape const& rShape, bool bClose, ShapeOrPict shapeOrPict);
-
- RTFDocumentImpl& m_rImport;
- std::stack<css::uno::Reference<css::drawing::XShapes>> m_aParents;
- css::uno::Reference<css::drawing::XShape> m_xShape;
- /// If m_xShape is imported as a Writer text frame (instead of a drawinglayer rectangle).
- bool m_bTextFrame;
- /// If m_xShape is imported as a Writer text graphic object (instead of a drawinglayer shape).
- bool m_bTextGraphicObject;
- /// if inside \pict, but actually it's a shape (not a picture)
- bool m_bFakePict;
- std::stack<writerfilter::dmapper::GraphicZOrderHelper> m_aGraphicZOrderHelpers;
-};
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfskipdestination.cxx b/writerfilter/source/rtftok/rtfskipdestination.cxx
deleted file mode 100644
index ad2122318333..000000000000
--- a/writerfilter/source/rtftok/rtfskipdestination.cxx
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- 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 "rtfskipdestination.hxx"
-#include <sal/log.hxx>
-#include "rtflistener.hxx"
-
-namespace writerfilter::rtftok
-{
-RTFSkipDestination::RTFSkipDestination(RTFListener& rImport)
- : m_rImport(rImport)
- , m_bParsed(true)
- , m_bReset(true)
-{
-}
-
-RTFSkipDestination::~RTFSkipDestination()
-{
- if (m_rImport.getSkipUnknown() && m_bReset)
- {
- if (!m_bParsed)
- {
- SAL_INFO("writerfilter", __func__ << ": skipping destination");
- m_rImport.setDestination(Destination::SKIP);
- }
- m_rImport.setSkipUnknown(false);
- }
-}
-
-void RTFSkipDestination::setParsed(bool bParsed) { m_bParsed = bParsed; }
-
-void RTFSkipDestination::setReset(bool bReset) { m_bReset = bReset; }
-
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfskipdestination.hxx b/writerfilter/source/rtftok/rtfskipdestination.hxx
deleted file mode 100644
index 4a894373f1e4..000000000000
--- a/writerfilter/source/rtftok/rtfskipdestination.hxx
+++ /dev/null
@@ -1,33 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-namespace writerfilter::rtftok
-{
-class RTFListener;
-
-/// Skips a destination after a not parsed control word if it was prefixed with \*
-class RTFSkipDestination final
-{
-public:
- explicit RTFSkipDestination(RTFListener& rImport);
- ~RTFSkipDestination();
- void setParsed(bool bParsed);
- void setReset(bool bReset);
-
-private:
- RTFListener& m_rImport;
- bool m_bParsed;
- /// If false, the destructor is a noop, required by the \* symbol itself.
- bool m_bReset;
-};
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfsprm.cxx b/writerfilter/source/rtftok/rtfsprm.cxx
deleted file mode 100644
index 148d39c2e48b..000000000000
--- a/writerfilter/source/rtftok/rtfsprm.cxx
+++ /dev/null
@@ -1,487 +0,0 @@
-/* -*- 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 "rtfsprm.hxx"
-#include <ooxml/resourceids.hxx>
-#include <ooxml/QNameToString.hxx>
-#include <rtl/strbuf.hxx>
-#include "rtfdocumentimpl.hxx"
-#include <algorithm>
-
-namespace writerfilter::rtftok
-{
-RTFSprm::RTFSprm(Id nKeyword, RTFValue::Pointer_t& pValue)
- : m_nKeyword(nKeyword)
- , m_pValue(pValue)
-{
-}
-
-sal_uInt32 RTFSprm::getId() const { return m_nKeyword; }
-
-Value::Pointer_t RTFSprm::getValue() { return Value::Pointer_t(m_pValue->Clone()); }
-
-writerfilter::Reference<Properties>::Pointer_t RTFSprm::getProps()
-{
- return m_pValue->getProperties();
-}
-
-#ifdef DBG_UTIL
-std::string RTFSprm::getName() const { return "RTFSprm"; }
-#endif
-
-#ifdef DBG_UTIL
-std::string RTFSprm::toString() const
-{
- OStringBuffer aBuf("RTFSprm");
-
- std::string sResult = QNameToString(m_nKeyword);
-
- aBuf.append(" ('");
- if (sResult.length() == 0)
- aBuf.append(sal_Int32(m_nKeyword));
- else
- aBuf.append(sResult.c_str());
- aBuf.append("', '" + m_pValue->toString() + "')");
-
- return std::string(aBuf);
-}
-#endif
-
-namespace
-{
-class RTFSprms_compare
-{
- Id m_keyword;
-
-public:
- RTFSprms_compare(Id keyword)
- : m_keyword{ keyword }
- {
- }
- bool operator()(const std::pair<Id, RTFValue::Pointer_t>& raPair) const
- {
- return raPair.first == m_keyword;
- }
-};
-}
-
-RTFValue::Pointer_t RTFSprms::find(Id nKeyword, bool bFirst, bool bForWrite)
-{
- if (bForWrite)
- ensureCopyBeforeWrite();
-
- RTFSprms_compare cmp{ nKeyword };
-
- if (bFirst)
- {
- auto it = std::find_if(m_pSprms->begin(), m_pSprms->end(), cmp);
- if (it != m_pSprms->end())
- return it->second;
- }
- else
- // find last
- {
- auto rit = std::find_if(m_pSprms->rbegin(), m_pSprms->rend(), cmp);
- if (rit != m_pSprms->rend())
- return rit->second;
- }
-
- return RTFValue::Pointer_t{};
-}
-
-void RTFSprms::set(Id nKeyword, const RTFValue::Pointer_t& pValue, RTFOverwrite eOverwrite)
-{
- ensureCopyBeforeWrite();
-
- switch (eOverwrite)
- {
- case RTFOverwrite::YES_PREPEND:
- {
- std::erase_if(*m_pSprms, RTFSprms_compare{ nKeyword });
- m_pSprms->emplace(m_pSprms->cbegin(), nKeyword, pValue);
- break;
- }
- case RTFOverwrite::YES:
- {
- auto it
- = std::find_if(m_pSprms->begin(), m_pSprms->end(), RTFSprms_compare{ nKeyword });
- if (it != m_pSprms->end())
- it->second = pValue;
- else
- m_pSprms->emplace_back(nKeyword, pValue);
- break;
- }
- case RTFOverwrite::NO_IGNORE:
- {
- if (std::none_of(m_pSprms->cbegin(), m_pSprms->cend(), RTFSprms_compare{ nKeyword }))
- m_pSprms->emplace_back(nKeyword, pValue);
- break;
- }
- case RTFOverwrite::NO_APPEND:
- {
- m_pSprms->emplace_back(nKeyword, pValue);
- break;
- }
- }
-}
-
-bool RTFSprms::erase(Id nKeyword)
-{
- ensureCopyBeforeWrite();
-
- auto i = std::find_if(m_pSprms->begin(), m_pSprms->end(), RTFSprms_compare{ nKeyword });
- if (i != m_pSprms->end())
- {
- m_pSprms->erase(i);
- return true;
- }
- return false;
-}
-
-void RTFSprms::eraseLast(Id nKeyword)
-{
- ensureCopyBeforeWrite();
-
- auto i = std::find_if(m_pSprms->rbegin(), m_pSprms->rend(), RTFSprms_compare{ nKeyword });
- if (i != m_pSprms->rend())
- m_pSprms->erase(std::next(i).base());
-}
-
-static RTFValue::Pointer_t getDefaultSPRM(Id const id, Id nStyleType)
-{
- if (nStyleType == NS_ooxml::LN_Value_ST_StyleType_character)
- {
- switch (id)
- {
- case NS_ooxml::LN_EG_RPrBase_szCs:
- case NS_ooxml::LN_EG_RPrBase_sz:
- return new RTFValue(24);
- case NS_ooxml::LN_CT_Color_val:
- return new RTFValue(0);
- case NS_ooxml::LN_EG_RPrBase_b:
- case NS_ooxml::LN_EG_RPrBase_i:
- return new RTFValue(0);
- case NS_ooxml::LN_CT_Underline_val:
- return new RTFValue(NS_ooxml::LN_Value_ST_Underline_none);
- case NS_ooxml::LN_CT_Fonts_ascii:
- case NS_ooxml::LN_CT_Fonts_eastAsia:
- case NS_ooxml::LN_CT_Fonts_cs:
- return new RTFValue("Times New Roman");
- default:
- break;
- }
- }
-
- if (!nStyleType || nStyleType == NS_ooxml::LN_Value_ST_StyleType_paragraph)
- {
- switch (id)
- {
- case NS_ooxml::LN_CT_Spacing_before:
- case NS_ooxml::LN_CT_Spacing_after:
- case NS_ooxml::LN_CT_Ind_left:
- case NS_ooxml::LN_CT_Ind_right:
- case NS_ooxml::LN_CT_Ind_firstLine:
- return new RTFValue(0);
- case NS_ooxml::LN_CT_Spacing_lineRule:
- return new RTFValue(NS_ooxml::LN_Value_doc_ST_LineSpacingRule_auto);
- case NS_ooxml::LN_CT_Spacing_line:
- // presumably this means 100%, cf. static const int nSingleLineSpacing = 240;
- return new RTFValue(240);
- case NS_ooxml::LN_CT_NumPr_numId:
- return new RTFValue(0);
- case NS_ooxml::LN_CT_PrBase_pBdr:
- { // tdf#150382 default all paragraph borders to none
- RTFSprms attributes;
- RTFSprms sprms;
- for (int i = 0; i < 4; ++i)
- {
- auto const nBorder = getParagraphBorder(i);
- RTFSprms aAttributes;
- RTFSprms aSprms;
- aAttributes.set(NS_ooxml::LN_CT_Border_val,
- new RTFValue(NS_ooxml::LN_Value_ST_Border_none));
- sprms.set(nBorder, new RTFValue(aAttributes, aSprms));
- }
- return new RTFValue(attributes, sprms);
- }
-
- default:
- break;
- }
- }
-
- return RTFValue::Pointer_t();
-}
-
-/// Is it problematic to deduplicate this SPRM?
-static bool isSPRMDeduplicateDenylist(Id nId, RTFSprms* pDirect)
-{
- switch (nId)
- {
- // See the NS_ooxml::LN_CT_PPrBase_tabs handler in DomainMapper,
- // deduplication is explicitly not wanted for these tokens.
- case NS_ooxml::LN_CT_TabStop_val:
- case NS_ooxml::LN_CT_TabStop_leader:
- case NS_ooxml::LN_CT_TabStop_pos:
- // \htmautsp arrives after the style table, so only the non-style value is
- // correct, keep these.
- case NS_ooxml::LN_CT_Spacing_beforeAutospacing:
- case NS_ooxml::LN_CT_Spacing_afterAutospacing:
- // \chbrdr requires *all* of the border settings to be present,
- // otherwise a default (NONE) border is created from the removed
- // attributes which then overrides the style-defined border.
- // See BorderHandler.cxx and NS_ooxml::LN_EG_RPrBase_bdr in DomainMapper.
- // This also is needed for NS_ooxml::LN_CT_PBdr_top etc.
- case NS_ooxml::LN_CT_Border_sz:
- case NS_ooxml::LN_CT_Border_val:
- case NS_ooxml::LN_CT_Border_color:
- case NS_ooxml::LN_CT_Border_space:
- case NS_ooxml::LN_CT_Border_shadow:
- case NS_ooxml::LN_CT_Border_frame:
- case NS_ooxml::LN_CT_Border_themeTint:
- case NS_ooxml::LN_CT_Border_themeColor:
- return true;
- // Removing \fi and \li if the style has the same value would mean taking these values from
- // \ls, while deduplication would be done to take the values from the style.
- case NS_ooxml::LN_CT_Ind_firstLine:
- case NS_ooxml::LN_CT_Ind_left:
- return pDirect && pDirect->find(NS_ooxml::LN_CT_PPrBase_numPr);
-
- default:
- return false;
- }
-}
-
-/// Should this SPRM be removed if all its children are removed?
-static bool isSPRMChildrenExpected(Id nId)
-{
- switch (nId)
- {
- case NS_ooxml::LN_CT_PBdr_top:
- case NS_ooxml::LN_CT_PBdr_left:
- case NS_ooxml::LN_CT_PBdr_bottom:
- case NS_ooxml::LN_CT_PBdr_right:
- // Expected children are NS_ooxml::LN_CT_Border_*.
- case NS_ooxml::LN_CT_PrBase_shd:
- // Expected children are NS_ooxml::LN_CT_Shd_*.
- case NS_ooxml::LN_CT_PPrBase_ind:
- // Expected children are NS_ooxml::LN_CT_Ind_*.
- return true;
-
- default:
- return false;
- }
-}
-
-/// Does the clone / deduplication of a single sprm.
-static void cloneAndDeduplicateSprm(std::pair<Id, RTFValue::Pointer_t> const& rSprm, RTFSprms& ret,
- Id nStyleType, RTFSprms* pDirect = nullptr)
-{
- RTFValue::Pointer_t const pValue(ret.find(rSprm.first));
- if (pValue)
- {
- if (rSprm.second->equals(*pValue))
- {
- //this removes properties that are equal at the style and at the sprm
- //don't do that for paragraph styles
- if (nStyleType == NS_ooxml::LN_Value_ST_StyleType_character)
- {
- if (!isSPRMDeduplicateDenylist(rSprm.first, pDirect))
- {
- ret.erase(rSprm.first); // duplicate to style
- }
- }
- }
- else if (!rSprm.second->getSprms().empty() || !rSprm.second->getAttributes().empty())
- {
- RTFSprms const sprms(pValue->getSprms().cloneAndDeduplicate(
- rSprm.second->getSprms(), nStyleType, /*bImplicitPPr =*/false, pDirect));
- RTFSprms const attributes(pValue->getAttributes().cloneAndDeduplicate(
- rSprm.second->getAttributes(), nStyleType, /*bImplicitPPr =*/false, pDirect));
- // Don't copy the sprm in case we expect it to have children but it doesn't have some.
- if (!isSPRMChildrenExpected(rSprm.first) || !sprms.empty() || !attributes.empty())
- ret.set(rSprm.first,
- RTFValue::Pointer_t(pValue->CloneWithSprms(attributes, sprms)));
- }
- }
- else
- {
- // not found - try to override style with default
- RTFValue::Pointer_t const pDefault(getDefaultSPRM(rSprm.first, nStyleType));
- if (pDefault)
- {
- ret.set(rSprm.first, pDefault);
- }
- else if (!rSprm.second->getSprms().empty() || !rSprm.second->getAttributes().empty())
- {
- RTFSprms const sprms(
- RTFSprms().cloneAndDeduplicate(rSprm.second->getSprms(), nStyleType));
- RTFSprms const attributes(
- RTFSprms().cloneAndDeduplicate(rSprm.second->getAttributes(), nStyleType));
- if (!sprms.empty() || !attributes.empty())
- {
- ret.set(rSprm.first, new RTFValue(attributes, sprms));
- }
- }
- }
-}
-
-/// Extracts the list level matching nLevel from pAbstract.
-static RTFValue::Pointer_t getListLevel(const RTFValue::Pointer_t& pAbstract, int nLevel)
-{
- for (const auto& rPair : pAbstract->getSprms())
- {
- if (rPair.first != NS_ooxml::LN_CT_AbstractNum_lvl)
- continue;
-
- RTFValue::Pointer_t pLevel = rPair.second->getAttributes().find(NS_ooxml::LN_CT_Lvl_ilvl);
- if (!pLevel)
- continue;
-
- if (pLevel->getInt() != nLevel)
- continue;
-
- return rPair.second;
- }
-
- return RTFValue::Pointer_t();
-}
-
-void RTFSprms::deduplicateList(const std::map<int, int>& rInvalidListLevelFirstIndents)
-{
- int nLevel = 0;
- RTFValue::Pointer_t pLevelId
- = getNestedSprm(*this, NS_ooxml::LN_CT_PPrBase_numPr, NS_ooxml::LN_CT_NumPr_ilvl);
- if (pLevelId)
- nLevel = pLevelId->getInt();
-
- auto it = rInvalidListLevelFirstIndents.find(nLevel);
- if (it == rInvalidListLevelFirstIndents.end())
- return;
-
- int nListValue = it->second;
-
- RTFValue::Pointer_t pParagraphValue
- = getNestedAttribute(*this, NS_ooxml::LN_CT_PPrBase_ind, NS_ooxml::LN_CT_Ind_firstLine);
- if (!pParagraphValue)
- return;
-
- int nParagraphValue = pParagraphValue->getInt();
-
- if (nParagraphValue == nListValue)
- eraseNestedAttribute(*this, NS_ooxml::LN_CT_PPrBase_ind, NS_ooxml::LN_CT_Ind_firstLine);
-}
-
-void RTFSprms::duplicateList(const RTFValue::Pointer_t& pAbstract)
-{
- int nLevel = 0;
- RTFValue::Pointer_t pLevelId
- = getNestedSprm(*this, NS_ooxml::LN_CT_PPrBase_numPr, NS_ooxml::LN_CT_NumPr_ilvl);
- if (pLevelId)
- nLevel = pLevelId->getInt();
-
- RTFValue::Pointer_t pLevel = getListLevel(pAbstract, nLevel);
- if (!pLevel)
- return;
-
- RTFValue::Pointer_t pLevelInd = pLevel->getSprms().find(NS_ooxml::LN_CT_PPrBase_ind);
- if (!pLevelInd)
- return;
-
- for (const auto& rListLevelPair : pLevelInd->getAttributes())
- {
- switch (rListLevelPair.first)
- {
- case NS_ooxml::LN_CT_Ind_left:
- case NS_ooxml::LN_CT_Ind_right:
- case NS_ooxml::LN_CT_Ind_firstLine:
- RTFValue::Pointer_t pParagraphValue
- = getNestedAttribute(*this, NS_ooxml::LN_CT_PPrBase_ind, rListLevelPair.first);
- if (!pParagraphValue)
- putNestedAttribute(*this, NS_ooxml::LN_CT_PPrBase_ind, rListLevelPair.first,
- getDefaultSPRM(rListLevelPair.first, 0));
-
- break;
- }
- }
-}
-
-RTFSprms RTFSprms::cloneAndDeduplicate(RTFSprms& rReference, Id const nStyleType,
- bool const bImplicitPPr, RTFSprms* pDirect) const
-{
- RTFSprms ret(*this);
- ret.ensureCopyBeforeWrite();
-
- // Note: apparently some attributes are set with OVERWRITE_NO_APPEND;
- // it is probably a bad idea to mess with those in any way here?
- for (auto& rSprm : rReference)
- {
- // Paragraph formatting sprms are directly contained in case of
- // paragraphs, but they are below NS_ooxml::LN_CT_Style_pPr in case of
- // styles. So handle those children directly, to avoid unexpected
- // addition of direct formatting sprms at the paragraph level.
- if (bImplicitPPr && rSprm.first == NS_ooxml::LN_CT_Style_pPr)
- {
- for (const auto& i : rSprm.second->getSprms())
- cloneAndDeduplicateSprm(i, ret, nStyleType, pDirect);
- }
- else
- cloneAndDeduplicateSprm(rSprm, ret, nStyleType, pDirect);
- }
- return ret;
-}
-
-bool RTFSprms::equals(const RTFSprms& rOther) const
-{
- auto it1 = m_pSprms->cbegin();
- auto it1End = m_pSprms->cend();
- auto it2 = rOther.m_pSprms->cbegin();
- auto it2End = rOther.m_pSprms->cend();
- while (it1 != it1End && it2 != it2End)
- {
- if (it1->first != it2->first)
- return false;
- if (!it1->second->equals(*it2->second))
- return false;
- ++it1;
- ++it2;
- }
- return it1 == it1End && it2 == it2End;
-}
-
-void RTFSprms::ensureCopyBeforeWrite()
-{
- if (m_pSprms->GetRefCount() > 1)
- {
- tools::SvRef<RTFSprmsImpl> pClone(new RTFSprmsImpl);
- for (auto& rSprm : *m_pSprms)
- pClone->push_back(
- std::make_pair(rSprm.first, RTFValue::Pointer_t(rSprm.second->Clone())));
- m_pSprms = pClone;
- }
-}
-
-RTFSprms::RTFSprms()
- : m_pSprms(new RTFSprmsImpl)
-{
-}
-
-RTFSprms::~RTFSprms() = default;
-
-void RTFSprms::clear()
-{
- if (m_pSprms->GetRefCount() == 1)
- return m_pSprms->clear();
-
- m_pSprms = tools::SvRef<RTFSprmsImpl>(new RTFSprmsImpl);
-}
-
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfsprm.hxx b/writerfilter/source/rtftok/rtfsprm.hxx
deleted file mode 100644
index 132a2bbcbeb2..000000000000
--- a/writerfilter/source/rtftok/rtfsprm.hxx
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-#include <string>
-#include <utility>
-#include <vector>
-#include <map>
-
-#include <tools/ref.hxx>
-#include "rtfvalue.hxx"
-
-namespace writerfilter::rtftok
-{
-using RTFSprmsImplBase = std::vector<std::pair<Id, RTFValue::Pointer_t>>;
-
-/// The payload of RTFSprms which is only copied on write.
-class RTFSprmsImpl : public RTFSprmsImplBase, public virtual SvRefBase
-{
-};
-
-enum class RTFOverwrite
-{
- YES, ///< Yes, if an existing key is found, overwrite it.
- NO_APPEND, ///< No, always append the value to the end of the list.
- NO_IGNORE, ///< No, if the key is already in the list, then ignore, otherwise append.
- YES_PREPEND ///< Yes, always prepend the value to the start of the list and remove existing entries.
-};
-
-/// A list of RTFSprm with a copy constructor that performs a deep copy.
-class RTFSprms : public virtual SvRefBase
-{
-public:
- using Pointer_t = tools::SvRef<RTFSprms>;
- using Entry_t = std::pair<Id, RTFValue::Pointer_t>;
- using Iterator_t = std::vector<Entry_t>::iterator;
- using ReverseIterator_t = std::vector<Entry_t>::reverse_iterator;
- RTFSprms();
- ~RTFSprms() override;
-
- RTFSprms(RTFSprms const&) = default;
- RTFSprms(RTFSprms&&) = default;
- RTFSprms& operator=(RTFSprms const&) = default;
- RTFSprms& operator=(RTFSprms&&) = default;
-
- RTFValue::Pointer_t find(Id nKeyword, bool bFirst = true, bool bForWrite = false);
- /// Does the same as ->push_back(), except that it can overwrite or ignore existing entries.
- void set(Id nKeyword, const RTFValue::Pointer_t& pValue,
- RTFOverwrite eOverwrite = RTFOverwrite::YES);
- bool erase(Id nKeyword);
- void eraseLast(Id nKeyword);
- /// Removes elements which are already in the reference set.
- /// Also insert default values to override attributes of style
- /// (yes, really; that's what Word does).
- /// @param bImplicitPPr implicit dereference of top-level pPr SPRM
- /// @param pDirect pointer to the root of the direct formatting SPRM tree, if any
- RTFSprms cloneAndDeduplicate(RTFSprms& rReference, Id nStyleType, bool bImplicitPPr = false,
- RTFSprms* pDirect = nullptr) const;
- /// Inserts default values to override attributes of pAbstract.
- void duplicateList(const RTFValue::Pointer_t& pAbstract);
- /// Removes duplicated values based on in-list properties.
- void deduplicateList(const std::map<int, int>& rInvalidListLevelFirstIndents);
- std::size_t size() const { return m_pSprms->size(); }
- bool empty() const { return m_pSprms->empty(); }
- Entry_t& back() { return m_pSprms->back(); }
- Iterator_t begin() { return m_pSprms->begin(); }
- Iterator_t end() { return m_pSprms->end(); }
- void clear();
- bool equals(const RTFSprms& rOther) const;
-
-private:
- void ensureCopyBeforeWrite();
- tools::SvRef<RTFSprmsImpl> m_pSprms;
-};
-
-/// RTF keyword with a parameter
-class RTFSprm : public Sprm
-{
-public:
- RTFSprm(Id nKeyword, RTFValue::Pointer_t& pValue);
- sal_uInt32 getId() const override;
- Value::Pointer_t getValue() override;
- writerfilter::Reference<Properties>::Pointer_t getProps() override;
-#ifdef DBG_UTIL
- std::string getName() const override;
- std::string toString() const override;
-#endif
-private:
- Id m_nKeyword;
- RTFValue::Pointer_t& m_pValue;
-};
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtftokenizer.cxx b/writerfilter/source/rtftok/rtftokenizer.cxx
deleted file mode 100644
index 420c6d36f0c3..000000000000
--- a/writerfilter/source/rtftok/rtftokenizer.cxx
+++ /dev/null
@@ -1,330 +0,0 @@
-/* -*- 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 "rtftokenizer.hxx"
-#include <o3tl/string_view.hxx>
-#include <tools/stream.hxx>
-#include <svx/dialmgr.hxx>
-#include <svx/strings.hrc>
-#include <rtl/strbuf.hxx>
-#include <rtl/character.hxx>
-#include <sal/log.hxx>
-#include "rtfskipdestination.hxx"
-#include <com/sun/star/io/BufferSizeExceededException.hpp>
-#include <com/sun/star/task/XStatusIndicator.hpp>
-#include <filter/msfilter/rtfutil.hxx>
-
-using namespace com::sun::star;
-
-namespace writerfilter::rtftok
-{
-std::unordered_map<OString, RTFSymbol> RTFTokenizer::s_aRTFControlWords;
-bool RTFTokenizer::s_bControlWordsInitialised;
-std::vector<RTFMathSymbol> RTFTokenizer::s_aRTFMathControlWords;
-bool RTFTokenizer::s_bMathControlWordsSorted;
-
-RTFTokenizer::RTFTokenizer(RTFListener& rImport, SvStream* pInStream,
- uno::Reference<task::XStatusIndicator> const& xStatusIndicator)
- : m_rImport(rImport)
- , m_pInStream(pInStream)
- , m_xStatusIndicator(xStatusIndicator)
- , m_nGroup(0)
- , m_nLineNumber(0)
- , m_nLineStartPos(0)
- , m_nGroupStart(0)
-{
- if (!RTFTokenizer::s_bControlWordsInitialised)
- {
- RTFTokenizer::s_bControlWordsInitialised = true;
- for (int i = 0; i < nRTFControlWords; ++i)
- s_aRTFControlWords.emplace(OString(aRTFControlWords[i].GetKeyword()),
- aRTFControlWords[i]);
- }
- if (!RTFTokenizer::s_bMathControlWordsSorted)
- {
- RTFTokenizer::s_bMathControlWordsSorted = true;
- s_aRTFMathControlWords = std::vector<RTFMathSymbol>(
- aRTFMathControlWords, aRTFMathControlWords + nRTFMathControlWords);
- std::sort(s_aRTFMathControlWords.begin(), s_aRTFMathControlWords.end());
- }
-}
-
-RTFTokenizer::~RTFTokenizer() = default;
-
-RTFError RTFTokenizer::resolveParse()
-{
- SAL_INFO("writerfilter.rtf", __func__);
- char ch;
- RTFError ret;
- // for hex chars
- int b = 0;
- int count = 2;
- std::size_t nPercentSize = 0;
- sal_uInt64 nLastPos = 0;
-
- if (m_xStatusIndicator.is())
- {
- OUString sDocLoad(SvxResId(RID_SVXSTR_DOC_LOAD));
-
- sal_uInt64 const nCurrentPos = Strm().Tell();
- sal_uInt64 const nEndPos = nCurrentPos + Strm().remainingSize();
- m_xStatusIndicator->start(sDocLoad, nEndPos);
- nPercentSize = nEndPos / 100;
-
- nLastPos = nCurrentPos;
- m_xStatusIndicator->setValue(nLastPos);
- }
-
- while (Strm().ReadChar(ch), !Strm().eof())
- {
- //SAL_INFO("writerfilter", __func__ << ": parsing character '" << ch << "'");
-
- sal_uInt64 const nCurrentPos = Strm().Tell();
- if (m_xStatusIndicator.is() && nCurrentPos > (nLastPos + nPercentSize))
- {
- nLastPos = nCurrentPos;
- m_xStatusIndicator->setValue(nLastPos);
- }
-
- if (m_nGroup < 0)
- return RTFError::GROUP_UNDER;
- if (m_nGroup > 0 && m_rImport.getInternalState() == RTFInternalState::BIN)
- {
- ret = m_rImport.resolveChars(ch);
- if (ret != RTFError::OK)
- return ret;
- }
- else
- {
- switch (ch)
- {
- case '{':
- m_nGroupStart = Strm().Tell() - 1;
- ret = m_rImport.pushState();
- if (ret != RTFError::OK)
- return ret;
- break;
- case '}':
- ret = m_rImport.popState();
- if (ret != RTFError::OK)
- return ret;
- if (m_nGroup == 0)
- {
- if (m_rImport.isSubstream())
- m_rImport.finishSubstream();
- return RTFError::OK;
- }
- break;
- case '\\':
- ret = resolveKeyword();
- if (ret != RTFError::OK)
- return ret;
- break;
- case 0x0d:
- break; // ignore this
- case 0x0a:
- m_nLineNumber++;
- m_nLineStartPos = nCurrentPos;
- break;
- default:
- if (m_nGroup == 0)
- return RTFError::CHAR_OVER;
- if (m_rImport.getInternalState() == RTFInternalState::NORMAL)
- {
- ret = m_rImport.resolveChars(ch);
- if (ret != RTFError::OK)
- return ret;
- }
- else
- {
- SAL_INFO("writerfilter.rtf", __func__ << ": hex internal state");
- // Assume that \'<number><junk> means \'0<number>.
- if (rtl::isAsciiDigit(static_cast<unsigned char>(ch))
- || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F'))
- {
- b = b << 4;
- sal_Int8 parsed = msfilter::rtfutil::AsHex(ch);
- if (parsed == -1)
- return RTFError::HEX_INVALID;
- b += parsed;
- }
- count--;
- if (!count)
- {
- ret = m_rImport.resolveChars(b);
- if (ret != RTFError::OK)
- return ret;
- count = 2;
- b = 0;
- m_rImport.setInternalState(RTFInternalState::NORMAL);
- }
- }
- break;
- }
- }
- }
-
- if (m_nGroup < 0)
- return RTFError::GROUP_UNDER;
- if (m_nGroup > 0)
- return RTFError::GROUP_OVER;
- return RTFError::OK;
-}
-
-void RTFTokenizer::pushGroup() { m_nGroup++; }
-
-void RTFTokenizer::popGroup() { m_nGroup--; }
-
-RTFError RTFTokenizer::resolveKeyword()
-{
- char ch;
-
- Strm().ReadChar(ch);
- if (Strm().eof())
- return RTFError::UNEXPECTED_EOF;
-
- if (!rtl::isAsciiAlpha(static_cast<unsigned char>(ch)))
- {
- // control symbols aren't followed by a space, so we can return here
- // without doing any SeekRel()
- return dispatchKeyword(OString(ch), false, 0);
- }
- OStringBuffer aBuf(32);
- while (rtl::isAsciiAlpha(static_cast<unsigned char>(ch)))
- {
- aBuf.append(ch);
- if (aBuf.getLength() > 32)
- // See RTF spec v1.9.1, page 7
- // A control word's name cannot be longer than 32 letters.
- throw io::BufferSizeExceededException();
- Strm().ReadChar(ch);
- if (Strm().eof())
- {
- ch = ' ';
- break;
- }
- }
-
- bool bNeg = false;
- if (ch == '-')
- {
- // in case we'll have a parameter, that will be negative
- bNeg = true;
- Strm().ReadChar(ch);
- if (Strm().eof())
- return RTFError::UNEXPECTED_EOF;
- }
- bool bParam = false;
- int nParam = 0;
- if (rtl::isAsciiDigit(static_cast<unsigned char>(ch)))
- {
- OStringBuffer aParameter;
-
- // we have a parameter
- bParam = true;
- while (rtl::isAsciiDigit(static_cast<unsigned char>(ch)))
- {
- aParameter.append(ch);
- Strm().ReadChar(ch);
- if (Strm().eof())
- {
- ch = ' ';
- break;
- }
- }
- nParam = o3tl::toInt32(aParameter);
- if (bNeg)
- nParam = -nParam;
- }
- if (ch != ' ')
- Strm().SeekRel(-1);
- OString aKeyword = aBuf.makeStringAndClear();
- return dispatchKeyword(aKeyword, bParam, nParam);
-}
-
-bool RTFTokenizer::lookupMathKeyword(RTFMathSymbol& rSymbol)
-{
- auto low
- = std::lower_bound(s_aRTFMathControlWords.begin(), s_aRTFMathControlWords.end(), rSymbol);
- if (low == s_aRTFMathControlWords.end() || rSymbol < *low)
- return false;
- rSymbol = *low;
- return true;
-}
-
-RTFError RTFTokenizer::dispatchKeyword(OString const& rKeyword, bool bParam, int nParam)
-{
- if (m_rImport.getDestination() == Destination::SKIP)
- {
- // skip binary data explicitly, to not trip over rtf markup
- // control characters
- if (rKeyword == "bin" && nParam > 0)
- Strm().SeekRel(nParam);
- return RTFError::OK;
- }
- SAL_INFO("writerfilter.rtf", __func__ << ": keyword '\\" << rKeyword << "' with param? "
- << (bParam ? 1 : 0) << " param val: '"
- << (bParam ? nParam : 0) << "'");
- auto findIt = s_aRTFControlWords.find(rKeyword);
- if (findIt == s_aRTFControlWords.end())
- {
- SAL_INFO("writerfilter.rtf", __func__ << ": unknown keyword '\\" << rKeyword << "'");
- RTFSkipDestination aSkip(m_rImport);
- aSkip.setParsed(false);
- return RTFError::OK;
- }
-
- RTFError ret;
- RTFSymbol const& rSymbol = findIt->second;
- switch (rSymbol.GetControlType())
- {
- case RTFControlType::FLAG:
- // flags ignore any parameter by definition
- ret = m_rImport.dispatchFlag(rSymbol.GetIndex());
- if (ret != RTFError::OK)
- return ret;
- break;
- case RTFControlType::DESTINATION:
- // same for destinations
- ret = m_rImport.dispatchDestination(rSymbol.GetIndex());
- if (ret != RTFError::OK)
- return ret;
- break;
- case RTFControlType::SYMBOL:
- // and symbols
- ret = m_rImport.dispatchSymbol(rSymbol.GetIndex());
- if (ret != RTFError::OK)
- return ret;
- break;
- case RTFControlType::TOGGLE:
- ret = m_rImport.dispatchToggle(rSymbol.GetIndex(), bParam, nParam);
- if (ret != RTFError::OK)
- return ret;
- break;
- case RTFControlType::VALUE:
- if (!bParam)
- nParam = rSymbol.GetDefValue();
- ret = m_rImport.dispatchValue(rSymbol.GetIndex(), nParam);
- if (ret != RTFError::OK)
- return ret;
- break;
- }
-
- return RTFError::OK;
-}
-
-OUString RTFTokenizer::getPosition()
-{
- return OUString::number(m_nLineNumber + 1) + ","
- + OUString::number(Strm().Tell() - m_nLineStartPos + 1);
-}
-
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtftokenizer.hxx b/writerfilter/source/rtftok/rtftokenizer.hxx
deleted file mode 100644
index feb74fc63c57..000000000000
--- a/writerfilter/source/rtftok/rtftokenizer.hxx
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-#include "rtflistener.hxx"
-
-#include <vector>
-#include <unordered_map>
-
-#include <com/sun/star/uno/Reference.h>
-
-#include <rtl/ustring.hxx>
-#include <tools/ref.hxx>
-
-namespace com::sun::star::task
-{
-class XStatusIndicator;
-}
-class SvStream;
-
-namespace writerfilter::rtftok
-{
-/// RTF tokenizer that separates control words from text.
-class RTFTokenizer final : public virtual SvRefBase
-{
-public:
- RTFTokenizer(RTFListener& rImport, SvStream* pInStream,
- css::uno::Reference<css::task::XStatusIndicator> const& xStatusIndicator);
- ~RTFTokenizer() override;
-
- RTFError resolveParse();
- /// Number of states on the stack.
- int getGroup() const { return m_nGroup; }
- /// To be invoked by the pushState() callback to signal when the importer enters a group.
- void pushGroup();
- /// To be invoked by the popState() callback to signal when the importer leaves a group.
- void popGroup();
- OUString getPosition();
- std::size_t getGroupStart() const { return m_nGroupStart; }
- /// To look up additional properties of a math symbol.
- static bool lookupMathKeyword(RTFMathSymbol& rSymbol);
-
-private:
- SvStream& Strm() { return *m_pInStream; }
- RTFError resolveKeyword();
- RTFError dispatchKeyword(OString const& rKeyword, bool bParam, int nParam);
-
- RTFListener& m_rImport;
- SvStream* m_pInStream;
- css::uno::Reference<css::task::XStatusIndicator> const& m_xStatusIndicator;
- // This is the same as aRTFControlWords, but mapped by token name for fast lookup
- static std::unordered_map<OString, RTFSymbol> s_aRTFControlWords;
- static bool s_bControlWordsInitialised;
- // This is the same as aRTFMathControlWords, but sorted
- static std::vector<RTFMathSymbol> s_aRTFMathControlWords;
- static bool s_bMathControlWordsSorted;
- /// Same as the size of the importer's states, except that this can be negative for invalid input.
- int m_nGroup;
- sal_Int32 m_nLineNumber;
- std::size_t m_nLineStartPos;
- std::size_t m_nGroupStart;
-};
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfvalue.cxx b/writerfilter/source/rtftok/rtfvalue.cxx
deleted file mode 100644
index 6654a3f2eca5..000000000000
--- a/writerfilter/source/rtftok/rtfvalue.cxx
+++ /dev/null
@@ -1,231 +0,0 @@
-/* -*- 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 "rtfreferenceproperties.hxx"
-#include "rtfdocumentimpl.hxx"
-#include <com/sun/star/embed/XEmbeddedObject.hpp>
-
-using namespace com::sun::star;
-
-namespace writerfilter::rtftok
-{
-RTFValue::RTFValue(int nValue, OUString sValue, const RTFSprms* pAttributes, const RTFSprms* pSprms,
- uno::Reference<drawing::XShape> xShape, uno::Reference<io::XInputStream> xStream,
- uno::Reference<embed::XEmbeddedObject> xObject, bool bForceString,
- const RTFShape* pShape, const RTFPicture* pPicture)
- : m_nValue(nValue)
- , m_sValue(std::move(sValue))
- , m_xShape(std::move(xShape))
- , m_xStream(std::move(xStream))
- , m_xObject(std::move(xObject))
- , m_bForceString(bForceString)
-{
- if (pAttributes)
- m_pAttributes = new RTFSprms(*pAttributes);
- if (pSprms)
- m_pSprms = new RTFSprms(*pSprms);
- if (pShape)
- m_pShape = new RTFShape(*pShape);
- if (pPicture)
- m_pPicture = new RTFPicture(*pPicture);
-}
-
-RTFValue::RTFValue() {}
-
-RTFValue::RTFValue(int nValue)
- : m_nValue(nValue)
-{
-}
-
-RTFValue::RTFValue(OUString sValue, bool bForce)
- : m_sValue(std::move(sValue))
- , m_bForceString(bForce)
-{
-}
-
-RTFValue::RTFValue(const RTFSprms& rAttributes)
- : m_pAttributes(new RTFSprms(rAttributes))
-{
-}
-
-RTFValue::RTFValue(const RTFSprms& rAttributes, const RTFSprms& rSprms)
- : m_pAttributes(new RTFSprms(rAttributes))
- , m_pSprms(new RTFSprms(rSprms))
-{
-}
-
-RTFValue::RTFValue(uno::Reference<drawing::XShape> xShape)
- : m_xShape(std::move(xShape))
-{
-}
-
-RTFValue::RTFValue(uno::Reference<io::XInputStream> xStream)
- : m_xStream(std::move(xStream))
-{
-}
-
-RTFValue::RTFValue(uno::Reference<embed::XEmbeddedObject> xObject)
- : m_xObject(std::move(xObject))
-{
-}
-
-RTFValue::RTFValue(const RTFShape& aShape)
- : m_pShape(new RTFShape(aShape))
-{
-}
-
-RTFValue::RTFValue(const RTFPicture& rPicture)
- : m_pPicture(new RTFPicture(rPicture))
-{
-}
-
-RTFValue::RTFValue(text::GraphicCrop const& rCrop)
- : m_oCrop(rCrop)
-{
-}
-
-RTFValue::~RTFValue() = default;
-
-int RTFValue::getInt() const { return m_nValue; }
-
-OUString RTFValue::getString() const
-{
- if (!m_sValue.isEmpty() || m_bForceString)
- return m_sValue;
-
- return OUString::number(m_nValue);
-}
-
-void RTFValue::setString(const OUString& sValue) { m_sValue = sValue; }
-
-uno::Any RTFValue::getAny() const
-{
- uno::Any ret;
- if (!m_sValue.isEmpty() || m_bForceString)
- ret <<= m_sValue;
- else if (m_xShape.is())
- ret <<= m_xShape;
- else if (m_xStream.is())
- ret <<= m_xStream;
- else if (m_xObject.is())
- ret <<= m_xObject;
- else if (m_oCrop)
- {
- ret <<= *m_oCrop;
- }
- else
- ret <<= static_cast<sal_Int32>(m_nValue);
- return ret;
-}
-
-RTFShape& RTFValue::getShape() const
-{
- if (!m_pShape)
- m_pShape = new RTFShape();
- return *m_pShape;
-}
-
-RTFPicture& RTFValue::getPicture() const
-{
- if (!m_pPicture)
- m_pPicture = new RTFPicture;
- return *m_pPicture;
-}
-
-writerfilter::Reference<Properties>::Pointer_t RTFValue::getProperties()
-{
- return new RTFReferenceProperties(getAttributes(), getSprms());
-}
-
-writerfilter::Reference<BinaryObj>::Pointer_t RTFValue::getBinary()
-{
- return writerfilter::Reference<BinaryObj>::Pointer_t();
-}
-
-#ifdef DBG_UTIL
-std::string RTFValue::toString() const
-{
- if (!m_sValue.isEmpty() || m_bForceString)
- return std::string(OUStringToOString(m_sValue, RTL_TEXTENCODING_UTF8));
-
- return std::string(OString::number(m_nValue));
-}
-#endif
-
-RTFValue* RTFValue::Clone() const
-{
- return new RTFValue(m_nValue, m_sValue, m_pAttributes.get(), m_pSprms.get(), m_xShape,
- m_xStream, m_xObject, m_bForceString, m_pShape.get(), m_pPicture.get());
-}
-
-RTFValue* RTFValue::CloneWithSprms(RTFSprms const& rAttributes, RTFSprms const& rSprms) const
-{
- return new RTFValue(m_nValue, m_sValue, &rAttributes, &rSprms, m_xShape, m_xStream, m_xObject,
- m_bForceString, m_pShape.get(), m_pPicture.get());
-}
-
-bool RTFValue::equals(const RTFValue& rOther) const
-{
- if (m_nValue != rOther.m_nValue)
- return false;
- if (m_sValue != rOther.m_sValue)
- return false;
-
- if (m_pAttributes && rOther.m_pAttributes)
- {
- if (m_pAttributes->size() != rOther.m_pAttributes->size())
- return false;
- if (!m_pAttributes->equals(*rOther.m_pAttributes))
- return false;
- }
- else if (m_pAttributes && m_pAttributes->size())
- {
- return false;
- }
- else if (rOther.m_pAttributes && rOther.m_pAttributes->size())
- {
- return false;
- }
-
- if (m_pSprms && rOther.m_pSprms)
- {
- if (m_pSprms->size() != rOther.m_pSprms->size())
- return false;
- if (!m_pSprms->equals(*rOther.m_pSprms))
- return false;
- }
- else if (m_pSprms && m_pSprms->size())
- {
- return false;
- }
- else if (rOther.m_pSprms && rOther.m_pSprms->size())
- {
- return false;
- }
-
- return true;
-}
-
-RTFSprms& RTFValue::getAttributes() const
-{
- if (!m_pAttributes)
- m_pAttributes = new RTFSprms();
- return *m_pAttributes;
-}
-
-RTFSprms& RTFValue::getSprms() const
-{
- if (!m_pSprms)
- m_pSprms = new RTFSprms();
- return *m_pSprms;
-}
-
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfvalue.hxx b/writerfilter/source/rtftok/rtfvalue.hxx
deleted file mode 100644
index 6c87c61a1d05..000000000000
--- a/writerfilter/source/rtftok/rtfvalue.hxx
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- 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/.
- */
-
-#pragma once
-
-#include <dmapper/resourcemodel.hxx>
-
-#include <com/sun/star/text/GraphicCrop.hpp>
-
-#include <optional>
-
-namespace com::sun::star
-{
-namespace embed
-{
-class XEmbeddedObject;
-}
-namespace io
-{
-class XInputStream;
-}
-}
-
-namespace writerfilter::rtftok
-{
-class RTFSprms;
-class RTFShape;
-class RTFPicture;
-/// Value of an RTF keyword
-class RTFValue : public Value
-{
- RTFValue(int nValue, OUString sValue, const RTFSprms* pAttributes, const RTFSprms* pSprms,
- css::uno::Reference<css::drawing::XShape> xShape,
- css::uno::Reference<css::io::XInputStream> xStream,
- css::uno::Reference<css::embed::XEmbeddedObject> xObject, bool bForceString,
- const RTFShape* pShape, const RTFPicture* pPicture);
-
-public:
- using Pointer_t = tools::SvRef<RTFValue>;
- RTFValue();
- explicit RTFValue(int nValue);
- RTFValue(OUString sValue, bool bForce = false);
- explicit RTFValue(const RTFSprms& rAttributes);
- RTFValue(const RTFSprms& rAttributes, const RTFSprms& rSprms);
- explicit RTFValue(css::uno::Reference<css::drawing::XShape> xShape);
- explicit RTFValue(css::uno::Reference<css::io::XInputStream> xStream);
- explicit RTFValue(css::uno::Reference<css::embed::XEmbeddedObject> xObject);
- explicit RTFValue(const RTFShape& aShape);
- explicit RTFValue(const RTFPicture& rPicture);
- explicit RTFValue(css::text::GraphicCrop const& rCrop);
- ~RTFValue() override;
- void setString(const OUString& sValue);
- int getInt() const override;
- OUString getString() const override;
- css::uno::Any getAny() const override;
- writerfilter::Reference<Properties>::Pointer_t getProperties() override;
- writerfilter::Reference<BinaryObj>::Pointer_t getBinary() override;
-#ifdef DBG_UTIL
- std::string toString() const override;
-#endif
- RTFValue* Clone() const;
- RTFValue* CloneWithSprms(RTFSprms const& rAttributes, RTFSprms const& rSprms) const;
- RTFSprms& getAttributes() const;
- RTFSprms& getSprms() const;
- RTFShape& getShape() const;
- RTFPicture& getPicture() const;
- bool equals(const RTFValue& rOther) const;
- RTFValue& operator=(RTFValue const& rOther) = delete;
-
-private:
- int m_nValue = 0;
- OUString m_sValue;
- mutable tools::SvRef<RTFSprms> m_pAttributes;
- mutable tools::SvRef<RTFSprms> m_pSprms;
- css::uno::Reference<css::drawing::XShape> m_xShape;
- css::uno::Reference<css::io::XInputStream> m_xStream;
- css::uno::Reference<css::embed::XEmbeddedObject> m_xObject;
- bool m_bForceString = false;
- mutable tools::SvRef<RTFShape> m_pShape;
- mutable tools::SvRef<RTFPicture> m_pPicture;
- ::std::optional<css::text::GraphicCrop> m_oCrop;
-};
-} // namespace writerfilter::rtftok
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */