namespace {
size_t family_to_index(SfxStyleFamily family)
{ switch (family) { case SfxStyleFamily::Char: return0; case SfxStyleFamily::Para: return1; case SfxStyleFamily::Frame: return2; case SfxStyleFamily::Page: return3; case SfxStyleFamily::Pseudo: return4; case SfxStyleFamily::Table: return5; default: break;
}
assert(false); // only for compiler warning. all cases are handled in the switch return0;
}
}
void
IndexedStyleSheets::Reindex()
{
mPositionsByName.clear(); for (size_t i = 0; i < NUMBER_OF_FAMILIES; i++) {
mStyleSheetsByFamily[i].clear();
}
sal_Int32 i = 0; for (constauto& rxStyleSheet : mStyleSheets) {
SfxStyleSheetBase* p = rxStyleSheet.get(); Register(*p, i);
++i;
}
}
void
IndexedStyleSheets::ReindexOnNameChange(const SfxStyleSheetBase& style, const OUString& rOldName, const OUString& rNewName)
{
std::pair<MapType::const_iterator, MapType::const_iterator> range = mPositionsByName.equal_range(rOldName); for (MapType::const_iterator it = range.first; it != range.second; ++it)
{ if (mStyleSheets[it->second].get() == &style)
{ unsigned nPos = it->second;
mPositionsByName.erase(it);
mPositionsByName.insert(std::make_pair(rNewName, nPos)); break;
}
}
}
void
IndexedStyleSheets::AddStyleSheet(const rtl::Reference< SfxStyleSheetBase >& style)
{ if (!HasStyleSheet(style)) {
mStyleSheets.push_back(style); // since we just added an element to the vector, we can safely do -1 as it will always be >= 1 Register(*style, mStyleSheets.size()-1);
}
}
bool
IndexedStyleSheets::RemoveStyleSheet(const rtl::Reference< SfxStyleSheetBase >& style)
{
std::pair<MapType::const_iterator, MapType::const_iterator> range = mPositionsByName.equal_range(style->GetName()); for (MapType::const_iterator it = range.first; it != range.second; ++it)
{
sal_Int32 pos = it->second; if (mStyleSheets.at(pos) == style)
{
mStyleSheets.erase(mStyleSheets.begin() + pos);
Reindex(); returntrue;
}
} returnfalse;
}
std::vector<sal_Int32> IndexedStyleSheets::FindPositionsByName(const OUString& name) const
{
std::vector<sal_Int32> r;
std::pair<MapType::const_iterator, MapType::const_iterator> range = mPositionsByName.equal_range(name); for (MapType::const_iterator it = range.first; it != range.second; ++it) {
r.push_back(it->second);
} return r;
}
std::vector<sal_Int32> IndexedStyleSheets::FindPositionsByNameAndPredicate(const OUString& name,
StyleSheetPredicate& predicate, SearchBehavior behavior) const
{
std::vector<sal_Int32> r; auto range = mPositionsByName.equal_range(name); for (auto it = range.first; it != range.second; ++it) {
sal_Int32 pos = it->second;
SfxStyleSheetBase *ssheet = mStyleSheets.at(pos).get(); if (predicate.Check(*ssheet)) {
r.push_back(pos); if (behavior == SearchBehavior::ReturnFirst) { break;
}
}
} return r;
}
// tdf#161729 clear style sheets in same order as they were added // std::vector::clear() appears to delete elements in the // reverse order added. In the case of tdf#161729, a style // sheet's SfxItemSet can have a parent SfxItemSet and that // parent is the SfxItemSet for a style sheet added later. // Deleting from the end of the vector deletes a style sheet // and its SfxItemSet. If the now deleted SfxItemSet is a // parent SfxItemSet of a style sheet that was added earlier, // the style sheet added earlier will now have an SfxItemSet // with its parent set to an already deleted pointer. And so // a crash will occur when that earlier style sheet is deleted.
rxStyleSheet.clear();
}
mStyleSheets.clear();
mPositionsByName.clear();
}
IndexedStyleSheets::~IndexedStyleSheets()
{
}
bool
IndexedStyleSheets::HasStyleSheet(const rtl::Reference< SfxStyleSheetBase >& style) const
{
std::pair<MapType::const_iterator, MapType::const_iterator> range = mPositionsByName.equal_range(style->GetName()); for (MapType::const_iterator it = range.first; it != range.second; ++it)
{ if (mStyleSheets.at(it->second) == style) returntrue;
} returnfalse;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.