Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 :
10 :
11 : #include <svl/IndexedStyleSheets.hxx>
12 : #include <svl/style.hxx>
13 :
14 : #include <stdexcept>
15 : #include <utility>
16 :
17 : using rtl::OUString;
18 :
19 : namespace svl {
20 :
21 0 : IndexedStyleSheets::IndexedStyleSheets()
22 0 : {;}
23 :
24 :
25 : void
26 0 : IndexedStyleSheets::Register(const rtl::OUString& name, unsigned pos)
27 : {
28 0 : mPositionsByName.insert(std::make_pair(name, pos));
29 0 : }
30 :
31 : void
32 0 : IndexedStyleSheets::Reindex()
33 : {
34 0 : mPositionsByName.clear();
35 0 : unsigned i = 0;
36 0 : for (VectorType::const_iterator it = mStyleSheets.begin();
37 0 : it != mStyleSheets.end(); ++it) {
38 0 : SfxStyleSheetBase* p = it->get();
39 0 : Register(p->GetName(), i);
40 0 : ++i;
41 : }
42 0 : }
43 :
44 : unsigned
45 0 : IndexedStyleSheets::GetNumberOfStyleSheets() const
46 : {
47 0 : return mStyleSheets.size();
48 : }
49 :
50 : void
51 0 : IndexedStyleSheets::AddStyleSheet(rtl::Reference< SfxStyleSheetBase > style)
52 : {
53 0 : if (!HasStyleSheet(style)) {
54 0 : mStyleSheets.push_back(style);
55 : // since we just added an element to the vector, we can safely do -1 as it will always be >= 1
56 0 : Register(style->GetName(), mStyleSheets.size()-1);
57 : }
58 0 : }
59 :
60 : bool
61 0 : IndexedStyleSheets::RemoveStyleSheet(rtl::Reference< SfxStyleSheetBase > style)
62 : {
63 0 : rtl::OUString styleName = style->GetName();
64 0 : std::vector<unsigned> positions = FindPositionsByName(styleName);
65 0 : bool found = false;
66 0 : unsigned stylePosition = 0;
67 0 : for (std::vector<unsigned>::const_iterator it = positions.begin();
68 0 : it != positions.end(); ++it) {
69 0 : if (mStyleSheets.at(*it) == style) {
70 0 : found = true;
71 0 : stylePosition = *it;
72 0 : break;
73 : }
74 : }
75 :
76 0 : if (found) {
77 0 : mStyleSheets.erase(mStyleSheets.begin() + stylePosition);
78 0 : Reindex();
79 : }
80 0 : return found;
81 : }
82 :
83 : std::vector<unsigned>
84 0 : IndexedStyleSheets::FindPositionsByName(const rtl::OUString& name) const
85 : {
86 0 : std::vector<unsigned> r;
87 0 : std::pair<MapType::const_iterator, MapType::const_iterator> range = mPositionsByName.equal_range(name);
88 0 : for (MapType::const_iterator it = range.first; it != range.second; ++it) {
89 0 : r.push_back(it->second);
90 : }
91 0 : return r;
92 : }
93 :
94 : std::vector<unsigned>
95 0 : IndexedStyleSheets::FindPositionsByNameAndPredicate(const rtl::OUString& name,
96 : StyleSheetPredicate& predicate) const
97 : {
98 0 : std::vector<unsigned> r;
99 0 : MapType::const_iterator it = mPositionsByName.find(name);
100 0 : for (/**/; it != mPositionsByName.end(); ++it) {
101 0 : unsigned pos = it->second;
102 0 : SfxStyleSheetBase *ssheet = mStyleSheets.at(pos).get();
103 0 : if (predicate.Check(*ssheet)) {
104 0 : r.push_back(pos);
105 : }
106 : }
107 0 : return r;
108 : }
109 :
110 :
111 : unsigned
112 0 : IndexedStyleSheets::GetNumberOfStyleSheetsWithPredicate(StyleSheetPredicate& predicate) const
113 : {
114 0 : unsigned r = 0;
115 0 : for (VectorType::const_iterator it = mStyleSheets.begin(); it != mStyleSheets.end(); ++it) {
116 0 : const SfxStyleSheetBase *ssheet = it->get();
117 0 : if (predicate.Check(*ssheet)) {
118 0 : ++r;
119 : }
120 : }
121 0 : return r;
122 : }
123 :
124 : rtl::Reference<SfxStyleSheetBase>
125 0 : IndexedStyleSheets::GetNthStyleSheetThatMatchesPredicate(
126 : unsigned n,
127 : StyleSheetPredicate& predicate,
128 : unsigned startAt)
129 : {
130 0 : rtl::Reference<SfxStyleSheetBase> retval;
131 0 : unsigned matching = 0;
132 0 : for (VectorType::iterator it = mStyleSheets.begin()+startAt; it != mStyleSheets.end(); ++it) {
133 0 : SfxStyleSheetBase *ssheet = it->get();
134 0 : if (predicate.Check(*ssheet)) {
135 0 : if (matching == n) {
136 0 : retval = *it;
137 0 : break;
138 : }
139 0 : ++matching;
140 : }
141 : }
142 0 : return retval;
143 : }
144 :
145 : unsigned
146 0 : IndexedStyleSheets::FindStyleSheetPosition(const SfxStyleSheetBase& style) const
147 : {
148 0 : VectorType::const_iterator it = std::find(mStyleSheets.begin(), mStyleSheets.end(), &style);
149 0 : if (it == mStyleSheets.end()) {
150 0 : throw std::runtime_error("IndexedStyleSheets::FindStylePosition Looked for style not in index");
151 : }
152 0 : return std::distance(mStyleSheets.begin(), it);
153 : }
154 :
155 : void
156 0 : IndexedStyleSheets::Clear(StyleSheetDisposer& disposer)
157 : {
158 0 : for (VectorType::iterator it = mStyleSheets.begin(); it != mStyleSheets.end(); ++it) {
159 0 : disposer.Dispose(*it);
160 : }
161 0 : mStyleSheets.clear();
162 0 : mPositionsByName.clear();
163 0 : }
164 :
165 0 : IndexedStyleSheets::~IndexedStyleSheets()
166 0 : {;}
167 :
168 : bool
169 0 : IndexedStyleSheets::HasStyleSheet(rtl::Reference< SfxStyleSheetBase > style) const
170 : {
171 0 : rtl::OUString styleName = style->GetName();
172 0 : std::vector<unsigned> positions = FindPositionsByName(styleName);
173 0 : for (std::vector<unsigned>::const_iterator it = positions.begin();
174 0 : it != positions.end(); ++it) {
175 0 : if (mStyleSheets.at(*it) == style) {
176 0 : return true;
177 : }
178 : }
179 0 : return false;
180 : }
181 :
182 : rtl::Reference< SfxStyleSheetBase >
183 0 : IndexedStyleSheets::GetStyleSheetByPosition(unsigned pos)
184 : {
185 0 : if( pos < mStyleSheets.size() )
186 0 : return mStyleSheets.at(pos);
187 0 : return NULL;
188 : }
189 :
190 : void
191 0 : IndexedStyleSheets::ApplyToAllStyleSheets(StyleSheetCallback& callback) const
192 : {
193 0 : for (VectorType::const_iterator it = mStyleSheets.begin(); it != mStyleSheets.end(); ++it) {
194 0 : callback.DoIt(**it);
195 : }
196 0 : }
197 :
198 : std::vector<unsigned>
199 0 : IndexedStyleSheets::FindPositionsByPredicate(StyleSheetPredicate& predicate) const
200 : {
201 0 : std::vector<unsigned> r;
202 0 : for (VectorType::const_iterator it = mStyleSheets.begin(); it != mStyleSheets.end(); ++it) {
203 0 : if (predicate.Check(**it)) {
204 0 : r.push_back(std::distance(mStyleSheets.begin(), it));
205 : }
206 : }
207 0 : return r;
208 : }
209 :
210 : } /* namespace svl */
211 :
212 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|