/**************************************************************
 *
 * 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.
 *
 *************************************************************/
package testlib.uno;

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 PageUtil {
	/**
	 * Get the page count for standard pages
	 *
	 * @param xComponent
	 *            : The presentation document
	 * @return slide count
	 */
	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
	 *
	 * @param xComponent
	 *            : The presentation document
	 * @param nIndex
	 *            : index of slide pages, from 0 or 1?
	 * @return Page of corresponding 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));
	}

	/**
	 * Create and insert a draw page into the giving position,the method returns
	 * the new created page
	 *
	 * @param xComponent
	 *            :The Presentation Document
	 * @param nIndex
	 *            :The index at which page will be inserted.
	 * @return The newly 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);
	}

	/**
	 * Remove the given page
	 *
	 * @param xComponent
	 *            : The Presentation Document
	 * @param xDrawPage
	 *            : The page want to be removed.
	 */
	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
	 *
	 * @param xDrawPage
	 *            : The specified target page
	 * @return specifies the 2-dimensional size of the page using width and
	 *         height.
	 */
	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());
	}

	/**
	 * Get the page count for master pages
	 *
	 * @param xComponent
	 *            : The presentation document
	 * @return Count of 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
	 *
	 * @param xComponent
	 *            : The Presentation document
	 * @param nIndex
	 *            : Index of target master page.
	 * @return Page of
	 */
	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();
	}
}
