diff options
Diffstat (limited to '')
-rw-r--r-- | xmloff/source/style/xmltabi.cxx | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/xmloff/source/style/xmltabi.cxx b/xmloff/source/style/xmltabi.cxx new file mode 100644 index 000000000..27880a177 --- /dev/null +++ b/xmloff/source/style/xmltabi.cxx @@ -0,0 +1,223 @@ +/* -*- 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/style/TabAlign.hpp> +#include <xmloff/xmltkmap.hxx> +#include <xmloff/nmspmap.hxx> +#include <xmloff/xmlnmspe.hxx> +#include <xmloff/xmlimp.hxx> +#include <com/sun/star/style/TabStop.hpp> +#include <xmloff/xmltoken.hxx> +#include <xmloff/xmluconv.hxx> +#include <xmltabi.hxx> + + +using namespace ::com::sun::star; +using namespace ::xmloff::token; + +namespace { + +enum SvXMLTokenMapAttrs +{ + XML_TOK_TABSTOP_POSITION, + XML_TOK_TABSTOP_TYPE, + XML_TOK_TABSTOP_CHAR, + XML_TOK_TABSTOP_LEADER_STYLE, + XML_TOK_TABSTOP_LEADER_TEXT +}; + +} + +static const SvXMLTokenMapEntry aTabsAttributesAttrTokenMap[] = +{ + { XML_NAMESPACE_STYLE, XML_POSITION, XML_TOK_TABSTOP_POSITION }, + { XML_NAMESPACE_STYLE, XML_TYPE, XML_TOK_TABSTOP_TYPE }, + { XML_NAMESPACE_STYLE, XML_CHAR, XML_TOK_TABSTOP_CHAR }, + { XML_NAMESPACE_STYLE, XML_LEADER_TEXT, XML_TOK_TABSTOP_LEADER_TEXT }, + { XML_NAMESPACE_STYLE, XML_LEADER_STYLE, XML_TOK_TABSTOP_LEADER_STYLE }, + XML_TOKEN_MAP_END +}; + + +class SvxXMLTabStopContext_Impl : public SvXMLImportContext +{ +private: + style::TabStop aTabStop; + +public: + + SvxXMLTabStopContext_Impl( SvXMLImport& rImport, sal_uInt16 nPrfx, + const OUString& rLName, + const uno::Reference< xml::sax::XAttributeList > & xAttrList ); + + const style::TabStop& getTabStop() const { return aTabStop; } +}; + + +SvxXMLTabStopContext_Impl::SvxXMLTabStopContext_Impl( + SvXMLImport& rImport, sal_uInt16 nPrfx, + const OUString& rLName, + const uno::Reference< xml::sax::XAttributeList > & xAttrList ) +: SvXMLImportContext( rImport, nPrfx, rLName ) +{ + aTabStop.Position = 0; + aTabStop.Alignment = style::TabAlign_LEFT; + aTabStop.DecimalChar = ','; + aTabStop.FillChar = ' '; + sal_Unicode cTextFillChar = 0; + + static const SvXMLTokenMap aTokenMap( aTabsAttributesAttrTokenMap ); + + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + for( sal_Int16 i=0; i < nAttrCount; i++ ) + { + const OUString& rAttrName = xAttrList->getNameByIndex( i ); + OUString aLocalName; + sal_uInt16 nPrefix = + GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, + &aLocalName ); + const OUString& rValue = xAttrList->getValueByIndex( i ); + + sal_Int32 nVal; + switch( aTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_TABSTOP_POSITION: + if (GetImport().GetMM100UnitConverter().convertMeasureToCore( + nVal, rValue)) + { + aTabStop.Position = nVal; + } + break; + case XML_TOK_TABSTOP_TYPE: + if( IsXMLToken( rValue, XML_LEFT ) ) + { + aTabStop.Alignment = style::TabAlign_LEFT; + } + else if( IsXMLToken( rValue, XML_RIGHT ) ) + { + aTabStop.Alignment = style::TabAlign_RIGHT; + } + else if( IsXMLToken( rValue, XML_CENTER ) ) + { + aTabStop.Alignment = style::TabAlign_CENTER; + } + else if( IsXMLToken( rValue, XML_CHAR ) ) + { + aTabStop.Alignment = style::TabAlign_DECIMAL; + } + else if( IsXMLToken( rValue, XML_DEFAULT ) ) + { + aTabStop.Alignment = style::TabAlign_DEFAULT; + } + break; + case XML_TOK_TABSTOP_CHAR: + if( !rValue.isEmpty() ) + aTabStop.DecimalChar = rValue[0]; + break; + case XML_TOK_TABSTOP_LEADER_STYLE: + if( IsXMLToken( rValue, XML_NONE ) ) + aTabStop.FillChar = ' '; + else if( IsXMLToken( rValue, XML_DOTTED ) ) + aTabStop.FillChar = '.'; + else + aTabStop.FillChar = '_'; + break; + case XML_TOK_TABSTOP_LEADER_TEXT: + if( !rValue.isEmpty() ) + cTextFillChar = rValue[0]; + break; + } + } + + if( cTextFillChar != 0 && aTabStop.FillChar != ' ' ) + aTabStop.FillChar = cTextFillChar; +} + + +SvxXMLTabStopImportContext::SvxXMLTabStopImportContext( + SvXMLImport& rImport, sal_uInt16 nPrfx, + const OUString& rLName, + const XMLPropertyState& rProp, + ::std::vector< XMLPropertyState > &rProps ) +: XMLElementPropertyContext( rImport, nPrfx, rLName, rProp, rProps ) +{ +} + +SvXMLImportContextRef SvxXMLTabStopImportContext::CreateChildContext( + sal_uInt16 nPrefix, + const OUString& rLocalName, + const uno::Reference< xml::sax::XAttributeList > & xAttrList ) +{ + SvXMLImportContext *pContext = nullptr; + + if( XML_NAMESPACE_STYLE == nPrefix && IsXMLToken( rLocalName, XML_TAB_STOP ) ) + { + // create new tabstop import context + const rtl::Reference<SvxXMLTabStopContext_Impl> xTabStopContext{ + new SvxXMLTabStopContext_Impl( GetImport(), nPrefix, rLocalName, + xAttrList )}; + + // add new tabstop to array of tabstops + if( !mpTabStops ) + mpTabStops = std::make_unique<SvxXMLTabStopArray_Impl>(); + + mpTabStops->push_back( xTabStopContext ); + + pContext = xTabStopContext.get(); + } + + return pContext; +} + +void SvxXMLTabStopImportContext::EndElement( ) +{ + sal_uInt16 nCount = mpTabStops ? mpTabStops->size() : 0; + uno::Sequence< style::TabStop> aSeq( nCount ); + + if( mpTabStops ) + { + sal_uInt16 nNewCount = 0; + + style::TabStop* pTabStops = aSeq.getArray(); + for( sal_uInt16 i=0; i < nCount; i++ ) + { + SvxXMLTabStopContext_Impl *pTabStopContext = (*mpTabStops)[i].get(); + const style::TabStop& rTabStop = pTabStopContext->getTabStop(); + bool bDflt = style::TabAlign_DEFAULT == rTabStop.Alignment; + if( !bDflt || 0==i ) + { + *pTabStops++ = pTabStopContext->getTabStop(); + nNewCount++; + } + if( bDflt && 0==i ) + break; + } + + if( nCount != nNewCount ) + aSeq.realloc( nNewCount ); + } + aProp.maValue <<= aSeq; + + SetInsert( true ); + XMLElementPropertyContext::EndElement(); + +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |