/**************************************************************
 * 
 * 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_sheet_SpreadsheetDrawPage_idl__
#define __com_sun_star_sheet_SpreadsheetDrawPage_idl__

#ifndef __com_sun_star_drawing_XDrawPage_idl__
#include <com/sun/star/drawing/XDrawPage.idl>
#endif

#ifndef __com_sun_star_drawing_XShapeGrouper_idl__
#include <com/sun/star/drawing/XShapeGrouper.idl>
#endif

#ifndef __com_sun_star_lang_XServiceInfo_idl__
#include <com/sun/star/lang/XServiceInfo.idl>
#endif

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

 module com {  module sun {  module star {  module sheet {

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

/** This abstract service is implemented by every page of a
	<type>SpreadsheetDocument</type>.

	@example create and insert a couple of <type scope="com::sun::star::drawing">LineShape</type>s:

	<listing>
	xPage = xDoc.DrawPages(0)
	for x% = 0 to 200
    xShape = xProv.createInstance( "com.sun.star.drawing.LineShape" )
	xShape.LineColor = rgb( 255, 0, n%+20 )
	xShape.LineWidth = 20
	xShape.Position = Point( x%, 2*x% )
	xShape.Size = Size( 300-x%, 20 )
	xPage.add( xShape )
	next x%
	</listing>

    @since OOo 1.1.2
 */
published service SpreadsheetDrawPage
{


	/** manages the <type scope="com::sun::star::drawing">Shape</type>s of this page.

				<p>It also lets you add new <type scope="com::sun::star::drawing">Shape</type>s. The program currently
				requires that these <type scope="com::sun::star::drawing">Shape</type>s be created by the factory of
				the	document.

				@see SpreadsheetDocument
	 */
	interface com::sun::star::drawing::XDrawPage;


	/** With this interface you can group/ungroup a collection of
				<type scope="com::sun::star::drawing">Shape</type>s.
	 */
	interface com::sun::star::drawing::XShapeGrouper;


	/** returns the services implemented by this instance.
	 */
	interface com::sun::star::lang::XServiceInfo;
};

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

}; }; }; };

#endif
