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

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

//============================================================================= 

module com { module sun { module star { module frame {

//============================================================================= 

/** is used to query, register and unregister user interface controller.

    <p>
    A user interface controller can be registered for a command URL. A certain user 
    interface controller will be created when a user interface element contains a 
    registered command URL.
    
    @see PopupMenuControllerFactory
    </p>
    
    @since OOo 2.0
 */

published interface XUIControllerRegistration : com::sun::star::uno::XInterface
{
    /** function to check if an user interface controller is registered
        for a command URL and optional module.

        @returns
            true if a controller was registered for the combination of command URL
            and model name.

        @param aCommandURL
            a command URL which specifies an action.

        @param aModelName
            an optional name of an OpenOffice model service. This value can remain empty if
            no model service name was specified.
    */
    boolean hasController( [in] string aCommandURL, [in] string aModelName );

    /** function to create an association between a user interface controller implementation 
        and a command URL and optional module.
        
        @param aCommandURL
            a command URL which specifies an action which shoudl be associated with a user
            interface controller.

        @param aModelName
            an optional name of an OpenOffice model service. This value can remain empty if
            no model service name was specified.

        @param aControllerImplementationName
            a UNO implementation name that can be used to create a user interface controller
            with the OpenOffice service manager.
    */
    void registerController( [in] string aCommandURL, [in] string aModelName, [in] string aControllerImplementationName );
    
    /** function to remove a previously defined association between a user interface controller 
        implementation and a command URL and optional module.
        
        @param aCommandURL
            a command URL which specifies an action which shoudl be associated with a user
            interface controller.

        @param aModelName
            an optional name of an OpenOffice model service. This value can remain empty if
            no model service name was specified.
    */
    void deregisterController( [in] string aCommandURL, [in] string aModelName );
};

}; }; }; };

//============================================================================= 

#endif
