/**************************************************************
 *
 * 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.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;

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

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


// __________ Implementation __________

/** FillStyle and LineStyle demo
    @author Sven Jacobi
 */

public class FillAndLineStyleDemo
{
    public static void main( String args[] )
    {
		XComponent xDrawDoc = null;
		try
		{
            // get the remote office context of a running office (a new office
            // instance is started if necessary)
			com.sun.star.uno.XComponentContext xOfficeContext = Helper.connect();

			// suppress Presentation Autopilot when opening the document
			// properties are the same as described for
			// com.sun.star.document.MediaDescriptor
			PropertyValue[] pPropValues = new PropertyValue[ 1 ];
			pPropValues[ 0 ] = new PropertyValue();
			pPropValues[ 0 ].Name = "Silent";
			pPropValues[ 0 ].Value = new Boolean( true );

			xDrawDoc = Helper.createDocument( xOfficeContext,
				"private:factory/sdraw", "_blank", 0, pPropValues );

			XDrawPage xPage = PageHelper.getDrawPageByIndex( xDrawDoc, 0 );

			XShape xRectangle = ShapeHelper.createShape( xDrawDoc,
				new Point( 0, 0 ),
					new Size( 15000, 12000 ),
						"com.sun.star.drawing.RectangleShape" );

			XShapes xShapes = (XShapes)
					UnoRuntime.queryInterface( XShapes.class, xPage );
			xShapes.add( xRectangle );

			XPropertySet xPropSet = (XPropertySet)
				UnoRuntime.queryInterface( XPropertySet.class, xRectangle );

			/* apply a gradient fill style that goes from top left to bottom
			   right and is changing its color from green to yellow */
			xPropSet.setPropertyValue( "FillStyle",
                                       com.sun.star.drawing.FillStyle.GRADIENT );
			Gradient aGradient = new Gradient();
			aGradient.Style = GradientStyle.LINEAR;
			aGradient.StartColor = 0x00ff00;
			aGradient.EndColor = 0xffff00;
			aGradient.Angle = 450;
			aGradient.Border = 0;
			aGradient.XOffset = 0;
			aGradient.YOffset = 0;
			aGradient.StartIntensity = 100;
			aGradient.EndIntensity = 100;
			aGradient.StepCount = 10;
			xPropSet.setPropertyValue( "FillGradient", aGradient );

			/* create a blue line with dashes and dots */
			xPropSet.setPropertyValue( "LineStyle",
                                       com.sun.star.drawing.LineStyle.DASH );
			LineDash aLineDash = new LineDash();
			aLineDash.Dots = 3;
			aLineDash.DotLen = 150;
			aLineDash.Dashes = 3;
			aLineDash.DashLen = 300;
			aLineDash.Distance = 150;
			xPropSet.setPropertyValue( "LineDash", aLineDash );
			xPropSet.setPropertyValue( "LineColor", new Integer( 0x0000ff ) );
			xPropSet.setPropertyValue( "LineWidth", new Integer( 200 ) );

		}
		catch( Exception ex )
		{
            System.out.println( ex );
		}
		System.exit( 0 );
    }
}
