/**************************************************************
 *
 * 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 static org.junit.Assert.*;
import static testlib.uno.GraphicUtil.getSizePixelOfGraphicFile;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openoffice.test.uno.UnoApp;
import org.openoffice.test.common.FileUtil;
import org.openoffice.test.common.Testspace;

import com.sun.star.beans.Property;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.UnknownPropertyException;
import com.sun.star.beans.XPropertySet;
import com.sun.star.beans.XPropertySetInfo;
import com.sun.star.drawing.XDrawPage;
import com.sun.star.drawing.XShape;
import com.sun.star.drawing.XShapes;
import com.sun.star.graphic.XGraphic;
import com.sun.star.graphic.XGraphicObject;
import com.sun.star.graphic.XGraphicProvider;
import com.sun.star.lang.WrappedTargetException;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XServiceName;
import com.sun.star.uno.Exception;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.awt.Point;
import com.sun.star.awt.Size;
//import com.sun.star.uno.AnyConverter;

public class GraphicUtil {

	public static String getUniqueIDbyXGraphic(UnoApp unoApp, XGraphic xgraphic) throws Exception{
		Object graphicObj = unoApp.getServiceFactory().createInstance("com.sun.star.graphic.GraphicObject");
		XGraphicObject xgraphicObj = (XGraphicObject)UnoRuntime.queryInterface(XGraphicObject.class, graphicObj);
		xgraphicObj.setGraphic(xgraphic);

		return xgraphicObj.getUniqueID();
	}

//	String sUrl = "file:///F:/work/36.gif";
	public static String getUniqueIDOfGraphicFile(UnoApp unoApp, String sUrl) throws Exception{
		XGraphic xgraphic = getXGraphicOfGraphicFile(unoApp,sUrl);
		String uniqueID = getUniqueIDbyXGraphic(unoApp, xgraphic);

		return uniqueID;
	}

	public static XGraphic getXGraphicOfGraphicFile(UnoApp unoApp, String sUrl) throws Exception
	{
		Object graphicObj = unoApp.getServiceFactory().createInstance("com.sun.star.graphic.GraphicProvider");
		XGraphicProvider xgraphicProvider = (XGraphicProvider)UnoRuntime.queryInterface(XGraphicProvider.class, graphicObj);
		PropertyValue[] sourceProps = new PropertyValue[1];
		sourceProps[0]       = new PropertyValue();
		sourceProps[0].Name  = "URL";
		sourceProps[0].Value = sUrl;
		return xgraphicProvider.queryGraphic(sourceProps);
	}

	public static Size getSize100thMMOfGraphicFile(UnoApp unoApp, String sUrl) throws Exception
	{
		Object graphicObj = unoApp.getServiceFactory().createInstance("com.sun.star.graphic.GraphicProvider");
		XGraphicProvider xgraphicProvider = (XGraphicProvider)UnoRuntime.queryInterface(XGraphicProvider.class, graphicObj);
		PropertyValue[] sourceProps = new PropertyValue[1];
		sourceProps[0]       = new PropertyValue();
		sourceProps[0].Name  = "URL";
		sourceProps[0].Value = sUrl;
		XPropertySet xGraphicPro = xgraphicProvider.queryGraphicDescriptor(sourceProps);
		Size size = (Size)xGraphicPro.getPropertyValue("Size100thMM");
		return size;
	}

	public static Size getSizePixelOfGraphicFile(UnoApp unoApp, String sUrl) throws Exception
	{
		Object graphicObj = unoApp.getServiceFactory().createInstance("com.sun.star.graphic.GraphicProvider");
		XGraphicProvider xgraphicProvider = (XGraphicProvider)UnoRuntime.queryInterface(XGraphicProvider.class, graphicObj);
		PropertyValue[] sourceProps = new PropertyValue[1];
		sourceProps[0]       = new PropertyValue();
		sourceProps[0].Name  = "URL";
		sourceProps[0].Value = sUrl;
		XPropertySet xGraphicPro = xgraphicProvider.queryGraphicDescriptor(sourceProps);
		Size size = (Size)xGraphicPro.getPropertyValue("SizePixel");
		return size;
	}


	//GraphicObjectShape
	public static Object[] getGraphicsOfPage(XDrawPage xDrawPage) throws Exception {
		XShapes m_xdrawShapes = (XShapes) UnoRuntime.queryInterface(XShapes.class, xDrawPage);
		int count = m_xdrawShapes.getCount();
		Object[] temp = new Object[count];
		int graphicNum=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("com.sun.star.drawing.GraphicObjectShape"))
			{
				temp[graphicNum] = shape;
				graphicNum++;
			}
		}

		Object[] graphics = new Object[graphicNum];
		System.arraycopy(temp, 0, graphics, 0, graphicNum);
		return graphics;
	}

	/*Insert a graphic into a Impress
	 * component: the Impress document
	 * toPage: the page that the graphic will be inserted to
	 * graphicURL: the file path of the graphic, e.g. file:///c:/test.png
	 * size: size of the graphic to be inserted
	 * position: position of the graphic to be inserted
	 * */
	public static void insertGraphic(XComponent component, XDrawPage toPage, String graphicURL, Size size, Point position) throws Exception
	{
		XMultiServiceFactory xDrawFactory =
	            (XMultiServiceFactory)UnoRuntime.queryInterface(
	                XMultiServiceFactory.class, component);

	    Object oGraphic = xDrawFactory.createInstance("com.sun.star.drawing.GraphicObjectShape");
	    XPropertySet xGraphicPro = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, oGraphic);
	    xGraphicPro.setPropertyValue("GraphicURL", graphicURL);

	    XShape xDrawShape = (XShape)UnoRuntime.queryInterface(XShape.class, oGraphic);

	    xDrawShape.setSize(size);
	    xDrawShape.setPosition(position);

	    toPage.add(xDrawShape);
	}

}
