LCOV - code coverage report
Current view: top level - sw/source/core/docnode - ndnotxt.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 80 135 59.3 %
Date: 2015-06-13 12:38:46 Functions: 15 20 75.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 <hintids.hxx>
      21             : #include <tools/poly.hxx>
      22             : #include <tools/fract.hxx>
      23             : #include <svl/stritem.hxx>
      24             : #include <svx/contdlg.hxx>
      25             : #include <vcl/svapp.hxx>
      26             : #include <docary.hxx>
      27             : #include <doc.hxx>
      28             : #include <fmtcol.hxx>
      29             : #include <ndnotxt.hxx>
      30             : #include <ndgrf.hxx>
      31             : #include <ndole.hxx>
      32             : #include <ndindex.hxx>
      33             : #include <hints.hxx>
      34             : #include <istyleaccess.hxx>
      35             : #include <SwStyleNameMapper.hxx>
      36             : 
      37             : #include <frmfmt.hxx>
      38             : 
      39        1152 : SwNoTextNode::SwNoTextNode( const SwNodeIndex & rWhere,
      40             :                   const sal_uInt8 nNdType,
      41             :                   SwGrfFormatColl *pGrfColl,
      42             :                   SwAttrSet* pAutoAttr ) :
      43             :     SwContentNode( rWhere, nNdType, pGrfColl ),
      44             :     pContour( 0 ),
      45             :     bAutomaticContour( false ),
      46             :     bContourMapModeValid( true ),
      47        1152 :     bPixelContour( false )
      48             : {
      49             :     // Should this set a hard attribute?
      50        1152 :     if( pAutoAttr )
      51         177 :         SetAttr( *pAutoAttr );
      52        1152 : }
      53             : 
      54        2304 : SwNoTextNode::~SwNoTextNode()
      55             : {
      56        1152 :     delete pContour;
      57        1152 : }
      58             : 
      59             : /// Creates an AttrSet for all derivations with ranges for frame-
      60             : /// and graphics-attributes.
      61         693 : void SwNoTextNode::NewAttrSet( SwAttrPool& rPool )
      62             : {
      63             :     OSL_ENSURE( !mpAttrSet.get(), "AttrSet is already set" );
      64         693 :     SwAttrSet aNewAttrSet( rPool, aNoTextNodeSetRange );
      65             : 
      66             :     // put names of parent style and conditional style:
      67         693 :     const SwFormatColl* pFormatColl = GetFormatColl();
      68        1386 :     OUString sVal;
      69         693 :     SwStyleNameMapper::FillProgName( pFormatColl->GetName(), sVal, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, true );
      70        1386 :     SfxStringItem aFormatColl( RES_FRMATR_STYLE_NAME, sVal );
      71         693 :     aNewAttrSet.Put( aFormatColl );
      72             : 
      73         693 :     aNewAttrSet.SetParent( &GetFormatColl()->GetAttrSet() );
      74        1386 :     mpAttrSet = GetDoc()->GetIStyleAccess().getAutomaticStyle( aNewAttrSet, IStyleAccess::AUTO_STYLE_NOTXT );
      75         693 : }
      76             : 
      77             : /// Dummies for loading/saving of persistent data
      78             : /// when working with graphics and OLE objects
      79           0 : bool SwNoTextNode::RestorePersistentData()
      80             : {
      81           0 :     return true;
      82             : }
      83             : 
      84           0 : bool SwNoTextNode::SavePersistentData()
      85             : {
      86           0 :     return true;
      87             : }
      88             : 
      89         481 : void SwNoTextNode::SetContour( const tools::PolyPolygon *pPoly, bool bAutomatic )
      90             : {
      91         481 :     delete pContour;
      92         481 :     if ( pPoly )
      93           9 :         pContour = new tools::PolyPolygon( *pPoly );
      94             :     else
      95         472 :         pContour = 0;
      96         481 :     bAutomaticContour = bAutomatic;
      97         481 :     bContourMapModeValid = true;
      98         481 :     bPixelContour = false;
      99         481 : }
     100             : 
     101           0 : void SwNoTextNode::CreateContour()
     102             : {
     103             :     OSL_ENSURE( !pContour, "Contour available." );
     104           0 :     pContour = new tools::PolyPolygon(SvxContourDlg::CreateAutoContour(GetGraphic()));
     105           0 :     bAutomaticContour = true;
     106           0 :     bContourMapModeValid = true;
     107           0 :     bPixelContour = false;
     108           0 : }
     109             : 
     110         245 : const tools::PolyPolygon *SwNoTextNode::HasContour() const
     111             : {
     112         245 :     if( !bContourMapModeValid )
     113             :     {
     114          10 :         const MapMode aGrfMap( GetGraphic().GetPrefMapMode() );
     115          10 :         bool bPixelGrf = aGrfMap.GetMapUnit() == MAP_PIXEL;
     116          20 :         const MapMode aContourMap( bPixelGrf ? MAP_PIXEL : MAP_100TH_MM );
     117          10 :         if( bPixelGrf ? !bPixelContour : aGrfMap != aContourMap )
     118             :         {
     119             :             // #i102238#
     120           0 :             double nGrfDPIx = 0.0;
     121           0 :             double nGrfDPIy = 0.0;
     122             :             {
     123           0 :                 if ( !bPixelGrf && bPixelContour )
     124             :                 {
     125           0 :                     const Size aGrfPixelSize( GetGraphic().GetSizePixel() );
     126           0 :                     const Size aGrfPrefMapModeSize( GetGraphic().GetPrefSize() );
     127           0 :                     if ( aGrfMap.GetMapUnit() == MAP_INCH )
     128             :                     {
     129           0 :                         nGrfDPIx = aGrfPixelSize.Width() / ( (double)aGrfMap.GetScaleX() * aGrfPrefMapModeSize.Width() );
     130           0 :                         nGrfDPIy = aGrfPixelSize.Height() / ( (double)aGrfMap.GetScaleY() * aGrfPrefMapModeSize.Height() );
     131             :                     }
     132             :                     else
     133             :                     {
     134             :                         const Size aGrf1000thInchSize =
     135             :                             OutputDevice::LogicToLogic( aGrfPrefMapModeSize,
     136           0 :                                                         aGrfMap, MAP_1000TH_INCH );
     137           0 :                         nGrfDPIx = 1000.0 * aGrfPixelSize.Width() / aGrf1000thInchSize.Width();
     138           0 :                         nGrfDPIy = 1000.0 * aGrfPixelSize.Height() / aGrf1000thInchSize.Height();
     139             :                     }
     140             :                 }
     141             :             }
     142             :             OSL_ENSURE( !bPixelGrf || aGrfMap == aContourMap,
     143             :                         "scale factor for pixel unsupported" );
     144             :             OutputDevice* pOutDev =
     145           0 :                 (bPixelGrf || bPixelContour) ? Application::GetDefaultDevice()
     146           0 :                                              : 0;
     147           0 :             sal_uInt16 nPolyCount = pContour->Count();
     148           0 :             for( sal_uInt16 j=0; j<nPolyCount; j++ )
     149             :             {
     150           0 :                 Polygon& rPoly = (*pContour)[j];
     151             : 
     152           0 :                 sal_uInt16 nCount = rPoly.GetSize();
     153           0 :                 for( sal_uInt16 i=0 ; i<nCount; i++ )
     154             :                 {
     155           0 :                     if( bPixelGrf )
     156           0 :                         rPoly[i] = pOutDev->LogicToPixel( rPoly[i],
     157           0 :                                                           aContourMap );
     158           0 :                     else if( bPixelContour )
     159             :                     {
     160           0 :                         rPoly[i] = pOutDev->PixelToLogic( rPoly[i], aGrfMap );
     161             :                         // #i102238#
     162           0 :                         if ( nGrfDPIx != 0 && nGrfDPIy != 0 )
     163             :                         {
     164           0 :                             rPoly[i] = Point( rPoly[i].getX() * pOutDev->GetDPIX() / nGrfDPIx,
     165           0 :                                               rPoly[i].getY() * pOutDev->GetDPIY() / nGrfDPIy );
     166             :                         }
     167             :                     }
     168             :                     else
     169           0 :                         rPoly[i] = OutputDevice::LogicToLogic( rPoly[i],
     170             :                                                                  aContourMap,
     171           0 :                                                                  aGrfMap );
     172             :                 }
     173             :             }
     174             :         }
     175          10 :         const_cast<SwNoTextNode *>(this)->bContourMapModeValid = true;
     176          20 :         const_cast<SwNoTextNode *>(this)->bPixelContour = false;
     177             :     }
     178             : 
     179         245 :     return pContour;
     180             : }
     181             : 
     182           6 : void SwNoTextNode::GetContour( tools::PolyPolygon &rPoly ) const
     183             : {
     184             :     OSL_ENSURE( pContour, "Contour not available." );
     185           6 :     rPoly = *HasContour();
     186           6 : }
     187             : 
     188          10 : void SwNoTextNode::SetContourAPI( const tools::PolyPolygon *pPoly )
     189             : {
     190          10 :     delete pContour;
     191          10 :     if ( pPoly )
     192          10 :         pContour = new tools::PolyPolygon( *pPoly );
     193             :     else
     194           0 :         pContour = 0;
     195          10 :     bContourMapModeValid = false;
     196          10 : }
     197             : 
     198          20 : bool SwNoTextNode::GetContourAPI( tools::PolyPolygon &rContour ) const
     199             : {
     200          20 :     if( !pContour )
     201          15 :         return false;
     202             : 
     203           5 :     rContour = *pContour;
     204           5 :     if( bContourMapModeValid )
     205             :     {
     206           5 :         const MapMode aGrfMap( GetGraphic().GetPrefMapMode() );
     207          10 :         const MapMode aContourMap( MAP_100TH_MM );
     208             :         OSL_ENSURE( aGrfMap.GetMapUnit() != MAP_PIXEL ||
     209             :                 aGrfMap == MapMode( MAP_PIXEL ),
     210             :                     "scale factor for pixel unsupported" );
     211          10 :         if( aGrfMap.GetMapUnit() != MAP_PIXEL &&
     212           5 :             aGrfMap != aContourMap )
     213             :         {
     214           0 :             sal_uInt16 nPolyCount = rContour.Count();
     215           0 :             for( sal_uInt16 j=0; j<nPolyCount; j++ )
     216             :             {
     217             :                 // --> OD #i102238# - use the right <tools::PolyPolygon> instance
     218           0 :                 Polygon& rPoly = rContour[j];
     219             :                 // <--
     220             : 
     221           0 :                 sal_uInt16 nCount = rPoly.GetSize();
     222           0 :                 for( sal_uInt16 i=0 ; i<nCount; i++ )
     223             :                 {
     224           0 :                     rPoly[i] = OutputDevice::LogicToLogic( rPoly[i], aGrfMap,
     225           0 :                                                            aContourMap );
     226             :                 }
     227             :             }
     228           5 :         }
     229             :     }
     230             : 
     231           5 :     return true;
     232             : }
     233             : 
     234           0 : bool SwNoTextNode::IsPixelContour() const
     235             : {
     236             :     bool bRet;
     237           0 :     if( bContourMapModeValid )
     238             :     {
     239           0 :         const MapMode aGrfMap( GetGraphic().GetPrefMapMode() );
     240           0 :         bRet = aGrfMap.GetMapUnit() == MAP_PIXEL;
     241             :     }
     242             :     else
     243             :     {
     244           0 :         bRet = bPixelContour;
     245             :     }
     246             : 
     247           0 :     return bRet;
     248             : }
     249             : 
     250          27 : Graphic SwNoTextNode::GetGraphic() const
     251             : {
     252          27 :     Graphic aRet;
     253          27 :     if ( GetGrfNode() )
     254             :     {
     255          27 :         aRet = static_cast<const SwGrfNode*>(this)->GetGrf(true);
     256             :     }
     257             :     else
     258             :     {
     259             :         OSL_ENSURE( GetOLENode(), "new type of Node?" );
     260           0 :         aRet = *const_cast<SwOLENode*>(static_cast<const SwOLENode*>(this))->SwOLENode::GetGraphic();
     261             :     }
     262          27 :     return aRet;
     263             : }
     264             : 
     265             : // #i73249#
     266         207 : void SwNoTextNode::SetTitle( const OUString& rTitle, bool bBroadcast )
     267             : {
     268             :     // Title attribute of <SdrObject> replaces own AlternateText attribute
     269         207 :     SwFlyFrameFormat* pFlyFormat = dynamic_cast<SwFlyFrameFormat*>(GetFlyFormat());
     270             :     OSL_ENSURE( pFlyFormat, "<SwNoTextNode::SetTitle(..)> - missing <SwFlyFrameFormat> instance" );
     271         207 :     if ( !pFlyFormat )
     272             :     {
     273         207 :         return;
     274             :     }
     275             : 
     276         207 :     pFlyFormat->SetObjTitle( rTitle, bBroadcast );
     277             : }
     278             : 
     279         304 : OUString SwNoTextNode::GetTitle() const
     280             : {
     281         304 :     const SwFlyFrameFormat* pFlyFormat = dynamic_cast<const SwFlyFrameFormat*>(GetFlyFormat());
     282             :     OSL_ENSURE( pFlyFormat, "<SwNoTextNode::GetTitle(..)> - missing <SwFlyFrameFormat> instance" );
     283         304 :     if ( !pFlyFormat )
     284             :     {
     285           0 :         return OUString();
     286             :     }
     287             : 
     288         304 :     return pFlyFormat->GetObjTitle();
     289             : }
     290             : 
     291         206 : void SwNoTextNode::SetDescription( const OUString& rDescription, bool bBroadcast )
     292             : {
     293         206 :     SwFlyFrameFormat* pFlyFormat = dynamic_cast<SwFlyFrameFormat*>(GetFlyFormat());
     294             :     OSL_ENSURE( pFlyFormat, "<SwNoTextNode::SetDescription(..)> - missing <SwFlyFrameFormat> instance" );
     295         206 :     if ( !pFlyFormat )
     296             :     {
     297         206 :         return;
     298             :     }
     299             : 
     300         206 :     pFlyFormat->SetObjDescription( rDescription, bBroadcast );
     301             : }
     302             : 
     303         268 : OUString SwNoTextNode::GetDescription() const
     304             : {
     305         268 :     const SwFlyFrameFormat* pFlyFormat = dynamic_cast<const SwFlyFrameFormat*>(GetFlyFormat());
     306             :     OSL_ENSURE( pFlyFormat, "<SwNoTextNode::GetDescription(..)> - missing <SwFlyFrameFormat> instance" );
     307         268 :     if ( !pFlyFormat )
     308             :     {
     309           0 :         return OUString();
     310             :     }
     311             : 
     312         268 :     return pFlyFormat->GetObjDescription();
     313         177 : }
     314             : 
     315             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11