/**************************************************************
 * 
 * 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_text_XPagePrintable_idl__
#define __com_sun_star_text_XPagePrintable_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

#ifndef __com_sun_star_beans_PropertyValue_idl__
#include <com/sun/star/beans/PropertyValue.idl>
#endif

#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif


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

 module com {  module sun {  module star {  module text {

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

/** Print several pages on one printer page.
 */
published interface XPagePrintable: com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------

	/** @returns the settings of printing of pages.
			 <p>
			 These settings contains:
			<UL>
				<LI><P>short PageRows  - number of rows of pages printed to one page  </P>
				<LI><P>short PageColumns - number of columns of pages printed to one page</P>
				<LI><P>long LeftMargin  - left margin of the page</P>
				<LI><P>long RightMargin - right margin of the page</P>
				<LI><P>long TopMargin   - top margin of the page</P>
				<LI><P>long BottomMargin - bottom margin of the page</P>
				<LI><P>long HoriMargin  - margin between rows of pages</P>
				<LI><P>long VertMargin  - margin between columns of pages</P>
				<LI><P>boolean IsLandscape - determins if the output page is printed in landscape format</P>
			</UL>
			 </p>
	 */
	sequence<com::sun::star::beans::PropertyValue> getPagePrintSettings();

	//-------------------------------------------------------------------------
        /** adjusts the settings of the page printing.
            @see getPagePrintSettings
	 */
	void setPagePrintSettings( [in] sequence<com::sun::star::beans::PropertyValue> aSettings );

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

	// DocMerge from xml: method com::sun::star::text::XPagePrintable::printPages
    /** prints the pages according to the <typ>PagePrintSettings</type>.

	@see com::sun::star::view::PrintOptions
	 */
	void printPages( [in] sequence<com::sun::star::beans::PropertyValue> xOptions )
			raises( com::sun::star::lang::IllegalArgumentException );

};

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

}; }; }; };


#endif
