Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include <hintids.hxx>
30 : : #include <editsh.hxx>
31 : : #include <edimp.hxx>
32 : : #include <doc.hxx>
33 : : #include <IDocumentUndoRedo.hxx>
34 : : #include <ndtxt.hxx>
35 : : #include <paratr.hxx>
36 : : #include <swundo.hxx>
37 : : #include <numrule.hxx>
38 : :
39 : :
40 : 0 : SwPamRanges::SwPamRanges( const SwPaM& rRing )
41 : : {
42 : 0 : const SwPaM* pTmp = &rRing;
43 [ # # ]: 0 : do {
44 [ # # ]: 0 : Insert( pTmp->GetMark()->nNode, pTmp->GetPoint()->nNode );
45 : 0 : } while( &rRing != ( pTmp = (const SwPaM*)pTmp->GetNext() ));
46 : 0 : }
47 : :
48 : :
49 : 0 : void SwPamRanges::Insert( const SwNodeIndex& rIdx1, const SwNodeIndex& rIdx2 )
50 : : {
51 : 0 : SwPamRange aRg( rIdx1.GetIndex(), rIdx2.GetIndex() );
52 [ # # ]: 0 : if( aRg.nEnd < aRg.nStart )
53 : 0 : { aRg.nStart = aRg.nEnd; aRg.nEnd = rIdx1.GetIndex(); }
54 : :
55 [ # # ]: 0 : _SwPamRanges::const_iterator it = lower_bound(aRg); //search Insert Position
56 [ # # ]: 0 : sal_uInt16 nPos = it - begin();
57 [ # # ][ # # ]: 0 : if (!empty() && (it != end()) && (*it) == aRg)
[ # # ][ # # ]
[ # # ]
[ # # # # ]
58 : : {
59 : : // is the one in the Array smaller?
60 [ # # ]: 0 : SwPamRange const& rTmp = _SwPamRanges::operator[](nPos);
61 [ # # ]: 0 : if( rTmp.nEnd < aRg.nEnd )
62 : : {
63 : 0 : aRg.nEnd = rTmp.nEnd;
64 [ # # ][ # # ]: 0 : erase(begin() + nPos); // combine
65 : : }
66 : : else
67 : : return; // done, because by precondition everything is combined
68 : : }
69 : :
70 : : sal_Bool bEnde;
71 [ # # ]: 0 : do {
72 : 0 : bEnde = sal_True;
73 : :
74 : : // combine with predecessor?
75 [ # # ]: 0 : if( nPos > 0 )
76 : : {
77 [ # # ]: 0 : SwPamRange const& rTmp = _SwPamRanges::operator[](nPos-1);
78 [ # # ][ # # ]: 0 : if( rTmp.nEnd == aRg.nStart
79 : : || rTmp.nEnd+1 == aRg.nStart )
80 : : {
81 : 0 : aRg.nStart = rTmp.nStart;
82 : 0 : bEnde = sal_False;
83 [ # # ][ # # ]: 0 : erase( begin() + --nPos ); // combine
84 : : }
85 : : // range contained in rTmp?
86 [ # # ][ # # ]: 0 : else if( rTmp.nStart <= aRg.nStart && aRg.nEnd <= rTmp.nEnd )
87 : : return;
88 : : }
89 : : // combine with successor?
90 [ # # ]: 0 : if( nPos < size() )
91 : : {
92 [ # # ]: 0 : SwPamRange const& rTmp = _SwPamRanges::operator[](nPos);
93 [ # # ][ # # ]: 0 : if( rTmp.nStart == aRg.nEnd ||
94 : : rTmp.nStart == aRg.nEnd+1 )
95 : : {
96 : 0 : aRg.nEnd = rTmp.nEnd;
97 : 0 : bEnde = sal_False;
98 [ # # ][ # # ]: 0 : erase( begin() + nPos ); // combine
99 : : }
100 : :
101 : : // range contained in rTmp?
102 [ # # ][ # # ]: 0 : else if( rTmp.nStart <= aRg.nStart && aRg.nEnd <= rTmp.nEnd )
103 : : return;
104 : : }
105 : 0 : } while( !bEnde );
106 : :
107 [ # # ]: 0 : _SwPamRanges::insert( aRg );
108 : : }
109 : :
110 : :
111 : :
112 : 0 : SwPaM& SwPamRanges::SetPam( sal_uInt16 nArrPos, SwPaM& rPam )
113 : : {
114 : : OSL_ASSERT( nArrPos < Count() );
115 : 0 : const SwPamRange& rTmp = (*this)[ nArrPos ];
116 : 0 : rPam.GetPoint()->nNode = rTmp.nStart;
117 [ # # ]: 0 : rPam.GetPoint()->nContent.Assign( rPam.GetCntntNode(), 0 );
118 : 0 : rPam.SetMark();
119 : 0 : rPam.GetPoint()->nNode = rTmp.nEnd;
120 [ # # ]: 0 : rPam.GetPoint()->nContent.Assign( rPam.GetCntntNode(), 0 );
121 : 0 : return rPam;
122 : : }
123 : :
124 : :
125 : :
126 : : // Numerierung Outline Regelwerk
127 : :
128 : :
129 : 0 : void SwEditShell::SetOutlineNumRule(const SwNumRule& rRule)
130 : : {
131 : 0 : StartAllAction(); // Klammern fuers Updaten !!
132 : 0 : GetDoc()->SetOutlineNumRule(rRule);
133 : 0 : EndAllAction();
134 : 0 : }
135 : :
136 : :
137 : 0 : const SwNumRule* SwEditShell::GetOutlineNumRule() const
138 : : {
139 : 0 : return GetDoc()->GetOutlineNumRule();
140 : : }
141 : :
142 : : // setzt, wenn noch keine Numerierung, sonst wird geaendert
143 : : // arbeitet mit alten und neuen Regeln, nur Differenzen aktualisieren
144 : :
145 : : // Absaetze ohne Numerierung, aber mit Einzuegen
146 : :
147 : 0 : sal_Bool SwEditShell::NoNum()
148 : : {
149 : 0 : sal_Bool bRet = sal_True;
150 : 0 : StartAllAction();
151 : :
152 : 0 : SwPaM* pCrsr = GetCrsr();
153 [ # # ]: 0 : if( pCrsr->GetNext() != pCrsr ) // Mehrfachselektion ?
154 : : {
155 [ # # ][ # # ]: 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
156 [ # # ]: 0 : SwPamRanges aRangeArr( *pCrsr );
157 [ # # ]: 0 : SwPaM aPam( *pCrsr->GetPoint() );
158 [ # # ]: 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
159 [ # # ][ # # ]: 0 : bRet = bRet && GetDoc()->NoNum( aRangeArr.SetPam( n, aPam ));
[ # # ][ # # ]
160 [ # # ][ # # ]: 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
[ # # ]
161 : : }
162 : : else
163 : 0 : bRet = GetDoc()->NoNum( *pCrsr );
164 : :
165 : 0 : EndAllAction();
166 : 0 : return bRet;
167 : : }
168 : : // Loeschen, Splitten der Aufzaehlungsliste
169 : :
170 : : // -> #i29560#
171 : 0 : sal_Bool SwEditShell::HasNumber() const
172 : : {
173 : 0 : sal_Bool bResult = sal_False;
174 : :
175 : : const SwTxtNode * pTxtNd =
176 : 0 : GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
177 : :
178 [ # # ]: 0 : if (pTxtNd)
179 : : {
180 : 0 : bResult = pTxtNd->HasNumber();
181 : :
182 : : // special case: outline numbered, not counted paragraph
183 [ # # ][ # # : 0 : if ( bResult &&
# # # # ]
184 : 0 : pTxtNd->GetNumRule() == GetDoc()->GetOutlineNumRule() &&
185 : 0 : !pTxtNd->IsCountedInList() )
186 : : {
187 : 0 : bResult = sal_False;
188 : : }
189 : : }
190 : :
191 : 0 : return bResult;
192 : : }
193 : :
194 : 0 : sal_Bool SwEditShell::HasBullet() const
195 : : {
196 : 0 : sal_Bool bResult = sal_False;
197 : :
198 : : const SwTxtNode * pTxtNd =
199 : 0 : GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
200 : :
201 [ # # ]: 0 : if (pTxtNd)
202 : : {
203 : 0 : bResult = pTxtNd->HasBullet();
204 : : }
205 : :
206 : 0 : return bResult;
207 : : }
208 : : // <- #i29560#
209 : :
210 : 0 : void SwEditShell::DelNumRules()
211 : : {
212 : 0 : StartAllAction();
213 : :
214 : 0 : SwPaM* pCrsr = GetCrsr();
215 [ # # ]: 0 : if( pCrsr->GetNext() != pCrsr ) // Mehrfachselektion ?
216 : : {
217 [ # # ][ # # ]: 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
218 [ # # ]: 0 : SwPamRanges aRangeArr( *pCrsr );
219 [ # # ]: 0 : SwPaM aPam( *pCrsr->GetPoint() );
220 [ # # ]: 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
221 : : {
222 [ # # ][ # # ]: 0 : GetDoc()->DelNumRules( aRangeArr.SetPam( n, aPam ) );
223 : : }
224 [ # # ][ # # ]: 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
[ # # ]
225 : : }
226 : : else
227 : 0 : GetDoc()->DelNumRules( *pCrsr );
228 : :
229 : : // rufe das AttrChangeNotify auf der UI-Seite. Sollte eigentlich
230 : : // ueberfluessig sein, aber VB hatte darueber eine Bugrep.
231 : 0 : CallChgLnk();
232 : :
233 : : // cursor can not be anymore in front of a label,
234 : : // because numbering/bullet is deleted.
235 : 0 : SetInFrontOfLabel( sal_False );
236 : :
237 : 0 : GetDoc()->SetModified();
238 : 0 : EndAllAction();
239 : 0 : }
240 : :
241 : : // Hoch-/Runterstufen
242 : :
243 : :
244 : 0 : sal_Bool SwEditShell::NumUpDown( sal_Bool bDown )
245 : : {
246 : 0 : StartAllAction();
247 : :
248 : 0 : sal_Bool bRet = sal_True;
249 : 0 : SwPaM* pCrsr = GetCrsr();
250 [ # # ]: 0 : if( pCrsr->GetNext() == pCrsr ) // keine Mehrfachselektion ?
251 : 0 : bRet = GetDoc()->NumUpDown( *pCrsr, bDown );
252 : : else
253 : : {
254 [ # # ][ # # ]: 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
255 [ # # ]: 0 : SwPamRanges aRangeArr( *pCrsr );
256 [ # # ]: 0 : SwPaM aPam( *pCrsr->GetPoint() );
257 [ # # ]: 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
258 [ # # ][ # # ]: 0 : bRet = bRet && GetDoc()->NumUpDown( aRangeArr.SetPam( n, aPam ), bDown );
[ # # ][ # # ]
259 [ # # ][ # # ]: 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
[ # # ]
260 : : }
261 : 0 : GetDoc()->SetModified();
262 : :
263 : : // #i54693# Update marked numbering levels
264 [ # # ]: 0 : if ( IsInFrontOfLabel() )
265 : 0 : UpdateMarkedListLevel();
266 : :
267 : 0 : CallChgLnk();
268 : :
269 : 0 : EndAllAction();
270 : 0 : return bRet;
271 : : }
272 : : // -> #i23726#
273 : 0 : sal_Bool SwEditShell::IsFirstOfNumRule() const
274 : : {
275 : 0 : sal_Bool bResult = sal_False;
276 : :
277 : 0 : SwPaM * pCrsr = GetCrsr();
278 [ # # ]: 0 : if (pCrsr->GetNext() == pCrsr)
279 : : {
280 : 0 : bResult = IsFirstOfNumRule(*pCrsr);
281 : : }
282 : :
283 : 0 : return bResult;
284 : : }
285 : :
286 : 0 : sal_Bool SwEditShell::IsFirstOfNumRule(const SwPaM & rPaM) const
287 : : {
288 : 0 : sal_Bool bResult = sal_False;
289 : :
290 [ # # ]: 0 : SwPosition aPos(*rPaM.GetPoint());
291 [ # # ]: 0 : bResult = GetDoc()->IsFirstOfNumRule(aPos);
292 : :
293 [ # # ]: 0 : return bResult;
294 : : }
295 : : // <- #i23726#
296 : :
297 : : // -> #i23725#
298 : : // #i90078#
299 : : // Remove unused default parameter <nLevel> and <bRelative>.
300 : : // Adjust method name and parameter name
301 : 0 : void SwEditShell::ChangeIndentOfAllListLevels( short nDiff )
302 : : {
303 : 0 : StartAllAction();
304 : :
305 : 0 : const SwNumRule *pCurNumRule = GetCurNumRule();
306 : : //#120911# check if numbering rule really exists
307 [ # # ]: 0 : if (pCurNumRule)
308 : : {
309 [ # # ]: 0 : SwNumRule aRule(*pCurNumRule);
310 : : // #i90078#
311 [ # # ]: 0 : aRule.ChangeIndent( nDiff );
312 : :
313 : : // no start of new list
314 [ # # ][ # # ]: 0 : SetCurNumRule( aRule, false );
[ # # ][ # # ]
315 : : }
316 : :
317 : 0 : EndAllAction();
318 : 0 : }
319 : :
320 : : // #i90078#
321 : : // Adjust method name
322 : 0 : void SwEditShell::SetIndent(short nIndent, const SwPosition & rPos)
323 : : {
324 : 0 : StartAllAction();
325 : :
326 : 0 : SwNumRule *pCurNumRule = GetDoc()->GetCurrNumRule(rPos);
327 : :
328 [ # # ]: 0 : if (pCurNumRule)
329 : : {
330 [ # # ]: 0 : SwPaM aPaM(rPos);
331 : 0 : SwTxtNode * pTxtNode = aPaM.GetNode()->GetTxtNode();
332 : :
333 : : // #i90078#
334 : :
335 [ # # ]: 0 : SwNumRule aRule(*pCurNumRule);
336 : :
337 [ # # ][ # # ]: 0 : if ( IsFirstOfNumRule() )
338 : : {
339 [ # # ]: 0 : aRule.SetIndentOfFirstListLevelAndChangeOthers( nIndent );
340 : : }
341 [ # # ][ # # ]: 0 : else if ( pTxtNode->GetActualListLevel() >= 0 )
342 : : {
343 : : aRule.SetIndent( nIndent,
344 [ # # ][ # # ]: 0 : static_cast<sal_uInt16>(pTxtNode->GetActualListLevel()) );
345 : : }
346 : :
347 : : // #i42921# - 3rd parameter = false in order to
348 : : // suppress setting of num rule at <aPaM>.
349 : : // do not apply any list
350 [ # # ][ # # ]: 0 : GetDoc()->SetNumRule( aPaM, aRule, false, String(), sal_False );
[ # # ][ # # ]
[ # # ]
351 : : }
352 : :
353 : 0 : EndAllAction();
354 : 0 : }
355 : : // <- #i23725#
356 : :
357 : 0 : sal_Bool SwEditShell::MoveParagraph( long nOffset )
358 : : {
359 : 0 : StartAllAction();
360 : :
361 : 0 : SwPaM *pCrsr = GetCrsr();
362 [ # # ]: 0 : if( !pCrsr->HasMark() )
363 : : {
364 : : // sorge dafuer, das Bound1 und Bound2 im gleichen Node stehen
365 : 0 : pCrsr->SetMark();
366 : 0 : pCrsr->DeleteMark();
367 : : }
368 : :
369 : 0 : sal_Bool bRet = GetDoc()->MoveParagraph( *pCrsr, nOffset );
370 : :
371 : 0 : GetDoc()->SetModified();
372 : 0 : EndAllAction();
373 : 0 : return bRet;
374 : : }
375 : :
376 : : //#outline level add by zhaojianwei
377 : 1364 : int SwEditShell::GetCurrentParaOutlineLevel( ) const
378 : : {
379 : 1364 : int nLevel = 0;
380 : :
381 : 1364 : SwPaM* pCrsr = GetCrsr();
382 : 1364 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
383 [ + - ]: 1364 : if( pTxtNd )
384 : 1364 : nLevel = pTxtNd->GetAttrOutlineLevel();
385 : 1364 : return nLevel;
386 : : }
387 : : //<-end,zhaojianwei
388 : :
389 : 0 : void SwEditShell::GetCurrentOutlineLevels( sal_uInt8& rUpper, sal_uInt8& rLower )
390 : : {
391 [ # # ]: 0 : SwPaM* pCrsr = GetCrsr();
392 [ # # ][ # # ]: 0 : SwPaM aCrsr( *pCrsr->Start() );
393 [ # # ]: 0 : aCrsr.SetMark();
394 [ # # ]: 0 : if( pCrsr->HasMark() )
395 [ # # ][ # # ]: 0 : *aCrsr.GetPoint() = *pCrsr->End();
396 : 0 : GetDoc()->GotoNextNum( *aCrsr.GetPoint(), sal_False,
397 [ # # ][ # # ]: 0 : &rUpper, &rLower );
398 : 0 : }
399 : :
400 : 0 : sal_Bool SwEditShell::MoveNumParas( sal_Bool bUpperLower, sal_Bool bUpperLeft )
401 : : {
402 [ # # ]: 0 : StartAllAction();
403 : :
404 : : // auf alle Selektionen ??
405 [ # # ]: 0 : SwPaM* pCrsr = GetCrsr();
406 [ # # ][ # # ]: 0 : SwPaM aCrsr( *pCrsr->Start() );
407 [ # # ]: 0 : aCrsr.SetMark();
408 : :
409 [ # # ]: 0 : if( pCrsr->HasMark() )
410 [ # # ][ # # ]: 0 : *aCrsr.GetPoint() = *pCrsr->End();
411 : :
412 : 0 : sal_Bool bRet = sal_False;
413 : : sal_uInt8 nUpperLevel, nLowerLevel;
414 [ # # ]: 0 : if( GetDoc()->GotoNextNum( *aCrsr.GetPoint(), sal_False,
415 [ # # ]: 0 : &nUpperLevel, &nLowerLevel ))
416 : : {
417 [ # # ]: 0 : if( bUpperLower )
418 : : {
419 : : // ueber die naechste Nummerierung
420 : 0 : long nOffset = 0;
421 : : const SwNode* pNd;
422 : :
423 [ # # ]: 0 : if( bUpperLeft ) // verschiebe nach oben
424 : : {
425 [ # # ]: 0 : SwPosition aPos( *aCrsr.GetMark() );
426 [ # # ][ # # ]: 0 : if( GetDoc()->GotoPrevNum( aPos, sal_False ) )
427 : 0 : nOffset = aPos.nNode.GetIndex() -
428 : 0 : aCrsr.GetMark()->nNode.GetIndex();
429 : : else
430 : : {
431 : 0 : sal_uLong nStt = aPos.nNode.GetIndex(), nIdx = nStt - 1;
432 [ # # ][ # # : 0 : while( nIdx && (
# # # # #
# ][ # # ]
433 [ # # ]: 0 : ( pNd = GetDoc()->GetNodes()[ nIdx ])->IsSectionNode() ||
434 : 0 : ( pNd->IsEndNode() && pNd->StartOfSectionNode()->IsSectionNode())))
435 : 0 : --nIdx;
436 [ # # ][ # # ]: 0 : if( GetDoc()->GetNodes()[ nIdx ]->IsTxtNode() )
[ # # ]
437 : 0 : nOffset = nIdx - nStt;
438 [ # # ]: 0 : }
439 : : }
440 : : else // verschiebe nach unten
441 : : {
442 [ # # ]: 0 : const SwNumRule* pOrig = aCrsr.GetNode(sal_False)->GetTxtNode()->GetNumRule();
443 [ # # ][ # # ]: 0 : if( aCrsr.GetNode()->IsTxtNode() &&
[ # # ]
444 [ # # ]: 0 : pOrig == aCrsr.GetNode()->GetTxtNode()->GetNumRule() )
445 : : {
446 : 0 : sal_uLong nStt = aCrsr.GetPoint()->nNode.GetIndex(), nIdx = nStt+1;
447 : :
448 [ # # ][ # # ]: 0 : while (nIdx < GetDoc()->GetNodes().Count()-1)
449 : : {
450 [ # # ][ # # ]: 0 : pNd = GetDoc()->GetNodes()[ nIdx ];
451 : :
452 [ # # # # : 0 : if (pNd->IsSectionNode() ||
# # # # ]
[ # # ][ # # ]
[ # # ]
453 : 0 : ( pNd->IsEndNode() && pNd->StartOfSectionNode()->IsSectionNode()) ||
454 [ # # ][ # # ]: 0 : ( pNd->IsTxtNode() && pOrig == ((SwTxtNode*)pNd)->GetNumRule() &&
455 [ # # ][ # # ]: 0 : ((SwTxtNode*)pNd)->GetActualListLevel() > nUpperLevel ))
456 : : {
457 : 0 : ++nIdx;
458 : : }
459 : : // #i57856#
460 : : else
461 : : {
462 : 0 : break;
463 : : }
464 : : }
465 : :
466 [ # # ][ # # ]: 0 : if( nStt == nIdx || !GetDoc()->GetNodes()[ nIdx ]->IsTxtNode() )
[ # # ][ # # ]
[ # # ]
467 : 0 : nOffset = 1;
468 : : else
469 : 0 : nOffset = nIdx - nStt;
470 : : }
471 : : else
472 : 0 : nOffset = 1;
473 : : }
474 : :
475 [ # # ]: 0 : if( nOffset )
476 : : {
477 [ # # ]: 0 : aCrsr.Move( fnMoveBackward, fnGoNode );
478 [ # # ]: 0 : bRet = GetDoc()->MoveParagraph( aCrsr, nOffset );
479 : : }
480 : : }
481 [ # # ][ # # ]: 0 : else if( bUpperLeft ? nUpperLevel : nLowerLevel+1 < MAXLEVEL )
482 : : {
483 [ # # ]: 0 : aCrsr.Move( fnMoveBackward, fnGoNode );
484 [ # # ]: 0 : bRet = GetDoc()->NumUpDown( aCrsr, !bUpperLeft );
485 : : }
486 : : }
487 : :
488 [ # # ]: 0 : GetDoc()->SetModified();
489 [ # # ]: 0 : EndAllAction();
490 [ # # ]: 0 : return bRet;
491 : : }
492 : :
493 : 0 : sal_Bool SwEditShell::OutlineUpDown( short nOffset )
494 : : {
495 : 0 : StartAllAction();
496 : :
497 : 0 : sal_Bool bRet = sal_True;
498 : 0 : SwPaM* pCrsr = GetCrsr();
499 [ # # ]: 0 : if( pCrsr->GetNext() == pCrsr ) // keine Mehrfachselektion ?
500 : 0 : bRet = GetDoc()->OutlineUpDown( *pCrsr, nOffset );
501 : : else
502 : : {
503 [ # # ][ # # ]: 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
504 [ # # ]: 0 : SwPamRanges aRangeArr( *pCrsr );
505 [ # # ]: 0 : SwPaM aPam( *pCrsr->GetPoint() );
506 [ # # ]: 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
507 : : bRet = bRet && GetDoc()->OutlineUpDown(
508 [ # # ][ # # ]: 0 : aRangeArr.SetPam( n, aPam ), nOffset );
[ # # ][ # # ]
509 [ # # ][ # # ]: 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
[ # # ]
510 : : }
511 : 0 : GetDoc()->SetModified();
512 : 0 : EndAllAction();
513 : 0 : return bRet;
514 : : }
515 : :
516 : :
517 : 0 : sal_Bool SwEditShell::MoveOutlinePara( short nOffset )
518 : : {
519 : 0 : StartAllAction();
520 : 0 : sal_Bool bRet = GetDoc()->MoveOutlinePara( *GetCrsr(), nOffset );
521 : 0 : EndAllAction();
522 : 0 : return bRet;
523 : : }
524 : :
525 : : // Outlines and SubOutline are ReadOnly?
526 : 0 : sal_Bool SwEditShell::IsProtectedOutlinePara() const
527 : : {
528 : 0 : sal_Bool bRet = sal_False;
529 : 0 : const SwNode& rNd = GetCrsr()->Start()->nNode.GetNode();
530 [ # # ]: 0 : if( rNd.IsTxtNode() )
531 : : {
532 [ # # ][ # # ]: 0 : const SwOutlineNodes& rOutlNd = GetDoc()->GetNodes().GetOutLineNds();
533 : 0 : SwNodePtr pNd = (SwNodePtr)&rNd;
534 : 0 : sal_Bool bFirst = sal_True;
535 : : sal_uInt16 nPos;
536 : 0 : int nLvl(0);
537 [ # # ][ # # ]: 0 : if( !rOutlNd.Seek_Entry( pNd, &nPos ) && nPos )
[ # # ][ # # ]
538 : 0 : --nPos;
539 : :
540 [ # # ]: 0 : for( ; nPos < rOutlNd.size(); ++nPos )
541 : : {
542 [ # # ]: 0 : SwNodePtr pTmpNd = rOutlNd[ nPos ];
543 : :
544 [ # # ]: 0 : int nTmpLvl = pTmpNd->GetTxtNode()->GetAttrOutlineLevel();
545 : :
546 : : OSL_ENSURE( nTmpLvl >= 0 && nTmpLvl <= MAXLEVEL,
547 : : "<SwEditShell::IsProtectedOutlinePara()>" );
548 : :
549 [ # # ]: 0 : if( bFirst )
550 : : {
551 : 0 : nLvl = nTmpLvl;
552 : 0 : bFirst = sal_False;
553 : : }
554 [ # # ]: 0 : else if( nLvl >= nTmpLvl )
555 : 0 : break;
556 : :
557 [ # # ][ # # ]: 0 : if( pTmpNd->IsProtect() )
558 : : {
559 : 0 : bRet = sal_True;
560 : 0 : break;
561 : : }
562 : : }
563 : : }
564 : : #if OSL_DEBUG_LEVEL > 0
565 : : else
566 : : {
567 : : OSL_FAIL("Cursor not on an outline node");
568 : : }
569 : : #endif
570 : 0 : return bRet;
571 : : }
572 : :
573 : : /** Test whether outline may be moved (bCopy == false)
574 : : * or copied (bCopy == true)
575 : : * Verify these conditions:
576 : : * 1) outline must be within main body (and not in redline)
577 : : * 2) outline must not be within table
578 : : * 3) if bCopy is set, outline must not be write protected
579 : : */
580 : 0 : sal_Bool lcl_IsOutlineMoveAndCopyable( const SwDoc* pDoc, sal_uInt16 nIdx, bool bCopy )
581 : : {
582 : 0 : const SwNodes& rNds = pDoc->GetNodes();
583 : 0 : const SwNode* pNd = rNds.GetOutLineNds()[ nIdx ];
584 : 0 : return pNd->GetIndex() >= rNds.GetEndOfExtras().GetIndex() && // 1) body
585 : 0 : !pNd->FindTableNode() && // 2) table
586 [ # # ][ # # ]: 0 : ( bCopy || !pNd->IsProtect() ); // 3) write
[ # # # # ]
587 : : }
588 : :
589 : 0 : sal_Bool SwEditShell::IsOutlineMovable( sal_uInt16 nIdx ) const
590 : : {
591 : 0 : return lcl_IsOutlineMoveAndCopyable( GetDoc(), nIdx, false );
592 : : }
593 : :
594 : 0 : sal_Bool SwEditShell::IsOutlineCopyable( sal_uInt16 nIdx ) const
595 : : {
596 : 0 : return lcl_IsOutlineMoveAndCopyable( GetDoc(), nIdx, true );
597 : : }
598 : :
599 : :
600 : 0 : sal_Bool SwEditShell::NumOrNoNum( sal_Bool bNumOn, sal_Bool bChkStart )
601 : : {
602 : 0 : sal_Bool bRet = sal_False;
603 : 0 : SwPaM* pCrsr = GetCrsr();
604 [ # # ]: 0 : if( pCrsr->GetNext() == pCrsr && !pCrsr->HasMark() &&
[ # # # # ]
[ # # ][ # # ]
605 : 0 : ( !bChkStart || !pCrsr->GetPoint()->nContent.GetIndex()) )
606 : : {
607 : 0 : StartAllAction(); // Klammern fuers Updaten !!
608 : 0 : bRet = GetDoc()->NumOrNoNum( pCrsr->GetPoint()->nNode, !bNumOn ); // #i29560#
609 : 0 : EndAllAction();
610 : : }
611 : 0 : return bRet;
612 : : }
613 : :
614 : 0 : sal_Bool SwEditShell::IsNoNum( sal_Bool bChkStart ) const
615 : : {
616 : : // ein Backspace im Absatz ohne Nummer wird zum Delete
617 : 0 : sal_Bool bResult = sal_False;
618 : 0 : SwPaM* pCrsr = GetCrsr();
619 : :
620 [ # # ]: 0 : if (pCrsr->GetNext() == pCrsr && !pCrsr->HasMark() &&
[ # # # # ]
[ # # ][ # # ]
621 : 0 : (!bChkStart || !pCrsr->GetPoint()->nContent.GetIndex()))
622 : : {
623 : 0 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
624 : :
625 [ # # ]: 0 : if (pTxtNd)
626 : : {
627 : 0 : bResult = ! pTxtNd->IsCountedInList();
628 : : }
629 : : }
630 : :
631 : 0 : return bResult;
632 : : }
633 : :
634 : 0 : sal_uInt8 SwEditShell::GetNumLevel() const
635 : : {
636 : : // gebe die akt. Ebene zurueck, auf der sich der Point vom Cursor befindet
637 : 0 : sal_uInt8 nLevel = MAXLEVEL; //end,zhaojianwei
638 : :
639 : 0 : SwPaM* pCrsr = GetCrsr();
640 : 0 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
641 : :
642 : : OSL_ENSURE( pTxtNd, "GetNumLevel() without text node" );
643 [ # # ]: 0 : if ( !pTxtNd )
644 : 0 : return nLevel;
645 : :
646 : 0 : const SwNumRule* pRule = pTxtNd->GetNumRule();
647 [ # # ]: 0 : if(pRule)
648 : : {
649 : 0 : const int nListLevelOfTxtNode( pTxtNd->GetActualListLevel() );
650 [ # # ]: 0 : if ( nListLevelOfTxtNode >= 0 )
651 : : {
652 : 0 : nLevel = static_cast<sal_uInt8>( nListLevelOfTxtNode );
653 : : }
654 : : }
655 : :
656 : 0 : return nLevel;
657 : : }
658 : :
659 : 25850 : const SwNumRule* SwEditShell::GetCurNumRule() const
660 : : {
661 : 25850 : return GetDoc()->GetCurrNumRule( *GetCrsr()->GetPoint() );
662 : : }
663 : :
664 : 0 : void SwEditShell::SetCurNumRule( const SwNumRule& rRule,
665 : : const bool bCreateNewList,
666 : : const String sContinuedListId,
667 : : const bool bResetIndentAttrs )
668 : : {
669 : 0 : StartAllAction();
670 : :
671 : 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
672 : :
673 : 0 : SwPaM* pCrsr = GetCrsr();
674 [ # # ]: 0 : if( pCrsr->GetNext() != pCrsr ) // Mehrfachselektion ?
675 : : {
676 [ # # ]: 0 : SwPamRanges aRangeArr( *pCrsr );
677 [ # # ]: 0 : SwPaM aPam( *pCrsr->GetPoint() );
678 [ # # ]: 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
679 : : {
680 [ # # ]: 0 : aRangeArr.SetPam( n, aPam );
681 : : GetDoc()->SetNumRule( aPam, rRule,
682 : : bCreateNewList, sContinuedListId,
683 [ # # ][ # # ]: 0 : sal_True, bResetIndentAttrs );
[ # # ]
684 [ # # ]: 0 : GetDoc()->SetCounted( aPam, true );
685 [ # # ]: 0 : }
686 : : }
687 : : else
688 : : {
689 : : GetDoc()->SetNumRule( *pCrsr, rRule,
690 : : bCreateNewList, sContinuedListId,
691 [ # # ]: 0 : sal_True, bResetIndentAttrs );
692 : 0 : GetDoc()->SetCounted( *pCrsr, true );
693 : : }
694 : 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
695 : :
696 : 0 : EndAllAction();
697 : 0 : }
698 : :
699 : 0 : String SwEditShell::GetUniqueNumRuleName( const String* pChkStr, sal_Bool bAutoNum ) const
700 : : {
701 : 0 : return GetDoc()->GetUniqueNumRuleName( pChkStr, bAutoNum );
702 : : }
703 : :
704 : 0 : void SwEditShell::ChgNumRuleFmts( const SwNumRule& rRule )
705 : : {
706 : 0 : StartAllAction();
707 : 0 : GetDoc()->ChgNumRuleFmts( rRule );
708 : 0 : EndAllAction();
709 : 0 : }
710 : :
711 : 0 : sal_Bool SwEditShell::ReplaceNumRule( const String& rOldRule, const String& rNewRule )
712 : : {
713 : 0 : StartAllAction();
714 : 0 : sal_Bool bRet = GetDoc()->ReplaceNumRule( *GetCrsr()->GetPoint(), rOldRule, rNewRule );
715 : 0 : EndAllAction();
716 : 0 : return bRet;
717 : : }
718 : :
719 : 0 : void SwEditShell::SetNumRuleStart( sal_Bool bFlag, SwPaM* pPaM )
720 : : {
721 : 0 : StartAllAction();
722 [ # # ]: 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr();
723 [ # # ]: 0 : if( pCrsr->GetNext() != pCrsr ) // Mehrfachselektion ?
724 : : {
725 [ # # ][ # # ]: 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
726 [ # # ]: 0 : SwPamRanges aRangeArr( *pCrsr );
727 [ # # ]: 0 : SwPaM aPam( *pCrsr->GetPoint() );
728 [ # # ]: 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
729 [ # # ][ # # ]: 0 : GetDoc()->SetNumRuleStart( *aRangeArr.SetPam( n, aPam ).GetPoint(), bFlag );
730 [ # # ][ # # ]: 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
[ # # ]
731 : : }
732 : : else
733 : 0 : GetDoc()->SetNumRuleStart( *pCrsr->GetPoint(), bFlag );
734 : :
735 : 0 : EndAllAction();
736 : 0 : }
737 : :
738 : 0 : sal_Bool SwEditShell::IsNumRuleStart( SwPaM* pPaM ) const
739 : : {
740 : 0 : sal_Bool bResult = sal_False;
741 [ # # ]: 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr( );
742 : 0 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
743 [ # # ]: 0 : if( pTxtNd )
744 [ # # ]: 0 : bResult = pTxtNd->IsListRestart() ? sal_True : sal_False;
745 : 0 : return bResult;
746 : : }
747 : :
748 : 0 : void SwEditShell::SetNodeNumStart( sal_uInt16 nStt, SwPaM* pPaM )
749 : : {
750 : 0 : StartAllAction();
751 : :
752 [ # # ]: 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr();
753 [ # # ]: 0 : if( pCrsr->GetNext() != pCrsr ) // Mehrfachselektion ?
754 : : {
755 [ # # ][ # # ]: 0 : GetDoc()->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
756 [ # # ]: 0 : SwPamRanges aRangeArr( *pCrsr );
757 [ # # ]: 0 : SwPaM aPam( *pCrsr->GetPoint() );
758 [ # # ]: 0 : for( sal_uInt16 n = 0; n < aRangeArr.Count(); ++n )
759 [ # # ][ # # ]: 0 : GetDoc()->SetNodeNumStart( *aRangeArr.SetPam( n, aPam ).GetPoint(), nStt );
760 [ # # ][ # # ]: 0 : GetDoc()->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
[ # # ]
761 : : }
762 : : else
763 : 0 : GetDoc()->SetNodeNumStart( *pCrsr->GetPoint(), nStt );
764 : :
765 : 0 : EndAllAction();
766 : 0 : }
767 : :
768 : 0 : sal_uInt16 SwEditShell::GetNodeNumStart( SwPaM* pPaM ) const
769 : : {
770 [ # # ]: 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr();
771 : 0 : const SwTxtNode* pTxtNd = pCrsr->GetNode()->GetTxtNode();
772 : : // correction: check, if list restart value is set at text node and
773 : : // use new method <SwTxtNode::GetAttrListRestartValue()>.
774 : : // return USHRT_MAX, if no list restart value is found.
775 [ # # ][ # # ]: 0 : if ( pTxtNd && pTxtNd->HasAttrListRestartValue() )
[ # # ]
776 : : {
777 : 0 : return static_cast<sal_uInt16>(pTxtNd->GetAttrListRestartValue());
778 : : }
779 : 0 : return USHRT_MAX;
780 : : }
781 : :
782 : 0 : const SwNumRule * SwEditShell::SearchNumRule( const bool bForward,
783 : : const bool bNum,
784 : : const bool bOutline,
785 : : int nNonEmptyAllowed,
786 : : String& sListId )
787 : : {
788 : 0 : return GetDoc()->SearchNumRule( *(bForward ? GetCrsr()->End() : GetCrsr()->Start()),
789 : : bForward, bNum, bOutline, nNonEmptyAllowed,
790 [ # # ]: 0 : sListId );
791 : : }
792 : :
793 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|