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 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <DocumentLinksAdministrationManager.hxx>
21 :
22 : #include <doc.hxx>
23 : #include <DocumentSettingManager.hxx>
24 : #include <IDocumentUndoRedo.hxx>
25 : #include <IDocumentState.hxx>
26 : #include <IDocumentLayoutAccess.hxx>
27 : #include <sfx2/objsh.hxx>
28 : #include <sfx2/linkmgr.hxx>
29 : #include <sfx2/docfile.hxx>
30 : #include <sfx2/frame.hxx>
31 : #include <linkenum.hxx>
32 : #include <com/sun/star/document/UpdateDocMode.hpp>
33 : #include <swtypes.hxx>
34 : #include <viewsh.hxx>
35 : #include <docsh.hxx>
36 : #include <bookmrk.hxx>
37 : #include <swserv.hxx>
38 : #include <swbaslnk.hxx>
39 : #include <section.hxx>
40 : #include <docary.hxx>
41 : #include <frmfmt.hxx>
42 : #include <fmtcntnt.hxx>
43 : #include <swtable.hxx>
44 : #include <ndtxt.hxx>
45 : #include <tools/urlobj.hxx>
46 : #include <unotools/charclass.hxx>
47 : //#include <rtl/string.h>
48 : #include <boost/foreach.hpp>
49 :
50 :
51 : using namespace ::com::sun::star;
52 :
53 : //Helper functions for this file
54 : namespace
55 : {
56 50 : struct _FindItem
57 : {
58 : const OUString m_Item;
59 : SwTableNode* pTblNd;
60 : SwSectionNode* pSectNd;
61 :
62 50 : _FindItem(const OUString& rS)
63 50 : : m_Item(rS), pTblNd(0), pSectNd(0)
64 50 : {}
65 : };
66 :
67 0 : ::sfx2::SvBaseLink* lcl_FindNextRemovableLink( const ::sfx2::SvBaseLinks& rLinks, sfx2::LinkManager& rLnkMgr )
68 : {
69 0 : for( sal_uInt16 n = 0; n < rLinks.size(); ++n )
70 : {
71 0 : ::sfx2::SvBaseLink* pLnk = &(*rLinks[ n ]);
72 0 : if( pLnk &&
73 0 : ( OBJECT_CLIENT_GRF == pLnk->GetObjType() ||
74 0 : OBJECT_CLIENT_FILE == pLnk->GetObjType() ) &&
75 0 : pLnk->ISA( SwBaseLink ) )
76 : {
77 0 : ::sfx2::SvBaseLinkRef xLink = pLnk;
78 :
79 0 : OUString sFName;
80 0 : rLnkMgr.GetDisplayNames( xLink, 0, &sFName, 0, 0 );
81 :
82 0 : INetURLObject aURL( sFName );
83 0 : if( INET_PROT_FILE == aURL.GetProtocol() ||
84 0 : INET_PROT_CID == aURL.GetProtocol() )
85 0 : return pLnk;
86 : }
87 : }
88 0 : return 0;
89 : }
90 :
91 :
92 42 : ::sw::mark::DdeBookmark* lcl_FindDdeBookmark( const IDocumentMarkAccess& rMarkAccess, const OUString& rName, const bool bCaseSensitive )
93 : {
94 : //Iterating over all bookmarks, checking DdeBookmarks
95 42 : const OUString sNameLc = bCaseSensitive ? rName : GetAppCharClass().lowercase(rName);
96 126 : for(IDocumentMarkAccess::const_iterator_t ppMark = rMarkAccess.getAllMarksBegin();
97 84 : ppMark != rMarkAccess.getAllMarksEnd();
98 : ++ppMark)
99 : {
100 2 : if ( IDocumentMarkAccess::GetType( *(ppMark->get()) ) == IDocumentMarkAccess::DDE_BOOKMARK)
101 : {
102 2 : ::sw::mark::DdeBookmark* const pBkmk = dynamic_cast< ::sw::mark::DdeBookmark*>(ppMark->get());
103 2 : if (!pBkmk)
104 2 : return NULL;
105 6 : if (
106 4 : (bCaseSensitive && (pBkmk->GetName() == sNameLc)) ||
107 2 : (!bCaseSensitive && GetAppCharClass().lowercase(pBkmk->GetName()) == sNameLc)
108 : )
109 : {
110 2 : return pBkmk;
111 : }
112 : }
113 : }
114 82 : return NULL;
115 : }
116 :
117 :
118 40 : bool lcl_FindSection( const SwSectionFmt* pSectFmt, _FindItem * const pItem, bool bCaseSensitive )
119 : {
120 40 : SwSection* pSect = pSectFmt->GetSection();
121 40 : if( pSect )
122 : {
123 : OUString sNm( (bCaseSensitive)
124 : ? pSect->GetSectionName()
125 40 : : GetAppCharClass().lowercase( pSect->GetSectionName() ));
126 : OUString sCompare( (bCaseSensitive)
127 : ? pItem->m_Item
128 80 : : GetAppCharClass().lowercase( pItem->m_Item ) );
129 40 : if( sNm == sCompare )
130 : {
131 : // found, so get the data
132 : const SwNodeIndex* pIdx;
133 0 : if( 0 != (pIdx = pSectFmt->GetCntnt().GetCntntIdx() ) &&
134 0 : &pSectFmt->GetDoc()->GetNodes() == &pIdx->GetNodes() )
135 : {
136 : // a table in the normal NodesArr
137 0 : pItem->pSectNd = pIdx->GetNode().GetSectionNode();
138 0 : return false;
139 : }
140 : // If the name is already correct, but not the rest then we don't have them.
141 : // The names are always unique.
142 40 : }
143 : }
144 40 : return true;
145 : }
146 :
147 0 : bool lcl_FindTable( const SwFrmFmt* pTableFmt, _FindItem * const pItem )
148 : {
149 0 : OUString sNm( GetAppCharClass().lowercase( pTableFmt->GetName() ));
150 0 : if ( sNm == pItem->m_Item )
151 : {
152 : SwTable* pTmpTbl;
153 : SwTableBox* pFBox;
154 0 : if( 0 != ( pTmpTbl = SwTable::FindTable( pTableFmt ) ) &&
155 0 : 0 != ( pFBox = pTmpTbl->GetTabSortBoxes()[0] ) &&
156 0 : pFBox->GetSttNd() &&
157 0 : &pTableFmt->GetDoc()->GetNodes() == &pFBox->GetSttNd()->GetNodes() )
158 : {
159 : // a table in the normal NodesArr
160 : pItem->pTblNd = (SwTableNode*)
161 0 : pFBox->GetSttNd()->FindTableNode();
162 0 : return false;
163 : }
164 : // If the name is already correct, but not the rest then we don't have them.
165 : // The names are always unique.
166 : }
167 0 : return true;
168 : }
169 :
170 : }
171 :
172 :
173 : namespace sw
174 : {
175 :
176 5052 : DocumentLinksAdministrationManager::DocumentLinksAdministrationManager( SwDoc& i_rSwdoc ) : mbVisibleLinks(true),
177 : mbLinksUpdated( false ), //#i38810#
178 5052 : mpLinkMgr( new sfx2::LinkManager( 0 ) ),
179 10104 : m_rSwdoc( i_rSwdoc )
180 : {
181 5052 : }
182 :
183 52 : bool DocumentLinksAdministrationManager::IsVisibleLinks() const
184 : {
185 52 : return mbVisibleLinks;
186 : }
187 :
188 36 : void DocumentLinksAdministrationManager::SetVisibleLinks(bool bFlag)
189 : {
190 36 : mbVisibleLinks = bFlag;
191 36 : }
192 :
193 75222 : sfx2::LinkManager& DocumentLinksAdministrationManager::GetLinkManager()
194 : {
195 75222 : return *mpLinkMgr;
196 : }
197 :
198 292 : const sfx2::LinkManager& DocumentLinksAdministrationManager::GetLinkManager() const
199 : {
200 292 : return *mpLinkMgr;
201 : }
202 :
203 : // #i42634# Moved common code of SwReader::Read() and SwDocShell::UpdateLinks()
204 : // to new SwDoc::UpdateLinks():
205 3998 : void DocumentLinksAdministrationManager::UpdateLinks( bool bUI )
206 : {
207 : SfxObjectCreateMode eMode;
208 3998 : sal_uInt16 nLinkMode = m_rSwdoc.GetDocumentSettingManager().getLinkUpdateMode( true );
209 3998 : if ( m_rSwdoc.GetDocShell()) {
210 3998 : sal_uInt16 nUpdateDocMode = m_rSwdoc.GetDocShell()->GetUpdateDocMode();
211 7996 : if( (nLinkMode != NEVER || document::UpdateDocMode::FULL_UPDATE == nUpdateDocMode) &&
212 4002 : !GetLinkManager().GetLinks().empty() &&
213 : SFX_CREATE_MODE_INTERNAL !=
214 8 : ( eMode = m_rSwdoc.GetDocShell()->GetCreateMode()) &&
215 4 : SFX_CREATE_MODE_ORGANIZER != eMode &&
216 4002 : SFX_CREATE_MODE_PREVIEW != eMode &&
217 4 : !m_rSwdoc.GetDocShell()->IsPreview() )
218 : {
219 4 : bool bAskUpdate = nLinkMode == MANUAL;
220 4 : bool bUpdate = true;
221 4 : switch(nUpdateDocMode)
222 : {
223 4 : case document::UpdateDocMode::NO_UPDATE: bUpdate = false;break;
224 0 : case document::UpdateDocMode::QUIET_UPDATE:bAskUpdate = false; break;
225 0 : case document::UpdateDocMode::FULL_UPDATE: bAskUpdate = true; break;
226 : }
227 4 : if( bUpdate && (bUI || !bAskUpdate) )
228 : {
229 0 : SfxMedium* pMedium = m_rSwdoc.GetDocShell()->GetMedium();
230 0 : SfxFrame* pFrm = pMedium ? pMedium->GetLoadTargetFrame() : 0;
231 0 : vcl::Window* pDlgParent = pFrm ? &pFrm->GetWindow() : 0;
232 :
233 0 : GetLinkManager().UpdateAllLinks( bAskUpdate, true, false, pDlgParent );
234 : }
235 : }
236 : }
237 3998 : }
238 :
239 0 : bool DocumentLinksAdministrationManager::GetData( const OUString& rItem, const OUString& rMimeType,
240 : uno::Any & rValue ) const
241 : {
242 : // search for bookmarks and sections case sensitive at first. If nothing is found then try again case insensitive
243 0 : bool bCaseSensitive = true;
244 : while( true )
245 : {
246 0 : ::sw::mark::DdeBookmark* const pBkmk = lcl_FindDdeBookmark(*m_rSwdoc.getIDocumentMarkAccess(), rItem, bCaseSensitive);
247 0 : if(pBkmk)
248 0 : return SwServerObject(*pBkmk).GetData(rValue, rMimeType);
249 :
250 : // Do we already have the Item?
251 0 : OUString sItem( bCaseSensitive ? rItem : GetAppCharClass().lowercase(rItem));
252 0 : _FindItem aPara( sItem );
253 0 : BOOST_FOREACH( const SwSectionFmt* pFmt, m_rSwdoc.GetSections() )
254 : {
255 0 : if (!(lcl_FindSection(pFmt, &aPara, bCaseSensitive)))
256 0 : break;
257 : }
258 0 : if( aPara.pSectNd )
259 : {
260 : // found, so get the data
261 0 : return SwServerObject( *aPara.pSectNd ).GetData( rValue, rMimeType );
262 : }
263 0 : if( !bCaseSensitive )
264 0 : break;
265 0 : bCaseSensitive = false;
266 0 : }
267 :
268 0 : _FindItem aPara( GetAppCharClass().lowercase( rItem ));
269 0 : BOOST_FOREACH( const SwFrmFmt* pFmt, *m_rSwdoc.GetTblFrmFmts() )
270 : {
271 0 : if (!(lcl_FindTable(pFmt, &aPara)))
272 0 : break;
273 : }
274 0 : if( aPara.pTblNd )
275 : {
276 0 : return SwServerObject( *aPara.pTblNd ).GetData( rValue, rMimeType );
277 : }
278 :
279 0 : return false;
280 : }
281 :
282 0 : bool DocumentLinksAdministrationManager::SetData( const OUString& rItem, const OUString& rMimeType,
283 : const uno::Any & rValue )
284 : {
285 : // search for bookmarks and sections case sensitive at first. If nothing is found then try again case insensitive
286 0 : bool bCaseSensitive = true;
287 : while( true )
288 : {
289 0 : ::sw::mark::DdeBookmark* const pBkmk = lcl_FindDdeBookmark(*m_rSwdoc.getIDocumentMarkAccess(), rItem, bCaseSensitive);
290 0 : if(pBkmk)
291 0 : return SwServerObject(*pBkmk).SetData(rMimeType, rValue);
292 :
293 : // Do we already have the Item?
294 0 : OUString sItem( bCaseSensitive ? rItem : GetAppCharClass().lowercase(rItem));
295 0 : _FindItem aPara( sItem );
296 0 : BOOST_FOREACH( const SwSectionFmt* pFmt, m_rSwdoc.GetSections() )
297 : {
298 0 : if (!(lcl_FindSection(pFmt, &aPara, bCaseSensitive)))
299 0 : break;
300 : }
301 0 : if( aPara.pSectNd )
302 : {
303 : // found, so get the data
304 0 : return SwServerObject( *aPara.pSectNd ).SetData( rMimeType, rValue );
305 : }
306 0 : if( !bCaseSensitive )
307 0 : break;
308 0 : bCaseSensitive = false;
309 0 : }
310 :
311 0 : OUString sItem(GetAppCharClass().lowercase(rItem));
312 0 : _FindItem aPara( sItem );
313 0 : BOOST_FOREACH( const SwFrmFmt* pFmt, *m_rSwdoc.GetTblFrmFmts() )
314 : {
315 0 : if (!(lcl_FindTable(pFmt, &aPara)))
316 0 : break;
317 : }
318 0 : if( aPara.pTblNd )
319 : {
320 0 : return SwServerObject( *aPara.pTblNd ).SetData( rMimeType, rValue );
321 : }
322 :
323 0 : return false;
324 : }
325 :
326 12 : ::sfx2::SvLinkSource* DocumentLinksAdministrationManager::CreateLinkSource(const OUString& rItem)
327 : {
328 12 : SwServerObject* pObj = NULL;
329 :
330 : // search for bookmarks and sections case sensitive at first. If nothing is found then try again case insensitive
331 12 : bool bCaseSensitive = true;
332 : while( true )
333 : {
334 : // bookmarks
335 22 : ::sw::mark::DdeBookmark* const pBkmk = lcl_FindDdeBookmark(*m_rSwdoc.getIDocumentMarkAccess(), rItem, bCaseSensitive);
336 24 : if(pBkmk && pBkmk->IsExpanded()
337 24 : && (0 == (pObj = pBkmk->GetRefObject())))
338 : {
339 : // mark found, but no link yet -> create hotlink
340 2 : pObj = new SwServerObject(*pBkmk);
341 2 : pBkmk->SetRefObject(pObj);
342 2 : GetLinkManager().InsertServer(pObj);
343 : }
344 22 : if(pObj)
345 4 : return pObj;
346 :
347 20 : _FindItem aPara(bCaseSensitive ? rItem : GetAppCharClass().lowercase(rItem));
348 : // sections
349 40 : BOOST_FOREACH( const SwSectionFmt* pFmt, m_rSwdoc.GetSections() )
350 : {
351 20 : if (!(lcl_FindSection(pFmt, &aPara, bCaseSensitive)))
352 0 : break;
353 : }
354 :
355 20 : if(aPara.pSectNd
356 20 : && (0 == (pObj = aPara.pSectNd->GetSection().GetObject())))
357 : {
358 : // section found, but no link yet -> create hotlink
359 0 : pObj = new SwServerObject( *aPara.pSectNd );
360 0 : aPara.pSectNd->GetSection().SetRefObject( pObj );
361 0 : GetLinkManager().InsertServer(pObj);
362 : }
363 20 : if(pObj)
364 0 : return pObj;
365 20 : if( !bCaseSensitive )
366 10 : break;
367 10 : bCaseSensitive = false;
368 10 : }
369 :
370 10 : _FindItem aPara( GetAppCharClass().lowercase(rItem) );
371 : // tables
372 10 : BOOST_FOREACH( const SwFrmFmt* pFmt, *m_rSwdoc.GetTblFrmFmts() )
373 : {
374 0 : if (!(lcl_FindTable(pFmt, &aPara)))
375 0 : break;
376 : }
377 10 : if(aPara.pTblNd
378 10 : && (0 == (pObj = aPara.pTblNd->GetTable().GetObject())))
379 : {
380 : // table found, but no link yet -> create hotlink
381 0 : pObj = new SwServerObject(*aPara.pTblNd);
382 0 : aPara.pTblNd->GetTable().SetRefObject(pObj);
383 0 : GetLinkManager().InsertServer(pObj);
384 : }
385 20 : return pObj;
386 : }
387 :
388 : /// embedded all local links (Areas/Graphics)
389 10 : bool DocumentLinksAdministrationManager::EmbedAllLinks()
390 : {
391 10 : bool bRet = false;
392 10 : sfx2::LinkManager& rLnkMgr = GetLinkManager();
393 10 : const ::sfx2::SvBaseLinks& rLinks = rLnkMgr.GetLinks();
394 10 : if( !rLinks.empty() )
395 : {
396 0 : ::sw::UndoGuard const undoGuard(m_rSwdoc.GetIDocumentUndoRedo());
397 :
398 0 : ::sfx2::SvBaseLink* pLnk = 0;
399 0 : while( 0 != (pLnk = lcl_FindNextRemovableLink( rLinks, rLnkMgr ) ) )
400 : {
401 0 : ::sfx2::SvBaseLinkRef xLink = pLnk;
402 : // Tell the link that it's being destroyed!
403 0 : xLink->Closed();
404 :
405 : // if one forgot to remove itself
406 0 : if( xLink.Is() )
407 0 : rLnkMgr.Remove( xLink );
408 :
409 0 : bRet = true;
410 0 : }
411 :
412 0 : m_rSwdoc.GetIDocumentUndoRedo().DelAllUndoObj();
413 0 : m_rSwdoc.getIDocumentState().SetModified();
414 : }
415 10 : return bRet;
416 : }
417 :
418 140 : void DocumentLinksAdministrationManager::SetLinksUpdated(const bool bNewLinksUpdated)
419 : {
420 140 : mbLinksUpdated = bNewLinksUpdated;
421 140 : }
422 :
423 1050 : bool DocumentLinksAdministrationManager::LinksUpdated() const
424 : {
425 1050 : return mbLinksUpdated;
426 : }
427 :
428 15135 : DocumentLinksAdministrationManager::~DocumentLinksAdministrationManager()
429 : {
430 5045 : DELETEZ( mpLinkMgr );
431 10090 : }
432 :
433 10 : bool DocumentLinksAdministrationManager::SelectServerObj( const OUString& rStr, SwPaM*& rpPam, SwNodeRange*& rpRange ) const
434 : {
435 : // Do we actually have the Item?
436 10 : rpPam = 0;
437 10 : rpRange = 0;
438 :
439 : OUString sItem( INetURLObject::decode( rStr, '%',
440 : INetURLObject::DECODE_WITH_CHARSET,
441 10 : RTL_TEXTENCODING_UTF8 ));
442 :
443 10 : sal_Int32 nPos = sItem.indexOf( cMarkSeparator );
444 :
445 10 : const CharClass& rCC = GetAppCharClass();
446 :
447 : // Extension for sections: not only link bookmarks/sections
448 : // but also frames (text!), tables, outlines:
449 10 : if( -1 != nPos )
450 : {
451 0 : bool bContinue = false;
452 0 : OUString sName( sItem.copy( 0, nPos ) );
453 0 : OUString sCmp( sItem.copy( nPos + 1 ));
454 0 : sItem = rCC.lowercase( sItem );
455 :
456 0 : _FindItem aPara( sName );
457 :
458 0 : if( sCmp == "table" )
459 : {
460 0 : sName = rCC.lowercase( sName );
461 0 : BOOST_FOREACH( const SwFrmFmt* pFmt, *m_rSwdoc.GetTblFrmFmts() )
462 : {
463 0 : if (!(lcl_FindTable(pFmt, &aPara)))
464 0 : break;
465 : }
466 0 : if( aPara.pTblNd )
467 : {
468 : rpRange = new SwNodeRange( *aPara.pTblNd, 0,
469 0 : *aPara.pTblNd->EndOfSectionNode(), 1 );
470 0 : return true;
471 : }
472 : }
473 0 : else if( sCmp == "frame" )
474 : {
475 : SwNodeIndex* pIdx;
476 : SwNode* pNd;
477 0 : const SwFlyFrmFmt* pFlyFmt = m_rSwdoc.FindFlyByName( sName );
478 0 : if( pFlyFmt &&
479 0 : 0 != ( pIdx = (SwNodeIndex*)pFlyFmt->GetCntnt().GetCntntIdx() ) &&
480 0 : !( pNd = &pIdx->GetNode())->IsNoTxtNode() )
481 : {
482 0 : rpRange = new SwNodeRange( *pNd, 1, *pNd->EndOfSectionNode() );
483 0 : return true;
484 : }
485 : }
486 0 : else if( sCmp == "region" )
487 : {
488 0 : sItem = sName; // Is being dealt with further down!
489 0 : bContinue = true;
490 : }
491 0 : else if( sCmp == "outline" )
492 : {
493 0 : SwPosition aPos( SwNodeIndex( (SwNodes&)m_rSwdoc.GetNodes() ));
494 0 : if( m_rSwdoc.GotoOutline( aPos, sName ))
495 : {
496 0 : SwNode* pNd = &aPos.nNode.GetNode();
497 0 : const int nLvl = pNd->GetTxtNode()->GetAttrOutlineLevel()-1;
498 :
499 0 : const SwOutlineNodes& rOutlNds = m_rSwdoc.GetNodes().GetOutLineNds();
500 : sal_uInt16 nTmpPos;
501 0 : rOutlNds.Seek_Entry( pNd, &nTmpPos );
502 0 : rpRange = new SwNodeRange( aPos.nNode, 0, aPos.nNode );
503 :
504 : // look for the section's end, now
505 0 : for( ++nTmpPos;
506 0 : nTmpPos < rOutlNds.size() &&
507 0 : nLvl < rOutlNds[ nTmpPos ]->GetTxtNode()->
508 0 : GetAttrOutlineLevel()-1;
509 : ++nTmpPos )
510 : ; // there is no block
511 :
512 0 : if( nTmpPos < rOutlNds.size() )
513 0 : rpRange->aEnd = *rOutlNds[ nTmpPos ];
514 : else
515 0 : rpRange->aEnd = m_rSwdoc.GetNodes().GetEndOfContent();
516 0 : return true;
517 0 : }
518 : }
519 :
520 0 : if( !bContinue )
521 0 : return false;
522 : }
523 :
524 : // search for bookmarks and sections case sensitive at first. If nothing is found then try again case insensitive
525 10 : bool bCaseSensitive = true;
526 : while( true )
527 : {
528 20 : ::sw::mark::DdeBookmark* const pBkmk = lcl_FindDdeBookmark(*m_rSwdoc.getIDocumentMarkAccess(), sItem, bCaseSensitive);
529 20 : if(pBkmk)
530 : {
531 0 : if(pBkmk->IsExpanded())
532 : rpPam = new SwPaM(
533 0 : pBkmk->GetMarkPos(),
534 0 : pBkmk->GetOtherMarkPos());
535 0 : return static_cast<bool>(rpPam);
536 : }
537 :
538 20 : _FindItem aPara( bCaseSensitive ? sItem : rCC.lowercase( sItem ) );
539 :
540 20 : if( !m_rSwdoc.GetSections().empty() )
541 : {
542 40 : BOOST_FOREACH( const SwSectionFmt* pFmt, m_rSwdoc.GetSections() )
543 : {
544 20 : if (!(lcl_FindSection(pFmt, &aPara, bCaseSensitive)))
545 0 : break;
546 : }
547 20 : if( aPara.pSectNd )
548 : {
549 : rpRange = new SwNodeRange( *aPara.pSectNd, 1,
550 0 : *aPara.pSectNd->EndOfSectionNode() );
551 0 : return true;
552 :
553 : }
554 : }
555 20 : if( !bCaseSensitive )
556 10 : break;
557 10 : bCaseSensitive = false;
558 10 : }
559 10 : return false;
560 : }
561 :
562 :
563 :
564 270 : }
565 :
566 :
567 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|