From 8f8ee6fd2c50572c44363a6d5d23bd9d192fe08d Mon Sep 17 00:00:00 2001 From: Tobias Lippert Date: Thu, 26 Jun 2014 19:59:15 +0200 Subject: fdo#76754 Add Positions by StyleSheetFamily to IndexedStyleSheets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I4eade2d00d145d8f65ccd70a1c6bbd0a134a1ad5 Reviewed-on: https://gerrit.libreoffice.org/10346 Reviewed-by: Caolán McNamara Tested-by: Caolán McNamara --- include/svl/IndexedStyleSheets.hxx | 10 ++++- svl/qa/unit/items/test_IndexedStyleSheets.cxx | 27 +++++++++++++- svl/source/items/IndexedStyleSheets.cxx | 54 ++++++++++++++++++++++++--- svl/source/items/style.cxx | 31 ++++++++++++++- 4 files changed, 113 insertions(+), 9 deletions(-) diff --git a/include/svl/IndexedStyleSheets.hxx b/include/svl/IndexedStyleSheets.hxx index 350628f274e3..bc5dea7f37a2 100644 --- a/include/svl/IndexedStyleSheets.hxx +++ b/include/svl/IndexedStyleSheets.hxx @@ -12,6 +12,7 @@ #include +#include #include #include @@ -156,10 +157,15 @@ public: GetNthStyleSheetThatMatchesPredicate(unsigned n, StyleSheetPredicate& predicate, unsigned startAt = 0); + /** Get the positions of the style sheets which belong to a certain family. + */ + const std::vector& + GetStyleSheetPositionsByFamily(SfxStyleFamily) const; + private: /** Register the position of a styleName in the index */ void - Register(const rtl::OUString& styleName, unsigned pos); + Register(const SfxStyleSheetBase& style, unsigned pos); typedef std::vector > VectorType; /** Vector with the stylesheets to allow for index-based access. @@ -174,6 +180,8 @@ private: /** A map which stores the positions of style sheets by their name */ MapType mPositionsByName; + + std::vector > mStyleSheetPositionsByFamily; }; } /* namespace svl */ diff --git a/svl/qa/unit/items/test_IndexedStyleSheets.cxx b/svl/qa/unit/items/test_IndexedStyleSheets.cxx index 3b0a0e0b8eb7..99b816f2c781 100644 --- a/svl/qa/unit/items/test_IndexedStyleSheets.cxx +++ b/svl/qa/unit/items/test_IndexedStyleSheets.cxx @@ -21,8 +21,8 @@ using namespace svl; class MockedStyleSheet : public SfxStyleSheetBase { public: - MockedStyleSheet(const rtl::OUString& name) - : SfxStyleSheetBase(name, NULL, SFX_STYLE_FAMILY_CHAR, 0) + MockedStyleSheet(const rtl::OUString& name, SfxStyleFamily fam = SFX_STYLE_FAMILY_CHAR) + : SfxStyleSheetBase(name, NULL, fam, 0) {;} }; @@ -36,6 +36,7 @@ class IndexedStyleSheetsTest : public CppUnit::TestFixture void RemovingStyleSheetWhichIsNotAvailableHasNoEffect(); void StyleSheetsCanBeRetrievedByTheirName(); void KnowsThatItStoresAStyleSheet(); + void PositionCanBeQueriedByFamily(); // Adds code needed to register the test suite CPPUNIT_TEST_SUITE(IndexedStyleSheetsTest); @@ -47,6 +48,7 @@ class IndexedStyleSheetsTest : public CppUnit::TestFixture CPPUNIT_TEST(RemovingStyleSheetWhichIsNotAvailableHasNoEffect); CPPUNIT_TEST(StyleSheetsCanBeRetrievedByTheirName); CPPUNIT_TEST(KnowsThatItStoresAStyleSheet); + CPPUNIT_TEST(PositionCanBeQueriedByFamily); // End of test suite definition CPPUNIT_TEST_SUITE_END(); @@ -151,6 +153,27 @@ void IndexedStyleSheetsTest::KnowsThatItStoresAStyleSheet() true, iss.HasStyleSheet(sheet2)); CPPUNIT_ASSERT_EQUAL_MESSAGE("Does not find style sheet which is not stored and has the same name as a stored.", false, iss.HasStyleSheet(sheet4)); +} + +void IndexedStyleSheetsTest::PositionCanBeQueriedByFamily() +{ + rtl::OUString name1("name1"); + rtl::OUString name2("name2"); + rtl::OUString name3("name3"); + rtl::Reference sheet1(new MockedStyleSheet(name1, SFX_STYLE_FAMILY_CHAR)); + rtl::Reference sheet2(new MockedStyleSheet(name2, SFX_STYLE_FAMILY_PARA)); + rtl::Reference sheet3(new MockedStyleSheet(name3, SFX_STYLE_FAMILY_CHAR)); + + IndexedStyleSheets iss; + iss.AddStyleSheet(sheet1); + iss.AddStyleSheet(sheet2); + iss.AddStyleSheet(sheet3); + + const std::vector& v = iss.GetStyleSheetPositionsByFamily(SFX_STYLE_FAMILY_CHAR); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Separation by family works.", static_cast(2), v.size()); + + const std::vector& w = iss.GetStyleSheetPositionsByFamily(SFX_STYLE_FAMILY_ALL); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Wildcard works for family queries.", static_cast(3), w.size()); } diff --git a/svl/source/items/IndexedStyleSheets.cxx b/svl/source/items/IndexedStyleSheets.cxx index 087f8172f124..7b9f7b632e75 100644 --- a/svl/source/items/IndexedStyleSheets.cxx +++ b/svl/source/items/IndexedStyleSheets.cxx @@ -16,27 +16,64 @@ using rtl::OUString; + +namespace { +const size_t NUMBER_OF_FAMILIES = 6; +size_t family_to_index(SfxStyleFamily family) +{ + switch (family) { + case SFX_STYLE_FAMILY_CHAR: + return 0; + case SFX_STYLE_FAMILY_PARA: + return 1; + case SFX_STYLE_FAMILY_FRAME: + return 2; + case SFX_STYLE_FAMILY_PAGE: + return 3; + case SFX_STYLE_FAMILY_PSEUDO: + return 4; + case SFX_STYLE_FAMILY_ALL: + return 5; + } + assert(false); // only for compiler warning. all cases are handled in the switch + return 0; +} +} + namespace svl { IndexedStyleSheets::IndexedStyleSheets() -{;} +{ + for (size_t i = 0; i < NUMBER_OF_FAMILIES; i++) { + mStyleSheetPositionsByFamily.push_back(std::vector()); + } +;} void -IndexedStyleSheets::Register(const rtl::OUString& name, unsigned pos) +IndexedStyleSheets::Register(const SfxStyleSheetBase& style, unsigned pos) { - mPositionsByName.insert(std::make_pair(name, pos)); + mPositionsByName.insert(std::make_pair(style.GetName(), pos)); + size_t position = family_to_index(style.GetFamily()); + mStyleSheetPositionsByFamily.at(position).push_back(pos); + size_t positionForFamilyAll = family_to_index(SFX_STYLE_FAMILY_ALL); + mStyleSheetPositionsByFamily.at(positionForFamilyAll).push_back(pos); } void IndexedStyleSheets::Reindex() { mPositionsByName.clear(); + mStyleSheetPositionsByFamily.clear(); + for (size_t i = 0; i < NUMBER_OF_FAMILIES; i++) { + mStyleSheetPositionsByFamily.push_back(std::vector()); + } + unsigned i = 0; for (VectorType::const_iterator it = mStyleSheets.begin(); it != mStyleSheets.end(); ++it) { SfxStyleSheetBase* p = it->get(); - Register(p->GetName(), i); + Register(*p, i); ++i; } } @@ -53,7 +90,7 @@ IndexedStyleSheets::AddStyleSheet(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->GetName(), mStyleSheets.size()-1); + Register(*style, mStyleSheets.size()-1); } } @@ -207,6 +244,13 @@ IndexedStyleSheets::FindPositionsByPredicate(StyleSheetPredicate& predicate) con return r; } +const std::vector& +IndexedStyleSheets::GetStyleSheetPositionsByFamily(SfxStyleFamily e) const +{ + size_t position = family_to_index(e); + return mStyleSheetPositionsByFamily.at(position); +} + } /* namespace svl */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svl/source/items/style.cxx b/svl/source/items/style.cxx index d6c9a3055eac..369bebe701eb 100644 --- a/svl/source/items/style.cxx +++ b/svl/source/items/style.cxx @@ -426,6 +426,10 @@ sal_uInt16 SfxStyleSheetIterator::Count() { n = (sal_uInt16) pBasePool->mIndexedStyleSheets->GetNumberOfStyleSheets(); } + else if(nMask == SFXSTYLEBIT_ALL) + { + n = static_cast(pBasePool->mIndexedStyleSheets->GetStyleSheetPositionsByFamily(nSearchFamily).size()); + } else { DoesStyleMatchStyleSheetPredicate predicate(this); @@ -442,6 +446,15 @@ SfxStyleSheetBase* SfxStyleSheetIterator::operator[](sal_uInt16 nIdx) retval = pBasePool->mIndexedStyleSheets->GetStyleSheetByPosition(nIdx).get(); nAktPosition = nIdx; } + else if(nMask == SFXSTYLEBIT_ALL) + { + rtl::Reference< SfxStyleSheetBase > ref = + pBasePool->mIndexedStyleSheets->GetStyleSheetByPosition( + pBasePool->mIndexedStyleSheets->GetStyleSheetPositionsByFamily(nSearchFamily).at(nIdx)) + ; + retval = ref.get(); + nAktPosition = nIdx; + } else { DoesStyleMatchStyleSheetPredicate predicate(this); @@ -464,7 +477,12 @@ SfxStyleSheetBase* SfxStyleSheetIterator::operator[](sal_uInt16 nIdx) SfxStyleSheetBase* SfxStyleSheetIterator::First() { - return operator[](0); + if (Count() != 0) { + return operator[](0); + } + else { + return NULL; + } } @@ -482,6 +500,17 @@ SfxStyleSheetBase* SfxStyleSheetIterator::Next() retval = pBasePool->mIndexedStyleSheets->GetStyleSheetByPosition(nAktPosition).get(); } } + else if(nMask == SFXSTYLEBIT_ALL) + { + unsigned newPosition = nAktPosition +1; + const std::vector& familyVector = pBasePool->mIndexedStyleSheets->GetStyleSheetPositionsByFamily(nSearchFamily); + if (familyVector.size() > newPosition) + { + nAktPosition = newPosition; + unsigned stylePosition = familyVector.at(newPosition); + retval = pBasePool->mIndexedStyleSheets->GetStyleSheetByPosition(stylePosition).get(); + } + } else { DoesStyleMatchStyleSheetPredicate predicate(this); -- cgit