summaryrefslogtreecommitdiff
path: root/svl/source/items
diff options
context:
space:
mode:
authorTobias Lippert <drtl@fastmail.fm>2014-06-26 19:59:15 +0200
committerCaolán McNamara <caolanm@redhat.com>2014-07-23 11:07:54 +0000
commit8f8ee6fd2c50572c44363a6d5d23bd9d192fe08d (patch)
tree24e78f489621bf5f6a031433b6e333ee49837aba /svl/source/items
parentfd641c7b23ce4205c29fc0c564b73336cb2cfb07 (diff)
fdo#76754 Add Positions by StyleSheetFamily to IndexedStyleSheets
Change-Id: I4eade2d00d145d8f65ccd70a1c6bbd0a134a1ad5 Reviewed-on: https://gerrit.libreoffice.org/10346 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'svl/source/items')
-rw-r--r--svl/source/items/IndexedStyleSheets.cxx54
-rw-r--r--svl/source/items/style.cxx31
2 files changed, 79 insertions, 6 deletions
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<unsigned>());
+ }
+;}
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>());
+ }
+
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<unsigned>&
+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<sal_uInt16>(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<unsigned>& 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);