/**************************************************************
 * 
 * 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 OOo 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
