/**************************************************************
 * 
 * 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 java.util.HashMap;

import org.openoffice.test.common.Testspace;

import com.sun.star.beans.PropertyValue;
import com.sun.star.container.XIndexAccess;
import com.sun.star.drawing.XDrawPage;
import com.sun.star.drawing.XDrawPagesSupplier;
import com.sun.star.drawing.XShape;
import com.sun.star.drawing.XShapes;
import com.sun.star.frame.XStorable;
import com.sun.star.lang.XComponent;
import com.sun.star.uno.Exception;
import com.sun.star.uno.UnoRuntime;

/**
 * 
 *
 */
public class SDUtil {

	private static HashMap filterName = new HashMap(); 
	
	private SDUtil() {

	}

	public static Object getPageByIndex(XComponent doc, int index) throws Exception {
		XDrawPagesSupplier xDrawPagesSupplier = (XDrawPagesSupplier) UnoRuntime.queryInterface(XDrawPagesSupplier.class, doc);
		Object drawPages = xDrawPagesSupplier.getDrawPages();
		XIndexAccess xIndexedDrawPages = (XIndexAccess) UnoRuntime.queryInterface(XIndexAccess.class, drawPages);
		return xIndexedDrawPages.getByIndex(index);
	}

	public static Object getShapeOfPageByIndex(Object page, int index) throws Exception {
		XDrawPage xDrawPage = (XDrawPage) UnoRuntime.queryInterface(XDrawPage.class, page);
		XShapes m_xdrawShapes = (XShapes) UnoRuntime.queryInterface(XShapes.class, xDrawPage);
		return m_xdrawShapes.getByIndex(index);
	}
	
	public static Object[] getShapesOfPageByType(XDrawPage xDrawPage, String shapeType) throws Exception {
		XShapes m_xdrawShapes = (XShapes) UnoRuntime.queryInterface(XShapes.class, xDrawPage);
		int count = m_xdrawShapes.getCount();
		Object[] temp = new Object[count];
		int shapeNum=0;
		for(int i=0;i<count; i++)
		{
			Object shape = m_xdrawShapes.getByIndex(i);
			XShape xshape = (XShape)UnoRuntime.queryInterface(XShape.class, shape);		
			String type = xshape.getShapeType();
			if(type.equals(shapeType))
			{
				temp[shapeNum] = shape;
				shapeNum++;				
			}
		}
		
		Object[] shapes = new Object[shapeNum];
		System.arraycopy(temp, 0, shapes, 0, shapeNum);
		return shapes;
	} 
	
	public static void saveFileAs(XComponent sdComponent, String fileName, String extName) throws Exception {
		
		initFilterName();

		String storeUrl = Testspace.getUrl("temp/" + fileName + "." + extName);
		
		PropertyValue[] storeProps = new PropertyValue[2];
		storeProps[0] = new PropertyValue();
		storeProps[0].Name = "FilterName";
		storeProps[0].Value = filterName.get(extName);
		storeProps[1] = new PropertyValue();
		storeProps[1].Name = "Overwrite";
		storeProps[1].Value = new Boolean(true);
		
		XStorable sdStorable = 
				(XStorable) UnoRuntime.queryInterface(XStorable.class, sdComponent);
		sdStorable.storeAsURL(storeUrl, storeProps);
	}
	
	private static void initFilterName() throws Exception {
		if (filterName.size() > 0) {
			return;
		}
		
		filterName.put("odp", "impress8");
		filterName.put("ppt", "MS PowerPoint 97");
	}

}
