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

#ifndef __com_sun_star_frame_XController_idl__
#include <com/sun/star/frame/XController.idl>
#endif
#ifndef __com_sun_star_frame_XDispatchProvider_idl__
#include <com/sun/star/frame/XDispatchProvider.idl>
#endif
#ifndef __com_sun_star_util_VetoException_idl__
#include <com/sun/star/util/VetoException.idl>
#endif

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

published interface XObjectInspectorModel;
published interface XObjectInspectorUI;

//-----------------------------------------------------------------------------
/** describes the main interface of an <type>ObjectInspector</type>.

    @see ObjectInspector

    @since OOo 2.0.3
*/
published interface XObjectInspector
{
    /** allows to plug the inspector into an <type scope="com::sun::star::frame">XFrame</type>

        <p>The <member scope="com::sun::star::frame">XController::setModel</member> method
        accepts only <type>XObjectInspectorModel</type>s, and will return <FALSE/> if the
        to-be-attached model is not <NULL/>, but does not support this interface.</p>

        <p>If you do not want to support a full-blown <type scope="com::sun::star::frame">XModel</type>,
        use the <member>InspectorModel</member> attribute instead.</p>

        <p>The <member scope="com::sun::star::frame">XController::getViewData</member> and
        <member scope="com::sun::star::frame">XController::restoreViewData</member> exchange
        string values, which describes as much of the current view state as possible.</p>
    */
    interface com::sun::star::frame::XController;

    /** allows to intercept functionality

        <p>This interface is inherited from the <type scope="com::sun::star::frame">Controller</type>
        service, currently, there is no functionality to intercept at an <type>XObjectInspector</type>.</p>
    */
    interface com::sun::star::frame::XDispatchProvider;

    /** provides access to the current model of the inspector

        <p>The model is mainly responsible for providing the property handlers. Additionally,
        it can provide user interface names and help URLs for property categories.</p>

        <p>Note that there are two ways of setting or retrieving the current model: You can either
        use <member scope="com::sun::star::frame">XModel::setModel</member>, or, if you do not want
        or need to implement the full-blown <type scope="com::sun::star::frame">XModel</type> interface,
        you can use this property directly. Both approaches are semantically equivalent.</p>

        <p>If a new model is set at the inspector, the complete UI will be rebuilt to reflect
        the change, using the new property handlers provided by the new model.</p>
    */
    [attribute] XObjectInspectorModel InspectorModel;

    /** provides access to the user interface of the object inspector.

        <p>This interface can be used to access and manipulate various aspects of
        the user interface. For instance, you can enable and disable certain
        property controls (or parts thereof), or register observers for all property
        controls.</p>

        @since OOo 2.2
    */
    [attribute, readonly] XObjectInspectorUI InspectorUI;

    /** inspects a new collection of one or more objects.

        <p>If the sequence is empty, the UI of the <type>ObjectInspector</type> will be
        cleared.</p>

        <p>If the sequence contains more than one object, the <type>XObjectInspector</type>
        will create a complete set of property handlers (as indicated by
        <member>XObjectInspectorModel::HandlerFactories</member>) for <em>every</em> of
        the objects, and compose their output.</p>

        @throws com::sun::star::util::VetoException
            if the inspector cannot switch to another object set. This typically happens if
            one of the active <type>XPropertyHandler</type>'s raised a non-modal user interface,
            and vetoed suspension of this UI.

        @see XPropertyHandler::isComposable
        @see XPropertyHandler::onInteractivePropertySelection
        @see XPropertyHandler::suspend
    */
    void inspect( [in] sequence< com::sun::star::uno::XInterface > Objects )
        raises (com::sun::star::util::VetoException);
};

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

}; }; }; };

#endif


