sw: numbering rule is not constructed for numbering type "None"

Previously during refactoring this condition was lost. And it
is possible practically that we have all format for numbering
(prefix, suffix, format string, etc) but numbering is disabled.

Change-Id: I0c8ab446753308ad80b8d133824a936dacf6cc82
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120082
Tested-by: Thorsten Behrens <thorsten.behrens@allotropia.de>
Reviewed-by: Thorsten Behrens <thorsten.behrens@allotropia.de>
diff --git a/sw/qa/extras/odfexport/data/tdf143605.odt b/sw/qa/extras/odfexport/data/tdf143605.odt
new file mode 100644
index 0000000..7fb597e
--- /dev/null
+++ b/sw/qa/extras/odfexport/data/tdf143605.odt
Binary files differ
diff --git a/sw/qa/extras/odfexport/odfexport2.cxx b/sw/qa/extras/odfexport/odfexport2.cxx
index db2110c..8e888f1 100644
--- a/sw/qa/extras/odfexport/odfexport2.cxx
+++ b/sw/qa/extras/odfexport/odfexport2.cxx
@@ -60,6 +60,12 @@ DECLARE_ODFEXPORT_TEST(testTdf137199, "tdf137199.docx")
    CPPUNIT_ASSERT_EQUAL(OUString("HELLO2WORLD!"), getProperty<OUString>(getParagraph(4), "ListLabelString"));
}

DECLARE_ODFEXPORT_TEST(testTdf143605, "tdf143605.odt")
{
    // With numering type "none" there should be nothing
    CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(getParagraph(1), "ListLabelString"));
}

DECLARE_ODFEXPORT_TEST(testListFormatDocx, "listformat.docx")
{
    // Ensure in resulting ODT we also have not just prefix/suffix, but custom delimiters
diff --git a/sw/source/core/doc/number.cxx b/sw/source/core/doc/number.cxx
index 674a242..3d7544e 100644
--- a/sw/source/core/doc/number.cxx
+++ b/sw/source/core/doc/number.cxx
@@ -657,102 +657,102 @@ OUString SwNumRule::MakeNumString( const SwNumberTree::tNumberVector & rNumVecto
        nLevel = _nRestrictToThisLevel;
    }

    if (nLevel < MAXLEVEL)
    assert(nLevel < MAXLEVEL);

    const SwNumFormat& rMyNFormat = Get( o3tl::narrowing<sal_uInt16>(nLevel) );

    if (rMyNFormat.GetNumberingType() == SVX_NUM_NUMBER_NONE)
        return OUString();

    css::lang::Locale aLocale( LanguageTag::convertToLocale(nLang));

    if (rMyNFormat.HasListFormat())
    {
        const SwNumFormat& rMyNFormat = Get( o3tl::narrowing<sal_uInt16>(nLevel) );
        OUString sLevelFormat = rMyNFormat.GetListFormat(bInclStrings);

        // In this case we are ignoring GetIncludeUpperLevels: we put all
        // level numbers requested by level format
        for (SwNumberTree::tNumberVector::size_type i=0; i <= nLevel; ++i)
        {
            css::lang::Locale aLocale( LanguageTag::convertToLocale(nLang));

            if (rMyNFormat.HasListFormat())
            OUString sReplacement;
            if (rNumVector[i])
            {
                OUString sLevelFormat = rMyNFormat.GetListFormat(bInclStrings);

                // In this case we are ignoring GetIncludeUpperLevels: we put all
                // level numbers requested by level format
                for (SwNumberTree::tNumberVector::size_type i=0; i <= nLevel; ++i)
                {
                    OUString sReplacement;
                    if (rNumVector[i])
                    {
                        if (bOnlyArabic)
                            sReplacement = OUString::number(rNumVector[i]);
                        else
                            sReplacement = Get(i).GetNumStr(rNumVector[i], aLocale);
                    }
                    else
                        sReplacement = "0";        // all 0 level are a 0

                    OUString sFind("%" + OUString::number(i + 1) + "%");
                    sal_Int32 nPosition = sLevelFormat.indexOf(sFind);
                    if (nPosition >= 0)
                        sLevelFormat = sLevelFormat.replaceAt(nPosition, sFind.getLength(), sReplacement);
                }

                aStr = sLevelFormat;
                if (bOnlyArabic)
                    sReplacement = OUString::number(rNumVector[i]);
                else
                    sReplacement = Get(i).GetNumStr(rNumVector[i], aLocale);
            }
            else
                sReplacement = "0";        // all 0 level are a 0

            OUString sFind("%" + OUString::number(i + 1) + "%");
            sal_Int32 nPosition = sLevelFormat.indexOf(sFind);
            if (nPosition >= 0)
                sLevelFormat = sLevelFormat.replaceAt(nPosition, sFind.getLength(), sReplacement);
        }

        aStr = sLevelFormat;
    }
    else
    {
        // Fallback case: level format is not defined
        // So use old way with levels joining by dot "."
        SwNumberTree::tNumberVector::size_type i = nLevel;

        if (!IsContinusNum() &&
            // - do not include upper levels, if level isn't numbered.
            rMyNFormat.GetNumberingType() != SVX_NUM_NUMBER_NONE &&
            rMyNFormat.GetIncludeUpperLevels())  // Just the own level?
        {
            sal_uInt8 n = rMyNFormat.GetIncludeUpperLevels();
            if (1 < n)
            {
                // Fallback case: level format is not defined
                // So use old way with levels joining by dot "."
                SwNumberTree::tNumberVector::size_type i = nLevel;
                if (i + 1 >= n)
                    i -= n - 1;
                else
                    i = 0;
            }
        }

                if (!IsContinusNum() &&
                    // - do not include upper levels, if level isn't numbered.
                    rMyNFormat.GetNumberingType() != SVX_NUM_NUMBER_NONE &&
                    rMyNFormat.GetIncludeUpperLevels())  // Just the own level?
                {
                    sal_uInt8 n = rMyNFormat.GetIncludeUpperLevels();
                    if (1 < n)
                    {
                        if (i + 1 >= n)
                            i -= n - 1;
                        else
                            i = 0;
                    }
                }
        for (; i <= nLevel; ++i)
        {
            const SwNumFormat& rNFormat = Get(i);
            if (SVX_NUM_NUMBER_NONE == rNFormat.GetNumberingType())
            {
                // Should 1.1.1 --> 2. NoNum --> 1..1 or 1.1 ??
                //                 if( i != rNum.nMyLevel )
                //                    aStr += ".";
                continue;
            }

                for (; i <= nLevel; ++i)
                {
                    const SwNumFormat& rNFormat = Get(i);
                    if (SVX_NUM_NUMBER_NONE == rNFormat.GetNumberingType())
                    {
                        // Should 1.1.1 --> 2. NoNum --> 1..1 or 1.1 ??
                        //                 if( i != rNum.nMyLevel )
                        //                    aStr += ".";
                        continue;
                    }
            if (rNumVector[i])
            {
                if (bOnlyArabic)
                    aStr.append(rNumVector[i]);
                else
                    aStr.append(rNFormat.GetNumStr(rNumVector[i], aLocale));
            }
            else
                aStr.append("0");        // all 0 level are a 0
            if (i != nLevel && !aStr.isEmpty())
                aStr.append(".");
        }

                    if (rNumVector[i])
                    {
                        if (bOnlyArabic)
                            aStr.append(rNumVector[i]);
                        else
                            aStr.append(rNFormat.GetNumStr(rNumVector[i], aLocale));
                    }
                    else
                        aStr.append("0");        // all 0 level are a 0
                    if (i != nLevel && !aStr.isEmpty())
                        aStr.append(".");
                }
        // The type doesn't have any number, so don't append
        // the post-/prefix string
        if (bInclStrings && !bOnlyArabic &&
            SVX_NUM_CHAR_SPECIAL != rMyNFormat.GetNumberingType() &&
            SVX_NUM_BITMAP != rMyNFormat.GetNumberingType())
        {
            const OUString& sPrefix = rMyNFormat.GetPrefix();
            const OUString& sSuffix = rMyNFormat.GetSuffix();

                // The type doesn't have any number, so don't append
                // the post-/prefix string
                if (bInclStrings && !bOnlyArabic &&
                    SVX_NUM_CHAR_SPECIAL != rMyNFormat.GetNumberingType() &&
                    SVX_NUM_BITMAP != rMyNFormat.GetNumberingType())
                {
                    const OUString& sPrefix = rMyNFormat.GetPrefix();
                    const OUString& sSuffix = rMyNFormat.GetSuffix();

                    aStr.insert(0, sPrefix);
                    aStr.append(sSuffix);
                    if (pExtremities)
                    {
                        pExtremities->nPrefixChars = sPrefix.getLength();
                        pExtremities->nSuffixChars = sSuffix.getLength();
                    }
                }
            aStr.insert(0, sPrefix);
            aStr.append(sSuffix);
            if (pExtremities)
            {
                pExtremities->nPrefixChars = sPrefix.getLength();
                pExtremities->nSuffixChars = sSuffix.getLength();
            }
        }
    }