| /************************************************************** |
| * |
| * 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 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #ifndef _XMLOFF_FORMS_PROPERTYIMPORT_HXX_ |
| #define _XMLOFF_FORMS_PROPERTYIMPORT_HXX_ |
| |
| #include <xmloff/xmlictxt.hxx> |
| #include "formattributes.hxx" |
| #include <vos/ref.hxx> |
| #include <comphelper/stl_types.hxx> |
| #include <com/sun/star/beans/PropertyValue.hpp> |
| #include "layerimport.hxx" |
| |
| namespace com { namespace sun { namespace star { namespace util { |
| struct Time; |
| struct Date; |
| } } } } |
| |
| //......................................................................... |
| namespace xmloff |
| { |
| //......................................................................... |
| |
| //===================================================================== |
| //= PropertyConversion |
| //===================================================================== |
| class PropertyConversion |
| { |
| public: |
| static ::com::sun::star::uno::Any convertString( |
| SvXMLImport& _rImporter, |
| const ::com::sun::star::uno::Type& _rExpectedType, |
| const ::rtl::OUString& _rReadCharacters, |
| const SvXMLEnumMapEntry* _pEnumMap = NULL, |
| const sal_Bool _bInvertBoolean = sal_False |
| ); |
| |
| static ::com::sun::star::uno::Type xmlTypeToUnoType( const ::rtl::OUString& _rType ); |
| }; |
| |
| class OFormLayerXMLImport_Impl; |
| //===================================================================== |
| //= OPropertyImport |
| //===================================================================== |
| /** Helper class for importing property values |
| |
| <p>This class imports properties which are stored as attributes as well as properties which |
| are stored in </em><form:properties></em> elements.</p> |
| */ |
| class OPropertyImport : public SvXMLImportContext |
| { |
| friend class OSinglePropertyContext; |
| friend class OListPropertyContext; |
| |
| protected: |
| typedef ::std::vector< ::com::sun::star::beans::PropertyValue > PropertyValueArray; |
| PropertyValueArray m_aValues; |
| PropertyValueArray m_aGenericValues; |
| // the values which the instance collects between StartElement and EndElement |
| |
| DECLARE_STL_STDKEY_SET( ::rtl::OUString, StringSet ); |
| StringSet m_aEncounteredAttributes; |
| |
| OFormLayerXMLImport_Impl& m_rContext; |
| |
| sal_Bool m_bTrackAttributes; |
| |
| // TODO: think about the restriction that the class does not know anything about the object it is importing. |
| // Perhaps this object should be known to the class, so setting the properties ('normal' ones as well as |
| // style properties) can be done in our own EndElement instead of letting derived classes do this. |
| |
| public: |
| OPropertyImport(OFormLayerXMLImport_Impl& _rImport, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName); |
| |
| virtual SvXMLImportContext* CreateChildContext( |
| sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName, |
| const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& _rxAttrList); |
| |
| virtual void StartElement( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& _rxAttrList); |
| virtual void Characters(const ::rtl::OUString& _rChars); |
| |
| protected: |
| /** handle one single attribute. |
| |
| <p>This is called for every attribute of the element. This class' implementaion checks if the attribute |
| describes a property, if so, it is added to <member>m_aValues</member>.</p> |
| |
| <p>All non-property attributes should be handled in derived classes.</p> |
| |
| @param _nNamespaceKey |
| key of the namespace used in the attribute |
| @param _rLocalName |
| local (relative to the namespace) attribute name |
| @param _rValue |
| attribute value |
| */ |
| virtual bool handleAttribute(sal_uInt16 _nNamespaceKey, |
| const ::rtl::OUString& _rLocalName, |
| const ::rtl::OUString& _rValue); |
| |
| /** determine if the element imported by the object had an given attribute. |
| <p>Please be aware of the fact that the name given must be a local name, i.e. not contain a namespace. |
| All form relevant attributes are in the same namespace, so this would be an redundant information.</p> |
| */ |
| sal_Bool encounteredAttribute(const ::rtl::OUString& _rAttributeName) const; |
| |
| /** determine if the element imported by the object had an given attribute. |
| <p>Please be aware of the fact that the name given must be a local name, i.e. not contain a namespace. |
| All form relevant attributes are in the same namespace, so this would be an redundant information.</p> |
| */ |
| sal_Bool encounteredAttribute(const sal_Char* _pAttributeName) const { return encounteredAttribute(::rtl::OUString::createFromAscii(_pAttributeName)); } |
| |
| /** enables the tracking of the encountered attributes |
| <p>The tracking will raise the import costs a little bit, but it's cheaper than |
| derived classes tracking this themself.</p> |
| */ |
| void enableTrackAttributes() { m_bTrackAttributes = sal_True; } |
| |
| inline void implPushBackPropertyValue(const ::com::sun::star::beans::PropertyValue& _rProp) |
| { |
| m_aValues.push_back(_rProp); |
| } |
| |
| inline void implPushBackPropertyValue( const ::rtl::OUString& _rName, const ::com::sun::star::uno::Any& _rValue ) |
| { |
| m_aValues.push_back( ::com::sun::star::beans::PropertyValue( |
| _rName, -1, _rValue, ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ); |
| } |
| |
| inline void implPushBackGenericPropertyValue(const ::com::sun::star::beans::PropertyValue& _rProp) |
| { |
| m_aGenericValues.push_back(_rProp); |
| } |
| }; |
| SV_DECL_IMPL_REF( OPropertyImport ) |
| |
| //===================================================================== |
| //= OPropertyElementsContext |
| //===================================================================== |
| /** helper class for importing the <form:properties> element |
| */ |
| class OPropertyElementsContext : public SvXMLImportContext |
| { |
| protected: |
| OPropertyImportRef m_xPropertyImporter; // to add the properties |
| |
| public: |
| OPropertyElementsContext(SvXMLImport& _rImport, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, |
| const OPropertyImportRef& _rPropertyImporter); |
| |
| virtual SvXMLImportContext* CreateChildContext( |
| sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName, |
| const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& _rxAttrList); |
| |
| #if OSL_DEBUG_LEVEL > 0 |
| virtual void StartElement( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& _rxAttrList); |
| virtual void Characters(const ::rtl::OUString& _rChars); |
| #endif |
| }; |
| |
| //===================================================================== |
| //= OSinglePropertyContext |
| //===================================================================== |
| /** helper class for importing a single <form:property> element |
| */ |
| class OSinglePropertyContext : public SvXMLImportContext |
| { |
| OPropertyImportRef m_xPropertyImporter; // to add the properties |
| |
| public: |
| OSinglePropertyContext(SvXMLImport& _rImport, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, |
| const OPropertyImportRef& _rPropertyImporter); |
| |
| virtual SvXMLImportContext* CreateChildContext( |
| sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName, |
| const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& _rxAttrList); |
| |
| virtual void StartElement( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& _rxAttrList); |
| }; |
| |
| //===================================================================== |
| //= OListPropertyContext |
| //===================================================================== |
| class OListPropertyContext : public SvXMLImportContext |
| { |
| OPropertyImportRef m_xPropertyImporter; |
| ::rtl::OUString m_sPropertyName; |
| ::rtl::OUString m_sPropertyType; |
| ::std::vector< ::rtl::OUString > m_aListValues; |
| |
| public: |
| OListPropertyContext( SvXMLImport& _rImport, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, |
| const OPropertyImportRef& _rPropertyImporter ); |
| |
| virtual void StartElement( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& _rxAttrList ); |
| |
| virtual void EndElement(); |
| |
| virtual SvXMLImportContext* CreateChildContext( |
| sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName, |
| const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& _rxAttrList); |
| }; |
| |
| //===================================================================== |
| //= OListValueContext |
| //===================================================================== |
| class OListValueContext : public SvXMLImportContext |
| { |
| ::rtl::OUString& m_rListValueHolder; |
| |
| public: |
| OListValueContext( SvXMLImport& _rImport, sal_uInt16 _nPrefix, const ::rtl::OUString& _rName, |
| ::rtl::OUString& _rListValueHolder ); |
| |
| virtual void StartElement( |
| const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& _rxAttrList ); |
| }; |
| |
| //......................................................................... |
| } // namespace xmloff |
| //......................................................................... |
| |
| #endif // _XMLOFF_FORMS_PROPERTYIMPORT_HXX_ |
| |
| |