/**************************************************************
 * 
 * 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_awt_XRegion_idl__ 
#define __com_sun_star_awt_XRegion_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_awt_Rectangle_idl__ 
#include <com/sun/star/awt/Rectangle.idl> 
#endif 


//============================================================================= 
 
 module com {  module sun {  module star {  module awt {  
 
//============================================================================= 
 
/** manages multiple rectangles which make up a region.
 */
published interface XRegion: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
	 
	/** returns the bounding box of the shape.
	 */
	Rectangle getBounds(); 
 
	//------------------------------------------------------------------------- 
		
	/** makes this region an empty region.
	 */
	[oneway] void clear(); 
 
	//------------------------------------------------------------------------- 
		
	/** moves this region by the specified horizontal and vertical delta.
	 */
	[oneway] void move( [in] long nHorzMove, 
			 [in] long nVertMove ); 
 
	//------------------------------------------------------------------------- 
		
	/** adds the specified rectangle to this region.
	 */
	[oneway] void unionRectangle( [in] Rectangle Rect ); 
 
	//------------------------------------------------------------------------- 
		
	/** intersects the specified rectangle with the current region.
	 */
	[oneway] void intersectRectangle( [in] Rectangle Region ); 
 
	//------------------------------------------------------------------------- 
		
	/** removes the area of the specified rectangle from this region.
	 */
	[oneway] void excludeRectangle( [in] Rectangle Rect ); 
 
	//------------------------------------------------------------------------- 
		
	/** applies an exclusive-or operation with the specified rectangle
        to this region.
	 */
	[oneway] void xOrRectangle( [in] Rectangle Rect ); 
 
	//------------------------------------------------------------------------- 
		
	/** adds the specified region to this region.
	 */
	[oneway] void unionRegion( [in] XRegion Region ); 
 
	//------------------------------------------------------------------------- 
		
	/** intersects the specified region with the current region.
	 */
	[oneway] void intersectRegion( [in] XRegion Region ); 
 
	//------------------------------------------------------------------------- 
		
	/** removes the area of the specified region from this region.
	 */
	[oneway] void excludeRegion( [in] XRegion Region ); 
 
	//------------------------------------------------------------------------- 
		
	/** applies an exclusive-or operation with the specified region
        to this region.
	 */
	[oneway] void xOrRegion( [in] XRegion Region ); 
 
	//------------------------------------------------------------------------- 
	 
	/** returns all rectangles which are making up this region.
	 */
	sequence<Rectangle> getRectangles(); 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
