office-gobmx/xmloff/source/text/xmlcontentcontrolcontext.cxx
Noel Grandin 12008e1054 loplugin:ostr in xmloff
Change-Id: I24f5626e57e03217e4bcf77289c785e255b9f904
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167667
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Tested-by: Jenkins
2024-05-15 20:37:38 +02:00

369 lines
11 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 .
*/
#include "xmlcontentcontrolcontext.hxx"
#include <com/sun/star/beans/XPropertySet.hpp>
#include <sax/tools/converter.hxx>
#include <xmloff/xmlimp.hxx>
#include <xmloff/xmlnamespace.hxx>
#include <xmloff/xmltoken.hxx>
#include <comphelper/propertyvalue.hxx>
#include <comphelper/sequence.hxx>
#include "XMLTextMarkImportContext.hxx"
#include "txtparai.hxx"
using namespace com::sun::star;
using namespace xmloff::token;
XMLContentControlContext::XMLContentControlContext(SvXMLImport& rImport, sal_Int32 /*nElement*/,
XMLHints_Impl& rHints, bool& rIgnoreLeadingSpace)
: SvXMLImportContext(rImport)
, m_rHints(rHints)
, m_rIgnoreLeadingSpace(rIgnoreLeadingSpace)
, m_xStart(GetImport().GetTextImport()->GetCursorAsRange()->getStart())
{
}
void XMLContentControlContext::startFastElement(
sal_Int32 /*nElement*/, const uno::Reference<xml::sax::XFastAttributeList>& xAttrList)
{
for (auto& rIter : sax_fastparser::castToFastAttributeList(xAttrList))
{
bool bTmp = false;
sal_Int32 nTmp = 0;
switch (rIter.getToken())
{
case XML_ELEMENT(LO_EXT, XML_SHOWING_PLACE_HOLDER):
{
if (sax::Converter::convertBool(bTmp, rIter.toView()))
{
m_bShowingPlaceHolder = bTmp;
}
break;
}
case XML_ELEMENT(LO_EXT, XML_CHECKBOX):
{
if (sax::Converter::convertBool(bTmp, rIter.toView()))
{
m_bCheckbox = bTmp;
}
break;
}
case XML_ELEMENT(LO_EXT, XML_CHECKED):
{
if (sax::Converter::convertBool(bTmp, rIter.toView()))
{
m_bChecked = bTmp;
}
break;
}
case XML_ELEMENT(LO_EXT, XML_CHECKED_STATE):
{
m_aCheckedState = rIter.toString();
break;
}
case XML_ELEMENT(LO_EXT, XML_UNCHECKED_STATE):
{
m_aUncheckedState = rIter.toString();
break;
}
case XML_ELEMENT(LO_EXT, XML_PICTURE):
{
if (sax::Converter::convertBool(bTmp, rIter.toView()))
{
m_bPicture = bTmp;
}
break;
}
case XML_ELEMENT(LO_EXT, XML_DATE):
{
if (sax::Converter::convertBool(bTmp, rIter.toView()))
{
m_bDate = bTmp;
}
break;
}
case XML_ELEMENT(LO_EXT, XML_DATE_FORMAT):
{
m_aDateFormat = rIter.toString();
break;
}
case XML_ELEMENT(LO_EXT, XML_DATE_RFC_LANGUAGE_TAG):
{
m_aDateLanguage = rIter.toString();
break;
}
case XML_ELEMENT(LO_EXT, XML_CURRENT_DATE):
{
m_aCurrentDate = rIter.toString();
break;
}
case XML_ELEMENT(LO_EXT, XML_PLAIN_TEXT):
{
if (sax::Converter::convertBool(bTmp, rIter.toView()))
{
m_bPlainText = bTmp;
}
break;
}
case XML_ELEMENT(LO_EXT, XML_COMBOBOX):
{
if (sax::Converter::convertBool(bTmp, rIter.toView()))
{
m_bComboBox = bTmp;
}
break;
}
case XML_ELEMENT(LO_EXT, XML_DROPDOWN):
{
if (sax::Converter::convertBool(bTmp, rIter.toView()))
{
m_bDropDown = bTmp;
}
break;
}
case XML_ELEMENT(LO_EXT, XML_ALIAS):
{
m_aAlias = rIter.toString();
break;
}
case XML_ELEMENT(LO_EXT, XML_TAG):
{
m_aTag = rIter.toString();
break;
}
case XML_ELEMENT(LO_EXT, XML_ID):
{
if (sax::Converter::convertNumber(nTmp, rIter.toView()))
{
m_nId = nTmp;
}
break;
}
case XML_ELEMENT(LO_EXT, XML_TAB_INDEX):
{
if (sax::Converter::convertNumber(nTmp, rIter.toView()))
{
m_nTabIndex = nTmp;
}
break;
}
case XML_ELEMENT(LO_EXT, XML_LOCK):
{
m_aLock = rIter.toString();
break;
}
default:
XMLOFF_WARN_UNKNOWN("xmloff", rIter);
}
}
}
void XMLContentControlContext::endFastElement(sal_Int32)
{
if (!m_xStart.is())
{
SAL_WARN("xmloff.text", "XMLContentControlContext::endFastElement: no m_xStart");
return;
}
uno::Reference<text::XTextRange> xEndRange
= GetImport().GetTextImport()->GetCursorAsRange()->getStart();
// Create range for insertion.
uno::Reference<text::XTextCursor> xInsertionCursor
= GetImport().GetTextImport()->GetText()->createTextCursorByRange(xEndRange);
xInsertionCursor->gotoRange(m_xStart, /*bExpand=*/true);
uno::Reference<text::XTextContent> xContentControl
= XMLTextMarkImportContext::CreateAndInsertMark(
GetImport(), u"com.sun.star.text.ContentControl"_ustr, OUString(), xInsertionCursor);
if (!xContentControl.is())
{
SAL_WARN("xmloff.text", "cannot insert content control");
return;
}
uno::Reference<beans::XPropertySet> xPropertySet(xContentControl, uno::UNO_QUERY);
if (!xPropertySet.is())
{
return;
}
if (m_bShowingPlaceHolder)
{
xPropertySet->setPropertyValue(u"ShowingPlaceHolder"_ustr, uno::Any(m_bShowingPlaceHolder));
}
if (m_bCheckbox)
{
xPropertySet->setPropertyValue(u"Checkbox"_ustr, uno::Any(m_bCheckbox));
}
if (m_bChecked)
{
xPropertySet->setPropertyValue(u"Checked"_ustr, uno::Any(m_bChecked));
}
if (!m_aCheckedState.isEmpty())
{
xPropertySet->setPropertyValue(u"CheckedState"_ustr, uno::Any(m_aCheckedState));
}
if (!m_aUncheckedState.isEmpty())
{
xPropertySet->setPropertyValue(u"UncheckedState"_ustr, uno::Any(m_aUncheckedState));
}
if (!m_aListItems.empty())
{
xPropertySet->setPropertyValue(u"ListItems"_ustr,
uno::Any(comphelper::containerToSequence(m_aListItems)));
}
if (m_bPicture)
{
xPropertySet->setPropertyValue(u"Picture"_ustr, uno::Any(m_bPicture));
}
if (m_bDate)
{
xPropertySet->setPropertyValue(u"Date"_ustr, uno::Any(m_bDate));
}
if (!m_aDateFormat.isEmpty())
{
xPropertySet->setPropertyValue(u"DateFormat"_ustr, uno::Any(m_aDateFormat));
}
if (!m_aDateLanguage.isEmpty())
{
xPropertySet->setPropertyValue(u"DateLanguage"_ustr, uno::Any(m_aDateLanguage));
}
if (!m_aCurrentDate.isEmpty())
{
xPropertySet->setPropertyValue(u"CurrentDate"_ustr, uno::Any(m_aCurrentDate));
}
if (m_bPlainText)
{
xPropertySet->setPropertyValue(u"PlainText"_ustr, uno::Any(m_bPlainText));
}
if (m_bComboBox)
{
xPropertySet->setPropertyValue(u"ComboBox"_ustr, uno::Any(m_bComboBox));
}
if (m_bDropDown)
{
xPropertySet->setPropertyValue(u"DropDown"_ustr, uno::Any(m_bDropDown));
}
if (!m_aAlias.isEmpty())
{
xPropertySet->setPropertyValue(u"Alias"_ustr, uno::Any(m_aAlias));
}
if (!m_aTag.isEmpty())
{
xPropertySet->setPropertyValue(u"Tag"_ustr, uno::Any(m_aTag));
}
if (m_nId)
{
xPropertySet->setPropertyValue(u"Id"_ustr, uno::Any(m_nId));
}
if (m_nTabIndex)
{
xPropertySet->setPropertyValue(u"TabIndex"_ustr, uno::Any(m_nTabIndex));
}
if (!m_aLock.isEmpty())
{
xPropertySet->setPropertyValue(u"Lock"_ustr, uno::Any(m_aLock));
}
}
css::uno::Reference<css::xml::sax::XFastContextHandler>
XMLContentControlContext::createFastChildContext(
sal_Int32 nElement, const uno::Reference<xml::sax::XFastAttributeList>& xAttrList)
{
switch (nElement)
{
case XML_ELEMENT(LO_EXT, XML_LIST_ITEM):
return new XMLListItemContext(GetImport(), *this);
break;
default:
break;
}
return XMLImpSpanContext_Impl::CreateSpanContext(GetImport(), nElement, xAttrList, m_rHints,
m_rIgnoreLeadingSpace);
}
void XMLContentControlContext::characters(const OUString& rChars)
{
GetImport().GetTextImport()->InsertString(rChars, m_rIgnoreLeadingSpace);
}
void XMLContentControlContext::AppendListItem(const css::beans::PropertyValues& rListItem)
{
m_aListItems.push_back(rListItem);
}
XMLListItemContext::XMLListItemContext(SvXMLImport& rImport,
XMLContentControlContext& rContentControl)
: SvXMLImportContext(rImport)
, m_rContentControl(rContentControl)
{
}
void XMLListItemContext::startFastElement(
sal_Int32 /*nElement*/, const uno::Reference<xml::sax::XFastAttributeList>& xAttrList)
{
OUString aDisplayText;
OUString aValue;
for (auto& rIter : sax_fastparser::castToFastAttributeList(xAttrList))
{
switch (rIter.getToken())
{
case XML_ELEMENT(LO_EXT, XML_DISPLAY_TEXT):
{
aDisplayText = rIter.toString();
break;
}
case XML_ELEMENT(LO_EXT, XML_VALUE):
{
aValue = rIter.toString();
break;
}
default:
XMLOFF_WARN_UNKNOWN("xmloff", rIter);
}
}
uno::Sequence<beans::PropertyValue> aListItem = {
comphelper::makePropertyValue(u"DisplayText"_ustr, uno::Any(aDisplayText)),
comphelper::makePropertyValue(u"Value"_ustr, uno::Any(aValue)),
};
m_rContentControl.AppendListItem(aListItem);
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */