summaryrefslogtreecommitdiffstats
path: root/sc/source/filter/xml/XMLTrackedChangesContext.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/filter/xml/XMLTrackedChangesContext.cxx')
-rw-r--r--sc/source/filter/xml/XMLTrackedChangesContext.cxx1398
1 files changed, 1398 insertions, 0 deletions
diff --git a/sc/source/filter/xml/XMLTrackedChangesContext.cxx b/sc/source/filter/xml/XMLTrackedChangesContext.cxx
new file mode 100644
index 000000000..b3dfb353c
--- /dev/null
+++ b/sc/source/filter/xml/XMLTrackedChangesContext.cxx
@@ -0,0 +1,1398 @@
+/* -*- 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 "XMLTrackedChangesContext.hxx"
+#include "XMLChangeTrackingImportHelper.hxx"
+#include "xmlimprt.hxx"
+#include "xmlconti.hxx"
+#include <formulacell.hxx>
+#include <textuno.hxx>
+#include <editutil.hxx>
+#include <document.hxx>
+#include <xmloff/xmltoken.hxx>
+#include <xmloff/xmlnamespace.hxx>
+#include <xmloff/xmluconv.hxx>
+#include <sax/tools/converter.hxx>
+#include <svl/sharedstringpool.hxx>
+#include <comphelper/base64.hxx>
+#include <com/sun/star/text/XTextCursor.hpp>
+#include <com/sun/star/text/ControlCharacter.hpp>
+
+using namespace com::sun::star;
+using namespace xmloff::token;
+
+namespace {
+
+class ScXMLChangeInfoContext : public ScXMLImportContext
+{
+ ScMyActionInfo aInfo;
+ OUStringBuffer sAuthorBuffer{32};
+ OUStringBuffer sDateTimeBuffer{32};
+ OUStringBuffer sCommentBuffer{64};
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper;
+ sal_uInt32 nParagraphCount;
+
+public:
+ ScXMLChangeInfoContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+
+ virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
+};
+
+class ScXMLBigRangeContext : public ScXMLImportContext
+{
+public:
+ ScXMLBigRangeContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScBigRange& rBigRange);
+};
+
+class ScXMLCellContentDeletionContext : public ScXMLImportContext
+{
+ OUString sFormulaAddress;
+ OUString sFormula;
+ OUString sFormulaNmsp;
+ OUString sInputString;
+ ScBigRange aBigRange;
+ double fValue;
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper;
+ ScCellValue maCell;
+ sal_uInt32 nID;
+ sal_Int32 nMatrixCols;
+ sal_Int32 nMatrixRows;
+ formula::FormulaGrammar::Grammar eGrammar;
+ sal_uInt16 nType;
+ ScMatrixMode nMatrixFlag;
+
+public:
+ ScXMLCellContentDeletionContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+
+ virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
+};
+
+class ScXMLDependenceContext : public ScXMLImportContext
+{
+public:
+ ScXMLDependenceContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+};
+
+class ScXMLDependingsContext : public ScXMLImportContext
+{
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper;
+
+public:
+ ScXMLDependingsContext( ScXMLImport& rImport,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+};
+
+class ScXMLChangeDeletionContext : public ScXMLImportContext
+{
+public:
+ ScXMLChangeDeletionContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+
+};
+
+class ScXMLDeletionsContext : public ScXMLImportContext
+{
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper;
+
+public:
+ ScXMLDeletionsContext( ScXMLImport& rImport,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+};
+
+class ScXMLChangeCellContext;
+
+class ScXMLChangeTextPContext : public ScXMLImportContext
+{
+ css::uno::Reference< css::xml::sax::XFastAttributeList> mxAttrList;
+ sal_Int32 mnElement;
+ OUStringBuffer sText;
+ ScXMLChangeCellContext* pChangeCellContext;
+ rtl::Reference<SvXMLImportContext>
+ pTextPContext;
+
+public:
+
+ ScXMLChangeTextPContext( ScXMLImport& rImport, sal_Int32 nElement,
+ const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList,
+ ScXMLChangeCellContext* pChangeCellContext);
+
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+
+ virtual void SAL_CALL characters( const OUString& rChars ) override;
+
+ virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
+};
+
+class ScXMLChangeCellContext : public ScXMLImportContext
+{
+ ScCellValue& mrOldCell;
+
+ OUString sText;
+ OUString& rInputString;
+ rtl::Reference<ScEditEngineTextObj> mpEditTextObj;
+ double fValue;
+ sal_uInt16& rType;
+ bool bEmpty;
+ bool bFirstParagraph;
+ bool bString;
+ bool bFormula;
+
+public:
+ ScXMLChangeCellContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScCellValue& rOldCell, OUString& sAddress,
+ OUString& rFormula, OUString& rFormulaNmsp,
+ formula::FormulaGrammar::Grammar& rGrammar,
+ OUString& rInputString, double& fValue, sal_uInt16& nType,
+ ScMatrixMode& nMatrixFlag, sal_Int32& nMatrixCols, sal_Int32& nMatrixRows);
+
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+
+ void CreateTextPContext(bool bIsNewParagraph);
+ bool IsEditCell() const { return mpEditTextObj.is(); }
+ void SetText(const OUString& sTempText) { sText = sTempText; }
+
+ virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
+};
+
+class ScXMLPreviousContext : public ScXMLImportContext
+{
+ OUString sFormulaAddress;
+ OUString sFormula;
+ OUString sFormulaNmsp;
+ OUString sInputString;
+ double fValue;
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper;
+ ScCellValue maOldCell;
+ sal_uInt32 nID;
+ sal_Int32 nMatrixCols;
+ sal_Int32 nMatrixRows;
+ formula::FormulaGrammar::Grammar eGrammar;
+ sal_uInt16 nType;
+ ScMatrixMode nMatrixFlag;
+
+public:
+ ScXMLPreviousContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+
+ virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
+};
+
+class ScXMLContentChangeContext : public ScXMLImportContext
+{
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper;
+ ScBigRange aBigRange;
+
+public:
+ ScXMLContentChangeContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+
+ virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
+};
+
+class ScXMLInsertionContext : public ScXMLImportContext
+{
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper;
+
+public:
+ ScXMLInsertionContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+
+ virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
+};
+
+class ScXMLInsertionCutOffContext : public ScXMLImportContext
+{
+public:
+ ScXMLInsertionCutOffContext( ScXMLImport& rImport,
+ const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+};
+
+class ScXMLMovementCutOffContext : public ScXMLImportContext
+{
+public:
+ ScXMLMovementCutOffContext( ScXMLImport& rImport,
+ const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+};
+
+class ScXMLCutOffsContext : public ScXMLImportContext
+{
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper;
+
+public:
+ ScXMLCutOffsContext( ScXMLImport& rImport,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+};
+
+class ScXMLDeletionContext : public ScXMLImportContext
+{
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper;
+
+public:
+ ScXMLDeletionContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+
+ virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
+};
+
+class ScXMLMovementContext : public ScXMLImportContext
+{
+ ScBigRange aSourceRange;
+ ScBigRange aTargetRange;
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper;
+
+public:
+ ScXMLMovementContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+
+ virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
+};
+
+class ScXMLRejectionContext : public ScXMLImportContext
+{
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper;
+
+public:
+ ScXMLRejectionContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper);
+
+ virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+
+ virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
+};
+
+}
+
+ScXMLTrackedChangesContext::ScXMLTrackedChangesContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pTempChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport ),
+ pChangeTrackingImportHelper(pTempChangeTrackingImportHelper)
+{
+ rImport.LockSolarMutex();
+
+ if ( !rAttrList.is() )
+ return;
+
+ auto aIter( rAttrList->find( XML_ELEMENT( TABLE, XML_PROTECTION_KEY ) ) );
+ if (aIter != rAttrList->end())
+ {
+ if( !aIter.isEmpty() )
+ {
+ uno::Sequence<sal_Int8> aPass;
+ ::comphelper::Base64::decode( aPass, aIter.toString() );
+ pChangeTrackingImportHelper->SetProtection(aPass);
+ }
+ }
+}
+
+ScXMLTrackedChangesContext::~ScXMLTrackedChangesContext()
+{
+ GetScImport().UnlockSolarMutex();
+}
+
+uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLTrackedChangesContext::createFastChildContext(
+ sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+{
+ SvXMLImportContext *pContext(nullptr);
+ sax_fastparser::FastAttributeList *pAttribList =
+ &sax_fastparser::castToFastAttributeList( xAttrList );
+
+ switch (nElement)
+ {
+ case XML_ELEMENT( TABLE, XML_CELL_CONTENT_CHANGE ):
+ pContext = new ScXMLContentChangeContext(GetScImport(), pAttribList, pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_INSERTION ):
+ pContext = new ScXMLInsertionContext(GetScImport(), pAttribList, pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_DELETION ):
+ pContext = new ScXMLDeletionContext(GetScImport(), pAttribList, pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_MOVEMENT ):
+ pContext = new ScXMLMovementContext(GetScImport(), pAttribList, pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_REJECTION ):
+ pContext = new ScXMLRejectionContext(GetScImport(), pAttribList, pChangeTrackingImportHelper);
+ break;
+ }
+
+ return pContext;
+}
+
+ScXMLChangeInfoContext::ScXMLChangeInfoContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pTempChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport ),
+ aInfo(),
+ pChangeTrackingImportHelper(pTempChangeTrackingImportHelper),
+ nParagraphCount(0)
+{
+ if ( rAttrList.is() )
+ {
+ for (auto &aIter : *rAttrList)
+ {
+ sal_Int32 nToken = aIter.getToken();
+ if ( nToken == XML_ELEMENT( OFFICE, XML_CHG_AUTHOR ) )
+ sAuthorBuffer = aIter.toString();
+ else if ( nToken == XML_ELEMENT( OFFICE, XML_CHG_DATE_TIME ) )
+ sDateTimeBuffer = aIter.toString();
+ }
+ }
+}
+
+css::uno::Reference< css::xml::sax::XFastContextHandler > ScXMLChangeInfoContext::createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ )
+{
+ SvXMLImportContext *pContext(nullptr);
+
+ if( nElement == XML_ELEMENT(DC, XML_CREATOR ) )
+ pContext = new ScXMLContentContext(GetScImport(), sAuthorBuffer);
+ else if( nElement == XML_ELEMENT(DC, XML_DATE ) )
+ pContext = new ScXMLContentContext(GetScImport(), sDateTimeBuffer);
+ else if (nElement == XML_ELEMENT(TEXT, XML_P))
+ {
+ if(nParagraphCount)
+ sCommentBuffer.append('\n');
+ ++nParagraphCount;
+ pContext = new ScXMLContentContext( GetScImport(), sCommentBuffer);
+ }
+
+ return pContext;
+}
+
+void SAL_CALL ScXMLChangeInfoContext::endFastElement( sal_Int32 /*nElement*/ )
+{
+ aInfo.sUser = sAuthorBuffer.makeStringAndClear();
+ ::sax::Converter::parseDateTime(aInfo.aDateTime, sDateTimeBuffer);
+ sDateTimeBuffer.setLength(0);
+ aInfo.sComment = sCommentBuffer.makeStringAndClear();
+ pChangeTrackingImportHelper->SetActionInfo(aInfo);
+}
+
+ScXMLBigRangeContext::ScXMLBigRangeContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScBigRange& rBigRange ) :
+ ScXMLImportContext( rImport )
+{
+ bool bColumn(false);
+ bool bRow(false);
+ bool bTable(false);
+ sal_Int32 nColumn(0);
+ sal_Int32 nRow(0);
+ sal_Int32 nTable(0);
+ sal_Int32 nStartColumn(0);
+ sal_Int32 nEndColumn(0);
+ sal_Int32 nStartRow(0);
+ sal_Int32 nEndRow(0);
+ sal_Int32 nStartTable(0);
+ sal_Int32 nEndTable(0);
+ if ( rAttrList.is() )
+ {
+ for (auto &aIter : *rAttrList)
+ {
+ switch (aIter.getToken())
+ {
+ case XML_ELEMENT( TABLE, XML_COLUMN ):
+ nColumn = aIter.toInt32();
+ bColumn = true;
+ break;
+ case XML_ELEMENT( TABLE, XML_ROW ):
+ nRow = aIter.toInt32();
+ bRow = true;
+ break;
+ case XML_ELEMENT( TABLE, XML_TABLE ):
+ nTable = aIter.toInt32();
+ bTable = true;
+ break;
+ case XML_ELEMENT( TABLE, XML_START_COLUMN ):
+ nStartColumn = aIter.toInt32();
+ break;
+ case XML_ELEMENT( TABLE, XML_END_COLUMN ):
+ nEndColumn = aIter.toInt32();
+ break;
+ case XML_ELEMENT( TABLE, XML_START_ROW ):
+ nStartRow = aIter.toInt32();
+ break;
+ case XML_ELEMENT( TABLE, XML_END_ROW ):
+ nEndRow = aIter.toInt32();
+ break;
+ case XML_ELEMENT( TABLE, XML_START_TABLE ):
+ nStartTable = aIter.toInt32();
+ break;
+ case XML_ELEMENT( TABLE, XML_END_TABLE ):
+ nEndTable = aIter.toInt32();
+ break;
+ }
+ }
+ }
+
+ if (bColumn)
+ nStartColumn = nEndColumn = nColumn;
+ if (bRow)
+ nStartRow = nEndRow = nRow;
+ if (bTable)
+ nStartTable = nEndTable = nTable;
+ rBigRange.Set(nStartColumn, nStartRow, nStartTable,
+ nEndColumn, nEndRow, nEndTable);
+}
+
+ScXMLCellContentDeletionContext::ScXMLCellContentDeletionContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pTempChangeTrackingImportHelper) :
+ ScXMLImportContext( rImport ),
+ fValue(0.0),
+ pChangeTrackingImportHelper(pTempChangeTrackingImportHelper),
+ nID(0),
+ nMatrixCols(0),
+ nMatrixRows(0),
+ eGrammar( formula::FormulaGrammar::GRAM_STORAGE_DEFAULT),
+ nType(css::util::NumberFormat::ALL),
+ nMatrixFlag(ScMatrixMode::NONE)
+{
+ if ( rAttrList.is() )
+ {
+ auto aIter( rAttrList->find( XML_ELEMENT( TABLE, XML_ID ) ) );
+ if (aIter != rAttrList->end())
+ nID = ScXMLChangeTrackingImportHelper::GetIDFromString( aIter.toView() );
+ }
+}
+
+uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLCellContentDeletionContext::createFastChildContext(
+ sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+{
+ SvXMLImportContext *pContext(nullptr);
+ sax_fastparser::FastAttributeList *pAttribList =
+ &sax_fastparser::castToFastAttributeList( xAttrList );
+
+ switch (nElement)
+ {
+ case XML_ELEMENT( TABLE, XML_CHANGE_TRACK_TABLE_CELL ):
+ pContext = new ScXMLChangeCellContext(GetScImport(), pAttribList,
+ maCell, sFormulaAddress, sFormula, sFormulaNmsp, eGrammar, sInputString, fValue, nType, nMatrixFlag, nMatrixCols, nMatrixRows );
+ break;
+ case XML_ELEMENT( TABLE, XML_CELL_ADDRESS ):
+ OSL_ENSURE(!nID, "a action with a ID should not contain a BigRange");
+ pContext = new ScXMLBigRangeContext(GetScImport(), pAttribList, aBigRange);
+ break;
+ }
+
+ return pContext;
+}
+
+void SAL_CALL ScXMLCellContentDeletionContext::endFastElement( sal_Int32 /*nElement*/ )
+{
+ std::unique_ptr<ScMyCellInfo> pCellInfo(new ScMyCellInfo(maCell, sFormulaAddress, sFormula, eGrammar, sInputString, fValue, nType,
+ nMatrixFlag, nMatrixCols, nMatrixRows));
+ if (nID)
+ pChangeTrackingImportHelper->AddDeleted(nID, std::move(pCellInfo));
+ else
+ pChangeTrackingImportHelper->AddGenerated(std::move(pCellInfo), aBigRange);
+}
+
+ScXMLDependenceContext::ScXMLDependenceContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport )
+{
+ sal_uInt32 nID(0);
+ if ( rAttrList.is() )
+ {
+ auto aIter( rAttrList->find( XML_ELEMENT( TABLE, XML_ID ) ) );
+ if (aIter != rAttrList->end())
+ nID = ScXMLChangeTrackingImportHelper::GetIDFromString(aIter.toView());
+ }
+ pChangeTrackingImportHelper->AddDependence(nID);
+}
+
+ScXMLDependingsContext::ScXMLDependingsContext( ScXMLImport& rImport,
+ ScXMLChangeTrackingImportHelper* pTempChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport ),
+ pChangeTrackingImportHelper(pTempChangeTrackingImportHelper)
+{
+ // here are no attributes
+}
+
+uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLDependingsContext::createFastChildContext(
+ sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+{
+ SvXMLImportContext *pContext(nullptr);
+ sax_fastparser::FastAttributeList *pAttribList =
+ &sax_fastparser::castToFastAttributeList( xAttrList );
+
+ // #i80033# read both old (dependence) and new (dependency) elements
+ if (nElement == XML_ELEMENT( TABLE, XML_DEPENDENCE ) ||
+ nElement == XML_ELEMENT( TABLE, XML_DEPENDENCY ))
+ {
+ pContext = new ScXMLDependenceContext(GetScImport(), pAttribList, pChangeTrackingImportHelper);
+ }
+
+ return pContext;
+}
+
+ScXMLChangeDeletionContext::ScXMLChangeDeletionContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport )
+{
+ sal_uInt32 nID(0);
+ if ( rAttrList.is() )
+ {
+ auto aIter( rAttrList->find( XML_ELEMENT( TABLE, XML_ID ) ) );
+ if (aIter != rAttrList->end())
+ nID = ScXMLChangeTrackingImportHelper::GetIDFromString( aIter.toView() );
+ }
+ pChangeTrackingImportHelper->AddDeleted(nID);
+}
+
+ScXMLDeletionsContext::ScXMLDeletionsContext( ScXMLImport& rImport,
+ ScXMLChangeTrackingImportHelper* pTempChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport ),
+ pChangeTrackingImportHelper(pTempChangeTrackingImportHelper)
+{
+ // here are no attributes
+}
+
+uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLDeletionsContext::createFastChildContext(
+ sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+{
+ SvXMLImportContext *pContext(nullptr);
+ sax_fastparser::FastAttributeList *pAttribList =
+ &sax_fastparser::castToFastAttributeList( xAttrList );
+
+ switch (nElement)
+ {
+ case XML_ELEMENT( TABLE, XML_CHANGE_DELETION ):
+ pContext = new ScXMLChangeDeletionContext(GetScImport(), pAttribList, pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_CELL_CONTENT_DELETION ):
+ pContext = new ScXMLCellContentDeletionContext(GetScImport(), pAttribList, pChangeTrackingImportHelper);
+ break;
+ }
+
+ return pContext;
+}
+
+ScXMLChangeTextPContext::ScXMLChangeTextPContext( ScXMLImport& rImport,
+ sal_Int32 nElement,
+ const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList,
+ ScXMLChangeCellContext* pTempChangeCellContext) :
+ ScXMLImportContext( rImport ),
+ mxAttrList(xAttrList),
+ mnElement(nElement),
+ pChangeCellContext(pTempChangeCellContext)
+{
+ // here are no attributes
+}
+
+uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLChangeTextPContext::createFastChildContext(
+ sal_Int32 nElement,
+ const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+{
+ uno::Reference< xml::sax::XFastContextHandler > xContext;
+ if (IsTokenInNamespace(mnElement, XML_NAMESPACE_TEXT)
+ && (nElement & TOKEN_MASK) == XML_S
+ && !pTextPContext)
+ {
+ sal_Int32 nRepeat(0);
+ for( auto& aIter : sax_fastparser::castToFastAttributeList(mxAttrList) )
+ {
+ if (aIter.getToken() == XML_ELEMENT(TEXT, XML_C))
+ nRepeat = aIter.toInt32();
+ else
+ XMLOFF_WARN_UNKNOWN("sc", aIter);
+ }
+ if (nRepeat)
+ for (sal_Int32 j = 0; j < nRepeat; ++j)
+ sText.append(' ');
+ else
+ sText.append(' ');
+ }
+ else
+ {
+ if (!pChangeCellContext->IsEditCell())
+ pChangeCellContext->CreateTextPContext(false);
+ bool bWasContext (true);
+ if (!pTextPContext)
+ {
+ bWasContext = false;
+ pTextPContext = GetScImport().GetTextImport()->CreateTextChildContext(
+ GetScImport(), mnElement, mxAttrList);
+ }
+ if (pTextPContext)
+ {
+ if (!bWasContext)
+ pTextPContext->characters(sText.makeStringAndClear());
+ xContext = pTextPContext->createFastChildContext(nElement, xAttrList);
+ }
+ }
+
+ return xContext;
+}
+
+void ScXMLChangeTextPContext::characters( const OUString& rChars )
+{
+ if (!pTextPContext)
+ sText.append(rChars);
+ else
+ pTextPContext->characters(rChars);
+}
+
+void ScXMLChangeTextPContext::endFastElement(sal_Int32 /*nElement*/)
+{
+ if (!pTextPContext)
+ pChangeCellContext->SetText(sText.makeStringAndClear());
+}
+
+ScXMLChangeCellContext::ScXMLChangeCellContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScCellValue& rOldCell, OUString& rAddress,
+ OUString& rFormula, OUString& rFormulaNmsp,
+ formula::FormulaGrammar::Grammar& rGrammar,
+ OUString& rTempInputString, double& rDateTimeValue, sal_uInt16& nType,
+ ScMatrixMode& nMatrixFlag, sal_Int32& nMatrixCols, sal_Int32& nMatrixRows )
+ : ScXMLImportContext( rImport )
+ , mrOldCell(rOldCell)
+ , rInputString(rTempInputString)
+ , fValue(0.0)
+ , rType(nType)
+ , bEmpty(true)
+ , bFirstParagraph(true)
+ , bString(true)
+ , bFormula(false)
+{
+ bool bIsMatrix(false);
+ bool bIsCoveredMatrix(false);
+ if ( rAttrList.is() )
+ {
+ for (auto &aIter : *rAttrList)
+ {
+ switch (aIter.getToken())
+ {
+ case XML_ELEMENT( TABLE, XML_FORMULA ):
+ bEmpty = false;
+ GetScImport().ExtractFormulaNamespaceGrammar( rFormula, rFormulaNmsp, rGrammar, aIter.toString() );
+ bFormula = true;
+ break;
+ case XML_ELEMENT( TABLE, XML_CELL_ADDRESS ):
+ rAddress = aIter.toString();
+ break;
+ case XML_ELEMENT( TABLE, XML_MATRIX_COVERED ):
+ bIsCoveredMatrix = IsXMLToken(aIter, XML_TRUE);
+ break;
+ case XML_ELEMENT( TABLE, XML_NUMBER_MATRIX_COLUMNS_SPANNED ):
+ bIsMatrix = true;
+ nMatrixCols = aIter.toInt32();
+ break;
+ case XML_ELEMENT( TABLE, XML_NUMBER_MATRIX_ROWS_SPANNED ):
+ bIsMatrix = true;
+ nMatrixRows = aIter.toInt32();
+ break;
+ case XML_ELEMENT( OFFICE, XML_VALUE_TYPE ):
+ if (IsXMLToken(aIter, XML_FLOAT))
+ bString = false;
+ else if (IsXMLToken(aIter, XML_DATE))
+ {
+ rType = css::util::NumberFormat::DATE;
+ bString = false;
+ }
+ else if (IsXMLToken(aIter, XML_TIME))
+ {
+ rType = css::util::NumberFormat::TIME;
+ bString = false;
+ }
+ break;
+ case XML_ELEMENT( OFFICE, XML_VALUE ):
+ fValue = aIter.toDouble();
+ bEmpty = false;
+ break;
+ case XML_ELEMENT( OFFICE, XML_DATE_VALUE ):
+ bEmpty = false;
+ if (GetScImport().GetMM100UnitConverter().setNullDate(GetScImport().GetModel()))
+ GetScImport().GetMM100UnitConverter().convertDateTime(rDateTimeValue, aIter.toView());
+ fValue = rDateTimeValue;
+ break;
+ case XML_ELEMENT( OFFICE, XML_TIME_VALUE ):
+ bEmpty = false;
+ ::sax::Converter::convertDuration(rDateTimeValue, aIter.toView());
+ fValue = rDateTimeValue;
+ }
+ }
+ }
+
+ if (bIsCoveredMatrix)
+ nMatrixFlag = ScMatrixMode::Reference;
+ else if (bIsMatrix && nMatrixRows && nMatrixCols)
+ nMatrixFlag = ScMatrixMode::Formula;
+}
+
+uno::Reference< xml::sax::XFastContextHandler > ScXMLChangeCellContext::createFastChildContext(
+ sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+{
+ SvXMLImportContext *pContext(nullptr);
+
+ if (nElement == XML_ELEMENT(TEXT, XML_P))
+ {
+ bEmpty = false;
+ if (bFirstParagraph)
+ {
+ pContext = new ScXMLChangeTextPContext(GetScImport(), nElement, xAttrList, this);
+ bFirstParagraph = false;
+ }
+ else
+ {
+ if (!mpEditTextObj.is())
+ CreateTextPContext(true);
+ pContext = GetScImport().GetTextImport()->CreateTextChildContext(
+ GetScImport(), nElement, xAttrList);
+ }
+ }
+ else
+ XMLOFF_WARN_UNKNOWN_ELEMENT("sc", nElement);
+
+ return pContext;
+}
+
+void ScXMLChangeCellContext::CreateTextPContext(bool bIsNewParagraph)
+{
+ if (!GetScImport().GetDocument())
+ return;
+
+ mpEditTextObj = new ScEditEngineTextObj();
+ mpEditTextObj->GetEditEngine()->SetEditTextObjectPool(GetScImport().GetDocument()->GetEditPool());
+ uno::Reference <text::XText> xText(mpEditTextObj);
+ if (xText.is())
+ {
+ uno::Reference<text::XTextCursor> xTextCursor(xText->createTextCursor());
+ if (bIsNewParagraph)
+ {
+ xText->setString(sText);
+ xTextCursor->gotoEnd(false);
+ xText->insertControlCharacter(xTextCursor, text::ControlCharacter::PARAGRAPH_BREAK, false);
+ }
+ GetScImport().GetTextImport()->SetCursor(xTextCursor);
+ }
+}
+
+void SAL_CALL ScXMLChangeCellContext::endFastElement( sal_Int32 /*nElement*/ )
+{
+ if (!bEmpty)
+ {
+ ScDocument* pDoc = GetScImport().GetDocument();
+ if (mpEditTextObj.is())
+ {
+ if (GetImport().GetTextImport()->GetCursor().is())
+ {
+ //GetImport().GetTextImport()->GetCursor()->gotoEnd(sal_False);
+ if( GetImport().GetTextImport()->GetCursor()->goLeft( 1, true ) )
+ {
+ GetImport().GetTextImport()->GetText()->insertString(
+ GetImport().GetTextImport()->GetCursorAsRange(), "",
+ true );
+ }
+ }
+
+ // The cell will own the text object instance.
+ mrOldCell.meType = CELLTYPE_EDIT;
+ mrOldCell.mpEditText = mpEditTextObj->CreateTextObject().release();
+ GetScImport().GetTextImport()->ResetCursor();
+ mpEditTextObj.clear();
+ }
+ else
+ {
+ if (!bFormula)
+ {
+ if (!sText.isEmpty() && bString)
+ {
+ mrOldCell.meType = CELLTYPE_STRING;
+ mrOldCell.mpString = new svl::SharedString(pDoc->GetSharedStringPool().intern(sText));
+ }
+ else
+ {
+ mrOldCell.meType = CELLTYPE_VALUE;
+ mrOldCell.mfValue = fValue;
+ }
+ if (rType == css::util::NumberFormat::DATE || rType == css::util::NumberFormat::TIME)
+ rInputString = sText;
+ }
+ }
+ }
+ else
+ mrOldCell.clear();
+}
+
+ScXMLPreviousContext::ScXMLPreviousContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pTempChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport ),
+ fValue(0.0),
+ pChangeTrackingImportHelper(pTempChangeTrackingImportHelper),
+ nID(0),
+ nMatrixCols(0),
+ nMatrixRows(0),
+ eGrammar( formula::FormulaGrammar::GRAM_STORAGE_DEFAULT),
+ nType(css::util::NumberFormat::ALL),
+ nMatrixFlag(ScMatrixMode::NONE)
+{
+ if ( rAttrList.is() )
+ {
+ auto aIter( rAttrList->find( XML_ELEMENT( TABLE, XML_ID ) ) );
+ if (aIter != rAttrList->end())
+ nID = ScXMLChangeTrackingImportHelper::GetIDFromString( aIter.toView() );
+ }
+}
+
+uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLPreviousContext::createFastChildContext(
+ sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+{
+ SvXMLImportContext *pContext(nullptr);
+ sax_fastparser::FastAttributeList *pAttribList =
+ &sax_fastparser::castToFastAttributeList( xAttrList );
+
+ if ( nElement == XML_ELEMENT( TABLE, XML_CHANGE_TRACK_TABLE_CELL ) )
+ pContext = new ScXMLChangeCellContext(GetScImport(), pAttribList,
+ maOldCell, sFormulaAddress, sFormula, sFormulaNmsp, eGrammar, sInputString, fValue, nType, nMatrixFlag, nMatrixCols, nMatrixRows);
+
+ return pContext;
+}
+
+void SAL_CALL ScXMLPreviousContext::endFastElement( sal_Int32 /*nElement*/ )
+{
+ pChangeTrackingImportHelper->SetPreviousChange(nID, new ScMyCellInfo(maOldCell, sFormulaAddress, sFormula, eGrammar, sInputString,
+ fValue, nType, nMatrixFlag, nMatrixCols, nMatrixRows));
+}
+
+ScXMLContentChangeContext::ScXMLContentChangeContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pTempChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport ),
+ pChangeTrackingImportHelper(pTempChangeTrackingImportHelper)
+{
+ sal_uInt32 nActionNumber(0);
+ sal_uInt32 nRejectingNumber(0);
+ ScChangeActionState nActionState(SC_CAS_VIRGIN);
+
+ if ( rAttrList.is() )
+ {
+ for (auto &aIter : *rAttrList)
+ {
+ switch (aIter.getToken())
+ {
+ case XML_ELEMENT( TABLE, XML_ID ):
+ nActionNumber = ScXMLChangeTrackingImportHelper::GetIDFromString( aIter.toView() );
+ break;
+ case XML_ELEMENT( TABLE, XML_ACCEPTANCE_STATE ):
+ if (IsXMLToken( aIter, XML_ACCEPTED ))
+ nActionState = SC_CAS_ACCEPTED;
+ else if (IsXMLToken( aIter, XML_REJECTED ))
+ nActionState = SC_CAS_REJECTED;
+ break;
+ case XML_ELEMENT( TABLE, XML_REJECTING_CHANGE_ID ):
+ nRejectingNumber = ScXMLChangeTrackingImportHelper::GetIDFromString( aIter.toView() );
+ }
+ }
+ }
+
+ pChangeTrackingImportHelper->StartChangeAction(SC_CAT_CONTENT);
+ pChangeTrackingImportHelper->SetActionNumber(nActionNumber);
+ pChangeTrackingImportHelper->SetActionState(nActionState);
+ pChangeTrackingImportHelper->SetRejectingNumber(nRejectingNumber);
+}
+
+uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLContentChangeContext::createFastChildContext(
+ sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+{
+ SvXMLImportContext *pContext(nullptr);
+ sax_fastparser::FastAttributeList *pAttribList =
+ &sax_fastparser::castToFastAttributeList( xAttrList );
+
+ switch (nElement)
+ {
+ case XML_ELEMENT( OFFICE, XML_CHANGE_INFO ):
+ pContext = new ScXMLChangeInfoContext(GetScImport(), pAttribList, pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_CELL_ADDRESS ):
+ pContext = new ScXMLBigRangeContext(GetScImport(), pAttribList, aBigRange);
+ break;
+ case XML_ELEMENT( TABLE, XML_DEPENDENCIES ):
+ pContext = new ScXMLDependingsContext(GetScImport(), pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_DELETIONS ):
+ pContext = new ScXMLDeletionsContext(GetScImport(), pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_PREVIOUS ):
+ pContext = new ScXMLPreviousContext(GetScImport(), pAttribList, pChangeTrackingImportHelper);
+ break;
+ }
+
+ return pContext;
+}
+
+void SAL_CALL ScXMLContentChangeContext::endFastElement( sal_Int32 /*nElement*/ )
+{
+ pChangeTrackingImportHelper->SetBigRange(aBigRange);
+ pChangeTrackingImportHelper->EndChangeAction();
+}
+
+ScXMLInsertionContext::ScXMLInsertionContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pTempChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport ),
+ pChangeTrackingImportHelper(pTempChangeTrackingImportHelper)
+{
+ sal_uInt32 nActionNumber(0);
+ sal_uInt32 nRejectingNumber(0);
+ sal_Int32 nPosition(0);
+ sal_Int32 nCount(1);
+ sal_Int32 nTable(0);
+ ScChangeActionState nActionState(SC_CAS_VIRGIN);
+ ScChangeActionType nActionType(SC_CAT_INSERT_COLS);
+
+ if ( rAttrList.is() )
+ {
+ for (auto &aIter : *rAttrList)
+ {
+ switch (aIter.getToken())
+ {
+ case XML_ELEMENT( TABLE, XML_ID ):
+ nActionNumber = ScXMLChangeTrackingImportHelper::GetIDFromString( aIter.toView() );
+ break;
+ case XML_ELEMENT( TABLE, XML_ACCEPTANCE_STATE ):
+ if (IsXMLToken( aIter, XML_ACCEPTED ))
+ nActionState = SC_CAS_ACCEPTED;
+ else if (IsXMLToken( aIter, XML_REJECTED ))
+ nActionState = SC_CAS_REJECTED;
+ break;
+ case XML_ELEMENT( TABLE, XML_REJECTING_CHANGE_ID ):
+ nRejectingNumber = ScXMLChangeTrackingImportHelper::GetIDFromString( aIter.toView() );
+ break;
+ case XML_ELEMENT( TABLE, XML_TYPE ):
+ if (IsXMLToken( aIter, XML_ROW ))
+ nActionType = SC_CAT_INSERT_ROWS;
+ else if (IsXMLToken( aIter, XML_TABLE ))
+ nActionType = SC_CAT_INSERT_TABS;
+ break;
+ case XML_ELEMENT( TABLE, XML_POSITION ):
+ nPosition = aIter.toInt32();
+ break;
+ case XML_ELEMENT( TABLE, XML_TABLE ):
+ nTable = aIter.toInt32();
+ break;
+ case XML_ELEMENT( TABLE, XML_COUNT ):
+ nCount = aIter.toInt32();
+ break;
+ }
+ }
+ }
+
+ pChangeTrackingImportHelper->StartChangeAction(nActionType);
+ pChangeTrackingImportHelper->SetActionNumber(nActionNumber);
+ pChangeTrackingImportHelper->SetActionState(nActionState);
+ pChangeTrackingImportHelper->SetRejectingNumber(nRejectingNumber);
+ pChangeTrackingImportHelper->SetPosition(nPosition, nCount, nTable);
+}
+
+uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLInsertionContext::createFastChildContext(
+ sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+{
+ SvXMLImportContext *pContext(nullptr);
+ sax_fastparser::FastAttributeList *pAttribList =
+ &sax_fastparser::castToFastAttributeList( xAttrList );
+
+ switch (nElement)
+ {
+ case XML_ELEMENT( OFFICE, XML_CHANGE_INFO ):
+ pContext = new ScXMLChangeInfoContext(GetScImport(), pAttribList, pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_DEPENDENCIES ):
+ pContext = new ScXMLDependingsContext(GetScImport(), pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_DELETIONS ):
+ pContext = new ScXMLDeletionsContext(GetScImport(), pChangeTrackingImportHelper);
+ break;
+ }
+
+ return pContext;
+}
+
+void SAL_CALL ScXMLInsertionContext::endFastElement( sal_Int32 /*nElement*/ )
+{
+ pChangeTrackingImportHelper->EndChangeAction();
+}
+
+ScXMLInsertionCutOffContext::ScXMLInsertionCutOffContext( ScXMLImport& rImport,
+ const uno::Reference<xml::sax::XFastAttributeList>& xAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport )
+{
+ sal_uInt32 nID(0);
+ sal_Int32 nPosition(0);
+ for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
+ {
+ switch (aIter.getToken())
+ {
+ case XML_ELEMENT(TABLE, XML_ID):
+ nID = ScXMLChangeTrackingImportHelper::GetIDFromString(aIter.toView());
+ break;
+ case XML_ELEMENT(TABLE, XML_POSITION):
+ ::sax::Converter::convertNumber(nPosition, aIter.toView());
+ break;
+ }
+ }
+ pChangeTrackingImportHelper->SetInsertionCutOff(nID, nPosition);
+}
+
+
+ScXMLMovementCutOffContext::ScXMLMovementCutOffContext( ScXMLImport& rImport,
+ const uno::Reference<xml::sax::XFastAttributeList>& xAttrList,
+ ScXMLChangeTrackingImportHelper* pChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport )
+{
+ sal_uInt32 nID(0);
+ sal_Int32 nPosition(0);
+ sal_Int32 nStartPosition(0);
+ sal_Int32 nEndPosition(0);
+ bool bPosition(false);
+ for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList ))
+ {
+ switch (aIter.getToken())
+ {
+ case XML_ELEMENT(TABLE, XML_ID):
+ nID = ScXMLChangeTrackingImportHelper::GetIDFromString(aIter.toView());
+ break;
+ case XML_ELEMENT(TABLE, XML_POSITION):
+ bPosition = true;
+ ::sax::Converter::convertNumber(nPosition, aIter.toView());
+ break;
+ case XML_ELEMENT(TABLE, XML_START_POSITION):
+ ::sax::Converter::convertNumber(nStartPosition, aIter.toView());
+ break;
+ case XML_ELEMENT(TABLE, XML_END_POSITION):
+ ::sax::Converter::convertNumber(nEndPosition, aIter.toView());
+ break;
+ }
+ }
+ if (bPosition)
+ nStartPosition = nEndPosition = nPosition;
+ pChangeTrackingImportHelper->AddMoveCutOff(nID, nStartPosition, nEndPosition);
+}
+
+ScXMLCutOffsContext::ScXMLCutOffsContext( ScXMLImport& rImport,
+ ScXMLChangeTrackingImportHelper* pTempChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport ),
+ pChangeTrackingImportHelper(pTempChangeTrackingImportHelper)
+{
+ // here are no attributes
+}
+
+css::uno::Reference< css::xml::sax::XFastContextHandler > ScXMLCutOffsContext::createFastChildContext(
+ sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
+{
+ SvXMLImportContext *pContext(nullptr);
+
+ if (nElement == XML_ELEMENT(TABLE, XML_INSERTION_CUT_OFF))
+ pContext = new ScXMLInsertionCutOffContext(GetScImport(), xAttrList, pChangeTrackingImportHelper);
+ else if (nElement == XML_ELEMENT(TABLE, XML_MOVEMENT_CUT_OFF))
+ pContext = new ScXMLMovementCutOffContext(GetScImport(), xAttrList, pChangeTrackingImportHelper);
+
+ return pContext;
+}
+
+ScXMLDeletionContext::ScXMLDeletionContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pTempChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport ),
+ pChangeTrackingImportHelper(pTempChangeTrackingImportHelper)
+{
+ sal_uInt32 nActionNumber(0);
+ sal_uInt32 nRejectingNumber(0);
+ sal_Int32 nPosition(0);
+ sal_Int32 nMultiSpanned(0);
+ sal_Int32 nTable(0);
+ ScChangeActionState nActionState(SC_CAS_VIRGIN);
+ ScChangeActionType nActionType(SC_CAT_DELETE_COLS);
+
+ if ( rAttrList.is() )
+ {
+ for (auto &aIter : *rAttrList)
+ {
+ sal_Int32 nToken = aIter.getToken();
+ switch (nToken)
+ {
+ case XML_ELEMENT( TABLE, XML_ID ):
+ nActionNumber = ScXMLChangeTrackingImportHelper::GetIDFromString( aIter.toView() );
+ break;
+ case XML_ELEMENT( TABLE, XML_ACCEPTANCE_STATE ):
+ if (IsXMLToken( aIter, XML_ACCEPTED ))
+ nActionState = SC_CAS_ACCEPTED;
+ else if (IsXMLToken( aIter, XML_REJECTED ))
+ nActionState = SC_CAS_REJECTED;
+ break;
+ case XML_ELEMENT( TABLE, XML_REJECTING_CHANGE_ID ):
+ nRejectingNumber = ScXMLChangeTrackingImportHelper::GetIDFromString( aIter.toView() );
+ break;
+ case XML_ELEMENT( TABLE, XML_TYPE ):
+ if (IsXMLToken( aIter, XML_ROW ))
+ nActionType = SC_CAT_DELETE_ROWS;
+ else if (IsXMLToken( aIter, XML_TABLE ))
+ nActionType = SC_CAT_DELETE_TABS;
+ break;
+ case XML_ELEMENT( TABLE, XML_POSITION ):
+ nPosition = aIter.toInt32();
+ break;
+ case XML_ELEMENT( TABLE, XML_TABLE ):
+ nTable = aIter.toInt32();
+ break;
+ case XML_ELEMENT( TABLE, XML_MULTI_DELETION_SPANNED ):
+ nMultiSpanned = aIter.toInt32();
+ break;
+ }
+ }
+ }
+
+ pChangeTrackingImportHelper->StartChangeAction(nActionType);
+ pChangeTrackingImportHelper->SetActionNumber(nActionNumber);
+ pChangeTrackingImportHelper->SetActionState(nActionState);
+ pChangeTrackingImportHelper->SetRejectingNumber(nRejectingNumber);
+ pChangeTrackingImportHelper->SetPosition(nPosition, 1, nTable);
+ pChangeTrackingImportHelper->SetMultiSpanned(static_cast<sal_Int16>(nMultiSpanned));
+}
+
+uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLDeletionContext::createFastChildContext(
+ sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+{
+ SvXMLImportContext *pContext(nullptr);
+ sax_fastparser::FastAttributeList *pAttribList =
+ &sax_fastparser::castToFastAttributeList( xAttrList );
+
+ switch (nElement)
+ {
+ case XML_ELEMENT( OFFICE, XML_CHANGE_INFO ):
+ pContext = new ScXMLChangeInfoContext(GetScImport(), pAttribList, pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_DEPENDENCIES ):
+ pContext = new ScXMLDependingsContext(GetScImport(), pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_DELETIONS ):
+ pContext = new ScXMLDeletionsContext(GetScImport(), pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_CUT_OFFS ):
+ case XML_ELEMENT( TABLE, XML_CUT_OFFS2 ): // cut_offs
+ pContext = new ScXMLCutOffsContext(GetScImport(), pChangeTrackingImportHelper);
+ }
+
+ return pContext;
+}
+
+void SAL_CALL ScXMLDeletionContext::endFastElement( sal_Int32 /*nElement*/ )
+{
+ pChangeTrackingImportHelper->EndChangeAction();
+}
+
+ScXMLMovementContext::ScXMLMovementContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pTempChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport ),
+ pChangeTrackingImportHelper(pTempChangeTrackingImportHelper)
+{
+ sal_uInt32 nActionNumber(0);
+ sal_uInt32 nRejectingNumber(0);
+ ScChangeActionState nActionState(SC_CAS_VIRGIN);
+
+ if ( rAttrList.is() )
+ {
+ for (auto &aIter : *rAttrList)
+ {
+ switch (aIter.getToken())
+ {
+ case XML_ELEMENT( TABLE, XML_ID ):
+ nActionNumber = ScXMLChangeTrackingImportHelper::GetIDFromString( aIter.toView() );
+ break;
+ case XML_ELEMENT( TABLE, XML_ACCEPTANCE_STATE ):
+ if (IsXMLToken( aIter, XML_ACCEPTED ))
+ nActionState = SC_CAS_ACCEPTED;
+ else if (IsXMLToken( aIter, XML_REJECTED ))
+ nActionState = SC_CAS_REJECTED;
+ break;
+ case XML_ELEMENT( TABLE, XML_REJECTING_CHANGE_ID ):
+ nRejectingNumber = ScXMLChangeTrackingImportHelper::GetIDFromString( aIter.toView() );
+ break;
+ }
+ }
+ }
+
+ pChangeTrackingImportHelper->StartChangeAction(SC_CAT_MOVE);
+ pChangeTrackingImportHelper->SetActionNumber(nActionNumber);
+ pChangeTrackingImportHelper->SetActionState(nActionState);
+ pChangeTrackingImportHelper->SetRejectingNumber(nRejectingNumber);
+}
+
+uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLMovementContext::createFastChildContext(
+ sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+{
+ SvXMLImportContext *pContext(nullptr);
+ sax_fastparser::FastAttributeList *pAttribList =
+ &sax_fastparser::castToFastAttributeList( xAttrList );
+
+ switch (nElement)
+ {
+ case XML_ELEMENT( OFFICE, XML_CHANGE_INFO ):
+ pContext = new ScXMLChangeInfoContext(GetScImport(), pAttribList, pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_DEPENDENCIES ):
+ pContext = new ScXMLDependingsContext(GetScImport(), pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_DELETIONS ):
+ pContext = new ScXMLDeletionsContext(GetScImport(), pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_SOURCE_RANGE_ADDRESS ):
+ pContext = new ScXMLBigRangeContext(GetScImport(), pAttribList, aSourceRange);
+ break;
+ case XML_ELEMENT( TABLE, XML_TARGET_RANGE_ADDRESS ):
+ pContext = new ScXMLBigRangeContext(GetScImport(), pAttribList, aTargetRange);
+ break;
+ }
+
+ return pContext;
+}
+
+void SAL_CALL ScXMLMovementContext::endFastElement( sal_Int32 /*nElement*/ )
+{
+ pChangeTrackingImportHelper->SetMoveRanges(aSourceRange, aTargetRange);
+ pChangeTrackingImportHelper->EndChangeAction();
+}
+
+ScXMLRejectionContext::ScXMLRejectionContext( ScXMLImport& rImport,
+ const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList,
+ ScXMLChangeTrackingImportHelper* pTempChangeTrackingImportHelper ) :
+ ScXMLImportContext( rImport ),
+ pChangeTrackingImportHelper(pTempChangeTrackingImportHelper)
+{
+ sal_uInt32 nActionNumber(0);
+ sal_uInt32 nRejectingNumber(0);
+ ScChangeActionState nActionState(SC_CAS_VIRGIN);
+
+ if ( rAttrList.is() )
+ {
+ for (auto &aIter : *rAttrList)
+ {
+ switch (aIter.getToken())
+ {
+ case XML_ELEMENT( TABLE, XML_ID ):
+ nActionNumber = ScXMLChangeTrackingImportHelper::GetIDFromString( aIter.toView() );
+ break;
+ case XML_ELEMENT( TABLE, XML_ACCEPTANCE_STATE ):
+ if (IsXMLToken( aIter, XML_ACCEPTED ))
+ nActionState = SC_CAS_ACCEPTED;
+ else if (IsXMLToken( aIter, XML_REJECTED ))
+ nActionState = SC_CAS_REJECTED;
+ break;
+ case XML_ELEMENT( TABLE, XML_REJECTING_CHANGE_ID ):
+ nRejectingNumber = ScXMLChangeTrackingImportHelper::GetIDFromString( aIter.toView() );
+ break;
+ }
+ }
+ }
+
+ pChangeTrackingImportHelper->StartChangeAction(SC_CAT_MOVE);
+ pChangeTrackingImportHelper->SetActionNumber(nActionNumber);
+ pChangeTrackingImportHelper->SetActionState(nActionState);
+ pChangeTrackingImportHelper->SetRejectingNumber(nRejectingNumber);
+}
+
+uno::Reference< xml::sax::XFastContextHandler > SAL_CALL ScXMLRejectionContext::createFastChildContext(
+ sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
+{
+ SvXMLImportContext *pContext(nullptr);
+ sax_fastparser::FastAttributeList *pAttribList =
+ &sax_fastparser::castToFastAttributeList( xAttrList );
+
+ switch (nElement)
+ {
+ case XML_ELEMENT( OFFICE, XML_CHANGE_INFO ):
+ pContext = new ScXMLChangeInfoContext(GetScImport(), pAttribList, pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_DEPENDENCIES ):
+ pContext = new ScXMLDependingsContext(GetScImport(), pChangeTrackingImportHelper);
+ break;
+ case XML_ELEMENT( TABLE, XML_DELETIONS ):
+ pContext = new ScXMLDeletionsContext(GetScImport(), pChangeTrackingImportHelper);
+ break;
+ }
+
+ return pContext;
+}
+
+void SAL_CALL ScXMLRejectionContext::endFastElement( sal_Int32 /*nElement*/ )
+{
+ pChangeTrackingImportHelper->EndChangeAction();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */