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

import com.sun.star.awt.Point;
import com.sun.star.awt.Size;

import com.sun.star.beans.XPropertySet;

import com.sun.star.container.XEnumeration;
import com.sun.star.container.XEnumerationAccess;

import com.sun.star.drawing.XShape;
import com.sun.star.drawing.XShapes;

import com.sun.star.text.ControlCharacter;
import com.sun.star.text.XText;
import com.sun.star.text.XTextCursor;
import com.sun.star.text.XTextContent;
import com.sun.star.text.XTextRange;


public class ShapeHelper
{
    // __________ static helper methods __________
	// 
	public static XPropertySet createAndInsertShape( XComponent xDrawDoc,
			XShapes xShapes, Point aPos, Size aSize, String sShapeType )
		throws java.lang.Exception
	{
		XShape xShape = createShape( xDrawDoc, aPos, aSize, sShapeType );
		xShapes.add( xShape );
		XPropertySet xPropSet = (XPropertySet)
			UnoRuntime.queryInterface( XPropertySet.class, xShape );
		return xPropSet;
	}

    /** create a Shape
	*/
	public static XShape createShape( XComponent xDrawDoc,
			Point aPos, Size aSize, String sShapeType )
		throws java.lang.Exception
	{
		XShape xShape = null;
		XMultiServiceFactory xFactory =
			(XMultiServiceFactory )UnoRuntime.queryInterface(
				XMultiServiceFactory.class, xDrawDoc );
		Object xObj = xFactory.createInstance( sShapeType );
		xShape = (XShape)UnoRuntime.queryInterface(
			XShape.class, xObj );
		xShape.setPosition( aPos );
		xShape.setSize( aSize );
		return xShape;
	}

	/**
        add text to a shape. the return value is the PropertySet
        of the text range that has been added
	*/
	public static XPropertySet addPortion( XShape xShape, String sText, boolean bNewParagraph )
		throws com.sun.star.lang.IllegalArgumentException
	{
		XText xText = (XText)
			UnoRuntime.queryInterface( XText.class, xShape );

		XTextCursor xTextCursor = xText.createTextCursor();
		xTextCursor.gotoEnd( false );
		if ( bNewParagraph == true )
		{
			xText.insertControlCharacter( xTextCursor, ControlCharacter.PARAGRAPH_BREAK, false );
			xTextCursor.gotoEnd( false );
		}
		XTextRange xTextRange = (XTextRange)
			UnoRuntime.queryInterface( XTextRange.class, xTextCursor );
		xTextRange.setString( sText );
		xTextCursor.gotoEnd( true );
		XPropertySet xPropSet = (XPropertySet)
			UnoRuntime.queryInterface( XPropertySet.class, xTextRange );
		return xPropSet;
	}

	public static void setPropertyForLastParagraph( XShape xText, String sPropName,
		Object aValue )
			throws com.sun.star.beans.UnknownPropertyException,
				com.sun.star.beans.PropertyVetoException,
					com.sun.star.lang.IllegalArgumentException,
						com.sun.star.lang.WrappedTargetException,
							com.sun.star.container.NoSuchElementException
	{
		XEnumerationAccess xEnumerationAccess = (XEnumerationAccess)
			UnoRuntime.queryInterface( XEnumerationAccess.class, xText );
		if ( xEnumerationAccess.hasElements() )
		{
			XEnumeration xEnumeration = xEnumerationAccess.createEnumeration();
			while( xEnumeration.hasMoreElements () )
			{
				Object xObj = xEnumeration.nextElement();
				if ( xEnumeration.hasMoreElements() == false )
				{
					XTextContent xTextContent = (XTextContent)UnoRuntime.queryInterface(
						XTextContent.class, xObj );
					XPropertySet xParaPropSet = (XPropertySet)
						UnoRuntime.queryInterface( XPropertySet.class, xTextContent );
					xParaPropSet.setPropertyValue( sPropName, aValue );
				}
			}
		}
	}
}
