LCOV - code coverage report
Current view: top level - sw/source/core/doc - DocumentLinksAdministrationManager.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 115 267 43.1 %
Date: 2014-11-03 Functions: 19 23 82.6 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10