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

#ifndef com_sun_star_graphic_XGraphic_idl
#include <com/sun/star/graphic/XGraphic.idl>
#endif

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

published interface XPropertyControl;

//-----------------------------------------------------------------------------
/** describes the appearance of a line representing a single property in an <type>ObjectInspector</type>.

    Such a line consists of
    <ul><li>a label with a human-readable name for the property</li>
        <li>a control which is used for user interaction - i.e. it displays the current property
            value, and allows the user entering a new one.</li>
        <li>(optional) one or two buttons which, when clicked, can start a more complex, interactive
            property value input. For instance, if you have a property whose value is a path in the
            file system, such a button could be used to let the user browse for a path with a
            usual file picker.</li>
    </ul>

    @see XPropertyHandler::describePropertyLine
    @see PropertyLineElement

    @since OOo 2.0.3
*/
published struct LineDescriptor
{
    /** denotes the human-readable display name used to present a property to the user
    */
    string  DisplayName;

    /** denotes the control which should be used to represent the property at the UI.

        @see XPropertyControlFactory
    */
    XPropertyControl Control;

    /** specifies the URL to the help topic to be associated with the property
    */
    string HelpURL;

    /** detetrmines whether a button exists which can be used for a more complex, interactive
        property value input.

        <p>If no image for the primary button is specified, but a primary button is present,
        the three dots will be displayed on the button.</p>

        @see XPropertyHandler::onInteractivePropertySelection
        @see HasSecondaryButton
        @see PrimaryButtonImageURL
        @see PrimaryButtonImage
    */
    boolean HasPrimaryButton;

    /** describes a unique id to associate with the primary button

        <p>In OpenOffice.org, UI elements sometimes require a so-called UniqueID, which can be
        used to uniquely (within the whole application) identify this UI element. For instance,
        automating the OpenOffice.org UI via a dedicated separate application ("TestTool") requires
        such IDs.</p>

        <p>If a primary button exists for a property's UI representation (<member>HasPrimaryButton</member>),
        it gets the ID specified herein.</p>
    */
    string PrimaryButtonId;

    /** describes the URL of an image to display on the primary button, if any.

        <p>This URL will be used to obtain an actual <type scope="com::sun::star::graphic">XGraphic</type>
        object from an <type scope="com::sun::star::graphic">GraphicProvider</type>.</p>

        <p>The property will be ignored if <member>HasPrimaryButton</member> is <FALSE/>.</p>

        <p>If you need to specify a graphic which does not have an URL, but is available as
        <type scope="com::sun::star::graphic">XGraphic</type> only, then you must leave
        <code>PrimaryButtonImageURL</code> empty, and use the <member>PrimaryButtonImage</member> property.

        @see PrimaryButtonImage
    */
    string  PrimaryButtonImageURL;

    /** describes a graphics to display at the primary button, if any.

        <p>The property will be ignored if <member>HasPrimaryButton</member> is <FALSE/>, or
        if <member>PrimaryButtonImageURL</member> is a non-empty string.</p>

        @see HasPrimaryButton
        @see PrimaryButtonImageURL
    */
    com::sun::star::graphic::XGraphic PrimaryButtonImage;

    /** detetrmines whether a secondary button exists which can be used for a more complex, interactive
        property value input.

        <p>A secondary button subordinated to the primary button. If no primary button exists
        (<member>HasPrimaryButton</member>), this member is ignored.</p>

        @see XPropertyHandler::onInteractivePropertySelection
        @see HasSecondaryButton
    */
    boolean HasSecondaryButton;

    /** describes a unique id to associate with the primary button

        <p>If a secondary button exists for a property's UI representation (<member>HasSecondaryButton</member>),
        it gets the ID specified herein.</p>

        @see PrimaryButtonId
    */
    string SecondaryButtonId;

    /** describes the URL of an image to display on the secondary button, if any.

        <p>This URL will be used to obtain an actual <type scope="com::sun::star::graphic">XGraphic</type>
        object from an <type scope="com::sun::star::graphic">GraphicProvider</type>.</p>

        <p>The property will be ignored if <member>HasSecondaryButton</member> is <FALSE/>.</p>

        <p>If you need to specify a graphic which does not have an URL, but is available as
        <type scope="com::sun::star::graphic">XGraphic</type> only, then you must leave
        <code>SecondaryButtonImageURL</code> empty, and use the <member>SecondaryButtonImage</member> property.

        @see SecondaryButtonImage
    */
    string  SecondaryButtonImageURL;

    /** describes a graphics to display at the secondary button, if any.

        <p>The property will be ignored if <member>HasSecondaryButton</member> is <FALSE/>, or
        if <member>SecondaryButtonImageURL</member> is a non-empty string.</p>

        @see HasSecondaryButton
        @see SecondaryButtonImageURL
    */
    com::sun::star::graphic::XGraphic SecondaryButtonImage;

    /** describes the indent level for the property

        <p>If a given property semantically depends on another one, the indent level
        can be used to visually represent this fact. For this, the dependent property's
        indent level would be one larger than the indent level of the other property.</p>

        <p>Normally, <type>XPropertyHandler</type>s will set this to <code>0</code> when describing
        the UI for a normal property.
    */
    short IndentLevel;

    /** describes the category into which the property should be sorted by the <type>ObjectInspector</type>.

        <p>An <type>ObjectInspector</type> can visually group properties which semantically belong
        together (for instance using tab pages). The decision which properties actually belong together
        is made using this <member>Category</member> attribute.</p>

        <p>For your implementation of <type>XPropertyHandler</type>, it's recommended that you document the programmatic
        names used for property categories. This way, your handler might be re-used in
        different contexts, where only the <type>XObjectInspectorModel</type> needs to provide consistent
        UI names for the categories.</p>

        @see XObjectInspectorModel::describeCategories
    */
    string Category;
};

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

}; }; }; };

#endif

