summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2020-04-30 09:53:49 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2020-04-30 10:32:42 +0200
commit7e4463db510fe7faa15e4f5ad3394aa0abf52b66 (patch)
treee5c9e7eb4cc12d36f60238321245c88bf2044642
parent7685dff381f538bf011a56da4a0493228b84614a (diff)
expand out OContainerImport template
to make the logic easier to follow, and to make it possible to convert this to fast-parser APIs Change-Id: I48921c3cd84b45f56ff943060f2d9c8e4882d051 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93193 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r--xmloff/source/forms/elementimport.cxx80
-rw-r--r--xmloff/source/forms/elementimport.hxx121
2 files changed, 89 insertions, 112 deletions
diff --git a/xmloff/source/forms/elementimport.cxx b/xmloff/source/forms/elementimport.cxx
index 25824d8e08c6..8693cc355bf1 100644
--- a/xmloff/source/forms/elementimport.cxx
+++ b/xmloff/source/forms/elementimport.cxx
@@ -1836,20 +1836,62 @@ namespace xmloff
OGridImport::OGridImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
const Reference< XNameContainer >& _rxParentContainer,
OControlElement::ElementType _eType)
- :OGridImport_Base(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, "column")
+ :OControlImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer)
{
setElementType(_eType);
}
- SvXMLImportContext* OGridImport::implCreateControlWrapper(sal_uInt16 _nPrefix, const OUString& _rLocalName)
+ SvXMLImportContextRef OGridImport::CreateChildContext(
+ sal_uInt16 _nPrefix, const OUString& _rLocalName,
+ const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList)
+ {
+ // maybe it's a sub control
+ if (_rLocalName == "column")
+ {
+ if (m_xMeAsContainer.is())
+ return new OColumnWrapperImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer);
+ else
+ {
+ OSL_FAIL("OGridImport::CreateChildContext: don't have an element!");
+ return nullptr;
+ }
+ }
+
+ return OControlImport::CreateChildContext(_nPrefix, _rLocalName, _rxAttrList);
+ }
+
+ void OGridImport::EndElement()
+ {
+ OControlImport::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);
+ }
+
+ css::uno::Reference< css::beans::XPropertySet > OGridImport::createElement()
{
- return new OColumnWrapperImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer);
+ // let the base class create the object
+ css::uno::Reference< css::beans::XPropertySet > xReturn = OControlImport::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;
}
//= OFormImport
OFormImport::OFormImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
const Reference< XNameContainer >& _rxParentContainer)
- :OFormImport_Base(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, "control")
+ :OElementImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer)
{
enableTrackAttributes();
}
@@ -1875,7 +1917,7 @@ namespace xmloff
void OFormImport::StartElement(const Reference< XAttributeList >& _rxAttrList)
{
m_rFormImport.enterEventContext();
- OFormImport_Base::StartElement(_rxAttrList);
+ OElementImport::StartElement(_rxAttrList);
// handle the target-frame attribute
simulateDefaultedAttribute(OAttributeMetaData::getCommonControlAttributeName(CCAFlags::TargetFrame), PROPERTY_TARGETFRAME, "_blank");
@@ -1883,14 +1925,32 @@ namespace xmloff
void OFormImport::EndElement()
{
- OFormImport_Base::EndElement();
+ OElementImport::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);
+
m_rFormImport.leaveEventContext();
}
- SvXMLImportContext* OFormImport::implCreateControlWrapper(sal_uInt16 _nPrefix, const OUString& _rLocalName)
+ css::uno::Reference< css::beans::XPropertySet > OFormImport::createElement()
{
- OSL_ENSURE( false, "illegal call to OFormImport::implCreateControlWrapper" );
- return new SvXMLImportContext(GetImport(), _nPrefix, _rLocalName );
+ // let the base class create the object
+ css::uno::Reference< css::beans::XPropertySet > xReturn = OElementImport::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;
}
bool OFormImport::handleAttribute(sal_uInt16 _nNamespaceKey, const OUString& _rLocalName, const OUString& _rValue)
@@ -1911,7 +1971,7 @@ namespace xmloff
return true;
}
- return OFormImport_Base::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
+ return OElementImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
}
void OFormImport::implTranslateStringListProperty(const OUString& _rPropertyName, const OUString& _rValue)
diff --git a/xmloff/source/forms/elementimport.hxx b/xmloff/source/forms/elementimport.hxx
index b0e8f3ce1407..a33993213443 100644
--- a/xmloff/source/forms/elementimport.hxx
+++ b/xmloff/source/forms/elementimport.hxx
@@ -549,42 +549,6 @@ namespace xmloff
const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
};
- //= OContainerImport
- // BASE must be a derivee of OElementImport
- template <class BASE>
- 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 char* _pWrapperElementName)
- :BASE(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer)
- ,m_sWrapperElementName(OUString::createFromAscii(_pWrapperElementName))
- {
- }
-
- // SvXMLImportContext overridables
- virtual SvXMLImportContextRef CreateChildContext(
- sal_uInt16 _nPrefix, const OUString& _rLocalName,
- const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
- virtual void EndElement() override;
-
- protected:
- // OElementImport overridables
- virtual css::uno::Reference< css::beans::XPropertySet >
- createElement() 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 &lt;form:column&gt; element wrapping
@@ -635,11 +599,9 @@ namespace xmloff
OControlElement::ElementType _eType);
};
- //= OGridImport
- typedef OContainerImport< OControlImport > OGridImport_Base;
/** helper class importing a single &lt;form:grid&gt; element
*/
- class OGridImport : public OGridImport_Base
+ class OGridImport : public OControlImport, public ODefaultEventAttacherManager
{
public:
OGridImport(
@@ -647,17 +609,22 @@ namespace xmloff
const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
OControlElement::ElementType _eType);
- protected:
- // OContainerImport overridables
- virtual SvXMLImportContext* implCreateControlWrapper(
- sal_uInt16 _nPrefix, const OUString& _rLocalName) override;
+ // SvXMLImportContext overridables
+ virtual SvXMLImportContextRef CreateChildContext(
+ sal_uInt16 _nPrefix, const OUString& _rLocalName,
+ const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
+ virtual void EndElement() override;
+
+ private:
+ // OElementImport overridables
+ virtual css::uno::Reference< css::beans::XPropertySet > createElement() override;
+
+ css::uno::Reference< css::container::XNameContainer > m_xMeAsContainer;
};
- //= OFormImport
- typedef OContainerImport< OElementImport > OFormImport_Base;
/** helper class importing a single &lt;form:form&gt; element
*/
- class OFormImport : public OFormImport_Base
+ class OFormImport : public OElementImport, public ODefaultEventAttacherManager
{
public:
OFormImport(
@@ -674,21 +641,23 @@ namespace xmloff
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;
+ // OElementImport overridables
+ virtual css::uno::Reference< css::beans::XPropertySet >
+ createElement() 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);
+
+ css::uno::Reference< css::container::XNameContainer > m_xMeAsContainer;
};
//= OXMLDataSourceImport
@@ -702,58 +671,6 @@ namespace xmloff
,const css::uno::Reference< css::beans::XPropertySet >& _xElement);
};
- //= OContainerImport
- template <class BASE>
- inline SvXMLImportContextRef 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 <class BASE>
- 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 <class BASE>
- 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 <class BASE>
OColumnImport< BASE >::OColumnImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,