[Libreoffice-commits] core.git: Branch 'libreoffice-4-2' - chart2/qa include/oox oox/source

Matúš Kukan matus.kukan at collabora.com
Fri Sep 12 02:12:27 PDT 2014


 chart2/qa/extras/chart2import.cxx                  |   53 +++++++++++++++++++++
 chart2/qa/extras/charttest.hxx                     |   12 ++++
 chart2/qa/extras/data/xlsx/number-formats.xlsx     |binary
 include/oox/drawingml/chart/objectformatter.hxx    |    3 -
 oox/source/drawingml/chart/axisconverter.cxx       |    2 
 oox/source/drawingml/chart/chartconverter.cxx      |    7 ++
 oox/source/drawingml/chart/chartspaceconverter.cxx |   14 -----
 oox/source/drawingml/chart/objectformatter.cxx     |   24 +++++----
 oox/source/drawingml/chart/seriesconverter.cxx     |    2 
 9 files changed, 90 insertions(+), 27 deletions(-)

New commits:
commit f408f7dd6d5221f3cc23e3ef4160e0ed72920fbe
Author: Matúš Kukan <matus.kukan at collabora.com>
Date:   Thu Sep 11 08:56:22 2014 +0200

    bnc#892610: OOXML import: Improve chart number formats.
    
    If sourceLinked is used, do not set "PercentageNumberFormat" even if
    showPercent is true. The format string should be used for "NumberFormat".
    
    c8cc89ff802d86b1f3a69afe1b4835b7df7f70c7 unnecessarily disabled
    "LinkNumberFormatToSource". Use that for data labels but not for axis.
    
    Also, actually make attaching number format supplier work for Calc.
    Previously, non standard formats were added into wrong supplier,
    and they were thrown away later because it was attached too late.
    (See also ChartModel::attachNumberFormatsSupplier)
    
    (cherry picked from commit d22a4d945ccf1456fbdb2c39802d956afa583a2a)
    
    Conflicts:
    	chart2/qa/extras/chart2import.cxx
    	oox/source/drawingml/chart/chartconverter.cxx
    
    Change-Id: Iaf9945abc3d82d0ac63d9f36b8888eb49f39ab57
    Reviewed-on: https://gerrit.libreoffice.org/11415
    Reviewed-by: Andras Timar <andras.timar at collabora.com>
    Tested-by: Andras Timar <andras.timar at collabora.com>

diff --git a/chart2/qa/extras/chart2import.cxx b/chart2/qa/extras/chart2import.cxx
index 1441903..67ada39 100644
--- a/chart2/qa/extras/chart2import.cxx
+++ b/chart2/qa/extras/chart2import.cxx
@@ -11,6 +11,7 @@
 #include "charttest.hxx"
 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
 #include <com/sun/star/chart2/CurveStyle.hpp>
+#include <com/sun/star/chart2/DataPointLabel.hpp>
 #include <com/sun/star/chart/ErrorBarStyle.hpp>
 #include <com/sun/star/chart2/XChartDocument.hpp>
 #include <com/sun/star/chart/XChartDocument.hpp>
@@ -33,6 +34,7 @@ public:
     void testPPTXChartSeries();
     void testPPTChartSeries();
     void testODPChartSeries();
+    void testNumberFormatsXLSX();
 
     CPPUNIT_TEST_SUITE(Chart2ImportTest);
     CPPUNIT_TEST(Fdo60083);
@@ -53,6 +55,7 @@ public:
 //    CPPUNIT_TEST(testPPTChartSeries);
 //    CPPUNIT_TEST(testPPTXChartSeries);
 //    CPPUNIT_TEST(testODPChartSeries);
+    CPPUNIT_TEST(testNumberFormatsXLSX);
     CPPUNIT_TEST_SUITE_END();
 
 private:
@@ -295,6 +298,56 @@ void Chart2ImportTest::testODPChartSeries()
 
 }
 
+void Chart2ImportTest::testNumberFormatsXLSX()
+{
+    load("/chart2/qa/extras/data/xlsx/", "number-formats.xlsx");
+    Reference<chart2::XChartDocument> xChartDoc = getChartDocFromSheet(0, mxComponent);
+    CPPUNIT_ASSERT_MESSAGE("failed to load chart", xChartDoc.is());
+
+    uno::Reference<chart2::XDataSeries> xDataSeries(getDataSeriesFromDoc(xChartDoc, 0));
+    CPPUNIT_ASSERT(xDataSeries.is());
+    uno::Reference<beans::XPropertySet> xPropertySet;
+    chart2::DataPointLabel aLabel;
+    sal_Int32 nNumberFormat;
+    bool bLinkNumberFormatToSource = false;
+    bool bSuccess = false;
+    const sal_Int32 nChartDataNumberFormat = getNumberFormat(
+            xChartDoc, "_(\"$\"* #,##0_);_(\"$\"* \\(#,##0\\);_(\"$\"* \"-\"??_);_(@_)");
+
+    xPropertySet.set(xDataSeries->getDataPointByIndex(0), uno::UNO_QUERY_THROW);
+    xPropertySet->getPropertyValue("Label") >>= aLabel;
+    CPPUNIT_ASSERT_EQUAL(sal_True, aLabel.ShowNumber);
+    CPPUNIT_ASSERT_EQUAL(sal_True, aLabel.ShowNumberInPercent);
+    xPropertySet->getPropertyValue("NumberFormat") >>= nNumberFormat;
+    CPPUNIT_ASSERT_EQUAL(nChartDataNumberFormat, nNumberFormat);
+    bSuccess = xPropertySet->getPropertyValue("PercentageNumberFormat") >>= nNumberFormat;
+    CPPUNIT_ASSERT_EQUAL(false, bSuccess);
+    bSuccess = xPropertySet->getPropertyValue("LinkNumberFormatToSource") >>= bLinkNumberFormatToSource;
+    CPPUNIT_ASSERT_MESSAGE("\"LinkNumberFormatToSource\" should be set to true.", bSuccess && bLinkNumberFormatToSource);
+
+    xPropertySet.set(xDataSeries->getDataPointByIndex(1), uno::UNO_QUERY_THROW);
+    xPropertySet->getPropertyValue("Label") >>= aLabel;
+    CPPUNIT_ASSERT_EQUAL(sal_True, aLabel.ShowNumber);
+    CPPUNIT_ASSERT_EQUAL(sal_False, aLabel.ShowNumberInPercent);
+    xPropertySet->getPropertyValue("NumberFormat") >>= nNumberFormat;
+    CPPUNIT_ASSERT_EQUAL(nChartDataNumberFormat, nNumberFormat);
+    bSuccess = xPropertySet->getPropertyValue("PercentageNumberFormat") >>= nNumberFormat;
+    CPPUNIT_ASSERT_EQUAL(false, bSuccess);
+    bSuccess = xPropertySet->getPropertyValue("LinkNumberFormatToSource") >>= bLinkNumberFormatToSource;
+    CPPUNIT_ASSERT_MESSAGE("\"LinkNumberFormatToSource\" should be set to true.", bSuccess && bLinkNumberFormatToSource);
+
+    xPropertySet.set(xDataSeries->getDataPointByIndex(2), uno::UNO_QUERY_THROW);
+    xPropertySet->getPropertyValue("Label") >>= aLabel;
+    CPPUNIT_ASSERT_EQUAL(sal_False, aLabel.ShowNumber);
+    CPPUNIT_ASSERT_EQUAL(sal_True, aLabel.ShowNumberInPercent);
+    xPropertySet->getPropertyValue("NumberFormat") >>= nNumberFormat;
+    CPPUNIT_ASSERT_EQUAL(nChartDataNumberFormat, nNumberFormat);
+    bSuccess = xPropertySet->getPropertyValue("PercentageNumberFormat") >>= nNumberFormat;
+    CPPUNIT_ASSERT_EQUAL(false, bSuccess);
+    bSuccess = xPropertySet->getPropertyValue("LinkNumberFormatToSource") >>= bLinkNumberFormatToSource;
+    CPPUNIT_ASSERT_MESSAGE("\"LinkNumberFormatToSource\" should be set to true.", bSuccess && bLinkNumberFormatToSource);
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(Chart2ImportTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/chart2/qa/extras/charttest.hxx b/chart2/qa/extras/charttest.hxx
index 53a465b..216c915 100644
--- a/chart2/qa/extras/charttest.hxx
+++ b/chart2/qa/extras/charttest.hxx
@@ -38,6 +38,9 @@
 #include <com/sun/star/chart/XChartDataArray.hpp>
 #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
 #include <com/sun/star/chart/XChartDocument.hpp>
+#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
+#include <com/sun/star/util/NumberFormat.hpp>
+
 #include <iostream>
 
 using namespace com::sun::star;
@@ -294,4 +297,13 @@ std::vector<uno::Sequence<uno::Any> > getDataSeriesLabelsFromChartType( const Re
     return aRet;
 }
 
+sal_Int32 getNumberFormat( const Reference<chart2::XChartDocument>& xChartDoc, const OUString& sFormat )
+{
+    Reference<util::XNumberFormatsSupplier> xNFS(xChartDoc, uno::UNO_QUERY_THROW);
+    Reference<util::XNumberFormats> xNumberFormats = xNFS->getNumberFormats();
+    CPPUNIT_ASSERT(xNumberFormats.is());
+
+    return xNumberFormats->queryKey(sFormat, css::lang::Locale(), sal_False);
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/qa/extras/data/xlsx/number-formats.xlsx b/chart2/qa/extras/data/xlsx/number-formats.xlsx
new file mode 100755
index 0000000..f5250c5
Binary files /dev/null and b/chart2/qa/extras/data/xlsx/number-formats.xlsx differ
diff --git a/include/oox/drawingml/chart/objectformatter.hxx b/include/oox/drawingml/chart/objectformatter.hxx
index dd3d15a..b6bdc37 100644
--- a/include/oox/drawingml/chart/objectformatter.hxx
+++ b/include/oox/drawingml/chart/objectformatter.hxx
@@ -131,7 +131,8 @@ public:
     void                convertNumberFormat(
                             PropertySet& rPropSet,
                             const NumberFormat& rNumberFormat,
-                            bool bPercentFormat = false );
+                            bool bAxis,
+                            bool bShowPercent = false );
 
     /** Sets automatic fill properties to the passed property set. */
     void                convertAutomaticFill(
diff --git a/oox/source/drawingml/chart/axisconverter.cxx b/oox/source/drawingml/chart/axisconverter.cxx
index d30595d..1b86da9 100644
--- a/oox/source/drawingml/chart/axisconverter.cxx
+++ b/oox/source/drawingml/chart/axisconverter.cxx
@@ -331,7 +331,7 @@ void AxisConverter::convertFromModel(
         // number format ------------------------------------------------------
 
         if( (aScaleData.AxisType == cssc2::AxisType::REALNUMBER) || (aScaleData.AxisType == cssc2::AxisType::PERCENT) )
-            getFormatter().convertNumberFormat(aAxisProp, mrModel.maNumberFormat, false);
+            getFormatter().convertNumberFormat(aAxisProp, mrModel.maNumberFormat, true);
 
         // position of crossing axis ------------------------------------------
 
diff --git a/oox/source/drawingml/chart/chartconverter.cxx b/oox/source/drawingml/chart/chartconverter.cxx
index 234d063..f03e7eb 100644
--- a/oox/source/drawingml/chart/chartconverter.cxx
+++ b/oox/source/drawingml/chart/chartconverter.cxx
@@ -20,6 +20,8 @@
 #include "oox/drawingml/chart/chartconverter.hxx"
 
 #include <com/sun/star/chart2/XChartDocument.hpp>
+#include <com/sun/star/chart2/data/XDataReceiver.hpp>
+#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
 #include "oox/drawingml/chart/chartspaceconverter.hxx"
 #include "oox/drawingml/chart/chartspacemodel.hxx"
 #include "oox/helper/containerhelper.hxx"
@@ -102,6 +104,11 @@ void ChartConverter::convertFromModel( XmlFilterBase& rFilter,
     OSL_ENSURE( rxChartDoc.is(), "ChartConverter::convertFromModel - missing chart document" );
     if( rxChartDoc.is() )
     {
+        Reference< data::XDataReceiver > xDataReceiver( rxChartDoc, uno::UNO_QUERY_THROW );
+        Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( rFilter.getModel(), uno::UNO_QUERY );
+        if (xNumberFormatsSupplier.is())
+            xDataReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier );
+
         ConverterRoot aConvBase( rFilter, *this, rChartModel, rxChartDoc, rChartSize );
         ChartSpaceConverter aSpaceConv( aConvBase, rChartModel );
         aSpaceConv.convertFromModel( rxExternalPage, rChartPos );
diff --git a/oox/source/drawingml/chart/chartspaceconverter.cxx b/oox/source/drawingml/chart/chartspaceconverter.cxx
index eeba446..3b7961a 100644
--- a/oox/source/drawingml/chart/chartspaceconverter.cxx
+++ b/oox/source/drawingml/chart/chartspaceconverter.cxx
@@ -23,7 +23,6 @@
 #include <com/sun/star/chart/XChartDocument.hpp>
 #include <com/sun/star/chart2/XChartDocument.hpp>
 #include <com/sun/star/chart2/XTitled.hpp>
-#include <com/sun/star/chart2/data/XDataReceiver.hpp>
 #include <com/sun/star/drawing/XDrawPageSupplier.hpp>
 #include <com/sun/star/drawing/FillStyle.hpp>
 #include "oox/core/xmlfilterbase.hxx"
@@ -40,12 +39,10 @@ using ::com::sun::star::uno::Exception;
 using ::com::sun::star::uno::UNO_QUERY;
 using ::com::sun::star::uno::UNO_QUERY_THROW;
 using ::com::sun::star::uno::makeAny;
-using ::com::sun::star::util::XNumberFormatsSupplier;
 using ::com::sun::star::drawing::XDrawPageSupplier;
 using ::com::sun::star::drawing::XShapes;
 using ::com::sun::star::chart2::XDiagram;
 using ::com::sun::star::chart2::XTitled;
-using ::com::sun::star::chart2::data::XDataReceiver;
 using ::com::sun::star::beans::XPropertySet;
 
 namespace oox {
@@ -81,17 +78,6 @@ void ChartSpaceConverter::convertFromModel( const Reference< XShapes >& rxExtern
         derived converters may create an external data provider) */
     getChartConverter()->createDataProvider( getChartDocument() );
 
-    // attach number formatter of container document to data receiver
-    try
-    {
-        Reference< XDataReceiver > xDataRec( getChartDocument(), UNO_QUERY_THROW );
-        Reference< XNumberFormatsSupplier > xNumFmtSupp( getFilter().getModel(), UNO_QUERY_THROW );
-        xDataRec->attachNumberFormatsSupplier( xNumFmtSupp );
-    }
-    catch( Exception& )
-    {
-    }
-
     // formatting of the chart background.  The default fill style varies with applications.
     PropertySet aBackPropSet( getChartDocument()->getPageBackground() );
 
diff --git a/oox/source/drawingml/chart/objectformatter.cxx b/oox/source/drawingml/chart/objectformatter.cxx
index a9911e7..0e4b914 100644
--- a/oox/source/drawingml/chart/objectformatter.cxx
+++ b/oox/source/drawingml/chart/objectformatter.cxx
@@ -1106,19 +1106,21 @@ void ObjectFormatter::convertTextRotation( PropertySet& rPropSet, const ModelRef
     }
 }
 
-void ObjectFormatter::convertNumberFormat( PropertySet& rPropSet, const NumberFormat& rNumberFormat, bool bPercentFormat )
+void ObjectFormatter::convertNumberFormat( PropertySet& rPropSet, const NumberFormat& rNumberFormat, bool bAxis, bool bShowPercent )
 {
     if( mxData->mxNumFmts.is() )
     {
-        sal_Int32 nPropId = bPercentFormat ? PROP_PercentageNumberFormat : PROP_NumberFormat;
+        const bool bGeneral = rNumberFormat.maFormatCode.equalsIgnoreAsciiCase("general");
+        const bool bPercent = !bAxis && bShowPercent && !rNumberFormat.mbSourceLinked;
+        sal_Int32 nPropId = bPercent ? PROP_PercentageNumberFormat : PROP_NumberFormat;
+        OUString sFormatCode(rNumberFormat.maFormatCode);
+        if (bPercent && bGeneral)
+            sFormatCode = OUString("0%");
         try
         {
-            bool bGeneral = rNumberFormat.maFormatCode.equalsIgnoreAsciiCase("general");
-            sal_Int32 nIndex = bGeneral && !bPercentFormat ?
+            sal_Int32 nIndex = bGeneral && !bPercent ?
                 mxData->mxNumTypes->getStandardIndex( mxData->maFromLocale ) :
-                mxData->mxNumFmts->addNewConverted(
-                        bGeneral ? OUString("0%") : rNumberFormat.maFormatCode,
-                        mxData->maEnUsLocale, mxData->maFromLocale );
+                mxData->mxNumFmts->addNewConverted( sFormatCode, mxData->maEnUsLocale, mxData->maFromLocale );
             if( nIndex >= 0 )
                 rPropSet.setProperty( nPropId, nIndex );
         }
@@ -1128,9 +1130,11 @@ void ObjectFormatter::convertNumberFormat( PropertySet& rPropSet, const NumberFo
                 append( OUStringToOString( rNumberFormat.maFormatCode, osl_getThreadTextEncoding() ) ).append( '\'' ).getStr() );
         }
 
-        // Format code is ignored if "LinkNumberFormatToSource" is set to "true" :-/
-        // See AxisHelper::getExplicitNumberFormatKeyForAxis()
-        rPropSet.setProperty(PROP_LinkNumberFormatToSource, makeAny(rNumberFormat.maFormatCode.isEmpty()));
+        // Setting "LinkNumberFormatToSource" does not really work, at least not for axis :-/
+        if (!bAxis)
+            rPropSet.setProperty(PROP_LinkNumberFormatToSource, makeAny(rNumberFormat.mbSourceLinked));
+        else
+            rPropSet.setProperty(PROP_LinkNumberFormatToSource, makeAny(rNumberFormat.maFormatCode.isEmpty()));
     }
 }
 
diff --git a/oox/source/drawingml/chart/seriesconverter.cxx b/oox/source/drawingml/chart/seriesconverter.cxx
index 2cccd3a..7d19bbe 100644
--- a/oox/source/drawingml/chart/seriesconverter.cxx
+++ b/oox/source/drawingml/chart/seriesconverter.cxx
@@ -134,7 +134,7 @@ void lclConvertLabelFormatting( PropertySet& rPropSet, ObjectFormatter& rFormatt
     if( !rDataLabel.mbDeleted )
     {
         // data label number format (percentage format wins over value format)
-        rFormatter.convertNumberFormat( rPropSet, rDataLabel.maNumberFormat, bShowPercent );
+        rFormatter.convertNumberFormat( rPropSet, rDataLabel.maNumberFormat, false, bShowPercent );
 
         // data label text formatting (frame formatting not supported by Chart2)
         rFormatter.convertTextFormatting( rPropSet, rDataLabel.mxTextProp, OBJECTTYPE_DATALABEL );


More information about the Libreoffice-commits mailing list