/* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * 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 . */ package com.sun.star.wizards.common; import java.util.Date; import com.sun.star.beans.XPropertySet; import com.sun.star.lang.Locale; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.uno.AnyConverter; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XInterface; import com.sun.star.util.NumberFormat; import com.sun.star.util.XNumberFormatTypes; import com.sun.star.util.XNumberFormats; import com.sun.star.util.XNumberFormatsSupplier; import com.sun.star.util.XNumberFormatter; public class NumberFormatter { public int iDateFormatKey = -1; public int iDateTimeFormatKey = -1; public int iNumberFormatKey = -1; public int iTextFormatKey = -1; public int iTimeFormatKey = -1; public int iLogicalFormatKey = -1; public long lDateCorrection; public XNumberFormatter xNumberFormatter; public XNumberFormats xNumberFormats; public XNumberFormatTypes xNumberFormatTypes; public XPropertySet xNumberFormatSettings; private boolean bNullDateCorrectionIsDefined = false; private Locale aLocale; public NumberFormatter(XMultiServiceFactory _xMSF, XNumberFormatsSupplier _xNumberFormatsSupplier, Locale _aLocale) throws Exception { aLocale = _aLocale; Object oNumberFormatter = _xMSF.createInstance("com.sun.star.util.NumberFormatter"); xNumberFormats = _xNumberFormatsSupplier.getNumberFormats(); xNumberFormatSettings = _xNumberFormatsSupplier.getNumberFormatSettings(); xNumberFormatter = UnoRuntime.queryInterface(XNumberFormatter.class, oNumberFormatter); xNumberFormatter.attachNumberFormatsSupplier(_xNumberFormatsSupplier); xNumberFormatTypes = UnoRuntime.queryInterface(XNumberFormatTypes.class, xNumberFormats); } public NumberFormatter(XNumberFormatsSupplier _xNumberFormatsSupplier, Locale _aLocale) throws Exception { aLocale = _aLocale; xNumberFormats = _xNumberFormatsSupplier.getNumberFormats(); xNumberFormatSettings = _xNumberFormatsSupplier.getNumberFormatSettings(); xNumberFormatTypes = UnoRuntime.queryInterface(XNumberFormatTypes.class, xNumberFormats); } /** * @param _xMSF * @param _xNumberFormatsSupplier * @return * @throws Exception * @deprecated * */ public static XNumberFormatter createNumberFormatter(XMultiServiceFactory _xMSF, XNumberFormatsSupplier _xNumberFormatsSupplier) throws Exception { Object oNumberFormatter = _xMSF.createInstance("com.sun.star.util.NumberFormatter"); XNumberFormatter xNumberFormatter = UnoRuntime.queryInterface(XNumberFormatter.class, oNumberFormatter); xNumberFormatter.attachNumberFormatsSupplier(_xNumberFormatsSupplier); return xNumberFormatter; } /** * gives a key to pass to a NumberFormat object.
* example:
*
     * XNumberFormatsSupplier nsf = (XNumberFormatsSupplier)UnoRuntime.queryInterface(...,document);
     * int key = Desktop.getNumberFormatterKey( nsf, ...star.i18n.NumberFormatIndex.DATE...);
     * XNumberFormatter nf = Desktop.createNumberFormatter(xmsf, nsf);
     * nf.convertNumberToString( key, 1972 );
     * 
* @param numberFormatsSupplier * @param type - a constant out of i18n.NumberFormatIndex enumeration. * @return a key to use with a util.NumberFormat instance. * */ public static int getNumberFormatterKey( Object numberFormatsSupplier, short type) { Object numberFormatTypes = UnoRuntime.queryInterface(XNumberFormatsSupplier.class,numberFormatsSupplier).getNumberFormats(); Locale l = new Locale(); return UnoRuntime.queryInterface(XNumberFormatTypes.class,numberFormatTypes).getFormatIndex(type, l); } public String convertNumberToString(int _nkey, double _dblValue) { return xNumberFormatter.convertNumberToString(_nkey, _dblValue); } public static String convertNumberToString(XNumberFormatter _xNumberFormatter, int _nkey, double _dblValue) { return _xNumberFormatter.convertNumberToString(_nkey, _dblValue); } public double convertStringToNumber(int _nkey, String _sString)throws Exception { return xNumberFormatter.convertStringToNumber(_nkey, _sString); } /** * @param dateCorrection The lDateCorrection to set. */ public void setNullDateCorrection(long dateCorrection) { lDateCorrection = dateCorrection; } public int defineNumberFormat(String _FormatString) { try { int NewFormatKey = xNumberFormats.queryKey(_FormatString, aLocale, true); if (NewFormatKey == -1) { NewFormatKey = xNumberFormats.addNew(_FormatString, aLocale); } return NewFormatKey; } catch (Exception e) { e.printStackTrace(System.err); return -1; } } /** * returns a numberformat for a FormatString. * @param _FormatString * @param _aLocale * @return */ public int defineNumberFormat(String _FormatString, Locale _aLocale) { try { int NewFormatKey = xNumberFormats.queryKey(_FormatString, _aLocale, true); if (NewFormatKey == -1) { NewFormatKey = xNumberFormats.addNew(_FormatString, _aLocale); } return NewFormatKey; } catch (Exception e) { e.printStackTrace(System.err); return -1; } } public void setNumberFormat(XInterface _xFormatObject, int _FormatKey, NumberFormatter _oNumberFormatter) { try { XPropertySet xNumberFormat = _oNumberFormatter.xNumberFormats.getByKey(_FormatKey); String FormatString = AnyConverter.toString(Helper.getUnoPropertyValue(xNumberFormat, "FormatString")); Locale oLocale = (Locale) Helper.getUnoPropertyValue(xNumberFormat, "Locale"); int NewFormatKey = defineNumberFormat(FormatString, oLocale); XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, _xFormatObject); if (xPSet.getPropertySetInfo().hasPropertyByName("FormatsSupplier")) { xPSet.setPropertyValue("FormatsSupplier", _oNumberFormatter.xNumberFormatter.getNumberFormatsSupplier()); } if (xPSet.getPropertySetInfo().hasPropertyByName("NumberFormat")) { xPSet.setPropertyValue("NumberFormat", new Integer(NewFormatKey)); } else if (xPSet.getPropertySetInfo().hasPropertyByName("FormatKey")) { xPSet.setPropertyValue("FormatKey", new Integer(NewFormatKey)); } else { // TODO: throws a exception in a try catch environment, very helpful? throw new Exception(); } } catch (Exception exception) { exception.printStackTrace(System.err); } } public long getNullDateCorrection() { if (!this.bNullDateCorrectionIsDefined) { com.sun.star.util.Date dNullDate = (com.sun.star.util.Date) Helper.getUnoStructValue(this.xNumberFormatSettings, "NullDate"); long lNullDate = Helper.convertUnoDatetoInteger(dNullDate); java.util.Calendar oCal = java.util.Calendar.getInstance(); oCal.set(1900, 1, 1); Date dTime = oCal.getTime(); long lTime = dTime.getTime(); long lDBNullDate = lTime / (3600 * 24000); lDateCorrection = lDBNullDate - lNullDate; return lDateCorrection; } else { return this.lDateCorrection; } } public int setBooleanReportDisplayNumberFormat() { String FormatString = "[=1]" + '"' + (char)9745 + '"' + ";[=0]" + '"' + (char)58480 + '"' + ";0"; iLogicalFormatKey = xNumberFormats.queryKey(FormatString, aLocale, true); try { if (iLogicalFormatKey == -1) { iLogicalFormatKey = xNumberFormats.addNew(FormatString, aLocale); } } catch (Exception e) { //MalformedNumberFormat e.printStackTrace(); iLogicalFormatKey = xNumberFormatTypes.getStandardFormat(NumberFormat.LOGICAL, aLocale); } return iLogicalFormatKey; } /** * @return Returns the iDateFormatKey. */ public int getDateFormatKey() { if (iDateFormatKey == -1) { iDateFormatKey = xNumberFormatTypes.getStandardFormat(NumberFormat.DATE, aLocale); } return iDateFormatKey; } /** * @return Returns the iDateTimeFormatKey. */ public int getDateTimeFormatKey() { if (iDateTimeFormatKey == -1) { iDateTimeFormatKey = xNumberFormatTypes.getStandardFormat(NumberFormat.DATETIME, aLocale); } return iDateTimeFormatKey; } /** * @return Returns the iLogicalFormatKey. */ public int getLogicalFormatKey() { if (iLogicalFormatKey == -1) { iLogicalFormatKey = xNumberFormatTypes.getStandardFormat(NumberFormat.LOGICAL, aLocale); } return iLogicalFormatKey; } /** * @return Returns the iNumberFormatKey. */ public int getNumberFormatKey() { if (iNumberFormatKey == -1) { iNumberFormatKey = xNumberFormatTypes.getStandardFormat(NumberFormat.NUMBER, aLocale); } return iNumberFormatKey; } /** * @return Returns the iTextFormatKey. */ public int getTextFormatKey() { if (iTextFormatKey == -1) { iTextFormatKey = xNumberFormatTypes.getStandardFormat(NumberFormat.TEXT, aLocale); } return iTextFormatKey; } /** * @return Returns the iTimeFormatKey. */ public int getTimeFormatKey() { if (iTimeFormatKey == -1) { iTimeFormatKey = xNumberFormatTypes.getStandardFormat(NumberFormat.TIME, aLocale); } return iTimeFormatKey; } }