sc/qa/unit/data/xls/cellformat.xls    |binary
 sc/qa/unit/subsequent_export-test.cxx |   17 +++++++++++++++++
 sc/source/filter/excel/xestring.cxx   |   11 ++++++++++-
 sc/source/filter/excel/xetable.cxx    |   25 ++++++++++++++-----------
 sc/source/filter/inc/xestring.hxx     |    4 +++-
 5 files changed, 44 insertions(+), 13 deletions(-)

New commits:
commit a2007d436e41db65374ced89039000a732a04dee
Author: Katarina Behrens <katarina.behr...@cib.de>
Date:   Mon Feb 29 11:23:33 2016 +0100

    tdf#98083: Always save cell format
    
    it was pretty bad idea not to save it for rich-formatted cells
    (tdf#92296) as there is more to cell format than just a font
    
    Due to a bug in xpath helper I'm backporting only part of the test
    
    (cherry picked from commit 7945cdf0ea570302a04550540848c03c0cd030ab)
    
    Change-Id: I0e5e7d7187c69519bb8f4de2b627e385fccd3d46
    Reviewed-on: https://gerrit.libreoffice.org/23032
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Eike Rathke <er...@redhat.com>

diff --git a/sc/qa/unit/data/xls/cellformat.xls 
b/sc/qa/unit/data/xls/cellformat.xls
new file mode 100644
index 0000000..bdb6c30
Binary files /dev/null and b/sc/qa/unit/data/xls/cellformat.xls differ
diff --git a/sc/qa/unit/subsequent_export-test.cxx 
b/sc/qa/unit/subsequent_export-test.cxx
index 475570e..388d6ae 100644
--- a/sc/qa/unit/subsequent_export-test.cxx
+++ b/sc/qa/unit/subsequent_export-test.cxx
@@ -100,6 +100,7 @@ public:
     void testMiscRowHeightExport();
     void testNamedRangeBugfdo62729();
     void testRichTextExportODS();
+    void testRichTextCellFormat();
     void testFormulaRefSheetNameODS();
 
     void testCellValuesExportODS();
@@ -174,6 +175,7 @@ public:
     CPPUNIT_TEST(testMiscRowHeightExport);
     CPPUNIT_TEST(testNamedRangeBugfdo62729);
     CPPUNIT_TEST(testRichTextExportODS);
+    CPPUNIT_TEST(testRichTextCellFormat);
     CPPUNIT_TEST(testFormulaRefSheetNameODS);
     CPPUNIT_TEST(testCellValuesExportODS);
     CPPUNIT_TEST(testCellNoteExportODS);
@@ -1012,6 +1014,21 @@ void ScExportTest::testRichTextExportODS()
     xNewDocSh3->DoClose();
 }
 
+void ScExportTest::testRichTextCellFormat()
+{
+    ScDocShellRef xDocSh = loadDoc("cellformat.", FORMAT_XLS);
+    CPPUNIT_ASSERT(xDocSh.Is());
+
+    xmlDocPtr pSheet = XPathHelper::parseExport(&(*xDocSh), m_xSFactory, 
"xl/worksheets/sheet1.xml", FORMAT_XLSX);
+    CPPUNIT_ASSERT(pSheet);
+
+    // make sure the only cell in this doc is assigned some formatting record
+    OUString aCellFormat = getXPath(pSheet, 
"/x:worksheet/x:sheetData/x:row/x:c", "s");
+    CPPUNIT_ASSERT_MESSAGE("Cell format is missing", !aCellFormat.isEmpty());
+
+    xDocSh->DoClose();
+}
+
 void ScExportTest::testFormulaRefSheetNameODS()
 {
     ScDocShellRef xDocSh = loadDoc("formula-quote-in-sheet-name.", FORMAT_ODS, 
true);
diff --git a/sc/source/filter/excel/xestring.cxx 
b/sc/source/filter/excel/xestring.cxx
index 58d1acef..7e87879 100644
--- a/sc/source/filter/excel/xestring.cxx
+++ b/sc/source/filter/excel/xestring.cxx
@@ -178,12 +178,21 @@ void XclExpString::LimitFormatCount( sal_uInt16 nMaxCount 
)
         maFormats.erase( maFormats.begin() + nMaxCount, maFormats.end() );
 }
 
-sal_uInt16 XclExpString::RemoveLeadingFont()
+sal_uInt16 XclExpString::GetLeadingFont()
 {
     sal_uInt16 nFontIdx = EXC_FONT_NOTFOUND;
     if( !maFormats.empty() && (maFormats.front().mnChar == 0) )
     {
         nFontIdx = maFormats.front().mnFontIdx;
+    }
+    return nFontIdx;
+}
+
+sal_uInt16 XclExpString::RemoveLeadingFont()
+{
+    sal_uInt16 nFontIdx = GetLeadingFont();
+    if( nFontIdx != EXC_FONT_NOTFOUND )
+    {
         maFormats.erase( maFormats.begin() );
     }
     return nFontIdx;
diff --git a/sc/source/filter/excel/xetable.cxx 
b/sc/source/filter/excel/xetable.cxx
index 866c9ab..a13395b 100644
--- a/sc/source/filter/excel/xetable.cxx
+++ b/sc/source/filter/excel/xetable.cxx
@@ -724,18 +724,21 @@ void XclExpLabelCell::Init( const XclExpRoot& rRoot,
     mnSstIndex = 0;
 
     const XclFormatRunVec& rFormats = mxText->GetFormats();
-    // Create the cell format and remove formatting of the leading run
-    // if the entire string is equally formatted
+    // remove formatting of the leading run if the entire string
+    // is equally formatted
+    sal_uInt16 nXclFont = EXC_FONT_NOTFOUND;
     if( rFormats.size() == 1 )
-    {
-        sal_uInt16 nXclFont = mxText->RemoveLeadingFont();
-        if( GetXFId() == EXC_XFID_NOTFOUND )
-        {
-            OSL_ENSURE( nXclFont != EXC_FONT_NOTFOUND, "XclExpLabelCell::Init 
- leading font not found" );
-            bool bForceLineBreak = mxText->IsWrapped();
-            SetXFId( rRoot.GetXFBuffer().InsertWithFont( pPattern, 
ApiScriptType::WEAK, nXclFont, bForceLineBreak ) );
-        }
-    }
+        nXclFont = mxText->RemoveLeadingFont();
+    else
+        nXclFont = mxText->GetLeadingFont();
+
+   // create cell format
+   if( GetXFId() == EXC_XFID_NOTFOUND )
+   {
+       OSL_ENSURE( nXclFont != EXC_FONT_NOTFOUND, "XclExpLabelCell::Init - 
leading font not found" );
+       bool bForceLineBreak = mxText->IsWrapped();
+       SetXFId( rRoot.GetXFBuffer().InsertWithFont( pPattern, 
ApiScriptType::WEAK, nXclFont, bForceLineBreak ) );
+   }
 
     // get auto-wrap attribute from cell format
     const XclExpXF* pXF = rRoot.GetXFBuffer().GetXFById( GetXFId() );
diff --git a/sc/source/filter/inc/xestring.hxx 
b/sc/source/filter/inc/xestring.hxx
index 0109972..b00dc6c 100644
--- a/sc/source/filter/inc/xestring.hxx
+++ b/sc/source/filter/inc/xestring.hxx
@@ -108,7 +108,9 @@ public:
     void                AppendTrailingFormat( sal_uInt16 nFontIdx );
     /** Removes formatting runs at the end, if the string contains too much. */
     void                LimitFormatCount( sal_uInt16 nMaxCount );
-    /** Removes and returns the font index for the first char from the 
formatting runs, otherwise EXC_FONT_NOTFOUND. */
+    /** Returns the font index of the first char in the formatting run, or 
EXC_FONT_NOTFOUND. */
+    sal_uInt16          GetLeadingFont();
+    /** The same as above + additionally remove the given font from the 
formatting run*/
     sal_uInt16          RemoveLeadingFont();
 
     // get data ---------------------------------------------------------------
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to