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

#ifndef __com_sun_star_inspection_XObjectInspectorModel_idl__
#include <com/sun/star/inspection/XObjectInspectorModel.idl>
#endif

#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif

//=============================================================================
module com {  module sun {  module star {  module inspection {

//-----------------------------------------------------------------------------
/** describes a default implementation of an ObjectInspectorModel

    <p>This service simplifies usage of an <type>ObjectInspector</type>.</p>

    <p>The <type>XObjectInspectorModel</type> implemented by this service will not provide any property
    categories, nor apply any particular order to the properties provided by its handler(s).</p>

    @see ObjectInspector
    @see XObjectInspectorModel
    @see XObjectInspectorModel::describeCategories
    @see XObjectInspectorModel::getPropertyOrderIndex

    @since OOo 2.0.3
*/
published service ObjectInspectorModel : XObjectInspectorModel
{
    /** creates a default ObjectInspectorModel, whose one and only handler factory
        creates a <type>GenericPropertyHandler</type>.
    */
    createDefault();

    /** creates a default ObjectInspectorModel, using an externally provided sequence of property handler
        factories.

        @param handlerFactories
            a sequence of handler factories, as to be provided in the XObjectInspectorModel::HandlerFactories
            method.
        @throws ::com::sun::star::lang::IllegalArgumentException
            if the given sequence is empty.

        @see XObjectInspectorModel::HandlerFactories
    */
    createWithHandlerFactories( [in] sequence< any > handlerFactories )
        raises ( ::com::sun::star::lang::IllegalArgumentException );

    /** creates a default ObjectInspectorModel, using an externally provided sequence of property handler
        factories, and describing an ObjectInspector which has a help section.

        @param handlerFactories
            a sequence of handler factories, as to be provided in the XObjectInspectorModel::HandlerFactories
            method.

        @param minHelpTextLines
            denotes the minimum number of lines of text to be reserved for the help
            section.

        @param maxHelpTextLines
            denotes the maximum number of lines of text to be reserved for the help
            section.

        @throws ::com::sun::star::lang::IllegalArgumentException
            if <arg>handlerFactories</arg> is empty.

        @throws ::com::sun::star::lang::IllegalArgumentException
            if <arg>minHelpTextLines</arg> or <arg>maxHelpTextLines</arg> are negative,
            or if <arg>minHelpTextLines</arg> is greater than <arg>maxHelpTextLines</arg>.

        @see XObjectInspectorModel::HandlerFactories
        @see XObjectInspectorModel::HasHelpSection
        @see XObjectInspectorModel::MinHelpTextLines
        @see XObjectInspectorModel::MaxHelpTextLines

        @since OOo 2.2
    */
    createWithHandlerFactoriesAndHelpSection(
        [in] sequence< any > handlerFactories,
        [in] long minHelpTextLines,
        [in] long maxHelpTextLines
    )
        raises ( ::com::sun::star::lang::IllegalArgumentException );
};

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

}; }; }; };

#endif


