/**************************************************************
 * 
 * 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_drawing_GenericDrawingDocument_idl__
#define __com_sun_star_drawing_GenericDrawingDocument_idl__

#ifndef __com_sun_star_drawing_XDrawPageDuplicator_idl__
#include <com/sun/star/drawing/XDrawPageDuplicator.idl>
#endif

#ifndef __com_sun_star_drawing_XDrawPagesSupplier_idl__
#include <com/sun/star/drawing/XDrawPagesSupplier.idl>
#endif

#ifndef __com_sun_star_drawing_XMasterPagesSupplier_idl__
#include <com/sun/star/drawing/XMasterPagesSupplier.idl>
#endif

#ifndef __com_sun_star_drawing_XLayerSupplier_idl__
#include <com/sun/star/drawing/XLayerSupplier.idl>
#endif

#ifndef __com_sun_star_lang_XMultiServiceFactory_idl__
#include <com/sun/star/lang/XMultiServiceFactory.idl>
#endif

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

#ifndef __com_sun_star_style_XStyleFamiliesSupplier_idl__
#include <com/sun/star/style/XStyleFamiliesSupplier.idl>
#endif

#ifndef __com_sun_star_lang_Locale_idl__
#include <com/sun/star/lang/Locale.idl>
#endif

#ifndef __com_sun_star_awt_Rectangle_idl__
#include <com/sun/star/awt/Rectangle.idl>
#endif

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

#ifndef __com_sun_star_document_OfficeDocument_idl__
#include <com/sun/star/document/OfficeDocument.idl>
#endif

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

 module com {  module sun {  module star {  module drawing {

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

/** specifies a document which consists of multiple pages
    with drawings.

    <p>Because its function is needed more then once, its defined as generic one.</p>
 */
published service GenericDrawingDocument
{
    /** this base service describes storing and printing */
    service com::sun::star::document::OfficeDocument;

    /** this factory lets you create various services that are
        used inside a drawing document

        <p>The following services are <type>Shape</type>s.
        They are created by the documents factory and must
        be inserted into a <type>DrawPage</type> or <type>MasterPage</type>
        of this document.

        <ul>
            <li><type>RectangleShape</type></li>
            <li><type>EllipseShape</type></li>
            <li><type>ControlShape</type></li>
            <li><type>ConnectorShape</type></li>
            <li><type>MeasureShape</type></li>
            <li><type>LineShape</type></li>
            <li><type>PolyPolygonShape</type></li>
            <li><type>PolyLineShape</type></li>
            <li><type>OpenBezierShape</type></li>
            <li><type>ClosedBezierShape</type></li>
            <li><type>GraphicObjectShape</type></li>
            <li><type>GroupShape</type></li>
            <li><type>TextShape</type></li>
            <li><type>OLE2Shape</type></li>
            <li><type>PageShape</type></li>
            <li><type>CaptionShape</type></li>
            <li><type>PluginShape</type></li>
            <li><type>AppletShape</type></li>
        </ul>

        <p>The following services are all <type scope="com::sun::star::text">TextField</type>
        and can be inserted into text as <type scope="com::sun::star::text">TextContent</type>.

        <ul>
            <li><member scope="com::sun::star::text">TextField::DateTime</member></li>
            <li><member scope="com::sun::star::text">TextField::URL</member></li>
            <li><member scope="com::sun::star::text">TextField::PageNumber</member></li>
            <li><member scope="com::sun::star::text">TextField::PageCount</member></li>
            <li><member scope="com::sun::star::text">TextField::SheetName</member></li>
            <li><member scope="com::sun::star::text">TextField::FileName</member></li>
            <li><member scope="com::sun::star::text">TextField::DocInfo.Title</member></li>
            <li><member scope="com::sun::star::text">TextField::Author</member></li>
            <li><member scope="com::sun::star::text">TextField::Measure</member></li>
        </ul>

        <p>The following services gives access to resources used inside the document
        and let you add new resources.

        <ul>
            <li><type scope="com::sun::star::drawing">DashTable</type></li>
            <li><type scope="com::sun::star::drawing">GradientTable</type></li>
            <li><type scope="com::sun::star::drawing">HatchTable</type></li>
            <li><type scope="com::sun::star::drawing">BitmapTable</type></li>
            <li><type scope="com::sun::star::drawing">TransparencyGradientTable</type></li>
            <li><type scope="com::sun::star::drawing">MarkerTable</type></li>
        </ul>

        <p>The following service can be set at the <code>Numbering</code> property
        inside a <type scope="com::sun::star::style">ParagraphProperties</type>

        <ul>
            <li><type scope="com::sun::star::text">NumberingRules</type></li>
        </ul>

        <p>The following services can be used for a <type scope="com::sun::star::image">ImageMap</type>
        inside the document.

        <br>A <type scope="com::sun::star::image">ImageMap</type> can be obtained from a
        <type>GraphicObjectShape</type>

        <ul>
            <li><type scope="com::sun::star::image">ImageMapRectangleObject</type></li>
            <li><type scope="com::sun::star::image">ImageMapCircleObject</type></li>
            <li><type scope="com::sun::star::image">ImageMapPolygonObject</type></li>
        </ul>

        <p>The following services lets you access the drawing property defaults
        of a document.

        <ul>
            <li><type scope="com::sun::star::drawing">Defaults</type></li>
        </ul>
    */
    interface com::sun::star::lang::XMultiServiceFactory;

    /** lets you access the properties of this service.
     */
    interface com::sun::star::beans::XPropertySet;

    /** lets you duplicate pages inside this document.
     */
    interface com::sun::star::drawing::XDrawPageDuplicator;


    /** provides an object that is implementing the service
                <type>DrawPage</type>s. With this service you have access to the
                <type>DrawPage</type>s inside a document.
     */
    interface com::sun::star::drawing::XDrawPagesSupplier;


    /** returns an object that is implementing the service
                <type>MasterPages</type>. With this service you have access to the
                <type>MasterPage</type>s inside a document.
     */
    interface com::sun::star::drawing::XMasterPagesSupplier;


    /** returns an object that is implementing the service
                <type>LayerManager</type>. This service lets you manipulate the
                <type>Layer</type>s of this document.
     */
    interface com::sun::star::drawing::XLayerSupplier;

    /** This interface lets you access the styles contained in this document
     */
    interface com::sun::star::style::XStyleFamiliesSupplier;

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

    /** This property specifies the length between the default tab stops
        inside text in this document in 1/100th mm.
     */
    [property] long TabStop;

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

    /** contains the identifier of the default locale of the document.
     */
    [property] com::sun::star::lang::Locale CharLocale;

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

    /** if this document is an ole client, this is the current visible area
        in 100th mm
    */
    [property] com::sun::star::awt::Rectangle VisibleArea;

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

    /** This property gives the XForbiddenCharacters.
     */
    [readonly, property] com::sun::star::i18n::XForbiddenCharacters ForbiddenCharacters;

};

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

}; }; }; };

#endif

