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



// __________ Imports __________

import com.sun.star.uno.UnoRuntime;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XServiceInfo;

import com.sun.star.awt.Size;

import com.sun.star.beans.XPropertySet;

import com.sun.star.drawing.XDrawPage;
import com.sun.star.drawing.XDrawPages;
import com.sun.star.drawing.XDrawPagesSupplier;
import com.sun.star.drawing.XMasterPageTarget;
import com.sun.star.drawing.XMasterPagesSupplier;

import com.sun.star.presentation.XPresentationPage;
import com.sun.star.presentation.XHandoutMasterSupplier;


public class PageHelper
{
    // __________ static helper methods __________

    // __________ draw pages __________

    /** get the page count for standard pages
	*/
	static public int getDrawPageCount( XComponent xComponent )
	{
		XDrawPagesSupplier xDrawPagesSupplier =
			(XDrawPagesSupplier)UnoRuntime.queryInterface(
				XDrawPagesSupplier.class, xComponent );
		XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
		return xDrawPages.getCount();
	}

    /** get draw page by index
	*/
	static public XDrawPage getDrawPageByIndex( XComponent xComponent, int nIndex )
		throws com.sun.star.lang.IndexOutOfBoundsException,
			com.sun.star.lang.WrappedTargetException
	{
		XDrawPagesSupplier xDrawPagesSupplier =
			(XDrawPagesSupplier)UnoRuntime.queryInterface(
				XDrawPagesSupplier.class, xComponent );
		XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
		return (XDrawPage)UnoRuntime.queryInterface(XDrawPage.class, xDrawPages.getByIndex( nIndex ));
	}

    /** creates and inserts a draw page into the giving position,
		the method returns the new created page
	*/
	static public XDrawPage insertNewDrawPageByIndex( XComponent xComponent, int nIndex )
		throws Exception
	{
		XDrawPagesSupplier xDrawPagesSupplier =
			(XDrawPagesSupplier)UnoRuntime.queryInterface(
				XDrawPagesSupplier.class, xComponent );
		XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
		return xDrawPages.insertNewByIndex( nIndex );
	}

    /** removes the given page
	*/
	static public void removeDrawPage( XComponent xComponent, XDrawPage xDrawPage )
	{
		XDrawPagesSupplier xDrawPagesSupplier =
			(XDrawPagesSupplier)UnoRuntime.queryInterface(
				XDrawPagesSupplier.class, xComponent );
		XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages();
		xDrawPages.remove( xDrawPage );
	}

	/** get size of the given page
	*/
	static public Size getPageSize( XDrawPage xDrawPage )
		throws com.sun.star.beans.UnknownPropertyException,
			com.sun.star.lang.WrappedTargetException
	{
		XPropertySet xPageProperties = (XPropertySet)
			UnoRuntime.queryInterface( XPropertySet.class, xDrawPage );
		return new Size(
			((Integer)xPageProperties.getPropertyValue( "Width" )).intValue(),
			((Integer)xPageProperties.getPropertyValue( "Height" )).intValue() );
	}

    // __________ master pages __________

    /** get the page count for master pages
	*/
	static public int getMasterPageCount( XComponent xComponent )
	{
		XMasterPagesSupplier xMasterPagesSupplier =
			(XMasterPagesSupplier)UnoRuntime.queryInterface(
				XMasterPagesSupplier.class, xComponent );
		XDrawPages xDrawPages = xMasterPagesSupplier.getMasterPages();
		return xDrawPages.getCount();
	}

    /** get master page by index
	*/
	static public XDrawPage getMasterPageByIndex( XComponent xComponent, int nIndex )
		throws com.sun.star.lang.IndexOutOfBoundsException,
			com.sun.star.lang.WrappedTargetException
	{
		XMasterPagesSupplier xMasterPagesSupplier =
			(XMasterPagesSupplier)UnoRuntime.queryInterface(
				XMasterPagesSupplier.class, xComponent );
		XDrawPages xDrawPages = xMasterPagesSupplier.getMasterPages();
		return (XDrawPage)UnoRuntime.queryInterface(XDrawPage.class, xDrawPages.getByIndex( nIndex ));
	}

    /** creates and inserts a new master page into the giving position,
		the method returns the new created page
	*/
	static public XDrawPage insertNewMasterPageByIndex( XComponent xComponent, int nIndex )
	{
		XMasterPagesSupplier xMasterPagesSupplier =
			(XMasterPagesSupplier)UnoRuntime.queryInterface(
				XMasterPagesSupplier.class, xComponent );
		XDrawPages xDrawPages = xMasterPagesSupplier.getMasterPages();
		return xDrawPages.insertNewByIndex( nIndex );
	}

    /** removes the given page
	*/
	static public void removeMasterPage( XComponent xComponent, XDrawPage xDrawPage )
	{
		XMasterPagesSupplier xMasterPagesSupplier =
			(XMasterPagesSupplier)UnoRuntime.queryInterface(
				XMasterPagesSupplier.class, xComponent );
		XDrawPages xDrawPages = xMasterPagesSupplier.getMasterPages();
		xDrawPages.remove( xDrawPage );
	}

    /** return the corresponding masterpage for the giving drawpage
	*/
	static public XDrawPage getMasterPage( XDrawPage xDrawPage )
	{
		XMasterPageTarget xMasterPageTarget =
			(XMasterPageTarget)UnoRuntime.queryInterface(
				XMasterPageTarget.class, xDrawPage );
		return xMasterPageTarget.getMasterPage();
	}

    /** sets given masterpage at the drawpage
	*/
	static public void setMasterPage( XDrawPage xDrawPage, XDrawPage xMasterPage )
	{
		XMasterPageTarget xMasterPageTarget =
			(XMasterPageTarget)UnoRuntime.queryInterface(
				XMasterPageTarget.class, xDrawPage );
		xMasterPageTarget.setMasterPage( xMasterPage );
	}

    // __________ presentation pages __________

	/** test if a Presentation Document is supported.
		This is important, because only presentation documents
		have notes and handout pages
	*/
	static public boolean isImpressDocument( XComponent xComponent )
	{
		XServiceInfo xInfo = (XServiceInfo)UnoRuntime.queryInterface(
				XServiceInfo.class, xComponent );
		return xInfo.supportsService( "com.sun.star.presentation.PresentationDocument" );
	}

    /** in impress documents each normal draw page has a corresponding notes page
	*/
	static public XDrawPage getNotesPage( XDrawPage xDrawPage )
	{
		XPresentationPage aPresentationPage =
			(XPresentationPage)UnoRuntime.queryInterface(
				XPresentationPage.class, xDrawPage );
		return aPresentationPage.getNotesPage();
	}

    /** in impress each documents has one handout page
	*/
	static public XDrawPage getHandoutMasterPage( XComponent xComponent )
	{
		XHandoutMasterSupplier aHandoutMasterSupplier =
			(XHandoutMasterSupplier)UnoRuntime.queryInterface(
				XHandoutMasterSupplier.class, xComponent );
		return aHandoutMasterSupplier.getHandoutMasterPage();
	}
}
