tdf#107723 Import font name from text portions in shapes

Change-Id: Ib9b73b5c05ec2e6846ea3adc950ccab5d1c0a9b0
Reviewed-on: https://gerrit.libreoffice.org/40439
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
diff --git a/include/oox/vml/vmltextbox.hxx b/include/oox/vml/vmltextbox.hxx
index 0f0828c..8b32713 100644
--- a/include/oox/vml/vmltextbox.hxx
+++ b/include/oox/vml/vmltextbox.hxx
@@ -49,6 +49,8 @@ struct TextParagraphModel
struct OOX_DLLPUBLIC TextFontModel
{
    OptValue< OUString > moName;     ///< Font name.
    OptValue< OUString > moNameAsian; ///< Asian font name.
    OptValue< OUString > moNameComplex; ///< Complex font name.
    OptValue< OUString > moColor;    ///< Font color, HTML encoded, sort of.
    OptValue< sal_Int32 > monSize;          ///< Font size in twips.
    OptValue< sal_Int32 > monUnderline;     ///< Single or double underline.
diff --git a/oox/source/vml/vmltextbox.cxx b/oox/source/vml/vmltextbox.cxx
index ac8c512..cfa07b0 100644
--- a/oox/source/vml/vmltextbox.cxx
+++ b/oox/source/vml/vmltextbox.cxx
@@ -82,6 +82,20 @@ void TextBox::convert(const uno::Reference<drawing::XShape>& xShape) const
        std::vector<beans::PropertyValue> aPropVec;
        const TextParagraphModel& rParagraph = aIt->maParagraph;
        const TextFontModel& rFont = aIt->maFont;
        if (rFont.moName.has())
        {
            aPropertyValue.Name = "CharFontName";
            aPropertyValue.Value <<= rFont.moName.get();
            aPropVec.push_back(aPropertyValue);

            aPropertyValue.Name = "CharFontNameAsian";
            aPropertyValue.Value <<= rFont.moNameAsian.get();
            aPropVec.push_back(aPropertyValue);

            aPropertyValue.Name = "CharFontNameComplex";
            aPropertyValue.Value <<= rFont.moNameComplex.get();
            aPropVec.push_back(aPropertyValue);
        }
        if (rFont.mobBold.has())
        {
            aPropertyValue.Name = "CharWeight";
diff --git a/oox/source/vml/vmltextboxcontext.cxx b/oox/source/vml/vmltextboxcontext.cxx
index 239e53c..c46ff71 100644
--- a/oox/source/vml/vmltextboxcontext.cxx
+++ b/oox/source/vml/vmltextboxcontext.cxx
@@ -139,6 +139,12 @@ void TextPortionContext::onStartElement(const AttributeList& rAttribs)
        case W_TOKEN(rPr):
        case W_TOKEN(t):
        break;
        case W_TOKEN(rFonts):
            // See https://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.runfonts(v=office.14).aspx
            maFont.moName = rAttribs.getString(W_TOKEN(ascii));
            maFont.moNameAsian = rAttribs.getString(W_TOKEN(eastAsia));
            maFont.moNameComplex = rAttribs.getString(W_TOKEN(cs));
        break;
        default:
            SAL_INFO("oox", "unhandled: 0x" << std::hex<< getCurrentElement());
        break;
diff --git a/sw/qa/extras/ooxmlimport/data/groupshape-fontname.docx b/sw/qa/extras/ooxmlimport/data/groupshape-fontname.docx
new file mode 100644
index 0000000..025f737
--- /dev/null
+++ b/sw/qa/extras/ooxmlimport/data/groupshape-fontname.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index fef6d06..bbbf1e6 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -1430,6 +1430,17 @@ DECLARE_OOXMLIMPORT_TEST(testTdf109524, "tdf109524.docx")
    CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(xTables->getByIndex(0), "RelativeWidth"));
}

DECLARE_OOXMLIMPORT_TEST(testGroupShapeFontName, "groupshape-fontname.docx")
{
    // Font names inside a group shape were not imported
    uno::Reference<container::XIndexAccess> xGroup(getShape(1), uno::UNO_QUERY);
    uno::Reference<text::XText> xText = uno::Reference<text::XTextRange>(xGroup->getByIndex(1), uno::UNO_QUERY)->getText();

    CPPUNIT_ASSERT_EQUAL(OUString("Calibri"), getProperty<OUString>(getRun(getParagraphOfText(1, xText), 1), "CharFontName"));
    CPPUNIT_ASSERT_EQUAL(OUString("Calibri"), getProperty<OUString>(getRun(getParagraphOfText(1, xText), 1), "CharFontNameComplex"));
    CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(getRun(getParagraphOfText(1, xText), 1), "CharFontNameAsian"));
}

// tests should only be added to ooxmlIMPORT *if* they fail round-tripping in ooxmlEXPORT

CPPUNIT_PLUGIN_IMPLEMENT();