/**************************************************************
 * 
 * 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_document_Settings_idl__
#define __com_sun_star_document_Settings_idl__

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

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

module com {   module sun {   module star {   module document {

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

/** describes properties that apply to the whole document of any
    application.

    <p>For application specific settings, please refer to the
    individual services.</p>

    @see com::sun::star::text::DocumentSettings
    @see com::sun::star::sheet::DocumentSettings
    @see com::sun::star::drawing::DocumentSettings
    @see com::sun::star::presentation::DocumentSettings
 */
published service Settings
{
    /** gives access to the properties implemented by this service.
     */
	interface com::sun::star::beans::XPropertySet;

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

    // Note: These settings are global.  However there is a note at
    // every property that shows which application currently makes use
    // of it.

    // Writer and Draw/Impress and Calc
    //-------------------------------------------------------------------------
    /** gives access to the set of forbidden characters.

        @return the
            <type scope="com::sun::star::i18n">XForbiddenCharacters</type>
            interface to allow retreival and modification of the
            forbidden characters set.
    */
    [optional, property] com::sun::star::i18n::XForbiddenCharacters ForbiddenCharacters;

    // Writer and Calc
    //-------------------------------------------------------------------------
    /** specifies the update mode for links when loading text documents.

        <p>For supported values see the constants group
        <type>LinkUpdateModes</type>.</p>
    */
    [optional, property] short LinkUpdateMode;

    // Writer and Draw/Impress and Calc
    //-------------------------------------------------------------------------
    /** printer used by the document.
     */
    [property] string PrinterName;

    // Writer and Draw/Impress and Calc
    //-------------------------------------------------------------------------
    /** platform and driver dependent printer setup data.

        <p>This property serves to capture the current printer setup
        settings, such as paper tray, printer options, etc. The data
        can typically be interpreted only by the system that generated
        it. The PrinterSetup property may be used to save and restore
        the user's printer settings.</p>
    */
    [property] sequence< byte > PrinterSetup;

    // Writer and Draw/Impress and Calc
    //-------------------------------------------------------------------------
    /** specifies if kerning is applied to Asian punctuation.

        <p>Applies only if kerning is enabled.</p>
    */
    [optional, property] boolean IsKernAsianPunctuation;

    // Writer and Draw/Impress and Calc
    //-------------------------------------------------------------------------
    /** specifies the compression (character spacing) type used for
        Asian characters.

        @see com::sun::star::text::CharacterCompressionType
    */
    [optional, property] short CharacterCompressionType;

    // Writer and Draw/Impress and Calc
    //-------------------------------------------------------------------------
    /** specifies if the user-specific settings saved within a
        document should be loaded with the document.
    */
    [optional, property] boolean ApplyUserData;

    // Writer and Calc
    //-------------------------------------------------------------------------
    /** specifies if a new version is created if a document has
        been modified and you want to close it.
    */
    [optional, property] boolean SaveVersionOnClose;

    // Writer and Draw/Impress and Calc
    //-------------------------------------------------------------------------
    /** specifies if the document should be updated when the
        template it was created from changes.

        <p>Applies only for documents that were created from a template.</p>
    */
    [optional, property] boolean UpdateFromTemplate;

    // Writer
    //-------------------------------------------------------------------------
    /** specifies if fields in text documents are updated automatically.
     */
    [optional, property] boolean FieldAutoUpdate;

    // Writer
    //-------------------------------------------------------------------------
    /** The name of the globally registered
        <type scope="com::sun::star::sdb">DataSource</type>
        from which the current data is taken.

        <p>The data source can e.g. be used for feeding a form
        letter.</p>
    */
    [optional, property] string CurrentDatabaseDataSource;

    // Writer
    //-------------------------------------------------------------------------
    /** a string value, specifying the name of the object displayed
        currently (or the SQL statement used).
    */
    [optional, property] string CurrentDatabaseCommand;

    // Writer
    //-------------------------------------------------------------------------
    // Note: What is the property DataTableName?  Is this Writer-specific?
    /** determines the interpretation of the property DataTableName.

        @see com::sun::star::sdb::CommandType
    */
    [optional, property] long CurrentDatabaseCommandType;

    // Draw and Impress
    //-------------------------------------------------------------------------
    /**
     */
    [optional, property] long DefaultTabStop;

    // Draw and Impress
    //-------------------------------------------------------------------------
    /** determines if the document will be printed as a booklet
        (brochure), i.e., two document pages are put together on one
        physical page, such that you can fold the print result and get
        a booklet.

        <p>Note, that you have to print in duplex mode, if both,
        <member>IsPrintBookletFront</member> and
        <member>IsPrintBookletBack</member> are set to <TRUE/>.</p>
     */
    [optional, property] boolean IsPrintBooklet;

    // Draw and Impress
    //-------------------------------------------------------------------------
    /** is only effective, if <member>IsPrintBooklet</member> is
        <TRUE/>.  If this property is also <TRUE/>, only the fronts of
        the pages of your booklet are printed.

        <p>This is especially useful, if your printer does not supply
        duplex printing.</p>
     */
    [optional, property] boolean IsPrintBookletFront;

    // Draw and Impress
    //-------------------------------------------------------------------------
    /** is only effective, if <member>IsPrintBooklet</member> is
        <TRUE/>.  If this property is also <TRUE/>, only the backs of
        the pages of your booklet are printed.

        <p>This is especially useful, if your printer does not supply
        duplex printing.</p>
     */
    [optional, property] boolean IsPrintBookletBack;

    // Draw and Impress
    //-------------------------------------------------------------------------
    // Note: Define a constant group for that?
    /**
     */
    [optional, property] long PrintQuality;

    // Draw and Impress
    //-------------------------------------------------------------------------
    /** contains the URL that points to a color table (file extension
        .soc) that will be used for showing a palette in dialogs using
        colors.
     */
    [optional, property] string ColorTableURL;

    // Draw and Impress
    //-------------------------------------------------------------------------
    /**
     */
    [optional, property] string DashTableURL;

    // Draw and Impress
    //-------------------------------------------------------------------------
    /**
     */
    [optional, property] string LineEndTableURL;

    // Draw and Impress
    //-------------------------------------------------------------------------
    /**
     */
    [optional, property] string HatchTableURL;

    // Draw and Impress
    //-------------------------------------------------------------------------
    /**
     */
    [optional, property] string GradientTableURL;

    // Draw and Impress
    //-------------------------------------------------------------------------
    /**
     */
    [optional, property] string BitmapTableURL;

    // Calc
    //-------------------------------------------------------------------------
    /**
     */
    [optional, property] boolean AutoCalculate;

    // Writer, later others
    //-------------------------------------------------------------------------
    /** forbid use of printer metrics for layout

        <p>For supported values see the constants group
        <type>PrinterIndependentLayout</type>.</p>
     */
    [optional, property] short PrinterIndependentLayout;

    // Writer, maybe later other applications, too
    //-------------------------------------------------------------------------
    /** layout engine should add value of a Font's 'external leading'
     * attribute to the line spacing.
     */
    [optional, property] boolean AddExternalLeading;

};

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

}; }; }; };

#endif
