7c3c3006de
is apparently worse than it
appeared at first glance since there are numerous assumptions about
bookmarks, such as that if they were inserted successfully they may be
copied successfully, which isn't the case for duplicate cross reference
bookmarks.
So fix this differently, by eliminating the duplicates and mapping all
reference fields to refer to the surviving bookmark.
It was not possible to do this in SwXBookmark by checking the makeMark()
return as that would raise interesting problems such as it's currently
guaranteed to have 1:1 SwXBoomarks to core Marks so we can't just
connect 2 SwXBookmarks to the same core Mark, and we also can't leave
the SwXBookmark unconnected after attach.
Another alternative would be to temporarily allow inserting the
duplicate bookmarks and then eliminate them after the import, but what
is implemented now is to check from xmloff for duplicates, which is
reasonably simple.
Change-Id: I7ee4854d1c9d8bf74201089cbb7287b1bd8ee3b9
113 lines
3.5 KiB
C++
113 lines
3.5 KiB
C++
/* -*- 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 .
|
|
*/
|
|
|
|
|
|
#ifndef INCLUDED_XMLOFF_SOURCE_TEXT_XMLTEXTMARKIMPORTCONTEXT_HXX
|
|
#define INCLUDED_XMLOFF_SOURCE_TEXT_XMLTEXTMARKIMPORTCONTEXT_HXX
|
|
|
|
#include <xmloff/xmlictxt.hxx>
|
|
#include <com/sun/star/uno/Reference.h>
|
|
|
|
|
|
namespace com { namespace sun { namespace star {
|
|
namespace text {
|
|
class XTextRange;
|
|
class XTextContent;
|
|
}
|
|
namespace xml { namespace sax {
|
|
class XAttributeList;
|
|
} }
|
|
} } }
|
|
class XMLTextImportHelper;
|
|
|
|
class XMLFieldParamImportContext : public SvXMLImportContext
|
|
{
|
|
XMLTextImportHelper& rHelper;
|
|
public:
|
|
XMLFieldParamImportContext(
|
|
SvXMLImport& rImport,
|
|
XMLTextImportHelper& rHlp,
|
|
sal_uInt16 nPrfx,
|
|
const OUString& rLocalName );
|
|
|
|
virtual void StartElement(
|
|
const css::uno::Reference<css::xml::sax::XAttributeList> & xAttrList) override;
|
|
};
|
|
|
|
|
|
/**
|
|
* import bookmarks and reference marks
|
|
* ( <bookmark>, <bookmark-start>, <bookmark-end>,
|
|
* <reference>, <reference-start>, <reference-end> )
|
|
*
|
|
* All elements are handled by the same class due to their similarities.
|
|
*/
|
|
class XMLTextMarkImportContext : public SvXMLImportContext
|
|
{
|
|
private:
|
|
XMLTextImportHelper & m_rHelper;
|
|
|
|
css::uno::Reference<css::uno::XInterface> & m_rxCrossRefHeadingBookmark;
|
|
|
|
OUString m_sBookmarkName;
|
|
OUString m_sFieldName;
|
|
OUString m_sXmlId;
|
|
// RDFa
|
|
bool m_bHaveAbout;
|
|
OUString m_sAbout;
|
|
OUString m_sProperty;
|
|
OUString m_sContent;
|
|
OUString m_sDatatype;
|
|
|
|
public:
|
|
|
|
XMLTextMarkImportContext(
|
|
SvXMLImport& rImport,
|
|
XMLTextImportHelper& rHlp,
|
|
css::uno::Reference<css::uno::XInterface> & io_rxCrossRefHeadingBookmark,
|
|
sal_uInt16 nPrfx,
|
|
const OUString& rLocalName );
|
|
|
|
protected:
|
|
|
|
virtual void StartElement(
|
|
const css::uno::Reference<css::xml::sax::XAttributeList> & xAttrList) override;
|
|
virtual void EndElement() override;
|
|
|
|
virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
|
|
const OUString& rLocalName,
|
|
const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
|
|
|
|
public:
|
|
static css::uno::Reference< css::text::XTextContent > CreateAndInsertMark(
|
|
SvXMLImport& rImport,
|
|
const OUString& sServiceName,
|
|
const OUString& sMarkName,
|
|
const css::uno::Reference<css::text::XTextRange> & rRange,
|
|
const OUString& i_rXmlId = OUString());
|
|
|
|
bool FindName(
|
|
SvXMLImport& rImport,
|
|
const css::uno::Reference<css::xml::sax::XAttributeList> & xAttrList);
|
|
};
|
|
|
|
#endif
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|