/**************************************************************
 *
 * 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 __________

// base classes
import com.sun.star.uno.XInterface;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.lang.*;

// property access
import com.sun.star.beans.*;

// application specific classes
import com.sun.star.chart.*;
import com.sun.star.drawing.*;

import com.sun.star.table.CellRangeAddress;
import com.sun.star.frame.XModel;
import com.sun.star.frame.XController;

import com.sun.star.util.XNumberFormatsSupplier;
import com.sun.star.util.XNumberFormats;

// base graphics things
import com.sun.star.awt.Point;
import com.sun.star.awt.Size;
import com.sun.star.awt.Rectangle;
import com.sun.star.awt.FontWeight;
import com.sun.star.awt.FontRelief;

// Exceptions
import com.sun.star.uno.Exception;
import com.sun.star.uno.RuntimeException;
import com.sun.star.beans.UnknownPropertyException;
import com.sun.star.lang.IndexOutOfBoundsException;
import com.sun.star.util.MalformedNumberFormatException;


// __________ Implementation __________

/** Create a spreadsheet add some data and add a chart
    @author Bj&ouml;rn Milcke
 */
public class ChartInDraw
{
    // ____________________

    public static void main( String args[] )
    {
        Helper aHelper = new Helper( args );

        ChartHelper aChartHelper = new ChartHelper( aHelper.createDrawingDocument());

        // the unit for measures is 1/100th of a millimeter
        // position at (1cm, 1cm)
        Point aPos    = new Point( 1000, 1000 );

        // size of the chart is 15cm x 12cm
        Size  aExtent = new Size( 15000, 13000 );

        // insert a new chart into the "Chart" sheet of the
        // spreadsheet document
        XChartDocument aChartDoc = aChartHelper.insertOLEChartInDraw(
            "BarChart",
            aPos,
            aExtent,
            "com.sun.star.chart.BarDiagram" );

        // instantiate test class with newly created chart
        ChartInDraw aTest   = new ChartInDraw( aChartDoc );

        try
        {
            aTest.lockControllers();

            aTest.testArea();
            aTest.testWall();
            aTest.testTitle();
            aTest.testLegend();
            aTest.testThreeD();

            aTest.unlockControllers();
        }
        catch( Exception ex )
        {
            System.out.println( "UNO Exception caught: " + ex );
            System.out.println( "Message: " + ex.getMessage() );
        }

        System.exit( 0 );
    }


    // ________________________________________

    public ChartInDraw( XChartDocument aChartDoc )
    {
        maChartDocument = aChartDoc;
        maDiagram       = maChartDocument.getDiagram();
    }

    // ____________________

    public void lockControllers()
        throws RuntimeException
    {
        ((XModel) UnoRuntime.queryInterface( XModel.class, maChartDocument )).lockControllers();
    }

    // ____________________

    public void unlockControllers()
        throws RuntimeException
    {
        ((XModel) UnoRuntime.queryInterface( XModel.class, maChartDocument )).unlockControllers();
    }

    // ____________________

    public void testArea()
        throws RuntimeException, UnknownPropertyException, PropertyVetoException,
               com.sun.star.lang.IllegalArgumentException, WrappedTargetException
    {
        XPropertySet   aArea = maChartDocument.getArea();

        if( aArea != null )
        {
            // change background color of entire chart
            aArea.setPropertyValue( "FillStyle", FillStyle.SOLID );
            aArea.setPropertyValue( "FillColor", new Integer( 0xeeeeee ));
        }
    }

    // ____________________

    public void testWall()
        throws RuntimeException, UnknownPropertyException, PropertyVetoException,
               com.sun.star.lang.IllegalArgumentException, WrappedTargetException
    {
        XPropertySet aWall = ((X3DDisplay) UnoRuntime.queryInterface(
                                  X3DDisplay.class, maDiagram )).getWall();

        // change background color of area
        aWall.setPropertyValue( "FillColor", new Integer( 0xcccccc ));
        aWall.setPropertyValue( "FillStyle",  FillStyle.SOLID );
    }

    // ____________________

    public void testTitle()
        throws RuntimeException, UnknownPropertyException, PropertyVetoException,
               com.sun.star.lang.IllegalArgumentException, WrappedTargetException
    {
        // change main title
        XPropertySet aDocProp = (XPropertySet) UnoRuntime.queryInterface(
            XPropertySet.class, maChartDocument );
        aDocProp.setPropertyValue( "HasMainTitle", new Boolean( true ));

        XShape aTitle = maChartDocument.getTitle();
        XPropertySet aTitleProp = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, aTitle );

        // set new text
        if( aTitleProp != null )
        {
            aTitleProp.setPropertyValue( "String", "Bar Chart in a Draw Document" );
        }
    }

    // ____________________

    public void testLegend()
        throws RuntimeException, UnknownPropertyException, PropertyVetoException,
               com.sun.star.lang.IllegalArgumentException, WrappedTargetException
    {
        XShape aLegend = maChartDocument.getLegend();
        XPropertySet aLegendProp = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, aLegend );

        aLegendProp.setPropertyValue( "Alignment", ChartLegendPosition.LEFT );
        aLegendProp.setPropertyValue( "FillStyle", FillStyle.SOLID );
        aLegendProp.setPropertyValue( "FillColor", new Integer( 0xeeddee ));
    }

    // ____________________

    public void testThreeD()
        throws RuntimeException, UnknownPropertyException, PropertyVetoException,
        com.sun.star.lang.IllegalArgumentException, WrappedTargetException,
        com.sun.star.lang.IndexOutOfBoundsException
    {
        XPropertySet aDiaProp = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, maDiagram );
        Boolean aTrue = new Boolean( true );

        aDiaProp.setPropertyValue( "Dim3D", aTrue );
        aDiaProp.setPropertyValue( "Deep", aTrue );
        // from Chart3DBarProperties:
        aDiaProp.setPropertyValue( "SolidType", new Integer( ChartSolidType.CYLINDER ));

        // change floor color to Magenta6
        XPropertySet aFloor = ((X3DDisplay) UnoRuntime.queryInterface(
                                   X3DDisplay.class, maDiagram )).getFloor();
        aFloor.setPropertyValue( "FillColor", new Integer( 0x6b2394 ));

        // apply changes to get a 3d scene
        unlockControllers();
        lockControllers();


        // rotate scene to a different angle
        HomogenMatrix aMatrix = new HomogenMatrix();
        HomogenMatrixLine aLines[] = new HomogenMatrixLine[]
            {
                new HomogenMatrixLine( 1.0, 0.0, 0.0, 0.0 ),
                new HomogenMatrixLine( 0.0, 1.0, 0.0, 0.0 ),
                new HomogenMatrixLine( 0.0, 0.0, 1.0, 0.0 ),
                new HomogenMatrixLine( 0.0, 0.0, 0.0, 1.0 )
            };

        aMatrix.Line1 = aLines[ 0 ];
        aMatrix.Line2 = aLines[ 1 ];
        aMatrix.Line3 = aLines[ 2 ];
        aMatrix.Line4 = aLines[ 3 ];

        // rotate 10 degrees along the x axis
        double fAngle = 10.0;
        double fCosX = java.lang.Math.cos( java.lang.Math.PI / 180.0 * fAngle );
        double fSinX = java.lang.Math.sin( java.lang.Math.PI / 180.0 * fAngle );

        // rotate -20 degrees along the y axis
        fAngle = -20.0;
        double fCosY = java.lang.Math.cos( java.lang.Math.PI / 180.0 * fAngle );
        double fSinY = java.lang.Math.sin( java.lang.Math.PI / 180.0 * fAngle );

        // rotate -5 degrees along the z axis
        fAngle = -5.0;
        double fCosZ = java.lang.Math.cos( java.lang.Math.PI / 180.0 * fAngle );
        double fSinZ = java.lang.Math.sin( java.lang.Math.PI / 180.0 * fAngle );

        aMatrix.Line1.Column1 =  fCosY *  fCosZ;
        aMatrix.Line1.Column2 =  fCosY * -fSinZ;
        aMatrix.Line1.Column3 =  fSinY;

        aMatrix.Line2.Column1 =  fSinX *  fSinY *  fCosZ +  fCosX *  fSinZ;
        aMatrix.Line2.Column2 = -fSinX *  fSinY *  fSinZ +  fCosX *  fCosZ;
        aMatrix.Line2.Column3 = -fSinX *  fCosY;

        aMatrix.Line3.Column1 = -fCosX *  fSinY *  fCosZ +  fSinX *  fSinZ;
        aMatrix.Line3.Column2 =  fCosX *  fSinY *  fSinZ +  fSinX *  fCosZ;
        aMatrix.Line3.Column3 =  fCosX *  fCosY;

        aDiaProp.setPropertyValue( "D3DTransformMatrix", aMatrix );

        // add a red light source

        // in a chart by default only the second (non-specular) light source is switched on
        // light source 1 is a specular light source
        aDiaProp.setPropertyValue( "D3DSceneLightColor1", new Integer( 0xff3333 ));

        // set direction
        com.sun.star.drawing.Direction3D aDirection = new com.sun.star.drawing.Direction3D();

        aDirection.DirectionX = -0.75;
        aDirection.DirectionY =  0.5;
        aDirection.DirectionZ =  0.5;

        aDiaProp.setPropertyValue( "D3DSceneLightDirection1", aDirection );
        aDiaProp.setPropertyValue( "D3DSceneLightOn1", new Boolean( true ));
    }

    // ______________________________
    //
    // private members
    // ______________________________

    private XChartDocument maChartDocument;
    private XDiagram       maDiagram;
}
