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

import java.util.Random;
import java.util.Date;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.Type;
import com.sun.star.uno.XInterface;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.document.XEmbeddedObjectSupplier;
import com.sun.star.awt.Rectangle;
import com.sun.star.beans.XPropertySet;
import com.sun.star.beans.PropertyValue;

import com.sun.star.container.*;
import com.sun.star.chart.*;
import com.sun.star.table.*;
import com.sun.star.sheet.*;

import com.sun.star.script.provider.XScriptContext;

public class MemoryUsage
{
    // public void updateMemoryUsage(XScriptContext ctxt, ActionEvent evt)
    public void updateMemoryUsage(XScriptContext ctxt)
        throws Exception
    {
        XSpreadsheet sheet = createSpreadsheet(ctxt);

        Runtime runtime = Runtime.getRuntime();
        Random generator = new Random();
        Date date = new Date();

        // allocate a random amount of memory
        int len = (int)(generator.nextFloat() * runtime.freeMemory() / 5);
        byte[] bytes = new byte[len];

        addData(sheet, date.toString(),
            runtime.totalMemory(), runtime.freeMemory());

        addChart(sheet);
    }

    private XSpreadsheet createSpreadsheet(XScriptContext ctxt)
        throws Exception
    {
        XComponentLoader loader = (XComponentLoader)
            UnoRuntime.queryInterface(
                XComponentLoader.class, ctxt.getDesktop());

        XComponent comp = loader.loadComponentFromURL(
            "private:factory/scalc", "_blank", 4, new PropertyValue[0]);

        XSpreadsheetDocument doc = (XSpreadsheetDocument)
            UnoRuntime.queryInterface(XSpreadsheetDocument.class, comp);

        XIndexAccess index = (XIndexAccess)
            UnoRuntime.queryInterface(XIndexAccess.class, doc.getSheets());

        XSpreadsheet sheet = (XSpreadsheet) AnyConverter.toObject(
            new Type(com.sun.star.sheet.XSpreadsheet.class), index.getByIndex(0));

        return sheet;
    }

    private void addData(
        XSpreadsheet sheet, String date, long total, long free)
        throws Exception
    {
        sheet.getCellByPosition(0, 0).setFormula("Used");
        sheet.getCellByPosition(0, 1).setFormula("Free");
        sheet.getCellByPosition(0, 2).setFormula("Total");

        sheet.getCellByPosition(1, 0).setValue(total - free);
        sheet.getCellByPosition(1, 1).setValue(free);
        sheet.getCellByPosition(1, 2).setValue(total);
    }

    private void addChart(XSpreadsheet sheet)
        throws Exception
    {
        Rectangle rect = new Rectangle();
        rect.X = 500;
        rect.Y = 3000;
        rect.Width = 10000;
        rect.Height = 8000;

        XCellRange range = (XCellRange)
            UnoRuntime.queryInterface(XCellRange.class, sheet);

        XCellRange myRange =
            range.getCellRangeByName("A1:B2");

        XCellRangeAddressable rangeAddr = (XCellRangeAddressable)
            UnoRuntime.queryInterface(XCellRangeAddressable.class, myRange);

        CellRangeAddress myAddr = rangeAddr.getRangeAddress();

        CellRangeAddress[] addr = new CellRangeAddress[1];
        addr[0] = myAddr;

        XTableChartsSupplier supp = (XTableChartsSupplier)
            UnoRuntime.queryInterface( XTableChartsSupplier.class, sheet);

        XTableCharts charts = supp.getCharts();
        charts.addNewByName("Example", rect, addr, false, true);

        try { Thread.sleep(3000); } catch (java.lang.InterruptedException e) { }

        // get the diagram and Change some of the properties
        XNameAccess chartsAccess = (XNameAccess)
            UnoRuntime.queryInterface( XNameAccess.class, charts);

        XTableChart tchart = (XTableChart)
            UnoRuntime.queryInterface(
                XTableChart.class, chartsAccess.getByName("Example"));

        XEmbeddedObjectSupplier eos = (XEmbeddedObjectSupplier)
            UnoRuntime.queryInterface( XEmbeddedObjectSupplier.class, tchart );

        XInterface xifc = eos.getEmbeddedObject();

        XChartDocument xChart = (XChartDocument)
            UnoRuntime.queryInterface(XChartDocument.class, xifc);

        XMultiServiceFactory xDocMSF = (XMultiServiceFactory)
            UnoRuntime.queryInterface(XMultiServiceFactory.class, xChart);

        Object diagObject =
            xDocMSF.createInstance("com.sun.star.chart.PieDiagram");

        XDiagram xDiagram = (XDiagram)
            UnoRuntime.queryInterface(XDiagram.class, diagObject);

        xChart.setDiagram(xDiagram);

        XPropertySet propset = (XPropertySet)
            UnoRuntime.queryInterface( XPropertySet.class, xChart.getTitle() );
        propset.setPropertyValue("String", "JVM Memory Usage");
    }
}
