crashtesting: crash on reimport of xlsx output of forum-pl-2758.ods
also seen as a leak as nothing is erased by: maRegisteredCellAttributes.erase(&rCandidate); once the style names are changed and the std::set isn't ordered according to its predicate anymore. Easiest thing to do here seems to run the rename of a cell style through CellAttributeHelper so it can reinsert the affected ScPatternAttrs Change-Id: I13486701f378228792baa2b378709b7d530c3770 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182743 Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com> Tested-by: Jenkins
This commit is contained in:
@@ -92,6 +92,7 @@ public:
|
||||
|
||||
void CellStyleDeleted(const ScStyleSheet& rStyle);
|
||||
void CellStyleCreated(ScDocument& rDoc, const OUString& rName);
|
||||
void RenameCellStyle(ScStyleSheet& rStyle, const OUString& rNewName);
|
||||
void UpdateAllStyleSheets(ScDocument& rDoc);
|
||||
void AllStylesToNames();
|
||||
void ReIndexRegistered();
|
||||
|
||||
@@ -56,6 +56,9 @@ public:
|
||||
// Finds Para style with given name case-insensitively, or STR_STYLENAME_STANDARD
|
||||
ScStyleSheet* FindAutoStyle(const OUString& rName);
|
||||
|
||||
// Rename rStyle to rNewName, and update CellAttribute holder
|
||||
SC_DLLPUBLIC void Rename(SfxStyleSheetBase& rStyle, const OUString& rNewName, SfxStyleFamily eFam);
|
||||
|
||||
SC_DLLPUBLIC virtual SfxStyleSheetBase& Make( const OUString&, SfxStyleFamily eFam,
|
||||
SfxStyleSearchBits nMask = SfxStyleSearchBits::All,
|
||||
const OUString& rParentStyleSheetName = u""_ustr) override;
|
||||
|
||||
@@ -197,6 +197,33 @@ void CellAttributeHelper::CellStyleDeleted(const ScStyleSheet& rStyle)
|
||||
}
|
||||
}
|
||||
|
||||
void CellAttributeHelper::RenameCellStyle(ScStyleSheet& rStyle, const OUString& rNewName)
|
||||
{
|
||||
std::vector<const ScPatternAttr*> aChanged;
|
||||
|
||||
const OUString& rCandidateStyleName = rStyle.GetName();
|
||||
auto it = maRegisteredCellAttributes.lower_bound(&rCandidateStyleName);
|
||||
while(it != maRegisteredCellAttributes.end())
|
||||
{
|
||||
const ScPatternAttr* pCheck = *it;
|
||||
if (CompareStringPtr(pCheck->GetStyleName(), &rCandidateStyleName) != 0)
|
||||
break;
|
||||
if (&rStyle == pCheck->GetStyleSheet())
|
||||
{
|
||||
aChanged.push_back(pCheck);
|
||||
// The name will change, we have to re-insert it
|
||||
it = maRegisteredCellAttributes.erase(it);
|
||||
}
|
||||
else
|
||||
++it;
|
||||
}
|
||||
|
||||
rStyle.SetName(rNewName);
|
||||
|
||||
for (const ScPatternAttr* p : aChanged)
|
||||
maRegisteredCellAttributes.insert(p);
|
||||
}
|
||||
|
||||
void CellAttributeHelper::CellStyleCreated(ScDocument& rDoc, const OUString& rName)
|
||||
{
|
||||
// If a style was created, don't keep any pattern with its name string in the pool,
|
||||
|
||||
@@ -114,6 +114,17 @@ rtl::Reference<SfxStyleSheetBase> ScStyleSheetPool::Create( const SfxStyleSheetB
|
||||
return new ScStyleSheet( static_cast<const ScStyleSheet&>(rStyle) );
|
||||
}
|
||||
|
||||
void ScStyleSheetPool::Rename(SfxStyleSheetBase& rStyle, const OUString& rNewName, SfxStyleFamily eFamily)
|
||||
{
|
||||
if (eFamily == SfxStyleFamily::Para)
|
||||
{
|
||||
assert(nullptr != pDoc);
|
||||
pDoc->getCellAttributeHelper().RenameCellStyle(static_cast<ScStyleSheet&>(rStyle), rNewName);
|
||||
return;
|
||||
}
|
||||
rStyle.SetName(rNewName);
|
||||
}
|
||||
|
||||
void ScStyleSheetPool::Remove( SfxStyleSheetBase* pStyle )
|
||||
{
|
||||
if ( pStyle )
|
||||
|
||||
@@ -231,7 +231,7 @@ ScStyleSheet& lclMakeStyleSheet( ScStyleSheetPool& rPool, const OUString& rStyle
|
||||
// rename existing style
|
||||
if( pOldStyleSheet && bForceName )
|
||||
{
|
||||
pOldStyleSheet->SetName( aNewName );
|
||||
rPool.Rename(*pOldStyleSheet, aNewName, eFamily);
|
||||
aNewName = rStyleName;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user