/**************************************************************
 * 
 * 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_rendering_XLinePolyPolygon2D_idl__
#define __com_sun_star_rendering_XLinePolyPolygon2D_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif
#ifndef __com_sun_star_lang_IndexOutOfBoundsException_idl__
#include <com/sun/star/lang/IndexOutOfBoundsException.idl>
#endif
#ifndef __com_sun_star_geometry_RealPoint2D_idl__
#include <com/sun/star/geometry/RealPoint2D.idl>
#endif
#ifndef __com_sun_star_rendering_XPolyPolygon2D_idl__
#include <com/sun/star/rendering/XPolyPolygon2D.idl>
#endif

module com { module sun { module star { module rendering {

/** Specialized interface for a 2D poly-polygon containing only straight line segments.

    @since OpenOffice 2.0
 */
published interface XLinePolyPolygon2D : XPolyPolygon2D
{
    /** Query subset of this poly-polygon, starting at the given
        polygon and the given point within that polygon, and
        containing the specified number of polygons and points in the
        last polygon.

        @param nPolygonIndex
        The index number of the polygon to start with extracting
        points. Set to 0 to start with the first polygon.

        @param nNumberOfPolygons
        The number of polygons, starting with nPolygonIndex, to
        extract points from. Set to -1 to extract all polygons,
        starting with nPolygonIndex (i.e. a total of
        getNumberOfPolygons() - nPolygonIndex polygons is extracted).

        @param nPointIndex
        The index of the point within the first polygon (that with the
        index number nPolygonIndex) to start extraction with. Set to 0
        to start with the first point in this polygon.

        @param nNumberOfPoints
        The number of points in the last polygon of the extraction
        sequence, to be extracted. Set to -1 to extract all points
        from the last polygon.
     */
    sequence< sequence< ::com::sun::star::geometry::RealPoint2D > > getPoints( [in] long nPolygonIndex, [in] long nNumberOfPolygons, [in] long nPointIndex, [in] long nNumberOfPoints )
        raises (com::sun::star::lang::IndexOutOfBoundsException);

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

    /** Set the specified sequence of points to the poly-polygon.

        This method can either set the whole poly-polygon to the new
        data, or insert the points at the given index

        @param nPolygonIndex
        The index of the polygon to start point insertion with. This
        index must be in the range [0,numPolygons], and the insertion
        will take place <em>before</em> this position (i.e. when
        specifying 0 here, the given point sequence will precede all
        existing polygons already within the poly-polygon). To append
        to a poly-polygon, call setPoints() with
        <member>XLinePolyPolygon2D::getNumberOfPolygons()</member>
        as the polygon index. If nPolygonIndex is -1, the given
        sequence of points <em>replaces</em> the poly-polygon content,
        such that after this method completes, it contains exactly the
        specified point data.

        @throws <type>com::sun::star::lang::IndexOutOfBoundsException</type>
        if one of the given values exceed the permissible range.
     */
    void setPoints( [in] sequence< sequence< ::com::sun::star::geometry::RealPoint2D > > points, [in] long nPolygonIndex )
        raises (com::sun::star::lang::IndexOutOfBoundsException);

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

    /** Get a single point from the poly-polygon
     */
    ::com::sun::star::geometry::RealPoint2D	getPoint( [in] long nPolygonIndex, [in] long nPointIndex )
        raises (com::sun::star::lang::IndexOutOfBoundsException);

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

    /** Set a single point on the poly-polygon. The remaining points of
        the poly-polygon will not be changed by this method.
     */
    void setPoint( [in] ::com::sun::star::geometry::RealPoint2D point, [in] long nPolygonIndex, [in] long nPointIndex )
        raises (com::sun::star::lang::IndexOutOfBoundsException);
};

}; }; }; };

#endif
