LCOV - code coverage report
Current view: top level - sw/source/core/doc - docdde.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 191 0.0 %
Date: 2014-04-14 Functions: 0 9 0.0 %
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 <stdlib.h>
      21             : 
      22             : #include <vcl/svapp.hxx>
      23             : #include <tools/urlobj.hxx>
      24             : 
      25             : #include <sfx2/linkmgr.hxx>
      26             : #include <unotools/charclass.hxx>
      27             : #include <fmtcntnt.hxx>
      28             : #include <doc.hxx>
      29             : #include <swserv.hxx>
      30             : #include <IMark.hxx>
      31             : #include <bookmrk.hxx>
      32             : #include <section.hxx>
      33             : #include <swtable.hxx>
      34             : #include <node.hxx>
      35             : #include <ndtxt.hxx>
      36             : #include <pam.hxx>
      37             : #include <docary.hxx>
      38             : #include <MarkManager.hxx>
      39             : #include <boost/foreach.hpp>
      40             : 
      41             : using namespace ::com::sun::star;
      42             : 
      43             : namespace
      44             : {
      45             : 
      46           0 :     static ::sw::mark::DdeBookmark* lcl_FindDdeBookmark(
      47             :         const IDocumentMarkAccess& rMarkAccess,
      48             :         const OUString& rName,
      49             :         const bool bCaseSensitive )
      50             :     {
      51             :         //Iterating over all bookmarks, checking DdeBookmarks
      52           0 :         const OUString sNameLc = bCaseSensitive ? rName : GetAppCharClass().lowercase(rName);
      53           0 :         for(IDocumentMarkAccess::const_iterator_t ppMark = rMarkAccess.getCommonMarksBegin();
      54           0 :             ppMark != rMarkAccess.getCommonMarksEnd();
      55             :             ++ppMark)
      56             :         {
      57           0 :             if ( IDocumentMarkAccess::GetType( *(ppMark->get()) ) == IDocumentMarkAccess::DDE_BOOKMARK)
      58             :             {
      59           0 :                 ::sw::mark::DdeBookmark* const pBkmk = dynamic_cast< ::sw::mark::DdeBookmark*>(ppMark->get());
      60           0 :                 if (!pBkmk)
      61           0 :                     return NULL;
      62           0 :                 if (
      63           0 :                     (bCaseSensitive && (pBkmk->GetName() == sNameLc)) ||
      64           0 :                     (!bCaseSensitive && GetAppCharClass().lowercase(pBkmk->GetName()) == sNameLc)
      65             :                    )
      66             :                 {
      67           0 :                     return pBkmk;
      68             :                 }
      69             :             }
      70             :         }
      71           0 :         return NULL;
      72             :     }
      73             : }
      74             : 
      75           0 : struct _FindItem
      76             : {
      77             :     const OUString m_Item;
      78             :     SwTableNode* pTblNd;
      79             :     SwSectionNode* pSectNd;
      80             : 
      81           0 :     _FindItem(const OUString& rS)
      82           0 :         : m_Item(rS), pTblNd(0), pSectNd(0)
      83           0 :     {}
      84             : };
      85             : 
      86           0 : static bool lcl_FindSection( const SwSectionFmt* pSectFmt, _FindItem * const pItem, bool bCaseSensitive )
      87             : {
      88           0 :     SwSection* pSect = pSectFmt->GetSection();
      89           0 :     if( pSect )
      90             :     {
      91             :         OUString sNm( (bCaseSensitive)
      92             :                 ? pSect->GetSectionName()
      93           0 :                 : GetAppCharClass().lowercase( pSect->GetSectionName() ));
      94             :         OUString sCompare( (bCaseSensitive)
      95             :                 ? pItem->m_Item
      96           0 :                 : GetAppCharClass().lowercase( pItem->m_Item ) );
      97           0 :         if( sNm == sCompare )
      98             :         {
      99             :             // found, so get the data
     100             :             const SwNodeIndex* pIdx;
     101           0 :             if( 0 != (pIdx = pSectFmt->GetCntnt().GetCntntIdx() ) &&
     102           0 :                 &pSectFmt->GetDoc()->GetNodes() == &pIdx->GetNodes() )
     103             :             {
     104             :                 // a table in the normal NodesArr
     105           0 :                 pItem->pSectNd = pIdx->GetNode().GetSectionNode();
     106           0 :                 return false;
     107             :             }
     108             :             // If the name is already correct, but not the rest then we don't have them.
     109             :             // The names are always unique.
     110           0 :         }
     111             :     }
     112           0 :     return true;
     113             : }
     114             : 
     115           0 : static bool lcl_FindTable( const SwFrmFmt* pTableFmt, _FindItem * const pItem )
     116             : {
     117           0 :     OUString sNm( GetAppCharClass().lowercase( pTableFmt->GetName() ));
     118           0 :     if ( sNm == pItem->m_Item )
     119             :     {
     120             :         SwTable* pTmpTbl;
     121             :         SwTableBox* pFBox;
     122           0 :         if( 0 != ( pTmpTbl = SwTable::FindTable( pTableFmt ) ) &&
     123           0 :             0 != ( pFBox = pTmpTbl->GetTabSortBoxes()[0] ) &&
     124           0 :             pFBox->GetSttNd() &&
     125           0 :             &pTableFmt->GetDoc()->GetNodes() == &pFBox->GetSttNd()->GetNodes() )
     126             :         {
     127             :             // a table in the normal NodesArr
     128             :             pItem->pTblNd = (SwTableNode*)
     129           0 :                                         pFBox->GetSttNd()->FindTableNode();
     130           0 :             return false;
     131             :         }
     132             :         // If the name is already correct, but not the rest then we don't have them.
     133             :         // The names are always unique.
     134             :     }
     135           0 :     return true;
     136             : }
     137             : 
     138           0 : bool SwDoc::GetData( const OUString& rItem, const OUString& rMimeType,
     139             :                      uno::Any & rValue ) const
     140             : {
     141             :     // search for bookmarks and sections case senstive at first. If nothing is found then try again case insensitive
     142           0 :     bool bCaseSensitive = true;
     143             :     while( true )
     144             :     {
     145           0 :         ::sw::mark::DdeBookmark* const pBkmk = lcl_FindDdeBookmark(*mpMarkManager, rItem, bCaseSensitive);
     146           0 :         if(pBkmk)
     147           0 :             return SwServerObject(*pBkmk).GetData(rValue, rMimeType);
     148             : 
     149             :         // Do we already have the Item?
     150           0 :         OUString sItem( bCaseSensitive ? rItem : GetAppCharClass().lowercase(rItem));
     151           0 :         _FindItem aPara( sItem );
     152           0 :         BOOST_FOREACH( const SwSectionFmt* pFmt, *mpSectionFmtTbl )
     153             :         {
     154           0 :             if (!(lcl_FindSection(pFmt, &aPara, bCaseSensitive)))
     155           0 :                 break;
     156             :         }
     157           0 :         if( aPara.pSectNd )
     158             :         {
     159             :             // found, so get the data
     160           0 :             return SwServerObject( *aPara.pSectNd ).GetData( rValue, rMimeType );
     161             :         }
     162           0 :         if( !bCaseSensitive )
     163           0 :             break;
     164           0 :         bCaseSensitive = false;
     165           0 :     }
     166             : 
     167           0 :     _FindItem aPara( GetAppCharClass().lowercase( rItem ));
     168           0 :     BOOST_FOREACH( const SwFrmFmt* pFmt, *mpTblFrmFmtTbl )
     169             :     {
     170           0 :         if (!(lcl_FindTable(pFmt, &aPara)))
     171           0 :             break;
     172             :     }
     173           0 :     if( aPara.pTblNd )
     174             :     {
     175           0 :         return SwServerObject( *aPara.pTblNd ).GetData( rValue, rMimeType );
     176             :     }
     177             : 
     178           0 :     return false;
     179             : }
     180             : 
     181           0 : bool SwDoc::SetData( const OUString& rItem, const OUString& rMimeType,
     182             :                      const uno::Any & rValue )
     183             : {
     184             :     // search for bookmarks and sections case senstive at first. If nothing is found then try again case insensitive
     185           0 :     bool bCaseSensitive = true;
     186             :     while( true )
     187             :     {
     188           0 :         ::sw::mark::DdeBookmark* const pBkmk = lcl_FindDdeBookmark(*mpMarkManager, rItem, bCaseSensitive);
     189           0 :         if(pBkmk)
     190           0 :             return SwServerObject(*pBkmk).SetData(rMimeType, rValue);
     191             : 
     192             :         // Do we already have the Item?
     193           0 :         OUString sItem( bCaseSensitive ? rItem : GetAppCharClass().lowercase(rItem));
     194           0 :         _FindItem aPara( sItem );
     195           0 :         BOOST_FOREACH( const SwSectionFmt* pFmt, *mpSectionFmtTbl )
     196             :         {
     197           0 :             if (!(lcl_FindSection(pFmt, &aPara, bCaseSensitive)))
     198           0 :                 break;
     199             :         }
     200           0 :         if( aPara.pSectNd )
     201             :         {
     202             :             // found, so get the data
     203           0 :             return SwServerObject( *aPara.pSectNd ).SetData( rMimeType, rValue );
     204             :         }
     205           0 :         if( !bCaseSensitive )
     206           0 :             break;
     207           0 :         bCaseSensitive = false;
     208           0 :     }
     209             : 
     210           0 :     OUString sItem(GetAppCharClass().lowercase(rItem));
     211           0 :     _FindItem aPara( sItem );
     212           0 :     BOOST_FOREACH( const SwFrmFmt* pFmt, *mpTblFrmFmtTbl )
     213             :     {
     214           0 :         if (!(lcl_FindTable(pFmt, &aPara)))
     215           0 :             break;
     216             :     }
     217           0 :     if( aPara.pTblNd )
     218             :     {
     219           0 :         return SwServerObject( *aPara.pTblNd ).SetData( rMimeType, rValue );
     220             :     }
     221             : 
     222           0 :     return false;
     223             : }
     224             : 
     225           0 : ::sfx2::SvLinkSource* SwDoc::CreateLinkSource(const OUString& rItem)
     226             : {
     227           0 :     SwServerObject* pObj = NULL;
     228             : 
     229             :     // search for bookmarks and sections case senstive at first. If nothing is found then try again case insensitive
     230           0 :     bool bCaseSensitive = true;
     231             :     while( true )
     232             :     {
     233             :         // bookmarks
     234           0 :         ::sw::mark::DdeBookmark* const pBkmk = lcl_FindDdeBookmark(*mpMarkManager, rItem, bCaseSensitive);
     235           0 :         if(pBkmk && pBkmk->IsExpanded()
     236           0 :             && (0 == (pObj = pBkmk->GetRefObject())))
     237             :         {
     238             :             // mark found, but no link yet -> create hotlink
     239           0 :             pObj = new SwServerObject(*pBkmk);
     240           0 :             pBkmk->SetRefObject(pObj);
     241           0 :             GetLinkManager().InsertServer(pObj);
     242             :         }
     243           0 :         if(pObj)
     244           0 :             return pObj;
     245             : 
     246           0 :         _FindItem aPara(bCaseSensitive ? rItem : GetAppCharClass().lowercase(rItem));
     247             :         // sections
     248           0 :         BOOST_FOREACH( const SwSectionFmt* pFmt, *mpSectionFmtTbl )
     249             :         {
     250           0 :             if (!(lcl_FindSection(pFmt, &aPara, bCaseSensitive)))
     251           0 :                 break;
     252             :         }
     253             : 
     254           0 :         if(aPara.pSectNd
     255           0 :             && (0 == (pObj = aPara.pSectNd->GetSection().GetObject())))
     256             :         {
     257             :             // section found, but no link yet -> create hotlink
     258           0 :             pObj = new SwServerObject( *aPara.pSectNd );
     259           0 :             aPara.pSectNd->GetSection().SetRefObject( pObj );
     260           0 :             GetLinkManager().InsertServer(pObj);
     261             :         }
     262           0 :         if(pObj)
     263           0 :             return pObj;
     264           0 :         if( !bCaseSensitive )
     265           0 :             break;
     266           0 :         bCaseSensitive = false;
     267           0 :     }
     268             : 
     269           0 :     _FindItem aPara( GetAppCharClass().lowercase(rItem) );
     270             :     // tables
     271           0 :     BOOST_FOREACH( const SwFrmFmt* pFmt, *mpTblFrmFmtTbl )
     272             :     {
     273           0 :         if (!(lcl_FindTable(pFmt, &aPara)))
     274           0 :             break;
     275             :     }
     276           0 :     if(aPara.pTblNd
     277           0 :         && (0 == (pObj = aPara.pTblNd->GetTable().GetObject())))
     278             :     {
     279             :         // table found, but no link yet -> create hotlink
     280           0 :         pObj = new SwServerObject(*aPara.pTblNd);
     281           0 :         aPara.pTblNd->GetTable().SetRefObject(pObj);
     282           0 :         GetLinkManager().InsertServer(pObj);
     283             :     }
     284           0 :     return pObj;
     285             : }
     286             : 
     287           0 : bool SwDoc::SelectServerObj( const OUString& rStr, SwPaM*& rpPam,
     288             :                             SwNodeRange*& rpRange ) const
     289             : {
     290             :     // Do we actually have the Item?
     291           0 :     rpPam = 0;
     292           0 :     rpRange = 0;
     293             : 
     294             :     OUString sItem( INetURLObject::decode( rStr, '%',
     295             :                                          INetURLObject::DECODE_WITH_CHARSET,
     296           0 :                                         RTL_TEXTENCODING_UTF8 ));
     297             : 
     298           0 :     sal_Int32 nPos = sItem.indexOf( cMarkSeparator );
     299             : 
     300           0 :     const CharClass& rCC = GetAppCharClass();
     301             : 
     302             :     // Extension for sections: not only link bookmarks/sections
     303             :     // but also frames (text!), tables, outlines:
     304           0 :     if( -1 != nPos )
     305             :     {
     306           0 :         bool bContinue = false;
     307           0 :         OUString sName( sItem.copy( 0, nPos ) );
     308           0 :         OUString sCmp( sItem.copy( nPos + 1 ));
     309           0 :         sItem = rCC.lowercase( sItem );
     310             : 
     311           0 :         _FindItem aPara( sName );
     312             : 
     313           0 :         if( sCmp == "table" )
     314             :         {
     315           0 :             sName = rCC.lowercase( sName );
     316           0 :             BOOST_FOREACH( const SwFrmFmt* pFmt, *mpTblFrmFmtTbl )
     317             :             {
     318           0 :                 if (!(lcl_FindTable(pFmt, &aPara)))
     319           0 :                     break;
     320             :             }
     321           0 :             if( aPara.pTblNd )
     322             :             {
     323             :                 rpRange = new SwNodeRange( *aPara.pTblNd, 0,
     324           0 :                                 *aPara.pTblNd->EndOfSectionNode(), 1 );
     325           0 :                 return true;
     326             :             }
     327             :         }
     328           0 :         else if( sCmp == "frame" )
     329             :         {
     330             :             SwNodeIndex* pIdx;
     331             :             SwNode* pNd;
     332           0 :             const SwFlyFrmFmt* pFlyFmt = FindFlyByName( sName );
     333           0 :             if( pFlyFmt &&
     334           0 :                 0 != ( pIdx = (SwNodeIndex*)pFlyFmt->GetCntnt().GetCntntIdx() ) &&
     335           0 :                 !( pNd = &pIdx->GetNode())->IsNoTxtNode() )
     336             :             {
     337           0 :                 rpRange = new SwNodeRange( *pNd, 1, *pNd->EndOfSectionNode() );
     338           0 :                 return true;
     339             :             }
     340             :         }
     341           0 :         else if( sCmp == "region" )
     342             :         {
     343           0 :             sItem = sName;              // Is being dealt with further down!
     344           0 :             bContinue = true;
     345             :         }
     346           0 :         else if( sCmp == "outline" )
     347             :         {
     348           0 :             SwPosition aPos( SwNodeIndex( (SwNodes&)GetNodes() ));
     349           0 :             if( GotoOutline( aPos, sName ))
     350             :             {
     351           0 :                 SwNode* pNd = &aPos.nNode.GetNode();
     352           0 :                 const int nLvl = pNd->GetTxtNode()->GetAttrOutlineLevel()-1;
     353             : 
     354           0 :                 const SwOutlineNodes& rOutlNds = GetNodes().GetOutLineNds();
     355             :                 sal_uInt16 nTmpPos;
     356           0 :                 rOutlNds.Seek_Entry( pNd, &nTmpPos );
     357           0 :                 rpRange = new SwNodeRange( aPos.nNode, 0, aPos.nNode );
     358             : 
     359             :                 // look for the section's end, now
     360           0 :                 for( ++nTmpPos;
     361           0 :                         nTmpPos < rOutlNds.size() &&
     362           0 :                         nLvl < rOutlNds[ nTmpPos ]->GetTxtNode()->
     363           0 :                                 GetAttrOutlineLevel()-1;
     364             :                     ++nTmpPos )
     365             :                     ;       // there is no block
     366             : 
     367           0 :                 if( nTmpPos < rOutlNds.size() )
     368           0 :                     rpRange->aEnd = *rOutlNds[ nTmpPos ];
     369             :                 else
     370           0 :                     rpRange->aEnd = GetNodes().GetEndOfContent();
     371           0 :                 return true;
     372           0 :             }
     373             :         }
     374             : 
     375           0 :         if( !bContinue )
     376           0 :             return false;
     377             :     }
     378             : 
     379             :     // search for bookmarks and sections case senstive at first. If nothing is found then try again case insensitive
     380           0 :     bool bCaseSensitive = true;
     381             :     while( true )
     382             :     {
     383           0 :         ::sw::mark::DdeBookmark* const pBkmk = lcl_FindDdeBookmark(*mpMarkManager, sItem, bCaseSensitive);
     384           0 :         if(pBkmk)
     385             :         {
     386           0 :             if(pBkmk->IsExpanded())
     387             :                 rpPam = new SwPaM(
     388           0 :                     pBkmk->GetMarkPos(),
     389           0 :                     pBkmk->GetOtherMarkPos());
     390           0 :             return static_cast<bool>(rpPam);
     391             :         }
     392             : 
     393           0 :         _FindItem aPara( bCaseSensitive ? sItem : rCC.lowercase( sItem ) );
     394             : 
     395           0 :         if( !mpSectionFmtTbl->empty() )
     396             :         {
     397           0 :             BOOST_FOREACH( const SwSectionFmt* pFmt, *mpSectionFmtTbl )
     398             :             {
     399           0 :                 if (!(lcl_FindSection(pFmt, &aPara, bCaseSensitive)))
     400           0 :                     break;
     401             :             }
     402           0 :             if( aPara.pSectNd )
     403             :             {
     404             :                 rpRange = new SwNodeRange( *aPara.pSectNd, 1,
     405           0 :                                         *aPara.pSectNd->EndOfSectionNode() );
     406           0 :                 return true;
     407             : 
     408             :             }
     409             :         }
     410           0 :         if( !bCaseSensitive )
     411           0 :             break;
     412           0 :         bCaseSensitive = false;
     413           0 :     }
     414           0 :     return false;
     415             : }
     416             : 
     417             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10