/**************************************************************
 * 
 * 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;
}
