/**************************************************************
 * 
 * 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_ViewSettings_idl__
#define __com_sun_star_text_ViewSettings_idl__

#ifndef __com_sun_star_beans_XPropertySet_idl__
#include <com/sun/star/beans/XPropertySet.idl>
#endif
#ifndef __com_sun_star_view_DocumentZoomType_idl__
#include <com/sun/star/view/DocumentZoomType.idl>
#endif
#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif

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

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

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

// DocMerge from xml: service com::sun::star::text::ViewSettings
/** provides access to the settings of the controller of a text document.
 */
published service ViewSettings
{
	// DocMerge: empty anyway
	interface com::sun::star::beans::XPropertySet;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowAnnotations
	/** If this property is <TRUE/>, annotations (notes) are visible.
	 */
	[property] boolean ShowAnnotations;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowBreaks
	/** If this property is <TRUE/>, paragraph line breaks are visible.
	 */
	[property] boolean ShowBreaks;

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

    // DocMerge from xml: property com::sun::star::text::ViewSettings::ShowFieldCommandsShowDrawings
	/** If this property is <TRUE/>, shapes are visible.
	 */
	[property] boolean ShowDrawings;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowFieldCommands
	/** If this property is <TRUE/>, text fields are shown with their commands; otherwise
		the content is visible.
	 */
	[property] boolean ShowFieldCommands;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowFootnoteBackground
	/** If this property is <TRUE/>, footnotes symbols are displayed with gray background.
	 */
	[property] boolean ShowFootnoteBackground;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowGraphics
	/** If this property is <TRUE/>, graphic objects are visible.
	 */
	[property] boolean ShowGraphics;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowHiddenParagraphs
	/** If this property is <TRUE/>, hidden paragraghs are displayed.
	 */
	[property] boolean ShowHiddenParagraphs;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowHiddenText
	/** If this property is <TRUE/>, hidden text is displayed.
	 */
	[property] boolean ShowHiddenText;

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

         /** ShowHoriRuler and ShowVertRuler determine whether a ruler is visible.
         */
        [property] boolean ShowRulers;

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

        /** If this property is <TRUE/> and the property ShowRulers is <TRUE/>,
           the horizontal ruler is displayed.
	 */
	[property] boolean ShowHoriRuler;

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

        /** If this property is <TRUE/> and the property ShowRulers is <TRUE/>,
           the horizontal scroll bar is displayed.
	 */
	[property] boolean ShowHoriScrollBar;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowIndexMarkBackground
	/** If this property is <TRUE/>, index marks are displayed with gray background.
	 */
	[property] boolean ShowIndexMarkBackground;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowParaBreaks
	/** If this property is <TRUE/>, paragraph breaks are visible.
	 */
	[property] boolean ShowParaBreaks;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowProtectedSpaces
	/** If this property is <TRUE/>, protected spaces (hard spaces) are displayed with gray
		background.
	 */
	[property] boolean ShowProtectedSpaces;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowSoftHyphens
	/** If this property is <TRUE/>, soft hyphens are displayed with gray background.
	 */
	[property] boolean ShowSoftHyphens;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowSpaces
	/** If this property is <TRUE/>, spaces are displayed with dots.
	 */
	[property] boolean ShowSpaces;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowTableBoundaries
	/** If this property is <TRUE/>, table boundaries are displayed.
	 */
	[property] boolean ShowTableBoundaries;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowTables
	/** If this property is <TRUE/>, tables are visible.
	 */
	[property] boolean ShowTables;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowTabstops
	/** If this property is <TRUE/>, tab stops are visible.
	 */
	[property] boolean ShowTabstops;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowTextBoundaries
	/** If this property is <TRUE/>, text boundaries are displayed.
	 */
	[property] boolean ShowTextBoundaries;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowTextFieldBackground
	/** If this property is <TRUE/>, text fields are displayed with gray background.
	 */
	[property] boolean ShowTextFieldBackground;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowVertRuler
	/** If this property is <TRUE/>, the vertical ruler is displayed.
	 */
	[property] boolean ShowVertRuler;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::ShowVertScrollBar
	/** If this property is <TRUE/>, the vertical scroll bar is displayed.
	 */
	[property] boolean ShowVertScrollBar;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::SmoothScrolling
	/** If this property is <TRUE/>, smooth scrolling is active.
	 */
	[property] boolean SmoothScrolling;

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

	// DocMerge from xml: property com::sun::star::text::ViewSettings::SolidMarkHandles
	/** If this property is <TRUE/>, handles of drawing objects are visible.
	 */
	[property] boolean SolidMarkHandles;
    //-------------------------------------------------------------------------
    /** If this property is <TRUE/>, the vertical ruler is aligned to the right side
     of the view and the vertical scrollbar is on the left.
	 */
    [property] boolean IsVertRulerRightAligned;

    //-------------------------------------------------------------------------
    /** If this property is <TRUE/> the document will be displayed as if it
        were a HTML document.
	 */
    [property] boolean ShowOnlineLayout;

    //-------------------------------------------------------------------------
    /** This property defines the zoom type for the document.

        @see com::sun::star::view::DocumentZoomType
     */
    [property] short ZoomType;

    //-------------------------------------------------------------------------
    /** Defines the zoom value to use.
        Valid only if the ZoomType is set to
        <member scope="com::sun::star::view::DocumentZoomType">BY_VALUE</member>.
	 */
    [property] short ZoomValue;
    //-------------------------------------------------------------------------
    /** If this property is <TRUE/> hyperlinks in the document are executed (loaded) on
     mouse click. Otherwise they are handled like normal text.
         */
    [optional, property] boolean IsExecuteHyperlinks;

    //-------------------------------------------------------------------------
    /** Specifies whether to display the grid or not

        @since OOo 2.0
     */
    [optional, property] boolean IsRasterVisible;

    //-------------------------------------------------------------------------
    /** Specifies whether to move frames, drawing elements, and form
        functions only between grid points.

        @since OOo 2.0
     */
    [optional, property] boolean IsSnapToRaster;

    //-------------------------------------------------------------------------
    /** Specifies the number of intervals between grid points on the X-axis.

        <p>The value must be greater or equal to 0, and the application
        may enforce an upper bound for the value.</p>

        @since OOo 2.0
        @throws com::sun::star::lang::IllegalArgumentException
            if the value is out of bounds.
     */
    [optional, property] long RasterSubdivisionX;

    //-------------------------------------------------------------------------
    /** Specifies the number of intervals between grid points on the Y-axis.

        <p>The value must be greater or equal to 0, and the application
        may enforce an upper bound for the value.</p>

        @since OOo 2.0
        @throws com::sun::star::lang::IllegalArgumentException
            if the value is out of bounds.
     */
    [optional, property] long RasterSubdivisionY;

    //-------------------------------------------------------------------------
    /** Defines the unit of measure for the spacing between grid points
        on the X-axis.

        <p>The value must be greater than 0. The application
        may enforce more restricting bounds for the value.</p>

        @since OOo 2.0
        @throws com::sun::star::lang::IllegalArgumentException
            if the value is out of bounds.
     */
    [optional, property] long RasterResolutionX;

    //-------------------------------------------------------------------------
    /** Defines the unit of measure for the spacing between grid points
        on the Y-axis.

        <p>The value must be greater than 0. The application
        may enforce more restricting bounds for the value.</p>

        @since OOo 2.0
        @throws com::sun::star::lang::IllegalArgumentException
            if the value is out of bounds.
     */
    [optional, property] long RasterResolutionY;

    //-------------------------------------------------------------------------
    /** If this property is <TRUE/>, hidden characters are displayed

        @since OOo 3.0
     */
    [optional, property] boolean ShowHiddenCharacters;
    //-------------------------------------------------------------------------
    /** If this property is <TRUE/>, the settings of nonprinting characters are applied.

        <p>This option controls the use of the settings ShowHiddenCharacters,
        ShowTabstops, ShowSpaces, ShowBreaks and ShowParaBreaks </p>

        @since OOo 3.0
     */
    [optional, property] boolean ShowNonprintingCharacters;
    //-------------------------------------------------------------------------
    /** metric unit of the horizontal ruler

        <p>Uses values <type scope="com::sun::star::awt">FieldUnit</type></p>

        @since OOo 3.1
     */
    [optional, property] long HorizontalRulerMetric;
    //-------------------------------------------------------------------------
    /** metric unit of the vertical ruler

        <p>Uses values from <type scope="com::sun::star::awt">FieldUnit</type></p>

        @since OOo 3.1
     */
    [optional, property] long VerticalRulerMetric;
    //-------------------------------------------------------------------------
    /** If this property is <TRUE/>, tips for document content are shown,
        typically in a help balloon when the mouse is over the content.

        @since Apache OpenOffice 3.5
     */
    [optional, property] boolean ShowContentTips;
};

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

}; }; }; };

#endif
