diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 16:51:28 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 16:51:28 +0000 |
commit | 940b4d1848e8c70ab7642901a68594e8016caffc (patch) | |
tree | eb72f344ee6c3d9b80a7ecc079ea79e9fba8676d /odk/examples/java/Spreadsheet/EuroAdaption.java | |
parent | Initial commit. (diff) | |
download | libreoffice-940b4d1848e8c70ab7642901a68594e8016caffc.tar.xz libreoffice-940b4d1848e8c70ab7642901a68594e8016caffc.zip |
Adding upstream version 1:7.0.4.upstream/1%7.0.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'odk/examples/java/Spreadsheet/EuroAdaption.java')
-rw-r--r-- | odk/examples/java/Spreadsheet/EuroAdaption.java | 383 |
1 files changed, 383 insertions, 0 deletions
diff --git a/odk/examples/java/Spreadsheet/EuroAdaption.java b/odk/examples/java/Spreadsheet/EuroAdaption.java new file mode 100644 index 000000000..c6906f45b --- /dev/null +++ b/odk/examples/java/Spreadsheet/EuroAdaption.java @@ -0,0 +1,383 @@ +/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * The Contents of this file are made available subject to the terms of + * the BSD license. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *************************************************************************/ + + +// comment: Step 1: get the Desktop object from the office +// Step 2: open an empty Calc document +// Step 3: enter an example text, set the numberformat to DM +// Step 4: change the numberformat to EUR (Euro) +// Step 5: use the DM/EUR factor on each cell with a content + + +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertySet; + +import com.sun.star.container.XEnumeration; +import com.sun.star.container.XIndexAccess; +import com.sun.star.container.XEnumerationAccess; + +import com.sun.star.document.XActionLockable; + +import com.sun.star.frame.XDesktop; +import com.sun.star.frame.XComponentLoader; + +import com.sun.star.lang.Locale; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiComponentFactory; + +import com.sun.star.table.XCell; +import com.sun.star.table.XCellRange; + +import com.sun.star.sheet.XSpreadsheet; +import com.sun.star.sheet.XSpreadsheets; +import com.sun.star.sheet.XSheetCellRanges; +import com.sun.star.sheet.XCellRangesQuery; +import com.sun.star.sheet.XCellFormatRangesSupplier; +import com.sun.star.sheet.XSpreadsheetDocument; + +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.XComponentContext; + +import com.sun.star.util.XNumberFormats; +import com.sun.star.util.XNumberFormatsSupplier; + + +public class EuroAdaption { + + public static void main(String args[]) { + // You need the desktop to create a document + // The getDesktop method does the UNO bootstrapping, gets the + // remote service manager and the desktop object. + com.sun.star.frame.XDesktop xDesktop = null; + xDesktop = getDesktop(); + + // create a sheet document + XSpreadsheetDocument xSheetdocument = null; + xSheetdocument = createSheetdocument( xDesktop ); + System.out.println( "Create a new Spreadsheet" ); + + // get the collection of all sheets from the document + XSpreadsheets xSheets = null; + xSheets = xSheetdocument.getSheets(); + + // the Action Interface provides methods to hide actions, + // like inserting data, on a sheet, that increase the performance + XActionLockable xActionInterface = null; + xActionInterface = UnoRuntime.queryInterface( + XActionLockable.class, xSheetdocument ); + + // lock all actions + xActionInterface.addActionLock(); + + com.sun.star.sheet.XSpreadsheet xSheet = null; + try { + // get via the index access the first sheet + XIndexAccess xElements = UnoRuntime.queryInterface( + XIndexAccess.class, xSheets ); + + // specify the first sheet from the spreadsheet + xSheet = UnoRuntime.queryInterface( + XSpreadsheet.class, xElements.getByIndex( 0 )); + } + catch( Exception e) { + e.printStackTrace(System.err); + } + + // get the interface to apply and create new numberformats + XNumberFormatsSupplier xNumberFormatSupplier = null; + xNumberFormatSupplier = UnoRuntime.queryInterface( + XNumberFormatsSupplier.class, xSheetdocument ); + XNumberFormats xNumberFormats = null; + xNumberFormats = xNumberFormatSupplier.getNumberFormats(); + + // insert some example data in a sheet + createExampleData( xSheet, xNumberFormats ); + System.out.println( "Insert example data and use the number format with the currency 'DM'" ); + + // Change the currency from the cells from DM to Euro + Convert( xSheet, xNumberFormats, "DM", "EUR", 1.95583f ); + System.out.println( "Change the number format to EUR and divide the values with the factor 1.95583" ); + + // remove all locks, the user see all changes + xActionInterface.removeActionLock(); + + System.out.println("done"); + System.exit(0); + } + + + public static void Convert( XSpreadsheet xSheet, XNumberFormats xNumberFormats, + String sOldSymbol, String sNewSymbol, + float fFactor ) { + try { + Locale xLanguage = new Locale(); + xLanguage.Country = "de"; // Germany -> DM + xLanguage.Language = "de"; // German + + // Numberformat string with sNewSymbol + String sSimple = "0 [$" + sNewSymbol + "]"; + // create a number format key with the sNewSymbol + int iSimpleKey = NumberFormat( xNumberFormats, sSimple, xLanguage ); + + // you have to use the FormatSupplier interface to get the + // CellFormat enumeration + XCellFormatRangesSupplier xCellFormatSupplier = + UnoRuntime.queryInterface( + XCellFormatRangesSupplier.class, xSheet ); + + // getCellFormatRanges() has the interfaces for the enumeration + XEnumerationAccess xEnumerationAccess = + UnoRuntime.queryInterface( + XEnumerationAccess.class, + xCellFormatSupplier.getCellFormatRanges() ); + + XEnumeration xRanges = xEnumerationAccess.createEnumeration(); + + while( xRanges.hasMoreElements() ) { + // the enumeration returns a cellrange + XCellRange xCellRange = UnoRuntime.queryInterface( + XCellRange.class, xRanges.nextElement()); + + // the PropertySet the get and set the properties from the cellrange + XPropertySet xCellProp = UnoRuntime.queryInterface( + XPropertySet.class, xCellRange ); + + // getPropertyValue returns an Object, you have to cast it to + // type that you need + Object oNumberObject = xCellProp.getPropertyValue( "NumberFormat" ); + int iNumberFormat = AnyConverter.toInt(oNumberObject); + + // get the properties from the cellrange numberformat + XPropertySet xFormat = xNumberFormats.getByKey(iNumberFormat ); + + short fType = AnyConverter.toShort(xFormat.getPropertyValue("Type")); + String sCurrencySymbol = AnyConverter.toString( + xFormat.getPropertyValue("CurrencySymbol")); + + // change the numberformat only on cellranges with a + // currency numberformat + if( ( (fType & com.sun.star.util.NumberFormat.CURRENCY) > 0) && + ( sCurrencySymbol.equals( sOldSymbol ) ) ) { + boolean bThousandSep = AnyConverter.toBoolean( + xFormat.getPropertyValue("ThousandsSeparator")); + boolean bNegativeRed = AnyConverter.toBoolean( + xFormat.getPropertyValue("NegativeRed")); + short fDecimals = AnyConverter.toShort( + xFormat.getPropertyValue("Decimals")); + short fLeadingZeros = AnyConverter.toShort( + xFormat.getPropertyValue("LeadingZeros")); + Locale oLocale = (Locale) AnyConverter.toObject( + new com.sun.star.uno.Type(Locale.class), + xFormat.getPropertyValue("Locale")); + + // create a new numberformat string + String sNew = xNumberFormats.generateFormat( iSimpleKey, + oLocale, bThousandSep, bNegativeRed, + fDecimals, fLeadingZeros ); + + // get the NumberKey from the numberformat + int iNewNumberFormat = NumberFormat( xNumberFormats, + sNew, oLocale ); + + // set the new numberformat to the cellrange DM->EUR + xCellProp.setPropertyValue( "NumberFormat", + Integer.valueOf( iNewNumberFormat ) ); + + // iterate over all cells from the cellrange with an + // content and use the DM/EUR factor + XCellRangesQuery xCellRangesQuery = UnoRuntime.queryInterface( + XCellRangesQuery.class, xCellRange ); + + XSheetCellRanges xSheetCellRanges = + xCellRangesQuery.queryContentCells( + (short) com.sun.star.sheet.CellFlags.VALUE ); + + if( xSheetCellRanges.getCount() > 0 ) { + XEnumerationAccess xCellEnumerationAccess = + xSheetCellRanges.getCells(); + XEnumeration xCellEnumeration = + xCellEnumerationAccess.createEnumeration(); + + while( xCellEnumeration.hasMoreElements() ) { + XCell xCell = UnoRuntime.queryInterface( + XCell.class, xCellEnumeration.nextElement()); + xCell.setValue( xCell.getValue() / fFactor ); + } + } + } + } + } + catch( Exception e) { + e.printStackTrace(System.err); + } + } + + + public static int NumberFormat( XNumberFormats xNumberFormat, String sFormat, + com.sun.star.lang.Locale xLanguage ) { + int nRetKey = 0; + + try { + // exists the numberformat + nRetKey = xNumberFormat.queryKey( sFormat, xLanguage, true ); + + // if not, create a new one + if( nRetKey == -1 ) { + nRetKey = xNumberFormat.addNew( sFormat, xLanguage ); + if( nRetKey == -1 ) + nRetKey = 0; + } + } + catch( Exception e) { + e.printStackTrace(System.err); + } + + return nRetKey; + } + + + public static void createExampleData( XSpreadsheet xSheet, + XNumberFormats xNumberFormat ) { + + // enter in a cellrange numbers and change the numberformat to DM + XCell xCell = null; + XCellRange xCellRange = null; + + try { + Locale xLanguage = new Locale(); + xLanguage.Country = "de"; // Germany -> DM + xLanguage.Language = "de"; // German + + // Numberformat string from DM + String sSimple = "0 [$DM]"; + + // get the numberformat key + int iNumberFormatKey = NumberFormat(xNumberFormat, sSimple, xLanguage); + + for( int iCounter=1; iCounter < 10; iCounter++ ) { + // get one cell and insert a number + xCell = xSheet.getCellByPosition( 2, 1 + iCounter ); + xCell.setValue( (double) iCounter * 2 ); + xCellRange = xSheet.getCellRangeByPosition( 2, 1 + iCounter, + 2, 1 + iCounter ); + + // get the PropertySet from the cell, to change the numberformat + XPropertySet xCellProp = UnoRuntime.queryInterface( + XPropertySet.class, xCellRange ); + xCellProp.setPropertyValue( "NumberFormat", + Integer.valueOf(iNumberFormatKey) ); + } + } + catch( Exception e) { + e.printStackTrace(System.err); + } + } + + public static XDesktop getDesktop() { + XDesktop xDesktop = null; + XMultiComponentFactory xMCF = null; + + try { + XComponentContext xContext = null; + + // get the remote office component context + xContext = com.sun.star.comp.helper.Bootstrap.bootstrap(); + + // get the remote office service manager + xMCF = xContext.getServiceManager(); + if( xMCF != null ) { + System.out.println("Connected to a running office ..."); + + Object oDesktop = xMCF.createInstanceWithContext( + "com.sun.star.frame.Desktop", xContext); + xDesktop = UnoRuntime.queryInterface( + XDesktop.class, oDesktop); + } + else + System.out.println( "Can't create a desktop. No connection, no remote servicemanager available!" ); + } + catch( Exception e) { + e.printStackTrace(System.err); + System.exit(1); + } + + + return xDesktop; + } + + + public static XSpreadsheetDocument createSheetdocument( XDesktop xDesktop ) { + XSpreadsheetDocument aSheetDocument = null; + + try { + XComponent xComponent = null; + xComponent = CreateNewDocument( xDesktop, "scalc" ); + + aSheetDocument = UnoRuntime.queryInterface( + XSpreadsheetDocument.class, xComponent); + } + catch( Exception e) { + e.printStackTrace(System.err); + } + + return aSheetDocument; + } + + protected static XComponent CreateNewDocument( XDesktop xDesktop, + String sDocumentType ) { + String sURL = "private:factory/" + sDocumentType; + + XComponent xComponent = null; + XComponentLoader xComponentLoader = null; + PropertyValue xEmptyArgs[] = new PropertyValue[0]; + + try { + xComponentLoader = UnoRuntime.queryInterface( + XComponentLoader.class, xDesktop ); + + xComponent = xComponentLoader.loadComponentFromURL( + sURL, "_blank", 0, xEmptyArgs); + } + catch( Exception e) { + e.printStackTrace(System.err); + } + + return xComponent ; + } + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |