/* -*- 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_FORMS_ELEMENTIMPORT_HXX
#define INCLUDED_XMLOFF_SOURCE_FORMS_ELEMENTIMPORT_HXX
#include
#include
*/
class OTextLikeImport : public OControlImport
{
private:
css::uno::Reference< css::text::XTextCursor > m_xCursor;
css::uno::Reference< css::text::XTextCursor > m_xOldCursor;
bool m_bEncounteredTextPara;
public:
OTextLikeImport(
OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
OControlElement::ElementType _eType
);
// SvXMLImportContext overridables
virtual void StartElement(
const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
virtual SvXMLImportContext* CreateChildContext(
sal_uInt16 _nPrefix, const OUString& _rLocalName,
const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
virtual void EndElement() override;
private:
void adjustDefaultControlProperty();
void removeRedundantCurrentValue();
};
//= OListAndComboImport
/** A specialized version of the OControlImport class, which handles
attributes / sub elements which are special to list and combo boxes
*/
class OListAndComboImport : public OControlImport
{
friend class OListOptionImport;
friend class OComboItemImport;
protected:
css::uno::Sequence< OUString >
m_aListSource;
css::uno::Sequence< OUString >
m_aValueList;
css::uno::Sequence< sal_Int16 >
m_aSelectedSeq;
css::uno::Sequence< sal_Int16 >
m_aDefaultSelectedSeq;
OUString m_sCellListSource; /// the cell range which acts as list source for the control
sal_Int32 m_nEmptyListItems; /// number of empty list items encountered during reading
sal_Int32 m_nEmptyValueItems; /// number of empty value items encountered during reading
bool m_bEncounteredLSAttrib;
bool m_bLinkWithIndexes; /** if and only if we should use a cell value binding
which exchanges the selection index (instead of the selection text
*/
public:
OListAndComboImport(
OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
OControlElement::ElementType _eType
);
// SvXMLImportContext overridables
virtual void StartElement(
const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
virtual SvXMLImportContext* CreateChildContext(
sal_uInt16 _nPrefix, const OUString& _rLocalName,
const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
virtual void EndElement() override;
// OPropertyImport overridables
virtual bool handleAttribute(sal_uInt16 _nNamespaceKey,
const OUString& _rLocalName,
const OUString& _rValue) override;
// OControlImport ovrridables
virtual void doRegisterCellValueBinding( const OUString& _rBoundCellAddress ) override;
protected:
void implPushBackLabel(const OUString& _rLabel);
void implPushBackValue(const OUString& _rValue);
void implEmptyLabelFound();
void implEmptyValueFound();
void implSelectCurrentItem();
void implDefaultSelectCurrentItem();
};
typedef tools::SvRef OListAndComboImportRef;
//= OListOptionImport
/** helper class for importing a single <form:option> element.
*/
class OListOptionImport
:public SvXMLImportContext
{
OListAndComboImportRef m_xListBoxImport;
public:
OListOptionImport(SvXMLImport& _rImport, sal_uInt16 _nPrefix, const OUString& _rName,
const OListAndComboImportRef& _rListBox);
virtual void StartElement(
const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
};
//= OComboItemImport
/** helper class for importing a single <form:item> element.
*/
class OComboItemImport
:public SvXMLImportContext
{
OListAndComboImportRef m_xListBoxImport;
public:
OComboItemImport(SvXMLImport& _rImport, sal_uInt16 _nPrefix, const OUString& _rName,
const OListAndComboImportRef& _rListBox);
protected:
// SvXMLImportContext overridables
virtual void StartElement(
const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
};
//= OContainerImport
// BASE must be a derivee of OElementImport
template
class OContainerImport
:public BASE
,public ODefaultEventAttacherManager
{
protected:
css::uno::Reference< css::container::XNameContainer >
m_xMeAsContainer;
OUString m_sWrapperElementName;
protected:
OContainerImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
const sal_Char* _pWrapperElementName)
:BASE(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer)
,m_sWrapperElementName(OUString::createFromAscii(_pWrapperElementName))
{
}
// SvXMLImportContext overridables
virtual SvXMLImportContext* CreateChildContext(
sal_uInt16 _nPrefix, const OUString& _rLocalName,
const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) SAL_OVERRIDE;
virtual void EndElement() SAL_OVERRIDE;
protected:
// OElementImport overridables
virtual css::uno::Reference< css::beans::XPropertySet >
createElement() SAL_OVERRIDE;
// create the child context for the given control type
virtual SvXMLImportContext* implCreateControlWrapper(
sal_uInt16 _nPrefix, const OUString& _rLocalName) = 0;
};
//= OColumnImport
/** helper class importing a single grid column (without the <form:column> element wrapping
the column).
BASE (the template argument) must be a derivee of OControlImport
*/
template
class OColumnImport : public BASE
{
protected:
css::uno::Reference< css::form::XGridColumnFactory >
m_xColumnFactory;
public:
OColumnImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
OControlElement::ElementType _eType);
protected:
// OElementImport overridables
virtual css::uno::Reference< css::beans::XPropertySet >
createElement() SAL_OVERRIDE;
};
//= OColumnWrapperImport
class OColumnWrapperImport : public SvXMLImportContext
{
protected:
css::uno::Reference< css::xml::sax::XAttributeList >
m_xOwnAttributes;
css::uno::Reference< css::container::XNameContainer >
m_xParentContainer;
OFormLayerXMLImport_Impl& m_rFormImport;
IEventAttacherManager& m_rEventManager;
public:
OColumnWrapperImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer);
// SvXMLImportContext overridables
virtual SvXMLImportContext* CreateChildContext(
sal_uInt16 _nPrefix, const OUString& _rLocalName,
const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
virtual void StartElement(
const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
protected:
OControlImport* implCreateChildContext(
sal_uInt16 _nPrefix, const OUString& _rLocalName,
OControlElement::ElementType _eType);
};
//= OGridImport
typedef OContainerImport< OControlImport > OGridImport_Base;
/** helper class importing a single <form:grid> element
*/
class OGridImport : public OGridImport_Base
{
public:
OGridImport(
OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
OControlElement::ElementType _eType);
protected:
// OContainerImport overridables
virtual SvXMLImportContext* implCreateControlWrapper(
sal_uInt16 _nPrefix, const OUString& _rLocalName) override;
};
//= OFormImport
typedef OContainerImport< OElementImport > OFormImport_Base;
/** helper class importing a single <form:form> element
*/
class OFormImport : public OFormImport_Base
{
public:
OFormImport(
OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer
);
protected:
// SvXMLImportContext overridables
virtual SvXMLImportContext* CreateChildContext(
sal_uInt16 _nPrefix, const OUString& _rLocalName,
const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
virtual void StartElement(
const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
virtual void EndElement() override;
// OContainerImport overridables
virtual SvXMLImportContext* implCreateControlWrapper(
sal_uInt16 _nPrefix, const OUString& _rLocalName) override;
// OPropertyImport overridables
virtual bool handleAttribute(sal_uInt16 _nNamespaceKey,
const OUString& _rLocalName,
const OUString& _rValue) override;
OControlImport* implCreateChildContext(
sal_uInt16 _nPrefix, const OUString& _rLocalName,
OControlElement::ElementType _eType );
virtual OUString determineDefaultServiceName() const override;
void implTranslateStringListProperty(const OUString& _rPropertyName, const OUString& _rValue);
};
//= OXMLDataSourceImport
class OXMLDataSourceImport : public SvXMLImportContext
{
public:
OXMLDataSourceImport( SvXMLImport& _rImport
,sal_uInt16 nPrfx
,const OUString& rLName
,const css::uno::Reference< css::xml::sax::XAttributeList > & xAttrList
,const css::uno::Reference< css::beans::XPropertySet >& _xElement);
};
//= OContainerImport
template
inline SvXMLImportContext* OContainerImport< BASE >::CreateChildContext(
sal_uInt16 _nPrefix, const OUString& _rLocalName,
const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList)
{
// maybe it's a sub control
if (_rLocalName == m_sWrapperElementName)
{
if (m_xMeAsContainer.is())
return implCreateControlWrapper(_nPrefix, _rLocalName);
else
{
OSL_FAIL("OContainerImport::CreateChildContext: don't have an element!");
return nullptr;
}
}
return BASE::CreateChildContext(_nPrefix, _rLocalName, _rxAttrList);
}
template
inline css::uno::Reference< css::beans::XPropertySet >
OContainerImport< BASE >::createElement()
{
// let the base class create the object
css::uno::Reference< css::beans::XPropertySet > xReturn = BASE::createElement();
if (!xReturn.is())
return xReturn;
// ensure that the object is a XNameContainer (we strongly need this for inserting child elements)
m_xMeAsContainer.set(xReturn, css::uno::UNO_QUERY);
if (!m_xMeAsContainer.is())
{
OSL_FAIL("OContainerImport::createElement: invalid element (no XNameContainer) created!");
xReturn.clear();
}
return xReturn;
}
template
inline void OContainerImport< BASE >::EndElement()
{
BASE::EndElement();
// now that we have all children, attach the events
css::uno::Reference< css::container::XIndexAccess > xIndexContainer(m_xMeAsContainer, css::uno::UNO_QUERY);
if (xIndexContainer.is())
ODefaultEventAttacherManager::setEvents(xIndexContainer);
}
//= OColumnImport
template
OColumnImport< BASE >::OColumnImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
OControlElement::ElementType _eType)
:BASE(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType)
,m_xColumnFactory(_rxParentContainer, css::uno::UNO_QUERY)
{
OSL_ENSURE(m_xColumnFactory.is(), "OColumnImport::OColumnImport: invalid parent container (no factory)!");
}
// OElementImport overridables
template
css::uno::Reference< css::beans::XPropertySet > OColumnImport< BASE >::createElement()
{
css::uno::Reference< css::beans::XPropertySet > xReturn;
// no call to the base class' method. We have to use the grid column factory
if (m_xColumnFactory.is())
{
// create the column
xReturn = m_xColumnFactory->createColumn(this->m_sServiceName);
OSL_ENSURE(xReturn.is(), "OColumnImport::createElement: the factory returned an invalid object!");
}
return xReturn;
}
} // namespace xmloff
#endif // INCLUDED_XMLOFF_SOURCE_FORMS_ELEMENTIMPORT_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */