/**************************************************************
 *
 * 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_META_DATA_HXX
#define XMLOFF_PROPERTY_META_DATA_HXX

#include "property_description.hxx"

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

    const PropertyDescription* getPropertyDescription( const ::rtl::OUString& i_propertyName );

    /** retries the descriptions of all properties which add to the given XML attribute

        <p>Effectively, the complete property map is search for all entries which have the given
        namespace/attribute values.</p>
    */
    void getPropertyGroup(
            const PropertyGroup i_propertyGroup,
            PropertyDescriptionList& o_propertyDescriptions
        );

    /** retrieves all known property groups which are mapped to the given attribute
    */
    void getPropertyGroupList(
        const AttributeDescription& i_attribute,
        PropertyGroups& o_propertyGroups
    );

    /** retrieves the attribute descriptor for the attribute given by namespace prefix and attribute name
    */
    AttributeDescription
        getAttributeDescription( const sal_uInt16 i_namespacePrefix, const ::rtl::OUString& i_attributeName );

//......................................................................................................................
} } // namespace xmloff::metadata
//......................................................................................................................

#endif // XMLOFF_PROPERTY_META_DATA_HXX
