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

#include <com/sun/star/uno/XInterface.idl>
#include <com/sun/star/ui/XUIElementFactory.idl>
#include <com/sun/star/container/ElementExistException.idl>
#include <com/sun/star/container/NoSuchElementException.idl>
#include <com/sun/star/beans/PropertyValue.idl>


module com { module sun { module star { module ui {


/** is used to query, register and deregister user interface element factories.

    <p>
    A user interface element factory is registered for a set of three properties.
    <ul>
        <li><b>Type</b>a string that identifies a type of a user interface element.</li>
        <li><b>Name</b>a string that identifies a single user interface element within a type class.</li>
        <li><b>Module</b>a string that identifies a single module of OpenOffice.</li>
    </ul>
    A combination of these three property values can uniquely identify every user interface
    element within OpenOffice.

    Currently the following user interface element types are defined:
    <ul>
        <li><b>menubar</b></li>
        <li><b>popupmenu</b></li>
        <li><b>toolbar</b></li>
        <li><b>statusbar</b></li>
        <li><b>floater</b></li>
    </ul>
    </p>

    @since OOo 2.0
 */

interface XUIElementFactoryRegistration : com::sun::star::uno::XInterface
{
    /** function to retrieve a list of all registered user interface element factories

        @returns
            a sequence of sequence of property values which describe every registered
            user interface element factory.<br/>

            The following properties are defined:
            <ul>
                <li><b>Type</b>a string property that identifies the type of the user interface
                element which this factory can create.</li>
                <li><b>Name</b>an optional string property which identifies a single user interface
                element within a type class which this factory can create. If this property is not
                returned, the factory is a generic factory for all user interface elements of the
                same type.</li>
                <li><b>Module</b>an optional string property that specifies to which module this factory is
                bound to. If this property is not returned, the factory is a generic factory.</li>
            </ul>
    */
    sequence< sequence< com::sun::star::beans::PropertyValue > > getRegisteredFactories();

    /** function to retrieve a previously registered user interface element factory.

        @returns
            a reference to a registered user interface element factory if a factory has been
            found. An empty reference when no factory has been found.
            <b>The defined search order of factories must be from special to generic ones.</b>

        @param ResourceURL
            a resource URL which identifies a user interface element. A resource URL uses the
            following syntax: "private:resource/$type/$name". It is only allowed to use ASCII
            characters for type and name.

        @param ModuleIdentifier
            an optional module identifier. This value can remain empty, if a generic factory is requested.
            The module identifier can be retrieved from the com::sun::star::frame::ModuleManager service.
    */
    ::com::sun::star::ui::XUIElementFactory getFactory( [in] string ResourceURL, [in] string ModuleIdentifier );

    /** function to register a user interface element factory.

        @param aType
            a string that identifies a type of a user interface element. Currently the following types
            are supported:
            <ul>
                <li><b>menubar</b></li>
                <li><b>toolbar</b></li>
                <li><b>statusbar</b></li>
            </ul>

        @param aName
            an optional name of a single user interface element. This name must be unique within a user
            interface element type class. This value can remain empty if no special factory for a single
            user interface element is needed.

        @param aModuleIdentifier
            an optional module identifier that can be used to register a factory only for a single module. This value
            can remain empty if no special factory for a single module is needed. The module identifier can be retrieved
            from the com::sun::star::frame::ModuleManager service.

        @param aFactoryImplementationName
            a UNO implementation name that can be used by an implementation to create a factory instance.
    */
    void registerFactory( [in] string aType, [in] string aName, [in] string aModuleIdentifier, [in] string aFactoryImplementationName ) raises (com::sun::star::container::ElementExistException);

    /** function to remove a previously defined user interface element factory.

        @param aType
            a string that identifies a type of a user interface element. Currently the following types
            are supported:
            <ul>
                <li><b>menubar</b></li>
                <li><b>toolbar</b></li>
                <li><b>statusbar</b></li>
            </ul>

        @param aName
            an optional name of a single user interface element. This name must be unique within a user
            interface element type class. This value can remain empty if no special factory for a single
            user interface element should be deregistered.

        @param ModuleIdentifier
            an optional module name that can be used to deregister a factory only for a single module. This value
            can remain empty if not a module based factory should be deregistered. The module identifier can be retrieved
            from the com::sun::star::frame::ModuleManager service.

        <p>
        <b>Using this function can be very dangerous as other implementation with OpenOffice may not be able to  create their
        user interface element anymore.
        </b>
        </p>
    */
    void deregisterFactory( [in] string aType, [in] string aName, [in] string ModuleIdentifier ) raises (com::sun::star::container::NoSuchElementException);
};

}; }; }; };


#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
