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

#ifndef __com_sun_star_beans_XPropertySet_idl__
#include <com/sun/star/beans/XPropertySet.idl>
#endif

#ifndef __com_sun_star_document_Settings_idl__
#include <com/sun/star/document/Settings.idl>
#endif

#ifndef __com_sun_star_text_PrintSettings_idl__
#include <com/sun/star/text/PrintSettings.idl>
#endif

#ifndef __com_sun_star_text_PrintPreviewSettings_idl__
#include <com/sun/star/text/PrintPreviewSettings.idl>
#endif

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

module com { module sun { module star { module text {

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

/** describes properties that apply to the whole text document.
 */
published service DocumentSettings
{
    service com::sun::star::document::Settings;

    [optional] service com::sun::star::text::PrintSettings;

    [optional] service com::sun::star::text::PrintPreviewSettings;

    //-------------------------------------------------------------------------
    /** gives access to the properties implemented by this service.
     */
    interface com::sun::star::beans::XPropertySet;

    //-------------------------------------------------------------------------

    /** specifies if charts in text documents are updated automatically.

        This has no effect if 'FieldAutoUpdate' is <FALSE/>.
    */
    [optional, property] boolean ChartAutoUpdate;

    /** specifies if spacing between paragraphs and tables is to be
        added.

        <p>If between two paragraphs, two tables, or a paragraph and a
        table, you have defined spacing above and below each object,
        usually only the larger one of the two spaces is used.  If the
        spacing between hte objects are to be added this property has
        to be <TRUE/>.</p>
    */
    [optional, property] boolean AddParaTableSpacing;

    /** specifies if top paragraph spacing is applied to paragraphs
        on the first page of text documents.

        <p>If <TRUE/>, the paragraph or table spacing to the top will
        also be effective at the beginning of a page or column if the
        paragraph or table is positioned on the first page of the
        document.  The same applies for a page break.</p>
    */
    [optional, property] boolean AddParaTableSpacingAtStart;

    /** specifies the alignment of tab stops in text documents.

        <p>If <TRUE/> centered and right-aligned paragraphs containing
        tabs are formatted as a whole in the center or aligned to the
        right. If <FALSE/>, only the text to the right of the last
        tab, for example, is aligned to the right, while the text to
        the left remains where it is.</p>
    */
    [optional, property] boolean AlignTabStopPosition;

    // ------------------------------------------------------------
    /** specifies if the contents of links in the global document
        are saved or not.

        <p>This property applies only for master documents.</p>

        <p><em>Note</em>: This name is a bit misleading, it should be
        something like <code>SaveLinkedDocumentContent</code>.</p>
    */
    [optional, property] boolean SaveGlobalDocumentLinks;
    // ------------------------------------------------------------
    /** specifies if the document has been created as a label document.

        <p>This property indicates that the document contains multiple text frames
        and that the content of one frame is duplicated into the other frames
        by internally linked text sections.</p>

    */
    [optional, property] boolean IsLabelDocument;
    // ------------------------------------------------------------
    /** specifies if the former (till OpenOffice.org 1.1) or the new
        line spacing formatting is applied.

        <p>This property controls how a set line spacing at a paragraph
        influences the formatting of the text lines and the spacing between
        paragraphs.
        If <TRUE/>, the formatting till OpenOffice.org 1.1 is
        applied. This means, that a proportional line spacing is applied
        above and below a text line and that the maximum of the line spacing
        value between two paragraph is added respectively reckoned up with the
        paragraph spacing (adding or reckoning up is controlled by document
        option AddParaTableSpacing).
        If <FALSE/> (default for documents since OpenOffice.org 2.0),
        a proportional line spacing is only applied below a text line and
        it's always added to the paragraph spacing between two paragraphs.</p>

        @since OpenOffice 2.0
    */
    [optional, property] boolean UseFormerLineSpacing;
    // ------------------------------------------------------------
    /** specifies if paragraph and table spacing is added at the
        bottom of table cells

        <p>This property controls, if the spacing of the last paragraph
        respectively table of a table cell is added at the bottom of this
        table cells
        If <TRUE/> (default for documents since OpenOffice.org 2.0),
        the spacing of the last paragraph respectively table of a table
        cell is added at the bottom of this table cell.
        If <FALSE/> (typically for documents till OpenOffice.org 1.1),
        the spacing of the last paragraph respectively table of a table
        cell isn't added at the bottom of this table cell.</p>

        @since OpenOffice 2.0
    */
    [optional, property] boolean AddParaSpacingToTableCells;
    // ------------------------------------------------------------
    /** specifies if the former (till OpenOffice.org 1.1) or the new
        object positioning is applied.

        <p>This property controls how floating screen objects (Writer
        fly frames and drawing objects are positioned.
        If <TRUE/>, the object positioning till OpenOffice.org 1.1 is
        applied. This means, that the top of a paragraph, at which a
        floating screen object orients its vertical position, includes
        the lower spacing and the line spacing of the previous paragraph.
        If <FALSE/> (default for documents since OpenOffice.org 2.0),
        the top of a paragraph, at which a floating screen object orients
        its vertical position, doesn't include the lower spacing and the
        line spacing of the previous paragraph.</p>

        @since OpenOffice 2.0
    */
    [optional, property] boolean UseFormerObjectPositioning;

    // ------------------------------------------------------------
    /** specifies if the text wrap of floating screen objects are
        considered in a specified way in the positioning algorithm.

        <p>This property controls how floating screen objects (Writer
        fly frames and drawing objects) are positioned.
        If <TRUE/>, the object positioning algorithm will consider
        the text wrap style, set at the floating screen object.
        The attribute <member>BaseFrameProperties::WrapInfluenceOnPosition</member>
        specifies how the text wrap is considered.
        If <FALSE/> (default value), the former object positioning
        algorithm (known from OpenOffice.org 1.1) is applied.</p>

        @since OpenOffice 2.0
    */
    [optional, property] boolean ConsiderTextWrapOnObjPos;

    // ------------------------------------------------------------
    /** specifies if Math objects should automatically vertically aligned to
        match the baseline of the surrounding text.
      
        <p>If activated formula object that are anchored 'As Character' will be
        vertically aligned to have their baseline match with the one from the text.</p>
     
        @since OpenOffice 3.4
    */
    [optional, property] boolean MathBaselineAlignment;
};

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

}; }; }; };

#endif
