[Libreoffice-commits] core.git: 2 commits - sc/qa sc/source

Kohei Yoshida kohei.yoshida at collabora.com
Thu May 15 17:33:55 PDT 2014


 sc/qa/unit/subsequent_export-test.cxx |  113 ++++++++++++++++++++++++++++------
 sc/source/filter/xml/xmlexprt.cxx     |   14 +++-
 2 files changed, 107 insertions(+), 20 deletions(-)

New commits:
commit 48eccfb812284f43ba24c3be3903537ce954944d
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Thu May 15 20:32:05 2014 -0400

    fdo#77537: Exporting font names in edit text needs special handling.
    
    Change-Id: Ia9c29d37eaf962e0245920e50f534dd779af72dc

diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx
index b1f831d..737a881 100644
--- a/sc/source/filter/xml/xmlexprt.cxx
+++ b/sc/source/filter/xml/xmlexprt.cxx
@@ -1116,10 +1116,18 @@ const SvxFieldData* toXMLPropertyStates(
             case EE_CHAR_FONTINFO_CJK:
             case EE_CHAR_FONTINFO_CTL:
             {
-                if (!static_cast<const SvxFontItem*>(p)->QueryValue(aAny, pEntry->mnFlag))
-                    continue;
+                // Apparently font info needs special handling.
+                const SvxFontItem* pItem = static_cast<const SvxFontItem*>(p);
 
-                rPropStates.push_back(XMLPropertyState(nIndex, aAny));
+                sal_Int32 nIndexFontName = xMapper->GetEntryIndex(XML_NAMESPACE_STYLE, "font-name", 0);
+
+                if (nIndexFontName == -1 || nIndexFontName >= nEntryCount)
+                    break;
+
+                if (!pItem->QueryValue(aAny, MID_FONT_FAMILY_NAME))
+                    break;
+
+                rPropStates.push_back(XMLPropertyState(nIndexFontName, aAny));
             }
             break;
             case EE_CHAR_WEIGHT:
commit 90f7bd61fb1c4665051f721bb7721277a79eb267
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Thu May 15 20:27:44 2014 -0400

    fdo#77537: Write export test for this.
    
    Change-Id: I2960713b1005c5f91fe78d12e33f1786978eac67

diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx
index f984e69..ab25140 100644
--- a/sc/qa/unit/subsequent_export-test.cxx
+++ b/sc/qa/unit/subsequent_export-test.cxx
@@ -44,6 +44,7 @@
 #include <editeng/section.hxx>
 #include <editeng/crossedoutitem.hxx>
 #include <editeng/borderline.hxx>
+#include <editeng/fontitem.hxx>
 #include <formula/grammar.hxx>
 
 #include <com/sun/star/table/BorderLineStyle.hpp>
@@ -441,6 +442,19 @@ void setAttribute( ScFieldEditEngine& rEE, sal_Int32 nPara, sal_Int32 nStart, sa
     }
 }
 
+void setFont( ScFieldEditEngine& rEE, sal_Int32 nPara, sal_Int32 nStart, sal_Int32 nEnd, const OUString& rFontName )
+{
+    ESelection aSel;
+    aSel.nStartPara = aSel.nEndPara = nPara;
+    aSel.nStartPos = nStart;
+    aSel.nEndPos = nEnd;
+
+    SfxItemSet aItemSet = rEE.GetEmptyItemSet();
+    SvxFontItem aItem(FAMILY_MODERN, rFontName, "", PITCH_VARIABLE, RTL_TEXTENCODING_UTF8, EE_CHAR_FONTINFO);
+    aItemSet.Put(aItem);
+    rEE.QuickSetAttribs(aItemSet, aSel);
+}
+
 }
 
 void ScExportTest::testNamedRangeBugfdo62729()
@@ -525,6 +539,23 @@ void ScExportTest::testRichTextExportODS()
             return false;
         }
 
+        static bool isFont(const editeng::Section& rAttr, const OUString& rFontName)
+        {
+            if (rAttr.maAttributes.empty())
+                return false;
+
+            std::vector<const SfxPoolItem*>::const_iterator it = rAttr.maAttributes.begin(), itEnd = rAttr.maAttributes.end();
+            for (; it != itEnd; ++it)
+            {
+                const SfxPoolItem* p = *it;
+                if (p->Which() != EE_CHAR_FONTINFO)
+                    continue;
+
+                return static_cast<const SvxFontItem*>(p)->GetFamilyName() == rFontName;
+            }
+            return false;
+        }
+
         bool checkB2(const EditTextObject* pText) const
         {
             if (!pText)
@@ -649,27 +680,62 @@ void ScExportTest::testRichTextExportODS()
             return true;
         }
 
+        bool checkB7(const EditTextObject* pText) const
+        {
+            if (!pText)
+                return false;
+
+            if (pText->GetParagraphCount() != 1)
+                return false;
+
+            if (pText->GetText(0) != "Font1 and Font2")
+                return false;
+
+            std::vector<editeng::Section> aSecAttrs;
+            pText->GetAllSections(aSecAttrs);
+            if (aSecAttrs.size() != 3)
+                return false;
+
+            // First section should have "Courier" font applied.
+            const editeng::Section* pAttr = &aSecAttrs[0];
+            if (pAttr->mnParagraph != 0 ||pAttr->mnStart != 0 || pAttr->mnEnd != 5)
+                return false;
+
+            if (pAttr->maAttributes.size() != 1 || !isFont(*pAttr, "Courier"))
+                return false;
+
+            // Last section should have "Luxi Mono" applied.
+            pAttr = &aSecAttrs[2];
+            if (pAttr->mnParagraph != 0 ||pAttr->mnStart != 10 || pAttr->mnEnd != 15)
+                return false;
+
+            if (pAttr->maAttributes.size() != 1 || !isFont(*pAttr, "Luxi Mono"))
+                return false;
+
+            return true;
+        }
+
     } aCheckFunc;
 
     // Start with an empty document, put one edit text cell, and make sure it
     // survives the save and reload.
-    ScDocShellRef xOrigDocSh = loadDoc("empty.", ODS);
+    ScDocShellRef xOrigDocSh = loadDoc("empty.", ODS, true);
     ScDocument* pDoc = xOrigDocSh->GetDocument();
     CPPUNIT_ASSERT(pDoc);
     CPPUNIT_ASSERT_MESSAGE("This document should at least have one sheet.", pDoc->GetTableCount() > 0);
 
     // Insert an edit text cell.
-    ScFieldEditEngine& rEE = pDoc->GetEditEngine();
-    rEE.SetText("Bold and Italic");
+    ScFieldEditEngine* pEE = &pDoc->GetEditEngine();
+    pEE->SetText("Bold and Italic");
     // Set the 'Bold' part bold.
-    setAttribute(rEE, 0, 0, 4, EE_CHAR_WEIGHT);
+    setAttribute(*pEE, 0, 0, 4, EE_CHAR_WEIGHT);
     // Set the 'Italic' part italic.
-    setAttribute(rEE, 0, 9, 15, EE_CHAR_ITALIC);
+    setAttribute(*pEE, 0, 9, 15, EE_CHAR_ITALIC);
     ESelection aSel;
     aSel.nStartPara = aSel.nEndPara = 0;
 
     // Set this edit text to cell B2.
-    pDoc->SetEditText(ScAddress(1,1,0), rEE.CreateTextObject());
+    pDoc->SetEditText(ScAddress(1,1,0), pEE->CreateTextObject());
     const EditTextObject* pEditText = pDoc->GetEditText(ScAddress(1,1,0));
     CPPUNIT_ASSERT_MESSAGE("Incorret B2 value.", aCheckFunc.checkB2(pEditText));
 
@@ -680,20 +746,22 @@ void ScExportTest::testRichTextExportODS()
     pDoc = xNewDocSh->GetDocument();
     CPPUNIT_ASSERT(pDoc);
     CPPUNIT_ASSERT_MESSAGE("Reloaded document should at least have one sheet.", pDoc->GetTableCount() > 0);
+    pEE = &pDoc->GetEditEngine();
 
     // Make sure the content of B2 is still intact.
     CPPUNIT_ASSERT_MESSAGE("Incorret B2 value.", aCheckFunc.checkB2(pEditText));
 
     // Insert a multi-line content to B4.
-    rEE.Clear();
-    rEE.SetText("One\nTwo\nThree");
-    pDoc->SetEditText(ScAddress(3,1,0), rEE.CreateTextObject());
+    pEE->Clear();
+    pEE->SetText("One\nTwo\nThree");
+    pDoc->SetEditText(ScAddress(3,1,0), pEE->CreateTextObject());
     pEditText = pDoc->GetEditText(ScAddress(3,1,0));
     CPPUNIT_ASSERT_MESSAGE("Incorret B4 value.", aCheckFunc.checkB4(pEditText));
 
     // Reload the doc again, and check the content of B2 and B4.
     ScDocShellRef xNewDocSh2 = saveAndReload(xNewDocSh, ODS);
     pDoc = xNewDocSh2->GetDocument();
+    pEE = &pDoc->GetEditEngine();
     xNewDocSh->DoClose();
 
     pEditText = pDoc->GetEditText(ScAddress(1,1,0));
@@ -702,22 +770,31 @@ void ScExportTest::testRichTextExportODS()
     CPPUNIT_ASSERT_MESSAGE("Incorret B4 value.", aCheckFunc.checkB4(pEditText));
 
     // Insert a multi-line content to B5, but this time, set some empty paragraphs.
-    rEE.Clear();
-    rEE.SetText("\nTwo\nThree\n\nFive\n");
-    pDoc->SetEditText(ScAddress(4,1,0), rEE.CreateTextObject());
+    pEE->Clear();
+    pEE->SetText("\nTwo\nThree\n\nFive\n");
+    pDoc->SetEditText(ScAddress(4,1,0), pEE->CreateTextObject());
     pEditText = pDoc->GetEditText(ScAddress(4,1,0));
     CPPUNIT_ASSERT_MESSAGE("Incorret B5 value.", aCheckFunc.checkB5(pEditText));
 
     // Insert a text with strikethrough in B6.
-    rEE.Clear();
-    rEE.SetText("Strike Me");
+    pEE->Clear();
+    pEE->SetText("Strike Me");
     // Set the 'Strike' part strikethrough.
-    setAttribute(rEE, 0, 0, 6, EE_CHAR_STRIKEOUT);
-    pDoc->SetEditText(ScAddress(5,1,0), rEE.CreateTextObject());
+    setAttribute(*pEE, 0, 0, 6, EE_CHAR_STRIKEOUT);
+    pDoc->SetEditText(ScAddress(5,1,0), pEE->CreateTextObject());
     pEditText = pDoc->GetEditText(ScAddress(5,1,0));
     CPPUNIT_ASSERT_MESSAGE("Incorret B6 value.", aCheckFunc.checkB6(pEditText));
 
-    // Reload the doc again, and check the content of B2, B4 and B6.
+    // Insert a text with different font segments in B7.
+    pEE->Clear();
+    pEE->SetText("Font1 and Font2");
+    setFont(*pEE, 0, 0, 5, "Courier");
+    setFont(*pEE, 0, 10, 15, "Luxi Mono");
+    pDoc->SetEditText(ScAddress(6,1,0), pEE->CreateTextObject());
+    pEditText = pDoc->GetEditText(ScAddress(6,1,0));
+    CPPUNIT_ASSERT_MESSAGE("Incorret B7 value.", aCheckFunc.checkB7(pEditText));
+
+    // Reload the doc again, and check the content of B2, B4, B6 and B7.
     ScDocShellRef xNewDocSh3 = saveAndReload(xNewDocSh2, ODS);
     pDoc = xNewDocSh3->GetDocument();
     xNewDocSh2->DoClose();
@@ -730,6 +807,8 @@ void ScExportTest::testRichTextExportODS()
     CPPUNIT_ASSERT_MESSAGE("Incorret B5 value.", aCheckFunc.checkB5(pEditText));
     pEditText = pDoc->GetEditText(ScAddress(5,1,0));
     CPPUNIT_ASSERT_MESSAGE("Incorret B6 value.", aCheckFunc.checkB6(pEditText));
+    pEditText = pDoc->GetEditText(ScAddress(6,1,0));
+    CPPUNIT_ASSERT_MESSAGE("Incorret B7 value.", aCheckFunc.checkB7(pEditText));
 
     xNewDocSh3->DoClose();
 }


More information about the Libreoffice-commits mailing list