summaryrefslogtreecommitdiffstats
path: root/xmloff/source/text/XMLTextHeaderFooterContext.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'xmloff/source/text/XMLTextHeaderFooterContext.cxx')
-rw-r--r--xmloff/source/text/XMLTextHeaderFooterContext.cxx190
1 files changed, 190 insertions, 0 deletions
diff --git a/xmloff/source/text/XMLTextHeaderFooterContext.cxx b/xmloff/source/text/XMLTextHeaderFooterContext.cxx
new file mode 100644
index 0000000000..786528201d
--- /dev/null
+++ b/xmloff/source/text/XMLTextHeaderFooterContext.cxx
@@ -0,0 +1,190 @@
+/* -*- 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/XText.hpp>
+#include <com/sun/star/text/XParagraphAppend.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <o3tl/any.hxx>
+#include <XMLTextHeaderFooterContext.hxx>
+#include <xmloff/xmlimp.hxx>
+
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::xml::sax;
+using namespace ::com::sun::star::text;
+using namespace ::com::sun::star::beans;
+
+
+XMLTextHeaderFooterContext::XMLTextHeaderFooterContext( SvXMLImport& rImport,
+ const Reference < XPropertySet > & rPageStylePropSet,
+ bool bFooter, bool bLft, bool bFrst ) :
+ SvXMLImportContext( rImport ),
+ xPropSet( rPageStylePropSet ),
+ sOn( bFooter ? OUString("FooterIsOn") : OUString("HeaderIsOn") ),
+ sShareContent( bFooter ? OUString("FooterIsShared") : OUString("HeaderIsShared") ),
+ sText( bFooter ? OUString("FooterText") : OUString("HeaderText") ),
+ sTextFirst(bFooter ? OUString("FooterTextFirst") : OUString("HeaderTextFirst")),
+ sTextLeft( bFooter ? OUString("FooterTextLeft") : OUString("HeaderTextLeft") ),
+ bInsertContent( true ),
+ bLeft( bLft ),
+ bFirst( bFrst )
+{
+ // NOTE: if this ever handles XML_DISPLAY attr then beware of fdo#72850 !
+ if( !(bLeft || bFirst) )
+ return;
+
+ Any aAny = xPropSet->getPropertyValue( sOn );
+ bool bOn = *o3tl::doAccess<bool>(aAny);
+
+ if( bOn )
+ {
+ if (bLeft)
+ {
+ aAny = xPropSet->getPropertyValue( sShareContent );
+ bool bShared = bool();
+ if (!(aAny >>= bShared))
+ assert(false); // should return a value!
+ if( bShared )
+ {
+ // Don't share headers any longer
+ xPropSet->setPropertyValue( sShareContent, Any(false) );
+ }
+ }
+ if (bFirst)
+ {
+ static constexpr OUString sShareContentFirst( u"FirstIsShared"_ustr );
+ aAny = xPropSet->getPropertyValue( sShareContentFirst );
+ bool bSharedFirst = bool();
+ if (!(aAny >>= bSharedFirst))
+ assert(false); // should return a value!
+ if( bSharedFirst )
+ {
+ // Don't share first/right headers any longer
+ xPropSet->setPropertyValue( sShareContentFirst, Any(false) );
+ }
+ }
+ }
+ else
+ {
+ // If headers or footers are switched off, no content must be
+ // inserted.
+ bInsertContent = false;
+ }
+}
+
+XMLTextHeaderFooterContext::~XMLTextHeaderFooterContext()
+{
+}
+
+css::uno::Reference< css::xml::sax::XFastContextHandler > XMLTextHeaderFooterContext::createFastChildContext(
+ sal_Int32 nElement,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+{
+ SvXMLImportContext *pContext = nullptr;
+ if( bInsertContent )
+ {
+ if( !xOldTextCursor.is() )
+ {
+ bool bRemoveContent = true;
+ Any aAny;
+ if( bLeft || bFirst )
+ {
+ // Headers and footers are switched on already,
+ // and they aren't shared.
+ if (bLeft)
+ aAny = xPropSet->getPropertyValue( sTextLeft );
+ else
+ aAny = xPropSet->getPropertyValue( sTextFirst );
+ }
+ else
+ {
+ aAny = xPropSet->getPropertyValue( sOn );
+ bool bOn = *o3tl::doAccess<bool>(aAny);
+
+ if( !bOn )
+ {
+ // Switch header on
+ xPropSet->setPropertyValue( sOn, Any(true) );
+
+ // The content has not to be removed, because the header
+ // or footer is empty already.
+ bRemoveContent = false;
+ }
+
+ // If a header or footer is not shared, share it now.
+ aAny = xPropSet->getPropertyValue( sShareContent );
+ bool bShared = *o3tl::doAccess<bool>(aAny);
+ if( !bShared )
+ {
+ xPropSet->setPropertyValue( sShareContent, Any(true) );
+ }
+
+ aAny = xPropSet->getPropertyValue( sText );
+ }
+
+ Reference < XText > xText;
+ aAny >>= xText;
+
+ if( bRemoveContent )
+ {
+ xText->setString(OUString());
+ // fdo#82165 shapes anchored at the beginning or end survive
+ // setString("") - kill them the hard way: SwDoc::DelFullPara()
+ uno::Reference<text::XParagraphAppend> const xAppend(
+ xText, uno::UNO_QUERY_THROW);
+ uno::Reference<lang::XComponent> const xPara(
+ xAppend->finishParagraph(
+ uno::Sequence<beans::PropertyValue>()),
+ uno::UNO_QUERY_THROW);
+ xPara->dispose();
+ }
+
+ rtl::Reference < XMLTextImportHelper > xTxtImport =
+ GetImport().GetTextImport();
+
+ xOldTextCursor = xTxtImport->GetCursor();
+ xTxtImport->SetCursor( xText->createTextCursor() );
+ }
+
+ pContext =
+ GetImport().GetTextImport()->CreateTextChildContext(
+ GetImport(), nElement, xAttrList,
+ XMLTextType::HeaderFooter );
+ }
+
+ return pContext;
+}
+
+void XMLTextHeaderFooterContext::endFastElement(sal_Int32 )
+{
+ if( xOldTextCursor.is() )
+ {
+ GetImport().GetTextImport()->DeleteParagraph();
+ GetImport().GetTextImport()->SetCursor( xOldTextCursor );
+ }
+ else if( !bLeft )
+ {
+ // If no content has been inserted into the header or footer,
+ // switch it off.
+ xPropSet->setPropertyValue( sOn, Any(false) );
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */