summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
Diffstat (limited to 'sw')
-rw-r--r--sw/inc/doc.hxx2
-rw-r--r--sw/qa/extras/accessibility/dialogs.cxx2
-rw-r--r--sw/qa/uitest/ui/frmdlg/frmdlg.py4
-rw-r--r--sw/source/core/doc/doclay.cxx71
4 files changed, 50 insertions, 29 deletions
diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index ba18eedd7ce0..a3fa61143214 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -306,7 +306,6 @@ private:
sal_uInt32 mnRsid; //< current session ID of the document
sal_uInt32 mnRsidRoot; //< session ID when the document was created
- std::unordered_map<sal_uInt16, sal_Int32> maDefaultFlyNameCounters; //< counters used to generate unique fly names
oslInterlockedCount mReferenceCount;
@@ -759,7 +758,6 @@ public:
// LayoutFormats (frames, DrawObjects), sometimes const sometimes not
const sw::FrameFormats<sw::SpzFrameFormat*>* GetSpzFrameFormats() const { return mpSpzFrameFormatTable.get(); }
sw::FrameFormats<sw::SpzFrameFormat*>* GetSpzFrameFormats() { return mpSpzFrameFormatTable.get(); }
- sal_Int32 GetNextDefaultFlyNumber(sal_uInt16 nWhich) { return ++maDefaultFlyNameCounters[nWhich]; }
const SwFrameFormat *GetDfltFrameFormat() const { return mpDfltFrameFormat.get(); }
SwFrameFormat *GetDfltFrameFormat() { return mpDfltFrameFormat.get(); }
diff --git a/sw/qa/extras/accessibility/dialogs.cxx b/sw/qa/extras/accessibility/dialogs.cxx
index 6343d69e63cd..451b90ce1206 100644
--- a/sw/qa/extras/accessibility/dialogs.cxx
+++ b/sw/qa/extras/accessibility/dialogs.cxx
@@ -186,7 +186,7 @@ CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestFrameDialog)
CPPUNIT_ASSERT(activateMenuItem(u"Insert", u"Frame", u"Frame..."));
CPPUNIT_ASSERT(dialogWaiter->waitEndDialog());
- CPPUNIT_ASSERT_EQUAL(u"<PARAGRAPH/><TEXT_FRAME name=\"Frame2\"><PARAGRAPH/></TEXT_FRAME>"_ustr,
+ CPPUNIT_ASSERT_EQUAL(u"<PARAGRAPH/><TEXT_FRAME name=\"Frame1\"><PARAGRAPH/></TEXT_FRAME>"_ustr,
collectText());
}
diff --git a/sw/qa/uitest/ui/frmdlg/frmdlg.py b/sw/qa/uitest/ui/frmdlg/frmdlg.py
index db229f88bec4..a37062c1d392 100644
--- a/sw/qa/uitest/ui/frmdlg/frmdlg.py
+++ b/sw/qa/uitest/ui/frmdlg/frmdlg.py
@@ -78,7 +78,7 @@ class Test(UITestCase):
# Without the accompanying fix in place, this test would have failed with:
# AssertionError: 0 != 2000.0
# i.e. the width was empty instead of the size from the UI.
- self.assertEqual(xComponent.TextFrames.Frame2.Size.Width, expected_mm100)
+ self.assertEqual(xComponent.TextFrames.Frame1.Size.Width, expected_mm100)
def test_insert_floating_table(self):
with self.ui_test.create_doc_in_start_center("writer") as xComponent:
@@ -101,7 +101,7 @@ class Test(UITestCase):
# Without the accompanying fix in place, this test would have failed with:
# AssertionError: 2 != 0
# i.e. the frame had a border by default when the table already had its own border.
- self.assertEqual(xComponent.TextFrames.Frame2.LeftBorder.LineWidth, 0)
+ self.assertEqual(xComponent.TextFrames.Frame1.LeftBorder.LineWidth, 0)
def test_insert_simple_frame(self):
# Given a Writer document:
diff --git a/sw/source/core/doc/doclay.cxx b/sw/source/core/doc/doclay.cxx
index 6f00b9fbb6f1..9353610dcb96 100644
--- a/sw/source/core/doc/doclay.cxx
+++ b/sw/source/core/doc/doclay.cxx
@@ -1276,43 +1276,50 @@ SwFlyFrameFormat* SwDoc::InsertDrawLabel(
return pNewFormat;
}
-static bool lcl_checkNameUnique(const SdrObject& rObj, const OUString& rCmpName)
+static void lcl_collectUsedNums(std::vector<unsigned int>& rSetFlags, sal_Int32 nNmLen, std::u16string_view rName, std::u16string_view rCmpName)
{
- if (rCmpName == rObj.GetName())
- return false;
+ if (o3tl::starts_with(rName, rCmpName))
+ {
+ // Only get and set the Flag
+ const sal_Int32 nNum = o3tl::toInt32(rName.substr(nNmLen)) - 1;
+ if (nNum >= 0)
+ rSetFlags.push_back(nNum);
+ }
+}
+
+static void lcl_collectUsedNums(std::vector<unsigned int>& rSetFlags, sal_Int32 nNmLen, const SdrObject& rObj, const OUString& rCmpName)
+{
+ OUString sName = rObj.GetName();
+ lcl_collectUsedNums(rSetFlags, nNmLen, sName, rCmpName);
// tdf#122487 take groups into account, iterate and recurse through their
// contents for name collision check
if (!rObj.IsGroupObject())
- return true;
+ return;
const SdrObjList* pSub(rObj.GetSubList());
assert(pSub && "IsGroupObject is implemented as GetSubList != nullptr");
for (const rtl::Reference<SdrObject>& pObj : *pSub)
{
- if (!lcl_checkNameUnique(*pObj, rCmpName))
- return false;
+ lcl_collectUsedNums(rSetFlags, nNmLen, *pObj, rCmpName);
}
- return true;
}
-static bool lcl_checkNameUnique(const SwDoc& rDoc, sal_uInt16 eType, const OUString& rCmpName)
+namespace
{
- for(sw::SpzFrameFormat* pFlyFormat: *rDoc.GetSpzFrameFormats())
+ int first_available_number(std::vector<unsigned int>& numbers)
{
- if (eType != pFlyFormat->Which())
- continue;
- if (eType == RES_DRAWFRMFMT)
+ std::sort(numbers.begin(), numbers.end());
+ auto last = std::unique(numbers.begin(), numbers.end());
+ numbers.erase(last, numbers.end());
+
+ for (size_t i = 0; i < numbers.size(); ++i)
{
- const SdrObject *pObj = pFlyFormat->FindSdrObject();
- if (pObj)
- if (!lcl_checkNameUnique(*pObj, rCmpName))
- return false;
+ if (numbers[i] != i)
+ return i;
}
- if (pFlyFormat->GetName() == rCmpName)
- return false;
+ return numbers.size();
}
- return true;
}
static OUString lcl_GetUniqueFlyName(const SwDoc& rDoc, TranslateId pDefStrId, sal_uInt16 eType, std::u16string_view rPrefix = std::u16string_view(), SwNodeType nNdTyp = SwNodeType::NONE)
@@ -1346,13 +1353,29 @@ static OUString lcl_GetUniqueFlyName(const SwDoc& rDoc, TranslateId pDefStrId, s
return aTmp;
}
- OUString aBaseName(SwResId(pDefStrId));
- for (;;)
+ OUString aName(SwResId(pDefStrId));
+ sal_Int32 nNmLen = aName.getLength();
+
+ std::vector<unsigned int> aUsedNums;
+ aUsedNums.reserve(rDoc.GetSpzFrameFormats()->size());
+
+ for(sw::SpzFrameFormat* pFlyFormat: *rDoc.GetSpzFrameFormats())
{
- OUString aName = aBaseName + OUString::number(const_cast<SwDoc&>(rDoc).GetNextDefaultFlyNumber(eType));
- if (lcl_checkNameUnique(rDoc, eType, aName))
- return aName;
+ if (eType != pFlyFormat->Which())
+ continue;
+ if (eType == RES_DRAWFRMFMT)
+ {
+ const SdrObject *pObj = pFlyFormat->FindSdrObject();
+ if (pObj)
+ lcl_collectUsedNums(aUsedNums, nNmLen, *pObj, aName);
+ }
+
+ lcl_collectUsedNums(aUsedNums, nNmLen, pFlyFormat->GetName(), aName);
}
+
+ // All numbers are flagged accordingly, so determine the right one
+ auto nNum = first_available_number(aUsedNums) + 1;
+ return aName + OUString::number(nNum);
}
OUString SwDoc::GetUniqueGrfName(std::u16string_view rPrefix) const