/**************************************************************
 *
 * 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_PROPERTY_DESCRIPTION_HXX
#define XMLOFF_PROPERTY_DESCRIPTION_HXX

#include "forms/property_handler.hxx"
#include "property_group.hxx"

#include "xmloff/xmltoken.hxx"

#include <vector>
#include <list>

//......................................................................................................................
namespace xmloff
{
//......................................................................................................................

	//==================================================================================================================
	//= PropertyDescription
	//==================================================================================================================
    struct AttributeDescription
    {
        sal_uInt16                      namespacePrefix;    // usually XML_NAMESPACE_FORM
        ::xmloff::token::XMLTokenEnum   attributeToken;

        AttributeDescription()
            :namespacePrefix( 0 )
            ,attributeToken( ::xmloff::token::XML_TOKEN_INVALID )
        {
        }

        AttributeDescription(
                const sal_uInt16                    i_namespacePrefix,
                const ::xmloff::token::XMLTokenEnum i_attributeToken
            )
            :namespacePrefix( i_namespacePrefix )
            ,attributeToken( i_attributeToken )
        {
        }
    };

    //..................................................................................................................
    inline bool operator==( const AttributeDescription& i_lhs, const AttributeDescription& i_rhs )
    {
        return  ( i_lhs.namespacePrefix == i_rhs.namespacePrefix )
            &&  ( i_lhs.attributeToken == i_rhs.attributeToken );
    }

	//==================================================================================================================
	//= PropertyDescription
	//==================================================================================================================
	struct PropertyDescription
	{
        /// is the name of the property
        const ::rtl::OUString               propertyName;
        /** denotes the attribute which represents the property. Note that multiple properties might comprise a single
            attribute value.
        */
        const AttributeDescription          attribute;
        /// is the factory for creating a handler for reading and writing the property
        const PropertyHandlerFactory        factory;
        /// the unique ID of the property. The property meta data table must not contain two entries with the same property ID
        const PropertyId                    propertyId;
        /** the group which the property belongs to. Multiple properties belonging to the same group will, all together,
            define the attribute value to be written into the ODF file.

            Consequently, properties which have the same |propertyGroup| value must also have the same |attribute|
            and the same |factory| value, with the only exception being NO_GROUP properties.

            Note that the other direction is not given: It is perfectly legitimate to map the same attribute to different
            (disjunct) property groups.
        */
        const PropertyGroup                 propertyGroup;

        PropertyDescription()
            :propertyName()
            ,attribute()
            ,factory( NULL )
            ,propertyId( PID_INVALID )
            ,propertyGroup( NO_GROUP )
        {
        }

        PropertyDescription(
            const ::rtl::OUString&              i_propertyName,
            const sal_uInt16                    i_namespacePrefix,
            const ::xmloff::token::XMLTokenEnum i_attributeToken,
            const PropertyHandlerFactory        i_factory,
            const PropertyId                    i_propertyId,
            const PropertyGroup                 i_propertyGroup
        )
            :propertyName( i_propertyName )
            ,attribute( i_namespacePrefix, i_attributeToken )
            ,factory( i_factory )
            ,propertyId( i_propertyId )
            ,propertyGroup( i_propertyGroup )
        {
        }
	};

	//==================================================================================================================
	//= PropertyDescriptionList
	//==================================================================================================================
    typedef ::std::vector< const PropertyDescription* > PropertyDescriptionList;

	//==================================================================================================================
	//= PropertyGroups
	//==================================================================================================================
    typedef ::std::list< PropertyDescriptionList >  PropertyGroups;

//......................................................................................................................
} // namespace xmloff
//......................................................................................................................

#endif // XMLOFF_PROPERTY_DESCRIPTION_HXX
