1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 #include "precompiled_sw.hxx"
25
26 #include <list.hxx>
27
28 #include <vector>
29 #include <numrule.hxx>
30 #include <ndarr.hxx>
31 #include <node.hxx>
32 #include <pam.hxx>
33 #include <SwNodeNum.hxx>
34
35 // ----------------------------------------------------------------------------
36 // SwListImpl
37 // implementation class for SwList
38 // ----------------------------------------------------------------------------
39 class SwListImpl
40 {
41 public:
42 SwListImpl( const String sListId,
43 SwNumRule& rDefaultListStyle,
44 const SwNodes& rNodes );
45 ~SwListImpl();
46
47 const String GetListId() const;
48
49 const String GetDefaultListStyleName() const;
50
51 void InsertListItem( SwNodeNum& rNodeNum,
52 const int nLevel );
53 void RemoveListItem( SwNodeNum& rNodeNum );
54
55 void InvalidateListTree();
56 void ValidateListTree();
57
58 void MarkListLevel( const int nListLevel,
59 const sal_Bool bValue );
60
61 bool IsListLevelMarked( const int nListLevel ) const;
62
63 private:
64 // unique identifier of the list
65 const String msListId;
66 // default list style for the list items, identified by the list style name
67 String msDefaultListStyleName;
68
69 // list trees for certain document ranges
70 typedef std::pair<SwNodeNum*, SwPaM*> tListTreeForRange;
71 typedef std::vector<tListTreeForRange> tListTrees;
72 tListTrees maListTrees;
73
74 int mnMarkedListLevel;
75
76 void NotifyItemsOnListLevel( const int nLevel );
77 };
78
SwListImpl(const String sListId,SwNumRule & rDefaultListStyle,const SwNodes & rNodes)79 SwListImpl::SwListImpl( const String sListId,
80 SwNumRule& rDefaultListStyle,
81 const SwNodes& rNodes )
82 : msListId( sListId ),
83 msDefaultListStyleName( rDefaultListStyle.GetName() ),
84 maListTrees(),
85 mnMarkedListLevel( MAXLEVEL )
86 {
87 // create empty list trees for the document ranges
88 const SwNode* pNode = rNodes[0];
89 do
90 {
91 SwPaM aPam( *pNode, *pNode->EndOfSectionNode() );
92
93 SwNodeNum* pNumberTreeRootNode = new SwNodeNum( &rDefaultListStyle );
94 SwPaM* pPam = new SwPaM( *(aPam.Start()), *(aPam.End()) );
95 tListTreeForRange aListTreeForRange( pNumberTreeRootNode, pPam );
96 maListTrees.push_back( aListTreeForRange );
97
98 pNode = pNode->EndOfSectionNode();
99 if (pNode != &rNodes.GetEndOfContent())
100 {
101 sal_uLong nIndex = pNode->GetIndex();
102 nIndex++;
103 pNode = rNodes[nIndex];
104 }
105 }
106 while ( pNode != &rNodes.GetEndOfContent() );
107 }
108
~SwListImpl()109 SwListImpl::~SwListImpl()
110 {
111 tListTrees::iterator aNumberTreeIter;
112 for ( aNumberTreeIter = maListTrees.begin();
113 aNumberTreeIter != maListTrees.end();
114 ++aNumberTreeIter )
115 {
116 SwNodeNum::HandleNumberTreeRootNodeDelete( *((*aNumberTreeIter).first) );
117 delete (*aNumberTreeIter).first;
118 delete (*aNumberTreeIter).second;
119 }
120 }
121
GetListId() const122 const String SwListImpl::GetListId() const
123 {
124 return msListId;
125 }
126
GetDefaultListStyleName() const127 const String SwListImpl::GetDefaultListStyleName() const
128 {
129 return msDefaultListStyleName;
130 }
131
InsertListItem(SwNodeNum & rNodeNum,const int nLevel)132 void SwListImpl::InsertListItem( SwNodeNum& rNodeNum,
133 const int nLevel )
134 {
135 const SwPosition aPosOfNodeNum( rNodeNum.GetPosition() );
136 const SwNodes* pNodesOfNodeNum = &(aPosOfNodeNum.nNode.GetNode().GetNodes());
137
138 tListTrees::const_iterator aNumberTreeIter;
139 for ( aNumberTreeIter = maListTrees.begin();
140 aNumberTreeIter != maListTrees.end();
141 ++aNumberTreeIter )
142 {
143 const SwPosition* pStart = (*aNumberTreeIter).second->Start();
144 const SwPosition* pEnd = (*aNumberTreeIter).second->End();
145 const SwNodes* pRangeNodes = &(pStart->nNode.GetNode().GetNodes());
146
147 if ( pRangeNodes == pNodesOfNodeNum &&
148 *pStart <= aPosOfNodeNum && aPosOfNodeNum <= *pEnd)
149 {
150 (*aNumberTreeIter).first->AddChild( &rNodeNum, nLevel );
151
152 break;
153 }
154 }
155 }
156
RemoveListItem(SwNodeNum & rNodeNum)157 void SwListImpl::RemoveListItem( SwNodeNum& rNodeNum )
158 {
159 rNodeNum.RemoveMe();
160 }
161
InvalidateListTree()162 void SwListImpl::InvalidateListTree()
163 {
164 tListTrees::iterator aNumberTreeIter;
165 for ( aNumberTreeIter = maListTrees.begin();
166 aNumberTreeIter != maListTrees.end();
167 ++aNumberTreeIter )
168 {
169 (*aNumberTreeIter).first->InvalidateTree();
170 }
171 }
172
ValidateListTree()173 void SwListImpl::ValidateListTree()
174 {
175 tListTrees::iterator aNumberTreeIter;
176 for ( aNumberTreeIter = maListTrees.begin();
177 aNumberTreeIter != maListTrees.end();
178 ++aNumberTreeIter )
179 {
180 (*aNumberTreeIter).first->NotifyInvalidChildren();
181 }
182 }
183
MarkListLevel(const int nListLevel,const sal_Bool bValue)184 void SwListImpl::MarkListLevel( const int nListLevel,
185 const sal_Bool bValue )
186 {
187 if ( bValue )
188 {
189 if ( nListLevel != mnMarkedListLevel )
190 {
191 if ( mnMarkedListLevel != MAXLEVEL )
192 {
193 // notify former marked list nodes
194 NotifyItemsOnListLevel( mnMarkedListLevel );
195 }
196
197 mnMarkedListLevel = nListLevel;
198
199 // notify new marked list nodes
200 NotifyItemsOnListLevel( mnMarkedListLevel );
201 }
202 }
203 else
204 {
205 if ( mnMarkedListLevel != MAXLEVEL )
206 {
207 // notify former marked list nodes
208 NotifyItemsOnListLevel( mnMarkedListLevel );
209 }
210
211 mnMarkedListLevel = MAXLEVEL;
212 }
213 }
214
IsListLevelMarked(const int nListLevel) const215 bool SwListImpl::IsListLevelMarked( const int nListLevel ) const
216 {
217 return nListLevel == mnMarkedListLevel;
218 }
219
NotifyItemsOnListLevel(const int nLevel)220 void SwListImpl::NotifyItemsOnListLevel( const int nLevel )
221 {
222 tListTrees::iterator aNumberTreeIter;
223 for ( aNumberTreeIter = maListTrees.begin();
224 aNumberTreeIter != maListTrees.end();
225 ++aNumberTreeIter )
226 {
227 (*aNumberTreeIter).first->NotifyNodesOnListLevel( nLevel );
228 }
229 }
230
231 // ----------------------------------------------------------------------------
232 // SwList
233 // ----------------------------------------------------------------------------
SwList(const String sListId,SwNumRule & rDefaultListStyle,const SwNodes & rNodes)234 SwList::SwList( const String sListId,
235 SwNumRule& rDefaultListStyle,
236 const SwNodes& rNodes )
237 : mpListImpl( new SwListImpl( sListId, rDefaultListStyle, rNodes ) )
238 {
239 }
240
~SwList()241 SwList::~SwList()
242 {
243 delete mpListImpl;
244 }
245
GetListId() const246 const String SwList::GetListId() const
247 {
248 return mpListImpl->GetListId();
249 }
250
GetDefaultListStyleName() const251 const String SwList::GetDefaultListStyleName() const
252 {
253 return mpListImpl->GetDefaultListStyleName();
254 }
255
InsertListItem(SwNodeNum & rNodeNum,const int nLevel)256 void SwList::InsertListItem( SwNodeNum& rNodeNum,
257 const int nLevel )
258 {
259 mpListImpl->InsertListItem( rNodeNum, nLevel );
260 }
261
RemoveListItem(SwNodeNum & rNodeNum)262 void SwList::RemoveListItem( SwNodeNum& rNodeNum )
263 {
264 mpListImpl->RemoveListItem( rNodeNum );
265 }
266
InvalidateListTree()267 void SwList::InvalidateListTree()
268 {
269 mpListImpl->InvalidateListTree();
270 }
271
ValidateListTree()272 void SwList::ValidateListTree()
273 {
274 mpListImpl->ValidateListTree();
275 }
276
MarkListLevel(const int nListLevel,const sal_Bool bValue)277 void SwList::MarkListLevel( const int nListLevel,
278 const sal_Bool bValue )
279 {
280 mpListImpl->MarkListLevel( nListLevel, bValue );
281 }
282
IsListLevelMarked(const int nListLevel) const283 bool SwList::IsListLevelMarked( const int nListLevel ) const
284 {
285 return mpListImpl->IsListLevelMarked( nListLevel );
286 }
287
288 //void SwList::ContinueList( SwList& rList )
289 //{
290 // mpListImpl->ContinueList( rList );
291 //}
292 //const SwList* SwList::GetContinuedList() const
293 //{
294 // return mpListImpl->GetContinuedList();
295 //}
296 //void SwList::ClearContinuation()
297 //{
298 // mpListImpl->ClearContinuation();
299 //}
300