/**************************************************************
 * 
 * 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 OpenOffice 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 should 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 should 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
