/**************************************************************
 * 
 * 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 com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.uno.XComponentContext;
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.container.XEnumeration;
import com.sun.star.container.XEnumerationAccess;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XController;
import com.sun.star.frame.XModel;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.sheet.XCellAddressable;
import com.sun.star.sheet.XCellRangesQuery;
import com.sun.star.sheet.XSheetCellRanges;
import com.sun.star.sheet.XSpreadsheet;
import com.sun.star.sheet.XSpreadsheetDocument;
import com.sun.star.sheet.XSpreadsheetView;
import com.sun.star.sheet.XSpreadsheets;
import com.sun.star.table.XCell;
import com.sun.star.uno.UnoRuntime;
 
public class FirstLoadComponent {
 
    /** Creates a new instance of FirstLoadComponent */
    public FirstLoadComponent() {
    }
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            // get the remote office component context
            XComponentContext xRemoteContext = Bootstrap.bootstrap();
            if (xRemoteContext == null) {
                System.err.println("ERROR: Could not bootstrap default Office.");
            }
 
            XMultiComponentFactory xRemoteServiceManager = xRemoteContext.getServiceManager();
 
            Object desktop = xRemoteServiceManager.createInstanceWithContext(
                "com.sun.star.frame.Desktop", xRemoteContext);
            XComponentLoader xComponentLoader = (XComponentLoader)
                UnoRuntime.queryInterface(XComponentLoader.class, desktop);
 
            PropertyValue[] loadProps = new PropertyValue[0];
            XComponent xSpreadsheetComponent = xComponentLoader.loadComponentFromURL("private:factory/scalc", "_blank", 0, loadProps);
 
            XSpreadsheetDocument xSpreadsheetDocument = (XSpreadsheetDocument)
                UnoRuntime.queryInterface(XSpreadsheetDocument.class,
                                          xSpreadsheetComponent);
 
            XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets();
            xSpreadsheets.insertNewByName("MySheet", (short)0);
            com.sun.star.uno.Type elemType = xSpreadsheets.getElementType();
 
            System.out.println(elemType.getTypeName());
            Object sheet = xSpreadsheets.getByName("MySheet");
            XSpreadsheet xSpreadsheet = (XSpreadsheet)UnoRuntime.queryInterface(
                XSpreadsheet.class, sheet);
 
            XCell xCell = xSpreadsheet.getCellByPosition(0, 0);
            xCell.setValue(21);
            xCell = xSpreadsheet.getCellByPosition(0, 1);
            xCell.setValue(21);
            xCell = xSpreadsheet.getCellByPosition(0, 2);
            xCell.setFormula("=sum(A1:A2)");
 
            XPropertySet xCellProps = (XPropertySet)UnoRuntime.queryInterface(
                XPropertySet.class, xCell);
            xCellProps.setPropertyValue("CellStyle", "Result");
 
            XModel xSpreadsheetModel = (XModel)UnoRuntime.queryInterface(
                XModel.class, xSpreadsheetComponent);
            XController xSpreadsheetController = xSpreadsheetModel.getCurrentController();
            XSpreadsheetView xSpreadsheetView = (XSpreadsheetView)
                UnoRuntime.queryInterface(XSpreadsheetView.class,
                                          xSpreadsheetController);
            xSpreadsheetView.setActiveSheet(xSpreadsheet);
 
            // *********************************************************
            // example for use of enum types
            xCellProps.setPropertyValue("VertJustify",
                                        com.sun.star.table.CellVertJustify.TOP);
 
 
            // *********************************************************
            // example for a sequence of PropertyValue structs
            // create an array with one PropertyValue struct, it contains
            // references only
            loadProps = new PropertyValue[1];
 
            // instantiate PropertyValue struct and set its member fields
            PropertyValue asTemplate = new PropertyValue();
            asTemplate.Name = "AsTemplate";
            asTemplate.Value = new Boolean(true);
 
            // assign PropertyValue struct to array of references for PropertyValue
            // structs
            loadProps[0] = asTemplate;
 
            // load calc file as template
            //xSpreadsheetComponent = xComponentLoader.loadComponentFromURL(
            //    "file:///c:/temp/DataAnalysys.ods", "_blank", 0, loadProps);
 
            // *********************************************************
            // example for use of XEnumerationAccess
            XCellRangesQuery xCellQuery = (XCellRangesQuery)
                UnoRuntime.queryInterface(XCellRangesQuery.class, sheet);
            XSheetCellRanges xFormulaCells = xCellQuery.queryContentCells(
                (short)com.sun.star.sheet.CellFlags.FORMULA);
            XEnumerationAccess xFormulas = xFormulaCells.getCells();
            XEnumeration xFormulaEnum = xFormulas.createEnumeration();
 
            while (xFormulaEnum.hasMoreElements()) {
                Object formulaCell = xFormulaEnum.nextElement();
                xCell = (XCell)UnoRuntime.queryInterface(XCell.class, formulaCell);
                XCellAddressable xCellAddress = (XCellAddressable)
                    UnoRuntime.queryInterface(XCellAddressable.class, xCell);
                System.out.println("Formula cell in column " +
                                   xCellAddress.getCellAddress().Column
                                   + ", row " + xCellAddress.getCellAddress().Row
                                   + " contains " + xCell.getFormula());
            }
 
        }
        catch (java.lang.Exception e){
            e.printStackTrace();
        }
        finally {
            System.exit( 0 );
        }
    }
 
}


// import com.sun.star.uno.UnoRuntime;
// import com.sun.star.uno.XComponentContext;
// import com.sun.star.lang.XMultiComponentFactory;
// import com.sun.star.lang.XComponent;
// import com.sun.star.beans.XPropertySet;
// import com.sun.star.beans.PropertyValue;
// import com.sun.star.sheet.XSpreadsheetDocument;
// import com.sun.star.sheet.XSpreadsheets;
// import com.sun.star.sheet.XSpreadsheet;
// import com.sun.star.sheet.XSpreadsheetView;
// import com.sun.star.sheet.XCellRangesQuery;
// import com.sun.star.sheet.XSheetCellRanges;
// import com.sun.star.sheet.XCellAddressable;
// import com.sun.star.table.XCell;
// import com.sun.star.frame.XModel;
// import com.sun.star.frame.XController;
// import com.sun.star.frame.XComponentLoader;
// import com.sun.star.container.XEnumeration;
// import com.sun.star.container.XEnumerationAccess;

// import com.sun.star.uno.AnyConverter;


// /**
//  *
//  * @author  dschulten
//  */
// public class FirstLoadComponent {
    
//     /** Creates a new instance of FirstLoadComponent */
//     public FirstLoadComponent() {
//     }
    
//     /**
//      * @param args the command line arguments
//      */
//     private XComponentContext xRemoteContext = null;
//     private XMultiComponentFactory xRemoteServiceManager = null;
    
//     public static void main(String[] args) {
//         FirstLoadComponent firstLoadComponent1 = new FirstLoadComponent();
//         try {
//             firstLoadComponent1.useConnection();
//         }
//         catch (java.lang.Exception e){
//             System.out.println(e.getMessage());
//             e.printStackTrace();
//         }
//         finally {
//             System.exit(0);
//         }
//     }
    
//     private void useConnection() throws java.lang.Exception {
//         try {
//             // get the remote office component context
//             xRemoteContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
//             System.out.println("Connected to a running office ...");
                
//             xRemoteServiceManager = xRemoteContext.getServiceManager();
//         }
//         catch( Exception e) {
//             e.printStackTrace();
//             System.exit(1);
//         }

//         try {
//             Object desktop = xRemoteServiceManager.createInstanceWithContext(
//                 "com.sun.star.frame.Desktop", xRemoteContext);
//             XComponentLoader xComponentLoader = (XComponentLoader)
//                 UnoRuntime.queryInterface(XComponentLoader.class, desktop);

//             PropertyValue[] loadProps = new PropertyValue[0];
//             XComponent xSpreadsheetComponent = xComponentLoader.loadComponentFromURL("private:factory/scalc", "_blank", 0, loadProps);
            
//             XSpreadsheetDocument xSpreadsheetDocument = (XSpreadsheetDocument)
//                 UnoRuntime.queryInterface(XSpreadsheetDocument.class,
//                                           xSpreadsheetComponent);

//             XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets();
//             xSpreadsheets.insertNewByName("MySheet", (short)0);
//             com.sun.star.uno.Type elemType = xSpreadsheets.getElementType();
            
//             System.out.println(elemType.getTypeName());
//             Object sheet = xSpreadsheets.getByName("MySheet");
//             XSpreadsheet xSpreadsheet = (XSpreadsheet)UnoRuntime.queryInterface(
//                 XSpreadsheet.class, sheet);

//             XCell xCell = xSpreadsheet.getCellByPosition(0, 0);
//             xCell.setValue(21);
//             xCell = xSpreadsheet.getCellByPosition(0, 1);
//             xCell.setValue(21);
//             xCell = xSpreadsheet.getCellByPosition(0, 2);
//             xCell.setFormula("=sum(A1:A2)");

//             XPropertySet xCellProps = (XPropertySet)UnoRuntime.queryInterface(
//                 XPropertySet.class, xCell);
//             xCellProps.setPropertyValue("CellStyle", "Result");
            
//             XModel xSpreadsheetModel = (XModel)UnoRuntime.queryInterface(
//                 XModel.class, xSpreadsheetComponent);
//             XController xSpreadsheetController = xSpreadsheetModel.getCurrentController();
//             XSpreadsheetView xSpreadsheetView = (XSpreadsheetView)
//                 UnoRuntime.queryInterface(XSpreadsheetView.class,
//                                           xSpreadsheetController);
//             xSpreadsheetView.setActiveSheet(xSpreadsheet);     
 
//             // *********************************************************
//             // example for use of enum types
//             xCellProps.setPropertyValue("VertJustify",
//                                         com.sun.star.table.CellVertJustify.TOP);

            
//             // *********************************************************
//             // example for a sequence of PropertyValue structs
//             // create an array with one PropertyValue struct, it contains
//             // references only
//             loadProps = new PropertyValue[1];

//             // instantiate PropertyValue struct and set its member fields
//             PropertyValue asTemplate = new PropertyValue();
//             asTemplate.Name = "AsTemplate";
//             asTemplate.Value = new Boolean(true);

//             // assign PropertyValue struct to array of references for PropertyValue
//             // structs
//             loadProps[0] = asTemplate;

//             // load calc file as template
//             //xSpreadsheetComponent = xComponentLoader.loadComponentFromURL(
//             //    "file:///c:/temp/DataAnalysys.ods", "_blank", 0, loadProps);
                
//             // *********************************************************
//             // example for use of XEnumerationAccess
//             XCellRangesQuery xCellQuery = (XCellRangesQuery)
//                 UnoRuntime.queryInterface(XCellRangesQuery.class, sheet);
//             XSheetCellRanges xFormulaCells = xCellQuery.queryContentCells(
//                 (short)com.sun.star.sheet.CellFlags.FORMULA);
//             XEnumerationAccess xFormulas = xFormulaCells.getCells();
//             XEnumeration xFormulaEnum = xFormulas.createEnumeration();
            
//             while (xFormulaEnum.hasMoreElements()) {
//                 Object formulaCell = xFormulaEnum.nextElement();
//                 xCell = (XCell)UnoRuntime.queryInterface(XCell.class, formulaCell);
//                 XCellAddressable xCellAddress = (XCellAddressable)
//                     UnoRuntime.queryInterface(XCellAddressable.class, xCell);
//                 System.out.println("Formula cell in column " +
//                                    xCellAddress.getCellAddress().Column
//                                    + ", row " + xCellAddress.getCellAddress().Row
//                                    + " contains " + xCell.getFormula());
//             }
                        
//         }
//         catch( com.sun.star.lang.DisposedException e ) { //works from Patch 1
//             xRemoteContext = null;
//             throw e;
//         }          
//     }    
// }
