/**************************************************************
 * 
 * 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_presentation_Presentation_idl__ 
#define __com_sun_star_presentation_Presentation_idl__ 
 
#ifndef __com_sun_star_presentation_XPresentation_idl__ 
#include <com/sun/star/presentation/XPresentation.idl> 
#endif 
 
#ifndef __com_sun_star_beans_XPropertySet_idl__ 
#include <com/sun/star/beans/XPropertySet.idl> 
#endif 
 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module presentation {  
 
//============================================================================= 
 
/** This service is a presentation that is available from a 
	<type>PresentationDocument</type> via the 
	<type>XPresentationSupplier</type> interface.
 */
published service Presentation
{ 
	/** lets you start and stop a presentation.  
			 
		<p>It also gives you access to the more advanced features, like 
		rehearse timing and the live modes.
	 */
	interface com::sun::star::presentation::XPresentation; 

	//------------------------------------------------------------------------- 
 
	/** This is the standard interface for access to the properties from this 
		service.
	 */
	interface com::sun::star::beans::XPropertySet; 
 
	//------------------------------------------------------------------------- 
	 
	/** enables/disables the shape animations.
	 */
	[property] boolean AllowAnimations; 
 
	//------------------------------------------------------------------------- 
	 
	/** If this string is not empty, it contains the name of a customized
		show that is used for the presentation.
	 */
	[property] string CustomShow; 
 
	//------------------------------------------------------------------------- 
	 
	/** If this string is not empty, it contains the name of the page where
		the presentation is started.
	 */
	[property] string FirstPage; 
 
	//------------------------------------------------------------------------- 
	 
	/** If this property is set to <TRUE/>, the window of the presentation is 
		always on top of all other windows.
	 */
	[property] boolean IsAlwaysOnTop; 
 
	//------------------------------------------------------------------------- 
	 
	/** If this property is <TRUE/>, all pages are changed automatically.
		
		<p>This overrides the properties of the pages.</p>
	 */
	[property] boolean IsAutomatic; 
 
	//------------------------------------------------------------------------- 
	 
	/** If this property is set to <TRUE/>, the presentation is repeated
		endlessly.
	 */
	[property] boolean IsEndless; 
 
	//------------------------------------------------------------------------- 
	 
	/** If this property is set to <TRUE/>, the presentation runs in
		full-screen mode.
	 */
	[property] boolean IsFullScreen; 
 
	//------------------------------------------------------------------------- 
	 
	/** With this property, you can set the presentation to live mode.
		<p>Implementations that have no live mode capability may ignore this
		property and always return false.
	 */
	[property] boolean IsLivePresentation; 
 
	//------------------------------------------------------------------------- 
	 
	/** If this property is <TRUE/>, the mouse is visible during the
		presentation.
	 */
	[property] boolean IsMouseVisible; 
 
	//------------------------------------------------------------------------- 
	 
	/** is the duration of the black screen after the 
		presentation has finished.
		
		<p>If this is set to <literal>0</literal>, no black screen is shown.</p>
	 */
	[property] long Pause; 
 
	//------------------------------------------------------------------------- 
	 
	/** If this is set to <TRUE/>, the Navigator is opened at the start of the
		presentation.
	 */
	[property] boolean StartWithNavigator; 
 
	//------------------------------------------------------------------------- 
	 
	/** If this is <TRUE/>, a pen is shown during presentation.

		<p>You can draw on the presentation with this pen.</p>
	 */
	[property] boolean UsePen; 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
