/* -*- 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 .
*/
using ::com::sun::star::beans::XPropertySet; using ::com::sun::star::uno::Reference; using ::com::sun::star::xml::sax::XFastAttributeList; using ::com::sun::star::lang::XMultiServiceFactory; using ::com::sun::star::container::XNamed;
// section import: This one is fairly tricky due to a variety of // limits of the core or the API. The main problem is that if you // insert a section within another section, you can't move the cursor // between the ends of the inner and the enclosing section. To avoid // these problems, additional markers are first inserted and later deleted.
XMLSectionImportContext::XMLSectionImportContext( SvXMLImport& rImport )
: SvXMLImportContext(rImport)
, bProtect(false)
, bCondOK(false)
, bIsVisible(true)
, bValid(false)
, bSequenceOK(false)
, bIsCurrentlyVisible(true)
, bIsCurrentlyVisibleOK(false)
, bHasContent(false)
{
}
// save PropertySet (for CreateChildContext)
xSectionPropertySet = xPropSet;
// name
Reference<XNamed> xNamed(xPropSet, UNO_QUERY);
xNamed->setName(sName);
// stylename? if (!sStyleName.isEmpty())
{
XMLPropStyleContext* pStyle = rHelper->
FindSectionStyle(sStyleName);
if (pStyle != nullptr)
{
pStyle->FillPropertySet( xPropSet );
}
}
// IsVisible and condition (not for index headers) if (! bIsIndexHeader)
{
xPropSet->setPropertyValue( u"IsVisible"_ustr, Any(bIsVisible) );
// #97450# hidden sections must be hidden on reload // For backwards compatibility, set flag only if it is // present if( bIsCurrentlyVisibleOK )
{
xPropSet->setPropertyValue( u"IsCurrentlyVisible"_ustr, Any(bIsCurrentlyVisible));
}
if (bCondOK)
{
xPropSet->setPropertyValue( u"Condition"_ustr, Any(sCond) );
}
}
// password (only for regular sections) if ( bSequenceOK &&
(nElement & TOKEN_MASK) == XML_SECTION )
{
xPropSet->setPropertyValue(u"ProtectionKey"_ustr, Any(aSequence));
}
// insert marker, <paragraph>, marker; then insert // section over the first marker character, and delete the // last paragraph (and marker) when closing a section.
Reference<XTextRange> xStart =
rHelper->GetCursor()->getStart(); #ifndef DBG_UTIL
OUString sMarkerString(" "); #else
OUString sMarkerString(u"X"_ustr); #endif
rHelper->InsertString(sMarkerString);
rHelper->InsertControlCharacter(
ControlCharacter::APPEND_PARAGRAPH );
rHelper->InsertString(sMarkerString);
// select first marker
rHelper->GetCursor()->gotoRange(xStart, false);
rHelper->GetCursor()->goRight(1, true);
// convert section to XTextContent
Reference<XTextContent> xTextContent(xSectionPropertySet,
UNO_QUERY);
// and insert (over marker)
rHelper->GetText()->insertTextContent(
rHelper->GetCursorAsRange(), xTextContent, true );
// and delete first marker (in section)
rHelper->GetText()->insertString(
rHelper->GetCursorAsRange(), u""_ustr, true);
// finally, check for redlines that should start at // the section start node
rHelper->RedlineAdjustStartNodeCursor(); // start ???
// xml:id for RDF metadata
GetImport().SetXmlId(xIfc, sXmlId);
}
void XMLSectionImportContext::endFastElement(sal_Int32 )
{ // get rid of last paragraph // (unless it's the only paragraph in the section)
rtl::Reference<XMLTextImportHelper> rHelper = GetImport().GetTextImport();
rHelper->GetCursor()->goRight(1, false); if (bHasContent)
{
rHelper->GetCursor()->goLeft(1, true);
rHelper->GetText()->insertString(rHelper->GetCursorAsRange(),
u""_ustr, true);
}
// and delete second marker
rHelper->GetCursor()->goRight(1, true);
rHelper->GetText()->insertString(rHelper->GetCursorAsRange(),
u""_ustr, true);
// check for redlines to our endnode
rHelper->RedlineAdjustStartNodeCursor();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.